This commit is contained in:
Patrick Alvin Alcala 2025-02-28 14:08:05 +08:00
parent 27f00e43a7
commit 3572f90b24
24 changed files with 290 additions and 257 deletions

View file

@ -2,27 +2,27 @@ C/C++ Structured Logz
x x
v/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/additional_project_files.txtC v/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/additional_project_files.txtC
A A
?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ß¶§ÕÔ2  ž•ŽÑ2w ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  Ɖ<EFBFBD>×Ô2  ž•ŽÑ2w
u u
s/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/android_gradle_build.json  ß¶§ÕÔ2Í Ç•ŽÑ2| s/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/android_gradle_build.json  Ɖ<EFBFBD>×Ô2Í Ç•ŽÑ2|
z z
x/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/android_gradle_build_mini.json  ß¶§ÕÔ2æ ò•ŽÑ2i x/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/android_gradle_build_mini.json  Ɖ<EFBFBD>×Ô2æ ò•ŽÑ2i
g g
e/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/build.ninja  à¶§ÕÔ2 º ¾”ŽÑ2m e/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/build.ninja  Ɖ<EFBFBD>×Ô2 º ¾”ŽÑ2m
k k
i/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/build.ninja.txt  à¶§ÕÔ2r i/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/build.ninja.txt  Ɖ<EFBFBD>×Ô2r
p p
n/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/build_file_index.txt  à¶§ÕÔ2 ^ ô•ŽÑ2s n/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/build_file_index.txt  Ɖ<EFBFBD>×Ô2 ^ ô•ŽÑ2s
q q
o/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/compile_commands.json  à¶§ÕÔ2w o/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/compile_commands.json  lj<EFBFBD>×Ô2w
u u
s/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/compile_commands.json.bin  à¶§ÕÔ2 } s/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/compile_commands.json.bin  lj<EFBFBD>×Ô2 }
{ {
y/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/metadata_generation_command.txt  à¶§ÕÔ2 y/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/metadata_generation_command.txt  lj<EFBFBD>×Ô2
à ô•ŽÑ2p à ô•ŽÑ2p
n n
l/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/prefab_config.json  à¶§ÕÔ2  ( ô•ŽÑ2u l/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/prefab_config.json  lj<EFBFBD>×Ô2  ( ô•ŽÑ2u
s s
q/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/symbol_folder_index.txt  à¶§ÕÔ2  h ô•ŽÑ2b q/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/arm64-v8a/symbol_folder_index.txt  lj<EFBFBD>×Ô2  h ô•ŽÑ2b
` `
^/home/patrick/fvm/versions/3.29.0/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  à¶§ÕÔ2 ¤ ˆÈ¼<C388>Ñ2 ^/home/patrick/fvm/versions/3.29.0/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  lj<EFBFBD>×Ô2 ¤ ˆÈ¼<C388>Ñ2

View file

@ -2,27 +2,27 @@ C/C++ Structured Log|
z z
x/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/additional_project_files.txtC x/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/additional_project_files.txtC
A A
?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ÷§ÕÔ2  ÅîŽÑ2y ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ͉<EFBFBD>×Ô2  ÅîŽÑ2y
w w
u/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/android_gradle_build.json  ÷§ÕÔ2Ñ ÆîŽÑ2~ u/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/android_gradle_build.json  ͉<EFBFBD>×Ô2Ñ ÆîŽÑ2~
| |
z/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/android_gradle_build_mini.json  ÷§ÕÔ2ê ÇîŽÑ2k z/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/android_gradle_build_mini.json  ͉<EFBFBD>×Ô2ê ÇîŽÑ2k
i i
g/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/build.ninja  ÷§ÕÔ2ªº ¼îŽÑ2o g/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/build.ninja  ͉<EFBFBD>×Ô2ªº ¼îŽÑ2o
m m
k/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/build.ninja.txt  ÷§ÕÔ2t k/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/build.ninja.txt  ͉<EFBFBD>×Ô2t
r r
p/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/build_file_index.txt  ÷§ÕÔ2 ^ ÈîŽÑ2u p/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/build_file_index.txt  ͉<EFBFBD>×Ô2 ^ ÈîŽÑ2u
s s
q/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/compile_commands.json  ÷§ÕÔ2y q/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/compile_commands.json  ͉<EFBFBD>×Ô2y
w w
u/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/compile_commands.json.bin  ÷§ÕÔ2  u/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/compile_commands.json.bin  ͉<EFBFBD>×Ô2 
} }
{/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/metadata_generation_command.txt  ÷§ÕÔ2 {/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/metadata_generation_command.txt  ͉<EFBFBD>×Ô2
Í ÈîŽÑ2r Í ÈîŽÑ2r
p p
n/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/prefab_config.json  ÷§ÕÔ2  ( ÈîŽÑ2w n/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/prefab_config.json  ͉<EFBFBD>×Ô2  ( ÈîŽÑ2w
u u
s/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/symbol_folder_index.txt  Ä·§ÕÔ2  j ÈîŽÑ2b s/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/armeabi-v7a/symbol_folder_index.txt  ͉<EFBFBD>×Ô2  j ÈîŽÑ2b
` `
^/home/patrick/fvm/versions/3.29.0/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Ä·§ÕÔ2 ¤ ˆÈ¼<C388>Ñ2 ^/home/patrick/fvm/versions/3.29.0/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  ͉<EFBFBD>×Ô2 ¤ ˆÈ¼<C388>Ñ2

View file

@ -2,27 +2,27 @@ C/C++ Structured Logt
r r
p/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/additional_project_files.txtC p/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/additional_project_files.txtC
A A
?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  €¸§ÕÔ2  ðŽÑ2q ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  Ô‰<EFBFBD>×Ô2  ðŽÑ2q
o o
m/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/android_gradle_build.json  €¸§ÕÔ2Á ˜ðŽÑ2v m/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/android_gradle_build.json  Ô‰<EFBFBD>×Ô2Á ˜ðŽÑ2v
t t
r/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/android_gradle_build_mini.json  €¸§ÕÔ2Ú šðŽÑ2c r/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/android_gradle_build_mini.json  Ô‰<EFBFBD>×Ô2Ú šðŽÑ2c
a a
_/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/build.ninja  €¸§ÕÔ2‚º ŽðŽÑ2g _/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/build.ninja  Ô‰<EFBFBD>×Ô2‚º ŽðŽÑ2g
e e
c/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/build.ninja.txt  €¸§ÕÔ2l c/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/build.ninja.txt  Ô‰<EFBFBD>×Ô2l
j j
h/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/build_file_index.txt  €¸§ÕÔ2 ^ ðŽÑ2m h/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/build_file_index.txt  Ô‰<EFBFBD>×Ô2 ^ ðŽÑ2m
k k
i/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/compile_commands.json  €¸§ÕÔ2q i/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/compile_commands.json  Ô‰<EFBFBD>×Ô2q
o o
m/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/compile_commands.json.bin  €¸§ÕÔ2 w m/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/compile_commands.json.bin  Ô‰<EFBFBD>×Ô2 w
u u
s/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/metadata_generation_command.txt  €¸§ÕÔ2 s/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/metadata_generation_command.txt  Ô‰<EFBFBD>×Ô2
¥ ðŽÑ2j ¥ ðŽÑ2j
h h
f/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/prefab_config.json  €¸§ÕÔ2  ( ðŽÑ2o f/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/prefab_config.json  Ô‰<EFBFBD>×Ô2  ( ðŽÑ2o
m m
k/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/symbol_folder_index.txt  €¸§ÕÔ2  b ðŽÑ2b k/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86/symbol_folder_index.txt  Ô‰<EFBFBD>×Ô2  b ðŽÑ2b
` `
^/home/patrick/fvm/versions/3.29.0/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  €¸§ÕÔ2 ¤ ˆÈ¼<C388>Ñ2 ^/home/patrick/fvm/versions/3.29.0/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Ô‰<EFBFBD>×Ô2 ¤ ˆÈ¼<C388>Ñ2

View file

@ -2,27 +2,27 @@ C/C++ Structured Logw
u u
s/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/additional_project_files.txtC s/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/additional_project_files.txtC
A A
?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  Џ§ÕÔ2  ßñŽÑ2t ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ݉<EFBFBD>×Ô2  ßñŽÑ2t
r r
p/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/android_gradle_build.json  Џ§ÕÔ2Ç àñŽÑ2y p/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/android_gradle_build.json  ݉<EFBFBD>×Ô2Ç àñŽÑ2y
w w
u/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/android_gradle_build_mini.json  Џ§ÕÔ2à áñŽÑ2f u/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/android_gradle_build_mini.json  ݉<EFBFBD>×Ô2à áñŽÑ2f
d d
b/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/build.ninja  Џ§ÕÔ2‘º ÚñŽÑ2j b/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/build.ninja  ݉<EFBFBD>×Ô2‘º ÚñŽÑ2j
h h
f/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/build.ninja.txt  Џ§ÕÔ2o f/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/build.ninja.txt  ݉<EFBFBD>×Ô2o
m m
k/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/build_file_index.txt  Џ§ÕÔ2 ^ âñŽÑ2p k/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/build_file_index.txt  ݉<EFBFBD>×Ô2 ^ âñŽÑ2p
n n
l/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/compile_commands.json  Џ§ÕÔ2t l/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/compile_commands.json  ݉<EFBFBD>×Ô2t
r r
p/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/compile_commands.json.bin  Џ§ÕÔ2 z p/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/compile_commands.json.bin  ݉<EFBFBD>×Ô2 z
x x
v/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/metadata_generation_command.txt  Џ§ÕÔ2 v/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/metadata_generation_command.txt  ݉<EFBFBD>×Ô2
´ âñŽÑ2m ´ âñŽÑ2m
k k
i/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/prefab_config.json  Џ§ÕÔ2  ( âñŽÑ2r i/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/prefab_config.json  ݉<EFBFBD>×Ô2  ( âñŽÑ2r
p p
n/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/symbol_folder_index.txt  Џ§ÕÔ2  e âñŽÑ2b n/home/patrick/Documents/WebApps/pharmacy_mobile/android/app/.cxx/Debug/k6q1g3c4/x86_64/symbol_folder_index.txt  ݉<EFBFBD>×Ô2  e âñŽÑ2b
` `
^/home/patrick/fvm/versions/3.29.0/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Џ§ÕÔ2 ¤ ˆÈ¼<C388>Ñ2 ^/home/patrick/fvm/versions/3.29.0/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  ݉<EFBFBD>×Ô2 ¤ ˆÈ¼<C388>Ñ2

View file

@ -0,0 +1,10 @@
import 'package:flutter/widgets.dart';
Future<bool> checkExisting(dynamic table, TextEditingController controller) async {
try {
final uuid = await table.getUUID(controller.text);
return uuid.isNotEmpty;
} catch (e) {
return false;
}
}

View file

@ -1,5 +1,3 @@
import 'dart:developer';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart';
@ -7,7 +5,6 @@ import 'package:pharmacy_mobile/tables/ref_categories.dart';
import 'package:pharmacy_mobile/tables/ref_generic_names.dart'; import 'package:pharmacy_mobile/tables/ref_generic_names.dart';
import 'package:pharmacy_mobile/widgets/button_widget.dart'; import 'package:pharmacy_mobile/widgets/button_widget.dart';
import 'package:pharmacy_mobile/widgets/dropdown_widget.dart'; import 'package:pharmacy_mobile/widgets/dropdown_widget.dart';
import 'package:pharmacy_mobile/widgets/form_border_widget.dart';
import 'package:pharmacy_mobile/widgets/form_border_widget2.dart'; import 'package:pharmacy_mobile/widgets/form_border_widget2.dart';
import 'package:pharmacy_mobile/widgets/input_widget.dart'; import 'package:pharmacy_mobile/widgets/input_widget.dart';
import 'package:pharmacy_mobile/widgets/page_background_widget.dart'; import 'package:pharmacy_mobile/widgets/page_background_widget.dart';
@ -91,8 +88,6 @@ class _AddGenericsPageState extends State<AddGenericsPage> {
} }
_categoryUUID = await _refCategories.getUUID(_selectedCategory); _categoryUUID = await _refCategories.getUUID(_selectedCategory);
log('_selectedCategory: $_selectedCategory');
log('_categoryUUID: $_categoryUUID');
final post = await _refGenericNames.postGeneric(_nameController.text, _categoryUUID); final post = await _refGenericNames.postGeneric(_nameController.text, _categoryUUID);

View file

@ -1,10 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:go_router/go_router.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart';
import 'package:pharmacy_mobile/functions/checkexisting_function.dart';
import 'package:pharmacy_mobile/tables/ref_manufactorers.dart';
import 'package:pharmacy_mobile/widgets/button_widget.dart'; import 'package:pharmacy_mobile/widgets/button_widget.dart';
import 'package:pharmacy_mobile/widgets/form_border_widget2.dart'; import 'package:pharmacy_mobile/widgets/form_border_widget2.dart';
import 'package:pharmacy_mobile/widgets/input_widget.dart'; import 'package:pharmacy_mobile/widgets/input_widget.dart';
import 'package:pharmacy_mobile/widgets/page_background_widget.dart'; import 'package:pharmacy_mobile/widgets/page_background_widget.dart';
import 'package:pharmacy_mobile/widgets/snackbar_widget.dart';
import 'package:pharmacy_mobile/widgets/text_widget.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart';
import 'package:pharmacy_mobile/widgets/title_widget.dart'; import 'package:pharmacy_mobile/widgets/title_widget.dart';
@ -19,17 +23,45 @@ class _AddManufactorerPageState extends State<AddManufactorerPage> {
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();
final _nameController = TextEditingController(); final _nameController = TextEditingController();
final _addressController = TextEditingController(); final _addressController = TextEditingController();
final _refManufactorers = RefManufactorers();
late bool _isLoading = false; late bool _isLoading = false;
void saveManufactorer() async { void _saveManufactorer() async {
setState(() => _isLoading = true); setState(() => _isLoading = true);
if (await InternetConnectionChecker.instance.hasConnection) { try {
// final existing = await _checkExisting(); if (await InternetConnectionChecker.instance.hasConnection) {
} final existing = await checkExisting(_refManufactorers, _nameController);
setState(() => _isLoading = false); if (existing && mounted) {
showNotification(context, 'Manufactorer already listed', false);
return;
}
final post = await _refManufactorers.postManufactorer(_nameController.text, _addressController.text);
if (post && mounted) {
showNotification(context, 'Manufactorer added to list', true);
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) {
context.push('/main');
}
});
}
} else {
if (mounted) {
showNotification(context, 'Error: No Internet Connection', false);
}
}
} catch (e) {
if (mounted) {
showNotification(context, 'Error: $e', false);
}
} finally {
setState(() => _isLoading = false);
}
} }
@override @override
@ -71,7 +103,7 @@ class _AddManufactorerPageState extends State<AddManufactorerPage> {
if (_isLoading) if (_isLoading)
const Center(child: CircularProgressIndicator(color: Colors.white)) const Center(child: CircularProgressIndicator(color: Colors.white))
else else
ButtonWidget(text: 'Add', onPressed: saveManufactorer) ButtonWidget(text: 'Save Manufactorer', onPressed: _saveManufactorer)
], ],
))) )))
], ],

