diff options
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin.pm | 2 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/Contact.pm | 14 | ||||
-rw-r--r-- | t/app/controller/admin/reportextrafields.t | 56 | ||||
-rw-r--r-- | templates/web/base/admin/contact-form.html | 2 | ||||
-rw-r--r-- | templates/web/base/admin/extra-metadata-form.html | 12 |
6 files changed, 83 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index b1b052008..7ec954119 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ ## Releases * Unreleased + - Bugfixes: + - Don't remove automated fields when editing contacts #2163 * v2.3.4 (7th June 2018) - Bugfixes: diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm index 7d04f5ff9..95969016f 100644 --- a/perllib/FixMyStreet/App/Controller/Admin.pm +++ b/perllib/FixMyStreet/App/Controller/Admin.pm @@ -2145,6 +2145,8 @@ sub update_extra_fields : Private { $meta->{variable} = $notice ? 'false' : 'true'; $meta->{description} = $c->get_param("metadata[$i].description"); $meta->{datatype_description} = $c->get_param("metadata[$i].datatype_description"); + $meta->{automated} = $c->get_param("metadata[$i].automated") + if $c->get_param("metadata[$i].automated"); if ( $meta->{datatype} eq "singlevaluelist" ) { $meta->{values} = []; diff --git a/perllib/FixMyStreet/DB/Result/Contact.pm b/perllib/FixMyStreet/DB/Result/Contact.pm index c544f084a..4250a20c7 100644 --- a/perllib/FixMyStreet/DB/Result/Contact.pm +++ b/perllib/FixMyStreet/DB/Result/Contact.pm @@ -94,14 +94,12 @@ sub category_display { $self->translate_column('category'); } -sub get_metadata_for_input { +sub get_metadata_for_editing { my $self = shift; my $id_field = $self->id_field; my @metadata = @{$self->get_extra_fields}; # First, ones we always want to ignore (hard-coded, old system) @metadata = grep { $_->{code} !~ /^(easting|northing|closest_address|$id_field)$/ } @metadata; - # Also ignore any we have with a 'server_set' automated attribute - @metadata = grep { !$_->{automated} || $_->{automated} ne 'server_set' } @metadata; # Just in case the extra data is in an old parsed format foreach (@metadata) { @@ -112,6 +110,16 @@ sub get_metadata_for_input { return \@metadata; } +sub get_metadata_for_input { + my $self = shift; + my $metadata = $self->get_metadata_for_editing; + + # Also ignore any we have with a 'server_set' automated attribute + my @metadata = grep { !$_->{automated} || $_->{automated} ne 'server_set' } @$metadata; + + return \@metadata; +} + sub id_field { my $self = shift; return $self->get_extra_metadata('id_field') || 'fixmystreet_id'; diff --git a/t/app/controller/admin/reportextrafields.t b/t/app/controller/admin/reportextrafields.t index fb06665f4..4549eeadf 100644 --- a/t/app/controller/admin/reportextrafields.t +++ b/t/app/controller/admin/reportextrafields.t @@ -120,6 +120,34 @@ FixMyStreet::override_config { $contact->update; }; + subtest 'check contact updating does not remove server_set' => sub { + $contact->set_extra_fields(({ code => 'POT', automated => 'server_set' })); + $contact->update; + + $mech->get_ok("/admin/body/" . $body->id . "/" . $contact->category); + $mech->submit_form_ok( { with_fields => { + email => 'test4@example.com', + note => 'test4 note', + } } ); + + $mech->content_like(qr'test4@example.com's); + + $contact->discard_changes; + my $meta_data = $contact->get_extra_fields; + is $contact->email, 'test4@example.com', 'contact updated'; + is_deeply $meta_data, [ { + order => 0, + datatype => 'string', + datatype_description => '', + description => '', + required => 'false', + variable => 'true', + code => 'POT', + automated => 'server_set' + } ], "automated fields not unset"; + }; + + subtest 'Create and update new ReportExtraFields' => sub { my $extra_fields = []; @@ -181,11 +209,39 @@ FixMyStreet::override_config { { name => "name1", key => "key1" }, ] }; + $object->discard_changes; is_deeply $object->get_extra_fields, $extra_fields, 'new list field was added'; is $object->language, "en-gb", "Correct language was set"; $mech->get_ok("/admin/reportextrafields/" . $object->id); + $mech->submit_form_ok({ with_fields => { + "metadata[2].order" => "3", + "metadata[2].code" => "automated_test", + "metadata[2].required" => undef, + "metadata[2].notice" => "", + "metadata[2].description" => "", + "metadata[2].datatype_description" => "", + "metadata[2].datatype" => "string", + "metadata[2].automated" => "server_set", + }}); + + push @$extra_fields, { + order => "3", + code => "automated_test", + required => "false", + variable => "true", + description => "", + datatype_description => "", + datatype => "string", + automated => "server_set", + }; + + $object->discard_changes; + is_deeply $object->get_extra_fields, $extra_fields, 'new automated field was added'; + is $object->language, "en-gb", "Correct language was set"; + + $mech->get_ok("/admin/reportextrafields/" . $object->id); $mech->submit_form_ok( { with_fields => { "metadata[1].values[1].key" => "key2", "metadata[1].values[1].name" => "name2", diff --git a/templates/web/base/admin/contact-form.html b/templates/web/base/admin/contact-form.html index 1157e781e..24021ebf3 100644 --- a/templates/web/base/admin/contact-form.html +++ b/templates/web/base/admin/contact-form.html @@ -144,5 +144,5 @@ as well.") %] <dt>[% pair.key %]</dt> <dd>[% pair.value %]</dd> [% END %] </dl> - [% INCLUDE 'admin/extra-metadata-form.html' metas=(contact.get_metadata_for_input OR []) %] + [% INCLUDE 'admin/extra-metadata-form.html' metas=(contact.get_metadata_for_editing OR []) %] </form> diff --git a/templates/web/base/admin/extra-metadata-form.html b/templates/web/base/admin/extra-metadata-form.html index 6a88a3c1e..9264d98d9 100644 --- a/templates/web/base/admin/extra-metadata-form.html +++ b/templates/web/base/admin/extra-metadata-form.html @@ -6,7 +6,17 @@ <div class="admin-hint"><p>[% loc('The ordering of this field on the report page. Fields are shown in ascending order according to this value.') %]</p></div> <label> [% loc('Order') %] - <input name="metadata[[% loop.index %]].order" data-field-name="order" type=text value="[% meta.order | html %]"> + <input name="metadata[[% loop.index %]].order" data-field-name="order" type=text value="[% meta.order OR 0 | html %]"> + </label> + + <div class="admin-hint"><p>[% loc('Whether the field is displayed to the user, included as a hidden field and automatically populated, or set by the server upon Open311 submission. This field is usually set automatically.') %]</p></div> + <label> + [% loc('Automated') %] + <select name="metadata[[% loop.index %]].automated" data-field-name="automated" class="js-metadata-item-type"> + <option value="" [% meta.automated == '' ? 'selected' : '' %]></option> + <option value="server_set" [% meta.automated == 'server_set' ? 'selected' : '' %]>[% loc('Server Set') %]</option> + <option value="hidden_field" [% meta.automated == 'hidden_field' ? 'selected' : '' %]>[% loc('Hidden Field') %]</option> + </select> </label> <div class="admin-hint"><p>[% loc('The code used to store this field value in the database. e.g. <code>address</code> would be available as <code>problem.extra.address</code> in the templates.') %]</p></div> |