aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Somerville <matthew-github@dracos.co.uk>2019-05-28 15:52:02 +0100
committerMatthew Somerville <matthew-github@dracos.co.uk>2019-05-28 15:52:02 +0100
commit6798a63297e4954344eefbf51147a971f30b58d2 (patch)
treeaff6cf7bc8f3e6de3271dcaccd81cebd8276e44e
parent323d3a632453bfcd10360fe2c2b9e4d684f350c8 (diff)
parent8c8b62e2b3a8af1b1f6fafe4080296a3826b7c1e (diff)
Merge branch 'bexley'
-rw-r--r--perllib/FixMyStreet/Cobrand/Bexley.pm121
-rw-r--r--perllib/FixMyStreet/Cobrand/UK.pm1
-rw-r--r--perllib/FixMyStreet/Cobrand/UKCouncils.pm7
-rw-r--r--perllib/Open311/GetServiceRequestUpdates.pm5
-rw-r--r--perllib/Open311/PopulateServiceList.pm2
-rw-r--r--t/cobrand/bexley.t64
-rw-r--r--t/open311/getservicerequestupdates.t100
-rw-r--r--t/open311/post-service-request-updates.t25
-rw-r--r--templates/email/bexley/_email_color_overrides.html19
-rw-r--r--templates/web/base/report/new/category_wrapper.html2
-rw-r--r--templates/web/bexley/footer_extra_js.html13
-rw-r--r--templates/web/bexley/header_extra.html1
-rw-r--r--templates/web/bexley/header_logo.html2
-rw-r--r--templates/web/bexley/main_nav_items.html55
-rw-r--r--templates/web/bexley/tracking_code.html15
-rw-r--r--templates/web/fixmystreet.com/footer_extra_js.html1
-rw-r--r--web/cobrands/bathnes/assets.js16
-rw-r--r--web/cobrands/bathnes/js.js8
-rw-r--r--web/cobrands/bathnes/staff.js4
-rw-r--r--web/cobrands/bexley/_colours.scss53
-rw-r--r--web/cobrands/bexley/base.scss125
-rw-r--r--web/cobrands/bexley/images/logo.pngbin0 -> 7250 bytes
-rw-r--r--web/cobrands/bexley/js.js157
-rw-r--r--web/cobrands/bexley/layout.scss33
-rw-r--r--web/cobrands/bristol/assets.js32
-rw-r--r--web/cobrands/bromley/assets.js20
-rw-r--r--web/cobrands/bromley/base.scss24
-rw-r--r--web/cobrands/buckinghamshire/assets.js44
-rw-r--r--web/cobrands/buckinghamshire/js.js8
-rw-r--r--web/cobrands/fixmystreet/assets.js19
-rw-r--r--web/cobrands/highways/assets.js4
-rw-r--r--web/cobrands/lincolnshire/assets.js44
-rw-r--r--web/cobrands/lincolnshire/roadworks.js4
-rw-r--r--web/cobrands/northamptonshire/assets.js20
-rw-r--r--web/cobrands/sass/_base.scss34
35 files changed, 876 insertions, 206 deletions
diff --git a/perllib/FixMyStreet/Cobrand/Bexley.pm b/perllib/FixMyStreet/Cobrand/Bexley.pm
new file mode 100644
index 000000000..c89fd9895
--- /dev/null
+++ b/perllib/FixMyStreet/Cobrand/Bexley.pm
@@ -0,0 +1,121 @@
+package FixMyStreet::Cobrand::Bexley;
+use parent 'FixMyStreet::Cobrand::Whitelabel';
+
+use strict;
+use warnings;
+
+sub council_area_id { 2494 }
+sub council_area { 'Bexley' }
+sub council_name { 'London Borough of Bexley' }
+sub council_url { 'bexley' }
+sub example_places { ( 'DA6 7AT', "Chieveley Road" ) }
+sub get_geocoder { 'OSM' }
+
+sub enable_category_groups { 1 }
+sub suggest_duplicates { 1 }
+
+sub base_url {
+ my $self = shift;
+ return $self->next::method() if FixMyStreet->config('STAGING_SITE');
+ # uncoverable statement
+ return 'https://fix.bexley.gov.uk';
+}
+
+sub disambiguate_location {
+ my $self = shift;
+ my $string = shift;
+
+ return {
+ %{ $self->SUPER::disambiguate_location() },
+ centre => '51.46088,0.142359',
+ bounds => [ 51.408484, 0.074653, 51.515542, 0.2234676 ],
+ };
+}
+
+sub on_map_default_status { 'open' }
+
+sub contact_email {
+ my $self = shift;
+ return join( '@', 'customer.services', $self->council_url . '.gov.uk' );
+}
+
+sub open311_munge_update_params {
+ my ($self, $params, $comment, $body) = @_;
+
+ $params->{service_request_id_ext} = $comment->problem->id;
+
+ my $contact = $comment->result_source->schema->resultset("Contact")->not_deleted->find({
+ body_id => $body->id,
+ category => $comment->problem->category
+ });
+ $params->{service_code} = $contact->email;
+}
+
+sub open311_get_update_munging {
+ my ($self, $comment) = @_;
+
+ # If we've received an update via Open311 that's closed
+ # or fixed the report, also close it to updates.
+ $comment->problem->set_extra_metadata(closed_updates => 1)
+ if !$comment->problem->is_open;
+}
+
+sub lookup_site_code_config {
+ # uncoverable subroutine
+ # uncoverable statement
+ {
+ buffer => 200, # metres
+ url => "https://tilma.mysociety.org/mapserver/bexley",
+ srsname => "urn:ogc:def:crs:EPSG::27700",
+ typename => "Streets",
+ property => "NSG_REF",
+ accept_feature => sub { 1 }
+ }
+}
+
+sub open311_config {
+ my ($self, $row, $h, $params) = @_;
+
+ my $extra = $row->get_extra_fields;
+
+ # Reports made via the app probably won't have a NSGRef because we don't
+ # display the road layer. Instead we'll look up the closest asset from the
+ # WFS service at the point we're sending the report over Open311.
+ if (!$row->get_extra_field_value('NSGRef')) {
+ if (my $ref = $self->lookup_site_code($row)) {
+ push @$extra, { name => 'NSGRef', description => 'NSG Ref', value => $ref };
+ }
+ }
+
+ $row->set_extra_fields(@$extra);
+}
+
+sub admin_user_domain { 'bexley.gov.uk' }
+
+sub open311_post_send {
+ my ($self, $row, $h) = @_;
+
+ # Check Open311 was successful
+ return unless $row->external_id;
+
+ return unless $row->category eq 'Abandoned and untaxed vehicles'
+ || $row->category eq 'Animal fouling';
+
+ my $mb = FixMyStreet->config('STAGING_SITE') ? 'digital-team' : 'P1sfromContactCentre';
+ my $e = join('@', $mb, $self->admin_user_domain);
+ my $sender = FixMyStreet::SendReport::Email->new( to => [ [ $e, 'Bexley P1 email' ] ] );
+
+ if ($row->category eq 'Abandoned and untaxed vehicles') {
+ my ($burnt) = grep { $_->{name} eq 'burnt' } @{$row->get_extra_fields};
+ return unless $burnt && $burnt->{value} eq 'Yes';
+ }
+
+ $self->open311_config($row); # Populate NSGRef again if needed
+
+ my $extra_data = join "; ", map { "$_->{description}: $_->{value}" } @{$row->get_extra_fields};
+ $h->{additional_information} = $extra_data;
+
+ $sender->send($row, $h);
+}
+
+1;
diff --git a/perllib/FixMyStreet/Cobrand/UK.pm b/perllib/FixMyStreet/Cobrand/UK.pm
index 1c6ebe29a..da0356664 100644
--- a/perllib/FixMyStreet/Cobrand/UK.pm
+++ b/perllib/FixMyStreet/Cobrand/UK.pm
@@ -107,6 +107,7 @@ sub short_name {
return 'Durham+County' if $name eq 'Durham County Council';
return 'Durham+City' if $name eq 'Durham City Council';
+ $name =~ s/^London Borough of //;
$name =~ s/ (Borough|City|District|County) Council$//;
$name =~ s/ Council$//;
$name =~ s/ & / and /;
diff --git a/perllib/FixMyStreet/Cobrand/UKCouncils.pm b/perllib/FixMyStreet/Cobrand/UKCouncils.pm
index 0926dec4a..09ca6c535 100644
--- a/perllib/FixMyStreet/Cobrand/UKCouncils.pm
+++ b/perllib/FixMyStreet/Cobrand/UKCouncils.pm
@@ -159,6 +159,13 @@ sub all_reports_single_body {
sub reports_body_check {
my ( $self, $c, $code ) = @_;
+ # Deal with Bexley name not starting with short name
+ if ($code =~ /bexley/i) {
+ my $body = $c->model('DB::Body')->search( { name => { -like => "%$code%" } } )->single;
+ $c->stash->{body} = $body;
+ return $body;
+ }
+
# We want to make sure we're only on our page.
unless ( $self->council_name =~ /^\Q$code\E/ ) {
$c->res->redirect( 'https://www.fixmystreet.com' . $c->req->uri->path_query, 301 );
diff --git a/perllib/Open311/GetServiceRequestUpdates.pm b/perllib/Open311/GetServiceRequestUpdates.pm
index 3b436aaa7..8193aaa9b 100644
--- a/perllib/Open311/GetServiceRequestUpdates.pm
+++ b/perllib/Open311/GetServiceRequestUpdates.pm
@@ -86,6 +86,8 @@ sub update_comments {
return 0;
}
+ my $cobrand = $body->get_cobrand_handler;
+
for my $request (@$requests) {
my $request_id = $request->{service_request_id};
@@ -191,6 +193,9 @@ sub update_comments {
$comment->state('hidden') unless $comment->text || $comment->photo
|| ($comment->problem_state && $state ne $old_state);
+ $cobrand->call_hook(open311_get_update_munging => $comment)
+ if $cobrand;
+
# As comment->created has been looked at above, its time zone has been shifted
# to TIME_ZONE (if set). We therefore need to set it back to local before
# insertion. We also then need a clone, otherwise the setting of lastupdate
diff --git a/perllib/Open311/PopulateServiceList.pm b/perllib/Open311/PopulateServiceList.pm
index d506111ec..ad7288c62 100644
--- a/perllib/Open311/PopulateServiceList.pm
+++ b/perllib/Open311/PopulateServiceList.pm
@@ -226,7 +226,7 @@ sub _add_meta_to_contact {
# turn the data into something a bit more friendly to use
my @meta =
# remove trailing colon as we add this when we display so we don't want 2
- map { $_->{description} =~ s/:\s*//; $_ }
+ map { $_->{description} =~ s/:\s*$//; $_ }
# there is a display order and we only want to sort once
sort { $a->{order} <=> $b->{order} }
@{ $meta_data->{attributes} };
diff --git a/t/cobrand/bexley.t b/t/cobrand/bexley.t
new file mode 100644
index 000000000..e6f400e3d
--- /dev/null
+++ b/t/cobrand/bexley.t
@@ -0,0 +1,64 @@
+use CGI::Simple;
+use Test::MockModule;
+use FixMyStreet::TestMech;
+use FixMyStreet::Script::Reports;
+
+use_ok 'FixMyStreet::Cobrand::Bexley';
+
+my $ukc = Test::MockModule->new('FixMyStreet::Cobrand::UKCouncils');
+$ukc->mock('lookup_site_code', sub {
+ my ($self, $row, $buffer) = @_;
+ is $row->latitude, 51.408484, 'Correct latitude';
+ return "Road ID";
+});
+
+my $cobrand = FixMyStreet::Cobrand::Bexley->new;
+like $cobrand->contact_email, qr/bexley/;
+is $cobrand->on_map_default_status, 'open';
+is_deeply $cobrand->disambiguate_location->{bounds}, [ 51.408484, 0.074653, 51.515542, 0.2234676 ];
+
+my $mech = FixMyStreet::TestMech->new;
+
+my $body = $mech->create_body_ok(2494, 'London Borough of Bexley', {
+ send_method => 'Open311', api_key => 'key', 'endpoint' => 'e', 'jurisdiction' => 'j' });
+$mech->create_contact_ok(body_id => $body->id, category => 'Abandoned and untaxed vehicles', email => "ABAN");
+
+FixMyStreet::override_config {
+ ALLOWED_COBRANDS => [ 'bexley' ],
+ MAPIT_URL => 'http://mapit.uk/',
+ STAGING_FLAGS => { send_reports => 1, skip_checks => 0 },
+}, sub {
+
+ subtest 'cobrand displays council name' => sub {
+ ok $mech->host("bexley.fixmystreet.com"), "change host to bexley";
+ $mech->get_ok('/');
+ $mech->content_contains('Bexley');
+ };
+
+ subtest 'cobrand displays council name' => sub {
+ $mech->get_ok('/reports/Bexley');
+ $mech->content_contains('Bexley');
+ };
+
+ my ($report) = $mech->create_problems_for_body(1, $body->id, 'On Road', {
+ category => 'Abandoned and untaxed vehicles', cobrand => 'bexley',
+ latitude => 51.408484, longitude => 0.074653,
+ });
+ $report->set_extra_fields({ 'name' => 'burnt', description => 'Was it burnt?', 'value' => 'Yes' });
+ $report->update;
+
+ subtest 'Server-side NSGRef included' => sub {
+ my $test_data = FixMyStreet::Script::Reports::send();
+ my $req = $test_data->{test_req_used};
+ my $c = CGI::Simple->new($req->content);
+ is $c->param('service_code'), 'ABAN';
+ is $c->param('attribute[NSGRef]'), 'Road ID';
+
+ my $email = $mech->get_email;
+ like $email->header('To'), qr/"Bexley P1 email".*bexley/;
+ like $mech->get_text_body_from_email($email), qr/NSG Ref: Road ID/;
+ };
+
+};
+
+done_testing();
diff --git a/t/open311/getservicerequestupdates.t b/t/open311/getservicerequestupdates.t
index e53921156..130b618c9 100644
--- a/t/open311/getservicerequestupdates.t
+++ b/t/open311/getservicerequestupdates.t
@@ -23,6 +23,7 @@ my $user = FixMyStreet::DB->resultset('User')->find_or_create(
my %bodies = (
2237 => FixMyStreet::DB->resultset("Body")->create({ name => 'Oxfordshire' }),
+ 2494 => FixMyStreet::DB->resultset("Body")->create({ name => 'Bexley' }),
2482 => FixMyStreet::DB->resultset("Body")->create({
name => 'Bromley',
send_method => 'Open311',
@@ -34,6 +35,7 @@ my %bodies = (
2651 => FixMyStreet::DB->resultset("Body")->create({ name => 'Edinburgh' }),
);
$bodies{2237}->body_areas->create({ area_id => 2237 });
+$bodies{2494}->body_areas->create({ area_id => 2494 });
my $response_template = $bodies{2482}->response_templates->create({
title => "investigating template",
@@ -130,8 +132,10 @@ subtest 'check extended request parsed correctly' => sub {
};
my $problem_rs = FixMyStreet::DB->resultset('Problem');
-my $problem = $problem_rs->new(
- {
+
+sub create_problem {
+ my ($body_id, $external_id) = @_;
+ my $problem = $problem_rs->create({
postcode => 'EH99 1SP',
latitude => 1,
longitude => 1,
@@ -149,12 +153,13 @@ my $problem = $problem_rs->new(
created => DateTime->now()->subtract( days => 1 ),
lastupdate => DateTime->now()->subtract( days => 1 ),
anonymous => 1,
- external_id => int(rand(time())),
- bodies_str => $bodies{2482}->id,
- }
-);
+ external_id => $external_id || int(rand(time())),
+ bodies_str => $body_id,
+ });
+ return $problem;
+}
-$problem->insert;
+my $problem = create_problem($bodies{2482}->id);
for my $test (
{
@@ -448,27 +453,7 @@ for my $test (
};
}
-my $problemOx = $problem_rs->create({
- postcode => 'EH99 1SP',
- latitude => 1,
- longitude => 1,
- areas => 1,
- title => '',
- detail => '',
- used_map => 1,
- user_id => 1,
- name => '',
- state => 'confirmed',
- service => '',
- cobrand => 'default',
- cobrand_data => '',
- user => $user,
- created => DateTime->now()->subtract( days => 1 ),
- lastupdate => DateTime->now()->subtract( days => 1 ),
- anonymous => 1,
- external_id => int(rand(time())),
- bodies_str => $bodies{2237}->id,
-});
+my $problemB = create_problem($bodies{2237}->id);
for my $test (
{
@@ -487,27 +472,46 @@ for my $test (
},
) {
subtest $test->{desc} => sub {
- my $local_requests_xml = setup_xml($problemOx->external_id, $problemOx->id, $test->{comment_status});
+ my $local_requests_xml = setup_xml($problemB->external_id, $problemB->id, $test->{comment_status});
my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } );
- $problemOx->lastupdate( DateTime->now()->subtract( days => 1 ) );
- $problemOx->state( $test->{start_state} );
- $problemOx->update;
+ $problemB->lastupdate( DateTime->now()->subtract( days => 1 ) );
+ $problemB->state( $test->{start_state} );
+ $problemB->update;
my $update = Open311::GetServiceRequestUpdates->new( system_user => $user );
$update->update_comments( $o, $bodies{2237} );
- is $problemOx->comments->count, 1, 'comment count';
- $problemOx->discard_changes;
+ is $problemB->comments->count, 1, 'comment count';
+ $problemB->discard_changes;
my $c = FixMyStreet::DB->resultset('Comment')->search( { external_id => 638344 } )->first;
ok $c, 'comment exists';
is $c->problem_state, $test->{problem_state}, 'problem_state correct';
- is $problemOx->state, $test->{end_state}, 'correct problem state';
- $problemOx->comments->delete;
+ is $problemB->state, $test->{end_state}, 'correct problem state';
+ $problemB->comments->delete;
};
}
+subtest 'Marking report as fixed closes it for updates (Bexley)' => sub {
+ my $local_requests_xml = setup_xml($problemB->external_id, $problemB->id, 'CLOSED');
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } );
+
+ $problemB->update( { bodies_str => $bodies{2494}->id } );
+
+ my $update = Open311::GetServiceRequestUpdates->new( system_user => $user );
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => 'bexley',
+ }, sub {
+ $update->update_comments( $o, $bodies{2494} );
+ };
+
+ $problemB->discard_changes;
+ is $problemB->comments->count, 1, 'comment count';
+ is $problemB->get_extra_metadata('closed_updates'), 1;
+ $problemB->comments->delete;
+};
+
subtest 'Update with media_url includes image in update' => sub {
my $UPLOAD_DIR = tempdir( CLEANUP => 1 );
FixMyStreet::override_config {
@@ -578,29 +582,7 @@ subtest 'date for comment correct' => sub {
$problem->comments->delete;
};
-my $problem2 = $problem_rs->create(
- {
- postcode => 'EH99 1SP',
- latitude => 1,
- longitude => 1,
- areas => 1,
- title => '',
- detail => '',
- used_map => 1,
- user_id => 1,
- name => '',
- state => 'confirmed',
- service => '',
- cobrand => 'default',
- cobrand_data => '',
- user => $user,
- created => DateTime->now(),
- lastupdate => DateTime->now(),
- anonymous => 1,
- external_id => $problem->external_id,
- bodies_str => $bodies{2651}->id,
- }
-);
+my $problem2 = create_problem($bodies{2651}->id, $problem->external_id);
for my $test (
{
diff --git a/t/open311/post-service-request-updates.t b/t/open311/post-service-request-updates.t
index 6a7bc6ff2..ac6fb870c 100644
--- a/t/open311/post-service-request-updates.t
+++ b/t/open311/post-service-request-updates.t
@@ -62,6 +62,7 @@ my $other_user = $mech->create_user_ok('test2@example.com', title => 'MRS');
sub c {
my ($p, $user) = @_;
my $c = $mech->create_comment_for_problem($p, $user || $p->user, 'Name', 'Update text', 'f', 'confirmed', 'confirmed', { confirmed => \'current_timestamp' });
+ $c->discard_changes;
return $c;
}
@@ -96,6 +97,30 @@ subtest 'Send comments' => sub {
};
};
+subtest 'Check Bexley munging' => sub {
+ FixMyStreet::override_config {
+ ALLOWED_COBRANDS => ['fixmystreet', 'bexley'],
+ }, sub {
+ my $bexley = $mech->create_body_ok(2494, 'Bexley', $params);
+ $mech->create_contact_ok(body_id => $bexley->id, category => 'Other', email => "OTHER");
+
+ my $test_res = HTTP::Response->new();
+ $test_res->code(200);
+ $test_res->message('OK');
+ $test_res->content('<?xml version="1.0" encoding="utf-8"?><service_request_updates><request_update><update_id>248</update_id></request_update></service_request_updates>');
+ my $o = Open311->new(
+ fixmystreet_body => $bexley,
+ test_mode => 1,
+ test_get_returns => { 'servicerequestupdates.xml' => $test_res },
+ );
+ my ($p5, $c5) = p_and_c($bexley);
+ my $id = $o->post_service_request_update($c5);
+ is $id, 248, 'correct update ID returned';
+ like $o->test_req_used->content, qr/service_code=OTHER/, 'Service code included';
+ };
+};
+
+
subtest 'Oxfordshire gets an ID' => sub {
FixMyStreet::override_config {
ALLOWED_COBRANDS => ['fixmystreet', 'bromley', 'buckinghamshire', 'lewisham', 'oxfordshire'],
diff --git a/templates/email/bexley/_email_color_overrides.html b/templates/email/bexley/_email_color_overrides.html
new file mode 100644
index 000000000..5645da3ef
--- /dev/null
+++ b/templates/email/bexley/_email_color_overrides.html
@@ -0,0 +1,19 @@
+[%
+
+color_fuchsia = '#912B88'
+color_spring = '#5DA70E'
+color_white = '#fff'
+
+header_background_color = color_fuchsia
+header_text_color = color_white
+
+secondary_column_background_color = color_white
+
+button_background_color = color_spring
+button_text_color = color_white
+
+logo_width = "200" # pixel measurement, but without 'px' suffix
+logo_height = "80" # pixel measurement, but without 'px' suffix
+logo_file = "logo.png"
+
+%]
diff --git a/templates/web/base/report/new/category_wrapper.html b/templates/web/base/report/new/category_wrapper.html
index 33c6813f9..6cbb55229 100644
--- a/templates/web/base/report/new/category_wrapper.html
+++ b/templates/web/base/report/new/category_wrapper.html
@@ -19,7 +19,7 @@
[% PROCESS "report/new/duplicate_suggestions.html" %]
-<div id="js-post-category-messages" class="js-hide-if-invalid-category">
+<div id="js-post-category-messages" class="js-hide-if-invalid-category_extras">
[%# This section includes 'Pick an asset' text, roadworks info, extra category questions %]
[%- IF category_extras OR report_extra_fields %]
diff --git a/templates/web/bexley/footer_extra_js.html b/templates/web/bexley/footer_extra_js.html
new file mode 100644
index 000000000..f4b5652a1
--- /dev/null
+++ b/templates/web/bexley/footer_extra_js.html
@@ -0,0 +1,13 @@
+[% scripts.push(
+ version('/cobrands/fixmystreet-uk-councils/js.js'),
+) %]
+[%~
+IF bodyclass.match('mappage');
+ scripts.push(
+ version('/vendor/OpenLayers.Projection.OrdnanceSurvey.js'),
+ version('/cobrands/fixmystreet/assets.js'),
+ version('/cobrands/bexley/js.js'),
+ version('/cobrands/highways/assets.js'),
+ );
+END
+%]
diff --git a/templates/web/bexley/header_extra.html b/templates/web/bexley/header_extra.html
new file mode 100644
index 000000000..c5b1dcc6e
--- /dev/null
+++ b/templates/web/bexley/header_extra.html
@@ -0,0 +1 @@
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:400,400i,700">
diff --git a/templates/web/bexley/header_logo.html b/templates/web/bexley/header_logo.html
new file mode 100644
index 000000000..f0f9b2cc8
--- /dev/null
+++ b/templates/web/bexley/header_logo.html
@@ -0,0 +1,2 @@
+ <a href="https://www.bexley.gov.uk" id="site-logo">London Borough of Bexley</a>
+ <a href="/" id="report-cta" title="[%- loc('Report a problem') -%]">[%- loc('Report') -%]</a>
diff --git a/templates/web/bexley/main_nav_items.html b/templates/web/bexley/main_nav_items.html
new file mode 100644
index 000000000..44edd68a8
--- /dev/null
+++ b/templates/web/bexley/main_nav_items.html
@@ -0,0 +1,55 @@
+[%~ IF problem ~%]
+ [%~ INCLUDE navitem uri='/report/new?longitude=' _ problem.longitude _ '&amp;latitude=' _ problem.latitude label=loc('Report another problem here') attrs='class="report-a-problem-btn"' ~%]
+[%~ ELSIF latitude AND longitude ~%]
+ [%~ INCLUDE navitem uri='/report/new?longitude=' _ longitude _ '&amp;latitude=' _ latitude label=loc('Report a problem here') attrs='class="report-a-problem-btn"' ~%]
+[%~ ELSIF homepage_template ~%]
+ [%~ INCLUDE navitem uri='/report' label=loc('Report a problem') attrs='class="report-a-problem-btn"' ~%]
+[%~ ELSE ~%]
+ [%~ INCLUDE navitem uri='/' label=loc('Report a problem') attrs='class="report-a-problem-btn"' ~%]
+[%~ END ~%]
+
+[%~ UNLESS hide_all_reports_link ~%]
+ [%~
+ IF c.user_exists AND c.user.categories.size;
+ categories = c.user.categories_string | uri;
+ cat_suffix = "?filter_category=" _ categories;
+ END;
+
+ reports_uri = '/reports';
+ IF body_name;
+ body_name = body_name | uri;
+ reports_uri = "${reports_uri}/${body_name}";
+ END;
+
+ INCLUDE navitem uri=reports_uri label=loc('All reports') suffix=cat_suffix;
+ ~%]
+[%~ END ~%]
+
+[%~
+ IF pc;
+ pc_uri = pc | uri;
+ pc_suffix = "/list?pc=" _ pc_uri;
+ END;
+
+ INCLUDE navitem uri='/alert' label=loc('Local alerts') suffix=pc_suffix;
+~%]
+
+[%~ INCLUDE navitem uri='/faq' label=loc('Help') ~%]
+
+[%~ UNLESS hide_privacy_link ~%]
+ [%~ INCLUDE navitem uri='/privacy' label=loc('Privacy') liattrs='class="nav-menu__item--privacy"' ~%]
+[%~ END ~%]
+
+[%~ IF c.user_exists ~%]
+ [%~ INCLUDE navitem uri='/my' label=loc('Your account') ~%]
+[%~ ELSE ~%]
+ [%~ INCLUDE navitem uri='/auth' label=loc('Sign in') ~%]
+[%~ END ~%]
+
+[%~ IF c.user_exists AND c.user.has_body_permission_to('planned_reports') ~%]
+ [%~ INCLUDE navitem always_url=1 uri='/my/planned' label=loc('Shortlist') ~%]
+[%~ END ~%]
+
+[%~ IF c.user_exists AND c.cobrand.admin_allow_user(c.user) ~%]
+ [%~ INCLUDE navitem uri='/admin' label=loc('Admin') ~%]
+[%~ END ~%]
diff --git a/templates/web/bexley/tracking_code.html b/templates/web/bexley/tracking_code.html
new file mode 100644
index 000000000..dff0b4607
--- /dev/null
+++ b/templates/web/bexley/tracking_code.html
@@ -0,0 +1,15 @@
+[% IF c.config.BASE_URL == "https://www.fixmystreet.com" %]
+<script nonce="[% csp_nonce %]">
+(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+ga('create', 'UA-96119487-1', 'auto');
+ga('set', 'anonymizeIp', true);
+ga('send', 'pageview');
+
+</script>
+[% ELSE %]
+<!-- Tracking code not inserted as "[% c.config.BASE_URL %]" not "https://www.fixmystreet.com" -->
+[% END %]
diff --git a/templates/web/fixmystreet.com/footer_extra_js.html b/templates/web/fixmystreet.com/footer_extra_js.html
index cb570a169..61f260fe8 100644
--- a/templates/web/fixmystreet.com/footer_extra_js.html
+++ b/templates/web/fixmystreet.com/footer_extra_js.html
@@ -6,6 +6,7 @@ IF bodyclass.match('mappage');
scripts.push( version('/cobrands/fixmystreet/assets.js') );
scripts.push( version('/cobrands/fixmystreet-uk-councils/alloy.js') );
scripts.push( version('/cobrands/bathnes/assets.js') );
+ scripts.push( version('/cobrands/bexley/js.js') );
scripts.push( version('/cobrands/bristol/assets.js') );
scripts.push( version('/cobrands/bromley/assets.js') );
scripts.push( version('/cobrands/buckinghamshire/assets.js') );
diff --git a/web/cobrands/bathnes/assets.js b/web/cobrands/bathnes/assets.js
index 16ecb3076..fd1386480 100644
--- a/web/cobrands/bathnes/assets.js
+++ b/web/cobrands/bathnes/assets.js
@@ -33,7 +33,7 @@ fixmystreet.maps.banes_defaults = {
};
-fixmystreet.assets.add($.extend(true, {}, fixmystreet.maps.banes_defaults, {
+fixmystreet.assets.add(fixmystreet.maps.banes_defaults, {
http_options: {
params: {
TYPENAME: "Gritbins"
@@ -44,9 +44,9 @@ fixmystreet.assets.add($.extend(true, {}, fixmystreet.maps.banes_defaults, {
attributes: {
asset_details: 'feature_location'
}
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, fixmystreet.maps.banes_defaults, {
+fixmystreet.assets.add(fixmystreet.maps.banes_defaults, {
http_options: {
params: {
TYPENAME: "ParksOpenSpacesAssets"
@@ -91,7 +91,7 @@ fixmystreet.assets.add($.extend(true, {}, fixmystreet.maps.banes_defaults, {
'Seats'
],
name: "Parks and Grounds"
-}));
+});
@@ -190,7 +190,7 @@ var lighting_stylemap = new OpenLayers.StyleMap({
});
-fixmystreet.assets.add($.extend(true, {}, fixmystreet.maps.banes_defaults, {
+fixmystreet.assets.add(fixmystreet.maps.banes_defaults, {
http_options: {
params: {
TYPENAME: "StreetLighting"
@@ -211,7 +211,7 @@ fixmystreet.assets.add($.extend(true, {}, fixmystreet.maps.banes_defaults, {
"description: " + a.unitdescription;
}
}
-}));
+});
var highways_stylemap = new OpenLayers.StyleMap({
@@ -221,7 +221,7 @@ var highways_stylemap = new OpenLayers.StyleMap({
})
});
-fixmystreet.assets.add($.extend(true, {}, fixmystreet.maps.banes_defaults, {
+fixmystreet.assets.add(fixmystreet.maps.banes_defaults, {
http_options: {
params: {
TYPENAME: "AdoptedHighways"
@@ -236,7 +236,7 @@ fixmystreet.assets.add($.extend(true, {}, fixmystreet.maps.banes_defaults, {
},
name: "Adopted Highways",
attribution: " © Crown Copyright. All rights reserved. 1000233344"
-}));
+});
})();
diff --git a/web/cobrands/bathnes/js.js b/web/cobrands/bathnes/js.js
index afc7df44d..51c8bcfed 100644
--- a/web/cobrands/bathnes/js.js
+++ b/web/cobrands/bathnes/js.js
@@ -26,13 +26,13 @@ fixmystreet.roadworks.filter = function(feature) {
var org_id = '114';
var body = "Bath and North East Somerset Council";
-fixmystreet.assets.add($.extend(true, {}, fixmystreet.roadworks.layer_future, {
+fixmystreet.assets.add(fixmystreet.roadworks.layer_future, {
http_options: { params: { organisation_id: org_id } },
body: body
-}));
-fixmystreet.assets.add($.extend(true, {}, fixmystreet.roadworks.layer_planned, {
+});
+fixmystreet.assets.add(fixmystreet.roadworks.layer_planned, {
http_options: { params: { organisation_id: org_id } },
body: body
-}));
+});
})();
diff --git a/web/cobrands/bathnes/staff.js b/web/cobrands/bathnes/staff.js
index c6a8a9560..1f9aa6e6e 100644
--- a/web/cobrands/bathnes/staff.js
+++ b/web/cobrands/bathnes/staff.js
@@ -21,7 +21,7 @@ var llpg_stylemap = new OpenLayers.StyleMap({
});
-fixmystreet.assets.add($.extend(true, {}, fixmystreet.maps.banes_defaults, {
+fixmystreet.assets.add(fixmystreet.maps.banes_defaults, {
http_options: {
params: {
TYPENAME: "LLPG"
@@ -32,7 +32,7 @@ fixmystreet.assets.add($.extend(true, {}, fixmystreet.maps.banes_defaults, {
stylemap: llpg_stylemap,
non_interactive: true,
always_visible: true
-}));
+});
// Some normally-invisible layers are visible to staff, so replace their
diff --git a/web/cobrands/bexley/_colours.scss b/web/cobrands/bexley/_colours.scss
new file mode 100644
index 000000000..e2c1657bb
--- /dev/null
+++ b/web/cobrands/bexley/_colours.scss
@@ -0,0 +1,53 @@
+/* COLOURS */
+
+$menu-image: 'menu-white';
+
+$mappage-header-height: 128px;
+
+$white: #fff;
+
+$red: #B10E1E;
+
+$royal: #2E358B;
+$fuchsia: #912B88;
+$aqua: #00A1B3;
+$spring: #5DA70E;
+
+$royal_lt: #B3B7E6;
+$fuchsia_lt: #E9AFE5;
+$aqua_lt: #00CCCC;
+$sprint_lt: #B8E26A;
+
+$text_black: #0B0C0C;
+$text_grey: #6F777B;
+
+$link: #005EA5;
+$hover: #2B8CC4;
+$visited: #4C2C92;
+$focus: #FFBF47;
+
+$grey_border: #BFC1C3;
+$grey_panel: #DEE0E2;
+$grey_highlight: #F8F8F8;
+
+$col_button: #00823B;
+$col_button_hover: #006435;
+
+$primary: $grey_highlight;
+$primary_b: $royal;
+$primary_text: $text_black;
+
+$base_bg: $white;
+$base_fg: $text_black;
+
+$nav_background_colour: $fuchsia;
+$nav_colour: $white;
+$nav_hover_background_colour: darken($fuchsia, 10%);
+
+$col_click_map: $aqua;
+
+$header-top-border: false;
+
+$heading-font: Lato, sans-serif;
+$body-font: Lato, sans-serif;
+$meta-font: $body-font;
diff --git a/web/cobrands/bexley/base.scss b/web/cobrands/bexley/base.scss
new file mode 100644
index 000000000..bedd5b21b
--- /dev/null
+++ b/web/cobrands/bexley/base.scss
@@ -0,0 +1,125 @@
+@import "../sass/h5bp";
+@import "./_colours";
+@import "../sass/mixins";
+@import "../sass/base";
+
+div.form-error, p.form-error { // TODO Add to more, make a variable.
+ background-color: $red;
+}
+
+/* Font overrides */
+
+#front-main h2 {
+ font-style: normal;
+}
+
+/* .form-control has this already, make sure buttons etc caught too */
+input {
+ font-family: inherit;
+}
+
+/* Size */
+
+body {
+ font-size: 1.125em;
+}
+
+small {
+ font-size: 0.89em;
+}
+.meta-2 {
+ font-size: 0.89em;
+}
+#key-tools a,button {
+ font-size: 0.89em;
+}
+.btn--small {
+ font-size: 0.89em;
+}
+.mobile-map-banner {
+ font-size: 0.89em;
+}
+#front-main a#geolocate_link {
+ font-size: 0.89em;
+}
+#front_stats div {
+ font-size: 0.89em;
+}
+.description_tips ul {
+ font-size: 0.89em;
+ line-height: 1.4;
+}
+
+.report-list-filters {
+ font-size: 0.89em;
+ .form-control {
+ font-size: 1em;
+ }
+}
+.multi-select-menuitem, .multi-select-button {
+ font-size: 1em;
+}
+
+/* Colour overrides */
+
+.description_tips .do {
+ color: $col_button_hover;
+}
+.description_tips .dont {
+ color: $red;
+}
+
+a,
+.fake-link {
+ text-decoration: none;
+ color: $link;
+
+ &:visited {
+ color: $visited;
+ }
+
+ &:hover,
+ &:active {
+ text-decoration: underline;
+ color: $hover;
+ }
+
+ &:focus {
+ color: $focus;
+ }
+}
+
+.dz-clickable .dz-message u {
+ color: $link;
+}
+
+.btn-primary,
+.green-btn,
+.btn--primary {
+ border: none;
+ background: $col_button;
+
+ &:focus,
+ &:hover,
+ &:active {
+ background: $col_button_hover;
+ }
+}
+
+ol.big-numbers > li:before {
+ color: $fuchsia_lt;
+}
+
+/* Header */
+
+#site-logo {
+ width: 150px;
+ height: 60px;
+ padding: 1em 0;
+ background: url(/cobrands/bexley/images/logo.png) 0 50% no-repeat;
+ background-size: 150px 60px;
+}
+
+#postcodeForm .form-hint {
+// color: $white;
+}
diff --git a/web/cobrands/bexley/images/logo.png b/web/cobrands/bexley/images/logo.png
new file mode 100644
index 000000000..8051ac80d
--- /dev/null
+++ b/web/cobrands/bexley/images/logo.png
Binary files differ
diff --git a/web/cobrands/bexley/js.js b/web/cobrands/bexley/js.js
new file mode 100644
index 000000000..580320325
--- /dev/null
+++ b/web/cobrands/bexley/js.js
@@ -0,0 +1,157 @@
+(function(){
+
+if (!fixmystreet.maps) {
+ return;
+}
+
+var defaults = {
+ http_options: {
+ url: "https://tilma.mysociety.org/mapserver/bexley",
+ params: {
+ SERVICE: "WFS",
+ VERSION: "1.1.0",
+ REQUEST: "GetFeature",
+ SRSNAME: "urn:ogc:def:crs:EPSG::3857"
+ }
+ },
+ format_class: OpenLayers.Format.GML.v3.MultiCurveFix, // Not sure needed any more
+ max_resolution: 4.777314267158508,
+ min_resolution: 0.5971642833948135,
+ geometryName: 'msGeometry',
+ srsName: "EPSG:3857",
+ body: "London Borough of Bexley",
+ strategy_class: OpenLayers.Strategy.FixMyStreet
+};
+
+var streetlight_default = {
+ fillColor: "#FFFF00",
+ fillOpacity: 0.6,
+ strokeColor: "#000000",
+ strokeOpacity: 0.8,
+ strokeWidth: 2,
+ pointRadius: 6
+};
+
+var pin_prefix = fixmystreet.pin_prefix || document.getElementById('js-map-data').getAttribute('data-pin_prefix');
+
+var streetlight_select = {
+ externalGraphic: pin_prefix + "pin-spot.png",
+ fillColor: "#55BB00",
+ graphicWidth: 48,
+ graphicHeight: 64,
+ graphicXOffset: -24,
+ graphicYOffset: -56,
+ backgroundGraphic: pin_prefix + "pin-shadow.png",
+ backgroundWidth: 60,
+ backgroundHeight: 30,
+ backgroundXOffset: -7,
+ backgroundYOffset: -22,
+ popupYOffset: -40,
+ graphicOpacity: 1.0,
+
+ label: "${Unit_No}",
+ labelOutlineColor: "white",
+ labelOutlineWidth: 3,
+ labelYOffset: 65,
+ fontSize: '15px',
+ fontWeight: 'bold'
+};
+
+var streetlight_stylemap = new OpenLayers.StyleMap({
+ 'default': new OpenLayers.Style(streetlight_default),
+ 'select': new OpenLayers.Style(streetlight_select)
+});
+
+var labeled_defaults = $.extend(true, {}, defaults, {
+ select_action: true,
+ stylemap: streetlight_stylemap,
+ feature_code: 'Unit_No',
+ asset_type: 'spot',
+ asset_id_field: 'Unit_ID',
+ attributes: {
+ UnitID: 'Unit_ID'
+ },
+ actions: {
+ asset_found: function(asset) {
+ var id = asset.attributes[this.fixmystreet.feature_code] || '';
+ if (id !== '') {
+ var asset_name = this.fixmystreet.asset_item;
+ $('.category_meta_message').html('You have selected ' + asset_name + ' <b>' + id + '</b>');
+ } else {
+ $('.category_meta_message').html(this.fixmystreet.asset_item_message);
+ }
+ },
+ asset_not_found: function() {
+ $('.category_meta_message').html(this.fixmystreet.asset_item_message);
+ }
+ }
+});
+
+fixmystreet.assets.add(defaults, {
+ http_options: {
+ params: {
+ TYPENAME: "Streets",
+ }
+ },
+ always_visible: true,
+ non_interactive: true,
+ nearest_radius: 20,
+ usrn: {
+ attribute: 'NSG_REF',
+ field: 'NSGRef'
+ },
+ stylemap: new OpenLayers.StyleMap({
+ 'default': new OpenLayers.Style({
+ fill: false,
+ stroke: false
+ })
+ })
+});
+
+fixmystreet.assets.add(labeled_defaults, {
+ http_options: {
+ params: {
+ TYPENAME: "Bollards"
+ }
+ },
+ asset_category: ["Traffic bollard"],
+ asset_item_message: 'Select the <b class="asset-spot"></b> on the map to pinpoint the exact location of a damaged traffic bollard.',
+ asset_item: 'bollard'
+});
+
+fixmystreet.assets.add(labeled_defaults, {
+ http_options: {
+ params: {
+ TYPENAME: "Lighting"
+ }
+ },
+ asset_category: ["Lamp post", "Light in park or open space", "Underpass light", "Light in multi-storey car park", "Light in outside car park"],
+ asset_item_message: 'Please pinpoint the exact location for the street lighting fault.',
+ asset_item: 'street light'
+});
+
+// We need to trigger the below function on subcategory change also
+$(function(){
+ $("#problem_form").on("change.category", "#form_DALocation", function() {
+ $(fixmystreet).trigger('report_new:category_change', [ $('#form_category') ]);
+ });
+});
+
+fixmystreet.message_controller.register_category({
+ body: defaults.body,
+ category: function() {
+ var cat = $('#form_category').val();
+ if (cat === 'Dead animal') {
+ var where = $('#form_DALocation').val();
+ if (where === 'Garden' || where === 'Other private property') {
+ return true;
+ }
+ }
+ return false;
+ },
+ keep_category_extras: true,
+ message: 'Please follow the link below to pay to remove a dead animal from a private property.'
+});
+
+})();
+
diff --git a/web/cobrands/bexley/layout.scss b/web/cobrands/bexley/layout.scss
new file mode 100644
index 000000000..948b01443
--- /dev/null
+++ b/web/cobrands/bexley/layout.scss
@@ -0,0 +1,33 @@
+@import "_colours";
+
+@import "../sass/layout";
+
+body.twothirdswidthpage .content .sticky-sidebar aside {
+ top: 10em;
+}
+
+#site-logo {
+ width: 208px;
+ height: 80px;
+ padding: 24px 0;
+ background-position: 8px 50%;
+ background-size: 200px 80px;
+}
+
+#front_stats big {
+ color: $fuchsia_lt;
+}
+
+.nav-menu--main {
+ span {
+ background-color: $nav_hover_background_colour;
+ }
+}
+
+.general-notes {
+ font-size: 0.89em;
+}
+
+#key-tools a,button {
+ font-size: 0.89em;
+}
diff --git a/web/cobrands/bristol/assets.js b/web/cobrands/bristol/assets.js
index 77124ce96..b31f3c154 100644
--- a/web/cobrands/bristol/assets.js
+++ b/web/cobrands/bristol/assets.js
@@ -30,26 +30,26 @@ var options = $.extend({}, common_options, {
}
});
-fixmystreet.assets.add($.extend({}, options, {
+fixmystreet.assets.add(options, {
wfs_feature: "COD_ASSETS_AREA",
asset_type: 'area',
asset_category: "Bridges/Subways",
asset_item: 'bridge/subway'
-}));
+});
-fixmystreet.assets.add($.extend({}, options, {
+fixmystreet.assets.add(options, {
asset_category: "Gully/Drainage",
asset_item: 'gully',
filter_key: 'COD_ASSET_TYPE',
filter_value: 'GULLY'
-}));
+});
-fixmystreet.assets.add($.extend({}, options, {
+fixmystreet.assets.add(options, {
asset_category: "Grit Bins",
asset_item: 'grit bin',
filter_key: 'COD_ASSET_TYPE',
filter_value: 'GRITBIN'
-}));
+});
var lighting_options = $.extend({}, common_options, {
@@ -75,7 +75,7 @@ var lighting_options = $.extend({}, common_options, {
filter_key: 'Unit_type_description'
});
-fixmystreet.assets.add($.extend({}, lighting_options, {
+fixmystreet.assets.add(lighting_options, {
asset_category: "Street Light",
asset_item: 'street light',
filter_value: [
@@ -88,32 +88,32 @@ fixmystreet.assets.add($.extend({}, lighting_options, {
'SL: Refuge Column',
'SL: Subway'
]
-}));
+});
-fixmystreet.assets.add($.extend({}, lighting_options, {
+fixmystreet.assets.add(lighting_options, {
asset_category: "Zebra Crossing Light",
asset_item: 'light',
filter_value: 'SL: Zebra'
-}));
+});
-fixmystreet.assets.add($.extend({}, lighting_options, {
+fixmystreet.assets.add(lighting_options, {
asset_category: "Iluminated Bollard",
asset_item: 'bollard',
filter_value: 'SL: Bollard'
-}));
+});
// NB there's a typo in BCC's ‘Iluminated Bollard’ category so this repeats
// the above (without the typo) just in case they fix it.
-fixmystreet.assets.add($.extend({}, lighting_options, {
+fixmystreet.assets.add(lighting_options, {
asset_category: "Illuminated Bollard",
asset_item: 'bollard',
filter_value: 'SL: Bollard'
-}));
+});
-fixmystreet.assets.add($.extend({}, lighting_options, {
+fixmystreet.assets.add(lighting_options, {
asset_category: "Illuminated Sign",
asset_item: 'sign',
filter_value: 'SL: Sign'
-}));
+});
})();
diff --git a/web/cobrands/bromley/assets.js b/web/cobrands/bromley/assets.js
index 44bf50a98..d5386d9af 100644
--- a/web/cobrands/bromley/assets.js
+++ b/web/cobrands/bromley/assets.js
@@ -37,7 +37,7 @@ OpenLayers.Layer.VectorAssetBromley = OpenLayers.Class(OpenLayers.Layer.VectorAs
CLASS_NAME: 'OpenLayers.Layer.VectorAssetBromley'
});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
class: OpenLayers.Layer.VectorAssetBromley,
http_options: {
params: {
@@ -51,9 +51,9 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
asset_category: ["Street Lighting and Road Signs"],
subcategories: [ 'SL_LAMP', 'SL_NOT_WORK', 'SL_ON_DAY', 'SL_BLOCK_VEG' ],
asset_item: 'street light'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
class: OpenLayers.Layer.VectorAssetBromley,
http_options: {
params: {
@@ -64,9 +64,9 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
subcategories: ['PG_OFLOW_DOG', 'SC_LIT_BIN'],
asset_item: 'park bin',
asset_item_message: 'For our parks, pick a <b class="asset-spot">bin</b> from the map &raquo;'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "Street_Trees"
@@ -74,7 +74,7 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
},
asset_category: ["Public Trees"],
asset_item: 'tree'
-}));
+});
var highways_stylemap = new OpenLayers.StyleMap({
'default': new OpenLayers.Style({
@@ -100,7 +100,7 @@ $(function(){
});
});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "TFL_Red_Route"
@@ -129,7 +129,7 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
fixmystreet.body_overrides.remove_only_send();
}
}
-}));
+});
var prow_stylemap = new OpenLayers.StyleMap({
'default': new OpenLayers.Style({
@@ -141,7 +141,7 @@ var prow_stylemap = new OpenLayers.StyleMap({
})
});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "PROW"
@@ -160,6 +160,6 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
$('#form_prow_reference').val('');
}
}
-}));
+});
})();
diff --git a/web/cobrands/bromley/base.scss b/web/cobrands/bromley/base.scss
index 16ca15e55..9435aa35d 100644
--- a/web/cobrands/bromley/base.scss
+++ b/web/cobrands/bromley/base.scss
@@ -26,32 +26,24 @@
// can't understand a selector it will invalidate the whole line.
::-webkit-input-placeholder {
color: #999;
- font: {
- style:normal;
- size:0.9375em;
- }
+ font-style: normal;
+ font-size: 0.9375em;
}
:-moz-placeholder {
color: #999;
- font: {
- style:normal;
- size:0.9375em;
- }
+ font-style: normal;
+ font-size: 0.9375em;
}
:-ms-placeholder {
color: #999;
- font: {
- style:normal;
- size:0.9375em;
- }
+ font-style: normal;
+ font-size: 0.9375em;
}
//this only gets used when the browser doesn't support @placeholder
.placeholder {
color: #999;
- font: {
- style:normal;
- size:0.9375em;
- }
+ font-style: normal;
+ font-size: 0.9375em;
}
// Reset body line height on front page
diff --git a/web/cobrands/buckinghamshire/assets.js b/web/cobrands/buckinghamshire/assets.js
index 4ced684fd..208eb26e9 100644
--- a/web/cobrands/buckinghamshire/assets.js
+++ b/web/cobrands/buckinghamshire/assets.js
@@ -32,7 +32,7 @@ var defaults = {
strategy_class: OpenLayers.Strategy.FixMyStreet
};
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "Grit_Bins"
@@ -40,7 +40,7 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
},
asset_category: ["Salt bin damaged", "Salt bin refill"],
asset_item: 'grit bin'
-}));
+});
var pin_prefix = fixmystreet.pin_prefix || document.getElementById('js-map-data').getAttribute('data-pin_prefix');
@@ -123,7 +123,7 @@ var labeled_defaults = $.extend(true, {}, defaults, {
}
});
-fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
+fixmystreet.assets.add(labeled_defaults, {
http_options: {
params: {
TYPENAME: "StreetLights_Union"
@@ -135,9 +135,9 @@ fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
'Street light intermittent',
'Street light not working' ],
asset_item: 'street light'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
+fixmystreet.assets.add(labeled_defaults, {
http_options: {
params: {
TYPENAME: "IlluminatedBollards"
@@ -145,9 +145,9 @@ fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
},
asset_category: ["Bollard light not working"],
asset_item: 'bollard'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
+fixmystreet.assets.add(labeled_defaults, {
http_options: {
params: {
TYPENAME: "Bollards"
@@ -155,9 +155,9 @@ fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
},
asset_category: ["Bollards or railings"],
asset_item: 'bollard'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
+fixmystreet.assets.add(labeled_defaults, {
stylemap: streetlight_stylemap,
http_options: {
params: {
@@ -168,9 +168,9 @@ fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
'Belisha Beacon broken',
],
asset_item: 'belisha beacon'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
+fixmystreet.assets.add(labeled_defaults, {
stylemap: streetlight_stylemap,
http_options: {
params: {
@@ -181,9 +181,9 @@ fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
'Belisha Beacon broken',
],
asset_item: 'belisha beacon'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
+fixmystreet.assets.add(labeled_defaults, {
stylemap: streetlight_stylemap_alt,
http_options: {
params: {
@@ -196,9 +196,9 @@ fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
'Traffic lights & crossings problems with timings',
],
asset_item: 'crossing'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
+fixmystreet.assets.add(labeled_defaults, {
http_options: {
params: {
TYPENAME: "Signs_Union"
@@ -209,9 +209,9 @@ fixmystreet.assets.add($.extend(true, {}, labeled_defaults, {
'Sign problem',
],
asset_item: 'sign'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "Gullies"
@@ -221,7 +221,7 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
'Blocked drain'
],
asset_item: 'drain'
-}));
+});
// The "whole street asset" layer indicates who is responsible for maintaining
// a road via the 'feature_ty' attribute on features.
@@ -301,7 +301,7 @@ $(fixmystreet).on('report_new:highways_change', function() {
});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "Whole_Street"
@@ -360,7 +360,7 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
},
filter_key: 'feature_ty',
filter_value: types_to_show,
-}));
+});
// As with the road found/not_found above, we want to change the destination
// depending upon the answer to the extra question shown when on a road
@@ -374,7 +374,7 @@ $("#problem_form").on("change", "#form_road-placement", function() {
}
});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "WinterRoutes"
@@ -407,7 +407,7 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
$("#category_meta .js-gritting-notice").hide();
}
}
-}));
+});
fixmystreet.message_controller.register_category({
body: defaults.body,
diff --git a/web/cobrands/buckinghamshire/js.js b/web/cobrands/buckinghamshire/js.js
index a5d4969d9..6be03f91f 100644
--- a/web/cobrands/buckinghamshire/js.js
+++ b/web/cobrands/buckinghamshire/js.js
@@ -6,13 +6,13 @@ if (!fixmystreet.maps) {
var org_id = '1016';
var body = "Buckinghamshire County Council";
-fixmystreet.assets.add($.extend(true, {}, fixmystreet.roadworks.layer_future, {
+fixmystreet.assets.add(fixmystreet.roadworks.layer_future, {
http_options: { params: { organisation_id: org_id } },
body: body
-}));
-fixmystreet.assets.add($.extend(true, {}, fixmystreet.roadworks.layer_planned, {
+});
+fixmystreet.assets.add(fixmystreet.roadworks.layer_planned, {
http_options: { params: { organisation_id: org_id } },
body: body
-}));
+});
})();
diff --git a/web/cobrands/fixmystreet/assets.js b/web/cobrands/fixmystreet/assets.js
index ad14b9390..1d2bc3206 100644
--- a/web/cobrands/fixmystreet/assets.js
+++ b/web/cobrands/fixmystreet/assets.js
@@ -513,7 +513,9 @@ fixmystreet.assets = {
return selected_feature;
},
- add: function(options) {
+ add: function(default_options, options) {
+ options = $.extend(true, {}, default_options, options);
+
var asset_fault_layer = null;
// An interactive layer for selecting an asset (e.g. street light)
@@ -934,11 +936,16 @@ fixmystreet.message_controller = (function() {
// This shows the reporting form
function enable_report_form() {
$(".js-hide-if-invalid-category").show();
+ $(".js-hide-if-invalid-category_extras").show();
}
// This hides the reporting form, apart from the category selection
- function disable_report_form() {
+ // And perhaps the category_extras unless asked not to
+ function disable_report_form(keep_category_extras) {
$(".js-hide-if-invalid-category").hide();
+ if (!keep_category_extras) {
+ $(".js-hide-if-invalid-category_extras").hide();
+ }
}
// This hides the responsibility message, and (unless a
@@ -1014,17 +1021,19 @@ fixmystreet.message_controller = (function() {
var $msg;
if (typeof stopper.message === 'function') {
$msg = stopper.message();
- $msg.attr('id', stopperId);
} else {
- $msg = $('<p id="' + stopperId + '" class="box-warning">' + stopper.message + '</p>');
+ $msg = $('<p class="box-warning">' + stopper.message + '</p>');
}
+ $msg.attr('id', stopperId);
+ $msg.attr('role', 'alert');
+ $msg.attr('aria-live', 'assertive');
if ($id.length) {
$id.replaceWith($msg);
} else {
$msg.insertBefore('#js-post-category-messages');
}
- disable_report_form();
+ disable_report_form(stopper.keep_category_extras);
});
return {
diff --git a/web/cobrands/highways/assets.js b/web/cobrands/highways/assets.js
index 5f361e491..8f4734131 100644
--- a/web/cobrands/highways/assets.js
+++ b/web/cobrands/highways/assets.js
@@ -31,7 +31,7 @@ var highways_stylemap = new OpenLayers.StyleMap({
})
});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "Highways"
@@ -72,7 +72,7 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
$('#highways').remove();
}
}
-}));
+});
function add_highways_warning(road_name) {
var $warning = $('<div class="box-warning" id="highways"><p>It looks like you clicked on the <strong>' + road_name + '</strong> which is managed by <strong>Highways England</strong>. ' +
diff --git a/web/cobrands/lincolnshire/assets.js b/web/cobrands/lincolnshire/assets.js
index f4b1861a9..b36b04b64 100644
--- a/web/cobrands/lincolnshire/assets.js
+++ b/web/cobrands/lincolnshire/assets.js
@@ -29,7 +29,7 @@ var defaults = {
body: "Lincolnshire County Council"
};
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "SL_Bollards"
@@ -37,9 +37,9 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
},
asset_category: "Bollards (lit)",
asset_item: 'bollard'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "SL_Street_Light_Units"
@@ -51,9 +51,9 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
filter_value: [
"SL: Bulkhead Lighting", "SL: Refuge Beacon", "SL: Street Lighting Unit"
]
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "SL_Street_Light_Units"
@@ -63,7 +63,7 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
asset_item: 'light',
filter_key: 'Type',
filter_value: "SL: Subway Lighting Unit"
-}));
+});
function get_barrier_stylemap() {
return new OpenLayers.StyleMap({
@@ -86,7 +86,7 @@ function get_barrier_stylemap() {
});
}
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "Safety_Barriers"
@@ -98,9 +98,9 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
filter_value: "ST: Safety Barrier",
stylemap: get_barrier_stylemap(),
max_resolution: 1.194328566789627
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "LCC_Drainage-GulliesOffletsManholes"
@@ -108,9 +108,9 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
},
asset_category: "Blocked drain",
asset_item: 'drain'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "ST_All_Structures"
@@ -122,9 +122,9 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
filter_value: [
"ST: Culvert 1 Cell", "ST: Culvert 2+ Cells", "ST: Culvert/Pipe"
]
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "SL_Lit_Signs"
@@ -132,9 +132,9 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
},
asset_category: "Sign (lit)",
asset_item: 'street sign'
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "ST_All_Structures"
@@ -151,9 +151,9 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
"ST: Bridge Ped/Cycle 2+ Spans", "ST: Bridge Vehicular 1 Span",
"ST: Bridge Vehicular 2-3 Spans", "ST: Bridge Vehicular 4+ Spans"
]
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "Carriageway"
@@ -179,9 +179,9 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
stroke: false
})
})
-}));
+});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "NSG"
@@ -200,7 +200,7 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
})
})
-}));
+});
var llpg_stylemap = new OpenLayers.StyleMap({
'default': new OpenLayers.Style({
@@ -218,7 +218,7 @@ var llpg_stylemap = new OpenLayers.StyleMap({
})
});
-fixmystreet.assets.add($.extend(true, {}, defaults, {
+fixmystreet.assets.add(defaults, {
http_options: {
params: {
TYPENAME: "LLPG"
@@ -229,6 +229,6 @@ fixmystreet.assets.add($.extend(true, {}, defaults, {
stylemap: llpg_stylemap,
non_interactive: true,
always_visible: true
-}));
+});
})();
diff --git a/web/cobrands/lincolnshire/roadworks.js b/web/cobrands/lincolnshire/roadworks.js
index 760e8f00e..0e8923607 100644
--- a/web/cobrands/lincolnshire/roadworks.js
+++ b/web/cobrands/lincolnshire/roadworks.js
@@ -4,10 +4,10 @@ if (!fixmystreet.maps) {
return;
}
-fixmystreet.assets.add($.extend(true, {}, fixmystreet.roadworks.layer_future, {
+fixmystreet.assets.add(fixmystreet.roadworks.layer_future, {
http_options: { params: { organisation_id: '1070' } },
body: "Lincolnshire County Council"
-}));
+});
// NB Lincs don't want forward planning works displayed, so
// fixmystreet.roadworks.layer_planned is deliberately missing here.
diff --git a/web/cobrands/northamptonshire/assets.js b/web/cobrands/northamptonshire/assets.js
index c6632de5c..cae4c26a5 100644
--- a/web/cobrands/northamptonshire/assets.js
+++ b/web/cobrands/northamptonshire/assets.js
@@ -385,7 +385,7 @@ var northants_defaults = $.extend(true, {}, fixmystreet.assets.alloy_defaults, {
$.each(layers, function(index, layer) {
if ( layer.categories ) {
- fixmystreet.assets.add($.extend(true, {}, northants_defaults, {
+ fixmystreet.assets.add(northants_defaults, {
http_options: {
layerid: layer.layer,
layerVersion: layer.version,
@@ -393,7 +393,7 @@ $.each(layers, function(index, layer) {
asset_type: layer.asset_type || 'spot',
asset_category: layer.categories,
asset_item: layer.item_name || layer.layer_name.toLowerCase(),
- }));
+ });
}
});
@@ -422,7 +422,7 @@ var northants_road_defaults = $.extend(true, {}, fixmystreet.assets.alloy_defaul
});
-fixmystreet.assets.add($.extend(true, {}, northants_road_defaults, {
+fixmystreet.assets.add(northants_road_defaults, {
http_options: {
layerid: 221,
layerVersion: '221.4-',
@@ -433,7 +433,7 @@ fixmystreet.assets.add($.extend(true, {}, northants_road_defaults, {
asset_category: [
"Damaged Speed Humps",
]
-}));
+});
var barrier_style = new OpenLayers.Style({
fill: false,
@@ -442,7 +442,7 @@ var barrier_style = new OpenLayers.Style({
strokeWidth: 4
});
-fixmystreet.assets.add($.extend(true, {}, northants_road_defaults, {
+fixmystreet.assets.add(northants_road_defaults, {
http_options: {
layerid: is_live ? 1068 : 230,
layerVersion: is_live ? '1068.1-' : '230.4-',
@@ -456,7 +456,7 @@ fixmystreet.assets.add($.extend(true, {}, northants_road_defaults, {
asset_category: [
"Pedestrian Barriers - Damaged / Missing",
]
-}));
+});
var highways_style = new OpenLayers.Style({
fill: false,
@@ -465,7 +465,7 @@ var highways_style = new OpenLayers.Style({
strokeWidth: 7
});
-fixmystreet.assets.add($.extend(true, {}, northants_road_defaults, {
+fixmystreet.assets.add(northants_road_defaults, {
protocol_class: OpenLayers.Protocol.Alloy,
http_options: {
layerid: is_live ? 20 : 308,
@@ -503,7 +503,7 @@ fixmystreet.assets.add($.extend(true, {}, northants_road_defaults, {
"Restricted Visibility / Overgrown / Overhanging",
"Restricted Visibility",
]
-}));
+});
var prow_style = new OpenLayers.Style({
@@ -513,7 +513,7 @@ var prow_style = new OpenLayers.Style({
strokeWidth: 7
});
-fixmystreet.assets.add($.extend(true, {}, northants_road_defaults, {
+fixmystreet.assets.add(northants_road_defaults, {
http_options: {
layerid: 173,
layerVersion: '173.1-',
@@ -527,7 +527,7 @@ fixmystreet.assets.add($.extend(true, {}, northants_road_defaults, {
"Livestock",
"Passage-Obstructed/Overgrown"
]
-}));
+});
fixmystreet.message_controller.register_category({
body: northants_defaults.body,
diff --git a/web/cobrands/sass/_base.scss b/web/cobrands/sass/_base.scss
index 5a1cf8fe7..e193553be 100644
--- a/web/cobrands/sass/_base.scss
+++ b/web/cobrands/sass/_base.scss
@@ -127,11 +127,9 @@ ol.big-numbers {
top:-0.2em;
color:$col_big_numbers;
line-height:1;
- font: {
- family: $meta-font;
- weight:bold;
- size:2.5rem;
- }
+ font-family: $meta-font;
+ font-weight: bold;
+ font-size: 2.5rem;
}
}
}
@@ -1838,10 +1836,8 @@ html.js #map .noscript {
padding:0.75em 30px;
a {
@include button-reset(#333, #1a1a1a, #1a1a1a, #fff, #333, #1a1a1a, #1a1a1a, #fff);
- font: {
- weight:normal;
- size:0.875em;
- }
+ font-weight: normal;
+ font-size: 0.875em;
line-height:1;
padding:0.5em 0.75em;
position:absolute;
@@ -2208,11 +2204,9 @@ label .muted {
text-align:center;
margin: 1em;
h2 {
- font: {
- style:italic;
- family: $meta-font;
- size:1.1875em;
- }
+ font-style: italic;
+ font-family: $meta-font;
+ font-size: 1.1875em;
color:#4d4d4d;
}
p {
@@ -2267,10 +2261,8 @@ label .muted {
background:#1a1a1a;
color:#C8C8C8;
padding:0.5em;
- font: {
- family: $meta-font;
- size:0.8125em;
- }
+ font-family: $meta-font;
+ font-size: 0.8125em;
@include border-radius(0 0 0.25em 0.25em);
&:hover {
text-decoration:none;
@@ -2303,10 +2295,8 @@ a#geolocate_link.loading, .btn--geolocate.loading {
text-align:center;
padding:1em;
line-height:1.25em;
- font: {
- size:0.8125em;
- weight:bold;
- }
+ font-size: 0.8125em;
+ font-weight: bold;
}
big {
display:block;