2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-07-01 19:30:44 +00:00

Format Code and Add Format Checks to CI (#643)

* Remove unused lib/generated/i18n.dart

* Use `fvm dart format .`

* Add contributing guidelines

* Enforce dart format

* Add `dart format off` directive to generated files
This commit is contained in:
Ben Hagen
2025-06-24 01:55:01 +02:00
committed by GitHub
parent e9db6532e4
commit 4444884afa
100 changed files with 5332 additions and 5592 deletions

View File

@ -1,4 +1,3 @@
import "package:flutter/material.dart";
import "package:flutter_speed_dial/flutter_speed_dial.dart";
import "package:flutter_tabler_icons/flutter_tabler_icons.dart";
@ -25,7 +24,6 @@ import "package:inventree/widget/progress.dart";
* Widget for viewing a single SalesOrder instance
*/
class SalesOrderDetailWidget extends StatefulWidget {
const SalesOrderDetailWidget(this.order, {Key? key}) : super(key: key);
final InvenTreeSalesOrder order;
@ -34,9 +32,7 @@ class SalesOrderDetailWidget extends StatefulWidget {
_SalesOrderDetailState createState() => _SalesOrderDetailState();
}
class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
_SalesOrderDetailState();
List<InvenTreeSOLineItem> lines = [];
@ -68,7 +64,7 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
onPressed: () {
editOrder(context);
},
)
),
);
}
@ -77,7 +73,6 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
// Add a new shipment against this sales order
Future<void> _addShipment(BuildContext context) async {
var fields = InvenTreeSalesOrderShipment().formFields();
fields["order"]?["value"] = widget.order.pk;
@ -89,9 +84,8 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
fields: fields,
onSuccess: (result) async {
refresh(context);
}
},
);
}
// Add a new line item to this sales order
@ -102,52 +96,51 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
fields["order"]?["hidden"] = true;
InvenTreeSOLineItem().createForm(
context,
L10().lineItemAdd,
fields: fields,
onSuccess: (result) async {
refresh(context);
}
context,
L10().lineItemAdd,
fields: fields,
onSuccess: (result) async {
refresh(context);
},
);
}
/// Upload an image for this order
Future<void> _uploadImage(BuildContext context) async {
InvenTreeSalesOrderAttachment().uploadImage(
widget.order.pk,
prefix: widget.order.reference,
).then((result) => refresh(context));
InvenTreeSalesOrderAttachment()
.uploadImage(widget.order.pk, prefix: widget.order.reference)
.then((result) => refresh(context));
}
/// Issue this order
Future<void> _issueOrder(BuildContext context) async {
confirmationDialog(
L10().issueOrder, "",
icon: TablerIcons.send,
color: Colors.blue,
acceptText: L10().issue,
onAccept: () async {
widget.order.issueOrder().then((dynamic) {
refresh(context);
});
}
L10().issueOrder,
"",
icon: TablerIcons.send,
color: Colors.blue,
acceptText: L10().issue,
onAccept: () async {
widget.order.issueOrder().then((dynamic) {
refresh(context);
});
},
);
}
/// Cancel this order
Future<void> _cancelOrder(BuildContext context) async {
confirmationDialog(
L10().cancelOrder, "",
icon: TablerIcons.circle_x,
color: Colors.red,
acceptText: L10().cancel,
onAccept: () async {
await widget.order.cancelOrder().then((dynamic) {
refresh(context);
});
}
L10().cancelOrder,
"",
icon: TablerIcons.circle_x,
color: Colors.red,
acceptText: L10().cancel,
onAccept: () async {
await widget.order.cancelOrder().then((dynamic) {
refresh(context);
});
},
);
}
@ -157,50 +150,51 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
if (showCameraShortcut && widget.order.canEdit) {
actions.add(
SpeedDialChild(
child: Icon(TablerIcons.camera, color: Colors.blue),
label: L10().takePicture,
onTap: () async {
_uploadImage(context);
}
)
SpeedDialChild(
child: Icon(TablerIcons.camera, color: Colors.blue),
label: L10().takePicture,
onTap: () async {
_uploadImage(context);
},
),
);
}
if (widget.order.isPending) {
actions.add(
SpeedDialChild(
child: Icon(TablerIcons.send, color: Colors.blue),
label: L10().issueOrder,
onTap: () async {
_issueOrder(context);
}
)
SpeedDialChild(
child: Icon(TablerIcons.send, color: Colors.blue),
label: L10().issueOrder,
onTap: () async {
_issueOrder(context);
},
),
);
}
if (widget.order.isOpen) {
actions.add(
SpeedDialChild(
child: Icon(TablerIcons.circle_x, color: Colors.red),
label: L10().cancelOrder,
onTap: () async {
_cancelOrder(context);
}
)
SpeedDialChild(
child: Icon(TablerIcons.circle_x, color: Colors.red),
label: L10().cancelOrder,
onTap: () async {
_cancelOrder(context);
},
),
);
}
// Add line item
if ((widget.order.isPending || widget.order.isInProgress) && InvenTreeSOLineItem().canCreate) {
if ((widget.order.isPending || widget.order.isInProgress) &&
InvenTreeSOLineItem().canCreate) {
actions.add(
SpeedDialChild(
child: Icon(TablerIcons.circle_plus, color: Colors.green),
label: L10().lineItemAdd,
onTap: () async {
_addLineItem(context);
}
)
},
),
);
actions.add(
@ -209,8 +203,8 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
label: L10().shipmentAdd,
onTap: () async {
_addShipment(context);
}
)
},
),
);
}
@ -221,7 +215,8 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
List<SpeedDialChild> barcodeButtons(BuildContext context) {
List<SpeedDialChild> actions = [];
if ((widget.order.isInProgress || widget.order.isPending) && InvenTreeSOLineItem().canCreate) {
if ((widget.order.isInProgress || widget.order.isPending) &&
InvenTreeSOLineItem().canCreate) {
actions.add(
SpeedDialChild(
child: Icon(Icons.barcode_reader),
@ -231,8 +226,8 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
context,
handler: SOAddItemBarcodeHandler(salesOrder: widget.order),
);
}
)
},
),
);
if (api.supportsBarcodeSOAllocateEndpoint) {
@ -243,12 +238,10 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
onTap: () async {
scanBarcode(
context,
handler: SOAllocateStockHandler(
salesOrder: widget.order,
)
handler: SOAllocateStockHandler(salesOrder: widget.order),
);
}
)
},
),
);
}
}
@ -261,10 +254,20 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
await widget.order.reload();
await api.SalesOrderStatus.load();
supportsProjectCodes = api.supportsProjectCodes && await api.getGlobalBooleanSetting("PROJECT_CODES_ENABLED", backup: true);
showCameraShortcut = await InvenTreeSettingsManager().getBool(INV_SO_SHOW_CAMERA, true);
supportsProjectCodes =
api.supportsProjectCodes &&
await api.getGlobalBooleanSetting(
"PROJECT_CODES_ENABLED",
backup: true,
);
showCameraShortcut = await InvenTreeSettingsManager().getBool(
INV_SO_SHOW_CAMERA,
true,
);
InvenTreeSalesOrderAttachment().countAttachments(widget.order.pk).then((int value) {
InvenTreeSalesOrderAttachment().countAttachments(widget.order.pk).then((
int value,
) {
if (mounted) {
setState(() {
attachmentCount = value;
@ -273,13 +276,15 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
});
// Count number of "extra line items" against this order
InvenTreeSOExtraLineItem().count(filters: {"order": widget.order.pk.toString() }).then((int value) {
if (mounted) {
setState(() {
extraLineCount = value;
InvenTreeSOExtraLineItem()
.count(filters: {"order": widget.order.pk.toString()})
.then((int value) {
if (mounted) {
setState(() {
extraLineCount = value;
});
}
});
}
});
}
// Edit the current SalesOrder instance
@ -305,7 +310,7 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
onSuccess: (data) async {
refresh(context);
showSnackIcon(L10().salesOrderUpdated, success: true);
}
},
);
}
@ -321,121 +326,154 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
trailing: Text(
api.SalesOrderStatus.label(widget.order.status),
style: TextStyle(
color: api.SalesOrderStatus.color(widget.order.status)
color: api.SalesOrderStatus.color(widget.order.status),
),
),
)
),
);
}
List<Widget> orderTiles(BuildContext context) {
List<Widget> tiles = [
headerTile(context)
];
List<Widget> tiles = [headerTile(context)];
InvenTreeCompany? customer = widget.order.customer;
if (supportsProjectCodes && widget.order.hasProjectCode) {
tiles.add(ListTile(
title: Text(L10().projectCode),
subtitle: Text("${widget.order.projectCode} - ${widget.order.projectCodeDescription}"),
leading: Icon(TablerIcons.list),
));
tiles.add(
ListTile(
title: Text(L10().projectCode),
subtitle: Text(
"${widget.order.projectCode} - ${widget.order.projectCodeDescription}",
),
leading: Icon(TablerIcons.list),
),
);
}
if (customer != null) {
tiles.add(ListTile(
title: Text(L10().customer),
subtitle: Text(customer.name),
leading: Icon(TablerIcons.user, color: COLOR_ACTION),
onTap: () {
customer.goToDetailPage(context);
}
));
tiles.add(
ListTile(
title: Text(L10().customer),
subtitle: Text(customer.name),
leading: Icon(TablerIcons.user, color: COLOR_ACTION),
onTap: () {
customer.goToDetailPage(context);
},
),
);
}
if (widget.order.customerReference.isNotEmpty) {
tiles.add(ListTile(
title: Text(L10().customerReference),
trailing: Text(widget.order.customerReference),
leading: Icon(TablerIcons.hash),
));
tiles.add(
ListTile(
title: Text(L10().customerReference),
trailing: Text(widget.order.customerReference),
leading: Icon(TablerIcons.hash),
),
);
}
Color lineColor = widget.order.complete ? COLOR_SUCCESS : COLOR_WARNING;
tiles.add(ListTile(
title: Text(L10().lineItems),
subtitle: ProgressBar(
widget.order.completedLineItemCount.toDouble(),
maximum: widget.order.lineItemCount.toDouble()
tiles.add(
ListTile(
title: Text(L10().lineItems),
subtitle: ProgressBar(
widget.order.completedLineItemCount.toDouble(),
maximum: widget.order.lineItemCount.toDouble(),
),
leading: Icon(TablerIcons.clipboard_check),
trailing: Text(
"${widget.order.completedLineItemCount} / ${widget.order.lineItemCount}",
style: TextStyle(color: lineColor),
),
),
leading: Icon(TablerIcons.clipboard_check),
trailing: Text("${widget.order.completedLineItemCount} / ${widget.order.lineItemCount}", style: TextStyle(color: lineColor)),
));
);
// Extra line items
tiles.add(ListTile(
title: Text(L10().extraLineItems),
leading: Icon(TablerIcons.clipboard_list, color: COLOR_ACTION),
trailing: Text(extraLineCount.toString()),
onTap: () => {
Navigator.push(
tiles.add(
ListTile(
title: Text(L10().extraLineItems),
leading: Icon(TablerIcons.clipboard_list, color: COLOR_ACTION),
trailing: Text(extraLineCount.toString()),
onTap: () => {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SOExtraLineListWidget(widget.order, filters: {"order": widget.order.pk.toString()})
)
)
},
));
builder: (context) => SOExtraLineListWidget(
widget.order,
filters: {"order": widget.order.pk.toString()},
),
),
),
},
),
);
// Shipment progress
if (widget.order.shipmentCount > 0) {
tiles.add(ListTile(
title: Text(L10().shipments),
subtitle: ProgressBar(
widget.order.completedShipmentCount.toDouble(),
maximum: widget.order.shipmentCount.toDouble()
tiles.add(
ListTile(
title: Text(L10().shipments),
subtitle: ProgressBar(
widget.order.completedShipmentCount.toDouble(),
maximum: widget.order.shipmentCount.toDouble(),
),
leading: Icon(TablerIcons.truck_delivery),
trailing: Text(
"${widget.order.completedShipmentCount} / ${widget.order.shipmentCount}",
style: TextStyle(color: lineColor),
),
),
leading: Icon(TablerIcons.truck_delivery),
trailing: Text("${widget.order.completedShipmentCount} / ${widget.order.shipmentCount}", style: TextStyle(color: lineColor)),
));
);
}
// TODO: total price
if (widget.order.startDate.isNotEmpty) {
tiles.add(ListTile(
title: Text(L10().startDate),
trailing: Text(widget.order.startDate),
leading: Icon(TablerIcons.calendar),
));
tiles.add(
ListTile(
title: Text(L10().startDate),
trailing: Text(widget.order.startDate),
leading: Icon(TablerIcons.calendar),
),
);
}
if (widget.order.targetDate.isNotEmpty) {
tiles.add(ListTile(
title: Text(L10().targetDate),
trailing: Text(widget.order.targetDate),
leading: Icon(TablerIcons.calendar),
));
tiles.add(
ListTile(
title: Text(L10().targetDate),
trailing: Text(widget.order.targetDate),
leading: Icon(TablerIcons.calendar),
),
);
}
if (widget.order.shipmentDate.isNotEmpty) {
tiles.add(ListTile(
title: Text(L10().completionDate),
trailing: Text(widget.order.shipmentDate),
leading: Icon(TablerIcons.calendar),
));
tiles.add(
ListTile(
title: Text(L10().completionDate),
trailing: Text(widget.order.shipmentDate),
leading: Icon(TablerIcons.calendar),
),
);
}
// Responsible "owner"
if (widget.order.responsibleName.isNotEmpty && widget.order.responsibleLabel.isNotEmpty) {
tiles.add(ListTile(
if (widget.order.responsibleName.isNotEmpty &&
widget.order.responsibleLabel.isNotEmpty) {
tiles.add(
ListTile(
title: Text(L10().responsible),
leading: Icon(widget.order.responsibleLabel == "group" ? TablerIcons.users : TablerIcons.user),
trailing: Text(widget.order.responsibleName)
));
leading: Icon(
widget.order.responsibleLabel == "group"
? TablerIcons.users
: TablerIcons.user,
),
trailing: Text(widget.order.responsibleName),
),
);
}
// Notes tile
@ -446,12 +484,10 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => NotesWidget(widget.order)
)
MaterialPageRoute(builder: (context) => NotesWidget(widget.order)),
);
},
)
),
);
// Attachments
@ -462,18 +498,18 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
trailing: attachmentCount > 0 ? Text(attachmentCount.toString()) : null,
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AttachmentWidget(
InvenTreeSalesOrderAttachment(),
widget.order.pk,
widget.order.reference,
widget.order.canEdit
)
)
);
context,
MaterialPageRoute(
builder: (context) => AttachmentWidget(
InvenTreeSalesOrderAttachment(),
widget.order.pk,
widget.order.reference,
widget.order.canEdit,
),
),
);
},
)
),
);
return tiles;
@ -496,5 +532,4 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
PaginatedSOShipmentList({"order": widget.order.pk.toString()}),
];
}
}