move add new folder and move to folder into one dialog box

this lets us combine the two actions to create "Move to a new folder".
If the user hits enter rather than clicking a button, there is a hidden
submit button that (for now) prevents them from taking any action.
A future commit will try and understand what the user might be doing
based on which fields are populated/selected.
This commit is contained in:
Leo Hemsted
2018-11-15 17:31:07 +00:00
parent 9dec9ed626
commit 690585c017
4 changed files with 51 additions and 34 deletions

View File

@@ -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('Cant be empty')
def validate_new_folder_name(self, field):
if self.is_add_op and not field.data:
raise ValidationError('Cant 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')

View File

@@ -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):

View File

@@ -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 %}
<button type="submit" name="operation" value="unknown" hidden></button>
{{ 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 %}

View File

@@ -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 %}