diff --git a/frappe/public/js/frappe/form/footer/timeline.js b/frappe/public/js/frappe/form/footer/timeline.js
index c9c3a0f277..e3241811e3 100644
--- a/frappe/public/js/frappe/form/footer/timeline.js
+++ b/frappe/public/js/frappe/form/footer/timeline.js
@@ -365,86 +365,125 @@ frappe.ui.form.Timeline = Class.extend({
out = [].concat(docinfo.communications);
if(with_versions) {
- var add_comment = function(version, text, comment_type) {
- if(!comment_type) {
- text = '' + text + '';
- }
- out.push({
- comment_type: comment_type || 'Edit',
- creation: version.creation,
- owner: version.owner,
- version_name: version.name,
- sender: version.owner,
- comment_by: version.owner,
- content: text
- });
- }
-
- docinfo.versions.forEach(function(version) {
- if(!version.data) return;
- var data = JSON.parse(version.data);
-
- // comment
- if(data.comment) {
- add_comment(version, data.comment, data.comment_type);
- return;
- }
-
- // value changed in parent
- if(data.changed && data.changed.length) {
- var parts = [];
- data.changed.slice(0, 3).forEach(function(p) {
- if(p[0]==='docstatus') {
- if(p[2]==1) {
- add_comment(version, __('submitted this document'));
- } else if (p[2]==2) {
- add_comment(version, __('cancelled this document'));
- }
- } else {
- parts.push(__('{0} from {1} to {2}', [
- frappe.meta.get_label(me.frm.doctype, p[0]),
- (frappe.ellipsis(p[1], 40) || '""').bold(),
- (frappe.ellipsis(p[2], 40) || '""').bold()
- ]));
- }
- });
- add_comment(version, __("changed value of {0}", [parts.join(', ')]));
- }
-
- // value changed in table field
- if(data.row_changed && data.row_changed.length) {
- var parts = [], count = 0;
- data.row_changed.every(function(row) {
- row[3].every(function(p) {
- parts.push(__('{0} from {1} to {2} in row #{3}', [
- frappe.meta.get_label(me.frm.fields_dict[row[0]].grid.doctype,
- p[0]),
- (frappe.ellipsis(p[1], 40) || '""').bold(),
- (frappe.ellipsis(p[2], 40) || '""').bold(),
- row[1]
- ]));
- return parts.length < 3;
- });
- return parts.length < 3;
- });
- add_comment(version, __("changed values for {0}",
- [parts.join(', ')]));
- }
-
- // rows added / removed
- // __('added'), __('removed') # for translation, don't remove
- ['added', 'removed'].forEach(function(key) {
- if(data[key] && data[key].length) {
- parts = (data[key] || []).map(function(p) {
- return frappe.meta.get_label(me.frm.doctype, p[0]) });
- add_comment(version, __("{0} rows for {1}",
- [__(key), parts.join(', ')]));
- }
- });
- });
+ this.build_version_comments(docinfo, out);
}
return out;
},
+ build_version_comments: function(docinfo, out) {
+ var me = this;
+
+ docinfo.versions.forEach(function(version) {
+ if(!version.data) return;
+ var data = JSON.parse(version.data);
+
+ // comment
+ if(data.comment) {
+ out.push(this.get_version_comment(version, data.comment, data.comment_type));
+ return;
+ }
+
+ // value changed in parent
+ if(data.changed && data.changed.length) {
+ var parts = [];
+ data.changed.every(function(p) {
+ if(p[0]==='docstatus') {
+ if(p[2]==1) {
+ out.push(me.get_version_comment(version, __('submitted this document')));
+ } else if (p[2]==2) {
+ out.push(me.get_version_comment(version, __('cancelled this document')));
+ }
+ } else {
+ var df = frappe.meta.get_docfield(me.frm.doctype, p[0], me.frm.docname);
+ if(!df.hidden) {
+ var field_display_status = frappe.perm.get_field_display_status(df, null,
+ me.frm.perm);
+ if(field_display_status === 'Read' || field_display_status === 'Write') {
+ parts.push(__('{0} from {1} to {2}', [
+ __(df.label),
+ (frappe.ellipsis(p[1], 40) || '""').bold(),
+ (frappe.ellipsis(p[2], 40) || '""').bold()
+ ]));
+ }
+ }
+ }
+ return parts.length < 3;
+ });
+ if(parts.length) {
+ out.push(me.get_version_comment(version, __("changed value of {0}", [parts.join(', ')])));
+ }
+ }
+
+ // value changed in table field
+ if(data.row_changed && data.row_changed.length) {
+ var parts = [], count = 0;
+ data.row_changed.every(function(row) {
+ row[3].every(function(p) {
+ var df = frappe.meta.get_docfield(me.frm.fields_dict[row[0]].grid.doctype,
+ p[0], me.frm.docname);
+
+ if(!df.hidden) {
+ field_display_status = frappe.perm.get_field_display_status(df,
+ null, me.frm.perm);
+
+ if(field_display_status === 'Read' || field_display_status === 'Write') {
+ parts.push(__('{0} from {1} to {2} in row #{3}', [
+ frappe.meta.get_label(me.frm.fields_dict[row[0]].grid.doctype,
+ p[0]),
+ (frappe.ellipsis(p[1], 40) || '""').bold(),
+ (frappe.ellipsis(p[2], 40) || '""').bold(),
+ row[1]
+ ]));
+ }
+ }
+ return parts.length < 3;
+ });
+ return parts.length < 3;
+ });
+ if(parts.length) {
+ out.push(me.get_version_comment(version, __("changed values for {0}",
+ [parts.join(', ')])));
+ }
+ }
+
+ // rows added / removed
+ // __('added'), __('removed') # for translation, don't remove
+ ['added', 'removed'].forEach(function(key) {
+ if(data[key] && data[key].length) {
+ parts = (data[key] || []).map(function(p) {
+ var df = frappe.meta.get_docfield(me.frm.doctype, p[0], me.frm.docname);
+ if(!df.hidden) {
+ var field_display_status = frappe.perm.get_field_display_status(df, null,
+ me.frm.perm);
+
+ if(field_display_status === 'Read' || field_display_status === 'Write') {
+ return frappe.meta.get_label(me.frm.doctype, p[0])
+ }
+ }
+ });
+ parts = parts.filter(function(p) { return p; });
+ if(parts.length) {
+ out.push(me.get_version_comment(version, __("{0} rows for {1}",
+ [__(key), parts.join(', ')])));
+ }
+ }
+ });
+ });
+ },
+ get_version_comment: function(version, text, comment_type) {
+ if(!comment_type) {
+ text = '' + text + '';
+ }
+ return {
+ comment_type: comment_type || 'Edit',
+ creation: version.creation,
+ owner: version.owner,
+ version_name: version.name,
+ sender: version.owner,
+ comment_by: version.owner,
+ content: text
+ };
+ },
+
add_comment: function(btn) {
var txt = this.input.val();
diff --git a/frappe/public/js/frappe/model/perm.js b/frappe/public/js/frappe/model/perm.js
index f83e56f47e..adff448535 100644
--- a/frappe/public/js/frappe/model/perm.js
+++ b/frappe/public/js/frappe/model/perm.js
@@ -255,11 +255,16 @@ $.extend(frappe.perm, {
},
get_field_display_status: function(df, doc, perm, explain) {
- if(!doc) {
+ // returns the display status of a particular field
+ // returns one of "Read", "Write" or "None"
+ if(!perm && doc) {
+ perm = frappe.perm.get_perm(doc.doctype, doc);
+ }
+
+ if(!perm) {
return (df && (cint(df.hidden) || cint(df.hidden_due_to_dependency))) ? "None": "Write";
}
- perm = perm || frappe.perm.get_perm(doc.doctype, doc);
if(!df.permlevel) df.permlevel = 0;
var p = perm[df.permlevel];
var status = "None";
@@ -282,6 +287,10 @@ $.extend(frappe.perm, {
if(cint(df.hidden_due_to_dependency)) status = "None";
if(explain) console.log("By Hidden Due To Dependency:" + status);
+ if(!doc) {
+ return status;
+ }
+
// submit
if(status==="Write" && cint(doc.docstatus) > 0) status = "Read";
if(explain) console.log("By Submit:" + status);
diff --git a/frappe/public/js/frappe/ui/toolbar/awesome_bar.js b/frappe/public/js/frappe/ui/toolbar/awesome_bar.js
index 223016f5a3..72d7774512 100644
--- a/frappe/public/js/frappe/ui/toolbar/awesome_bar.js
+++ b/frappe/public/js/frappe/ui/toolbar/awesome_bar.js
@@ -282,7 +282,7 @@ frappe.search.verbs = [
out.push({
label: __("{0} Calendar", [__(match).bold()]),
value: __("{0} Calendar", [__(match)]),
- route:["Calendar", match]
+ route:["List", match, "Calendar"]
});
out.push({