OpusVL-Preferences

 view release on metacpan or  search on metacpan

lib/OpusVL/FB11X/Preferences/Role/ParameterValueEditing.pm  view on Meta::CPAN

package OpusVL::FB11X::Preferences::Role::ParameterValueEditing;

use v5.24;
use Moose::Role;
use Switch::Plain 'sswitch';

sub add_prefs_defaults
{
    my $self = shift;
    my $c = shift;
    my $args = shift;
    my $defaults = $args->{defaults};
    my $resultset = $args->{resultset};
    my $object = $args->{object};

    my $field_rs = $resultset ? $resultset->prf_defaults : $object->prf_defaults;
    my @fields = $field_rs->active->all;
    for my $field (@fields)
    {
        my $value;
        if($object) {
            $value = $object->prf_get($field->name);
        } else {
            $value = $field->default_value;
        }
        if($field->can('confirmation_required') && $field->confirmation_required)
        {
            $defaults->{'confirm_global_fields_' . $field->name} = $value;
        }
        $defaults->{'global_fields_' . $field->name} = $value;
    }
    return $defaults;
}

# DEBT: I don't know how to decouple this from the token processor because it's
# doing audit trail stuff. The Brain architecture needs to be more mature to do
# that.
sub update_prefs_values
{
    my ($self, $c, $object) = @_;

    # FIXME: to use two methods below instead.
    my $form = $c->stash->{form};
    my @fields = $object->prf_defaults->active->all;
    my $params = OpusVL::FB11::Hive->service('sysparams')->for_component('preferences');

    for my $field (@fields)
    {
        my $name = $field->name;
        my $value = $form->param_value('global_fields_' . $name);
        unless($object->prf_get($name) eq $value)
        {
            if ($field->audit) {
                #my $url = $c->uri_for(
                #    $c->controller('Modules::TokenFunctions')
                #        ->action_for('view', [ $object->id ])
                #);

                my $details = {
                    evt_type => 'pref_change',
                    fmt_args => {
                        token => $object->safe_name,
                        field => $field->name,
                        encrypted_data => $field->encrypted,
                    },
                };
                unless($field->encrypted)
                {
                    $details->{fmt_args}->{old_value} = $object->prf_get($name);
                    $details->{fmt_args}->{new_value} = $value;
                }
                $object->evt_raise_event($details);
            }

            if (($params->get('audit.email.alerts')||'') =~ /yes/i) {
                my $phone_field = $params->get('audit.phone.field');
                if ($field->name eq 'email' or $field->name eq $phone_field) {
                    #($self, $c, $event, $user, $outlet, $amount, $transaction_type, $token, $to)
                    my $to = $field->name eq 'email' ? $object->prf_get('email') : $value;

                    if ($field->name eq $phone_field) { $object->prf_set($name, $value); }
                    # DEBT: We need a mail service in the hive
                    $c->controller('TokenFunctions')->_send_email(
                        $c,
                        undef,
                        $c->user,
                        undef,
                        undef,
                        'audit_' . $field->name,
                        $object,
                        $object->prf_get('email'),
                    );
                }
            }
            $object->prf_set($name, $value);
        }
    }
}

sub get_prefs_values_from_form
{
    my ($self, $c, $object) = @_;

    my @fields = $object->prf_defaults->active->all;
    return $self->collect_values_from_form($c, @fields);
}

sub collect_values_from_form
{
    my ($self, $c, @fields) = @_;
    return $self->collect_values_from_form_ex($c, {}, @fields);
}

sub collect_values_from_form_ex
{
    my ($self, $c, $args, @fields) = @_;
    my $form = $c->stash->{form};
    $args //= {};
    $args->{prefix} //= 'global_fields_';

    my $values = {};

    for my $field (@fields)
    {
        my $name = $field->name;
        my $value = $c->req->param($args->{prefix} . $name);
        
        # strip whitespace
        if ($value) {
            $value =~ s/^\s+//g;
            $value =~ s/\s+$//g;
        }

        $values->{$name} = $value;
    }
    return $values;
}

