RT-Extension-FormTools
view release on metacpan or search on metacpan
html/Forms/dhandler view on Meta::CPAN
const values = JSON.parse(jQuery(this).attr('data-show-condition-values'));
const target = jQuery(this);
const syncShowCondition = function(source) {
let source_values = [];
if ( source ) {
if ( source.target ) {
source = jQuery(source.target);
}
const name = source.attr('name');
if ( source.closest('.formtools-item.hidden').length ) {
// this is a field hidden by other fields, ignoring all current values
}
else if (source.is(':checkbox') || source.is(':radio')) {
jQuery(':input[name="' + name +'"]:checked').each(function () {
source_values.push(jQuery(this).val());
});
}
else {
jQuery(':input[name="' + name +'"]').each(function () {
const val = jQuery(this).val();
if ( Array.isArray(val) ) {
source_values.push(...val);
}
else {
source_values.push(val);
}
});
}
}
let matched;
for ( let source_value of source_values ) {
if ( values.includes(source_value) ) {
matched = true;
}
}
let changed;
if ( matched ) {
if ( target.closest('.formtools-item').hasClass('hidden') ) {
target.closest('.formtools-item').removeClass('hidden');
// Set required attribute on newly visible required fields
target.closest('.formtools-item').find('[data-name]:has(.required) :input:not(.items-placeholder), :input.required:not(.items-placeholder)').attr('required', true);
changed = 1;
}
}
else {
if ( !target.closest('.formtools-item').hasClass('hidden') ) {
target.closest('.formtools-item').addClass('hidden');
// Remove required attribute from hidden elements
target.closest('.formtools-item').find(':input').attr('required', false);
changed = 1;
}
}
// cascade changes
if ( changed && target.find('select[name^="Object-RT::Ticket--CustomField"]').length ) {
const target_select = target.find('select[name^="Object-RT::Ticket--CustomField"]');
const target_name = target_select.attr('name');
if (jQuery('[data-show-condition-name="' + target_name + '"]').length) {
target_select.change();
}
}
};
jQuery(':input[type!=hidden][name="' + show_condition_name +'"]').change(syncShowCondition).change();
// Handle the case where show condition input is on previous pages
if ( jQuery(':input[type=hidden][name="' + show_condition_name +'"]').length ) {
syncShowCondition(jQuery(':input[type=hidden][name="' + show_condition_name +'"]'));
}
else if ( !jQuery(':input[name="' + show_condition_name +'"]').length && jQuery(':input[type=hidden][name="' + show_condition_name +'-Magic"]').length ) {
// Nothing is selected, hide the target element
syncShowCondition();
}
});
jQuery(':input[name=Back]').click(function() {
const form = jQuery(this).closest('form');
form.find(':input[required]').attr('required', false);
});
});
</script>
</&>
<%init>
my $path = $m->dhandler_arg;
my ($form_name, $page_name);
if ( $path =~ /^([\w\s]+)\/([-\w]+)$/ ) {
$form_name = $1;
$page_name = $2;
}
else {
$form_name = $path;
}
# Limit to names to letters, numbers, underscore, spaces
unless ( $form_name =~ /^[\w\s]+$/ ) {
RT->Logger->error("FormTools called with invalid form name: $form_name");
Abort('Invalid form name');
}
if ( $page_name ) {
unless ( $page_name =~ /^[-\w]+$/ ) {
RT->Logger->error("FormTools called with invalid page name: $page_name");
Abort('Invalid page name');
}
}
# Load FormTools configration and look for a configured
# form with the provided name.
my $form_attribute = RT::Attribute->new( $session{CurrentUser} );
$form_attribute->LoadByCols( Name => 'FormTools Form', Description => $form_name );
my $form_config;
( run in 0.678 second using v1.01-cache-2.11-cpan-e1769b4cff6 )