Skip to content

Commit 8e68267

Browse files
committed
Add headless userbar setup
1 parent 2b4ccfb commit 8e68267

File tree

4 files changed

+109
-0
lines changed

4 files changed

+109
-0
lines changed

bakerydemo/base/wagtail_hooks.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@ def register_icons(icons):
3535
class CustomAccessibilityItem(AccessibilityItem):
3636
axe_run_only = None
3737

38+
def get_axe_spec(self, request):
39+
spec = super().get_axe_spec(request)
40+
spec["allowedOrigins"] = [
41+
"<unsafe_all_origins>",
42+
# Can also use specific origins like the following, but a browser
43+
# warning will be shown in the console because Axe tries each origin
44+
# in every layer.
45+
# "http://localhost:3000",
46+
# "http://127.0.0.1:8000",
47+
]
48+
return spec
49+
3850

3951
@hooks.register("construct_wagtail_userbar")
4052
def replace_userbar_accessibility_item(request, items):

bakerydemo/headless.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
1+
from django.views.generic import TemplateView
2+
from wagtail.admin.userbar import (
3+
AccessibilityItem,
4+
AddPageItem,
5+
AdminItem,
6+
EditPageItem,
7+
ExplorePageItem,
8+
apply_userbar_hooks,
9+
)
10+
from wagtail.models import Page, Revision
111
from wagtail_headless_preview.models import HeadlessMixin
12+
from wagtail_headless_preview.settings import headless_preview_settings
213

314

415
class CustomHeadlessMixin(HeadlessMixin):
@@ -11,3 +22,67 @@ def get_client_root_url(self, request):
1122
if getattr(request, "is_preview", False):
1223
return f"{root_url}/api/draft"
1324
return root_url
25+
26+
27+
def get_userbar_context(request, object, position):
28+
# Extracted from wagtail.admin.templatetags.wagtailuserbar.wagtailuserbar
29+
30+
revision_id = getattr(request, "revision_id", None)
31+
in_preview_panel = getattr(request, "in_preview_panel", False)
32+
33+
if in_preview_panel:
34+
items = []
35+
else:
36+
items = [AdminItem()]
37+
38+
if isinstance(object, Page) and object.pk:
39+
if revision_id:
40+
revision = (
41+
Revision.objects.for_instance(object)
42+
.filter(id=revision_id)
43+
.prefetch_related("content_object")
44+
.first()
45+
)
46+
revision_object = revision.content_object if revision else None
47+
items.append(ExplorePageItem(revision_object))
48+
items.append(EditPageItem(revision_object))
49+
else:
50+
# Not a revision
51+
items.append(ExplorePageItem(object))
52+
items.append(EditPageItem(object))
53+
items.append(AddPageItem(object))
54+
55+
items.append(AccessibilityItem())
56+
57+
apply_userbar_hooks(request, items, object)
58+
59+
# Render the items
60+
rendered_items = [item.render(request) for item in items]
61+
62+
# Remove any unrendered items
63+
rendered_items = [item for item in rendered_items if item]
64+
65+
# Render the userbar items
66+
return {
67+
"request": request,
68+
"items": rendered_items,
69+
"position": position,
70+
"page": object,
71+
"revision_id": revision_id,
72+
}
73+
74+
75+
class UserbarView(TemplateView):
76+
template_name = "wagtailadmin/userbar/base.html"
77+
http_method_names = ["get"]
78+
79+
def dispatch(self, request, *args, **kwargs):
80+
response = super().dispatch(request, *args, **kwargs)
81+
client_url = headless_preview_settings.CLIENT_URLS["default"]
82+
response["Access-Control-Allow-Origin"] = client_url
83+
return response
84+
85+
def get_context_data(self, **kwargs):
86+
context = super().get_context_data(**kwargs)
87+
context.update(get_userbar_context(self.request, None, None))
88+
return context
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{% load wagtailuserbar %}
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<style>
7+
body, html {
8+
margin: 0; padding: 0; height: 100%; overflow: hidden;
9+
}
10+
</style>
11+
</head>
12+
<body>
13+
<iframe id="preview-iframe" title="Headless preview" src="{{ preview_url }}" width="100%" height="100%" style="border: none;"></iframe>
14+
{% comment %}
15+
Include the wagtail userbar so we can run Axe in the intermediate
16+
iframe, but hide it so it's invisible.
17+
{% endcomment %}
18+
<div hidden>{% wagtailuserbar %}</div>
19+
</body>
20+
</html>

bakerydemo/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
from wagtail.documents import urls as wagtaildocs_urls
99
from wagtail.images.views.serve import ServeView
1010

11+
from bakerydemo.headless import UserbarView
1112
from bakerydemo.search import views as search_views
1213

1314
from .api import api_router
1415

1516
urlpatterns = [
1617
path("django-admin/", admin.site.urls),
1718
path("admin/", include(wagtailadmin_urls)),
19+
path("userbar/", UserbarView.as_view(), name="userbar"),
1820
path("documents/", include(wagtaildocs_urls)),
1921
re_path(
2022
r"^images/([^/]*)/(\d*)/([^/]*)/[^/]*$",

0 commit comments

Comments
 (0)