From 6be8e94d67e3c7803394a6447dbb1c3c878c1082 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 13 May 2026 16:08:38 +0300 Subject: [PATCH 1/2] improvements --- .../widgets/request_category_list.dart | 2 +- lib/modules/cx_module/chat/chat_page.dart | 35 +++++------ .../chat/view_all_attachment_page.dart | 4 +- .../incident_module/incident_detail_page.dart | 2 +- .../incident_module/incident_item_view.dart | 2 +- .../pages/installation_form_view.dart | 3 +- .../pages/installation_pullout_form_view.dart | 5 +- .../update_device_transfer.dart | 5 +- .../tm_module/tasks/create_task_view.dart | 3 +- .../tasks/update_task_request_view.dart | 7 ++- .../traf_module/create_traf_request_page.dart | 2 +- .../traf_module/traf_request_detail_page.dart | 10 ++-- .../traf_module/traf_request_item_view.dart | 2 +- .../users_auto_complete_field.dart | 16 +++-- .../common_widgets/app_text_form_field.dart | 2 +- .../swipe_module/swipe_history_view.dart | 10 ++-- .../widgets/date_and_time/date_picker.dart | 4 +- lib/views/widgets/timer/app_timer.dart | 60 +++++-------------- 18 files changed, 72 insertions(+), 102 deletions(-) diff --git a/lib/dashboard_latest/widgets/request_category_list.dart b/lib/dashboard_latest/widgets/request_category_list.dart index 375d0996..f0fbafb9 100644 --- a/lib/dashboard_latest/widgets/request_category_list.dart +++ b/lib/dashboard_latest/widgets/request_category_list.dart @@ -33,7 +33,7 @@ class RequestCategoryList extends StatelessWidget { shrinkWrap: true, padding: const EdgeInsets.all(16), physics: const NeverScrollableScrollPhysics(), - separatorBuilder: (cxt, index) => 16.height, + separatorBuilder: (cxt, index) => 12.height, itemBuilder: (context, index) { if (index == list.length) { return CircularProgressIndicator(color: AppColor.loadingColor(context), strokeWidth: 1).center; diff --git a/lib/modules/cx_module/chat/chat_page.dart b/lib/modules/cx_module/chat/chat_page.dart index c3e351cc..ea9893b6 100644 --- a/lib/modules/cx_module/chat/chat_page.dart +++ b/lib/modules/cx_module/chat/chat_page.dart @@ -79,16 +79,13 @@ class _ChatMessagesState { _ChatMessagesState({ required this.isLoading, required this.messages, - }) : messageCount = messages.length, - lastMessageTime = messages.isNotEmpty ? messages.first.createdDate : null; + }) : messageCount = messages.length, + lastMessageTime = messages.isNotEmpty ? messages.first.createdDate : null; @override bool operator ==(Object other) => - identical(this, other) || - other is _ChatMessagesState && - isLoading == other.isLoading && - messageCount == other.messageCount && - lastMessageTime == other.lastMessageTime; // FIX: Compare timestamp to detect new messages + identical(this, other) || + other is _ChatMessagesState && isLoading == other.isLoading && messageCount == other.messageCount && lastMessageTime == other.lastMessageTime; // FIX: Compare timestamp to detect new messages @override int get hashCode => Object.hash(isLoading, messageCount, lastMessageTime); @@ -198,7 +195,7 @@ class _ChatPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: AppColor.white10, + // backgroundColor: AppColor.white10, appBar: DefaultAppBar(title: widget.title), // OPTIMIZATION: Using Selector for connection state (rarely changes) // This prevents rebuilding entire chat UI on every message/typing event @@ -208,7 +205,7 @@ class _ChatPageState extends State { loginResponse: provider.chatLoginResponse, ), builder: (context, connectionState, child) { - if (connectionState.isLoading) return CircularProgressIndicator(color: AppColor.loadingColor(context), strokeWidth: 3).center; + if (connectionState.isLoading) return CircularProgressIndicator(color: AppColor.loadingColor(context), strokeWidth: 3).center; if (connectionState.loginResponse == null) { return Column( @@ -278,7 +275,7 @@ class _ChatPageState extends State { style: AppTextStyles.bodyText.copyWith( color: AppColor.white10, decoration: TextDecoration.underline, - decorationColor: AppColor.white10, + decorationColor: AppColor.white10 ), ).onPress(() { Navigator.push(context, CupertinoPageRoute(builder: (context) => ViewAllAttachmentPage(moduleId: widget.moduleId, requestId: widget.requestId))); @@ -294,7 +291,7 @@ class _ChatPageState extends State { messages: provider.chatResponseList, ), builder: (context, messagesState, _) => Container( - color: AppColor.neutral100, + // color: AppColor.neutral100, child: messagesState.isLoading ? ListView( padding: const EdgeInsets.all(16), @@ -311,7 +308,7 @@ class _ChatPageState extends State { "Send a message to start conversation", overflow: TextOverflow.ellipsis, maxLines: 1, - style: AppTextStyles.heading6.copyWith(color: AppColor.neutral50.withOpacity(.5), fontWeight: FontWeight.w500), + style: AppTextStyles.heading6.copyWith(color: AppColor.lightTextColor(context), fontWeight: FontWeight.w500), ).center : ListView.builder( padding: const EdgeInsets.all(16), @@ -340,7 +337,7 @@ class _ChatPageState extends State { ), ).expanded, if (!widget.readOnly) ...[ - Divider(height: 1, thickness: 1, color: const Color(0xff767676).withOpacity(.11)), + const Divider().defaultStyle(context), SafeArea( child: ConstrainedBox( constraints: const BoxConstraints(minHeight: 56), @@ -349,8 +346,8 @@ class _ChatPageState extends State { if (chatState == ChatState.idle) ...[ TextFormField( controller: textEditingController, - cursorColor: AppColor.neutral50, - style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral50), + cursorColor: AppColor.loadingColor(context), + style: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 14, color: AppColor.textStyleColor(context)), minLines: 1, maxLines: 3, textInputAction: TextInputAction.none, @@ -371,11 +368,11 @@ class _ChatPageState extends State { errorBorder: InputBorder.none, contentPadding: const EdgeInsets.only(left: 16, top: 8, bottom: 8), alignLabelWithHint: true, - filled: true, + // filled: true, constraints: const BoxConstraints(), suffixIconConstraints: const BoxConstraints(), hintText: "Type your message here...", - hintStyle: AppTextStyles.bodyText.copyWith(color: const Color(0xffCCCCCC)), + hintStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: AppColor.lightTextColor(context)), ), ).expanded, IconButton( @@ -399,7 +396,7 @@ class _ChatPageState extends State { style: const ButtonStyle( tapTargetSize: MaterialTapTargetSize.shrinkWrap, // or .padded ), - icon: "chat_attachment".toSvgAsset(width: 24, height: 24), + icon: "chat_attachment".toSvgAsset(width: 24, height: 24,color: AppColor.icon2Color(context)), constraints: const BoxConstraints(), ), IconButton( @@ -420,7 +417,7 @@ class _ChatPageState extends State { style: const ButtonStyle( tapTargetSize: MaterialTapTargetSize.shrinkWrap, // or .padded ), - icon: "chat_mic".toSvgAsset(width: 24, height: 24), + icon: "chat_mic".toSvgAsset(width: 24, height: 24,color: AppColor.icon2Color(context)), constraints: const BoxConstraints(), ), ] else if (chatState == ChatState.voiceRecordingStarted) ...[ diff --git a/lib/modules/cx_module/chat/view_all_attachment_page.dart b/lib/modules/cx_module/chat/view_all_attachment_page.dart index 4e865e42..1e442591 100644 --- a/lib/modules/cx_module/chat/view_all_attachment_page.dart +++ b/lib/modules/cx_module/chat/view_all_attachment_page.dart @@ -55,7 +55,7 @@ class _ViewAllAttachmentPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: AppColor.neutral100, + // backgroundColor: AppColor.neutral100, appBar: const DefaultAppBar(title: "Documents"), body: FutureBuilder>( future: viewAllDocuments(widget.moduleId, widget.requestId), @@ -112,7 +112,7 @@ class AttachmentFileViewer extends StatelessWidget { decoration: ShapeDecoration( color: AppColor.background(context), shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: (context.isDark ? AppColor.neutral20 : AppColor.neutral30)), + side: BorderSide(width: 1, color: AppColor.border2Color(context)), borderRadius: BorderRadius.circular(32), ), ), diff --git a/lib/modules/incident_module/incident_detail_page.dart b/lib/modules/incident_module/incident_detail_page.dart index d2dad569..ea8f37c4 100644 --- a/lib/modules/incident_module/incident_detail_page.dart +++ b/lib/modules/incident_module/incident_detail_page.dart @@ -54,7 +54,7 @@ class IncidentDetailPage extends StatelessWidget { InfoDateWidget(snapshot.data!.createdDate?.toString() ?? ""), ], ), - 12.height, + // 12.height, ...requesterDetails(context, snapshot.data!), const Divider().defaultStyle(context), ...requestDetails(context, snapshot.data!), diff --git a/lib/modules/incident_module/incident_item_view.dart b/lib/modules/incident_module/incident_item_view.dart index aa9d0711..8ffad76b 100644 --- a/lib/modules/incident_module/incident_item_view.dart +++ b/lib/modules/incident_module/incident_item_view.dart @@ -66,7 +66,7 @@ class IncidentItemView extends StatelessWidget { InfoTextWidget(label: context.translation.requestType, value: requestDetails!.requestType), InfoTextWidget(label: "Incident No", value: requestDetails!.requestNo), InfoTextWidget(label: context.translation.assetName, value: requestDetails!.assetName), - InfoTextWidget(label: context.translation.site, value: requestDetails!.site, showArrow: true), + InfoTextWidget(label: context.translation.site, value: requestDetails!.site, showEmptyValue: true, showArrow: true), ], ).toShadowContainer(context, withShadow: showShadow).onPress(() async { Navigator.push(context, MaterialPageRoute(builder: (context) => IncidentDetailPage(incidentId: requestDetails!.id!))); diff --git a/lib/modules/loan_module/pages/installation_form_view.dart b/lib/modules/loan_module/pages/installation_form_view.dart index f39b3ac6..5ad7e3c4 100644 --- a/lib/modules/loan_module/pages/installation_form_view.dart +++ b/lib/modules/loan_module/pages/installation_form_view.dart @@ -23,6 +23,7 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; @@ -115,7 +116,7 @@ class _InstallationFormViewState extends State { formatDateWithTime: true, date: _formData.date, onDatePicker: (DateTime date) async { - final time = await showTimePicker(context: context, initialTime: TimeOfDay.now()); + final time = await showThemedTimePicker(context: context, initialTime: TimeOfDay.now()); if (time == null) return; setState(() { _formData.date = DateTime(date.year, date.month, date.day, time.hour, time.minute); diff --git a/lib/modules/loan_module/pages/installation_pullout_form_view.dart b/lib/modules/loan_module/pages/installation_pullout_form_view.dart index 6d60fb2d..f94163cc 100644 --- a/lib/modules/loan_module/pages/installation_pullout_form_view.dart +++ b/lib/modules/loan_module/pages/installation_pullout_form_view.dart @@ -24,6 +24,7 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; @@ -60,7 +61,7 @@ class _InstallationPullOutFormViewState extends State with TickerProviderStat date: DateTime.tryParse(_addTaskModel?.estimationDeliveryDate ?? ""), formatDateWithTime: true, onDatePicker: (selectedDate) { - showTimePicker( + showThemedTimePicker( context: context, initialTime: TimeOfDay.now(), ).then((selectedTime) { diff --git a/lib/modules/tm_module/tasks/update_task_request_view.dart b/lib/modules/tm_module/tasks/update_task_request_view.dart index f7c94d60..d5cfd48c 100644 --- a/lib/modules/tm_module/tasks/update_task_request_view.dart +++ b/lib/modules/tm_module/tasks/update_task_request_view.dart @@ -36,6 +36,7 @@ import 'package:test_sa/providers/task_request_provider/task_job_provider.dart'; import 'package:test_sa/providers/task_request_provider/task_request_provider.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; @@ -315,7 +316,7 @@ class _UpdateTaskRequestState extends State { date: DateTime.tryParse(taskModel.installationDate ?? ""), formatDateWithTime: false, onDatePicker: (selectedDate) { - showTimePicker( + showThemedTimePicker( context: context, initialTime: TimeOfDay.now(), ).then((selectedTime) { @@ -827,7 +828,7 @@ class EmployeeCard extends StatelessWidget { formatDateWithTime: true, from: DateTime.tryParse(createdDate ?? ''), onDatePicker: (selectedDate) { - showTimePicker( + showThemedTimePicker( context: context, initialTime: TimeOfDay.now(), ).then((selectedTime) { @@ -872,7 +873,7 @@ class EmployeeCard extends StatelessWidget { formatDateWithTime: true, from: DateTime.tryParse(createdDate ?? ''), onDatePicker: (selectedDate) { - showTimePicker( + showThemedTimePicker( context: context, initialTime: TimeOfDay.now(), ).then((selectedTime) { diff --git a/lib/modules/traf_module/create_traf_request_page.dart b/lib/modules/traf_module/create_traf_request_page.dart index ce3818f4..31e44e48 100644 --- a/lib/modules/traf_module/create_traf_request_page.dart +++ b/lib/modules/traf_module/create_traf_request_page.dart @@ -315,7 +315,7 @@ class _CreateTRAFRequestPageState extends State { ), ], ), - separatorBuilder: (cxt, index) => Divider(thickness: 1, height: 1, color: context.isDark ? AppColor.neutral20 : AppColor.neutral30), + separatorBuilder: (cxt, index) => const Divider().defaultStyle(context), itemCount: userBasedOnSearch.length) ], 12.height, diff --git a/lib/modules/traf_module/traf_request_detail_page.dart b/lib/modules/traf_module/traf_request_detail_page.dart index 17395d08..fb36ecc3 100644 --- a/lib/modules/traf_module/traf_request_detail_page.dart +++ b/lib/modules/traf_module/traf_request_detail_page.dart @@ -59,9 +59,9 @@ class _TrafRequestDetailPageState extends State { padding: const EdgeInsets.all(16), children: [ requesterInformation(trafProvider.trafRequestDataModel!), - 16.height, + 12.height, requestInformation(trafProvider.trafRequestDataModel!), - 16.height, + 12.height, assetInformation(trafProvider.trafRequestDataModel!), ], ).expanded, @@ -96,7 +96,7 @@ class _TrafRequestDetailPageState extends State { InfoTextWidget(label: 'Number/Contact Information'.addTranslation, value: data.requesterContactNumber ?? '-'), InfoTextWidget(label: 'Extension'.addTranslation, value: data.requesterExtensionNumber ?? '-'), ], - ).toShadowContainer(context, borderRadius: 20, padding: 16); + ).toShadowContainer(context); } Widget requestInformation(TrafRequestDataModel data) { @@ -129,7 +129,7 @@ class _TrafRequestDetailPageState extends State { InfoTextWidget(label: 'Equipment going to be used with combination of other equipments', value: data.usedWithCombination ?? '-'), ], ], - ).toShadowContainer(context, borderRadius: 20, padding: 16); + ).toShadowContainer(context); } Widget assetInformation(TrafRequestDataModel data) { @@ -167,6 +167,6 @@ class _TrafRequestDetailPageState extends State { }) ], ], - ).toShadowContainer(context, borderRadius: 20, padding: 16); + ).toShadowContainer(context); } } diff --git a/lib/modules/traf_module/traf_request_item_view.dart b/lib/modules/traf_module/traf_request_item_view.dart index b9246cfb..8c9c69d3 100644 --- a/lib/modules/traf_module/traf_request_item_view.dart +++ b/lib/modules/traf_module/traf_request_item_view.dart @@ -76,7 +76,7 @@ class TrafRequestItemView extends StatelessWidget { InfoHeaderWidget(requestDetails?.nameOfType ?? "TRAF Request"), InfoTextWidget(label: context.translation.requestType, value: requestDetails!.requestType), InfoTextWidget(label: "TRAF No", value: requestDetails!.requestNo), - InfoTextWidget(label: context.translation.site, value: requestDetails!.site, showArrow: true), + InfoTextWidget(label: context.translation.site, value: requestDetails!.site, showEmptyValue: true,showArrow: true), ], ).toShadowContainer(context, withShadow: showShadow).onPress(() async { Navigator.push(context, MaterialPageRoute(builder: (context) => TrafRequestDetailPage(trafId: requestDetails!.id!))); diff --git a/lib/modules/traf_module/users_auto_complete_field.dart b/lib/modules/traf_module/users_auto_complete_field.dart index bb55f457..2c728877 100644 --- a/lib/modules/traf_module/users_auto_complete_field.dart +++ b/lib/modules/traf_module/users_auto_complete_field.dart @@ -59,11 +59,12 @@ class _UsersAutoCompleteFieldState extends State { @override Widget build(BuildContext context) { - final border = UnderlineInputBorder(borderSide: BorderSide.none, borderRadius: BorderRadius.circular(10)); + final border = UnderlineInputBorder(borderSide: BorderSide.none, borderRadius: BorderRadius.circular(16)); return Container( decoration: BoxDecoration( color: AppColor.background(context), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: AppColor.border2Color(context)), // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), child: Autocomplete( @@ -92,7 +93,8 @@ class _UsersAutoCompleteFieldState extends State { return TextField( controller: _controller, focusNode: fieldFocusNode, - style: AppTextStyles.bodyText.copyWith(color: AppColor.black10), + style: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 14, color: AppColor.textStyleColor(context)), + cursorColor: AppColor.loadingColor(context), textAlign: TextAlign.start, decoration: InputDecoration( border: border, @@ -104,11 +106,13 @@ class _UsersAutoCompleteFieldState extends State { constraints: const BoxConstraints(), suffixIconConstraints: const BoxConstraints(maxHeight: 24, maxWidth: 24 + 8), filled: true, - fillColor: AppColor.fieldBgColor(context), + fillColor: AppColor.dropDownBackground(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), + // floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), + floatingLabelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: AppColor.floatingTextStyleColor(context)), + labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: AppColor.labelTextStyleColor(context)), labelText: "Users going to use technology", - labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)), + // labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)), suffixIcon: loading ? CircularProgressIndicator(color: AppColor.loadingColor(context), strokeWidth: 3.0).paddingOnly(end: 8) : null, ), textInputAction: TextInputAction.search, diff --git a/lib/new_views/common_widgets/app_text_form_field.dart b/lib/new_views/common_widgets/app_text_form_field.dart index 5b485df7..d8ffbe97 100644 --- a/lib/new_views/common_widgets/app_text_form_field.dart +++ b/lib/new_views/common_widgets/app_text_form_field.dart @@ -219,7 +219,7 @@ class _AppTextFormFieldState extends State { : !widget.enable ? (widget.enableColor ?? AppColor.disableDark) : AppColor.dropDownBackground(context)), - errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red30), + errorStyle: AppTextStyle.tiny.copyWith(color: AppColor.red30), // floatingLabelStyle: widget.floatingLabelStyle ?? AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.white10 : AppColor.neutral20), diff --git a/lib/new_views/swipe_module/swipe_history_view.dart b/lib/new_views/swipe_module/swipe_history_view.dart index c01458ad..c340f7bb 100644 --- a/lib/new_views/swipe_module/swipe_history_view.dart +++ b/lib/new_views/swipe_module/swipe_history_view.dart @@ -10,6 +10,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/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/item_views/info_text_widget.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; @@ -62,7 +63,7 @@ class _SwipeHistoryViewState extends State { formatDateWithTime: true, onDatePicker: (selectedDate) { if (selectedDate != null) { - showTimePicker( + showThemedTimePicker( context: context, initialTime: TimeOfDay.now(), ).then((selectedTime) { @@ -93,7 +94,7 @@ class _SwipeHistoryViewState extends State { formatDateWithTime: true, onDatePicker: (selectedDate) { if (selectedDate != null) { - showTimePicker( + showThemedTimePicker( context: context, initialTime: TimeOfDay.now(), ).then((selectedTime) { @@ -121,10 +122,7 @@ class _SwipeHistoryViewState extends State { 12.height, AppFilledButton(label: context.translation.search, maxWidth: false, onPressed: getSwipeHistory), 8.height, - const Divider( - thickness: 2, - color: AppColor.white60, - ), + const Divider().defaultStyle(context), Consumer(builder: (context, snapshot, child) { return SwipeHistoryList(snapshot.swipeHistory ?? [], snapshot.isLoading).expanded; }), diff --git a/lib/views/widgets/date_and_time/date_picker.dart b/lib/views/widgets/date_and_time/date_picker.dart index 58fab5d6..a1c9a997 100644 --- a/lib/views/widgets/date_and_time/date_picker.dart +++ b/lib/views/widgets/date_and_time/date_picker.dart @@ -202,9 +202,7 @@ class ADatePicker extends StatelessWidget { ), // Icon theme for navigation arrows - iconTheme: IconThemeData( - color: Colors.white, - ), + iconTheme: IconThemeData(color: Colors.white), ), child: child!, ); diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index d8c9b632..9b54f53e 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -10,6 +10,7 @@ import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import '../../../new_views/app_style/app_color.dart'; @@ -171,28 +172,7 @@ class _AppTimerState extends State { enable: widget.enabled ? _tempPickerTimer == null : false, formatDateWithTime: true, onDatePicker: (selectedDate) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - builder: (BuildContext context, Widget? child) { - final ThemeData currentTheme = Theme.of(context); - return Theme( - data: currentTheme.copyWith( - timePickerTheme: TimePickerThemeData( - dialHandColor: AppColor.primary10, - dialBackgroundColor: Colors.grey.withOpacity(0.1), - hourMinuteColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.grey.withOpacity(0.1)), - dayPeriodColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.transparent), - dayPeriodTextColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? Colors.white : AppColor.primary10), - dayPeriodBorderSide: BorderSide(color: Colors.grey.withOpacity(0.2)), - entryModeIconColor: AppColor.primary10, - ), - textButtonTheme: TextButtonThemeData(style: TextButton.styleFrom(foregroundColor: AppColor.primary10)), - ), - child: child!, - ); - }, - ).then((selectedTime) { + showThemedTimePicker(context: context, initialTime: TimeOfDay.now()).then((selectedTime) { if (selectedTime != null) { _pickerStartAt = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); if (widget.pickerFromDate != null && _pickerStartAt!.isBefore(widget.pickerFromDate!)) { @@ -216,34 +196,16 @@ class _AppTimerState extends State { ADatePicker( label: context.translation.endTime, hideShadow: true, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + // backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, enable: widget.enabled ? _pickerStartAt != null : false, from: _pickerStartAt, date: _pickerEndAt, to: DateTime.now(), formatDateWithTime: true, onDatePicker: (selectedDate) { - showTimePicker( + showThemedTimePicker( context: context, initialTime: TimeOfDay.now(), - builder: (BuildContext context, Widget? child) { - final ThemeData currentTheme = Theme.of(context); - return Theme( - data: currentTheme.copyWith( - timePickerTheme: TimePickerThemeData( - dialHandColor: AppColor.primary10, - dialBackgroundColor: Colors.grey.withOpacity(0.1), - hourMinuteColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.grey.withOpacity(0.1)), - dayPeriodColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.transparent), - dayPeriodTextColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? Colors.white : AppColor.primary10), - dayPeriodBorderSide: BorderSide(color: Colors.grey.withOpacity(0.2)), - entryModeIconColor: AppColor.primary10, - ), - textButtonTheme: TextButtonThemeData(style: TextButton.styleFrom(foregroundColor: AppColor.primary10)), - ), - child: child!, - ); - }, ).then((selectedTime) { if (selectedTime != null) { selectedDate = selectedDate.add(Duration(hours: selectedTime.hour, minutes: selectedTime.minute)); @@ -273,8 +235,10 @@ class _AppTimerState extends State { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - CMRequestUtils.formatTimerDurationCM(_tempPickerTimer!.durationInSecond!.round()).bodyText(context).custom(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), - "Start at: ${_tempPickerTimer!.startAt!.toIso8601String().toFirstActionFormat}\nEnd at: ${_tempPickerTimer!.endAt!.toIso8601String().toFirstActionFormat}".tinyFont(context), + CMRequestUtils.formatTimerDurationCM(_tempPickerTimer!.durationInSecond!.round()).bodyText(context).custom(color: AppColor.labelTextStyleColor(context)), + "Start at: ${_tempPickerTimer!.startAt!.toIso8601String().toFirstActionFormat}\nEnd at: ${_tempPickerTimer!.endAt!.toIso8601String().toFirstActionFormat}" + .tinyFont(context) + .custom(color: AppColor.lightTextColor(context)), ], ).expanded, 8.width, @@ -282,7 +246,7 @@ class _AppTimerState extends State { deletePickerTime(); }) ], - ).toShadowContainer(context, padding: 8) + ).toShadowContainer(context) ], 8.height, ], @@ -331,7 +295,11 @@ class _AppTimerState extends State { }, ), ), - if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow,color: AppColor.icon2Color(context),), + if (widget.enabled) + Icon( + _running ? Icons.pause : Icons.play_arrow, + color: AppColor.icon2Color(context), + ), ], ), ).onPress(_loading || !widget.enabled ? null : _onPressed), From d6e775cff13445cdaee7e78cca988caa95a801e4 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 13 May 2026 16:08:45 +0300 Subject: [PATCH 2/2] improvements --- lib/models/device/asset_search.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/models/device/asset_search.dart b/lib/models/device/asset_search.dart index 9d57ddbd..0aa7a252 100644 --- a/lib/models/device/asset_search.dart +++ b/lib/models/device/asset_search.dart @@ -157,7 +157,7 @@ class DeviceSearch { final map = {}; if (code != null && code!.isNotEmpty) map['code'] = code; if (assetSerialNumber != null && assetSerialNumber!.isNotEmpty) map['assetSerialNumber'] = assetSerialNumber; - if (assetName != null && assetName!.isNotEmpty) map['assetName'] = [assetName]; + if (assetName != null && assetName!.isNotEmpty) map['assetName'] = assetName; // todo @discuss baha about multiple asset search if (supplyDateSymbol != null) { map['supplyDateSymbol'] = supplyDateSymbol!.toJson(); }