From 9fdc20a61b4c40a1175ab4b1877373e4a1a8ced5 Mon Sep 17 00:00:00 2001 From: tzw Date: Mon, 10 Feb 2025 11:23:38 +0630 Subject: [PATCH] update image resolution and search bar cursor color --- lib/constants.dart | 4 +- lib/pages/carton/carton_filter.dart | 3 +- lib/pages/carton_search/carton_search.dart | 1 + lib/pages/carton_size/carton_size_editor.dart | 78 ++++---- lib/pages/faq/faq_edit_page.dart | 2 +- .../fcs_shipment/fcs_shipment_editor.dart | 25 ++- lib/pages/main/util.dart | 8 +- lib/pages/market/market_editor.dart | 67 ++++--- lib/pages/package_search/package_search.dart | 33 ++-- lib/pages/user_search/user_search.dart | 28 +-- lib/pages/widgets/img_picker.dart | 5 +- lib/pages/widgets/input_date.dart | 176 +++++++++--------- lib/pages/widgets/multi_img_file.dart | 19 +- 13 files changed, 246 insertions(+), 203 deletions(-) diff --git a/lib/constants.dart b/lib/constants.dart index 2e662cf..9e63128 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -1,6 +1,8 @@ const uploadPhotoLimit = 10; const shipmentCountForCartonFilter = 10; const resendCountSec = 30; +int imageQuality = 100; +double imageMaxWidth = 1000; const config_collection = "configs"; const user_collection = "users"; @@ -84,7 +86,7 @@ const privilege_receiving = "rc"; const privilege_pickup = "pku"; const privilege_collect = "col"; const privilege_report = "rpt"; -const privilege_pin ="pin"; +const privilege_pin = "pin"; // Pickup types const shipment_local_pickup = "Local pickup"; diff --git a/lib/pages/carton/carton_filter.dart b/lib/pages/carton/carton_filter.dart index 384454b..6c1344a 100644 --- a/lib/pages/carton/carton_filter.dart +++ b/lib/pages/carton/carton_filter.dart @@ -328,7 +328,8 @@ class _CartonFilterState extends State { onTap: () => _changeStatus(b), title: Row( children: [ - Text(b, style: const TextStyle(fontSize: 15)), + Text(capitalizeFirstLetter(b), + style: const TextStyle(fontSize: 15)), const SizedBox( width: 20, ), diff --git a/lib/pages/carton_search/carton_search.dart b/lib/pages/carton_search/carton_search.dart index f13dc60..8142f4d 100644 --- a/lib/pages/carton_search/carton_search.dart +++ b/lib/pages/carton_search/carton_search.dart @@ -31,6 +31,7 @@ class PartSearchDelegate extends SearchDelegate { ThemeData appBarTheme(BuildContext context) { final ThemeData theme = Theme.of(context); return theme.copyWith( + textSelectionTheme: TextSelectionThemeData(cursorColor: Colors.grey), appBarTheme: AppBarTheme(color: primaryColor), iconButtonTheme: IconButtonThemeData( style: ButtonStyle( diff --git a/lib/pages/carton_size/carton_size_editor.dart b/lib/pages/carton_size/carton_size_editor.dart index 9fb31e0..0403ad5 100644 --- a/lib/pages/carton_size/carton_size_editor.dart +++ b/lib/pages/carton_size/carton_size_editor.dart @@ -24,6 +24,7 @@ class _CartonSizeEditorState extends State { TextEditingController _widthController = new TextEditingController(); TextEditingController _heightController = new TextEditingController(); TextEditingController _lengthController = new TextEditingController(); + final _formKey = GlobalKey(); bool _isLoading = false; CartonSize? _cartonSize; @@ -55,9 +56,16 @@ class _CartonSizeEditorState extends State { @override Widget build(BuildContext context) { final nameBox = InputText( - labelTextKey: 'box.carton_size.name', - iconData: Icons.text_format, - controller: _nameController); + labelTextKey: 'box.carton_size.name', + iconData: Icons.text_format, + controller: _nameController, + validator: (value) { + if (value!.isEmpty) { + return "Enter carton size name"; + } + return null; + }, + ); final lengthBox = LengthPicker( controller: _lengthController, @@ -90,10 +98,13 @@ class _CartonSizeEditorState extends State { context, getLocalString(context, 'box.cargo.save.btn'), callack: () async { + if (!_formKey.currentState!.validate()) return; + if (_nameController.text == "") { - showMsgDialog(context, "Esrror", "Invalid carton size name!"); + showMsgDialog(context, "Error", "Invalid carton size name!"); return; } + setState(() { _isLoading = true; }); @@ -132,35 +143,38 @@ class _CartonSizeEditorState extends State { } }, ); - return LocalProgress( - inAsyncCall: _isLoading, - child: Scaffold( - appBar: LocalAppBar( - labelKey: "box.carton_size", - backgroundColor: Colors.white, - labelColor: primaryColor, - arrowColor: primaryColor, - onBack: () { - if (isDataChanged()) { - showConfirmDialog(context, "back.button_confirm", () { + return Form( + key: _formKey, + child: LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + appBar: LocalAppBar( + labelKey: "box.carton_size", + backgroundColor: Colors.white, + labelColor: primaryColor, + arrowColor: primaryColor, + onBack: () { + if (isDataChanged()) { + showConfirmDialog(context, "back.button_confirm", () { + Navigator.of(context).pop(); + }); + } else { Navigator.of(context).pop(); - }); - } else { - Navigator.of(context).pop(); - } - }, - ), - body: Container( - padding: EdgeInsets.all(18), - child: ListView( - shrinkWrap: true, - children: [ - nameBox, - dimBox, - SizedBox(height: 40), - saveBtn, - SizedBox(height: 20), - ], + } + }, + ), + body: Container( + padding: EdgeInsets.all(18), + child: ListView( + shrinkWrap: true, + children: [ + nameBox, + dimBox, + SizedBox(height: 40), + saveBtn, + SizedBox(height: 20), + ], + ), ), ), ), diff --git a/lib/pages/faq/faq_edit_page.dart b/lib/pages/faq/faq_edit_page.dart index 0250276..44ed498 100644 --- a/lib/pages/faq/faq_edit_page.dart +++ b/lib/pages/faq/faq_edit_page.dart @@ -48,7 +48,7 @@ class _FAQEditorState extends State { _mmA.text = _faq.answerMm ?? ''; _pageLabelEng.text = _faq.pageLinkLabelEng ?? ""; _pageLabelMm.text = _faq.pageLinkLabelMm ?? ""; - _pageLink = _faq.pageLink ?? ''; + _pageLink = _faq.pageLink ?? info; } } diff --git a/lib/pages/fcs_shipment/fcs_shipment_editor.dart b/lib/pages/fcs_shipment/fcs_shipment_editor.dart index 4114ebe..eb6fe2a 100644 --- a/lib/pages/fcs_shipment/fcs_shipment_editor.dart +++ b/lib/pages/fcs_shipment/fcs_shipment_editor.dart @@ -83,10 +83,15 @@ class _FcsShipmentEditorState extends State { _currentDestination = loadingDestination.isNotEmpty ? loadingDestination.first : null; } else { - _currentShipmentType = model.shipmentTypes.first; - _currentConsignee = model.shipmentConsingees.first; - _currentLoadingPort = model.shipmentPorts.first; - _currentDestination = model.shipmentPorts.first; + _currentShipmentType = + model.shipmentTypes.isNotEmpty ? model.shipmentTypes.first : null; + _currentConsignee = model.shipmentConsingees.isNotEmpty + ? model.shipmentConsingees.first + : null; + _currentLoadingPort = + model.shipmentPorts.isNotEmpty ? model.shipmentPorts.first : null; + _currentDestination = + model.shipmentPorts.isNotEmpty ? model.shipmentPorts.first : null; } } @@ -357,10 +362,14 @@ class _FcsShipmentEditorState extends State { return _shipmentNumberController.text != "" || _cutoffDateController.text != "" || _etaDateController.text != "" || - _currentConsignee != shipmentModel.shipmentConsingees.first || - _currentShipmentType != shipmentModel.shipmentTypes.first || - _currentLoadingPort != shipmentModel.shipmentPorts.first || - _currentDestination != shipmentModel.shipmentPorts.first; + (shipmentModel.shipmentConsingees.isNotEmpty && + _currentConsignee != shipmentModel.shipmentConsingees.first) || + (shipmentModel.shipmentTypes.isNotEmpty && + _currentShipmentType != shipmentModel.shipmentTypes.first) || + (shipmentModel.shipmentPorts.isNotEmpty && + _currentLoadingPort != shipmentModel.shipmentPorts.first) || + (shipmentModel.shipmentPorts.isNotEmpty && + _currentDestination != shipmentModel.shipmentPorts.first); } else { FcsShipment fcsShipment = _getPayload(); return widget.shipment!.isChangedForEdit(fcsShipment); diff --git a/lib/pages/main/util.dart b/lib/pages/main/util.dart index 24791f8..5d14196 100644 --- a/lib/pages/main/util.dart +++ b/lib/pages/main/util.dart @@ -404,11 +404,15 @@ String removeTrailingZeros(double number) { return result; } - bool isValidEmail(String email) { // Define a regular expression for validating an email final emailRegex = RegExp(r'^[^@\s]+@[^@\s]+\.[^@\s]+$'); // Check if the email matches the pattern return emailRegex.hasMatch(email); -} \ No newline at end of file +} + +String capitalizeFirstLetter(String text) { + if (text.isEmpty) return text; + return text[0].toUpperCase() + text.substring(1); +} diff --git a/lib/pages/market/market_editor.dart b/lib/pages/market/market_editor.dart index 935f968..7f0ebcb 100644 --- a/lib/pages/market/market_editor.dart +++ b/lib/pages/market/market_editor.dart @@ -19,6 +19,7 @@ class MarketEditor extends StatefulWidget { class _MarketEditorState extends State { TextEditingController _marketNameCtl = new TextEditingController(); + final _formKey = GlobalKey(); bool _isLoading = false; List markets = []; @@ -141,36 +142,46 @@ class _MarketEditorState extends State { await showDialog( context: context, builder: (BuildContext context) { - return new AlertDialog( - contentPadding: const EdgeInsets.all(16.0), - content: new Row( - children: [ - new Expanded( - child: InputText( - labelTextKey: "market.edit.name", - controller: _marketNameCtl, - autoFocus: true, - ), - ) + return Form( + key: _formKey, + child: new AlertDialog( + contentPadding: const EdgeInsets.all(16.0), + content: new Row( + children: [ + new Expanded( + child: InputText( + labelTextKey: "market.edit.name", + controller: _marketNameCtl, + autoFocus: true, + validator: (value) { + if (value!.isEmpty) { + return "Enter market name"; + } + return null; + }, + ), + ) + ], + ), + actions: [ + new TextButton( + child: LocalText(context, "btn.cancel", color: primaryColor), + onPressed: () { + Navigator.pop(context); + }), + new TextButton( + child: LocalText( + context, + "btn.save", + color: primaryColor, + ), + onPressed: () { + if (!_formKey.currentState!.validate()) return; + Navigator.pop(context); + _add(); + }) ], ), - actions: [ - new TextButton( - child: LocalText(context, "btn.cancel", color: primaryColor), - onPressed: () { - Navigator.pop(context); - }), - new TextButton( - child: LocalText( - context, - "btn.save", - color: primaryColor, - ), - onPressed: () { - Navigator.pop(context); - _add(); - }) - ], ); }, ); diff --git a/lib/pages/package_search/package_search.dart b/lib/pages/package_search/package_search.dart index 2b9930c..467c320 100644 --- a/lib/pages/package_search/package_search.dart +++ b/lib/pages/package_search/package_search.dart @@ -31,20 +31,20 @@ class PackageSearchDelegate extends SearchDelegate { ThemeData appBarTheme(BuildContext context) { final ThemeData theme = Theme.of(context); return theme.copyWith( - appBarTheme: AppBarTheme(color: primaryColor), - iconButtonTheme: IconButtonThemeData( - style: ButtonStyle( - iconColor: WidgetStateProperty.all(Colors.white))), - inputDecorationTheme: InputDecorationTheme( - border: InputBorder.none, - hintStyle: TextStyle(color: Colors.grey, fontSize: 14)), - textTheme: TextTheme( - displayLarge: TextStyle( - color: theme.primaryTextTheme.displayLarge?.color, - fontSize: 16, - backgroundColor: primaryColor)), - primaryColor: primaryColor, - ); + textSelectionTheme: TextSelectionThemeData(cursorColor: Colors.grey), + appBarTheme: AppBarTheme(color: primaryColor), + iconButtonTheme: IconButtonThemeData( + style: ButtonStyle( + iconColor: WidgetStateProperty.all(Colors.white))), + inputDecorationTheme: InputDecorationTheme( + border: InputBorder.none, + hintStyle: TextStyle(color: Colors.grey, fontSize: 14)), + textTheme: TextTheme( + displayLarge: TextStyle( + color: theme.primaryTextTheme.displayLarge?.color, + fontSize: 16, + backgroundColor: primaryColor)), + primaryColor: primaryColor); } @override @@ -126,7 +126,7 @@ class PackageSearchDelegate extends SearchDelegate { @override Widget buildSuggestions(BuildContext context) { - return FutureBuilder?>( + return FutureBuilder?>( future: SharedPref.getRecentSearch('package_search', query), builder: (context, snapshot) { List _oldFilters = snapshot.data ?? []; @@ -134,8 +134,7 @@ class PackageSearchDelegate extends SearchDelegate { return const Center( child: Opacity( opacity: 0.2, - child: Icon(Octicons.package, - color: primaryColor, size: 200), + child: Icon(Octicons.package, color: primaryColor, size: 200), ), ); } diff --git a/lib/pages/user_search/user_search.dart b/lib/pages/user_search/user_search.dart index 2a86d51..5404c44 100644 --- a/lib/pages/user_search/user_search.dart +++ b/lib/pages/user_search/user_search.dart @@ -34,20 +34,20 @@ class UserSearchDelegate extends SearchDelegate { ThemeData appBarTheme(BuildContext context) { final ThemeData theme = Theme.of(context); return theme.copyWith( - appBarTheme: AppBarTheme(color: primaryColor), - iconButtonTheme: IconButtonThemeData( - style: ButtonStyle( - iconColor: WidgetStateProperty.all(Colors.white))), - inputDecorationTheme: InputDecorationTheme( - border: InputBorder.none, - hintStyle: TextStyle(color: Colors.grey, fontSize: 14)), - textTheme: TextTheme( - displayLarge: TextStyle( - color: theme.primaryTextTheme.displayLarge?.color, - fontSize: 16, - backgroundColor: primaryColor)), - primaryColor: primaryColor, - ); + textSelectionTheme: TextSelectionThemeData(cursorColor: Colors.grey), + appBarTheme: AppBarTheme(color: primaryColor), + iconButtonTheme: IconButtonThemeData( + style: ButtonStyle( + iconColor: WidgetStateProperty.all(Colors.white))), + inputDecorationTheme: InputDecorationTheme( + border: InputBorder.none, + hintStyle: TextStyle(color: Colors.grey, fontSize: 14)), + textTheme: TextTheme( + displayLarge: TextStyle( + color: theme.primaryTextTheme.displayLarge?.color, + fontSize: 16, + backgroundColor: primaryColor)), + primaryColor: primaryColor); } @override diff --git a/lib/pages/widgets/img_picker.dart b/lib/pages/widgets/img_picker.dart index c99bd41..e1f29ae 100644 --- a/lib/pages/widgets/img_picker.dart +++ b/lib/pages/widgets/img_picker.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:image_picker/image_picker.dart'; +import '../../constants.dart'; import 'show_img.dart'; typedef OnFile = void Function(File?); @@ -57,8 +58,8 @@ class _LocalImagePickerState extends State { if (camera || gallery) { var selectedFile = await ImagePicker().pickImage( source: camera ? ImageSource.camera : ImageSource.gallery, - imageQuality: 80, - maxWidth: 1000); + imageQuality: imageQuality, + maxWidth: imageMaxWidth); if (selectedFile != null) { setState(() { this.file = File(selectedFile.path); diff --git a/lib/pages/widgets/input_date.dart b/lib/pages/widgets/input_date.dart index 491eb41..df40b5a 100644 --- a/lib/pages/widgets/input_date.dart +++ b/lib/pages/widgets/input_date.dart @@ -40,96 +40,96 @@ class InputDate extends StatelessWidget { return Padding( padding: const EdgeInsets.only(top: 15.0, bottom: 5), child: TextFormField( - readOnly: true, - onTap: () async { - var dateFormatter = new DateFormat(dateFormatString); - FocusScope.of(context).unfocus(); - var initialDate = DateTime.now(); - if (controller.text != "") { - try { - initialDate = dateFormatter.parse(controller.text); - } catch (e) {} // ignore error - } - var d = await showDatePicker( - context: context, - firstDate: DateTime(0), - lastDate: DateTime(2025), - initialDate: initialDate, - builder: (context, child) { - return Theme( - data: Theme.of(context).copyWith( - colorScheme: ColorScheme.light( - background: primaryColor, - surfaceTint: Colors.white, - primary: primaryColor), - textButtonTheme: TextButtonThemeData( - style: - TextButton.styleFrom(foregroundColor: primaryColor), - ), + readOnly: true, + onTap: () async { + var dateFormatter = new DateFormat(dateFormatString); + FocusScope.of(context).unfocus(); + var initialDate = DateTime.now(); + if (controller.text != "") { + try { + initialDate = dateFormatter.parse(controller.text); + } catch (e) {} // ignore error + } + var d = await showDatePicker( + context: context, + firstDate: DateTime(0), + lastDate: DateTime(2050), + initialDate: initialDate, + builder: (context, child) { + return Theme( + data: Theme.of(context).copyWith( + colorScheme: ColorScheme.light( + background: primaryColor, + surfaceTint: Colors.white, + primary: primaryColor), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom(foregroundColor: primaryColor), ), - child: child!, - ); - }, - ); - if (d != null) { - controller.text = dateFormatter.format(d); - } - }, - controller: controller, - autofocus: autoFocus, - cursorColor: primaryColor, - style: textStyle, - maxLines: maxLines, - keyboardType: textInputType, - decoration: new InputDecoration( - // hintText: '', - hintStyle: TextStyle( - height: 1.5, - ), - errorStyle: const TextStyle(color: dangerColor, fontSize: 12), - labelText: labelTextKey == null - ? null - : AppTranslations.of(context)!.text(labelTextKey!), - labelStyle: languageModel.isEng - ? newLabelStyle(color: Colors.black54, fontSize: 20) - : newLabelStyleMM(color: Colors.black54, fontSize: 20), - icon: iconData == null - ? null - : Icon( - iconData, - color: primaryColor, - ), - enabledBorder: withBorder - ? OutlineInputBorder( - borderSide: BorderSide(color: primaryColor, width: 1.0), - ) - : UnderlineInputBorder( - borderSide: BorderSide(color: primaryColor, width: 1.0)), - focusedBorder: withBorder - ? OutlineInputBorder( - borderSide: BorderSide(color: primaryColor, width: 1.0), - ) - : UnderlineInputBorder( - borderSide: BorderSide(color: primaryColor, width: 1.0)), - errorBorder: withBorder - ? OutlineInputBorder( - borderSide: BorderSide( - color: borderColor ?? dangerColor, width: 1.0), - ) - : UnderlineInputBorder( - borderSide: BorderSide( - color: borderColor ?? dangerColor, width: 1.0)), - focusedErrorBorder: withBorder - ? OutlineInputBorder( - borderSide: BorderSide( - color: borderColor ?? dangerColor, width: 1.0), - ) - : UnderlineInputBorder( - borderSide: BorderSide( - color: borderColor ?? dangerColor, width: 1.0)), + ), + child: child!, + ); + }, + ); + if (d != null) { + controller.text = dateFormatter.format(d); + } + }, + controller: controller, + autofocus: autoFocus, + cursorColor: primaryColor, + style: textStyle, + maxLines: maxLines, + keyboardType: textInputType, + decoration: new InputDecoration( + // hintText: '', + hintStyle: TextStyle( + height: 1.5, ), - validator: validator, - autovalidateMode: autovalidateMode,), + errorStyle: const TextStyle(color: dangerColor, fontSize: 12), + labelText: labelTextKey == null + ? null + : AppTranslations.of(context)!.text(labelTextKey!), + labelStyle: languageModel.isEng + ? newLabelStyle(color: Colors.black54, fontSize: 20) + : newLabelStyleMM(color: Colors.black54, fontSize: 20), + icon: iconData == null + ? null + : Icon( + iconData, + color: primaryColor, + ), + enabledBorder: withBorder + ? OutlineInputBorder( + borderSide: BorderSide(color: primaryColor, width: 1.0), + ) + : UnderlineInputBorder( + borderSide: BorderSide(color: primaryColor, width: 1.0)), + focusedBorder: withBorder + ? OutlineInputBorder( + borderSide: BorderSide(color: primaryColor, width: 1.0), + ) + : UnderlineInputBorder( + borderSide: BorderSide(color: primaryColor, width: 1.0)), + errorBorder: withBorder + ? OutlineInputBorder( + borderSide: + BorderSide(color: borderColor ?? dangerColor, width: 1.0), + ) + : UnderlineInputBorder( + borderSide: BorderSide( + color: borderColor ?? dangerColor, width: 1.0)), + focusedErrorBorder: withBorder + ? OutlineInputBorder( + borderSide: + BorderSide(color: borderColor ?? dangerColor, width: 1.0), + ) + : UnderlineInputBorder( + borderSide: BorderSide( + color: borderColor ?? dangerColor, width: 1.0)), + ), + validator: validator, + autovalidateMode: autovalidateMode, + ), ); } } diff --git a/lib/pages/widgets/multi_img_file.dart b/lib/pages/widgets/multi_img_file.dart index 003f358..31f65ab 100644 --- a/lib/pages/widgets/multi_img_file.dart +++ b/lib/pages/widgets/multi_img_file.dart @@ -11,6 +11,7 @@ import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:image_picker/image_picker.dart'; +import '../../constants.dart'; import 'display_image_source.dart'; import 'multi_img_controller.dart'; @@ -147,11 +148,11 @@ class _MultiImageFileState extends State { Icon(Icons.error), ) : Image.file( - fileContainers[index].file!, - width: 50, - height: 50, - fit: BoxFit.cover, - ), + fileContainers[index].file!, + width: 50, + height: 50, + fit: BoxFit.cover, + ), ), ), widget.enabled @@ -177,8 +178,8 @@ class _MultiImageFileState extends State { _openImagePicker(bool camera) async { var selectedFile = await ImagePicker().pickImage( source: camera ? ImageSource.camera : ImageSource.gallery, - imageQuality: 80, - maxWidth: 1000); + imageQuality: imageQuality, + maxWidth: imageMaxWidth); if (selectedFile != null) { _fileAdded(DisplayImageSource(), File(selectedFile.path)); } @@ -214,8 +215,8 @@ class _MultiImageFileState extends State { if (camera || gallery) { var selectedFile = await ImagePicker().pickImage( source: camera ? ImageSource.camera : ImageSource.gallery, - imageQuality: 80, - maxWidth: 1000); + imageQuality: imageQuality, + maxWidth: imageMaxWidth); if (selectedFile != null) { _fileAdded(fileContainer, File.fromRawPath(await selectedFile.readAsBytes()));