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) {

Reply via email to