Merge branch 'refs/heads/design_3.0_medical_gas' into design_3.0_demo_module

# Conflicts:
#	lib/controllers/api_routes/urls.dart
#	lib/modules/loan_module/pages/loan_equipment_detail_page.dart
#	lib/new_views/pages/land_page/create_request_type_bottom_sheet.dart
#	lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart
#	lib/new_views/pages/land_page/my_request/my_requests_page.dart
design_3.0_demo_module
Sikander Saleem 22 hours ago
commit 64fbf46b82

@ -11,15 +11,15 @@
00C3AFCE29769C38002E7B47 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 00C3AFCD29769C37002E7B47 /* GoogleService-Info.plist */; }; 00C3AFCE29769C38002E7B47 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 00C3AFCD29769C37002E7B47 /* GoogleService-Info.plist */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
7116B13B2016C1B081C63974 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B9D24AC2EE56E204217B187 /* Pods_Runner.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
84713E5C1A48D35EB02DB255 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC2334F09AFE7D4C8720A3D2 /* Pods_Runner.framework */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = { E50AEC852F3CD47400480356 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase; isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
dstPath = ""; dstPath = "";
@ -37,12 +37,12 @@
00C3AFCD29769C37002E7B47 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; }; 00C3AFCD29769C37002E7B47 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
2E3CB8321FC9463EA4F59770 /* 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 = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
5B9D24AC2EE56E204217B187 /* 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 = "<group>"; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
834C7D121918F9FF211C5314 /* 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 = "<group>"; }; 7FC568C44F174E173A0E36F5 /* 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 = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -50,8 +50,8 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B01BA1F7378A0B9F7249FF2A /* 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 = "<group>"; }; A231AA589F4F59D80E8AF17E /* 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 = "<group>"; };
DC2334F09AFE7D4C8720A3D2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; ADC3DDCEFAF7F30FE0D8CEDF /* 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 = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -59,7 +59,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
84713E5C1A48D35EB02DB255 /* Pods_Runner.framework in Frameworks */, 7116B13B2016C1B081C63974 /* Pods_Runner.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -69,13 +69,21 @@
577ED37A491ADCF557B4F6D9 /* Pods */ = { 577ED37A491ADCF557B4F6D9 /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
2E3CB8321FC9463EA4F59770 /* Pods-Runner.debug.xcconfig */, ADC3DDCEFAF7F30FE0D8CEDF /* Pods-Runner.debug.xcconfig */,
B01BA1F7378A0B9F7249FF2A /* Pods-Runner.release.xcconfig */, 7FC568C44F174E173A0E36F5 /* Pods-Runner.release.xcconfig */,
834C7D121918F9FF211C5314 /* Pods-Runner.profile.xcconfig */, A231AA589F4F59D80E8AF17E /* Pods-Runner.profile.xcconfig */,
); );
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
93938E05E88B2AC688D7ECF2 /* Frameworks */ = {
isa = PBXGroup;
children = (
5B9D24AC2EE56E204217B187 /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = { 9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -95,7 +103,7 @@
97C146F01CF9000F007C117D /* Runner */, 97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */, 97C146EF1CF9000F007C117D /* Products */,
577ED37A491ADCF557B4F6D9 /* Pods */, 577ED37A491ADCF557B4F6D9 /* Pods */,
ACFB4E3E17DB02D4A9B63D84 /* Frameworks */, 93938E05E88B2AC688D7ECF2 /* Frameworks */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -124,14 +132,6 @@
path = Runner; path = Runner;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
ACFB4E3E17DB02D4A9B63D84 /* Frameworks */ = {
isa = PBXGroup;
children = (
DC2334F09AFE7D4C8720A3D2 /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@ -139,15 +139,15 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = ( buildPhases = (
F8BE49D37BC14FBD6C4F3196 /* [CP] Check Pods Manifest.lock */, 8CD9A20F25CF79461AA21605 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */, 9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */, 97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */, 97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */, 97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
B921EEB42AD074FA76A076B1 /* [CP] Embed Pods Frameworks */, E50AEC852F3CD47400480356 /* Embed Frameworks */,
A65B36E3496C62B7D376B428 /* [CP] Copy Pods Resources */, 5C70B483506D887A89BE3626 /* [CP] Embed Pods Frameworks */,
C902EF1B5AA2B6EF0A294F1F /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@ -225,75 +225,75 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
}; };
9740EEB61CF901F6004384FC /* Run Script */ = { 5C70B483506D887A89BE3626 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "Run Script"; name = "[CP] Embed Pods Frameworks";
outputPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
}; };
A65B36E3496C62B7D376B428 /* [CP] Copy Pods Resources */ = { 8CD9A20F25CF79461AA21605 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputFileListPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "[CP] Copy Pods Resources"; inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", );
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; 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; showEnvVarsInLog = 0;
}; };
B921EEB42AD074FA76A076B1 /* [CP] Embed Pods Frameworks */ = { 9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputFileListPaths = ( inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "[CP] Embed Pods Frameworks"; name = "Run Script";
outputFileListPaths = ( outputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
showEnvVarsInLog = 0;
}; };
F8BE49D37BC14FBD6C4F3196 /* [CP] Check Pods Manifest.lock */ = { C902EF1B5AA2B6EF0A294F1F /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputFileListPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
); );
inputPaths = ( name = "[CP] Copy Pods Resources";
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = ( outputFileListPaths = (
); "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; 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"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */

@ -1,18 +1,19 @@
class URLs { class URLs {
URLs._(); URLs._();
static const String appReleaseBuildNumber = "32"; static const String appReleaseBuildNumber = "33";
// static const host1 = "https://atomsm.hmg.com"; // production url // static const host1 = "https://atomsm.hmg.com"; // production url
// static const host1 = "https://atomsmdev.hmg.com"; // local DEV url // static const host1 = "https://atomsmdev.hmg.com"; // local DEV url
static const host1 = "https://atomsmuat.hmg.com"; // local UAT url static const host1 = "https://atomsmuat.hmg.com"; // local UAT url
// static final String _baseUrl = "$_host/mobile"; // host local UAT // static String _baseUrl = "$_host/mobile";
static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
// static final String _baseUrl = "$_host/v3/mobile"; // for asset delivery module
// static final String _baseUrl = "$_host/mobile"; // host local UAT and for internal audit dev // static final String _baseUrl = "$_host/mobile"; // host local UAT and for internal audit dev
// static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM // static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM
// static final String _baseUrl = "$_host/v4/mobile"; // v4 for Demo module
// static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation // static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation
// static final String _baseUrl = "$_host/v6/mobile"; // for asset delivery module
static const String chatHubUrl = "https://apiderichat.hmg.com/chathub"; static const String chatHubUrl = "https://apiderichat.hmg.com/chathub";
@ -401,6 +402,7 @@ class URLs {
static get getMedDepartmentBasedOnSite => "$_baseUrl/TRAFDataSource/GetDepartmentBasedOnSite"; static get getMedDepartmentBasedOnSite => "$_baseUrl/TRAFDataSource/GetDepartmentBasedOnSite";
static get getLoanById => '$_baseUrl/Loan/GetLoanById'; static get getLoanById => '$_baseUrl/Loan/GetLoanById';
static get getLoanByWorkOrderId => '$_baseUrl/Loan/GetLoanByWorkOrderId';
static get addLoan => '$_baseUrl/Loan/AddLoan'; static get addLoan => '$_baseUrl/Loan/AddLoan';
@ -420,6 +422,8 @@ class URLs {
static get getAssetDeliveryInspectionData => '$_baseUrl/AssetDeliveryExternalDeliveryInspection/GetAssetDeliveryExternalDeliveryInspectionByDeliveryId'; static get getAssetDeliveryInspectionData => '$_baseUrl/AssetDeliveryExternalDeliveryInspection/GetAssetDeliveryExternalDeliveryInspectionByDeliveryId';
static get getOracleUserList => '$_baseUrl/AssetDeliveryExternal/GetEmployeesFromOracle'; static get getOracleUserList => '$_baseUrl/AssetDeliveryExternal/GetEmployeesFromOracle';
static get saveMasterInfoDeliveryInspection => '$_baseUrl/AssetDeliveryExternalDeliveryInspection/SaveMaseterInfoDeliveryInspection';
static get sendEmailToAddSignature => '$_baseUrl/Signature/SendEmailToAddSignature';
static get getLineFromExternalPo => '$_baseUrl/AssetDeliveryExternalDeliveryInspection/GetLineFromExternalPo'; static get getLineFromExternalPo => '$_baseUrl/AssetDeliveryExternalDeliveryInspection/GetLineFromExternalPo';

@ -16,6 +16,7 @@ import 'package:test_sa/modules/pm_module/recurrent_wo/recurrent_work_order_view
import 'package:test_sa/modules/tm_module/device_transfer/device_transfer_details.dart'; import 'package:test_sa/modules/tm_module/device_transfer/device_transfer_details.dart';
import 'package:test_sa/modules/tm_module/tasks/task_request_detail_view.dart'; import 'package:test_sa/modules/tm_module/tasks/task_request_detail_view.dart';
import 'package:test_sa/modules/tm_module/gas_refill/gas_refill_details.dart'; import 'package:test_sa/modules/tm_module/gas_refill/gas_refill_details.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
@pragma('vm:entry-point') @pragma('vm:entry-point')
@ -121,7 +122,7 @@ class FirebaseNotificationManger {
break; break;
default: default:
serviceClass = const Scaffold(body: Center(child: NoDataFound())); serviceClass = const Scaffold(appBar: DefaultAppBar(), body: Center(child: NoDataFound()));
} }
Navigator.of(context).push(MaterialPageRoute(builder: (_) => serviceClass!)); Navigator.of(context).push(MaterialPageRoute(builder: (_) => serviceClass!));
@ -134,7 +135,7 @@ class FirebaseNotificationManger {
// SparePartTransaction= 8, // SparePartTransaction= 8,
// GasRefill=9, // GasRefill=9,
// TechnicalRetirmentWO = 11, // TechnicalRetirmentWO = 11,
// Recurrent = 12, // Recurrent = 12,
switch (transactionType) { switch (transactionType) {
case "1": case "1":
serviceClass = PpmDetailsPage(requestId: int.parse(messageData["requestNumber"].toString())); serviceClass = PpmDetailsPage(requestId: int.parse(messageData["requestNumber"].toString()));
@ -172,7 +173,7 @@ class FirebaseNotificationManger {
// requestDetails: RequestsDetails(nameOfType: messageData["sourceName"], status: messageData["statusName"], priority: messageData["priorityName"], date: messageData["createdDate"])); // requestDetails: RequestsDetails(nameOfType: messageData["sourceName"], status: messageData["statusName"], priority: messageData["priorityName"], date: messageData["createdDate"]));
// return; // return;
default: default:
serviceClass = const Scaffold(body: Center(child: NoDataFound())); serviceClass = const Scaffold(appBar: DefaultAppBar(), body: Center(child: NoDataFound()));
} }
// if (messageData["requestType"] == "Service request to engineer") { // if (messageData["requestType"] == "Service request to engineer") {

@ -163,11 +163,11 @@ class AllRequestsProvider extends ChangeNotifier {
} }
}); });
if (context.userProvider.isNurse) { if (context.settingProvider.isUserFlowMedical && context.userProvider.isNurse) {
list.add(9); // list.add(9); //
} }
list.add(12); list.add(12);
if (context.userProvider.isCommissioningEngineer) { if (context.userProvider.isCommissioningEngineer && context.settingProvider.isUserFlowMedical) {
list = [13]; list = [13];
} }
// loan module // loan module

@ -40,7 +40,7 @@ class AssetProvider extends ChangeNotifier {
List<Asset> _devices = []; List<Asset> _devices = [];
List<Asset> _searchDevices = []; List<Asset> _searchDevices = [];
List<TechnicalInspectionAssetBasicInfoModel> technicalInspectionAsset= []; List<TechnicalInspectionAssetBasicInfoModel> technicalInspectionAsset = [];
List<Asset> get devices => _devices; List<Asset> get devices => _devices;
@ -133,8 +133,6 @@ class AssetProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
List equipmentListJson = json.decode(response.body)["data"]; List equipmentListJson = json.decode(response.body)["data"];
var dList = equipmentListJson.map<TechnicalInspectionAssetBasicInfoModel>((asset) => TechnicalInspectionAssetBasicInfoModel.fromJson(asset)).toList() ?? []; var dList = equipmentListJson.map<TechnicalInspectionAssetBasicInfoModel>((asset) => TechnicalInspectionAssetBasicInfoModel.fromJson(asset)).toList() ?? [];
log('dlist ${dList.length}');
technicalInspectionAsset.addAll(dList); technicalInspectionAsset.addAll(dList);
nextPage = true; nextPage = true;
} else { } else {

@ -58,7 +58,7 @@ class AppBarWidget extends StatelessWidget {
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, fontSize: context.isTablet() ? 12 : null), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, fontSize: context.isTablet() ? 12 : null),
), ),
], ],
), ).expanded,
const Spacer(), const Spacer(),
Consumer<SettingProvider>(builder: (context, settingProvider, child) { Consumer<SettingProvider>(builder: (context, settingProvider, child) {
return Container( return Container(

@ -73,7 +73,7 @@ class RequestCategoryFragment extends StatelessWidget {
Widget getTabs({required BuildContext context, required DashBoardProvider requestsProvider, required UsersTypes? userType}) { Widget getTabs({required BuildContext context, required DashBoardProvider requestsProvider, required UsersTypes? userType}) {
List<CategoryTabs> tabs = CategoryTabs.getTabs(userType: userType ?? UsersTypes.normal_user, context: context); List<CategoryTabs> tabs = CategoryTabs.getTabs(userType: userType ?? UsersTypes.normal_user, context: context);
return SizedBox( return SizedBox(
height: 44 + (context.isTablet() ? 36 : 16), height: 44 + (context.isTablet() ? 36 : 16).toScreenHeight,
child: ListView.separated( child: ListView.separated(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
separatorBuilder: (cxt, index) => 12.width, separatorBuilder: (cxt, index) => 12.width,

@ -33,11 +33,11 @@ class Utils {
static bool get isLoading => _isLoadingVisible; static bool get isLoading => _isLoadingVisible;
static void showToast(String message, {bool longDuration = true}) { static void showToast(String message, {bool longDuration = true, ToastGravity toastGravity = ToastGravity.BOTTOM}) {
Fluttertoast.showToast( Fluttertoast.showToast(
msg: message, msg: message,
toastLength: longDuration ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT, toastLength: longDuration ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM, gravity: toastGravity,
timeInSecForIosWeb: 1, timeInSecForIosWeb: 1,
backgroundColor: Colors.black54, backgroundColor: Colors.black54,
textColor: Colors.white, textColor: Colors.white,

@ -1,3 +1,5 @@
import 'dart:typed_data';
import 'package:test_sa/models/base.dart'; import 'package:test_sa/models/base.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/assistant_employee.dart'; import 'package:test_sa/models/new_models/assistant_employee.dart';
@ -83,6 +85,7 @@ class TaskData {
String? estimationDeliveryDate; String? estimationDeliveryDate;
String? reasonOfFSCA; String? reasonOfFSCA;
String? correctiveActionDescription; String? correctiveActionDescription;
String? signature;
TaskContactUser? evaluatorUser; TaskContactUser? evaluatorUser;
List<TaskJobActivityEngineerTimer>? taskJobActivityEngineerTimers = []; List<TaskJobActivityEngineerTimer>? taskJobActivityEngineerTimers = [];
TimerModel? taskTimerModel = TimerModel(); TimerModel? taskTimerModel = TimerModel();
@ -126,6 +129,7 @@ class TaskData {
this.alertNo, this.alertNo,
this.estimationDeliveryDate, this.estimationDeliveryDate,
this.reasonOfFSCA, this.reasonOfFSCA,
this.signature,
this.correctiveActionDescription, this.correctiveActionDescription,
this.evaluatorUser, this.evaluatorUser,
this.taskTimePicker}); this.taskTimePicker});
@ -193,6 +197,7 @@ class TaskData {
alertNo = json['alertNo']; alertNo = json['alertNo'];
estimationDeliveryDate = json['estimationDeliveryDate']; estimationDeliveryDate = json['estimationDeliveryDate'];
reasonOfFSCA = json['reasonOfFSCA']; reasonOfFSCA = json['reasonOfFSCA'];
signature = json['signature'];
correctiveActionDescription = json['correctiveActionDescription']; correctiveActionDescription = json['correctiveActionDescription'];
evaluatorUser = json['evaluatorUser'] != null ? TaskContactUser.fromJson(json['evaluatorUser']) : null; evaluatorUser = json['evaluatorUser'] != null ? TaskContactUser.fromJson(json['evaluatorUser']) : null;
site = json["site"] == null ? null : Site.fromJson(json["site"]); site = json["site"] == null ? null : Site.fromJson(json["site"]);
@ -239,7 +244,7 @@ class TaskData {
floor = taskData.floor; floor = taskData.floor;
department = taskData.department; department = taskData.department;
room = taskData.room; room = taskData.room;
signature = taskData.signature;
taskTimerModel = taskData.taskTimerModel; taskTimerModel = taskData.taskTimerModel;
totalWorkingHours = taskData.totalWorkingHours; totalWorkingHours = taskData.totalWorkingHours;
timerModelList = taskData.timerModelList; timerModelList = taskData.timerModelList;
@ -350,79 +355,6 @@ class TaskData {
return data; return data;
} }
// Map<String, dynamic> toJson() {
// final Map<String, dynamic> data = <String, dynamic>{};
//
// data['id'] = id;
// data['statusValue'] = statusValue;
// data['taskJobNo'] = taskJobNo;
//
// if (userCreated != null) {
// data['userCreated'] = userCreated!.toJson();
// }
//
// if (taskJobContactPersons != null) {
// data['taskJobContactPersons'] = taskJobContactPersons!.map((e) => e.toJson()).toList();
// }
//
// if (taskType != null) {
// data['taskType'] = taskType!.toJson();
// }
//
// if (taskJobStatus != null) {
// data['taskJobStatus'] = taskJobStatus!.toJson();
// }
//
// data['asset'] = asset?.toJson();
// data['site'] = site;
// data['building'] = building;
// data['floor'] = floor;
// data['department'] = department;
// data['room'] = room;
// data['callComment'] = callComment;
//
// if (assignedEngineer != null) {
// data['assignedEngineer'] = assignedEngineer!.toJson();
// }
//
// if (taskJobAssistantEmployees != null) {
// data['taskJobAssistantEmployees'] = taskJobAssistantEmployees!.map((v) => v.toJson()).toList();
// }
// if (taskJobHistories != null) {
// data['taskJobHistories'] = taskJobHistories!.map((e) => e.toJson()).toList();
// }
// if (installationBuilding != null) {
// data['installationBuilding'] = installationBuilding!.toJson();
// }
// data['installationFloor'] = installationFloor;
// data['installationDepartment'] = installationDepartment;
// data['serialNo'] = serialNo;
// data['installationDate'] = installationDate;
// data['completedAction'] = completedAction;
// data['impactStatus'] = impactStatus;
// data['isUserAcknowledge'] = isUserAcknowledge;
// data['typeOfAlert'] = typeOfAlert;
// data['riskLevel'] = riskLevel;
// data['resource'] = resource;
// data['actionNeeded'] = actionNeeded;
// data['alertNo'] = alertNo;
// data['estimationDeliveryDate'] = estimationDeliveryDate;
// data['reasonOfFSCA'] = reasonOfFSCA;
// data['correctiveActionDescription'] = correctiveActionDescription;
//
// if (evaluatorUser != null) {
// data['evaluatorUser'] = evaluatorUser!.toJson();
// }
// if (taskJobActivityEngineerTimers != null) {
// data['taskJobActivityEngineerTimers'] = taskJobActivityEngineerTimers!.map((e) => e.toJson()).toList();
// }
// if (taskJobAttachments != null) {
// data['taskJobAttachments'] = taskJobAttachments?.map((e) => e.toJson()).toList();
// }
//
// return data;
// }
Map<String, dynamic> toEngineerUpdateJson() { Map<String, dynamic> toEngineerUpdateJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id; data['id'] = id;
@ -449,6 +381,9 @@ class TaskData {
} }
data['impactStatusId'] = impactStatus?.id; data['impactStatusId'] = impactStatus?.id;
data['isUserAcknowledge'] = isUserAcknowledge; data['isUserAcknowledge'] = isUserAcknowledge;
if (signature != null) {
data['signature'] = signature;
}
return data; return data;
} }
} }

@ -1,5 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/modules/asset_delivery_module/pages/attachment_view.dart'; import 'package:test_sa/modules/asset_delivery_module/pages/attachment_view.dart';
@ -7,6 +10,7 @@ import 'package:test_sa/modules/asset_delivery_module/provider/asset_delivery_pr
import 'package:test_sa/modules/asset_delivery_module/provider/attachment_type_provider.dart'; import 'package:test_sa/modules/asset_delivery_module/provider/attachment_type_provider.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/new_views/swipe_module/dialoge/acknowledge_work_dialog.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
class HelperFunction { class HelperFunction {
@ -37,6 +41,29 @@ class HelperFunction {
} }
} }
static void cancelRequest({required BuildContext context, int ?itemId, int? requestId}) async {
AssetDeliveryProvider assetDeliveryProvider = Provider.of<AssetDeliveryProvider>(context, listen: false);
showDialog(
context: context,
builder: (BuildContext cxt) => AcknowledgeWorkDialog(
message: "Are you sure you want to change this request status to cancel?",
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel',
onSave: () async {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await assetDeliveryProvider.changeDeliveryStatusToCancel(itemId: itemId).then((status) async {
Navigator.pop(context);
if (status) {
Navigator.pop(context);
await assetDeliveryProvider.getAssetDeliveryTableListById(requestId: requestId);
}
});
},
onDiscard: () {},
),
);
}
static Future<Lookup?> showAttachmentTypeBottomSheet(BuildContext context) { static Future<Lookup?> showAttachmentTypeBottomSheet(BuildContext context) {
return showModalBottomSheet<Lookup?>( return showModalBottomSheet<Lookup?>(
context: context, context: context,
@ -58,7 +85,7 @@ class HelperFunction {
children: [ children: [
SingleItemDropDownMenu<Lookup, AttachmentTypeLookupProvider>( SingleItemDropDownMenu<Lookup, AttachmentTypeLookupProvider>(
context: context, context: context,
title: context.translation.reason, title: 'Attachment Type'.addTranslation,
onSelect: (value) { onSelect: (value) {
Navigator.pop(context, value); Navigator.pop(context, value);
}, },

@ -44,13 +44,13 @@ class DeliveryInspectionFormModel {
'deliveryInspectionInspectedDateTo': deliveryInspectionInspectedDateTo?.toIso8601String(), 'deliveryInspectionInspectedDateTo': deliveryInspectionInspectedDateTo?.toIso8601String(),
'totalTime': totalTime, 'totalTime': totalTime,
'deliveryInspectionInspectedBy': inspectedByModel?.name, 'deliveryInspectionInspectedBy': inspectedByModel?.name,
"deliveryInspectionInspectedBySignature": inspectedByModel?.signature, // "deliveryInspectionInspectedBySignature": inspectedByModel?.signature,
"deliveryInspectionInspectedByEmail": inspectedByModel?.email, "deliveryInspectionInspectedByEmail": inspectedByModel?.email,
'deliveryInspectionApprovedBy': approvedByModel?.name, 'deliveryInspectionApprovedBy': approvedByModel?.name,
"deliveryInspectionApprovedBySignature": approvedByModel?.signature, // "deliveryInspectionApprovedBySignature": approvedByModel?.signature,
"deliveryInspectionApprovedByEmail": approvedByModel?.email, "deliveryInspectionApprovedByEmail": approvedByModel?.email,
"deliveryInspectionThirdApproverBy": thirdApprovalModel?.name, "deliveryInspectionThirdApproverBy": thirdApprovalModel?.name,
"deliveryInspectionThirdApproverBySignature": thirdApprovalModel?.signature, // "deliveryInspectionThirdApproverBySignature": thirdApprovalModel?.signature,
"deliveryInspectionThirdApproverByEmail": thirdApprovalModel?.email, "deliveryInspectionThirdApproverByEmail": thirdApprovalModel?.email,
}; };
} }

@ -14,6 +14,7 @@ class TechnicalInspectionAssetModel {
num? id; num? id;
num? tableItemId; num? tableItemId;
num? lineId; num? lineId;
num? lineNo;
num? assetDeliveryInternalDetailAssetId; num? assetDeliveryInternalDetailAssetId;
num? assetDeliveryInternalDetailAssetChildId; num? assetDeliveryInternalDetailAssetChildId;
num? costCenterId; num? costCenterId;
@ -47,6 +48,7 @@ class TechnicalInspectionAssetModel {
this.tableItemId, this.tableItemId,
this.status, this.status,
this.lineId, this.lineId,
this.lineNo,
this.costCenterId, this.costCenterId,
this.assetNumber, this.assetNumber,
this.assetOrigin, this.assetOrigin,
@ -73,6 +75,7 @@ class TechnicalInspectionAssetModel {
TechnicalInspectionAssetModel.fromJson(Map<String, dynamic> json) { TechnicalInspectionAssetModel.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
lineNo = json['lineNo'];
assetDeliveryInternalDetailAssetId = json['assetDeliveryInternalDetailAssetId']; assetDeliveryInternalDetailAssetId = json['assetDeliveryInternalDetailAssetId'];
assetDeliveryInternalDetailAssetChildId = json['assetDeliveryInternalDetailAssetChildId']; assetDeliveryInternalDetailAssetChildId = json['assetDeliveryInternalDetailAssetChildId'];
assetNumber = json['assetNumber']; assetNumber = json['assetNumber'];
@ -106,6 +109,7 @@ class TechnicalInspectionAssetModel {
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = {}; final Map<String, dynamic> data = {};
data['id'] = id; data['id'] = id;
// data['lineNo'] = lineNo;
data['assetDeliveryInternalDetailAssetId'] = assetDeliveryInternalDetailAssetId; data['assetDeliveryInternalDetailAssetId'] = assetDeliveryInternalDetailAssetId;
data['assetDeliveryExternalDeliveryId'] = tableItemId; data['assetDeliveryExternalDeliveryId'] = tableItemId;
data['assetDeliveryExternalDetailId'] = lineId; data['assetDeliveryExternalDetailId'] = lineId;

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
@ -5,6 +7,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/modules/asset_delivery_module/helper_function.dart';
import 'package:test_sa/modules/asset_delivery_module/models/asset_delivery_data_model.dart'; import 'package:test_sa/modules/asset_delivery_module/models/asset_delivery_data_model.dart';
import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_stage_tab_page.dart'; import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_stage_tab_page.dart';
import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_table_card_view.dart'; import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_table_card_view.dart';
@ -87,13 +90,13 @@ class _AssetDeliveryPageState extends State<AssetDeliveryPage> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
requestDetailCard(context), requestDetailCard(context).toShadowContainer(context, borderRadius: 20),
const Divider().defaultStyle(context), 20.height,
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
"Asset Delivery Table", "Asset Delivery Table".addTranslation,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10), style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
), ),
Row( Row(
@ -130,10 +133,10 @@ class _AssetDeliveryPageState extends State<AssetDeliveryPage> {
}), }),
], ],
), ),
8.height, 16.height,
assetDeliveryTableList(context: context, assetDeliveryProvider: provider), assetDeliveryTableList(context: context, assetDeliveryProvider: provider),
], ],
).toShadowContainer(context, borderRadius: 20), ),
); );
}, },
), ),
@ -210,16 +213,8 @@ class _AssetDeliveryPageState extends State<AssetDeliveryPage> {
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
), ),
8.height, 8.height,
//Need to verify this with backend ...
// widget.poInternal?? '-',
Text( Text(
dataModel?.isHMG == true getPOExternal(),
? dataModel?.poNumber != null
? dataModel!.poNumber.toString()
: '-'
: dataModel?.poNumber != null
? dataModel!.poNumber.toString()
: '-',
style: AppTextStyles.bodyText2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral120), style: AppTextStyles.bodyText2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral120),
), ),
8.height, 8.height,
@ -288,6 +283,20 @@ class _AssetDeliveryPageState extends State<AssetDeliveryPage> {
); );
} }
String getPOExternal() {
String poNo = '-';
if (dataModel?.isHMG == true) {
if (dataModel?.poNumber != null) {
poNo = dataModel!.poNumber.toString();
}
return poNo;
}
if (dataModel?.purchaseOrderMaster != null) {
poNo = dataModel!.purchaseOrderMaster!.poNumber.toString();
}
return poNo;
}
Widget assetDeliveryTableList({required BuildContext context, required AssetDeliveryProvider assetDeliveryProvider}) { Widget assetDeliveryTableList({required BuildContext context, required AssetDeliveryProvider assetDeliveryProvider}) {
List<AssetDeliveryTableModel> assetDeliveryTableList = assetDeliveryProvider.assetDeliveryTableList; List<AssetDeliveryTableModel> assetDeliveryTableList = assetDeliveryProvider.assetDeliveryTableList;
return assetDeliveryProvider.isDeliveryTableListLoading return assetDeliveryProvider.isDeliveryTableListLoading
@ -310,14 +319,15 @@ class _AssetDeliveryPageState extends State<AssetDeliveryPage> {
AssetDeliveryBottomSheet.changeStatusBottomSheet( AssetDeliveryBottomSheet.changeStatusBottomSheet(
context: context, context: context,
cancelStatusTap: () async { cancelStatusTap: () async {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); HelperFunction.cancelRequest(context: context, itemId: model.id, requestId: widget.requestId);
await assetDeliveryProvider.changeDeliveryStatusToCancel(itemId: model.id).then((status) async { // showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
Navigator.pop(context); // await assetDeliveryProvider.changeDeliveryStatusToCancel(itemId: model.id).then((status) async {
if (status) { // Navigator.pop(context);
Navigator.pop(context); // if (status) {
await assetDeliveryProvider.getAssetDeliveryTableListById(requestId: widget.requestId); // Navigator.pop(context);
} // await assetDeliveryProvider.getAssetDeliveryTableListById(requestId: widget.requestId);
}); // }
// });
}, },
statusChangeTap: () async { statusChangeTap: () async {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());

@ -27,10 +27,10 @@ class AssetDeliveryAttachmentView extends StatefulWidget {
bool viewOnly = false; bool viewOnly = false;
final List<GenericAttachmentModel> attachmentList; final List<GenericAttachmentModel> attachmentList;
AssetDeliveryAttachmentView({ AssetDeliveryAttachmentView({
super.key, super.key,
required this.attachmentList, required this.attachmentList,
this.viewOnly=false, this.viewOnly = false,
this.attachmentType, this.attachmentType,
this.tableItemId, this.tableItemId,
}); });
@ -106,15 +106,16 @@ class _AssetDeliveryAttachmentViewState extends State<AssetDeliveryAttachmentVie
], ],
), ),
), ),
FooterActionButton.footerContainer( if (widget.attachmentType == 5 && !widget.viewOnly)
context: context, FooterActionButton.footerContainer(
child: AppFilledButton( context: context,
buttonColor: AppColor.primary10, child: AppFilledButton(
label: 'Save'.addTranslation, buttonColor: AppColor.primary10,
maxWidth: true, label: 'Save'.addTranslation,
onPressed: _onSavePressed, maxWidth: true,
onPressed: _onSavePressed,
),
), ),
),
], ],
), ),
); );

