changeset b22e83f9f106 in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=b22e83f9f106
description:
        Add help for each value to selection and multiselection

        issue9649
        review320021002
diffstat:

 CHANGELOG        |   1 +
 src/common.js    |  29 ++++++++++++++++++++------
 src/view.js      |   3 +-
 src/view/form.js |  61 +++++++++++++++++++++++++++++++++++++++++++++----------
 4 files changed, 75 insertions(+), 19 deletions(-)

diffs (257 lines):

diff -r bbe035407d10 -r b22e83f9f106 CHANGELOG
--- a/CHANGELOG Sun Feb 14 14:03:55 2021 +0100
+++ b/CHANGELOG Sun Feb 14 14:28:55 2021 +0100
@@ -1,3 +1,4 @@
+* Manage help for each selection
 * Display revision on dialog
 * Support empty value for timedelta converter
 * Unify PYSON string format
diff -r bbe035407d10 -r b22e83f9f106 src/common.js
--- a/src/common.js     Sun Feb 14 14:03:55 2021 +0100
+++ b/src/common.js     Sun Feb 14 14:28:55 2021 +0100
@@ -625,6 +625,7 @@
     Sao.common.selection_mixin = {};
     Sao.common.selection_mixin.init = function() {
         this.selection = null;
+        this.help = null;
         this.inactive_selection = [];
         this._last_domain = null;
         this._values2selection = {};
@@ -642,6 +643,7 @@
         }
         var key = JSON.stringify(value);
         var selection = this.attributes.selection || [];
+        var help = this.attributes.help_selection || {};
         var prm;
         var prepare_selection = function(selection) {
             selection = jQuery.extend([], selection);
@@ -651,7 +653,8 @@
                 });
             }
             this.selection = jQuery.extend([], selection);
-            if (callback) callback(this.selection);
+            this.help = this.attributes.help_selection || {};
+            if (callback) callback(this.selection, this.help);
         };
         if (!(selection instanceof Array) &&
                 !(key in this._values2selection)) {
@@ -680,7 +683,7 @@
         var _update_selection = function() {
             if (!field) {
                 if (callback) {
-                    callback(this.selection);
+                    callback(this.selection, this.help);
                 }
                 return;
             }
@@ -694,7 +697,7 @@
                             Sao.common.selection_mixin.filter_selection.call(
                                     this, domain, record, field);
                             if (callback) {
-                                callback(this.selection);
+                                callback(this.selection, this.help);
                             }
                         }.bind(this));
             } else {
@@ -709,14 +712,19 @@
                         (JSON.stringify(context) ==
                          JSON.stringify(this._last_domain[1]))) {
                     if (callback) {
-                        callback(this.selection);
+                        callback(this.selection, this.help);
                     }
                     return;
                 }
+                var fields = ['rec_name'];
+                var help_field = this.attributes.help_field;
+                if (help_field) {
+                    fields.push(help_field);
+                }
                 var prm = Sao.rpc({
                     'method': 'model.' + this.attributes.relation +
                         '.search_read',
-                    'params': [domain, 0, null, null, ['rec_name'], context]
+                    'params': [domain, 0, null, null, fields, context]
                 }, record.model.session);
                 prm.done(function(result) {
                     var selection = [];
@@ -726,18 +734,25 @@
                     if (this.nullable_widget) {
                         selection.push([null, '']);
                     }
+                    var help = {};
+                    if (help_field){
+                        result.forEach(function(x) {
+                            help[x.id] = x[help_field];
+                        });
+                    }
                     this._last_domain = [domain, context];
                     this._domain_cache[jdomain] = selection;
                     this.selection = jQuery.extend([], selection);
+                    this.help = help;
                     if (callback) {
-                        callback(this.selection);
+                        callback(this.selection, this.help);
                     }
                 }.bind(this));
                 prm.fail(function() {
                     this._last_domain = null;
                     this.selection = [];
                     if (callback) {
-                        callback(this.selection);
+                        callback(this.selection, this.help);
                     }
                 }.bind(this));
             }
diff -r bbe035407d10 -r b22e83f9f106 src/view.js
--- a/src/view.js       Sun Feb 14 14:03:55 2021 +0100
+++ b/src/view.js       Sun Feb 14 14:28:55 2021 +0100
@@ -144,7 +144,8 @@
                     'relation_field', 'views', 'invisible', 'add_remove',
                     'sort', 'context', 'size', 'filename', 'autocomplete',
                     'translate', 'create', 'delete', 'selection_change_with',
