changeset a349f81e5b3e in sao:5.0 details: https://hg.tryton.org/sao?cmd=changeset;node=a349f81e5b3e description: Escape external strings
issue9351 review301651002 (grafted from 2d55ed2f2bb12fd6fbe387fc768ad4394c00c20a) diffstat: CHANGELOG | 2 + src/common.js | 72 ++++++++++++++++++++++++++-------------------------- src/sao.js | 14 +++++----- src/screen.js | 8 ++-- src/session.js | 6 ++-- src/tab.js | 14 +++++----- src/view/calendar.js | 2 +- src/view/form.js | 10 +++--- src/view/tree.js | 2 +- src/window.js | 40 ++++++++++++++-------------- 10 files changed, 86 insertions(+), 84 deletions(-) diffs (699 lines): diff -r a64431c8055f -r a349f81e5b3e CHANGELOG --- a/CHANGELOG Sun May 10 11:34:47 2020 +0200 +++ b/CHANGELOG Tue May 26 09:57:34 2020 +0200 @@ -1,3 +1,5 @@ +* Escape external strings (issue9351) + Version 5.0.22 - 2020-05-01 * Bug fixes (see mercurial logs for details) diff -r a64431c8055f -r a349f81e5b3e src/common.js --- a/src/common.js Sun May 10 11:34:47 2020 +0200 +++ b/src/common.js Tue May 26 09:57:34 2020 +0200 @@ -124,12 +124,12 @@ jQuery('<div/>', { 'class': 'checkbox' }).append(jQuery('<label/>') - .append(jQuery('<input/>', { + .text(' ' + k) + .prepend(jQuery('<input/>', { 'type': 'radio', 'name': 'selection', 'value': i - })) - .append(' ' + k)) + }))) .appendTo(dialog.body); }); dialog.body.find('input').first().prop('checked', true); @@ -137,14 +137,14 @@ jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('Cancel')).click(function() { + }).text(Sao.i18n.gettext('Cancel')).click(function() { dialog.modal.modal('hide'); prm.fail(); }).appendTo(dialog.footer); jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'button' - }).append(Sao.i18n.gettext('OK')).click(function() { + }).text(Sao.i18n.gettext('OK')).click(function() { var i = dialog.body.find('input:checked').attr('value'); dialog.modal.modal('hide'); prm.resolve(values[keys[i]]); @@ -754,7 +754,7 @@ this.el = el; } else { this.el = jQuery('<button/>'); - this.el.append(attributes.string || ''); + this.el.text(attributes.string || ''); if (this.attributes.rule) { this.el.append(' ').append(jQuery('<span/>', { 'class': 'badge' @@ -2843,14 +2843,14 @@ 'aria-hidden': true, })).append(jQuery('<span/>', { 'class': 'sr-only' - }).append(Sao.i18n.gettext('Message: ')) + }).text(Sao.i18n.gettext('Message: ')) ).append(jQuery('<span/>') - .append(message) + .text(message) .css('white-space', 'pre-wrap'))); jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'button' - }).append(Sao.i18n.gettext('OK')).click(function() { + }).text(Sao.i18n.gettext('OK')).click(function() { this.close(dialog); prm.resolve('ok'); }.bind(this)).appendTo(dialog.footer); @@ -2875,20 +2875,20 @@ 'aria-hidden': true, })).append(jQuery('<span/>', { 'class': 'sr-only' - }).append(Sao.i18n.gettext('Warning: ')) + }).text(Sao.i18n.gettext('Warning: ')) ).append(jQuery('<h4/>') - .append(title) + .text(title) .css('white-space', 'pre-wrap')); if (message) { content.append(jQuery('<span/>') - .append(message) + .text(message) .css('white-space', 'pre-wrap')); } dialog.body.append(content); jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'button' - }).append(Sao.i18n.gettext('OK')).click(function() { + }).text(Sao.i18n.gettext('OK')).click(function() { this.close(dialog); prm.resolve('ok'); }.bind(this)).appendTo(dialog.footer); @@ -2909,7 +2909,7 @@ 'class': 'checkbox', }).append(jQuery('<label/>') .append(always) - .append(Sao.i18n.gettext('Always ignore this warning.'))) + .text(Sao.i18n.gettext('Always ignore this warning.'))) ); dialog.body.append(jQuery('<p/>') .text(Sao.i18n.gettext('Do you want to proceed?'))); @@ -2917,14 +2917,14 @@ jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('No')).click(function() { + }).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' - }).append(Sao.i18n.gettext('Yes')).click(function() { + }).text(Sao.i18n.gettext('Yes')).click(function() { this.close(dialog); if (always.prop('checked')) { prm.resolve('always'); @@ -2949,9 +2949,9 @@ 'aria-hidden': true, })).append(jQuery('<span/>', { 'class': 'sr-only' - }).append(Sao.i18n.gettext('Confirmation: ')) + }).text(Sao.i18n.gettext('Confirmation: ')) ).append(jQuery('<span/>') - .append(message) + .text(message) .css('white-space', 'pre-wrap'))); return dialog; } @@ -2964,14 +2964,14 @@ jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('Cancel')).click(function() { + }).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' - }).append(Sao.i18n.gettext('OK')).click(function() { + }).text(Sao.i18n.gettext('OK')).click(function() { this.close(dialog); prm.resolve(); }.bind(this)).appendTo(dialog.footer); @@ -2987,21 +2987,21 @@ jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('Cancel')).click(function() { + }).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' - }).append(Sao.i18n.gettext('No')).click(function() { + }).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' - }).append(Sao.i18n.gettext('Yes')).click(function() { + }).text(Sao.i18n.gettext('Yes')).click(function() { this.close(dialog); prm.resolve('ok'); }.bind(this)).appendTo(dialog.footer); @@ -3031,18 +3031,18 @@ 'class': 'form-group' }).append(jQuery('<label/>', { 'for': 'ask-dialog-entry' - }).append(question)).append(entry)); + }).text(question)).append(entry)); jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('Cancel')).click(function() { + }).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' - }).append(Sao.i18n.gettext('OK')).click(function() { + }).text(Sao.i18n.gettext('OK')).click(function() { this.close(dialog); prm.resolve(entry.val()); }.bind(this)).appendTo(dialog.footer); @@ -3067,8 +3067,8 @@ 'aria-hidden': true, })).append(jQuery('<span/>', { 'class': 'sr-only' - }).append(Sao.i18n.gettext('Write Concurrency Warning: ')) - ).append(Sao.i18n.gettext('This record has been modified ' + + }).text(Sao.i18n.gettext('Write Concurrency Warning: ')) + ).text(Sao.i18n.gettext('This record has been modified ' + 'while you were editing it.'))) .append(jQuery('<p/>').text(Sao.i18n.gettext('Choose:'))) .append(jQuery('<ul/>') @@ -3084,14 +3084,14 @@ jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('Cancel')).click(function() { + }).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' - }).append(Sao.i18n.gettext('Compare')).click(function() { + }).text(Sao.i18n.gettext('Compare')).click(function() { this.close(dialog); Sao.Tab.create({ 'model': model, @@ -3105,7 +3105,7 @@ jQuery('<button/>', { 'class': 'btn btn-default', 'type': 'button' - }).append(Sao.i18n.gettext('Write Anyway')).click(function() { + }).text(Sao.i18n.gettext('Write Anyway')).click(function() { this.close(dialog); prm.resolve(); }.bind(this)).appendTo(dialog.footer); @@ -3129,7 +3129,7 @@ 'aria-hidden': true, })).append(jQuery('<span/>', { 'class': 'sr-only' - }).append(Sao.i18n.gettext('Warning: ')) + }).text(Sao.i18n.gettext('Warning: ')) ).append(jQuery('<p/>') .append(jQuery('<pre/>') .text(details))) @@ -3143,7 +3143,7 @@ jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'button' - }).append(Sao.i18n.gettext('Close')).click(function() { + }).text(Sao.i18n.gettext('Close')).click(function() { this.close(dialog); prm.resolve(); }.bind(this)).appendTo(dialog.footer); @@ -3280,7 +3280,7 @@ 'class': 'action action-' + action_id }).append(jQuery('<a/>', { 'href': '#' - }).append(this._format_action(content))) + }).text(this._format_action(content))) .click(function(evt) { evt.preventDefault(); if (this.action_activated) { @@ -3332,7 +3332,7 @@ 'class': 'completion' }).append(jQuery('<a/>', { 'href': '#' - }).append(this._format(value))) + }).text(this._format(value))) .click(function(evt) { evt.preventDefault(); if (this.match_selected) { @@ -3519,7 +3519,7 @@ var button = jQuery('<button/>', { 'class': 'btn btn-default', 'type': 'button' - }).append(Sao.i18n.gettext('Close')).click(close) + }).text(Sao.i18n.gettext('Close')).click(close) .appendTo(dialog.footer); dialog.modal.on('shown.bs.modal', function() { // Force the click trigger diff -r a64431c8055f -r a349f81e5b3e src/sao.js --- a/src/sao.js Sun May 10 11:34:47 2020 +0200 +++ b/src/sao.js Tue May 26 09:57:34 2020 +0200 @@ -661,7 +661,7 @@ }).click(function(evt) { evt.preventDefault(); Sao.preferences(); - }).append(preferences.status_bar)); + }).text(preferences.status_bar)); var title = Sao.i18n.gettext("Logout"); jQuery('#user-logout').append(jQuery('<a/>', { 'href': '#', @@ -850,7 +850,7 @@ add_title: function(title) { this.header.append(jQuery('<h4/>', { 'class': 'modal-title' - }).append(title)); + }).text(title)); } }); @@ -1085,18 +1085,18 @@ var global_shortcuts_dl = jQuery('<dl/>', { 'class': 'dl-horizontal col-md-6' }).append(jQuery('<h5/>') - .append(Sao.i18n.gettext('Global shortcuts'))) + .text(Sao.i18n.gettext('Global shortcuts'))) .appendTo(row); var tab_shortcuts_dl = jQuery('<dl/>', { 'class': 'dl-horizontal col-md-6' }).append(jQuery('<h5/>') - .append(Sao.i18n.gettext('Tab shortcuts'))) - .appendTo(row); + .text(Sao.i18n.gettext('Tab shortcuts'))) + .appendTo(row); shortcuts_defs().forEach(function(definition) { - var dt = jQuery('<dt/>').append(definition.label); + var dt = jQuery('<dt/>').text(definition.label); var dd = jQuery('<dd/>').append(jQuery('<kbd>') - .append(definition.shortcut)); + .text(definition.shortcut)); var dest_dl; if (definition.id) { dest_dl = tab_shortcuts_dl; diff -r a64431c8055f -r a349f81e5b3e src/screen.js --- a/src/screen.js Sun May 10 11:34:47 2020 +0200 +++ b/src/screen.js Tue May 26 09:57:34 2020 +0200 @@ -30,7 +30,7 @@ this.filter_button = jQuery('<button/>', { type: 'button', 'class': 'btn btn-default' - }).append(Sao.i18n.gettext('Filters')); + }).text(Sao.i18n.gettext('Filters')); this.filter_button.click(this.search_box.bind(this)); this.search_entry = jQuery('<input/>', { 'class': 'form-control mousetrap', @@ -91,7 +91,7 @@ 'role': 'menuitem', 'href': '#', 'tabindex': -1 - }).append(name) + }).text(name) .click(domain, this.bookmark_activate.bind(this))) .appendTo(dropdown_bookmark); } @@ -182,7 +182,7 @@ role: 'tab', 'data-toggle': 'tab', 'href': '#' + i - }).append(name + ' ').append(counter)).appendTo(nav); + }).text(name + ' ').append(counter)).appendTo(nav); this.tab_counter.push(counter); }.bind(this)); nav.find('a:first').tab('show'); @@ -525,7 +525,7 @@ jQuery('<button/>', { 'class': 'btn btn-primary', type: 'submit' - }).append(Sao.i18n.gettext('Find')) + }).text(Sao.i18n.gettext('Find')) .click(search).appendTo(dialog.footer); } this.search_modal.modal('show'); diff -r a64431c8055f -r a349f81e5b3e src/session.js --- a/src/session.js Sun May 10 11:34:47 2020 +0200 +++ b/src/session.js Tue May 26 09:57:34 2020 +0200 @@ -135,7 +135,7 @@ }).append(jQuery('<label/>', { 'class': 'control-label', 'for': 'login-database' - }).append(Sao.i18n.gettext('Database'))) + }).text(Sao.i18n.gettext('Database'))) .append(dialog.database_select) .append(dialog.database_input) ).append(jQuery('<div/>', { @@ -143,13 +143,13 @@ }).append(jQuery('<label/>', { 'class': 'control-label', 'for': 'login-login' - }).append(Sao.i18n.gettext('User name'))) + }).text(Sao.i18n.gettext('User name'))) .append(dialog.login_input) ); dialog.button = jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'submit' - }).append(' ' + Sao.i18n.gettext("Login")).appendTo(dialog.footer); + }).text(' ' + Sao.i18n.gettext("Login")).appendTo(dialog.footer); return dialog; }; diff -r a64431c8055f -r a349f81e5b3e src/tab.js --- a/src/tab.js Sun May 10 11:34:47 2020 +0200 +++ b/src/tab.js Tue May 26 09:57:34 2020 +0200 @@ -138,7 +138,7 @@ 'tabindex': -1 }).append(Sao.common.ICONFACTORY.get_icon_img(item.icon, { 'aria-hidden': 'true', - })).append(' ' + item.label).appendTo(menuitem); + })).text(' ' + item.label).appendTo(menuitem); this.menu_buttons[item.id] = menuitem; link.click(function(evt) { evt.preventDefault(); @@ -432,7 +432,7 @@ 'aria-hidden': true }).append('×')).append(jQuery('<span/>', { 'class': 'sr-only' - }).append(Sao.i18n.gettext('Close'))).click(function(evt) { + }).text(Sao.i18n.gettext('Close'))).click(function(evt) { evt.preventDefault(); tab.close(); })) @@ -586,7 +586,7 @@ 'role': 'menuitem', 'href': '#', 'tabindex': -1 - }).append( + }).text( button.attributes.string || '')) .click(function(evt) { evt.preventDefault(); @@ -604,7 +604,7 @@ 'role': 'menuitem', 'href': '#', 'tabindex': -1 - }).append(action.name)) + }).text(action.name)) .click(function(evt) { evt.preventDefault(); var prm = jQuery.when(); @@ -982,7 +982,7 @@ 'role': 'menuitem', 'href': '#', 'tabindex': -1, - }).append(name).appendTo(jQuery('<li/>', { + }).text(name).appendTo(jQuery('<li/>', { 'role': 'presentation', }).appendTo(menu)); if (typeof callback == 'string') { @@ -1017,14 +1017,14 @@ 'role': 'menuitem', 'href': '#', 'tabindex': -1, - }).append(Sao.i18n.gettext('Add...')))); + }).text(Sao.i18n.gettext('Add...')))); menu.append(jQuery('<li/>', { 'role': 'presentation', }).append(jQuery('<a/>', { 'role': 'menuitem', 'href': '#', 'tabindex': -1, - }).append(Sao.i18n.gettext('Manage...')) + }).text(Sao.i18n.gettext('Manage...')) .click(function(evt) { evt.preventDefault(); window_(); diff -r a64431c8055f -r a349f81e5b3e src/view/calendar.js --- a/src/view/calendar.js Sun May 10 11:34:47 2020 +0200 +++ b/src/view/calendar.js Tue May 26 09:57:34 2020 +0200 @@ -238,7 +238,7 @@ this.screen.view_name == 'calendar') { element.find('.fc-time').remove(); } - element.append(event.description); + element.text(event.description); element.css('white-space', 'pre'); var model_access = Sao.common.MODELACCESS.get( this.screen.model_name); diff -r a64431c8055f -r a349f81e5b3e src/view/form.js --- a/src/view/form.js Sun May 10 11:34:47 2020 +0200 +++ b/src/view/form.js Tue May 26 09:57:34 2020 +0200 @@ -796,7 +796,7 @@ 'href': '#' + tab_id }) .append(img) - .append(text)) + .text(text)) .appendTo(this.nav); pane.html(tab).appendTo(this.panes); if (!this.selected) { @@ -891,7 +891,7 @@ 'class': 'caret', }))); if (attributes.string) { - link.append(attributes.string); + link.text(attributes.string); } }, add: function(widget) { @@ -1129,13 +1129,13 @@ jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('Cancel')).click(function() { + }).text(Sao.i18n.gettext('Cancel')).click(function() { this.close(dialog); }.bind(this)).appendTo(dialog.footer); jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'button' - }).append(Sao.i18n.gettext('OK')).click(this.write + }).text(Sao.i18n.gettext('OK')).click(this.write .bind(this, widget, dialog)) .appendTo(dialog.footer); dialog.content.submit(function(evt) { @@ -1989,7 +1989,7 @@ return function(option) { dropdown.append(jQuery('<li/>').append(jQuery('<a/>', { 'href': '#' - }).append(option).click(function(evt) { + }).text(option).click(function(evt) { evt.preventDefault(); document.execCommand(properties.command, false, option); }))); diff -r a64431c8055f -r a349f81e5b3e src/view/tree.js --- a/src/view/tree.js Sun May 10 11:34:47 2020 +0200 +++ b/src/view/tree.js Tue May 26 09:57:34 2020 +0200 @@ -500,7 +500,7 @@ var more_button = jQuery('<button/>', { 'class': 'btn btn-default', 'type': 'button' - }).append(Sao.i18n.gettext('More') + }).text(Sao.i18n.gettext('More') ).click(function() { this.display_size += Sao.config.display_size; this.display(); diff -r a64431c8055f -r a349f81e5b3e src/window.js --- a/src/window.js Sun May 10 11:34:47 2020 +0200 +++ b/src/window.js Tue May 26 09:57:34 2020 +0200 @@ -87,7 +87,7 @@ dialog.footer.append(jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(button_text).click(function() { + }).text(button_text).click(function() { this.response('RESPONSE_CANCEL'); }.bind(this))); } @@ -96,7 +96,7 @@ dialog.footer.append(jQuery('<button/>', { 'class': 'btn btn-default', 'type': 'button' - }).append(Sao.i18n.gettext('New')).click(function() { + }).text(Sao.i18n.gettext('New')).click(function() { this.response('RESPONSE_ACCEPT'); }.bind(this))); } @@ -105,12 +105,12 @@ dialog.footer.append(jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'submit' - }).append(Sao.i18n.gettext('Save'))); + }).text(Sao.i18n.gettext('Save'))); } else { dialog.footer.append(jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'submit' - }).append(Sao.i18n.gettext('OK'))); + }).text(Sao.i18n.gettext('OK'))); } dialog.content.submit(function(e) { this.response('RESPONSE_OK'); @@ -573,27 +573,27 @@ jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('Cancel')).click(function() { + }).text(Sao.i18n.gettext('Cancel')).click(function() { this.response('RESPONSE_CANCEL'); }.bind(this)).appendTo(dialog.footer); jQuery('<button/>', { 'class': 'btn btn-default', 'type': 'button' - }).append(Sao.i18n.gettext('Find')).click(function() { + }).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' - }).append(Sao.i18n.gettext('New')).click(function() { + }).text(Sao.i18n.gettext('New')).click(function() { this.response('RESPONSE_ACCEPT'); }.bind(this)).appendTo(dialog.footer); } jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'submit' - }).append(Sao.i18n.gettext('OK')).appendTo(dialog.footer); + }).text(Sao.i18n.gettext('OK')).appendTo(dialog.footer); dialog.content.submit(function(e) { this.response('RESPONSE_OK'); e.preventDefault(); @@ -694,13 +694,13 @@ jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('Cancel')).click(function() { + }).text(Sao.i18n.gettext('Cancel')).click(function() { this.response('RESPONSE_CANCEL'); }.bind(this)).appendTo(dialog.footer); jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'submit' - }).append(Sao.i18n.gettext('OK')).appendTo(dialog.footer); + }).text(Sao.i18n.gettext('OK')).appendTo(dialog.footer); dialog.content.submit(function(e) { this.response('RESPONSE_OK'); e.preventDefault(); @@ -777,13 +777,13 @@ jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('Cancel')).click(function() { + }).text(Sao.i18n.gettext('Cancel')).click(function() { this.response('RESPONSE_CANCEL'); }.bind(this)).appendTo(dialog.footer); jQuery('<button/>', { 'class': 'btn btn-primary', 'type': 'submit' - }).append(Sao.i18n.gettext('OK')).appendTo(dialog.footer); + }).text(Sao.i18n.gettext('OK')).appendTo(dialog.footer); dialog.content.submit(function(e) { this.response('RESPONSE_OK'); e.preventDefault(); @@ -890,14 +890,14 @@ jQuery('<button/>', { 'class': 'btn btn-link', 'type': 'button' - }).append(Sao.i18n.gettext('Cancel')).click(function(){ + }).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' - }).append(Sao.i18n.gettext('OK')).click(function(e){ + }).text(Sao.i18n.gettext('OK')).click(function(e){ this.response('RESPONSE_OK'); e.preventDefault(); }.bind(this)).appendTo(this.dialog.footer); @@ -937,7 +937,7 @@ this.fields_all.find('.bg-primary').each(function(i, el_field) { this.sig_sel_add(el_field); }.bind(this)); - }.bind(this)).append(' '+Sao.i18n.gettext('Add')) + }.bind(this)).text(' ' + Sao.i18n.gettext('Add')) .appendTo(this.column_buttons); jQuery('<button/>', { @@ -947,7 +947,7 @@ ).click(function(){ // sig_unsel this.fields_selected.children('li.bg-primary').remove(); - }.bind(this)).append(' '+Sao.i18n.gettext('Remove')) + }.bind(this)).text(' ' + Sao.i18n.gettext('Remove')) .appendTo(this.column_buttons); jQuery('<button/>', { @@ -956,7 +956,7 @@ }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-clear') ).click(function(){ this.fields_selected.empty(); - }.bind(this)).append(' '+Sao.i18n.gettext('Clear')) + }.bind(this)).text(' ' + Sao.i18n.gettext('Clear')) .appendTo(this.column_buttons); jQuery('<hr>').appendTo(this.column_buttons); @@ -1119,7 +1119,7 @@ }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-search') ).click(function(){ this.autodetect(); - }.bind(this)).append(' '+Sao.i18n.gettext('Auto-Detect')) + }.bind(this)).text(' ' + Sao.i18n.gettext('Auto-Detect')) .appendTo(this.column_buttons); var chooser_label = jQuery('<label/>', { @@ -1434,7 +1434,7 @@ }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-save') ).click(function(){ this.addreplace_predef(); - }.bind(this)).append(' '+Sao.i18n.gettext('Save Export')) + }.bind(this)).text(' ' + Sao.i18n.gettext('Save Export')) .appendTo(this.column_buttons); jQuery('<button/>', { @@ -1443,7 +1443,7 @@ }).append(Sao.common.ICONFACTORY.get_icon_img('tryton-delete') ).click(function(){ this.remove_predef(); - }.bind(this)).append(' '+Sao.i18n.gettext('Delete Export')) + }.bind(this)).text(' ' + Sao.i18n.gettext('Delete Export')) .appendTo(this.column_buttons); var predefined_exports_column = jQuery('<div/>', {