update staff list, add pin editor and privilege editor

This commit is contained in:
tzw
2024-02-14 16:58:45 +06:30
parent 106ddded29
commit 13e6e232d5
20 changed files with 770 additions and 113 deletions

View File

@@ -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;
});
}
}
}

View File

@@ -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)
]))));
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}
}