Merge branch 'master' of tzw/fcs into master
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -328,7 +328,8 @@ class _CartonFilterState extends State<CartonFilter> {
|
||||
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,
|
||||
),
|
||||
|
||||
@@ -31,6 +31,7 @@ class PartSearchDelegate extends SearchDelegate<Carton> {
|
||||
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(
|
||||
|
||||
@@ -24,6 +24,7 @@ class _CartonSizeEditorState extends State<CartonSizeEditor> {
|
||||
TextEditingController _widthController = new TextEditingController();
|
||||
TextEditingController _heightController = new TextEditingController();
|
||||
TextEditingController _lengthController = new TextEditingController();
|
||||
final _formKey = GlobalKey<FormState>();
|
||||
|
||||
bool _isLoading = false;
|
||||
CartonSize? _cartonSize;
|
||||
@@ -57,7 +58,14 @@ class _CartonSizeEditorState extends State<CartonSizeEditor> {
|
||||
final nameBox = InputText(
|
||||
labelTextKey: 'box.carton_size.name',
|
||||
iconData: Icons.text_format,
|
||||
controller: _nameController);
|
||||
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<CartonSizeEditor> {
|
||||
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,7 +143,9 @@ class _CartonSizeEditorState extends State<CartonSizeEditor> {
|
||||
}
|
||||
},
|
||||
);
|
||||
return LocalProgress(
|
||||
return Form(
|
||||
key: _formKey,
|
||||
child: LocalProgress(
|
||||
inAsyncCall: _isLoading,
|
||||
child: Scaffold(
|
||||
appBar: LocalAppBar(
|
||||
@@ -164,6 +177,7 @@ class _CartonSizeEditorState extends State<CartonSizeEditor> {
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ class _FAQEditorState extends State<FAQEditor> {
|
||||
_mmA.text = _faq.answerMm ?? '';
|
||||
_pageLabelEng.text = _faq.pageLinkLabelEng ?? "";
|
||||
_pageLabelMm.text = _faq.pageLinkLabelMm ?? "";
|
||||
_pageLink = _faq.pageLink ?? '';
|
||||
_pageLink = _faq.pageLink ?? info;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -83,10 +83,15 @@ class _FcsShipmentEditorState extends State<FcsShipmentEditor> {
|
||||
_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<FcsShipmentEditor> {
|
||||
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);
|
||||
|
||||
@@ -404,7 +404,6 @@ 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]+$');
|
||||
@@ -412,3 +411,8 @@ bool isValidEmail(String email) {
|
||||
// Check if the email matches the pattern
|
||||
return emailRegex.hasMatch(email);
|
||||
}
|
||||
|
||||
String capitalizeFirstLetter(String text) {
|
||||
if (text.isEmpty) return text;
|
||||
return text[0].toUpperCase() + text.substring(1);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ class MarketEditor extends StatefulWidget {
|
||||
|
||||
class _MarketEditorState extends State<MarketEditor> {
|
||||
TextEditingController _marketNameCtl = new TextEditingController();
|
||||
final _formKey = GlobalKey<FormState>();
|
||||
|
||||
bool _isLoading = false;
|
||||
List<String> markets = [];
|
||||
@@ -141,7 +142,9 @@ class _MarketEditorState extends State<MarketEditor> {
|
||||
await showDialog<String>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return new AlertDialog(
|
||||
return Form(
|
||||
key: _formKey,
|
||||
child: new AlertDialog(
|
||||
contentPadding: const EdgeInsets.all(16.0),
|
||||
content: new Row(
|
||||
children: <Widget>[
|
||||
@@ -150,6 +153,12 @@ class _MarketEditorState extends State<MarketEditor> {
|
||||
labelTextKey: "market.edit.name",
|
||||
controller: _marketNameCtl,
|
||||
autoFocus: true,
|
||||
validator: (value) {
|
||||
if (value!.isEmpty) {
|
||||
return "Enter market name";
|
||||
}
|
||||
return null;
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
@@ -167,10 +176,12 @@ class _MarketEditorState extends State<MarketEditor> {
|
||||
color: primaryColor,
|
||||
),
|
||||
onPressed: () {
|
||||
if (!_formKey.currentState!.validate()) return;
|
||||
Navigator.pop(context);
|
||||
_add();
|
||||
})
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
@@ -31,6 +31,7 @@ class PackageSearchDelegate extends SearchDelegate<Package> {
|
||||
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(
|
||||
@@ -43,8 +44,7 @@ class PackageSearchDelegate extends SearchDelegate<Package> {
|
||||
color: theme.primaryTextTheme.displayLarge?.color,
|
||||
fontSize: 16,
|
||||
backgroundColor: primaryColor)),
|
||||
primaryColor: primaryColor,
|
||||
);
|
||||
primaryColor: primaryColor);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -134,8 +134,7 @@ class PackageSearchDelegate extends SearchDelegate<Package> {
|
||||
return const Center(
|
||||
child: Opacity(
|
||||
opacity: 0.2,
|
||||
child: Icon(Octicons.package,
|
||||
color: primaryColor, size: 200),
|
||||
child: Icon(Octicons.package, color: primaryColor, size: 200),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ class UserSearchDelegate extends SearchDelegate<User> {
|
||||
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(
|
||||
@@ -46,8 +47,7 @@ class UserSearchDelegate extends SearchDelegate<User> {
|
||||
color: theme.primaryTextTheme.displayLarge?.color,
|
||||
fontSize: 16,
|
||||
backgroundColor: primaryColor)),
|
||||
primaryColor: primaryColor,
|
||||
);
|
||||
primaryColor: primaryColor);
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -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<LocalImagePicker> {
|
||||
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);
|
||||
|
||||
@@ -53,7 +53,7 @@ class InputDate extends StatelessWidget {
|
||||
var d = await showDatePicker(
|
||||
context: context,
|
||||
firstDate: DateTime(0),
|
||||
lastDate: DateTime(2025),
|
||||
lastDate: DateTime(2050),
|
||||
initialDate: initialDate,
|
||||
builder: (context, child) {
|
||||
return Theme(
|
||||
@@ -63,8 +63,7 @@ class InputDate extends StatelessWidget {
|
||||
surfaceTint: Colors.white,
|
||||
primary: primaryColor),
|
||||
textButtonTheme: TextButtonThemeData(
|
||||
style:
|
||||
TextButton.styleFrom(foregroundColor: primaryColor),
|
||||
style: TextButton.styleFrom(foregroundColor: primaryColor),
|
||||
),
|
||||
),
|
||||
child: child!,
|
||||
@@ -113,23 +112,24 @@ class InputDate extends StatelessWidget {
|
||||
borderSide: BorderSide(color: primaryColor, width: 1.0)),
|
||||
errorBorder: withBorder
|
||||
? OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: borderColor ?? dangerColor, width: 1.0),
|
||||
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),
|
||||
borderSide:
|
||||
BorderSide(color: borderColor ?? dangerColor, width: 1.0),
|
||||
)
|
||||
: UnderlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: borderColor ?? dangerColor, width: 1.0)),
|
||||
),
|
||||
validator: validator,
|
||||
autovalidateMode: autovalidateMode,),
|
||||
autovalidateMode: autovalidateMode,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -177,8 +178,8 @@ class _MultiImageFileState extends State<MultiImageFile> {
|
||||
_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<MultiImageFile> {
|
||||
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()));
|
||||
|
||||
Reference in New Issue
Block a user