diff --git a/libraries.txt b/libraries.txt index b70eb4ac..dad7e61b 100644 --- a/libraries.txt +++ b/libraries.txt @@ -4,7 +4,7 @@ including Python modules installed via Pip which are listed in requirements.txt. Library Version Licence URL ======= ======= ======= === QT 4.6.2+ LGPL v2.1/3 http://www.qt.io/ -Bootstrap 3.3.4 MIT http://getbootstrap.com/ +Bootstrap 4.1.3 MIT http://getbootstrap.com/ jQuery 3.3.1 MIT http://jquery.com/ Modernizr 2.6.2 MIT/BSD http://modernizr.com/ AlertifyJS 1.7.1 MIT http://alertifyjs.com/ *** Do not update - changed to GPL3 in 1.8.0 *** @@ -21,7 +21,6 @@ font-Awesome 4.5 SIL OFL http://fortawesome.github.io/Fon font-mfizz 2.4.1 MIT http://fizzed.com/oss/font-mfizz backgrid.js 0.3.5 MIT http://backgridjs.com/ backbone.undo 0.2 MIT http://backbone.undojs.com/ -bootstrap-switch 3.3.2 MIT http://www.bootstrap-switch.org/ select2 4.0.1 MIT https://select2.github.io/ backgrid-filter 01b2b21 MIT https://github.com/wyuenho/backgrid-filter backbone.paginator 2.0.3 MIT http://github.com/backbone-paginator/backbone.paginator @@ -41,3 +40,4 @@ Mousetrap 1.6.1 AL https://github.com/ccampbell/mou Axios 0.18.0 MIT https://github.com/axios/axios leaflet 1.3.3 BSD https://leafletjs.com/ wkx 0.4.5 MIT https://github.com/cschwarz/wkx +Bootstrap4-toggle 3.4.0 MIT https://gitbrent.github.io/bootstrap4-toggle diff --git a/web/package.json b/web/package.json index a554bbb5..4b6a5c76 100644 --- a/web/package.json +++ b/web/package.json @@ -59,7 +59,6 @@ "bignumber.js": "^6.0.0", "bootstrap": "^4.1.3", "bootstrap-datepicker": "^1.7.0", - "bootstrap-switch": "3.3.4", "bowser": "1.6.1", "browserify": "~14.1.0", "codemirror": "^5.29.0", @@ -98,7 +97,8 @@ "underscore.string": "^3.3.4", "watchify": "~3.9.0", "webcabin-docker": "git+https://github.com/EnterpriseDB/wcDocker/#25f6fda624c5469340da0c111a18545a4455973a", - "wkx": "^0.4.5" + "wkx": "^0.4.5", + "bootstrap4-toggle": "3.4.0" }, "scripts": { "linter": "yarn eslint --no-eslintrc -c .eslintrc.js --ext .js --ext .jsx .", diff --git a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js index 17ee0c44..edbcfbf4 100644 --- a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js +++ b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js @@ -72,7 +72,7 @@ define('pgadmin.node.role', [ var switchOptions = { 'onText': gettext('Yes'), 'offText': gettext('No'), - 'size': 'mini', + 'size': 'small', }; var RoleCustomSwitchControl = Backform.SwitchControl.extend({ diff --git a/web/pgadmin/browser/server_groups/servers/static/js/server.js b/web/pgadmin/browser/server_groups/servers/static/js/server.js index 540bebec..924dadc0 100644 --- a/web/pgadmin/browser/server_groups/servers/static/js/server.js +++ b/web/pgadmin/browser/server_groups/servers/static/js/server.js @@ -936,7 +936,7 @@ define('pgadmin.node.server', [ id: 'tunnel_authentication', label: gettext('Authentication'), type: 'switch', mode: ['properties', 'edit', 'create'], group: gettext('SSH Tunnel'), 'options': {'onText': gettext('Identity file'), - 'offText': gettext('Password'), 'size': 'small'}, + 'offText': gettext('Password'), 'size': '', width: '110'}, deps: ['use_ssh_tunnel'], disabled: function(model) { return !model.get('use_ssh_tunnel'); diff --git a/web/pgadmin/misc/statistics/static/js/statistics.js b/web/pgadmin/misc/statistics/static/js/statistics.js index cfd573e1..95a4cd80 100644 --- a/web/pgadmin/misc/statistics/static/js/statistics.js +++ b/web/pgadmin/misc/statistics/static/js/statistics.js @@ -104,7 +104,9 @@ define('misc.statistics', [ offText: gettext('False'), onColor: 'success', offColor: 'primary', - size: 'mini', + size: 'small', + width: null, + height: null, } ); diff --git a/web/pgadmin/preferences/static/js/preferences.js b/web/pgadmin/preferences/static/js/preferences.js index 33b7e747..2324e5af 100644 --- a/web/pgadmin/preferences/static/js/preferences.js +++ b/web/pgadmin/preferences/static/js/preferences.js @@ -214,8 +214,8 @@ define('pgadmin.preferences', [ onText: gettext('True'), offText: gettext('False'), onColor: 'success', - offColor: 'default', - size: 'mini', + offColor: 'primary', + size: 'small', }; return 'switch'; case 'node': @@ -223,8 +223,8 @@ define('pgadmin.preferences', [ onText: gettext('Show'), offText: gettext('Hide'), onColor: 'success', - offColor: 'default', - size: 'mini', + offColor: 'primary', + size: 'small', }; return 'switch'; case 'integer': diff --git a/web/pgadmin/static/css/style.css b/web/pgadmin/static/css/style.css index aeb0354a..e7293d47 100644 --- a/web/pgadmin/static/css/style.css +++ b/web/pgadmin/static/css/style.css @@ -3,7 +3,7 @@ @import '~font-awesome/css/font-awesome.css'; @import '~bootstrap-datepicker/dist/css/bootstrap-datepicker3.css'; @import '~tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.css'; -@import '~bootstrap-switch/dist/css/bootstrap3/bootstrap-switch.css'; +@import '~bootstrap4-toggle/css/bootstrap4-toggle.css'; @import '~backgrid-select-all/backgrid-select-all.css'; @import '~backgrid-filter/backgrid-filter.css'; @import '~backgrid-sizeable-columns/backgrid-sizeable-columns.css'; diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js index 246b30b7..ea3c4664 100644 --- a/web/pgadmin/static/js/backform.pgadmin.js +++ b/web/pgadmin/static/js/backform.pgadmin.js @@ -10,7 +10,7 @@ define([ 'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'backbone', 'backform', 'backgrid', 'codemirror', 'sources/sqleditor_utils', - 'spectrum', 'pgadmin.backgrid', 'select2', + 'spectrum', 'pgadmin.backgrid', 'select2', 'bootstrap.toggle', ], function(gettext, _, S, $, Backbone, Backform, Backgrid, CodeMirror, SqlEditorUtils) { var pgAdmin = (window.pgAdmin = window.pgAdmin || {}), @@ -430,6 +430,8 @@ define([ onColor: 'success', offColor: 'primary', size: 'small', + width: null, + height: null, }, controlLabelClassName: Backform.controlLabelClassName, controlsClassName: Backform.controlsClassName, @@ -440,9 +442,11 @@ define([ '', '
', '
', - ' ', + ' <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%> />', '
', ' <% if (helpMessage && helpMessage.length) { %>', ' <%=helpMessage%>', @@ -456,7 +460,7 @@ define([ ); }, events: { - 'switchChange.bootstrapSwitch': 'onChange', + 'change input#bootstrapToggle': 'onChange', }, render: function() { var field = _.defaults(this.field.toJSON(), this.defaults), @@ -465,23 +469,49 @@ define([ name = attrArr.shift(), path = attrArr.join('.'), rawValue = this.keyPathAccessor(attributes[name], path), - evalF = function(f, d, m) { - return (_.isFunction(f) ? !!f.apply(d, [m]) : !!f); + data = _.extend(field, { + rawValue: rawValue, + value: this.formatter.fromRaw(rawValue, this.model), + attributes: attributes, + formatter: this.formatter, + }), + evalF = function(f, m) { + return (_.isFunction(f) ? !!f(m) : !!f); }, - options = _.defaults({ - disabled: evalF(field.disabled, field, this.model), - }, this.field.get('options'), this.defaults.options, - $.fn.bootstrapSwitch.defaults); + evalFLocal = function(f, d, m) { + return (_.isFunction(f) ? !!f.apply(d, [m]) : !!f); + }; - Backform.InputControl.prototype.render.apply(this, arguments); - this.$input = this.$el.find('input[type=checkbox]').first(); + // Evaluate the disabled, visible, and required option + _.extend(data, { + disabled: evalFLocal(field.disabled, field, this.model), + visible: evalF(data.visible, this.model), + required: evalF(data.required, this.model), + }); - //Check & set additional properties - this.$input.bootstrapSwitch( - _.extend(options, { - 'state': rawValue, - }) - ); + // Clean up first + this.$el.removeClass(Backform.hiddenClassName); + + if (!data.visible) + this.$el.addClass(Backform.hiddenClassName); + + if(Backform.requiredInputClassName) { + this.$el.removeClass(Backform.requiredInputClassName); + } + + if (data.required) { + this.$el.addClass(Backform.requiredInputClassName); + } + + data.options = _.defaults({ + disabled: evalFLocal(field.disabled, field, this.model), + }, this.field.get('options'), this.defaults.options, + $.fn.bootstrapToggle.defaults); + + this.$el.html(this.template(data)).addClass(field.name); + this.$input = this.$el.find('input[type=checkbox]').first(); + this.$input.bootstrapToggle(); + this.updateInvalid(); return this; }, diff --git a/web/pgadmin/static/js/backgrid.pgadmin.js b/web/pgadmin/static/js/backgrid.pgadmin.js index 2832b5ac..cdb8b0f9 100644 --- a/web/pgadmin/static/js/backgrid.pgadmin.js +++ b/web/pgadmin/static/js/backgrid.pgadmin.js @@ -9,7 +9,8 @@ define([ 'sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', 'backgrid', 'alertify', - 'moment', 'bignumber', 'bootstrap.datetimepicker', 'bootstrap.switch', 'backgrid.filter', + 'moment', 'bignumber', 'bootstrap.datetimepicker', 'backgrid.filter', + 'bootstrap.toggle', ], function( gettext, _, $, Backbone, Backform, Backgrid, Alertify, moment, BigNumber ) { @@ -451,18 +452,20 @@ define([ /** SwitchCell renders a Bootstrap Switch in backgrid cell */ - if (window.jQuery && window.jQuery.fn.bootstrapSwitch) - $.fn.bootstrapSwitch = window.jQuery.fn.bootstrapSwitch; + if (window.jQuery && window.jQuery.fn.bootstrapToggle) + $.fn.bootstrapToggle = window.jQuery.fn.bootstrapToggle; Backgrid.Extension.SwitchCell = Backgrid.BooleanCell.extend({ defaults: { options: _.defaults({ - onText: gettext('True'), - offText: gettext('False'), + onText: gettext('Yes'), + offText: gettext('No'), onColor: 'success', - offColor: 'default', - size: 'mini', - }, $.fn.bootstrapSwitch.defaults), + offColor: 'primary', + size: 'small', + width: null, + height: null, + }, $.fn.bootstrapToggle.defaults), }, className: 'switch-cell', @@ -482,7 +485,7 @@ define([ }, events: { - 'switchChange.bootstrapSwitch': 'onChange', + 'change input#bootstrapToggle': 'onChange', }, onChange: function() { @@ -503,7 +506,8 @@ define([ rawValue = this.formatter.fromRaw( model.get(column.get('name')), model ), - editable = Backgrid.callByNeed(col.editable, column, model); + editable = Backgrid.callByNeed(col.editable, column, model), + options = _.defaults({}, col.options, this.defaults.options); this.undelegateEvents(); @@ -513,17 +517,15 @@ define([ $('', { tabIndex: -1, type: 'checkbox', - }).prop('checked', rawValue).prop('disabled', !editable)); + id: 'bootstrapToggle', + }).prop('checked', rawValue).prop('disabled', !editable).attr('data-toggle', 'toggle') + .attr('data-size', options.size).attr('data-on', options.onText).attr('data-off', options.offText) + .attr('data-onstyle', options.onColor).attr('data-offstyle', options.offColor)); + this.$input = this.$el.find('input[type=checkbox]').first(); // Override BooleanCell checkbox with Bootstrapswitch - this.$input.bootstrapSwitch( - _.defaults({ - 'state': rawValue, - 'disabled': !editable, - }, col.options, - this.defaults.options - )); + this.$input.bootstrapToggle(); // Listen for Tab key this.$el.on('keydown', function(e) { diff --git a/web/pgadmin/static/scss/_bootstrap.overrides.scss b/web/pgadmin/static/scss/_bootstrap.overrides.scss index febe7ad7..224c597f 100644 --- a/web/pgadmin/static/scss/_bootstrap.overrides.scss +++ b/web/pgadmin/static/scss/_bootstrap.overrides.scss @@ -228,30 +228,13 @@ legend { font-size: 13px; } - -/* Remove default left padding from checkbox for bootstrap-switch */ -.checkbox { - margin-bottom: 0px !important; - margin-top: 0px !important; -} -.checkbox label { - padding-left: 0px !important; - margin-bottom: 0px !important; -} -.bootstrap-switch > .bootstrap-switch-container > input { - border: 0px solid $color-fg; - height: 0px; - margin: 0px; - padding: 0px; - width: 0px; -} .switch-cell { height: 0px; width: 0px; } /* Center align the switch in backgrid */ -td.switch-cell > div.bootstrap-switch { +td.switch-cell > div.toggle { display: block; margin: auto; } @@ -308,13 +291,6 @@ td.switch-cell > div.bootstrap-switch { line-height: 0.7rem; } - -.bootstrap-switch.bootstrap-switch-disabled, .bootstrap-switch.bootstrap-switch-readonly { - background-color: $input-disabled-bg !important; - opacity: 1; -} - - .btn-toolbar { min-width: 100%; } @@ -329,10 +305,6 @@ td.switch-cell > div.bootstrap-switch { } } -/* bootstrap-switch */ -.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary { - background: $color-primary; -} -.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success { - background: $color-success; +.btn.disabled, .btn:disabled, .btn[disabled] { + opacity: $btn-disabled-opacity; } diff --git a/web/pgadmin/tools/backup/static/js/backup.js b/web/pgadmin/tools/backup/static/js/backup.js index 70e8a68b..535a765c 100644 --- a/web/pgadmin/tools/backup/static/js/backup.js +++ b/web/pgadmin/tools/backup/static/js/backup.js @@ -44,21 +44,6 @@ define([ */ Backform.CustomSwitchControl = Backform.SwitchControl.extend({ - template: _.template([ - '', - '
', - '
', - ' ', - '
', - '
', - '<% if (helpMessage && helpMessage.length) { %>', - ' <%=helpMessage%>', - '<% } %>', - ].join('\n')), className: 'pgadmin-control-group form-group pg-el-md-6 pg-el-12 row', }); diff --git a/web/pgadmin/tools/maintenance/static/js/maintenance.js b/web/pgadmin/tools/maintenance/static/js/maintenance.js index f8d88908..591bf880 100644 --- a/web/pgadmin/tools/maintenance/static/js/maintenance.js +++ b/web/pgadmin/tools/maintenance/static/js/maintenance.js @@ -30,19 +30,6 @@ define([ return pgAdmin.Tools.maintenance; Backform.CustomSwitchControl = Backform.SwitchControl.extend({ - template: _.template([ - '', - '
', - '
', - ' ', - '
', - '
', - '<% if (helpMessage && helpMessage.length) { %>', - ' <%=helpMessage%>', - '<% } %>', - ].join('\n')), className: 'pgadmin-control-group form-group pg-el-md-6 pg-el-12 row', }); diff --git a/web/pgadmin/tools/restore/static/js/restore.js b/web/pgadmin/tools/restore/static/js/restore.js index 1f249abf..6c79476d 100644 --- a/web/pgadmin/tools/restore/static/js/restore.js +++ b/web/pgadmin/tools/restore/static/js/restore.js @@ -25,19 +25,6 @@ commonUtils, menuUtils, supportedNodes, restoreDialog } Backform.CustomSwitchControl = Backform.SwitchControl.extend({ - template: _.template([ - '', - '
', - '
', - ' ', - '
', - '
', - '<% if (helpMessage && helpMessage.length) { %>', - ' <%=helpMessage%>', - '<% } %>', - ].join('\n')), className: 'pgadmin-control-group form-group pg-el-md-6 row', }); diff --git a/web/webpack.shim.js b/web/webpack.shim.js index db45166f..be244949 100644 --- a/web/webpack.shim.js +++ b/web/webpack.shim.js @@ -37,9 +37,9 @@ var webpackShimConfig = { 'deps': ['moment'], 'exports': 'jQuery.fn.datetimepicker', }, - 'bootstrap.switch': { + 'bootstrap.toggle': { deps: ['jquery', 'bootstrap'], - 'exports': '$.fn.bootstrapSwitch', + 'exports': '$.fn.bootstrapToggle', }, 'backbone': { exports: 'Backbone', // Once loaded, use the global 'Backbone' as the module value. @@ -53,10 +53,10 @@ var webpackShimConfig = { 'exports': 'Backgrid', }, 'pgadmin.backform': { - 'deps': ['backform', 'pgadmin.backgrid', 'select2'], + 'deps': ['backform', 'pgadmin.backgrid', 'select2', 'bootstrap.toggle'], }, 'pgadmin.backgrid': { - 'deps': ['backgrid', 'bootstrap.datetimepicker', 'bootstrap.switch'], + 'deps': ['backgrid', 'bootstrap.datetimepicker', 'bootstrap.toggle'], }, 'backgrid.select.all': { @@ -172,7 +172,7 @@ var webpackShimConfig = { 'backform': path.join(__dirname, './pgadmin/static/vendor/backform/backform'), 'backgrid': path.join(__dirname, './node_modules/backgrid/lib/backgrid'), 'bootstrap.datetimepicker': path.join(__dirname, './node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min'), - 'bootstrap.switch': path.join(__dirname, './node_modules/bootstrap-switch/dist/js/bootstrap-switch'), + 'bootstrap.toggle': path.join(__dirname, './node_modules/bootstrap4-toggle/js/bootstrap4-toggle'), 'select2': path.join(__dirname, './node_modules/select2/dist/js/select2.full'), 'backgrid.filter': path.join(__dirname, './node_modules/backgrid-filter/backgrid-filter'), 'backgrid.sizeable.columns': path.join(__dirname, './node_modules/backgrid-sizeable-columns/backgrid-sizeable-columns'), diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js index 6cce766c..b65e924a 100644 --- a/web/webpack.test.config.js +++ b/web/webpack.test.config.js @@ -77,7 +77,7 @@ module.exports = { 'spectrum': path.join(__dirname, './node_modules/spectrum-colorpicker/spectrum'), 'bignumber': path.join(__dirname, './node_modules/bignumber.js/bignumber'), 'bootstrap.datetimepicker': path.join(__dirname, './node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min'), - 'bootstrap.switch': path.join(__dirname, './node_modules/bootstrap-switch/dist/js/bootstrap-switch'), + 'bootstrap.toggle': path.join(__dirname, './node_modules/bootstrap4-toggle/js/bootstrap4-toggle'), 'backbone': path.join(__dirname, './node_modules/backbone/backbone'), 'backform': path.join(__dirname, './node_modules/backform/src/backform'), 'backgrid': path.join(__dirname, './node_modules/backgrid/lib/backgrid'),