From 4c9252558919c664c7507e7c2c6ddce789988346 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 9 Jul 2025 15:37:27 +0300 Subject: [PATCH] 1.3.3+22 uploaded --- lib/controllers/api_routes/urls.dart | 2 +- .../forms/spare_part/spare_part_request.dart | 24 ++-- .../widgets/images/multi_image_picker.dart | 111 +++++++++--------- pubspec.yaml | 2 +- 4 files changed, 67 insertions(+), 72 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index ac68fd50..beb4b33c 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,7 +1,7 @@ class URLs { URLs._(); - static const String appReleaseBuildNumber = "18"; + static const String appReleaseBuildNumber = "19"; static const host1 = "https://atomsm.hmg.com"; // production url // static const host1 = "https://atomsmdev.hmg.com"; // local DEV url 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 ce77a407..360a0033 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 @@ -59,18 +59,18 @@ class _SparePartRequestState extends State with TickerProvider super.initState(); _partsProvider = Provider.of(context, listen: false); _requestDetailProvider = Provider.of(context, listen: false); - // _requestDetailProvider?.sparePartHelperModel = SparePartHelperModel( - // id: _requestDetailProvider?.sparePartHelperModel?.id ?? 0, - // workOrderId: _requestDetailProvider?.sparePartHelperModel?.workOrderId ?? _requestDetailProvider?.currentWorkOrder?.data?.requestId, - // sparePartAttachments: _requestDetailProvider?.sparePartHelperModel?.sparePartAttachments ?? [], - // sparePart: _requestDetailProvider?.sparePartHelperModel?.sparePart ?? SparePart(), - // quantity: _requestDetailProvider?.sparePartHelperModel?.quantity, - // installQty: _requestDetailProvider?.sparePartHelperModel?.installQty, - // returnQty: _requestDetailProvider?.sparePartHelperModel?.returnQty, - // activityStatusId: _requestDetailProvider?.sparePartHelperModel?.activityStatusId ?? statusLookup.id, - // activityStatus: _requestDetailProvider?.sparePartHelperModel?.activityStatus ?? statusLookup, - // comment: _requestDetailProvider?.sparePartHelperModel?.comment ?? '', - // ); + _requestDetailProvider?.sparePartHelperModel = SparePartHelperModel( + id: _requestDetailProvider?.sparePartHelperModel?.id ?? 0, + workOrderId: _requestDetailProvider?.sparePartHelperModel?.workOrderId ?? _requestDetailProvider?.currentWorkOrder?.data?.requestId, + sparePartAttachments: _requestDetailProvider?.sparePartHelperModel?.sparePartAttachments ?? [], + sparePart: _requestDetailProvider?.sparePartHelperModel?.sparePart ?? SparePart(), + quantity: _requestDetailProvider?.sparePartHelperModel?.quantity, + installQty: _requestDetailProvider?.sparePartHelperModel?.installQty, + returnQty: _requestDetailProvider?.sparePartHelperModel?.returnQty, + activityStatusId: _requestDetailProvider?.sparePartHelperModel?.activityStatusId ?? statusLookup.id, + activityStatus: _requestDetailProvider?.sparePartHelperModel?.activityStatus ?? statusLookup, + comment: _requestDetailProvider?.sparePartHelperModel?.comment ?? '', + ); _partQtyController.text = _requestDetailProvider?.sparePartHelperModel?.quantity != null ? _requestDetailProvider!.sparePartHelperModel!.quantity!.round().toString() : ''; _installQtyController.text = _requestDetailProvider?.sparePartHelperModel?.installQty != null ? _requestDetailProvider!.sparePartHelperModel!.installQty!.round().toString() : ''; _returnQtyController.text = _requestDetailProvider?.sparePartHelperModel?.returnQty != null ? _requestDetailProvider!.sparePartHelperModel!.returnQty!.round().toString() : ''; diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index 3608aa5b..aa1c97b6 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -1,7 +1,6 @@ import 'dart:io'; import 'package:file_picker/file_picker.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:image_picker/image_picker.dart'; @@ -18,7 +17,8 @@ class MultiFilesPicker extends StatefulWidget { final String label; final bool error; final List files; - final List attachment ; + final List attachment; + final bool enabled, onlyImages; double? buttonHeight; Widget? buttonIcon; @@ -51,7 +51,7 @@ class _MultiFilesPickerState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - if(widget.enabled)...[ + if (widget.enabled) ...[ AppDashedButton( title: widget.label, height: widget.buttonHeight, @@ -60,8 +60,8 @@ class _MultiFilesPickerState extends State { onPressed: (widget.enabled == false) ? () {} : widget.showAsGrid - ? showFileSourceSheet - : onFilePicker), + ? showFileSourceSheet + : onFilePicker), 16.height, ], if (widget.files.isNotEmpty) @@ -101,6 +101,9 @@ class _MultiFilesPickerState extends State { if (result != null) { for (var path in result.paths) { widget.files.add(File(path!)); + if (widget.onChange != null) { + widget.onChange!(widget.files); + } } setState(() {}); } @@ -112,7 +115,7 @@ class _MultiFilesPickerState extends State { return; } - ImageSource source = (await showModalBottomSheet( + ImageSource? source = (await showModalBottomSheet( context: context, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical( @@ -143,8 +146,8 @@ class _MultiFilesPickerState extends State { 12.height, ], ).paddingAll(21), - )) as ImageSource; - + )) as ImageSource?; + if (source == null) return; final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800); if (pickedFile != null) { @@ -154,7 +157,7 @@ class _MultiFilesPickerState extends State { widget.onChange!(widget.files); } setState(() {}); - } + } } Widget gridItem(IconData iconData, String title) { @@ -187,28 +190,26 @@ class _MultiFilesPickerState extends State { ImageSource? source = await showModalBottomSheet( context: context, builder: (BuildContext context) { - Widget listCard({required String icon, required String label, required VoidCallback onTap}){ + Widget listCard({required String icon, required String label, required VoidCallback onTap}) { return GestureDetector( onTap: onTap, child: Container( - constraints: BoxConstraints(minWidth: 111.toScreenWidth,minHeight: 111.toScreenHeight), - padding: EdgeInsets.symmetric(horizontal: 12.toScreenWidth,vertical: 12.toScreenHeight), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - border: Border.all(width: 1,color:AppColor.white70) - ), + constraints: BoxConstraints(minWidth: 111.toScreenWidth, minHeight: 111.toScreenHeight), + padding: EdgeInsets.symmetric(horizontal: 12.toScreenWidth, vertical: 12.toScreenHeight), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), border: Border.all(width: 1, color: AppColor.white70)), child: Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - icon.toSvgAsset(), - 24.height, - label.bodyText2(context).custom(color: AppColor.black20), - ], + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + icon.toSvgAsset(), + 24.height, + label.bodyText2(context).custom(color: AppColor.black20), + ], ), ), ); } + return Container( padding: const EdgeInsets.all(16.0), child: Row( @@ -216,7 +217,7 @@ class _MultiFilesPickerState extends State { children: [ listCard( icon: 'camera_icon', - label: '${context.translation.open}\n${context.translation.camera}', + label: '${context.translation.open}\n${context.translation.camera}', onTap: () { Navigator.of(context).pop(ImageSource.camera); }, @@ -230,7 +231,7 @@ class _MultiFilesPickerState extends State { ), listCard( icon: 'file_icon', - label: '${context.translation.open}\n${context.translation.files}', + label: '${context.translation.open}\n${context.translation.files}', onTap: () async { await fromFilePicker(); Navigator.pop(context); @@ -286,36 +287,32 @@ class _MultiFilesPickerState extends State { } } +class AttachmentModel { + int id = 0; + File? file; + AttachmentModel(this.id, this.file); - - -class AttachmentModel { - int id =0; - File ? file; - AttachmentModel(this.id,this.file); - factory AttachmentModel.fromJson(Map json) { return AttachmentModel( json['id'] ?? 0, json['file'] != null ? File(json['file']) : null, ); } - + Map toJson() { return { 'id': id, 'file': file?.path, }; } - - } class AttachmentPicker extends StatefulWidget { final String label; final bool error; - final List attachment ; + final List attachment; + final bool enabled, onlyImages; double? buttonHeight; Widget? buttonIcon; @@ -325,16 +322,16 @@ class AttachmentPicker extends StatefulWidget { AttachmentPicker( {Key? key, - this.attachment = const [], - required this.label, - this.error = false, - this.buttonHeight, - this.buttonIcon, - this.enabled = true, - this.onlyImages = false, - this.onChange, - this.showAsGrid = false, - this.buttonColor}) + this.attachment = const [], + required this.label, + this.error = false, + this.buttonHeight, + this.buttonIcon, + this.enabled = true, + this.onlyImages = false, + this.onChange, + this.showAsGrid = false, + this.buttonColor}) : super(key: key); @override @@ -355,15 +352,15 @@ class _AttachmentPickerState extends State { onPressed: (widget.enabled == false) ? () {} : widget.showAsGrid - ? showFileSourceSheet - : onFilePicker), + ? showFileSourceSheet + : onFilePicker), 16.height, if (widget.attachment.isNotEmpty) Wrap( spacing: 8.toScreenWidth, children: List.generate( widget.attachment.length, - (index) { + (index) { File image = widget.attachment[index].file!; return MultiFilesPickerItem( file: image, @@ -481,16 +478,13 @@ class _AttachmentPickerState extends State { ImageSource? source = await showModalBottomSheet( context: context, builder: (BuildContext context) { - Widget listCard({required String icon, required String label, required VoidCallback onTap}){ + Widget listCard({required String icon, required String label, required VoidCallback onTap}) { return GestureDetector( onTap: onTap, child: Container( - constraints: BoxConstraints(minWidth: 111.toScreenWidth,minHeight: 111.toScreenHeight), - padding: EdgeInsets.symmetric(horizontal: 12.toScreenWidth,vertical: 12.toScreenHeight), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - border: Border.all(width: 1,color:AppColor.white70) - ), + constraints: BoxConstraints(minWidth: 111.toScreenWidth, minHeight: 111.toScreenHeight), + padding: EdgeInsets.symmetric(horizontal: 12.toScreenWidth, vertical: 12.toScreenHeight), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), border: Border.all(width: 1, color: AppColor.white70)), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, @@ -503,6 +497,7 @@ class _AttachmentPickerState extends State { ), ); } + return Container( padding: const EdgeInsets.all(16.0), child: Row( @@ -510,7 +505,7 @@ class _AttachmentPickerState extends State { children: [ listCard( icon: 'camera_icon', - label: '${context.translation.open}\n${context.translation.camera}', + label: '${context.translation.open}\n${context.translation.camera}', onTap: () { Navigator.of(context).pop(ImageSource.camera); }, @@ -524,7 +519,7 @@ class _AttachmentPickerState extends State { ), listCard( icon: 'file_icon', - label: '${context.translation.open}\n${context.translation.files}', + label: '${context.translation.open}\n${context.translation.files}', onTap: () async { await fromFilePicker(); Navigator.pop(context); @@ -572,7 +567,7 @@ class _AttachmentPickerState extends State { widget.onChange!(widget.attachment); } setState(() {}); - } + } setState(() {}); } diff --git a/pubspec.yaml b/pubspec.yaml index 6ecb3c07..455d5d30 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.3.2+21 +version: 1.3.3+22 environment: sdk: ">=3.5.0 <4.0.0"