sub prefs_hash_to_array
{
    my $self = shift;
    my $rs = shift;
    my $hash = shift;

    my @d = sort { $a->{param}->display_order <=> $b->{param}->display_order 
                    || $a->{param}->name cmp $b->{param}->name } 
            map { { 
                name => $_, 
                value => $hash->{$_}, 
                param => $rs->prf_defaults->find({ name => $_ }),
            } } keys %$hash;
    return @d;
}

sub update_prefs_from_hash
{
    my ($self, $object, $hash) = @_;

    for my $name (keys %$hash)
    {
        my $value = $hash->{$name};
        unless($object->prf_get($name) eq $value)
        {
            $object->prf_set($name, $value);
        }
    }
}

sub construct_global_data_form
{
    my $self = shift;
    my $c = shift;
    my $args = shift;
    my $source = $args->{resultset} || $args->{object};
    my $search = $args->{search_form};

    my @fields = $search ? $source->prf_defaults->for_search_criteria
                         : $source->prf_defaults->active->display_order;
    $self->construct_form_fields($c, $search, @fields);
    unless($search)
    {
        my $owner_id = $source->can('get_owner_type') ? $source->get_owner_type->id : $source->prf_owner_type_id;
        my $form = $c->stash->{form};
        my $global_fields = $form->get_all_element('prf_fields');
        $global_fields->element({
            name => 'prf_owner_type_id',
            type => 'Hidden',
            default => $owner_id,
        });
        unless($form->get_all_element('id'))
        {
            $global_fields->element({
                name => 'id',
                type => 'Hidden',
                default => $source->id,
            });
        }
    }
}

sub construct_global_data_search_form
{
    my $self = shift;
    my $c = shift;
    my $args = shift;
    $args->{search_form} = 1;
    return $self->construct_global_data_form($c, $args);
}

sub construct_form_fields
{
    my ($self, $c, $search, @fields) = @_;
    return $self->construct_form_fields_ex($c, $search, {}, @fields);
}

lib/OpusVL/FB11X/Preferences/Role/ParameterValueEditing.pm  view on Meta::CPAN

                    $extra_field{label} = 'Confirm ' . $extra_field{label};
                    delete $extra_field{javascript} if exists $extra_field{javascript};
                    delete $extra_field{validator} if exists $extra_field{validator};
                    $extra_field{constraints} = [] unless(exists $extra_field{constraints});
                    push @{$extra_field{constraints}}, { type => 'Equal', message => $missmatch_msg, others => $original_name };
                }
            }
            $details->{attributes}->{class} 
                = join ' ', $details->{attributes}->{class}->@*
                if $details->{attributes}->{class};
            $details->{container_attributes}->{class}
                = join ' ', $details->{container_attributes}->{class}->@*
                if $details->{container_attributes}->{class};
            my $element = $global_fields->element($details);
            my $extra_element = $global_fields->element(\%extra_field) if %extra_field;
        }
        $global_fields->remove_element($no_fields);
    }
    # NOTE: caller must call $form->process afterwards
}

sub field_type_info
{
    my ($self, $c, $fields, @field_list) = @_;

    for my $field (@field_list)
    {
        my $name = $field->name;
        my $field_name = "extra_field_$name";
        my $field_info = {
            name => $field_name,
            type => $field->data_type,
            label => $field->comment,
        };
        if($field->data_type eq 'select')
        {
            $field_info->{options} = $field->form_options;
        }
        if($field->required)
        {
            $field_info->{required} = 1;
        }
        if($field->can('unique_field') && $field->unique_field)
        {
            $field_info->{unique_field} = 1;
        }
        push @$fields, $field_info;
    }
}

1;

=head1 NAME

OpusVL::AppKitX::TokenProcessor::Admin::Role::ParameterValueEditing

=head1 DESCRIPTION

=head1 METHODS

=head2 add_prefs_defaults

=head2 update_prefs_values

=head2 get_prefs_values_from_form

=head2 collect_values_from_form

=head2 prefs_hash_to_array

=head2 update_prefs_from_hash

=head2 construct_global_data_form

=head2 construct_global_data_search_form

=head2 construct_form_fields

=head2 field_type_info


=head1 ATTRIBUTES


=head1 LICENSE AND COPYRIGHT

Copyright 2012 OpusVL.

This software is licensed according to the "IP Assignment Schedule" provided with the development project.

=cut



( run in 1.729 second using v1.01-cache-2.11-cpan-5a3173703d6 )