changeset 9a6ab3679cce in sao:default
details: https://hg.tryton.org/sao?cmd=changeset&node=9a6ab3679cce
description:
        Manage overflow on button and add title on every buttons

        issue10863
        review381191002
diffstat:

 src/common.js    |  78 +++++++++++++++++++++++++++++++++--------------
 src/sao.less     |   4 ++
 src/screen.js    |   6 ++-
 src/session.js   |   3 +-
 src/tab.js       |  11 +++---
 src/view/form.js |  24 +++++++++++---
 src/view/tree.js |   4 +-
 src/window.js    |  90 +++++++++++++++++++++++++++++++++++++------------------
 8 files changed, 152 insertions(+), 68 deletions(-)

diffs (735 lines):

diff -r 2d70702c1424 -r 9a6ab3679cce src/common.js
--- a/src/common.js     Thu Oct 21 00:15:16 2021 +0200
+++ b/src/common.js     Thu Oct 21 00:16:49 2021 +0200
@@ -156,14 +156,16 @@
 
         jQuery('<button/>', {
             'class': 'btn btn-link',
-            'type': 'button'
+            'type': 'button',
+            'title': Sao.i18n.gettext("Cancel"),
         }).text(Sao.i18n.gettext('Cancel')).click(function() {
             dialog.modal.modal('hide');
             prm.reject();
         }).appendTo(dialog.footer);
         jQuery('<button/>', {
             'class': 'btn btn-primary',
-            'type': 'button'
+            'type': 'button',
+            'title': Sao.i18n.gettext("OK"),
         }).text(Sao.i18n.gettext('OK')).click(function() {
             var i = dialog.body.find('input:checked').attr('value');
             dialog.modal.modal('hide');
@@ -3142,7 +3144,8 @@
                 .css('white-space', 'pre-wrap')));
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("OK"),
             }).text(Sao.i18n.gettext('OK')).click(function() {
                 this.close(dialog);
                 prm.resolve('ok');
@@ -3180,7 +3183,8 @@
             dialog.body.append(content);
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("OK"),
             }).text(Sao.i18n.gettext('OK')).click(function() {
                 this.close(dialog);
                 prm.resolve('ok');
@@ -3209,14 +3213,16 @@
             dialog.footer.empty();
             jQuery('<button/>', {
                 'class': 'btn btn-link',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("No"),
             }).text(Sao.i18n.gettext('No')).click(function() {
                 this.close(dialog);
                 prm.reject();
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Yes"),
             }).text(Sao.i18n.gettext('Yes')).click(function() {
                 this.close(dialog);
                 if (always.prop('checked')) {
@@ -3256,14 +3262,16 @@
                 this, message);
             jQuery('<button/>', {
                 'class': 'btn btn-link',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Cancel"),
             }).text(Sao.i18n.gettext('Cancel')).click(function() {
                 this.close(dialog);
                 prm.reject();
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("OK"),
             }).text(Sao.i18n.gettext('OK')).click(function() {
                 this.close(dialog);
                 prm.resolve();
@@ -3279,21 +3287,24 @@
                 this, message);
             jQuery('<button/>', {
                 'class': 'btn btn-link',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Cancel"),
             }).text(Sao.i18n.gettext('Cancel')).click(function() {
                 this.close(dialog);
                 prm.resolve('cancel');
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-default',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("No"),
             }).text(Sao.i18n.gettext('No')).click(function() {
                 this.close(dialog);
                 prm.resolve('ko');
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Yes"),
             }).text(Sao.i18n.gettext('Yes')).click(function() {
                 this.close(dialog);
                 prm.resolve('ok');
@@ -3327,14 +3338,16 @@
             }).text(question)).append(entry));
             jQuery('<button/>', {
                 'class': 'btn btn-link',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Cancel"),
             }).text(Sao.i18n.gettext('Cancel')).click(function() {
                 this.close(dialog);
                 prm.reject();
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("OK"),
             }).text(Sao.i18n.gettext('OK')).click(function() {
                 this.close(dialog);
                 prm.resolve(entry.val());
@@ -3376,14 +3389,16 @@
                 );
             jQuery('<button/>', {
                 'class': 'btn btn-link',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Cancel"),
             }).text(Sao.i18n.gettext('Cancel')).click(function() {
                 this.close(dialog);
                 prm.reject();
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-default',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Compare"),
             }).text(Sao.i18n.gettext('Compare')).click(function() {
                 this.close(dialog);
                 Sao.rpc({
@@ -3404,7 +3419,8 @@
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-default',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Write Anyway"),
             }).text(Sao.i18n.gettext('Write Anyway')).click(function() {
                 this.close(dialog);
                 prm.resolve();
@@ -3442,7 +3458,8 @@
                     }).text(Sao.i18n.gettext('Report Bug')))));
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Close"),
             }).text(Sao.i18n.gettext('Close')).click(function() {
                 this.close(dialog);
                 prm.resolve();
@@ -3849,7 +3866,8 @@
                 .click(close);
         var button = jQuery('<button/>', {
             'class': 'btn btn-default',
-            'type': 'button'
+            'type': 'button',
+            'title': Sao.i18n.gettext("Close"),
         }).text(Sao.i18n.gettext('Close')).click(close)
             .appendTo(dialog.footer);
         dialog.modal.on('shown.bs.modal', function() {
@@ -4035,7 +4053,8 @@
                 var properties = buttons[i];
                 var button = jQuery('<button/>', {
                     'class': 'btn btn-default',
-                    'type': 'button'
+                    'type': 'button',
+                    'title': properties.label,
                 }).append(Sao.common.ICONFACTORY.get_icon_img(
                     'tryton-format-' + properties.icon)
                 ).appendTo(group);
@@ -4046,13 +4065,16 @@
         add_buttons([
             {
                 'icon': 'bold',
-                'command': 'bold'
+                'command': 'bold',
+                'label': Sao.i18n.gettext("Bold"),
             }, {
                 'icon': 'italic',
-                'command': 'italic'
+                'command': 'italic',
+                'label': Sao.i18n.gettext("Italic"),
             }, {
                 'icon': 'underline',
-                'command': 'underline'
+                'command': 'underline',
+                'label': Sao.i18n.gettext("Underline"),
             }]);
 
         var selections = [
@@ -4101,15 +4123,23 @@
             {
                 'icon': 'align-left',
                 'command': Sao.i18n.rtl? 'justifyRight' : 'justifyLeft',
+                'label': (Sao.i18n.rtl?
+                    Sao.i18n.gettext("Justify Right") :
+                    Sao.i18n.gettext("Justify Left")),
             }, {
                 'icon': 'align-center',
-                'command': 'justifyCenter'
+                'command': 'justifyCenter',
+                'label': Sao.i18n.gettext("Justify Center"),
             }, {
                 'icon': 'align-right',
                 'command': Sao.i18n.rtl? 'justifyLeft': 'justifyRight',
+                'label': (Sao.i18n.rtl?
+                    Sao.i18n.gettext("Justify Left") :
+                    Sao.i18n.gettext("Justify Right")),
             }, {
                 'icon': 'align-justify',
-                'command': 'justifyFull'
+                'command': 'justifyFull',
+                'label': Sao.i18n.gettext("Justify Full"),
             }]);
 
         // TODO backColor
diff -r 2d70702c1424 -r 9a6ab3679cce src/sao.less
--- a/src/sao.less      Thu Oct 21 00:15:16 2021 +0200
+++ b/src/sao.less      Thu Oct 21 00:16:49 2021 +0200
@@ -42,6 +42,10 @@
     }
 }
 
+button {
+    overflow-y: hidden;
+    text-overflow: ellipsis;
+}
 
 .navbar-inverse {
     .close {
diff -r 2d70702c1424 -r 9a6ab3679cce src/screen.js
--- a/src/screen.js     Thu Oct 21 00:15:16 2021 +0200
+++ b/src/screen.js     Thu Oct 21 00:16:49 2021 +0200
@@ -29,7 +29,8 @@
             this.el.append(this.filter_box);
             this.filter_button = jQuery('<button/>', {
                 type: 'button',
-                'class': 'btn btn-link'
+                'class': 'btn btn-link',
+                'title': Sao.i18n.gettext("Filters"),
             }).text(Sao.i18n.gettext('Filters'));
             this.filter_button.click(this.search_box.bind(this));
             this.search_entry = jQuery('<input/>', {
@@ -558,7 +559,8 @@
 
                 jQuery('<button/>', {
                     'class': 'btn btn-primary',
-                    type: 'submit'
+                    type: 'submit',
+                    'title': Sao.i18n.gettext("Find"),
                 }).text(Sao.i18n.gettext('Find'))
                 .click(search).appendTo(dialog.footer);
             }
diff -r 2d70702c1424 -r 9a6ab3679cce src/session.js
--- a/src/session.js    Thu Oct 21 00:15:16 2021 +0200
+++ b/src/session.js    Thu Oct 21 00:16:49 2021 +0200
@@ -205,7 +205,8 @@
         );
         dialog.button = jQuery('<button/>', {
             'class': 'btn btn-primary',
-            'type': 'submit'
+            'type': 'submit',
+            'title': Sao.i18n.gettext("Login"),
         }).text(' ' + Sao.i18n.gettext("Login")).appendTo(dialog.footer);
         return dialog;
     };
diff -r 2d70702c1424 -r 9a6ab3679cce src/tab.js
--- a/src/tab.js        Thu Oct 21 00:15:16 2021 +0200
+++ b/src/tab.js        Thu Oct 21 00:16:49 2021 +0200
@@ -192,7 +192,8 @@
             })).append(jQuery('<button/>', {
                 'type': 'button',
                 'class': 'close visible-xs',
-                'aria-label': Sao.i18n.gettext('Close')
+                'aria-label': Sao.i18n.gettext("Close"),
+                'title': Sao.i18n.gettext("Close"),
             }).append(jQuery('<span/>', {
                 'aria-hidden': true
             }).append('&times;')).click(function() {
@@ -399,12 +400,12 @@
             Sao.set_url(tab.get_url(), tab.name.split(' / ').pop());
         })
         .append(jQuery('<button/>', {
-            'class': 'close'
+            'class': 'close',
+            'aria-label': Sao.i18n.gettext("Close"),
+            'title': Sao.i18n.gettext("Close"),
         }).append(jQuery('<span/>', {
             'aria-hidden': true
-        }).append('&times;')).append(jQuery('<span/>', {
-            'class': 'sr-only'
-        }).text(Sao.i18n.gettext('Close'))).click(function(evt) {
+        }).append('&times;')).click(function(evt) {
             evt.preventDefault();
             tab.close();
         }))
