Revision 5c9dc2dc
Added by Ohad Levy about 5 years ago
app/assets/javascripts/class_edit.js | ||
---|---|---|
function filter_puppet_classes(item){
|
||
var term = $(item).val().trim();
|
||
var class_elems = $('.available_classes').find('.puppetclass_group, .puppetclass');
|
||
if (term.length > 0) {
|
||
class_elems.hide().has('[data-class-name*="'+term+'"]').show();
|
||
} else {
|
||
class_elems.show();
|
||
}
|
||
}
|
||
|
||
function add_puppet_class(item){
|
||
var id = $(item).attr('data-class-id');
|
||
var type = $(item).attr('data-type');
|
||
$(item).tooltip('hide');
|
||
var content = $(item).closest('li').clone();
|
||
content.attr('id', 'selected_puppetclass_'+ id);
|
||
content.append("<input id='" + type +"_puppetclass_ids_' name='" + type +"[puppetclass_ids][]' type='hidden' value=" +id+ ">");
|
||
|
||
var link = content.children('a');
|
||
var links = content.find('a');
|
||
|
||
links.attr('onclick', 'remove_puppet_class(this)');
|
||
links.attr('data-original-title', tfm.i18n.sprintf(__('Click to remove %s'), link.data("class-name")));
|
||
links.tooltip();
|
||
link.removeClass('glyphicon-plus-sign').addClass('glyphicon-minus-sign');
|
||
|
||
$('#selected_classes').append(content);
|
||
|
||
$("#selected_puppetclass_"+ id).show('highlight', 5000);
|
||
$("#puppetclass_"+ id).addClass('selected-marker').hide();
|
||
findElementsForRemoveIcon($("#puppetclass_"+ id));
|
||
// trigger load_puppet_class_parameters in host_edit.js which is fired by custom event handler called 'AddedClass'
|
||
$(document.body).trigger('AddedClass', link);
|
||
}
|
||
|
||
function add_group_puppet_class(item){
|
||
var id = $(item).attr('data-class-id');
|
||
var type = $(item).attr('data-type');
|
||
$(item).tooltip('hide');
|
||
var content = $(item).closest('li').clone();
|
||
content.attr('id', 'selected_puppetclass_'+ id);
|
||
content.children('span').tooltip();
|
||
content.val('');
|
||
|
||
var link = content.children('a');
|
||
var links = content.find('a');
|
||
links.attr('onclick', '');
|
||
links.attr('data-original-title', __('belongs to config group'));
|
||
links.tooltip();
|
||
link.removeClass('glyphicon-plus-sign');
|
||
|
||
$('#selected_classes').append(content);
|
||
|
||
$("#selected_puppetclass_"+ id).show('highlight', 5000);
|
||
$("#puppetclass_"+ id).addClass('selected-marker').hide();
|
||
|
||
// trigger load_puppet_class_parameters in host_edit.js which is fired by custom event handler called 'AddedClass'
|
||
$(document.body).trigger('AddedClass', link);
|
||
}
|
||
|
||
function remove_puppet_class(item){
|
||
var id = $(item).attr('data-class-id');
|
||
$('#puppetclass_' + id).removeClass('selected-marker').show();
|
||
$('#puppetclass_' + id).parent().prev().find('i').show();
|
||
$('#puppetclass_' + id).closest('.puppetclass_group').show();
|
||
$('#selected_puppetclass_' + id).children('a').tooltip('hide');
|
||
$('#selected_puppetclass_' + id).remove();
|
||
$('#puppetclass_' + id + '_params_loading').remove();
|
||
$('[id^="puppetclass_' + id + '_params\\["]').remove();
|
||
$('#params-tab').removeClass("tab-error");
|
||
if ($("#params").find('.form-group.error').length > 0) $('#params-tab').addClass('tab-error');
|
||
|
||
return false;
|
||
}
|
||
|
||
function addConfigGroup(item){
|
||
var id = $(item).attr('data-group-id');
|
||
var type = $(item).attr('data-type');
|
||
var content = $(item).closest('li').clone();
|
||
content.attr('id', 'selected_config_group_'+ id);
|
||
content.append("<input id='config_group_ids' name=" + type + "[config_group_ids][] type='hidden' value=" +id+ ">");
|
||
$("#selected_config_group_"+ id).show('highlight', 5000);
|
||
$("#config_group_"+ id).addClass('selected-marker').hide();
|
||
var link = content.children('a');
|
||
var links = content.find('a');
|
||
link.attr('onclick', 'removeConfigGroup(this)');
|
||
link.attr('data-original-title', __('Click to remove config group'));
|
||
links.tooltip();
|
||
link.removeClass('glyphicon-plus-sign').addClass('glyphicon-minus-sign');
|
||
link.text(__(' Remove'));
|
||
|
||
$('#selected_config_groups').append(content);
|
||
$("#selected_config_group_"+ id).show('highlight', 5000);
|
||
$("#config_group_"+ id).addClass('selected-marker').hide();
|
||
|
||
var puppetclass_ids = $.parseJSON($(item).attr('data-puppetclass-ids'));
|
||
var inherited_ids = $.parseJSON($('#inherited_ids').attr('data-inherited-puppetclass-ids'));
|
||
|
||
$.each(puppetclass_ids, function(index,puppetclass_id) {
|
||
var pc = $("li#puppetclass_" + puppetclass_id);
|
||
var pc_link = $("a[data-class-id='" + puppetclass_id + "']");
|
||
if ( (pc_link.length > 0) && (pc.length > 0) && ($.inArray(puppetclass_id, inherited_ids) == -1 ) ) {
|
||
if (!($("#selected_puppetclass_"+ puppetclass_id).length > 0)) {
|
||
add_group_puppet_class(pc_link);
|
||
}
|
||
}
|
||
})
|
||
}
|
||
|
||
function removeConfigGroup(item){
|
||
var id = $(item).attr('data-group-id');
|
||
$('#config_group_' + id).removeClass('selected-marker').show();
|
||
$('#selected_config_group_' + id).children('a').tooltip('hide');
|
||
$('#selected_config_group_' + id).remove();
|
||
|
||
var puppetclass_ids = $.parseJSON($(item).attr('data-puppetclass-ids'));
|
||
var inherited_ids = $.parseJSON($('#inherited_ids').attr('data-inherited-puppetclass-ids'));
|
||
|
||
$.each(puppetclass_ids, function(index,puppetclass_id){
|
||
var pc = $('#selected_puppetclass_' + puppetclass_id);
|
||
var pc_link = $("a[data-class-id='" + puppetclass_id + "']");
|
||
if ( (pc_link.length > 0) && (pc.length > 0) && ($.inArray(puppetclass_id, inherited_ids) == -1 ) ) {
|
||
remove_puppet_class(pc_link);
|
||
}
|
||
});
|
||
return false;
|
||
}
|
||
|
||
function findElementsForRemoveIcon(element) {
|
||
var clicked_element = element.parent().prev();
|
||
var ul_id = '#' + element.parent().attr('id');
|
||
removeIconIfEmpty(clicked_element, ul_id);
|
||
}
|
||
|
||
function expandClassList(clicked_element, toggle_element) {
|
||
$(toggle_element).fadeToggle();
|
||
clicked_element.find('i').toggleClass('glyphicon-plus glyphicon-minus');
|
||
removeIconIfEmpty(clicked_element, toggle_element);
|
||
}
|
||
|
||
function removeIconIfEmpty(element, ul_id) {
|
||
if ($(ul_id).children(':visible').length == 0) {
|
||
element.find('i').hide();
|
||
}
|
||
}
|
app/helpers/application_helper.rb | ||
---|---|---|
def remove_link_to_function(text, options)
|
||
options.delete_if { |key, value| !options[key].to_s } # otherwise error during template render
|
||
title = (_("Click to remove %s") % options[:"data-class-name"])
|
||
link_to_function(text, "remove_puppet_class(this)", options.merge!(:'data-original-title' => title))
|
||
link_to_function(text, "tfm.classEditor.removePuppetClass(this)", options.merge!(:'data-original-title' => title))
|
||
end
|
||
|
||
def link_to_add_puppetclass(klass, type)
|
||
... | ... | |
end
|
||
|
||
def add_link_to_function(text, options)
|
||
link_to_function(text, "add_puppet_class(this)",
|
||
link_to_function(text, "tfm.classEditor.addPuppetClass(this)",
|
||
options.merge(:'data-original-title' => _("Click to add %s") % options[:"data-class-name"]))
|
||
end
|
||
|
app/helpers/puppetclasses_helper.rb | ||
---|---|---|
{}
|
||
end
|
||
link_to_function(icon_text('plus', list.first, css_options),
|
||
"expandClassList($(this), '#pc_#{list.first}')")
|
||
"tfm.classEditor.expandClassList($(this), '#pc_#{list.first}')")
|
||
end
|
||
end
|
app/views/config_groups/_config_group.html.erb | ||
---|---|---|
<%= hidden_field_tag("#{type}[config_group_ids][]", config_group.id) if added == 'manually' %>
|
||
<span>
|
||
<%= link_to(icon_text('plus', config_group.name), '#', :rel=>'twipsy', :class => 'config_group_name',
|
||
:onclick => "expandClassList($(this), '#cgroup_#{config_group.id}')",
|
||
:onclick => "tfm.classEditor.expandClassList($(this), '#cgroup_#{config_group.id}')",
|
||
:data => {:puppetclass_ids => config_group.puppetclass_ids,
|
||
:'group-id' => config_group.id,
|
||
:id => config_group.id,
|
||
... | ... | |
) %>
|
||
</span>
|
||
<%= link_to(" #{added ? _('Remove') : _('Add')}", '#', :rel=>'twipsy', :class => "btn btn-default btn-sm glyphicon glyphicon-#{added ? 'minus' : 'plus'}-sign",
|
||
:onclick => (added ? 'removeConfigGroup(this)' : 'addConfigGroup(this)'),
|
||
:onclick => (added ? 'tfm.classEditor.removeConfigGroup(this)' : 'tfm.classEditor.addConfigGroup(this)'),
|
||
:data => {:puppetclass_ids => config_group.puppetclass_ids,
|
||
:'group-id' => config_group.id,
|
||
:id => config_group.id,
|
app/views/config_groups/_form.html.erb | ||
---|---|---|
<%= javascript 'class_edit' %>
|
||
|
||
<%= form_for(@config_group) do |f| %>
|
||
<%= base_errors_for @config_group %>
|
||
|
app/views/config_groups/index.html.erb | ||
---|---|---|
<%= javascript 'class_edit' %>
|
||
|
||
<% title _('Config Groups') %>
|
||
|
||
<% title_actions new_link(_('Create Config Group')), help_button %>
|
app/views/hostgroups/_form.html.erb | ||
---|---|---|
<%= javascript 'host_edit', 'host_edit_interfaces', 'class_edit' %>
|
||
<%= javascript 'host_edit', 'host_edit_interfaces' %>
|
||
<%= form_for @hostgroup, :html => {:data => {:id => @hostgroup.try(:id), :submit => 'progress_bar' }} do |f| %>
|
||
<%= base_errors_for @hostgroup %>
|
||
|
app/views/hosts/_form.html.erb | ||
---|---|---|
<%= javascript 'hosts', 'host_edit', 'host_edit_interfaces', 'class_edit', 'charts' %>
|
||
<%= javascript 'hosts', 'host_edit', 'host_edit_interfaces', 'charts' %>
|
||
<%= render "hosts/dhcp_lease_errors" if has_dhcp_lease_errors?(@host.errors) %>
|
||
<%= render "hosts/conflicts" if (!has_dhcp_lease_errors?(@host.errors) && has_conflicts?(@host.errors)) %>
|
||
<%= render "hosts/progress" %>
|
app/views/puppetclasses/_class_selection.html.erb | ||
---|---|---|
<h3><%= _('Available Classes') %></h3>
|
||
<div class='clearfix'>
|
||
<div class='form-group col-md-6'>
|
||
<input placeholder="<%= _('Filter classes') %>" class="form-control" onkeyup="filter_puppet_classes(this);" type='text'>
|
||
<input placeholder="<%= _('Filter classes') %>" class="form-control" onkeyup="tfm.classEditor.filterPuppetClasses(this);" type='text'>
|
||
</div>
|
||
</div>
|
||
<div class="row">
|
config/initializers/assets.rb | ||
---|---|---|
taxonomy_edit
|
||
gettext/all
|
||
filters
|
||
class_edit
|
||
subnets
|
||
hidden_values
|
||
proxy_status
|
webpack/assets/javascripts/bundle.js | ||
---|---|---|
advancedFields: require('./foreman_advanced_fields'),
|
||
breadcrumbs: require('./foreman_breadcrumbs'),
|
||
configReportsModalDiff: require('./foreman_config_reports_modal_diff'),
|
||
classEditor: require('./foreman_class_edit'),
|
||
dashboard: require('./foreman_dashboard'),
|
||
i18n,
|
||
document: foremanDocument,
|
webpack/assets/javascripts/foreman_class_edit.js | ||
---|---|---|
import { sprintf } from './react_app/common/I18n';
|
||
|
||
export function filterPuppetClasses(item) {
|
||
const term = $(item)
|
||
.val()
|
||
.trim();
|
||
const classElems = $('.available_classes').find(
|
||
'.puppetclass_group, .puppetclass'
|
||
);
|
||
if (term.length > 0) {
|
||
classElems
|
||
.hide()
|
||
.has(`[data-class-name*="${term}"]`)
|
||
.show();
|
||
} else {
|
||
classElems.show();
|
||
}
|
||
}
|
||
|
||
export function addPuppetClass(item) {
|
||
const id = $(item).attr('data-class-id');
|
||
const type = $(item).attr('data-type');
|
||
$(item).tooltip('hide');
|
||
const content = $(item)
|
||
.closest('li')
|
||
.clone();
|
||
content.attr('id', `selected_puppetclass_${id}`);
|
||
content.append(
|
||
`<input id='${type}_puppetclass_ids_' name='${type}[puppetclass_ids][]' type='hidden' value=${id}>`
|
||
);
|
||
|
||
const link = content.children('a');
|
||
const links = content.find('a');
|
||
|
||
links.attr('onclick', 'tfm.classEditor.removePuppetClass(this)');
|
||
links.attr(
|
||
'data-original-title',
|
||
sprintf(__('Click to remove %s'), link.data('class-name'))
|
||
);
|
||
links.tooltip();
|
||
link.removeClass('glyphicon-plus-sign').addClass('glyphicon-minus-sign');
|
||
|
||
$('#selected_classes').append(content);
|
||
|
||
$(`#selected_puppetclass_${id}`).show('highlight', 5000);
|
||
$(`#puppetclass_${id}`)
|
||
.addClass('selected-marker')
|
||
.hide();
|
||
findElementsForRemoveIcon($(`#puppetclass_${id}`));
|
||
// trigger load_puppet_class_parameters in host_edit.js which is fired by custom event handler called 'AddedClass'
|
||
$(document.body).trigger('AddedClass', link);
|
||
}
|
||
|
||
function addGroupPuppetClass(item) {
|
||
const id = $(item).attr('data-class-id');
|
||
$(item).tooltip('hide');
|
||
const content = $(item)
|
||
.closest('li')
|
||
.clone();
|
||
content.attr('id', `selected_puppetclass_${id}`);
|
||
content.children('span').tooltip();
|
||
content.val('');
|
||
|
||
const link = content.children('a');
|
||
const links = content.find('a');
|
||
links.attr('onclick', '');
|
||
links.attr('data-original-title', __('belongs to config group'));
|
||
links.tooltip();
|
||
link.removeClass('glyphicon-plus-sign');
|
||
|
||
$('#selected_classes').append(content);
|
||
|
||
$(`#selected_puppetclass_${id}`).show('highlight', 5000);
|
||
$(`#puppetclass_${id}`)
|
||
.addClass('selected-marker')
|
||
.hide();
|
||
|
||
// trigger load_puppet_class_parameters in host_edit.js which is fired by custom event handler called 'AddedClass'
|
||
$(document.body).trigger('AddedClass', link);
|
||
}
|
||
|
||
export function removePuppetClass(item) {
|
||
const id = $(item).attr('data-class-id');
|
||
$(`#puppetclass_${id}`)
|
||
.removeClass('selected-marker')
|
||
.show();
|
||
$(`#puppetclass_${id}`)
|
||
.parent()
|
||
.prev()
|
||
.find('i')
|
||
.show();
|
||
$(`#puppetclass_${id}`)
|
||
.closest('.puppetclass_group')
|
||
.show();
|
||
$(`#selected_puppetclass_${id}`)
|
||
.children('a')
|
||
.tooltip('hide');
|
||
$(`#selected_puppetclass_${id}`).remove();
|
||
$(`#puppetclass_${id}_params_loading`).remove();
|
||
$(`[id^="puppetclass_${id}_params\\["]`).remove();
|
||
$('#params-tab').removeClass('tab-error');
|
||
if ($('#params').find('.form-group.error').length > 0)
|
||
$('#params-tab').addClass('tab-error');
|
||
|
||
return false;
|
||
}
|
||
|
||
export function addConfigGroup(item) {
|
||
const id = $(item).attr('data-group-id');
|
||
const type = $(item).attr('data-type');
|
||
const content = $(item)
|
||
.closest('li')
|
||
.clone();
|
||
content.attr('id', `selected_config_group_${id}`);
|
||
content.append(
|
||
`<input id='config_group_ids' name=${type}[config_group_ids][] type='hidden' value=${id}>`
|
||
);
|
||
$(`#selected_config_group_${id}`).show('highlight', 5000);
|
||
$(`#config_group_${id}`)
|
||
.addClass('selected-marker')
|
||
.hide();
|
||
const link = content.children('a');
|
||
const links = content.find('a');
|
||
link.attr('onclick', 'tfm.classEditor.removeConfigGroup(this)');
|
||
link.attr('data-original-title', __('Click to remove config group'));
|
||
links.tooltip();
|
||
link.removeClass('glyphicon-plus-sign').addClass('glyphicon-minus-sign');
|
||
link.text(__(' Remove'));
|
||
|
||
$('#selected_config_groups').append(content);
|
||
$(`#selected_config_group_${id}`).show('highlight', 5000);
|
||
$(`#config_group_${id}`)
|
||
.addClass('selected-marker')
|
||
.hide();
|
||
|
||
const puppetclassIds = $.parseJSON($(item).attr('data-puppetclass-ids'));
|
||
const inheritedIds = $.parseJSON(
|
||
$('#inherited_ids').attr('data-inherited-puppetclass-ids')
|
||
);
|
||
|
||
$.each(puppetclassIds, (index, puppetclassId) => {
|
||
const pc = $(`li#puppetclass_${puppetclassId}`);
|
||
const pcLink = $(`a[data-class-id='${puppetclassId}']`);
|
||
if (
|
||
pcLink.length > 0 &&
|
||
pc.length > 0 &&
|
||
$.inArray(puppetclassId, inheritedIds) === -1
|
||
) {
|
||
if (!($(`#selected_puppetclass_${puppetclassId}`).length > 0)) {
|
||
addGroupPuppetClass(pcLink);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
export function removeConfigGroup(item) {
|
||
const id = $(item).attr('data-group-id');
|
||
$(`#config_group_${id}`)
|
||
.removeClass('selected-marker')
|
||
.show();
|
||
$(`#selected_config_group_${id}`)
|
||
.children('a')
|
||
.tooltip('hide');
|
||
$(`#selected_config_group_${id}`).remove();
|
||
|
||
const puppetclassIds = $.parseJSON($(item).attr('data-puppetclass-ids'));
|
||
const inheritedIds = $.parseJSON(
|
||
$('#inherited_ids').attr('data-inherited-puppetclass-ids')
|
||
);
|
||
|
||
$.each(puppetclassIds, (index, puppetclassId) => {
|
||
const pc = $(`#selected_puppetclass_${puppetclassId}`);
|
||
const pcLink = $(`a[data-class-id='${puppetclassId}']`);
|
||
if (
|
||
pcLink.length > 0 &&
|
||
pc.length > 0 &&
|
||
$.inArray(puppetclassId, inheritedIds) === -1
|
||
) {
|
||
removePuppetClass(pcLink);
|
||
}
|
||
});
|
||
return false;
|
||
}
|
||
|
||
function findElementsForRemoveIcon(element) {
|
||
const clickedElement = element.parent().prev();
|
||
const ulId = `#${element.parent().attr('id')}`;
|
||
removeIconIfEmpty(clickedElement, ulId);
|
||
}
|
||
|
||
export function expandClassList(clickedElement, toggleElement) {
|
||
$(toggleElement).fadeToggle();
|
||
clickedElement.find('i').toggleClass('glyphicon-plus glyphicon-minus');
|
||
removeIconIfEmpty(clickedElement, toggleElement);
|
||
}
|
||
|
||
function removeIconIfEmpty(element, ulId) {
|
||
if ($(ulId).children(':visible').length === 0) {
|
||
element.find('i').hide();
|
||
}
|
||
}
|
Also available in: Unified diff
fixes #26554 - move class_edit to webpack.
this is a pure move + lint, no code changes introduced.