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'),