diff -r 2d70702c1424 -r 9a6ab3679cce src/view/form.js
--- a/src/view/form.js  Thu Oct 21 00:15:16 2021 +0200
+++ b/src/view/form.js  Thu Oct 21 00:16:49 2021 +0200
@@ -996,6 +996,7 @@
                 'params': [this.action_id, context],
             }, Sao.Session.current_session, false);
             this.label.text(action.name);
+            this.el.attr('title', action.name);
 
             var decoder = new Sao.PYSON.Decoder(pyson_ctx);
             var domain = decoder.decode(action.pyson_domain);
@@ -1282,13 +1283,15 @@
             this.read(widget, dialog);
             jQuery('<button/>', {
                 'class': 'btn btn-link',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Cancel"),
             }).text(Sao.i18n.gettext('Cancel')).click(function() {
                 this.close(dialog);
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("OK"),
             }).text(Sao.i18n.gettext('OK')).click(this.write
                     .bind(this, widget, dialog))
                     .appendTo(dialog.footer);
@@ -1617,8 +1620,10 @@
         _set_password_label: function() {
             if (this.input.prop('type') == 'password') {
                 this.button.text(Sao.i18n.gettext('Show'));
+                this.button.attr('title', Sao.i18n.gettext("Show"));
             } else {
                 this.button.text(Sao.i18n.gettext('Hide'));
+                this.button.attr('title', Sao.i18n.gettext("Hide"));
             }
         }
     });
