Make radio select work w/ new checkboxes/radios

The visual appearance of radio and checkbox form inputs changed in
GOV.UK Elements here:

https://github.com/alphagov/govuk_elements/pull/296

This was subsequently reimplemented with different markup and no
Javascript here:
https://github.com/alphagov/govuk_elements/pull/406

This has meant making the following changes to our app:
- changing the markup in our radio/checkbox macros to match the example
  markup given by GOV.UK Elements
- removing the previous Javascript file because it’s no longer needed to
  make the radios appear visual selected
- making the buttons on the scheduled job picker look like links,
  because the grey button style looked weird with the new radio buttons
This commit is contained in:
Chris Hill-Scott
2017-04-10 14:18:12 +01:00
parent 31d03acc11
commit a592898eff
7 changed files with 91 additions and 81 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ $(() => $("time.timeago").timeago());
$(() => GOVUK.modules.start()); $(() => GOVUK.modules.start());
$(() => new GOVUK.SelectionButtons('.block-label input, .sms-message-option input')); $(() => new GOVUK.SelectionButtons('.block-label input'));
$(() => $('.error-message').eq(0).parent('label').next('input').trigger('focus')); $(() => $('.error-message').eq(0).parent('label').next('input').trigger('focus'));
+28 -22
View File
@@ -5,54 +5,57 @@
let states = { let states = {
'initial': Hogan.compile(` 'initial': Hogan.compile(`
<div class="radio-select-column"> <div class="radio-select-column">
<label class="block-label js-block-label" for="{{name}}-0"> <div class="multiple-choice js-multiple-choice">
<input checked="checked" id="{{name}}-0" name="{{name}}" type="radio" value=""> Now <input checked="checked" id="{{name}}-0" name="{{name}}" type="radio" value="">
</label> <label class="block-label js-block-label" for="{{name}}-0">Now</label>
</div>
</div> </div>
<div class="radio-select-column"> <div class="radio-select-column">
{{#categories}} {{#categories}}
<input type='button' class='button tertiary-button js-category-button' value='{{.}}' /> <input type='button' class='js-category-button' value='{{.}}' />
{{/categories}} {{/categories}}
</div> </div>
`), `),
'choose': Hogan.compile(` 'choose': Hogan.compile(`
<div class="radio-select-column"> <div class="radio-select-column">
<label class="block-label js-block-label" for="{{name}}-0"> <div class="multiple-choice js-multiple-choice js-initial-option">
<input checked="checked" id="{{name}}-0" name="{{name}}" type="radio" value="" class="js-initial-option"> Now <input checked="checked" id="{{name}}-0" name="{{name}}" type="radio" value="">
</label> <label for="{{name}}-0">Now</label>
</div>
</div> </div>
<div class="radio-select-column"> <div class="radio-select-column">
{{#choices}} {{#choices}}
<label class="block-label js-block-label" for="{{id}}"> <div class="multiple-choice js-multiple-choice js-option">
<input type="radio" value="{{value}}" id="{{id}}" name="{{name}}" class="js-option" /> <input type="radio" value="{{value}}" id="{{id}}" name="{{name}}" />
{{label}} <label for="{{id}}">{{label}}</label>
</label> </div>
{{/choices}} {{/choices}}
</div> </div>
`), `),
'chosen': Hogan.compile(` 'chosen': Hogan.compile(`
<div class="radio-select-column"> <div class="radio-select-column">
<label class="block-label js-block-label" for="{{name}}-0"> <div class="multiple-choice js-multiple-choice js-initial-option">
<input id="{{name}}-0" name="{{name}}" type="radio" value="" class="js-initial-option"> Now <input id="{{name}}-0" name="{{name}}" type="radio" value="">
</label> <label for="{{name}}-0">Now</label>
</div>
</div> </div>
<div class="radio-select-column"> <div class="radio-select-column">
{{#choices}} {{#choices}}
<label class="block-label js-block-label" for="{{id}}"> <div class="multiple-choice js-multiple-choice">
<input checked="checked" type="radio" value="{{value}}" id="{{id}}" name="{{name}}" /> <input checked="checked" type="radio" value="{{value}}" id="{{id}}" name="{{name}}" />
{{label}} <label for="{{id}}">{{label}}</label>
</label> </div>
{{/choices}} {{/choices}}
</div> </div>
<div class="radio-select-column"> <div class="radio-select-column">
<input type='button' class='button tertiary-button js-reset-button' value='Choose a different time' /> <input type='button' class='category-link js-reset-button' value='Choose a different time' />
</div> </div>
`) `)
}; };
let focusSelected = function() { let focusSelected = function() {
setTimeout( setTimeout(
() => $('[type=radio]:checked').parent('label').blur().trigger('focus').addClass('selected'), () => $('[type=radio]:checked').next('label').blur().trigger('focus').addClass('selected'),
10 10
); );
}; };
@@ -62,13 +65,16 @@
this.start = function(component) { this.start = function(component) {
let $component = $(component); let $component = $(component);
let render = (state, data) => $component.html(states[state].render(data)); let render = (state, data) => {
$component.html(states[state].render(data));
new GOVUK.SelectionButtons('.block-label input');
};
let choices = $('label', $component).toArray().map(function(element) { let choices = $('label', $component).toArray().map(function(element) {
let $element = $(element); let $element = $(element);
return { return {
'id': $element.attr('for'), 'id': $element.attr('for'),
'label': $.trim($element.text()), 'label': $.trim($element.text()),
'value': $element.find('input').attr('value') 'value': $element.prev('input').attr('value')
}; };
}); });
let categories = $component.data('categories').split(','); let categories = $component.data('categories').split(',');
@@ -95,7 +101,7 @@
if (!event.pageX) return true; if (!event.pageX) return true;
event.preventDefault(); event.preventDefault();
let value = $(this).attr('value'); let value = $('input', this).attr('value');
render('chosen', { render('chosen', {
'choices': choices.filter( 'choices': choices.filter(
element => element.value == value element => element.value == value
@@ -5,19 +5,25 @@
display: inline-block; display: inline-block;
vertical-align: top; vertical-align: top;
.block-label { .multiple-choice {
margin-right: 5px; margin-right: 5px;
padding-right: $gutter - 10px; padding-right: 10px;
padding-left: 54px - 10px; padding-left: 54px - 10px;
} }
} }
.tertiary-button { .js-reset-button,
.js-category-button {
background: none;
text-decoration: underline;
color: $link-colour;
//font-weight: bold;
border: none;
display: inline-block; display: inline-block;
vertical-align: top; vertical-align: top;
width: auto; width: auto;
padding: 20px $gutter-half 15px $gutter-half; padding: 7px 20px 7px 10px;
margin-right: 5px; margin-right: 5px;
} }
@@ -26,12 +32,12 @@
height: 60px; height: 60px;
overflow: visible; overflow: visible;
.block-label { .multiple-choice {
display: none; display: none;
} }
.js-block-label { .js-multiple-choice {
display: inline-block; display: block;
} }
} }
+16 -23
View File
@@ -1,29 +1,22 @@
{% macro checkbox( {% macro checkbox(
field, field,
hint=False, hint=False,
help_link=None, width='2-3'
help_link_text=None,
width='2-3',
suffix=None,
block=False
) %} ) %}
<label class="{% if block %}block-label{% endif %}" for="{{ field.name }}"> <div class="multiple-choice">
{{ field()}} <input
{{ field.label.text }} id="{{ field.id }}" name="{{ field.name }}" type="checkbox" value="{{ field.data }}"
{% if hint %} {% if field.checked %}
<span class="form-hint"> checked
{{ hint }} {% endif %}
</span> >
{% endif %} <label for="{{ field.id }}">
{% if field.errors %} {{ field.label.text }}
<span class="error-message"> {% if hint %}
{{ field.errors[0] }} <div class="hint">
</span> {{ hint }}
{% endif %} </div>
{% if help_link and help_link_text %} {% endif %}
<p class="textbox-help-link">
<a href='{{ help_link }}'>{{ help_link_text }}</a>
</p>
{% endif %}
</label> </label>
</div>
{% endmacro %} {% endmacro %}
+29 -23
View File
@@ -15,7 +15,7 @@
{% endif %} {% endif %}
</legend> </legend>
{% for option in field %} {% for option in field %}
<label class="block-label" for="{{ option.id }}"> <div class="multiple-choice">
<input <input
id="{{ option.id }}" name="{{ option.name }}" type="radio" value="{{ option.data }}" id="{{ option.id }}" name="{{ option.name }}" type="radio" value="{{ option.data }}"
{% if option.data in disable %} {% if option.data in disable %}
@@ -25,13 +25,15 @@
checked checked
{% endif %} {% endif %}
> >
{{ option.label.text }} <label class="block-label" for="{{ option.id }}">
{% if option_hints[option.data] %} {{ option.label.text }}
<div class="block-label-hint"> {% if option_hints[option.data] %}
{{ option_hints[option.data] }} <div class="block-label-hint">
</div> {{ option_hints[option.data] }}
{% endif %} </div>
</label> {% endif %}
</label>
</div>
{% endfor %} {% endfor %}
</fieldset> </fieldset>
</div> </div>
@@ -56,10 +58,12 @@
<div class="radio-select" data-module="radio-select" data-categories="{{ field.categories|join(',') }}"> <div class="radio-select" data-module="radio-select" data-categories="{{ field.categories|join(',') }}">
<div class="radio-select-column"> <div class="radio-select-column">
{% for option in field %} {% for option in field %}
<label class="block-label" for="{{ option.id }}"> <div class="multiple-choice">
{{ option }} {{ option }}
{{ option.label.text }} <label for="{{ option.id }}">
</label> {{ option.label.text }}
</label>
</div>
{% if loop.first %} {% if loop.first %}
</div> </div>
<div class="radio-select-column"> <div class="radio-select-column">
@@ -88,7 +92,7 @@
{% endif %} {% endif %}
</legend> </legend>
{% for value, option, checked in field.iter_choices() %} {% for value, option, checked in field.iter_choices() %}
<label class="block-label" for="{{ field.name }}-{{ loop.index }}"> <div class="multiple-choice">
<input <input
type="radio" type="radio"
name="{{ field.name }}" name="{{ field.name }}"
@@ -96,17 +100,19 @@
value="{{ value }}" value="{{ value }}"
{% if checked %}checked="checked"{% endif %} {% if checked %}checked="checked"{% endif %}
/> />
{% if branding_dict.get(value, {}).get('colour') %} <label class="block-label" for="{{ field.name }}-{{ loop.index }}">
<span style="background: {{ branding_dict[value].colour }}; display: inline-block; width: 3px; height: 27px"></span> {% if branding_dict.get(value, {}).get('colour') %}
{% endif %} <span style="background: {{ branding_dict[value].colour }}; display: inline-block; width: 3px; height: 27px"></span>
{% if branding_dict.get(value, {}).get('logo') %} {% endif %}
<img {% if branding_dict.get(value, {}).get('logo') %}
src="{{ branding_dict[value].logo }}" <img
height="27" src="{{ branding_dict[value].logo }}"
/> height="27"
{% endif %} />
{{option}} {% endif %}
</label> {{option}}
</label>
</div>
{% endfor %} {% endfor %}
</fieldset> </fieldset>
</div> </div>
@@ -4,9 +4,9 @@
<legend class="form-label"> <legend class="form-label">
Permissions Permissions
</legend> </legend>
{{ checkbox(form.send_messages, block=True) }} {{ checkbox(form.send_messages) }}
{{ checkbox(form.manage_service, block=True) }} {{ checkbox(form.manage_service) }}
{{ checkbox(form.manage_api_keys, block=True) }} {{ checkbox(form.manage_api_keys) }}
</fieldset> </fieldset>
<div class="form-group"> <div class="form-group">
-1
View File
@@ -54,7 +54,6 @@ gulp.task('copy:govuk_template:images', () => gulp.src(paths.template + 'assets/
gulp.task('javascripts', () => gulp gulp.task('javascripts', () => gulp
.src([ .src([
paths.toolkit + 'javascripts/govuk/modules.js', paths.toolkit + 'javascripts/govuk/modules.js',
paths.toolkit + 'javascripts/govuk/selection-buttons.js',
paths.src + 'javascripts/detailsPolyfill.js', paths.src + 'javascripts/detailsPolyfill.js',
paths.src + 'javascripts/apiKey.js', paths.src + 'javascripts/apiKey.js',
paths.src + 'javascripts/autofocus.js', paths.src + 'javascripts/autofocus.js',