aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/FixMyStreet')
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin/Bodies.pm16
-rw-r--r--perllib/FixMyStreet/DB/Result/Contact.pm21
-rw-r--r--perllib/FixMyStreet/Roles/Extra.pm50
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.