diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index e0820b57..84b68233 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -3,13 +3,13 @@ class URLs { static const String appReleaseBuildNumber = "44"; - // 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://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 final String _baseUrl = "$_host/mobile"; // host local UAT // static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis - // 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/v6/mobile"; // for asset delivery module diff --git a/lib/modules/cm_module/views/components/service_request_detail_view.dart b/lib/modules/cm_module/views/components/service_request_detail_view.dart index 026fac67..8bc088b8 100644 --- a/lib/modules/cm_module/views/components/service_request_detail_view.dart +++ b/lib/modules/cm_module/views/components/service_request_detail_view.dart @@ -20,6 +20,7 @@ import 'package:test_sa/modules/cm_module/views/forms/asset_retired/asset_retire import 'package:test_sa/modules/cm_module/views/forms/cost/cost_detail_form_screen.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/views/widgets/equipment/asset_detail_page.dart'; import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; @@ -73,43 +74,43 @@ class _ServiceRequestDetailViewState extends State { : requestProvider.currentWorkOrder == null ? const NoDataFound() : Column( - children: [ - SingleChildScrollView( - padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - workOrderDetailCard(context, requestProvider.currentWorkOrder!.data!, _userProvider, requestProvider), - initialVisitCard(requestDetailProvider: requestProvider, userProvider: _userProvider), - 12.height, - assetDetailCard(requestDetailProvider: requestProvider, userProvider: _userProvider), - 12.height, - if (context.userProvider.user!.type == UsersTypes.engineer && - !requestProvider.isReadOnlyRequest && - requestProvider.currentWorkOrder!.data!.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.activity) ...[ - costCard(context, requestProvider), + children: [ + SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + workOrderDetailCard(context, requestProvider.currentWorkOrder!.data!, _userProvider, requestProvider), + initialVisitCard(requestDetailProvider: requestProvider, userProvider: _userProvider), 12.height, + assetDetailCard(requestDetailProvider: requestProvider, userProvider: _userProvider), + 12.height, + if (context.userProvider.user!.type == UsersTypes.engineer && + !requestProvider.isReadOnlyRequest && + requestProvider.currentWorkOrder!.data!.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.activity) ...[ + costCard(context, requestProvider), + 12.height, + ], + contactInfoCard(context, requestProvider.currentWorkOrder!.data!), + 20.height, ], - contactInfoCard(context, requestProvider.currentWorkOrder!.data!), - 20.height, - ], - ), - ).expanded, - SafeArea( - top: false, - right: false, - left: false, - child: FooterActionButton.requestDetailsFooterWidget( - workOrderNextStepStatus: requestProvider.currentWorkOrder!.data!.nextStep!.workOrderNextStepEnum!, - status: requestProvider.currentWorkOrder?.data?.status, - isEmpIsAssigned: requestProvider.currentWorkOrder!.data!.assignedEmployee != null, - activities: requestProvider.currentWorkOrder!.data?.activities ?? [], - userProvider: _userProvider, - context: context), - ).toShadowContainer(context, padding: 0, showShadow: false, borderRadius: 0), - ], - ); + ), + ).expanded, + SafeArea( + top: false, + right: false, + left: false, + child: FooterActionButton.requestDetailsFooterWidget( + workOrderNextStepStatus: requestProvider.currentWorkOrder!.data!.nextStep!.workOrderNextStepEnum!, + status: requestProvider.currentWorkOrder?.data?.status, + isEmpIsAssigned: requestProvider.currentWorkOrder!.data!.assignedEmployee != null, + activities: requestProvider.currentWorkOrder!.data?.activities ?? [], + userProvider: _userProvider, + context: context), + ).toShadowContainer(context, padding: 0, showShadow: false, borderRadius: 0), + ], + ); }); } @@ -135,7 +136,7 @@ class _ServiceRequestDetailViewState extends State { // spacing: 8, runSpacing: 8, children: [ - if (Provider.of(context, listen: false).showPriority&&workOrder.priority!=null) ...[ + if (Provider.of(context, listen: false).showPriority && workOrder.priority != null) ...[ StatusLabel( label: workOrder.priority?.name, id: workOrder.priority?.value, @@ -190,9 +191,19 @@ class _ServiceRequestDetailViewState extends State { ], ), 8.height, - Text( - context.translation.assetInformation, - style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + Row( + spacing: 4, + children: [ + Flexible( + child: Text( + context.translation.assetInformation, + style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + ), + const Icon(Icons.open_in_new_rounded, color: AppColor.primary10, size: 21).onPress(() { + Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: workOrder.asset!.id); + }) + ], ), 8.height, Text( diff --git a/lib/views/widgets/dialogs/loading_dialog.dart b/lib/views/widgets/dialogs/loading_dialog.dart index 1a72e452..a8a6880e 100644 --- a/lib/views/widgets/dialogs/loading_dialog.dart +++ b/lib/views/widgets/dialogs/loading_dialog.dart @@ -9,26 +9,29 @@ class UploadingDialog extends StatelessWidget { @override Widget build(BuildContext context) { return Center( - child: Container( - height: 150.toScreenWidth, - width: 200.toScreenWidth, - alignment: Alignment.center, - padding: const EdgeInsets.all(8), - decoration: BoxDecoration( - color: AppColor.neutral30, - borderRadius: BorderRadius.circular(20.0), - boxShadow: [AppStyle.boxShadow], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const CircularProgressIndicator(strokeWidth: 3), - 16.height, - Text( - "Uploading...", - style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: AppColor.textColor(context), height: 35 / 24, letterSpacing: -0.96), - ) - ], + child: Material( + borderRadius: BorderRadius.circular(20.0), + child: Container( + height: 150.toScreenWidth, + width: 200.toScreenWidth, + alignment: Alignment.center, + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: AppColor.neutral30, + borderRadius: BorderRadius.circular(20.0), + boxShadow: [AppStyle.boxShadow], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const CircularProgressIndicator(strokeWidth: 3), + 16.height, + Text( + "Uploading...", + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: AppColor.textColor(context), height: 35 / 24, letterSpacing: -0.96), + ) + ], + ), ), ), ); diff --git a/lib/views/widgets/equipment/asset_detail_page.dart b/lib/views/widgets/equipment/asset_detail_page.dart index 5beea1c5..151df55e 100644 --- a/lib/views/widgets/equipment/asset_detail_page.dart +++ b/lib/views/widgets/equipment/asset_detail_page.dart @@ -7,6 +7,7 @@ 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/helper/utils.dart'; import 'package:test_sa/models/device/asset_by_id_model.dart'; import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; @@ -168,7 +169,7 @@ class _AssetDetailPageState extends State { context: context, child: AppFilledButton( buttonColor: AppColor.primary10, - label: "Upload Images", + label: "Upload Images (AI Training)", onPressed: _upload, ), ), diff --git a/lib/views/widgets/equipment/asset_image_upload_page.dart b/lib/views/widgets/equipment/asset_image_upload_page.dart index 314a7b65..cd0caae9 100644 --- a/lib/views/widgets/equipment/asset_image_upload_page.dart +++ b/lib/views/widgets/equipment/asset_image_upload_page.dart @@ -10,6 +10,7 @@ import 'package:test_sa/modules/cm_module/views/components/action_button/footer_ 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/default_app_bar.dart'; +import 'package:test_sa/views/widgets/dialogs/dialog.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; class AssetImageUploadPage extends StatefulWidget { @@ -30,6 +31,7 @@ class _AssetImageUploadPageState extends State { @override void initState() { super.initState(); + // attachments = widget.attachments; } @override @@ -47,10 +49,11 @@ class _AssetImageUploadPageState extends State { padding: const EdgeInsets.all(16), children: [ AttachmentPicker( - label: "Upload Images", + label: "Import", attachment: attachments, buttonColor: AppColor.black10, onlyImages: true, + pickMultiple: true, showAsListView: true, buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120), onChange: (_attachments) { @@ -64,13 +67,22 @@ class _AssetImageUploadPageState extends State { context: context, child: AppFilledButton( buttonColor: AppColor.primary10, + disableButton: attachments.length < 4, label: "Upload Images", onPressed: () async { - Utils.showUploadingDialog(context); - bool result = await Provider.of(context, listen: false).uploadAssetImages(widget.assetId, attachments); - Utils.hideLoading(context); + bool result = await showDialog( + context: context, + builder: (_) => AAlertDialog( + title: context.translation.confirm, + content: "For more enhancement, these images will be used to train AI model.\n\nAre you sure you are uploading clear and high quality images?"), + ); if (result) { - Navigator.pop(context, result); + Utils.showUploadingDialog(context); + result = await Provider.of(context, listen: false).uploadAssetImages(widget.assetId, attachments); + Utils.hideLoading(context); + if (result) { + Navigator.pop(context, result); + } } }, ), diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index a7de6c03..cead4b1a 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -322,6 +322,7 @@ class AttachmentPicker extends StatefulWidget { final Function(List)? onChange; final bool showAsGrid; final bool showAsListView; + final bool pickMultiple; Lookup? documentType; AttachmentPicker( @@ -337,6 +338,7 @@ class AttachmentPicker extends StatefulWidget { this.documentType, this.showAsGrid = false, this.showAsListView = false, + this.pickMultiple = false, this.buttonColor}) : super(key: key); @@ -348,7 +350,8 @@ class _AttachmentPickerState extends State { @override Widget build(BuildContext context) { return Column( - crossAxisAlignment: CrossAxisAlignment.start,spacing: 12, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12, children: [ AppDashedButton( title: widget.label, @@ -465,16 +468,21 @@ class _AttachmentPickerState extends State { ).paddingAll(21), )) as ImageSource; - final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800); + // if(widget.pickMultiple) { + final pickedFile12 = await ImagePicker().pickMultiImage(imageQuality: 70, maxWidth: 800, maxHeight: 800); - if (pickedFile != null) { - File fileImage = File(pickedFile.path); - widget.attachment.add(GenericAttachmentModel(id: 0, name: fileImage.path, documentTypeId: widget.documentType)); - if (widget.onChange != null) { - widget.onChange!(widget.attachment); - } - setState(() {}); - } + // // } + // + // final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800); + // + // if (pickedFile != null) { + // File fileImage = File(pickedFile.path); + // widget.attachment.add(GenericAttachmentModel(id: 0, name: fileImage.path, documentTypeId: widget.documentType)); + // if (widget.onChange != null) { + // widget.onChange!(widget.attachment); + // } + // setState(() {}); + // } } Widget gridItem(IconData iconData, String title) { @@ -632,6 +640,20 @@ class _AttachmentPickerState extends State { // ); if (source == null) return; + if (widget.pickMultiple && source == ImageSource.gallery) { + final pickedFiles = await ImagePicker().pickMultiImage(imageQuality: 70, maxWidth: 800, maxHeight: 800); + if (pickedFiles.isNotEmpty) { + pickedFiles.forEach((pickedFile) { + File fileImage = File(pickedFile.path); + widget.attachment.add(GenericAttachmentModel(id: 0, name: fileImage.path, documentTypeId: widget.documentType)); + }); + if (widget.onChange != null) { + widget.onChange!(widget.attachment); + } + setState(() {}); + return; + } + } final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800); if (pickedFile != null) {