diff --git a/client/scss/components/_listing.scss b/client/scss/components/_listing.scss index d676386738..d09a812569 100644 --- a/client/scss/components/_listing.scss +++ b/client/scss/components/_listing.scss @@ -421,7 +421,8 @@ table.listing { .page-explorer .listing { position: relative; - .table-headers { + .table-headers, + thead tr { height: 35px; .title { diff --git a/wagtail/admin/templates/wagtailadmin/pages/index.html b/wagtail/admin/templates/wagtailadmin/pages/index.html index de5fb5cc11..85b835901e 100644 --- a/wagtail/admin/templates/wagtailadmin/pages/index.html +++ b/wagtail/admin/templates/wagtailadmin/pages/index.html @@ -62,7 +62,7 @@ {% endif %} {% endif %} - {% include "wagtailadmin/pages/listing/_list_explore.html" with sortable=1 sortable_by_type=1 full_width=1 show_ordering_column=show_ordering_column show_bulk_actions=show_bulk_actions parent_page=parent_page orderable=parent_page_perms.can_reorder_children show_locale_labels=show_locale_labels %} + {% component table %} {% if is_paginated %} {% include "wagtailadmin/shared/pagination_nav.html" with items=page_obj linkurl=index_url %} diff --git a/wagtail/admin/templates/wagtailadmin/pages/listing/_ordering_cell.html b/wagtail/admin/templates/wagtailadmin/pages/listing/_ordering_cell.html new file mode 100644 index 0000000000..cbcd528e80 --- /dev/null +++ b/wagtail/admin/templates/wagtailadmin/pages/listing/_ordering_cell.html @@ -0,0 +1,10 @@ +{% load i18n wagtailadmin_tags %} + +
+ {% icon name="grip" classname="default" %} + + {% trans 'Drag' %} + Item {{ forloop.counter }} of {{ pages|length }} + +
+ diff --git a/wagtail/admin/templates/wagtailadmin/pages/listing/_ordering_header.html b/wagtail/admin/templates/wagtailadmin/pages/listing/_ordering_header.html new file mode 100644 index 0000000000..47a34249b8 --- /dev/null +++ b/wagtail/admin/templates/wagtailadmin/pages/listing/_ordering_header.html @@ -0,0 +1,12 @@ +{% load i18n wagtailadmin_tags %} + + {% if is_ascending %} + + {% icon name="order" %}{% trans 'Sort' %} + + {% else %} + + {% icon name="order" %}{% trans 'Sort' %} + + {% endif %} + diff --git a/wagtail/admin/ui/tables/pages.py b/wagtail/admin/ui/tables/pages.py index 302c4bcb8b..5a6ad76a3a 100644 --- a/wagtail/admin/ui/tables/pages.py +++ b/wagtail/admin/ui/tables/pages.py @@ -49,6 +49,11 @@ class BulkActionsColumn(BulkActionsCheckboxColumn): return context +class OrderingColumn(BaseColumn): + header_template_name = "wagtailadmin/pages/listing/_ordering_header.html" + cell_template_name = "wagtailadmin/pages/listing/_ordering_cell.html" + + class NavigateToChildrenColumn(BaseColumn): cell_template_name = "wagtailadmin/pages/listing/_navigation_explore.html" @@ -65,12 +70,22 @@ class NavigateToChildrenColumn(BaseColumn): class PageTable(Table): + # If true, attributes will be added on the element to support reordering + use_row_ordering_attributes = False + def get_row_classname(self, instance): if not instance.live: return "unpublished" else: return "" + def get_row_attrs(self, instance): + attrs = super().get_row_attrs(instance) + if self.use_row_ordering_attributes: + attrs["id"] = "page_%d" % instance.id + attrs["data-page-title"] = instance.get_admin_display_title() + return attrs + def get_context_data(self, parent_context): context = super().get_context_data(parent_context) context["show_locale_labels"] = parent_context.get("show_locale_labels") diff --git a/wagtail/admin/views/pages/listing.py b/wagtail/admin/views/pages/listing.py index 3609cb2bb9..de9fee4aae 100644 --- a/wagtail/admin/views/pages/listing.py +++ b/wagtail/admin/views/pages/listing.py @@ -2,15 +2,25 @@ from django.conf import settings from django.db.models import Count from django.shortcuts import get_object_or_404, redirect from django.urls import reverse -from django.views.generic import ListView +from django.utils.translation import gettext_lazy as _ from wagtail import hooks from wagtail.admin.ui.side_panels import PageSidePanels +from wagtail.admin.ui.tables import Column, DateColumn +from wagtail.admin.ui.tables.pages import ( + BulkActionsColumn, + NavigateToChildrenColumn, + OrderingColumn, + PageStatusColumn, + PageTable, + PageTitleColumn, +) +from wagtail.admin.views.generic.base import BaseListingView from wagtail.admin.views.generic.permissions import PermissionCheckedMixin from wagtail.permission_policies.pages import Page, PagePermissionPolicy -class IndexView(PermissionCheckedMixin, ListView): +class IndexView(PermissionCheckedMixin, BaseListingView): template_name = "wagtailadmin/pages/index.html" permission_policy = PagePermissionPolicy() any_permission_required = { @@ -24,6 +34,41 @@ class IndexView(PermissionCheckedMixin, ListView): context_object_name = "pages" page_kwarg = "p" paginate_by = 50 + table_class = PageTable + table_classname = "listing full-width" + + columns = [ + BulkActionsColumn("bulk_actions", width="10px"), + PageTitleColumn( + "title", + label=_("Title"), + sort_key="title", + classname="align-top title", + ), + DateColumn( + "latest_revision_created_at", + label=_("Updated"), + sort_key="latest_revision_created_at", + width="12%", + classname="align-top", + ), + Column( + "type", + label=_("Type"), + accessor="page_type_display_name", + sort_key="content_type", + width="12%", + classname="align-top", + ), + PageStatusColumn( + "status", + label=_("Status"), + sort_key="live", + width="12%", + classname="align-top", + ), + NavigateToChildrenColumn("navigate", width="10%"), + ] def get(self, request, parent_page_id=None): if parent_page_id: @@ -120,9 +165,15 @@ class IndexView(PermissionCheckedMixin, ListView): return reverse("wagtailadmin_explore", args=[self.parent_page.id]) def get_context_data(self, **kwargs): + show_ordering_column = self.ordering == "ord" + if show_ordering_column: + self.columns = self.columns.copy() + self.columns[0] = OrderingColumn("ordering", width="10px", sort_key="ord") + context = super().get_context_data(**kwargs) - show_ordering_column = self.ordering == "ord" + if show_ordering_column: + context["table"].use_row_ordering_attributes = True side_panels = PageSidePanels( self.request,