diff --git a/assets/release_notes.md b/assets/release_notes.md index 5c1ab3d9..f8dd4583 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -2,6 +2,8 @@ --- - Fixes bug which prevent dialog boxes from being dismissed correctly +- Enable editing of attachment comments +- Updated translations ### 0.17.2 - December 2024 --- diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index 0804699c..e707df98 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -324,6 +324,8 @@ class InvenTreeModel { // Legacy API provided external link as "URL", while newer API uses "link" String get link => (jsondata["link"] ?? jsondata["URL"] ?? "") as String; + bool get hasLink => link.isNotEmpty; + /* * Attempt to extract a custom icon for this model. * If icon data is provided, attempt to convert to a TablerIcon icon @@ -946,6 +948,20 @@ class InvenTreeAttachment extends InvenTreeModel { @override String get URL => "attachment/"; + @override + Map> formFields() { + Map> fields = { + "link": {}, + "comment": {} + }; + + if (!hasLink) { + fields.remove("link"); + } + + return fields; + } + // Override this reference field for any subclasses // Note: This is used for the *legacy* attachment API String get REFERENCE_FIELD => ""; @@ -955,7 +971,9 @@ class InvenTreeAttachment extends InvenTreeModel { String get REF_MODEL_TYPE => ""; String get attachment => getString("attachment"); - + + bool get hasAttachment => attachment.isNotEmpty; + // Return the filename of the attachment String get filename { return attachment.split("/").last; @@ -1024,6 +1042,10 @@ class InvenTreeAttachment extends InvenTreeModel { String url = URL; + if (comment.isNotEmpty) { + data["comment"] = comment; + } + if (InvenTreeAPI().supportsModernAttachments) { url = "attachment/"; diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 3fef1f36..0614723d 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -338,6 +338,9 @@ "description": "edit" }, + "editAttachment": "Edit Attachment", + "@editAttachment": {}, + "editCategory": "Edit Category", "@editCategory": {}, diff --git a/lib/widget/attachment_widget.dart b/lib/widget/attachment_widget.dart index 42f3e84c..b10af546 100644 --- a/lib/widget/attachment_widget.dart +++ b/lib/widget/attachment_widget.dart @@ -97,6 +97,14 @@ class _AttachmentWidgetState extends RefreshableState { refresh(context); } + + Future editAttachment(BuildContext context, InvenTreeAttachment attachment) async + { + attachment.editForm(context, L10().editAttachment).then((result) => { + refresh(context) + }); + } + /* * Delete the specified attachment */ @@ -117,6 +125,7 @@ class _AttachmentWidgetState extends RefreshableState { * Display an option context menu for the selected attachment */ Future showOptionsMenu(BuildContext context, InvenTreeAttachment attachment) async { + OneContext().showDialog( builder: (BuildContext ctx) { return SimpleDialog( @@ -125,12 +134,22 @@ class _AttachmentWidgetState extends RefreshableState { Divider(), SimpleDialogOption( onPressed: () async { - Navigator.of(ctx).pop(); + OneContext().popDialog(); + editAttachment(context, attachment); + }, + child: ListTile( + title: Text(L10().edit), + leading: Icon(TablerIcons.edit), + ) + ), + SimpleDialogOption( + onPressed: () async { + OneContext().popDialog(); deleteAttachment(context, attachment); }, child: ListTile( title: Text(L10().delete), - leading: Icon(TablerIcons.trash), + leading: Icon(TablerIcons.trash, color: COLOR_DANGER), ) ) ] @@ -162,6 +181,9 @@ class _AttachmentWidgetState extends RefreshableState { } } }); + + setState(() { + }); } @override diff --git a/lib/widget/refreshable_state.dart b/lib/widget/refreshable_state.dart index f20462cb..546c14dd 100644 --- a/lib/widget/refreshable_state.dart +++ b/lib/widget/refreshable_state.dart @@ -43,7 +43,12 @@ mixin BaseWidgetProperties { return SingleChildScrollView( physics: AlwaysScrollableScrollPhysics(), child: Column( - children: getTiles(context) + children: [ + ListView( + children: getTiles(context), + shrinkWrap: true, + ) + ], ) ); }