Browse Source

refactor(desk): delete desk and modules pages

version-14
Prateeksha Singh 6 years ago
parent
commit
77b9fb4646
16 changed files with 6 additions and 532 deletions
  1. +0
    -1
      frappe/core/page/desktop/README.md
  2. +0
    -3
      frappe/core/page/desktop/__init__.py
  3. +0
    -26
      frappe/core/page/desktop/all_applications_dialog.html
  4. +0
    -344
      frappe/core/page/desktop/desktop.js
  5. +0
    -20
      frappe/core/page/desktop/desktop.json
  6. +0
    -25
      frappe/core/page/desktop/desktop.py
  7. +0
    -8
      frappe/core/page/desktop/desktop_help_message.html
  8. +0
    -21
      frappe/core/page/desktop/desktop_icon_grid.html
  9. +0
    -23
      frappe/core/page/desktop/desktop_list_view.html
  10. +0
    -11
      frappe/core/page/desktop/desktop_module_icon.html
  11. +0
    -0
      frappe/desk/page/modules/__init__.py
  12. +0
    -18
      frappe/desk/page/modules/modules.json
  13. +0
    -30
      frappe/desk/page/modules/modules_section.html
  14. +2
    -0
      frappe/patches.txt
  15. +1
    -1
      frappe/public/js/frappe/views/components/Modules.vue
  16. +3
    -1
      frappe/public/js/frappe/views/modules_home.js

+ 0
- 1
frappe/core/page/desktop/README.md View File

@@ -1 +0,0 @@
First screen after login. Array of module icons based on permission.

+ 0
- 3
frappe/core/page/desktop/__init__.py View File

@@ -1,3 +0,0 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt


+ 0
- 26
frappe/core/page/desktop/all_applications_dialog.html View File

@@ -1,26 +0,0 @@
<div><input class="form-control desktop-app-search" type="text" placeholder="{%= __("Search Application") %}">
</div>
{% if (frappe.user.has_role("System Manager")) { %}
<p class="text-right"><a href="#applications" class="btn btn-sm btn-default">Install new applications</a>
</p>
{% } %}
<hr>
<p class="text-muted small">{%= __("Checked items will be shown on desktop") %}</p>
<div class="list-group all-applications-list">
{% for(var i=0, l=all_modules.length; i < l; i++) {
var module_name = all_modules[i];
var module = frappe.get_module(module_name);
if (desktop_items.indexOf(module_name)===-1
|| frappe.user.is_module_blocked(module_name)) { continue; }
%}
<div class="list-group-item" data-label="{%= module.label %}" data-name="{%= module.name %}">
<div class="checkbox">
<label>
<input type="checkbox" {% if (user_desktop_items.indexOf(module.name)!==-1) { %} checked {% } %}
data-name="{%= module.name %}"
{{ module.force_show ? "disabled" : ""}}> {%= __(module.label) %}
</label>
</div>
</div>
{% } %}
</div>

+ 0
- 344
frappe/core/page/desktop/desktop.js View File

@@ -1,344 +0,0 @@
frappe.provide('frappe.desktop');

// frappe.pages['desktop'].on_page_load = function(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");
// }
// };

