Let users add new template from the choose page

Since we’re letting users add new folders directly from the choose page
it makes sense that they should also be able to add templates from
there.

This resolves the problem we saw in user research where people found it
hard to know where to go to add a new folder when they were all behind
one green button.
This commit is contained in:
Chris Hill-Scott
2018-11-28 13:48:13 +00:00
parent 8aeea9929f
commit 10100e51b6
6 changed files with 234 additions and 79 deletions

View File

@@ -717,7 +717,14 @@ class FieldWithNoneOption():
class RadioFieldWithNoneOption(FieldWithNoneOption, RadioField):
pass
def validate(self, *args, **kwargs):
if self.data == self.NONE_OPTION_VALUE:
self.data = None
return True
return super().validate(*args, **kwargs)
class HiddenFieldWithNoneOption(FieldWithNoneOption, HiddenField):
@@ -1174,6 +1181,8 @@ class TemplateAndFoldersSelectionForm(Form):
all_template_folders,
template_list,
current_folder_id,
allow_adding_letter_template,
allow_adding_copy_of_template,
*args,
**kwargs
):
@@ -1183,7 +1192,7 @@ class TemplateAndFoldersSelectionForm(Form):
self.templates_and_folders.choices = template_list.as_id_and_name
self.op = None
self.is_move_op = self.is_add_op = False
self.is_move_op = self.is_add_folder_op = self.is_add_template_op = False
self.move_to.choices = [
(item['id'], item['name'])
@@ -1191,13 +1200,21 @@ class TemplateAndFoldersSelectionForm(Form):
if item['id'] != str(current_folder_id)
]
self.add_template_by_template_type.choices = filter(None, [
('email', 'Email template'),
('sms', 'Text message template'),
('letter', 'Letter template') if allow_adding_letter_template else None,
('copy-existing', 'Copy of an existing template') if allow_adding_copy_of_template else None,
])
def validate(self):
self.op = request.form.get('operation')
self.is_move_op = self.op in {'move_to_existing_folder', 'move_to_new_folder'}
self.is_add_op = self.op in {'add_new_folder', 'move_to_new_folder'}
self.is_add_folder_op = self.op in {'add_new_folder', 'move_to_new_folder'}
self.is_add_template_op = self.op in {'add_template'}
if not (self.is_add_op or self.is_move_op):
if not (self.is_add_folder_op or self.is_move_op or self.is_add_template_op):
return False
return super().validate()
@@ -1218,3 +1235,7 @@ class TemplateAndFoldersSelectionForm(Form):
])
add_new_folder_name = StringField('Folder name', validators=[required_for_ops('add_new_folder')])
move_to_new_folder_name = StringField('Folder name', validators=[required_for_ops('move_to_new_folder')])
add_template_by_template_type = RadioFieldWithNoneOption('Add new', validators=[
required_for_ops('add_template')
])

View File

