diff --git a/client/src/entrypoints/admin/task-chooser-modal.js b/client/src/entrypoints/admin/task-chooser-modal.js index 4ed3214db4..14c3fa4873 100644 --- a/client/src/entrypoints/admin/task-chooser-modal.js +++ b/client/src/entrypoints/admin/task-chooser-modal.js @@ -131,6 +131,10 @@ const TASK_CHOOSER_MODAL_ONLOAD_HANDLERS = { task_chosen(modal, jsonData) { modal.respond('taskChosen', jsonData.result); modal.close(); + }, + reshow_create_tab(modal, jsonData) { + $('#new', modal.body).html(jsonData.htmlFragment); + ajaxifyTaskCreateTab(modal, jsonData); } }; window.TASK_CHOOSER_MODAL_ONLOAD_HANDLERS = TASK_CHOOSER_MODAL_ONLOAD_HANDLERS; diff --git a/wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/create_form.html b/wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/create_form.html index ff5a32637d..e04eaa0b45 100644 --- a/wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/create_form.html +++ b/wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/create_form.html @@ -4,7 +4,7 @@ {{ form.media.js }} {% if task_types|length > 1 %} - {% trans "Choose a different task type" %} + {% trans "Choose a different task type" %} {% endif %}
diff --git a/wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/select_task_type.html b/wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/select_task_type.html index af713cb6fb..78474b0bb6 100644 --- a/wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/select_task_type.html +++ b/wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/select_task_type.html @@ -8,7 +8,7 @@
  • {{ description }} diff --git a/wagtail/admin/tests/test_workflows.py b/wagtail/admin/tests/test_workflows.py index 22a17fd1da..79ebd49fa8 100644 --- a/wagtail/admin/tests/test_workflows.py +++ b/wagtail/admin/tests/test_workflows.py @@ -1633,24 +1633,22 @@ class TestTaskChooserView(TestCase, WagtailTestUtils): self.assertFalse(response.context['searchform'].is_searching()) def test_get_with_create_model_selected(self): - response = self.client.get(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.GroupApprovalTask') + response = self.client.get(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.GroupApprovalTask') self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, "wagtailadmin/workflows/task_chooser/chooser.html") - - # Check that the "create" view was shown in the "new" tab + # Check that the "create" view was returned self.assertTemplateUsed(response, "wagtailadmin/workflows/task_chooser/includes/create_form.html") self.assertTemplateNotUsed(response, "wagtailadmin/workflows/task_chooser/includes/select_task_type.html") def test_get_with_non_task_create_model_selected(self): - response = self.client.get(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.Page') + response = self.client.get(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.Page') self.assertEqual(response.status_code, 404) def test_get_with_base_task_create_model_selected(self): # Task is technically a subclass of itself so we need an extra test for it - response = self.client.get(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.Task') + response = self.client.get(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.Task') self.assertEqual(response.status_code, 404) @@ -1678,7 +1676,7 @@ class TestTaskChooserView(TestCase, WagtailTestUtils): } def test_post_with_create_model_selected(self): - response = self.client.post(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.GroupApprovalTask', self.get_post_data()) + response = self.client.post(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.GroupApprovalTask', self.get_post_data()) self.assertEqual(response.status_code, 200) @@ -1700,7 +1698,7 @@ class TestTaskChooserView(TestCase, WagtailTestUtils): # When a single task type exists there's no need to specify create_model get_task_types.return_value = [GroupApprovalTask] - response = self.client.post(reverse('wagtailadmin_workflows:task_chooser'), self.get_post_data()) + response = self.client.post(reverse('wagtailadmin_workflows:task_chooser_create'), self.get_post_data()) self.assertEqual(response.status_code, 200) @@ -1718,7 +1716,7 @@ class TestTaskChooserView(TestCase, WagtailTestUtils): }) def test_post_without_create_model_selected(self): - response = self.client.post(reverse('wagtailadmin_workflows:task_chooser'), self.get_post_data()) + response = self.client.post(reverse('wagtailadmin_workflows:task_chooser_create'), self.get_post_data()) self.assertEqual(response.status_code, 400) @@ -1726,7 +1724,7 @@ class TestTaskChooserView(TestCase, WagtailTestUtils): self.assertFalse(Task.objects.filter(name="Editor approval task", active=True).exists()) def test_post_with_non_task_create_model_selected(self): - response = self.client.post(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.Page', self.get_post_data()) + response = self.client.post(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.Page', self.get_post_data()) self.assertEqual(response.status_code, 404) @@ -1735,7 +1733,7 @@ class TestTaskChooserView(TestCase, WagtailTestUtils): def test_post_with_base_task_create_model_selected(self): # Task is technically a subclass of itself so we need an extra test for it - response = self.client.post(reverse('wagtailadmin_workflows:task_chooser') + '?create_model=wagtailcore.Task', self.get_post_data()) + response = self.client.post(reverse('wagtailadmin_workflows:task_chooser_create') + '?create_model=wagtailcore.Task', self.get_post_data()) self.assertEqual(response.status_code, 404) diff --git a/wagtail/admin/urls/workflows.py b/wagtail/admin/urls/workflows.py index c022c514e4..da5fbe6411 100644 --- a/wagtail/admin/urls/workflows.py +++ b/wagtail/admin/urls/workflows.py @@ -21,5 +21,6 @@ urlpatterns = [ path('tasks/enable//', workflows.enable_task, name='enable_task'), path('task_chooser/', workflows.TaskChooserView.as_view(), name='task_chooser'), path('task_chooser/results/', workflows.TaskChooserResultsView.as_view(), name='task_chooser_results'), + path('task_chooser/create/', workflows.TaskChooserCreateView.as_view(), name='task_chooser_create'), path('task_chooser//', workflows.task_chosen, name='task_chosen'), ] diff --git a/wagtail/admin/views/workflows.py b/wagtail/admin/views/workflows.py index ed4b842241..a38486702b 100644 --- a/wagtail/admin/views/workflows.py +++ b/wagtail/admin/views/workflows.py @@ -5,6 +5,7 @@ from django.db import transaction from django.db.models.functions import Lower from django.http import Http404, HttpResponseBadRequest from django.shortcuts import get_object_or_404, redirect, render +from django.template.loader import render_to_string from django.template.response import TemplateResponse from django.urls import reverse from django.utils.functional import cached_property @@ -560,6 +561,12 @@ class BaseTaskChooserView(View): task_type_choices.sort(key=lambda task_type: task_type[1].lower()) return task_type_choices + def get_form_js_context(self): + return { + 'error_label': _("Server Error"), + 'error_message': _("Report this error to your webmaster with the following information:"), + } + class TaskChooserView(BaseTaskChooserView): def get(self, request): @@ -571,6 +578,43 @@ class TaskChooserView(BaseTaskChooserView): return self.render_to_response() + def render_to_response(self): + searchform = TaskChooserSearchForm(task_type_choices=self.get_task_type_filter_choices()) + tasks = searchform.task_model.objects.filter(active=True).order_by(Lower('name')) + + paginator = Paginator(tasks, per_page=10) + tasks = paginator.get_page(self.request.GET.get('p')) + + chooser_html_context = { + 'tasks': tasks, + 'searchform': searchform, + 'createform': self.createform, + 'can_create': self.can_create, + 'add_url': reverse('wagtailadmin_workflows:task_chooser_create') + '?' + self.request.GET.urlencode() if self.create_model else None + } + + if not self.createform: + chooser_html_context['task_types'] = self.get_task_type_options() + + js_context = self.get_form_js_context() + js_context['step'] = 'chooser' + + return render_modal_workflow( + self.request, 'wagtailadmin/workflows/task_chooser/chooser.html', None, + chooser_html_context, json_data=js_context + ) + + +class TaskChooserCreateView(BaseTaskChooserView): + def get(self, request): + create_form_class = self.get_create_form_class() + if create_form_class: + self.createform = create_form_class(prefix='create-task') + else: + self.createform = None + + return self.render_to_response() + def post(self, request): create_form_class = self.get_create_form_class() if not create_form_class: @@ -585,32 +629,24 @@ class TaskChooserView(BaseTaskChooserView): return self.render_to_response() def render_to_response(self): - searchform = TaskChooserSearchForm(task_type_choices=self.get_task_type_filter_choices()) - tasks = searchform.task_model.objects.filter(active=True).order_by(Lower('name')) + if self.createform: + tab_html = render_to_string("wagtailadmin/workflows/task_chooser/includes/create_form.html", { + 'form': self.createform, + 'add_url': reverse('wagtailadmin_workflows:task_chooser_create') + '?' + self.request.GET.urlencode() if self.create_model else None, + 'task_types': self.get_task_type_options(), + }, self.request) + else: + tab_html = render_to_string("wagtailadmin/workflows/task_chooser/includes/select_task_type.html", { + 'task_types': self.get_task_type_options(), + }, self.request) - paginator = Paginator(tasks, per_page=10) - tasks = paginator.get_page(self.request.GET.get('p')) - - chooser_html_context = { - 'tasks': tasks, - 'searchform': searchform, - 'createform': self.createform, - 'can_create': self.can_create, - 'add_url': reverse('wagtailadmin_workflows:task_chooser') + '?' + self.request.GET.urlencode() if self.create_model else None - } - - if not self.createform: - chooser_html_context['task_types'] = self.get_task_type_options() - - chooser_js_context = { - 'step': 'chooser', - 'error_label': _("Server Error"), - 'error_message': _("Report this error to your webmaster with the following information:"), - } + js_context = self.get_form_js_context() + js_context['step'] = 'reshow_create_tab' + js_context['htmlFragment'] = tab_html return render_modal_workflow( - self.request, 'wagtailadmin/workflows/task_chooser/chooser.html', None, - chooser_html_context, json_data=chooser_js_context + self.request, None, None, None, + json_data=js_context )