diff --git a/app/assets/javascripts/admin/addon/components/themes-list-item.gjs b/app/assets/javascripts/admin/addon/components/themes-list-item.gjs new file mode 100644 index 00000000000..eca7738d754 --- /dev/null +++ b/app/assets/javascripts/admin/addon/components/themes-list-item.gjs @@ -0,0 +1,168 @@ +import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; +import { Input } from "@ember/component"; +import { hash } from "@ember/helper"; +import { on } from "@ember/modifier"; +import { action } from "@ember/object"; +import { htmlSafe } from "@ember/template"; +import PluginOutlet from "discourse/components/plugin-outlet"; +import concatClass from "discourse/helpers/concat-class"; +import icon from "discourse-common/helpers/d-icon"; +import i18n from "discourse-common/helpers/i18n"; +import escape from "discourse-common/lib/escape"; +import { iconHTML } from "discourse-common/lib/icon-library"; + +const MAX_COMPONENTS = 4; + +export default class ThemesListItem extends Component { + @tracked childrenExpanded = false; + + get displayHasMore() { + return this.args.theme?.get("childThemes.length") > MAX_COMPONENTS; + } + + get displayComponents() { + return this.hasComponents && this.args.theme?.isActive; + } + + get hasComponents() { + return this.children.length > 0; + } + + @action + handleClick(event) { + if (!event.target.classList.contains("others-count")) { + this.args.navigateToTheme(); + } + } + + get children() { + let children = this.args.theme?.get("childThemes.[]"); + if (this.args.theme?.get("component") || !children) { + return []; + } + children = this.childrenExpanded + ? children + : children.slice(0, MAX_COMPONENTS); + return children.map((t) => { + const name = escape(t.name); + return t.enabled ? name : `${iconHTML("ban")} ${name}`; + }); + } + + get childrenString() { + return this.children.join(", "); + } + + get moreCount() { + const childrenCount = this.args.theme?.get("childThemes.length"); + if ( + this.args.theme?.get("component") || + !childrenCount || + this.childrenExpanded + ) { + return 0; + } + return childrenCount - MAX_COMPONENTS; + } + + @action + toggleChildrenExpanded(event) { + event?.preventDefault(); + this.childrenExpanded = !this.childrenExpanded; + } + + <template> + {{! template-lint-disable no-nested-interactive }} + <div + class={{concatClass + "themes-list-container__item" + (if @theme.selected "selected") + }} + role="button" + {{on "click" this.handleClick}} + ...attributes + > + <div class="inner-wrapper"> + <span> + <PluginOutlet + @name="admin-customize-themes-list-item" + @connectorTagName="span" + @outletArgs={{hash theme=@theme}} + /> + </span> + + <div class="info"> + {{#if @selectInactiveMode}} + <Input + @checked={{@theme.markedToDelete}} + id={{@theme.id}} + @type="checkbox" + /> + {{/if}} + <span class="name"> + {{@theme.name}} + </span> + + <span class="icons"> + {{#if @theme.selected}} + {{icon "caret-right"}} + {{else}} + {{#if @theme.default}} + {{icon + "check" + class="default-indicator" + title="admin.customize.theme.default_theme_tooltip" + }} + {{/if}} + {{#if @theme.isPendingUpdates}} + {{icon + "sync" + title="admin.customize.theme.updates_available_tooltip" + class="light-grey-icon" + }} + {{/if}} + {{#if @theme.isBroken}} + {{icon + "exclamation-circle" + class="broken-indicator" + title="admin.customize.theme.broken_theme_tooltip" + }} + {{/if}} + {{#unless @theme.enabled}} + {{icon + "ban" + class="light-grey-icon" + title="admin.customize.theme.disabled_component_tooltip" + }} + {{/unless}} + {{/if}} + </span> + </div> + + {{#if this.displayComponents}} + <div class="components-list"> + <span class="components">{{htmlSafe this.childrenString}}</span> + + {{#if this.displayHasMore}} + <a + href + {{on "click" this.toggleChildrenExpanded}} + class="others-count" + > + {{#if this.childrenExpanded}} + {{i18n "admin.customize.theme.collapse"}} + {{else}} + {{i18n + "admin.customize.theme.and_x_more" + count=this.moreCount + }} + {{/if}} + </a> + {{/if}} + </div> + {{/if}} + </div> + </div> + </template> +} diff --git a/app/assets/javascripts/admin/addon/components/themes-list-item.hbs b/app/assets/javascripts/admin/addon/components/themes-list-item.hbs deleted file mode 100644 index 82bb11b066e..00000000000 --- a/app/assets/javascripts/admin/addon/components/themes-list-item.hbs +++ /dev/null @@ -1,73 +0,0 @@ -<div class="inner-wrapper"> - <span> - <PluginOutlet - @name="admin-customize-themes-list-item" - @connectorTagName="span" - @outletArgs={{hash theme=this.theme}} - /> - </span> - - <div class="info"> - {{#if @selectInactiveMode}} - <Input - @checked={{this.theme.markedToDelete}} - id={{this.theme.id}} - @type="checkbox" - /> - {{/if}} - <span class="name"> - {{this.theme.name}} - </span> - - <span class="icons"> - {{#if this.theme.selected}} - {{d-icon "caret-right"}} - {{else}} - {{#if this.theme.default}} - {{d-icon - "check" - class="default-indicator" - title="admin.customize.theme.default_theme_tooltip" - }} - {{/if}} - {{#if this.theme.isPendingUpdates}} - {{d-icon - "sync" - title="admin.customize.theme.updates_available_tooltip" - class="light-grey-icon" - }} - {{/if}} - {{#if this.theme.isBroken}} - {{d-icon - "exclamation-circle" - class="broken-indicator" - title="admin.customize.theme.broken_theme_tooltip" - }} - {{/if}} - {{#unless this.theme.enabled}} - {{d-icon - "ban" - class="light-grey-icon" - title="admin.customize.theme.disabled_component_tooltip" - }} - {{/unless}} - {{/if}} - </span> - </div> - - {{#if this.displayComponents}} - <div class="components-list"> - <span class="components">{{html-safe this.childrenString}}</span> - - {{#if this.displayHasMore}} - <a href {{on "click" this.toggleChildrenExpanded}} class="others-count"> - {{#if this.childrenExpanded}} - {{i18n "admin.customize.theme.collapse"}} - {{else}} - {{i18n "admin.customize.theme.and_x_more" count=this.moreCount}} - {{/if}} - </a> - {{/if}} - </div> - {{/if}} -</div> \ No newline at end of file diff --git a/app/assets/javascripts/admin/addon/components/themes-list-item.js b/app/assets/javascripts/admin/addon/components/themes-list-item.js deleted file mode 100644 index 3630d3a27de..00000000000 --- a/app/assets/javascripts/admin/addon/components/themes-list-item.js +++ /dev/null @@ -1,72 +0,0 @@ -import Component from "@ember/component"; -import { action } from "@ember/object"; -import { and, gt } from "@ember/object/computed"; -import { classNameBindings, classNames } from "@ember-decorators/component"; -import escape from "discourse-common/lib/escape"; -import { iconHTML } from "discourse-common/lib/icon-library"; -import discourseComputed from "discourse-common/utils/decorators"; - -const MAX_COMPONENTS = 4; - -@classNames("themes-list-container__item") -@classNameBindings("theme.selected:selected") -export default class ThemesListItem extends Component { - childrenExpanded = false; - - @gt("children.length", 0) hasComponents; - - @and("hasComponents", "theme.isActive") displayComponents; - - @gt("theme.childThemes.length", MAX_COMPONENTS) displayHasMore; - - click(e) { - if (!e.target.classList.contains("others-count")) { - this.navigateToTheme(); - } - } - - @discourseComputed( - "theme.component", - "theme.childThemes.@each.name", - "theme.childThemes.length", - "childrenExpanded" - ) - children() { - const theme = this.theme; - let children = theme.get("childThemes"); - if (theme.get("component") || !children) { - return []; - } - children = this.childrenExpanded - ? children - : children.slice(0, MAX_COMPONENTS); - return children.map((t) => { - const name = escape(t.name); - return t.enabled ? name : `${iconHTML("ban")} ${name}`; - }); - } - - @discourseComputed("children") - childrenString(children) { - return children.join(", "); - } - - @discourseComputed( - "theme.childThemes.length", - "theme.component", - "childrenExpanded", - "children.length" - ) - moreCount(childrenCount, component, expanded) { - if (component || !childrenCount || expanded) { - return 0; - } - return childrenCount - MAX_COMPONENTS; - } - - @action - toggleChildrenExpanded(event) { - event?.preventDefault(); - this.toggleProperty("childrenExpanded"); - } -} diff --git a/app/assets/javascripts/admin/addon/components/themes-list.hbs b/app/assets/javascripts/admin/addon/components/themes-list.hbs index 51d33899c58..4792658a8ec 100644 --- a/app/assets/javascripts/admin/addon/components/themes-list.hbs +++ b/app/assets/javascripts/admin/addon/components/themes-list.hbs @@ -114,7 +114,7 @@ {{#if (and this.hasInactiveThemes (not this.activeFilter))}} {{#each this.inactiveThemes as |theme|}} <ThemesListItem - @classNames="inactive-theme" + class="inactive-theme" @theme={{theme}} @navigateToTheme={{fn this.navigateToTheme theme}} @selectInactiveMode={{this.selectInactiveMode}}