diff options
Diffstat (limited to 'ogcp/static')
-rw-r--r-- | ogcp/static/js/ogcp.js | 97 |
1 files changed, 53 insertions, 44 deletions
diff --git a/ogcp/static/js/ogcp.js b/ogcp/static/js/ogcp.js index 872f03c..0dccd57 100644 --- a/ogcp/static/js/ogcp.js +++ b/ogcp/static/js/ogcp.js @@ -59,70 +59,79 @@ function storeCheckboxStatus(checkbox, context) { localStorage.removeItem(context + checkbox.id); } -function checkParentsCheckboxes() { - const checkboxes = $('input:checkbox[form|="scopesForm"]'); - const reversedCheckboxes = $(checkboxes.get().reverse()) +function findParentCheckboxes(element) { + const $element = $(element); + const parents = $element.parentsUntil('#scopes').not('ul'); + + const checkboxes = parents + .map(function() { + return $(this).children('input[type="checkbox"][form="scopesForm"]').toArray(); + }) + .get() + .flat(); + return $(checkboxes).not($element);; +} - reversedCheckboxes.each(function() { - const checkbox = this; - const checkboxChildren = $('input:checkbox', this.parentNode).not(this); +function setParentStatus(checkboxes) { + checkboxes.each(function() { + const checkboxChildren = $(this).parent().find('input:checkbox[form="scopesForm"]').not(this); if (checkboxChildren.length == 0) return; - if (this.name == "scope-server") { - const checkedChildren = checkboxChildren.filter(":checked"); - checkbox.checked = checkedChildren.length > 0; - return; - } - const unCheckedChildren = checkboxChildren.filter(":not(:checked)"); - checkbox.indeterminate = + this.indeterminate = unCheckedChildren.length > 0 && unCheckedChildren.length < checkboxChildren.length; - checkbox.checked = unCheckedChildren.length === 0; + this.checked = unCheckedChildren.length === 0; }); } -function checkChildrenCheckboxes(context) { - const checkboxes = $('input:checkbox[form|="scopesForm"]') +function configureCommandCheckboxes(context) { + const checkboxes = $('input:checkbox[form="scopesForm"]'); + + // Ensure the form fields are sent + $('#scopesForm').on('submit', function() { + checkboxes.each(function() { + if (this.indeterminate) { + this.checked = true; + this.disabled = false; + } + }); + }); + + // disable checkboxes outside of scope-room branches + $(window).on('pageshow', function(event) { + const enabledCheckboxes = checkboxes.filter('[name="scope-room"]').parent().find('input:checkbox[form="scopesForm"]'); + checkboxes.not(enabledCheckboxes).prop('disabled', true); + setParentStatus(checkboxes) + }); checkboxes.on('change', function () { - const checked = this.checked - const children = $('input:checkbox', this.parentNode).not(this) + const checked = this.checked; + const childrenCheckboxes = $('input:checkbox[form|="scopesForm"]', this.parentNode); + // Uncheck all other checkboxes outside of the actual room branch if (checked) { - // Only for rooms, deselect other rooms - if (this.name === 'scope-room') { - const others = $('input:checkbox[form|="scopesForm"]').not(this); - others.prop('checked', false); - others.each(function() { - showSelectedClient(this); - storeCheckboxStatus(this, context); - }); - //others.trigger('change'); - } else { - // Look for room, deselect all other rooms - const selectedRoom = $('[data-room="' + $(this).data('parentRoom') + '"]'); - const others = $('input:checkbox[name="scope-room"]').not(selectedRoom); - others.prop('checked', false).prop('indeterminate', false); - others.each(function() { - const checks = $(this).parent().find('input:checkbox').prop('checked', false); - storeCheckboxStatus(this, context); - checks.each(function() { - showSelectedClient(this); - storeCheckboxStatus(this, context); - }); - }); - } + const roomBranch = findParentCheckboxes(this).add(childrenCheckboxes) + .filter('[name="scope-room"]') + .parent().find('input:checkbox[form="scopesForm"]'); + checkboxes.not(roomBranch).each(function () { + this.checked = false; + this.indeterminate = false; + }); } - children.each(function () { + childrenCheckboxes.each(function () { this.checked = checked; + }); + + setParentStatus(checkboxes); + + checkboxes.each(function() { + showSelectedClient(this); storeCheckboxStatus(this, context); - $(this).trigger('show-client'); }); - checkParentsCheckboxes(); }); } |