discourse/app/assets/javascripts/admin/addon/templates/plugins-index.gjs
Kris c544d7afa0
FEATURE: Add reusable AdminFilterControls component, apply to plugins and reports (#33706)
This creates a reusable filter component for admin areas that includes a
text filter and dropdown.

The component accepts an array to filter, an array of searchable
property names, and optional dropdown values. An additional option is
available if you'd like the default dropdown value to be something other
than "all."




It looks like this: 

<img width="2204" height="876" alt="image"
src="https://github.com/user-attachments/assets/48693634-6752-4078-8639-42fb1ac77679"
/>

The dropdown is optional, without it: 

<img width="1756" height="900" alt="image"
src="https://github.com/user-attachments/assets/ea9a7ae6-ae86-4cd8-8b99-4afc082f2ce5"
/>

When there are no matching filters, it provides a reset button: 

<img width="2188" height="394" alt="image"
src="https://github.com/user-attachments/assets/9e59218e-8040-41db-ba81-1dc2628429bb"
/>

I'll use this to replace occurrences of similar filters, we've added a
couple to the AI plugin.
2025-07-24 16:55:33 -04:00

82 lines
2.9 KiB
Text
Vendored

import RouteTemplate from "ember-route-template";
import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item";
import DPageHeader from "discourse/components/d-page-header";
import NavItem from "discourse/components/nav-item";
import PluginOutlet from "discourse/components/plugin-outlet";
import icon from "discourse/helpers/d-icon";
import lazyHash from "discourse/helpers/lazy-hash";
import { i18n } from "discourse-i18n";
import AdminFilterControls from "admin/components/admin-filter-controls";
import AdminPluginsList from "admin/components/admin-plugins-list";
export default RouteTemplate(
<template>
<div class="admin-plugins-list-container">
<DPageHeader
@titleLabel={{i18n "admin.config.plugins.title"}}
@descriptionLabel={{i18n "admin.config.plugins.header_description"}}
@learnMoreUrl="https://www.discourse.org/plugins"
>
<:breadcrumbs>
<DBreadcrumbsItem @path="/admin" @label={{i18n "admin_title"}} />
<DBreadcrumbsItem
@path="/admin/plugins"
@label={{i18n "admin.plugins.title"}}
/>
</:breadcrumbs>
<:tabs>
<NavItem @route="adminPlugins.index" @label="admin.plugins.title" />
{{#each @controller.adminRoutes as |route|}}
{{#if route.use_new_show_route}}
<NavItem
@route={{route.full_location}}
@label={{route.label}}
@routeParam={{route.location}}
@class="admin-plugin-tab-nav-item"
data-plugin-nav-tab-id={{route.plugin_id}}
/>
{{else}}
<NavItem
@route={{route.full_location}}
@label={{route.label}}
@class="admin-plugin-tab-nav-item"
data-plugin-nav-tab-id={{route.plugin_id}}
/>
{{/if}}
{{/each}}
</:tabs>
</DPageHeader>
<div class="alert alert-info admin-plugins-howto">
<a href="https://meta.discourse.org/t/install-a-plugin/19157">
{{icon "circle-info"}}
{{i18n "admin.plugins.howto"}}
</a>
</div>
{{#if @controller.model.length}}
<AdminFilterControls
@array={{@controller.model}}
@searchableProps={{@controller.searchableProps}}
@dropdownOptions={{@controller.dropdownOptions}}
@inputPlaceholder={{i18n "admin.plugins.filters.search_placeholder"}}
@noResultsMessage={{i18n "admin.plugins.filters.no_results"}}
as |filteredPlugins|
>
<AdminPluginsList @plugins={{filteredPlugins}} />
</AdminFilterControls>
{{else}}
<p>{{i18n "admin.plugins.none_installed"}}</p>
{{/if}}
<span>
<PluginOutlet
@name="admin-below-plugins-index"
@connectorTagName="div"
@outletArgs={{lazyHash model=@controller.model}}
/>
</span>
</div>
</template>
);