@ -9,6 +9,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/modules/asset_delivery_module/helper_function.dart'; import 'package:test_sa/modules/asset_delivery_module/helper_function.dart';
import 'package:test_sa/modules/asset_delivery_module/models/asset_delivery_data_model.dart'; import 'package:test_sa/modules/asset_delivery_module/models/asset_delivery_data_model.dart';
@ -28,6 +29,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/new_views/swipe_module/dialoge/acknowledge_work_dialog.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import '../../../../new_views/common_widgets/app_filled_button.dart'; import '../../../../new_views/common_widgets/app_filled_button.dart';
@ -77,9 +79,11 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
), ),
]); ]);
model = results[0] as DeliveryInspectionFormModel; model = results[0] as DeliveryInspectionFormModel;
setState(() { if (mounted) {
isLoading = false; setState(() {
}); isLoading = false;
});
}
} }
@override @override
@ -91,12 +95,6 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: Theme.of(context).scaffoldBackgroundColor, backgroundColor: Theme.of(context).scaffoldBackgroundColor,
// appBar: DefaultAppBar(
// title: 'Delivery Inspection'.addTranslation,
// onBackPress: () {
// Navigator.pop(context);
// },
// ),
body: isLoading body: isLoading
? const CircularProgressIndicator(color: AppColor.primary10).center ? const CircularProgressIndicator(color: AppColor.primary10).center
: Form( : Form(
@ -104,52 +102,39 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
child: Column( child: Column(
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (!viewOnly) ...[inspectionDetailsForm()] else ...[inspectionDetails()], if (!viewOnly) ...[inspectionDetailsForm()] else ...[inspectionDetails()],
8.height, 20.height,
Text( Text(
'Total Time'.addTranslation, "Lines",
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10), style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
), ),
8.height, 8.height,
Text( linesList(context),
formatInspectionDuration(model.totalTime), ],
style: AppTextStyles.bodyText2.copyWith( )).expanded,
color: context.isDark ? AppColor.neutral30 : AppColor.neutral120,
),
),
// Text(
// model.totalTime != null ? '${model.totalTime.toString()} hours' : '-',
// style: AppTextStyles.bodyText2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral120),
// ),
8.height,
const Divider().defaultStyle(context),
Text(
"Lines",
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
),
8.height,
linesList(context),
],
).toShadowContainer(context, borderRadius: 20, padding: 12))
.expanded,
FooterActionButton.footerContainer( FooterActionButton.footerContainer(
context: context, context: context,
child: !viewOnly child: !viewOnly
? Column( ? Column(
children: [ children: [
AppFilledButton( Row(
buttonColor: AppColor.primary10, children: [
label: 'Attachments'.addTranslation, AppFilledButton(
maxWidth: true, buttonColor: AppColor.primary10,
onPressed: () { label: 'Attachments'.addTranslation,
HelperFunction.attachmentTap(context: context, assetDeliveryProvider: assetDeliveryProvider!, deliveryTableItemId: widget.deliveryTableModel.id); maxWidth: true,
}), onPressed: () {
16.height, HelperFunction.attachmentTap(context: context, assetDeliveryProvider: assetDeliveryProvider!, deliveryTableItemId: widget.deliveryTableModel.id);
}).expanded,
12.width,
AppFilledButton(buttonColor: AppColor.primary10, label: 'Save'.addTranslation, maxWidth: true, onPressed: _saveTap).expanded,
],
),
12.height,
Row( Row(
children: [ children: [
AppFilledButton( AppFilledButton(
@ -247,6 +232,7 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
Widget inspectionDetailsForm() { Widget inspectionDetailsForm() {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
_inspectionTile( _inspectionTile(
title: 'Inspected by'.addTranslation, title: 'Inspected by'.addTranslation,
@ -264,7 +250,6 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
} }
}, },
), ),
8.height, 8.height,
_inspectionTile( _inspectionTile(
title: 'Approved by'.addTranslation, title: 'Approved by'.addTranslation,
@ -285,13 +270,13 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
if (widget.requestModel?.paymentTerm?.value == 2) ...[ if (widget.requestModel?.paymentTerm?.value == 2) ...[
8.height, 8.height,
_inspectionTile( _inspectionTile(
title: 'Third Approved by'.addTranslation, title: 'ThirdApprover'.addTranslation,
model: model.thirdApprovalModel, model: model.thirdApprovalModel,
isHmg: widget.requestModel?.isHMG == true, isHmg: widget.requestModel?.isHMG == true,
onTap: () async { onTap: () async {
final result = await showInspectionBottomSheet( final result = await showInspectionBottomSheet(
context, context,
title: 'Third Approved by'.addTranslation, title: 'ThirdApprover'.addTranslation,
isHmg: widget.requestModel?.isHMG == true, isHmg: widget.requestModel?.isHMG == true,
initialModel: model.thirdApprovalModel ?? InspectionPersonModel(), initialModel: model.thirdApprovalModel ?? InspectionPersonModel(),
); );
@ -301,57 +286,6 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
}, },
), ),
], ],
// if (widget.requestModel?.isHMG == true) ...[
// OracleUserAutoCompleteField(
// clearAfterPick: false,
// initialValue: model.deliveryInspectionInspectedBy ?? '',
// label: 'Inspected by'.addTranslation,
// onPick: (value) {
// model.deliveryInspectionInspectedBy = value.fullName;
// setState(() {});
// },
// onChanged: (value) {},
// ),
// 8.height,
// OracleUserAutoCompleteField(
// clearAfterPick: false,
// initialValue: model.deliveryInspectionApprovedBy ?? '',
// label: 'Approved by'.addTranslation,
// onChanged: (value) {},
// onPick: (value) {
// model.deliveryInspectionApprovedBy = value.fullName;
// setState(() {});
// },
// ),
// ] //No HMG user free text insted of dropdown ...
// else ...[
// AppTextFormField(
// labelText: 'Inspected by'.addTranslation,
// backgroundColor: AppColor.fieldBgColor(context),
// initialValue: model.deliveryInspectionInspectedBy ?? '',
// textAlign: TextAlign.center,
// labelStyle: AppTextStyles.textFieldLabelStyle,
// showShadow: false,
// onChange: (value) {
// model.deliveryInspectionInspectedBy = value;
// },
// style: Theme.of(context).textTheme.titleMedium,
// ),
// 8.height,
// AppTextFormField(
// labelText: 'Approved by'.addTranslation,
// backgroundColor: AppColor.fieldBgColor(context),
// initialValue: model.deliveryInspectionApprovedBy ?? '',
// textAlign: TextAlign.center,
// labelStyle: AppTextStyles.textFieldLabelStyle,
// showShadow: false,
// onChange: (value) {
// model.deliveryInspectionApprovedBy = value;
// },
// style: Theme.of(context).textTheme.titleMedium,
// ),
// ],
8.height, 8.height,
ADatePicker( ADatePicker(
label: 'Inspected Date/Time From'.addTranslation, label: 'Inspected Date/Time From'.addTranslation,
@ -385,7 +319,6 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
setState(() {}); setState(() {});
}, },
), ),
8.height, 8.height,
ADatePicker( ADatePicker(
label: 'Inspected Date/Time To'.addTranslation, label: 'Inspected Date/Time To'.addTranslation,
@ -424,8 +357,20 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
setState(() {}); setState(() {});
}, },
), ),
8.height,
Text(
'Total Time'.addTranslation,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
),
8.height,
Text(
formatInspectionDuration(model.totalTime),
style: AppTextStyles.bodyText2.copyWith(
color: context.isDark ? AppColor.neutral30 : AppColor.neutral120,
),
),
], ],
); ).toShadowContainer(context, borderRadius: 20, padding: 12);
} }
bool _validateInspectionDates({DateTime? from, DateTime? to}) { bool _validateInspectionDates({DateTime? from, DateTime? to}) {
@ -552,8 +497,20 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
model.deliveryInspectionInspectedDateTo != null ? model.deliveryInspectionInspectedDateTo!.toString().toServiceRequestDetailsFormat : '-', model.deliveryInspectionInspectedDateTo != null ? model.deliveryInspectionInspectedDateTo!.toString().toServiceRequestDetailsFormat : '-',
style: AppTextStyles.bodyText2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral120), style: AppTextStyles.bodyText2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral120),
), ),
8.height,
Text(
'Total Time'.addTranslation,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
),
8.height,
Text(
formatInspectionDuration(model.totalTime),
style: AppTextStyles.bodyText2.copyWith(
color: context.isDark ? AppColor.neutral30 : AppColor.neutral120,
),
),
], ],
); ).toShadowContainer(context, borderRadius: 20, padding: 12);
} }
Widget _inspectionTile({ Widget _inspectionTile({
@ -566,7 +523,7 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
onTap: onTap, onTap: onTap,
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
child: Container( child: Container(
padding: const EdgeInsets.all(14), padding: const EdgeInsets.all(12),
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColor.fieldBgColor(context), color: AppColor.fieldBgColor(context),
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
@ -575,6 +532,7 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
children: [ children: [
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [ children: [
Text(title, style: AppTextStyles.textFieldLabelStyle), Text(title, style: AppTextStyles.textFieldLabelStyle),
6.height, 6.height,
@ -603,27 +561,34 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
); );
} }
Future<Lookup?> showAttachmentTypePicker() { void _cancelTap() async {
return showDialog<Lookup>( HelperFunction.cancelRequest(context: context, itemId: widget.deliveryTableModel.id!, requestId: widget.requestModel?.id);
context: context, // showDialog(
builder: (_) { // context: context,
return AlertDialog( // builder: (BuildContext cxt) => AcknowledgeWorkDialog(
content: SingleItemDropDownMenu<Lookup, AttachmentTypeLookupProvider>( // message: "Are you sure you want to mark this request as cancel ",
context: context, // confirmButtonText: 'Ok',
title: context.translation.reason, // cancelButtonText: 'Cancel',
showAsFullScreenDialog: false, // onSave: () async {
onSelect: (value) { // showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
Navigator.pop(context, value); // await assetDeliveryProvider!.changeDeliveryStatusToCancel(itemId: widget.deliveryTableModel.id).then((status) async {
}, // Navigator.pop(context);
), // if (status) {
); // Navigator.pop(context);
}, // await assetDeliveryProvider!.getAssetDeliveryTableListById(requestId: widget.requestModel?.id);
); // }
// });
// },
// onDiscard: () {},
// ),
// );
} }
void _cancelTap() async { void _saveTap() async {
_formKey.currentState!.save();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await assetDeliveryProvider!.changeDeliveryStatusToCancel(itemId: widget.deliveryTableModel.id).then((status) async { model.assetDeliveryExternalDeliveryId = widget.deliveryTableModel.id;
await assetDeliveryProvider!.saveMasterInfoDeliveryInspection(requestPayload: model.toJson()).then((status) async {
Navigator.pop(context); Navigator.pop(context);
if (status) { if (status) {
Navigator.pop(context); Navigator.pop(context);
@ -678,8 +643,8 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
void _changeStatusTap() async { void _changeStatusTap() async {
_formKey.currentState!.save(); _formKey.currentState!.save();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
model.assetDeliveryExternalDeliveryId = widget.deliveryTableModel.id; // await assetDeliveryProvider!.changeDeliveryStatus(requestPayload: model.toJson()).then((status) async {
await assetDeliveryProvider!.changeDeliveryStatus(requestPayload: model.toJson()).then((status) async { await assetDeliveryProvider!.changeDeliveryStatus(itemId: widget.deliveryTableModel.id).then((status) async {
Navigator.pop(context); Navigator.pop(context);
if (status) { if (status) {
Navigator.pop(context); Navigator.pop(context);
@ -707,6 +672,7 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
return InspectionPersonBottomSheet( return InspectionPersonBottomSheet(
title: title, title: title,
isHmg: isHmg, isHmg: isHmg,
tableId: widget.deliveryTableModel.id,
model: InspectionPersonModel( model: InspectionPersonModel(
name: initialModel.name, name: initialModel.name,
email: initialModel.email, email: initialModel.email,

@ -2,14 +2,19 @@ import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/modules/asset_delivery_module/models/inspection_person_model.dart'; import 'package:test_sa/modules/asset_delivery_module/models/inspection_person_model.dart';
import 'package:test_sa/modules/asset_delivery_module/pages/delivery_inspection/oracle_user_autocomplete_field.dart'; import 'package:test_sa/modules/asset_delivery_module/pages/delivery_inspection/oracle_user_autocomplete_field.dart';
import 'package:test_sa/modules/asset_delivery_module/provider/asset_delivery_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
@ -17,12 +22,14 @@ class InspectionPersonBottomSheet extends StatefulWidget {
final String title; final String title;
bool isHmg; bool isHmg;
final InspectionPersonModel model; final InspectionPersonModel model;
int? tableId;
InspectionPersonBottomSheet({ InspectionPersonBottomSheet({
super.key, super.key,
required this.title, required this.title,
required this.isHmg, required this.isHmg,
required this.model, required this.model,
this.tableId,
}); });
@override @override
@ -67,7 +74,7 @@ class _InspectionPersonBottomSheetState extends State<InspectionPersonBottomShee
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text(widget.title, style: Theme.of(context).textTheme.titleLarge), Text(widget.title, style: Theme.of(context).textTheme.titleLarge),
16.height, 12.height,
if (widget.isHmg) if (widget.isHmg)
OracleUserAutoCompleteField( OracleUserAutoCompleteField(
clearAfterPick: false, clearAfterPick: false,
@ -94,46 +101,90 @@ class _InspectionPersonBottomSheetState extends State<InspectionPersonBottomShee
setState(() {}); setState(() {});
}, },
), ),
12.height, 8.height,
AppTextFormField( Row(
labelText: 'Email'.addTranslation, children: [
controller: emailController, AppTextFormField(
textInputType: TextInputType.emailAddress, labelText: 'Email'.addTranslation,
backgroundColor: AppColor.fieldBgColor(context), controller: emailController,
showShadow: false, textInputType: TextInputType.emailAddress,
enable: widget.isHmg?false:true, backgroundColor: AppColor.fieldBgColor(context),
textAlign: TextAlign.center, showShadow: false,
labelStyle: AppTextStyles.textFieldLabelStyle, enable: widget.isHmg ? false : true,
style: Theme.of(context).textTheme.titleMedium, textAlign: TextAlign.center,
onChange: (v) { labelStyle: AppTextStyles.textFieldLabelStyle,
setState(() { style: Theme.of(context).textTheme.titleMedium,
_model.email = v; onChange: (v) {
}); setState(() {
}, _model.email = v;
});
},
).expanded,
if (emailController.text.isNotEmpty) ...[
8.width,
AppFilledButton(
buttonColor: AppColor.primary10,
label: 'SendEmail'.addTranslation,
width: 100.toScreenWidth,
height: 54,
onPressed: () async {
AssetDeliveryProvider assetDeliveryProvider = Provider.of<AssetDeliveryProvider>(context, listen: false);
if (nameController.text.isEmpty) {
return 'Enter Name'.showToast;
}
String type = '';
if (widget.title.contains('Inspected')) {
type = 'Inspected';
} else if (widget.title.contains('Approved')) {
type = 'Approved';
} else if (widget.title.contains('ThirdApprover')) {
type = 'ThirdApprover';
}
Map<String, dynamic> payload = {
"recordId": widget.tableId,
"parameter1": "DeliveryInspection",
"parameter2": type,
"username": nameController.text,
"email": emailController.text
};
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await assetDeliveryProvider.sendEmailToAddSignature(requestPayload: payload).then((status) async {
Navigator.pop(context);
if (status) {
'Email sent successfully'.showToast;
}
});
//send email.
}),
],
],
), ),
12.height, 8.height,
ESignature( ESignature(
title: '', title: '',
editable: false,
oldSignature: _model.localSignature == null ? _model.signature : null, oldSignature: _model.localSignature == null ? _model.signature : null,
newSignature: _model.localSignature, newSignature: _model.localSignature,
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
showShadow: false, showShadow: false,
onChange: (signature) { // onChange: (signature) {
if (signature.isEmpty) return; // if (signature.isEmpty) return;
setState(() { // setState(() {
_model.localSignature = signature; // _model.localSignature = signature;
_model.signature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; // _model.signature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
}); // });
}, // },
onSaved: (signature) { // onSaved: (signature) {
if (signature == null || signature.isEmpty) return; // if (signature == null || signature.isEmpty) return;
setState(() { // setState(() {
_model.localSignature = signature; // _model.localSignature = signature;
_model.signature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; // _model.signature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
}); // });
}, // },
), ),
20.height, 12.height,
AppFilledButton( AppFilledButton(
label: context.translation.save, label: context.translation.save,
maxWidth: true, maxWidth: true,

@ -83,7 +83,7 @@ class _EndUserCostCenterLIstViewState extends State<EndUserCostCenterLIstView> {
: Column( : Column(
children: [ children: [
//Refactor this //Refactor this
SingleChildScrollView(padding: const EdgeInsets.all(16), child: linesList(context).toShadowContainer(context, borderRadius: 20, padding: 12)).expanded, SingleChildScrollView(padding: const EdgeInsets.all(16), child: linesList(context)).expanded,
!viewOnly !viewOnly
? FooterActionButton.footerContainer( ? FooterActionButton.footerContainer(
@ -171,14 +171,15 @@ class _EndUserCostCenterLIstViewState extends State<EndUserCostCenterLIstView> {
} }
void _cancelTap() async { void _cancelTap() async {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); HelperFunction.cancelRequest(context: context, itemId: widget.deliveryTableModel.id!, requestId: widget.requestModel?.id);
await assetDeliveryProvider?.changeDeliveryStatusToCancel(itemId: widget.deliveryTableModel.id).then((status) async { // showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
Navigator.pop(context); // await assetDeliveryProvider?.changeDeliveryStatusToCancel(itemId: widget.deliveryTableModel.id).then((status) async {
if (status) { // Navigator.pop(context);
Navigator.pop(context); // if (status) {
await assetDeliveryProvider?.getAssetDeliveryTableListById(requestId: widget.requestModel?.id); // Navigator.pop(context);
} // await assetDeliveryProvider?.getAssetDeliveryTableListById(requestId: widget.requestModel?.id);
}); // }
// });
} }
void _changeStatusTap() async { void _changeStatusTap() async {

@ -108,9 +108,7 @@ class _UpdateEndUserCostCenterDetailsViewState extends State<UpdateEndUserCostCe
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
inspectionDetailsForm(), inspectionDetailsForm().toShadowContainer(context, borderRadius: 20, padding: 12),
8.height,
const Divider().defaultStyle(context),
///Need to implement later as discuss with Ahmed. ///Need to implement later as discuss with Ahmed.
// Text( // Text(
@ -130,15 +128,15 @@ class _UpdateEndUserCostCenterDetailsViewState extends State<UpdateEndUserCostCe
// 'web_link_icon'.toSvgAsset(height: 20, width: 20), // 'web_link_icon'.toSvgAsset(height: 20, width: 20),
// ], // ],
// ), // ),
16.height, 20.height,
Text( Text(
"Items", "Items",
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10), style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
), ),
8.height, 16.height,
endUserAssetList(context), endUserAssetList(context),
], ],
).toShadowContainer(context, borderRadius: 20, padding: 12)) ))
.expanded, .expanded,
FooterActionButton.footerContainer(context: context, child: AppFilledButton(buttonColor: AppColor.primary10, label: 'Save'.addTranslation, maxWidth: true, onPressed: _saveTap)), FooterActionButton.footerContainer(context: context, child: AppFilledButton(buttonColor: AppColor.primary10, label: 'Save'.addTranslation, maxWidth: true, onPressed: _saveTap)),
], ],

@ -14,17 +14,17 @@ import 'package:test_sa/views/widgets/requests/request_status.dart';
class AssetDeliveryHistoryLogView extends StatefulWidget { class AssetDeliveryHistoryLogView extends StatefulWidget {
final int? tableItemId; final int? tableItemId;
const AssetDeliveryHistoryLogView({Key? key,this.tableItemId}) : super(key: key);
const AssetDeliveryHistoryLogView({Key? key, this.tableItemId}) : super(key: key);
@override @override
State<AssetDeliveryHistoryLogView> createState() => _AssetDeliveryHistoryLogViewState(); State<AssetDeliveryHistoryLogView> createState() => _AssetDeliveryHistoryLogViewState();
} }
class _AssetDeliveryHistoryLogViewState extends State<AssetDeliveryHistoryLogView> { class _AssetDeliveryHistoryLogViewState extends State<AssetDeliveryHistoryLogView> {
List<AssetDeliveryHistoryModel> history = []; List<AssetDeliveryHistoryModel> history = [];
bool loading = false;
@override @override
void initState() { void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
@ -33,10 +33,18 @@ class _AssetDeliveryHistoryLogViewState extends State<AssetDeliveryHistoryLogVie
super.initState(); super.initState();
} }
void getInitialData() async { void getInitialData() async {
setState(() {
loading = true;
});
history = await Provider.of<AssetDeliveryProvider>(context, listen: false).getHistory(tableItemId: widget.tableItemId); history = await Provider.of<AssetDeliveryProvider>(context, listen: false).getHistory(tableItemId: widget.tableItemId);
if (mounted) {
setState(() {
loading = false;
});
}
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -47,65 +55,64 @@ class _AssetDeliveryHistoryLogViewState extends State<AssetDeliveryHistoryLogVie
// Navigator.pop(context); // Navigator.pop(context);
// }, // },
// ), // ),
body: Consumer<AssetDeliveryProvider>(builder: (context, provider, _) { body: loading
return provider.isLoading ? const CircularProgressIndicator(color: AppColor.primary10).center
? const CircularProgressIndicator(color: AppColor.primary10).center : Stack(
: Stack( children: [
children: [ Padding(
Padding( padding: EdgeInsets.only(left: 122.toScreenWidth),
padding: EdgeInsets.only(left: 122.toScreenWidth), child: const VerticalDivider(
child: const VerticalDivider( color: AppColor.white40,
color: AppColor.white40, thickness: 2,
thickness: 2, width: 20,
width: 20, indent: 10,
indent: 10, endIndent: 10,
endIndent: 10, ),
), ),
), SafeArea(
SafeArea( child: Builder(builder: (cxt) {
child: Builder(builder: (cxt) { List<Widget> items = [];
List<Widget> items = []; String lastStatus = "";
String lastStatus = ""; DateTime? nextDate;
DateTime? nextDate; for (int i = 0; i < history.length; i++) {
for (int i = 0; i < history.length; i++) { var object = history[i];
var object = history[i]; String currentStatus = object.status!.name!;
String currentStatus = object.status!.name!; if (lastStatus.isEmpty) {
if (lastStatus.isEmpty) { lastStatus = currentStatus;
lastStatus = currentStatus; }
} if (lastStatus == currentStatus) {
if (lastStatus == currentStatus) { if (i + 1 < history.length) {
if (i + 1 < history.length) { nextDate = history[i + 1].createdDate;
nextDate = history[i + 1].createdDate; String timeDifference = CMRequestUtils.calculateTimeDifference(object.createdDate!, nextDate!);
String timeDifference = CMRequestUtils.calculateTimeDifference(object.createdDate!, nextDate!); object.timeDifference = timeDifference;
object.timeDifference = timeDifference; } else {
} else { object.timeDifference = ''; // Empty string for the last action
object.timeDifference = ''; // Empty string for the last action }
items.add(historyLogCard(cxt, object));
} else {
items.add(statusCard(cxt, lastStatus));
lastStatus = currentStatus;
if (i + 1 < history.length) {
nextDate = history[i + 1].createdDate;
String timeDifference = CMRequestUtils.calculateTimeDifference(object.createdDate!, nextDate!);
object.timeDifference = timeDifference;
} else {
object.timeDifference = ''; // Empty string for the last action
}
items.add(historyLogCard(cxt, object));
}
} }
items.add(historyLogCard(cxt, object));
} else {
items.add(statusCard(cxt, lastStatus)); items.add(statusCard(cxt, lastStatus));
lastStatus = currentStatus; return SingleChildScrollView(
if (i + 1 < history.length) { padding: const EdgeInsets.all(16),
nextDate = history[i + 1].createdDate; child: Column(children: items),
String timeDifference = CMRequestUtils.calculateTimeDifference(object.createdDate!, nextDate!); );
object.timeDifference = timeDifference; }),
} else { ),
object.timeDifference = ''; // Empty string for the last action ],
}
items.add(historyLogCard(cxt, object));
}
}
items.add(statusCard(cxt, lastStatus));
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(children: items),
);
}),
), ),
], );
); }
}),
);}
Widget historyLogCard(BuildContext context, AssetDeliveryHistoryModel object) { Widget historyLogCard(BuildContext context, AssetDeliveryHistoryModel object) {
String title = object.status!.name!; String title = object.status!.name!;
@ -148,7 +155,8 @@ class _AssetDeliveryHistoryLogViewState extends State<AssetDeliveryHistoryLogVie
), ),
).paddingOnly(bottom: 16, start: 40); ).paddingOnly(bottom: 16, start: 40);
} }
// Need to check status text we have
//Todo Need to check status text we have
String statusText(String status) { String statusText(String status) {
if (status == "new" || status == "open") { if (status == "new" || status == "open") {
return "New".addTranslation; return "New".addTranslation;

@ -94,18 +94,19 @@ class _InspectionCheckListViewState extends State<InspectionCheckListView> {
} }
Widget inspectionStatusRadioWidget({required int index, required InspectionChecklistItem model, required BuildContext context}) { Widget inspectionStatusRadioWidget({required int index, required InspectionChecklistItem model, required BuildContext context}) {
bool status = (model.status == null || model.status == null) ? true : (model.status != null ? (model.status == 'true' ? true : false) : false); bool status = (model.status == null) ? false : (model.status != null ? (model.status == 'true' ? true : false) : false);
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( Text(
// ' (${index+1}) ${model.title}',
model.title ?? '', model.title ?? '',
overflow: TextOverflow.ellipsis, softWrap: true,
maxLines: 1, // maxLines: 1,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? Colors.white : AppColor.white936), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? Colors.white : AppColor.white936, height: 1.5),
), ),
14.height, 7.height,
// Column( // Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
@ -119,6 +120,7 @@ class _InspectionCheckListViewState extends State<InspectionCheckListView> {
status = !status; status = !status;
model.status = status.toString(); model.status = status.toString();
}); });
updateStatus(index, status.toString());
}, },
child: Container( child: Container(
width: 99.toScreenWidth, width: 99.toScreenWidth,
@ -158,7 +160,7 @@ class _InspectionCheckListViewState extends State<InspectionCheckListView> {
), ),
), ),
], ],
).paddingOnly(top: 4, bottom: 4); ).paddingOnly(top: 14);
} }
Widget buildToggleOption({ Widget buildToggleOption({

@ -66,6 +66,11 @@ class TechnicalInspectionAssetCard extends StatelessWidget {
), ),
2.height, 2.height,
], ],
if (!ischild)
Text(
'Line No: ${assetModel.lineNo ?? '-'}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
Text( Text(
'Asset Name: ${assetModel.modelDefinition?.assetName ?? '-'}', 'Asset Name: ${assetModel.modelDefinition?.assetName ?? '-'}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),

@ -130,7 +130,7 @@ class _TechnicalInspectionLinesListViewState extends State<TechnicalInspectionLi
}, },
); );
}, },
).toShadowContainer(context, borderRadius: 20, padding: 12), )
], ],
), ),
).expanded, ).expanded,
@ -250,14 +250,15 @@ class _TechnicalInspectionLinesListViewState extends State<TechnicalInspectionLi
} }
void _cancelTap() async { void _cancelTap() async {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); HelperFunction.cancelRequest(context: context, itemId: widget.deliveryTableModel.id!, requestId: widget.requestModel?.id);
await assetDeliveryProvider?.changeDeliveryStatusToCancel(itemId: widget.deliveryTableModel.id).then((status) async { // showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
Navigator.pop(context); // await assetDeliveryProvider?.changeDeliveryStatusToCancel(itemId: widget.deliveryTableModel.id).then((status) async {
if (status) { // Navigator.pop(context);
Navigator.pop(context); // if (status) {
await assetDeliveryProvider?.getAssetDeliveryTableListById(requestId: widget.requestModel?.id); // Navigator.pop(context);
} // await assetDeliveryProvider?.getAssetDeliveryTableListById(requestId: widget.requestModel?.id);
}); // }
// });
} }
void _nextTap() async { void _nextTap() async {

@ -112,15 +112,13 @@ class _UpdateChildAssetViewState extends State<UpdateChildAssetView> {
inspectionDetailsForm( inspectionDetailsForm(
lineId: widget.lineId, lineId: widget.lineId,
provider: provider, provider: provider,
), ).toShadowContainer(context, borderRadius: 20, padding: 12),
8.height, 20.height,
const Divider().defaultStyle(context),
8.height,
testLines( testLines(
context: context, context: context,
) )
], ],
).toShadowContainer(context, borderRadius: 20, padding: 12)) ))
.expanded, .expanded,
FooterActionButton.footerContainer(context: context, child: AppFilledButton(buttonColor: AppColor.primary10, label: 'Save'.addTranslation, maxWidth: true, onPressed: _saveTap)), FooterActionButton.footerContainer(context: context, child: AppFilledButton(buttonColor: AppColor.primary10, label: 'Save'.addTranslation, maxWidth: true, onPressed: _saveTap)),
], ],
@ -165,26 +163,7 @@ class _UpdateChildAssetViewState extends State<UpdateChildAssetView> {
showShadow: false, showShadow: false,
enable: false, enable: false,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
).onPress(() async { ),
var data = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TechnicalInspectionSearchAssetView(
lineId: lineId,
)));
if (data != null) {
TechnicalInspectionAssetModel? assetModel = await provider.getAssetDetails(assetId: data?.id);
if (assetModel != null) {
provider.setChildModel(assetModel);
if (assetModel.site != null) {
await provider.getSiteData(siteId: assetModel.site?.id, model: provider.childFormModel);
}
provider.setParentModel(assetModel);
populateTextFields(model: provider.childFormModel);
}
}
}),
8.height, 8.height,
AppTextFormField( AppTextFormField(
labelText: 'Asset Name'.addTranslation, labelText: 'Asset Name'.addTranslation,
@ -415,7 +394,7 @@ class _UpdateChildAssetViewState extends State<UpdateChildAssetView> {
orElse: () => InspectionChecklistItem(status: 'FAIL'), orElse: () => InspectionChecklistItem(status: 'FAIL'),
) )
.status == .status ==
'PASS'; 'true';
} }
buildInspectionPayload(List<InspectionChecklistItem> checklist) { buildInspectionPayload(List<InspectionChecklistItem> checklist) {

@ -114,34 +114,31 @@ class _UpdateParentAssetViewState extends State<UpdateParentAssetView> {
: Column( : Column(
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [
inspectionDetailsForm(lineId: widget.lineId, provider: provider).toShadowContainer(context, borderRadius: 20, padding: 12),
20.height,
Row(
children: [ children: [
inspectionDetailsForm(lineId: widget.lineId, provider: provider), Text(
8.height, "Test List",
const Divider().defaultStyle(context), style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
8.height,
Row(
children: [
Text(
"Test List",
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
),
8.width,
'web_link_icon'.toSvgAsset().onPress(() {
openInspectionChecklist(context);
}),
],
), ),
8.height, 8.width,
childList( 'web_link_icon'.toSvgAsset().onPress(() {
context: context, openInspectionChecklist(context);
provider: provider, }),
)
], ],
).toShadowContainer(context, borderRadius: 20, padding: 12)) ),
.expanded, 16.height,
childList(
context: context,
provider: provider,
)
],
)).expanded,
FooterActionButton.footerContainer(context: context, child: AppFilledButton(buttonColor: AppColor.primary10, label: 'Save'.addTranslation, maxWidth: true, onPressed: _saveTap)), FooterActionButton.footerContainer(context: context, child: AppFilledButton(buttonColor: AppColor.primary10, label: 'Save'.addTranslation, maxWidth: true, onPressed: _saveTap)),
], ],
); );
@ -468,7 +465,7 @@ class _UpdateParentAssetViewState extends State<UpdateParentAssetView> {
orElse: () => InspectionChecklistItem(status: 'FAIL'), orElse: () => InspectionChecklistItem(status: 'FAIL'),
) )
.status == .status ==
'PASS'; 'true';
} }
buildInspectionPayload(List<InspectionChecklistItem> checklist) { buildInspectionPayload(List<InspectionChecklistItem> checklist) {

@ -89,24 +89,27 @@ class _UpdateTechnicalInspectionLinesViewState extends State<UpdateTechnicalInsp
: Column( : Column(
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
itemDetails(context: context, itemNo: widget.deliveryLineModel?.itemNumber, itemDescription: widget.deliveryLineModel?.itemDescription), itemDetails(context: context, itemNo: widget.deliveryLineModel?.itemNumber, itemDescription: widget.deliveryLineModel?.itemDescription),
12.height, 12.height,
inspectionDetailsForm(), inspectionDetailsForm(),
8.height,
const Divider().defaultStyle(context),
Text(
"Cost Centers",
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
),
8.height,
costCenterList(context),
], ],
).toShadowContainer(context, borderRadius: 20, padding: 12)) ).toShadowContainer(context, borderRadius: 20, padding: 12),
.expanded, 20.height,
Text(
"Cost Centers",
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
),
16.height,
costCenterList(context),
],
)).expanded,
FooterActionButton.footerContainer(context: context, child: AppFilledButton(buttonColor: AppColor.primary10, label: 'Save'.addTranslation, maxWidth: true, onPressed: _saveTap)), FooterActionButton.footerContainer(context: context, child: AppFilledButton(buttonColor: AppColor.primary10, label: 'Save'.addTranslation, maxWidth: true, onPressed: _saveTap)),
], ],
), ),

