foreman/app/assets/javascripts/lookup_keys.js @ 09ce8a63
334d0359 | Amos Benari | //on load
|
|
09ce8a63 | Ori Rabin | $(document).on("ContentLoad", function() {
|
|
92bf092d | Amos Benari | //select the first tab
|
|
select_first_tab();
|
|||
d755be52 | Tomer Brisker | $(document).on('click', '.nav-tabs a[data-toggle="tab"]', function(){select_first_tab();});
|
|
bf4a13d3 | Walden Raines | // expend inner form fields
|
|
$('.tabs-left .col-md-4').removeClass('col-md-4').addClass('col-md-8')
|
|||
92bf092d | Amos Benari | //remove variable click event
|
|
e5f912f7 | Amos Benari | $(document).on('click', '.smart-var-tabs li a span', function(){ remove_node(this);});
|
|
09ce8a63 | Ori Rabin | fill_in_matchers();
|
|
$('.matchers').parents('form').on('submit', function(){
|
|||
build_match();
|
|||
})
|
|||
$('.matcher_key').select2('destroy');
|
|||
334d0359 | Amos Benari | })
|
|
92bf092d | Amos Benari | function select_first_tab(){
|
|
d755be52 | Tomer Brisker | var pills = $('.lookup-keys-container:visible .smart-var-tabs li:visible');
|
|
if (pills.length > 0 && pills.find('.tab-error:visible').length == 0){
|
|||
pills.find('a:visible').first().click();
|
|||
92bf092d | Amos Benari | }
|
|
}
|
|||
function remove_node(item){
|
|||
$($(item).parent("a").attr("href")).children('.btn-danger').click();
|
|||
}
|
|||
3154d77e | Tomas Strachota | function fix_template_context(content, context) {
|
|
// context will be something like this for a brand new form:
|
|||
// project[tasks_attributes][new_1255929127459][assignments_attributes][new_1255929128105]
|
|||
// or for an edit form:
|
|||
// project[tasks_attributes][0][assignments_attributes][1]
|
|||
if(context) {
|
|||
var parent_names = context.match(/[a-z_]+_attributes/g) || [];
|
|||
var parent_ids = context.match(/(new_)?[0-9]+/g) || [];
|
|||
for(var i = 0; i < parent_names.length; i++) {
|
|||
if(parent_ids[i]) {
|
|||
content = content.replace(
|
|||
new RegExp('(_' + parent_names[i] + ')_.+?_', 'g'),
|
|||
'$1_' + parent_ids[i] + '_');
|
|||
content = content.replace(
|
|||
new RegExp('(\\[' + parent_names[i] + '\\])\\[.+?\\]', 'g'),
|
|||
'$1[' + parent_ids[i] + ']');
|
|||
}
|
|||
}
|
|||
}
|
|||
return content;
|
|||
}
|
|||
function fix_template_names(content, assoc, new_id) {
|
|||
var regexp = new RegExp('new_' + assoc, 'g');
|
|||
return content.replace(regexp, "new_" + new_id);
|
|||
}
|
|||
334d0359 | Amos Benari | function add_child_node(item) {
|
|
9afa092e | Ohad Levy | // Setup
|
|
334d0359 | Amos Benari | var assoc = $(item).attr('data-association'); // Name of child
|
|
f8d94608 | Amos Benari | var template_class = '.' + assoc + '_fields_template';
|
|
d6d3acd4 | Marek Hulan | $(item).parent().find(template_class).find('select').select2('destroy');
|
|
f8d94608 | Amos Benari | var content = $(item).parent().find(template_class).html(); // Fields template
|
|
if (content == undefined) {content = $(template_class).html()};
|
|||
9afa092e | Ohad Levy | ||
// Make the context correct by replacing new_<parents> with the generated ID
|
|||
// of each of the parent objects
|
|||
334d0359 | Amos Benari | var context = ($(item).closest('.fields').find('input:first').attr('name') || '').replace(new RegExp('\[[a-z]+\]$'), '');
|
|
3154d77e | Tomas Strachota | content = fix_template_context(content, context);
|
|
var new_id = new Date().getTime();
|
|||
content = fix_template_names(content, assoc, new_id);
|
|||
8eb63065 | Amos Benari | var field = '';
|
|
if (assoc == 'lookup_keys') {
|
|||
8527c9f1 | Amos Benari | $('#smart_vars .smart-var-tabs .active, #smart_vars .stacked-content .active').removeClass('active');
|
|
84ab56ad | Ori Rabin | var pill = "<li class='active'><a data-toggle='pill' href='#new_" + new_id + "' id='pill_new_" + new_id + "'><div class='clip'>" + __('new') + "</div><span class='close pull-right'>×</span></a></li>"
|
|
f8d94608 | Amos Benari | $('#smart_vars .smart-var-tabs').prepend(pill);
|
|
8527c9f1 | Amos Benari | field = $('#smart_vars .stacked-content').prepend($(content).addClass('active'));
|
|
f8d94608 | Amos Benari | $('#smart_vars .smart-var-tabs li.active a').show('highlight', 500);
|
|
09ce8a63 | Ori Rabin | } else if (assoc == 'lookup_values') {
|
|
field = $(item).parent().find('tbody').first().append($(content).find('tr'));
|
|||
$(item).parent().find('table').removeClass('hidden');
|
|||
8eb63065 | Amos Benari | } else {
|
|
334d0359 | Amos Benari | field = $(content).insertBefore($(item));
|
|
8eb63065 | Amos Benari | }
|
|
334d0359 | Amos Benari | $(item).closest("form").trigger({type: 'nested:fieldAdded', field: field});
|
|
d31eea8c | Amos Benari | $('a[rel="popover"]').popover({html: true});
|
|
8838eb42 | Ohad Levy | $('a[rel="twipsy"]').tooltip();
|
|
334d0359 | Amos Benari | return new_id;
|
|
92bf092d | Amos Benari | }
|
|
9afa092e | Ohad Levy | ||
334d0359 | Amos Benari | function remove_child_node(item) {
|
|
var hidden_field = $(item).prev('input[type=hidden]')[0];
|
|||
if(hidden_field) {
|
|||
hidden_field.value = '1';
|
|||
}
|
|||
92bf092d | Amos Benari | ||
334d0359 | Amos Benari | $(item).closest('.fields').hide();
|
|
if($(item).parent().hasClass('fields')) {
|
|||
8cb120ea | Tomer Brisker | var pill_id = '#pill_' + $(item).closest('.fields')[0].id
|
|
var pill = $(pill_id);
|
|||
var undo_link = $("<a href='#'>" +pill.html()+"</a>").attr("data-pill", pill_id);
|
|||
e5f912f7 | Amos Benari | ||
pill.parent().hide();
|
|||
undo_link.on('click', function(){ undo_remove_child_node(this);});
|
|||
undo_link.find('span').remove();
|
|||
ec2b4ec9 | Amos Benari | $('.lookup-keys-container:visible').find('.undo-smart-vars').append(undo_link).show();
|
|
334d0359 | Amos Benari | }
|
|
$(item).closest("form").trigger('nested:fieldRemoved');
|
|||
return false;
|
|||
}
|
|||
8eb63065 | Amos Benari | ||
6d05514a | Tomas Strachota | function delete_child_node(item) {
|
|
$(item).closest('.fields').remove();
|
|||
$(item).closest("form").trigger('nested:fieldRemoved');
|
|||
return false;
|
|||
}
|
|||
e5f912f7 | Amos Benari | function undo_remove_child_node(item){
|
|
ec2b4ec9 | Amos Benari | var container = $('.lookup-keys-container:visible');
|
|
e5f912f7 | Amos Benari | var link = container.find($(item).attr("data-pill"));
|
|
var fields = container.find(link.attr("href"));
|
|||
var hidden_field = fields.find('input[type=hidden]').first()[0];
|
|||
if(hidden_field) {
|
|||
hidden_field.value = '0';
|
|||
}
|
|||
container.find('.smart-var-tabs li.active').removeClass('active');
|
|||
container.find('.fields.active').hide().removeClass('active');
|
|||
fields.show().addClass('active');
|
|||
ec2b4ec9 | Amos Benari | link.parent().show().addClass('active');
|
|
e5f912f7 | Amos Benari | ||
$(item).remove();
|
|||
bb7fd69c | Tomer Brisker | if (container.find('.undo-smart-vars a').length == 0) {
|
|
e5f912f7 | Amos Benari | container.find('.undo-smart-vars').hide();
|
|
}
|
|||
return false;
|
|||
}
|
|||
f8d94608 | Amos Benari | function toggleOverrideValue(item) {
|
|
var override = $(item).is(':checked');
|
|||
e5f912f7 | Amos Benari | var fields = $(item).closest('.fields');
|
|
var mandatory = fields.find("[id$='_required']");
|
|||
var type_field = fields.find("[id$='_key_type']");
|
|||
var validator_type_field = fields.find("[id$='_validator_type']");
|
|||
var default_value_field = fields.find("[id$='_default_value']");
|
|||
8e53b7c9 | Ori Rabin | var use_puppet_default = fields.find("[id$='use_puppet_default']");
|
|
e5f912f7 | Amos Benari | var override_value_div = fields.find("[id$='lookup_key_override_value']");
|
|
8cb120ea | Tomer Brisker | var pill_icon = $('#pill_' + fields[0].id +' i');
|
|
f8d94608 | Amos Benari | ||
mandatory.attr('disabled', override ? null : 'disabled');
|
|||
type_field.attr('disabled', override ? null : 'disabled');
|
|||
validator_type_field.attr('disabled', override ? null : 'disabled');
|
|||
8e53b7c9 | Ori Rabin | default_value_field.attr('disabled', override && !$(use_puppet_default).is(':checked') ? null : 'disabled' );
|
|
use_puppet_default.attr('disabled', override ? null : 'disabled' );
|
|||
bf4a13d3 | Walden Raines | pill_icon.attr("class", override ? 'glyphicon glyphicon-flag' : "glyphicon- ");
|
|
f8d94608 | Amos Benari | override_value_div.toggle(override);
|
|
}
|
|||
ea4eec44 | Ori Rabin | function changeCheckboxEnabledStatus(checkbox, shouldEnable) {
|
|
if (shouldEnable) {
|
|||
$(checkbox).attr('disabled', null);
|
|||
}
|
|||
else {
|
|||
$(checkbox).attr('checked', false);
|
|||
$(checkbox).attr('disabled', 'disabled');
|
|||
}
|
|||
}
|
|||
function keyTypeChange(item) {
|
|||
var reloadedItem = $(item);
|
|||
var keyType = reloadedItem.val();
|
|||
var fields = reloadedItem.closest('.fields');
|
|||
var mergeOverrides = fields.find("[id$='_merge_overrides']");
|
|||
var avoidDuplicates = fields.find("[id$='_avoid_duplicates']");
|
|||
2b6605c4 | Ori Rabin | var overrideMergeDiv = fields.find("[id$='lookup_key_override_merge']");
|
|
09ce8a63 | Ori Rabin | var validators = fields.find("[id^='optional_input_validators']");
|
|
2b6605c4 | Ori Rabin | ||
ea4eec44 | Ori Rabin | changeCheckboxEnabledStatus(mergeOverrides, keyType == 'array' || keyType == 'hash');
|
|
changeCheckboxEnabledStatus(avoidDuplicates, keyType == 'array' && $(mergeOverrides).attr('checked') == 'checked');
|
|||
2b6605c4 | Ori Rabin | overrideMergeDiv.toggle(keyType == 'array' || keyType == 'hash');
|
|
09ce8a63 | Ori Rabin | validators.collapse('show');
|
|
validators.parent().find('legend').removeClass('collapsed');
|
|||
ea4eec44 | Ori Rabin | }
|
|
function mergeOverridesChanged(item) {
|
|||
var fields = $(item).closest('.fields');
|
|||
var keyType = fields.find("[id$='_key_type']").val();
|
|||
var avoidDuplicates = fields.find("[id$='_avoid_duplicates']");
|
|||
changeCheckboxEnabledStatus(avoidDuplicates, keyType == 'array' && item.checked);
|
|||
}
|
|||
8e53b7c9 | Ori Rabin | function toggleUsePuppetDefaultValue(item, value_field) {
|
|
var use_puppet_default = $(item).is(':checked');
|
|||
var fields = $(item).closest('.fields');
|
|||
var value_field = fields.find('[id$=' + value_field + ']');
|
|||
value_field.attr('disabled', use_puppet_default ? 'disabled' : null );
|
|||
}
|
|||
f8d94608 | Amos Benari | function filterByEnvironment(item){
|
|
if ($(item).val()=="") {
|
|||
09ce8a63 | Ori Rabin | $('ul.smart-var-tabs li[data-used-environments] a').removeClass('hidden');
|
|
f8d94608 | Amos Benari | return;
|
|
}
|
|||
var selected = $(item).find('option:selected').text();
|
|||
09ce8a63 | Ori Rabin | $('ul.smart-var-tabs li[data-used-environments] a').addClass('hidden');
|
|
$('ul.smart-var-tabs li[data-used-environments*="'+selected+'"] a').removeClass('hidden');
|
|||
f8d94608 | Amos Benari | }
|
|
298756ca | Amos Benari | ||
1702ffc6 | Amos Benari | function filterByClassParam(item) {
|
|
var term = $(item).val().trim();
|
|||
if (term.length > 0) {
|
|||
09ce8a63 | Ori Rabin | $('ul.smart-var-tabs li[data-used-environments]').removeClass('search-marker').addClass('hidden');
|
|
$('ul.smart-var-tabs li[data-used-environments] a[href*='+term+']:not(.selected-marker)').parent().addClass('search-marker').removeClass('hidden');
|
|||
1702ffc6 | Amos Benari | } else{
|
|
09ce8a63 | Ori Rabin | $('ul.smart-var-tabs li[data-used-environments]:not(.selected-marker)').addClass('search-marker').removeClass('hidden');
|
|
1702ffc6 | Amos Benari | }
|
|
return false;
|
|||
}
|
|||
298756ca | Amos Benari | function validatorTypeSelected(item){
|
|
var validatorType = $(item).val();
|
|||
var validator_rule_field = $(item).closest('.fields').find("[id$='_validator_rule']");
|
|||
validator_rule_field.attr('disabled', validatorType == "" ? 'disabled' : null);
|
|||
}
|
|||
09ce8a63 | Ori Rabin | ||
const KEY_DELM = ",";
|
|||
const EQ_DELM = "=";
|
|||
function match_to_key_value(match){
|
|||
var regex = new RegExp('[' + KEY_DELM + EQ_DELM + ']');
|
|||
var keys = [], values = [],
|
|||
split_matcher = match.replace(/(\s+,) | (,\s+)/g, '').split(regex);
|
|||
$.each(split_matcher, function (index, value) {
|
|||
if (index % 2 === 0) {
|
|||
keys.push(value);
|
|||
} else {
|
|||
values.push(value);
|
|||
}
|
|||
});
|
|||
return [keys.join(KEY_DELM), values.join(KEY_DELM)];
|
|||
}
|
|||
function key_value_to_match(keys, values){
|
|||
var match = "";
|
|||
keys.split(KEY_DELM).forEach(function (el, index) {
|
|||
match += el + EQ_DELM + values.split(KEY_DELM)[index] + KEY_DELM;
|
|||
});
|
|||
return match.slice(0, -1);
|
|||
}
|
|||
function fill_in_matchers(){
|
|||
$('.matchers').each(function () {
|
|||
var matcher = $(this);
|
|||
var match = matcher.find('.match').val();
|
|||
var matcher_key = matcher.find('.matcher_key');
|
|||
var matcher_value = matcher.find('.matcher_value');
|
|||
var order = matcher.closest('.matcher-parent').find('#order').val().split('\n');
|
|||
matcher_key.empty();
|
|||
matcher_key.append("<option></option>");
|
|||
$.each(order, function (index, value) {
|
|||
matcher_key.append($("<option>", {value: _.escape(value), html: _.escape(value)}));
|
|||
});
|
|||
if (match) {
|
|||
var key_value = match_to_key_value(match);
|
|||
matcher_key.find("option[value='" + key_value[0] + "']").attr('selected', 'selected');
|
|||
matcher_value.val(key_value[1]);
|
|||
}
|
|||
});
|
|||
}
|
|||
function build_match() {
|
|||
$('.matchers').each(function () {
|
|||
var match = $(this).find('.match');
|
|||
var matcher_key = $(this).find('.matcher_key');
|
|||
var matcher_value = $(this).find('.matcher_value');
|
|||
match.val(key_value_to_match(matcher_key.val(), matcher_value.val()));
|
|||
});
|
|||
}
|