From 5ab8a8d4052dc9aa2bad2b2a0c7c5f1d1fd82b2e Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 13 Apr 2016 17:21:07 +0530 Subject: [PATCH] [cleanup] form links dashboard and added blocked in Desktop Icons, standard icons hidden by default --- frappe/config/desk.py | 5 +++ frappe/config/desktop.py | 12 ++++-- .../page/modules_setup/modules_setup.html | 3 ++ .../core/page/modules_setup/modules_setup.js | 4 +- .../core/page/modules_setup/modules_setup.py | 2 +- .../desk/doctype/desktop_icon/desktop_icon.py | 19 ++++---- frappe/desk/notifications.py | 2 +- frappe/desk/page/modules/modules.js | 3 +- frappe/desk/page/modules/modules_sidebar.html | 2 +- frappe/patches.txt | 1 + ...esktop_icons_hidden_by_admin_as_blocked.py | 9 ++++ frappe/public/build.json | 2 +- frappe/public/js/frappe/desk.js | 11 +++-- frappe/public/js/frappe/form/dashboard.js | 43 +++++++++++++++---- .../{form_documents.html => form_links.html} | 0 frappe/public/js/frappe/form/toolbar.js | 3 +- frappe/public/js/frappe/list/doclistview.js | 2 +- frappe/public/js/frappe/model/meta.js | 2 +- frappe/public/js/legacy/form.js | 20 +++++++-- 19 files changed, 107 insertions(+), 38 deletions(-) create mode 100644 frappe/patches/v7_0/desktop_icons_hidden_by_admin_as_blocked.py rename frappe/public/js/frappe/form/templates/{form_documents.html => form_links.html} (100%) diff --git a/frappe/config/desk.py b/frappe/config/desk.py index 58e073c734..229336c971 100644 --- a/frappe/config/desk.py +++ b/frappe/config/desk.py @@ -13,6 +13,11 @@ def get_data(): "label": _("To Do"), "description": _("Documents assigned to you and by you."), }, + { + "type": "doctype", + "name": "File", + "label": _("Files"), + }, { "type": "doctype", "name": "Event", diff --git a/frappe/config/desktop.py b/frappe/config/desktop.py index c53b60ae83..4859802f49 100644 --- a/frappe/config/desktop.py +++ b/frappe/config/desktop.py @@ -18,20 +18,23 @@ def get_data(): "icon": "octicon octicon-file-directory", "label": _("File Manager"), "link": "List/File", - "type": "list" + "type": "list", + "hidden": 1 }, { "module_name": "Website", "color": "#16a085", "icon": "octicon octicon-globe", - "type": "module" + "type": "module", + "hidden": 1 }, { "module_name": "Setup", "color": "#bdc3c7", "reverse": 1, "icon": "octicon octicon-settings", - "type": "module" + "type": "module", + "hidden": 1 }, { "module_name": "Core", @@ -39,6 +42,7 @@ def get_data(): "color": "#589494", "icon": "octicon octicon-circuit-board", "type": "module", - "system_manager": 1 + "system_manager": 1, + "hidden": 1 }, ] diff --git a/frappe/core/page/modules_setup/modules_setup.html b/frappe/core/page/modules_setup/modules_setup.html index e020ab1516..890a2e2eff 100644 --- a/frappe/core/page/modules_setup/modules_setup.html +++ b/frappe/core/page/modules_setup/modules_setup.html @@ -18,6 +18,9 @@ + {% endif %} {% include "frappe/core/page/modules_setup/includes/module_icons.html" %} diff --git a/frappe/core/page/modules_setup/modules_setup.js b/frappe/core/page/modules_setup/modules_setup.js index 056c2ecc8a..2c7951d0af 100644 --- a/frappe/core/page/modules_setup/modules_setup.js +++ b/frappe/core/page/modules_setup/modules_setup.js @@ -9,7 +9,9 @@ frappe.pages['modules_setup'].on_page_load = function(wrapper) { page.content = $(frappe.templates.modules_setup).appendTo(page.body); page.content.find('select[name="setup_for"]').on('change', function() { - page.content.find('select[name="user"]').toggle($(this).val() !== "everyone"); + var val = $(this).val(); + page.content.find('select[name="user"]').toggle(val !== "everyone"); + page.content.find('.block-warning').toggleClass('hidden', val !== 'everyone'); frappe.reload_modules_setup_icons(page); }); diff --git a/frappe/core/page/modules_setup/modules_setup.py b/frappe/core/page/modules_setup/modules_setup.py index d0956cd1e3..fd64281688 100644 --- a/frappe/core/page/modules_setup/modules_setup.py +++ b/frappe/core/page/modules_setup/modules_setup.py @@ -49,7 +49,7 @@ def get_user_icons(user): icons = [] for icon in get_desktop_icons(user): add = True - if icon.hidden_in_standard: + if icon.blocked: add = False if not icon.custom: diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.py b/frappe/desk/doctype/desktop_icon/desktop_icon.py index 41f6c5c1f3..6ff3d46c66 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.py +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.py @@ -8,7 +8,6 @@ import frappe import json import random from frappe.model.document import Document -from frappe import _ class DesktopIcon(Document): def validate(self): @@ -30,7 +29,7 @@ def get_desktop_icons(user=None): if not user_icons: fields = ['module_name', 'hidden', 'label', 'link', 'type', 'icon', 'color', - '_doctype', 'idx', 'force_show', 'reverse', 'custom', 'standard'] + '_doctype', 'idx', 'force_show', 'reverse', 'custom', 'standard', 'blocked'] standard_icons = frappe.db.get_all('Desktop Icon', fields=fields, filters={'standard': 1}) @@ -53,7 +52,7 @@ def get_desktop_icons(user=None): if standard_icon.get(key): icon[key] = standard_icon.get(key) - if standard_icon.hidden: + if standard_icon.blocked: icon.hidden = 1 # flag for modules_setup page @@ -168,14 +167,18 @@ def set_hidden(module_name, user=None, hidden=1): hide/unhide it globally''' if user: icon = get_user_copy(module_name, user) + + if hidden and icon.custom: + frappe.delete_doc(icon.doctype, icon.name, ignore_permissions=True) + return + else: + # hidden by user + icon.db_set('hidden', hidden) else: icon = frappe.get_doc('Desktop Icon', {'standard': 1, 'module_name': module_name}) - if hidden and icon.custom: - frappe.delete_doc(icon.doctype, icon.name, ignore_permissions=True) - return - - icon.db_set('hidden', hidden) + # blocked is globally hidden + icon.db_set('blocked', hidden) def get_all_icons(): return [d.module_name for d in frappe.get_all('Desktop Icon', diff --git a/frappe/desk/notifications.py b/frappe/desk/notifications.py index b4b2ca2fd8..18d9198837 100644 --- a/frappe/desk/notifications.py +++ b/frappe/desk/notifications.py @@ -199,7 +199,7 @@ def get_open_count(doctype, name): filters[fieldname] = name if filters: - open_count = len(frappe.get_list(doctype, fields='name', + open_count = len(frappe.get_all(doctype, fields='name', filters=filters, limit_page_length=6, distinct=True)) out.append({'name': doctype, 'count': open_count}) diff --git a/frappe/desk/page/modules/modules.js b/frappe/desk/page/modules/modules.js index 8ad5a0433c..0adc8efd7d 100644 --- a/frappe/desk/page/modules/modules.js +++ b/frappe/desk/page/modules/modules.js @@ -26,7 +26,8 @@ frappe.pages['modules'].on_page_load = function(wrapper) { } // render sidebar - page.sidebar.html(frappe.render_template('modules_sidebar', {modules: frappe.get_desktop_icons(true)})); + page.sidebar.html(frappe.render_template('modules_sidebar', + {modules: frappe.get_desktop_icons(true)})); page.activate_link = function(link) { page.last_link = link; diff --git a/frappe/desk/page/modules/modules_sidebar.html b/frappe/desk/page/modules/modules_sidebar.html index 1fdc0d500a..0c16818cb8 100644 --- a/frappe/desk/page/modules/modules_sidebar.html +++ b/frappe/desk/page/modules/modules_sidebar.html @@ -1,6 +1,6 @@ diff --git a/frappe/patches.txt b/frappe/patches.txt index b9eeac2589..91a2f3537a 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -123,3 +123,4 @@ frappe.patches.v6_24.sync_desktop_icons frappe.patches.v6_20x.set_allow_draft_for_print frappe.patches.v6_20x.remove_roles_from_website_user frappe.patches.v7_0.set_user_fullname +frappe.patches.v7_0.desktop_icons_hidden_by_admin_as_blocked \ No newline at end of file diff --git a/frappe/patches/v7_0/desktop_icons_hidden_by_admin_as_blocked.py b/frappe/patches/v7_0/desktop_icons_hidden_by_admin_as_blocked.py new file mode 100644 index 0000000000..e3f8f7b325 --- /dev/null +++ b/frappe/patches/v7_0/desktop_icons_hidden_by_admin_as_blocked.py @@ -0,0 +1,9 @@ +import frappe + +def execute(): + # all icons hidden in standard are "blocked" + # this is for the use case where the admin wants to remove icon for everyone + + # in 7.0, icons may be hidden by default, but still can be shown to the user + # e.g. Accounts, Stock etc, so we need a new property for blocked + frappe.db.sql('update `tabDesktop Icon` set blocked = 1 where standard=1 and hidden=1') \ No newline at end of file diff --git a/frappe/public/build.json b/frappe/public/build.json index 5460d7bc1a..079f315f02 100644 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -150,7 +150,7 @@ "public/js/frappe/form/templates/users_in_sidebar.html", "public/js/frappe/form/templates/set_sharing.html", "public/js/frappe/form/templates/form_sidebar.html", - "public/js/frappe/form/templates/form_documents.html", + "public/js/frappe/form/templates/form_links.html", "public/js/frappe/views/formview.js", "public/js/legacy/form.js", "public/js/legacy/clientscriptAPI.js", diff --git a/frappe/public/js/frappe/desk.js b/frappe/public/js/frappe/desk.js index 205441973d..2c1b08b51c 100644 --- a/frappe/public/js/frappe/desk.js +++ b/frappe/public/js/frappe/desk.js @@ -379,7 +379,7 @@ frappe.get_module = function(m, default_module) { return module; }; -frappe.get_desktop_icons = function(show_hidden) { +frappe.get_desktop_icons = function(show_hidden, show_global) { // filter valid icons var out = []; @@ -406,10 +406,13 @@ frappe.get_desktop_icons = function(show_hidden) { out = frappe.boot.user.allow_modules.indexOf(m.module_name) !== -1 } } - if(out && !show_hidden) { - if(m.hidden) out = false; + if(m.hidden&& !show_hidden) { + out = false; } - + if(m.blocked && !show_global) { + out = false; + } + console.log(module, out); return out; } diff --git a/frappe/public/js/frappe/form/dashboard.js b/frappe/public/js/frappe/form/dashboard.js index a79559732a..ad63c76358 100644 --- a/frappe/public/js/frappe/form/dashboard.js +++ b/frappe/public/js/frappe/form/dashboard.js @@ -14,7 +14,9 @@ frappe.ui.form.Dashboard = Class.extend({ this.wrapper.toggle(false); this.body.empty(); this.badge_area = $('').appendTo(this.body); + style="padding-left: 15px; padding-right: 15px;">\ +