-                    'schema_model', 'required'].forEach(function(name) {
+                    'schema_model', 'required', 'help_selection', 'help_field',
+                ].forEach(function(name) {
                         if ((name in field) && (!(name in node_attrs))) {
                             node_attrs[name] = field[name];
                         }
diff -r bbe035407d10 -r b22e83f9f106 src/view/form.js
--- a/src/view/form.js  Sun Feb 14 14:03:55 2021 +0100
+++ b/src/view/form.js  Sun Feb 14 14:28:55 2021 +0100
@@ -1945,27 +1945,28 @@
         },
         update_selection: function(record, field, callbak) {
             Sao.common.selection_mixin.update_selection.call(this, record,
-                field, function(selection) {
-                    this.set_selection(selection);
+                field, function(selection, help) {
+                    this.set_selection(selection, help);
                     if (callbak) {
-                        callbak();
+                        callbak(help);
                     }
                 }.bind(this));
         },
-        set_selection: function(selection) {
+        set_selection: function(selection, help) {
             var select = this.select;
             select.empty();
             selection.forEach(function(e) {
                 select.append(jQuery('<option/>', {
                     'value': JSON.stringify(e[0]),
-                    'text': e[1]
+                    'text': e[1],
+                    'title': help[e[0]],
                 }));
             });
         },
         display_update_selection: function() {
             var record = this.record;
             var field = this.field;
-            this.update_selection(record, field, function() {
+            this.update_selection(record, field, function(help) {
                 if (!field) {
                     this.select.val('');
                     return;
@@ -1993,6 +1994,11 @@
                 }
                 prm.done(function() {
                     this.select.val(JSON.stringify(value));
+                    var title = help[value] || null;
+                    if (this.attributes.help && title) {
+                        title = this.attributes.help + '\n' + title;
+                    }
+                    this.select.attr('title', title);
                 }.bind(this));
             }.bind(this));
         },
@@ -2715,20 +2721,21 @@
         },
         update_selection: function(record, field, callback) {
             Sao.common.selection_mixin.update_selection.call(this, record,
-                field, function(selection) {
-                    this.set_selection(selection);
+                field, function(selection, help) {
+                    this.set_selection(selection, help);
                     if (callback) {
                         callback();
                     }
                 }.bind(this));
         },
-        set_selection: function(selection) {
+        set_selection: function(selection, help) {
             var select = this.select;
             select.empty();
             selection.forEach(function(e) {
                 select.append(jQuery('<option/>', {
                     'value': e[0],
-                    'text': e[1]
+                    'text': e[1],
+                    'title': help[e[0]],
                 }));
             });
         },
@@ -3905,6 +3912,21 @@
                 this, view, attributes);
             this.select.prop('multiple', true);
         },
+        set_selection: function(selection, help) {
+            Sao.View.Form.MultiSelection._super.set_selection.call(
+                this, selection, help);
+            var widget_help = this.attributes.help;
+            if (widget_help) {
+                this.select.children().each(function() {
+                    var option = jQuery(this);
+                    var help = option.attr('title');
+                    if (help) {
+                        help = widget_help + '\n' + help;
+                        option.attr('title', help);
+                    }
+                });
+            }
+        },
         get modified() {
             if (this.record && this.field) {
                 var group = new Set(this.field.get_eval(this.record));
@@ -4568,8 +4590,9 @@
                 select.append(jQuery('<option/>', {
                     'value': JSON.stringify(e[0]),
                     'text': e[1],
+                    'title': this.definition.help_selection[e[0]],
                 }));
-            });
+            }.bind(this));
         },
         set_readonly: function(readonly) {
             this._readonly = readonly;
@@ -4592,6 +4615,11 @@
             },
             set_value: function(value) {
                 this.input.val(JSON.stringify(value));
+                var title = this.definition.help_selection[value] || null;
+                if (this.definition.help && title) {
+                    title = this.definition.help + '\n' + title;
+                }
+                this.input.attr('title', title);
             },
         });
 
@@ -4602,6 +4630,17 @@
                 Sao.View.Form.Dict.MultiSelection._super
                     .create_widget.call(this);
                 this.input.prop('multiple', true);
+                var widget_help = this.definition.help;
+                if (widget_help) {
+                    this.input.children().each(function() {
+                        var option = jQuery(this);
+                        var help = option.attr('title');
+                        if (help) {
+                            help = widget_help + '\n' + help;
+                            option.attr('title', help);
+                        }
+                    });
+                }
             },
             get_value: function() {
                 var value = this.input.val();

Reply via email to