mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-11 09:28:27 -04:00
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:
@@ -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')
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
Reference in New Issue
Block a user