congress/congress_dashboard/static/admin/js/policies.js

289 lines
9.7 KiB
JavaScript

horizon.policies = {
/* Update input attributes for column name autocompletion. */
updateColumnAcInput: function($input) {
$input.attr({
'placeholder': $input.attr('data-column-example'),
'pattern': $input.attr('data-pattern'),
'title': $input.attr('data-pattern-error')
});
/* form-control-feedback only hidden, so it still has autocompletion. */
$input.closest('td').find('.form-control-feedback')
.removeClass('hidden');
},
/* Get column names from conditions mappings. */
getMappedColumns: function() {
var mappings = [];
$('#mappings_table').find('.policy-column-name').each(function() {
var $td = $(this);
var column = $td.text();
if (column) {
mappings.push(column);
}
});
return mappings;
},
/* Check if any columns need to be removed from conditions mappings. */
scrubMappedColumns: function(columns) {
mappings = horizon.policies.getMappedColumns();
if (!columns) {
columns = [];
var $inputs = $('#policy_columns_table').find('.policy-column-input');
$inputs.each(function() {
var $input = $(this);
var name = $input.val();
if (name) {
columns.push(name);
}
});
}
for (var i = 0; i < mappings.length; i++) {
var name = mappings[i];
if ($.inArray(name, columns) == -1) {
$('#mappings_table').find('.policy-column-name:contains(' +
name + ')').closest('tr').remove();
}
}
/* Put label back if there's only one row left without it. */
var $rows = $('#mappings_table').find('.mapping-row');
if ($rows.length == 1 && !$rows.find('.label-cell').text()) {
var label = $('#mapping_0').find('.label-cell').html();
$rows.find('.label-cell').html(label);
}
},
}
horizon.addInitFunction(horizon.policies.init = function() {
/* Add another policy table column name. */
$(document).on('click', '#add_policy_column_button', function(evt) {
evt.preventDefault();
var $button = $(this);
var $tr = $('#policy_column_0').clone();
var count = $button.attr('data-count');
var cid = parseInt(count);
$button.attr('data-count', cid + 1);
/* Change ids and reset inputs. */
$tr.attr('id', 'policy_column_' + cid);
$tr.find('input[name]').val('').each(function() {
this.name = this.name.replace(/^(.+_)\d+$/, '$1' + cid);
});
$tr.find('.remove-policy-column-button').removeClass('hidden');
/* Add row before the one reserved for errors. */
$('#policy_columns_table').find('tr:last').before($tr);
});
/* Remove policy table column name input. */
$(document).on('click',
'#policy_columns_table a.remove-policy-column-button',
function(evt) {
evt.preventDefault();
var $a = $(this);
var $tr = $a.closest('tr');
$tr.remove();
horizon.policies.scrubMappedColumns();
});
/* Add policy table columns to conditions and combine into single param. */
$(document).on('change',
'#policy_columns_table input.policy-column-input',
function() {
var mappings = horizon.policies.getMappedColumns();
var columns = [];
var $inputs = $('#policy_columns_table').find('.policy-column-input');
$inputs.each(function() {
var $input = $(this);
var name = $input.val();
/* Does not make sense to have multiple of the same column. */
if (name && $.inArray(name, columns) == -1) {
columns.push(name);
if ($.inArray(name, mappings) == -1) {
/* Add mapping inputs for new policy column. */
var $tr = $('#mapping_0').clone();
var count = $('#mappings_table').attr('data-count');
var cid = parseInt(count);
$('#mappings_table').attr('data-count', cid + 1);
/* Change ids. */
$tr.attr('id', 'mapping_' + cid).toggleClass('hidden mapping-row');
$tr.find('.policy-column-name').text(name);
$tr.find('input[id]').each(function() {
this.id = this.id.replace(/^(.+_)\d+$/, '$1' + cid);
this.name = this.id;
});
/* Remove label if there's already a row with it. */
if ($('#mappings_table').find('.mapping-row').length) {
$tr.find('.label-cell').empty();
}
$('#mappings_table').find('tr:last').before($tr);
/* Add autocompletion. */
$('#mapping_column_' + cid).autocomplete({
minLength: 0,
source: JSON.parse($('#ds_columns').text())
});
$('#mapping_' + cid).find('.ac div.form-control-feedback')
.click(function() {
/* Focus on list now so that clicking outside of it closes it. */
$('#mapping_column_' + cid).autocomplete('search', '').focus();
});
}
}
});
/* Workflow expects one policy_columns value. */
$('#policy_columns').val(columns.join(', '));
horizon.policies.scrubMappedColumns(columns);
});
/* Add another join. */
$(document).on('click', '#add_join_button', function(evt) {
evt.preventDefault();
var $button = $(this);
var $tr = $('#join_0').clone();
var count = $button.attr('data-count');
var cid = parseInt(count);
$button.attr('data-count', cid + 1);
/* Change ids and reset inputs. */
$tr.attr('id', 'join_' + cid);
$tr.find('input[id], select[id]').val('').each(function() {
this.id = this.id.replace(/^(.+_)\d+$/, '$1' + cid);
this.name = this.id;
});
$tr.find('select').val($tr.find('option:first').val());
$tr.find('.remove-join-button').removeClass('hidden');
$('#joins_table').append($tr);
/* Add autocompletion. */
$('#join_left_' + cid + ', #join_right_' + cid).autocomplete({
minLength: 0,
source: JSON.parse($('#ds_columns').text())
});
horizon.policies.updateColumnAcInput($('#join_right_' + cid));
$('#join_' + cid).find('.ac div.form-control-feedback').click(function() {
var $div = $(this);
/* Focus on list now so that clicking outside of it closes it. */
$div.siblings('.ac-columns').autocomplete('search', '').focus();
});
});
/* Remove join input. */
$(document).on('click', '#joins_table a.remove-join-button',
function(evt) {
evt.preventDefault();
var $a = $(this);
var $tr = $a.closest('tr');
$tr.remove();
});
/* Update input attributes based on type selected. */
$(document).on('change', '#joins_table select.join-op', function() {
var $select = $(this);
var $input = $select.closest('tr').find('.join-right').val('');
if (!$select.val()) {
$input.autocomplete({
minLength: 0,
source: JSON.parse($('#ds_columns').text())
});
horizon.policies.updateColumnAcInput($input);
} else {
$input.closest('td').find('.form-control-feedback').addClass('hidden');
$input.autocomplete('destroy');
$input.attr('placeholder', $input.attr('data-static-example'));
$input.removeAttr('pattern').removeAttr('title');
}
});
/* Add another negation. */
$(document).on('click', '#add_negation_button', function(evt) {
evt.preventDefault();
var $button = $(this);
var $tr = $('#negation_0').clone();
var count = $button.attr('data-count');
var cid = parseInt(count);
$button.attr('data-count', cid + 1);
/* Change ids and reset inputs. */
$tr.attr('id', 'negation_' + cid);
$tr.find('input[id], select[id]').val('').each(function() {
this.id = this.id.replace(/^(.+_)\d+$/, '$1' + cid);
this.name = this.id;
});
$tr.find('select').val($tr.find('option:first').val());
$tr.find('.remove-negation-button').removeClass('hidden');
$('#negations_table').append($tr);
/* Add autocompletion. */
$('#negation_value_' + cid + ', #negation_column_' + cid).autocomplete({
minLength: 0,
source: JSON.parse($('#ds_columns').text())
});
$('#negation_' + cid).find('.ac div.form-control-feedback')
.click(function() {
var $div = $(this);
/* Focus on list now so that clicking outside of it closes it. */
$div.siblings('.ac-columns').autocomplete('search', '').focus();
});
});
/* Remove negation input. */
$(document).on('click', '#negations_table a.remove-negation-button',
function(evt) {
evt.preventDefault();
var $a = $(this);
var $tr = $a.closest('tr');
$tr.remove();
});
/* Add another alias. */
$(document).on('click', '#add_alias_button', function(evt) {
evt.preventDefault();
var $button = $(this);
var $tr = $('#alias_0').clone();
var count = $button.attr('data-count');
var cid = parseInt(count);
$button.attr('data-count', cid + 1);
/* Change ids and reset inputs. */
$tr.attr('id', 'alias_' + cid);
$tr.find('td:first').empty();
$tr.find('input[id]').val('').each(function() {
this.id = this.id.replace(/^(.+_)\d+$/, '$1' + cid);
this.name = this.id;
});
$tr.find('.remove-alias-button').removeClass('hidden');
$('#aliases_table').append($tr);
/* Add autocompletion. */
$('#alias_column_' + cid).autocomplete({
minLength: 0,
source: JSON.parse($('#ds_tables').text())
});
$('#alias_' + cid).find('.ac div.form-control-feedback')
.click(function() {
var $div = $(this);
/* Focus on list now so that clicking outside of it closes it. */
$div.siblings('.ac-tables').autocomplete('search', '').focus();
});
});
/* Remove alias input. */
$(document).on('click', '#aliases_table a.remove-alias-button',
function(evt) {
evt.preventDefault();
var $a = $(this);
var $tr = $a.closest('tr');
$tr.remove();
});
});