Move delete button in edit view to a header 'more' button

pull/12425/head
Sage Abdullah 2024-10-14 14:48:31 +01:00 zatwierdzone przez Thibaud Colas
rodzic 040065c73e
commit 45d9efdf99
5 zmienionych plików z 62 dodań i 11 usunięć
wagtail
admin
templates/wagtailadmin/generic

Wyświetl plik

@ -1,8 +1 @@
{% extends "wagtailadmin/generic/form.html" %}
{% load i18n %}
{% block extra_actions %}
{% if delete_url %}
<a href="{{ delete_url }}" class="button">{{ delete_item_label }}</a>
{% endif %}
{% endblock %}

Wyświetl plik

@ -41,6 +41,7 @@ from wagtail.admin.ui.tables import (
from wagtail.admin.utils import get_latest_str, get_valid_next_url_from_request
from wagtail.admin.views.mixins import SpreadsheetExportMixin
from wagtail.admin.widgets.button import (
Button,
ButtonWithDropdown,
HeaderButton,
ListingButton,
@ -728,6 +729,24 @@ class EditView(
.first()
)
@cached_property
def can_delete(self):
return self.user_has_permission_for_instance("delete", self.object)
@cached_property
def header_more_buttons(self):
buttons = []
if self.can_delete and (delete_url := self.get_delete_url()):
buttons.append(
Button(
self.delete_item_label,
url=delete_url,
icon_name="bin",
priority=20,
)
)
return buttons
def get_edit_url(self):
if not self.edit_url_name:
raise ImproperlyConfigured(
@ -858,9 +877,7 @@ class EditView(
context["media"] += side_panels.media
context["submit_button_label"] = self.submit_button_label
context["has_unsaved_changes"] = self.has_unsaved_changes
context["can_delete"] = self.user_has_permission_for_instance(
"delete", self.object
)
context["can_delete"] = self.can_delete
if context["can_delete"]:
context["delete_url"] = self.get_delete_url()
context["delete_item_label"] = self.delete_item_label

Wyświetl plik

@ -264,6 +264,7 @@ class Edit(EditView):
enable_item_label = _("Enable")
enable_url_name = "wagtailadmin_workflows:enable"
header_icon = "tasks"
header_more_buttons = []
edit_handler = None
MAX_PAGES = 5
_show_breadcrumbs = True
@ -706,6 +707,7 @@ class EditTask(EditView):
enable_item_label = _("Enable")
enable_url_name = "wagtailadmin_workflows:enable_task"
header_icon = "thumbtack"
header_more_buttons = []
_show_breadcrumbs = True
@cached_property

Wyświetl plik

@ -1,5 +1,6 @@
"""Handles rendering of the list of actions in the footer of the snippet create/edit views."""
from functools import lru_cache
from warnings import warn
from django.conf import settings
from django.contrib.admin.utils import quote
@ -13,6 +14,7 @@ from wagtail import hooks
from wagtail.admin.ui.components import Component
from wagtail.models import DraftStateMixin, LockableMixin, WorkflowMixin
from wagtail.snippets.permissions import get_permission_name
from wagtail.utils.deprecation import RemovedInWagtail70Warning
class ActionMenuItem(Component):
@ -219,6 +221,14 @@ class DeleteMenuItem(ActionMenuItem):
icon_name = "bin"
classname = "action-secondary"
def __init__(self, order=None):
super().__init__(order)
warn(
"DeleteMenuItem is deprecated. "
"The delete option is now provided via EditView.get_header_more_buttons().",
RemovedInWagtail70Warning,
)
def is_shown(self, context):
delete_permission = get_permission_name("delete", context["model"])
@ -258,7 +268,6 @@ def get_base_snippet_action_menu_items(model):
"""
menu_items = [
SaveMenuItem(order=0),
DeleteMenuItem(order=10),
]
if issubclass(model, DraftStateMixin):
menu_items += [
@ -341,6 +350,9 @@ class SnippetActionMenu:
self.default_item = None
def render_html(self):
if not self.default_item:
return ""
rendered_menu_items = [
menu_item.render_html(self.context) for menu_item in self.menu_items
]

Wyświetl plik

@ -34,6 +34,7 @@ from wagtail.models import Locale, ModelLogEntry, Revision
from wagtail.signals import published, unpublished
from wagtail.snippets.action_menu import (
ActionMenuItem,
DeleteMenuItem,
get_base_snippet_action_menu_items,
)
from wagtail.snippets.blocks import SnippetChooserBlock
@ -1944,6 +1945,32 @@ class TestSnippetEditView(BaseTestSnippetEditView):
self.assertNotContains(response, "<em>Save</em>")
def test_register_deprecated_delete_menu_item(self):
def hook_func(model):
return DeleteMenuItem(order=900)
get_base_snippet_action_menu_items.cache_clear()
with self.register_hook(
"register_snippet_action_menu_item", hook_func
), self.assertWarnsMessage(
RemovedInWagtail70Warning,
"DeleteMenuItem is deprecated. "
"The delete option is now provided via EditView.get_header_more_buttons().",
):
response = self.get()
get_base_snippet_action_menu_items.cache_clear()
delete_url = reverse(
self.test_snippet.snippet_viewset.get_url_name("delete"),
args=(quote(self.test_snippet.pk),),
)
self.assertContains(
response,
f'<a class="button" href="{ delete_url }"><svg class="icon icon-bin icon" aria-hidden="true"><use href="#icon-bin"></use></svg>Delete</a>',
html=True,
)
class TestEditTabbedSnippet(BaseTestSnippetEditView):
def setUp(self):