$.extend(frappe.desktop, {
refresh: function(wrapper) {
if (wrapper) {
this.wrapper = $(wrapper);
}

this.render();
this.make_sortable();
},

render: function() {
var me = this;
frappe.utils.set_title(__("Desktop"));

var template = frappe.list_desktop ? "desktop_list_view" : "desktop_icon_grid";

var all_icons = frappe.get_desktop_icons();
var explore_icon = {
module_name: 'Explore',
label: 'Explore',
_label: __('Explore'),
_id: 'Explore',
_doctype: '',
icon: 'octicon octicon-telescope',
color: '#7578f6',
link: 'modules'
};
explore_icon.app_icon = frappe.ui.app_icon.get_html(explore_icon);
all_icons.push(explore_icon);

frappe.desktop.wrapper.html(frappe.render_template(template, {
// all visible icons
desktop_items: all_icons,
}));

frappe.desktop.setup_module_click();

// notifications
frappe.desktop.show_pending_notifications();
$(document).on("notification-update", function() {
me.show_pending_notifications();
});

$(document).trigger("desktop-render");

},

render_help_messages: function(help_messages) {
var wrapper = frappe.desktop.wrapper.find('.help-message-wrapper');
var $help_messages = wrapper.find('.help-messages');

var 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 = $('<div class="help-message-item hidden"></div>')
.attr('data-message-idx', i)
.html(frappe.render_template('desktop_help_message', message))
.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() {
frappe.desktop.wiggling = false;

if(frappe.list_desktop) {
frappe.desktop.wrapper.on("click", ".desktop-list-item", function() {
frappe.desktop.open_module($(this));
});
} else {
frappe.desktop.wrapper.on("click", ".app-icon, .app-icon-svg", function() {
if ( !frappe.desktop.wiggling ) {
frappe.desktop.open_module($(this).parent());
}
});
}
frappe.desktop.wrapper.on("click", ".circle", function() {
var doctype = $(this).attr('data-doctype');
if(doctype) {
frappe.ui.notifications.show_open_count_list(doctype);
}
});

frappe.desktop.setup_wiggle();
},

setup_wiggle: () => {
// Wiggle, Wiggle, Wiggle.
const DURATION_LONG_PRESS = 1000;

var timer_id = 0;
const $cases = frappe.desktop.wrapper.find('.case-wrapper');
const $icons = frappe.desktop.wrapper.find('.app-icon');
const $notis = $(frappe.desktop.wrapper.find('.circle').toArray().filter((object) => {
// This hack is so bad, I should punch myself.
// Seriously, punch yourself.
const text = $(object).find('.circle-text').html();

return text;
}));

const clearWiggle = () => {
const $closes = $cases.find('.module-remove');
$closes.hide();
$notis.show();

$icons.removeClass('wiggle');

frappe.desktop.wiggling = false;
};

frappe.desktop.wrapper.on('mousedown', '.app-icon', () => {
timer_id = setTimeout(() => {
frappe.desktop.wiggling = true;
// hide all notifications.
$notis.hide();

$cases.each((i) => {
const $case = $($cases[i]);
const template =
`
<div class="circle module-remove" style="background-color:#E0E0E0; color:#212121">
<div class="circle-text">
<b>
&times
</b>
</div>
</div>
`;

$case.append(template);
const $close = $case.find('.module-remove');
const name = $case.attr('title');
$close.click(() => {
// good enough to create dynamic dialogs?
const dialog = new frappe.ui.Dialog({
title: __(`Hide ${name}?`)
});
dialog.set_primary_action(__('Hide'), () => {
frappe.call({
method: 'frappe.desk.doctype.desktop_icon.desktop_icon.hide',
args: { name: name },
freeze: true,
callback: (response) =>
{
if ( response.message ) {
location.reload();
}
}
})

dialog.hide();

clearWiggle();
});
// Hacks, Hacks and Hacks.
var $cancel = dialog.get_close_btn();
$cancel.click(() => {
clearWiggle();
});
$cancel.html(__(`Cancel`));

dialog.show();
});
});

$icons.addClass('wiggle');

}, DURATION_LONG_PRESS);
});
frappe.desktop.wrapper.on('mouseup mouseleave', '.app-icon', () => {
clearTimeout(timer_id);
});

// also stop wiggling if clicked elsewhere.
$('body').click((event) => {
if ( frappe.desktop.wiggling ) {
const $target = $(event.target);
// our target shouldn't be .app-icons or .close
const $parent = $target.parents('.case-wrapper');
if ( $parent.length == 0 )
clearWiggle();
}
});
// end wiggle
},

open_module: function(parent) {
var link = parent.attr("data-link");
if(link) {
if(link.indexOf('javascript:')===0) {
eval(link.substr(11));
} else if(link.substr(0, 1)==="/" || link.substr(0, 4)==="http") {
window.open(link, "_blank");
} else {
frappe.set_route(link);
}
return false;
} else {
var module = frappe.get_module(parent.attr("data-name"));
if (module && module.onclick) {
module.onclick();
return false;
}
}
},

make_sortable: function() {
if (frappe.dom.is_touchscreen() || frappe.list_desktop) {
return;
}

new Sortable($("#icon-grid").get(0), {
animation: 150,
onUpdate: function(event) {
var new_order = [];
$("#icon-grid .case-wrapper").each(function(i, e) {
new_order.push($(this).attr("data-name"));
});

frappe.call({
method: 'frappe.desk.doctype.desktop_icon.desktop_icon.set_order',
args: {
'new_order': new_order,
'user': frappe.session.user
},
quiet: true
});
}
});
},

set_background: function() {
frappe.ui.set_user_background(frappe.boot.user.background_image, null,
frappe.boot.user.background_style);
},

show_pending_notifications: function() {
var modules_list = frappe.get_desktop_icons();
for (var i=0, l=modules_list.length; i < l; i++) {
var module = modules_list[i];

var module_doctypes = frappe.boot.notification_info.module_doctypes[module.module_name];

var sum = 0;

if(module_doctypes && frappe.boot.notification_info.open_count_doctype) {
// sum all doctypes for a module
for (var j=0, k=module_doctypes.length; j < k; j++) {
var doctype = module_doctypes[j];
let count = (frappe.boot.notification_info.open_count_doctype[doctype] || 0);
count = typeof count == "string" ? parseInt(count) : count;
sum += count;
}
}

if(frappe.boot.notification_info.open_count_doctype
&& frappe.boot.notification_info.open_count_doctype[module.module_name]!=null) {
// notification count explicitly for doctype
let count = frappe.boot.notification_info.open_count_doctype[module.module_name] || 0;
count = typeof count == "string" ? parseInt(count) : count;
sum += count;
}

if(frappe.boot.notification_info.open_count_module
&& frappe.boot.notification_info.open_count_module[module.module_name]!=null) {
// notification count explicitly for module
let count = frappe.boot.notification_info.open_count_module[module.module_name] || 0;
count = typeof count == "string" ? parseInt(count) : count;
sum += count;
}

// if module found
if(module._id.indexOf('/')===-1 && !module._report) {
var notifier = $(".module-count-" + frappe.scrub(module._id));
if(notifier.length) {
notifier.toggle(sum ? true : false);
var circle = notifier.find(".circle-text");
var text = sum || '';
if(text > 99) {
text = '99+';
}

if(circle.length) {
circle.html(text);
} else {
notifier.html(text);
}
}
}
}
}
});

+ 0
- 20
frappe/core/page/desktop/desktop.json View File

@@ -1,20 +0,0 @@
{
"creation": "2013-02-14 17:37:37.000000",
"docstatus": 0,
"doctype": "Page",
"icon": "fa fa-th",
"idx": 1,
"modified": "2013-07-11 14:41:56.000000",
"modified_by": "Administrator",
"module": "Core",
"name": "desktop",
"owner": "Administrator",
"page_name": "desktop",
"roles": [
{
"role": "All"
}
],
"standard": "Yes",
"title": "Desktop"
}

+ 0
- 25
frappe/core/page/desktop/desktop.py View File

@@ -1,25 +0,0 @@
from __future__ import unicode_literals

import functools
import frappe
from past.builtins import cmp

@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)()