@ -337,6 +337,52 @@ class AssetDeliveryProvider extends ChangeNotifier {
} }
} }
Future<bool> saveMasterInfoDeliveryInspection({
Map<String, dynamic>? requestPayload,
}) async {
isLoading = true;
try {
final response = await ApiManager.instance.post(URLs.saveMasterInfoDeliveryInspection, body: requestPayload??{});
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
isLoading = false;
notifyListeners();
return true;
} else {
isLoading = false;
notifyListeners();
return false;
}
} catch (error) {
isLoading = false;
notifyListeners();
return false;
}
}
Future<bool> sendEmailToAddSignature({
Map<String, dynamic>? requestPayload,
}) async {
isLoading = true;
try {
final response = await ApiManager.instance.post(URLs.sendEmailToAddSignature, body: requestPayload??{});
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
isLoading = false;
notifyListeners();
return true;
} else {
isLoading = false;
notifyListeners();
return false;
}
} catch (error) {
isLoading = false;
notifyListeners();
return false;
}
}
Future<DeliveryInspectionFormModel> getAssetDeliveryInspectionData({int? itemId}) async { Future<DeliveryInspectionFormModel> getAssetDeliveryInspectionData({int? itemId}) async {
isLoading = true; isLoading = true;
DeliveryInspectionFormModel deliveryInspectionFormModel = DeliveryInspectionFormModel(); DeliveryInspectionFormModel deliveryInspectionFormModel = DeliveryInspectionFormModel();

@ -6,6 +6,7 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/enums/work_order_next_step.dart'; import 'package:test_sa/models/enums/work_order_next_step.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
@ -16,6 +17,8 @@ import 'package:test_sa/modules/cx_module/chat/chat_provider.dart';
import 'package:test_sa/modules/cx_module/chat/chat_widget.dart'; import 'package:test_sa/modules/cx_module/chat/chat_widget.dart';
import 'package:test_sa/modules/cx_module/survey/survey_page.dart'; import 'package:test_sa/modules/cx_module/survey/survey_page.dart';
import 'package:test_sa/modules/loan_module/pages/create_loan_request_page.dart'; import 'package:test_sa/modules/loan_module/pages/create_loan_request_page.dart';
import 'package:test_sa/modules/loan_module/pages/loan_equipment_detail_page.dart';
import 'package:test_sa/modules/loan_module/provider/loan_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
@ -104,7 +107,9 @@ class _CMDetailPageState extends State<CMDetailPage> {
(provider.currentWorkOrder?.data?.workOrderContactPerson?.isNotEmpty ?? false)) { (provider.currentWorkOrder?.data?.workOrderContactPerson?.isNotEmpty ?? false)) {
return ChatWidget( return ChatWidget(
moduleId: widget.moduleId, moduleId: widget.moduleId,
isShow: context.settingProvider.isUserFlowMedical && (context.userProvider.isEngineer || context.userProvider.isNurse) && provider.currentWorkOrder?.data?.assignedEmployee != null, isShow: context.settingProvider.isUserFlowMedical &&
(context.userProvider.isEngineer || context.userProvider.isNurse) &&
provider.currentWorkOrder?.data?.assignedEmployee != null,
isReadOnly: _requestProvider.isReadOnlyRequest, isReadOnly: _requestProvider.isReadOnlyRequest,
requestId: widget.requestId.toInt(), requestId: widget.requestId.toInt(),
assigneeEmployeeNumber: provider.currentWorkOrder?.data?.assignedEmployee!.employeeId!, assigneeEmployeeNumber: provider.currentWorkOrder?.data?.assignedEmployee!.employeeId!,
@ -115,23 +120,64 @@ class _CMDetailPageState extends State<CMDetailPage> {
return const SizedBox(); return const SizedBox();
} }
}), }),
isNurse if (isNurse)
? IconButton( IconButton(
icon: 'qr'.toSvgAsset( icon: 'qr'.toSvgAsset(height: 24, width: 24),
height: 24, onPressed: () {
width: 24, ServiceRequestBottomSheet.getQRCodeBottomSheet(context: context);
), },
onPressed: () { )
ServiceRequestBottomSheet.getQRCodeBottomSheet(context: context); else ...[
}, Selector<CMDetailProvider, bool>(
) selector: (_, myModel) => myModel.isLoading, // Selects only the userName
: IconButton( builder: (_, isLoading, __) {
icon: const Icon(Icons.home), if (isLoading) {
onPressed: () { return const SizedBox();
// stopTimer(); } else {
Navigator.pop(context); CMDetailProvider provider = Provider.of<CMDetailProvider>(context, listen: false);
}, //TODO need to verify the check with backend workOrderNextStepEnum
), int? statusValue = provider.currentWorkOrder?.data?.status?.value;
WorkOrderNextStepEnum? workOrderNextStepEnum = provider.currentWorkOrder?.data?.nextStep?.workOrderNextStepEnum;
if (statusValue == 2 && workOrderNextStepEnum == WorkOrderNextStepEnum.activity) {
return Container(
padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 6),
margin: const EdgeInsets.only(left: 2),
decoration: BoxDecoration(color: context.isDark ? AppColor.neutral50 : AppColor.neutral30, borderRadius: BorderRadius.circular(16)),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(Icons.add, size: 20, color: AppColor.black1E),
Text(
"Loan",
style: AppTextStyles.bodyText2.copyWith(color: AppColor.black1E),
),
4.width,
],
),
).onPress(() async {
LoanProvider loanProvider = Provider.of<LoanProvider>(context, listen: false);
Utils.showLoading(context);
var data = await loanProvider.getLoanByWorkOrderId(widget.requestId);
Utils.hideLoading(context);
if (data == null) {
CMDetailProvider cmProvider = Provider.of<CMDetailProvider>(context, listen: false);
Navigator.push(context, MaterialPageRoute(builder: (context) => CreateLoanRequestPage(workOrderId: widget.requestId, workOrder: cmProvider.currentWorkOrder!.data)));
} else {
Navigator.push(context, MaterialPageRoute(builder: (context) => LoanEquipmentDetailPage(loanId: data.id!)));
}
});
}
return const SizedBox();
}
}),
IconButton(
icon: const Icon(Icons.home),
onPressed: () {
// stopTimer();
Navigator.pop(context);
},
)
],
], ],
), ),
body: DefaultTabController( body: DefaultTabController(

@ -167,7 +167,7 @@ class ChatProvider with ChangeNotifier, DiagnosticableTreeMixin {
if (!readOnly) { if (!readOnly) {
await buildHubConnection(chatParticipantModel!.id!.toString()); await buildHubConnection(chatParticipantModel!.id!.toString());
} }
userChatHistory = null;
userChatHistory = await ChatApiClient().loadChatHistory(moduleId, requestId, myId, assigneeEmployeeNumber); userChatHistory = await ChatApiClient().loadChatHistory(moduleId, requestId, myId, assigneeEmployeeNumber);
chatResponseList = userChatHistory ?? []; chatResponseList = userChatHistory ?? [];
chatResponseList.sort((a, b) => b.createdDate!.compareTo(a.createdDate!)); chatResponseList.sort((a, b) => b.createdDate!.compareTo(a.createdDate!));

@ -2,6 +2,8 @@ import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/mapped_sites.dart'; import 'package:test_sa/models/new_models/mapped_sites.dart';
import 'package:test_sa/models/new_models/site.dart'; import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/models/new_models/traf_department.dart'; import 'package:test_sa/models/new_models/traf_department.dart';
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_details.dart';
import 'package:test_sa/modules/loan_module/models/medical_department_model.dart'; import 'package:test_sa/modules/loan_module/models/medical_department_model.dart';
class LoanFormModel { class LoanFormModel {
@ -12,12 +14,15 @@ class LoanFormModel {
String? requestDescription; String? requestDescription;
String? model; String? model;
String? manufacturer; String? manufacturer;
bool isNewVendor;
Lookup? loanProvided; Lookup? loanProvided;
String? vendorName; String? vendorName;
String? vendorRepresentativeName; String? vendorRepresentativeName;
String? vendorNumber; String? vendorNumber;
String? vendorEmail; String? vendorEmail;
Site? site; Site? site;
SupplierDetails? supplier;
SuppEngineerWorkOrders? supEngineer;
MedicalDepartmentModel? department; MedicalDepartmentModel? department;
List<LoanAttachments>? loanAttachment; List<LoanAttachments>? loanAttachment;
MappedSite? mappedSite; MappedSite? mappedSite;
@ -25,6 +30,7 @@ class LoanFormModel {
LoanFormModel({ LoanFormModel({
this.docName, this.docName,
this.isNewVendor=false,
this.docNumber, this.docNumber,
this.docEmail, this.docEmail,
this.itemDescription, this.itemDescription,
@ -38,6 +44,8 @@ class LoanFormModel {
this.vendorEmail, this.vendorEmail,
this.loanAttachment, this.loanAttachment,
this.site, this.site,
this.supplier,
this.supEngineer,
this.department, this.department,
this.mappedSite, this.mappedSite,
this.mappedDepartment, this.mappedDepartment,
@ -94,6 +102,7 @@ class LoanFormModel {
"vendorNumber": vendorNumber, "vendorNumber": vendorNumber,
"vendorContact": vendorNumber, "vendorContact": vendorNumber,
"vendorEmail": vendorEmail, "vendorEmail": vendorEmail,
"isNewVendor": isNewVendor,
// 'siteId': site?.id, // 'siteId': site?.id,
'siteId': mappedSite?.id, 'siteId': mappedSite?.id,
// 'departmentId': department?.id, // 'departmentId': department?.id,
@ -109,9 +118,7 @@ class LoanAttachments {
num? loanId; num? loanId;
String? attachmentName; String? attachmentName;
String? attachmentDescription; String? attachmentDescription;
LoanAttachments({this.id, this.loanAttachmentTypeId, this.attachmentName, this.loanId, this.attachmentDescription}); LoanAttachments({this.id, this.loanAttachmentTypeId, this.attachmentName, this.loanId, this.attachmentDescription});
LoanAttachments.fromJson(dynamic json) { LoanAttachments.fromJson(dynamic json) {
id = json['id']; id = json['id'];
loanAttachmentTypeId = json['loanAttachmentTypeId']; loanAttachmentTypeId = json['loanAttachmentTypeId'];

@ -0,0 +1,40 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/modules/loan_module/models/loan_form_model.dart';
class LoanInstallationPullOutFormModel {
String? snNo;
DateTime? date;
Uint8List? signature;
List<LoanAttachments>? loanAttachment;
TimerModel? timerModel = TimerModel();
DateTime? startTime;
DateTime? endTime;
double? totalHours;
LoanInstallationPullOutFormModel({
this.loanAttachment,
this.timerModel,
this.snNo,
this.signature,
this.date,
this.startTime,
this.endTime,
this.totalHours,
});
Map<String, dynamic> toJson() {
//Need to check payload parm they need
return {
'snNo': snNo,
'InstallationDate': date?.toIso8601String(),
"loanAttachments": loanAttachment != null ? loanAttachment!.map((v) => v.toJson()).toList() : [],
"signature": signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature!)}" : null,
'startTime': startTime?.toIso8601String(),
'endTime': endTime?.toIso8601String(),
'totalHours': totalHours,
};
}
}

@ -15,6 +15,8 @@ import 'package:test_sa/models/new_models/mapped_sites.dart';
import 'package:test_sa/models/new_models/task_request/task_type_model.dart'; import 'package:test_sa/models/new_models/task_request/task_type_model.dart';
import 'package:test_sa/models/new_models/traf_department.dart'; import 'package:test_sa/models/new_models/traf_department.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_details.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/loan_module/models/loan_form_model.dart'; import 'package:test_sa/modules/loan_module/models/loan_form_model.dart';
@ -28,6 +30,7 @@ import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart
import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
import 'package:test_sa/providers/loading_list_notifier.dart'; import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/providers/lookups/department_lookup_provider.dart'; import 'package:test_sa/providers/lookups/department_lookup_provider.dart';
import 'package:test_sa/providers/work_order/vendor_provider.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../../../new_views/common_widgets/default_app_bar.dart';
@ -47,9 +50,11 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TaskType? selectedType; TaskType? selectedType;
final LoanFormModel _loanFormModel = LoanFormModel(); final LoanFormModel _loanFormModel = LoanFormModel(isNewVendor: false);
TextEditingController commentController = TextEditingController(); TextEditingController commentController = TextEditingController();
TextEditingController vendorPhoneController = TextEditingController();
TextEditingController vendorEmailController = TextEditingController();
bool get isBackUpRequest => widget.workOrderId != null; bool get isBackUpRequest => widget.workOrderId != null;
@ -61,6 +66,22 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
Provider.of<MedicalDepartmentProvider>(context, listen: false).reset(); Provider.of<MedicalDepartmentProvider>(context, listen: false).reset();
Provider.of<LoanPeriodProvider>(context, listen: false).reset(); Provider.of<LoanPeriodProvider>(context, listen: false).reset();
loanTypes = [Lookup(id: 0, name: "Standard", value: 1), Lookup(id: 1, name: "Backup", value: 2)]; loanTypes = [Lookup(id: 0, name: "Standard", value: 1), Lookup(id: 1, name: "Backup", value: 2)];
if (isBackUpRequest) {
fillSiteDeptInfo();
}
}
@override
void dispose() {
vendorPhoneController.dispose();
vendorEmailController.dispose();
super.dispose();
}
void fillSiteDeptInfo() {
_loanFormModel.mappedSite = MappedSite.fromJson(widget.workOrder!.site!.toJson());
_loanFormModel.mappedDepartment = TrafDepartment.fromJson(widget.workOrder!.department!.toJson());
} }
@override @override
@ -94,7 +115,7 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
'Asset Information'.addTranslation.bodyText(context).custom(color: AppColor.black10), 'Asset Information'.addTranslation.bodyText(context).custom(color: AppColor.black10),
8.height, 8.height,
Text( Text(
'${context.translation.assetName}: ${widget.workOrder!.assetNdModel!.name?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.assetName}: ${widget.workOrder!.assetNdModel!.name?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
), ),
Text( Text(
@ -106,11 +127,11 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
), ),
Text( Text(
'${context.translation.model}: ${widget.workOrder!.model?.name!.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.model}: ${widget.workOrder!.model?.name!.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
), ),
Text( Text(
'${context.translation.manufacture}: ${widget.workOrder!.manufacturer?.name?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.manufacture}: ${widget.workOrder!.manufacturer?.name?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
), ),
16.height, 16.height,
@ -274,6 +295,7 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
title: context.translation.site, title: context.translation.site,
initialValue: _loanFormModel.mappedSite, initialValue: _loanFormModel.mappedSite,
showShadow: false, showShadow: false,
enabled: !isBackUpRequest,
validator: (value) { validator: (value) {
if (value == null) return "Please select a site"; if (value == null) return "Please select a site";
return null; return null;
@ -281,13 +303,12 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
showAsBottomSheet: true, showAsBottomSheet: true,
onSelect: (value) { onSelect: (value) {
if(value!=null){ if (value != null) {
_loanFormModel.mappedSite = value; _loanFormModel.mappedSite = value;
_loanFormModel.mappedDepartment = null; _loanFormModel.mappedDepartment = null;
Provider.of<DepartmentLookupProvider>(context,listen:false).getData(id:_loanFormModel.mappedSite?.id); Provider.of<DepartmentLookupProvider>(context, listen: false).getData(id: _loanFormModel.mappedSite?.id);
setState(() {}); setState(() {});
} }
}, },
), ),
8.height, 8.height,
@ -295,6 +316,7 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
context: context, context: context,
title: context.translation.department, title: context.translation.department,
showShadow: false, showShadow: false,
enabled: !isBackUpRequest,
validator: (value) { validator: (value) {
if (value == null) return "Please select a department"; if (value == null) return "Please select a department";
return null; return null;
@ -417,46 +439,136 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
List<Widget> vendorDetailsSection() { List<Widget> vendorDetailsSection() {
return [ return [
'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), Row(
8.height, mainAxisAlignment: MainAxisAlignment.spaceBetween,
AppTextFormField( children: [
initialValue: "", 'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10),
labelText: "Vendor Name", Row(
validator: (value) { children: [
if ((value ?? "").isEmpty) return "Mandatory"; Container(
return null; height: 24,
}, width: 24,
style: Theme.of(context).textTheme.titleMedium, decoration: const BoxDecoration(
backgroundColor: AppColor.fieldBgColor(context), shape: BoxShape.circle,
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), color: AppColor.primary10, // or AppColor.blueStatus(context)
showShadow: false, ),
textInputType: TextInputType.name, alignment: Alignment.center,
textInputAction: TextInputAction.next, child: Icon(
onChange: (value) { !_loanFormModel.isNewVendor ? Icons.add : Icons.search,
_loanFormModel.vendorName = value; color: Colors.white,
}, size: 16,
),
),
4.width,
Text(
!_loanFormModel.isNewVendor ? "Add new vendor" : "Select existing vendor",
style: AppTextStyles.bodyText.copyWith(
color: context.isDark ? AppColor.neutral30 : AppColor.neutral50,
// decoration: TextDecoration.underline,
),
),
],
).onPress(() async {
_loanFormModel.supplier = null;
_loanFormModel.vendorName = null;
_loanFormModel.supEngineer = null;
_loanFormModel.vendorRepresentativeName = null;
setState(() {
_loanFormModel.isNewVendor = !_loanFormModel.isNewVendor;
});
}),
],
), ),
8.height, 8.height,
AppTextFormField( if (!_loanFormModel.isNewVendor) ...[
initialValue: "", SingleItemDropDownMenu<SupplierDetails, VendorProvider>(
labelText: "Vendor Representative Name", context: context,
validator: (value) { title: 'Vendor Name'.addTranslation,
if ((value ?? "").isEmpty) return "Mandatory"; backgroundColor: AppColor.fieldBgColor(context),
return null; initialValue: _loanFormModel.supplier,
}, showAsBottomSheet: true,
style: Theme.of(context).textTheme.titleMedium, validator: (value) {
backgroundColor: AppColor.fieldBgColor(context), if (value == null) return "Please select vendor name";
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), return null;
showShadow: false, },
textInputType: TextInputType.name, showShadow: false,
textInputAction: TextInputAction.next, showCancel: true,
onChange: (value) { onSelect: (person) {
_loanFormModel.vendorRepresentativeName = value; _loanFormModel.supplier = person;
}, _loanFormModel.vendorName = person?.name;
), _loanFormModel.supEngineer = null;
_loanFormModel.vendorRepresentativeName = null;
vendorPhoneController.text = person?.contact ?? '';
vendorEmailController.text = person?.email ?? '';
setState(() {});
},
),
8.height,
SingleItemDropDownMenu<SuppPersons, NullableLoadingProvider>(
context: context,
backgroundColor: _loanFormModel.supplier?.suppliername == null
? context.isDark
? AppColor.neutral20
: AppColor.neutral40
: AppColor.fieldBgColor(context),
title: "Representative Name".addTranslation,
showShadow: false,
validator: (value) {
if (value == null) return "Please select representative name";
return null;
},
enabled: _loanFormModel.supplier?.suppPersons?.isNotEmpty ?? false,
staticData: _loanFormModel.supplier?.suppPersons,
showAsBottomSheet: true,
initialValue: _loanFormModel.supEngineer == null ? null : SuppPersons.fromJson(_loanFormModel.supEngineer?.toJson()),
onSelect: (suppPerson) {
if (suppPerson != null) {
_loanFormModel.vendorRepresentativeName = suppPerson.name;
_loanFormModel.supEngineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson());
setState(() {});
}
},
),
] else ...[
AppTextFormField(
initialValue: "",
labelText: "Vendor Name",
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.name,
textInputAction: TextInputAction.next,
onChange: (value) {
_loanFormModel.vendorName = value;
},
),
8.height,
AppTextFormField(
initialValue: "",
labelText: "Vendor Representative Name",
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.name,
textInputAction: TextInputAction.next,
onChange: (value) {
_loanFormModel.vendorRepresentativeName = value;
},
),
],
8.height, 8.height,
AppTextFormField( AppTextFormField(
initialValue: "", controller: vendorPhoneController,
labelText: "Vendor Number", labelText: "Vendor Number",
validator: (value) { validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory"; if ((value ?? "").isEmpty) return "Mandatory";
@ -474,7 +586,7 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
), ),
8.height, 8.height,
AppTextFormField( AppTextFormField(
initialValue: "", controller: vendorEmailController,
labelText: "Vendor Email", labelText: "Vendor Email",
validator: (value) { validator: (value) {
if ((value ?? "").isEmpty) { if ((value ?? "").isEmpty) {

@ -0,0 +1,187 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/loan_module/models/loan_installation_pullout_form_model.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
class InstallationPullOutFormView extends StatefulWidget {
final bool isPullout;
final String? createdDate;
const InstallationPullOutFormView({super.key, required this.isPullout, this.createdDate});
@override
State<InstallationPullOutFormView> createState() => _InstallationPullOutFormViewState();
}
class _InstallationPullOutFormViewState extends State<InstallationPullOutFormView> {
final _formKey = GlobalKey<FormState>();
final _snController = TextEditingController();
List<GenericAttachmentModel> _attachments = [];
final _formData = LoanInstallationPullOutFormModel();
@override
void dispose() {
_snController.dispose();
super.dispose();
}
void _pickInstallationDate(DateTime date) async {
final time = await showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
);
if (time == null) return;
setState(() {
_formData.date = DateTime(
date.year,
date.month,
date.day,
time.hour,
time.minute,
);
});
}
void _onSignatureChanged(Uint8List signature) {
if (signature.isEmpty) return;
setState(() {
_formData.signature = signature;
});
}
void _submitForm() {
if (!_formKey.currentState!.validate()) return;
//Validation if required .
// if (_formData.date == null) {
// context.showSnackBar('Please select installation date');
// return;
// }
//
// if (_formData.signature == null || _formData.signature!.isEmpty) {
// context.showSnackBar('Signature is required');
// return;
// }
_formData.snNo = _snController.text;
}
void updateTimer({TimerModel? timer}) {
if (timer?.startAt != null && timer?.endAt != null) {
final start = timer!.startAt!;
final end = timer.endAt!;
final difference = end.difference(start);
final totalHours = difference.inSeconds / 3600.0;
_formData.startTime = start;
_formData.endTime = end;
_formData.totalHours = totalHours;
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: widget.isPullout ? null : DefaultAppBar(title: 'Installation Report'.addTranslation),
body: SafeArea(
child: Form(
key: _formKey,
child: Column(
children: [
SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
if (!widget.isPullout) ...[
AppTextFormField(
controller: _snController,
labelText: context.translation.snNo,
backgroundColor: AppColor.fieldBgColor(context),
textAlign: TextAlign.center,
labelStyle: AppTextStyles.textFieldLabelStyle,
hintStyle: AppTextStyles.textFieldLabelStyle,
textInputType: TextInputType.text,
textInputAction: TextInputAction.next,
showShadow: false,
validator: (v) => (v == null || v.isEmpty) ? 'Required' : null,
),
8.height,
],
ADatePicker(
label: !widget.isPullout ? "Installation Date".addTranslation : "Validation Date".addTranslation,
hideShadow: true,
backgroundColor: AppColor.fieldBgColor(context),
to: DateTime.now().add(const Duration(days: 365)),
formatDateWithTime: true,
onDatePicker: _pickInstallationDate,
),
8.height,
AppTimer(
label: context.translation.workingHours,
timer: _formData.timerModel,
// pickerFromDate: DateTime.tryParse(widget.createdDate ?? ''),
pickerFromDate: DateTime(DateTime.now().year, DateTime.now().month, 1),
pickerTimer: _formData.timerModel,
showTimer: false,
onPick: (timer) {
updateTimer(timer: timer);
},
width: double.infinity,
decoration: BoxDecoration(
color: AppColor.fieldBgColor(context),
borderRadius: BorderRadius.circular(10),
),
timerProgress: (isRunning) {},
onChange: (timer) async {
updateTimer(timer: timer);
return true;
},
),
ESignature(
title: 'End-user signature'.addTranslation,
backgroundColor: AppColor.fieldBgColor(context),
showShadow: false,
oldSignature: '',
newSignature: _formData.signature,
onChange: _onSignatureChanged,
),
24.height,
AttachmentPicker(
label: context.translation.attachments,
attachment: _attachments,
),
],
).toShadowContainer(context, borderRadius: 20),
).expanded,
FooterActionButton.footerContainer(
context: context,
child: AppFilledButton(
buttonColor: AppColor.primary10,
label: context.translation.submitRequest,
onPressed: _submitForm,
),
),
],
),
),
),
);
}
}

@ -0,0 +1,87 @@
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/modules/loan_module/models/loan_request_model.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/widgets/images/files_list.dart';
class InstallationDetailsView extends StatelessWidget {
final LoanRequestModel loanData;
const InstallationDetailsView({super.key, required this.loanData});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
detailContent(
context: context,
heading: 'Updates SN:',
label: loanData.installationDate??'-'
),
detailContent(
context: context,
heading: 'Installation Date',
label: loanData.installationDate??'-'
),
],
),
12.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
detailContent(
context: context,
heading: 'Start Time',
label: loanData.installationDate??'-'
),
detailContent(
context: context,
heading: 'End Time',
label: loanData.installationDate??'-'
),
],
),
12.height,
detailContent(
context: context,
heading: 'Total Time',
label: loanData.installationDate??'-'
),
if (loanData.loanAttachments!.isNotEmpty) ...[
12.height,
Text(
"Uploads Phase 2 docs".addTranslation,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
8.height,
FilesList(images: loanData.loanAttachments?.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []),
],
],
).toShadowContainer(context, borderRadius: 20),
);
}
Widget detailContent({required BuildContext context, required String label, required String heading}) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
heading.bodyText(context).custom(color: AppColor.neutral120),
6.height,
//TODO Need to check which value need to show here
label.bodyText(context).custom(color: AppColor.neutral120),
],
);
}
}

@ -1,5 +1,3 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
@ -9,23 +7,18 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart';
import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_data_model.dart';
import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/update_equipment_internal_audit_page.dart';
import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/update_system_internal_audit_page.dart';
import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart';
import 'package:test_sa/modules/loan_module/models/loan_attachment_model.dart'; import 'package:test_sa/modules/loan_module/models/loan_attachment_model.dart';
import 'package:test_sa/modules/loan_module/pages/pullout_detail_page.dart';
import 'package:test_sa/modules/loan_module/provider/loan_provider.dart'; import 'package:test_sa/modules/loan_module/provider/loan_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/images/files_list.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
import '../models/loan_request_model.dart'; import '../models/loan_request_model.dart';
import 'installation_pullout_form_view.dart';
class LoanEquipmentDetailPage extends StatelessWidget { class LoanEquipmentDetailPage extends StatelessWidget {
static const String id = "/loan-equipment-detail-page"; static const String id = "/loan-equipment-detail-page";
@ -46,7 +39,9 @@ class LoanEquipmentDetailPage extends StatelessWidget {
List<LoanAttachmentModel> allAttachments = snapshot.data!.loanAttachments!; List<LoanAttachmentModel> allAttachments = snapshot.data!.loanAttachments!;
return ListView( return Column(
children: [
ListView(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
children: [ children: [
Column( Column(
@ -91,7 +86,27 @@ class LoanEquipmentDetailPage extends StatelessWidget {
], ],
).toShadowContainer(context, padding: 12), ).toShadowContainer(context, padding: 12),
], ],
); ).expanded,
// if (context.userProvider.isEngineer && (snapshot.data?.loanStatusValue == 5 || snapshot.data?.loanStatusValue == 8))
// FooterActionButton.footerContainer(
// context: context,
// child: AppFilledButton(
// onPressed: () async {
// if (snapshot.data?.loanStatusValue == 5) {
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => PullOutDetailsPage(
// loanData: snapshot.data,
// )));
// return;
// }
// Navigator.push(context, MaterialPageRoute(builder: (context) => const InstallationPullOutFormView(isPullout: false)));
// },
// label: snapshot.data?.loanStatusValue == 5 ? 'Installation Report' : 'PullOut Report',
// ),
// )
]);
}), }),
)); ));
} }