' + + __("Documents related to {0}", [this.frm.doc.name]) +'

').appendTo(this.body); this.clear_headline(); }, set_headline: function(html) { @@ -83,20 +85,43 @@ frappe.ui.form.Dashboard = Class.extend({ return progress_chart; }, - show_documents: function() { + show_links: function() { this.reset(); if(this.frm.doc.__islocal) return; - this.links = this.frm.doc.__onload.links; - - this.render_document_list(); + if(!this.links) { + this.links = this.frm.doc.__onload.links; + this.filter_permissions(); + } + this.render_links(); this.set_open_count(); }, - render_document_list: function() { + filter_permissions: function() { + // filter out transactions for which the user + // does not have permission + var transactions = []; + this.links.transactions.forEach(function(group) { + var items = []; + group.items.forEach(function(doctype) { + if(frappe.model.can_read(doctype)) { + items.push(doctype); + } + }); + + // only add thie group, if there is atleast + // one item with permission + if(items.length) { + group.items = items; + transactions.push(group); + } + }); + this.links.transactions = transactions; + }, + render_links: function() { var me = this; - $(frappe.render_template('form_documents', + $(frappe.render_template('form_links', {transactions: this.links.transactions})) .appendTo(this.badge_area) @@ -151,7 +176,7 @@ frappe.ui.form.Dashboard = Class.extend({ callback: function(r) { $.each(r.message, function(i, d) { if(d.count) { - me.frm.dashboard.set_badge_count(d.name, d.count > 5 ? '5+' : d.count) + me.frm.dashboard.set_badge_count(d.name, (d.count > 5) ? '5+' : d.count) } }) } @@ -162,6 +187,6 @@ frappe.ui.form.Dashboard = Class.extend({ $(this.wrapper) .find('.open-notification[data-doctype="'+doctype+'"]') .removeClass('hidden') - .html(cint(count)); + .html(count); } }); diff --git a/frappe/public/js/frappe/form/templates/form_documents.html b/frappe/public/js/frappe/form/templates/form_links.html similarity index 100% rename from frappe/public/js/frappe/form/templates/form_documents.html rename to frappe/public/js/frappe/form/templates/form_links.html diff --git a/frappe/public/js/frappe/form/toolbar.js b/frappe/public/js/frappe/form/toolbar.js index 04706544db..2f5cdcea08 100644 --- a/frappe/public/js/frappe/form/toolbar.js +++ b/frappe/public/js/frappe/form/toolbar.js @@ -222,7 +222,7 @@ frappe.ui.form.Toolbar = Class.extend({ }, get_action_status: function() { var status = null; - if (this.frm.page.current_view_name==='print') { + if (this.frm.page.current_view_name==='print' || this.frm.hidden) { status = "Edit"; } else if (this.can_submit()) { status = "Submit"; @@ -253,6 +253,7 @@ frappe.ui.form.Toolbar = Class.extend({ if(status === "Edit") { this.page.set_primary_action(__("Edit"), function() { me.frm.page.set_view('main'); + me.frm.set_hidden(false); }, 'octicon octicon-pencil'); } else if(status === "Cancel") { this.page.set_secondary_action(__(status), function() { diff --git a/frappe/public/js/frappe/list/doclistview.js b/frappe/public/js/frappe/list/doclistview.js index fa37ddc880..fc72eaa31b 100644 --- a/frappe/public/js/frappe/list/doclistview.js +++ b/frappe/public/js/frappe/list/doclistview.js @@ -302,7 +302,7 @@ frappe.views.DocListView = frappe.ui.Listing.extend({ // found in parent doctype = me.doctype; } else { - frappe.meta.get_table_fields(me.doctype).forEach(function(d) { + frappe.meta.get_table_fields(me.doctype).every(function(d) { if(frappe.meta.has_field(d.options, key)) { doctype = d.options; return false; diff --git a/frappe/public/js/frappe/model/meta.js b/frappe/public/js/frappe/model/meta.js index 43d66c9c7a..fb9cb10881 100644 --- a/frappe/public/js/frappe/model/meta.js +++ b/frappe/public/js/frappe/model/meta.js @@ -110,7 +110,7 @@ $.extend(frappe.meta, { }, get_table_fields: function(dt) { - return $.map(frappe.meta.docfield_map[dt], function(d, fieldname) { + return $.map(frappe.meta.docfield_list[dt], function(d) { return d.fieldtype==='Table' ? d : null}); }, diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index 63cec70357..0955f67929 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -29,7 +29,7 @@ _f.frms = {}; _f.Frm = function(doctype, parent, in_form) { this.docname = ''; this.doctype = doctype; - this.display = 0; + this.hidden = false; this.refresh_if_stale_for = 120; var me = this; @@ -178,6 +178,14 @@ _f.Frm.prototype.print_doc = function() { this.print_preview.set_user_lang(); } +_f.Frm.prototype.set_hidden = function(status) { + // set hidden if hide_first is set + this.hidden = status; + this.page.wrapper.find('.form-page').toggleClass('hidden', this.hidden); + this.toolbar.refresh(); +} + + _f.Frm.prototype.hide_print = function() { if(this.setup_done && this.page.current_view_name==="print") { this.page.set_view(this.page.previous_view_name==="print" ? @@ -427,9 +435,13 @@ _f.Frm.prototype.refresh = function(docname) { this.print_preview.preview(); } - if(this.show_print_first && is_a_different_doc && this.doc.docstatus===1) { - // show print view - this.print_doc(); + if(is_a_different_doc) { + if(this.show_print_first && this.doc.docstatus===1) { + // show print view + this.print_doc(); + } else if(this.hide_first && !this.doc.__unsaved) { + this.set_hidden(true); + } } this.show_if_needs_refresh();