mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
1) Added labels and titles after parsing and validating all the pgAdmin4 web pages for accessibility. Fixes #4770
2) Fixed an issue where Save Password control disappears after clicking on it while creating a server. Fixes #5116
This commit is contained in:
committed by
Akshay Joshi
parent
0da23b837d
commit
210bbfdbe1
@@ -13,6 +13,9 @@ New features
|
|||||||
| `Issue #3452 <https://redmine.postgresql.org/issues/3452>`_ - Added a Schema Diff tool to compare two schemas and generate a diff script.
|
| `Issue #3452 <https://redmine.postgresql.org/issues/3452>`_ - Added a Schema Diff tool to compare two schemas and generate a diff script.
|
||||||
| `Issue #4762 <https://redmine.postgresql.org/issues/4762>`_ - Allow screen-reader to read label & description of non-textable elements.
|
| `Issue #4762 <https://redmine.postgresql.org/issues/4762>`_ - Allow screen-reader to read label & description of non-textable elements.
|
||||||
| `Issue #4763 <https://redmine.postgresql.org/issues/4763>`_ - Allow screen-reader to identify the alert errors.
|
| `Issue #4763 <https://redmine.postgresql.org/issues/4763>`_ - Allow screen-reader to identify the alert errors.
|
||||||
|
| `Issue #4770 <https://redmine.postgresql.org/issues/4770>`_ - Added labels and titles after parsing and validating all the pgAdmin4 web pages for accessibility.
|
||||||
|
| `Issue #4993 <https://redmine.postgresql.org/issues/4993>`_ - Set input controls as read-only instead of disabled will allow tab navigation in the properties tab and also allow screen readers to read it.
|
||||||
|
|
||||||
|
|
||||||
Housekeeping
|
Housekeeping
|
||||||
************
|
************
|
||||||
@@ -30,11 +33,11 @@ Bug fixes
|
|||||||
| `Issue #4410 <https://redmine.postgresql.org/issues/4410>`_ - Fixed an issue while editing char[] or character varying[] column from View/Edit data throwing an error.
|
| `Issue #4410 <https://redmine.postgresql.org/issues/4410>`_ - Fixed an issue while editing char[] or character varying[] column from View/Edit data throwing an error.
|
||||||
| `Issue #4511 <https://redmine.postgresql.org/issues/4511>`_ - Fixed an issue where Grant wizard unable to handle multiple objects when the query string parameter exceeds its limit.
|
| `Issue #4511 <https://redmine.postgresql.org/issues/4511>`_ - Fixed an issue where Grant wizard unable to handle multiple objects when the query string parameter exceeds its limit.
|
||||||
| `Issue #4827 <https://redmine.postgresql.org/issues/4827>`_ - Fix column resizable issue in the file explorer dialog.
|
| `Issue #4827 <https://redmine.postgresql.org/issues/4827>`_ - Fix column resizable issue in the file explorer dialog.
|
||||||
| `Issue #4993 <https://redmine.postgresql.org/issues/4993>`_ - Set input controls as read-only instead of disabled will allow tab navigation in the properties tab and also allow screen readers to read it.
|
|
||||||
| `Issue #5000 <https://redmine.postgresql.org/issues/5000>`_ - Logout the pgAdmin session when no user activity of mouse move, click or keypress.
|
| `Issue #5000 <https://redmine.postgresql.org/issues/5000>`_ - Logout the pgAdmin session when no user activity of mouse move, click or keypress.
|
||||||
| `Issue #5025 <https://redmine.postgresql.org/issues/5025>`_ - Fix an issue where setting STORAGE_DIR to empty should show all the volumes on Windows in server mode.
|
| `Issue #5025 <https://redmine.postgresql.org/issues/5025>`_ - Fix an issue where setting STORAGE_DIR to empty should show all the volumes on Windows in server mode.
|
||||||
| `Issue #5065 <https://redmine.postgresql.org/issues/5065>`_ - Updated the incorrect icon used for the cast node on refresh.
|
| `Issue #5065 <https://redmine.postgresql.org/issues/5065>`_ - Updated the incorrect icon used for the cast node on refresh.
|
||||||
| `Issue #5066 <https://redmine.postgresql.org/issues/5066>`_ - Fix an issue where refreshing a package results in the change in the object completely.
|
| `Issue #5066 <https://redmine.postgresql.org/issues/5066>`_ - Fix an issue where refreshing a package results in the change in the object completely.
|
||||||
| `Issue #5074 <https://redmine.postgresql.org/issues/5074>`_ - Fix an issue where select, insert and update scripts on tables throwing an error.
|
| `Issue #5074 <https://redmine.postgresql.org/issues/5074>`_ - Fix an issue where select, insert and update scripts on tables throwing an error.
|
||||||
| `Issue #5076 <https://redmine.postgresql.org/issues/5076>`_ - Ensure Postfix starts in the container, now it runs as non-root by default.
|
| `Issue #5076 <https://redmine.postgresql.org/issues/5076>`_ - Ensure Postfix starts in the container, now it runs as non-root by default.
|
||||||
| `Issue #5107 <https://redmine.postgresql.org/issues/5107>`_ - Set proper focus on tab navigation for file manager dialog.
|
| `Issue #5107 <https://redmine.postgresql.org/issues/5107>`_ - Set proper focus on tab navigation for file manager dialog.
|
||||||
|
| `Issue #5116 <https://redmine.postgresql.org/issues/5116>`_ - Fixed an issue where Save Password control disappears after clicking on it while creating a server.
|
||||||
@@ -71,7 +71,7 @@ define('pgadmin.node.schema', [
|
|||||||
|
|
||||||
var gridHeader = _.template([
|
var gridHeader = _.template([
|
||||||
'<div class="subnode-header">',
|
'<div class="subnode-header">',
|
||||||
' <label class="control-label col-sm-4"><%-label%></label>',
|
' <span class="control-label col-sm-4"><%-label%></span>',
|
||||||
'</div>'].join('\n')),
|
'</div>'].join('\n')),
|
||||||
gridBody = $('<div class="pgadmin-control-group backgrid form-group col-12 object subnode"></div>').append(
|
gridBody = $('<div class="pgadmin-control-group backgrid form-group col-12 object subnode"></div>').append(
|
||||||
gridHeader(attributes)
|
gridHeader(attributes)
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ define('pgadmin.node.role', [
|
|||||||
template: _.template([
|
template: _.template([
|
||||||
'<label class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
|
'<label class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
|
||||||
'<div class="<%=Backform.controlsClassName%>">',
|
'<div class="<%=Backform.controlsClassName%>">',
|
||||||
' <select multiple="multiple" style="width:100%;" class="pgadmin-controls <%=extraClasses.join(\' \')%>" name="<%=name%>" value="<%-JSON.stringify(value)%>" <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%>>',
|
' <select title = <%=label%> multiple="multiple" style="width:100%;" class="pgadmin-controls <%=extraClasses.join(\' \')%>" name="<%=name%>" value="<%-JSON.stringify(value)%>" <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%>>',
|
||||||
' <% for (var i=0; i < options.length; i++) { %>',
|
' <% for (var i=0; i < options.length; i++) { %>',
|
||||||
' <% var option = options[i]; %>',
|
' <% var option = options[i]; %>',
|
||||||
' <option value=<%-option.value%> data-icon=<%-option.image%> <%=value != null && _.indexOf(value, option.value) != -1 ? "selected" : ""%> <%=option.disabled ? "disabled=\'disabled\'" : ""%>><%-option.label%></option>',
|
' <option value=<%-option.value%> data-icon=<%-option.image%> <%=value != null && _.indexOf(value, option.value) != -1 ? "selected" : ""%> <%=option.disabled ? "disabled=\'disabled\'" : ""%>><%-option.label%></option>',
|
||||||
|
|||||||
@@ -337,8 +337,8 @@ function(gettext, _, $, Backbone, Backform, Backgrid, Alertify, pgAdmin, pgNode)
|
|||||||
var self = this,
|
var self = this,
|
||||||
titleTmpl = _.template([
|
titleTmpl = _.template([
|
||||||
'<div class=\'subnode-header\'>',
|
'<div class=\'subnode-header\'>',
|
||||||
'<label class=\'control-label\'><%-label%></label>',
|
'<span class=\'control-label\'><%-label%></span>',
|
||||||
'<button class=\'btn btn-sm-sq btn-secondary add fa fa-plus\' title=\'' + _('Add new row') + '\' <%=canAdd ? \'\' : \'disabled="disabled"\'%>></button>',
|
'<button class=\'btn btn-sm-sq btn-secondary add fa fa-plus\' title=\'' + _('Add new row') + '\' <%=canAdd ? \'\' : \'disabled="disabled"\'%>><span class="sr-only">Add new row</span></button>',
|
||||||
'</div>'].join('\n')),
|
'</div>'].join('\n')),
|
||||||
$gridBody =
|
$gridBody =
|
||||||
$('<div class=\'pgadmin-control-group backgrid form-group col-12 object subnode\'></div>').append(
|
$('<div class=\'pgadmin-control-group backgrid form-group col-12 object subnode\'></div>').append(
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ define('pgadmin.browser', [
|
|||||||
width: 500,
|
width: 500,
|
||||||
isCloseable: false,
|
isCloseable: false,
|
||||||
isPrivate: true,
|
isPrivate: true,
|
||||||
content: '<div class="sql_textarea"><textarea id="sql-textarea" name="sql-textarea" title="'+gettext('SQL Code')+'"></textarea></div>',
|
content: '<label for="sql-textarea" class="sr-only">SQL Code</label><div class="sql_textarea"><textarea id="sql-textarea" name="sql-textarea" title="'+gettext('SQL Code')+'"></textarea></div>',
|
||||||
}),
|
}),
|
||||||
// Dependencies of the object
|
// Dependencies of the object
|
||||||
'dependencies': new pgAdmin.Browser.Panel({
|
'dependencies': new pgAdmin.Browser.Panel({
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ define([
|
|||||||
'<button tabindex="0" type="<%= type %>" ',
|
'<button tabindex="0" type="<%= type %>" ',
|
||||||
'class="btn <%=extraClasses.join(\' \')%>"',
|
'class="btn <%=extraClasses.join(\' \')%>"',
|
||||||
'<% if (disabled) { %> disabled="disabled"<% } %> title="<%-tooltip%>">',
|
'<% if (disabled) { %> disabled="disabled"<% } %> title="<%-tooltip%>">',
|
||||||
'<span class="<%= icon %>" role="img"></span><% if (label != "") { %> <%-label%><% } %></button>',
|
'<span class="<%= icon %>" role="img"></span><% if (label != "") { %> <%-label%><% } %><span class="sr-only"><%-tooltip%></span></button>',
|
||||||
].join(' '));
|
].join(' '));
|
||||||
if (location == 'header') {
|
if (location == 'header') {
|
||||||
btnGroup.appendTo(that.header);
|
btnGroup.appendTo(that.header);
|
||||||
@@ -165,9 +165,9 @@ define([
|
|||||||
|
|
||||||
// canDrop can be set to false for individual row from the server side to disable the checkbox
|
// canDrop can be set to false for individual row from the server side to disable the checkbox
|
||||||
if ('canDrop' in model && model.canDrop === false)
|
if ('canDrop' in model && model.canDrop === false)
|
||||||
this.$el.empty().append('<input tabindex="-1" type="checkbox" disabled="disabled"/>');
|
this.$el.empty().append('<input tabindex="-1" type="checkbox" title="Select" disabled="disabled"/>');
|
||||||
else
|
else
|
||||||
this.$el.empty().append('<input tabindex="-1" type="checkbox" />');
|
this.$el.empty().append('<input tabindex="-1" type="checkbox" title="Select" />');
|
||||||
|
|
||||||
this.delegateEvents();
|
this.delegateEvents();
|
||||||
return this;
|
return this;
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ define([
|
|||||||
pgAdmin.Browser.MenuGroup = function(opts, items, prev, ctx) {
|
pgAdmin.Browser.MenuGroup = function(opts, items, prev, ctx) {
|
||||||
var template = _.template([
|
var template = _.template([
|
||||||
'<% if (above) { %><li class="dropdown-divider"></li><% } %>',
|
'<% if (above) { %><li class="dropdown-divider"></li><% } %>',
|
||||||
'<li class="dropdown-submenu">',
|
'<li class="dropdown-submenu" role="menuitem">',
|
||||||
' <a href="#" class="dropdown-item">',
|
' <a href="#" class="dropdown-item">',
|
||||||
' <% if (icon) { %><i class="<%= icon %>"></i><% } %>',
|
' <% if (icon) { %><i class="<%= icon %>"></i><% } %>',
|
||||||
' <span><%= label %></span>',
|
' <span><%= label %></span>',
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
@import '~bootstrap-datepicker/dist/css/bootstrap-datepicker3.css';
|
@import '~bootstrap-datepicker/dist/css/bootstrap-datepicker3.css';
|
||||||
@import '~tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.css';
|
@import '~tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.css';
|
||||||
@import '~bootstrap4-toggle/css/bootstrap4-toggle.css';
|
@import '~bootstrap4-toggle/css/bootstrap4-toggle.css';
|
||||||
@import '~backgrid-select-all/backgrid-select-all.css';
|
|
||||||
@import '~backgrid-filter/backgrid-filter.css';
|
@import '~backgrid-filter/backgrid-filter.css';
|
||||||
@import '~slickgrid/css/select2.css';
|
@import '~slickgrid/css/select2.css';
|
||||||
@import '~jquery-contextmenu/dist/jquery.contextMenu.css';
|
@import '~jquery-contextmenu/dist/jquery.contextMenu.css';
|
||||||
@@ -22,3 +21,4 @@
|
|||||||
@import '~slickgrid/css/smoothness/jquery-ui-1.11.3.custom.css';
|
@import '~slickgrid/css/smoothness/jquery-ui-1.11.3.custom.css';
|
||||||
|
|
||||||
@import '../vendor/backgrid/backgrid.css';
|
@import '../vendor/backgrid/backgrid.css';
|
||||||
|
@import '../vendor/backgrid/backgrid-select-all.css';
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ define([
|
|||||||
template: _.template([
|
template: _.template([
|
||||||
'<label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
|
'<label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
|
||||||
'<div class="<%=Backform.controlsClassName%>">',
|
'<div class="<%=Backform.controlsClassName%>">',
|
||||||
' <input class="<%=Backform.controlClassName%> uneditable-input" <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly aria-readonly=true" : ""%> id="<%=cId%>" value="<%-value%>" />',
|
' <input id="<%=cId%>" class="<%=Backform.controlClassName%> uneditable-input" <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly aria-readonly=true" : ""%> id="<%=cId%>" value="<%-value%>" />',
|
||||||
' <% if (helpMessage && helpMessage.length) { %>',
|
' <% if (helpMessage && helpMessage.length) { %>',
|
||||||
' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
|
' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
|
||||||
' <% } %>',
|
' <% } %>',
|
||||||
@@ -551,7 +551,7 @@ define([
|
|||||||
extraToggleClasses: null,
|
extraToggleClasses: null,
|
||||||
},
|
},
|
||||||
template: _.template([
|
template: _.template([
|
||||||
'<label class="<%=controlLabelClassName%>"><%=label%></label>',
|
'<span class="<%=controlLabelClassName%>"><%=label%></span>',
|
||||||
'<label class="sr-value sr-only" for="<%=cId%>"></label>',
|
'<label class="sr-value sr-only" for="<%=cId%>"></label>',
|
||||||
'<div class="<%=controlsClassName%> <%=extraClasses.join(\' \')%>">',
|
'<div class="<%=controlsClassName%> <%=extraClasses.join(\' \')%>">',
|
||||||
' <input tabindex="-1" type="checkbox" aria-hidden="true" aria-label="Toggle button" data-style="quick" data-toggle="toggle"',
|
' <input tabindex="-1" type="checkbox" aria-hidden="true" aria-label="Toggle button" data-style="quick" data-toggle="toggle"',
|
||||||
@@ -1265,7 +1265,7 @@ define([
|
|||||||
var self = this,
|
var self = this,
|
||||||
gridHeader = _.template([
|
gridHeader = _.template([
|
||||||
'<div class="subnode-header">',
|
'<div class="subnode-header">',
|
||||||
' <label class="control-label pg-el-sm-10" id="<%=cId%>"><%-label%></label>',
|
' <span class="control-label pg-el-sm-10" id="<%=cId%>"><%-label%></span>',
|
||||||
' <button aria-label="' + _('Add new row') + '" class="btn btn-sm-sq btn-secondary add fa fa-plus" <%=canAdd ? "" : "disabled=\'disabled\'"%> title="' + _('Add new row') + '"><%-add_label%></button>',
|
' <button aria-label="' + _('Add new row') + '" class="btn btn-sm-sq btn-secondary add fa fa-plus" <%=canAdd ? "" : "disabled=\'disabled\'"%> title="' + _('Add new row') + '"><%-add_label%></button>',
|
||||||
'</div>',
|
'</div>',
|
||||||
].join('\n')),
|
].join('\n')),
|
||||||
@@ -1726,8 +1726,9 @@ define([
|
|||||||
helpMessage: null,
|
helpMessage: null,
|
||||||
},
|
},
|
||||||
template: _.template([
|
template: _.template([
|
||||||
|
'<label for="<%=cId%>" class="sr-only"><%=(label==""?"SQL":label)%></label>',
|
||||||
'<div class="<%=controlsClassName%>">',
|
'<div class="<%=controlsClassName%>">',
|
||||||
' <textarea class="<%=Backform.controlClassName%> <%=extraClasses.join(\' \')%>" name="<%=name%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly aria-readonly=true" : ""%> <%=required ? "required" : ""%>><%-value%></textarea>',
|
' <textarea id="<%=cId%>" class="<%=Backform.controlClassName%> <%=extraClasses.join(\' \')%>" name="<%=name%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly aria-readonly=true" : ""%> <%=required ? "required" : ""%>><%-value%></textarea>',
|
||||||
' <% if (helpMessage && helpMessage.length) { %>',
|
' <% if (helpMessage && helpMessage.length) { %>',
|
||||||
' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
|
' <span class="<%=Backform.helpMessageClassName%>"><%=helpMessage%></span>',
|
||||||
' <% } %>',
|
' <% } %>',
|
||||||
@@ -2140,7 +2141,7 @@ define([
|
|||||||
' <label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
|
' <label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
|
||||||
'<% }%>',
|
'<% }%>',
|
||||||
'<div class="<%=Backform.controlsClassName%>">',
|
'<div class="<%=Backform.controlsClassName%>">',
|
||||||
' <select id="<%=cId%>" class="<%=Backform.controlClassName%> <%=extraClasses.join(\' \')%>"',
|
' <select title="<%=name%>" id="<%=cId%>" class="<%=Backform.controlClassName%> <%=extraClasses.join(\' \')%>"',
|
||||||
' name="<%=name%>" value="<%-value%>" <%=disabled ? "disabled" : ""%> <%=readonly ? "disabled" : ""%>',
|
' name="<%=name%>" value="<%-value%>" <%=disabled ? "disabled" : ""%> <%=readonly ? "disabled" : ""%>',
|
||||||
' <%=required ? "required" : ""%><%= select2.multiple ? " multiple>" : ">" %>',
|
' <%=required ? "required" : ""%><%= select2.multiple ? " multiple>" : ">" %>',
|
||||||
' <%=select2.first_empty ? " <option></option>" : ""%>',
|
' <%=select2.first_empty ? " <option></option>" : ""%>',
|
||||||
@@ -2437,9 +2438,9 @@ define([
|
|||||||
|
|
||||||
// Customize template to add new styles
|
// Customize template to add new styles
|
||||||
template: _.template([
|
template: _.template([
|
||||||
'<label class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
|
'<label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=label%></label>',
|
||||||
'<div class="<%=Backform.controlsClassName%> sql_field_layout <%=extraClasses.join(\' \')%>">',
|
'<div class="<%=Backform.controlsClassName%> sql_field_layout <%=extraClasses.join(\' \')%>">',
|
||||||
' <textarea ',
|
' <textarea id="<%=cId%>"',
|
||||||
' class="<%=Backform.controlClassName%> " name="<%=name%>"',
|
' class="<%=Backform.controlClassName%> " name="<%=name%>"',
|
||||||
' maxlength="<%=maxlength%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly aria-readonly=true" : ""%>',
|
' maxlength="<%=maxlength%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly aria-readonly=true" : ""%>',
|
||||||
' rows=<%=rows%>',
|
' rows=<%=rows%>',
|
||||||
@@ -2523,6 +2524,7 @@ define([
|
|||||||
return (_.isFunction(f) ? !!f.apply(d, [m]) : !!f);
|
return (_.isFunction(f) ? !!f.apply(d, [m]) : !!f);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
data.cId = data.cId || _.uniqueId('pgC_');
|
||||||
// Evaluate the disabled, visible option
|
// Evaluate the disabled, visible option
|
||||||
var isDisabled = evalF(data.disabled, data, this.model),
|
var isDisabled = evalF(data.disabled, data, this.model),
|
||||||
isVisible = evalF(data.visible, data, this.model),
|
isVisible = evalF(data.visible, data, this.model),
|
||||||
@@ -2616,8 +2618,9 @@ define([
|
|||||||
Backform.SqlCodeControl = Backform.SqlFieldControl.extend({
|
Backform.SqlCodeControl = Backform.SqlFieldControl.extend({
|
||||||
// Customize template to add new styles
|
// Customize template to add new styles
|
||||||
template: _.template([
|
template: _.template([
|
||||||
|
'<label class="sr-only" for="<%=cId%>"><%=(label==""?"Code":label)%></label>',
|
||||||
'<div class="pgadmin-controls pg-el-12 <%=extraClasses.join(\' \')%>">',
|
'<div class="pgadmin-controls pg-el-12 <%=extraClasses.join(\' \')%>">',
|
||||||
' <textarea ',
|
' <textarea id="<%=cId%>" ',
|
||||||
' class="<%=Backform.controlClassName%> " name="<%=name%>"',
|
' class="<%=Backform.controlClassName%> " name="<%=name%>"',
|
||||||
' maxlength="<%=maxlength%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly aria-readonly=true" : ""%> ',
|
' maxlength="<%=maxlength%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly aria-readonly=true" : ""%> ',
|
||||||
' rows=<%=rows%>',
|
' rows=<%=rows%>',
|
||||||
@@ -2797,9 +2800,9 @@ define([
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
template: _.template([
|
template: _.template([
|
||||||
'<label class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
|
'<label for="<%=cId%>" class="<%=Backform.controlLabelClassName%>"><%=label%></label>',
|
||||||
'<div class="input-group <%=Backform.controlsClassName%>">',
|
'<div class="input-group <%=Backform.controlsClassName%>">',
|
||||||
' <input type="text" class="<%=Backform.controlClassName%> datetimepicker-input <%=extraClasses.join(\' \')%>" name="<%=name%>" value="<%-value%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly aria-readonly=true" : ""%> <%=required ? "required" : ""%> data-toggle="datetimepicker"/>',
|
' <input id="<%=cId%>" type="text" class="<%=Backform.controlClassName%> datetimepicker-input <%=extraClasses.join(\' \')%>" name="<%=name%>" value="<%-value%>" placeholder="<%-placeholder%>" <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly aria-readonly=true" : ""%> <%=required ? "required" : ""%> data-toggle="datetimepicker"/>',
|
||||||
' <div class="input-group-append">',
|
' <div class="input-group-append">',
|
||||||
' <span class="input-group-text fa fa-calendar"></span>',
|
' <span class="input-group-text fa fa-calendar"></span>',
|
||||||
' </div>',
|
' </div>',
|
||||||
@@ -2834,6 +2837,9 @@ define([
|
|||||||
visible: evalF(data.visible, this.model),
|
visible: evalF(data.visible, this.model),
|
||||||
required: evalF(data.required, this.model),
|
required: evalF(data.required, this.model),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
data.cId = data.cId || _.uniqueId('pgC_');
|
||||||
|
|
||||||
if (!data.disabled) {
|
if (!data.disabled) {
|
||||||
data.placeholder = data.placeholder || this.defaults.placeholder;
|
data.placeholder = data.placeholder || this.defaults.placeholder;
|
||||||
}
|
}
|
||||||
@@ -3226,7 +3232,7 @@ define([
|
|||||||
'<label class="<%=Backform.controlLabelClassName%>"><%=controlLabel%></label>',
|
'<label class="<%=Backform.controlLabelClassName%>"><%=controlLabel%></label>',
|
||||||
'<div class="<%=Backform.controlContainerClassName%>">',
|
'<div class="<%=Backform.controlContainerClassName%>">',
|
||||||
' <button class="btn btn-secondary btn-checkbox">',
|
' <button class="btn btn-secondary btn-checkbox">',
|
||||||
' <input type="<%=type%>" class="<%=extraClasses.join(\' \')%>" id="<%=id%>" name="<%=name%>" <%=value ? "checked=\'checked\'" : ""%> <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%> />',
|
' <input type="<%=type%>" class="<%=extraClasses.join(\' \')%>" id="<%=cId%>" name="<%=name%>" <%=value ? "checked=\'checked\'" : ""%> <%=disabled ? "disabled" : ""%> <%=required ? "required" : ""%> />',
|
||||||
' <%=label%>',
|
' <%=label%>',
|
||||||
' </button>',
|
' </button>',
|
||||||
'</div>',
|
'</div>',
|
||||||
|
|||||||
10
web/pgadmin/static/vendor/backform/backform.js
vendored
10
web/pgadmin/static/vendor/backform/backform.js
vendored
@@ -547,12 +547,12 @@
|
|||||||
id: _.uniqueId('bf_')
|
id: _.uniqueId('bf_')
|
||||||
},
|
},
|
||||||
template: _.template([
|
template: _.template([
|
||||||
'<label class="<%=Backform.controlLabelClassName%>" for="<%=id%>"><%=controlLabel%></label>',
|
'<label class="<%=Backform.controlLabelClassName%>" for="<%=cId%>"><%=controlLabel%></label>',
|
||||||
'<div class="<%=Backform.controlContainerClassName%>">',
|
'<div class="<%=Backform.controlContainerClassName%>">',
|
||||||
' <div class="form-check">',
|
' <div class="form-check">',
|
||||||
' <input type="<%=type%>" class="form-check-input <%=extraClasses.join(\' \')%>" id="<%=id%>" name="<%=name%>" <%=value ? "checked=\'checked\'" : ""%> <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly" : ""%> <%=required ? "required" : ""%> />',
|
' <input type="<%=type%>" class="form-check-input <%=extraClasses.join(\' \')%>" id="<%=cId%>" name="<%=name%>" <%=value ? "checked=\'checked\'" : ""%> <%=disabled ? "disabled" : ""%> <%=readonly ? "readonly" : ""%> <%=required ? "required" : ""%> />',
|
||||||
' <% if (label && label.length) { %>',
|
' <% if (label && label.length) { %>',
|
||||||
' <label class="form-check-label" for="<%=id%>"><%=label%></label>',
|
' <label class="form-check-label" for="<%=cId%>"><%=label%></label>',
|
||||||
' <% } %>',
|
' <% } %>',
|
||||||
' </div>',
|
' </div>',
|
||||||
'</div>'
|
'</div>'
|
||||||
@@ -579,8 +579,8 @@
|
|||||||
' <% var option = options[i]; %>',
|
' <% var option = options[i]; %>',
|
||||||
' <% var id = _.uniqueId("bf_"); %>',
|
' <% var id = _.uniqueId("bf_"); %>',
|
||||||
' <div class="form-check">',
|
' <div class="form-check">',
|
||||||
' <input type="<%=type%>" class="<%=extraClasses.join(\' \')%>" id="<%=id%>" name="<%=name%>" value="<%-formatter.fromRaw(option.value)%>" <%=rawValue == option.value ? "checked=\'checked\'" : ""%> <%=disabled ? "disabled" : ""%> <%=readonly ? "disabled" : ""%> <%=required ? "required" : ""%> />',
|
' <input type="<%=type%>" class="<%=extraClasses.join(\' \')%>" id="<%=cId%>" name="<%=name%>" value="<%-formatter.fromRaw(option.value)%>" <%=rawValue == option.value ? "checked=\'checked\'" : ""%> <%=disabled ? "disabled" : ""%> <%=readonly ? "disabled" : ""%> <%=required ? "required" : ""%> />',
|
||||||
' <label class="form-check-label" for="<%=id%>"><%-option.label%></label>',
|
' <label class="form-check-label" for="<%=cId%>"><%-option.label%></label>',
|
||||||
' </div>',
|
' </div>',
|
||||||
' <% } %>',
|
' <% } %>',
|
||||||
' <% if (helpMessage && helpMessage.length) { %>',
|
' <% if (helpMessage && helpMessage.length) { %>',
|
||||||
|
|||||||
12
web/pgadmin/static/vendor/backgrid/backgrid-select-all.css
vendored
Normal file
12
web/pgadmin/static/vendor/backgrid/backgrid-select-all.css
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
backgrid-select-all
|
||||||
|
http://github.com/wyuenho/backgrid
|
||||||
|
|
||||||
|
Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
|
||||||
|
Licensed under the MIT @license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.backgrid .select-row-cell,
|
||||||
|
.backgrid .select-all-header-cell {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
296
web/pgadmin/static/vendor/backgrid/backgrid-select-all.js
vendored
Normal file
296
web/pgadmin/static/vendor/backgrid/backgrid-select-all.js
vendored
Normal file
@@ -0,0 +1,296 @@
|
|||||||
|
/*
|
||||||
|
backgrid-select-all
|
||||||
|
http://github.com/wyuenho/backgrid
|
||||||
|
|
||||||
|
Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
|
||||||
|
Licensed under the MIT @license.
|
||||||
|
*/
|
||||||
|
(function (root, factory) {
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
// AMD. Register as an anonymous module.
|
||||||
|
define(["backbone", "backgrid", "underscore"], factory);
|
||||||
|
} else if (typeof exports == "object") {
|
||||||
|
// CommonJS
|
||||||
|
module.exports = factory(require("backbone"), require("backgrid"), require("underscore"));
|
||||||
|
}
|
||||||
|
// Browser
|
||||||
|
else factory(root.Backbone, root.Backgrid, root._);
|
||||||
|
|
||||||
|
}(this, function (Backbone, Backgrid, _) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
/**
|
||||||
|
Renders a checkbox for row selection.
|
||||||
|
|
||||||
|
@class Backgrid.Extension.SelectRowCell
|
||||||
|
@extends Backbone.View
|
||||||
|
*/
|
||||||
|
var SelectRowCell = Backgrid.Extension.SelectRowCell = Backbone.View.extend({
|
||||||
|
|
||||||
|
/** @property */
|
||||||
|
className: "select-row-cell",
|
||||||
|
|
||||||
|
/** @property */
|
||||||
|
tagName: "td",
|
||||||
|
|
||||||
|
/** @property */
|
||||||
|
events: {
|
||||||
|
"keydown input[type=checkbox]": "onKeydown",
|
||||||
|
"change input[type=checkbox]": "onChange",
|
||||||
|
"click input[type=checkbox]": "enterEditMode"
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initializer. If the underlying model triggers a `select` event, this cell
|
||||||
|
will change its checked value according to the event's `selected` value.
|
||||||
|
|
||||||
|
@param {Object} options
|
||||||
|
@param {Backgrid.Column} options.column
|
||||||
|
@param {Backbone.Model} options.model
|
||||||
|
*/
|
||||||
|
initialize: function (options) {
|
||||||
|
|
||||||
|
this.column = options.column;
|
||||||
|
if (!(this.column instanceof Backgrid.Column)) {
|
||||||
|
this.column = new Backgrid.Column(this.column);
|
||||||
|
}
|
||||||
|
|
||||||
|
var column = this.column, model = this.model, $el = this.$el;
|
||||||
|
this.listenTo(column, "change:renderable", function (column, renderable) {
|
||||||
|
$el.toggleClass("renderable", renderable);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (Backgrid.callByNeed(column.renderable(), column, model)) $el.addClass("renderable");
|
||||||
|
|
||||||
|
this.listenTo(model, "backgrid:select", function (model, selected) {
|
||||||
|
this.checkbox().prop("checked", selected).change();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the checkbox.
|
||||||
|
*/
|
||||||
|
checkbox: function () {
|
||||||
|
return this.$el.find("input[type=checkbox]");
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
Focuses the checkbox.
|
||||||
|
*/
|
||||||
|
enterEditMode: function () {
|
||||||
|
this.checkbox().focus();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
Unfocuses the checkbox.
|
||||||
|
*/
|
||||||
|
exitEditMode: function () {
|
||||||
|
this.checkbox().blur();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
Process keyboard navigation.
|
||||||
|
*/
|
||||||
|
onKeydown: function (e) {
|
||||||
|
var command = new Backgrid.Command(e);
|
||||||
|
if (command.passThru()) return true; // skip ahead to `change`
|
||||||
|
if (command.cancel()) {
|
||||||
|
e.stopPropagation();
|
||||||
|
this.checkbox().blur();
|
||||||
|
}
|
||||||
|
else if (command.save() || command.moveLeft() || command.moveRight() ||
|
||||||
|
command.moveUp() || command.moveDown()) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
this.model.trigger("backgrid:edited", this.model, this.column, command);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
When the checkbox's value changes, this method will trigger a Backbone
|
||||||
|
`backgrid:selected` event with a reference of the model and the
|
||||||
|
checkbox's `checked` value.
|
||||||
|
*/
|
||||||
|
onChange: function () {
|
||||||
|
var checked = this.checkbox().prop("checked");
|
||||||
|
this.$el.parent().toggleClass("selected", checked);
|
||||||
|
this.model.trigger("backgrid:selected", this.model, checked);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
Renders a checkbox in a table cell.
|
||||||
|
*/
|
||||||
|
render: function () {
|
||||||
|
this.$el.empty().append('<label class="sr-only">Select all</label><input tabindex="-1" type="checkbox" title="Select all"/>');
|
||||||
|
this.delegateEvents();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
Renders a checkbox to select all rows on the current page.
|
||||||
|
|
||||||
|
@class Backgrid.Extension.SelectAllHeaderCell
|
||||||
|
@extends Backgrid.Extension.SelectRowCell
|
||||||
|
*/
|
||||||
|
var SelectAllHeaderCell = Backgrid.Extension.SelectAllHeaderCell = SelectRowCell.extend({
|
||||||
|
|
||||||
|
/** @property */
|
||||||
|
className: "select-all-header-cell",
|
||||||
|
|
||||||
|
/** @property */
|
||||||
|
tagName: "th",
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initializer. When this cell's checkbox is checked, a Backbone
|
||||||
|
`backgrid:select` event will be triggered for each model for the current
|
||||||
|
page in the underlying collection. If a `SelectRowCell` instance exists
|
||||||
|
for the rows representing the models, they will check themselves. If any
|
||||||
|
of the SelectRowCell instances trigger a Backbone `backgrid:selected`
|
||||||
|
event with a `false` value, this cell will uncheck its checkbox. In the
|
||||||
|
event of a Backbone `backgrid:refresh` event, which is triggered when the
|
||||||
|
body refreshes its rows, which can happen under a number of conditions
|
||||||
|
such as paging or the columns were reset, this cell will still remember
|
||||||
|
the previously selected models and trigger a Backbone `backgrid:select`
|
||||||
|
event on them such that the SelectRowCells can recheck themselves upon
|
||||||
|
refreshing.
|
||||||
|
|
||||||
|
@param {Object} options
|
||||||
|
@param {Backgrid.Column} options.column
|
||||||
|
@param {Backbone.Collection} options.collection
|
||||||
|
*/
|
||||||
|
initialize: function (options) {
|
||||||
|
|
||||||
|
this.column = options.column;
|
||||||
|
if (!(this.column instanceof Backgrid.Column)) {
|
||||||
|
this.column = new Backgrid.Column(this.column);
|
||||||
|
}
|
||||||
|
|
||||||
|
var collection = this.collection;
|
||||||
|
var selectedModels = this.selectedModels = {};
|
||||||
|
this.listenTo(collection.fullCollection || collection,
|
||||||
|
"backgrid:selected", function (model, selected) {
|
||||||
|
if (selected) selectedModels[model.id || model.cid] = 1;
|
||||||
|
else {
|
||||||
|
delete selectedModels[model.id || model.cid];
|
||||||
|
this.checkbox().prop("checked", false);
|
||||||
|
}
|
||||||
|
if (_.keys(selectedModels).length === (collection.fullCollection|| collection).length) {
|
||||||
|
this.checkbox().prop("checked", true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.listenTo(collection.fullCollection || collection, "remove", function (model) {
|
||||||
|
delete selectedModels[model.id || model.cid];
|
||||||
|
if ((collection.fullCollection || collection).length === 0) {
|
||||||
|
this.checkbox().prop("checked", false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.listenTo(collection, "backgrid:refresh", function () {
|
||||||
|
if ((collection.fullCollection || collection).length === 0) {
|
||||||
|
this.checkbox().prop("checked", false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var checked = this.checkbox().prop("checked");
|
||||||
|
for (var i = 0; i < collection.length; i++) {
|
||||||
|
var model = collection.at(i);
|
||||||
|
if (checked || selectedModels[model.id || model.cid]) {
|
||||||
|
model.trigger("backgrid:select", model, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var column = this.column, $el = this.$el;
|
||||||
|
this.listenTo(column, "change:renderable", function (column, renderable) {
|
||||||
|
$el.toggleClass("renderable", renderable);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (Backgrid.callByNeed(column.renderable(), column, collection)) $el.addClass("renderable");
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
Propagates the checked value of this checkbox to all the models of the
|
||||||
|
underlying collection by triggering a Backbone `backgrid:select` event on
|
||||||
|
the models on the current page, passing each model and the current
|
||||||
|
`checked` value of the checkbox in each event.
|
||||||
|
|
||||||
|
A `backgrid:selected` event will also be triggered with the current
|
||||||
|
`checked` value on all the models regardless of whether they are on the
|
||||||
|
current page.
|
||||||
|
|
||||||
|
This method triggers a 'backgrid:select-all' event on the collection
|
||||||
|
afterwards.
|
||||||
|
*/
|
||||||
|
onChange: function () {
|
||||||
|
var checked = this.checkbox().prop("checked");
|
||||||
|
|
||||||
|
var collection = this.collection;
|
||||||
|
collection.each(function (model) {
|
||||||
|
model.trigger("backgrid:select", model, checked);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (collection.fullCollection) {
|
||||||
|
collection.fullCollection.each(function (model) {
|
||||||
|
if (!collection.get(model.cid)) {
|
||||||
|
model.trigger("backgrid:selected", model, checked);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
this.collection.trigger("backgrid:select-all", this.collection, checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
Convenient method to retrieve a list of selected models. This method only
|
||||||
|
exists when the `SelectAll` extension has been included. Selected models
|
||||||
|
are retained across pagination.
|
||||||
|
|
||||||
|
@member Backgrid.Grid
|
||||||
|
@return {Array.<Backbone.Model>}
|
||||||
|
*/
|
||||||
|
Backgrid.Grid.prototype.getSelectedModels = function () {
|
||||||
|
var selectAllHeaderCell;
|
||||||
|
var headerCells = this.header.row.cells;
|
||||||
|
for (var i = 0, l = headerCells.length; i < l; i++) {
|
||||||
|
var headerCell = headerCells[i];
|
||||||
|
if (headerCell instanceof SelectAllHeaderCell) {
|
||||||
|
selectAllHeaderCell = headerCell;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = [];
|
||||||
|
if (selectAllHeaderCell) {
|
||||||
|
var selectedModels = selectAllHeaderCell.selectedModels;
|
||||||
|
var collection = this.collection.fullCollection || this.collection;
|
||||||
|
for (var modelId in selectedModels) {
|
||||||
|
result.push(collection.get(modelId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Convenient method to deselect the selected models. This method is only
|
||||||
|
available when the `SelectAll` extension has been included.
|
||||||
|
|
||||||
|
@member Backgrid.Grid
|
||||||
|
*/
|
||||||
|
Backgrid.Grid.prototype.clearSelectedModels = function () {
|
||||||
|
var selectedModels = this.getSelectedModels();
|
||||||
|
for (var i = 0, l = selectedModels.length; i < l; i++) {
|
||||||
|
var model = selectedModels[i];
|
||||||
|
model.trigger("backgrid:select", model, false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}));
|
||||||
@@ -172,7 +172,7 @@ var webpackShimConfig = {
|
|||||||
'bootstrap.toggle': path.join(__dirname, './node_modules/bootstrap4-toggle/js/bootstrap4-toggle'),
|
'bootstrap.toggle': path.join(__dirname, './node_modules/bootstrap4-toggle/js/bootstrap4-toggle'),
|
||||||
'select2': path.join(__dirname, './node_modules/select2/dist/js/select2.full'),
|
'select2': path.join(__dirname, './node_modules/select2/dist/js/select2.full'),
|
||||||
'backgrid.filter': path.join(__dirname, './node_modules/backgrid-filter/backgrid-filter'),
|
'backgrid.filter': path.join(__dirname, './node_modules/backgrid-filter/backgrid-filter'),
|
||||||
'backgrid.select.all': path.join(__dirname, './node_modules/backgrid-select-all/backgrid-select-all'),
|
'backgrid.select.all': path.join(__dirname, './pgadmin/static/vendor/backgrid/backgrid-select-all'),
|
||||||
'pgadmin.alertifyjs': path.join(__dirname, './pgadmin/static/js/alertify.pgadmin.defaults'),
|
'pgadmin.alertifyjs': path.join(__dirname, './pgadmin/static/js/alertify.pgadmin.defaults'),
|
||||||
'pgadmin.backform': path.join(__dirname, './pgadmin/static/js/backform.pgadmin'),
|
'pgadmin.backform': path.join(__dirname, './pgadmin/static/js/backform.pgadmin'),
|
||||||
'pgadmin.backgrid': path.join(__dirname, './pgadmin/static/js/backgrid.pgadmin'),
|
'pgadmin.backgrid': path.join(__dirname, './pgadmin/static/js/backgrid.pgadmin'),
|
||||||
|
|||||||
Reference in New Issue
Block a user