diff --git a/frappe/__init__.py b/frappe/__init__.py index 33eed146be..91f2a06eaa 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -13,7 +13,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template -__version__ = '8.0.4' +__version__ = '8.0.5' __title__ = "Frappe Framework" local = Local() diff --git a/frappe/config/desktop.py b/frappe/config/desktop.py index 8acdd446ab..72f3b8bafa 100644 --- a/frappe/config/desktop.py +++ b/frappe/config/desktop.py @@ -3,17 +3,6 @@ from frappe import _ def get_data(): return [ - { - "module_name": 'Core', - "type": 'list', - "label": _('Email Inbox'), - "_label": _('Email Inbox'), - "_id": 'Email Inbox', - "_doctype": 'Communication', - "icon": 'fa fa-envelope-o', - "color": '#589494', - "link": 'List/Communication/Inbox' - }, { "module_name": "Desk", "label": _("Tools"), @@ -54,9 +43,21 @@ def get_data(): "type": "module", "hidden": 1 }, + { + "module_name": 'Email Inbox', + "type": 'list', + "label": 'Email Inbox', + "_label": _('Email Inbox'), + "_id": 'Email Inbox', + "_doctype": 'Communication', + "icon": 'fa fa-envelope-o', + "color": '#589494', + "link": 'List/Communication/Inbox' + }, { "module_name": "Core", - "label": _("Developer"), + "label": "Developer", + "_label": _("Developer"), "color": "#589494", "icon": "octicon octicon-circuit-board", "type": "module", diff --git a/frappe/core/doctype/communication/communication_list.js b/frappe/core/doctype/communication/communication_list.js index e7caf6938f..69cad3ceba 100644 --- a/frappe/core/doctype/communication/communication_list.js +++ b/frappe/core/doctype/communication/communication_list.js @@ -2,7 +2,8 @@ frappe.listview_settings['Communication'] = { add_fields: [ "sent_or_received","recipients", "subject", "communication_medium", "communication_type", - "sender", "seen", "reference_doctype", "reference_name" + "sender", "seen", "reference_doctype", "reference_name", + "has_attachment" ], filters: [["status", "=", "Open"]], diff --git a/frappe/core/doctype/feedback_trigger/feedback_trigger.py b/frappe/core/doctype/feedback_trigger/feedback_trigger.py index de39611517..54409166f0 100644 --- a/frappe/core/doctype/feedback_trigger/feedback_trigger.py +++ b/frappe/core/doctype/feedback_trigger/feedback_trigger.py @@ -70,7 +70,10 @@ def send_feedback_request(reference_doctype, reference_name, trigger="Manual", d def get_feedback_request_details(reference_doctype, reference_name, trigger="Manual", request=None): feedback_url = "" - if not trigger and not request and not frappe.db.get_value("Feedback Trigger", { "document_type": reference_doctype }): + if not frappe.db.get_value(reference_doctype, reference_name): + # reference document is either deleted or renamed + return + elif not trigger and not request and not frappe.db.get_value("Feedback Trigger", { "document_type": reference_doctype }): return elif not trigger and request: trigger = frappe.db.get_value("Feedback Request", request, "feedback_trigger") @@ -81,8 +84,8 @@ def get_feedback_request_details(reference_doctype, reference_name, trigger="Man return feedback_trigger = frappe.get_doc("Feedback Trigger", trigger) - doc = frappe.get_doc(reference_doctype, reference_name) + doc = frappe.get_doc(reference_doctype, reference_name) context = get_context(doc) recipients = doc.get(feedback_trigger.email_fieldname, None) diff --git a/frappe/desk/page/modules/modules.js b/frappe/desk/page/modules/modules.js index f8f9569baa..e5d22f8d9e 100644 --- a/frappe/desk/page/modules/modules.js +++ b/frappe/desk/page/modules/modules.js @@ -28,7 +28,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)})); + {modules: frappe.get_desktop_icons(true).sort( + function(a, b){ return (a._label > b._label) ? 1 : -1 })})); // help click page.main.on("click", '.module-section-link[data-type="help"]', function(event) { diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py index 92e2e3f644..b330b1570d 100755 --- a/frappe/email/doctype/email_account/email_account.py +++ b/frappe/email/doctype/email_account/email_account.py @@ -247,6 +247,9 @@ class EmailAccount(Document): email_sync_rule = self.build_email_sync_rule() email_server = self.get_incoming_server(in_receive=True, email_sync_rule=email_sync_rule) + if not email_server: + return + emails = email_server.get_messages() incoming_mails = emails.get("latest_messages") @@ -595,6 +598,9 @@ class EmailAccount(Document): uid_list = { flag.get("uid", None): flag.get("action", "Read") for flag in flags } if flags and uid_list: email_server = self.get_incoming_server() + if not email_server: + return + email_server.update_flag(uid_list=uid_list) # mark communication as read diff --git a/frappe/model/rename_doc.py b/frappe/model/rename_doc.py index a560aa2284..e80c8900a7 100644 --- a/frappe/model/rename_doc.py +++ b/frappe/model/rename_doc.py @@ -152,12 +152,17 @@ def update_child_docs(old, new, meta): def update_link_field_values(link_fields, old, new, doctype): for field in link_fields: if field['issingle']: - single_doc = frappe.get_doc(field['parent']) - if single_doc.get(field['fieldname'])==old: - single_doc.set(field['fieldname'], new) - # update single docs using ORM rather then query - # as single docs also sometimes sets defaults! - single_doc.save(ignore_permissions=True) + try: + single_doc = frappe.get_doc(field['parent']) + if single_doc.get(field['fieldname'])==old: + single_doc.set(field['fieldname'], new) + # update single docs using ORM rather then query + # as single docs also sometimes sets defaults! + single_doc.save(ignore_permissions=True) + except ImportError: + # fails in patches where the doctype has been renamed + # or no longer exists + pass else: # because the table hasn't been renamed yet! parent = field['parent'] if field['parent']!=new else old diff --git a/frappe/patches.txt b/frappe/patches.txt index e530148662..39789001be 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -174,3 +174,4 @@ frappe.patches.v8_0.deprecate_integration_broker frappe.patches.v8_0.setup_email_inbox #2017-03-29 frappe.patches.v8_0.newsletter_childtable_migrate execute:frappe.db.sql("delete from `tabDesktop Icon` where module_name='Communication'") +execute:frappe.db.sql("update `tabDesktop Icon` set type='list' where _doctype='Communication'") diff --git a/frappe/public/build.json b/frappe/public/build.json index fdb6da93c5..1eb86dc32a 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -251,7 +251,6 @@ "public/js/frappe/views/treeview.js", "public/js/frappe/views/image/image_view_item_row.html", - "public/js/frappe/views/image/image_view_item_main_head.html", "public/js/frappe/views/image/photoswipe_dom.html", "public/js/frappe/views/inbox/inbox_no_result.html", diff --git a/frappe/public/css/list.css b/frappe/public/css/list.css index c8866da49c..8e88423d78 100644 --- a/frappe/public/css/list.css +++ b/frappe/public/css/list.css @@ -152,14 +152,6 @@ } .filterable { cursor: pointer; - display: inline-block; - text-overflow: ellipsis; -} -.col-sm-2:not(.list-row-right) .filterable, -.col-sm-3:not(.list-row-right) .filterable { - max-width: 145px; - overflow: hidden; - width: 100%; } .doclist-row .label { margin-right: 8px; @@ -392,3 +384,73 @@ .inbox-value { padding-top: 2px; } +.list-items { + width: 100%; +} +.list-item-container { + border-bottom: 1px solid #d1d8dd; +} +.list-item-container:last-child { + border-bottom: none; +} +.list-item { + display: flex; + align-items: center; + cursor: pointer; + height: 40px; + padding-left: 15px; + font-size: 12px; +} +.list-item:hover { + background-color: #F7FAFC; +} +@media (max-width: 767px) { + .list-item { + height: 50px; + padding-left: 10px; + font-size: 14px; + font-weight: normal; + } +} +.list-item--head { + background-color: #F7FAFC; + border-bottom: 1px solid #d1d8dd; + cursor: auto; +} +.list-item input[type=checkbox] { + margin: 0; + margin-right: 5px; +} +.list-item .liked-by, +.list-item .liked-by-filter-button { + display: inline-block; + width: 20px; + margin-right: 10px; +} +.list-item__content { + flex: 1; + margin-right: 15px; + display: flex; + align-items: center; +} +.list-item__content--flex-2 { + flex: 2; +} +.list-item__content--activity { + justify-content: flex-end; + margin-right: 5px; +} +.list-item__content--activity .list-row-modified, +.list-item__content--activity .avatar-small { + margin-right: 10px; +} +.list-item__content--indicator span::before { + height: 12px; + width: 12px; +} +.list-item__content--id { + justify-content: flex-end; +} +.frappe-timestamp { + white-space: nowrap; +} diff --git a/frappe/public/js/frappe/desk.js b/frappe/public/js/frappe/desk.js index f4703d3787..11c6375cc7 100644 --- a/frappe/public/js/frappe/desk.js +++ b/frappe/public/js/frappe/desk.js @@ -444,6 +444,10 @@ frappe.get_module = function(m, default_module) { frappe.get_desktop_icons = function(show_hidden, show_global) { // filter valid icons + + // hidden == hidden from desktop + // blocked == no view from modules either + var out = []; var add_to_out = function(module) { diff --git a/frappe/public/js/frappe/list/header_select_all_like_filter.html b/frappe/public/js/frappe/list/header_select_all_like_filter.html index 324f8cb71f..1cb81c9dc9 100644 --- a/frappe/public/js/frappe/list/header_select_all_like_filter.html +++ b/frappe/public/js/frappe/list/header_select_all_like_filter.html @@ -1,8 +1,8 @@ {% if (_checkbox) { %} - {% } %} - + \ No newline at end of file diff --git a/frappe/public/js/frappe/list/item_assigned_to_comment_count.html b/frappe/public/js/frappe/list/item_assigned_to_comment_count.html index 676fab1457..91df275ac9 100644 --- a/frappe/public/js/frappe/list/item_assigned_to_comment_count.html +++ b/frappe/public/js/frappe/list/item_assigned_to_comment_count.html @@ -1,17 +1,15 @@ - + + {%= comment_when(data.modified, true) %} + +{% if (data._assign_list.length) { %} + + {%= frappe.avatar(data._assign_list[data._assign_list.length - 1]) %} +{% } else { %} + +{% } %} + + + {%= (data._comment_count > 99 ? "99+" : data._comment_count) || 0 %} + diff --git a/frappe/public/js/frappe/list/list_item_main.html b/frappe/public/js/frappe/list/list_item_main.html index 42f00765ea..928943abcd 100644 --- a/frappe/public/js/frappe/list/list_item_main.html +++ b/frappe/public/js/frappe/list/list_item_main.html @@ -1,49 +1,40 @@ -
- {% var total_cols=0; for (var i=0, l=columns.length; i < l; i++ ) { - var col = columns[i], value=data[col.fieldname]; total_cols += parseInt(col.colspan); %} - {% if (total_cols <= 12) { %} -
- {% if(col.type!=="Indicator") { %}{% } %} - {% if (col.type==="Subject") { %} - {%= subject %} - {% } else if (col.type==="Indicator") { %} - {%= indicator %} - {% } else if (col.render) { %} - {%= col.render(data) %} - {% } else if (col.fieldtype==="Image") { %} - {% if(data[col.df.options]) { %} - - {% } else { %} -
- {% } %} - {% } else if(col.fieldtype==="Select") { %} - {%= __(value) %} - {% } else if(col.fieldtype==="Link") { %} - {%= value %} - {% } else { %} - {% if(formatters && formatters[col.fieldname]) { %} - {{ formatters[col.fieldname](value, col.df, data) }} - {% } else { %} - {{ frappe.format(value, col.df, null, data) }} - {% } %} - {% } %} - {% if(col.type!=="Indicator") { %}
{% } %} -
+
+ {% if (col.type==="Subject") { %} + {%= subject %} + {% } else if (col.type==="Indicator") { %} + {%= indicator %} + {% } else if (col.render) { %} + {%= col.render(data) %} + {% } else if (col.fieldtype==="Image") { %} + {% if(data[col.df.options]) { %} + + {% } else { %} +
+ {% } %} + {% } else if(col.fieldtype==="Select") { %} + {%= __(value) %} + {% } else if(col.fieldtype==="Link") { %} + {%= value %} + {% } else { %} + + {% if(formatters && formatters[col.fieldname]) { %} + {{ formatters[col.fieldname](value, col.df, data) }} + {% } else { %} + {{ frappe.format(value, col.df, null, data) }} {% } %} + {% } %} -
+
\ No newline at end of file diff --git a/frappe/public/js/frappe/list/list_item_main_head.html b/frappe/public/js/frappe/list/list_item_main_head.html index d8fb694ca9..9dc8f16b58 100644 --- a/frappe/public/js/frappe/list/list_item_main_head.html +++ b/frappe/public/js/frappe/list/list_item_main_head.html @@ -1,29 +1,15 @@ -
- {% var total_cols=0; for (var i=0, l=columns.length; i < l; i++ ) { - var col = columns[i]; total_cols += parseInt(col.colspan); %} - {% if (total_cols <= 12) { %} -
+
- - {% if (col.type==="Subject") { %} - {%= frappe.render_template("header_select_all_like_filter", { _checkbox: _checkbox }) %} - {% } %} - {{ __(col.title) || __(col.label) || "" }} - + {% if (col.type==="Subject") { %} + {%= frappe.render_template("header_select_all_like_filter", { _checkbox: _checkbox }) %} + {% } %} + {{ __(col.title) || __(col.label) || "" }} -
- {% } %} - {% } %} -
+
\ No newline at end of file diff --git a/frappe/public/js/frappe/list/list_item_row.html b/frappe/public/js/frappe/list/list_item_row.html index 0db51d0a25..d67feabf3b 100644 --- a/frappe/public/js/frappe/list/list_item_row.html +++ b/frappe/public/js/frappe/list/list_item_row.html @@ -1,31 +1,24 @@ -
-
- - {%= main %} -
+
+ {%= main %} {% if (meta.title_field && !settings.hide_name_column) { - var is_different = data.name !== data[meta.title_field]; - %} -