Refactor hex colour preview Javascript

This commit improves the code that previews a hex colour when setting up
or changing an email branding.

Specifically it:
- refactors the Javascript to conform to our patterns (module pattern,
  preprocessed with Gulp)
- makes the code work when there are multiple colour previews on one
  page

It also does some visual prettifying, because I couldn’t help myself…
This commit is contained in:
Chris Hill-Scott
2018-08-20 13:27:50 +01:00
parent 864e732c38
commit b73e42650d
6 changed files with 36 additions and 21 deletions

View File

@@ -0,0 +1,26 @@
(function(Modules) {
"use strict";
let isSixDigitHex = value => value.match(/^#[0-9A-F]{6}$/i);
let colourOrWhite = value => isSixDigitHex(value) ? value : '#FFFFFF';
Modules.ColourPreview = function() {
this.start = component => {
this.$input = $('input', component);
this.$preview = $('.textbox-colour-preview', component);
this.$input
.on('change keyup', this.update)
.trigger('change');
};
this.update = () => this.$preview.css(
'background', colourOrWhite(this.$input.val())
);
};
})(window.GOVUK.Modules);

View File

@@ -62,11 +62,13 @@
.textbox-colour-preview {
@include media(desktop) {
width: 34px;
height: 34px;
width: 38px;
height: 38px;
margin-left: 5px;
border: 2px solid #0B0C0C;
border-radius: 50%;
box-shadow: inset 0 0 0 1px rgba($black, 0.2);
display: inline-block;
vertical-align: top;
transition: background 0.3s ease-out;
}
}

View File

@@ -734,21 +734,18 @@ class ServiceUpdateEmailBranding(StripWhitespaceForm):
domain = StringField('Domain')
colour = StringField(
'Colour',
render_kw={'onchange': 'update_colour(this)'},
validators=[
Regexp(regex="^$|^#(?:[0-9a-fA-F]{3}){1,2}$", message='Must be a valid color hex code')
]
)
banner_colour = StringField(
'Banner colour',
render_kw={'onchange': 'update_colour(this)'},
validators=[
Regexp(regex="^$|^#(?:[0-9a-fA-F]{3}){1,2}$", message='Must be a valid color hex code')
]
)
single_id_colour = StringField(
'Single identity colour',
render_kw={'onchange': 'update_colour(this)'},
validators=[
Regexp(regex="^$|^#(?:[0-9a-fA-F]{3}){1,2}$", message='Must be a valid color hex code')
]

View File

@@ -60,10 +60,9 @@
{% macro colour_textbox(
field,
width='2-3',
colour='#FFFFFF'
width='2-3'
) %}
<div class="form-group{% if field.errors %} form-group-error{% endif %}">
<div class="form-group{% if field.errors %} form-group-error{% endif %}" data-module="colour-preview">
<label class="form-label" for="{{ field.name }}">
{{ field.label.text }}
{% if field.errors %}
@@ -80,6 +79,6 @@
rows='1',
**kwargs
) }}
<span class="textbox-colour-preview" style="background:{{ colour }}"></span>
<span class="textbox-colour-preview"></span>
</div>
{% endmacro %}

View File

@@ -34,15 +34,5 @@
</div>
</form>
</div>
</div>
<script type="text/javascript">
function update_colour(element){
colour_preview = document.getElementsByClassName("textbox-colour-preview")[0];
if (element.value.match(/^#[0-9A-F]{6}$/i)) {
colour_preview.style.background = element.value;
} else {
colour_preview.style.background = '#FFFFFF';
}
}
</script>
{% endblock %}

View File

@@ -75,6 +75,7 @@ gulp.task('javascripts', () => gulp
paths.src + 'javascripts/preventDuplicateFormSubmissions.js',
paths.src + 'javascripts/fullscreenTable.js',
paths.src + 'javascripts/emailPreviewPane.js',
paths.src + 'javascripts/colourPreview.js',
paths.src + 'javascripts/main.js'
])
.pipe(plugins.prettyerror())