From 536d1096c26c16277eab5b3a734e3bd075366f35 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Wed, 11 Jan 2023 12:55:32 +0000 Subject: [PATCH] Change PageChooser widget constructor to accept `parent_id` as part of the opts dict The old signature is still accepted for backwards compatibility. This then matches the signature of the other chooser widget JS classes, allowing PageChooserFactory to extend the generic ChooserFactory. --- .../admin/page-chooser-telepath.js | 2 +- client/src/entrypoints/admin/page-chooser.js | 26 ++++++++++++------- wagtail/admin/tests/test_edit_handlers.py | 8 +++--- wagtail/admin/tests/test_widgets.py | 16 ++++++------ wagtail/admin/widgets/chooser.py | 9 ++++--- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/client/src/entrypoints/admin/page-chooser-telepath.js b/client/src/entrypoints/admin/page-chooser-telepath.js index 4f9cd699dc..769a33590a 100644 --- a/client/src/entrypoints/admin/page-chooser-telepath.js +++ b/client/src/entrypoints/admin/page-chooser-telepath.js @@ -11,7 +11,7 @@ class PageChooserFactory { placeholder.outerHTML = html; /* the PageChooser object also serves as the JS widget representation */ // eslint-disable-next-line no-undef - const chooser = new PageChooser(id, null, this.config); + const chooser = new PageChooser(id, this.config); chooser.setState(initialState); return chooser; } diff --git a/client/src/entrypoints/admin/page-chooser.js b/client/src/entrypoints/admin/page-chooser.js index de1424518a..9d6b3993be 100644 --- a/client/src/entrypoints/admin/page-chooser.js +++ b/client/src/entrypoints/admin/page-chooser.js @@ -7,27 +7,33 @@ class PageChooser extends Chooser { titleStateKey = 'adminTitle'; editUrlStateKey = 'editUrl'; - constructor(id, parentId, options = {}) { - super(id); - this.initialParentId = parentId; - this.options = options; + constructor(id, arg1, arg2) { + let opts; + if (arg2 || typeof arg1 === 'number') { + /* old-style args: (id, parentId, opts) */ + opts = { parent_id: arg1, ...arg2 }; + } else { + /* new style args: (id, opts) where opts includes 'parent_id' */ + opts = arg1 || {}; + } + super(id, opts); } getStateFromHTML() { const state = super.getStateFromHTML(); if (state) { - state.parentId = this.initialParentId; + state.parentId = this.opts.parent_id; } return state; } getModalOptions() { const opts = { - model_names: this.options.model_names, - target_pages: this.options.target_pages, - match_subclass: this.options.match_subclass, - can_choose_root: this.options.can_choose_root, - user_perms: this.options.user_perms, + model_names: this.opts.model_names, + target_pages: this.opts.target_pages, + match_subclass: this.opts.match_subclass, + can_choose_root: this.opts.can_choose_root, + user_perms: this.opts.user_perms, }; if (this.state && this.state.parentId) { opts.parentId = this.state.parentId; diff --git a/wagtail/admin/tests/test_edit_handlers.py b/wagtail/admin/tests/test_edit_handlers.py index 80d13039da..cdd148f5f3 100644 --- a/wagtail/admin/tests/test_edit_handlers.py +++ b/wagtail/admin/tests/test_edit_handlers.py @@ -947,7 +947,7 @@ class TestPageChooserPanel(TestCase): def test_render_js_init(self): result = self.page_chooser_panel.render_html() - expected_js = 'new PageChooser("{id}", {parent}, {{"model_names": ["{model}"], "can_choose_root": false, "user_perms": null}});'.format( + expected_js = 'new PageChooser("{id}", {{"model_names": ["{model}"], "can_choose_root": false, "user_perms": null, "parent_id": {parent}}});'.format( id="id_page", model="wagtailcore.page", parent=self.events_index_page.id ) @@ -969,7 +969,7 @@ class TestPageChooserPanel(TestCase): result = page_chooser_panel.render_html() # the canChooseRoot flag on PageChooser should now be true - expected_js = 'new PageChooser("{id}", {parent}, {{"model_names": ["{model}"], "can_choose_root": true, "user_perms": null}});'.format( + expected_js = 'new PageChooser("{id}", {{"model_names": ["{model}"], "can_choose_root": true, "user_perms": null, "parent_id": {parent}}});'.format( id="id_page", model="wagtailcore.page", parent=self.events_index_page.id ) self.assertIn(expected_js, result) @@ -1025,7 +1025,7 @@ class TestPageChooserPanel(TestCase): ) result = page_chooser_panel.render_html() - expected_js = 'new PageChooser("{id}", {parent}, {{"model_names": ["{model}"], "can_choose_root": false, "user_perms": null}});'.format( + expected_js = 'new PageChooser("{id}", {{"model_names": ["{model}"], "can_choose_root": false, "user_perms": null, "parent_id": {parent}}});'.format( id="id_page", model="tests.eventpage", parent=self.events_index_page.id ) @@ -1045,7 +1045,7 @@ class TestPageChooserPanel(TestCase): ) result = page_chooser_panel.render_html() - expected_js = 'new PageChooser("{id}", {parent}, {{"model_names": ["{model}"], "can_choose_root": false, "user_perms": null}});'.format( + expected_js = 'new PageChooser("{id}", {{"model_names": ["{model}"], "can_choose_root": false, "user_perms": null, "parent_id": {parent}}});'.format( id="id_page", model="tests.eventpage", parent=self.events_index_page.id ) diff --git a/wagtail/admin/tests/test_widgets.py b/wagtail/admin/tests/test_widgets.py index 56ed724826..97f1b3e720 100644 --- a/wagtail/admin/tests/test_widgets.py +++ b/wagtail/admin/tests/test_widgets.py @@ -73,7 +73,7 @@ class TestAdminPageChooserWidget(TestCase): html = widget.render("test", None, {"id": "test-id"}) self.assertIn( - 'new PageChooser("test-id", null, {"model_names": ["wagtailcore.page"], "can_choose_root": false, "user_perms": null});', + 'new PageChooser("test-id", {"model_names": ["wagtailcore.page"], "can_choose_root": false, "user_perms": null});', html, ) @@ -82,7 +82,7 @@ class TestAdminPageChooserWidget(TestCase): html = widget.render("test", None, {"id": "test-id"}) self.assertIn( - 'new PageChooser("test-id", null, {"model_names": ["wagtailcore.page"], "can_choose_root": false, "user_perms": "copy_to"});', + 'new PageChooser("test-id", {"model_names": ["wagtailcore.page"], "can_choose_root": false, "user_perms": "copy_to"});', html, ) @@ -99,7 +99,7 @@ class TestAdminPageChooserWidget(TestCase): self.assertInHTML("foobarbaz (simple page)", html) self.assertIn( - 'new PageChooser("test-id", %d, {"model_names": ["wagtailcore.page"], "can_choose_root": false, "user_perms": null});' + 'new PageChooser("test-id", {"model_names": ["wagtailcore.page"], "can_choose_root": false, "user_perms": null, "parent_id": %d});' % self.root_page.id, html, ) @@ -109,7 +109,7 @@ class TestAdminPageChooserWidget(TestCase): html = widget.render("test", None, {"id": "test-id"}) self.assertIn( - 'new PageChooser("test-id", null, {"model_names": ["tests.simplepage"], "can_choose_root": false, "user_perms": null});', + 'new PageChooser("test-id", {"model_names": ["tests.simplepage"], "can_choose_root": false, "user_perms": null});', html, ) @@ -121,7 +121,7 @@ class TestAdminPageChooserWidget(TestCase): html = widget.render("test", None, {"id": "test-id"}) self.assertIn( - 'new PageChooser("test-id", null, {"model_names": ["tests.simplepage"], "can_choose_root": false, "user_perms": null});', + 'new PageChooser("test-id", {"model_names": ["tests.simplepage"], "can_choose_root": false, "user_perms": null});', html, ) @@ -133,7 +133,7 @@ class TestAdminPageChooserWidget(TestCase): html = widget.render("test", None, {"id": "test-id"}) self.assertIn( - 'new PageChooser("test-id", null, {"model_names": ["tests.simplepage"], "can_choose_root": false, "user_perms": null});', + 'new PageChooser("test-id", {"model_names": ["tests.simplepage"], "can_choose_root": false, "user_perms": null});', html, ) @@ -146,7 +146,7 @@ class TestAdminPageChooserWidget(TestCase): html = widget.render("test", None, {"id": "test-id"}) self.assertIn( - 'new PageChooser("test-id", null, {"model_names": ["tests.simplepage", "tests.eventpage"], "can_choose_root": false, "user_perms": null});', + 'new PageChooser("test-id", {"model_names": ["tests.simplepage", "tests.eventpage"], "can_choose_root": false, "user_perms": null});', html, ) @@ -158,7 +158,7 @@ class TestAdminPageChooserWidget(TestCase): html = widget.render("test", self.child_page, {"id": "test-id"}) self.assertIn( - 'new PageChooser("test-id", %d, {"model_names": ["wagtailcore.page"], "can_choose_root": true, "user_perms": null});' + 'new PageChooser("test-id", {"model_names": ["wagtailcore.page"], "can_choose_root": true, "user_perms": null, "parent_id": %d});' % self.root_page.id, html, ) diff --git a/wagtail/admin/widgets/chooser.py b/wagtail/admin/widgets/chooser.py index 864c00297b..bd0ea13c00 100644 --- a/wagtail/admin/widgets/chooser.py +++ b/wagtail/admin/widgets/chooser.py @@ -344,10 +344,13 @@ class AdminPageChooser(BaseChooser): def render_js_init(self, id_, name, value_data): value_data = value_data or {} - return "new PageChooser({id}, {parent}, {options});".format( + options = self.client_options + parent_id = value_data.get("parent_id") + if parent_id is not None: + options["parent_id"] = parent_id + return "new PageChooser({id}, {options});".format( id=json.dumps(id_), - parent=json.dumps(value_data.get("parent_id")), - options=json.dumps(self.client_options), + options=json.dumps(options), ) @property