View file

@ -1,8 +1,4 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
@ -60,33 +56,6 @@ class _AddMedicinePageState extends State<AddMedicinePage> {
late bool imageUploaded = false; late bool imageUploaded = false;
late String imageUrl = ''; late String imageUrl = '';
// void _checkResult(List list, String name) {
// if (list.isEmpty) {
// if (mounted) {
// showNotification(context, 'Error: No $name Found', false);
// WidgetsBinding.instance.addPostFrameCallback((_) {
// if (mounted) {
// context.push('/main');
// }
// });
// }
// } else {
// setState(() => {});
// }
// }
// Future<Uint8List> compressFile(XFile file) async {
// var result = await FlutterImageCompress.compressWithFile(
// file.path,
// minWidth: 1020,
// minHeight: 765,
// quality: 90,
// format: CompressFormat.webp,
// );
// return result;
// }
Future<void> _getGenerics() async { Future<void> _getGenerics() async {
_genericNameList = await _refGenericNames.getList(); _genericNameList = await _refGenericNames.getList();
setState(() { setState(() {
@ -199,15 +168,16 @@ class _AddMedicinePageState extends State<AddMedicinePage> {
final imageBytes = await image!.readAsBytes(); final imageBytes = await image!.readAsBytes();
final webpImage = await _webpConvert(imageBytes); final webpImage = await _webpConvert(imageBytes);
late bool uploaded = false;
uuid = imageName; uuid = imageName;
if (mounted) { if (mounted) {
imageUrl = await _storage.uploadImage(context, storageName, webpImage, '$imageName.webp'); uploaded = await _storage.uploadImage(context, storageName, webpImage, '$imageName.webp');
} }
setState(() { setState(() {
if (imageUrl.isEmpty) { if (!uploaded) {
if (mounted) { if (mounted) {
showNotification(context, 'Image Upload failed, try again.', false); showNotification(context, 'Image Upload failed, try again.', false);
} }
@ -218,8 +188,6 @@ class _AddMedicinePageState extends State<AddMedicinePage> {
Future<Uint8List> _webpConvert(Uint8List file) async { Future<Uint8List> _webpConvert(Uint8List file) async {
final result = await FlutterImageCompress.compressWithList( final result = await FlutterImageCompress.compressWithList(
file, file,
// minHeight: 1080,
// minWidth: 1080,
quality: 70, quality: 70,
rotate: 0, rotate: 0,
keepExif: false, keepExif: false,

View file

@ -1,12 +1,8 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart';
import 'package:pharmacy_mobile/functions/barcode_scan_function.dart'; import 'package:pharmacy_mobile/functions/barcode_scan_function.dart';
import 'package:pharmacy_mobile/functions/checkresult_function.dart'; import 'package:pharmacy_mobile/functions/checkresult_function.dart';
import 'package:pharmacy_mobile/security/encryption.dart';
import 'package:pharmacy_mobile/tables/ref_medicines.dart'; import 'package:pharmacy_mobile/tables/ref_medicines.dart';
import 'package:pharmacy_mobile/tables/stocks.dart'; import 'package:pharmacy_mobile/tables/stocks.dart';
import 'package:pharmacy_mobile/widgets/button_widget.dart'; import 'package:pharmacy_mobile/widgets/button_widget.dart';
@ -20,7 +16,6 @@ import 'package:pharmacy_mobile/widgets/snackbar_widget.dart';
import 'package:pharmacy_mobile/widgets/text_widget.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart';
import 'package:pharmacy_mobile/widgets/title_widget.dart'; import 'package:pharmacy_mobile/widgets/title_widget.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:simple_barcode_scanner/simple_barcode_scanner.dart';
class AddStockPage extends StatefulWidget { class AddStockPage extends StatefulWidget {
const AddStockPage({super.key}); const AddStockPage({super.key});
@ -34,18 +29,16 @@ class _AddStockPageState extends State<AddStockPage> with WidgetsBindingObserver
final _refMedicines = RefMedicines(); final _refMedicines = RefMedicines();
final _quantityController = TextEditingController(); final _quantityController = TextEditingController();
final _dateController = TextEditingController(); final _dateController = TextEditingController();
final _medicineController = TextEditingController();
final _stocks = Stocks(); final _stocks = Stocks();
final bool _isLoading = false; late bool _isLoading = false;
late List _medicineList = []; late List _medicineList = [];
late String _selectedMedicine = ''; late String _selectedMedicine = '';
late DateTime selectedDate = DateTime.now(); late DateTime selectedDate = DateTime.now();
late String barcode = ''; late String barcode = '';
void _getMedicines() async { void _getMedicines() async {
_medicineList = await _refMedicines.getList2(); _medicineList = await _refMedicines.getList();
setState(() { setState(() {
checkResult(context, _medicineList, 'Medicines'); checkResult(context, _medicineList, 'Medicines');
@ -71,11 +64,27 @@ class _AddStockPageState extends State<AddStockPage> with WidgetsBindingObserver
} }
void _saveStock() async { void _saveStock() async {
final stockNameUUID = await _refMedicines.getUUID(_selectedMedicine); setState(() => _isLoading = true);
final stockQuantity = _quantityController.text;
final stockExpiration = _dateController.text;
await _stocks.postStock(stockNameUUID, stockExpiration, stockQuantity); try {
if (await InternetConnectionChecker.instance.hasConnection) {
final stockNameUUID = await _refMedicines.getUUID(_selectedMedicine);
final stockQuantity = _quantityController.text;
final stockExpiration = _dateController.text;
await _stocks.postStock(stockNameUUID, stockExpiration, stockQuantity);
} else {
if (mounted) {
showNotification(context, 'Error: No Internet Connection', false);
}
}
} catch (e) {
if (mounted) {
showNotification(context, 'Error: $e', false);
}
} finally {
setState(() => _isLoading = false);
}
} }
Future<void> _scanBarcode() async { Future<void> _scanBarcode() async {
@ -188,12 +197,10 @@ class _AddStockPageState extends State<AddStockPage> with WidgetsBindingObserver
value: selectedDate, value: selectedDate,
), ),
const Gap(32), const Gap(32),
ButtonWidget(text: 'Add Stock', onPressed: _saveStock), if (_isLoading)
const Gap(16), const Center(child: CircularProgressIndicator(color: Colors.white))
TextWidget( else
text: barcode, ButtonWidget(text: 'Add Stock', onPressed: _saveStock),
size: 14,
)
], ],
), ),
), ),

View file

@ -3,10 +3,8 @@ import 'package:flutter/material.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart';
import 'package:pharmacy_mobile/tables/ref_types.dart'; import 'package:pharmacy_mobile/tables/ref_types.dart';
import 'package:pharmacy_mobile/widgets/button_widget.dart'; import 'package:pharmacy_mobile/widgets/button_widget.dart';
import 'package:pharmacy_mobile/widgets/form_border_widget.dart';
import 'package:pharmacy_mobile/widgets/form_border_widget2.dart'; import 'package:pharmacy_mobile/widgets/form_border_widget2.dart';
import 'package:pharmacy_mobile/widgets/input_widget.dart'; import 'package:pharmacy_mobile/widgets/input_widget.dart';
import 'package:pharmacy_mobile/widgets/logo_widget.dart';
import 'package:pharmacy_mobile/widgets/page_background_widget.dart'; import 'package:pharmacy_mobile/widgets/page_background_widget.dart';
import 'package:pharmacy_mobile/widgets/snackbar_widget.dart'; import 'package:pharmacy_mobile/widgets/snackbar_widget.dart';
import 'package:pharmacy_mobile/widgets/text_widget.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart';

View file

@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pharmacy_mobile/tables/storage.dart';
import 'package:pharmacy_mobile/widgets/page_background_widget.dart'; import 'package:pharmacy_mobile/widgets/page_background_widget.dart';
class CustomerItemviewPage extends StatelessWidget { class CustomerItemviewPage extends StatelessWidget {
@ -7,13 +6,13 @@ class CustomerItemviewPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final storage = Storage(); // final storage = Storage();
void getURL() async { // void getURL() async {
final image = await storage.getPublicURL('ref_medicines_images', 'cb6eafdb-d86f-460a-9571-44446570d4cb.webp'); // final image = await storage.getPublicURL('ref_medicines_images', 'cb6eafdb-d86f-460a-9571-44446570d4cb.webp');
// setState(() { // // setState(() {
// imageUrl = image; // // imageUrl = image;
} // }
return Scaffold( return Scaffold(
body: PageBackgroundWidget( body: PageBackgroundWidget(

View file

@ -1,15 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:pharmacy_mobile/auth/auth_service.dart';
import 'package:pharmacy_mobile/widgets/button_widget.dart';
import 'package:pharmacy_mobile/widgets/consultation_widget.dart'; import 'package:pharmacy_mobile/widgets/consultation_widget.dart';
import 'package:pharmacy_mobile/widgets/logo_widget.dart'; import 'package:pharmacy_mobile/widgets/logo_widget.dart';
import 'package:pharmacy_mobile/widgets/menu_widget.dart';
import 'package:pharmacy_mobile/widgets/page_background_widget.dart'; import 'package:pharmacy_mobile/widgets/page_background_widget.dart';
import 'package:pharmacy_mobile/widgets/snackbar_widget.dart';
import 'package:pharmacy_mobile/widgets/text_widget.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart';
import 'package:pharmacy_mobile/widgets/title_widget.dart';
import 'package:go_router/go_router.dart';
class CustomerMainPage extends StatefulWidget { class CustomerMainPage extends StatefulWidget {
// final NotchBottomBarController? controller; // final NotchBottomBarController? controller;

View file

@ -1,17 +1,11 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:pharmacy_mobile/tables/ref_medicines.dart';
import 'package:pharmacy_mobile/tables/stocks.dart'; import 'package:pharmacy_mobile/tables/stocks.dart';
import 'package:pharmacy_mobile/tables/storage.dart'; import 'package:pharmacy_mobile/tables/storage.dart';
import 'package:pharmacy_mobile/widgets/button_widget.dart';
import 'package:pharmacy_mobile/widgets/input_widget.dart'; import 'package:pharmacy_mobile/widgets/input_widget.dart';
import 'package:pharmacy_mobile/widgets/item_card_widget.dart'; import 'package:pharmacy_mobile/widgets/item_card_widget.dart';
import 'package:pharmacy_mobile/widgets/logo_widget.dart'; import 'package:pharmacy_mobile/widgets/logo_widget.dart';
import 'package:pharmacy_mobile/widgets/page_background_widget.dart'; import 'package:pharmacy_mobile/widgets/page_background_widget.dart';
import 'package:pharmacy_mobile/widgets/text_widget.dart';
import 'package:pharmacy_mobile/widgets/title_widget.dart';
class CustomerSearchPage extends StatefulWidget { class CustomerSearchPage extends StatefulWidget {
// final NotchBottomBarController? controller; // final NotchBottomBarController? controller;

View file

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:pharmacy_mobile/tables/stocks.dart'; import 'package:pharmacy_mobile/tables/stocks.dart';
import 'package:pharmacy_mobile/tables/storage.dart'; import 'package:pharmacy_mobile/tables/storage.dart';
@ -18,7 +17,6 @@ class ListStocksPage extends StatefulWidget {
class _ListStocksPageState extends State<ListStocksPage> { class _ListStocksPageState extends State<ListStocksPage> {
final _stocks = Stocks(); final _stocks = Stocks();
final _storage = Storage();
late List _stockList = []; late List _stockList = [];
bool _isLoading = false; bool _isLoading = false;

View file

@ -53,7 +53,7 @@ class _MainPageState extends State<MainPage> {
MenuWidget( MenuWidget(
icon: FontAwesomeIcons.circlePlus, icon: FontAwesomeIcons.circlePlus,
text: 'Add Manufactorer', text: 'Add Manufactorer',
description: 'Add Manufactorer to the record', description: 'Register manufactorer to the list',
onPressed: () => {context.push('/addmanufactorer')}, onPressed: () => {context.push('/addmanufactorer')},
color: 'blue', color: 'blue',
), ),
@ -61,7 +61,7 @@ class _MainPageState extends State<MainPage> {
MenuWidget( MenuWidget(
icon: FontAwesomeIcons.circlePlus, icon: FontAwesomeIcons.circlePlus,
text: 'Add Type', text: 'Add Type',
description: 'Create a new medical type', description: 'Register new medical type',
onPressed: () => {context.push('/addtype')}, onPressed: () => {context.push('/addtype')},
color: 'blue', color: 'blue',
), ),
@ -69,7 +69,7 @@ class _MainPageState extends State<MainPage> {
MenuWidget( MenuWidget(
icon: FontAwesomeIcons.circlePlus, icon: FontAwesomeIcons.circlePlus,
text: 'Add Category', text: 'Add Category',
description: 'Create a new medicine category', description: 'Register new medicine category',
onPressed: () => {context.push('/addcategory')}, onPressed: () => {context.push('/addcategory')},
color: 'blue', color: 'blue',
), ),
@ -77,35 +77,35 @@ class _MainPageState extends State<MainPage> {
MenuWidget( MenuWidget(
icon: FontAwesomeIcons.circlePlus, icon: FontAwesomeIcons.circlePlus,
text: 'Add Generics', text: 'Add Generics',
description: 'Add generic name on the list', description: 'Register generic name',
onPressed: () => {context.push('/addgenerics')}, onPressed: () => {context.push('/addgenerics')},
color: 'blue'), color: 'blue'),
const Gap(32), const Gap(32),
MenuWidget( MenuWidget(
icon: FontAwesomeIcons.circlePlus, icon: FontAwesomeIcons.circlePlus,
text: 'Add Medicine', text: 'Add Medicine',
description: 'Add generic name on the list', description: 'Register medicine to the global list',
onPressed: () => {context.push('/addmedicines')}, onPressed: () => {context.push('/addmedicines')},
color: 'green'), color: 'green'),
const Gap(16), const Gap(16),
MenuWidget( MenuWidget(
icon: FontAwesomeIcons.circlePlus, icon: FontAwesomeIcons.circlePlus,
text: 'Add Stock', text: 'Add Stock',
description: 'Add generic name on the list', description: 'Add a new stock',
onPressed: () => {context.push('/addstock')}, onPressed: () => {context.push('/addstock')},
color: 'green'), color: 'green'),
const Gap(32), const Gap(32),
MenuWidget( MenuWidget(
icon: Icons.delete, icon: Icons.delete,
text: 'Remove Stock', text: 'Remove Stock',
description: 'Add generic name on the list', description: 'Reduce stock based on purchase',
onPressed: () => {context.push('/deletestock')}, onPressed: () => {context.push('/deletestock')},
color: 'red'), color: 'red'),
const Gap(32), const Gap(32),
MenuWidget( MenuWidget(
icon: FontAwesomeIcons.listCheck, icon: FontAwesomeIcons.listCheck,
text: 'List of Stocks', text: 'List of Stocks',
description: 'Add generic name on the list', description: 'View the list of available stocks',
onPressed: () => {context.push('/liststocks')}, onPressed: () => {context.push('/liststocks')},
color: 'yellow'), color: 'yellow'),
const Gap(40), const Gap(40),

View file

@ -1,12 +1,9 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart';
import 'package:pharmacy_mobile/auth/auth_service.dart'; import 'package:pharmacy_mobile/auth/auth_service.dart';
import 'package:pharmacy_mobile/widgets/button_widget.dart'; import 'package:pharmacy_mobile/widgets/button_widget.dart';
import 'package:pharmacy_mobile/widgets/input_widget.dart'; import 'package:pharmacy_mobile/widgets/input_widget.dart';
import 'package:pharmacy_mobile/widgets/logo_widget.dart';
import 'package:pharmacy_mobile/widgets/page_background_widget.dart'; import 'package:pharmacy_mobile/widgets/page_background_widget.dart';
import 'package:pharmacy_mobile/widgets/snackbar_widget.dart'; import 'package:pharmacy_mobile/widgets/snackbar_widget.dart';
import 'package:pharmacy_mobile/widgets/text_widget.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart';
@ -35,7 +32,6 @@ class _RegisterPageState extends State<RegisterPage> {
final confirmPassword = _confirmPasswordController.text; final confirmPassword = _confirmPasswordController.text;
if (email.isEmpty) { if (email.isEmpty) {
log('message');
if (mounted) { if (mounted) {
showNotification(context, 'Error: Please enter a valid email', false); showNotification(context, 'Error: Please enter a valid email', false);
} }

View file

@ -44,13 +44,4 @@ class RefGenericNames {
return false; return false;
} }
} }
Future<List> getSample() async {
try {
final data = await _supabase.from('ref_generic_names').select('''generic_name, ref_categories(category_name)''');
return data.toList();
} catch (e) {
return [];
}
}
} }

View file

@ -1,21 +1,41 @@
import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:uuid/uuid.dart';
class RefManufactorers { class RefManufactorers {
final SupabaseClient _supabase = Supabase.instance.client; final SupabaseClient _supabase = Supabase.instance.client;
Future<List> getList() async { Future<List> getList() async {
final data = await _supabase try {
.from('ref_manufactorers') final data = await _supabase
.select('manufactorer_name') .from('ref_manufactorers')
.order('manufactorer_name', ascending: true); .select('manufactorer_name')
return data.toList(); .order('manufactorer_name', ascending: true);
return data.toList();
} catch (e) {
return [];
}
} }
Future<String> getUUID(String name) async { Future<String> getUUID(String name) async {
final data = try {
await _supabase.from('ref_manufactorers').select('ref_manufactorers_uuid').eq('manufactorer_name', name); final data =
return data.first['ref_manufactorers_uuid'].toString(); await _supabase.from('ref_manufactorers').select('ref_manufactorers_uuid').eq('manufactorer_name', name);
return data.first['ref_manufactorers_uuid'].toString();
} catch (e) {
return '';
}
} }
Future<bool> postManufactorer(String name, String address) async {
try {
final genericUUID = Uuid().v4();
await _supabase
.from('ref_manufactorers')
.insert({'ref_manufactorers_uuid': genericUUID, 'manufactorer_name': name, 'manufactorer_address': address});
return true;
} catch (e) {
return false;
}
}
} }

View file

@ -4,37 +4,48 @@ class RefMedicines {
final SupabaseClient _supabase = Supabase.instance.client; final SupabaseClient _supabase = Supabase.instance.client;
Future<List> getList() async { Future<List> getList() async {
final data = await _supabase.from('ref_medicines').select('medicine_name').order('medicine_name', ascending: true); try {
return data.toList(); final data = await _supabase
} .from('ref_medicines')
.select('medicine_name, ref_manufactorers(manufactorer_name)')
Future<List> getList2() async { .order('medicine_name', ascending: true);
final data = await _supabase return data.toList();
.from('ref_medicines') } catch (e) {
.select('medicine_name, ref_manufactorers(manufactorer_name)') return [];
.order('medicine_name', ascending: true); }
return data.toList();
} }
Future<List> getListWithUUID() async { Future<List> getListWithUUID() async {
final data = await _supabase try {
.from('ref_medicines') final data = await _supabase
.select('ref_medicines_uuid, medicine_name') .from('ref_medicines')
.order('medicine_name', ascending: true); .select('ref_medicines_uuid, medicine_name')
return data.toList(); .order('medicine_name', ascending: true);
return data.toList();
} catch (e) {
return [];
}
} }
Future<String> getUUID(String name) async { Future<String> getUUID(String name) async {
final data = await _supabase.from('ref_medicines').select('ref_medicines_uuid').eq('medicine_name', name); try {
return data.first['ref_medicines_uuid']; final data = await _supabase.from('ref_medicines').select('ref_medicines_uuid').eq('medicine_name', name);
return data.first['ref_medicines_uuid'];
} catch (e) {
return '';
}
} }
Future<String> getBarcode(String name) async { Future<String> getBarcode(String name) async {
final data = await _supabase.from('ref_medicines').select('barcode').eq('medicine_name', name); try {
return data.first['barcode']; final data = await _supabase.from('ref_medicines').select('barcode').eq('medicine_name', name);
return data.first['barcode'];
} catch (e) {
return '';
}
} }
Future<void> postMedicine(String uuid, String name, String muuid, String guuid, String tuuid, String barcode) async { Future<bool> postMedicine(String uuid, String name, String muuid, String guuid, String tuuid, String barcode) async {
final medicine = { final medicine = {
'ref_medicines_uuid': uuid, 'ref_medicines_uuid': uuid,
'medicine_name': name, 'medicine_name': name,
@ -44,6 +55,11 @@ class RefMedicines {
'barcode': barcode 'barcode': barcode
}; };
await _supabase.from('ref_medicines').insert(medicine); try {
await _supabase.from('ref_medicines').insert(medicine);
return true;
} catch (e) {
return false;
}
} }
} }

View file

@ -5,18 +5,31 @@ class RefTypes {
final SupabaseClient _supabase = Supabase.instance.client; final SupabaseClient _supabase = Supabase.instance.client;
Future<List> getList() async { Future<List> getList() async {
final data = await _supabase.from('ref_types').select('type_name').order('type_name', ascending: true); try {
return data.toList(); final data = await _supabase.from('ref_types').select('type_name').order('type_name', ascending: true);
return data.toList();
} catch (e) {
return [];
}
} }
Future<String> getUUID(String name) async { Future<String> getUUID(String name) async {
final data = await _supabase.from('ref_types').select('ref_types_uuid').eq('type_name', name); try {
return data.first['ref_types_uuid'].toString(); final data = await _supabase.from('ref_types').select('ref_types_uuid').eq('type_name', name);
return data.first['ref_types_uuid'].toString();
} catch (e) {
return '';
}
} }
Future<void> postType(String name) async { Future<bool> postType(String name) async {
final typeUUID = Uuid().v4(); final typeUUID = Uuid().v4();
await _supabase.from('ref_types').insert({'ref_types_uuid': typeUUID, 'type_name': name}); try {
await _supabase.from('ref_types').insert({'ref_types_uuid': typeUUID, 'type_name': name});
return true;
} catch (e) {
return false;
}
} }
} }

View file

@ -9,31 +9,39 @@ class Stocks {
Future<List> getList() async { Future<List> getList() async {
List<Map<String, dynamic>> stockData = []; List<Map<String, dynamic>> stockData = [];
final data = try {
await _supabase.from('stocks').select('ref_medicines(medicine_name), expiration_date, quantity, price'); final data =
await _supabase.from('stocks').select('ref_medicines(medicine_name), expiration_date, quantity, price');
for (var item in data) { for (var item in data) {
stockData.add({ stockData.add({
'medicine_name': item['ref_medicines']['medicine_name'], 'medicine_name': item['ref_medicines']['medicine_name'],
'quantity': item['quantity'].toString(), 'quantity': item['quantity'].toString(),
'expiration_date': item['expiration_date'], 'expiration_date': item['expiration_date'],
'price': item['price'], 'price': item['price'],
}); });
}
return stockData;
} catch (e) {
return [];
} }
return stockData;
} }
Future<String> getUUID(String name) async { Future<String> getUUID(String name) async {
final medUUID = await _supabase.from('ref_medicines').select('ref_medicines_uuid').eq('medicine_name', name); try {
final data = await _supabase final medUUID = await _supabase.from('ref_medicines').select('ref_medicines_uuid').eq('medicine_name', name);
.from('stocks') final data = await _supabase
.select('stocks_uuid') .from('stocks')
.eq('ref_medicines_uuid', medUUID.first['ref_medicines_uuid']); .select('stocks_uuid')
return data.first['stocks_uuid'].toString(); .eq('ref_medicines_uuid', medUUID.first['ref_medicines_uuid']);
return data.first['stocks_uuid'].toString();
} catch (e) {
return '';
}
} }
Future<void> postStock(String muuid, String name, String quantity) async { Future<bool> postStock(String muuid, String name, String quantity) async {
final uuid = Uuid().v4(); final uuid = Uuid().v4();
final stock = { final stock = {
@ -43,15 +51,29 @@ class Stocks {
'quantity': quantity, 'quantity': quantity,
}; };
await _supabase.from('stocks').insert(stock); try {
await _supabase.from('stocks').insert(stock);
return true;
} catch (e) {
return false;
}
} }
Future<String> getQuantity(String uuid) async { Future<String> getQuantity(String uuid) async {
final data = await _supabase.from('stocks').select('quantity').eq('stocks_uuid', uuid); try {
return data.first['quantity'].toString(); final data = await _supabase.from('stocks').select('quantity').eq('stocks_uuid', uuid);
return data.first['quantity'].toString();
} catch (e) {
return '';
}
} }
Future<void> updateStock(String uuid, String column, String value) async { Future<bool> updateStock(String uuid, String column, String value) async {
await _supabase.from('stocks').update({column: value}).eq('stocks_uuid', uuid).select(); try {
await _supabase.from('stocks').update({column: value}).eq('stocks_uuid', uuid).select();
return true;
} catch (e) {
return false;
}
} }
} }

View file

@ -1,69 +1,47 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:pharmacy_mobile/widgets/snackbar_widget.dart';
import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:supabase_flutter/supabase_flutter.dart';
class Storage { class Storage {
final SupabaseClient _supabase = Supabase.instance.client; final SupabaseClient _supabase = Supabase.instance.client;
Future<String> createBucket(String name) async { Future<bool> createBucket(String name) async {
try { try {
final response = await _supabase.storage.createBucket(name); final response = await _supabase.storage.createBucket(name);
return response; return response.isNotEmpty;
} catch (e, stackTrace) {
log('Error creating bucket: $e', stackTrace: stackTrace);
rethrow;
}
}
Future<List> getList() async {
try {
final response = await _supabase.storage.listBuckets();
return response;
} catch (e, stackTrace) {
log('Error getting list: $e', stackTrace: stackTrace);
rethrow;
}
}
Future<void> uploadFile(XFile image, String name) async {
try {
final imageString = await image.readAsString(encoding: utf8);
final imageFile = File(imageString);
await _supabase.storage.from('images').upload(name, imageFile);
log('upload Complete');
} catch (e) { } catch (e) {
log('Error getting list: $e'); return false;
rethrow;
} }
} }
Future<String> uploadImage(BuildContext context, String storage, Uint8List image, String name) async { Future<bool> uploadImage(BuildContext context, String storage, Uint8List image, String name) async {
try { try {
final imageBytes = image; final imageBytes = image;
final imagePath = name; final imagePath = name;
await _supabase.storage.from(storage).uploadBinary(imagePath, imageBytes); await _supabase.storage.from(storage).uploadBinary(imagePath, imageBytes);
final imageUrl = _supabase.storage.from(storage).getPublicUrl(imagePath); final imageUrl = _supabase.storage.from(storage).getPublicUrl(imagePath);
return imageUrl; return imageUrl.isNotEmpty;
} catch (e) { } catch (e) {
// ignore: use_build_context_synchronously return false;
showNotification(context, 'Error uploading image: $e', false);
rethrow;
} }
} }
Future<Uint8List> downloadImage(String storage, String name) async { Future<Uint8List> downloadImage(String storage, String name) async {
final Uint8List file = await _supabase.storage.from(storage).download(name); try {
return file; final Uint8List file = await _supabase.storage.from(storage).download(name);
return file;
} catch (e) {
return Uint8List(0);
}
} }
Future<String> getPublicURL(String storage, String name) async { Future<String> getPublicURL(String storage, String name) async {
final String file = _supabase.storage.from(storage).getPublicUrl(name); try {
return file; final String file = _supabase.storage.from(storage).getPublicUrl(name);
return file;
} catch (e) {
return '';
}
} }
} }

View file

@ -3,10 +3,11 @@ import 'package:google_fonts/google_fonts.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
// ignore: must_be_immutable
class DatePickerWidget extends StatefulWidget { class DatePickerWidget extends StatefulWidget {
final String label; final String label;
final TextEditingController controller; final TextEditingController controller;
DateTime value; late DateTime value;
DatePickerWidget({super.key, required this.label, required this.controller, required this.value}); DatePickerWidget({super.key, required this.label, required this.controller, required this.value});

View file

@ -35,7 +35,8 @@ class MenuWidget extends StatelessWidget {
const Color.fromRGBO(104, 156, 59, 0.8), const Color.fromRGBO(104, 156, 59, 0.8),
]; ];
MenuWidget({super.key, required this.text, required this.description, this.icon, this.onPressed, this.color, this.width}); MenuWidget(
{super.key, required this.text, required this.description, this.icon, this.onPressed, this.color, this.width});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {