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