From 007718368280beb2d189ae710926e1c37a960383 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Wed, 6 Jul 2022 16:12:25 +0100 Subject: [PATCH] Add a base class for Telepath adapters for chooser widgets --- .../admin/chooser-widget-telepath.js | 3 ++ client/webpack.config.js | 1 + wagtail/admin/widgets/chooser.py | 30 +++++++++++++++++-- wagtail/documents/widgets.py | 10 ++----- wagtail/images/widgets.py | 11 ++----- wagtail/snippets/widgets.py | 11 ++----- 6 files changed, 37 insertions(+), 29 deletions(-) create mode 100644 client/src/entrypoints/admin/chooser-widget-telepath.js diff --git a/client/src/entrypoints/admin/chooser-widget-telepath.js b/client/src/entrypoints/admin/chooser-widget-telepath.js new file mode 100644 index 0000000000..ec69a360c1 --- /dev/null +++ b/client/src/entrypoints/admin/chooser-widget-telepath.js @@ -0,0 +1,3 @@ +import { ChooserFactory } from '../../components/ChooserWidget'; + +window.telepath.register('wagtail.admin.widgets.Chooser', ChooserFactory); diff --git a/client/webpack.config.js b/client/webpack.config.js index d03a04f796..1e6319c06e 100644 --- a/client/webpack.config.js +++ b/client/webpack.config.js @@ -33,6 +33,7 @@ module.exports = function exports(env, argv) { 'admin': [ 'chooser-modal', 'chooser-widget', + 'chooser-widget-telepath', 'comments', 'core', 'date-time-chooser', diff --git a/wagtail/admin/widgets/chooser.py b/wagtail/admin/widgets/chooser.py index 720396b838..fa35fd1ea7 100644 --- a/wagtail/admin/widgets/chooser.py +++ b/wagtail/admin/widgets/chooser.py @@ -234,11 +234,35 @@ class BaseChooser(widgets.Input): def render_js_init(self, id_, name, value_data): return "new Chooser({0});".format(json.dumps(id_)) - class Media: - js = [ - "wagtailadmin/js/chooser-widget.js", + @cached_property + def media(self): + return forms.Media( + js=[ + versioned_static("wagtailadmin/js/chooser-widget.js"), + ] + ) + + +class BaseChooserAdapter(WidgetAdapter): + js_constructor = "wagtail.admin.widgets.Chooser" + + def js_args(self, widget): + return [ + widget.render_html("__NAME__", None, attrs={"id": "__ID__"}), + widget.id_for_label("__ID__"), ] + @cached_property + def media(self): + return forms.Media( + js=[ + versioned_static("wagtailadmin/js/chooser-widget-telepath.js"), + ] + ) + + +register(BaseChooserAdapter(), BaseChooser) + class AdminPageChooser(BaseChooser): choose_one_text = _("Choose a page") diff --git a/wagtail/documents/widgets.py b/wagtail/documents/widgets.py index aaf22de83f..5532b60317 100644 --- a/wagtail/documents/widgets.py +++ b/wagtail/documents/widgets.py @@ -2,22 +2,16 @@ from django import forms from django.utils.functional import cached_property from wagtail.admin.staticfiles import versioned_static +from wagtail.admin.widgets import BaseChooserAdapter from wagtail.documents.views.chooser import viewset as chooser_viewset from wagtail.telepath import register -from wagtail.widget_adapters import WidgetAdapter AdminDocumentChooser = chooser_viewset.widget_class -class DocumentChooserAdapter(WidgetAdapter): +class DocumentChooserAdapter(BaseChooserAdapter): js_constructor = "wagtail.documents.widgets.DocumentChooser" - def js_args(self, widget): - return [ - widget.render_html("__NAME__", None, attrs={"id": "__ID__"}), - widget.id_for_label("__ID__"), - ] - @cached_property def media(self): return forms.Media( diff --git a/wagtail/images/widgets.py b/wagtail/images/widgets.py index 05d54d4400..0ff7c0b95a 100644 --- a/wagtail/images/widgets.py +++ b/wagtail/images/widgets.py @@ -5,11 +5,10 @@ from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from wagtail.admin.staticfiles import versioned_static -from wagtail.admin.widgets import BaseChooser +from wagtail.admin.widgets import BaseChooser, BaseChooserAdapter from wagtail.images import get_image_model from wagtail.images.shortcuts import get_rendition_or_not_found from wagtail.telepath import register -from wagtail.widget_adapters import WidgetAdapter class AdminImageChooser(BaseChooser): @@ -53,15 +52,9 @@ class AdminImageChooser(BaseChooser): ) -class ImageChooserAdapter(WidgetAdapter): +class ImageChooserAdapter(BaseChooserAdapter): js_constructor = "wagtail.images.widgets.ImageChooser" - def js_args(self, widget): - return [ - widget.render_html("__NAME__", None, attrs={"id": "__ID__"}), - widget.id_for_label("__ID__"), - ] - @cached_property def media(self): return forms.Media( diff --git a/wagtail/snippets/widgets.py b/wagtail/snippets/widgets.py index 7787ffc9d6..18082d8c5d 100644 --- a/wagtail/snippets/widgets.py +++ b/wagtail/snippets/widgets.py @@ -8,10 +8,9 @@ from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from wagtail.admin.staticfiles import versioned_static -from wagtail.admin.widgets import BaseChooser +from wagtail.admin.widgets import BaseChooser, BaseChooserAdapter from wagtail.admin.widgets.button import ListingButton from wagtail.telepath import register -from wagtail.widget_adapters import WidgetAdapter class AdminSnippetChooser(BaseChooser): @@ -59,15 +58,9 @@ class AdminSnippetChooser(BaseChooser): ) -class SnippetChooserAdapter(WidgetAdapter): +class SnippetChooserAdapter(BaseChooserAdapter): js_constructor = "wagtail.snippets.widgets.SnippetChooser" - def js_args(self, widget): - return [ - widget.render_html("__NAME__", None, attrs={"id": "__ID__"}), - widget.id_for_label("__ID__"), - ] - @cached_property def media(self): return forms.Media(