@ -0,0 +1,80 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/modules/loan_module/models/loan_request_model.dart';
import 'package:test_sa/modules/loan_module/pages/installation_pullout_form_view.dart';
import 'package:test_sa/modules/loan_module/pages/intallation_details_view.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
class PullOutDetailsPage extends StatefulWidget {
final LoanRequestModel? loanData;
PullOutDetailsPage({Key? key, required this.loanData}) : super(key: key);
@override
_PullOutDetailsPageState createState() {
return _PullOutDetailsPageState();
}
}
class _PullOutDetailsPageState extends State<PullOutDetailsPage> {
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
appBar: DefaultAppBar(
title: 'Loan Request'.addTranslation,
),
body: DefaultTabController(
length: 2,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 16.toScreenWidth, right: 16.toScreenWidth, top: 12.toScreenHeight),
decoration: BoxDecoration(color: context.isDark ? AppColor.neutral50 : AppColor.white10, borderRadius: BorderRadius.circular(10)),
child: TabBar(
padding: EdgeInsets.symmetric(vertical: 4.toScreenHeight, horizontal: 4.toScreenWidth),
labelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelStyle: AppTextStyles.bodyText,
labelStyle: AppTextStyles.bodyText,
indicatorPadding: EdgeInsets.zero,
indicatorSize: TabBarIndicatorSize.tab,
dividerColor: Colors.transparent,
indicator: BoxDecoration(color: context.isDark ? AppColor.neutral60 : AppColor.neutral110, borderRadius: BorderRadius.circular(7)),
onTap: (index) {
// setState(() {});
},
tabs: [
Tab(text: 'Installation'.addTranslation, height: 57.toScreenHeight),
Tab(text: 'Pull Out'.addTranslation, height: 57.toScreenHeight),
],
),
),
12.height,
TabBarView(
children: [
Align(
alignment: Alignment.topCenter,
child: InstallationDetailsView(
loanData: widget.loanData!,
),
),
const InstallationPullOutFormView(isPullout: true),
],
).expanded,
],
),
));
}
}

