From 40690d6551b1530bca94e704fff0da2cdf94aa87 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 29 Jun 2026 15:06:34 +0300 Subject: [PATCH 1/5] asset type added in cm detail. --- .../views/components/service_request_detail_view.dart | 4 ++++ 1 file changed, 4 insertions(+) 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 a6d4d880..026fac67 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 @@ -215,6 +215,10 @@ class _ServiceRequestDetailViewState extends State { '${context.translation.model}: ${workOrder.model?.name!.cleanupWhitespace?.capitalizeFirstOfEach}', style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), ), + Text( + '${context.translation.assetType}: ${workOrder.assetType?.name?.cleanupWhitespace?.capitalizeFirstOfEach}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ), Text( '${context.translation.site}: ${workOrder.site?.siteName?.cleanupWhitespace?.capitalizeFirstOfEach}', style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), From 5d068349c75830571f3c4206327825f9d4dd6b35 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 6 Jul 2026 09:42:04 +0300 Subject: [PATCH 2/5] incident module wo by asset cont. --- lib/controllers/api_routes/urls.dart | 8 +- .../create_incident_request_page.dart | 16 ++- .../incident_module/incident_detail_page.dart | 13 ++ .../auto_complete/wo_auto_complete_field.dart | 133 ++++++++++++++++++ 4 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 lib/views/widgets/auto_complete/wo_auto_complete_field.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 8995f023..94e03ff2 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 = "42"; - 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/v2/mobile"; // new V2 apis - static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM + 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/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/incident_module/create_incident_request_page.dart b/lib/modules/incident_module/create_incident_request_page.dart index 5ceb5dca..deac471e 100644 --- a/lib/modules/incident_module/create_incident_request_page.dart +++ b/lib/modules/incident_module/create_incident_request_page.dart @@ -22,6 +22,7 @@ import 'package:test_sa/modules/incident_module/incident_lookup_provider.dart'; import 'package:test_sa/modules/incident_module/incident_provider.dart'; import 'package:test_sa/modules/loan_module/models/medical_department_model.dart'; import 'package:test_sa/modules/loan_module/provider/medical_department_provider.dart'; +import 'package:test_sa/modules/traf_module/asset_auto_complete_field.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'; @@ -30,6 +31,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/loading_list_notifier.dart'; import 'package:test_sa/providers/lookups/yes_no_lookup_provider.dart'; +import 'package:test_sa/views/widgets/auto_complete/wo_auto_complete_field.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/equipment/asset_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; @@ -136,7 +138,19 @@ class _CreateIncidentRequestPageState extends State { payload["departmentId"] = asset.department?.id; setState(() {}); }, - ) + ), + 12.height, + WoAutoCompleteField( + clearAfterPick: false, + byName: true, + enabled: device != null, + initialValue: "", + onPick: (asset) { + // trafRequest?.assetNDId = asset.id; + // model.partCatalogItem = PartCatalogItem(id: part.sparePart?.id, partNumber: part.sparePart?.partNo, partName: part.sparePart?.partName, oracleCode: part.sparePart?.oracleCode); + // setState(() {}); + }, + ), ], if (incidentType?.value != null && incidentType?.value != 1) ...[ 16.height, diff --git a/lib/modules/incident_module/incident_detail_page.dart b/lib/modules/incident_module/incident_detail_page.dart index 2484a9e9..6eb8c521 100644 --- a/lib/modules/incident_module/incident_detail_page.dart +++ b/lib/modules/incident_module/incident_detail_page.dart @@ -1,5 +1,6 @@ import 'dart:developer'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; @@ -8,6 +9,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/modules/cm_module/cm_detail_page.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/incident_module/incident_attachment_model.dart'; import 'package:test_sa/modules/incident_module/incident_data_model.dart'; @@ -101,6 +103,17 @@ class IncidentDetailPage extends StatelessWidget { 'Incident Title: ${incidentData.incidentTitle ?? "-"}'.bodyText(context), 'Incident Description: ${incidentData.incidentDescription ?? "-"}'.bodyText(context), 'Exist OVR: ${incidentData.existingOvrTicketName ?? "-"}'.bodyText(context), + RichText( + text: TextSpan(text: "CM WorkOrder: ", style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), children: [ + TextSpan( + text: "Privacy Policy", + style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context), decoration: TextDecoration.underline), + recognizer: TapGestureRecognizer() + ..onTap = () async { + await Navigator.of(context).push(MaterialPageRoute(builder: (_) => CMDetailPage(requestId: incidentData.id!, moduleId: 3))); + }), + ]), + ), 'Site: ${incidentData.siteName ?? "-"}'.bodyText(context), 'Building: ${incidentData.buildingName ?? "-"}'.bodyText(context), 'Floor: ${incidentData.floorName ?? "-"}'.bodyText(context), diff --git a/lib/views/widgets/auto_complete/wo_auto_complete_field.dart b/lib/views/widgets/auto_complete/wo_auto_complete_field.dart new file mode 100644 index 00000000..56ebae4c --- /dev/null +++ b/lib/views/widgets/auto_complete/wo_auto_complete_field.dart @@ -0,0 +1,133 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/oracle_code_provider.dart'; +import 'package:test_sa/controllers/providers/api/parts_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/new_models/asset_nd_auto_complete_by_dynamic_codes_model.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../extensions/text_extensions.dart'; +import '../../../models/service_request/spare_parts.dart'; +import '../../../new_views/app_style/app_text_style.dart'; + +class WoAutoCompleteField extends StatefulWidget { + final String initialValue; + final num? assetId; + final bool clearAfterPick, byName, enabled; + final Function(AssetNDAutoCompleteByDynamicCodesModel) onPick; + + const WoAutoCompleteField({Key? key, required this.byName, required this.initialValue, this.assetId, required this.onPick, this.clearAfterPick = true, this.enabled = true}) : super(key: key); + + @override + _WoAutoCompleteFieldState createState() => _WoAutoCompleteFieldState(); +} + +class _WoAutoCompleteFieldState extends State { + late OracleCodeProvider _oracleCodeProvider; + + late TextEditingController _controller; + + bool loading = false; + + @override + void initState() { + _controller = TextEditingController(text: widget.initialValue); + super.initState(); + _oracleCodeProvider = Provider.of(context, listen: false); + } + + @override + void didUpdateWidget(covariant WoAutoCompleteField oldWidget) { + if (widget.initialValue != oldWidget.initialValue) { + _controller = TextEditingController(text: widget.initialValue); + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final border = UnderlineInputBorder(borderSide: BorderSide.none, borderRadius: BorderRadius.circular(10)); + return Container( + decoration: BoxDecoration( + color: AppColor.background(context), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], + ), + child: Autocomplete( + optionsBuilder: (TextEditingValue textEditingValue) async { + if (textEditingValue.text.isEmpty) { + if (loading) { + setState(() { + loading = false; + }); + } + return const Iterable.empty(); + } + if (!loading) { + setState(() { + loading = true; + }); + } + List workOrders = (await _oracleCodeProvider.getAssetByOracleCode(textEditingValue.text)); + setState(() { + loading = false; + }); + return workOrders; + }, + displayStringForOption: (AssetNDAutoCompleteByDynamicCodesModel option) => widget.byName ? option.displayName ?? "" : option.codeValue ?? "", + fieldViewBuilder: (BuildContext context, TextEditingController fieldTextEditingController, FocusNode fieldFocusNode, VoidCallback onFieldSubmitted) { + return TextField( + controller: _controller, + focusNode: fieldFocusNode, + style: AppTextStyles.bodyText.copyWith(color: AppColor.black10), + textAlign: TextAlign.start, + decoration: InputDecoration( + border: border, + disabledBorder: border, + focusedBorder: border, + enabledBorder: border, + errorBorder: border, + contentPadding: EdgeInsets.symmetric(vertical: 8.toScreenHeight, horizontal: 16.toScreenWidth), + constraints: const BoxConstraints(), + suffixIconConstraints: const BoxConstraints(maxHeight: 24, maxWidth: 24 + 8), + filled: true, + enabled: widget.enabled, + fillColor: AppColor.fieldBgColor(context), + errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), + floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), + labelText: "Name/Oracle Code", + labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)), + suffixIcon: loading ? const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3.0).paddingOnly(end: 8) : null, + ), + textInputAction: TextInputAction.search, + onChanged: (text) { + fieldTextEditingController.text = text; + }, + onSubmitted: (String value) { + onFieldSubmitted(); + }, + ); + }, + onSelected: (AssetNDAutoCompleteByDynamicCodesModel selection) { + if (widget.clearAfterPick) { + _controller.clear(); + } else { + _controller.text = widget.byName ? (selection.displayName ?? "") : (selection.codeValue ?? ""); + } + widget.onPick(selection); + }, + ), + ); + } +} From b34ede43beb934e0e2d1016ede56c22c459fa5fc Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 <50428976+WaseemAbbasi22@users.noreply.github.com> Date: Mon, 6 Jul 2026 10:13:14 +0300 Subject: [PATCH 3/5] attachment bug fixes for medical gas request --- .../update_delivery_notes_page.dart | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/modules/medical_gas_inspection/update_delivery_notes_page.dart b/lib/modules/medical_gas_inspection/update_delivery_notes_page.dart index 73d24c57..9e9038dd 100644 --- a/lib/modules/medical_gas_inspection/update_delivery_notes_page.dart +++ b/lib/modules/medical_gas_inspection/update_delivery_notes_page.dart @@ -1,3 +1,7 @@ +import 'dart:convert'; +import 'dart:developer'; +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; @@ -6,6 +10,8 @@ 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/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/medical_gas_inspection/models/delivery_notes_form_model.dart'; import 'package:test_sa/modules/medical_gas_inspection/models/medical_gas_data_model.dart'; @@ -37,9 +43,7 @@ class _UpdateDeliveryNotesState extends State { bool pressureTestAcknowledgement = false; bool leakTestAcknowledgement = false; final GlobalKey _formKey = GlobalKey(); - final GlobalKey _scaffoldKey = GlobalKey(); - - // List selectedItemList = []; + List _attachments = []; @override void initState() { @@ -62,9 +66,13 @@ class _UpdateDeliveryNotesState extends State { isInspectedGasLeak: dataModel.isInspectedGasLeak, isPressureChecked: dataModel.isPressureChecked, deliveredDate: dataModel.deliveredDate, - attachments: dataModel.deliveryNoteAttachmentDto, + // attachments: dataModel.deliveryNoteAttachmentDto, isSubmitted: dataModel.isSubmitted, deliveryNoteNumber: dataModel.deliveryNote); + + if (dataModel.deliveryNoteAttachmentDto.isNotEmpty) { + _attachments.addAll(dataModel.deliveryNoteAttachmentDto.map((e) => GenericAttachmentModel(id: e.id, name: e.name)).toList()); + } //Need to Confirm this condition // selectedItemList = dataModel.requestDetailDtos.where((item) => item.deliveredQuantity != null && item.deliveredQuantity! > 0).toList(); setState(() {}); @@ -201,7 +209,7 @@ class _UpdateDeliveryNotesState extends State { AttachmentPicker( label: 'Upload Attachment', - attachment: formModel.attachments, + attachment: _attachments, buttonColor: AppColor.primary10, // showAsListView: true, onlyImages: false, @@ -320,6 +328,15 @@ class _UpdateDeliveryNotesState extends State { deliveredQuantity: item.deliveredQuantity, )); } + formModel.attachments = []; + try { + for (var item in _attachments) { + String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; + formModel.attachments.add(GenericAttachmentModel(id: item.id, name: fileName)); + } + } catch (error) { + print(error); + } showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); await medicalGasInspectionProvider.updatedDeliveryNotes(model: formModel).then((status) async { Navigator.pop(context); From 78e9042bbbc9d2031ed3fbbbff4ae038621a0911 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 7 Jul 2026 10:52:50 +0300 Subject: [PATCH 4/5] incident module cm work order integrated & improvements. --- lib/controllers/api_routes/urls.dart | 1 + lib/models/wo_by_asset_id_model.dart | 11 ++++++++ lib/modules/cm_module/cm_detail_provider.dart | 16 ++++++++++++ .../create_incident_request_page.dart | 21 ++++++++++------ .../incident_module/incident_data_model.dart | 8 ++++++ .../incident_module/incident_detail_page.dart | 23 +++++++++-------- .../traf_module/traf_request_detail_page.dart | 4 +-- .../auto_complete/wo_auto_complete_field.dart | 25 +++++++++++-------- 8 files changed, 77 insertions(+), 32 deletions(-) create mode 100644 lib/models/wo_by_asset_id_model.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 94e03ff2..12459d16 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -159,6 +159,7 @@ class URLs { static get assignEngineerToWorkOrderUrl => '$_baseUrl/ServiceRequest/AssignEngineerToWorkOrder'; static get uploadWorkOrderAttachmentsUrl => '$_baseUrl/ServiceRequest/UploadAttachmentsWorkOrder'; + static get workOrderByAssetIdAutoComplete => '$_baseUrl/ServiceRequest/WorkOrderByAssetIdAutoComplete'; static get getArrivalVerificationTypeUrl => '$_baseUrl/ArrivalVerificationType/GetArrivalVerificationType'; diff --git a/lib/models/wo_by_asset_id_model.dart b/lib/models/wo_by_asset_id_model.dart new file mode 100644 index 00000000..8a6497d1 --- /dev/null +++ b/lib/models/wo_by_asset_id_model.dart @@ -0,0 +1,11 @@ +class WoByAssetIdModel { + int? id; + String? workOrderNo; + + WoByAssetIdModel({this.id, this.workOrderNo}); + + WoByAssetIdModel.fromJson(dynamic json) { + id = json['id']; + workOrderNo = json['workOrderNo']; + } +} diff --git a/lib/modules/cm_module/cm_detail_provider.dart b/lib/modules/cm_module/cm_detail_provider.dart index a63dcf9e..9aa4aa4d 100644 --- a/lib/modules/cm_module/cm_detail_provider.dart +++ b/lib/modules/cm_module/cm_detail_provider.dart @@ -17,6 +17,7 @@ import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/service_request/spare_parts.dart'; import 'package:test_sa/models/service_request/supplier_details.dart'; +import 'package:test_sa/models/wo_by_asset_id_model.dart'; import 'cm_request_utils.dart'; @@ -1003,4 +1004,19 @@ class CMDetailProvider extends ChangeNotifier { return -1; } } + + Future> getWorkOrderByAssetId(String searchText, int assetId) async { + late Response response; + try { + response = await ApiManager.instance.post(URLs.workOrderByAssetIdAutoComplete, body: {"pageSize": 1, "pageNumber": 20, "search": searchText, "assetId": assetId}); + List woList = []; + if (response.statusCode >= 200 && response.statusCode < 300) { + List categoriesListJson = json.decode(response.body)["data"]; + woList = categoriesListJson.map((wo) => WoByAssetIdModel.fromJson(wo)).toList(); + } + return woList; + } catch (error) { + return []; + } + } } diff --git a/lib/modules/incident_module/create_incident_request_page.dart b/lib/modules/incident_module/create_incident_request_page.dart index deac471e..ee8f76aa 100644 --- a/lib/modules/incident_module/create_incident_request_page.dart +++ b/lib/modules/incident_module/create_incident_request_page.dart @@ -16,6 +16,7 @@ import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/new_models/site.dart'; +import 'package:test_sa/models/wo_by_asset_id_model.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/incident_module/incident_lookup_provider.dart'; @@ -65,6 +66,7 @@ class _CreateIncidentRequestPageState extends State { Department? _selectedDepartment; Asset? device; + WoByAssetIdModel? woByAssetId; Lookup? incidentType; Lookup? ovrSystem; @@ -127,10 +129,10 @@ class _CreateIncidentRequestPageState extends State { borderColor: AppColor.black20, onPick: (asset) async { device = asset; - payload["assetId"] = asset.modelDefinition?.id; + payload["assetId"] = asset?.id; payload["oracleCode"] = asset.modelDefinition?.oracleCodes?.first.codeValue; payload["model"] = asset.modelDefinition?.modelName; - payload["manufacturer"] = asset.modelDefinition?.manufacturerId; + payload["manufacturer"] = asset.modelDefinition?.manufacturerName; payload["assetOrigin"] = asset.modelDefinition?.assetName; payload["siteId"] = asset.site?.id; payload["buildingId"] = asset.building?.id; @@ -144,11 +146,11 @@ class _CreateIncidentRequestPageState extends State { clearAfterPick: false, byName: true, enabled: device != null, + assetId: device?.id?.toInt(), initialValue: "", onPick: (asset) { - // trafRequest?.assetNDId = asset.id; - // model.partCatalogItem = PartCatalogItem(id: part.sparePart?.id, partNumber: part.sparePart?.partNo, partName: part.sparePart?.partName, oracleCode: part.sparePart?.oracleCode); - // setState(() {}); + woByAssetId = asset; + setState(() {}); }, ), ], @@ -369,6 +371,7 @@ class _CreateIncidentRequestPageState extends State { onSelect: (value) { incidentType = value; payload["incidentClassificationId"] = value?.id; + payload["workOrderId"] = null; setState(() {}); }, ), @@ -690,17 +693,19 @@ class _CreateIncidentRequestPageState extends State { "Please scan or pick asset".showToast; return; } - + if (incidentType?.value == 1 && device != null && woByAssetId?.id == null) { + "Please choose CM Work Order".showToast; + return; + } if (ovrSystem?.value == 1 && isOvrVerified == false) { "Please verify OVR Ticket Number".showToast; return; } - if (occurrenceDate == null) { "Please select occurrence Data".showToast; return; } - + payload["workOrderId"] = woByAssetId?.id; payload["occurrenceDate"] = occurrenceDate!.toIso8601String(); _formKey.currentState!.save(); diff --git a/lib/modules/incident_module/incident_data_model.dart b/lib/modules/incident_module/incident_data_model.dart index 6e5e46f1..7c9f3ba7 100644 --- a/lib/modules/incident_module/incident_data_model.dart +++ b/lib/modules/incident_module/incident_data_model.dart @@ -74,6 +74,8 @@ class IncidentDataModel { String? occurrenceDate; String? createdDate; List? incidentAttachments; + int? workOrderId; + String? workOrderNo; IncidentDataModel( {this.id, @@ -148,6 +150,8 @@ class IncidentDataModel { this.approvalSignature, this.occurrenceDate, this.createdDate, + this.workOrderId, + this.workOrderNo, this.incidentAttachments}); IncidentDataModel.fromJson(Map json) { @@ -223,6 +227,8 @@ class IncidentDataModel { approvalSignature = json['approvalSignature']; occurrenceDate = json['occurrenceDate']; createdDate = json['createdDate']; + workOrderId = json['workOrderId']; + workOrderNo = json['workOrderNo']; if (json['incidentAttachments'] != null) { incidentAttachments = []; json['incidentAttachments'].forEach((v) { @@ -305,6 +311,8 @@ class IncidentDataModel { data['approvalSignature'] = this.approvalSignature; data['occurrenceDate'] = this.occurrenceDate; data['createdDate'] = this.createdDate; + data['workOrderId'] = this.workOrderId; + data['workOrderNo'] = this.workOrderNo; if (this.incidentAttachments != null) { data['incidentAttachments'] = this.incidentAttachments!.map((v) => v.toJson()).toList(); } diff --git a/lib/modules/incident_module/incident_detail_page.dart b/lib/modules/incident_module/incident_detail_page.dart index 6eb8c521..f96dcd4f 100644 --- a/lib/modules/incident_module/incident_detail_page.dart +++ b/lib/modules/incident_module/incident_detail_page.dart @@ -103,22 +103,23 @@ class IncidentDetailPage extends StatelessWidget { 'Incident Title: ${incidentData.incidentTitle ?? "-"}'.bodyText(context), 'Incident Description: ${incidentData.incidentDescription ?? "-"}'.bodyText(context), 'Exist OVR: ${incidentData.existingOvrTicketName ?? "-"}'.bodyText(context), - RichText( - text: TextSpan(text: "CM WorkOrder: ", style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), children: [ - TextSpan( - text: "Privacy Policy", - style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context), decoration: TextDecoration.underline), - recognizer: TapGestureRecognizer() - ..onTap = () async { - await Navigator.of(context).push(MaterialPageRoute(builder: (_) => CMDetailPage(requestId: incidentData.id!, moduleId: 3))); - }), - ]), - ), 'Site: ${incidentData.siteName ?? "-"}'.bodyText(context), 'Building: ${incidentData.buildingName ?? "-"}'.bodyText(context), 'Floor: ${incidentData.floorName ?? "-"}'.bodyText(context), 'Department: ${incidentData.departmentName ?? "-"}'.bodyText(context), 'Occurrence Date: ${incidentData.occurrenceDate?.toServiceRequestDetailsFormat ?? "-"}'.bodyText(context), + if (incidentData.workOrderId != null) + RichText( + text: TextSpan(text: "Work Order: ", style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), children: [ + TextSpan( + text: "${incidentData.workOrderNo}", + style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context), decoration: TextDecoration.underline), + recognizer: TapGestureRecognizer() + ..onTap = () async { + await Navigator.of(context).push(MaterialPageRoute(builder: (_) => CMDetailPage(requestId: incidentData.workOrderId!, moduleId: 3))); + }), + ]), + ), 'Root Cause: ${incidentData.rootCauseName ?? "-"}'.bodyText(context), if (incidentData.rootCauseValue == 5) 'Root reason: ${incidentData.otherRootCause ?? "-"}'.bodyText(context), 'Comments: ${incidentData.comments ?? "-"}'.bodyText(context), diff --git a/lib/modules/traf_module/traf_request_detail_page.dart b/lib/modules/traf_module/traf_request_detail_page.dart index 548cb41b..ea1ea197 100644 --- a/lib/modules/traf_module/traf_request_detail_page.dart +++ b/lib/modules/traf_module/traf_request_detail_page.dart @@ -136,9 +136,9 @@ class _TrafRequestDetailPageState extends State { 'Requested Quantity: ${data.qty ?? '-'}'.bodyText(context), ], 4.height, - 'How would the requested technology solve the current situation and/or serve the purpose?: ${data.purposeAnswer ?? '-'}'.bodyText(context), + 'How would the requested technology solve the current situation and/or serve the purpose?:\n${data.purposeAnswer ?? '-'}'.bodyText(context), 4.height, - 'What is the current practice?: ${data.currentPractise ?? '-'}'.bodyText(context), + 'What is the current practice?:\n${data.currentPractise ?? '-'}'.bodyText(context), 4.height, 'Census Q1: ${data.censusQ1 ?? '-'}'.bodyText(context), 'Census Q2: ${data.censusQ2 ?? '-'}'.bodyText(context), diff --git a/lib/views/widgets/auto_complete/wo_auto_complete_field.dart b/lib/views/widgets/auto_complete/wo_auto_complete_field.dart index 56ebae4c..b157df2e 100644 --- a/lib/views/widgets/auto_complete/wo_auto_complete_field.dart +++ b/lib/views/widgets/auto_complete/wo_auto_complete_field.dart @@ -8,6 +8,8 @@ import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/new_models/asset_nd_auto_complete_by_dynamic_codes_model.dart'; +import 'package:test_sa/models/wo_by_asset_id_model.dart'; +import 'package:test_sa/modules/cm_module/cm_detail_provider.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -17,9 +19,9 @@ import '../../../new_views/app_style/app_text_style.dart'; class WoAutoCompleteField extends StatefulWidget { final String initialValue; - final num? assetId; + final int? assetId; final bool clearAfterPick, byName, enabled; - final Function(AssetNDAutoCompleteByDynamicCodesModel) onPick; + final Function(WoByAssetIdModel) onPick; const WoAutoCompleteField({Key? key, required this.byName, required this.initialValue, this.assetId, required this.onPick, this.clearAfterPick = true, this.enabled = true}) : super(key: key); @@ -28,7 +30,7 @@ class WoAutoCompleteField extends StatefulWidget { } class _WoAutoCompleteFieldState extends State { - late OracleCodeProvider _oracleCodeProvider; + late CMDetailProvider _cmDetailProvider; late TextEditingController _controller; @@ -38,7 +40,7 @@ class _WoAutoCompleteFieldState extends State { void initState() { _controller = TextEditingController(text: widget.initialValue); super.initState(); - _oracleCodeProvider = Provider.of(context, listen: false); + _cmDetailProvider = Provider.of(context, listen: false); } @override @@ -64,7 +66,7 @@ class _WoAutoCompleteFieldState extends State { borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), - child: Autocomplete( + child: Autocomplete( optionsBuilder: (TextEditingValue textEditingValue) async { if (textEditingValue.text.isEmpty) { if (loading) { @@ -72,20 +74,21 @@ class _WoAutoCompleteFieldState extends State { loading = false; }); } - return const Iterable.empty(); + return const Iterable.empty(); } if (!loading) { setState(() { loading = true; }); } - List workOrders = (await _oracleCodeProvider.getAssetByOracleCode(textEditingValue.text)); + List workOrders = (await _cmDetailProvider.getWorkOrderByAssetId(textEditingValue.text, widget.assetId!)); + setState(() { loading = false; }); return workOrders; }, - displayStringForOption: (AssetNDAutoCompleteByDynamicCodesModel option) => widget.byName ? option.displayName ?? "" : option.codeValue ?? "", + displayStringForOption: (WoByAssetIdModel option) => widget.byName ? option.workOrderNo ?? "" : option.workOrderNo ?? "", fieldViewBuilder: (BuildContext context, TextEditingController fieldTextEditingController, FocusNode fieldFocusNode, VoidCallback onFieldSubmitted) { return TextField( controller: _controller, @@ -106,7 +109,7 @@ class _WoAutoCompleteFieldState extends State { fillColor: AppColor.fieldBgColor(context), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), - labelText: "Name/Oracle Code", + labelText: "CM Work Order Number", labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)), suffixIcon: loading ? const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3.0).paddingOnly(end: 8) : null, ), @@ -119,11 +122,11 @@ class _WoAutoCompleteFieldState extends State { }, ); }, - onSelected: (AssetNDAutoCompleteByDynamicCodesModel selection) { + onSelected: (WoByAssetIdModel selection) { if (widget.clearAfterPick) { _controller.clear(); } else { - _controller.text = widget.byName ? (selection.displayName ?? "") : (selection.codeValue ?? ""); + _controller.text = widget.byName ? (selection.workOrderNo ?? "") : (selection.workOrderNo ?? ""); } widget.onPick(selection); }, From 0e1d8ab1bbaea61cbbc0fa5867d3e8b80a471f59 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 7 Jul 2026 11:16:48 +0300 Subject: [PATCH 5/5] v1.7.8+44 uploaded. --- lib/controllers/api_routes/urls.dart | 32 ++++++++++++++++++++++------ pubspec.yaml | 2 +- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 12459d16..43998ee8 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,15 +1,15 @@ class URLs { URLs._(); - static const String appReleaseBuildNumber = "42"; + 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/v2/mobile"; // new V2 apis - // static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM + // 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/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 @@ -73,10 +73,15 @@ class URLs { //One Time Task Urls cleaner module new flow urls .... static get getTaskType => "$_baseUrl/OneTimeTasks/GetTaskTypes"; + static get scanQRCode => "$_baseUrl/OneTimeTasks/ScanQRCode"; + static get proceedRequest => "$_baseUrl/OneTimeTasks/Proceed"; + static get completeRequest => "$_baseUrl/OneTimeTasks/Complete"; + static get getRequestById => "$_baseUrl/OneTimeTasks/GetById"; + //service request new flow urls. static get nurseDashboardCountUrl => '$_baseUrl/ServiceRequest/GetDashboardNurseCount'; @@ -159,6 +164,7 @@ class URLs { static get assignEngineerToWorkOrderUrl => '$_baseUrl/ServiceRequest/AssignEngineerToWorkOrder'; static get uploadWorkOrderAttachmentsUrl => '$_baseUrl/ServiceRequest/UploadAttachmentsWorkOrder'; + static get workOrderByAssetIdAutoComplete => '$_baseUrl/ServiceRequest/WorkOrderByAssetIdAutoComplete'; static get getArrivalVerificationTypeUrl => '$_baseUrl/ArrivalVerificationType/GetArrivalVerificationType'; @@ -269,11 +275,17 @@ class URLs { static get getYesNoRequestTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=4"; static get getDemoPeriodLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=4101"; + static get incidentStatusLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=3060"; + static get incidentTypeLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=3061"; + static get incidentRootCauseLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=3062"; + static get incidentPersonInvolvedLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=3063"; + static get clinicalNonClinicalLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=3064"; + static get genderLookup => "$_baseUrl/Lookups/GetLookup?lookupEnum=3065"; static get getDemoDocumentTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=4106"; @@ -427,15 +439,21 @@ class URLs { static get getLoanPeriod => "$_baseUrl/Lookups/GetLookup?lookupEnum=3051"; static get getMedDepartmentBasedOnSite => "$_baseUrl/TRAFDataSource/GetDepartmentBasedOnSite"; + static get getFlowMedicalDepartments => "$_baseUrl/FlowDepartments/All"; static get getLoanById => '$_baseUrl/Loan/GetLoanById'; + static get getLoanByWorkOrderId => '$_baseUrl/Loan/GetLoanByWorkOrderId'; + static get getIncidentById => '$_baseUrl/Incident/GetIncidentById'; + static get getOvrTicketDetails => '$_baseUrl/Incident/GetOvrTicketDetails'; static get addLoan => '$_baseUrl/Loan/AddLoan'; + static get loanWorkflowAction => '$_baseUrl/Loan/LoanWorkflowAction'; + static get addIncident => '$_baseUrl/Incident/AddIncident'; static get addDemoTrialOutcome => '$_baseUrl/DemoRequest/addDemoTrialOutcome'; @@ -454,7 +472,9 @@ class URLs { static get getAssetDeliveryInspectionData => '$_baseUrl/AssetDeliveryExternalDeliveryInspection/GetAssetDeliveryExternalDeliveryInspectionByDeliveryId'; static get getOracleUserList => '$_baseUrl/AssetDeliveryExternal/GetEmployeesFromOracle'; + static get saveMasterInfoDeliveryInspection => '$_baseUrl/AssetDeliveryExternalDeliveryInspection/SaveMaseterInfoDeliveryInspection'; + static get sendEmailToAddSignature => '$_baseUrl/Signature/SendEmailToAddSignature'; static get getLineFromExternalPo => '$_baseUrl/AssetDeliveryExternalDeliveryInspection/GetLineFromExternalPo'; @@ -540,4 +560,4 @@ class URLs { static get updateDemoPeriodByRequester => "$_baseUrl/DemoRequest/UpdateDemoPeriodByRequester"; //4104 attachment type lookup -} \ No newline at end of file +} diff --git a/pubspec.yaml b/pubspec.yaml index afce5ab7..aa34d07d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.7.7+42 +version: 1.7.8+44 environment: sdk: ">=3.5.0 <4.0.0"