changeset e4d48affbb83 in sao:default
details: https://hg.tryton.org/sao?cmd=changeset&node=e4d48affbb83
description:
Support create/delete attribute in view
issue10840
review377341002
diffstat:
src/common.js | 14 +++-
src/view/form.js | 145 +++++++++++++++++++++++++++++++++++++++++-------------
2 files changed, 119 insertions(+), 40 deletions(-)
diffs (260 lines):
diff -r 124993176812 -r e4d48affbb83 src/common.js
--- a/src/common.js Fri Oct 08 19:10:46 2021 +0200
+++ b/src/common.js Mon Oct 11 22:53:02 2021 +0200
@@ -3678,17 +3678,21 @@
});
Sao.common.get_completion = function(el, source,
- match_selected, action_activated) {
+ match_selected, action_activated, search, create) {
var format = function(content) {
return content.rec_name;
};
var completion = new Sao.common.InputCompletion(
el, source, match_selected, format);
if (action_activated) {
- completion.set_actions([
- ['search', Sao.i18n.gettext('Search...')],
- ['create', Sao.i18n.gettext('Create...')]],
- action_activated);
+ var actions = [];
+ if (search || search == undefined) {
+ actions.push(['search', Sao.i18n.gettext('Search...')]);
+ }
+ if (create || create == undefined) {
+ actions.push(['create', Sao.i18n.gettext('Create...')]);
+ }
+ completion.set_actions(actions, action_activated);
}
};
diff -r 124993176812 -r e4d48affbb83 src/view/form.js
--- a/src/view/form.js Fri Oct 08 19:10:46 2021 +0200
+++ b/src/view/form.js Mon Oct 11 22:53:02 2021 +0200
@@ -2549,7 +2549,13 @@
return this.get_access('read');
},
get create_access() {
- return this.attributes.create && this.get_access('create');
+ var create = this.attributes.create;
+ if (create === undefined) {
+ create = true;
+ } else if (typeof create == 'string') {
+ create = Boolean(parseInt(create, 10));
+ }
+ return create && this.get_access('create');
},
get modified() {
if (this.record && this.field) {
@@ -3074,7 +3080,8 @@
Sao.common.get_completion(this.wid_text,
this._update_completion.bind(this),
this._completion_match_selected.bind(this),
- this._completion_action_activated.bind(this));
+ this._completion_action_activated.bind(this),
+ this.read_access, this.create_access);
this.wid_completion = true;
}
@@ -3178,6 +3185,37 @@
this.but_switch.prop('disabled', this.screen.number_of_views <= 0);
},
+ get_access: function(type) {
+ var model = this.attributes.relation;
+ if (model) {
+ return Sao.common.MODELACCESS.get(model)[type];
+ }
+ return true;
+ },
+ get read_access() {
+ return this.get_access('read');
+ },
+ get create_access() {
+ var create = this.attributes.create;
+ if (create === undefined) {
+ create = true;
+ } else if (typeof create == 'string') {
+ create = Boolean(parseInt(create, 10));
+ }
+ return create && this.get_access('create');
+ },
+ get write_access() {
+ return this.get_access('write');
+ },
+ get delete_access() {
+ var delete_ = this.attributes.delete;
+ if (delete_ === undefined) {
+ delete_ = true;
+ } else if (typeof delete_ == 'string') {
+ delete_ = Boolean(parseInt(delete_, 10));
+ }
+ return delete_ && this.get_access('delete');
+ },
get modified() {
return this.screen.current_view.modified;
},
@@ -3195,7 +3233,6 @@
this._required);
},
_set_button_sensitive: function() {
- var access = Sao.common.MODELACCESS.get(this.screen.model_name);
var size_limit, o2m_size;
var record = this.record;
var field = this.field;
@@ -3210,31 +3247,47 @@
size_limit = false;
}
var deletable = this.screen.deletable;
- var create = this.attributes.create;
- if (create === undefined) {
- create = true;
- }
- this.but_new.prop('disabled', this._readonly || !create ||
- size_limit || !access.create);
-
- var delete_ = this.attributes['delete'];
- if (delete_ === undefined) {
- delete_ = true;
- }
- this.but_del.prop('disabled', this._readonly || !delete_ ||
- !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);
- this.but_next.prop('disabled', (this.position > 0) && (
- this._position >= this._length));
- this.but_previous.prop('disabled', this._position <= 1);
+ this.but_new.prop(
+ 'disabled',
+ this._readonly ||
+ !this.create_access ||
+ size_limit);
+ this.but_del.prop(
+ 'disabled',
+ this._readonly ||
+ !this.delete_access ||
+ !this._position ||
+ !deletable);
+ this.but_undel.prop(
+ 'disabled',
+ this._readonly ||
+ size_limit ||
+ !this._position);
+ this.but_open.prop(
+ 'disabled',
+ !this._position ||
+ !this.read_access);
+ this.but_next.prop(
+ 'disabled',
+ (this.position > 0) &&
+ ( this._position >= this._length));
+ this.but_previous.prop(
+ 'disabled',
+ this._position <= 1);
if (this.attributes.add_remove) {
- this.wid_text.prop('disabled', this._readonly);
- this.but_add.prop('disabled', this._readonly || size_limit ||
- !access.write || !access.read);
- this.but_remove.prop('disabled', this._readonly ||
- !this.position || !access.write || !access.read);
+ this.but_add.prop(
+ 'disabled',
+ this._readonly ||
+ size_limit ||
+ !this.write_access ||
+ !this.read_access);
+ this.wid_text.prop('disabled', this.but_add.prop('disabled'));
+ this.but_remove.prop(
+ 'disabled',
+ this._readonly ||
+ !this.position ||
+ !this.write_access ||
+ !this.read_access);
}
},
_sequence: function() {
@@ -3309,8 +3362,7 @@
this.edit();
},
add: function(event_) {
- var access = Sao.common.MODELACCESS.get(this.screen.model_name);
- if (!access.write || !access.read) {
+ if (!this.write_access || !this.read_access) {
return;
}
this.view.set_value();
@@ -3362,9 +3414,8 @@
});
},
remove: function(event_) {
- var access = Sao.common.MODELACCESS.get(this.screen.model_name);
var writable = !this.screen.readonly;
- if (!access.write || !access.read || !writable) {
+ if (!this.write_access || !this.read_access || !writable) {
return;
}
this.screen.remove(false, true, false);
@@ -3644,7 +3695,8 @@
Sao.common.get_completion(group,
this._update_completion.bind(this),
this._completion_match_selected.bind(this),
- this._completion_action_activated.bind(this));
+ this._completion_action_activated.bind(this),
+ this.read_access, this.create_access);
this.wid_completion = true;
}
@@ -3693,6 +3745,25 @@
this.content.append(this.screen.screen_container.el);
}.bind(this));
},
+ get_access: function(type) {
+ var model = this.attributes.relation;
+ if (model) {
+ return Sao.common.MODELACCESS.get(model)[type];
+ }
+ return true;
+ },
+ get read_access() {
+ return this.get_access('read');
+ },
+ get create_access() {
+ var create = this.attributes.create;
+ if (create === undefined) {
+ create = true;
+ } else if (typeof create == 'string') {
+ create = Boolean(parseInt(create, 10));
+ }
+ return create && this.get_access('create');
+ },
set_readonly: function(readonly) {
Sao.View.Form.Many2Many._super.set_readonly.call(this, readonly);
this._set_button_sensitive();
@@ -3794,7 +3865,7 @@
view_ids: (this.attributes.view_ids ||
'').split(','),
views_preload: this.attributes.views || {},
- new_: this.attributes.create,
+ new_: this.create_access,
search_filter: parser.quote(value),
title: this.attributes.string
});
@@ -4651,11 +4722,15 @@
_set_button_sensitive: function() {
var create = this.attributes.create;
if (create === undefined) {
- create = true;
+ create = 1;
+ } else if (typeof create == 'string') {
+ create = Boolean(parseInt(create, 10));
}
var delete_ = this.attributes['delete'];
if (delete_ === undefined) {
- delete_ = true;
+ delete_ = 1;
+ } else if (typeof delete_ == 'string') {
+ delete_ = Boolean(parseInt(delete_, 10));
}
this.but_add.prop('disabled', this._readonly || !create);
for (var key in this.fields) {