diff --git a/app/assets/stylesheets/components/message.scss b/app/assets/stylesheets/components/message.scss index 3d63ff455..14e02ebf7 100644 --- a/app/assets/stylesheets/components/message.scss +++ b/app/assets/stylesheets/components/message.scss @@ -24,6 +24,9 @@ } } +$message-text-left-spacing: 22px; +$message-type-bottom-spacing: govuk-spacing(4); + .message { &-name { @@ -63,23 +66,14 @@ } &-type { - color: $secondary-text-colour; - margin: 0 0 govuk-spacing(4) 0; + color: $govuk-secondary-text-colour; + margin: 0 0 $message-type-bottom-spacing 0; + padding-left: 0; pointer-events: none; } } -#template-list { - - margin-top: govuk-spacing(6); - - &.top-gutter-5px { - margin-top: 5px; - } - -} - .template-list { &-item { @@ -123,6 +117,22 @@ } + &-hint, + &-label { + padding-left: $message-text-left-spacing; + } + + &-label { + padding-top: 0px; + padding-bottom: 0px; + } + + // Fix for GOVUK Frontend selector with high precendence + // https://github.com/alphagov/govuk-frontend/blob/v2.13.0/src/components/hint/_hint.scss + &-label:not(.govuk-label--m):not(.govuk-label--l):not(.govuk-label--xl)+.template-list-item-hint { + margin-bottom: $message-type-bottom-spacing; + } + } &-folder { diff --git a/app/main/forms.py b/app/main/forms.py index e23b43cdd..6837be289 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -623,11 +623,34 @@ class govukCheckboxesField(govukCheckboxesMixin, SelectMultipleField): def get_items_from_options(self, field): return [self.get_item_from_option(option) for option in field] + def extend_params(self, params, extensions): + items = None + param_items = len(params['items']) if 'items' in params else 0 + + # split items off from params to make it a pure dict + if 'items' in extensions: + items = extensions['items'] + del extensions['items'] + + # merge dicts + params.update(extensions) + + # merge items + if items: + if 'items' not in params: + params['items'] = items + else: + for idx, _item in enumerate(items): + if idx >= param_items: + params['items'].append(items[idx]) + else: + params['items'][idx].update(items[idx]) + # self.__call__ renders the HTML for the field by: # 1. delegating to self.meta.render_field which # 2. calls field.widget # this bypasses that by making self.widget a method with the same interface as widget.__call__ - def widget(self, field, **kwargs): + def widget(self, field, param_extensions=None, **kwargs): # error messages error_message = None @@ -1898,9 +1921,18 @@ class TemplateAndFoldersSelectionForm(Form): return self.move_to_new_folder_name.data return None - templates_and_folders = MultiCheckboxField('Choose templates or folders', validators=[ - required_for_ops('move-to-new-folder', 'move-to-existing-folder') - ]) + templates_and_folders = govukCheckboxesField( + 'Choose templates or folders', + validators=[required_for_ops('move-to-new-folder', 'move-to-existing-folder')], + choices=[], # added to keep order of arguments, added properly in __init__ + param_extensions={ + "fieldset": { + "legend": { + "classes": "govuk-visually-hidden" + } + } + } + ) # if no default set, it is set to None, which process_data transforms to '__NONE__' # this means '__NONE__' (self.ALL_TEMPLATES option) is selected when no form data has been submitted # set default to empty string so process_data method doesn't perform any transformation diff --git a/app/templates/views/templates/_template_list.html b/app/templates/views/templates/_template_list.html index 5bcb03501..42483d33a 100644 --- a/app/templates/views/templates/_template_list.html +++ b/app/templates/views/templates/_template_list.html @@ -21,37 +21,58 @@ {% endif %}
{% else %} -