@ -35,4 +35,17 @@ class LoanProvider extends ChangeNotifier {
} }
return loanData; return loanData;
} }
Future<LoanRequestModel?> getLoanByWorkOrderId(int id) async {
LoanRequestModel? loanData;
try {
Response response = await ApiManager.instance.get(URLs.getLoanByWorkOrderId + "?woId=$id", enableToastMessage: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
loanData = LoanRequestModel.fromJson(json.decode(response.body)["data"]);
}
} catch (error) {
print(error);
}
return loanData;
}
} }

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
@ -45,6 +45,7 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
MedicalGasFormModel _medicalGasFormModel = MedicalGasFormModel(); MedicalGasFormModel _medicalGasFormModel = MedicalGasFormModel();
MedicalGasSupplierModel? medicalGasInfo; MedicalGasSupplierModel? medicalGasInfo;
late MedicalGasInspectionProvider medicalGasInspectionProvider; late MedicalGasInspectionProvider medicalGasInspectionProvider;
late SiteProvider siteProvider;
bool isGasInfoLoading = false; bool isGasInfoLoading = false;
@override @override
@ -52,10 +53,14 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
super.initState(); super.initState();
// Provider.of<MedicalGasSupplierProvider>(context, listen: false).reset(); // Provider.of<MedicalGasSupplierProvider>(context, listen: false).reset();
medicalGasInspectionProvider = Provider.of<MedicalGasInspectionProvider>(context, listen: false); medicalGasInspectionProvider = Provider.of<MedicalGasInspectionProvider>(context, listen: false);
siteProvider = Provider.of<SiteProvider>(context, listen: false);
_populateFormData(); _populateFormData();
} }
_populateFormData() { _populateFormData() {
if (siteProvider.items.isEmpty) {
siteProvider.reset();
}
if (widget.dataModel != null) { if (widget.dataModel != null) {
MedicalGasDataModel dataModel = widget.dataModel!; MedicalGasDataModel dataModel = widget.dataModel!;
_medicalGasFormModel = MedicalGasFormModel( _medicalGasFormModel = MedicalGasFormModel(
@ -97,7 +102,7 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
context: context, context: context,
title: "Order Type", title: "Order Type",
validator: (value) { validator: (value) {
if (value == null) return "Mandatory"; if (value == null) return "Please select order type";
return null; return null;
}, },
initialValue: _medicalGasFormModel.orderType, initialValue: _medicalGasFormModel.orderType,
@ -113,7 +118,7 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
context: context, context: context,
title: "Item Type", title: "Item Type",
validator: (value) { validator: (value) {
if (value == null) return "Mandatory"; if (value == null) return "Please select item type";
return null; return null;
}, },
initialValue: _medicalGasFormModel.itemType, initialValue: _medicalGasFormModel.itemType,
@ -145,25 +150,6 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
}, },
), ),
8.height, 8.height,
// 8.height,
// SingleItemDropDownMenu<MedicalDepartmentModel, MedicalDepartmentProvider>(
// context: context,
// title: context.translation.department,
// showShadow: false,
// validator: (value) {
// if (value == null) return "Please select a department";
// return null;
// },
// showAsBottomSheet: true,
// initialValue: _medicalGasFormModel.department,
// requestById: context.userProvider.user?.clientId,
// backgroundColor: AppColor.fieldBgColor(context),
// onSelect: (value) {
// _medicalGasFormModel.department = value;
// setState(() {});
// },
// ),
// 8.height,
SingleItemDropDownMenu<MedicalGasSupplierModel, MedicalGasSupplierProvider>( SingleItemDropDownMenu<MedicalGasSupplierModel, MedicalGasSupplierProvider>(
context: context, context: context,
title: context.translation.supplier, title: context.translation.supplier,
@ -171,6 +157,10 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
showAsBottomSheet: true, showAsBottomSheet: true,
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
showShadow: false, showShadow: false,
validator: (value) {
if (value == null) return "Please select a supplier";
return null;
},
onSelect: (value) { onSelect: (value) {
setState(() { setState(() {
_medicalGasFormModel.supplier = value; _medicalGasFormModel.supplier = value;
@ -178,7 +168,6 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
setGasInfo(); setGasInfo();
}, },
), ),
if (medicalGasInfo != null) medicalGasInfoWidget(), if (medicalGasInfo != null) medicalGasInfoWidget(),
], ],
).toShadowContainer(context, borderRadius: 20), ).toShadowContainer(context, borderRadius: 20),
@ -254,9 +243,25 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
labelText: model.itemName, labelText: model.itemName,
hintText: 'Enter Quantity'.addTranslation, hintText: 'Enter Quantity'.addTranslation,
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
initialValue: model.requestedQuantity != null ? model.requestedQuantity.toString() : '', initialValue: model.requestedQuantity != null ? model.requestedQuantity?.toStringAsFixed(0) : '',
// initialValue: model.value != null ? model.value.toString() : '',
textAlign: TextAlign.center, textAlign: TextAlign.center,
enable: true, // validator: (value) {
// if (value == null || value.trim().isEmpty) {
// return "This field is required";
// }
//
// final intVal = int.tryParse(value);
// if (intVal == null) {
// return "Enter a valid number";
// }
//
// if (intVal <= 0) {
// return "Value must be greater than 0";
// }
//
// return null;
// },
textInputType: TextInputType.number, textInputType: TextInputType.number,
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
showShadow: false, showShadow: false,
@ -274,6 +279,8 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
} }
Future<void> _update({bool isSubmitted = false}) async { Future<void> _update({bool isSubmitted = false}) async {
if (!_formKey.currentState!.validate()) return;
_formKey.currentState?.save();
if (medicalGasInfo != null && medicalGasInfo!.attributeInfo!.isNotEmpty) { if (medicalGasInfo != null && medicalGasInfo!.attributeInfo!.isNotEmpty) {
_medicalGasFormModel.gasRequestDetail = []; _medicalGasFormModel.gasRequestDetail = [];
for (var item in medicalGasInfo!.attributeInfo!) { for (var item in medicalGasInfo!.attributeInfo!) {
@ -284,15 +291,19 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
)); ));
} }
} }
_medicalGasFormModel.isSubmitted = isSubmitted; _medicalGasFormModel.isSubmitted = isSubmitted;
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await medicalGasInspectionProvider.saveMedicalGas(model: _medicalGasFormModel).then((status) async { await medicalGasInspectionProvider.saveMedicalGas(model: _medicalGasFormModel).then((status) async {
Navigator.pop(context); Navigator.pop(context);
if (status) { if (status) {
Navigator.pop(context, true); Navigator.pop(context, true);
AllRequestsProvider allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
allRequestsProvider.reset();
await allRequestsProvider.getAllRequests(context, typeTransaction: 14);
} else { } else {
//This should be handled from backend. //This should be handled from backend.
Fluttertoast.showToast(msg: 'No gas available for selected site', toastLength: Toast.LENGTH_LONG); Fluttertoast.showToast(msg: 'Something went wrong', toastLength: Toast.LENGTH_LONG);
} }
}); });
} }

