diff --git a/app/main/forms.py b/app/main/forms.py index b4ddb4b6a..ed249e9eb 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -3,6 +3,7 @@ from datetime import datetime, timedelta from itertools import chain import pytz +from flask import request from flask_wtf import FlaskForm as Form from flask_wtf.file import FileAllowed from flask_wtf.file import FileField as FileField_wtf @@ -1154,11 +1155,33 @@ class TemplateAndFoldersSelectionForm(Form): self.templates_and_folders.choices = template_list.as_id_and_name + self.is_move_op = self.is_add_op = False + self.move_to.choices = [ (item['id'], item['name']) for item in ([self.ALL_TEMPLATES_FOLDER] + all_template_folders) if item['id'] != str(current_folder_id) ] + def validate(self): + op = request.form.get('operation') + + self.is_move_op = op in {'move_to_existing_folder', 'move_to_new_folder'} + self.is_add_op = op in {'add_new_folder', 'move_to_new_folder'} + + if not (self.is_add_op or self.is_move_op): + return False + + return super().validate() + + def validate_move_to(self, field): + if self.is_move_op and not field.data: + raise ValidationError('Can’t be empty') + + def validate_new_folder_name(self, field): + if self.is_add_op and not field.data: + raise ValidationError('Can’t be empty') + templates_and_folders = MultiCheckboxField('Choose templates or folders') - move_to = RadioFieldWithNoneOption('Choose a folder') + move_to = RadioFieldWithNoneOption('Choose a folder', validators=[Optional()]) + new_folder_name = StringField('Folder name') diff --git a/app/main/views/templates.py b/app/main/views/templates.py index 9506fc92a..02db81402 100644 --- a/app/main/views/templates.py +++ b/app/main/views/templates.py @@ -117,24 +117,9 @@ def choose_template(service_id, template_type='all', template_folder_id=None): template_type=template_type, current_folder_id=template_folder_id, ) - add_folder_form = TemplateFolderForm() - if is_valid_template_operation('move', templates_and_folders_form): - current_service.move_to_folder( - ids_to_move=templates_and_folders_form.templates_and_folders.data, - move_to=templates_and_folders_form.move_to.data, - ) - return redirect(request.url) - - if is_valid_template_operation('add_new_folder', add_folder_form): - template_folder_api_client.create_template_folder( - current_service.id, - name=add_folder_form.name.data, - parent_id=template_folder_id - ) - return redirect( - url_for('.choose_template', service_id=service_id, template_folder_id=template_folder_id) - ) + if request.method == 'POST' and can_manage_folders() and templates_and_folders_form.validate_on_submit(): + return process_folder_management_form(templates_and_folders_form, template_folder_id) return render_template( 'views/templates/choose.html', @@ -150,20 +135,30 @@ def choose_template(service_id, template_type='all', template_folder_id=None): template_nav_items=get_template_nav_items(template_folder_id), template_type=template_type, search_form=SearchTemplatesForm(), - templates_and_folders_form=templates_and_folders_form, - add_folder_form=add_folder_form, + templates_and_folders_form=templates_and_folders_form ) -def is_valid_template_operation(operation_name, form): +def process_folder_management_form(form, current_folder_id): + new_folder_id = None - if ( - can_manage_folders() and - request.method == 'POST' and - request.form.get('operation') == operation_name and - form.validate_on_submit() - ): - return True + if form.is_add_op: + new_folder_id = template_folder_api_client.create_template_folder( + current_service.id, + name=form.new_folder_name.data, + parent_id=current_folder_id + ) + + if form.is_move_op: + # if we've just made a folder, we also want to move there + move_to_id = new_folder_id or form.move_to.data + + current_service.move_to_folder( + ids_to_move=form.templates_and_folders.data, + move_to=move_to_id + ) + + return redirect(request.url) def get_template_nav_label(value): diff --git a/app/templates/views/templates/_move_to.html b/app/templates/views/templates/_move_to.html index 10ab965a2..f1789dd64 100644 --- a/app/templates/views/templates/_move_to.html +++ b/app/templates/views/templates/_move_to.html @@ -2,6 +2,10 @@ {% from "components/page-footer.html" import page_footer %} {% if templates_and_folders_form.move_to.choices and template_list.templates_to_show %} + {{ radios(templates_and_folders_form.move_to) }} - {{ page_footer('Move selected', button_name='operation', button_value='move') }} + {{ page_footer('Move', button_name='operation', button_value='move_to_existing_folder') }} + {{ textbox(templates_and_folders_form.new_folder_name) }} + {{ page_footer('Move to a new folder', button_name='operation', button_value='move_to_new_folder') }} + {{ page_footer('New folder', button_name='operation', button_value='add_new_folder') }} {% endif %} diff --git a/app/templates/views/templates/choose.html b/app/templates/views/templates/choose.html index e5f473ca3..8cba7139c 100644 --- a/app/templates/views/templates/choose.html +++ b/app/templates/views/templates/choose.html @@ -85,11 +85,6 @@ {% endwith %} {% endcall %} - {% call form_wrapper() %} - {{ textbox(add_folder_form.name) }} - {{ page_footer('New folder', button_name='operation', button_value='add_new_folder') }} - {% endcall %} - {% else %} {% include 'views/templates/_template_list.html' %} {% endif %}