From e7601d23575d5474f028122e38e88e7969c90409 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 22 Feb 2017 16:13:53 +0530 Subject: [PATCH 1/5] [enhance] add help messages in desktop --- frappe/core/page/desktop/desktop.js | 75 +++++++++++++++++++ frappe/core/page/desktop/desktop.py | 25 +++++++ .../core/page/desktop/desktop_icon_grid.html | 13 ++++ frappe/public/css/desktop.css | 48 ++++++++++++ frappe/public/less/desktop.less | 61 +++++++++++++++ 5 files changed, 222 insertions(+) create mode 100644 frappe/core/page/desktop/desktop.py diff --git a/frappe/core/page/desktop/desktop.js b/frappe/core/page/desktop/desktop.js index 1477ebb30b..828b52f6b1 100644 --- a/frappe/core/page/desktop/desktop.js +++ b/frappe/core/page/desktop/desktop.js @@ -51,6 +51,7 @@ $.extend(frappe.desktop, { desktop_items: all_icons, })); + frappe.desktop.setup_help_messages(); frappe.desktop.setup_module_click(); // notifications @@ -60,6 +61,80 @@ $.extend(frappe.desktop, { }); $(document).trigger("desktop-render"); + + }, + + setup_help_messages: function() { + // { + // title: 'Sign up for a Premium Plan', + // description: 'Sign up for a premium plan and add users, get more disk space and priority support', + // action: 'Select Plan', + // route: 'usage-info' + // } + + if(!frappe.user.has_role('System Manager')) { + return; + } + + frappe.call({ + method: 'frappe.core.page.desktop.desktop.get_help_messages', + callback: function(r) { + frappe.desktop.render_help_messages(r.message); + } + }); + + }, + + render_help_messages: function(help_messages) { + var wrapper = frappe.desktop.wrapper.find('.help-message-wrapper'); + var $help_messages = wrapper.find('.help-messages'); + + set_current_message = function(idx) { + idx = cint(idx); + wrapper.current_message_idx = idx; + wrapper.find('.left-arrow, .right-arrow').addClass('disabled'); + wrapper.find('.help-message-item').addClass('hidden'); + wrapper.find('[data-message-idx="'+idx+'"]').removeClass('hidden'); + if(idx > 0) { + wrapper.find('.left-arrow').removeClass('disabled'); + } + if(idx < help_messages.length - 1) { + wrapper.find('.right-arrow').removeClass('disabled'); + } + } + + if(help_messages) { + wrapper.removeClass('hidden'); + help_messages.forEach(function(message, i) { + var $message = $('') + .attr('data-message-idx', i) + .html($.format('
{0}
\ +

{1}

