From 3ab2850b7427374f489119f0eeb2aede2aaa123f Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 24 Apr 2019 17:02:28 +0530 Subject: [PATCH] feat: allow addition of buttons in list --- frappe/desk/doctype/todo/todo.json | 30 ++++++++++++---- frappe/desk/doctype/todo/todo_list.js | 21 ++++++++++-- frappe/public/js/frappe/list/list_view.js | 34 +++++++++++++++++-- .../energy_point_log/energy_point_log.py | 7 ++++ 4 files changed, 80 insertions(+), 12 deletions(-) diff --git a/frappe/desk/doctype/todo/todo.json b/frappe/desk/doctype/todo/todo.json index 09b0610215..4b70086648 100644 --- a/frappe/desk/doctype/todo/todo.json +++ b/frappe/desk/doctype/todo/todo.json @@ -21,6 +21,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "description_and_status", "fieldtype": "Section Break", "hidden": 0, @@ -53,6 +54,7 @@ "collapsible": 0, "columns": 0, "default": "Open", + "fetch_if_empty": 0, "fieldname": "status", "fieldtype": "Select", "hidden": 0, @@ -86,6 +88,7 @@ "collapsible": 0, "columns": 0, "default": "Medium", + "fetch_if_empty": 0, "fieldname": "priority", "fieldtype": "Select", "hidden": 0, @@ -120,6 +123,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_2", "fieldtype": "Column Break", "hidden": 0, @@ -150,6 +154,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "color", "fieldtype": "Color", "hidden": 0, @@ -157,7 +162,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_standard_filter": 0, "label": "Color", "length": 0, @@ -182,6 +187,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "date", "fieldtype": "Date", "hidden": 0, @@ -189,7 +195,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_standard_filter": 1, "label": "Due Date", "length": 0, @@ -215,6 +221,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "owner", "fieldtype": "Link", "hidden": 0, @@ -247,6 +254,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "description_section", "fieldtype": "Section Break", "hidden": 0, @@ -279,6 +287,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "description", "fieldtype": "Text Editor", "hidden": 0, @@ -314,6 +323,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "section_break_6", "fieldtype": "Section Break", "hidden": 0, @@ -345,6 +355,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "reference_type", "fieldtype": "Link", "hidden": 0, @@ -352,7 +363,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_standard_filter": 0, "label": "Reference Type", "length": 0, @@ -379,6 +390,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "reference_name", "fieldtype": "Dynamic Link", "hidden": 0, @@ -413,6 +425,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_10", "fieldtype": "Column Break", "hidden": 0, @@ -443,6 +456,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "role", "fieldtype": "Link", "hidden": 0, @@ -477,6 +491,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "assigned_by", "fieldtype": "Link", "hidden": 0, @@ -510,6 +525,7 @@ "collapsible": 0, "columns": 0, "fetch_from": "assigned_by.full_name", + "fetch_if_empty": 0, "fieldname": "assigned_by_full_name", "fieldtype": "Read Only", "hidden": 0, @@ -543,6 +559,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "sender", "fieldtype": "Data", "hidden": 1, @@ -575,6 +592,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "assignment_rule", "fieldtype": "Link", "hidden": 0, @@ -603,17 +621,16 @@ } ], "has_web_view": 0, - "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-check", "idx": 2, - "image_view": 0, "in_create": 0, "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2019-03-07 16:11:25.764549", + "menu_index": 0, + "modified": "2019-04-24 15:45:23.290491", "modified_by": "Administrator", "module": "Desk", "name": "ToDo", @@ -660,7 +677,6 @@ ], "quick_entry": 1, "read_only": 0, - "read_only_onload": 0, "search_fields": "description, reference_type, reference_name", "show_name_in_global_search": 0, "sort_order": "DESC", diff --git a/frappe/desk/doctype/todo/todo_list.js b/frappe/desk/doctype/todo/todo_list.js index 6200e85dca..ca782c7932 100644 --- a/frappe/desk/doctype/todo/todo_list.js +++ b/frappe/desk/doctype/todo/todo_list.js @@ -1,4 +1,7 @@ frappe.listview_settings['ToDo'] = { + hide_name_column: true, + add_fields: ["reference_type", "reference_name"], + onload: function(me) { if (!frappe.route_options) { frappe.route_options = { @@ -8,7 +11,22 @@ frappe.listview_settings['ToDo'] = { } me.page.set_title(__("To Do")); }, - hide_name_column: true, + + button: { + show: function(doc) { + return doc.reference_name; + }, + get_label: function(doc) { + return __('Open'); + }, + get_description: function(doc) { + return __('Open {0}', [`${doc.reference_type} ${doc.reference_name}`]) + }, + action: function(doc) { + frappe.set_route('Form', doc.reference_type, doc.reference_name); + } + }, + refresh: function(me) { if (me.todo_sidebar_setup) return; @@ -19,5 +37,4 @@ frappe.listview_settings['ToDo'] = { me.todo_sidebar_setup = true; }, - add_fields: ["reference_type", "reference_name"], } \ No newline at end of file diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 5e016f0215..caa8338653 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -373,7 +373,10 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { if (this.data.length > 0) { // append rows this.$result.append( - this.data.map(doc => this.get_list_row_html(doc)).join('') + this.data.map((doc, i) => { + doc._idx = i; + return this.get_list_row_html(doc); + }).join('') ); } this.on_row_checked(); @@ -473,7 +476,8 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { } get_list_row_html(doc) { - return this.get_list_row_html_skeleton(this.get_left_html(doc), this.get_right_html(doc)); + return this.get_list_row_html_skeleton(this.get_left_html(doc), + this.get_right_html(doc)); } get_list_row_html_skeleton(left = '', right = '') { @@ -580,7 +584,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { get_meta_html(doc) { let html = ''; - if (doc[this.meta.title_field || ''] !== doc.name) { + if (!this.settings.hide_name_column && doc[this.meta.title_field || ''] !== doc.name) { html += ` `; } + + if (this.settings.button && this.settings.button.show(doc)) { + html += ` + + `; + } + const modified = comment_when(doc.modified, true); const last_assignee = JSON.parse(doc._assign || '[]').slice(-1)[0]; @@ -710,6 +727,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { this.setup_check_events(); this.setup_like(); this.setup_realtime_updates(); + this.setup_action_handler(); } setup_filterable() { @@ -762,6 +780,16 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { }); } + setup_action_handler() { + this.$result.on('click', '.btn-action', (e) => { + const $button = $(e.currentTarget); + const doc = this.data[$button.attr('data-idx')]; + this.settings.button.action(doc); + e.stopPropagation(); + return false; + }); + } + setup_check_events() { this.$result.on('change', 'input[type=checkbox]', e => { const $target = $(e.currentTarget); diff --git a/frappe/social/doctype/energy_point_log/energy_point_log.py b/frappe/social/doctype/energy_point_log/energy_point_log.py index 2076815e25..42e12c0374 100644 --- a/frappe/social/doctype/energy_point_log/energy_point_log.py +++ b/frappe/social/doctype/energy_point_log/energy_point_log.py @@ -11,9 +11,16 @@ from frappe.utils import cint, get_fullname, getdate class EnergyPointLog(Document): def validate(self): + self.map_milestone_reference() if self.type in ['Appreciation', 'Criticism'] and self.user == self.owner: frappe.throw(_('You cannot give review points to yourself')) + def map_milestone_reference(self): + # link energy point to the original reference, if set by milestone + if self.reference_doctype == 'Milestone': + self.reference_doctype, self.reference_name = frappe.db.get_value('Milestone', self.reference_name, + ['reference_type', 'reference_name']) + def after_insert(self): alert_dict = get_alert_dict(self) if alert_dict: