diff --git a/lib/main.dart b/lib/main.dart index 76ef74c..0b03378 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:pharmacy_mobile/pages/add_generics.dart'; import 'package:pharmacy_mobile/pages/add_medicine.dart'; +import 'package:pharmacy_mobile/pages/add_type.dart'; // import 'package:pharmacy_mobile/auth/auth_gate.dart'; import 'package:pharmacy_mobile/pages/index_page.dart'; import 'package:pharmacy_mobile/pages/login_page.dart'; @@ -61,6 +62,11 @@ final _router = GoRouter( path: '/addgenerics', builder: (context, state) => AddGenericsPage(), ), + GoRoute( + name: 'addtype', + path: '/addtype', + builder: (context, state) => AddTypePage(), + ), ], ); diff --git a/lib/pages/add_generics.dart b/lib/pages/add_generics.dart index a6d43e7..45a8e2e 100644 --- a/lib/pages/add_generics.dart +++ b/lib/pages/add_generics.dart @@ -3,6 +3,7 @@ import 'package:gap/gap.dart'; import 'package:flutter/material.dart'; // import 'package:pharmacy_mobile/auth/auth_service.dart'; import 'package:pharmacy_mobile/tables/ref_categories.dart'; +import 'package:pharmacy_mobile/tables/ref_generic_names.dart'; import 'package:pharmacy_mobile/widgets/button_widget.dart'; import 'package:pharmacy_mobile/widgets/dropdown_widget.dart'; import 'package:pharmacy_mobile/widgets/input_widget.dart'; @@ -19,8 +20,11 @@ class AddGenericsPage extends StatefulWidget { class AddGenericsPageState extends State { // final _formKey = GlobalKey(); final _refCategories = RefCategories(); + final _refGenericNames = RefGenericNames(); final _nameController = TextEditingController(); late List _categoryList; + late String _selectedCategory; + late String _categoryUUID; @override void initState() { @@ -32,16 +36,23 @@ class AddGenericsPageState extends State { _categoryList = await _refCategories.getList(); } - void saveData() async {} + void _updateCategory(dynamic category) { + _selectedCategory = category; + } + + void saveGeneric() async { + _categoryUUID = await _refCategories.getUUID(_selectedCategory); + + log(_categoryUUID); + await _refGenericNames.postGeneric(_nameController.text, _categoryUUID); + } @override void dispose() { _nameController.dispose(); _categoryList = []; - // _genericNameController.dispose(); - // _typeController.dispose(); - // _manufactorerController.dispose(); - // _focusNode.dispose(); + _selectedCategory = ''; + _categoryUUID = ''; super.dispose(); } @@ -71,9 +82,10 @@ class AddGenericsPageState extends State { const Gap(16), InputWidget(label: 'Name', controller: _nameController), const Gap(16), - DropDownWidget(label: 'Category', list: _categoryList, listTitle: 'category_name'), + DropDownWidget( + label: 'Category', list: _categoryList, listTitle: 'category_name', onChanged: _updateCategory), const Gap(16), - ButtonWidget(text: 'Add', onPressed: saveData) + ButtonWidget(text: 'Add', onPressed: saveGeneric) ], )), ), diff --git a/lib/pages/add_medicine.dart b/lib/pages/add_medicine.dart index 4b51e2e..df42dfc 100644 --- a/lib/pages/add_medicine.dart +++ b/lib/pages/add_medicine.dart @@ -1,5 +1,11 @@ import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; +import 'package:pharmacy_mobile/tables/ref_categories.dart'; +import 'package:pharmacy_mobile/tables/ref_generic_names.dart'; +import 'package:pharmacy_mobile/tables/ref_manufactorers.dart'; +import 'package:pharmacy_mobile/tables/ref_types.dart'; +import 'package:pharmacy_mobile/widgets/button_widget.dart'; +import 'package:pharmacy_mobile/widgets/dropdown_widget.dart'; import 'package:pharmacy_mobile/widgets/input_widget.dart'; // import 'package:google_fonts/google_fonts.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart'; @@ -15,12 +21,48 @@ class AddMedicinePage extends StatefulWidget { class AddMedicinePageState extends State { final _formKey = GlobalKey(); // final _authService = AuthService(); + final _refGenericNames = RefGenericNames(); + // final _refCategories = RefCategories(); + final _refTypes = RefTypes(); + final _refManufactorer = RefManufactorers(); final _nameController = TextEditingController(); final _genericNameController = TextEditingController(); final _typeController = TextEditingController(); final _manufactorerController = TextEditingController(); + final _categoryController = TextEditingController(); final FocusNode _focusNode = FocusNode(); + late List _genericNameList = []; + late String _selectedGeneric; + late List _typeList = []; + late String _selectedType; + late List _manufactorerList = []; + late String _selectedManufactorer; + + @override + void initState() { + autoRun(); + super.initState(); + } + + void autoRun() async { + _genericNameList = await _refGenericNames.getList(); + _typeList = await _refTypes.getList(); + _manufactorerList = await _refManufactorer.getList(); + } + + void _updateGeneric(dynamic generic) { + _selectedGeneric = generic; + } + + void _updateType(dynamic type) { + _selectedType = type; + } + + void _updateManufactorer(dynamic manufactorer) { + _selectedManufactorer = manufactorer; + } + // @override // void initState() { // super.initState(); @@ -32,7 +74,11 @@ class AddMedicinePageState extends State { _genericNameController.dispose(); _typeController.dispose(); _manufactorerController.dispose(); + _categoryController.dispose(); _focusNode.dispose(); + + _genericNameList = []; + _selectedGeneric = ''; super.dispose(); } @@ -66,6 +112,24 @@ class AddMedicinePageState extends State { child: Column( children: [ InputWidget(label: 'Name', controller: _nameController), + const Gap(16), + DropDownWidget( + label: 'Generic Name', + list: _genericNameList, + listTitle: 'generic_name', + onChanged: _updateGeneric), + const Gap(8), + TextWidget(text: _categoryController.text), + const Gap(16), + DropDownWidget(label: 'Type', list: _typeList, listTitle: 'type_name', onChanged: _updateType), + const Gap(16), + DropDownWidget( + label: 'Manufactorer', + list: _manufactorerList, + listTitle: 'manufactorer_name', + onChanged: _updateManufactorer), + const Gap(16), + ButtonWidget(text: 'Save Medicine', onPressed: onPressed) ], ), )) diff --git a/lib/pages/add_type.dart b/lib/pages/add_type.dart new file mode 100644 index 0000000..40591da --- /dev/null +++ b/lib/pages/add_type.dart @@ -0,0 +1,76 @@ +import 'dart:developer'; +import 'package:gap/gap.dart'; +import 'package:flutter/material.dart'; +// import 'package:pharmacy_mobile/auth/auth_service.dart'; +import 'package:pharmacy_mobile/tables/ref_categories.dart'; +import 'package:pharmacy_mobile/tables/ref_generic_names.dart'; +import 'package:pharmacy_mobile/tables/ref_types.dart'; +import 'package:pharmacy_mobile/widgets/button_widget.dart'; +import 'package:pharmacy_mobile/widgets/dropdown_widget.dart'; +import 'package:pharmacy_mobile/widgets/input_widget.dart'; +import 'package:pharmacy_mobile/widgets/text_widget.dart'; +import 'package:pharmacy_mobile/widgets/title_widget.dart'; + +class AddTypePage extends StatefulWidget { + const AddTypePage({super.key}); + + @override + _AddTypePageState createState() => _AddTypePageState(); +} + +class _AddTypePageState extends State { + final _typeController = TextEditingController(); + final _refTypes = RefTypes(); + + void saveType() async { + await _refTypes.postType(_typeController.text); + } + + @override + void dispose() { + _typeController.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + alignment: Alignment.center, + height: MediaQuery.of(context).size.height, + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [ + Color.fromRGBO(34, 51, 69, 1), + Color.fromRGBO(22, 32, 44, 1), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + child: Center( + child: Column( + children: [ + const Gap(120), + const TitleWidget(firstTextSize: 16, secondTextSize: 32), + const Gap(32), + const TextWidget(text: 'Add Medicine Type'), + const Gap(16), + Form( + child: Center( + child: Column( + children: [ + InputWidget(label: 'Type Name', controller: _typeController), + const Gap(16), + ButtonWidget(text: 'Save Type', onPressed: saveType) + ], + ), + )) + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/main_page.dart b/lib/pages/main_page.dart index bf8a166..7a16a1c 100644 --- a/lib/pages/main_page.dart +++ b/lib/pages/main_page.dart @@ -68,9 +68,9 @@ class MainPage extends StatelessWidget { ), const Gap(16), MenuWidget( - icon: FontAwesomeIcons.squarePlus, - text: 'Add Medicine Type', - ), + icon: FontAwesomeIcons.squarePlus, + text: 'Add Medicine Type', + onPressed: () => {context.push('/addtype')}), const Gap(32), MenuWidget( icon: FontAwesomeIcons.listCheck, diff --git a/lib/tables/ref_categories.dart b/lib/tables/ref_categories.dart index 183f85f..1f19af6 100644 --- a/lib/tables/ref_categories.dart +++ b/lib/tables/ref_categories.dart @@ -10,6 +10,11 @@ class RefCategories { Future getUUID(String name) async { final data = await _supabase.from('ref_categories').select('ref_categories_uuid').eq('category_name', name); - return data.toString(); + return data.first['ref_categories_uuid']; + } + + Future getName(String uuid) async { + final data = await _supabase.from('ref_categories').select('category_name').eq('ref_categories_uuid', uuid); + return data.first['category_name']; } } diff --git a/lib/tables/ref_generic_names.dart b/lib/tables/ref_generic_names.dart new file mode 100644 index 0000000..8eb0261 --- /dev/null +++ b/lib/tables/ref_generic_names.dart @@ -0,0 +1,20 @@ +import 'package:supabase_flutter/supabase_flutter.dart'; +import 'package:uuid/uuid.dart'; + +class RefGenericNames { + final SupabaseClient _supabase = Supabase.instance.client; + + Future getList() async { + final data = + await _supabase.from('ref_generic_names').select('generic_name').order('generic_name', ascending: true); + return data.toList(); + } + + Future postGeneric(String name, String uuid) async { + final genericUUID = Uuid().v4(); + + await _supabase + .from('ref_generic_names') + .insert({'ref_generic_names_uuid': genericUUID, 'generic_name': name, 'ref_categories_uuid': uuid}); + } +} diff --git a/lib/tables/ref_manufactorers.dart b/lib/tables/ref_manufactorers.dart new file mode 100644 index 0000000..803e901 --- /dev/null +++ b/lib/tables/ref_manufactorers.dart @@ -0,0 +1,13 @@ +import 'package:supabase_flutter/supabase_flutter.dart'; + +class RefManufactorers { + final SupabaseClient _supabase = Supabase.instance.client; + + Future getList() async { + final data = await _supabase + .from('ref_manufactorers') + .select('manufactorer_name') + .order('manufactorer_name', ascending: true); + return data.toList(); + } +} diff --git a/lib/tables/ref_types.dart b/lib/tables/ref_types.dart new file mode 100644 index 0000000..891e0a9 --- /dev/null +++ b/lib/tables/ref_types.dart @@ -0,0 +1,17 @@ +import 'package:supabase_flutter/supabase_flutter.dart'; +import 'package:uuid/uuid.dart'; + +class RefTypes { + final SupabaseClient _supabase = Supabase.instance.client; + + Future getList() async { + final data = await _supabase.from('ref_types').select('type_name').order('type_name', ascending: true); + return data.toList(); + } + + Future postType(String name) async { + final typeUUID = Uuid().v4(); + + await _supabase.from('ref_types').insert({'ref_types_uuid': typeUUID, 'type_name': name}); + } +} diff --git a/lib/widgets/dropdown_widget.dart b/lib/widgets/dropdown_widget.dart index 952e49f..e958e82 100644 --- a/lib/widgets/dropdown_widget.dart +++ b/lib/widgets/dropdown_widget.dart @@ -2,41 +2,51 @@ import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:google_fonts/google_fonts.dart'; +typedef OnChangedCallback = void Function(dynamic value); + class DropDownWidget extends StatelessWidget { final String label; final List list; final String listTitle; - const DropDownWidget({super.key, required this.label, required this.list, required this.listTitle}); + final OnChangedCallback onChanged; + const DropDownWidget({ + super.key, + required this.label, + required this.list, + required this.listTitle, + required this.onChanged, + }); @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(label, - style: GoogleFonts.outfit( - textStyle: const TextStyle(color: Colors.white, fontSize: 16), - )), - const Gap(8), - DropdownMenu( - initialSelection: '', - dropdownMenuEntries: [ - for (var item in list) DropdownMenuEntry(label: item[listTitle].toString(), value: item[listTitle]) - ], - textStyle: TextStyle(color: Colors.white), + Text( + '$label:', + style: GoogleFonts.outfit( + textStyle: const TextStyle(color: Colors.white, fontSize: 16), + ), + ), + const Gap(8), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), // Set the desired border radius + border: Border.all(color: Colors.white), // Set the border color + ), + child: DropdownMenu( + initialSelection: '', + dropdownMenuEntries: [ + for (var item in list) + DropdownMenuEntry( + label: item[listTitle].toString(), + value: item[listTitle], + ) + ], + onSelected: onChanged, + width: MediaQuery.of(context).size.width, + textStyle: GoogleFonts.outfit(textStyle: TextStyle(color: Colors.white))), ), - - // DropdownButton( - // isExpanded: true, - // value: list, - // onChanged: (_) {}, - // items: list.map((item) { - // return DropdownMenuItem( - // value: item, - // child: Text(item, overflow: TextOverflow.ellipsis, maxLines: 1), - // ); - // }).toList(), - // ), ], ); } diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index 6f1d1a4..21e0981 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -14,7 +14,7 @@ class InputWidget extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(label, + Text('$label:', style: GoogleFonts.outfit( textStyle: const TextStyle(color: Colors.white, fontSize: 16), )), diff --git a/pubspec.lock b/pubspec.lock index fbb4ea9..12a58e4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -113,6 +113,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -469,6 +477,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -605,6 +621,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.4" + uuid: + dependency: "direct main" + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5a9c830..36c27f7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,6 +18,7 @@ dependencies: supabase_flutter: ^2.8.3 quickalert: ^1.1.0 font_awesome_flutter: ^10.8.0 + uuid: ^4.5.1 dev_dependencies: flutter_test: