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 4 days 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());

@ -30,7 +30,7 @@ class AssetDeliveryAttachmentView extends StatefulWidget {
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,6 +106,7 @@ class _AssetDeliveryAttachmentViewState extends State<AssetDeliveryAttachmentVie
], ],
), ),
), ),
if (widget.attachmentType == 5 && !widget.viewOnly)
FooterActionButton.footerContainer( FooterActionButton.footerContainer(
context: context, context: context,
child: AppFilledButton( child: AppFilledButton(

@ -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,10 +79,12 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
), ),
]); ]);
model = results[0] as DeliveryInspectionFormModel; model = results[0] as DeliveryInspectionFormModel;
if (mounted) {
setState(() { setState(() {
isLoading = false; isLoading = false;
}); });
} }
}
@override @override
void dispose() { void dispose() {
@ -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(
@ -109,25 +107,7 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (!viewOnly) ...[inspectionDetailsForm()] else ...[inspectionDetails()], if (!viewOnly) ...[inspectionDetailsForm()] else ...[inspectionDetails()],
8.height, 20.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,
),
),
// 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( Text(
"Lines", "Lines",
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10), style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
@ -135,12 +115,13 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
8.height, 8.height,
linesList(context), linesList(context),
], ],
).toShadowContainer(context, borderRadius: 20, padding: 12)) )).expanded,
.expanded,
FooterActionButton.footerContainer( FooterActionButton.footerContainer(
context: context, context: context,
child: !viewOnly child: !viewOnly
? Column( ? Column(
children: [
Row(
children: [ children: [
AppFilledButton( AppFilledButton(
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
@ -148,8 +129,12 @@ class _DeliveryInspectionFormViewState extends State<DeliveryInspectionFormView>
maxWidth: true, maxWidth: true,
onPressed: () { onPressed: () {
HelperFunction.attachmentTap(context: context, assetDeliveryProvider: assetDeliveryProvider!, deliveryTableItemId: widget.deliveryTableModel.id); HelperFunction.attachmentTap(context: context, assetDeliveryProvider: assetDeliveryProvider!, deliveryTableItemId: widget.deliveryTableModel.id);
}), }).expanded,
16.height, 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,14 +101,16 @@ class _InspectionPersonBottomSheetState extends State<InspectionPersonBottomShee
setState(() {}); setState(() {});
}, },
), ),
12.height, 8.height,
Row(
children: [
AppTextFormField( AppTextFormField(
labelText: 'Email'.addTranslation, labelText: 'Email'.addTranslation,
controller: emailController, controller: emailController,
textInputType: TextInputType.emailAddress, textInputType: TextInputType.emailAddress,
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
showShadow: false, showShadow: false,
enable: widget.isHmg?false:true, enable: widget.isHmg ? false : true,
textAlign: TextAlign.center, textAlign: TextAlign.center,
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
@ -110,30 +119,72 @@ class _InspectionPersonBottomSheetState extends State<InspectionPersonBottomShee
_model.email = v; _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,8 +55,7 @@ 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: [
@ -103,9 +110,9 @@ class _AssetDeliveryHistoryLogViewState extends State<AssetDeliveryHistoryLogVie
}), }),
), ),
], ],
),
); );
}), }
);}
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) {

@ -118,10 +118,8 @@ class _UpdateParentAssetViewState extends State<UpdateParentAssetView> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
inspectionDetailsForm(lineId: widget.lineId, provider: provider), inspectionDetailsForm(lineId: widget.lineId, provider: provider).toShadowContainer(context, borderRadius: 20, padding: 12),
8.height, 20.height,
const Divider().defaultStyle(context),
8.height,
Row( Row(
children: [ children: [
Text( Text(
@ -134,14 +132,13 @@ class _UpdateParentAssetViewState extends State<UpdateParentAssetView> {
}), }),
], ],
), ),
8.height, 16.height,
childList( childList(
context: context, context: context,
provider: provider, provider: provider,
) )
], ],
).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)),
], ],
); );
@ -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) {

@ -91,22 +91,25 @@ class _UpdateTechnicalInspectionLinesViewState extends State<UpdateTechnicalInsp
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), ).toShadowContainer(context, borderRadius: 20, padding: 12),
20.height,
Text( Text(
"Cost Centers", "Cost Centers",
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,
costCenterList(context), costCenterList(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)),
], ],
), ),

@ -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,
width: 24,
),
onPressed: () { onPressed: () {
ServiceRequestBottomSheet.getQRCodeBottomSheet(context: context); ServiceRequestBottomSheet.getQRCodeBottomSheet(context: context);
}, },
) )
: IconButton( else ...[
Selector<CMDetailProvider, bool>(
selector: (_, myModel) => myModel.isLoading, // Selects only the userName
builder: (_, isLoading, __) {
if (isLoading) {
return const SizedBox();
} else {
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), icon: const Icon(Icons.home),
onPressed: () { onPressed: () {
// stopTimer(); // stopTimer();
Navigator.pop(context); 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,8 +439,97 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
List<Widget> vendorDetailsSection() { List<Widget> vendorDetailsSection() {
return [ return [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), 'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10),
Row(
children: [
Container(
height: 24,
width: 24,
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: AppColor.primary10, // or AppColor.blueStatus(context)
),
alignment: Alignment.center,
child: Icon(
!_loanFormModel.isNewVendor ? Icons.add : Icons.search,
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,
if (!_loanFormModel.isNewVendor) ...[
SingleItemDropDownMenu<SupplierDetails, VendorProvider>(
context: context,
title: 'Vendor Name'.addTranslation,
backgroundColor: AppColor.fieldBgColor(context),
initialValue: _loanFormModel.supplier,
showAsBottomSheet: true,
validator: (value) {
if (value == null) return "Please select vendor name";
return null;
},
showShadow: false,
showCancel: true,
onSelect: (person) {
_loanFormModel.supplier = person;
_loanFormModel.vendorName = person?.name;
_loanFormModel.supEngineer = null;
_loanFormModel.vendorRepresentativeName = null;
vendorPhoneController.text = person?.contact ?? '';
vendorEmailController.text = person?.email ?? '';
setState(() {});
},
),
8.height, 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( AppTextFormField(
initialValue: "", initialValue: "",
labelText: "Vendor Name", labelText: "Vendor Name",
@ -454,9 +565,10 @@ class _CreateLoanRequestPageState extends State<CreateLoanRequestPage> with Tick
_loanFormModel.vendorRepresentativeName = 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,8 +53,7 @@ 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
@ -135,7 +134,6 @@ class _MedicalGasInspectionDetailPageState extends State<MedicalGasInspectionDet
}), }),
), ),
], ],
),
)); ));
} }

@ -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)

@ -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,7 +43,7 @@ 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(
@ -66,7 +66,8 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
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),
@ -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,7 +71,23 @@ 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
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Signature'.addTranslation,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
),
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) ?? ''),
),
],
)
: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Row( Row(

@ -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