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 )