@ -53,90 +53,88 @@ class _MedicalGasInspectionDetailPageState extends State<MedicalGasInspectionDet
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: const DefaultAppBar(title: "Request Details"), appBar: const DefaultAppBar(title: "Request Details"),
body: SafeArea( body: _isLoading
child: _isLoading ? SizedBox.expand(child: const CircularProgressIndicator(color: AppColor.primary10).center)
? SizedBox.expand(child: const CircularProgressIndicator(color: AppColor.primary10).center) : model == null
: model == null ? const NoDataFound().center
? const NoDataFound().center : Column(
: Column( children: [
children: [ ListView(
ListView( padding: const EdgeInsets.all(16),
padding: const EdgeInsets.all(16), children: [
children: [ Column(
Column( crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, children: [
children: [ //Need to return the status form api backend
//Need to return the status form api backend Row(
Row( children: [
children: [ if (widget.prority != null) ...[
if (widget.prority != null) ...[
StatusLabel(
label: widget.prority,
textColor: AppColor.getRequestStatusTextColorByName(context, widget.prority),
backgroundColor: AppColor.getRequestStatusColorByName(context, widget.prority),
),
8.width,
],
StatusLabel( StatusLabel(
label: model?.requestStatus?.name, label: widget.prority,
textColor: AppColor.getHistoryLogStatusTextColorByName(model?.requestStatus?.name ?? ''), textColor: AppColor.getRequestStatusTextColorByName(context, widget.prority),
backgroundColor: AppColor.getHistoryLogStatusColorByName(model?.requestStatus?.name ?? ''), backgroundColor: AppColor.getRequestStatusColorByName(context, widget.prority),
), ),
1.width.expanded, 8.width,
Text(model!.requestedDate!.toServiceRequestCardFormat,
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50))
], ],
), StatusLabel(
8.height, label: model?.requestStatus?.name,
Text("Request Details", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), textColor: AppColor.getHistoryLogStatusTextColorByName(model?.requestStatus?.name ?? ''),
'${context.translation.requestNo}: ${model?.requestNumber ?? '-'}'.bodyText(context), backgroundColor: AppColor.getHistoryLogStatusColorByName(model?.requestStatus?.name ?? ''),
'Requested by: ${model?.requestedBy ?? '-'}'.bodyText(context),
if (model?.lastModifiedBy != null)
'Last Modified by: ${model?.lastModifiedBy ?? '-'}'.bodyText(context),
'Order Type: ${model?.requestOrderType ?? '-'}'.bodyText(context),
'Item Type: ${model?.itemType ?? '-'}'.bodyText(context),
'Site: ${model?.site ?? '-'}'.bodyText(context),
'Supplier Name: ${model?.supplier ?? '-'}'.bodyText(context),
'Supplier Contact: ${model?.contact ?? '-'}'.bodyText(context),
'Supplier Email: ${model?.email ?? '-'}'.bodyText(context),
if (model!.deliveryNoteAttachmentDto.isNotEmpty) ...[
const Divider().defaultStyle(context),
Text(
"Attachments".addTranslation,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
), ),
FilesList(images: model!.deliveryNoteAttachmentDto.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []), 1.width.expanded,
Text(model!.requestedDate!.toServiceRequestCardFormat,
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50))
], ],
),
8.height,
Text("Request Details", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'${context.translation.requestNo}: ${model?.requestNumber ?? '-'}'.bodyText(context),
'Requested by: ${model?.requestedBy ?? '-'}'.bodyText(context),
if (model?.lastModifiedBy != null)
'Last Modified by: ${model?.lastModifiedBy ?? '-'}'.bodyText(context),
'Order Type: ${model?.requestOrderType ?? '-'}'.bodyText(context),
'Item Type: ${model?.itemType ?? '-'}'.bodyText(context),
'Site: ${model?.site ?? '-'}'.bodyText(context),
'Supplier Name: ${model?.supplier ?? '-'}'.bodyText(context),
'Supplier Contact: ${model?.contact ?? '-'}'.bodyText(context),
'Supplier Email: ${model?.email ?? '-'}'.bodyText(context),
if (model!.deliveryNoteAttachmentDto.isNotEmpty) ...[
const Divider().defaultStyle(context),
Text(
"Attachments".addTranslation,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
FilesList(images: model!.deliveryNoteAttachmentDto.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
], ],
).toShadowContainer(context, padding: 12), ],
], ).toShadowContainer(context, padding: 12),
).expanded, ],
if (model?.requestStatus?.value != null && model!.requestStatus!.value! < 3) ).expanded,
FooterActionButton.footerContainer( if (model?.requestStatus?.value != null && model!.requestStatus!.value! < 3)
context: context, FooterActionButton.footerContainer(
child: AppFilledButton( context: context,
buttonColor: AppColor.primary10, child: AppFilledButton(
label: model?.isSubmitted == true ? "Upload Delivery Note" : 'Update', buttonColor: AppColor.primary10,
onPressed: () async { label: model?.isSubmitted == true ? "Upload Delivery Note" : 'Update',
if (model?.isSubmitted == true) { onPressed: () async {
bool? isRefresh = await Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateDeliveryNotes(dataModel: model))); if (model?.isSubmitted == true) {
if (isRefresh == true) { bool? isRefresh = await Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateDeliveryNotes(dataModel: model)));
_loadData();
}
return;
}
bool? isRefresh = await Navigator.of(context).push(MaterialPageRoute(
builder: (_) => CreateMedicalGasRequestPage(
dataModel: model,
)));
if (isRefresh == true) { if (isRefresh == true) {
_loadData(); _loadData();
} }
}), return;
), }
], bool? isRefresh = await Navigator.of(context).push(MaterialPageRoute(
), builder: (_) => CreateMedicalGasRequestPage(
)); dataModel: model,
)));
if (isRefresh == true) {
_loadData();
}
}),
),
],
));
} }
Widget labelValueText(BuildContext context, String label, String? value) { Widget labelValueText(BuildContext context, String label, String? value) {

@ -1,5 +1,3 @@
import 'package:test_sa/models/base.dart'; import 'package:test_sa/models/base.dart';
class MedicalGasSupplierModel extends Base { class MedicalGasSupplierModel extends Base {
@ -15,7 +13,7 @@ class MedicalGasSupplierModel extends Base {
id = json['id']; id = json['id'];
identifier = id?.toString() ?? ''; identifier = id?.toString() ?? '';
supplier = json['supplier']; supplier = json['supplier'];
name=supplier; name = supplier;
supplierEmail = json['supplierEmail']; supplierEmail = json['supplierEmail'];
supplierContact = json['supplierContact']; supplierContact = json['supplierContact'];
if (json['attributeInfoDtos'] != null) { if (json['attributeInfoDtos'] != null) {
@ -41,16 +39,18 @@ class AttributeInfo {
int? id; int? id;
int? medicalGasAttributeId; int? medicalGasAttributeId;
num? requestedQuantity; num? requestedQuantity;
num? value;
String? itemName; String? itemName;
String? oracleName; String? oracleName;
String? oracleCode; String? oracleCode;
AttributeInfo({this.id, this.medicalGasAttributeId, this.requestedQuantity, this.itemName, this.oracleName, this.oracleCode}); AttributeInfo({this.id, this.medicalGasAttributeId, this.requestedQuantity, this.itemName, this.value, this.oracleName, this.oracleCode});
AttributeInfo.fromJson(Map<String, dynamic> json) { AttributeInfo.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
medicalGasAttributeId = json['medicalGasAttributeId']; medicalGasAttributeId = json['medicalGasAttributeId'];
requestedQuantity = json['requestedQuantity']; requestedQuantity = json['requestedQuantity'];
value = json['value'];
itemName = json['itemName']; itemName = json['itemName'];
oracleName = json['oracleName']; oracleName = json['oracleName'];
oracleCode = json['oracleCode']; oracleCode = json['oracleCode'];

@ -36,6 +36,8 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
late MedicalGasInspectionProvider medicalGasInspectionProvider; late MedicalGasInspectionProvider medicalGasInspectionProvider;
bool pressureTestAcknowledgement = false; bool pressureTestAcknowledgement = false;
bool leakTestAcknowledgement = false; bool leakTestAcknowledgement = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
// List<MedicalGasRequestDetailModel> selectedItemList = []; // List<MedicalGasRequestDetailModel> selectedItemList = [];
@ -56,7 +58,7 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
MedicalGasDataModel dataModel = widget.dataModel!; MedicalGasDataModel dataModel = widget.dataModel!;
formModel = DeliveryNotesFormModel( formModel = DeliveryNotesFormModel(
id: dataModel.id, id: dataModel.id,
deliveredItemList: dataModel.requestDetailDtos, deliveredItemList: dataModel.requestDetailDtos.where((item) => item.requestedQuantity! > 0).toList(),
isInspectedGasLeak: dataModel.isInspectedGasLeak, isInspectedGasLeak: dataModel.isInspectedGasLeak,
isPressureChecked: dataModel.isPressureChecked, isPressureChecked: dataModel.isPressureChecked,
deliveredDate: dataModel.deliveredDate, deliveredDate: dataModel.deliveredDate,
@ -78,7 +80,8 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
// _update(context: context); // _update(context: context);
// }, // },
), ),
body: SafeArea( body: Form(
key: _formKey,
child: Column( child: Column(
children: [ children: [
ListView( ListView(
@ -110,10 +113,10 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
AppTextFormField( AppTextFormField(
initialValue: formModel.deliveryNoteNumber, initialValue: formModel.deliveryNoteNumber,
labelText: "Delivery Notes", labelText: "Delivery Notes",
validator: (value) { // validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory"; // if ((value ?? "").isEmpty) return "Delivery Notes Required";
return null; // return null;
}, // },
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
@ -290,6 +293,24 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
} }
void _update({required BuildContext context, bool isSubmitted = false}) async { void _update({required BuildContext context, bool isSubmitted = false}) async {
if (!_formKey.currentState!.validate()) return;
if (formModel.deliveredDate == null) {
'Delivered Date Required'.addTranslation.showToast;
return;
}
if (formModel.deliveryNoteNumber == null) {
'Delivery Notes Required'.addTranslation.showToast;
return;
}
if (formModel.isPressureChecked == null || formModel.isPressureChecked == false) {
'Please acknowledge cylinders are tested for pressure'.addTranslation.showToast;
return;
}
if (formModel.isInspectedGasLeak == null || formModel.isInspectedGasLeak == false) {
'Please acknowledge cylinders have been inspected for leak test'.addTranslation.showToast;
return;
}
_formKey.currentState?.save();
formModel.gasDeliveredQuantityDtos = []; formModel.gasDeliveredQuantityDtos = [];
formModel.isSubmitted = isSubmitted; formModel.isSubmitted = isSubmitted;
for (var item in formModel.deliveredItemList) { for (var item in formModel.deliveredItemList) {
@ -331,7 +352,7 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
color: context.isDark ? Colors.white : AppColor.white936, color: context.isDark ? Colors.white : AppColor.white936,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
), ),
'Req Qty ${model.requestedQuantity}'.bodyText2(context).custom( 'Req Qty ${model.requestedQuantity?.toStringAsFixed(0)}'.bodyText2(context).custom(
color: context.isDark ? Colors.white : AppColor.white936, color: context.isDark ? Colors.white : AppColor.white936,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
), ),
@ -340,17 +361,49 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
right: TextFormField( right: TextFormField(
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
initialValue: model.deliveredQuantity != null ? model.deliveredQuantity?.toStringAsFixed(0) : '', initialValue: model.deliveredQuantity != null ? model.deliveredQuantity?.toStringAsFixed(0) : '',
validator: (value) {
if (value == null || value.trim().isEmpty) {
return "This field is required";
}
final intVal = int.tryParse(value);
if (intVal == null) {
return "Enter a valid number";
}
if (intVal <= 0) {
return "Value must be greater than 0";
}
return null;
},
decoration: InputDecoration( decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(horizontal: 5.toScreenWidth), isDense: true,
contentPadding: EdgeInsets.symmetric(
horizontal: 5.toScreenWidth,
vertical: 6, // keeps normal height ~30
),
filled: true, filled: true,
fillColor: AppColor.fieldBgColor(context), fillColor: AppColor.fieldBgColor(context),
constraints: BoxConstraints(
maxHeight: 30.toScreenHeight,
),
border: border, border: border,
enabledBorder: border, enabledBorder: border,
focusedBorder: border, focusedBorder: border,
errorStyle: const TextStyle(
height: 1.2, // controls extra height when error appears
fontSize: 12,
),
), ),
// decoration: InputDecoration(
// contentPadding: EdgeInsets.symmetric(horizontal: 5.toScreenWidth),
// filled: true,
// fillColor: AppColor.fieldBgColor(context),
// constraints: BoxConstraints(
// maxHeight: 40.toScreenHeight,
// ),
// border: border,
// enabledBorder: border,
// focusedBorder: border,
// ),
onChanged: (value) { onChanged: (value) {
model.deliveredQuantity = int.tryParse(value); model.deliveredQuantity = int.tryParse(value);
}, },
@ -371,7 +424,7 @@ class _ItemRowLayout extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Expanded(child: left), // Items column Expanded(child: left), // Items column
SizedBox( SizedBox(

@ -228,7 +228,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
requestId: widget.model.id!.toInt(), requestId: widget.model.id!.toInt(),
assigneeEmployeeNumber: _model!.senderAssignedEmployeeNumber, assigneeEmployeeNumber: _model!.senderAssignedEmployeeNumber,
myLoginUserID: context.userProvider.user!.employeeId ?? context.userProvider.user!.username!, myLoginUserID: context.userProvider.user!.employeeId ?? context.userProvider.user!.username!,
contactEmployeeINumber: _model!.assetTransferContactPersons!.first.employeeNumber, contactEmployeeINumber: _model!.assetTransferContactPersons!.first.employeeNumber ?? _model!.assetTransferContactPersons!.first.employeeNumber,
), ),
if ((_userProvider!.user?.type == UsersTypes.engineer)) if ((_userProvider!.user?.type == UsersTypes.engineer))
if (isCurrentEngineerEligibleForEdit && isCurrentRequestEditAble) if (isCurrentEngineerEligibleForEdit && isCurrentRequestEditAble)
@ -289,7 +289,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
requestId: widget.model.id!.toInt(), requestId: widget.model.id!.toInt(),
assigneeEmployeeNumber: isSender ? _deviceTransfer.senderAssignedEmployeeNumber! : _deviceTransfer.receiverAssignedEmployeeNumber!, assigneeEmployeeNumber: isSender ? _deviceTransfer.senderAssignedEmployeeNumber! : _deviceTransfer.receiverAssignedEmployeeNumber!,
myLoginUserID: context.userProvider.user!.employeeId ?? context.userProvider.user!.username!, myLoginUserID: context.userProvider.user!.employeeId ?? context.userProvider.user!.username!,
contactEmployeeINumber: _deviceTransfer.assetTransferContactPersons!.first.employeeNumber, contactEmployeeINumber: _model!.assetTransferContactPersons!.first.employeeNumber ?? _deviceTransfer.assetTransferContactPersons!.first.employeeNumber,
), ),
if ((_userProvider!.user?.type == UsersTypes.engineer)) if ((_userProvider!.user?.type == UsersTypes.engineer))
if (isCurrentEngineerEligibleForEdit && !isCurrentRequestClosed) if (isCurrentEngineerEligibleForEdit && !isCurrentRequestClosed)

@ -73,7 +73,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
requestId: widget.model.id!.toInt(), requestId: widget.model.id!.toInt(),
assigneeEmployeeNumber: _gasRefillModel.assignedEmployee?.employeeId!, assigneeEmployeeNumber: _gasRefillModel.assignedEmployee?.employeeId!,
myLoginUserID: context.userProvider.user!.employeeId ?? context.userProvider.user!.username!, myLoginUserID: context.userProvider.user!.employeeId ?? context.userProvider.user!.username!,
contactEmployeeINumber: _gasRefillModel.gasRefillContactPerson!.first.employeeCode!, contactEmployeeINumber: _gasRefillModel.gasRefillContactPerson!.first.employeeCode!,
); );
}) })
], ],

@ -63,6 +63,7 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
List<TimerHistoryModel> timerList = []; List<TimerHistoryModel> timerList = [];
static List<Lookup> deliveredQuantity = [ static List<Lookup> deliveredQuantity = [
Lookup(name: "0", id: 0, value: 0),
Lookup(name: "1", id: 1, value: 1), Lookup(name: "1", id: 1, value: 1),
Lookup(name: "2", id: 2, value: 2), Lookup(name: "2", id: 2, value: 2),
Lookup(name: "3", id: 3, value: 3), Lookup(name: "3", id: 3, value: 3),
@ -253,7 +254,6 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
8.height,
SingleItemDropDownMenu<Lookup, NullableLoadingProvider>( SingleItemDropDownMenu<Lookup, NullableLoadingProvider>(
context: context, context: context,
title: context.translation.quantity, title: context.translation.quantity,

@ -47,10 +47,10 @@ class _TaskRequestDetailsViewState extends State<TaskRequestDetailsView> {
@override @override
void initState() { void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
getTaskData(); getTaskData();
}); });
super.initState();
} }
@override @override

@ -3,6 +3,7 @@ import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
@ -35,6 +36,7 @@ import 'package:test_sa/providers/task_request_provider/task_job_provider.dart';
import 'package:test_sa/providers/task_request_provider/task_request_provider.dart'; import 'package:test_sa/providers/task_request_provider/task_request_provider.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
@ -65,6 +67,7 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
String comments = ''; String comments = '';
List<TimerHistoryModel> timerList = []; List<TimerHistoryModel> timerList = [];
double totalWorkingHours = 0; double totalWorkingHours = 0;
Uint8List? newSignature;
@override @override
void initState() { void initState() {
@ -152,12 +155,24 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
if (taskProvider.taskRequestModel?.taskType?.isRecallAndAlert == true) ...[ if (taskProvider.taskRequestModel?.taskType?.isRecallAndAlert == true) ...[
recallAlertTypeWidget(taskModel: taskProvider.taskRequestModel!), recallAlertTypeWidget(taskModel: taskProvider.taskRequestModel!),
], ],
// if (previousComments.isNotEmpty) ...[ //Not good approach need to use enums ....
// 'Previous Comments'.bodyText2(context).custom(color: AppColor.neutral50), if (taskProvider.taskRequestModel?.taskType?.typeName == "PullOut") ...[
// 8.height, ESignature(
title: "End-user signature",
backgroundColor: AppColor.fieldBgColor(context),
showShadow: false,
oldSignature: taskProvider.taskRequestModel?.signature,
newSignature: newSignature,
onSaved: (signature) {
newSignature = signature;
if (signature == null || signature.isEmpty) return;
taskProvider.taskRequestModel?.signature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
8.height,
],
buildPreviousComments(taskProvider: taskProvider), buildPreviousComments(taskProvider: taskProvider),
// 8.height,
// ],
AppTextFormField( AppTextFormField(
initialValue: "", initialValue: "",
labelText: context.translation.technicalComment, labelText: context.translation.technicalComment,
@ -186,7 +201,6 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
TaskRequestAssistantEmployeeList( TaskRequestAssistantEmployeeList(
assetId: taskProvider.taskRequestModel?.asset?.id, assetId: taskProvider.taskRequestModel?.asset?.id,
createdDate: widget.createdDate ?? '', createdDate: widget.createdDate ?? '',
//widget.requestDetails?.date
assistantEmployeeList: taskProvider.taskRequestModel?.taskJobAssistantEmployees, assistantEmployeeList: taskProvider.taskRequestModel?.taskJobAssistantEmployees,
cardPadding: 0, cardPadding: 0,
onListChanged: (updatedList) { onListChanged: (updatedList) {
@ -233,15 +247,9 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
void _updateTask({required BuildContext context, required int status}) async { void _updateTask({required BuildContext context, required int status}) async {
TaskRequestProvider taskRequestProvider = Provider.of<TaskRequestProvider>(context, listen: false); TaskRequestProvider taskRequestProvider = Provider.of<TaskRequestProvider>(context, listen: false);
_formKey.currentState?.save();
TaskData? taskModel = TaskData.copyWith(taskRequestProvider.taskRequestModel!); TaskData? taskModel = TaskData.copyWith(taskRequestProvider.taskRequestModel!);
taskModel?.statusValue = status; taskModel.statusValue = status;
// taskModel.taskTimePicker = taskRequestProvider.taskRequestModel?.taskTimePicker;
// taskModel.totalWorkingHours = taskRequestProvider.taskRequestModel?.totalWorkingHours;
// taskModel.taskTimerModel = taskRequestProvider.taskRequestModel?.taskTimerModel;
// taskModel.timerModelList = taskRequestProvider.taskRequestModel?.timerModelList;
if (validate(model: taskModel)) { if (validate(model: taskModel)) {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
@ -253,10 +261,10 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
taskAttachment.add(TaskJobAttachment(id: item.id, name: fileName)); taskAttachment.add(TaskJobAttachment(id: item.id, name: fileName));
} }
taskModel?.taskJobAttachments = taskAttachment; taskModel.taskJobAttachments = taskAttachment;
if (taskModel?.taskTimePicker != null) { if (taskModel.taskTimePicker != null) {
int durationInSecond = taskModel!.taskTimePicker!.endAt!.difference(taskModel.taskTimePicker!.startAt!).inSeconds; int durationInSecond = taskModel.taskTimePicker!.endAt!.difference(taskModel.taskTimePicker!.startAt!).inSeconds;
taskModel.taskJobActivityEngineerTimers?.add( taskModel.taskJobActivityEngineerTimers?.add(
TaskJobActivityEngineerTimer( TaskJobActivityEngineerTimer(
id: 0, id: 0,
@ -267,11 +275,10 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
), ),
); );
} }
taskModel.timerModelList?.forEach((timer) {
taskModel?.timerModelList?.forEach((timer) {
int durationInSecond = timer.endAt!.difference(timer.startAt!).inSeconds; int durationInSecond = timer.endAt!.difference(timer.startAt!).inSeconds;
taskModel.taskJobActivityEngineerTimers?.add( taskModel.taskJobActivityEngineerTimers?.add(
TaskJobActivityEngineerTimer ( TaskJobActivityEngineerTimer(
id: 0, startDate: timer.startAt!.toIso8601String(), endDate: timer.endAt?.toIso8601String(), totalWorkingHour: ((durationInSecond) / 60 / 60), comment: timer.comments ?? comments), id: 0, startDate: timer.startAt!.toIso8601String(), endDate: timer.endAt?.toIso8601String(), totalWorkingHour: ((durationInSecond) / 60 / 60), comment: timer.comments ?? comments),
); );
}); });

@ -117,6 +117,7 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
// trafRequest?.qty = 0; // trafRequest?.qty = 0;
} else if (requestType?.value == 2) { } else if (requestType?.value == 2) {
trafRequest?.assetNDId = null; trafRequest?.assetNDId = null;
trafRequest?.qty = 1;
} }
setState(() {}); setState(() {});
}, },
@ -133,6 +134,23 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
// setState(() {}); // setState(() {});
}, },
), ),
12.height,
AppTextFormField(
initialValue: trafRequest?.qty?.toString() ?? "",
makeMultiLinesNull: true,
labelText: "Quantity",
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.number,
onChange: (value) {
trafRequest?.qty = int.parse(value);
},
),
], ],
if (requestType?.value == 2) ...[ if (requestType?.value == 2) ...[
12.height, 12.height,

@ -18,6 +18,7 @@ class AppFilledButton extends StatelessWidget {
final bool showBorder; final bool showBorder;
final double radius; final double radius;
final int height; final int height;
final double? width;
final bool disableButton; final bool disableButton;
const AppFilledButton( const AppFilledButton(
@ -29,6 +30,7 @@ class AppFilledButton extends StatelessWidget {
this.fontSize, this.fontSize,
this.loading = false, this.loading = false,
this.height = 56, this.height = 56,
this.width,
this.showBorder = false, this.showBorder = false,
this.disableButton = false, this.disableButton = false,
this.buttonColor, this.buttonColor,
@ -41,7 +43,7 @@ class AppFilledButton extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
height: height.toScreenHeight, height: height.toScreenHeight,
width: maxWidth ? double.infinity : null, width: maxWidth ? double.infinity : width,
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),

@ -17,7 +17,7 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
final VoidCallback? onWillPopScope; final VoidCallback? onWillPopScope;
final TextStyle? titleStyle; final TextStyle? titleStyle;
const DefaultAppBar({this.title, this.onBackPress, this.onWillPopScope, this.actions,this.titleStyle, this.showHomeActionButton = false, this.showBackButton = true, Key? key}) : super(key: key); const DefaultAppBar({this.title, this.onBackPress, this.onWillPopScope, this.actions, this.titleStyle, this.showHomeActionButton = false, this.showBackButton = true, Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -43,30 +43,31 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
titleSpacing: 16, titleSpacing: 16,
title: Row( title: Row(
children: [ children: [
if(showBackButton) if (showBackButton)
const Icon(Icons.arrow_back_ios).onPress(() { const Icon(Icons.arrow_back_ios).onPress(() {
if (onWillPopScope != null) { if (onWillPopScope != null) {
showDialog( showDialog(
context: context, context: context,
builder: (BuildContext cxt) => AcknowledgeWorkDialog( builder: (BuildContext cxt) => AcknowledgeWorkDialog(
onSave: onWillPopScope!, onSave: onWillPopScope!,
onDiscard: () { onDiscard: () {
Navigator.of(cxt).pop(); Navigator.of(cxt).pop();
}, },
), ),
); );
return; return;
} }
if (onBackPress != null) { if (onBackPress != null) {
onBackPress!(); onBackPress!();
} else { } else {
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
}), }),
10.width, 10.width,
Text( Text(
title ?? "", title ?? "",
style:titleStyle?? AppTextStyles.heading3.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: titleStyle ??
(context.isTablet() ? AppTextStyles.heading4 : AppTextStyles.heading3).copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
).expanded, ).expanded,
], ],
), ),

@ -117,11 +117,9 @@ class CreateRequestModel {
if (context.userProvider.isQualityUser && context.settingProvider.isUserFlowMedical) { if (context.userProvider.isQualityUser && context.settingProvider.isUserFlowMedical) {
list.add(CreateRequestModel("Equipment Internal Audit Checklist".addTranslation, "add_icon", CreateEquipmentInternalAuditForm.id)); list.add(CreateRequestModel("Equipment Internal Audit Checklist".addTranslation, "add_icon", CreateEquipmentInternalAuditForm.id));
list.add(CreateRequestModel("System Internal Audit Checklist".addTranslation, "add_icon", CreateSystemInternalAuditForm.id)); list.add(CreateRequestModel("System Internal Audit Checklist".addTranslation, "add_icon", CreateSystemInternalAuditForm.id));
} } else if (context.userProvider.isAssessor && context.settingProvider.isUserFlowMedical) {
// else if (context.userProvider.isAssessor) { list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id));
// list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id)); } else if (context.userProvider.isEngineer) {
// }
else if (context.userProvider.isEngineer) {
if (Provider.of<SettingProvider>(context, listen: false).engineerCanCreateCM) { if (Provider.of<SettingProvider>(context, listen: false).engineerCanCreateCM) {
list.add(CreateRequestModel(context.translation.correctiveMaintenance, "add_icon", CreateCMRequest.id)); list.add(CreateRequestModel(context.translation.correctiveMaintenance, "add_icon", CreateCMRequest.id));
} }
@ -129,16 +127,18 @@ class CreateRequestModel {
//TODO uncommit this to enable task. //TODO uncommit this to enable task.
list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id)); list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id));
//Need to add check from permission Api. //Need to add check from permission Api.
// if (Provider.of<SettingProvider>(context, listen: false).engineerCanCreateCM) { if ((context.settingProvider.isUserFlowMedical)) {
list.add(CreateRequestModel('Medical Gas Inspection'.addTranslation, "add_icon", CreateMedicalGasRequestPage.id)); list.add(CreateRequestModel('Medical Gas'.addTranslation, "add_icon", CreateMedicalGasRequestPage.id));
// } }
} else { } else {
list.add(CreateRequestModel(context.translation.correctiveMaintenance, "add_icon", CreateCMRequest.id)); list.add(CreateRequestModel(context.translation.correctiveMaintenance, "add_icon", CreateCMRequest.id));
list.add(CreateRequestModel(context.translation.gasRefill, "add_icon", GasRefillRequestForm.routeName)); list.add(CreateRequestModel(context.translation.gasRefill, "add_icon", GasRefillRequestForm.routeName));
list.add(CreateRequestModel(context.translation.transferAsset, "add_icon", CreateDeviceTransferRequest.id)); list.add(CreateRequestModel(context.translation.transferAsset, "add_icon", CreateDeviceTransferRequest.id));
//TODO uncommit this to enable task. //TODO uncommit this to enable task.
list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id)); list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id));
// list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id)); if ((context.settingProvider.isUserFlowMedical)) {
list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id));
}
list.add(CreateRequestModel('Loan Equipment Request'.addTranslation, "add_icon", CreateLoanRequestPage.id)); list.add(CreateRequestModel('Loan Equipment Request'.addTranslation, "add_icon", CreateLoanRequestPage.id));
list.add(CreateRequestModel('Demo Request'.addTranslation, "add_icon", CreateDemoRequestPage.id)); list.add(CreateRequestModel('Demo Request'.addTranslation, "add_icon", CreateDemoRequestPage.id));
} }

@ -96,19 +96,19 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
} }
}); });
//Hide traf //Hide traf
// if (!isEngineer) { if (!isEngineer && context.settingProvider.isUserFlowMedical) {
// types['TRAF'] = 9; types['TRAF'] = 9;
// } }
// if (context.userProvider.isAssessor) { if (context.settingProvider.isUserFlowMedical && context.userProvider.isAssessor) {
// types = {"TRAF": 9}; types = {"TRAF": 9};
// } }
if (context.userProvider.isQualityUser) { if (context.userProvider.isQualityUser) {
if (context.settingProvider.isUserFlowMedical) types = {'Recall and Alert': 7}; if (context.settingProvider.isUserFlowMedical) types = {'Recall and Alert': 7};
if (context.settingProvider.isUserFlowMedical) types['Equipment Internal Audit'] = 10; if (context.settingProvider.isUserFlowMedical) types['Equipment Internal Audit'] = 10;
if (context.settingProvider.isUserFlowMedical) types['System Internal Audit'] = 11; if (context.settingProvider.isUserFlowMedical) types['System Internal Audit'] = 11;
} }
if (context.userProvider.isCommissioningEngineer) { if (context.userProvider.isCommissioningEngineer && context.settingProvider.isUserFlowMedical) {
///TODO need to check what other requests type needed here. ///TODO need to check what other requests type needed here.
types = { types = {
'Asset Delivery': 13, 'Asset Delivery': 13,

@ -63,10 +63,10 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
} }
}); });
//Hide TRAF. //Hide TRAF.
// if (context.userProvider.user!.type == UsersTypes.normal_user) { if (context.settingProvider.isUserFlowMedical && context.userProvider.user!.type == UsersTypes.normal_user) {
// requestsList.add(Request(9, 'TRAF')); requestsList.add(Request(9, 'TRAF'));
// } }
if (context.userProvider.isEngineer &&context.settingProvider.isUserFlowMedical) { if (context.userProvider.isEngineer && context.settingProvider.isUserFlowMedical) {
requestsList.add(Request(10, 'Equipment Internal Audit')); requestsList.add(Request(10, 'Equipment Internal Audit'));
requestsList.add(Request(11, 'System Internal Audit')); requestsList.add(Request(11, 'System Internal Audit'));
//Need to be added for new user role commissioning engineer //Need to be added for new user role commissioning engineer
@ -80,12 +80,11 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
requestsList = [ requestsList = [
Request(null, context.translation.allWorkOrder), Request(null, context.translation.allWorkOrder),
Request(9, 'TRAF'),
Request(15, 'Demo Request'), Request(15, 'Demo Request'),
// Request(9, 'TRAF'),
]; ];
} }
if (context.userProvider.isCommissioningEngineer) { if (context.userProvider.isCommissioningEngineer && context.settingProvider.isUserFlowMedical) {
///TODO need to show only allowed ids for all workOrder ///TODO need to show only allowed ids for all workOrder
requestsList = [ requestsList = [
Request(null, context.translation.allWorkOrder), Request(null, context.translation.allWorkOrder),
@ -96,8 +95,8 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
requestsList = [ requestsList = [
Request(null, context.translation.allWorkOrder), Request(null, context.translation.allWorkOrder),
if (context.settingProvider.isUserFlowMedical) Request(7, 'Recall and Alert'), if (context.settingProvider.isUserFlowMedical) Request(7, 'Recall and Alert'),
if (context.settingProvider.isUserFlowMedical) Request(10, 'Equipment Internal Audit'), if (context.settingProvider.isUserFlowMedical) Request(10, 'Equipment Internal Audit'),
if (context.settingProvider.isUserFlowMedical) Request(11, 'System Internal Audit'), if (context.settingProvider.isUserFlowMedical) Request(11, 'System Internal Audit'),
]; ];
} }
@ -115,7 +114,7 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Container( Container(
height: 40, height: 40.toScreenHeight,
padding: const EdgeInsets.only(left: 16, right: 8), padding: const EdgeInsets.only(left: 16, right: 8),
alignment: Alignment.center, alignment: Alignment.center,
decoration: ShapeDecoration( decoration: ShapeDecoration(

@ -6,28 +6,13 @@ import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/providers/api/hospitals_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
import 'package:test_sa/models/new_models/department.dart'; import 'package:test_sa/models/new_models/department.dart';
import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/new_models/floor.dart';
import 'package:test_sa/models/new_models/site.dart'; import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/models/new_models/task_request/task_request_model.dart'; import 'package:test_sa/models/new_models/task_request/task_request_model.dart';
import 'package:test_sa/models/new_models/task_request/task_type_model.dart';
import 'package:test_sa/models/service_request/pending_service_request_model.dart';
import 'package:test_sa/models/service_request/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/service_request/spare_parts.dart';
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_engineer_model.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import '../../models/service_request/search_work_order.dart';
import '../../models/service_request/wo_call_request.dart';
import '../../models/user.dart';
import '../../new_views/common_widgets/app_lazy_loading.dart'; import '../../new_views/common_widgets/app_lazy_loading.dart';
class TaskRequestProvider extends ChangeNotifier { class TaskRequestProvider extends ChangeNotifier {

@ -4,6 +4,7 @@ import 'package:signature/signature.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
@ -16,10 +17,12 @@ class ESignature extends StatefulWidget {
final Function(Uint8List?)? onSaved; final Function(Uint8List?)? onSaved;
final Color? backgroundColor; final Color? backgroundColor;
final Function(Uint8List)? onChange; final Function(Uint8List)? onChange;
final bool editable;
final bool showShadow; final bool showShadow;
final String title; final String title;
const ESignature({Key? key, required this.title, required this.oldSignature, this.backgroundColor, this.onSaved, this.onChange, this.showShadow = true, required this.newSignature}) const ESignature(
{Key? key, required this.title, required this.oldSignature, this.backgroundColor, this.onSaved, this.onChange, this.editable = true, this.showShadow = true, required this.newSignature})
: super(key: key); : super(key: key);
@override @override
@ -39,7 +42,6 @@ class _ESignatureState extends State<ESignature> {
if (widget.newSignature != null) { if (widget.newSignature != null) {
signature = widget.newSignature; signature = widget.newSignature;
} }
super.initState(); super.initState();
} }
@ -69,54 +71,70 @@ class _ESignatureState extends State<ESignature> {
borderRadius: _editable ? const BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10)) : BorderRadius.circular(10), borderRadius: _editable ? const BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10)) : BorderRadius.circular(10),
boxShadow: widget.showShadow ? [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)] : null, boxShadow: widget.showShadow ? [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)] : null,
), ),
child: Column( child: widget.editable == false
crossAxisAlignment: CrossAxisAlignment.center, ? Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
Row( children: [
crossAxisAlignment: CrossAxisAlignment.start, Text(
mainAxisAlignment: MainAxisAlignment.spaceBetween, 'Signature'.addTranslation,
children: [ style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
widget.title.tinyFont(context).paddingOnly(top: 8), ),
(!_editable Container(
? "edit".toSvgAsset(width: 48).paddingOnly(top: 8)
: Container(
width: 48.toScreenWidth,
height: 48.toScreenWidth,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(color: AppColor.neutral30)),
padding: const EdgeInsets.all(11),
margin: const EdgeInsets.only(top: 8),
child: "done".toSvgAsset(width: 26),
))
.onPress(() async {
if (_editable) {
signature = await _controller!.toPngBytes();
if (widget.onChange != null && signature != null) {
widget.onChange!(signature!);
}
}
_editable = !_editable;
setState(() {});
}),
],
),
((widget.oldSignature != null || signature != null) && !_editable)
? Container(
height: 135.toScreenHeight, height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
padding: const EdgeInsets.only(bottom: 8), padding: const EdgeInsets.only(bottom: 8),
child: signature != null ? Image.memory(signature!) : ImageLoader(showDefaultIcon: true, boxFit: BoxFit.contain, url: URLs.getFileUrl(widget.oldSignature) ?? ''), child: signature != null ? Image.memory(signature!) : ImageLoader(showDefaultIcon: true, boxFit: BoxFit.contain, url: URLs.getFileUrl(widget.oldSignature) ?? ''),
)
: AbsorbPointer(
absorbing: !_editable,
child: Signature(
controller: _controller!,
height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width - 64.toScreenWidth,
backgroundColor: Colors.transparent,
),
), ),
], ],
), )
: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
widget.title.tinyFont(context).paddingOnly(top: 8),
(!_editable
? "edit".toSvgAsset(width: 48).paddingOnly(top: 8)
: Container(
width: 48.toScreenWidth,
height: 48.toScreenWidth,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(color: AppColor.neutral30)),
padding: const EdgeInsets.all(11),
margin: const EdgeInsets.only(top: 8),
child: "done".toSvgAsset(width: 26),
))
.onPress(() async {
if (_editable) {
signature = await _controller!.toPngBytes();
if (widget.onChange != null && signature != null) {
widget.onChange!(signature!);
}
}
_editable = !_editable;
setState(() {});
}),
],
),
((widget.oldSignature != null || signature != null) && !_editable)
? Container(
height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width,
padding: const EdgeInsets.only(bottom: 8),
child: signature != null ? Image.memory(signature!) : ImageLoader(showDefaultIcon: true, boxFit: BoxFit.contain, url: URLs.getFileUrl(widget.oldSignature) ?? ''),
)
: AbsorbPointer(
absorbing: !_editable,
child: Signature(
controller: _controller!,
height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width - 64.toScreenWidth,
backgroundColor: Colors.transparent,
),
),
],
),
), ),
if (_editable) if (_editable)
Container( Container(

@ -62,7 +62,7 @@ class AssetPicker extends StatelessWidget {
children: [ children: [
if (device == null && deviceList.isEmpty) if (device == null && deviceList.isEmpty)
Container( Container(
height: 50, height: 50.toScreenHeight,
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
color: buttonColor ?? backgroundColor ?? AppColor.blueStatus(context), color: buttonColor ?? backgroundColor ?? AppColor.blueStatus(context),

@ -1,15 +1,19 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart'; import 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/tm_module/device_transfer/search_device_page.dart'; import 'package:test_sa/modules/tm_module/device_transfer/search_device_page.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import '../../../controllers/providers/api/devices_provider.dart'; import '../../../controllers/providers/api/devices_provider.dart';
@ -32,6 +36,7 @@ class _AssetScanQrState extends State<AssetScanQr> {
// Barcode result; // Barcode result;
QRViewController? _controller; QRViewController? _controller;
bool _scanDone = false; bool _scanDone = false;
bool _scanning = false;
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR_scanner'); final GlobalKey qrKey = GlobalKey(debugLabel: 'QR_scanner');
late AssetProvider _devicesProvider; late AssetProvider _devicesProvider;
@ -93,7 +98,14 @@ class _AssetScanQrState extends State<AssetScanQr> {
_scanDone = false; _scanDone = false;
} }
} else { } else {
_controller?.pauseCamera();
setState(() {
_scanning = true;
});
final result = await _getDevice(scanData.code!, isQr: true); final result = await _getDevice(scanData.code!, isQr: true);
setState(() {
_scanning = false;
});
if (result.isNotEmpty) { if (result.isNotEmpty) {
if (widget.multiSelection) { if (widget.multiSelection) {
Navigator.of(context).pop(<Asset>[result[0]]); Navigator.of(context).pop(<Asset>[result[0]]);
@ -101,6 +113,8 @@ class _AssetScanQrState extends State<AssetScanQr> {
Navigator.of(context).pop(result[0]); Navigator.of(context).pop(result[0]);
} }
} else { } else {
Utils.showToast("No Item Found. Try Again", toastGravity: ToastGravity.CENTER);
_controller?.resumeCamera();
_scanDone = false; _scanDone = false;
} }
} }
@ -115,6 +129,14 @@ class _AssetScanQrState extends State<AssetScanQr> {
fit: BoxFit.fitHeight, fit: BoxFit.fitHeight,
), ),
), ),
if (_scanning)
Container(
width: 56.toScreenHeight,
height: 56.toScreenHeight,
padding: const EdgeInsets.all(8),
decoration: const BoxDecoration(shape: BoxShape.circle, color: Colors.white),
child: const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3),
).center
], ],
).expanded, ).expanded,
if (widget.enablePickManually) if (widget.enablePickManually)

@ -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. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.5.0+32 version: 1.6.0+33
environment: environment:
sdk: ">=3.5.0 <4.0.0" sdk: ">=3.5.0 <4.0.0"

Loading…
Cancel
Save