\ +
{3}
', + [message.title, message.description, message.route, message.action])) + .appendTo($help_messages); + + }); + + set_current_message(0); + + wrapper.find('.close').on('click', function() { + wrapper.addClass('hidden'); + }); + } + + wrapper.find('.left-arrow').on('click', function() { + if(wrapper.current_message_idx) { + set_current_message(wrapper.current_message_idx - 1); + } + }) + + wrapper.find('.right-arrow').on('click', function() { + if(help_messages.length > wrapper.current_message_idx + 1) { + set_current_message(wrapper.current_message_idx + 1); + } + }); + }, setup_module_click: function() { diff --git a/frappe/core/page/desktop/desktop.py b/frappe/core/page/desktop/desktop.py new file mode 100644 index 0000000000..5e347168c3 --- /dev/null +++ b/frappe/core/page/desktop/desktop.py @@ -0,0 +1,25 @@ +from __future__ import unicode_literals + +import frappe + +@frappe.whitelist() +def get_help_messages(): + '''Return help messages for the desktop (called via `get_help_messages` hook) + + Format for message: + + { + title: _('Add Employees to Manage Them'), + description: _('Add your Employees so you can manage leaves, expenses and payroll'), + action: 'Add Employee', + route: 'List/Employee' + } + + ''' + messages = [] + for fn in frappe.get_hooks('get_help_messages'): + messages += frappe.get_attr(fn)() + + print sorted(messages, lambda a, b: cmp(a.get('count'), b.get('count'))) + + return sorted(messages, lambda a, b: cmp(a.get('count'), b.get('count'))) \ No newline at end of file diff --git a/frappe/core/page/desktop/desktop_icon_grid.html b/frappe/core/page/desktop/desktop_icon_grid.html index 23743a029f..6b85c8a56e 100644 --- a/frappe/core/page/desktop/desktop_icon_grid.html +++ b/frappe/core/page/desktop/desktop_icon_grid.html @@ -4,5 +4,18 @@ {{ frappe.render_template("desktop_module_icon", desktop_items[i]) }} {% } %} +
diff --git a/frappe/public/css/desktop.css b/frappe/public/css/desktop.css index a5e459f2de..b29d93f2b0 100644 --- a/frappe/public/css/desktop.css +++ b/frappe/public/css/desktop.css @@ -186,3 +186,51 @@ body[data-route=""] .navbar-set-desktop-icons, body[data-route="desktop"] .navbar-set-desktop-icons { display: block; } +.help-message-wrapper { + position: fixed; + bottom: 30px; + width: 100%; +} +.help-message-wrapper .help-message-container { + position: relative; + text-align: left; + margin: auto; + width: 500px; + background-color: #fff; + padding: 10px 15px 15px 15px; + border-radius: 3px; + box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.15); +} +.help-message-wrapper h5 { + margin-top: 5px; +} +.help-message-wrapper .help-message-item { + font-size: 12px; +} +.help-message-wrapper .octicon { + color: #8D99A6; + cursor: pointer; + width: 20px; +} +.help-message-wrapper .octicon.disabled { + color: #d1d8dd; +} +.help-message-wrapper .octicon:hover { + color: #36414C; + text-decoration: none; +} +.help-message-wrapper .left-arrow { + position: absolute; + right: 30px; + bottom: 15px; + text-align: left; +} +.help-message-wrapper .right-arrow { + position: absolute; + right: 15px; + bottom: 15px; + text-align: right; +} +.help-message-wrapper .indicator { + color: #36414C; +} diff --git a/frappe/public/less/desktop.less b/frappe/public/less/desktop.less index fa7ae76a82..28c89fc46c 100644 --- a/frappe/public/less/desktop.less +++ b/frappe/public/less/desktop.less @@ -234,3 +234,64 @@ body[data-route=""] .navbar-set-desktop-icons, body[data-route="desktop"] .navbar-set-desktop-icons { display: block; } + +.help-message-wrapper { + position: fixed; + bottom: 30px; + width: 100%; + + .help-message-container { + position: relative; + text-align: left; + margin: auto; + width: 500px; + background-color: #fff; + padding: 10px 15px 15px 15px; + border-radius: 3px; + box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.15); + } + + h5 { + margin-top: 5px; + } + + .help-message-item { + font-size: 12px; + } + + .octicon { + color: @text-muted; + cursor: pointer; + width: 20px; + } + + .octicon.disabled { + color: @text-extra-muted; + } + + .octicon:hover { + color: @text-color; + text-decoration: none; + } + + .left-arrow { + position: absolute; + right: 30px; + bottom: 15px; + text-align: left; + // margin-top: 2px; + } + .right-arrow { + position: absolute; + right: 15px; + bottom: 15px; + text-align: right; + // margin-top: -18px; + } + + .indicator { + color: @text-color; + } + +} + From 77b17be78eedba325c5b5b08ccbb8bd7296c6daa Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 23 Feb 2017 17:02:27 +0530 Subject: [PATCH 2/5] [enhance] add new buttons on form dashboards --- frappe/public/css/form.css | 8 ++- frappe/public/js/frappe/form/control.js | 13 ++++- frappe/public/js/frappe/form/dashboard.js | 23 ++++++++- .../js/frappe/form/templates/form_links.html | 7 ++- frappe/public/js/frappe/ui/page.js | 2 +- .../js/frappe/views/reports/reportview.js | 21 +++++++- frappe/public/js/legacy/clientscriptAPI.js | 50 ++++++++++++++++++- frappe/public/js/legacy/form.js | 13 +++-- frappe/public/less/form.less | 10 +++- 9 files changed, 134 insertions(+), 13 deletions(-) diff --git a/frappe/public/css/form.css b/frappe/public/css/form.css index 27d3a44194..2ff8d99dbd 100644 --- a/frappe/public/css/form.css +++ b/frappe/public/css/form.css @@ -144,9 +144,15 @@ padding-bottom: 15px; } .form-links .document-link { - margin-bottom: 5px; + margin-bottom: 10px; height: 22px; } +.form-links .document-link:hover .badge-link { + text-decoration: underline; +} +.form-links .document-link:hover .badge-link[disabled='disabled'] { + text-decoration: none; +} .form-links .count { display: inline-block; margin-left: 5px; diff --git a/frappe/public/js/frappe/form/control.js b/frappe/public/js/frappe/form/control.js index 720b47f21f..321d7279bb 100644 --- a/frappe/public/js/frappe/form/control.js +++ b/frappe/public/js/frappe/form/control.js @@ -295,7 +295,6 @@ frappe.ui.form.ControlInput = frappe.ui.form.Control.extend({ if(me.only_input) { make_input(); update_input(); - me.$input && me.$input.prop("disabled", true); } else { $(me.input_area).toggle(false); if (me.disp_area) { @@ -303,6 +302,7 @@ frappe.ui.form.ControlInput = frappe.ui.form.Control.extend({ $(me.disp_area).toggle(true); } } + me.$input && me.$input.prop("disabled", true); } me.set_description(); @@ -826,11 +826,20 @@ frappe.ui.form.ControlText = frappe.ui.form.ControlData.extend({ make_wrapper: function() { this._super(); this.$wrapper.find(".like-disabled-input").addClass("for-description"); + }, + make_input: function() { + this._super(); + this.$input.css({'height': '300px'}) } }); frappe.ui.form.ControlLongText = frappe.ui.form.ControlText; -frappe.ui.form.ControlSmallText = frappe.ui.form.ControlText; +frappe.ui.form.ControlSmallText = frappe.ui.form.ControlText.extend({ + make_input: function() { + this._super(); + this.$input.css({'height': '150px'}) + } +}); frappe.ui.form.ControlCheck = frappe.ui.form.ControlData.extend({ input_type: "checkbox", diff --git a/frappe/public/js/frappe/form/dashboard.js b/frappe/public/js/frappe/form/dashboard.js index 1b18eef783..4d1190e37d 100644 --- a/frappe/public/js/frappe/form/dashboard.js +++ b/frappe/public/js/frappe/form/dashboard.js @@ -146,6 +146,16 @@ frappe.ui.form.Dashboard = Class.extend({ } }, + after_refresh: function() { + var me = this; + // show / hide new buttons (if allowed) + this.links_area.find('.btn-new').each(function() { + if(me.frm.can_create($(this).attr('data-doctype'))) { + $(this).removeClass('hidden'); + } + }); + }, + init_data: function() { this.data = this.frm.meta.__dashboard || {}; if(!this.data.transactions) this.data.transactions = []; @@ -177,12 +187,16 @@ frappe.ui.form.Dashboard = Class.extend({ render_links: function() { var me = this; this.links_area.removeClass('hidden'); + this.links_area.find('.btn-new').addClass('hidden'); if(this.data_rendered) { return; } - $(frappe.render_template('form_links', - {transactions: this.data.transactions})) + //this.transactions_area.empty(); + + this.data.frm = this.frm; + + $(frappe.render_template('form_links', this.data)) .appendTo(this.transactions_area) // bind links @@ -195,6 +209,11 @@ frappe.ui.form.Dashboard = Class.extend({ me.open_document_list($(this).parent(), true); }); + // bind new + this.transactions_area.find('.btn-new').on('click', function() { + me.frm.make_new($(this).attr('data-doctype')); + }); + this.data_rendered = true; }, open_document_list: function($link, show_open) { diff --git a/frappe/public/js/frappe/form/templates/form_links.html b/frappe/public/js/frappe/form/templates/form_links.html index c02337b360..afb4a87b2b 100644 --- a/frappe/public/js/frappe/form/templates/form_links.html +++ b/frappe/public/js/frappe/form/templates/form_links.html @@ -10,7 +10,12 @@ data-doctype="{{ doctype }}"> {{ __(doctype) }} - + + {% if !internal_links[doctype] %} + + {% endif %} {% } %} diff --git a/frappe/public/js/frappe/ui/page.js b/frappe/public/js/frappe/ui/page.js index 4259c3a864..f6e87f0014 100644 --- a/frappe/public/js/frappe/ui/page.js +++ b/frappe/public/js/frappe/ui/page.js @@ -254,7 +254,7 @@ frappe.ui.Page = Class.extend({ add_inner_button: function(label, action, group) { if(group) { var $group = this.get_inner_group_button(group); - $('
  • '+label+'
  • ').on('click', action).appendTo($group.find(".dropdown-menu")); + return $('
  • '+label+'
  • ').on('click', action).appendTo($group.find(".dropdown-menu")); } else { return $('