changeset 2f272a66182b in sao:default details: https://hg.tryton.org/sao?cmd=changeset;node=2f272a66182b description: Manage deletable and writable state from ir.rule
issue9357 review290101002 diffstat: CHANGELOG | 1 + src/model.js | 16 +++++++++++++++- src/screen.js | 23 +++++++++++++++++++++-- src/tab.js | 6 ++++++ src/view/form.js | 9 ++++++--- src/window.js | 5 +++-- 6 files changed, 52 insertions(+), 8 deletions(-) diffs (187 lines): diff -r f3d0a8d2b7f7 -r 2f272a66182b CHANGELOG --- a/CHANGELOG Tue Sep 22 10:18:39 2020 +0200 +++ b/CHANGELOG Wed Sep 23 10:04:19 2020 +0200 @@ -1,3 +1,4 @@ +* Manage deletable and writable state * Support e-mail template * Always encode CSV export in UTF-8 * Use tempusdominus and Popper for date time picker diff -r f3d0a8d2b7f7 -r 2f272a66182b src/model.js --- a/src/model.js Tue Sep 22 10:18:39 2020 +0200 +++ b/src/model.js Wed Sep 23 10:04:19 2020 +0200 @@ -551,6 +551,8 @@ this._loaded = {}; this.fields = {}; this._timestamp = null; + this._write = true; + this._delete = true; this.resources = null; this.button_clicks = {}; this.links_counts = {}; @@ -685,6 +687,8 @@ fnames_to_fetch.push('rec_name'); } fnames_to_fetch.push('_timestamp'); + fnames_to_fetch.push('_write'); + fnames_to_fetch.push('_delete'); var context = jQuery.extend({}, this.get_context()); if (loading == 'eager') { @@ -813,6 +817,10 @@ } continue; } + if (name == '_write' || name == '_delete') { + this[name] = value; + continue; + } if (!(name in this.model.fields)) { if (name == 'rec_name') { this._values[name] = value; @@ -1342,7 +1350,13 @@ return Boolean(~this.group.record_removed.indexOf(this)); }, get readonly() { - return this.deleted || this.removed || this.exception; + return (this.deleted || + this.removed || + this.exception || + !this._write); + }, + get deletable() { + return this._delete; }, get identity() { return JSON.stringify( diff -r f3d0a8d2b7f7 -r 2f272a66182b src/screen.js --- a/src/screen.js Tue Sep 22 10:18:39 2020 +0200 +++ b/src/screen.js Wed Sep 23 10:04:19 2020 +0200 @@ -813,6 +813,17 @@ // switch_view to avoid unnecessary call to fields_view_get by // domain_parser. }, + get readonly() { + var readonly_records = this.selected_records.some(function(r) { + return r.readonly; + }); + return this.attributes.readonly || readonly_records; + }, + get deletable() { + return this.selected_records.every(function(r) { + return r.deletable; + }); + }, load_next_view: function() { if (!jQuery.isEmptyObject(this.view_to_load)) { var view_id; @@ -1181,7 +1192,7 @@ context = this.context; } var group = new Sao.Group(this.model, context, []); - group.readonly = this.attributes.readonly || false; + group.readonly = this.attributes.readonly; this.set_group(group); }, get current_record() { @@ -1328,6 +1339,12 @@ this.set_cursor(false, false); return view.display(); }, + get selected_records() { + if (this.current_view) { + return this.current_view.selected_records; + } + return []; + }, clear: function() { this.current_record = null; this.group.clear(); @@ -1902,7 +1919,9 @@ this.new_(); } } else if (action == 'delete') { - if (access['delete']) { + if (access['delete'] && ( + this.current_record ? this.current_record.deletable : + true)) { this.remove(!this.group.parent, false, !this.group.parent); } } else if (action == 'remove') { diff -r f3d0a8d2b7f7 -r 2f272a66182b src/tab.js --- a/src/tab.js Tue Sep 22 10:18:39 2020 +0200 +++ b/src/tab.js Wed Sep 23 10:04:19 2020 +0200 @@ -1288,6 +1288,12 @@ }.bind(this)); this.buttons.switch_.prop('disabled', this.attributes.view_ids > 1); + + this.menu_buttons.delete_.toggleClass( + 'disabled', !this.screen.deletable); + this.menu_buttons.save.toggleClass( + 'disabled', this.screen.readonly); + var msg = name + ' / ' + data[1]; if (data[1] < data[2]) { msg += Sao.i18n.gettext(' of ') + data[2]; diff -r f3d0a8d2b7f7 -r 2f272a66182b src/view/form.js --- a/src/view/form.js Tue Sep 22 10:18:39 2020 +0200 +++ b/src/view/form.js Wed Sep 23 10:04:19 2020 +0200 @@ -3034,6 +3034,7 @@ o2m_size = null; size_limit = false; } + var deletable = this.screen.deletable; var create = this.attributes.create; if (create === undefined) { create = true; @@ -3046,7 +3047,7 @@ delete_ = true; } this.but_del.prop('disabled', this._readonly || !delete_ || - !access['delete'] || !this._position); + !access['delete'] || !this._position || !deletable); this.but_undel.prop('disabled', this._readonly || size_limit || !this._position); this.but_open.prop('disabled', !access.read || !this._position); @@ -3186,7 +3187,8 @@ }, remove: function(event_) { var access = Sao.common.MODELACCESS.get(this.screen.model_name); - if (!access.write || !access.read) { + var writable = !this.screen.readonly; + if (!access.write || !access.read || !writable) { return; } this.screen.remove(false, true, false); @@ -3301,7 +3303,8 @@ return this.edit(); }, delete_: function(event_) { - if (!Sao.common.MODELACCESS.get(this.screen.model_name)['delete']) { + if (!Sao.common.MODELACCESS.get(this.screen.model_name)['delete'] || + !this.screen.deletable) { return; } this.screen.remove(false, false, false); diff -r f3d0a8d2b7f7 -r 2f272a66182b src/window.js --- a/src/window.js Tue Sep 22 10:18:39 2020 +0200 +++ b/src/window.js Wed Sep 23 10:04:19 2020 +0200 @@ -303,7 +303,8 @@ record_label: function(data) { var name = '_'; var access = Sao.common.MODELACCESS.get(this.screen.model_name); - var readonly = this.screen.group.readonly; + var deletable = this.screen.deletable; + var readonly = this.screen.group.readonly || this.screen.readonly; if (data[0] >= 1) { name = data[0]; if (this.domain) { @@ -311,7 +312,7 @@ } this.but_next.prop('disabled', data[0] >= data[1]); this.but_previous.prop('disabled', data[0] <= 1); - if (access.delete && !readonly) { + if (access.delete && !readonly && deletable) { this.but_del.prop('disabled', false); this.but_undel.prop('disabled', false); }