diff --git a/client/src/entrypoints/admin/telepath/widgets.js b/client/src/entrypoints/admin/telepath/widgets.js index 77118fddb8..099b1255e0 100644 --- a/client/src/entrypoints/admin/telepath/widgets.js +++ b/client/src/entrypoints/admin/telepath/widgets.js @@ -58,3 +58,22 @@ class RadioSelect extends Widget { boundWidgetClass = BoundRadioSelect; } window.telepath.register('wagtail.widgets.RadioSelect', RadioSelect); + + +class PageChooser { + constructor(html, idForLabel, config) { + this.html = html; + this.idForLabel = idForLabel; + this.config = config; + } + + render(placeholder, name, id) { + var html = this.html.replace(/__NAME__/g, name).replace(/__ID__/g, id); + var dom = $(html); + $(placeholder).replaceWith(dom); + /* the chooser object returned by createPageChooser also serves as the JS widget representation */ + // eslint-disable-next-line no-undef + return createPageChooser(id, null, this.config); + } +} +window.telepath.register('wagtail.widgets.PageChooser', PageChooser); diff --git a/wagtail/admin/widgets/chooser.py b/wagtail/admin/widgets/chooser.py index 2051048677..ab162771c3 100644 --- a/wagtail/admin/widgets/chooser.py +++ b/wagtail/admin/widgets/chooser.py @@ -8,6 +8,7 @@ from django.utils.translation import gettext_lazy as _ from wagtail.admin.staticfiles import versioned_static from wagtail.core.models import Page +from wagtail.core.telepath import Adapter, register from wagtail.utils.widgets import WidgetWithScript @@ -166,3 +167,23 @@ class AdminPageChooser(AdminChooser): versioned_static('wagtailadmin/js/page-chooser-modal.js'), versioned_static('wagtailadmin/js/page-chooser.js'), ]) + + +class PageChooserAdapter(Adapter): + js_constructor = 'wagtail.widgets.PageChooser' + + def js_args(self, widget, context): + return [ + widget.render_html('__NAME__', None, attrs={'id': '__ID__'}), + widget.id_for_label('__ID__'), + widget.client_options, + ] + + @property + def media(self): + return AdminPageChooser().media + forms.Media(js=[ + versioned_static('wagtailadmin/js/telepath/widgets.js') + ]) + + +register(PageChooserAdapter(), AdminPageChooser) diff --git a/wagtail/core/blocks/field_block.py b/wagtail/core/blocks/field_block.py index 3471465cbd..32d063a1c9 100644 --- a/wagtail/core/blocks/field_block.py +++ b/wagtail/core/blocks/field_block.py @@ -721,6 +721,18 @@ class PageChooserBlock(ChooserBlock): return AdminPageChooser(target_models=self.target_models, can_choose_root=self.can_choose_root) + def get_form_state(self, value): + value_data = self.widget.get_value_data(value) + if value_data is None: + return None + else: + return { + 'id': value_data['id'], + 'parentId': value_data['parent_id'], + 'adminTitle': value_data['display_title'], + 'editUrl': value_data['edit_url'], + } + def render_basic(self, value, context=None): if value: return format_html('{1}', value.url, value.title)