diff --git a/assets/images/delete.svg b/assets/images/delete.svg new file mode 100644 index 00000000..7fdfe788 --- /dev/null +++ b/assets/images/delete.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/edit_icon.svg b/assets/images/edit_icon.svg index 3b49167b..fda0002c 100644 --- a/assets/images/edit_icon.svg +++ b/assets/images/edit_icon.svg @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/assets/images/wo/equipment_audit_wo.svg b/assets/images/wo/equipment_audit_wo.svg new file mode 100644 index 00000000..613c2a1a --- /dev/null +++ b/assets/images/wo/equipment_audit_wo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/wo/incident_wo.svg b/assets/images/wo/incident_wo.svg new file mode 100644 index 00000000..def3594b --- /dev/null +++ b/assets/images/wo/incident_wo.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/wo/system_audit_wo.svg b/assets/images/wo/system_audit_wo.svg new file mode 100644 index 00000000..bc1990f7 --- /dev/null +++ b/assets/images/wo/system_audit_wo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/wo/task_wo.svg b/assets/images/wo/task_wo.svg new file mode 100644 index 00000000..a9504573 --- /dev/null +++ b/assets/images/wo/task_wo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/wo/traf_wo.svg b/assets/images/wo/traf_wo.svg new file mode 100644 index 00000000..92a07332 --- /dev/null +++ b/assets/images/wo/traf_wo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index ff457b1d..bc5f3c8a 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -116,7 +116,7 @@ extension WidgetExtensions on Widget { double borderRadius = 14, bool withShadow = true, Color? backgroundColor, - Color borderColor = Colors.transparent, + Color? borderColor, double padding = 12, EdgeInsets? paddingObject, EdgeInsets? margin, @@ -128,7 +128,7 @@ extension WidgetExtensions on Widget { width: double.infinity, decoration: ShapeDecoration( color: backgroundColor ?? AppColor.background(context), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius), side: BorderSide(color: AppColor.borderColor(context))), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius), side: BorderSide(color: borderColor ?? AppColor.borderColor(context))), shadows: showShadow ? [boxShadowR14] : null, ), child: this, @@ -202,5 +202,5 @@ extension WidgetExtensions on Widget { } extension DividerExtension on Divider { - Divider defaultStyle(BuildContext context) => Divider(thickness: 1, color: context.isDarkNotListen ? AppColor.neutral20 : AppColor.neutral30); + Divider defaultStyle(BuildContext context) => Divider(thickness: 1, color: AppColor.borderColor(context)); } diff --git a/lib/main.dart b/lib/main.dart index c240cefa..c10bc2c1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -114,7 +114,7 @@ import 'package:test_sa/views/pages/user/profile_page.dart'; import 'package:test_sa/views/update_available_screen.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; import 'package:test_sa/views/widgets/equipment/asset_detail_page.dart'; -import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; +import 'package:test_sa/views/widgets/equipment/my_assets_page.dart'; import 'package:timezone/data/latest_all.dart' as tz; import 'package:timezone/timezone.dart' as tz; diff --git a/lib/modules/asset_inventory_module/pages/asset_inventory_form_view.dart b/lib/modules/asset_inventory_module/pages/asset_inventory_form_view.dart index 5bf1ede2..52c7cfa2 100644 --- a/lib/modules/asset_inventory_module/pages/asset_inventory_form_view.dart +++ b/lib/modules/asset_inventory_module/pages/asset_inventory_form_view.dart @@ -92,7 +92,7 @@ class _AssetInventoryFormViewState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - 'Not Registered'.addTranslation.heading5(context), + 'Not Registered'.addTranslation.heading5(context).custom(color: AppColor.textStyleColor(context)), AdvancedSwitch( controller: registeredController, activeColor: AppColor.green50.withOpacity(0.5), diff --git a/lib/modules/cleaner_module/pages/cleaner_request_item_view.dart b/lib/modules/cleaner_module/pages/cleaner_request_item_view.dart index 96d0eb05..56f5d1bd 100644 --- a/lib/modules/cleaner_module/pages/cleaner_request_item_view.dart +++ b/lib/modules/cleaner_module/pages/cleaner_request_item_view.dart @@ -23,7 +23,7 @@ class CleanerRequestItemView extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - if (result.taskNo != null && result.taskNo!.isNotEmpty) result.taskNo!.heading5(context), + if (result.taskNo != null && result.taskNo!.isNotEmpty) result.taskNo!.heading5(context).custom(color: AppColor.textStyleColor(context)), if (result.createdDate != null) Text( result.createdDate!.split('T').first, diff --git a/lib/modules/cleaner_module/widgets/cleaner_checklist_widget.dart b/lib/modules/cleaner_module/widgets/cleaner_checklist_widget.dart index 9f6f117b..12d22165 100644 --- a/lib/modules/cleaner_module/widgets/cleaner_checklist_widget.dart +++ b/lib/modules/cleaner_module/widgets/cleaner_checklist_widget.dart @@ -368,7 +368,7 @@ class _CleanerChecklistWidgetState extends State { borderRadius: BorderRadius.circular(30), //boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), - child: const Icon(Icons.delete_rounded, color: Color(0xffF63939))) + child: "delete".toSvgAsset()) .onPress(() { widget.onImageCaptured?.call(null); }); diff --git a/lib/modules/cm_module/cm_detail_page.dart b/lib/modules/cm_module/cm_detail_page.dart index 35fc8d45..f17416d6 100644 --- a/lib/modules/cm_module/cm_detail_page.dart +++ b/lib/modules/cm_module/cm_detail_page.dart @@ -1,6 +1,11 @@ +import 'dart:developer'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:open_file/open_file.dart'; import 'package:provider/provider.dart'; +import 'package:share_plus/share_plus.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; @@ -21,6 +26,7 @@ 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/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'views/components/history_log_view.dart'; import 'views/components/service_request_detail_view.dart'; diff --git a/lib/modules/cm_module/views/components/activities_list_view.dart b/lib/modules/cm_module/views/components/activities_list_view.dart index 920676d6..e52fbd95 100644 --- a/lib/modules/cm_module/views/components/activities_list_view.dart +++ b/lib/modules/cm_module/views/components/activities_list_view.dart @@ -137,11 +137,11 @@ class _ActivitiesListViewState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { + "edit_icon".toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).onPress(() { editSparePartRequest(context: context, requestDetailProvider: requestDetailProvider, activity: activity); }), 24.width, - "delete_icon".toSvgAsset(height: 21, width: 21).onPress(() async { + "delete_icon".toSvgAsset(height: 24, width: 24).onPress(() async { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); int status = await requestDetailProvider.deleteActivitySparePart(id: activity.id!, workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!); if (status == 200) { @@ -239,11 +239,11 @@ class _ActivitiesListViewState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { + "edit_icon".toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).onPress(() { editMaintenanceRequest(context: context, requestDetailProvider: requestDetailProvider, activity: activity); }), 24.width, - "delete_icon".toSvgAsset(height: 21, width: 21).onPress(() async { + "delete_icon".toSvgAsset(height: 24, width: 24).onPress(() async { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); int status = await requestDetailProvider.deleteActivityMaintenance(id: activity.id!, workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!); if (status == 200) { diff --git a/lib/modules/cm_module/views/components/asset_detail_card.dart b/lib/modules/cm_module/views/components/asset_detail_card.dart index 4352b1e6..68061d46 100644 --- a/lib/modules/cm_module/views/components/asset_detail_card.dart +++ b/lib/modules/cm_module/views/components/asset_detail_card.dart @@ -52,7 +52,7 @@ class AssetDetailCard extends StatelessWidget { ), //hide if status is closed or complete . if (!requestDetailProvider.isReadOnlyRequest) - "edit_icon".toSvgAsset(height: 21, width: 21, color: context.isDark ? AppColor.primary10 : null).onPress(() async { + "edit_icon".toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).onPress(() async { requestDetailProvider.refreshTimer = false; await Navigator.push(context, MaterialPageRoute(builder: (context) => VerifyAssetDetails(isEdit: true))); requestDetailProvider.refreshTimer = true; diff --git a/lib/modules/cm_module/views/components/initial_visit_card.dart b/lib/modules/cm_module/views/components/initial_visit_card.dart index 5ae963c2..7c464140 100644 --- a/lib/modules/cm_module/views/components/initial_visit_card.dart +++ b/lib/modules/cm_module/views/components/initial_visit_card.dart @@ -24,6 +24,7 @@ class _InitialVisitCardState extends State { void initState() { super.initState(); } + @override Widget build(BuildContext context) { return Consumer(builder: (context, CMDetailProvider requestDetailProvider, snapshot) { @@ -38,12 +39,12 @@ class _InitialVisitCardState extends State { ), Row( children: [ - "reminder_icon".toSvgAsset(height: 21, width: 21).onPress(() { + "reminder_icon".toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).onPress(() { ServiceRequestBottomSheet.getReminderTimeList(context: context); ServiceRequestBottomSheet.initialVisitReminderBottomSheet(context: context, reminder: requestDetailProvider.currentWorkOrder?.data?.setReminder); }), 24.width, - "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { + "edit_icon".toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).onPress(() { ServiceRequestBottomSheet.initialVisitBottomSheet(context: context); }), ], @@ -56,7 +57,7 @@ class _InitialVisitCardState extends State { requestDetailProvider.needVisitHelperModel!.comment!.bodyText2(context).custom(color: AppColor.neutral120), ] ], - ).toShadowContainer(context,margin:const EdgeInsets.only(top: 12)); + ).toShadowContainer(context, margin: const EdgeInsets.only(top: 12)); }); } } 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 e61a2591..01a5ac5c 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 @@ -22,6 +22,7 @@ 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/images/files_list.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; +import 'package:test_sa/views/widgets/item_views/info_text_widget.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/sound/sound_player.dart'; @@ -505,7 +506,7 @@ class _ServiceRequestDetailViewState extends State { style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ).expanded, if (!provider.isReadOnlyRequest) - "edit_icon".toSvgAsset(height: 21, width: 21, color: context.isDark ? AppColor.primary10 : null).onPress(() async { + "edit_icon".toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).onPress(() async { provider.refreshTimer = false; await Navigator.push(context, MaterialPageRoute(builder: (context) => CostDetailFormScreen(isEdit: true))); provider.refreshTimer = true; @@ -551,7 +552,7 @@ class _ServiceRequestDetailViewState extends State { ], ), ], - ).toShadowContainer(context, padding: 12); + ).toShadowContainer(context); } Widget assetRetiredButton({required BuildContext context}) { @@ -560,7 +561,7 @@ class _ServiceRequestDetailViewState extends State { child: AppFilledButton( label: context.translation.assetToBeRetired, maxWidth: true, - buttonColor: Colors.white54, + buttonColor: AppColor.background(context), textColor: AppColor.red30, showBorder: true, onPressed: () async { diff --git a/lib/modules/cm_module/views/forms/spare_part/spare_part_request.dart b/lib/modules/cm_module/views/forms/spare_part/spare_part_request.dart index 289d4778..1821a20b 100644 --- a/lib/modules/cm_module/views/forms/spare_part/spare_part_request.dart +++ b/lib/modules/cm_module/views/forms/spare_part/spare_part_request.dart @@ -137,7 +137,7 @@ class _SparePartRequestState extends State with TickerProvider child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - context.translation.sparePartDetails.heading5(context), + context.translation.sparePartDetails.heading5(context).custom(color: AppColor.textStyleColor(context)), // 12.height, // SingleItemDropDownMenu( // context: context, diff --git a/lib/modules/export_module/widgets/cleaner_checklist_widget.dart b/lib/modules/export_module/widgets/cleaner_checklist_widget.dart index 9f6f117b..12d22165 100644 --- a/lib/modules/export_module/widgets/cleaner_checklist_widget.dart +++ b/lib/modules/export_module/widgets/cleaner_checklist_widget.dart @@ -368,7 +368,7 @@ class _CleanerChecklistWidgetState extends State { borderRadius: BorderRadius.circular(30), //boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), - child: const Icon(Icons.delete_rounded, color: Color(0xffF63939))) + child: "delete".toSvgAsset()) .onPress(() { widget.onImageCaptured?.call(null); }); diff --git a/lib/modules/pm_module/ppm_wo/ppm_details_page.dart b/lib/modules/pm_module/ppm_wo/ppm_details_page.dart index 85b1d569..1670fe26 100644 --- a/lib/modules/pm_module/ppm_wo/ppm_details_page.dart +++ b/lib/modules/pm_module/ppm_wo/ppm_details_page.dart @@ -90,7 +90,7 @@ class _PpmDetailsPageState extends State { ], ), 8.height, - planPreventiveVisit.assetName!.cleanupWhitespace.capitalizeFirstOfEach.heading5(context), + planPreventiveVisit.assetName!.cleanupWhitespace.capitalizeFirstOfEach.heading5(context).custom(color: AppColor.textStyleColor(context)), 8.height, '${context.translation.assetNumber}: ${planPreventiveVisit.asset!.assetNumber}'.bodyText(context), '${context.translation.assetSN}: ${planPreventiveVisit.asset!.assetSerialNo}'.bodyText(context), diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/ppm_calibration_tools_form.dart b/lib/modules/pm_module/ppm_wo/update_ppm/ppm_calibration_tools_form.dart index ad460de5..34fedcad 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/ppm_calibration_tools_form.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/ppm_calibration_tools_form.dart @@ -80,7 +80,7 @@ class _PpmCalibrationToolsFormState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - (index == 0 ? "$currentIndex /$totalTabs . Calibration Tools" : "").heading5(context), + (index == 0 ? "$currentIndex /$totalTabs . Calibration Tools" : "").heading5(context).custom(color: AppColor.textStyleColor(context)), "trash".toSvgAsset(height: 20, width: 15).onPress(() { widget.models!.remove(model); setState(() {}); diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/ppm_external_details_form.dart b/lib/modules/pm_module/ppm_wo/update_ppm/ppm_external_details_form.dart index a3154b94..c6289512 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/ppm_external_details_form.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/ppm_external_details_form.dart @@ -134,7 +134,7 @@ class _ExternalDetailItemState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - (widget.index == 0 ? "1 /4 . External Details" : "").heading5(context), + (widget.index == 0 ? "1 /4 . External Details" : "").heading5(context).custom(color: AppColor.textStyleColor(context)), Container( height: 32, width: 32, diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/ppm_pm_check_list_form.dart b/lib/modules/pm_module/ppm_wo/update_ppm/ppm_pm_check_list_form.dart index 9f5b0e63..f27968c6 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/ppm_pm_check_list_form.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/ppm_pm_check_list_form.dart @@ -50,7 +50,7 @@ class _PpmPmChecklistFormState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (index == 0) ...[ - "$currentIndex /$totalTabs . PM Checklist".heading5(context), + "$currentIndex /$totalTabs . PM Checklist".heading5(context).custom(color: AppColor.textStyleColor(context)), 16.height, ], AppTextFormField( diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/ppm_pm_kits_form.dart b/lib/modules/pm_module/ppm_wo/update_ppm/ppm_pm_kits_form.dart index a25e4d4a..022c4125 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/ppm_pm_kits_form.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/ppm_pm_kits_form.dart @@ -78,7 +78,7 @@ class _PpmPMKitsFormState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - (index == 0 ? "$currentIndex /$totalTabs . PM Kits" : "").heading5(context), + (index == 0 ? "$currentIndex /$totalTabs . PM Kits" : "").heading5(context).custom(color: AppColor.textStyleColor(context)), Container( height: 32, width: 32, diff --git a/lib/modules/tm_module/device_transfer/device_filter_screen.dart b/lib/modules/tm_module/device_transfer/device_filter_screen.dart index 5eef3a5a..0616e728 100644 --- a/lib/modules/tm_module/device_transfer/device_filter_screen.dart +++ b/lib/modules/tm_module/device_transfer/device_filter_screen.dart @@ -7,13 +7,14 @@ import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/site.dart'; +import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.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/multiple_item_drop_down_menu.dart'; import 'package:test_sa/providers/department_provider.dart'; import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/equipment/commissioning_status_buttons.dart'; +import 'package:test_sa/views/widgets/equipment/asset_status_buttons.dart'; import '../../../models/device/asset_search.dart'; import '../../../new_views/common_widgets/app_lazy_loading.dart'; @@ -45,6 +46,7 @@ class _DeviceFilterScreenState extends State { setState(() {}); startDate = filter.supplyDateFrom; endDate = filter.supplyDateTo; + _commissioningStatus = filter.assetStatus; final departmentProvider = Provider.of(context, listen: false); final siteProvider = Provider.of(context, listen: false); if (departmentProvider.items.isEmpty ?? true) await departmentProvider.getData(); @@ -68,115 +70,110 @@ class _DeviceFilterScreenState extends State { @override Widget build(BuildContext context) { - return SafeArea( - top: false, - child: Scaffold( - appBar: DefaultAppBar( - title: context.translation.filter, - actions: [ - if (loading == false && _showResetButton()) - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - context.translation.reset, - style: AppTextStyles.bodyText2.copyWith(color: AppColor.loadingColor(context)), - ).paddingAll(8).onPress(() { + return Scaffold( + appBar: DefaultAppBar( + title: context.translation.filter, + actions: [ + if (loading == false && _showResetButton()) + TextButton( + onPressed: () { + setState(() { + startDate = null; + endDate = null; + _selectedDepartments = []; + _selectedSites = []; + _commissioningStatus = null; + }); + }, + style: TextButton.styleFrom(padding: EdgeInsets.zero, tapTargetSize: MaterialTapTargetSize.shrinkWrap), + child: Text( + 'Clear Filters', + style: AppTextStyles.bodyText2.copyWith(color: AppColor.primary10), + ), + ).paddingOnly(start: 16, end: 16) + ], + ), + body: Column( + children: [ + ListView( + padding: const EdgeInsets.all(16), + children: [ + AssetStatusButtons( + initialValue: _commissioningStatus, + onSelect: (value) { + if (value != null) { + _commissioningStatus = value; + } + }, + ), + 16.height, + MultipleItemDropDownMenu( + context: context, + title: context.translation.byDepartment, + showAsBottomSheet: true, + backgroundColor: context.isDark ? AppColor.neutral60 : Colors.white, + // backgroundColor: AppColor.fieldBgColor(context), + showShadow: true, + height: 56.toScreenHeight, + showCancel: true, + onSelect: (value) { + if (value != null) { setState(() { - startDate = null; - endDate = null; - _selectedDepartments = []; - _selectedSites = []; + _selectedDepartments = value; }); - }), - ], - ) - ], - ), - body: Column( - children: [ - SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, + } + }, + ), + 12.height, + MultipleItemDropDownMenu( + context: context, + title: context.translation.bySite, + showAsBottomSheet: true, + // backgroundColor: AppColor.fieldBgColor(context), + backgroundColor: context.isDark ? AppColor.neutral60 : Colors.white, + showShadow: true, + height: 56.toScreenHeight, + showCancel: true, + onSelect: (value) { + if (value != null) { + setState(() { + _selectedSites = value; + }); + } + }, + ), + 16.height, + context.translation.pmDateRange.heading5(context).custom(color: AppColor.textStyleColor(context)), + 8.height, + Row( children: [ - CommissioningStatusButtons( - initialValue: _commissioningStatus, - onSelect: (value) { - if (value != null) { - _commissioningStatus = value; - } - }, - ), - 16.height, - MultipleItemDropDownMenu( - context: context, - title: context.translation.byDepartment, - showAsBottomSheet: true, - backgroundColor: context.isDark ? AppColor.neutral60 : Colors.white, - // backgroundColor: AppColor.fieldBgColor(context), - showShadow: true, - height: 56.toScreenHeight, - showCancel: true, - onSelect: (value) { - if (value != null) { - setState(() { - _selectedDepartments = value; - }); - } + ADatePicker( + label: context.translation.to, + from: DateTime(2000), + date: DateTime.tryParse(startDate ?? ""), + onDatePicker: (date) { + setState(() { + startDate = date.toIso8601String(); + }); }, - ).paddingOnly(start: 16, end: 16), - 8.height, - MultipleItemDropDownMenu( - context: context, - title: context.translation.bySite, - showAsBottomSheet: true, - // backgroundColor: AppColor.fieldBgColor(context), - backgroundColor: context.isDark ? AppColor.neutral60 : Colors.white, - showShadow: true, - height: 56.toScreenHeight, - showCancel: true, - onSelect: (value) { - if (value != null) { - setState(() { - _selectedSites = value; - }); - } + ).expanded, + 8.width, + ADatePicker( + label: context.translation.to, + from: DateTime(2000), + date: DateTime.tryParse(endDate ?? ""), + onDatePicker: (date) { + setState(() { + endDate = date.toIso8601String(); + }); }, - ).paddingOnly(start: 16, end: 16), - 16.height, - context.translation.pmDateRange.heading5(context).paddingOnly(start: 16, end: 16), - 8.height, - Row( - children: [ - ADatePicker( - label: context.translation.to, - from: DateTime(2000), - date: DateTime.tryParse(startDate ?? ""), - onDatePicker: (date) { - setState(() { - startDate = date.toIso8601String(); - }); - }, - ).expanded, - 8.width, - ADatePicker( - label: context.translation.to, - from: DateTime(2000), - date: DateTime.tryParse(endDate ?? ""), - onDatePicker: (date) { - setState(() { - endDate = date.toIso8601String(); - }); - }, - ).expanded, - ], - ).paddingOnly(start: 16, end: 16), + ).expanded, ], ), - ).expanded, - AppFilledButton(onPressed: _search, label: context.translation.applyFilter).paddingOnly(start: 16, end: 16), - ], - ).paddingOnly(top: 16, bottom: 16), + ], + ).expanded, + FooterActionButton.footerContainer(context: context, child: AppFilledButton(onPressed: _search, label: context.translation.applyFilter)), + ], ), ); } @@ -184,6 +181,7 @@ class _DeviceFilterScreenState extends State { void _search() async { filter.sites = _selectedSites.map((site) => site.name ?? '').where((name) => name.isNotEmpty).toList(); filter.departments = _selectedDepartments.map((dept) => dept.name ?? '').where((name) => name.isNotEmpty).toList(); + filter.assetStatus = _commissioningStatus; filter.supplyDateFrom = startDate; filter.supplyDateTo = endDate; final deviceProvider = Provider.of(context, listen: false); @@ -195,6 +193,6 @@ class _DeviceFilterScreenState extends State { } bool _showResetButton() { - return (_selectedDepartments.isNotEmpty) || (_selectedSites.isNotEmpty) || (startDate != null) || (endDate != null); + return (_selectedDepartments.isNotEmpty) || (_selectedSites.isNotEmpty) || (_commissioningStatus != null) || (startDate != null) || (endDate != null); } } diff --git a/lib/modules/tm_module/device_transfer/device_search_screen.dart b/lib/modules/tm_module/device_transfer/device_search_screen.dart index 56768834..d9f99f8d 100644 --- a/lib/modules/tm_module/device_transfer/device_search_screen.dart +++ b/lib/modules/tm_module/device_transfer/device_search_screen.dart @@ -5,6 +5,8 @@ import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_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/views/components/action_button/footer_action_button.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'; @@ -62,39 +64,38 @@ class _DeviceSearchScreenState extends State { title: context.translation.search, actions: [ if (_showResetButton()) - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - context.translation.reset, - style: AppTextStyles.bodyText2.copyWith(color: const Color(0xFF4A8DB7)), - ).paddingAll(8).onPress(() { - setState(() { - _assetNameController.text = ""; - _assetNumberController.text = ""; - _snController.text = ""; - _modelController.text = ""; - _supplierController.text = ""; - _siteController.text = ""; - _manufactureController.text = ""; - _mdController.text = ""; - }); - }), - ], - ) + TextButton( + onPressed: () { + setState(() { + _assetNameController.text = ""; + _assetNumberController.text = ""; + _snController.text = ""; + _modelController.text = ""; + _supplierController.text = ""; + _siteController.text = ""; + _manufactureController.text = ""; + _mdController.text = ""; + }); + }, + style: TextButton.styleFrom(padding: EdgeInsets.zero, tapTargetSize: MaterialTapTargetSize.shrinkWrap), + child: Text( + 'Clear Filters', + style: AppTextStyles.bodyText2.copyWith(color: AppColor.primary10), + ), + ).paddingOnly(start: 16, end: 16), ], ), body: Form( key: _formKey, - child: Column( - children: [ - SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, + child: SafeArea( + child: Column( + children: [ + ListView( + padding: const EdgeInsets.all(16), children: [ - context.translation.searchBy.heading5(context), - 8.height, - context.translation.searchByDesc.bodyText(context), + context.translation.searchBy.heading5(context).custom(color: AppColor.textStyleColor(context)), + 4.height, + context.translation.searchByDesc.bodyText2(context).custom(color: AppColor.lightTextColor(context)), 16.height, AppTextFormField( controller: _assetNameController, @@ -215,11 +216,11 @@ class _DeviceSearchScreenState extends State { ), 8.height, ], - ), - ).expanded, - AppFilledButton(onPressed: _search, label: context.translation.search), - ], - ).paddingAll(16), + ).expanded, + FooterActionButton.footerContainer(context: context, child: AppFilledButton(onPressed: _search, label: context.translation.search)), + ], + ), + ), ), ); } diff --git a/lib/modules/tm_module/device_transfer/device_transfer_details.dart b/lib/modules/tm_module/device_transfer/device_transfer_details.dart index 00d6738e..acb1e613 100644 --- a/lib/modules/tm_module/device_transfer/device_transfer_details.dart +++ b/lib/modules/tm_module/device_transfer/device_transfer_details.dart @@ -252,7 +252,7 @@ class _DeviceTransferDetailsState extends State { ], ), 8.height, - context.translation.workOrderDetails.heading5(context), + context.translation.workOrderDetails.heading5(context).custom(color: AppColor.textStyleColor(context)), infoText(label: context.translation.destinationSite, value: _model?.senderSiteName), // infoText(label: "Sender Building".addTranslation, value: _model?.senderBuildingName), // infoText(label: "Sender Floor".addTranslation, value: _model?.senderFloorName), @@ -332,7 +332,7 @@ class _DeviceTransferDetailsState extends State { children: [ statusLabel ?? Container(), if (statusLabel != null) 8.height, - isSender ? context.translation.senderDetails.heading5(context) : context.translation.receiverDetails.heading5(context), + isSender ? context.translation.senderDetails.heading5(context) : context.translation.receiverDetails.heading5(context).custom(color: AppColor.textStyleColor(context)), ], ).expanded, if (context.userProvider.isEngineer || context.userProvider.isNurse) diff --git a/lib/modules/tm_module/gas_refill/create_gas_refill_request.dart b/lib/modules/tm_module/gas_refill/create_gas_refill_request.dart index fb1daeb8..ccf1e9f6 100644 --- a/lib/modules/tm_module/gas_refill/create_gas_refill_request.dart +++ b/lib/modules/tm_module/gas_refill/create_gas_refill_request.dart @@ -15,6 +15,7 @@ import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/timer_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/providers/loading_list_notifier.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; @@ -242,7 +243,7 @@ class _RequestGasRefillState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - context.translation.gasRefill.heading5(context), + context.translation.gasRefill.heading5(context).custom(color: AppColor.textStyleColor(context)), 8.height, '${context.translation.gasRequest}: ${widget.gasRefillModel!.gasRefillDetails![0].gasType!.name}'.bodyText(context), '${context.translation.cylinderType}: ${widget.gasRefillModel!.gasRefillDetails![0].cylinderType!.name}'.bodyText(context), diff --git a/lib/modules/tm_module/gas_refill/gas_refill_request_form.dart b/lib/modules/tm_module/gas_refill/gas_refill_request_form.dart index 1d61deca..8b6814c8 100644 --- a/lib/modules/tm_module/gas_refill/gas_refill_request_form.dart +++ b/lib/modules/tm_module/gas_refill/gas_refill_request_form.dart @@ -300,7 +300,7 @@ class _GasRefillRequestFormState extends State { // Column( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ -// (_gasModel.gasRefillDetails![index].gasType?.name ?? "").heading5(context), +// (_gasModel.gasRefillDetails![index].gasType?.name ?? "").heading5(context).custom(color: AppColor.textStyleColor(context)), // 8.height, // ("${context.translation.quantity}: ${_gasModel.gasRefillDetails![index].requestedQty}").bodyText(context), // ("${context.translation.cylinderSize}: ${_gasModel.gasRefillDetails![index].cylinderSize?.name}").bodyText(context), @@ -655,7 +655,7 @@ class _GasRefillRequestFormState extends State { // // Column( // // crossAxisAlignment: CrossAxisAlignment.start, // // children: [ -// // (_gasModel.gasRefillDetails![index].gasType?.name ?? "").heading5(context), +// // (_gasModel.gasRefillDetails![index].gasType?.name ?? "").heading5(context).custom(color: AppColor.textStyleColor(context)), // // 8.height, // // ("${context.translation.quantity}: ${_gasModel.gasRefillDetails![index].requestedQty}").bodyText(context), // // ("${context.translation.cylinderSize}: ${_gasModel.gasRefillDetails![index].cylinderSize?.name}").bodyText(context), diff --git a/lib/modules/traf_module/create_traf_request_page.dart b/lib/modules/traf_module/create_traf_request_page.dart index 8a7f5435..ce3818f4 100644 --- a/lib/modules/traf_module/create_traf_request_page.dart +++ b/lib/modules/traf_module/create_traf_request_page.dart @@ -308,7 +308,7 @@ class _CreateTRAFRequestPageState extends State { title: Text("Name: ${userBasedOnSearch[index].userName ?? ""}"), subtitle: Text( "Position: ${userBasedOnSearch[index].position ?? "-"}\nEmail: ${userBasedOnSearch[index].email ?? ""}\nPhone: ${userBasedOnSearch[index].phoneNumber ?? ""}"), - trailing: const Icon(Icons.delete_rounded, color: Color(0xffF63939), size: 20).onPress(() { + trailing: "delete".toSvgAsset().onPress(() { userBasedOnSearch.removeAt(index); setState(() {}); }), diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index e5a249b0..1a021c19 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -90,6 +90,8 @@ class AppColor { static const Color orange60 = Color(0xff886400); static const Color orange70 = Color(0xffFFC945); static const Color orange80 = Color(0xff65531B); + static const Color yellowBgColor = Color(0xffF4DC92); + static const Color yellowTextColor = Color(0xff65531B); // new UI colors diff --git a/lib/new_views/common_widgets/asset_info_card.dart b/lib/new_views/common_widgets/asset_info_card.dart index c3400768..0540ac45 100644 --- a/lib/new_views/common_widgets/asset_info_card.dart +++ b/lib/new_views/common_widgets/asset_info_card.dart @@ -3,6 +3,7 @@ import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; import '../../models/device/asset.dart'; @@ -16,7 +17,7 @@ class AssetInfoCard extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - (asset.modelDefinition?.assetName?.cleanupWhitespace.capitalizeFirstOfEach ?? "").heading5(context), + (asset.modelDefinition?.assetName?.cleanupWhitespace.capitalizeFirstOfEach ?? "").heading5(context).custom(color: AppColor.textStyleColor(context)), 8.height, "${context.translation.assetNo}: ${asset.assetNumber}".bodyText(context), "${context.translation.manufacture}: ${asset.modelDefinition?.manufacturerName}".bodyText(context), diff --git a/lib/new_views/pages/help_center_page.dart b/lib/new_views/pages/help_center_page.dart index d8c78acf..d0847eeb 100644 --- a/lib/new_views/pages/help_center_page.dart +++ b/lib/new_views/pages/help_center_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; import '../common_widgets/default_app_bar.dart'; @@ -41,7 +42,7 @@ class HelpCenterPage extends StatelessWidget { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - title.heading5(context), + title.heading5(context).custom(color: AppColor.textStyleColor(context)), "arrow_right".toSvgAsset(width: 17), ], ); diff --git a/lib/new_views/pages/land_page/calender_fragments/calendar_header.dart b/lib/new_views/pages/land_page/calender_fragments/calendar_header.dart index fd0934e2..c65109c1 100644 --- a/lib/new_views/pages/land_page/calender_fragments/calendar_header.dart +++ b/lib/new_views/pages/land_page/calender_fragments/calendar_header.dart @@ -19,7 +19,7 @@ class CalendarHeader extends StatelessWidget { children: [ Row( children: [ - dateFormat.format(dateTime).heading5(context), + dateFormat.format(dateTime).heading5(context).custom(color: AppColor.textStyleColor(context)), 6.width, Align(alignment: AlignmentDirectional.centerEnd, child: Icon(Icons.keyboard_arrow_down_sharp, color: context.isDark ? AppColor.neutral10 : AppColor.neutral60, size: 24)), const Spacer(), diff --git a/lib/new_views/pages/land_page/create_request_type_bottom_sheet.dart b/lib/new_views/pages/land_page/create_request_type_bottom_sheet.dart index 5fa4e229..7c1bdb87 100644 --- a/lib/new_views/pages/land_page/create_request_type_bottom_sheet.dart +++ b/lib/new_views/pages/land_page/create_request_type_bottom_sheet.dart @@ -115,26 +115,26 @@ class CreateRequestModel { // } // }); if (context.userProvider.isQualityUser && context.settingProvider.isUserFlowMedical) { - 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("Equipment Internal Audit Checklist".addTranslation, "wo/equipment_audit_wo", CreateEquipmentInternalAuditForm.id)); + list.add(CreateRequestModel("System Internal Audit Checklist".addTranslation, "wo/system_audit_wo", CreateSystemInternalAuditForm.id)); } else if (context.userProvider.isAssessor && context.settingProvider.isUserFlowMedical) { - list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id)); + list.add(CreateRequestModel("TRAF".addTranslation, "wo/traf_wo", CreateTRAFRequestPage.id)); } else if (context.userProvider.isEngineer) { if (Provider.of(context, listen: false).engineerCanCreateCM) { list.add(CreateRequestModel(context.translation.correctiveMaintenance, "wo/cm_wo", CreateCMRequest.id)); } //TODO uncommit this to enable task. - list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id)); + list.add(CreateRequestModel(context.translation.task, "wo/task_wo", CreateTaskView.id)); //Need to add check from permission Api. if ((context.settingProvider.isUserFlowMedical)) { - list.add(CreateRequestModel('Medical Gas'.addTranslation, "add_icon", CreateMedicalGasRequestPage.id)); + list.add(CreateRequestModel('Medical Gas'.addTranslation, "wo/gas_refill_wo", CreateMedicalGasRequestPage.id)); } } else { list.add(CreateRequestModel(context.translation.correctiveMaintenance, "wo/cm_wo", CreateCMRequest.id)); list.add(CreateRequestModel(context.translation.gasRefill, "wo/gas_refill_wo", GasRefillRequestForm.routeName)); list.add(CreateRequestModel(context.translation.transferAsset, "wo/device_transfer_wo", CreateDeviceTransferRequest.id)); - list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id)); + list.add(CreateRequestModel(context.translation.task, "wo/task_wo", CreateTaskView.id)); // context.userProvider.modulesPermissionsList.forEach((module) { // if (module.module!.value! == 9) { // list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id)); @@ -149,14 +149,14 @@ class CreateRequestModel { context.userProvider.modulesPermissionsList.forEach((module) { if (module.module!.value! == 9 && (module.canAdd ?? false)) { - list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id)); + list.add(CreateRequestModel("TRAF".addTranslation, "wo/traf_wo", CreateTRAFRequestPage.id)); } if (module.module!.value! == 15 && (module.canAdd ?? false)) { list.add(CreateRequestModel('Demo Request'.addTranslation, "wo/demo_wo", CreateDemoRequestPage.id)); } }); if (!context.userProvider.isNurse && context.settingProvider.isUserFlowMedical) { - list.add(CreateRequestModel("Incident Management", "add_icon", CreateIncidentRequestPage.id)); + list.add(CreateRequestModel("Incident Management", "wo/incident_wo", CreateIncidentRequestPage.id)); } return list; } diff --git a/lib/new_views/pages/land_page/land_page.dart b/lib/new_views/pages/land_page/land_page.dart index a495d8c1..a52085a0 100644 --- a/lib/new_views/pages/land_page/land_page.dart +++ b/lib/new_views/pages/land_page/land_page.dart @@ -22,7 +22,7 @@ import 'package:test_sa/new_views/pages/land_page/my_request/my_requests_page.da import 'package:test_sa/new_views/pages/login_page.dart'; import 'package:test_sa/new_views/pages/settings_page.dart'; import 'package:test_sa/providers/work_order/vendor_provider.dart'; -import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; +import 'package:test_sa/views/widgets/equipment/my_assets_page.dart'; import '../../../controllers/providers/settings/setting_provider.dart'; import '../../../views/widgets/dialogs/dialog.dart'; diff --git a/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart b/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart index 53a4089a..61e4e63a 100644 --- a/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart +++ b/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart @@ -141,24 +141,22 @@ class _AllRequestsFilterPageState extends State { title: context.translation.filter, actions: [ if (_showResetButton()) - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - context.translation.reset, - style: AppTextStyles.bodyText2.copyWith(color: AppColor.loadingColor(context)), - ).paddingAll(8).onPress(() { - Provider.of(context, listen: false).searchedModel = null; - setState(() { - search?.statuses?.clear(); - search?.typeTransaction?.clear(); - search?.startDate = null; - search?.endDate = null; - search?.isArchived = false; - }); - }), - ], - ) + TextButton( + onPressed: () { + setState(() { + search?.statuses?.clear(); + search?.typeTransaction?.clear(); + search?.startDate = null; + search?.endDate = null; + search?.isArchived = false; + }); + }, + style: TextButton.styleFrom(padding: EdgeInsets.zero, tapTargetSize: MaterialTapTargetSize.shrinkWrap), + child: Text( + 'Clear Filters', + style: AppTextStyles.bodyText2.copyWith(color: AppColor.primary10), + ), + ).paddingOnly(start: 16, end: 16) ], ), body: Column( @@ -168,7 +166,7 @@ class _AllRequestsFilterPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - "WO Status".heading5(context), + "WO Status".heading5(context).custom(color: AppColor.textStyleColor(context)), 8.height, RequestsTypeFilter( initialValues: search?.statuses ?? [], @@ -185,7 +183,7 @@ class _AllRequestsFilterPageState extends State { }, ), 16.height, - "Type of WO".heading5(context), + "Type of WO".heading5(context).custom(color: AppColor.textStyleColor(context)), 8.height, RequestsTypeFilter( initialValues: search?.typeTransaction ?? [], @@ -196,7 +194,7 @@ class _AllRequestsFilterPageState extends State { }, ), 16.height, - context.translation.pickDate.heading5(context), + context.translation.pickDate.heading5(context).custom(color: AppColor.textStyleColor(context)), 8.height, Row( children: [ @@ -228,7 +226,7 @@ class _AllRequestsFilterPageState extends State { ], ), 16.height, - // "Archived WO".heading5(context), + // "Archived WO".heading5(context).custom(color: AppColor.textStyleColor(context)), // // 8.height, // Row( // children: [ diff --git a/lib/new_views/pages/land_page/my_request/my_requests_page.dart b/lib/new_views/pages/land_page/my_request/my_requests_page.dart index b8b0c850..6e25f3c9 100644 --- a/lib/new_views/pages/land_page/my_request/my_requests_page.dart +++ b/lib/new_views/pages/land_page/my_request/my_requests_page.dart @@ -186,6 +186,7 @@ class _MyRequestsPageState extends State { body: Consumer(builder: (context, snapshot, _) { return Column( children: [ + if (!_filterIsEmpty()) _buildActiveFiltersChips(), if (_filterIsEmpty()) SizedBox( height: 50.toScreenHeight, @@ -254,12 +255,333 @@ class _MyRequestsPageState extends State { (_search!.manufacture?.value?.isNotEmpty ?? false) || (_search!.sn?.value?.isNotEmpty ?? false) || (_search!.statuses?.isNotEmpty ?? false) || + (_search!.typeTransaction?.isNotEmpty ?? false) || (_search!.startDate != null) || - (_search!.endDate != null)) { + (_search!.endDate != null) || + (_search!.selectedSortOption?.isNotEmpty ?? false)) { return false; } return true; } + + Widget _buildActiveFiltersChips() { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: AppColor.background(context), + border: Border( + bottom: BorderSide(color: AppColor.borderColor(context), width: 1), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Active Filters', + style: AppTextStyles.tinyFont2.copyWith(color: AppColor.labelTextStyleColor(context), fontWeight: FontWeight.w600), + ), + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16, + children: [ + SizedBox( + height: 40.toScreenHeight, + child: ListView.separated( + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.only(top: 8, right: 0, left: 0, bottom: 0), + itemBuilder: (cxt, index) => _getActiveFilterChips()[index], + separatorBuilder: (cxt, index) => 8.width, + itemCount: _getActiveFilterChips().length), + ).expanded, + TextButton( + onPressed: _clearAllFilters, + style: TextButton.styleFrom(padding: EdgeInsets.zero, tapTargetSize: MaterialTapTargetSize.shrinkWrap), + child: Text( + 'Clear Filters', + style: AppTextStyles.tinyFont.copyWith(color: AppColor.primary10, fontWeight: FontWeight.w500), + ), + ), + ], + ) + ], + ), + ); + } + + List _getActiveFilterChips() { + List chips = []; + + // Request Number + if (_search?.requestNumber?.value?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.woNumber}: ${_search!.requestNumber!.value}', + onDelete: () { + setState(() { + _search!.requestNumber!.value = null; + _search!.requestNumber!.controller?.clear(); + _refreshWithFilters(); + }); + }, + )); + } + + // Asset Name + if (_search?.assetName?.value?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.assetName}: ${_search!.assetName!.value}', + onDelete: () { + setState(() { + _search!.assetName!.value = null; + _search!.assetName!.controller?.clear(); + _refreshWithFilters(); + }); + }, + )); + } + + // Asset Number + if (_search?.assetNo?.value?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.assetNo}: ${_search!.assetNo!.value}', + onDelete: () { + setState(() { + _search!.assetNo!.value = null; + _search!.assetNo!.controller?.clear(); + _refreshWithFilters(); + }); + }, + )); + } + + // Manufacturer + if (_search?.manufacture?.value?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.manufacture}: ${_search!.manufacture!.value}', + onDelete: () { + setState(() { + _search!.manufacture!.value = null; + _search!.manufacture!.controller?.clear(); + _refreshWithFilters(); + }); + }, + )); + } + + // Serial Number + if (_search?.sn?.value?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.sn}: ${_search!.sn!.value}', + onDelete: () { + setState(() { + _search!.sn!.value = null; + _search!.sn!.controller?.clear(); + _refreshWithFilters(); + }); + }, + )); + } + + // Model + if (_search?.model?.value?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.model}: ${_search!.model!.value}', + onDelete: () { + setState(() { + _search!.model!.value = null; + _search!.model!.controller?.clear(); + _refreshWithFilters(); + }); + }, + )); + } + + // Statuses + if (_search?.statuses?.isNotEmpty ?? false) { + for (var statusId in _search!.statuses!) { + String statusName = _getStatusName(statusId); + chips.add(_buildFilterChip( + label: 'Status: $statusName', + onDelete: () { + setState(() { + _search!.statuses!.remove(statusId); + _refreshWithFilters(); + }); + }, + )); + } + } + + // Type Transactions + if (_search?.typeTransaction?.isNotEmpty ?? false) { + for (var typeId in _search!.typeTransaction!) { + String typeName = _getTypeName(typeId); + chips.add(_buildFilterChip( + label: 'Type: $typeName', + onDelete: () { + setState(() { + _search!.typeTransaction!.remove(typeId); + _refreshWithFilters(); + }); + }, + )); + } + } + + // Date Range + if (_search?.startDate != null || _search?.endDate != null) { + String dateLabel = 'Date: '; + if (_search!.startDate != null && _search!.endDate != null) { + dateLabel += '${_formatDate(_search!.startDate!)} - ${_formatDate(_search!.endDate!)}'; + } else if (_search!.startDate != null) { + dateLabel += 'From ${_formatDate(_search!.startDate!)}'; + } else if (_search!.endDate != null) { + dateLabel += 'To ${_formatDate(_search!.endDate!)}'; + } + + chips.add(_buildFilterChip( + label: dateLabel, + onDelete: () { + setState(() { + _search!.startDate = null; + _search!.endDate = null; + _refreshWithFilters(); + }); + }, + )); + } + + // Sort Option + if (_search?.selectedSortOption?.isNotEmpty ?? false) { + String sortLabel = 'Sort: ${_getSortLabel(_search!.selectedSortOption!)}'; + chips.add(_buildFilterChip( + label: sortLabel, + showDelete: false, + )); + } + + return chips; + } + + Widget _buildFilterChip({required String label, VoidCallback? onDelete, bool showDelete = true}) { + return Theme( + data: Theme.of(context).copyWith(splashColor: Colors.transparent, highlightColor: Colors.transparent), + child: Chip( + backgroundColor: AppColor.backgroundTabBarColor(context), + side: BorderSide(color: AppColor.border2Color(context)), + label: Text(label), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)), + labelStyle: AppTextStyles.tinyFont2.copyWith(color: AppColor.labelTextStyleColor(context)), + deleteIconColor: showDelete ? AppColor.icon2Color(context) : null, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + onDeleted: showDelete ? onDelete : null, + ), + ); + } + + String _getStatusName(int statusId) { + switch (statusId) { + case 0: + return "All WO"; + case 1: + return context.translation.open; + case 2: + return context.translation.inProgress; + case 3: + return context.translation.closed; + case 4: + return context.translation.completed; + case 5: + return "Canceled"; + default: + return "Status $statusId"; + } + } + + String _getTypeName(int typeId) { + switch (typeId) { + case 1: + return context.translation.correctiveMaintenance; + case 2: + return context.translation.gasRefill; + case 3: + return context.translation.transferAsset; + case 4: + return context.translation.preventiveMaintenance; + case 5: + return context.translation.recurrentWo; + case 6: + return context.translation.taskRequest; + case 7: + return 'Recall and Alert'; + case 8: + return 'Asset Inventory'; + case 9: + return 'TRAF'; + case 10: + return 'Equipment Internal Audit'; + case 11: + return 'System Internal Audit'; + case 12: + return 'Loan Equipment'; + case 13: + return 'Asset Delivery'; + case 14: + return 'Medical Gas Inspection'; + case 15: + return 'Demo'; + case 16: + return 'Incidents'; + default: + return "Type $typeId"; + } + } + + String _formatDate(DateTime date) { + return '${date.day}/${date.month}/${date.year}'; + } + + String _getSortLabel(String sortOption) { + switch (sortOption.toLowerCase()) { + case 'ascending': + return 'Ascending'; + case 'descending': + return 'Descending'; + default: + return sortOption; + } + } + + void _clearAllFilters() { + setState(() { + _search?.requestNumber?.value = null; + _search?.requestNumber?.controller?.clear(); + _search?.assetName?.value = null; + _search?.assetName?.controller?.clear(); + _search?.assetNo?.value = null; + _search?.assetNo?.controller?.clear(); + _search?.manufacture?.value = null; + _search?.manufacture?.controller?.clear(); + _search?.sn?.value = null; + _search?.sn?.controller?.clear(); + _search?.model?.value = null; + _search?.model?.controller?.clear(); + _search?.statuses?.clear(); + _search?.typeTransaction?.clear(); + _search?.startDate = null; + _search?.endDate = null; + _search?.isArchived = false; + _search?.selectedSortOption = null; + _search = null; // Clear the entire search object + _provider?.searchedModel = null; + _refreshWithFilters(); + }); + } + + void _refreshWithFilters() { + _provider?.reset(); + _provider?.getAllRequests(context, typeTransaction: requestsList[selectedRequest].id, search: _search); + } } class Request { diff --git a/lib/new_views/pages/report_bug_page.dart b/lib/new_views/pages/report_bug_page.dart index f7df033b..84dc988d 100644 --- a/lib/new_views/pages/report_bug_page.dart +++ b/lib/new_views/pages/report_bug_page.dart @@ -6,6 +6,7 @@ import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/user.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 '../../controllers/providers/api/user_provider.dart'; @@ -31,7 +32,7 @@ class ReportBugPage extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - user.clientName!.heading5(context), + user.clientName!.heading5(context).custom(color: AppColor.textStyleColor(context)), 8.height, "Call ID: ${0}".bodyText(context), "Date of Survey: ${DateFormat("dd MMM, yyyy").format(DateTime.now())}".bodyText(context), diff --git a/lib/new_views/pages/settings_page.dart b/lib/new_views/pages/settings_page.dart index 15bf5f98..790785b3 100644 --- a/lib/new_views/pages/settings_page.dart +++ b/lib/new_views/pages/settings_page.dart @@ -105,7 +105,7 @@ class _SettingsPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - context.translation.arabic.heading5(context), + context.translation.arabic.heading5(context).custom(color: AppColor.textStyleColor(context)), AdvancedSwitch( controller: langController, activeColor: AppColor.green50.withOpacity(0.5), @@ -127,7 +127,7 @@ class _SettingsPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - context.translation.lightTheme.heading5(context), + context.translation.lightTheme.heading5(context).custom(color: AppColor.textStyleColor(context)), AdvancedSwitch( controller: themeController, activeColor: AppColor.green50.withOpacity(0.5), @@ -158,7 +158,7 @@ class _SettingsPageState extends State { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - "Fingerprint/Face ID".heading5(context), + "Fingerprint/Face ID".heading5(context).custom(color: AppColor.textStyleColor(context)), customSwitch(localAuth).onPress(() { checkForLocalAuth(localAuth); }), diff --git a/lib/new_views/pages/unsafe_device_view.dart b/lib/new_views/pages/unsafe_device_view.dart index 6b482553..2f6d2f10 100644 --- a/lib/new_views/pages/unsafe_device_view.dart +++ b/lib/new_views/pages/unsafe_device_view.dart @@ -32,7 +32,7 @@ class _UnsafeDeviceScreenState extends State { // Center(child: Image.asset("assets/images/logos/main_mohemm_logo.png", width: 200, height: 50)), "logo".toSvgAsset(height: 64), 50.height, - "Sorry".heading5(context), + "Sorry".heading5(context).custom(color: AppColor.textStyleColor(context)), 21.height, "You are using Atoms app on an unsafe device. To be able to use the app with all it's features, Please make sure that the below points are considered: " .heading5(context).paddingOnly(start: 20, end: 20), diff --git a/lib/new_views/swipe_module/mark_attendance_widget.dart b/lib/new_views/swipe_module/mark_attendance_widget.dart index 6a6740e8..7ebe6b6a 100644 --- a/lib/new_views/swipe_module/mark_attendance_widget.dart +++ b/lib/new_views/swipe_module/mark_attendance_widget.dart @@ -144,7 +144,7 @@ // mainAxisSize: MainAxisSize.min, // children: [ // 20.height, -// 'click me '.heading5(context), +// 'click me '.heading5(context).custom(color: AppColor.textStyleColor(context)), // // LocaleKeys.markAttendance.tr().toSectionHeading(), // // LocaleKeys.selectMethodOfAttendance.tr().toText11(color: const Color(0xff535353)), // GridView( diff --git a/lib/views/pages/user/notifications/notifications_list.dart b/lib/views/pages/user/notifications/notifications_list.dart index e82a2fb5..db311261 100644 --- a/lib/views/pages/user/notifications/notifications_list.dart +++ b/lib/views/pages/user/notifications/notifications_list.dart @@ -29,7 +29,7 @@ class NotificationsList extends StatelessWidget { physics: const NeverScrollableScrollPhysics(), padding: const EdgeInsets.all(0), itemCount: notifications.length, - separatorBuilder: (context, itemIndex) => const Divider().defaultStyle(context).paddingOnly(top: 16, bottom: 16), + separatorBuilder: (context, itemIndex) => const Divider().defaultStyle(context).paddingOnly(top: 4, bottom: 4), itemBuilder: (context, itemIndex) { return NotificationItem( notification: notifications[itemIndex], diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index 8c86ed1c..62911777 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -163,13 +163,13 @@ class _ProfilePageState extends State { // if ((_user.phoneNumber ?? "").isNotEmpty) ...[ // const Divider().defaultStyle(context), // 8.height, - // (_user.phoneNumber??"").heading5(context), + // (_user.phoneNumber??"").heading5(context).custom(color: AppColor.textStyleColor(context)), // 8.height, // ], // if ((_user.extensionNo ?? "").isNotEmpty) ...[ // const Divider().defaultStyle(context), // 8.height, - // _user.extensionNo!.heading5(context), + // _user.extensionNo!.heading5(context).custom(color: AppColor.textStyleColor(context)), // 8.height, // ], if ((_user.departmentName?.length ?? 0) > 0) const Divider().defaultStyle(context), diff --git a/lib/views/pages/user/requests/create_service_request_page.dart b/lib/views/pages/user/requests/create_service_request_page.dart index dee41f1f..3c94b7de 100644 --- a/lib/views/pages/user/requests/create_service_request_page.dart +++ b/lib/views/pages/user/requests/create_service_request_page.dart @@ -291,7 +291,7 @@ // // // Align( // // alignment: AlignmentDirectional.centerStart, -// // child: context.translation.callComments.heading5(context), +// // child: context.translation.callComments.heading5(context).custom(color: AppColor.textStyleColor(context)), // // ), // 8.height, // // SpeechToTextButton( diff --git a/lib/views/widgets/bottom_sheets/asset_detail_bottom_sheet.dart b/lib/views/widgets/bottom_sheets/asset_detail_bottom_sheet.dart index c0192cd1..fd203840 100644 --- a/lib/views/widgets/bottom_sheets/asset_detail_bottom_sheet.dart +++ b/lib/views/widgets/bottom_sheets/asset_detail_bottom_sheet.dart @@ -23,7 +23,7 @@ class AssetDetailBottomSheet extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - (asset?.modelDefinition?.assetName?.cleanupWhitespace.capitalizeFirstOfEach ?? "-").heading5(context), + (asset?.modelDefinition?.assetName?.cleanupWhitespace.capitalizeFirstOfEach ?? "-").heading5(context).custom(color: AppColor.textStyleColor(context)), 16.height, AspectRatio( aspectRatio: 358 / 136, diff --git a/lib/views/widgets/equipment/asset_detail_page.dart b/lib/views/widgets/equipment/asset_detail_page.dart index f0b095fb..6db652dd 100644 --- a/lib/views/widgets/equipment/asset_detail_page.dart +++ b/lib/views/widgets/equipment/asset_detail_page.dart @@ -96,7 +96,7 @@ class _AssetDetailPageState extends State { backgroundColor: AppColor.getRequestStatusColorByName(context, assetModel.commissioningStatus!.name!), ), if (assetModel.commissioningStatus != null) 8.height, - (assetModel.modelDefinition?.assetName?.cleanupWhitespace.capitalizeFirstOfEach ?? "-").heading5(context), + (assetModel.modelDefinition?.assetName?.cleanupWhitespace.capitalizeFirstOfEach ?? "-").heading5(context).custom(color: AppColor.textStyleColor(context)), 8.height, Row( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/views/widgets/equipment/asset_item_gridview.dart b/lib/views/widgets/equipment/asset_item_gridview.dart index cc463097..4947d46d 100644 --- a/lib/views/widgets/equipment/asset_item_gridview.dart +++ b/lib/views/widgets/equipment/asset_item_gridview.dart @@ -5,6 +5,7 @@ import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/asset.dart'; +import 'package:test_sa/views/widgets/item_views/info_text_widget.dart'; import '../../../new_views/app_style/app_color.dart'; @@ -41,20 +42,23 @@ class AssetItemGridView extends StatelessWidget { device.modelDefinition!.assetName!.cleanupWhitespace.capitalizeFirstOfEach, maxLines: 2, overflow: TextOverflow.ellipsis, - style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + style: AppTextStyles.bodyText.copyWith(color: AppColor.textStyleColor(context)), ), Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - "${context.translation.assetNumber} : ${device.assetNumber}".bodyText2(context), - "${context.translation.modelName} : ${device.modelDefinition!.modelName}".cleanupWhitespace.capitalizeFirstOfEach.bodyText2(context), - Text( - "${context.translation.serialNo} : ${device.assetSerialNo}", - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: AppTextStyles.bodyText2.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), - ).expanded, + // "${context.translation.assetNumber} : ${device.assetNumber}".bodyText2(context), + // "${context.translation.modelName} : ${device.modelDefinition!.modelName}".cleanupWhitespace.capitalizeFirstOfEach.bodyText2(context), + // Text( + // "${context.translation.serialNo} : ${device.assetSerialNo}", + // maxLines: 2, + // overflow: TextOverflow.ellipsis, + // style: AppTextStyles.bodyText2.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), + // ).expanded, + InfoTextWidget(label: context.translation.assetNumber, value: device.assetNumber), + InfoTextWidget(label: context.translation.modelName, value: device.modelDefinition!.modelName), + InfoTextWidget(label: context.translation.serialNo, value: device.assetSerialNo), ], ).expanded, Row( @@ -62,15 +66,15 @@ class AssetItemGridView extends StatelessWidget { children: [ Text( 'View Details', - style: AppTextStyles.bodyText2.copyWith(color: AppColor.blueStatus(context)), + style: AppTextStyles.bodyText2.copyWith(color: AppColor.primary10), ), 4.width, - Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14) + const Icon(Icons.arrow_forward, color: AppColor.primary10, size: 14) ], ), ], ).expanded ], - ).onPress(() => onPressed(device)).toShadowContainer(context,padding: 12); + ).onPress(() => onPressed(device)).toShadowContainer(context); } } diff --git a/lib/views/widgets/equipment/asset_item_listview.dart b/lib/views/widgets/equipment/asset_item_listview.dart index f2aab423..e5fe91e9 100644 --- a/lib/views/widgets/equipment/asset_item_listview.dart +++ b/lib/views/widgets/equipment/asset_item_listview.dart @@ -6,6 +6,8 @@ import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/views/widgets/item_views/info_header_widget.dart'; +import 'package:test_sa/views/widgets/item_views/info_text_widget.dart'; class AssetItemListView extends StatelessWidget { final Asset device; @@ -24,14 +26,14 @@ class AssetItemListView extends StatelessWidget { width: 95, height: 95, decoration: ShapeDecoration( - color: context.isDark ? AppColor.neutral50 : AppColor.neutral30, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + color: AppColor.dropDownBackground(context), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10), side: BorderSide(color: AppColor.border2Color(context))), image: DecorationImage( fit: BoxFit.cover, image: NetworkImage(device.assetPhoto != null ? URLs.getFileUrl(device.assetPhoto!)! : "https://www.lasteelcraft.com/images/no-image-available.png"), )), ), - 15.width, + 12.width, Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, @@ -40,38 +42,33 @@ class AssetItemListView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - device.modelDefinition!.assetName!.cleanupWhitespace.capitalizeFirstOfEach.heading6(context), - 8.height, - "${context.translation.assetNumber} : ${device.assetNumber}".bodyText(context), - "${context.translation.modelName} : ${device.modelDefinition!.modelName}".cleanupWhitespace.capitalizeFirstOfEach.bodyText(context), + InfoHeaderWidget(device.modelDefinition!.assetName!.cleanupWhitespace), + // device.modelDefinition!.assetName!.cleanupWhitespace.capitalizeFirstOfEach.heading6(context), + 4.height, + InfoTextWidget(label: context.translation.assetNumber, value: device.assetNumber), + InfoTextWidget(label: context.translation.modelName, value: device.modelDefinition!.modelName), + InfoTextWidget(label: context.translation.serialNo, value: device.assetSerialNo), + // "${context.translation.assetNumber} : ${device.assetNumber}".bodyText(context), + // "${context.translation.modelName} : ${device.modelDefinition!.modelName}".cleanupWhitespace.capitalizeFirstOfEach.bodyText(context), ], ), - Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - "${context.translation.serialNo} : ${device.assetSerialNo}".bodyText(context).expanded, - 4.width, - selectButton ?? + Align( + alignment: Alignment.bottomRight, + child: selectButton ?? Row( mainAxisSize: MainAxisSize.min, children: [ Text( context.translation.viewDetails, - style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), + style: AppTextStyles.bodyText2.copyWith(color: AppColor.blueStatus(context)), ), 4.width, - Icon( - Icons.arrow_forward, - color: AppColor.blueStatus(context), - size: 14, - ) + const Icon(Icons.arrow_forward, color: AppColor.primary10, size: 14) ], - ), - ], - ) + )) ], ).expanded ], - ).toShadowContainer(context, padding: 12, borderColor: isSelected ? AppColor.blueStatus(context) : Colors.transparent).onPress(() => onPressed(device)); + ).toShadowContainer(context, borderColor: isSelected ? AppColor.primary10 : Colors.transparent).onPress(() => onPressed(device)); } } diff --git a/lib/views/widgets/equipment/asset_picker.dart b/lib/views/widgets/equipment/asset_picker.dart index d94d0d2b..fcb827d5 100644 --- a/lib/views/widgets/equipment/asset_picker.dart +++ b/lib/views/widgets/equipment/asset_picker.dart @@ -199,11 +199,7 @@ class AssetPicker extends StatelessWidget { }), if (multiSelection) ...[ 4.width, - const Icon( - Icons.delete_rounded, - color: Color(0xffF63939), - size: 20, - ).onPress(() { + "delete".toSvgAsset().onPress(() { onAssetRemove!(device.id!.toInt()); }), ] diff --git a/lib/views/widgets/equipment/commissioning_status_buttons.dart b/lib/views/widgets/equipment/asset_status_buttons.dart similarity index 86% rename from lib/views/widgets/equipment/commissioning_status_buttons.dart rename to lib/views/widgets/equipment/asset_status_buttons.dart index e0ba6565..ca16d654 100644 --- a/lib/views/widgets/equipment/commissioning_status_buttons.dart +++ b/lib/views/widgets/equipment/asset_status_buttons.dart @@ -10,17 +10,17 @@ import '../../../models/lookup.dart'; import '../../../new_views/app_style/app_color.dart'; import '../../../providers/service_request_providers/commissioning_status_provider.dart'; -class CommissioningStatusButtons extends StatefulWidget { +class AssetStatusButtons extends StatefulWidget { final Function(Lookup?)? onSelect; final Lookup? initialValue; - const CommissioningStatusButtons({Key? key, this.onSelect, this.initialValue}) : super(key: key); + const AssetStatusButtons({Key? key, this.onSelect, this.initialValue}) : super(key: key); @override - State createState() => _CommissioningStatusButtonsState(); + State createState() => _AssetStatusButtonsState(); } -class _CommissioningStatusButtonsState extends State { +class _AssetStatusButtonsState extends State { int _selectedIndex = 0; @override @@ -36,7 +36,7 @@ class _CommissioningStatusButtonsState extends State } @override - void didUpdateWidget(covariant CommissioningStatusButtons oldWidget) { + void didUpdateWidget(covariant AssetStatusButtons oldWidget) { if (widget.initialValue != oldWidget.initialValue) { final provider = Provider.of(context, listen: false); if (widget.initialValue != null) { @@ -54,7 +54,7 @@ class _CommissioningStatusButtonsState extends State return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - context.translation.assetStatus.heading5(context).paddingOnly(start: 16, end: 16), + context.translation.assetStatus.heading5(context).custom(color: AppColor.textStyleColor(context)), 8.height, Consumer( builder: (context, snapshot, _) { @@ -69,17 +69,18 @@ class _CommissioningStatusButtonsState extends State 8.width, const _Skelton().expanded, ], - ).paddingOnly(start: 16, end: 16), + ), ) : SizedBox( height: 36.toScreenHeight, - child: ListView.builder( + child: ListView.separated( itemCount: snapshot.items.length + 1, scrollDirection: Axis.horizontal, shrinkWrap: true, - padding: EdgeInsetsDirectional.only(start: 16.toScreenWidth), + padding: EdgeInsetsDirectional.only(start: 0.toScreenWidth), + separatorBuilder: (cxt, index) => 8.width, itemBuilder: (context, index) => Container( - margin: EdgeInsets.symmetric(horizontal: 4.toScreenWidth), + margin: EdgeInsets.symmetric(horizontal: 0.toScreenWidth), padding: EdgeInsets.symmetric(vertical: 8.toScreenHeight, horizontal: 12.toScreenWidth), alignment: Alignment.center, // foregroundDecoration: _selectedIndex != index @@ -104,8 +105,7 @@ class _CommissioningStatusButtonsState extends State // color: AppColor.filterButtonTextColor(context) - color: _selectedIndex == index ? AppColor.primary10 : AppColor.filterButtonTextColor(context) - ), + color: _selectedIndex == index ? AppColor.primary10 : AppColor.filterButtonTextColor(context)), ).onPress(() { setState(() { _selectedIndex = index; diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/my_assets_page.dart similarity index 52% rename from lib/views/widgets/equipment/single_device_picker.dart rename to lib/views/widgets/equipment/my_assets_page.dart index 62aca8c9..6d6ee224 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/my_assets_page.dart @@ -94,7 +94,7 @@ class _MyAssetsPageState extends State { Navigator.of(context).pop(); }), Container( - height: 40, + height: 40.toScreenHeight, padding: const EdgeInsets.only(left: 16, right: 8), alignment: Alignment.center, decoration: ShapeDecoration( @@ -169,6 +169,7 @@ class _MyAssetsPageState extends State { }, child: Column( children: [ + if (!_filterIsEmpty()) _buildActiveFiltersChips(), Expanded( child: _searchableList.isEmpty ? NoDataFound(message: context.translation.noDeviceFound).center @@ -192,7 +193,7 @@ class _MyAssetsPageState extends State { ? ListView.separated( padding: const EdgeInsets.all(16), itemCount: _searchableList.length, - separatorBuilder: (listContext, itemIndex) => 8.height, + separatorBuilder: (listContext, itemIndex) => 12.height, itemBuilder: (listContext, itemIndex) { return AssetItemListView( device: _searchableList[itemIndex], @@ -237,4 +238,314 @@ class _MyAssetsPageState extends State { ), ); } + + bool _filterIsEmpty() { + if (_searchAsset == null) return true; + if ((_searchAsset!.assetName?.isNotEmpty ?? false) || + (_searchAsset!.assetNo?.isNotEmpty ?? false) || + (_searchAsset!.assetSerialNumber?.isNotEmpty ?? false) || + (_searchAsset!.model?.isNotEmpty ?? false) || + (_searchAsset!.supplier?.isNotEmpty ?? false) || + (_searchAsset!.site?.isNotEmpty ?? false) || + (_searchAsset!.manufacturer?.isNotEmpty ?? false) || + (_searchAsset!.modelDefinition?.isNotEmpty ?? false) || + (_searchAsset!.departments?.isNotEmpty ?? false) || + (_searchAsset!.sites?.isNotEmpty ?? false) || + (_searchAsset!.assetStatus != null) || + (_searchAsset!.supplyDateFrom != null) || + (_searchAsset!.supplyDateTo != null)) { + return false; + } + return true; + } + + Widget _buildActiveFiltersChips() { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: AppColor.background(context), + border: Border( + bottom: BorderSide(color: AppColor.borderColor(context), width: 1), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Active Filters', + style: AppTextStyles.tinyFont2.copyWith( + color: AppColor.labelTextStyleColor(context), + fontWeight: FontWeight.w600, + ), + ), + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16, + children: [ + SizedBox( + height: 40.toScreenHeight, + child: ListView.separated( + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.only(top: 8, right: 0, left: 0, bottom: 0), + itemBuilder: (cxt, index) => _getActiveFilterChips()[index], + separatorBuilder: (cxt, index) => 8.width, + itemCount: _getActiveFilterChips().length, + ), + ).expanded, + TextButton( + onPressed: _clearAllFilters, + style: TextButton.styleFrom( + padding: EdgeInsets.zero, + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + child: Text( + 'Clear Filters', + style: AppTextStyles.tinyFont.copyWith( + color: AppColor.primary10, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ) + ], + ), + ); + } + + List _getActiveFilterChips() { + List chips = []; + + // Asset Name + if (_searchAsset?.assetName?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.assetName}: ${_searchAsset!.assetName}', + onDelete: () { + setState(() { + _searchAsset!.assetName = null; + _refreshWithFilters(); + }); + }, + )); + } + + // Asset Number + if (_searchAsset?.assetNo?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.assetNumber}: ${_searchAsset!.assetNo}', + onDelete: () { + setState(() { + _searchAsset!.assetNo = null; + _refreshWithFilters(); + }); + }, + )); + } + + // Serial Number + if (_searchAsset?.assetSerialNumber?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.snNumber}: ${_searchAsset!.assetSerialNumber}', + onDelete: () { + setState(() { + _searchAsset!.assetSerialNumber = null; + _refreshWithFilters(); + }); + }, + )); + } + + // Model + if (_searchAsset?.model?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.model}: ${_searchAsset!.model}', + onDelete: () { + setState(() { + _searchAsset!.model = null; + _refreshWithFilters(); + }); + }, + )); + } + + // Supplier + if (_searchAsset?.supplier?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.supplier}: ${_searchAsset!.supplier}', + onDelete: () { + setState(() { + _searchAsset!.supplier = null; + _refreshWithFilters(); + }); + }, + )); + } + + // Site (single) + if (_searchAsset?.site?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.site}: ${_searchAsset!.site}', + onDelete: () { + setState(() { + _searchAsset!.site = null; + _refreshWithFilters(); + }); + }, + )); + } + + // Manufacturer + if (_searchAsset?.manufacturer?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.manufacture}: ${_searchAsset!.manufacturer}', + onDelete: () { + setState(() { + _searchAsset!.manufacturer = null; + _refreshWithFilters(); + }); + }, + )); + } + + // Model Definition + if (_searchAsset?.modelDefinition?.isNotEmpty ?? false) { + chips.add(_buildFilterChip( + label: '${context.translation.md}: ${_searchAsset!.modelDefinition}', + onDelete: () { + setState(() { + _searchAsset!.modelDefinition = null; + _refreshWithFilters(); + }); + }, + )); + } + + // Asset Status (Commissioning Status) + if (_searchAsset?.assetStatus != null) { + chips.add(_buildFilterChip( + label: 'Status: ${_searchAsset!.assetStatus!.name ?? 'Unknown'}', + onDelete: () { + setState(() { + _searchAsset!.assetStatus = null; + _refreshWithFilters(); + }); + }, + )); + } + + // Departments (multiple) + if (_searchAsset?.departments?.isNotEmpty ?? false) { + for (var dept in _searchAsset!.departments!) { + chips.add(_buildFilterChip( + label: '${context.translation.byDepartment}: $dept', + onDelete: () { + setState(() { + _searchAsset!.departments!.remove(dept); + _refreshWithFilters(); + }); + }, + )); + } + } + + // Sites (multiple) + if (_searchAsset?.sites?.isNotEmpty ?? false) { + for (var site in _searchAsset!.sites!) { + chips.add(_buildFilterChip( + label: '${context.translation.bySite}: $site', + onDelete: () { + setState(() { + _searchAsset!.sites!.remove(site); + _refreshWithFilters(); + }); + }, + )); + } + } + + // Date Range + if (_searchAsset?.supplyDateFrom != null || _searchAsset?.supplyDateTo != null) { + String dateLabel = 'Supply Date: '; + if (_searchAsset!.supplyDateFrom != null && _searchAsset!.supplyDateTo != null) { + dateLabel += '${_formatDate(_searchAsset!.supplyDateFrom!)} - ${_formatDate(_searchAsset!.supplyDateTo!)}'; + } else if (_searchAsset!.supplyDateFrom != null) { + dateLabel += 'From ${_formatDate(_searchAsset!.supplyDateFrom!)}'; + } else if (_searchAsset!.supplyDateTo != null) { + dateLabel += 'To ${_formatDate(_searchAsset!.supplyDateTo!)}'; + } + + chips.add(_buildFilterChip( + label: dateLabel, + onDelete: () { + setState(() { + _searchAsset!.supplyDateFrom = null; + _searchAsset!.supplyDateTo = null; + _refreshWithFilters(); + }); + }, + )); + } + + return chips; + } + + Widget _buildFilterChip({required String label, required VoidCallback onDelete}) { + return Theme( + data: Theme.of(context).copyWith( + splashColor: Colors.transparent, + highlightColor: Colors.transparent, + ), + child: Chip( + backgroundColor: AppColor.backgroundTabBarColor(context), + side: BorderSide(color: AppColor.border2Color(context)), + label: Text(label), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30.0), + ), + labelStyle: AppTextStyles.tinyFont2.copyWith( + color: AppColor.labelTextStyleColor(context), + ), + deleteIconColor: AppColor.icon2Color(context), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + onDeleted: onDelete, + ), + ); + } + + String _formatDate(String dateString) { + try { + final date = DateTime.parse(dateString); + return '${date.day}/${date.month}/${date.year}'; + } catch (e) { + return dateString; + } + } + + void _clearAllFilters() { + setState(() { + _searchAsset?.assetName = null; + _searchAsset?.assetNo = null; + _searchAsset?.assetSerialNumber = null; + _searchAsset?.model = null; + _searchAsset?.supplier = null; + _searchAsset?.site = null; + _searchAsset?.manufacturer = null; + _searchAsset?.modelDefinition = null; + _searchAsset?.assetStatus = null; + _searchAsset?.departments?.clear(); + _searchAsset?.sites?.clear(); + _searchAsset?.supplyDateFrom = null; + _searchAsset?.supplyDateTo = null; + _searchAsset = null; + _refreshWithFilters(); + }); + } + + void _refreshWithFilters() { + _devicesProvider.reset(); + _devicesProvider.getAssets(search: _searchAsset); + _searchableList.clear(); + _searchableList.addAll(_devicesProvider.devices); + } } diff --git a/lib/views/widgets/equipment/pick_asset.dart b/lib/views/widgets/equipment/pick_asset.dart index f5d0f4ff..4d9c08d6 100644 --- a/lib/views/widgets/equipment/pick_asset.dart +++ b/lib/views/widgets/equipment/pick_asset.dart @@ -3,7 +3,7 @@ import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; +import 'package:test_sa/views/widgets/equipment/my_assets_page.dart'; import '../../../models/device/asset.dart'; import '../../../new_views/app_style/app_color.dart'; diff --git a/lib/views/widgets/fullscreen_dialogs/multiple_selection_fullscreen_dialog.dart b/lib/views/widgets/fullscreen_dialogs/multiple_selection_fullscreen_dialog.dart index 8e7abf36..2bb2cd87 100644 --- a/lib/views/widgets/fullscreen_dialogs/multiple_selection_fullscreen_dialog.dart +++ b/lib/views/widgets/fullscreen_dialogs/multiple_selection_fullscreen_dialog.dart @@ -54,7 +54,7 @@ class _SelectionBottomSheetState extends State extends State extends State extends State extends State { ], ).expanded, 8.width, - const Icon(Icons.delete_rounded, size: 20, color: Color(0xffF63939)).onPress(() { + "delete".toSvgAsset().onPress(() { deletePickerTime(); }) ],