aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--perllib/FixMyStreet/App/Controller/Report/New.pm9
-rw-r--r--perllib/FixMyStreet/DB/Result/Contact.pm10
-rw-r--r--perllib/FixMyStreet/Roles/Extra.pm28
-rw-r--r--t/app/model/extra.t8
-rw-r--r--templates/web/base/admin/category_edit.html31
5 files changed, 48 insertions, 38 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm
index 7960f5e4c..7b012e0a1 100644
--- a/perllib/FixMyStreet/App/Controller/Report/New.pm
+++ b/perllib/FixMyStreet/App/Controller/Report/New.pm
@@ -616,14 +616,7 @@ sub setup_categories_and_bodies : Private {
push @category_options, $contact->category;
my $metas = $contact->get_metadata_for_input;
- if (scalar @$metas) {
- foreach (@$metas) {
- if (ref $_->{values} eq 'HASH') {
- $_->{values} = [ map { { name => $_->{name}[0], key => $_->{key}[0] } } @{$_->{values}->{value}} ];
- }
- }
- $category_extras{ $contact->category } = $metas;
- }
+ $category_extras{$contact->category} = $metas if @$metas;
my $body_send_method = $bodies{$contact->body_id}->send_method || '';
$c->stash->{unresponsive}{$contact->category} = $contact->body_id
diff --git a/perllib/FixMyStreet/DB/Result/Contact.pm b/perllib/FixMyStreet/DB/Result/Contact.pm
index b37734e7a..0c9a7c0d8 100644
--- a/perllib/FixMyStreet/DB/Result/Contact.pm
+++ b/perllib/FixMyStreet/DB/Result/Contact.pm
@@ -86,7 +86,15 @@ __PACKAGE__->many_to_many( response_priorities => 'contact_response_priorities',
sub get_metadata_for_input {
my $self = shift;
my $id_field = $self->id_field;
- return [ grep { $_->{code} !~ /^(easting|northing|$id_field)$/ } @{$self->get_extra_fields} ];
+ my @metadata = grep { $_->{code} !~ /^(easting|northing|$id_field)$/ } @{$self->get_extra_fields};
+
+ # Just in case the extra data is in an old parsed format
+ foreach (@metadata) {
+ if (ref $_->{values} eq 'HASH') {
+ $_->{values} = [ map { { name => $_->{name}[0], key => $_->{key}[0] } } @{$_->{values}->{value}} ];
+ }
+ }
+ return \@metadata;
}
sub id_field {
diff --git a/perllib/FixMyStreet/Roles/Extra.pm b/perllib/FixMyStreet/Roles/Extra.pm
index 19fc91873..dc2e5c241 100644
--- a/perllib/FixMyStreet/Roles/Extra.pm
+++ b/perllib/FixMyStreet/Roles/Extra.pm
@@ -23,13 +23,13 @@ And
# e.g. for sites like Zurich (but handled gracefully otherwise)
$problem->set_extra_metadata( overdue => 1 );
- if ($problem->get_extra_metadata( 'overdue')) { ... }
+ if ($problem->get_extra_metadata('overdue')) { ... }
=head1 METHODS
=head2 set_extra_metadata
- $problem->set_extra_metadata( overdue => 1);
+ $problem->set_extra_metadata(overdue => 1);
=cut
@@ -42,7 +42,7 @@ sub set_extra_metadata {
=head2 set_extra_metadata_if_undefined
- $problem->set_extra_metadata_if_undefined( overdue => 1);
+ $problem->set_extra_metadata_if_undefined(overdue => 1);
# as above, but won't set if, for example 'overdue' is already set to 0
=cut
@@ -72,33 +72,21 @@ sub unset_extra_metadata {
=head2 get_extra_metadata
+ my $metadata = $problem->get_extra_metadata;
my $overdue = $problem->get_extra_metadata('overdue');
=cut
-sub get_extra_metadata {
- my ($self, $key) = @_;
- my $extra = $self->get_extra();
-
- return $extra->{$key};
-};
-
-=head2 get_extra_metadata_as_hashref
-
- my $hashref = $contact->get_extra_metadata_as_hashref();
-
-=cut
-
my $META_FIELD = '_fields';
-sub get_extra_metadata_as_hashref {
- my ($self) = @_;
+sub get_extra_metadata {
+ my ($self, $key) = @_;
my $extra = $self->get_extra();
my %extra = %$extra;
delete $extra{$META_FIELD};
- return \%extra;
-}
+ return $key ? $extra{$key} : \%extra;
+};
=head2 get_extra_fields
diff --git a/t/app/model/extra.t b/t/app/model/extra.t
index 52e2d839c..3b46ce128 100644
--- a/t/app/model/extra.t
+++ b/t/app/model/extra.t
@@ -54,14 +54,14 @@ subtest 'Old list layout transparently upgraded' => sub {
subtest 'metadata' => sub {
my $contact = get_test_contact([]);
- is_deeply $contact->get_extra_metadata_as_hashref(), {}, 'No extra metadata';
+ is_deeply $contact->get_extra_metadata, {}, 'No extra metadata';
$contact->set_extra_metadata('foo' => 'bar');
is $contact->get_extra_metadata('foo'), 'bar', 'extra metadata set...';
$contact->update;
$contact->discard_changes;
is $contact->get_extra_metadata('foo'), 'bar', '... and retrieved';
- is_deeply $contact->get_extra_metadata_as_hashref(), { foo => 'bar' }, 'No extra metadata';
+ is_deeply $contact->get_extra_metadata, { foo => 'bar' }, 'No extra metadata';
};
};
@@ -88,14 +88,14 @@ subtest 'Default hash layout' => sub {
subtest 'metadata' => sub {
my $contact = get_test_contact();
- is_deeply $contact->get_extra_metadata_as_hashref(), {}, 'No extra metadata';
+ is_deeply $contact->get_extra_metadata, {}, 'No extra metadata';
$contact->set_extra_metadata('foo' => 'bar');
is $contact->get_extra_metadata('foo'), 'bar', 'extra metadata set...';
$contact->update;
$contact->discard_changes;
is $contact->get_extra_metadata( 'foo'), 'bar', '... and retrieved';
- is_deeply $contact->get_extra_metadata_as_hashref(), { foo => 'bar' }, 'No extra metadata';
+ is_deeply $contact->get_extra_metadata, { foo => 'bar' }, 'No extra metadata';
$contact->unset_extra_metadata('foo');
is $contact->get_extra_metadata('foo'), undef, 'extra metadata now unset';
diff --git a/templates/web/base/admin/category_edit.html b/templates/web/base/admin/category_edit.html
index cdf371643..6aec0c132 100644
--- a/templates/web/base/admin/category_edit.html
+++ b/templates/web/base/admin/category_edit.html
@@ -23,11 +23,7 @@
<p><strong>[% loc('Category:') %] </strong>[% contact.category | html %]
<input type="hidden" name="category" value="[% contact.category | html %]" >
<input type="hidden" name="token" value="[% csrf_token %]" >
- [% IF contact.extra %]
- <p><strong>[% loc('Extra data:') %] </strong>
- [% USE Dumper %]
- [% Dumper.dump(contact.extra) | html %]</p>
- [% END %]
+
<p><strong>[% loc('Email:') %] </strong>
<input type="text" name="email" value="[% contact.email | html %]" size="30">
@@ -86,6 +82,31 @@
<p><input type="submit" name="Save changes" value="[% loc('Save changes') %]">
</form>
+[% IF contact.extra %]
+<h2>[% loc('Extra data:') %] </h2>
+<dl>
+ [% FOR pair IN contact.get_extra_metadata %]
+ <dt>[% pair.key %]</dt> <dd>[% pair.value %]</dd>
+ [% END %]
+</dl>
+<ul>
+ [% FOR meta IN contact.get_metadata_for_input %]
+ <li>
+ [% meta.order %], <code>[% meta.code %]</code>, [% meta.datatype %],
+ [% meta.required ? loc('required') : loc('optional') %]
+ <br><small>[% meta.description %]</small>
+ [% IF meta.variable != 'false' AND meta.exists('values') %]
+ <ul>
+ [% FOR option IN meta.values %]
+ <li>[% option.name %] <small>([% option.key %])</small></li>
+ [% END %]
+ </ul>
+ [%- END %]
+ </li>
+ [%- END %]
+</ul>
+[% END %]
+
<h2>[% loc('History') %]</h2>
<table border="1">
<tr>