return sorted(messages, key = functools.cmp_to_key(lambda a, b: cmp(a.get('count'), b.get('count'))))

+ 0
- 8
frappe/core/page/desktop/desktop_help_message.html View File

@@ -1,8 +0,0 @@
<div><span class="indicator blue">{{ title }}</span></div>
<p>{{ description }}</p>
<div>
<a class="btn btn-sm btn-default" href="#{{ route }}">{{ action }}</a>
<span class="help-progress" title="{{ __("You have made {0} of {1}", [count, target]) }}">
<span class="help-progress-bar" style="width: {{ Math.floor(count/target*100) }}%"></span>
</span>
</div>

+ 0
- 21
frappe/core/page/desktop/desktop_icon_grid.html View File

@@ -1,21 +0,0 @@
<div style="text-align: center; padding-top: calc(40px + 3%)">
<div id="icon-grid">
{% for (var i=0, l=desktop_items.length; i < l; i++) { %}
{{ frappe.render_template("desktop_module_icon", desktop_items[i]) }}
{% } %}
</div>
<div class="help-message-wrapper hidden">
<div class="help-message-container">
<a class="close pull-right" style="margin-right: -7px;">
<i class="octicon octicon-x"></i></a>
<div class="help-messages">

</div>
<a class="left-arrow octicon octicon-chevron-left">
</a>
<a class="right-arrow octicon octicon-chevron-right">
</a>
</div>
</div>
</div>
<div style="clear: both"></div>

+ 0
- 23
frappe/core/page/desktop/desktop_list_view.html View File

