From c01ace60482109ade50eb2ce0bcc674f23f0dbc0 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Thu, 24 Jan 2019 06:25:04 +0530 Subject: [PATCH 01/29] feat(explore_page): Modules and Module Detail views --- frappe/config/desktop.py | 102 +++++----- frappe/config/settings.py | 51 ----- .../doctype/desktop_icon/desktop_icon.json | 109 ++++++++++- .../desk/doctype/desktop_icon/desktop_icon.py | 2 +- frappe/desk/page/modules/modules.js | 185 ------------------ frappe/public/build.json | 6 +- .../public/js/frappe/modules/ModuleDetail.vue | 136 +++++++++++++ frappe/public/js/frappe/modules/Modules.vue | 134 +++++++++++++ .../js/frappe/modules/modules_factory.js | 21 ++ .../public/js/frappe/modules/modules_home.js | 26 +++ 10 files changed, 486 insertions(+), 286 deletions(-) delete mode 100644 frappe/config/settings.py delete mode 100644 frappe/desk/page/modules/modules.js create mode 100644 frappe/public/js/frappe/modules/ModuleDetail.vue create mode 100644 frappe/public/js/frappe/modules/Modules.vue create mode 100644 frappe/public/js/frappe/modules/modules_factory.js create mode 100644 frappe/public/js/frappe/modules/modules_home.js diff --git a/frappe/config/desktop.py b/frappe/config/desktop.py index b620508c06..df57ac8c15 100644 --- a/frappe/config/desktop.py +++ b/frappe/config/desktop.py @@ -3,14 +3,6 @@ from frappe import _ def get_data(): return [ - { - "module_name": "Desk", - "label": _("Tools"), - "color": "#FFF5A7", - "reverse": 1, - "icon": "octicon octicon-calendar", - "type": "module" - }, { "module_name": "File Manager", "color": "#AA784D", @@ -21,28 +13,6 @@ def get_data(): "type": "list", "hidden": 1 }, - { - "module_name": "Website", - "color": "#16a085", - "icon": "octicon octicon-globe", - "type": "module", - "hidden": 1 - }, - { - "module_name": "Integrations", - "color": "#16a085", - "icon": "octicon octicon-globe", - "type": "module", - "hidden": 1 - }, - { - "module_name": "Setup", - "color": "#bdc3c7", - "reverse": 1, - "icon": "octicon octicon-settings", - "type": "module", - "hidden": 1 - }, { "module_name": 'Email Inbox', "type": 'list', @@ -54,6 +24,47 @@ def get_data(): "color": '#589494', "link": 'List/Communication/Inbox' }, + + + # Administration + { + "module_name": 'Contacts', + "type": 'module', + "icon": "octicon octicon-book", + "color": '#ffaedb', + "category": "Administration", + "hidden": 1, + "description": "People Contacts and Address Book." + }, + { + "module_name": "Setup", + "color": "#bdc3c7", + "reverse": 1, + "icon": "octicon octicon-settings", + "type": "module", + "category": "Administration", + "hidden": 1, + "description": "Configure your ERPNext account." + }, + { + "module_name": "Integrations", + "color": "#16a085", + "icon": "octicon octicon-globe", + "type": "module", + "category": "Administration", + "hidden": 1, + "description": "DropBox, Woocomerce, AWS, Shopify and GoCardless." + }, + { + "module_name": "Desk", + "label": _("Tools"), + "color": "#FFF5A7", + "reverse": 1, + "icon": "octicon octicon-calendar", + "type": "module", + "category": "Administration", + "description": "Todos, Notes and other basic tools to help you track your work." + }, { "module_name": "Core", "label": "Developer", @@ -62,14 +73,20 @@ def get_data(): "icon": "octicon octicon-circuit-board", "type": "module", "system_manager": 1, - "hidden": 1 - }, - { - "module_name": 'Contacts', - "type": 'module', - "icon": "octicon octicon-book", - "color": '#FFAEDB', + "category": "Administration", "hidden": 1, + "description": "The Frappe innards of ERPNext. (Only active when developer mode is enabled)" + }, + + # Places + { + "module_name": "Website", + "color": "#16a085", + "icon": "octicon octicon-globe", + "type": "module", + "category": "Places", + "hidden": 1, + "description": "Webpages and the Portal Side of Things." }, { "module_name": 'Social', @@ -79,13 +96,8 @@ def get_data(): "link": 'social/home', "color": '#FF4136', 'standard': 1, - 'idx': 15 + "category": "Places", + 'idx': 15, + "description": "Build your profile and share posts on the feed with other users." }, - { - "module_name": 'Settings', - "color": "#bdc3c7", - "reverse": 1, - "icon": "octicon octicon-settings", - "type": "module" - } ] diff --git a/frappe/config/settings.py b/frappe/config/settings.py deleted file mode 100644 index d1c00c2e71..0000000000 --- a/frappe/config/settings.py +++ /dev/null @@ -1,51 +0,0 @@ -from frappe import _ - -def get_data(): - return [{ - "label": _("Settings"), - "icon": "fa fa-wrench", - "items": [ - { - "type": "doctype", - "name": "System Settings", - "label": _("System Settings"), - "description": _("Language, Date and Time settings"), - "hide_count": True - }, - { - "type": "doctype", - "name": "Domain Settings", - "label": _("Domain Settings"), - "description": _("Enable / Disable Domains"), - "hide_count": True - }, - { - "type": "doctype", - "name": "Print Settings", - "label": _("Print Settings"), - "description": _("Print Style, PDF Size"), - "hide_count": True - }, - { - "type": "doctype", - "name": "Website Settings", - "label": _("Website Settings"), - "description": _("Landing Page, Website Theme, Brand Setup and more"), - "hide_count": True - }, - { - "type": "doctype", - "name": "S3 Backup Settings", - "label": _("S3 Backup Settings"), - "description": _("Enable / Disable Backup, Backup Frequency"), - "hide_count": True - }, - { - "type": "doctype", - "name": "SMS Settings", - "label": _("SMS Settings"), - "description": _("SMS Gateway URL, Message & Receiver Parameter"), - "hide_count": True - } - ] - }] diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.json b/frappe/desk/doctype/desktop_icon/desktop_icon.json index ee9765e944..59c95953ad 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.json +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_events_in_timeline": 0, "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, @@ -14,6 +15,7 @@ "fields": [ { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -40,10 +42,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -70,10 +74,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -100,10 +106,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -130,10 +138,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -159,10 +169,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -189,10 +201,76 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "category", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Category", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -219,10 +297,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -249,10 +329,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -279,10 +361,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -308,10 +392,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -339,10 +425,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -370,10 +458,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -401,10 +491,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -431,10 +523,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -460,10 +554,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -490,10 +586,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -520,10 +618,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -550,10 +650,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -580,6 +682,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -593,7 +696,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-05-08 15:41:31.121652", + "modified": "2019-01-24 04:58:58.720618", "modified_by": "Administrator", "module": "Desk", "name": "Desktop Icon", @@ -602,7 +705,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 1, @@ -629,5 +731,6 @@ "sort_order": "DESC", "title_field": "module_name", "track_changes": 1, - "track_seen": 0 + "track_seen": 0, + "track_views": 0 } \ No newline at end of file diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.py b/frappe/desk/doctype/desktop_icon/desktop_icon.py index 175d1ece7d..fcf10ef61d 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.py +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.py @@ -31,7 +31,7 @@ def get_desktop_icons(user=None): user_icons = frappe.cache().hget('desktop_icons', user) if not user_icons: - fields = ['module_name', 'hidden', 'label', 'link', 'type', 'icon', 'color', + fields = ['module_name', 'hidden', 'label', 'link', 'type', 'icon', 'color', 'description', 'category', '_doctype', '_report', 'idx', 'force_show', 'reverse', 'custom', 'standard', 'blocked'] active_domains = frappe.get_active_domains() diff --git a/frappe/desk/page/modules/modules.js b/frappe/desk/page/modules/modules.js deleted file mode 100644 index 80048fbf59..0000000000 --- a/frappe/desk/page/modules/modules.js +++ /dev/null @@ -1,185 +0,0 @@ -frappe.pages['modules'].on_page_load = function(wrapper) { - var page = frappe.ui.make_app_page({ - parent: wrapper, - title: 'Modules', - single_column: false - }); - - frappe.modules_page = page; - frappe.module_links = {}; - page.section_data = {}; - - page.wrapper.find('.page-head h1').css({'padding-left': '15px'}); - // page.wrapper.find('.page-content').css({'margin-top': '0px'}); - - // menu - page.add_menu_item(__('Set Desktop Icons'), function() { - frappe.frappe_toolbar.modules_select - .show(frappe.session.user); - }); - - if(frappe.user.has_role('System Manager')) { - page.add_menu_item(__('Install Apps'), function() { - frappe.set_route("applications"); - }); - } - - page.get_page_modules = () => { - return frappe.get_desktop_icons(true) - .filter(d => d.type==='module' && !d.blocked) - .sort((a, b) => { return (a._label > b._label) ? 1 : -1; }); - }; - - let get_module_sidebar_item = (item) => `
  • - - - ${item._label} - -
  • `; - - let get_sidebar_html = () => { - let sidebar_items_html = page.get_page_modules() - .map(get_module_sidebar_item.bind(this)).join(""); - - return ``; - }; - - // render sidebar - page.sidebar.html(get_sidebar_html()); - - // help click - page.main.on("click", '.module-section-link[data-type="help"]', function() { - frappe.help.show_video($(this).attr("data-youtube-id")); - return false; - }); - - // notifications click - page.main.on("click", '.open-notification', function() { - var doctype = $(this).attr('data-doctype'); - if(doctype) { - frappe.ui.notifications.show_open_count_list(doctype); - } - }); - - page.activate_link = function(link) { - page.last_link = link; - page.wrapper.find('.module-sidebar-item.active, .module-link.active').removeClass('active'); - $(link).addClass('active').parent().addClass("active"); - show_section($(link).attr('data-name')); - }; - - var show_section = function(module_name) { - if (!module_name) return; - if(module_name in page.section_data) { - render_section(page.section_data[module_name]); - } else { - page.main.empty(); - return frappe.call({ - method: "frappe.desk.moduleview.get", - args: { - module: module_name - }, - callback: function(r) { - var m = frappe.get_module(module_name); - m.data = r.message.data; - process_data(module_name, m.data); - page.section_data[module_name] = m; - render_section(m); - }, - freeze: true, - }); - } - - }; - - var render_section = function(m) { - page.set_title(__(m.label)); - page.main.html(frappe.render_template('modules_section', m)); - - // if(frappe.utils.is_xs() || frappe.utils.is_sm()) { - // // call this after a timeout, becuase a refresh will set the page to the top - // setTimeout(function() { - // $(document).scrollTop($('.module-body').offset().top - 150); - // }, 100); - // } - - //setup_section_toggle(); - frappe.app.update_notification_count_in_modules(); - }; - - var process_data = function(module_name, data) { - frappe.module_links[module_name] = []; - data.forEach(function(section) { - section.items.forEach(function(item) { - item.style = ''; - if(item.type==="doctype") { - item.doctype = item.name; - - // map of doctypes that belong to a module - frappe.module_links[module_name].push(item.name); - } - if(!item.route) { - if(item.link) { - item.route=strip(item.link, "#"); - } - else if(item.type==="doctype") { - if(frappe.model.is_single(item.doctype)) { - item.route = 'Form/' + item.doctype; - } else { - if (item.filters) { - frappe.route_options=item.filters; - } - item.route="List/" + item.doctype; - //item.style = 'font-weight: 500;'; - } - // item.style = 'font-weight: bold;'; - } - else if(item.type==="report" && item.is_query_report) { - item.route="query-report/" + item.name; - } - else if(item.type==="report") { - item.route="List/" + item.doctype + "/Report/" + item.name; - } - else if(item.type==="page") { - item.route=item.name; - } - } - - if(item.route_options) { - item.route += "?" + $.map(item.route_options, function(value, key) { - return encodeURIComponent(key) + "=" + encodeURIComponent(value); }).join('&'); - } - - if(item.type==="page" || item.type==="help" || item.type==="report" || - (item.doctype && frappe.model.can_read(item.doctype))) { - item.shown = true; - } - }); - }); - }; -}; - -frappe.pages['modules'].on_page_show = function(wrapper) { - let route = frappe.get_route(); - let modules = frappe.modules_page.get_page_modules().map(d => d.module_name); - $("body").attr("data-sidebar", 1); - if(route.length > 1) { - // activate section based on route - let module_name = route[1]; - if(modules.includes(module_name)) { - frappe.modules_page.activate_link( - frappe.modules_page.sidebar.find('.module-link[data-name="'+ module_name +'"]')); - } else { - frappe.throw(__(`Module ${module_name} not found.`)); - } - } else if(frappe.modules_page.last_link) { - // open last link - frappe.set_route('modules', frappe.modules_page.last_link.attr('data-name')); - } else { - // first time, open the first page - frappe.modules_page.activate_link(frappe.modules_page.sidebar.find('.module-link:first')); - } -}; diff --git a/frappe/public/build.json b/frappe/public/build.json index 6e8c8a97fc..5c1627f036 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -248,7 +248,8 @@ "public/js/frappe/chat.js", - "public/js/frappe/social/social_factory.js" + "public/js/frappe/social/social_factory.js", + "public/js/frappe/modules/modules_factory.js" ], "css/module.min.css": [ "public/less/module.less" @@ -381,5 +382,8 @@ ], "js/social.min.js": [ "public/js/frappe/social/social_home.js" + ], + "js/modules.min.js": [ + "public/js/frappe/modules/modules_home.js" ] } diff --git a/frappe/public/js/frappe/modules/ModuleDetail.vue b/frappe/public/js/frappe/modules/ModuleDetail.vue new file mode 100644 index 0000000000..487cf5a525 --- /dev/null +++ b/frappe/public/js/frappe/modules/ModuleDetail.vue @@ -0,0 +1,136 @@ + + + + diff --git a/frappe/public/js/frappe/modules/Modules.vue b/frappe/public/js/frappe/modules/Modules.vue new file mode 100644 index 0000000000..0f86c2bc85 --- /dev/null +++ b/frappe/public/js/frappe/modules/Modules.vue @@ -0,0 +1,134 @@ + + + + + + diff --git a/frappe/public/js/frappe/modules/modules_factory.js b/frappe/public/js/frappe/modules/modules_factory.js new file mode 100644 index 0000000000..eb49babc61 --- /dev/null +++ b/frappe/public/js/frappe/modules/modules_factory.js @@ -0,0 +1,21 @@ +frappe.views.ModulesFactory = class ModulesFactory extends frappe.views.Factory { + show() { + if (frappe.pages.modules) { + frappe.container.change_to('modules'); + } else { + this.make('modules'); + } + } + + make(page_name) { + const assets = [ + '/assets/js/modules.min.js' + ]; + + frappe.require(assets, () => { + frappe.modules.home = new frappe.modules.Home({ + parent: this.make_page(true, page_name) + }); + }); + } +}; diff --git a/frappe/public/js/frappe/modules/modules_home.js b/frappe/public/js/frappe/modules/modules_home.js new file mode 100644 index 0000000000..5b5e419cb5 --- /dev/null +++ b/frappe/public/js/frappe/modules/modules_home.js @@ -0,0 +1,26 @@ +import Modules from './Modules.vue'; + +frappe.provide('frappe.social'); + +frappe.modules.Home = class { + constructor({ parent }) { + this.$parent = $(parent); + this.page = parent.page; + this.setup_header(); + this.make_body(); + } + make_body() { + this.$modules_container = this.$parent.find('.layout-main'); + frappe.require('/assets/js/frappe-vue.min.js', () => { + Vue.prototype.__ = window.__; + Vue.prototype.frappe = window.frappe; + new Vue({ + el: this.$modules_container[0], + render: h => h(Modules) + }); + }); + } + setup_header() { + this.page.set_title(__('Modules')); + } +}; From 466764e1b47fbd2b9880b26d42da354ca94a6759 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Sun, 27 Jan 2019 17:25:41 +0530 Subject: [PATCH 02/29] fix(style): modules page --- frappe/public/js/frappe/modules/Modules.vue | 18 +++++++++++------- .../public/js/frappe/modules/modules_home.js | 5 ++--- frappe/public/js/frappe/toolbar.js | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/frappe/public/js/frappe/modules/Modules.vue b/frappe/public/js/frappe/modules/Modules.vue index 0f86c2bc85..f085053617 100644 --- a/frappe/public/js/frappe/modules/Modules.vue +++ b/frappe/public/js/frappe/modules/Modules.vue @@ -11,15 +11,18 @@
    -

    {{ module.label }}

    -

    {{ module.description }}

    +

    + {{ module.label }} + +

    +

    {{ module.description }}

    @@ -84,8 +87,9 @@ export default { padding-bottom: 30px; } -.module-category { - margin-top: 20px; +.module-category { + margin-top: 30px; + margin-bottom: 15px; border-bottom: 1px solid #d0d8dd; } @@ -120,8 +124,8 @@ export default { } .icon-box { - padding: 0px 30px; - width: 62px; + padding: 15px; + width: 54px; display: flex; justify-content: center; } diff --git a/frappe/public/js/frappe/modules/modules_home.js b/frappe/public/js/frappe/modules/modules_home.js index 5b5e419cb5..b15c9cb397 100644 --- a/frappe/public/js/frappe/modules/modules_home.js +++ b/frappe/public/js/frappe/modules/modules_home.js @@ -1,6 +1,6 @@ import Modules from './Modules.vue'; -frappe.provide('frappe.social'); +frappe.provide('frappe.modules'); frappe.modules.Home = class { constructor({ parent }) { @@ -12,8 +12,7 @@ frappe.modules.Home = class { make_body() { this.$modules_container = this.$parent.find('.layout-main'); frappe.require('/assets/js/frappe-vue.min.js', () => { - Vue.prototype.__ = window.__; - Vue.prototype.frappe = window.frappe; + Vue.prototype.__ = window.__; new Vue({ el: this.$modules_container[0], render: h => h(Modules) diff --git a/frappe/public/js/frappe/toolbar.js b/frappe/public/js/frappe/toolbar.js index e698563e9c..ce208d566a 100755 --- a/frappe/public/js/frappe/toolbar.js +++ b/frappe/public/js/frappe/toolbar.js @@ -21,7 +21,7 @@ $(document).on("toolbar_setup", function() { if(limits.space || limits.users || limits.expiry || limits.emails) { help_links = []; - help_links.push('
  • ' + frappe._('Usage Info') + '
  • '); + help_links.push(''); help_links.push('
  • '); $(help_links.join("\n")).insertBefore($("#toolbar-user").find("li:first")); } From 8fd13bc63c3ba490768de4794a6ff01368c020d2 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Mon, 28 Jan 2019 01:29:49 +0530 Subject: [PATCH 03/29] feat(desk): Load desk as a module list --- frappe/core/page/desktop/desktop.js | 24 ++++++++--------- frappe/public/build.json | 6 +---- .../js/frappe/modules/modules_factory.js | 21 --------------- .../public/js/frappe/modules/modules_home.js | 25 ----------------- .../components}/ModuleDetail.vue | 0 .../{modules => views/components}/Modules.vue | 2 +- frappe/public/js/frappe/views/pageview.js | 27 +++++++++++++------ 7 files changed, 33 insertions(+), 72 deletions(-) delete mode 100644 frappe/public/js/frappe/modules/modules_factory.js delete mode 100644 frappe/public/js/frappe/modules/modules_home.js rename frappe/public/js/frappe/{modules => views/components}/ModuleDetail.vue (100%) rename frappe/public/js/frappe/{modules => views/components}/Modules.vue (98%) diff --git a/frappe/core/page/desktop/desktop.js b/frappe/core/page/desktop/desktop.js index 24dd0c3b4e..ac14a2f652 100644 --- a/frappe/core/page/desktop/desktop.js +++ b/frappe/core/page/desktop/desktop.js @@ -1,19 +1,19 @@ frappe.provide('frappe.desktop'); -frappe.pages['desktop'].on_page_load = function(wrapper) { +// frappe.pages['desktop'].on_page_load = function(wrapper) { - // load desktop - if(!frappe.list_desktop) { - frappe.desktop.set_background(); - } - frappe.desktop.refresh(wrapper); -}; +// // load desktop +// if(!frappe.list_desktop) { +// frappe.desktop.set_background(); +// } +// frappe.desktop.refresh(wrapper); +// }; -frappe.pages['desktop'].on_page_show = function(wrapper) { - if(frappe.list_desktop) { - $("body").attr("data-route", "list-desktop"); - } -}; +// frappe.pages['desktop'].on_page_show = function(wrapper) { +// if(frappe.list_desktop) { +// $("body").attr("data-route", "list-desktop"); +// } +// }; $.extend(frappe.desktop, { refresh: function(wrapper) { diff --git a/frappe/public/build.json b/frappe/public/build.json index 5c1627f036..6e8c8a97fc 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -248,8 +248,7 @@ "public/js/frappe/chat.js", - "public/js/frappe/social/social_factory.js", - "public/js/frappe/modules/modules_factory.js" + "public/js/frappe/social/social_factory.js" ], "css/module.min.css": [ "public/less/module.less" @@ -382,8 +381,5 @@ ], "js/social.min.js": [ "public/js/frappe/social/social_home.js" - ], - "js/modules.min.js": [ - "public/js/frappe/modules/modules_home.js" ] } diff --git a/frappe/public/js/frappe/modules/modules_factory.js b/frappe/public/js/frappe/modules/modules_factory.js deleted file mode 100644 index eb49babc61..0000000000 --- a/frappe/public/js/frappe/modules/modules_factory.js +++ /dev/null @@ -1,21 +0,0 @@ -frappe.views.ModulesFactory = class ModulesFactory extends frappe.views.Factory { - show() { - if (frappe.pages.modules) { - frappe.container.change_to('modules'); - } else { - this.make('modules'); - } - } - - make(page_name) { - const assets = [ - '/assets/js/modules.min.js' - ]; - - frappe.require(assets, () => { - frappe.modules.home = new frappe.modules.Home({ - parent: this.make_page(true, page_name) - }); - }); - } -}; diff --git a/frappe/public/js/frappe/modules/modules_home.js b/frappe/public/js/frappe/modules/modules_home.js deleted file mode 100644 index b15c9cb397..0000000000 --- a/frappe/public/js/frappe/modules/modules_home.js +++ /dev/null @@ -1,25 +0,0 @@ -import Modules from './Modules.vue'; - -frappe.provide('frappe.modules'); - -frappe.modules.Home = class { - constructor({ parent }) { - this.$parent = $(parent); - this.page = parent.page; - this.setup_header(); - this.make_body(); - } - make_body() { - this.$modules_container = this.$parent.find('.layout-main'); - frappe.require('/assets/js/frappe-vue.min.js', () => { - Vue.prototype.__ = window.__; - new Vue({ - el: this.$modules_container[0], - render: h => h(Modules) - }); - }); - } - setup_header() { - this.page.set_title(__('Modules')); - } -}; diff --git a/frappe/public/js/frappe/modules/ModuleDetail.vue b/frappe/public/js/frappe/views/components/ModuleDetail.vue similarity index 100% rename from frappe/public/js/frappe/modules/ModuleDetail.vue rename to frappe/public/js/frappe/views/components/ModuleDetail.vue diff --git a/frappe/public/js/frappe/modules/Modules.vue b/frappe/public/js/frappe/views/components/Modules.vue similarity index 98% rename from frappe/public/js/frappe/modules/Modules.vue rename to frappe/public/js/frappe/views/components/Modules.vue index f085053617..8a11403bec 100644 --- a/frappe/public/js/frappe/modules/Modules.vue +++ b/frappe/public/js/frappe/views/components/Modules.vue @@ -1,6 +1,6 @@ + + + From 0ee2700614b6f1b4aab32634cc4082059af53a02 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Thu, 31 Jan 2019 17:07:14 +0530 Subject: [PATCH 22/29] feat(module_links): indicators reflect status --- frappe/desk/moduleview.py | 5 +- frappe/public/js/frappe/desk.js | 15 ---- .../frappe/views/components/ModuleDetail.vue | 8 +- .../views/components/ModuleLinkItem.vue | 80 +++++++++++-------- frappe/public/js/frappe/views/modules_home.js | 1 + frappe/public/js/frappe/views/pageview.js | 1 + 6 files changed, 54 insertions(+), 56 deletions(-) diff --git a/frappe/desk/moduleview.py b/frappe/desk/moduleview.py index d91f49d004..bfa5e4e42e 100644 --- a/frappe/desk/moduleview.py +++ b/frappe/desk/moduleview.py @@ -47,7 +47,10 @@ def get_data(module): def exists(name): exists = exists_cache.get(name) if not exists: - exists = frappe.db.exists(name) + if not frappe.db.get_value('DocType', name, 'issingle'): + exists = frappe.db.count(name) + else: + exists = True exists_cache[name] = exists return exists diff --git a/frappe/public/js/frappe/desk.js b/frappe/public/js/frappe/desk.js index c2a0100378..a04e4eed4b 100644 --- a/frappe/public/js/frappe/desk.js +++ b/frappe/public/js/frappe/desk.js @@ -264,9 +264,6 @@ frappe.Application = Class.extend({ $.extend(frappe.boot.notification_info, r.message); $(document).trigger("notification-update"); - // update in module views - me.update_notification_count_in_modules(); - if(frappe.get_route()[0] != "messages") { if(r.message.new_messages.length) { frappe.utils.set_title_prefix("(" + r.message.new_messages.length + ")"); @@ -279,18 +276,6 @@ frappe.Application = Class.extend({ } }, - update_notification_count_in_modules: function() { - $.each(frappe.boot.notification_info.open_count_doctype, function(doctype, count) { - if(count) { - $('.open-notification.global[data-doctype="'+ doctype +'"]') - .removeClass("hide").html(count > 99 ? "99+" : count); - } else { - $('.open-notification.global[data-doctype="'+ doctype +'"]') - .addClass("hide"); - } - }); - }, - set_globals: function() { frappe.session.user = frappe.boot.user.name; frappe.session.user_email = frappe.boot.user.email; diff --git a/frappe/public/js/frappe/views/components/ModuleDetail.vue b/frappe/public/js/frappe/views/components/ModuleDetail.vue index 5c49ded9f4..8fed25d0ac 100644 --- a/frappe/public/js/frappe/views/components/ModuleDetail.vue +++ b/frappe/public/js/frappe/views/components/ModuleDetail.vue @@ -6,10 +6,11 @@ class="border section-box" >

    {{ section.label }}

    - @@ -28,10 +29,7 @@ export default { components: { ModuleLinkItem }, - props: ['module_name', 'sections'], - updated() { - frappe.app.update_notification_count_in_modules(); - }, + props: ['module_name', 'sections'] } From b5a9105e47b703c4daa5fb805cef5e22f4ed13ce Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Thu, 7 Feb 2019 09:17:21 +0530 Subject: [PATCH 25/29] feat(module_links): add condition for modules, show label in title --- frappe/config/__init__.py | 3 +++ frappe/config/desktop.py | 2 ++ frappe/public/js/frappe/views/components/ModuleDetail.vue | 2 +- frappe/public/js/frappe/views/components/Modules.vue | 5 +++-- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/frappe/config/__init__.py b/frappe/config/__init__.py index 98561322f1..4e95927e9d 100644 --- a/frappe/config/__init__.py +++ b/frappe/config/__init__.py @@ -47,6 +47,9 @@ def get_modules_from_app(app): if module_name not in active_domains: to_add = False + if "condition" in m and not m["condition"]: + to_add = False + if to_add: active_modules_list.append(m) diff --git a/frappe/config/desktop.py b/frappe/config/desktop.py index 3ea060ae17..d92f8469af 100644 --- a/frappe/config/desktop.py +++ b/frappe/config/desktop.py @@ -1,4 +1,5 @@ from __future__ import unicode_literals +import frappe from frappe import _ def get_data(): @@ -54,6 +55,7 @@ def get_data(): "icon": "octicon octicon-circuit-board", "type": "module", "system_manager": 1, + "condition": getattr(frappe.local.conf, 'developer_mode', 0), "hidden": 1, "description": "The Frappe innards of ERPNext. (Only active when developer mode is enabled)" }, diff --git a/frappe/public/js/frappe/views/components/ModuleDetail.vue b/frappe/public/js/frappe/views/components/ModuleDetail.vue index 446db3a03d..d2faa5df6d 100644 --- a/frappe/public/js/frappe/views/components/ModuleDetail.vue +++ b/frappe/public/js/frappe/views/components/ModuleDetail.vue @@ -10,7 +10,7 @@ :key="section.label + item.label" :data-youtube-id="item.type==='help' ? item.youtube_id : false" v-bind="item" - :open_count="frappe.boot.notification_info.open_count_doctype[item.doctype]" + :open_count="item.type==='doctype' ? frappe.boot.notification_info.open_count_doctype[item.doctype] : false" > diff --git a/frappe/public/js/frappe/views/components/Modules.vue b/frappe/public/js/frappe/views/components/Modules.vue index 29132e5fad..c561326055 100644 --- a/frappe/public/js/frappe/views/components/Modules.vue +++ b/frappe/public/js/frappe/views/components/Modules.vue @@ -35,7 +35,8 @@ export default { let route = frappe.get_route(); if(route[0] === 'modules' || !route[0]) { this.route = route; - let module_name = route[1]; + let module = this.modules_list.filter(m => m.module_name == route[1])[0]; + let module_name = module && (module.label || module.module_name); let title = this.current_module_label ? this.current_module_label : module_name; frappe.modules.home && frappe.modules.home.page.set_title(title); @@ -47,7 +48,7 @@ export default { } if(module_name) { - this.get_module_sections(module_name); + this.get_module_sections(module.module_name); } } }, From 83c0e3154649c31e7ea2ba4725e90046d456b931 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Thu, 7 Feb 2019 09:52:08 +0530 Subject: [PATCH 26/29] feat(module_links): show onboard untouches points --- frappe/config/__init__.py | 26 ++++++++ frappe/desk/moduleview.py | 61 ++++++++++--------- .../js/frappe/views/components/Desktop.vue | 2 +- 3 files changed, 58 insertions(+), 31 deletions(-) diff --git a/frappe/config/__init__.py b/frappe/config/__init__.py index 4e95927e9d..4a6805bdf8 100644 --- a/frappe/config/__init__.py +++ b/frappe/config/__init__.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from frappe import _ import frappe +from frappe.desk.moduleview import get_data from six import iteritems def get_modules_from_all_apps_for_user(user=None): @@ -51,9 +52,34 @@ def get_modules_from_app(app): to_add = False if to_add: + onboard_present = is_onboard_present(m) if show_onboard(m) else False + m["onboard_present"] = onboard_present active_modules_list.append(m) return active_modules_list +def show_onboard(module): + return module.get("type") == "module" and module.get("category") in ["Modules", "Domains"] + +def is_onboard_present(module): + print(module["module_name"]) + exists_cache = {} + def exists(name, link_type): + exists = exists_cache.get(name) + if not exists: + if link_type == "doctype" and not frappe.db.get_value('DocType', name, 'issingle'): + exists = frappe.db.count(name) + else: + exists = True + exists_cache[name] = exists + return exists + + sections = get_data(module["module_name"], False) + for section in sections: + for item in section["items"]: + if exists(item.get("name"), item.get("type")): + return True + return False + def is_domain(module): return module.get("category") == "Domains" diff --git a/frappe/desk/moduleview.py b/frappe/desk/moduleview.py index 7685ccda12..b90d6584a5 100644 --- a/frappe/desk/moduleview.py +++ b/frappe/desk/moduleview.py @@ -24,7 +24,7 @@ def hide_module(module): set_hidden(module, frappe.session.user, 1) clear_desktop_icons_cache() -def get_data(module): +def get_data(module, build=True): """Get module data for the module view `desk/#Module/[name]`""" doctype_info = get_doctype_info(module) data = build_config_from_file(module) @@ -42,41 +42,42 @@ def get_data(module): #set_last_modified(data) - exists_cache = {} - def exists(name): - exists = exists_cache.get(name) - if not exists: - if not frappe.db.get_value('DocType', name, 'issingle'): - exists = frappe.db.count(name) - else: - exists = True - exists_cache[name] = exists - return exists + if build: + exists_cache = {} + def exists(name): + exists = exists_cache.get(name) + if not exists: + if not frappe.db.get_value('DocType', name, 'issingle'): + exists = frappe.db.count(name) + else: + exists = True + exists_cache[name] = exists + return exists - for section in data: - for item in section["items"]: - # Onboarding + for section in data: + for item in section["items"]: + # Onboarding - # First disable based on exists of depends_on list - doctype = item.get("doctype") - dependencies = item.get("dependencies") or None - if not dependencies and doctype: - item["dependencies"] = [doctype] + # First disable based on exists of depends_on list + doctype = item.get("doctype") + dependencies = item.get("dependencies") or None + if not dependencies and doctype: + item["dependencies"] = [doctype] - dependencies = item.get("dependencies") - if dependencies: - incomplete_dependencies = [d for d in dependencies if not exists(d)] - if len(incomplete_dependencies): - item["incomplete_dependencies"] = incomplete_dependencies + dependencies = item.get("dependencies") + if dependencies: + incomplete_dependencies = [d for d in dependencies if not exists(d)] + if len(incomplete_dependencies): + item["incomplete_dependencies"] = incomplete_dependencies - if item.get("onboard"): - # Mark Spotlights for initial - if item.get("type") == "doctype": - name = item.get("name") - count = exists(name) + if item.get("onboard"): + # Mark Spotlights for initial + if item.get("type") == "doctype": + name = item.get("name") + count = exists(name) - item["count"] = count + item["count"] = count return data diff --git a/frappe/public/js/frappe/views/components/Desktop.vue b/frappe/public/js/frappe/views/components/Desktop.vue index b02af191a0..8c705b8b52 100644 --- a/frappe/public/js/frappe/views/components/Desktop.vue +++ b/frappe/public/js/frappe/views/components/Desktop.vue @@ -16,7 +16,7 @@

    - + {{ module.label }}

    {{ module.description }}

    From c8bc68eb31ac67e0363d8f4a94a4169b406b8baf Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Thu, 7 Feb 2019 10:33:26 +0530 Subject: [PATCH 27/29] fix(code_style): minor --- frappe/core/page/desktop/desktop.js | 8 +------- frappe/public/js/frappe/views/breadcrumbs.js | 4 +++- frappe/public/js/frappe/views/reports/report_view.js | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/frappe/core/page/desktop/desktop.js b/frappe/core/page/desktop/desktop.js index 293c3b40d4..13b64c9246 100644 --- a/frappe/core/page/desktop/desktop.js +++ b/frappe/core/page/desktop/desktop.js @@ -1,7 +1 @@ -frappe.pages['desktop'].on_page_load = function(wrapper) { - var page = frappe.ui.make_app_page({ - parent: wrapper, - title: 'Desktop', - single_column: true - }); -} \ No newline at end of file +frappe.pages['desktop'].on_page_load = function() {}; \ No newline at end of file diff --git a/frappe/public/js/frappe/views/breadcrumbs.js b/frappe/public/js/frappe/views/breadcrumbs.js index bfb3352aee..e4987c274f 100644 --- a/frappe/public/js/frappe/views/breadcrumbs.js +++ b/frappe/public/js/frappe/views/breadcrumbs.js @@ -40,7 +40,9 @@ frappe.breadcrumbs = { var breadcrumbs = frappe.breadcrumbs.all[frappe.breadcrumbs.current_page()]; if(!frappe.visible_modules) { - frappe.visible_modules = $.map(frappe.boot.allowed_modules, (m) => { return m.module_name; }); + frappe.visible_modules = $.map(frappe.boot.allowed_modules, (m) => { + return m.module_name; + }); } var $breadcrumbs = $("#navbar-breadcrumbs").empty(); diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index d4c136379b..33b969eac5 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -1186,7 +1186,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { frappe.set_route('List', 'User Permission', args); } }); - }; + } return items.map(i => Object.assign(i, { standard: true })); } From a6499c46c6e3cc0dcff878e52bc6187dc1919a02 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Thu, 7 Feb 2019 11:08:49 +0530 Subject: [PATCH 28/29] fix(test): remove test for explore page --- cypress/integration/awesome_bar.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/cypress/integration/awesome_bar.js b/cypress/integration/awesome_bar.js index 44dbde8fcf..4b2ae0da93 100644 --- a/cypress/integration/awesome_bar.js +++ b/cypress/integration/awesome_bar.js @@ -8,13 +8,6 @@ context('Awesome Bar', () => { cy.get('.navbar-home').click(); }); - it('navigates to modules', () => { - cy.get('#navbar-search') - .type('modules{downarrow}{enter}', { delay: 100 }); - - cy.location('hash').should('eq', '#modules'); - }); - it('navigates to doctype list', () => { cy.get('#navbar-search') .type('todo{downarrow}{enter}', { delay: 100 }); From 043e290721fe8e4986673072804650d820d73416 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Thu, 7 Feb 2019 11:28:05 +0530 Subject: [PATCH 29/29] fix(domains): remove desktop icons from domainification --- frappe/config/__init__.py | 6 +++--- frappe/core/doctype/domain/domain.py | 9 +-------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/frappe/config/__init__.py b/frappe/config/__init__.py index 4a6805bdf8..d26f788bba 100644 --- a/frappe/config/__init__.py +++ b/frappe/config/__init__.py @@ -34,9 +34,9 @@ def get_modules_from_app(app): if isinstance(modules, dict): active_modules_list = [] - for m, desktop_icon in iteritems(modules): - desktop_icon['module_name'] = m - active_modules_list.append(desktop_icon) + for m, module in iteritems(modules): + module['module_name'] = m + active_modules_list.append(module) else: active_modules_list = [] for m in modules: diff --git a/frappe/core/doctype/domain/domain.py b/frappe/core/doctype/domain/domain.py index ea21e73b95..a4e9f503ab 100644 --- a/frappe/core/doctype/domain/domain.py +++ b/frappe/core/doctype/domain/domain.py @@ -18,8 +18,7 @@ class Domain(Document): self.setup_roles() self.setup_properties() self.set_values() - # always set the desktop icons while changing the domain settings - self.setup_desktop_icons() + if not int(frappe.defaults.get_defaults().setup_complete or 0): # if setup not complete, setup desktop etc. self.setup_sidebar_items() @@ -89,12 +88,6 @@ class Domain(Document): frappe.db.set_value('Portal Settings', None, 'default_role', self.data.get('default_portal_role')) - def setup_desktop_icons(self): - '''set desktop icons form `data.desktop_icons`''' - from frappe.desk.doctype.desktop_icon.desktop_icon import set_desktop_icons - if self.data.desktop_icons: - set_desktop_icons(self.data.desktop_icons) - def setup_properties(self): if self.data.properties: for args in self.data.properties: