diff --git a/CHANGELOG b/CHANGELOG
index 588dbd4cd7..2aa50c1a71 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,5 @@
+* Display unread and total of notes
+* Use resources method
* Rename roundup.url configuration to bug.url
* Use separate XML parser in Views
* Add range selection with Shift-click
diff --git a/src/common.js b/src/common.js
index 7d834cd9b5..9dc627d38a 100644
--- a/src/common.js
+++ b/src/common.js
@@ -2736,7 +2736,7 @@
},
_convert: function(data) {
var xml = jQuery.parseXML(data);
- jQuery(xml).find('svg').attr('fill', Sao.config.icon_color);
+ jQuery(xml).find('svg').attr('fill', Sao.config.icon_colors[0]);
data = new XMLSerializer().serializeToString(xml);
var blob = new Blob([data],
{type: 'image/svg+xml'});
diff --git a/src/model.js b/src/model.js
index 8246b2cd3f..b4a4f336fd 100644
--- a/src/model.js
+++ b/src/model.js
@@ -494,8 +494,7 @@
this._loaded = {};
this.fields = {};
this._timestamp = null;
- this.attachment_count = -1;
- this.unread_note = -1;
+ this.resources = null;
this.button_clicks = {};
this.state_attrs = {};
this.autocompletion = {};
@@ -1270,46 +1269,17 @@
}
}
},
- get_attachment_count: function(reload) {
- var prm = jQuery.Deferred();
- if (this.id < 0) {
- prm.resolve(0);
- return prm;
- }
- if ((this.attachment_count < 0) || reload) {
- prm = Sao.rpc({
- method: 'model.ir.attachment.search_count',
- params: [
- [['resource', '=', this.model.name + ',' + this.id]],
- this.get_context()]
- }, this.model.session).then(function(count) {
- this.attachment_count = count;
- return count;
- }.bind(this));
+ get_resources: function(reload) {
+ var prm;
+ if ((this.id >= 0) && (!this.resources || reload)) {
+ prm = this.model.execute(
+ 'resources', [this.id], this.get_context())
+ .then(function(resources) {
+ this.resources = resources;
+ return resources;
+ }.bind(this));
} else {
- prm.resolve(this.attachment_count);
- }
- return prm;
- },
- get_unread_note: function(reload) {
- var prm = jQuery.Deferred();
- if (this.id < 0) {
- prm.resolve(0);
- return prm;
- }
- if ((this.unread_note < 0) || reload) {
- prm = Sao.rpc({
- method: 'model.ir.note.search_count',
- params: [
- [['resource', '=', this.model.name + ',' + this.id],
- ['unread', '=', true]],
- this.get_context()]
- }, this.model.session).then(function(count) {
- this.unread_note = count;
- return count;
- }.bind(this));
- } else {
- prm.resolve(this.unread_note);
+ prm = jQuery.when(this.resources);
}
return prm;
},
diff --git a/src/sao.js b/src/sao.js
index 87f87d2682..25e6d41b7c 100644
--- a/src/sao.js
+++ b/src/sao.js
@@ -246,7 +246,7 @@ var Sao = {};
Sao.config.display_size = 20;
Sao.config.bug_url = 'https://bugs.tryton.org/';
Sao.config.title = 'Tryton';
- Sao.config.icon_color = '#3465a4';
+ Sao.config.icon_colors = '#3465a4,#555753,#cc0000'.split(',');
Sao.config.bus_timeout = 10 * 60 * 1000;
Sao.i18n = i18n();
diff --git a/src/screen.js b/src/screen.js
index 6827e4c757..e83dc73505 100644
--- a/src/screen.js
+++ b/src/screen.js
@@ -1185,13 +1185,10 @@
}
if (this.tab) {
if (record) {
- record.get_attachment_count().always(
- this.tab.attachment_count.bind(this.tab));
- record.get_unread_note().always(
- this.tab.update_unread_note.bind(this.tab));
+ record.get_resources().always(
+ this.tab.update_resources.bind(this.tab));
} else {
- this.tab.attachment_count(0);
- this.tab.update_unread_note(0);
+ this.tab.update_resources();
}
this.tab.record_message();
}
diff --git a/src/tab.js b/src/tab.js
index 363e3a357a..1000f400cf 100644
--- a/src/tab.js
+++ b/src/tab.js
@@ -1022,7 +1022,7 @@
attach: function(evt) {
var window_ = function() {
return new Sao.Window.Attachment(record, function() {
- this.update_attachment_count(true);
+ this.refresh_resources(true);
}.bind(this));
}.bind(this);
var dropdown = this.buttons.attach.parents('.dropdown');
@@ -1140,7 +1140,7 @@
}
var window_ = new Sao.Window.Attachment(record, function() {
- this.update_attachment_count(true);
+ this.refresh_resources(true);
}.bind(this));
files.forEach(function(file) {
Sao.common.get_file_data(file, function(data, filename) {
@@ -1168,68 +1168,77 @@
evt.dataTransfer.clearData();
}
},
- update_attachment_count: function(reload) {
- var record = this.screen.current_record;
- if (record) {
- record.get_attachment_count(reload).always(
- this.attachment_count.bind(this));
- } else {
- this.attachment_count(0);
- }
- },
- attachment_count: function(count) {
- var badge = this.buttons.attach.find('.badge');
- if (!badge.length) {
- badge = jQuery('', {
- 'class': 'badge'
- }).appendTo(this.buttons.attach);
- }
- var text = count || '';
- if (count > 99) {
- text = '99+';
- }
- badge.text(text);
- this.buttons.attach.attr(
- 'title', Sao.i18n.gettext("Attachment(%1)", count));
- var record_id = this.screen.get_id();
- this.buttons.attach.prop('disabled',
- record_id < 0 || record_id === null);
- },
note: function() {
var record = this.screen.current_record;
if (!record || (record.id < 0)) {
return;
}
new Sao.Window.Note(record, function() {
- this.update_unread_note(true);
+ this.refresh_resources(true);
}.bind(this));
},
- update_unread_note: function(reload) {
+ refresh_resources: function(reload) {
var record = this.screen.current_record;
if (record) {
- record.get_unread_note(reload).always(
- this._unread_note.bind(this));
+ record.get_resources(reload).always(
+ this.update_resources.bind(this));
} else {
- this._unread_note(0);
+ this.update_resources();
}
},
- _unread_note: function(unread) {
- var badge = this.buttons.note.find('.badge');
- if (!badge.length) {
- badge = jQuery('', {
- 'class': 'badge'
- }).appendTo(this.buttons.note);
+ update_resources: function(resources) {
+ if (!resources) {
+ resources = {};
}
- var text = unread || '';
- if (unread > 99) {
- text = '99+';
- }
- badge.text(text);
- this.buttons.note.attr(
- 'title', Sao.i18n.gettext("Note(%1)", unread));
var record_id = this.screen.get_id();
- this.buttons.note.prop('disabled',
- record_id < 0 || record_id === null);
+ var disabled = record_id < 0 || record_id === null;
+
+ var update = function(name, title, text, color) {
+ var button = this.buttons[name];
+
+ var badge = button.find('.badge');
+ if (!badge.length) {
+ badge = jQuery('', {
+ 'class': 'badge'
+ }).appendTo(button);
+ }
+ if (color) {
+ color = Sao.config.icon_colors[color];
+ } else {
+ color = '';
+ }
+ badge.css('background-color', color);
+ badge.text(text);
+ button.attr('title', title);
+ button.prop('disabled', disabled);
+ }.bind(this);
+
+ var count = resources.attachment_count || 0;
+ var badge = count || '';
+ if (count > 99) {
+ badge = '99+';
+ }
+ var title= Sao.i18n.gettext("Attachment (%1)", count);
+ update('attach', title, badge, 1);
+
+ count = resources.note_count || 0;
+ var unread = resources.note_unread || 0;
+ badge = '';
+ var color = unread > 0 ? 2 : 1;
+ if (count) {
+ if (count > 9) {
+ badge = '+';
+ } else {
+ badge = count;
+ }
+ if (unread > 9) {
+ badge = '+/' + badge;
+ } else {
+ badge = unread + '/' + badge;
+ }
+ }
+ title = Sao.i18n.gettext("Note (%1/%2)", unread, count);
+ update('note', title, badge, color);
},
record_message: function(data) {
if (data) {
@@ -1344,12 +1353,12 @@
action.update_domain(this.board.actions);
}
},
- attachment_count: function() {
- },
note: function() {
},
- update_unread_note: function() {
- }
+ refresh_resources: function() {
+ },
+ update_resources: function() {
+ },
});
Sao.Tab.Wizard = Sao.class_(Sao.Tab, {