@@ -1,23 +0,0 @@
<div class="container page-body">
<div class="row">
<div class="layout-main-section">
<div class="page-content desktop-list" style="margin-top: 40px;">
{% for (var i=0, l=desktop_items.length; i < l; i++) {
var module = desktop_items[i];
%}
<div class="desktop-list-item" id="module-icon-{%= module._id %}"
data-name="{%= module.name %}" data-link="{%= module.link %}"
title="{%= module._label %}">
<h4>
<i class="{{ module.icon }} text-muted"
style="font-size: 20px; margin-right: 15px;"></i>
{{ module._label }}
</h4>
<span class="open-notification global module-count-{{ module._id }}"
style="display: none;"></span>
</div>
{% } %}
</div>
</div>
</div>
</div>

+ 0
- 11
frappe/core/page/desktop/desktop_module_icon.html View File

@@ -1,11 +0,0 @@
<div class="case-wrapper"
data-name="{{ module_name }}" data-link="{{ link }}" title="{{ _label }}">
{{ app_icon }}
<div class="case-label ellipsis">
<div class="circle module-count-{{ frappe.scrub(_id) }}" data-doctype="{{ _doctype }}" style="display: none;">
<span class="circle-text"></span>
</div>
<!-- <span id="module-count-{{ _id }}" class="octicon octicon-primitive-dot circle" style="display: None"></span> -->
<span class="case-label-text">{{ _label }}</span>
</div>
</div>

+ 0
- 0
frappe/desk/page/modules/__init__.py View File


+ 0
- 18
frappe/desk/page/modules/modules.json View File

@@ -1,18 +0,0 @@
{
"content": null,
"creation": "2016-03-07 04:46:00.420330",
"docstatus": 0,
"doctype": "Page",
"idx": 0,
"modified": "2016-03-07 04:46:00.420330",
"modified_by": "Administrator",
"module": "Desk",
"name": "modules",
"owner": "Administrator",
"page_name": "modules",
"roles": [],
"script": null,
"standard": "Yes",
"style": null,
"title": "Modules"
}

+ 0
- 30
frappe/desk/page/modules/modules_section.html View File

@@ -1,30 +0,0 @@
<div class="module-body">
{% for (var i=0; i < data.length; i++) { var section = data[i]; %}
{% if ((i % 2)===0) { %}<div class="row module-section">{% } %}
<div class="col-sm-6 module-section-column">
<div class="h4 section-head">
{{ section.label }}
</div>
<div class="section-body">
{% for (var j=0; j < section.items.length; j++) {
var item = section.items[j];
if(item.shown) { %}
<div style="min-height: 22px; margin-top: 8px;">
<a class="module-section-link small" data-type="{{ item.type }}"
{% if(item.type==="help") { %}
data-youtube-id="{{ item.youtube_id }}"{% } %}
href="#{{ item.route }}" style="{{ item.style }}">
{{ item.label || __(item.name) }}
</a>
{% if(item.type==="doctype") { %}
<span class="open-notification global hide"
data-doctype="{{ item.doctype || item.name }}"></span>
{% } %}
</div>
{% } %}
{% } %}
</div>
</div>
{% if ((i % 2)===1 || i===data.length-1) { %}</div>{% } %}
{% } %}
</div>

+ 2
- 0
frappe/patches.txt View File

@@ -236,3 +236,5 @@ frappe.patches.v11_0.fix_order_by_in_reports_json
execute:frappe.delete_doc('Page', 'applications', ignore_missing=True)
frappe.patches.v11_0.set_missing_creation_and_modified_value_for_user_permissions
frappe.patches.v12_0.set_primary_key_in_series
execute:frappe.delete_doc("Page", "desktop", ignore_missing=True)
execute:frappe.delete_doc("Page", "modules", ignore_missing=True)

+ 1
- 1
frappe/public/js/frappe/views/components/Modules.vue View File

@@ -15,7 +15,7 @@ export default {
return {
route: frappe.get_route(),
current_module_label: '',
current_module_sections: [],
current_module_sections: [],
modules_data_cache: {},
modules_list: [],
};


+ 3
- 1
frappe/public/js/frappe/views/modules_home.js View File

@@ -14,7 +14,7 @@ frappe.modules.Home = class {
frappe.require('/assets/js/frappe-vue.min.js', () => {
Vue.prototype.__ = window.__; // eslint-disable-line
// eslint-disable-next-line
new Vue({
new Vue({
el: this.$modules_container[0],
render: h => h(Modules)
});
@@ -22,5 +22,7 @@ frappe.modules.Home = class {
}
setup_header() {
this.page.set_title(__('Modules'));

// subtitle
}
};

Loading…
Cancel
Save