From 8d31e702e82e9e9d204908b16bd997595bbfb956 Mon Sep 17 00:00:00 2001 From: marination Date: Thu, 17 Nov 2022 18:46:45 +0530 Subject: [PATCH] fix: Kanban Board Menu Items Accessibility via perms - Save Filters and Delete Board btns render if 'write' and 'delete' perms exist on Kanban Board - `Create Kanban Board` renders only if 'create' perms exist on Kanban Board - Bind board permisions to `board_perms` property of board object - Get perms via backend call at board initialization, as frontend does not have document object (only doctype meta and perms are cached) --- .../public/js/frappe/list/list_view_select.js | 16 +++-- .../views/kanban/kanban_board.bundle.js | 2 +- .../js/frappe/views/kanban/kanban_view.js | 68 ++++++++++++------- 3 files changed, 55 insertions(+), 31 deletions(-) diff --git a/frappe/public/js/frappe/list/list_view_select.js b/frappe/public/js/frappe/list/list_view_select.js index 5265ace340..daa16432b5 100644 --- a/frappe/public/js/frappe/list/list_view_select.js +++ b/frappe/public/js/frappe/list/list_view_select.js @@ -191,12 +191,16 @@ frappe.views.ListViewSelect = class ListViewSelect { ); }); - this.page.add_custom_menu_item( - kanban_switcher, - __("Create New Kanban Board"), - () => frappe.views.KanbanView.show_kanban_dialog(this.doctype), - true - ); + let perms = this.list_view.board_perms; + let can_create = perms ? perms.create : true; + if (can_create) { + this.page.add_custom_menu_item( + kanban_switcher, + __("Create New Kanban Board"), + () => frappe.views.KanbanView.show_kanban_dialog(this.doctype), + true + ); + } } get_page_name() { diff --git a/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js b/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js index 971081f5b9..ae11c0fdc0 100644 --- a/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js +++ b/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js @@ -519,7 +519,7 @@ frappe.provide("frappe.views"); function init() { make_dom(); - // setup_sortable(); // drag card + setup_sortable(); // drag card make_cards(); store.watch((state, getters) => { return state.cards; diff --git a/frappe/public/js/frappe/views/kanban/kanban_view.js b/frappe/public/js/frappe/views/kanban/kanban_view.js index f1be1d2849..506d4ee1b2 100644 --- a/frappe/public/js/frappe/views/kanban/kanban_view.js +++ b/frappe/public/js/frappe/views/kanban/kanban_view.js @@ -56,33 +56,53 @@ frappe.views.KanbanView = class KanbanView extends frappe.views.ListView { this.card_meta = this.get_card_meta(); this.page_length = 0; - // frappe run serially get/set perms > push menu items > get_board - this.menu_items.push( - ...[ - { - label: __("Save filters"), - action: () => { - this.save_kanban_board_filters(); - }, - }, - { - label: __("Delete Kanban Board"), - action: () => { - frappe.confirm("Are you sure you want to proceed?", () => { - frappe.db.delete_doc("Kanban Board", this.board_name).then(() => { - frappe.show_alert(`Kanban Board ${this.board_name} deleted.`); - frappe.set_route("List", this.doctype, "List"); - }); - }); - }, - }, - ] - ); - - return this.get_board(); + return frappe.run_serially([ + () => this.set_board_perms_and_push_menu_items(), + () => this.get_board(), + ]); }); } + set_board_perms_and_push_menu_items() { + // needs server-side call as client-side document instance is absent before kanban render + return frappe.call({ + method: "frappe.client.get_doc_permissions", + args: { + doctype: "Kanban Board", + docname: this.board_name + }, + callback: (result) => { + this.board_perms = result.message.permissions || {}; + this.push_menu_items(); + }, + }); + } + + push_menu_items() { + if (this.board_perms.write) { + this.menu_items.push({ + label: __("Save filters"), + action: () => { + this.save_kanban_board_filters(); + } + }); + } + + if (this.board_perms.delete) { + this.menu_items.push({ + label: __("Delete Kanban Board"), + action: () => { + frappe.confirm("Are you sure you want to proceed?", () => { + frappe.db.delete_doc("Kanban Board", this.board_name).then(() => { + frappe.show_alert(`Kanban Board ${this.board_name} deleted.`); + frappe.set_route("List", this.doctype, "List"); + }); + }); + }, + }); + } + } + setup_paging_area() { // pass }