From fbbb453138fbf0482dd9a40d2f8dda9fa26638ff Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Fri, 4 Aug 2023 11:47:32 +0200 Subject: [PATCH] feat: close assignment from sidebar --- frappe/desk/form/assign_to.py | 12 +++++- frappe/desk/form/load.py | 2 +- .../js/frappe/form/sidebar/assign_to.js | 43 +++++++++++++++---- frappe/public/scss/common/modal.scss | 19 +++++--- frappe/translations/de.csv | 2 + 5 files changed, 60 insertions(+), 18 deletions(-) diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index ce8bb444a1..16f170498d 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -32,7 +32,7 @@ def get(args=None): filters={ "reference_type": args.get("doctype"), "reference_name": args.get("name"), - "status": ("!=", "Cancelled"), + "status": ("not in", ("Cancelled", "Closed")), }, limit=5, ) @@ -164,6 +164,14 @@ def remove(doctype, name, assign_to): return set_status(doctype, name, "", assign_to, status="Cancelled") +@frappe.whitelist() +def close(doctype: str, name: str, assign_to: str): + if assign_to != frappe.session.user: + frappe.throw(_("Only the assignee can complete this to-do.")) + + return set_status(doctype, name, "", assign_to, status="Closed") + + def set_status(doctype, name, todo=None, assign_to=None, status="Cancelled"): """remove from todo""" try: @@ -187,7 +195,7 @@ def set_status(doctype, name, todo=None, assign_to=None, status="Cancelled"): pass # clear assigned_to if field exists - if frappe.get_meta(doctype).get_field("assigned_to") and status == "Cancelled": + if frappe.get_meta(doctype).get_field("assigned_to") and status in ("Cancelled", "Closed"): frappe.db.set_value(doctype, name, "assigned_to", None) return get({"doctype": doctype, "name": name}) diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index 56f39aacfb..d6d4c400b2 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -345,7 +345,7 @@ def get_assignments(dt, dn): filters={ "reference_type": dt, "reference_name": dn, - "status": ("!=", "Cancelled"), + "status": ("not in", ("Cancelled", "Closed")), "allocated_to": ("is", "set"), }, ) diff --git a/frappe/public/js/frappe/form/sidebar/assign_to.js b/frappe/public/js/frappe/form/sidebar/assign_to.js index cd83705f19..25f259e867 100644 --- a/frappe/public/js/frappe/form/sidebar/assign_to.js +++ b/frappe/public/js/frappe/form/sidebar/assign_to.js @@ -288,6 +288,13 @@ frappe.ui.form.AssignmentDialog = class { assign_to: assignment, }); } + close_assignment(assignment) { + return frappe.xcall("frappe.desk.form.assign_to.close", { + doctype: this.frm.doctype, + name: this.frm.docname, + assign_to: assignment, + }); + } update_assignment(assignment) { const in_the_list = this.assignment_list.find(`[data-user="${assignment}"]`).length; if (!in_the_list) { @@ -295,22 +302,40 @@ frappe.ui.form.AssignmentDialog = class { } } get_assignment_row(assignment) { - let row = $(` + const row = $(`