@@ -2193,7 +2198,8 @@
                 var button  = jQuery('<button/>', {
                     'class': 'btn btn-default btn-sm form-control',
                     'type': 'button',
-                    'aria-label': Sao.i18n.gettext('Translate')
+                    'aria-label': Sao.i18n.gettext('Translate'),
+                    'title': Sao.i18n.gettext("Translate"),
                 }).appendTo(jQuery('<span/>', {
                     'class': 'input-group-btn'
                 }).appendTo(this.el));
@@ -2271,6 +2277,7 @@
                     'class': 'btn btn-default btn-sm form-control',
                     'type': 'button',
                     'aria-label': Sao.i18n.gettext("Translate"),
+                    'title': Sao.i18n.gettext("Translate"),
                 }).appendTo(jQuery('<span/>', {
                     'class': 'input-group-btn',
                 }).appendTo(this.el));
@@ -4114,7 +4121,9 @@
 
                 this.but_open = jQuery('<button/>', {
                     'class': 'btn btn-default',
-                    'type': 'button'
+                    'type': 'button',
+                    'aria-label': Sao.i18n.gettext("Open..."),
+                    'title': Sao.i18n.gettext("Open..."),
                 }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-open')
                 ).appendTo(jQuery('<span/>', {
                     'class': 'input-group-btn',
@@ -4478,6 +4487,7 @@
                     'class': 'btn btn-default btn-sm',
                     'type': 'button',
                     'aria-label': Sao.i18n.gettext('Translate'),
+                    'title': Sao.i18n.gettext("Translate"),
                 }).appendTo(this.el);
                 button.append(
                     Sao.common.ICONFACTORY.get_icon_img('tryton-translate'));
@@ -4618,7 +4628,8 @@
             this.but_add = jQuery('<button/>', {
                 'class': 'btn btn-default btn-sm',
                 'type': 'button',
-                'aria-label': Sao.i18n.gettext('Add')
+                'aria-label': Sao.i18n.gettext("Add"),
+                'title': Sao.i18n.gettext("Add"),
             }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-add')
             ).appendTo(jQuery('<div/>', {
                 'class': 'input-group-btn'
@@ -4908,7 +4919,8 @@
             this.button = jQuery('<button/>', {
                 'class': 'btn btn-default',
                 'type': 'button',
-                'arial-label': Sao.i18n.gettext('Remove')
+                'arial-label': Sao.i18n.gettext("Remove"),
+                'title': Sao.i18n.gettext("Remove"),
             }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-remove')
             ).appendTo(jQuery('<div/>', {
                 'class': 'input-group-btn'
diff -r 2d70702c1424 -r 9a6ab3679cce src/view/tree.js
--- a/src/view/tree.js  Thu Oct 21 00:15:16 2021 +0200
+++ b/src/view/tree.js  Thu Oct 21 00:16:49 2021 +0200
@@ -822,7 +822,8 @@
                     var more_cell = jQuery('<td/>');
                     var more_button = jQuery('<button/>', {
                         'class': 'btn btn-default btn-block',
-                        'type': 'button'
+                        'type': 'button',
+                        'title': Sao.i18n.gettext("More"),
                     }).text(Sao.i18n.gettext('More')
                     ).click(function() {
                         this.display_size += Sao.config.display_size;
@@ -2540,6 +2541,7 @@
                 button = jQuery('<button/>', {
                     'class': 'btn btn-default btn-sm',
                     'type': 'button',
+                    'title': Sao.i18n.gettext("Save As..."),
                 }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-save')
                 ).appendTo(cell)
                     .click(record, function(event) {
diff -r 2d70702c1424 -r 9a6ab3679cce src/window.js
--- a/src/window.js     Thu Oct 21 00:15:16 2021 +0200
+++ b/src/window.js     Thu Oct 21 00:16:49 2021 +0200
@@ -62,7 +62,8 @@
             }).append(jQuery('<button/>', {
                 'type': 'button',
                 'class': 'close stretched-link',
-                'aria-label': Sao.i18n.gettext('Close')
+                'aria-label': Sao.i18n.gettext("Close"),
+                'title': Sao.i18n.gettext("Close"),
             }).append(jQuery('<span/>', {
                 'aria-hidden': true
             }).append('&times;')).click(function() {
@@ -176,7 +177,8 @@
 
                 dialog.footer.append(jQuery('<button/>', {
                     'class': 'btn btn-link',
-                    'type': 'button'
+                    'type': 'button',
+                    'title': button_text,
                 }).text(button_text).click(function() {
                     this.response('RESPONSE_CANCEL');
                 }.bind(this)));
@@ -185,7 +187,8 @@
             if (kwargs.new_ && this.many) {
                 dialog.footer.append(jQuery('<button/>', {
                     'class': 'btn btn-default',
-                    'type': 'button'
+                    'type': 'button',
+                    'title': Sao.i18n.gettext("New"),
                 }).text(Sao.i18n.gettext('New')).click(function() {
                     this.response('RESPONSE_ACCEPT');
                 }.bind(this)));
@@ -194,12 +197,14 @@
             if (this.save_current) {
                 dialog.footer.append(jQuery('<button/>', {
                     'class': 'btn btn-primary',
-                    'type': 'submit'
+                    'type': 'submit',
+                    'title': Sao.i18n.gettext("Save"),
                 }).text(Sao.i18n.gettext('Save')));
             } else {
                 dialog.footer.append(jQuery('<button/>', {
                     'class': 'btn btn-primary',
-                    'type': 'submit'
+                    'type': 'submit',
+                    'title': Sao.i18n.gettext("OK"),
                 }).text(Sao.i18n.gettext('OK')));
             }
             dialog.content.submit(function(e) {
@@ -239,7 +244,8 @@
                 this.but_switch = jQuery('<button/>', {
                     'class': 'btn btn-default btn-sm',
                     'type': 'button',
-                    'aria-label': Sao.i18n.gettext('Switch')
+                    'aria-label': Sao.i18n.gettext("Switch"),
+                    'title': Sao.i18n.gettext("Switch"),
                 }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-switch')
                 ).appendTo(buttons);
                 this.but_switch.click(
@@ -248,7 +254,8 @@
                 this.but_previous = jQuery('<button/>', {
                     'class': 'btn btn-default btn-sm',
                     'type': 'button',
-                    'aria-label': Sao.i18n.gettext('Previous')
+                    'aria-label': Sao.i18n.gettext("Previous"),
+                    'title': Sao.i18n.gettext("Previous"),
                 }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-back')
                 ).appendTo(buttons);
                 this.but_previous.click(
@@ -263,7 +270,8 @@
                 this.but_next = jQuery('<button/>', {
                     'class': 'btn btn-default btn-sm',
                     'type': 'button',
-                    'aria-label': Sao.i18n.gettext('Next')
+                    'aria-label': Sao.i18n.gettext("Next"),
+                    'title': Sao.i18n.gettext("Next"),
                 }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-forward')
                 ).appendTo(buttons);
                 this.but_next.click(disable_during(this.next.bind(this)));
@@ -274,7 +282,8 @@
                     this.but_add = jQuery('<button/>', {
                         'class': 'btn btn-default btn-sm',
                         'type': 'button',
-                        'aria-label': Sao.i18n.gettext('Add')
+                        'aria-label': Sao.i18n.gettext("Add"),
+                        'title': Sao.i18n.gettext("Add"),
                     }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-add')
                     ).appendTo(buttons);
                     this.but_add.click(disable_during(this.add.bind(this)));
@@ -283,7 +292,8 @@
                     this.but_remove = jQuery('<button/>', {
                         'class': 'btn btn-default btn-sm',
                         'type': 'button',
-                        'aria-label': Sao.i18n.gettext('Remove')
+                        'aria-label': Sao.i18n.gettext("Remove"),
+                        'title': Sao.i18n.gettext("Remove"),
                     
}).append(Sao.common.ICONFACTORY.get_icon_img('tryton-remove')
                     ).appendTo(buttons);
                     this.but_remove.click(
@@ -294,7 +304,8 @@
                 this.but_new = jQuery('<button/>', {
                     'class': 'btn btn-default btn-sm',
                     'type': 'button',
-                    'aria-label': Sao.i18n.gettext('New')
+                    'aria-label': Sao.i18n.gettext("New"),
+                    'title': Sao.i18n.gettext("New"),
                 }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-create')
                 ).appendTo(buttons);
                 this.but_new.click(disable_during(this.new_.bind(this)));
@@ -303,7 +314,8 @@
                 this.but_del = jQuery('<button/>', {
                     'class': 'btn btn-default btn-sm',
                     'type': 'button',
-                    'aria-label': Sao.i18n.gettext('Delete')
+                    'aria-label': Sao.i18n.gettext("Delete"),
+                    'title': Sao.i18n.gettext("Delete"),
                 }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-delete')
                 ).appendTo(buttons);
                 this.but_del.click(disable_during(this.delete_.bind(this)));
@@ -312,7 +324,8 @@
                 this.but_undel = jQuery('<button/>', {
                     'class': 'btn btn-default btn-sm',
                     'type': 'button',
-                    'aria-label': Sao.i18n.gettext('Undelete')
+                    'aria-label': Sao.i18n.gettext("Undelete"),
+                    'title': Sao.i18n.gettext("Undelete"),
                 }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-undo')
                 ).appendTo(buttons);
                 this.but_undel.click(disable_during(this.undelete.bind(this)));
@@ -700,27 +713,31 @@
 
             jQuery('<button/>', {
                 'class': 'btn btn-link',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Cancel"),
             }).text(Sao.i18n.gettext('Cancel')).click(function() {
                 this.response('RESPONSE_CANCEL');
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-default',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Find"),
             }).text(Sao.i18n.gettext('Find')).click(function() {
                 this.response('RESPONSE_APPLY');
             }.bind(this)).appendTo(dialog.footer);
             if (kwargs.new_ && Sao.common.MODELACCESS.get(model).create) {
                 jQuery('<button/>', {
                     'class': 'btn btn-default',
-                    'type': 'button'
+                    'type': 'button',
+                    'title': Sao.i18n.gettext("New"),
                 }).text(Sao.i18n.gettext('New')).click(function() {
                     this.response('RESPONSE_ACCEPT');
                 }.bind(this)).appendTo(dialog.footer);
             }
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'submit'
+                'type': 'submit',
+                'title': Sao.i18n.gettext("OK"),
             }).text(Sao.i18n.gettext('OK')).appendTo(dialog.footer);
             dialog.content.submit(function(e) {
                 this.response('RESPONSE_OK');
@@ -822,13 +839,15 @@
 
             jQuery('<button/>', {
                 'class': 'btn btn-link',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Cancel"),
             }).text(Sao.i18n.gettext('Cancel')).click(function() {
                 this.response('RESPONSE_CANCEL');
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'submit'
+                'type': 'submit',
+                'title': Sao.i18n.gettext("OK"),
             }).text(Sao.i18n.gettext('OK')).appendTo(dialog.footer);
             dialog.content.submit(function(e) {
                 this.response('RESPONSE_OK');
@@ -902,13 +921,15 @@
 
             jQuery('<button/>', {
                 'class': 'btn btn-link',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Cancel"),
             }).text(Sao.i18n.gettext('Cancel')).click(function() {
                 this.response('RESPONSE_CANCEL');
             }.bind(this)).appendTo(dialog.footer);
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'submit'
+                'type': 'submit',
+                'title': Sao.i18n.gettext("OK"),
             }).text(Sao.i18n.gettext('OK')).appendTo(dialog.footer);
             dialog.content.submit(function(e) {
                 this.response('RESPONSE_OK');
@@ -969,14 +990,16 @@
             this.fields_model = {};
             jQuery('<button/>', {
                 'class': 'btn btn-link',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Cancel"),
             }).text(Sao.i18n.gettext('Cancel')).click(function(){
                 this.response('RESPONSE_CANCEL');
             }.bind(this)).appendTo(this.dialog.footer);
 
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
-                'type': 'submit'
+                'type': 'submit',
+                'title': Sao.i18n.gettext("OK"),
             }).text(Sao.i18n.gettext('OK')).click(function(e){
                 this.response('RESPONSE_OK');
                 e.preventDefault();
@@ -1011,7 +1034,8 @@
 
             var button_add = jQuery('<button/>', {
                 'class': 'btn btn-default btn-block',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Add"),
             }).text(' ' + Sao.i18n.gettext('Add')).prepend(
                 Sao.common.ICONFACTORY.get_icon_img('tryton-add')
             ).click(function(){
@@ -1023,7 +1047,8 @@
 
             jQuery('<button/>', {
                 'class': 'btn btn-default btn-block',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Remove"),
             }).text(' ' + Sao.i18n.gettext('Remove')).prepend(
                 Sao.common.ICONFACTORY.get_icon_img('tryton-remove')
             ).click(function(){
@@ -1034,7 +1059,8 @@
 
             jQuery('<button/>', {
                 'class': 'btn btn-default btn-block',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Clear"),
             }).text(' ' + Sao.i18n.gettext('Clear')).prepend(
                 Sao.common.ICONFACTORY.get_icon_img('tryton-clear')
             ).click(function(){
@@ -1164,7 +1190,8 @@
 
             jQuery('<button/>', {
                 'class': 'btn btn-default btn-block',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Auto-Detect"),
             }).text(' ' + Sao.i18n.gettext('Auto-Detect')).prepend(
                 Sao.common.ICONFACTORY.get_icon_img('tryton-search')
             ).click(function(){
@@ -1497,7 +1524,8 @@
 
             jQuery('<button/>', {
                 'class': 'btn btn-default btn-block',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Save Export"),
             }).text(' ' + Sao.i18n.gettext('Save Export')).prepend(
                 Sao.common.ICONFACTORY.get_icon_img('tryton-save')
             ).click(function(){
@@ -1509,6 +1537,7 @@
                 'class': 'btn btn-default btn-block',
                 'target': '_blank',
                 'rel': 'noreferrer noopener',
+                'title': Sao.i18n.gettext("URL Export"),
             }).text(' ' + Sao.i18n.gettext("URL Export")).prepend(
                 Sao.common.ICONFACTORY.get_icon_img('tryton-public')
             )
@@ -1517,7 +1546,8 @@
 
             jQuery('<button/>', {
                 'class': 'btn btn-default btn-block',
-                'type': 'button'
+                'type': 'button',
+                'title': Sao.i18n.gettext("Delete Export"),
             }).text(' ' + Sao.i18n.gettext('Delete Export')).prepend(
                 Sao.common.ICONFACTORY.get_icon_img('tryton-delete')
             ).click(function(){
@@ -2214,6 +2244,7 @@
             jQuery('<button/>', {
                 'class': 'btn btn-link',
                 'type': 'button',
+                'title': Sao.i18n.gettext("Cancel"),
             }).text(' ' + Sao.i18n.gettext('Cancel')).prepend(
                 Sao.common.ICONFACTORY.get_icon_img('tryton-cancel')
             ).click(function() {
@@ -2223,6 +2254,7 @@
             jQuery('<button/>', {
                 'class': 'btn btn-primary',
                 'type': 'submit',
+                'title': Sao.i18n.gettext("Send"),
             }).text(' ' + Sao.i18n.gettext('Send')).prepend(
                 Sao.common.ICONFACTORY.get_icon_img('tryton-send')
             ).appendTo(this.dialog.footer);

Reply via email to