update staff list, add pin editor and privilege editor
This commit is contained in:
@@ -4,29 +4,29 @@ import 'package:fcs/pages/widgets/local_app_bar.dart';
|
||||
import 'package:fcs/pages/widgets/multi_img_controller.dart';
|
||||
import 'package:fcs/pages/widgets/progress.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../main/util.dart';
|
||||
import '../widgets/local_button.dart';
|
||||
import '../widgets/multi_img_file.dart';
|
||||
|
||||
typedef void FindCallBack();
|
||||
import 'model/carton_model.dart';
|
||||
|
||||
class CartonImageUploadEditor extends StatefulWidget {
|
||||
final Carton? box;
|
||||
const CartonImageUploadEditor({this.box});
|
||||
final Carton carton;
|
||||
const CartonImageUploadEditor({required this.carton});
|
||||
@override
|
||||
_CartonImageUploaState createState() => _CartonImageUploaState();
|
||||
}
|
||||
|
||||
class _CartonImageUploaState extends State<CartonImageUploadEditor> {
|
||||
bool _isLoading = false;
|
||||
Carton? _box;
|
||||
MultiImgController multiImgController = MultiImgController();
|
||||
|
||||
MultiImgController _multiImgController = MultiImgController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_box = widget.box;
|
||||
multiImgController.setImageUrls = _box?.photoUrls;
|
||||
_multiImgController.setImageUrls = widget.carton.photoUrls;
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -34,9 +34,10 @@ class _CartonImageUploaState extends State<CartonImageUploadEditor> {
|
||||
final saveBtn = Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 30),
|
||||
child: LocalButton(
|
||||
textKey: "btn.save",
|
||||
callBack: () {},
|
||||
),
|
||||
textKey: "btn.save",
|
||||
callBack: () {
|
||||
_uploadImage();
|
||||
}),
|
||||
);
|
||||
|
||||
return LocalProgress(
|
||||
@@ -53,19 +54,37 @@ class _CartonImageUploaState extends State<CartonImageUploadEditor> {
|
||||
child: ListView(
|
||||
children: [
|
||||
Center(
|
||||
child: Text("${_box?.cartonNumber}",
|
||||
child: Text("${widget.carton.cartonNumber}",
|
||||
style: TextStyle(
|
||||
color: primaryColor,
|
||||
fontSize: 25,
|
||||
))),
|
||||
MultiImageFile(
|
||||
enabled: true,
|
||||
controller: multiImgController,
|
||||
controller: _multiImgController,
|
||||
title: "Receipt File",
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
saveBtn,
|
||||
],
|
||||
),
|
||||
)));
|
||||
}
|
||||
|
||||
_uploadImage() async {
|
||||
setState(() {
|
||||
_isLoading = true;
|
||||
});
|
||||
try {
|
||||
await context.read<CartonModel>().uploadCartonImages(widget.carton,
|
||||
_multiImgController.getAddedFile, _multiImgController.getDeletedUrl);
|
||||
Navigator.pop(context, true);
|
||||
} catch (e) {
|
||||
showMsgDialog(context, "Error", e.toString());
|
||||
} finally {
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ class CartonInfo extends StatefulWidget {
|
||||
class _CartonInfoState extends State<CartonInfo> {
|
||||
final DateFormat dateFormat = DateFormat("d MMM yyyy");
|
||||
final NumberFormat numberFormatter = NumberFormat("#,###");
|
||||
MultiImgController multiImgController = MultiImgController();
|
||||
MultiImgController _multiImgController = MultiImgController();
|
||||
bool _isLoading = false;
|
||||
late Carton _carton;
|
||||
List<CargoType> _cargoTypes = [];
|
||||
@@ -58,7 +58,7 @@ class _CartonInfoState extends State<CartonInfo> {
|
||||
_carton.cartonType = carton_from_packages;
|
||||
_carton.billTo = billToConsignee;
|
||||
_carton.cartonSizeType = customCarton;
|
||||
multiImgController.setImageUrls = _carton.photos;
|
||||
_multiImgController.setImageUrls = _carton.photoUrls;
|
||||
_cargoTypes = _carton.cargoTypes.where((e) => !e.isCutomDuty).toList();
|
||||
_surchareItems = _carton.cargoTypes.where((e) => e.isCutomDuty).toList();
|
||||
if (_carton.cartonType == carton_from_packages) {
|
||||
@@ -245,7 +245,6 @@ class _CartonInfoState extends State<CartonInfo> {
|
||||
style: TextStyle(color: Colors.black54, fontSize: 15)))
|
||||
],
|
||||
),
|
||||
//),
|
||||
Container(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(right: 60),
|
||||
@@ -273,7 +272,6 @@ class _CartonInfoState extends State<CartonInfo> {
|
||||
);
|
||||
}).toList()),
|
||||
const SizedBox(height: 10),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -283,29 +281,39 @@ class _CartonInfoState extends State<CartonInfo> {
|
||||
|
||||
final img = MultiImageFile(
|
||||
enabled: false,
|
||||
controller: multiImgController,
|
||||
controller: _multiImgController,
|
||||
title: "Receipt File",
|
||||
);
|
||||
|
||||
final uploadImageBtn = Padding(
|
||||
padding: EdgeInsets.only(left: 200.0, right: 8.0),
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Color(0xff272262),
|
||||
elevation: 3,
|
||||
shape:
|
||||
RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0)),
|
||||
minimumSize: Size(10, 35),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.push(
|
||||
context,
|
||||
CupertinoPageRoute(
|
||||
builder: (context) => CartonImageUploadEditor(box: _carton)),
|
||||
);
|
||||
},
|
||||
child: const Text('Upload Images'),
|
||||
),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Color(0xff272262),
|
||||
elevation: 3,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(5.0)),
|
||||
minimumSize: Size(10, 35),
|
||||
),
|
||||
onPressed: () async {
|
||||
bool? updated = await Navigator.push(
|
||||
context,
|
||||
CupertinoPageRoute(
|
||||
builder: (context) =>
|
||||
CartonImageUploadEditor(carton: _carton)),
|
||||
);
|
||||
|
||||
if (updated ?? false) {
|
||||
Carton? c = await context
|
||||
.read<CartonModel>()
|
||||
.getCarton(widget.carton.id ?? "");
|
||||
if (c == null) return;
|
||||
_carton = c;
|
||||
_init();
|
||||
}
|
||||
},
|
||||
child: LocalText(context, "box.imageupload.title",
|
||||
color: Colors.white, fontSize: 14)),
|
||||
);
|
||||
|
||||
final deleteBtn = Padding(
|
||||
@@ -390,7 +398,9 @@ class _CartonInfoState extends State<CartonInfo> {
|
||||
_surchareItems.isEmpty ? const SizedBox() : surchargeItemBox,
|
||||
uploadImageBtn,
|
||||
img,
|
||||
deleteBtn
|
||||
const SizedBox(height: 15),
|
||||
deleteBtn,
|
||||
const SizedBox(height: 20)
|
||||
]))));
|
||||
}
|
||||
|
||||
|
||||
@@ -95,11 +95,18 @@ class _CartonSizeWidgetState extends State<CartonSizeWidget> {
|
||||
_heightController.text =
|
||||
widget.height == null ? "0" : removeTrailingZeros(widget.height ?? 0);
|
||||
|
||||
_loadShipment();
|
||||
|
||||
if (mounted) {
|
||||
setState(() {});
|
||||
}
|
||||
}
|
||||
|
||||
_loadShipment() async {
|
||||
var fcsShipments =
|
||||
await context.read<FcsShipmentModel>().getActiveFcsShipments();
|
||||
_shipments = fcsShipments;
|
||||
_shipment = widget.shipment;
|
||||
|
||||
if (mounted) {
|
||||
setState(() {});
|
||||
}
|
||||
@@ -107,7 +114,7 @@ class _CartonSizeWidgetState extends State<CartonSizeWidget> {
|
||||
|
||||
@override
|
||||
void didUpdateWidget(covariant CartonSizeWidget oldWidget) {
|
||||
_init();
|
||||
_loadShipment();
|
||||
super.didUpdateWidget(oldWidget);
|
||||
}
|
||||
|
||||
|
||||
@@ -76,11 +76,18 @@ class _TypeWidgetState extends State<TypeWidget> {
|
||||
_heightController.text =
|
||||
widget.height == null ? "0" : removeTrailingZeros(widget.height ?? 0);
|
||||
|
||||
_loadShipment();
|
||||
|
||||
if (mounted) {
|
||||
setState(() {});
|
||||
}
|
||||
}
|
||||
|
||||
_loadShipment() async {
|
||||
var fcsShipments =
|
||||
await context.read<FcsShipmentModel>().getActiveFcsShipments();
|
||||
_shipments = fcsShipments;
|
||||
_shipment = widget.shipment;
|
||||
|
||||
if (mounted) {
|
||||
setState(() {});
|
||||
}
|
||||
@@ -88,7 +95,7 @@ class _TypeWidgetState extends State<TypeWidget> {
|
||||
|
||||
@override
|
||||
void didUpdateWidget(covariant TypeWidget oldWidget) {
|
||||
_init();
|
||||
_loadShipment();
|
||||
super.didUpdateWidget(oldWidget);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
import 'package:fcs/data/services/services.dart';
|
||||
@@ -10,6 +11,8 @@ import 'package:fcs/pagination/paginator_listener.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
import '../../../domain/entities/user.dart';
|
||||
import '../../../helpers/firebase_helper.dart';
|
||||
import 'package:path/path.dart' as Path;
|
||||
|
||||
class CartonModel extends BaseModel {
|
||||
final log = Logger('CartonModel');
|
||||
@@ -227,7 +230,7 @@ class CartonModel extends BaseModel {
|
||||
return Services.instance.cartonService.searchCarton(term);
|
||||
}
|
||||
|
||||
Future<List<Carton>> getCartonsByIds(List<String> cartonIds) async {
|
||||
Future<List<Carton>> getCartonsByIds(List<String> cartonIds) async {
|
||||
List<Carton> cartons = [];
|
||||
try {
|
||||
for (var e in cartonIds) {
|
||||
@@ -241,4 +244,40 @@ class CartonModel extends BaseModel {
|
||||
}
|
||||
return cartons;
|
||||
}
|
||||
|
||||
Future<void> uploadCartonImages(
|
||||
Carton carton, List<File?> files, List<String?> deletedUrls) async {
|
||||
if (deletedUrls.isNotEmpty) {
|
||||
for (String? url in deletedUrls) {
|
||||
carton.photoUrls.remove(url);
|
||||
}
|
||||
}
|
||||
|
||||
List<String> uploadedURL = [];
|
||||
if (files.isNotEmpty) {
|
||||
var count =
|
||||
(carton.photoUrls.length) + files.length - (deletedUrls.length);
|
||||
|
||||
if (count > uploadPhotoLimit)
|
||||
throw Exception("Exceed number of file upload");
|
||||
|
||||
carton.photoUrls = carton.photoUrls;
|
||||
String path = Path.join(carton_files_path);
|
||||
uploadedURL = await uploadFiles(path, files);
|
||||
uploadedURL.forEach((url) {
|
||||
carton.photoUrls.add(url);
|
||||
});
|
||||
}
|
||||
try {
|
||||
// await Services.instance.packageService.updateReceiving(package);
|
||||
} catch (e) {
|
||||
// delete newly uploaded photos if fails
|
||||
try {
|
||||
deleteStorageFromUrls(uploadedURL);
|
||||
carton.photoUrls.removeWhere((i) => uploadedURL.contains(i));
|
||||
} catch (e) {}
|
||||
throw e;
|
||||
}
|
||||
return deleteStorageFromUrls(deletedUrls);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user