diff options
Diffstat (limited to 'perllib/FixMyStreet')
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 16 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/Contact.pm | 21 | ||||
-rw-r--r-- | perllib/FixMyStreet/Roles/Extra.pm | 50 |
3 files changed, 85 insertions, 2 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index 8ca6bbc22..fa5a55213 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -288,6 +288,22 @@ sub update_contacts : Private { $c->forward('/admin/update_extra_fields', [ $contact ]); $c->forward('contact_cobrand_extra_fields', [ $contact ]); + # Special form disabling form + if ($c->get_param('disable')) { + my $msg = $c->get_param('disable_message'); + $errors{category} = _('Please enter a message') unless $msg; + my $meta = { + code => '_fms_disable_', + variable => 'false', + protected => 'true', + disable_form => 'true', + description => $msg, + }; + $contact->update_extra_field($meta); + } else { + $contact->remove_extra_field('_fms_disable_'); + } + if ( %errors ) { $c->stash->{updated} = _('Please correct the errors below'); $c->stash->{contact} = $contact; diff --git a/perllib/FixMyStreet/DB/Result/Contact.pm b/perllib/FixMyStreet/DB/Result/Contact.pm index 3ce0ec66f..bc91c84ee 100644 --- a/perllib/FixMyStreet/DB/Result/Contact.pm +++ b/perllib/FixMyStreet/DB/Result/Contact.pm @@ -98,7 +98,7 @@ sub category_display { $self->translate_column('category'); } -sub get_metadata_for_editing { +sub get_all_metadata { my $self = shift; my @metadata = @{$self->get_extra_fields}; @@ -111,9 +111,19 @@ sub get_metadata_for_editing { return \@metadata; } +sub get_metadata_for_editing { + my $self = shift; + my $metadata = $self->get_all_metadata; + + # Ignore the special admin-form-created entry + my @metadata = grep { $_->{code} ne '_fms_disable_' } @$metadata; + + return \@metadata; +} + sub get_metadata_for_input { my $self = shift; - my $metadata = $self->get_metadata_for_editing; + my $metadata = $self->get_all_metadata; # Also ignore any we have with a 'server_set' automated attribute my @metadata = grep { !$_->{automated} || $_->{automated} ne 'server_set' } @$metadata; @@ -136,4 +146,11 @@ sub id_field { return $self->get_extra_metadata('id_field') || 'fixmystreet_id'; } +sub disable_form_field { + my $self = shift; + my $metadata = $self->get_all_metadata; + my ($field) = grep { $_->{code} eq '_fms_disable_' } @$metadata; + return $field; +} + 1; diff --git a/perllib/FixMyStreet/Roles/Extra.pm b/perllib/FixMyStreet/Roles/Extra.pm index 445f6d91c..883ac2fd7 100644 --- a/perllib/FixMyStreet/Roles/Extra.pm +++ b/perllib/FixMyStreet/Roles/Extra.pm @@ -135,6 +135,56 @@ sub push_extra_fields { $self->extra({ %$extra, $META_FIELD => [ @$existing, @fields ] }); } +=head2 update_extra_field + + $problem->update_extra_field( { ... } ); + +Given an extra field, will replace one with the same code in the +existing list of fields, or add to the end if not present. + +=cut + +sub update_extra_field { + my ($self, $field) = @_; + + # Can operate on list that uses code (Contact) or name (Problem), + # but make sure we have one of them + my $attr; + $attr = 'code' if $field->{code}; + $attr = 'name' if $field->{name}; + die unless $attr; + + my $existing = $self->get_extra_fields; + my $found; + foreach (@$existing) { + if ($_->{$attr} eq $field->{$attr}) { + $_ = $field; + $found = 1; + } + } + if (!$found) { + push @$existing, $field; + } + + $self->set_extra_fields(@$existing); +} + +=head2 remove_extra_field + + $problem->remove_extra_field( $code ); + +Given an extra field code, will remove it from the list of fields. + +=cut + +sub remove_extra_field { + my ($self, $code) = @_; + + my @fields = @{ $self->get_extra_fields() }; + @fields = grep { ($_->{code} || $_->{name}) ne $code } @fields; + $self->set_extra_fields(@fields); +} + =head1 HELPER METHODS For internal use mostly. |