@@ -116,6 +116,11 @@ def choose_template(service_id, template_type='all', template_folder_id=None):
template_list=template_list,
template_type=template_type,
current_folder_id=template_folder_id,
allow_adding_letter_template=current_service.has_permission('letter'),
allow_adding_copy_of_template=(
current_service.all_templates or
len(user_api_client.get_service_ids_for_user(current_user)) > 1
),
)
if request.method == 'POST' and templates_and_folders_form.validate_on_submit():
@@ -144,7 +149,13 @@ def choose_template(service_id, template_type='all', template_folder_id=None):
def process_folder_management_form(form, current_folder_id):
new_folder_id = None
if form.is_add_op:
if form.is_add_template_op:
return _add_template_by_type(
form.add_template_by_template_type.data,
current_folder_id,
)
if form.is_add_folder_op:
new_folder_id = template_folder_api_client.create_template_folder(
current_service.id,
name=form.get_folder_name(),
@@ -248,55 +259,59 @@ def add_template_by_type(service_id, template_folder_id=None):
form = ChooseTemplateType(
include_letters=current_service.has_permission('letter'),
include_copy=any((
service_api_client.count_service_templates(service_id) > 0,
len(current_service.all_templates) > 0,
len(user_api_client.get_service_ids_for_user(current_user)) > 1,
)),
include_folder=current_service.has_permission('edit_folders')
)
if form.validate_on_submit():
if form.template_type.data == 'copy-existing':
return redirect(url_for(
'.choose_template_to_copy',
service_id=service_id,
))
if form.template_type.data == 'letter':
blank_letter = service_api_client.create_service_template(
'Untitled',
'letter',
'Body',
service_id,
'Main heading',
'normal',
template_folder_id
)
return redirect(url_for(
'.view_template',
service_id=service_id,
template_id=blank_letter['data']['id'],
))
if email_or_sms_not_enabled(form.template_type.data, current_service.permissions):
return redirect(url_for(
'.action_blocked',
service_id=service_id,
notification_type=form.template_type.data,
return_to='add_new_template',
template_id='0'
))
else:
return redirect(url_for(
'.add_service_template',
service_id=service_id,
template_type=form.template_type.data,
template_folder_id=template_folder_id,
))
return _add_template_by_type(form.template_type.data, template_folder_id)
return render_template('views/templates/add.html', form=form)
def _add_template_by_type(template_type, template_folder_id):
if template_type == 'copy-existing':
return redirect(url_for(
'.choose_template_to_copy',
service_id=current_service.id,
))
if template_type == 'letter':
blank_letter = service_api_client.create_service_template(
'Untitled',
'letter',
'Body',
current_service.id,
'Main heading',
'normal',
template_folder_id
)
return redirect(url_for(
'.view_template',
service_id=current_service.id,
template_id=blank_letter['data']['id'],
))
if email_or_sms_not_enabled(template_type, current_service.permissions):
return redirect(url_for(
'.action_blocked',
service_id=current_service.id,
notification_type=template_type,
return_to='add_new_template',
template_id='0'
))
else:
return redirect(url_for(
'.add_service_template',
service_id=current_service.id,
template_type=template_type,
template_folder_id=template_folder_id,
))
@main.route("/services/<service_id>/templates/copy")
@login_required
@user_has_permissions('manage_templates')

View File

@@ -1,19 +1,20 @@
{% from "components/radios.html" import radios %}
{% from "components/page-footer.html" import page_footer %}
{% if templates_and_folders_form.move_to.choices and template_list.templates_to_show %}
<button type="submit" name="operation" value="unknown" hidden></button>
<div id="move_to_folder_radios">
{{ radios(templates_and_folders_form.move_to) }}
{{ page_footer('Move', button_name='operation', button_value='move_to_existing_folder') }}
</div>
<div id="move_to_new_folder_form">
<fieldset>
<legend class="visuallyhidden">Move to a new folder</legend>
{{ textbox(templates_and_folders_form.move_to_new_folder_name) }}
{{ page_footer('Move to a new folder', button_name='operation', button_value='move_to_new_folder') }}
</fieldset>
</div>
{% if templates_and_folders_form.move_to.choices and template_list.templates_to_show %}
<div id="move_to_folder_radios">
{{ radios(templates_and_folders_form.move_to) }}
{{ page_footer('Move', button_name='operation', button_value='move_to_existing_folder') }}
</div>
<div id="move_to_new_folder_form">
<fieldset>
<legend class="visuallyhidden">Move to a new folder</legend>
{{ textbox(templates_and_folders_form.move_to_new_folder_name) }}
{{ page_footer('Move to a new folder', button_name='operation', button_value='move_to_new_folder') }}
</fieldset>
</div>
{% endif %}
<div id="add_new_folder_form">
<fieldset>
<legend class="visuallyhidden">Add a new folder</legend>
@@ -21,4 +22,10 @@
{{ page_footer('New folder', button_name='operation', button_value='add_new_folder') }}
</fieldset>
</div>
{% endif %}
<div id="add_new_template_form">
<fieldset>
<legend class="visuallyhidden">Add a new template</legend>
{{ radios(templates_and_folders_form.add_template_by_template_type) }}
{{ page_footer('Continue', button_name='operation', button_value='add_template') }}
</fieldset>
</div>