From 05685d430f6d03a4d16c4aa3c87de5b5d725416f Mon Sep 17 00:00:00 2001 From: Osama Sayegh Date: Sun, 16 Feb 2025 00:19:16 +0300 Subject: [PATCH] FIX: Make permalink search work even when there're 100+ permalinks (#31354) Permalink search regressed in https://github.com/discourse/discourse/pull/30633 where the search implementation was changed from server side to client side. Prior to that change, we included a `filter` param in the request to make the server find permalinks that matched the given filter and return the results limited to 100 records. However, with that change, we stopped sending the `filter` param with the request, which made the server always return the same 100 records which would then be filtered on the client side. That means if a site has more than 100 records, any records that don't make it in the first 100 will never be found using search. Meta topic: https://meta.discourse.org/t/permalinks-no-longer-has-a-way-to-search-or-show-all-permalinks/351922?u=osama --- .../addon/components/admin-permalink-form.gjs | 10 +++------- .../addon/controllers/admin-permalinks-index.js | 2 +- .../javascripts/admin/addon/models/permalink.js | 15 +++------------ .../admin/addon/routes/admin-permalinks-index.js | 8 ++++++++ .../admin/addon/templates/permalinks-index.hbs | 6 +++--- .../tests/acceptance/admin-permalink-test.js | 8 ++++++-- 6 files changed, 24 insertions(+), 25 deletions(-) create mode 100644 app/assets/javascripts/admin/addon/routes/admin-permalinks-index.js diff --git a/app/assets/javascripts/admin/addon/components/admin-permalink-form.gjs b/app/assets/javascripts/admin/addon/components/admin-permalink-form.gjs index 8f77fcd7247..cf714ac8cc1 100644 --- a/app/assets/javascripts/admin/addon/components/admin-permalink-form.gjs +++ b/app/assets/javascripts/admin/addon/components/admin-permalink-form.gjs @@ -87,9 +87,7 @@ export default class AdminFlagsForm extends Component { permalink_type: data.permalinkType, permalink_type_value: this.valueForPermalinkType(data), }); - this.adminPermalinks.model.allLinks.unshift( - Permalink.create(result.payload) - ); + this.adminPermalinks.model.unshift(Permalink.create(result.payload)); this.router.transitionTo("adminPermalinks"); } catch (error) { popupAjaxError(error); @@ -108,12 +106,10 @@ export default class AdminFlagsForm extends Component { permalink_type_value: this.valueForPermalinkType(data), } ); - const index = this.adminPermalinks.model.allLinks.findIndex( + const index = this.adminPermalinks.model.findIndex( (permalink) => permalink.id === this.args.permalink.id ); - this.adminPermalinks.model.allLinks[index] = Permalink.create( - result.payload - ); + this.adminPermalinks.model[index] = Permalink.create(result.payload); this.router.transitionTo("adminPermalinks"); } catch (error) { popupAjaxError(error); diff --git a/app/assets/javascripts/admin/addon/controllers/admin-permalinks-index.js b/app/assets/javascripts/admin/addon/controllers/admin-permalinks-index.js index 90797c549cd..a70a45a0c31 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-permalinks-index.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-permalinks-index.js @@ -49,7 +49,7 @@ export default class AdminPermalinksIndexController extends Controller { didConfirm: async () => { try { await this.store.destroyRecord("permalink", permalink); - this.model.allLinks.removeObject(permalink); + this.model.removeObject(permalink); } catch { this.dialog.alert(i18n("generic_error")); } diff --git a/app/assets/javascripts/admin/addon/models/permalink.js b/app/assets/javascripts/admin/addon/models/permalink.js index 67327877d59..3fb34c62fd8 100644 --- a/app/assets/javascripts/admin/addon/models/permalink.js +++ b/app/assets/javascripts/admin/addon/models/permalink.js @@ -5,18 +5,9 @@ import Category from "discourse/models/category"; import RestModel from "discourse/models/rest"; export default class Permalink extends RestModel { - static findAll(filter) { - return ajax("/admin/permalinks.json").then(function (permalinks) { - let allLinks = permalinks.map((p) => Permalink.create(p)); - - let filteredLinks = filter - ? allLinks.filter( - (p) => p.url.includes(filter) || p.external_url?.includes(filter) - ) - : allLinks; - - return { allLinks, filteredLinks }; - }); + static async findAll(filter) { + const data = await ajax("/admin/permalinks.json", { data: { filter } }); + return data.map((p) => Permalink.create(p)); } @discourseComputed("category_id") diff --git a/app/assets/javascripts/admin/addon/routes/admin-permalinks-index.js b/app/assets/javascripts/admin/addon/routes/admin-permalinks-index.js new file mode 100644 index 00000000000..66de319c61a --- /dev/null +++ b/app/assets/javascripts/admin/addon/routes/admin-permalinks-index.js @@ -0,0 +1,8 @@ +import DiscourseRoute from "discourse/routes/discourse"; + +export default class AdminPermalinksIndexRoute extends DiscourseRoute { + setupController(controller, model) { + super.setupController(...arguments); + controller.set("hasPermalinks", model.length > 0); + } +} diff --git a/app/assets/javascripts/admin/addon/templates/permalinks-index.hbs b/app/assets/javascripts/admin/addon/templates/permalinks-index.hbs index 4d0ab4482f5..c08c48adea2 100644 --- a/app/assets/javascripts/admin/addon/templates/permalinks-index.hbs +++ b/app/assets/javascripts/admin/addon/templates/permalinks-index.hbs @@ -1,5 +1,5 @@ - {{#if this.model.allLinks.length}} + {{#if this.hasPermalinks}}