diff --git a/android/AtomsSA-playStore.jks b/android/AtomsSA-playStore.jks new file mode 100644 index 00000000..0d4a261e Binary files /dev/null and b/android/AtomsSA-playStore.jks differ diff --git a/android/app/build.gradle b/android/app/build.gradle index 02304bd9..e55e2b22 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -26,6 +26,13 @@ apply plugin: 'kotlin-android' apply plugin: 'com.google.gms.google-services' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + + android { compileSdkVersion 33 ndkVersion flutter.ndkVersion @@ -42,18 +49,27 @@ android { // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. minSdkVersion 21 targetSdkVersion 33 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName + versionCode 1 + versionName '1.0.0' } - buildTypes { + signingConfigs { release { - proguardFiles getDefaultProguardFile('proguard-android.txt'), - 'proguard-rules.pro' - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + buildTypes { + debug { signingConfig signingConfigs.debug } + release { + minifyEnabled true + shrinkResources true + signingConfig signingConfigs.release + } } } diff --git a/android/key.properties b/android/key.properties new file mode 100644 index 00000000..6a8cd33e --- /dev/null +++ b/android/key.properties @@ -0,0 +1,4 @@ +storePassword=Cloud@AtomsSA +keyPassword=Cloud@AtomsSA +keyAlias=playstore +storeFile=/Users/sikandersaleem/StudioProjects/cloudsolutions-atoms/android/AtomsSA-playStore.jks diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index e9eac980..2ce29fb9 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -64,7 +64,7 @@ "code": "Code", "serialNumber": "Serial Number", "add": "Add", - "brand": "Brand", + "brand": "manufacture", "clearSearch": "Clear Search", "closed": "Closed", "create": "Create", @@ -84,8 +84,8 @@ "facebook": "facebook", "faultDescription": "Fault Description", "general": "General", - "hospital": "Client", - "hospitalRequired": "Client Required", + "hospital": "Site", + "hospitalRequired": "Site Required", "hotLine": "Hot Line", "jobSheetNumber": "Job Sheet Number", "linkedIn": "linkedIn", @@ -96,9 +96,9 @@ "nameExist": "Name Exist", "newServiceRequest": "New Service Request", "newWord": "New", - "noDateFound": "No Data Found", - "noDeviceFound": "No Device Found", - "noHospitalFound": "No Client Found", + "noDateFound": "No Date Found", + "noDeviceFound": "No Asset Found", + "noHospitalFound": "No Site Found", "noModelFound": "No Model Found", "noServiceRequestFound": "No Service Request Found", "noSnFound": "No SN Found", @@ -106,8 +106,8 @@ "notificationsNotFound": "Notifications Not Found", "noUniteFound": "No Unit Found", "ourWebsite": "Our Website", - "pickDevice": "Pick Device", - "pickHospital": "Pick Client", + "pickDevice": "Pick Asset", + "pickHospital": "Pick Site", "pickUnite": "Pick Unit", "policy": "Policy", "reason1": "The engineer didn't confirm visit date with 2 hours from the request time", @@ -169,10 +169,10 @@ "attachImage": "Attach Image", "callLastSituation": "Call's Last Situation", "customer": "Customer", - "editServiceReport": "Edit Service Report", + "editServiceReport": "Edit Work Order", "invoiceCode": "Invoice Code", "invoiceNumber": "Invoice Number", - "newServiceReport": "New Service Report", + "newServiceReport": "New Work Order", "number": "Number", "operatingHours": "Operating Hours", "partNumber": "Part Number", diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee8..ec97fc6f 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee8..c4855bfe 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/GoogleService-Info.plist b/ios/GoogleService-Info.plist new file mode 100644 index 00000000..b6a5d4ff --- /dev/null +++ b/ios/GoogleService-Info.plist @@ -0,0 +1,34 @@ + + + + + CLIENT_ID + 973582662416-3jlv0ckuiupmo20lsjv56pcqgho6ga63.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.973582662416-3jlv0ckuiupmo20lsjv56pcqgho6ga63 + API_KEY + AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc + GCM_SENDER_ID + 973582662416 + PLIST_VERSION + 1 + BUNDLE_ID + com.hmg.atoms + PROJECT_ID + atoms-fb912 + STORAGE_BUCKET + atoms-fb912.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:973582662416:ios:bc4a8061444c6a08fbc395 + + \ No newline at end of file diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 00000000..2c068c40 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '12.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 00000000..cbf76fea --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,216 @@ +PODS: + - audioplayers_darwin (0.0.1): + - Flutter + - Firebase/CoreOnly (10.3.0): + - FirebaseCore (= 10.3.0) + - Firebase/Messaging (10.3.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 10.3.0) + - firebase_core (2.4.1): + - Firebase/CoreOnly (= 10.3.0) + - Flutter + - firebase_messaging (14.2.1): + - Firebase/Messaging (= 10.3.0) + - firebase_core + - Flutter + - FirebaseCore (10.3.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Logger (~> 7.8) + - FirebaseCoreInternal (10.3.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.3.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - FirebaseMessaging (10.3.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Reachability (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - nanopb (< 2.30910.0, >= 2.30908.0) + - Flutter (1.0.0) + - flutter_keyboard_visibility (0.0.1): + - Flutter + - flutter_local_notifications (0.0.1): + - Flutter + - flutter_sound (9.2.13): + - Flutter + - flutter_sound_core (= 9.2.13) + - flutter_sound_core (9.2.13) + - fluttertoast (0.0.2): + - Flutter + - Toast + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) + - GoogleDataTransport (9.2.0): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/AppDelegateSwizzler (7.10.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.10.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.10.0): + - GoogleUtilities/Environment + - GoogleUtilities/Network (7.10.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.10.0)" + - GoogleUtilities/Reachability (7.10.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (7.10.0): + - GoogleUtilities/Logger + - image_picker_ios (0.0.1): + - Flutter + - MTBBarcodeScanner (5.0.11) + - nanopb (2.30909.0): + - nanopb/decode (= 2.30909.0) + - nanopb/encode (= 2.30909.0) + - nanopb/decode (2.30909.0) + - nanopb/encode (2.30909.0) + - package_info (0.0.1): + - Flutter + - path_provider_ios (0.0.1): + - Flutter + - permission_handler_apple (9.0.4): + - Flutter + - PromisesObjC (2.1.1) + - qr_code_scanner (0.2.0): + - Flutter + - MTBBarcodeScanner + - share (0.0.1): + - Flutter + - shared_preferences_ios (0.0.1): + - Flutter + - speech_to_text (0.0.1): + - Flutter + - Try + - sqflite (0.0.2): + - Flutter + - FMDB (>= 2.7.5) + - Toast (4.0.0) + - Try (2.1.1) + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) + - Flutter (from `Flutter`) + - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) + - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - flutter_sound (from `.symlinks/plugins/flutter_sound/ios`) + - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - package_info (from `.symlinks/plugins/package_info/ios`) + - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) + - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`) + - share (from `.symlinks/plugins/share/ios`) + - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) + - speech_to_text (from `.symlinks/plugins/speech_to_text/ios`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +SPEC REPOS: + trunk: + - Firebase + - FirebaseCore + - FirebaseCoreInternal + - FirebaseInstallations + - FirebaseMessaging + - flutter_sound_core + - FMDB + - GoogleDataTransport + - GoogleUtilities + - MTBBarcodeScanner + - nanopb + - PromisesObjC + - Toast + - Try + +EXTERNAL SOURCES: + audioplayers_darwin: + :path: ".symlinks/plugins/audioplayers_darwin/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_messaging: + :path: ".symlinks/plugins/firebase_messaging/ios" + Flutter: + :path: Flutter + flutter_keyboard_visibility: + :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" + flutter_local_notifications: + :path: ".symlinks/plugins/flutter_local_notifications/ios" + flutter_sound: + :path: ".symlinks/plugins/flutter_sound/ios" + fluttertoast: + :path: ".symlinks/plugins/fluttertoast/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + package_info: + :path: ".symlinks/plugins/package_info/ios" + path_provider_ios: + :path: ".symlinks/plugins/path_provider_ios/ios" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" + qr_code_scanner: + :path: ".symlinks/plugins/qr_code_scanner/ios" + share: + :path: ".symlinks/plugins/share/ios" + shared_preferences_ios: + :path: ".symlinks/plugins/shared_preferences_ios/ios" + speech_to_text: + :path: ".symlinks/plugins/speech_to_text/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 + Firebase: f92fc551ead69c94168d36c2b26188263860acd9 + firebase_core: bf59c32d2e53814f558efa20840c1902fa2fe461 + firebase_messaging: ee597229fc260f8fa491fa8f2d4a32dfbfa406fa + FirebaseCore: 988754646ab3bd4bdcb740f1bfe26b9f6c0d5f2a + FirebaseCoreInternal: 29b76f784d607df8b2a1259d73c3f04f1210137b + FirebaseInstallations: e2f26126089dcf41e215f7b8925af8d953c7d602 + FirebaseMessaging: e345b219fd15d325f0cf2fef28cb8ce00d851b3f + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 + flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 + flutter_sound: c60effa2a350fb977885f0db2fbc4c1ad5160900 + flutter_sound_core: 26c10e5832e76aaacfae252d8925232281c486ae + fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0 + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f + GoogleUtilities: bad72cb363809015b1f7f19beb1f1cd23c589f95 + image_picker_ios: b786a5dcf033a8336a657191401bfdf12017dabb + MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb + nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 + package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 + path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 + permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce + PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb + qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e + share: 0b2c3e82132f5888bccca3351c504d0003b3b410 + shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad + speech_to_text: b43a7d99aef037bd758ed8e45d79bbac035d2dfe + sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 + Try: 5ef669ae832617b3cee58cb2c6f99fb767a4ff96 + url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de + +PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048 + +COCOAPODS: 1.11.3 diff --git a/ios/Runner.plist/AppDelegate.swift b/ios/Runner.plist/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/ios/Runner.plist/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 00000000..4152ccf7 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 00000000..562fa042 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 00000000..a6a1917a Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 00000000..324b0db9 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 00000000..53cc7899 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 00000000..381ad0a1 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 00000000..fa500726 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 00000000..a6a1917a Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 00000000..bb7246f4 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 00000000..783711d9 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 00000000..b1ea3dce Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 00000000..cb2d7562 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 00000000..1fb76fdf Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 00000000..3fa8b167 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 00000000..783711d9 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 00000000..ad9f039d Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 00000000..b553aa40 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 00000000..83e19077 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 00000000..e054ce80 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 00000000..d81666a5 Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 00000000..0a32b49b Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 00000000..0bedcf2f --- /dev/null +++ b/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 00000000..9da19eac Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 00000000..9da19eac Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 00000000..9da19eac Binary files /dev/null and b/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/ios/Runner.plist/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner.plist/Base.lproj/LaunchScreen.storyboard b/ios/Runner.plist/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/ios/Runner.plist/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.plist/Base.lproj/Main.storyboard b/ios/Runner.plist/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/ios/Runner.plist/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.plist/GeneratedPluginRegistrant.h b/ios/Runner.plist/GeneratedPluginRegistrant.h new file mode 100644 index 00000000..7a890927 --- /dev/null +++ b/ios/Runner.plist/GeneratedPluginRegistrant.h @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +NS_ASSUME_NONNULL_END +#endif /* GeneratedPluginRegistrant_h */ diff --git a/ios/Runner.plist/GeneratedPluginRegistrant.m b/ios/Runner.plist/GeneratedPluginRegistrant.m new file mode 100644 index 00000000..153c6c06 --- /dev/null +++ b/ios/Runner.plist/GeneratedPluginRegistrant.m @@ -0,0 +1,133 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#import "GeneratedPluginRegistrant.h" + +#if __has_include() +#import +#else +@import audioplayers_darwin; +#endif + +#if __has_include() +#import +#else +@import firebase_core; +#endif + +#if __has_include() +#import +#else +@import firebase_messaging; +#endif + +#if __has_include() +#import +#else +@import flutter_keyboard_visibility; +#endif + +#if __has_include() +#import +#else +@import flutter_local_notifications; +#endif + +#if __has_include() +#import +#else +@import flutter_sound; +#endif + +#if __has_include() +#import +#else +@import fluttertoast; +#endif + +#if __has_include() +#import +#else +@import image_picker_ios; +#endif + +#if __has_include() +#import +#else +@import package_info; +#endif + +#if __has_include() +#import +#else +@import path_provider_ios; +#endif + +#if __has_include() +#import +#else +@import permission_handler_apple; +#endif + +#if __has_include() +#import +#else +@import qr_code_scanner; +#endif + +#if __has_include() +#import +#else +@import share; +#endif + +#if __has_include() +#import +#else +@import shared_preferences_ios; +#endif + +#if __has_include() +#import +#else +@import speech_to_text; +#endif + +#if __has_include() +#import +#else +@import sqflite; +#endif + +#if __has_include() +#import +#else +@import url_launcher_ios; +#endif + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { + [AudioplayersDarwinPlugin registerWithRegistrar:[registry registrarForPlugin:@"AudioplayersDarwinPlugin"]]; + [FLTFirebaseCorePlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseCorePlugin"]]; + [FLTFirebaseMessagingPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseMessagingPlugin"]]; + [FlutterKeyboardVisibilityPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterKeyboardVisibilityPlugin"]]; + [FlutterLocalNotificationsPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterLocalNotificationsPlugin"]]; + [FlutterSound registerWithRegistrar:[registry registrarForPlugin:@"FlutterSound"]]; + [FluttertoastPlugin registerWithRegistrar:[registry registrarForPlugin:@"FluttertoastPlugin"]]; + [FLTImagePickerPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTImagePickerPlugin"]]; + [FLTPackageInfoPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTPackageInfoPlugin"]]; + [FLTPathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTPathProviderPlugin"]]; + [PermissionHandlerPlugin registerWithRegistrar:[registry registrarForPlugin:@"PermissionHandlerPlugin"]]; + [FlutterQrPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterQrPlugin"]]; + [FLTSharePlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTSharePlugin"]]; + [FLTSharedPreferencesPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTSharedPreferencesPlugin"]]; + [SpeechToTextPlugin registerWithRegistrar:[registry registrarForPlugin:@"SpeechToTextPlugin"]]; + [SqflitePlugin registerWithRegistrar:[registry registrarForPlugin:@"SqflitePlugin"]]; + [FLTURLLauncherPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTURLLauncherPlugin"]]; +} + +@end diff --git a/ios/Runner.plist/Info.plist b/ios/Runner.plist/Info.plist new file mode 100644 index 00000000..f4d2d02d --- /dev/null +++ b/ios/Runner.plist/Info.plist @@ -0,0 +1,53 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Test Sa + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ATOMS + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSSpeechRecognitionUsageDescription + Recognize Speech + NSMicrophoneUsageDescription + To Record Audio + + diff --git a/ios/Runner.plist/Runner-Bridging-Header.h b/ios/Runner.plist/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/ios/Runner.plist/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 59490632..a5559bc2 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,16 +3,18 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ + 00C3AFCE29769C38002E7B47 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 00C3AFCD29769C37002E7B47 /* GoogleService-Info.plist */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + F2A2A0FF9835A41EAE85C46C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4EFA2032ACFCE75A326C4021 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -29,9 +31,13 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 00C3AFCC297590E6002E7B47 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 00C3AFCD29769C37002E7B47 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 21218448C05A6EE259A8A273 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4EFA2032ACFCE75A326C4021 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -42,6 +48,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9CABA487766DBA12CD9795AB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + C495935E3B272204B901FA13 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -49,12 +57,23 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + F2A2A0FF9835A41EAE85C46C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 577ED37A491ADCF557B4F6D9 /* Pods */ = { + isa = PBXGroup; + children = ( + 21218448C05A6EE259A8A273 /* Pods-Runner.debug.xcconfig */, + C495935E3B272204B901FA13 /* Pods-Runner.release.xcconfig */, + 9CABA487766DBA12CD9795AB /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -72,6 +91,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, + 577ED37A491ADCF557B4F6D9 /* Pods */, + CF00C18CA99370AC196B5B50 /* Frameworks */, ); sourceTree = ""; }; @@ -86,6 +107,8 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 00C3AFCD29769C37002E7B47 /* GoogleService-Info.plist */, + 00C3AFCC297590E6002E7B47 /* Runner.entitlements */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -98,6 +121,14 @@ path = Runner; sourceTree = ""; }; + CF00C18CA99370AC196B5B50 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 4EFA2032ACFCE75A326C4021 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -105,12 +136,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 1EBE8111D78021B782F0E9D3 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 82ACB2D948A573383205B7AC /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -161,6 +194,7 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 00C3AFCE29769C38002E7B47 /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -169,6 +203,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 1EBE8111D78021B782F0E9D3 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -183,6 +239,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 82ACB2D948A573383205B7AC /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -254,6 +327,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -264,6 +338,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + EXCLUDED_ARCHS = arm64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -272,7 +347,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -287,14 +362,103 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3A359E86ZF; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Atoms; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.testSa; + MARKETING_VERSION = 1.0.1; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-l\"sqlite3\"", + "-l\"z\"", + "-framework", + "\"AVFoundation\"", + "-framework", + "\"CoreTelephony\"", + "-framework", + "\"FBLPromises\"", + "-framework", + "\"FMDB\"", + "-framework", + "\"FirebaseCore\"", + "-framework", + "\"FirebaseCoreInternal\"", + "-framework", + "\"FirebaseInstallations\"", + "-framework", + "\"FirebaseMessaging\"", + "-framework", + "\"Foundation\"", + "-framework", + "\"GoogleDataTransport\"", + "-framework", + "\"GoogleUtilities\"", + "-framework", + "\"MTBBarcodeScanner\"", + "-framework", + "\"MediaPlayer\"", + "-framework", + "\"QuartzCore\"", + "-framework", + "\"Security\"", + "-framework", + "\"SystemConfiguration\"", + "-framework", + "\"Toast\"", + "-framework", + "\"Try\"", + "-framework", + "\"UIKit\"", + "-framework", + "\"audioplayers_darwin\"", + "-framework", + "\"firebase_core\"", + "-framework", + "\"firebase_messaging\"", + "-framework", + "\"flutter_keyboard_visibility\"", + "-framework", + "\"flutter_local_notifications\"", + "-framework", + "\"flutter_sound\"", + "-framework", + "\"flutter_sound_core\"", + "-framework", + "\"fluttertoast\"", + "-framework", + "\"image_picker_ios\"", + "-framework", + "\"nanopb\"", + "-framework", + "\"package_info\"", + "-framework", + "\"path_provider_ios\"", + "-framework", + "\"permission_handler_apple\"", + "-framework", + "\"qr_code_scanner\"", + "-framework", + "\"share\"", + "-framework", + "\"shared_preferences_ios\"", + "-framework", + "\"speech_to_text\"", + "-framework", + "\"sqflite\"", + "-framework", + "\"url_launcher_ios\"", + "-weak_framework", + "\"UserNotifications\"", + "\"-lc++\"", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.hmg.atoms; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -325,6 +489,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -335,6 +500,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + EXCLUDED_ARCHS = arm64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -349,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -380,6 +546,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -390,6 +557,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + EXCLUDED_ARCHS = arm64; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -398,7 +566,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -415,14 +583,103 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3A359E86ZF; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Atoms; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.testSa; + MARKETING_VERSION = 1.0.1; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-l\"sqlite3\"", + "-l\"z\"", + "-framework", + "\"AVFoundation\"", + "-framework", + "\"CoreTelephony\"", + "-framework", + "\"FBLPromises\"", + "-framework", + "\"FMDB\"", + "-framework", + "\"FirebaseCore\"", + "-framework", + "\"FirebaseCoreInternal\"", + "-framework", + "\"FirebaseInstallations\"", + "-framework", + "\"FirebaseMessaging\"", + "-framework", + "\"Foundation\"", + "-framework", + "\"GoogleDataTransport\"", + "-framework", + "\"GoogleUtilities\"", + "-framework", + "\"MTBBarcodeScanner\"", + "-framework", + "\"MediaPlayer\"", + "-framework", + "\"QuartzCore\"", + "-framework", + "\"Security\"", + "-framework", + "\"SystemConfiguration\"", + "-framework", + "\"Toast\"", + "-framework", + "\"Try\"", + "-framework", + "\"UIKit\"", + "-framework", + "\"audioplayers_darwin\"", + "-framework", + "\"firebase_core\"", + "-framework", + "\"firebase_messaging\"", + "-framework", + "\"flutter_keyboard_visibility\"", + "-framework", + "\"flutter_local_notifications\"", + "-framework", + "\"flutter_sound\"", + "-framework", + "\"flutter_sound_core\"", + "-framework", + "\"fluttertoast\"", + "-framework", + "\"image_picker_ios\"", + "-framework", + "\"nanopb\"", + "-framework", + "\"package_info\"", + "-framework", + "\"path_provider_ios\"", + "-framework", + "\"permission_handler_apple\"", + "-framework", + "\"qr_code_scanner\"", + "-framework", + "\"share\"", + "-framework", + "\"shared_preferences_ios\"", + "-framework", + "\"speech_to_text\"", + "-framework", + "\"sqflite\"", + "-framework", + "\"url_launcher_ios\"", + "-weak_framework", + "\"UserNotifications\"", + "\"-lc++\"", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.hmg.atoms; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -437,14 +694,103 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3A359E86ZF; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Atoms; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.testSa; + MARKETING_VERSION = 1.0.1; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-l\"sqlite3\"", + "-l\"z\"", + "-framework", + "\"AVFoundation\"", + "-framework", + "\"CoreTelephony\"", + "-framework", + "\"FBLPromises\"", + "-framework", + "\"FMDB\"", + "-framework", + "\"FirebaseCore\"", + "-framework", + "\"FirebaseCoreInternal\"", + "-framework", + "\"FirebaseInstallations\"", + "-framework", + "\"FirebaseMessaging\"", + "-framework", + "\"Foundation\"", + "-framework", + "\"GoogleDataTransport\"", + "-framework", + "\"GoogleUtilities\"", + "-framework", + "\"MTBBarcodeScanner\"", + "-framework", + "\"MediaPlayer\"", + "-framework", + "\"QuartzCore\"", + "-framework", + "\"Security\"", + "-framework", + "\"SystemConfiguration\"", + "-framework", + "\"Toast\"", + "-framework", + "\"Try\"", + "-framework", + "\"UIKit\"", + "-framework", + "\"audioplayers_darwin\"", + "-framework", + "\"firebase_core\"", + "-framework", + "\"firebase_messaging\"", + "-framework", + "\"flutter_keyboard_visibility\"", + "-framework", + "\"flutter_local_notifications\"", + "-framework", + "\"flutter_sound\"", + "-framework", + "\"flutter_sound_core\"", + "-framework", + "\"fluttertoast\"", + "-framework", + "\"image_picker_ios\"", + "-framework", + "\"nanopb\"", + "-framework", + "\"package_info\"", + "-framework", + "\"path_provider_ios\"", + "-framework", + "\"permission_handler_apple\"", + "-framework", + "\"qr_code_scanner\"", + "-framework", + "\"share\"", + "-framework", + "\"shared_preferences_ios\"", + "-framework", + "\"speech_to_text\"", + "-framework", + "\"sqflite\"", + "-framework", + "\"url_launcher_ios\"", + "-weak_framework", + "\"UserNotifications\"", + "\"-lc++\"", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.hmg.atoms; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -478,4 +824,4 @@ /* End XCConfigurationList section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; -} \ No newline at end of file +} diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16..21a3cc14 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 70693e4a..077fc083 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,5 +1,6 @@ import UIKit import Flutter +import Firebase @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { @@ -7,6 +8,7 @@ import Flutter _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { + FirebaseApp.configure() GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist new file mode 100644 index 00000000..b6a5d4ff --- /dev/null +++ b/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,34 @@ + + + + + CLIENT_ID + 973582662416-3jlv0ckuiupmo20lsjv56pcqgho6ga63.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.973582662416-3jlv0ckuiupmo20lsjv56pcqgho6ga63 + API_KEY + AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc + GCM_SENDER_ID + 973582662416 + PLIST_VERSION + 1 + BUNDLE_ID + com.hmg.atoms + PROJECT_ID + atoms-fb912 + STORAGE_BUCKET + atoms-fb912.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:973582662416:ios:bc4a8061444c6a08fbc395 + + \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 4cb4d755..347cd5f4 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,10 +2,12 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Test Sa + Atoms SA CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -13,7 +15,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - ATOMS + Atoms SA CFBundlePackageType APPL CFBundleShortVersionString @@ -22,8 +24,23 @@ ???? CFBundleVersion $(FLUTTER_BUILD_NUMBER) + FirebaseAppDelegateProxyEnabled + LSRequiresIPhoneOS + NSCameraUsageDescription + This app requires permission to access Camera to allow user to attach images + NSMicrophoneUsageDescription + This app requires permission for Record Audio for to allow user to send voice notes + NSPhotoLibraryUsageDescription + This app requires permission to access photo gallery to allow user to attach images + NSSpeechRecognitionUsageDescription + This app requires permission for Speech Recognition for speech to text functionality. + UIBackgroundModes + + fetch + remote-notification + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile @@ -43,7 +60,5 @@ UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone - diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..903def2a --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index f09068a2..f2e26591 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,7 +1,7 @@ class URLs{ URLs._(); static const host2 = "http://194.163.164.213/atoms/api"; - static const host1 = "http://194.163.164.213/atoms/api"; + static const host1 = "https://atoms.hmg.com/api"; // API Routes static const login = "/handle/user/login"; // post @@ -37,6 +37,8 @@ class URLs{ static const getServiceReportLastCalls = "/return/call/last/situation"; // get static const getServiceTypes = "/return/service/type"; // get static const getPartNumber = "/handle/return/all/parts"; // get + static const getServiceReportPriority = "/return/call/priority/list"; // get + static const getServiceReportDefectTypes = "/return/call/defect/type/list"; // get //gas refill static const getGasTypes = "/return/gas/refill/types"; // get @@ -53,5 +55,13 @@ class URLs{ // employee static const getEmployees = "/return/assigned/employee"; // get + // pentry + static const getPentry = "/return/pentry/details"; // get + static const updatePentry = "/update/pentry/details"; // get + static const getPentryTaskStatus = "/return/pentry/task/status"; // get + static const getPentryVisitStatus = "/return/pentry/visit/status/list"; // get + static const getPentryStatus = "/return/pentry/status/list"; // get + // contacts + static const getPentryContacts = "/handle/return/all/contacts"; // get } \ No newline at end of file diff --git a/lib/controllers/localization/localization.dart b/lib/controllers/localization/localization.dart index fafc8aaf..a6e7fe82 100644 --- a/lib/controllers/localization/localization.dart +++ b/lib/controllers/localization/localization.dart @@ -1,8 +1,8 @@ import 'dart:convert'; -import 'package:test_sa/models/subtitle.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:test_sa/models/subtitle.dart'; class AppLocalization { diff --git a/lib/controllers/notification/firebase_notification_manger.dart b/lib/controllers/notification/firebase_notification_manger.dart index 19ef543e..153d28fa 100644 --- a/lib/controllers/notification/firebase_notification_manger.dart +++ b/lib/controllers/notification/firebase_notification_manger.dart @@ -1,9 +1,9 @@ import 'dart:convert'; -import 'package:test_sa/models/app_notification.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/models/app_notification.dart'; import 'notification_manger.dart'; diff --git a/lib/controllers/notification/notification_manger.dart b/lib/controllers/notification/notification_manger.dart index 8c0de712..a568d5d3 100644 --- a/lib/controllers/notification/notification_manger.dart +++ b/lib/controllers/notification/notification_manger.dart @@ -1,6 +1,6 @@ -import 'package:test_sa/views/app_style/colors.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:test_sa/views/app_style/colors.dart'; class NotificationManger{ // private constructor to avoid create object diff --git a/lib/controllers/providers/api/departments_provider.dart b/lib/controllers/providers/api/departments_provider.dart index 1b66771d..0bcd0f02 100644 --- a/lib/controllers/providers/api/departments_provider.dart +++ b/lib/controllers/providers/api/departments_provider.dart @@ -1,9 +1,9 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/department.dart'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/department.dart'; class DepartmentsProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index e646a6da..1d433c11 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -1,21 +1,11 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; -import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device_transfer.dart'; -import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/issue.dart'; -import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class DeviceTransferProvider extends ChangeNotifier{ @@ -74,10 +64,6 @@ class DeviceTransferProvider extends ChangeNotifier{ // return 200; Response response; try{ - print( Uri.parse( - "$host${URLs.getDeviceTransfer}?uid=${user.id}" - "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" - ),); response = await get( Uri.parse( "$host${URLs.getDeviceTransfer}?uid=${user.id}" @@ -106,7 +92,6 @@ class DeviceTransferProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -136,8 +121,6 @@ class DeviceTransferProvider extends ChangeNotifier{ host+URLs.requestDeviceTransfer), body: body, ); - - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(items != null) { @@ -153,7 +136,6 @@ class DeviceTransferProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } @@ -175,16 +157,12 @@ class DeviceTransferProvider extends ChangeNotifier{ }; body.addAll(newModel.toJson(isSender)); - print(body); Response response; try{ - print(Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"),); response = await post( Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), body: body, ); - - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { reset(); @@ -198,7 +176,6 @@ class DeviceTransferProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 808421da..b55d1733 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -1,10 +1,10 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class DevicesProvider extends ChangeNotifier{ @@ -81,25 +81,25 @@ class DevicesProvider extends ChangeNotifier{ @required String host, @required User user, @required String hospitalId, - @required String title}) async { + String serialNumber, + String number, + }) async { Response response; try{ response = await get( - Uri.parse(host + URLs.getEquipment+"?client=$hospitalId" - + ( title == null || title.isEmpty ? "" : "&name=$title" )), + Uri.parse("$host${URLs.getEquipment}?client=$hospitalId" + "${serialNumber?.isEmpty == false ? "&name=$serialNumber" :""}" + "${number?.isEmpty == false ? "&number=$number" : ""}" + ), ); - _stateCode = response.statusCode; - List _page = []; + List page = []; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); + page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); } - return _page; + return page; } catch(error) { - _loading = false; - _stateCode = -1; - notifyListeners(); return []; } @@ -128,13 +128,10 @@ class DevicesProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - print(categoriesListJson.length); _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); - print(_page.length); } return _page; } catch(error) { - print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index e0f90bbc..7dba6a8c 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -1,16 +1,10 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/issue.dart'; -import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class GasRefillProvider extends ChangeNotifier{ @@ -54,10 +48,6 @@ class GasRefillProvider extends ChangeNotifier{ isLoading = true; Response response; try{ - print( Uri.parse( - "$host${URLs.getGasRefill}?uid=${user.id}" - "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" - )); response = await get( Uri.parse( "$host${URLs.getGasRefill}?uid=${user.id}" @@ -67,7 +57,6 @@ class GasRefillProvider extends ChangeNotifier{ "Content-Type":"application/json; charset=utf-8" } ); - print(response.body); stateCode = response.statusCode; if(stateCode >= 200 && stateCode < 300) { // client's request was successfully received @@ -87,7 +76,6 @@ class GasRefillProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -109,12 +97,11 @@ class GasRefillProvider extends ChangeNotifier{ }; body["details"] = jsonEncode(model.details.map((model) => { - "type": model.type.id.toString(), - "size": model.cylinderSize.id.toString(), + "type": model.type.id?.toString(), + "size": model.cylinderSize?.id.toString(), "requsted_qty": model.requestedQuantity.toString(), }).toList()); - print(body); Response response; try{ response = await post( @@ -123,7 +110,6 @@ class GasRefillProvider extends ChangeNotifier{ body: body, ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(items != null) { @@ -139,7 +125,6 @@ class GasRefillProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } @@ -165,8 +150,6 @@ class GasRefillProvider extends ChangeNotifier{ "deliverd_qty": model.deliveredQuantity.toString(), }).toList()); - print(body); - print(Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"),); Response response; try{ response = await post( @@ -174,7 +157,6 @@ class GasRefillProvider extends ChangeNotifier{ body: body, ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { oldModel.fromGasRefillModel(newModel); @@ -183,7 +165,6 @@ class GasRefillProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index 3ead9f6f..df70994f 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/user.dart'; class HospitalsProvider extends ChangeNotifier{ @@ -55,11 +55,7 @@ class HospitalsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - print( Uri.parse( - host + URLs.getHospitals - + "?page=${(_hospitals?.length ?? 0) ~/pageItemNumber}" - + ( title == null || title.isEmpty ? "" : "&name=$title" ))); - response = await get( + response = await get( Uri.parse( host + URLs.getHospitals + "?page=${(_hospitals?.length ?? 0) ~/pageItemNumber}" @@ -96,11 +92,6 @@ class HospitalsProvider extends ChangeNotifier{ } - /// return -2 if request in progress - /// return -1 if error happen when sending request - /// return state code if request complete may be 200, 404 or 403 - /// for more details check http state manager - /// lib\controllers\http_status_manger\http_status_manger.dart Future> getHospitalsList ({String host,User user,String title}) async { Response response; try{ diff --git a/lib/controllers/providers/api/notifications_provider.dart b/lib/controllers/providers/api/notifications_provider.dart index 0bea5f26..d21ec77b 100644 --- a/lib/controllers/providers/api/notifications_provider.dart +++ b/lib/controllers/providers/api/notifications_provider.dart @@ -1,10 +1,10 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class NotificationsProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/parts_provider.dart b/lib/controllers/providers/api/parts_provider.dart index 061e3da7..6f763f77 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -110,7 +110,6 @@ class PartsProvider extends ChangeNotifier{ "Content-Type":"application/json; charset=utf-8" } ); - _stateCode = response.statusCode; List _page = []; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -119,9 +118,6 @@ class PartsProvider extends ChangeNotifier{ } return _page; } catch(error) { - _loading = false; - _stateCode = -1; - notifyListeners(); return []; } diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index 1db89790..03737f73 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; @@ -76,7 +77,7 @@ class RegularVisitsProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received try{ - List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); + List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); List _visits = requestsListJson.map( (request) => Visit.fromJson(request) ).toList(); @@ -137,5 +138,46 @@ class RegularVisitsProvider extends ChangeNotifier{ } } + Future getPently({String host,User user,String id}) async { + Response response; + response = await get( + Uri.parse("$host${URLs.getPentry}/$id"), + headers: { + "Content-Type":"application/json; charset=utf-8" + } + ); + + Pentry pantry; + if(response.statusCode >= 200 && response.statusCode < 300) { + pantry = Pentry.fromMap(json.decode(utf8.decode(response.bodyBytes))); + } + return pantry; + } + Future updatePentry ({ + @required String host, + @required User user, + @required Pentry pentry, + @required Visit visit, + }) async { + try{ + Response response; + Map body = pentry.toMap(); + body["uid"] = user.id; + body["token"] = user.token; + response = await post( + Uri.parse(host+URLs.updatePentry + "/${visit.id}"), + body: body, + ); + if(response.statusCode >= 200 && response.statusCode < 300) { + visit.status = pentry.ppmVisitStatus; + notifyListeners(); + } + return response.statusCode; + + } catch(error) { + return -1; + } + + } } \ No newline at end of file diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index b5ab6022..040ed855 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -1,17 +1,17 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/models/issue.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:test_sa/models/status.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class ServiceRequestsProvider extends ChangeNotifier{ @@ -58,14 +58,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ isLoading = true; Response response; try{ - print( Uri.parse( - host+URLs.getServiceRequests - +"?uid=${user.id}" - +(hospitalId == null? "" :"&client_nid=$hospitalId") - +"&token=${user.token}" - "&page=${(serviceRequests?.length ?? 0) ~/pageItemNumber}" - +search?.toSearchString() ?? "" - )); response = await get( Uri.parse( host+URLs.getServiceRequests @@ -79,7 +71,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ "Content-Type":"application/json; charset=utf-8" } ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -100,7 +91,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -161,11 +151,12 @@ class ServiceRequestsProvider extends ChangeNotifier{ "client": user.hospital.id ?? '', "complaint": serviceRequest.maintenanceIssue, "image": json.encode(serviceRequest.devicePhotos), + "priority": (serviceRequest.priority?.id).toString(), + "defect_types": (serviceRequest.defectType?.id).toString(), }; if(serviceRequest.audio != null){ body["audio"] = serviceRequest.audio; } - print(body); Response response; try{ response = await post( @@ -173,7 +164,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ host+URLs.createRequest), body: body, ); - stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(serviceRequests != null) @@ -188,7 +178,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } @@ -225,7 +214,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required String host, @required User user, @required String newDate, - @required Status employee, + @required Lookup employee, @required ServiceRequest request, }) async { Response response; @@ -235,14 +224,12 @@ class ServiceRequestsProvider extends ChangeNotifier{ body["nid"] = request.id; if(newDate != null) body["date"] = newDate; if(employee != null) body["ass_emp"] = employee.id.toString(); - print(body); try{ response = await post( Uri.parse( host+URLs.updateRequestDate), body: body, ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { request.engineerName = employee.label; @@ -377,7 +364,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ host+URLs.updateServiceReport), body: body, ); - print(response.body); //stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { diff --git a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart index 7c6a6757..04f6d5b6 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; class EmployeesProvider extends ChangeNotifier{ @@ -23,8 +23,8 @@ class EmployeesProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List _items; + List get items => _items; // when categories in-process _loading = true // done _loading = true @@ -49,15 +49,14 @@ class EmployeesProvider extends ChangeNotifier{ Response response; try{ response = await get( - Uri.parse( - host + URLs.getEmployees), + Uri.parse( + host + URLs.getEmployees), ); - print(response.body); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((type) => Status.fromJson(type)).toList(); + _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart index a4533788..b4112034 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; class GasCylinderSizesProvider extends ChangeNotifier{ @@ -24,8 +24,8 @@ class GasCylinderSizesProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List _items; + List get items => _items; // when categories in-process _loading = true // done _loading = true @@ -50,13 +50,13 @@ class GasCylinderSizesProvider extends ChangeNotifier{ Response response; try{ response = await get( - Uri.parse(host + URLs.getGasCylinderSize), + Uri.parse(host + URLs.getGasCylinderSize), ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((item) => Status.fromJson(item)).toList(); + _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart index 60d5db9e..24b4e018 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -24,8 +24,8 @@ class GasStatusProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List _items; + List get items => _items; // when categories in-process _loading = true // done _loading = true @@ -49,13 +49,13 @@ class GasStatusProvider extends ChangeNotifier{ Response response; try{ response = await get( - Uri.parse(host + URLs.getGasStatus), + Uri.parse(host + URLs.getGasStatus), ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((item) => Status.fromJson(item)).toList(); + _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart index 33ab1b27..f444c233 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -24,8 +24,8 @@ class GasTypesProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List _items; + List get items => _items; // when categories in-process _loading = true // done _loading = true @@ -49,19 +49,18 @@ class GasTypesProvider extends ChangeNotifier{ Response response; try{ response = await get( - Uri.parse(host + URLs.getGasTypes), + Uri.parse(host + URLs.getGasTypes), ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((item) => Status.fromJson(item)).toList(); + _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; notifyListeners(); return response.statusCode; } catch(error) { - print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart new file mode 100644 index 00000000..8e3168d9 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class PentryStatusProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await get( + Uri.parse( + host + URLs.getPentryStatus), + ); + + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(utf8.decode(response.bodyBytes)); + _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart new file mode 100644 index 00000000..03370135 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class PentryTaskStatusProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await get( + Uri.parse( + host + URLs.getPentryTaskStatus), + ); + + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + _items = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart new file mode 100644 index 00000000..09b52cbb --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class PentryVisitStatusProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await get( + Uri.parse( + host + URLs.getPentryVisitStatus), + ); + + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(utf8.decode(response.bodyBytes)); + _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart new file mode 100644 index 00000000..50efd414 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class ServiceRequestDefectTypesProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await get( + Uri.parse( + host + URLs.getServiceReportDefectTypes), + ); + + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(utf8.decode(response.bodyBytes)); + _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart index b7ac8b79..50de291f 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; class ServiceReportLastCallsProvider extends ChangeNotifier{ @@ -24,8 +24,8 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _calls; - List get calls => _calls; + List _calls; + List get calls => _calls; // when categories in-process _loading = true // done _loading = true @@ -59,7 +59,7 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _calls = categoriesListJson.map((type) => Status.fromServiceReportJson(type)).toList(); + _calls = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart new file mode 100644 index 00000000..58fc2d98 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class ServiceRequestPriorityProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await get( + Uri.parse( + host + URLs.getServiceReportPriority), + ); + + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(utf8.decode(response.bodyBytes)); + _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart index 5d2f499d..bac49f9f 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; class ServiceReportReasonsProvider extends ChangeNotifier{ @@ -23,8 +23,8 @@ class ServiceReportReasonsProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _reasons; - List get reasons => _reasons; + List _reasons; + List get reasons => _reasons; // when categories in-process _loading = true // done _loading = true @@ -56,7 +56,7 @@ class ServiceReportReasonsProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _reasons = categoriesListJson.map((type) => Status.fromServiceReportJson(type)).toList(); + _reasons = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart index 1cc21f4c..89cb100f 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; class ServiceReportStatusProvider extends ChangeNotifier{ @@ -23,8 +23,8 @@ class ServiceReportStatusProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _status; - List get statuses => _status; + List _status; + List get statuses => _status; // when categories in-process _loading = true // done _loading = true @@ -56,7 +56,7 @@ class ServiceReportStatusProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _status = categoriesListJson.map((type) => Status.fromServiceReportJson(type)).toList(); + _status = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart index 3737fc51..a8b07c08 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; class ServiceReportTypesProvider extends ChangeNotifier{ @@ -23,8 +23,8 @@ class ServiceReportTypesProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _types; - List get types => _types; + List _types; + List get types => _types; // when categories in-process _loading = true // done _loading = true @@ -57,7 +57,7 @@ class ServiceReportTypesProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _types = categoriesListJson.map((type) => Status.fromServiceReportJson(type)).toList(); + _types = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart index 5cde5e9b..a5bcb0a5 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; class ServiceStatusProvider extends ChangeNotifier{ @@ -23,8 +23,8 @@ class ServiceStatusProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _statuses; - List get statuses => _statuses; + List _statuses; + List get statuses => _statuses; // when categories in-process _loading = true // done _loading = true @@ -57,7 +57,7 @@ class ServiceStatusProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _statuses = categoriesListJson.map((e) => Status.fromServiceReportJson(e)).toList(); + _statuses = categoriesListJson.map((e) => Lookup.fromIntIdJson(e)).toList(); } _loading = false; diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 326dbb6d..5a8f3ce5 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:test_sa/views/app_style/colors.dart'; extension WidgetExtensions on Widget { Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this); diff --git a/lib/main.dart b/lib/main.dart index e2deac02..dea92839 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,9 @@ +import 'dart:io'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/departments_provider.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; @@ -11,6 +17,10 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/employee/empl import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/login.dart'; import 'package:test_sa/views/pages/register.dart'; @@ -28,11 +38,10 @@ import 'package:test_sa/views/pages/user/visits/preventive_maintenance_visits_pa import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:provider/provider.dart'; + import 'controllers/providers/api/parts_provider.dart'; import 'controllers/providers/api/preventive_maintenance_visits_provider.dart'; +import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_status_provider.dart'; @@ -44,7 +53,15 @@ import 'views/pages/device_transfer/request_device_transfer.dart'; import 'views/pages/device_transfer/track_device_transfer.dart'; import 'views/widgets/hospitals/single_hospital_picker.dart'; -void main() { +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + if (Platform.isIOS) { + await Firebase.initializeApp( + options: const FirebaseOptions(apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", messagingSenderId: "973582662416", projectId: "atoms-fb912"), + ); + } else { + await Firebase.initializeApp(); + } runApp( ChangeNotifierProvider( create: (_) => SettingProvider(), @@ -80,6 +97,11 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => GasRefillProvider()), ChangeNotifierProvider(create: (_) => DeviceTransferProvider()), ChangeNotifierProvider(create: (_) => EmployeesProvider()), + ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), + ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()), + ChangeNotifierProvider(create: (_) => PentryStatusProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestDefectTypesProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index a817b00e..b84b8715 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -1,6 +1,7 @@ class Device{ String id; String serialNumber; + String number; String brand; String model; DateTime productionDate; @@ -13,6 +14,7 @@ class Device{ Device({ this.id, this.serialNumber, + this.number, this.brand, this.model, this.productionDate, @@ -27,6 +29,7 @@ class Device{ return Device( id: parsedJson["nid"] ?? parsedJson["id"], serialNumber: parsedJson["sn"] ?? parsedJson["value"], + number: parsedJson["asset_no"], brand: parsedJson["brand"].toString(), model: parsedJson["model"].toString(), productionDate: getDateFromString(parsedJson["production_date"]), @@ -42,6 +45,7 @@ class Device{ return Device( id: device.id, serialNumber: device.serialNumber, + number: device.number, brand: device.brand, model: device.model, productionDate: device.productionDate, diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index 2cad5ed0..d62913ab 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -1,9 +1,5 @@ -import 'package:http/http.dart'; -import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; -import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/status.dart'; class DeviceTransfer{ String id; diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index f3f1d80d..d3645b9d 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -1,8 +1,6 @@ -import 'package:http/http.dart'; import 'package:test_sa/models/department.dart'; -import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; class DeviceTransferInfo{ String userId; @@ -13,7 +11,7 @@ class DeviceTransferInfo{ String travelingHours; String name; String signature; - Status status; + Lookup status; DeviceTransferInfo({ this.userId, @@ -67,7 +65,7 @@ class DeviceTransferInfo{ comment: parsedJson["${key}comment"], client: Hospital.fromJson(parsedJson["${key}client"]), department: Department.fromJson(parsedJson["${key}department"]), - status: Status.fromJson(parsedJson["${key}status"]), + status: Lookup.fromJson(parsedJson["${key}status"]), ); } } diff --git a/lib/models/gas_refill/gas_refill_details.dart b/lib/models/gas_refill/gas_refill_details.dart index 35ed91fa..f150e150 100644 --- a/lib/models/gas_refill/gas_refill_details.dart +++ b/lib/models/gas_refill/gas_refill_details.dart @@ -1,8 +1,8 @@ -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; class GasRefillDetails{ - Status type; - Status cylinderSize; + Lookup type; + Lookup cylinderSize; int requestedQuantity; int deliveredQuantity; @@ -21,9 +21,9 @@ class GasRefillDetails{ } factory GasRefillDetails.fromJson(Map parsedJson){ return GasRefillDetails( - type: Status.fromJson(parsedJson["type"]), + type: Lookup.fromJson(parsedJson["type"]), - cylinderSize: Status.fromJson(parsedJson["size"]), + cylinderSize: Lookup.fromJson(parsedJson["size"]), requestedQuantity: parsedJson["requsted_qty"] == null ? 0 : int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0, deliveredQuantity: parsedJson["deliverd_qty"] == null @@ -33,8 +33,8 @@ class GasRefillDetails{ factory GasRefillDetails.fromDetails(GasRefillDetails details){ return GasRefillDetails( - type: Status.fromStatus(details.type), - cylinderSize:Status.fromStatus(details.cylinderSize), + type: Lookup.fromStatus(details.type), + cylinderSize:Lookup.fromStatus(details.cylinderSize), requestedQuantity: details.requestedQuantity, deliveredQuantity: details.deliveredQuantity, ); diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index b0941c2b..28773fac 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -1,12 +1,12 @@ import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; class GasRefillModel{ String id; String userId; String clientName; String title; - Status status; + Lookup status; List details; GasRefillModel({ @@ -30,7 +30,7 @@ class GasRefillModel{ userId = model.userId; clientName = model.clientName; title = model.title; - status = Status.fromStatus(model.status); + status = Lookup.fromStatus(model.status); details = model.details.map((e) => GasRefillDetails.fromDetails(e)).toList(); } @@ -45,7 +45,7 @@ class GasRefillModel{ userId: parsedJson["uid"], title: parsedJson["title"], clientName: parsedJson["client"], - status: Status.fromJson(parsedJson["status"]), + status: Lookup.fromJson(parsedJson["status"]), details: details, ); } diff --git a/lib/models/status.dart b/lib/models/lookup.dart similarity index 58% rename from lib/models/status.dart rename to lib/models/lookup.dart index 79786f40..93e1f9ec 100644 --- a/lib/models/status.dart +++ b/lib/models/lookup.dart @@ -1,10 +1,10 @@ -class Status{ +class Lookup{ final String label; final String key; final int id; - const Status({ + const Lookup({ this.label, this.key, this.id, @@ -12,7 +12,7 @@ class Status{ @override bool operator == (Object other) => - identical(this, other) || other is Status && + identical(this, other) || other is Lookup && key == other.key && id == other.id; @@ -20,26 +20,26 @@ class Status{ @override int get hashCode => id.hashCode; - factory Status.fromStatus(Status old){ - return Status( + factory Lookup.fromStatus(Lookup old){ + return Lookup( label: old.label, id: old.id, key: old.key, ); } - factory Status.fromJson(Map parsedJson){ + factory Lookup.fromJson(Map parsedJson){ if(parsedJson["id"] == null && parsedJson["uid"] == null) return null; - return Status( + return Lookup( label: parsedJson["value"], id: parsedJson["id"] is int - ? parsedJson["id"] - : int.tryParse(parsedJson["id"] ?? parsedJson["uid"]), + ? parsedJson["id"] + : int.tryParse(parsedJson["id"] ?? parsedJson["uid"]), ); } - factory Status.fromServiceReportJson(Map parsedJson){ - return Status( + factory Lookup.fromIntIdJson(Map parsedJson){ + return Lookup( label: parsedJson["value"], id: parsedJson["id"], ); diff --git a/lib/models/pantry/calibration_tools.dart b/lib/models/pantry/calibration_tools.dart new file mode 100644 index 00000000..2c70c6d2 --- /dev/null +++ b/lib/models/pantry/calibration_tools.dart @@ -0,0 +1,26 @@ +import 'package:test_sa/models/lookup.dart'; + +class CalibrationTool{ + Lookup assetsNumber; + DateTime dataOfTesting; + + CalibrationTool({ + this.assetsNumber, + this.dataOfTesting, + }); + + Map toMap() { + return { + if(assetsNumber != null) 'assetsSN': (assetsNumber?.id).toString(), + if(dataOfTesting != null) 'dataOfTesting': (dataOfTesting.millisecondsSinceEpoch ~/ 1000).toString(), + }; + } + + factory CalibrationTool.fromMap(Map map) { + return CalibrationTool( + assetsNumber: Lookup.fromJson(map['assetsSN']), + dataOfTesting: map['dataOfTesting'] == null || map['dataOfTesting'] == "" ? null : + DateTime.fromMillisecondsSinceEpoch(int.tryParse(map['dataOfTesting']) * 1000), + ); + } +} \ No newline at end of file diff --git a/lib/models/pantry/contact.dart b/lib/models/pantry/contact.dart new file mode 100644 index 00000000..50748bea --- /dev/null +++ b/lib/models/pantry/contact.dart @@ -0,0 +1,41 @@ +import 'package:test_sa/models/lookup.dart'; + +class Contact{ + Lookup title; + Lookup contactPerson; + String job; + String email; + String telephone; + String landLine; + + Contact({ + this.title, + this.contactPerson, + this.job, + this.email, + this.telephone, + this.landLine + }); + + Map toMap() { + return { + if (title != null) 'title': title.id.toString(), + if (contactPerson != null) 'contactPerson': contactPerson.id.toString(), + if (job != null) 'job': job, + if (email != null) 'email': email, + if (telephone != null) 'telephone': telephone, + if (landLine != null) 'landLine': landLine, + }; + } + + factory Contact.fromMap(Map map) { + return Contact( + title: map['title'] as Lookup, + contactPerson: map['contactPerson'] as Lookup, + job: map['job'] as String, + email: map['email'] as String, + telephone: map['telephone'] as String, + landLine: map['landLine'] as String, + ); + } +} \ No newline at end of file diff --git a/lib/models/pantry/lookups/contact_person.dart b/lib/models/pantry/lookups/contact_person.dart new file mode 100644 index 00000000..5231712c --- /dev/null +++ b/lib/models/pantry/lookups/contact_person.dart @@ -0,0 +1,15 @@ +import 'package:test_sa/models/lookup.dart'; + +class ContactTitle extends Lookup { + ContactTitle({ + int id, + String label + }):super(id: id,label: label); + + factory ContactTitle.fromMap(Map parsedJson){ + return ContactTitle( + label: parsedJson["value"], + id: parsedJson["id"], + ); + } +} \ No newline at end of file diff --git a/lib/models/pantry/lookups/contact_title.dart b/lib/models/pantry/lookups/contact_title.dart new file mode 100644 index 00000000..5231712c --- /dev/null +++ b/lib/models/pantry/lookups/contact_title.dart @@ -0,0 +1,15 @@ +import 'package:test_sa/models/lookup.dart'; + +class ContactTitle extends Lookup { + ContactTitle({ + int id, + String label + }):super(id: id,label: label); + + factory ContactTitle.fromMap(Map parsedJson){ + return ContactTitle( + label: parsedJson["value"], + id: parsedJson["id"], + ); + } +} \ No newline at end of file diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart new file mode 100644 index 00000000..ebd855dc --- /dev/null +++ b/lib/models/pantry/pentry.dart @@ -0,0 +1,120 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/pantry/calibration_tools.dart'; +import 'package:test_sa/models/pantry/pm_kit.dart'; +import 'package:test_sa/models/pantry/ppm_check_list.dart'; +import 'package:test_sa/models/timer_model.dart'; + +class Pentry{ + Lookup ppmVisitStatus; + Lookup status; + TimerModel timer; + DateTime actualVisitDate; + String travelingHours; + String image; + File imageFile; + // List contacts; + List ppmCheckLists; + List calibrationTools; + List pmKits; + + Pentry({ + this.travelingHours, + this.timer, + this.status, + this.ppmVisitStatus, + this.actualVisitDate, + this.image, + this.imageFile, + // this.contacts, + this.ppmCheckLists, + this.calibrationTools, + this.pmKits, + }); + + bool validate(){ + if(actualVisitDate == null) return false; + if(timer == null && timer.endAt != null) return false; + if(ppmVisitStatus == null) return false; + //if(status == null) return false; + + return true; + } + + Map toMap() { + Map map = {}; + map["visit_status"] = ppmVisitStatus?.id.toString(); + if(status != null) map["pentry_status"] = status?.id.toString(); + if(travelingHours != null) map["traveling_hours"] = travelingHours; + if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); + map["actual_date"] = (actualVisitDate.millisecondsSinceEpoch / 1000).toStringAsFixed(0); + if(timer != null){ + map["start_date"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); + map["end_date"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); + map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); + } + // if(contacts?.isNotEmpty == true) { + // for(int i = 0;i e.toMap()).toList()); + map["calibrationTools"] = jsonEncode(calibrationTools.map((e) => e.toMap()).toList()); + map["pmKits"] = jsonEncode(pmKits.map((e) => e.toMap()).toList()); + return map; + } + + factory Pentry.fromMap(Map map) { + // List contacts = []; + // if(map['contacts'] != null){ + // contacts =(map['contacts'] as List) + // .map((e) => Contact.fromMap(e as Map)) + // .toList(); + // } + + List pmKits = []; + if(map['pmKits'] != null){ + pmKits =(map['pmKits'] as List) + .map((e) => PMKit.fromMap(e as Map)) + .toList(); + } + + List ppmCheckLists = []; + if(map['ppmCheckLists'] != null){ + ppmCheckLists =(map['ppmCheckLists'] as List) + .map((e) => PPMCheckList.fromMap(e as Map)) + .toList(); + } + + List calibrationTools = []; + if(map['calibrationTools'] != null){ + calibrationTools =(map['calibrationTools'] as List) + .map((e) => CalibrationTool.fromMap(e as Map)) + .toList(); + } + return Pentry( + status: Lookup.fromJson(map["pentry_status"]), + ppmVisitStatus: Lookup.fromJson(map["visit_status"]), + actualVisitDate: getDate(map["actual_date"]), + travelingHours: map["traveling_hours"], + timer: TimerModel( + startAt: getDate(map["start_date"]), + endAt: getDate(map["end_date"]), + durationInSecond: (int.tryParse(map["working_hours"] ?? "") ?? 0) * 60 *60 + ), + // contacts: contacts, + ppmCheckLists: ppmCheckLists, + calibrationTools: calibrationTools, + pmKits: pmKits, + ); + } + + static getDate(String date){ + return date == null || date.isEmpty + ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); + } +} \ No newline at end of file diff --git a/lib/models/pantry/pm_kit.dart b/lib/models/pantry/pm_kit.dart new file mode 100644 index 00000000..0a008e5f --- /dev/null +++ b/lib/models/pantry/pm_kit.dart @@ -0,0 +1,45 @@ +import 'package:test_sa/models/lookup.dart'; + +class PMKit{ + Lookup itemCode; + String itemName; + String preparationTimeFrame; + String kitFrequencyDemand; + String availability; + String quantityNeeded; + String quantityReserved; + + PMKit({ + this.itemCode, + this.itemName, + this.preparationTimeFrame, + this.kitFrequencyDemand, + this.availability, + this.quantityNeeded, + this.quantityReserved + }); + + Map toMap() { + return { + if(itemCode != null) 'itemCode': (itemCode?.id).toString(), + if(itemName != null) 'itemName': itemName, + if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame, + if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand, + if(availability != null) 'availability': availability, + if(quantityNeeded != null) 'quantityNeeded': quantityNeeded, + if(quantityReserved != null) 'quantityReserved': quantityReserved, + }; + } + + factory PMKit.fromMap(Map map) { + return PMKit( + itemCode: Lookup.fromJson(map['itemCode']), + itemName: map['itemName'] as String, + preparationTimeFrame: map['preparationTimeFrame'] as String, + kitFrequencyDemand: map['kitFrequencyDemand'] as String, + availability: map['availability'] as String, + quantityNeeded: map['quantityNeeded'] as String, + quantityReserved: map['quantityReserved'] as String, + ); + } +} \ No newline at end of file diff --git a/lib/models/pantry/ppm_check_list.dart b/lib/models/pantry/ppm_check_list.dart new file mode 100644 index 00000000..8f1a14d7 --- /dev/null +++ b/lib/models/pantry/ppm_check_list.dart @@ -0,0 +1,33 @@ +import 'package:test_sa/models/lookup.dart'; + +class PPMCheckList{ + Lookup status; + String title; + String comment; + String measuredValue; + + PPMCheckList({ + this.title, + this.status, + this.comment, + this.measuredValue, + }); + + Map toMap() { + return { + if(status != null) 'status': status?.id.toString(), + if(title != null) 'title': title, + if(comment != null) 'comment': comment, + if(measuredValue != null) 'measuredValue': measuredValue, + }; + } + + factory PPMCheckList.fromMap(Map map) { + return PPMCheckList( + status: Lookup.fromJson(map['status']), + title: map['title'] as String, + comment: map['comment'] as String, + measuredValue: map['measuredValue'] as String, + ); + } +} \ No newline at end of file diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 7737c9f5..81047ec1 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -1,8 +1,8 @@ import 'dart:convert'; import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/part.dart'; -import 'package:test_sa/models/status.dart'; import 'package:test_sa/models/timer_model.dart'; class ServiceReport { @@ -10,11 +10,11 @@ class ServiceReport { String operatingHours; DateTime visitDate; DateTime endDate; - Status serviceType; - Status callLastSituation; - Status status; - Status type; - Status reason; + Lookup serviceType; + Lookup callLastSituation; + Lookup status; + Lookup type; + Lookup reason; String faultDescription; String workPreformed; //String workHours; @@ -90,7 +90,6 @@ class ServiceReport { } bool validate(){ - if(visitDate == null) return false; if(serviceType == null) return false; if(status == null) return false; @@ -120,11 +119,11 @@ class ServiceReport { } return ServiceReport( id: id, - serviceType: Status.fromJson(parsedJson["service_type"]), - callLastSituation: Status.fromJson(parsedJson["call_last_situtation"]), - reason: Status.fromJson(parsedJson["reasons"]), - status: Status.fromJson(parsedJson["service_report_status"]), - type: Status.fromJson(parsedJson["service_report_type"]), + serviceType: Lookup.fromJson(parsedJson["service_type"]), + callLastSituation: Lookup.fromJson(parsedJson["call_last_situtation"]), + reason: Lookup.fromJson(parsedJson["reasons"]), + status: Lookup.fromJson(parsedJson["service_report_status"]), + type: Lookup.fromJson(parsedJson["service_report_type"]), faultDescription: parsedJson["fault_description"], endDate:getDate(parsedJson["end_date"]), invoiceCode: parsedJson["invoice_code"], diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index 81ea6744..edf66852 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -1,4 +1,4 @@ -import '../timer_model.dart'; +import 'package:test_sa/models/lookup.dart'; class ServiceRequest{ String id; @@ -27,6 +27,9 @@ class ServiceRequest{ DateTime nextVisitDate; String jobSheetNumber; String reportID; + String deviceNumber; + Lookup priority; + Lookup defectType; ServiceRequest({ this.id, @@ -55,6 +58,9 @@ class ServiceRequest{ this.nextVisitDate, this.workPerformed, this.reportID, + this.defectType, + this.priority, + this.deviceNumber, }); @@ -63,6 +69,7 @@ class ServiceRequest{ id: parsedJson["nid"], requestCode: parsedJson["call_id"] ?? parsedJson["jobcode"] , hospitalName: parsedJson["call_client"], + deviceNumber: parsedJson["device_no"], deviceId: parsedJson["deviceid"], audio: parsedJson["audio"] ?? "", deviceArName: parsedJson["equipment_arabic_name"] == false diff --git a/lib/models/user.dart b/lib/models/user.dart index 10fb06be..caa9e7fb 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -3,13 +3,12 @@ import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/hospital.dart'; -class User{ +class User { String id; String userName; String password; String email; String image; - String hospitalID; Hospital hospital; Department department; UsersTypes type; @@ -18,103 +17,95 @@ class User{ String token; bool isActive; - - User({ - this.id, - this.userName = "", - this.email = "", - this.password = "", - this.phoneNumber = "", - this.hospital, - this.image, - this.department, - this.type, - this.whatsApp, - this.token, - this.isActive = false - }); + User( + {this.id, + this.userName = "", + this.email = "", + this.password = "", + this.phoneNumber = "", + this.hospital, + this.image, + this.department, + this.type, + this.whatsApp, + this.token, + this.isActive = false}); Future> toLoginJson() async { - if(FirebaseNotificationManger.token == null) - await FirebaseNotificationManger.getToken(); + if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); return { - "username":userName, - "pass":password, + "username": userName, + "pass": password, "firebase_token": FirebaseNotificationManger?.token ?? "", }; } - Map toUpdateProfileJson(){ - Map jsonObject ={}; - if(department?.id != null && department.id.isNotEmpty) - jsonObject["department"] = department.id; - if(whatsApp != null && whatsApp.isNotEmpty) - jsonObject["whatsapp"] = whatsApp; - if(phoneNumber != null && phoneNumber.isNotEmpty) - jsonObject["phone"] = phoneNumber; + Map toUpdateProfileJson() { + Map jsonObject = {}; + if (department?.id != null && department.id.isNotEmpty) jsonObject["department"] = department.id; + if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp; + if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber; return jsonObject; } Future> toRegisterJson() async { - if(FirebaseNotificationManger.token == null) - await FirebaseNotificationManger.getToken(); + if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); return { "username": userName, - "email":email, - "whatsapp":whatsApp, - "client":hospital.id, - "department":department?.id, - "phone":phoneNumber, - "pass":password, + "email": email, + "whatsapp": whatsApp, + "client": hospital.id, + "department": department?.id, + "phone": phoneNumber, + "pass": password, "firebase_token": FirebaseNotificationManger?.token ?? "", }; } - Map toJson(){ + Map toJson() { return { - "uid":id, + "uid": id, "name": userName, - "email":email, - "token":token, - "phone":phoneNumber, - "whatsapp":whatsApp, - "client":hospital?.id, - "client_name":hospital?.name, - "department":department?.id, - "department_name":department?.name, - "password":password, - "picture":image, - "active":isActive ? 1 : 0, - "role": type == UsersTypes.engineer - ? "field_engineer" : "normal_user" , - // "token":token, pass is token + "email": email, + "token": token, + "phone": phoneNumber, + "whatsapp": whatsApp, + "client": hospital?.id, + "client_name": hospital?.name, + "department": department?.id, + "department_name": department?.name, + "password": password, + "picture": image, + "active": isActive ? 1 : 0, + "role": type == UsersTypes.engineer ? "field_engineer" : "normal_user", + // "token":token, pass is token }; } - factory User.fromJson(Map parsedJson){ + factory User.fromJson(Map parsedJson) { UsersTypes type; - switch(parsedJson["role"]){ - case "field_engineer": type = UsersTypes.engineer; break; - default: type = UsersTypes.normal_user; break; + switch (parsedJson["role"]) { + case "field_engineer": + type = UsersTypes.engineer; + break; + default: + type = UsersTypes.normal_user; + break; } return User( - id: parsedJson["uid"], - userName: parsedJson["name"] ?? parsedJson["title"], - email: parsedJson["mail"] ?? parsedJson["email"], - hospital: Hospital( - id: parsedJson["client"], - name: parsedJson["client_name"] - ), - department: Department( - id: parsedJson["department"], - name: parsedJson["department_name"], - ), - image: parsedJson["picture"], - phoneNumber: parsedJson["phone"], - whatsApp: parsedJson["whatsapp"], - token: parsedJson["token"], - isActive: parsedJson["active"] == "1", - type:type - ); + id: parsedJson["uid"], + userName: parsedJson["name"] ?? parsedJson["title"], + email: parsedJson["mail"] ?? parsedJson["email"], + hospital: Hospital(id: parsedJson["client"], name: parsedJson["client_name"]), + department: Department( + id: parsedJson["department"], + name: parsedJson["department_name"], + ), + image: parsedJson["picture"], + phoneNumber: parsedJson["phone"], + whatsApp: parsedJson["whatsapp"], + token: parsedJson["token"], + isActive: parsedJson["active"] == "1", + type: type); } -} \ No newline at end of file +} diff --git a/lib/models/visits/visit.dart b/lib/models/visits/visit.dart index 55071bf9..b6562e4c 100644 --- a/lib/models/visits/visit.dart +++ b/lib/models/visits/visit.dart @@ -1,5 +1,4 @@ -import 'package:test_sa/models/status.dart'; -import 'package:test_sa/models/timer_model.dart'; +import 'package:test_sa/models/lookup.dart'; class Visit{ String id; @@ -16,8 +15,9 @@ class Visit{ String employName; String modelAndBrand; String contactStatus; - Status status; + Lookup status; String assignTo; + String deviceNumber; List images; Visit({ @@ -38,6 +38,7 @@ class Visit{ this.contactStatus, this.images, this.assignTo, + this.deviceNumber, }); factory Visit.fromJson(Map parsedJson){ @@ -45,6 +46,7 @@ class Visit{ id: parsedJson["nid"], serialNumber: parsedJson["title"], hospitalId: parsedJson["client"], + deviceNumber: parsedJson["device_no"], hospitalName: parsedJson["client_name"], deviceId: parsedJson["medical_equipment_nid"], deviceSerialNumber: parsedJson["medical_equipment"], @@ -57,7 +59,7 @@ class Visit{ modelAndBrand: parsedJson["mode_brand"], contactStatus: parsedJson["contactStatus"], images: List.from(parsedJson["images"] ?? []), - status: Status( + status: Lookup( id: int.tryParse(parsedJson["status"] ?? "-1"), // actual value (0,1,2) label: parsedJson["status_value"] // text value ), diff --git a/lib/models/visits/visits_group.dart b/lib/models/visits/visits_group.dart index b408e934..abe6dfc0 100644 --- a/lib/models/visits/visits_group.dart +++ b/lib/models/visits/visits_group.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/visits/visit.dart'; class VisitsGroup{ @@ -8,8 +8,8 @@ class VisitsGroup{ String travelingHours; String jobSheetNumber; String image; - Status status; - Status taskStatus; + Lookup status; + Lookup taskStatus; DateTime date; List visits; diff --git a/lib/views/app_style/colors.dart b/lib/views/app_style/colors.dart index 921cb636..b6200b0e 100644 --- a/lib/views/app_style/colors.dart +++ b/lib/views/app_style/colors.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; class AColors { AColors._(); static const Color white = Color(0xffffffff); diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 9b089448..7b36058c 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -15,7 +15,6 @@ import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_info_section.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; -import 'package:test_sa/views/widgets/requests/request_status.dart'; class DeviceTransferDetails extends StatefulWidget { final DeviceTransfer model; @@ -51,7 +50,6 @@ class _DeviceTransferDetailsState extends State { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _deviceTransferProvider = Provider.of(context); - print(_userProvider.user.id); _isSender = _userProvider.user.id == widget.model.sender?.userId; _isReceiver = _userProvider.user.id == widget.model.receiver?.userId; return Scaffold( diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 66162778..eaaed184 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -12,7 +12,6 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/departments/department_button.dart'; -import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/device_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index 02da4946..454d6d30 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -1,21 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; -import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; -import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; +import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class TrackDeviceTransferPage extends StatefulWidget { static const String id = "/track-device-transfer"; @@ -65,7 +58,7 @@ class _TrackDeviceTransferPageState extends State Expanded( child: Center( child: Text( - _subtitle.serviceRequests, + "Device Transfer", style: Theme.of(context).textTheme.headline6.copyWith( color: AColors.white, fontStyle: FontStyle.italic diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index f9044b65..2b407a48 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -14,10 +14,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; -import 'package:test_sa/views/widgets/equipment/device_button.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; diff --git a/lib/views/pages/login.dart b/lib/views/pages/login.dart index e351b9f9..33372b50 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -131,19 +131,17 @@ class _LoginState extends State { } }, ), - SizedBox( - height: 140 * AppStyle.getScaleFactor(context), - ), - AOutLinedButton( - text: _subtitle.signUp, - //color: AColors.cyan, - onPressed: () { - Navigator.of(context).pushNamed(Register.id); - }, - ), - SizedBox( - height: 32, - ), + // SizedBox( + // height: 140 * AppStyle.getScaleFactor(context), + // ), + // AOutLinedButton( + // text: _subtitle.signUp, + // //color: AColors.cyan, + // onPressed: () { + // Navigator.of(context).pushNamed(Register.id); + // }, + // ), + const SizedBox(height: 32), ], ), ), diff --git a/lib/views/pages/splash_screen.dart b/lib/views/pages/splash_screen.dart index 32911345..a7bfa347 100644 --- a/lib/views/pages/splash_screen.dart +++ b/lib/views/pages/splash_screen.dart @@ -1,16 +1,16 @@ import 'dart:convert'; +import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flare_flutter/flare_actor.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/notification/notification_manger.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/pages/user/land_page.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import 'login.dart'; @@ -70,7 +70,6 @@ class _SplashScreenState extends State { print(await FirebaseMessaging.instance.getToken()); Navigator.of(context).pushNamed(Login.id); if(_settingProvider.isLoaded && _settingProvider.user != null){ - print(_settingProvider.user.toJson()); _goToUserScreen(_settingProvider.user); } }, diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/lib/views/pages/user/gas_refill/gas_refill_details.dart index 33dd686a..d1d41eac 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_details.dart +++ b/lib/views/pages/user/gas_refill/gas_refill_details.dart @@ -13,7 +13,6 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_create_details_item.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_update_details_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index ce9796fc..713c9530 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -1,19 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; -import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; +import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class TrackGasRefillPage extends StatefulWidget { static const String id = "/track-gas-refill"; diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index c5ae3187..dd37a8af 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -33,7 +33,6 @@ import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/dialogs/dialog.dart'; import 'package:test_sa/views/widgets/drawer/drawer_item.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../widgets/land_page/land_page_item.dart'; @@ -94,7 +93,6 @@ class _LandPageState extends State { _buttonHeight = 68 * AppStyle.getScaleFactor(context); return WillPopScope( onWillPop: () async { - print("back pressed"); bool result = await showDialog( context: context, builder: (_) => AAlertDialog( @@ -279,8 +277,8 @@ class _LandPageState extends State { padding: EdgeInsets.all(4), decoration: BoxDecoration(border: Border.all(color: Theme.of(context).primaryColor, width: 2), shape: BoxShape.circle), child: ClipOval( - child: ImageLoader( - url: "https://cdn.business2community.com/wp-content/uploads/2017/08/blank-profile-picture-973460_640.png", + child: ClipOval( + child: Icon(Icons.person,size: 36,color: Theme.of(context).colorScheme.primary,), ), ), ), @@ -345,27 +343,27 @@ class _LandPageState extends State { launch("mailto:customerservice@Test SA.com"); }, ), - DrawerItem( - icon: Icons.phone_in_talk, - title: "${_subtitle.hotLine} 15564", - onPressed: () { - launch("tel:15564"); - }, - ), - DrawerItem( - icon: FontAwesomeIcons.linkedinIn, - title: _subtitle.linkedIn, - onPressed: () { - launch("https://www.linkedin.com/company/Test SA/"); - }, - ), - DrawerItem( - icon: FontAwesomeIcons.globe, - title: _subtitle.ourWebsite, - onPressed: () { - launch("https://www.Test SA.com/"); - }, - ), + // DrawerItem( + // icon: Icons.phone_in_talk, + // title: "${_subtitle.hotLine} 15564", + // onPressed: () { + // launch("tel:15564"); + // }, + // ), + // DrawerItem( + // icon: FontAwesomeIcons.linkedinIn, + // title: _subtitle.linkedIn, + // onPressed: () { + // launch("https://www.linkedin.com/company/Test SA/"); + // }, + // ), + // DrawerItem( + // icon: FontAwesomeIcons.globe, + // title: _subtitle.ourWebsite, + // onPressed: () { + // launch("https://www.Test SA.com/"); + // }, + // ), DrawerItem( icon: Icons.share, title: _subtitle.shareApp, diff --git a/lib/views/pages/user/notifications/notifications_page.dart b/lib/views/pages/user/notifications/notifications_page.dart index 900fb460..a0e85259 100644 --- a/lib/views/pages/user/notifications/notifications_page.dart +++ b/lib/views/pages/user/notifications/notifications_page.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -7,8 +9,6 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class NotificationsPage extends StatefulWidget { static final String id = "/notifications"; @override diff --git a/lib/views/pages/user/report_issues_page.dart b/lib/views/pages/user/report_issues_page.dart index d9a91be3..a1641b24 100644 --- a/lib/views/pages/user/report_issues_page.dart +++ b/lib/views/pages/user/report_issues_page.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -8,15 +11,11 @@ import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; - import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/issues/report_issue_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; class ReportIssuesPage extends StatefulWidget { static final String id = "/report-issue"; final ServiceRequest serviceRequest; diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 32a4e29f..86b819e8 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -25,6 +25,9 @@ import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/sound/record_sound.dart'; import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_priority_mune.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; class CreateRequestPage extends StatefulWidget { static final String id = "/create-request"; @@ -111,7 +114,7 @@ class _CreateRequestPageState extends State { initialValue: _userProvider.user.hospital?.name ?? _subtitle.noHospitalFound, hintText: _subtitle.hospital, prefixIconData: FontAwesomeIcons.hospital, - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.subtitle1, ), 12.height, _userProvider.user.department == null @@ -121,7 +124,7 @@ class _CreateRequestPageState extends State { initialValue: _userProvider.user.department?.name ?? _subtitle.noUniteFound, hintText: _subtitle.unite, prefixIconData: FontAwesomeIcons.hospitalUser, - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.subtitle1, ), 12.height, DeviceButton( @@ -131,6 +134,24 @@ class _CreateRequestPageState extends State { setState(() {}); }, ), + const SizedBox(height: 8,), + const ASubTitle("Priority"), + const SizedBox(height: 4,), + ServiceRequestPriorityMenu( + initialValue: _serviceRequest.priority, + onSelect: (status){ + _serviceRequest.priority = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Defect Type"), + const SizedBox(height: 4,), + ServiceRequestDefectTypesMenu( + initialValue: _serviceRequest.defectType, + onSelect: (status){ + _serviceRequest.defectType = status; + }, + ), 12.height, MultiImagesPicker( label: _subtitle.deviceImages, @@ -173,7 +194,6 @@ class _CreateRequestPageState extends State { final file = File(_serviceRequest.audio); _serviceRequest.audio = base64Encode(file.readAsBytesSync()); } - print("pass data"); int status = await _serviceRequestsProvider.createRequest( user: _userProvider.user, host: _settingProvider.host, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index b509b58d..b9f353be 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -12,7 +12,7 @@ import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -68,7 +68,7 @@ class _CreateServiceReportState extends State with TickerPr void initState() { _serviceReport = ServiceReport( visitDate: DateTime.now(), - type: const Status(id: 2), + type: const Lookup(id: 2), device: Device( id: widget.request.deviceId, serialNumber: widget.request.deviceSerialNumber, @@ -159,25 +159,25 @@ class _CreateServiceReportState extends State with TickerPr Row( children: [ // Report Status - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.reportType), - _validate && _serviceReport.type == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), - ServiceReportTypeMenu( - initialValue: _serviceReport.type, - onSelect: (status){ - _serviceReport.type = status; - }, - ), - ], - ), - ), - const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.reportType), + // _validate && _serviceReport.type == null ? + // ASubTitle(_subtitle.requiredWord,color: Colors.red,): + // const SizedBox.shrink(), + // const SizedBox(height: 4,), + // ServiceReportTypeMenu( + // initialValue: _serviceReport.type, + // onSelect: (status){ + // _serviceReport.type = status; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), // visit date Expanded( child: Column( @@ -490,9 +490,9 @@ class _CreateServiceReportState extends State with TickerPr textAlign: TextAlign.center, hintText: "i.e 3, 3.5, 4", style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : _subtitle.requiredWord, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value){ _serviceReport.travelingHours = value; @@ -507,29 +507,29 @@ class _CreateServiceReportState extends State with TickerPr // Operating Hours and Job Sheet Number Row( children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.operatingHours), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.operatingHours, - textAlign: TextAlign.center, - hintText: "i.e 3, 3.5, 4", - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.operatingHours = value; - }, - ), - ], - ), - ), - const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.operatingHours), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.operatingHours, + // textAlign: TextAlign.center, + // hintText: "i.e 3, 3.5, 4", + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value){ + // _serviceReport.operatingHours = value; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index aeed77b5..0b268fc7 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -1,18 +1,20 @@ import 'dart:convert'; import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/status.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -33,10 +35,6 @@ import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; class EditServiceReport extends StatefulWidget { static final String id = "/edit-service-report"; final ServiceRequest request ; diff --git a/lib/views/pages/user/requests/report/future_service_report.dart b/lib/views/pages/user/requests/report/future_service_report.dart index a2e1897d..5ee16ea2 100644 --- a/lib/views/pages/user/requests/report/future_service_report.dart +++ b/lib/views/pages/user/requests/report/future_service_report.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -5,11 +7,8 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import 'edit_service_report.dart'; class FutureServiceReport extends StatefulWidget { diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index c9e78584..2ada571e 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -1,3 +1,7 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; @@ -20,11 +24,6 @@ import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/service_request_update_dialog.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; import '../report_issues_page.dart'; import 'report/future_service_report.dart'; @@ -182,6 +181,10 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.code, info: serviceRequest.requestCode, ), + RequestInfoRow( + title: "Asset Number", + info: serviceRequest.deviceNumber, + ), RequestInfoRow( title: _subtitle.deviceSN, info: serviceRequest.deviceSerialNumber, @@ -230,10 +233,10 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.unite, info: serviceRequest.departmentName, ), - RequestInfoRow( - title: _subtitle.deviceArName, - content: serviceRequest.deviceArName, - ), + // RequestInfoRow( + // title: _subtitle.deviceArName, + // content: serviceRequest.deviceArName, + // ), RequestInfoRow( title: _subtitle.deviceEnName, content: serviceRequest.deviceEnName, diff --git a/lib/views/pages/user/requests/requests_page.dart b/lib/views/pages/user/requests/requests_page.dart index af926f28..e535d03b 100644 --- a/lib/views/pages/user/requests/requests_page.dart +++ b/lib/views/pages/user/requests/requests_page.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -5,13 +7,11 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceRequestsPage extends StatefulWidget { static final String id = "/service-requests"; @override diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart new file mode 100644 index 00000000..7c9201b1 --- /dev/null +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -0,0 +1,187 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/models/visits/visit.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/pentry/pentry_calibration_tool_form.dart'; +import 'package:test_sa/views/widgets/pentry/pentry_info_form.dart'; +import 'package:test_sa/views/widgets/pentry/pentry_pm_kit_form.dart'; +import 'package:test_sa/views/widgets/pentry/pentry_ppm_check_list_form.dart'; + +class EditPentry extends StatefulWidget { + final Pentry pentry; + final Visit visit; + const EditPentry({Key key,this.pentry, this.visit}) : super(key: key); + + @override + State createState() => _EditPentryState(); +} + +class _EditPentryState extends State with SingleTickerProviderStateMixin{ + bool _isLoading = false; + bool _validate = false; + Subtitle _subtitle; + UserProvider _userProvider; + SettingProvider _settingProvider; + RegularVisitsProvider _regularVisitsProvider; + Pentry _pentry; + final GlobalKey _scaffoldKey = GlobalKey(); + + TabController _tabController; + _onSubmit() async { + _validate = true; + + if(!_pentry.validate()) { + setState(() { }); + return; + } + + _isLoading = true; + setState(() {}); + + int status = await _regularVisitsProvider.updatePentry( + user: _userProvider.user, + host: _settingProvider.host, + pentry: _pentry, + visit: widget.visit + ); + _isLoading =false; + setState(() {}); + if(status >= 200 && status < 300){ + Fluttertoast.showToast( + msg: _subtitle.requestCompleteSuccessfully, + ); + // Navigator.of(context).pop(); + }else{ + String errorMessage = HttpStatusManger.getStatusMessage( + status: status, subtitle: _subtitle); + Fluttertoast.showToast( + msg: errorMessage, + ); + } + } + + @override + void initState() { + _pentry = widget.pentry; + _tabController = TabController(length: 4, vsync: this); + super.initState(); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + _subtitle = AppLocalization.of(context).subtitle; + _userProvider = Provider.of(context); + _settingProvider = Provider.of(context); + _regularVisitsProvider = Provider.of(context); + return Scaffold( + key: _scaffoldKey, + body: SafeArea( + child: LoadingManager( + isLoading: _isLoading, + isFailedLoading: false, + stateCode: 200, + onRefresh: () async {}, + child: Column( + children: [ + Material( + color: Theme.of(context).colorScheme.primary, + child: Padding( + padding: const EdgeInsets.all(2.0), + child: TabBar( + controller: _tabController, + isScrollable: true, + onTap: (index){ + setState(() {}); + }, + tabs: const [ + Tab(text: "PPM Check List",), + Tab(text: "Calibration Tools",), + Tab(text: "PK Kits",), + Tab(text: "Pentry",), + ]), + ), + ), + Expanded( + child: Stack( + children: [ + TabBarView( + physics: const NeverScrollableScrollPhysics(), + controller: _tabController, + children: [ + PentryPPMCheckListForm( + models: _pentry.ppmCheckLists, + enableValidate: _validate, + ), + PentryCalibrationToolForm( + models: _pentry.calibrationTools, + enableValidate: _validate, + ), + PentryPMKitForm( + models: _pentry.pmKits, + enableValidate: _validate, + ), + PentryInfoForm( + model: _pentry, + enableValidate: _validate, + ) + ], + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + if(_tabController.index != 0) + ASmallButton( + text: _subtitle.back, + onPressed: (){ + _tabController.animateTo(_tabController.index - 1,); + setState(() {}); + }, + ), + const Spacer(), + if(_tabController.index != _tabController.length -1) + ASmallButton( + text: _subtitle.next, + onPressed: (){ + _tabController.animateTo(_tabController.index + 1,); + setState(() {}); + }, + ), + if(_tabController.index == _tabController.length -1) + ASmallButton( + text: _subtitle.update, + onPressed: _onSubmit, + ), + ], + ), + ), + ) + ], + ), + ), + + ], + ) + ), + ), + ); + } +} + diff --git a/lib/views/pages/user/visits/pantry/future_edit_pently.dart b/lib/views/pages/user/visits/pantry/future_edit_pently.dart new file mode 100644 index 00000000..161df3ce --- /dev/null +++ b/lib/views/pages/user/visits/pantry/future_edit_pently.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/models/visits/visit.dart'; +import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; +import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; +class FutureEditPentry extends StatefulWidget { + + final Visit visit; + + const FutureEditPentry({Key key, this.visit}) : super(key: key); + + @override + State createState() => _FutureEditPentryState(); +} + +class _FutureEditPentryState extends State { + + UserProvider _userProvider; + SettingProvider _settingProvider; + @override + Widget build(BuildContext context) { + _userProvider = Provider.of(context); + _settingProvider = Provider.of(context); + //String requestId = ModalRoute.of(context).settings.arguments; + Subtitle subtitle = AppLocalization.of(context).subtitle; + return Scaffold( + body: FutureBuilder( + future: RegularVisitsProvider().getPently( + user: _userProvider.user, + host: _settingProvider.host, + id: widget.visit.id + ), + builder: (BuildContext context, AsyncSnapshot snapshot){ + if(snapshot.hasError) { + + return FailedLoading( + message: subtitle.failedToCompleteRequest, + onReload: (){setState(() {});}, + ); + } + if(snapshot.hasData){ + return EditPentry( + pentry: snapshot.data, + visit: widget.visit, + ); + } + return const Center(child: ALoading()); + }, + ), + ); + } +} diff --git a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart b/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart index b4eec47f..7c1c57c2 100644 --- a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart +++ b/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart @@ -1,3 +1,7 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/preventive_maintenance_visits_provider.dart'; @@ -8,16 +12,12 @@ import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.dart'; -import 'package:test_sa/views/widgets/visits/visits_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/search/visits_search_bar.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; +import 'package:test_sa/views/widgets/visits/visits_list.dart'; class PreventiveMaintenanceVisitsPage extends StatefulWidget { static final String id = "/preventive-maintenance-visits"; @override diff --git a/lib/views/pages/user/visits/regular_visits_page.dart b/lib/views/pages/user/visits/regular_visits_page.dart index d1bd69bd..37e34fed 100644 --- a/lib/views/pages/user/visits/regular_visits_page.dart +++ b/lib/views/pages/user/visits/regular_visits_page.dart @@ -1,3 +1,7 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; @@ -8,16 +12,12 @@ import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.dart'; -import 'package:test_sa/views/widgets/visits/visits_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/search/visits_search_bar.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; +import 'package:test_sa/views/widgets/visits/visits_list.dart'; class RegularVisitsPage extends StatefulWidget { static final String id = "/Regular-visits"; @override diff --git a/lib/views/pages/user/visits/update_visits_group_sheet.dart b/lib/views/pages/user/visits/update_visits_group_sheet.dart index 50d925d5..724f4657 100644 --- a/lib/views/pages/user/visits/update_visits_group_sheet.dart +++ b/lib/views/pages/user/visits/update_visits_group_sheet.dart @@ -1,8 +1,9 @@ import 'dart:convert'; import 'dart:io'; +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; @@ -15,7 +16,6 @@ import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/images/one_image_picker.dart'; import 'package:test_sa/views/widgets/search/filter_item.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; -import 'package:flutter/material.dart'; class UpdateVisitsGroupSheet extends StatefulWidget { final List visits; final String title; @@ -26,15 +26,15 @@ class UpdateVisitsGroupSheet extends StatefulWidget { } class _UpdateVisitsGroupSheetState extends State { - List status = [ - Status(label: "Done", id: 0,), - Status(label: "Not Yet", id: 1), - Status(label: "On Hold", id: 2,), + List status = [ + Lookup(label: "Done", id: 0,), + Lookup(label: "Not Yet", id: 1), + Lookup(label: "On Hold", id: 2,), ]; - List taskStatus = [ - Status(label: "Passed", id: 0,), - Status(label: "Failed", id: 1), + List taskStatus = [ + Lookup(label: "Passed", id: 0,), + Lookup(label: "Failed", id: 1), ]; VisitsGroup _group = VisitsGroup(); File _image; diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index 98738c36..e191cf67 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -1,14 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/pages/user/visits/pantry/future_edit_pently.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/images/images_list.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; -import 'package:flutter/material.dart'; + +import '../../../../controllers/providers/api/regular_visits_provider.dart'; + class VisitDetailsPage extends StatelessWidget { static final String id = "/visit-details"; @@ -18,6 +24,8 @@ class VisitDetailsPage extends StatelessWidget { @override Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; + final regularVisitsProvider = Provider.of(context); + return Scaffold( body: SafeArea( child: Column( @@ -39,7 +47,18 @@ class VisitDetailsPage extends StatelessWidget { ), ), ), - SizedBox(width: 42,) + AIconButton( + iconData: Icons.edit, + color: AColors.white, + buttonSize: 42, + backgroundColor: AColors.green, + onPressed: () async { + Navigator.of(context).push( + MaterialPageRoute(builder: (_)=> FutureEditPentry(visit: visit,)) + ); + }, + ), + SizedBox(width: 16,) ], ), ), @@ -87,6 +106,10 @@ class VisitDetailsPage extends StatelessWidget { title: _subtitle.code, info: visit.serialNumber, ), + RequestInfoRow( + title: "Asset Number", + info: visit.deviceNumber, + ), RequestInfoRow( title: _subtitle.deviceSN, info: visit.deviceSerialNumber, diff --git a/lib/views/widgets/app_name_bar.dart b/lib/views/widgets/app_name_bar.dart index 35a382a0..8aebd901 100644 --- a/lib/views/widgets/app_name_bar.dart +++ b/lib/views/widgets/app_name_bar.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class AppNameBar extends StatelessWidget { @override Widget build(BuildContext context) { diff --git a/lib/views/widgets/buttons/app_icon_button.dart b/lib/views/widgets/buttons/app_icon_button.dart index 8c1da58e..07e9c9a3 100644 --- a/lib/views/widgets/buttons/app_icon_button.dart +++ b/lib/views/widgets/buttons/app_icon_button.dart @@ -1,7 +1,7 @@ -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class AIconButton extends StatelessWidget { final IconData iconData; diff --git a/lib/views/widgets/date_and_time/date_picker.dart b/lib/views/widgets/date_and_time/date_picker.dart index 4ce1dd9f..ee68b716 100644 --- a/lib/views/widgets/date_and_time/date_picker.dart +++ b/lib/views/widgets/date_and_time/date_picker.dart @@ -1,6 +1,5 @@ -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class ADatePicker extends StatelessWidget { final DateTime date; @@ -14,13 +13,13 @@ class ADatePicker extends StatelessWidget { Widget build(BuildContext context) { return ElevatedButton( style: ElevatedButton.styleFrom( + foregroundColor: Colors.white, + textStyle: Theme.of(context).textTheme.subtitle2, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular( 12 * AppStyle.getScaleFactor(context) - ) + ), ), - primary: AColors.white, - onPrimary: AColors.primaryColor, ), child: Text( date == null ? "Pick Date" : diff --git a/lib/views/widgets/date_and_time/from_to_date_bar.dart b/lib/views/widgets/date_and_time/from_to_date_bar.dart index 422dcbf9..4ef79e81 100644 --- a/lib/views/widgets/date_and_time/from_to_date_bar.dart +++ b/lib/views/widgets/date_and_time/from_to_date_bar.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; import 'date_picker.dart'; class FromToDateBar extends StatefulWidget { diff --git a/lib/views/widgets/departments/department_item.dart b/lib/views/widgets/departments/department_item.dart index fd37b418..4ac240e9 100644 --- a/lib/views/widgets/departments/department_item.dart +++ b/lib/views/widgets/departments/department_item.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class DepartmentItem extends StatelessWidget { final Department department; final Function(Department) onPressed; diff --git a/lib/views/widgets/departments/single_department_picker.dart b/lib/views/widgets/departments/single_department_picker.dart index fb07b393..e5fb916b 100644 --- a/lib/views/widgets/departments/single_department_picker.dart +++ b/lib/views/widgets/departments/single_department_picker.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/departments_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -6,8 +8,6 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/departments/department_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import '../app_text_form_field.dart'; class SingleDepartmentPicker extends StatefulWidget { diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index a042d72f..169e16f1 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; diff --git a/lib/views/widgets/device_trancfer/device_transfer_list.dart b/lib/views/widgets/device_trancfer/device_transfer_list.dart index ede0bc6d..18bee922 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_list.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_list.dart @@ -1,17 +1,11 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/device/device_transfer.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart'; -import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_item.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_item.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:test_sa/views/widgets/requests/service_request_item.dart'; -import 'package:flutter/material.dart'; class DeviceTransferList extends StatelessWidget { final List items; final bool nextPage; diff --git a/lib/views/widgets/e_signature/e_signature.dart b/lib/views/widgets/e_signature/e_signature.dart index 72f9d653..c48ce9b5 100644 --- a/lib/views/widgets/e_signature/e_signature.dart +++ b/lib/views/widgets/e_signature/e_signature.dart @@ -1,5 +1,3 @@ -import 'dart:convert'; - import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:signature/signature.dart'; diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index c9e11872..0756bc70 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -1,13 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; -import 'package:provider/provider.dart'; class AutoCompleteDeviceField extends StatefulWidget { final Device initialValue; final String hospitalId; @@ -43,65 +42,52 @@ class _AutoCompleteDeviceFieldState extends State { _userProvider = Provider.of(context); _devicesProvider = Provider.of(context); //Subtitle _subtitle = AppLocalization.of(context).subtitle; - return LoadingManager( - isLoading: _devicesProvider.isLoading, - isFailedLoading: _devicesProvider.devices == null, - stateCode: _devicesProvider.stateCode, - onRefresh: () async { - _devicesProvider.reset(); - await _devicesProvider.getEquipment( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId - ); - }, - child: Container( - padding: EdgeInsets.symmetric( - horizontal: 16 + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) ), - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] - ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - controller: _controller, - textAlign: TextAlign.center, - decoration: InputDecoration( - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, + boxShadow: [ + AppStyle.boxShadow + ] + ), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, ), - suggestionsCallback: (vale) async { - return await _devicesProvider.getDevicesList( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId, - title: vale, - ); - }, - itemBuilder: (context, device) { - return ListTile( - title: Text(device.serialNumber), - subtitle: Text(device.model+"/"+device.brand), - ); - }, - onSuggestionSelected: (device) { - _controller.text = device.serialNumber; - widget.onPick(device.id); - }, - ), + textInputAction: TextInputAction.search, ), + suggestionsCallback: (value) async { + return await _devicesProvider.getDevicesList( + host: _settingProvider.host, + user: _userProvider.user, + hospitalId: widget.hospitalId, + serialNumber: value, + ); + }, + itemBuilder: (context, device) { + return ListTile( + title: Text(device.serialNumber), + subtitle: Text(device.model+"/"+device.brand), + ); + }, + onSuggestionSelected: (device) { + _controller.text = device.serialNumber; + widget.onPick(device.id); + }, + ), ); } } diff --git a/lib/views/widgets/equipment/device_item.dart b/lib/views/widgets/equipment/device_item.dart index aaa3112d..df07096b 100644 --- a/lib/views/widgets/equipment/device_item.dart +++ b/lib/views/widgets/equipment/device_item.dart @@ -1,9 +1,9 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class DeviceItem extends StatelessWidget { final Device device; final Function(Device) onPressed; diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 9ecd0bbe..bc8bf527 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -8,9 +11,6 @@ import 'package:test_sa/views/widgets/equipment/device_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/qr/scan_qr.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; import '../app_text_form_field.dart'; class SingleDevicePicker extends StatefulWidget { @@ -88,22 +88,41 @@ class _SingleDevicePickerState extends State { }, child: Column( children: [ - SizedBox(height: 48,), + const SizedBox(height: 48), Padding( padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), - child: ATextFormField( - hintText: _subtitle.searchBySn, - style: Theme.of(context).textTheme.headline6, - suffixIcon: const Icon(Icons.search_rounded), - onChange: (value){ - _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices.where( - (element) => element.serialNumber.toLowerCase().contains( + child: Column( + children: [ + ATextFormField( + hintText: _subtitle.searchBySn, + style: Theme.of(context).textTheme.subtitle1, + suffixIcon: const Icon(Icons.search_rounded), + onChange: (value){ + _searchableList.clear(); + _searchableList.addAll(_devicesProvider.devices.where( + (element) => element.serialNumber.toLowerCase().contains( value.toLowerCase() - ) - ).toList()); - setState(() {}); - }, + ) + ).toList()); + setState(() {}); + }, + ), + const SizedBox(height: 8,), + ATextFormField( + hintText: "Search by Number", + style: Theme.of(context).textTheme.subtitle1, + suffixIcon: const Icon(Icons.search_rounded), + onChange: (value){ + _searchableList.clear(); + _searchableList.addAll(_devicesProvider.devices.where( + (element) => element.number.toLowerCase().contains( + value.toLowerCase() + ) + ).toList()); + setState(() {}); + }, + ), + ], ), ), Expanded( diff --git a/lib/views/widgets/gas_refill/gas_refill_list.dart b/lib/views/widgets/gas_refill/gas_refill_list.dart index b54c2ee9..e25797d2 100644 --- a/lib/views/widgets/gas_refill/gas_refill_list.dart +++ b/lib/views/widgets/gas_refill/gas_refill_list.dart @@ -1,14 +1,11 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_item.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:test_sa/views/widgets/requests/service_request_item.dart'; -import 'package:flutter/material.dart'; class GasRefillList extends StatelessWidget { final List items; final bool nextPage; diff --git a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart index 2a94a9ba..0ccd9e45 100644 --- a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart @@ -3,7 +3,6 @@ import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; diff --git a/lib/views/widgets/hospitals/auto_complete_field.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart similarity index 89% rename from lib/views/widgets/hospitals/auto_complete_field.dart rename to lib/views/widgets/hospitals/hospital_auto_complete_field.dart index 6ce29dcf..863ebc08 100644 --- a/lib/views/widgets/hospitals/auto_complete_field.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart @@ -10,18 +10,18 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_item.dart'; -class AutoCompleteField extends StatefulWidget { +class HospitalAutoCompleteField extends StatefulWidget { final String initialValue; final Function(String) onSearch; final Function(String) onSave; - const AutoCompleteField({Key key, this.onSearch, this.initialValue, this.onSave}) : super(key: key); + const HospitalAutoCompleteField({Key key, this.onSearch, this.initialValue, this.onSave}) : super(key: key); @override - _AutoCompleteFieldState createState() => _AutoCompleteFieldState(); + _HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState(); } -class _AutoCompleteFieldState extends State { +class _HospitalAutoCompleteFieldState extends State { SettingProvider _settingProvider; TextEditingController _controller; diff --git a/lib/views/widgets/hospitals/single_hospital_picker.dart b/lib/views/widgets/hospitals/single_hospital_picker.dart index f2ee3c74..27ca0861 100644 --- a/lib/views/widgets/hospitals/single_hospital_picker.dart +++ b/lib/views/widgets/hospitals/single_hospital_picker.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/hospitals_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -6,8 +8,6 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import '../app_text_form_field.dart'; class SingleHospitalPicker extends StatefulWidget { diff --git a/lib/views/widgets/images/image_item.dart b/lib/views/widgets/images/image_item.dart index 8478ae97..5e2412a0 100644 --- a/lib/views/widgets/images/image_item.dart +++ b/lib/views/widgets/images/image_item.dart @@ -1,8 +1,8 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; class ImageItem extends StatelessWidget { final String url; final bool isVideo; diff --git a/lib/views/widgets/images/images_list.dart b/lib/views/widgets/images/images_list.dart index 01868340..df2bdb0d 100644 --- a/lib/views/widgets/images/images_list.dart +++ b/lib/views/widgets/images/images_list.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; import 'image_item.dart'; import 'images_viewer.dart'; diff --git a/lib/views/widgets/images/images_viewer.dart b/lib/views/widgets/images/images_viewer.dart index 76c79814..865f0306 100644 --- a/lib/views/widgets/images/images_viewer.dart +++ b/lib/views/widgets/images/images_viewer.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:flutter/material.dart'; class ImagesViewer extends StatelessWidget { final List images; diff --git a/lib/views/widgets/images/mini_one_image_picker.dart b/lib/views/widgets/images/mini_one_image_picker.dart index 0f696032..710e960d 100644 --- a/lib/views/widgets/images/mini_one_image_picker.dart +++ b/lib/views/widgets/images/mini_one_image_picker.dart @@ -1,11 +1,11 @@ import 'dart:io'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class AMiniOneImagePicker extends StatefulWidget { final Function(File) onPick; @@ -70,7 +70,8 @@ class _AMiniOneImagePickerState extends State { AppStyle.borderRadius * AppStyle.getScaleFactor(context) ) ), - primary: Colors.grey[200], + //primary: Colors.grey[200], + textStyle: Theme.of(context).textTheme.overline, padding: _image == null ? null : EdgeInsets.zero, ), @@ -78,7 +79,6 @@ class _AMiniOneImagePickerState extends State { padding: const EdgeInsets.all(8.0), child: Text( _image == null ? _subtitle.pickImage : _image.path.split("/").last, - style: Theme.of(context).textTheme.overline, textScaleFactor: AppStyle.getScaleFactor(context), ), ), diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index 0173336f..854209bb 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -50,7 +50,7 @@ class _MultiImagesPickerState extends State with TickerProvid child: Text( widget.label ?? _subtitle.images, style: Theme.of(context).textTheme.headline6.copyWith( - fontSize: 16, + fontSize: 14, ), textScaleFactor: AppStyle.getScaleFactor(context), ), diff --git a/lib/views/widgets/images/multi_image_picker_item.dart b/lib/views/widgets/images/multi_image_picker_item.dart index 92943032..be1d1b15 100644 --- a/lib/views/widgets/images/multi_image_picker_item.dart +++ b/lib/views/widgets/images/multi_image_picker_item.dart @@ -1,9 +1,9 @@ import 'dart:io'; +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:flutter/material.dart'; class MultiImagesPickerItem extends StatelessWidget { diff --git a/lib/views/widgets/images/one_image_picker.dart b/lib/views/widgets/images/one_image_picker.dart index 4220f330..3ff3ebbf 100644 --- a/lib/views/widgets/images/one_image_picker.dart +++ b/lib/views/widgets/images/one_image_picker.dart @@ -1,11 +1,11 @@ import 'dart:io'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class AOneImagePicker extends StatefulWidget { final Function(File) onPick; diff --git a/lib/views/widgets/issues/report_issue_item.dart b/lib/views/widgets/issues/report_issue_item.dart index 0d04910d..8a952be7 100644 --- a/lib/views/widgets/issues/report_issue_item.dart +++ b/lib/views/widgets/issues/report_issue_item.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class ReportIssueItem extends StatelessWidget { final bool isSelected; final String issueInfo; diff --git a/lib/views/widgets/loaders/app_lazy_loading.dart b/lib/views/widgets/loaders/app_lazy_loading.dart index 7f2676c1..e3378c98 100644 --- a/lib/views/widgets/loaders/app_lazy_loading.dart +++ b/lib/views/widgets/loaders/app_lazy_loading.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; import 'app_loading.dart'; class ALazyLoading extends StatelessWidget { diff --git a/lib/views/widgets/loaders/failed_loading.dart b/lib/views/widgets/loaders/failed_loading.dart index 42e047ef..5039628b 100644 --- a/lib/views/widgets/loaders/failed_loading.dart +++ b/lib/views/widgets/loaders/failed_loading.dart @@ -1,6 +1,6 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class FailedLoading extends StatelessWidget { final String message; final VoidCallback onReload; diff --git a/lib/views/widgets/loaders/lazy_loading.dart b/lib/views/widgets/loaders/lazy_loading.dart index d5649c30..d5e5f2ed 100644 --- a/lib/views/widgets/loaders/lazy_loading.dart +++ b/lib/views/widgets/loaders/lazy_loading.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; import 'app_loading.dart'; class LazyLoading extends StatefulWidget { diff --git a/lib/views/widgets/loaders/loading_manager.dart b/lib/views/widgets/loaders/loading_manager.dart index 2a0c9bd9..8ed322e0 100644 --- a/lib/views/widgets/loaders/loading_manager.dart +++ b/lib/views/widgets/loaders/loading_manager.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; -import 'package:flutter/material.dart'; import 'app_loading.dart'; import 'failed_loading.dart'; diff --git a/lib/views/widgets/loaders/no_item_found.dart b/lib/views/widgets/loaders/no_item_found.dart index ca71c28e..5ed637e7 100644 --- a/lib/views/widgets/loaders/no_item_found.dart +++ b/lib/views/widgets/loaders/no_item_found.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class NoItemFound extends StatelessWidget { final String message; diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index ef2be956..9c31d01e 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/parts_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -5,14 +8,12 @@ import 'package:test_sa/models/part.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; -import 'package:provider/provider.dart'; class AutoCompletePartsField extends StatefulWidget { final String initialValue; final Function(Part) onPick; + final bool clearAfterPick; - const AutoCompletePartsField({Key key, this.initialValue, this.onPick}) : super(key: key); + const AutoCompletePartsField({Key key, this.initialValue, this.onPick, this.clearAfterPick = true}) : super(key: key); @override _AutoCompletePartsFieldState createState() => _AutoCompletePartsFieldState(); @@ -54,7 +55,7 @@ class _AutoCompletePartsFieldState extends State { ); }, child: Container( - padding: EdgeInsets.symmetric( + padding: const EdgeInsets.symmetric( horizontal: 16 ), decoration: BoxDecoration( @@ -63,7 +64,7 @@ class _AutoCompletePartsFieldState extends State { borderRadius: BorderRadius.circular( AppStyle.borderRadius * AppStyle.getScaleFactor(context) ), - boxShadow: [ + boxShadow: const [ AppStyle.boxShadow ] ), @@ -72,7 +73,7 @@ class _AutoCompletePartsFieldState extends State { style: Theme.of(context).textTheme.subtitle1, controller: _controller, textAlign: TextAlign.center, - decoration: InputDecoration( + decoration: const InputDecoration( border: InputBorder.none, disabledBorder: InputBorder.none, focusedBorder: InputBorder.none, @@ -93,7 +94,11 @@ class _AutoCompletePartsFieldState extends State { ); }, onSuggestionSelected: (part) { - _controller.clear(); + if(widget.clearAfterPick){ + _controller.clear(); + } else{ + _controller.text = part.code; + } widget.onPick(part); }, ), diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart new file mode 100644 index 00000000..ea2228cd --- /dev/null +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/devices_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +class AutoCompleteDeviceNumberField extends StatefulWidget { + final Lookup initialValue; + final String hospitalId; + final Function(Lookup) onPick; + + const AutoCompleteDeviceNumberField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); + + @override + State createState() => _AutoCompleteDeviceNumberFieldState(); +} + +class _AutoCompleteDeviceNumberFieldState extends State { + + SettingProvider _settingProvider; + DevicesProvider _devicesProvider; + UserProvider _userProvider; + TextEditingController _controller; + + @override + void initState() { + _controller = TextEditingController(text: widget.initialValue?.label); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + @override + Widget build(BuildContext context) { + _settingProvider = Provider.of(context); + _userProvider = Provider.of(context); + _devicesProvider = Provider.of(context); + //Subtitle _subtitle = AppLocalization.of(context).subtitle; + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) + ), + boxShadow: const [ + AppStyle.boxShadow + ] + ), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, + ), + suggestionsCallback: (vale) async { + return await _devicesProvider.getDevicesList( + host: _settingProvider.host, + user: _userProvider.user, + hospitalId: widget.hospitalId, + number: vale, + ); + }, + itemBuilder: (context, device) { + return ListTile( + title: Text(device.number), + subtitle: Text("${device.model}/${device.brand}"), + ); + }, + onSuggestionSelected: (device) { + _controller.text = device.number; + widget.onPick(Lookup(id: int.tryParse(device.id),label: device.number)); + }, + ), + ); + } +} diff --git a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart new file mode 100644 index 00000000..70528bb3 --- /dev/null +++ b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart @@ -0,0 +1,95 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/models/pantry/calibration_tools.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; +import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +class PentryCalibrationToolForm extends StatefulWidget { + final List models; + final bool enableValidate; + const PentryCalibrationToolForm({ + Key key, this.models, this.enableValidate, + }) : super(key: key); + + @override + State createState() => _PentryCalibrationToolFormState(); +} + +class _PentryCalibrationToolFormState extends State { + + + @override + Widget build(BuildContext context) { + final subtitle = AppLocalization.of(context).subtitle; + final userProvider = Provider.of(context); + return ListView.builder( + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), + left: 12 * AppStyle.getScaleFactor(context), + right: 12 * AppStyle.getScaleFactor(context), + bottom: 80 * AppStyle.getScaleFactor(context) + ), + itemCount: widget.models.length + 1, + itemBuilder: (context,index){ + if(index == widget.models.length){ + return AButton( + text: subtitle.add, + onPressed: (){ + widget.models.add(CalibrationTool()); + setState(() {}); + }, + ); + } + final model = widget.models[index]; + return ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle("#${index+1}"), + if(index != 0) + ASmallButton( + color: Theme.of(context).colorScheme.error, + text: subtitle.delete, + onPressed: (){ + widget.models.remove(model); + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8,), + const ASubTitle("Asset Number"), + const SizedBox(height: 4,), + AutoCompleteDeviceNumberField( + initialValue: model.assetsNumber, + hospitalId: userProvider.user.hospital.id, + onPick: (number){ + model.assetsNumber = number; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Date of Testing"), + const SizedBox(height: 4,), + ADatePicker( + date: model.dataOfTesting, + onDatePicker: (date){ + model.dataOfTesting =date; + setState(() {}); + }, + ), + const SizedBox(height: 8,), + Divider(color: Theme.of(context).textTheme.titleMedium.color,), + ], + ); + } + ); + } +} diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/lib/views/widgets/pentry/pentry_info_form.dart new file mode 100644 index 00000000..1fadc1c9 --- /dev/null +++ b/lib/views/widgets/pentry/pentry_info_form.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/app_text_form_field.dart'; +import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; +import 'package:test_sa/views/widgets/status/pentry/pentry_status_mune.dart'; +import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart'; +import 'package:test_sa/views/widgets/timer/app_timer.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +class PentryInfoForm extends StatefulWidget { + final Pentry model; + final bool enableValidate; + const PentryInfoForm({ + Key key, this.model, this.enableValidate, + }) : super(key: key); + + @override + State createState() => _PentryInfoFormState(); +} + +class _PentryInfoFormState extends State { + + @override + Widget build(BuildContext context) { + final subtitle = AppLocalization.of(context).subtitle; + final userProvider = Provider.of(context); + return ListView( + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), + left: 12 * AppStyle.getScaleFactor(context), + right: 12 * AppStyle.getScaleFactor(context), + bottom: 80 * AppStyle.getScaleFactor(context) + ), + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + const SizedBox(height: 8,), + const ASubTitle("PPM Visit Status"), + if(widget.enableValidate && widget.model.ppmVisitStatus == null) + ASubTitle(subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + PentryVisitsStatusMenu( + initialValue: widget.model.ppmVisitStatus, + onSelect: (status){ + widget.model.ppmVisitStatus = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Timer"), + if(widget.enableValidate && widget.model?.timer?.endAt == null) + ASubTitle(subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + AppTimer( + timer: widget.model.timer, + onChange: (timer) async{ + widget.model.timer = timer; + return true; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Status"), + // if(widget.enableValidate && widget.model.status == null) + // ASubTitle(subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + PentryStatusMenu( + initialValue: widget.model.status, + onSelect: (status){ + widget.model.status = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Actual Visit Date"), + if(widget.enableValidate && widget.model.actualVisitDate == null) + ASubTitle(subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + ADatePicker( + date: widget.model.actualVisitDate, + from: DateTime.now().subtract(const Duration(days: 30)), + onDatePicker: (date){ + if(date == null) return; + widget.model.actualVisitDate = date; + setState(() {}); + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Traveling Hours"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (widget.model.travelingHours ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.number, + onChange: (value){ + widget.model.travelingHours = value; + }, + ), + const SizedBox(height: 12,), + const ASubTitle("PPM Attachment"), + AMiniOneImagePicker( + //error: _validate && _serviceReport.image == null, + image: widget.model.imageFile, + onPick: (image){ + widget.model.imageFile =image; + }, + ), + const SizedBox(height: 8,), + ], + ); + } +} diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart new file mode 100644 index 00000000..6fdd3b43 --- /dev/null +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -0,0 +1,154 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/pantry/pm_kit.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/app_text_form_field.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; +import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +class PentryPMKitForm extends StatefulWidget { + final List models; + final bool enableValidate; + const PentryPMKitForm({ + Key key, this.models, this.enableValidate, + }) : super(key: key); + + @override + State createState() => _PentryPMKitFormState(); +} + +class _PentryPMKitFormState extends State { + + @override + Widget build(BuildContext context) { + final subtitle = AppLocalization.of(context).subtitle; + return ListView.builder( + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), + left: 12 * AppStyle.getScaleFactor(context), + right: 12 * AppStyle.getScaleFactor(context), + bottom: 80 * AppStyle.getScaleFactor(context) + ), + itemCount: widget.models.length + 1, + itemBuilder: (context,index){ + if(index == widget.models.length){ + return AButton( + text: subtitle.add, + onPressed: (){ + widget.models.add(PMKit()); + setState(() {}); + }, + ); + } + final model = widget.models[index]; + return ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle("#${index+1}"), + if(index != 0) + ASmallButton( + color: Theme.of(context).colorScheme.error, + text: subtitle.delete, + onPressed: (){ + widget.models.remove(model); + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8,), + const ASubTitle("Item Code"), + const SizedBox(height: 4,), + AutoCompletePartsField( + clearAfterPick: false, + initialValue: (model.itemCode?.label ?? "").toString(), + onPick: (part){ + model.itemCode = Lookup(id: int.tryParse(part.id),label: part.code); + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Item Name"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.itemName ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.itemName = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Preparation Time Frame"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.preparationTimeFrame ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.preparationTimeFrame = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("kit Frequency Demand"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.kitFrequencyDemand ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.kitFrequencyDemand = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Availability"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.availability ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.availability = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Quantity Needed"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.quantityNeeded ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.number, + onChange: (value){ + model.quantityNeeded = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Quantity Reserved"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.quantityReserved ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.number, + onChange: (value){ + model.quantityReserved = value; + }, + ), + const SizedBox(height: 8,), + Divider(color: Theme.of(context).textTheme.titleMedium.color,), + ], + ); + } + ); + } +} diff --git a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart new file mode 100644 index 00000000..201c7498 --- /dev/null +++ b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/pantry/ppm_check_list.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/app_text_form_field.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; +import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +class PentryPPMCheckListForm extends StatefulWidget { + final List models; + final bool enableValidate; + const PentryPPMCheckListForm({ + Key key, this.models, this.enableValidate, + }) : super(key: key); + + @override + State createState() => _PentryPPMCheckListFormState(); +} + +class _PentryPPMCheckListFormState extends State { + + + @override + Widget build(BuildContext context) { + final subtitle = AppLocalization.of(context).subtitle; + return ListView.builder( + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), + left: 12 * AppStyle.getScaleFactor(context), + right: 12 * AppStyle.getScaleFactor(context), + bottom: 80 * AppStyle.getScaleFactor(context) + ), + itemCount: widget.models.length + 1, + itemBuilder: (context,index){ + if(index == widget.models.length){ + return AButton( + text: subtitle.add, + onPressed: (){ + widget.models.add(PPMCheckList()); + setState(() {}); + }, + ); + } + final model = widget.models[index]; + return ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle("#${index+1}"), + if(index != 0) + ASmallButton( + color: Theme.of(context).colorScheme.error, + text: subtitle.delete, + onPressed: (){ + widget.models.remove(model); + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8,), + const ASubTitle("Task"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.title ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.title = value; + }, + ), + const SizedBox(height: 8,), + ASubTitle(subtitle.status), + const SizedBox(height: 4,), + PentryTaskStatusMenu( + initialValue: model.status, + onSelect: (status){ + model.status = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Comment"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.comment ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.comment = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Measured Value"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.measuredValue ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.measuredValue = value; + }, + ), + const SizedBox(height: 8,), + Divider(color: Theme.of(context).textTheme.titleMedium.color,), + ], + ); + } + ); + } +} diff --git a/lib/views/widgets/requests/info_row.dart b/lib/views/widgets/requests/info_row.dart index e7f8ed43..d8fe0bc6 100644 --- a/lib/views/widgets/requests/info_row.dart +++ b/lib/views/widgets/requests/info_row.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class RequestInfoRow extends StatelessWidget { final String title; final String info; diff --git a/lib/views/widgets/requests/request_status.dart b/lib/views/widgets/requests/request_status.dart index 84142349..c953efc8 100644 --- a/lib/views/widgets/requests/request_status.dart +++ b/lib/views/widgets/requests/request_status.dart @@ -1,8 +1,6 @@ -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class StatusLabel extends StatelessWidget { final String label; final Color color; diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart index 6cffb284..448cb53e 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -251,57 +251,6 @@ class ServiceRequestItem extends StatelessWidget { color: onItemColor ), ), - - ], - ), - ], - ), - if(request.viewReport) - Column( - children: [ - const SizedBox(height: 8,), - Row( - children: [ - Expanded( - child: Text( - "Work Duration", - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - fontWeight: FontWeight.bold - ), - ), - ), - // AppTimer( - // timer: request.timer, - // onChange: (timeModel) async { - // - // request.timer = timeModel; - // if(timeModel.endAt == null) return true; - // int status = await servicesProvider.updateServiceReportTimer( - // host: settingProvider.host, - // user: _user, - // timer: timeModel, - // request: request - // ); - // if(status >= 200 && status < 300){ - // return true; - // }else{ - // String errorMessage = HttpStatusManger.getStatusMessage( - // status: status, subtitle: _subtitle); - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar( - // content: Text( - // errorMessage - // ), - // ) - // ); - // return false; - // } - // - // - // }, - // ), ], ), ], diff --git a/lib/views/widgets/requests/service_request_list.dart b/lib/views/widgets/requests/service_request_list.dart index 7672a5d6..7cd71079 100644 --- a/lib/views/widgets/requests/service_request_list.dart +++ b/lib/views/widgets/requests/service_request_list.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -5,7 +6,6 @@ import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/requests/service_request_item.dart'; -import 'package:flutter/material.dart'; class ServiceRequestsList extends StatelessWidget { final List requests; final bool nextPage; diff --git a/lib/views/widgets/requests/service_request_update_dialog.dart b/lib/views/widgets/requests/service_request_update_dialog.dart index ccea8858..bde17432 100644 --- a/lib/views/widgets/requests/service_request_update_dialog.dart +++ b/lib/views/widgets/requests/service_request_update_dialog.dart @@ -8,13 +8,13 @@ import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/hospitals/auto_complete_field.dart'; +import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/views/widgets/status/employee/employee_mune.dart'; @@ -33,7 +33,7 @@ class _ServiceRequestsUpdateDialogState extends State with TickerProviderStateMixin{ ServiceRequestSearch _search; - List status = [ - Status(label: "New", id: 4,), + List status = [ + Lookup(label: "New", id: 4,), - Status(label: "Repaired", id: 6,), - Status(label: "Repeated", id: 8), - Status(label: "Closed", id: 9,), - Status(label: "Under Repair", id: 5,), + Lookup(label: "Repaired", id: 6,), + Lookup(label: "Repeated", id: 8), + Lookup(label: "Closed", id: 9,), + Lookup(label: "Under Repair", id: 5,), ]; final GlobalKey _formKey = GlobalKey(); @@ -94,7 +94,7 @@ class _ServiceRequestsSearchDialogState extends State with TickerProviderStateMixin{ VisitsSearch _search; - List status = [ - Status(label: "Done", id: 0,), - Status(label: "Not Yet", id: 1), - Status(label: "On Hold", id: 2,), + List status = [ + Lookup(label: "Done", id: 0,), + Lookup(label: "Not Yet", id: 1), + Lookup(label: "On Hold", id: 2,), ]; - List contactStatus = [ - Status(label: "Hospital Employee", key: "H",), - Status(label: "Under Warranty", key: "CW"), - Status(label: "Under Maintenance Contract", key: "CC",), + List contactStatus = [ + Lookup(label: "Hospital Employee", key: "H",), + Lookup(label: "Under Warranty", key: "CW"), + Lookup(label: "Under Maintenance Contract", key: "CC",), ]; @@ -100,7 +100,7 @@ class _VisitsSearchDialogState extends State }, ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - AutoCompleteField( + HospitalAutoCompleteField( initialValue: _search.hospitalName, onSave: (value){ _search.hospitalName = value; diff --git a/lib/views/widgets/sound/record_sound.dart b/lib/views/widgets/sound/record_sound.dart index d53dbdb3..5ca797e4 100644 --- a/lib/views/widgets/sound/record_sound.dart +++ b/lib/views/widgets/sound/record_sound.dart @@ -83,7 +83,6 @@ class _RecordSoundState extends State { _recording = true; setState(() {}); - print("onTapDown"); } _stopRecording() async { @@ -93,12 +92,10 @@ class _RecordSoundState extends State { return; } String path = (await _myRecorder.stopRecorder()).toString(); - print("audio path ----> $path <-----"); _record = path; widget.onRecord(path); _recording = false; setState(() {}); - print("onTapUp"); } _cancelRecording() async { @@ -111,7 +108,6 @@ class _RecordSoundState extends State { _recording = false; await Future.delayed(const Duration(seconds: 1)); if (!_recording) setState(() {}); - print("onTapCancel"); // _message.memoryAudio.; } diff --git a/lib/views/widgets/sound/sound_player.dart b/lib/views/widgets/sound/sound_player.dart index 20dd0051..1422f24e 100644 --- a/lib/views/widgets/sound/sound_player.dart +++ b/lib/views/widgets/sound/sound_player.dart @@ -81,7 +81,6 @@ class _ASoundPlayerState extends State { icon: const Icon( Icons.replay_rounded), onPressed: () async { _failedToLoad = false; - print(!Uri.parse(_audio).isAbsolute); try { _audioPlayer.seek(const Duration(milliseconds: 0)); _audioPlayer.stop(); @@ -131,7 +130,6 @@ class _ASoundPlayerState extends State { } // set up listeners _audioPlayer.onPositionChanged.listen((Duration duration) { - //print('Current position: $p'); if(!_sliderMoving){ _audioPosition = duration; rebuild(); diff --git a/lib/views/widgets/status/employee/employee_mune.dart b/lib/views/widgets/status/employee/employee_mune.dart index 5555233a..5ea741d4 100644 --- a/lib/views/widgets/status/employee/employee_mune.dart +++ b/lib/views/widgets/status/employee/employee_mune.dart @@ -1,14 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class EmployeeMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const EmployeeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart b/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart index 842e5d0e..358226b0 100644 --- a/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart +++ b/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart @@ -1,16 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class GasCylinderSizeMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const GasCylinderSizeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/gas_refill/gas_status.dart b/lib/views/widgets/status/gas_refill/gas_status.dart index 524d8acf..1dce0c71 100644 --- a/lib/views/widgets/status/gas_refill/gas_status.dart +++ b/lib/views/widgets/status/gas_refill/gas_status.dart @@ -1,16 +1,14 @@ -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class GasStatusMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const GasStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/gas_refill/gas_type.dart b/lib/views/widgets/status/gas_refill/gas_type.dart index 9d9b47f5..8d3b9e61 100644 --- a/lib/views/widgets/status/gas_refill/gas_type.dart +++ b/lib/views/widgets/status/gas_refill/gas_type.dart @@ -1,17 +1,14 @@ -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class GasTypeMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const GasTypeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/multi_status_menu.dart b/lib/views/widgets/status/multi_status_menu.dart index b0c8272d..99a52a87 100644 --- a/lib/views/widgets/status/multi_status_menu.dart +++ b/lib/views/widgets/status/multi_status_menu.dart @@ -1,14 +1,13 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; class MultiStatusMenu extends StatefulWidget { - final List statuses; - final List initialSelectedStatus; - final Function(List) onSelect; + final List statuses; + final List initialSelectedStatus; + final Function(List) onSelect; const MultiStatusMenu({Key key, this.statuses, this.onSelect, this.initialSelectedStatus}) : super(key: key); @override @@ -17,7 +16,7 @@ class MultiStatusMenu extends StatefulWidget { class _MultiStatusMenuState extends State { - List _selectedStatus = []; + List _selectedStatus = []; TextEditingController _controller; @override @@ -93,7 +92,7 @@ class _MultiStatusMenuState extends State { AppStyle.boxShadow ] ), - child: TypeAheadField( + child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( style: Theme.of(context).textTheme.subtitle1, controller: _controller, @@ -107,7 +106,7 @@ class _MultiStatusMenuState extends State { textInputAction: TextInputAction.search, ), suggestionsCallback: (vale) { - return widget.statuses.where((Status option) { + return widget.statuses.where((Lookup option) { return option.label.toLowerCase().contains(_controller.text); }); }, diff --git a/lib/views/widgets/status/pentry/pentry_status_mune.dart b/lib/views/widgets/status/pentry/pentry_status_mune.dart new file mode 100644 index 00000000..b0813f22 --- /dev/null +++ b/lib/views/widgets/status/pentry/pentry_status_mune.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class PentryStatusMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const PentryStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/pentry/pentry_task_status_mune.dart b/lib/views/widgets/status/pentry/pentry_task_status_mune.dart new file mode 100644 index 00000000..8564410d --- /dev/null +++ b/lib/views/widgets/status/pentry/pentry_task_status_mune.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class PentryTaskStatusMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const PentryTaskStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart b/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart new file mode 100644 index 00000000..4df17a49 --- /dev/null +++ b/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class PentryVisitsStatusMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const PentryVisitsStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/report/service_report_last_call.dart b/lib/views/widgets/status/report/service_report_last_call.dart index 7093e7e4..a3f59211 100644 --- a/lib/views/widgets/status/report/service_report_last_call.dart +++ b/lib/views/widgets/status/report/service_report_last_call.dart @@ -1,12 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/models/status.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceReportLastCallsMenu extends StatelessWidget { - final Function(Status) onSelect; + final Function(Lookup) onSelect; final ServiceReport report; const ServiceReportLastCallsMenu({ diff --git a/lib/views/widgets/status/report/service_report_reasons.dart b/lib/views/widgets/status/report/service_report_reasons.dart index 8aa4effd..dbdd48ef 100644 --- a/lib/views/widgets/status/report/service_report_reasons.dart +++ b/lib/views/widgets/status/report/service_report_reasons.dart @@ -1,14 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceReportReasonsMenu extends StatelessWidget { - final Status initialValue; - final Function(Status) onSelect; + final Lookup initialValue; + final Function(Lookup) onSelect; const ServiceReportReasonsMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index 41033e8b..8a4d1c98 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -1,17 +1,17 @@ import 'dart:math'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/models/status.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceReportStatusMenu extends StatefulWidget { - final Function(Status) onSelect; + final Function(Lookup) onSelect; final ServiceReport report; const ServiceReportStatusMenu({Key key, this.onSelect, this.report}) : super(key: key); diff --git a/lib/views/widgets/status/report/service_report_type.dart b/lib/views/widgets/status/report/service_report_type.dart index 26e4eb14..fb315747 100644 --- a/lib/views/widgets/status/report/service_report_type.dart +++ b/lib/views/widgets/status/report/service_report_type.dart @@ -1,36 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceReportTypeMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const ServiceReportTypeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override Widget build(BuildContext context) { - SettingProvider _settingProvider = Provider.of(context); - UserProvider _userProvider = Provider.of(context); - ServiceReportTypesProvider _menuProvider = Provider.of(context); + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceReportTypesProvider menuProvider = Provider.of(context); return LoadingManager( - isLoading: _menuProvider.isLoading, - isFailedLoading: _menuProvider.types == null, - stateCode: _menuProvider.stateCode, + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.types == null, + stateCode: menuProvider.stateCode, onRefresh: () async { - _menuProvider.reset(); - await _menuProvider.getTypes( - user: _userProvider.user, - host: _settingProvider.host + menuProvider.reset(); + await menuProvider.getTypes( + user: userProvider.user, + host: settingProvider.host ); - onSelect(initialValue ?? _menuProvider.types?.last); + onSelect(initialValue ?? menuProvider.types?.last); }, child: SingleStatusMenu( - initialStatus: initialValue ?? _menuProvider.types?.last, - statuses: _menuProvider.types, + initialStatus: initialValue ?? menuProvider.types?.last, + statuses: menuProvider.types, onSelect: onSelect, ) ); diff --git a/lib/views/widgets/status/report/service_status.dart b/lib/views/widgets/status/report/service_status.dart index 6851ab38..37eb554e 100644 --- a/lib/views/widgets/status/report/service_status.dart +++ b/lib/views/widgets/status/report/service_status.dart @@ -1,14 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceStatusMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const ServiceStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart b/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart new file mode 100644 index 00000000..be02c54e --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class ServiceRequestDefectTypesMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestDefectTypesMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/service_request/service_request_priority_mune.dart b/lib/views/widgets/status/service_request/service_request_priority_mune.dart new file mode 100644 index 00000000..fe3bd6db --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_priority_mune.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class ServiceRequestPriorityMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestPriorityMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index 8e35e903..212cd1c8 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; class SingleStatusMenu extends StatefulWidget { - final List statuses; - final Status initialStatus; - final Function(Status) onSelect; + final List statuses; + final Lookup initialStatus; + final Function(Lookup) onSelect; const SingleStatusMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key); @@ -15,7 +15,7 @@ class SingleStatusMenu extends StatefulWidget { } class _SingleStatusMenuState extends State { - Status _selectedStatus; + Lookup _selectedStatus; @override void didUpdateWidget(covariant SingleStatusMenu oldWidget) { @@ -54,7 +54,7 @@ class _SingleStatusMenuState extends State { // AppStyle.boxShadow // ] ), - child: DropdownButton( + child: DropdownButton( value: _selectedStatus, iconSize: 24, icon: Icon(Icons.keyboard_arrow_down_rounded), @@ -66,14 +66,14 @@ class _SingleStatusMenuState extends State { ), style: TextStyle(color: Theme.of(context).primaryColor), underline: SizedBox.shrink(), - onChanged: (Status newValue) { + onChanged: (Lookup newValue) { setState(() { _selectedStatus = newValue; }); widget.onSelect(newValue); }, - items: widget.statuses.map>((Status value) { - return DropdownMenuItem( + items: widget.statuses.map>((Lookup value) { + return DropdownMenuItem( value: value, child: Text( value.label, diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index c2c332b3..95f4fbe7 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -30,24 +30,24 @@ class _AppTimerState extends State { final ValueNotifier _period = ValueNotifier("0:00:00"); _startTimer() async { - final time = DateTime.now(); - bool result = await widget.onChange( - TimerModel(startAt: time,endAt: null,durationInSecond: _delay)); - if(!result) return; - _running = true; + if (!_running) { + final time = DateTime.now(); + bool result = await widget.onChange( + TimerModel(startAt: time,endAt: null,durationInSecond: _delay)); + if(!result) return; + _running = true; - if(_endAt != null){ - _delay += _endAt.difference(_startAt).inSeconds; + if(_endAt != null){ + _delay += _endAt.difference(_startAt).inSeconds; + } + _startAt = time.subtract(Duration(seconds: _delay)); + _endAt = null; } - _startAt = time.subtract(Duration(seconds: _delay)); - _endAt = null; - - _timer = Timer.periodic(const Duration(seconds: 1), (timer) { if(_loading == true) return; _period.value = (_endAt ?? DateTime.now()).difference( - _startAt + _startAt ).toString().split(".").first; }); } @@ -78,32 +78,13 @@ class _AppTimerState extends State { @override void initState() { - // TODO: implement initState - // if(widget.timer?.isNotEmpty == true){ - // _startAt = widget.timer.last.startAt; - // _endAt = widget.timer.last.endAt; - // _running = _startAt != null && _endAt == null; - // print(_startAt); - // print(_endAt); - // print(_running); - // if(widget.timer.length != 1){ - // for (int i = 0;i(context); - Color itemColor = index % 2 == 0 - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary; - Color onItemColor = index % 2 != 0 - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary; + Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; + Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; Subtitle _subtitle = AppLocalization.of(context).subtitle; return Padding( padding: const EdgeInsets.symmetric(vertical: 4), child: ElevatedButton( style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), primary: itemColor, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), ), ), - onPressed: (){ - if(activeSelectMod && _userProvider.user.type == UsersTypes.engineer) + onPressed: () { + if (activeSelectMod && _userProvider.user.type == UsersTypes.engineer) onSelect(visit); else onPressed(visit); }, - onLongPress: _userProvider.user.type == UsersTypes.engineer ? (){ - onLongPress(visit); - } : null, - - child:Column( + onLongPress: _userProvider.user.type == UsersTypes.engineer + ? () { + onLongPress(visit); + } + : null, + child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( - "S.N: "+visit.deviceSerialNumber ?? "No serial number", - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 16, - fontWeight: FontWeight.bold - ), + "S.N: " + visit.deviceSerialNumber ?? "No serial number", + style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), ), ), AnimatedSwitcher( @@ -83,63 +66,65 @@ class VisitItem extends StatelessWidget { child: SizedBox( height: 18, child: Checkbox( - activeColor: Colors.black38, - + activeColor: Colors.black38, value: isSelected, - onChanged: (value){ + onChanged: (value) { onSelect(visit); - } - ), + }), ), ), ), - VisitStatusLabel(visit: visit,) + VisitStatusLabel( + visit: visit, + ) ], ), - Divider(color: onItemColor,), + Divider( + color: onItemColor, + ), Row( children: [ Expanded( child: Text( visit.hospitalName ?? "No client found", style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor, - fontSize: 14, - ), + color: onItemColor, + fontSize: 14, + ), ), ), - Text( - visit.modelAndBrand ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( + ], + ), + Text( + visit.modelAndBrand ?? "", + style: Theme.of(context).textTheme.subtitle1.copyWith( color: onItemColor, fontSize: 14, ), - ), - ], ), - Divider(color: onItemColor,), + Divider( + color: onItemColor, + ), Row( children: [ Expanded( child: Text( visit.employName ?? "No employ found", - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 14, fontWeight: FontWeight.bold), ), ), Text( visit.contactStatus ?? "", style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor, - fontSize: 14, - ), + color: onItemColor, + fontSize: 14, + ), ), ], ), - Divider(color: onItemColor,), + Divider( + color: onItemColor, + ), Row( children: [ Expanded( @@ -149,18 +134,16 @@ class VisitItem extends StatelessWidget { Text( _subtitle.expectDate, style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - - ), + color: onItemColor, + fontSize: 14, + ), ), Text( visit.expectDate ?? _subtitle.noDateFound, style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - - ), + color: onItemColor, + fontSize: 14, + ), ), ], ), @@ -171,16 +154,16 @@ class VisitItem extends StatelessWidget { Text( _subtitle.actualDate, style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - ), + color: onItemColor, + fontSize: 14, + ), ), Text( visit.actualDate ?? _subtitle.noDateFound, style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - ), + color: onItemColor, + fontSize: 14, + ), ), ], ), diff --git a/lib/views/widgets/visits/visit_status.dart b/lib/views/widgets/visits/visit_status.dart index 7309dcd6..871287fe 100644 --- a/lib/views/widgets/visits/visit_status.dart +++ b/lib/views/widgets/visits/visit_status.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class VisitStatusLabel extends StatelessWidget { final Visit visit; diff --git a/pubspec.lock b/pubspec.lock index 6dc640b6..8608b33d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: _flutterfire_internals url: "https://pub.dartlang.org" source: hosted - version: "1.0.11" + version: "1.0.12" archive: dependency: transitive description: @@ -35,49 +35,49 @@ packages: name: audioplayers url: "https://pub.dartlang.org" source: hosted - version: "1.1.1" + version: "1.2.0" audioplayers_android: dependency: transitive description: name: audioplayers_android url: "https://pub.dartlang.org" source: hosted - version: "1.1.1" + version: "1.1.3" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.0.4" audioplayers_linux: dependency: transitive description: name: audioplayers_linux url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0" audioplayers_web: dependency: transitive description: name: audioplayers_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" boolean_selector: dependency: transitive description: @@ -126,7 +126,7 @@ packages: name: checked_yaml url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.2" cli_util: dependency: transitive description: @@ -141,20 +141,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.1" - cloud_firestore_platform_interface: - dependency: transitive - description: - name: cloud_firestore_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "5.10.0" - cloud_firestore_web: - dependency: transitive - description: - name: cloud_firestore_web - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" collection: dependency: transitive description: @@ -224,7 +210,7 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.4.1" firebase_core_platform_interface: dependency: transitive description: @@ -238,28 +224,28 @@ packages: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging url: "https://pub.dartlang.org" source: hosted - version: "14.2.0" + version: "14.2.1" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.9" + version: "4.2.10" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web url: "https://pub.dartlang.org" source: hosted - version: "3.2.10" + version: "3.2.11" flare_flutter: dependency: "direct main" description: @@ -461,7 +447,7 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "3.2.2" + version: "3.3.0" image_picker: dependency: "direct main" description: @@ -489,7 +475,7 @@ packages: name: image_picker_ios url: "https://pub.dartlang.org" source: hosted - version: "0.8.6+4" + version: "0.8.6+5" image_picker_platform_interface: dependency: transitive description: @@ -804,7 +790,7 @@ packages: name: shared_preferences_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.5" shared_preferences_platform_interface: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e51e2229..99885208 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.6.1+1 +version: 1.0.1+2 environment: sdk: ">=2.7.0 <3.0.0"