DEV: Fix "ember/no-empty-glimmer-component-classes" lint (#24629)

This commit is contained in:
Jarek Radosz
2023-11-29 15:14:30 +01:00
committed by GitHub
parent 0f7e4d2eaa
commit 7cac167928
23 changed files with 288 additions and 315 deletions

View File

@ -1,23 +1,22 @@
import Component from "@glimmer/component";
import i18n from "discourse-common/helpers/i18n";
import AdminPluginsListItem from "./admin-plugins-list-item";
export default class AdminPluginsList extends Component {
<template>
<table class="admin-plugins-list grid">
<thead>
<tr>
<th>{{i18n "admin.plugins.name"}}</th>
<th>{{i18n "admin.plugins.version"}}</th>
<th>{{i18n "admin.plugins.enabled"}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#each @plugins as |plugin|}}
<AdminPluginsListItem @plugin={{plugin}} />
{{/each}}
</tbody>
</table>
</template>
}
const AdminPluginsList = <template>
<table class="admin-plugins-list grid">
<thead>
<tr>
<th>{{i18n "admin.plugins.name"}}</th>
<th>{{i18n "admin.plugins.version"}}</th>
<th>{{i18n "admin.plugins.enabled"}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#each @plugins as |plugin|}}
<AdminPluginsListItem @plugin={{plugin}} />
{{/each}}
</tbody>
</table>
</template>;
export default AdminPluginsList;

View File

@ -1,44 +1,46 @@
import Component from "@glimmer/component";
import CookText from "discourse/components/cook-text";
import i18n from "discourse-common/helpers/i18n";
import and from "truth-helpers/helpers/and";
import not from "truth-helpers/helpers/not";
export default class DashboardNewFeatureItem extends Component {
<template>
<div class="admin-new-feature-item">
<div class="admin-new-feature-item__content">
<div class="admin-new-feature-item__header">
{{#if (and @item.emoji (not @item.screenshot_url))}}
<div
class="admin-new-feature-item__new-feature-emoji"
>{{@item.emoji}}</div>
{{/if}}
<h3>
{{@item.title}}
</h3>
</div>
{{#if @item.screenshot_url}}
<img
src={{@item.screenshot_url}}
class="admin-new-feature-item__screenshot"
alt={{@item.title}}
/>
const DashboardNewFeatureItem = <template>
<div class="admin-new-feature-item">
<div class="admin-new-feature-item__content">
<div class="admin-new-feature-item__header">
{{#if (and @item.emoji (not @item.screenshot_url))}}
<div class="admin-new-feature-item__new-feature-emoji">
{{@item.emoji}}
</div>
{{/if}}
<h3>
{{@item.title}}
</h3>
</div>
{{#if @item.screenshot_url}}
<img
src={{@item.screenshot_url}}
class="admin-new-feature-item__screenshot"
alt={{@item.title}}
/>
{{/if}}
<div class="admin-new-feature-item__feature-description">
<CookText @rawText={{@item.description}} />
{{#if @item.link}}
<a
href={{@item.link}}
target="_blank"
rel="noopener noreferrer"
class="admin-new-feature-item__learn-more"
>
{{i18n "admin.dashboard.new_features.learn_more"}}
</a>
{{/if}}
<div class="admin-new-feature-item__feature-description">
<CookText @rawText={{@item.description}} />
{{#if @item.link}}
<a
href={{@item.link}}
target="_blank"
rel="noopener noreferrer"
class="admin-new-feature-item__learn-more"
>
{{i18n "admin.dashboard.new_features.learn_more"}}
</a>
{{/if}}
</div>
</div>
</div>
</template>
}
</div>
</template>;
export default DashboardNewFeatureItem;

View File

@ -36,6 +36,7 @@ class GlimmerComponentWithParentViewManager extends CustomComponentManager {
* when building backwards-compatible versions of components. Any use of the parentView property
* of the component should be considered deprecated.
*/
// eslint-disable-next-line ember/no-empty-glimmer-component-classes
export default class GlimmerComponentWithDeprecatedParentView extends Component {}
setInternalComponentManager(

View File

@ -1,13 +1,12 @@
import Component from "@glimmer/component";
import DButton from "discourse/components/d-button";
export default class PasskeyLoginButton extends Component {
<template>
<DButton
@action={{@passkeyLogin}}
@icon="user"
@label="login.passkey.name"
class="btn btn-social passkey-login-button"
/>
</template>
}
const PasskeyLoginButton = <template>
<DButton
@action={{@passkeyLogin}}
@icon="user"
@label="login.passkey.name"
class="btn-social passkey-login-button"
/>
</template>;
export default PasskeyLoginButton;

View File

@ -9,9 +9,11 @@ import { forceMobile, resetMobile } from "discourse/lib/mobile";
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
import { registerTemporaryModule } from "../helpers/temporary-module-helper";
// eslint-disable-next-line ember/no-empty-glimmer-component-classes
class MockColocatedComponent extends Component {}
setComponentTemplate(hbs`Colocated Original`, MockColocatedComponent);
// eslint-disable-next-line ember/no-empty-glimmer-component-classes
class MockResolvedComponent extends Component {}
const MockResolvedComponentTemplate = hbs`Resolved Original`;

View File

@ -1,32 +1,31 @@
import Component from "@glimmer/component";
import DButton from "discourse/components/d-button";
import replaceEmoji from "discourse/helpers/replace-emoji";
import dIcon from "discourse-common/helpers/d-icon";
import htmlSafe from "discourse-common/helpers/html-safe";
import ChatUserAvatar from "./chat-user-avatar";
export default class ChatComposerMessageDetails extends Component {
<template>
<div
class="chat-composer-message-details"
data-id={{@message.id}}
data-action={{if @message.editing "edit" "reply"}}
>
<div class="chat-reply">
{{dIcon (if @message.editing "pencil-alt" "reply")}}
<ChatUserAvatar @user={{@message.user}} />
<span class="chat-reply__username">{{@message.user.username}}</span>
<span class="chat-reply__excerpt">
{{replaceEmoji (htmlSafe @message.excerpt)}}
</span>
</div>
<DButton
@action={{@cancelAction}}
@icon="times-circle"
@title="cancel"
class="btn-flat cancel-message-action"
/>
const ChatComposerMessageDetails = <template>
<div
class="chat-composer-message-details"
data-id={{@message.id}}
data-action={{if @message.editing "edit" "reply"}}
>
<div class="chat-reply">
{{dIcon (if @message.editing "pencil-alt" "reply")}}
<ChatUserAvatar @user={{@message.user}} />
<span class="chat-reply__username">{{@message.user.username}}</span>
<span class="chat-reply__excerpt">
{{replaceEmoji (htmlSafe @message.excerpt)}}
</span>
</div>
</template>
}
<DButton
@action={{@cancelAction}}
@icon="times-circle"
@title="cancel"
class="btn-flat cancel-message-action"
/>
</div>
</template>;
export default ChatComposerMessageDetails;

View File

@ -1,13 +1,12 @@
import Component from "@glimmer/component";
import DButton from "discourse/components/d-button";
export default class extends Component {
<template>
<DButton
@icon="times"
@action={{@close}}
@title="chat.close"
class="btn-flat btn-link chat-drawer-header__close-btn"
/>
</template>
}
const CloseButton = <template>
<DButton
@icon="times"
@action={{@close}}
@title="chat.close"
class="btn-flat btn-link chat-drawer-header__close-btn"
/>
</template>;
export default CloseButton;

View File

@ -1,12 +1,11 @@
import Component from "@glimmer/component";
import replaceEmoji from "discourse/helpers/replace-emoji";
export default class extends Component {
<template>
<div class="chat-emoji-avatar">
<div class="chat-emoji-avatar-container">
{{replaceEmoji @emoji}}
</div>
const ChatEmojiAvatar = <template>
<div class="chat-emoji-avatar">
<div class="chat-emoji-avatar-container">
{{replaceEmoji @emoji}}
</div>
</template>
}
</div>
</template>;
export default ChatEmojiAvatar;

View File

@ -1,22 +1,21 @@
import Component from "@glimmer/component";
import i18n from "discourse-common/helpers/i18n";
import and from "truth-helpers/helpers/and";
import not from "truth-helpers/helpers/not";
export default class extends Component {
<template>
{{#if (and @message.newest (not @message.formattedFirstMessageDate))}}
<div class="chat-message-separator-new">
<div class="chat-message-separator__text-container">
<span class="chat-message-separator__text">
{{i18n "chat.last_visit"}}
</span>
</div>
<div class="chat-message-separator__line-container">
<div class="chat-message-separator__line"></div>
</div>
const ChatMessageSeparatorNew = <template>
{{#if (and @message.newest (not @message.formattedFirstMessageDate))}}
<div class="chat-message-separator-new">
<div class="chat-message-separator__text-container">
<span class="chat-message-separator__text">
{{i18n "chat.last_visit"}}
</span>
</div>
{{/if}}
</template>
}
<div class="chat-message-separator__line-container">
<div class="chat-message-separator__line"></div>
</div>
</div>
{{/if}}
</template>;
export default ChatMessageSeparatorNew;

View File

@ -1,7 +1,5 @@
import Component from "@glimmer/component";
const ChatSidePanelResizer = <template>
<div class="chat-side-panel-resizer"></div>
</template>;
export default class extends Component {
<template>
<div class="chat-side-panel-resizer"></div>
</template>
}
export default ChatSidePanelResizer;

View File

@ -1,12 +1,11 @@
import Component from "@glimmer/component";
import dIcon from "discourse-common/helpers/d-icon";
export default class ChatComposerButton extends Component {
<template>
<div class="chat-composer-button__wrapper">
<button type="button" class="chat-composer-button" ...attributes>
{{dIcon @icon}}
</button>
</div>
</template>
}
const ChatComposerButton = <template>
<div class="chat-composer-button__wrapper">
<button type="button" class="chat-composer-button" ...attributes>
{{dIcon @icon}}
</button>
</div>
</template>;
export default ChatComposerButton;

View File

@ -1,7 +1,5 @@
import Component from "@glimmer/component";
const ChatComposerSeparator = <template>
<div class="chat-composer-separator"></div>
</template>;
export default class ChatComposerSeparator extends Component {
<template>
<div class="chat-composer-separator"></div>
</template>
}
export default ChatComposerSeparator;

View File

@ -1,48 +1,44 @@
import Component from "@glimmer/component";
import { LinkTo } from "@ember/routing";
import concatClass from "discourse/helpers/concat-class";
import icon from "discourse-common/helpers/d-icon";
export default class ChatFormRow extends Component {
<template>
{{#if @route}}
<LinkTo
@route={{@route}}
@models={{@routeModels}}
class={{concatClass
"chat-form__row -link"
(if @separator "-separator")
}}
>
<div class="chat-form__row-content">
{{@label}}
{{icon "chevron-right" class="chat-form__row-icon"}}
</div>
</LinkTo>
{{else}}
<div class={{concatClass "chat-form__row" (if @separator "-separator")}}>
<div class="chat-form__row-content">
{{#if @label}}
<span class="chat-form__row-label">{{@label}}</span>
{{/if}}
const ChatFormRow = <template>
{{#if @route}}
<LinkTo
@route={{@route}}
@models={{@routeModels}}
class={{concatClass "chat-form__row -link" (if @separator "-separator")}}
>
<div class="chat-form__row-content">
{{@label}}
{{icon "chevron-right" class="chat-form__row-icon"}}
</div>
</LinkTo>
{{else}}
<div class={{concatClass "chat-form__row" (if @separator "-separator")}}>
<div class="chat-form__row-content">
{{#if @label}}
<span class="chat-form__row-label">{{@label}}</span>
{{/if}}
{{#if (has-block)}}
<span class="chat-form__row-label">
{{yield}}
</span>
{{/if}}
{{#if (has-block)}}
<span class="chat-form__row-label">
{{yield}}
</span>
{{/if}}
{{#if (has-block "action")}}
<div class="chat-form__row-action">{{yield to="action"}}</div>
{{/if}}
</div>
{{#if (has-block "description")}}
<div class="chat-form__row-description">
{{yield to="description"}}
</div>
{{#if (has-block "action")}}
<div class="chat-form__row-action">{{yield to="action"}}</div>
{{/if}}
</div>
{{/if}}
</template>
}
{{#if (has-block "description")}}
<div class="chat-form__row-description">
{{yield to="description"}}
</div>
{{/if}}
</div>
{{/if}}
</template>;
export default ChatFormRow;

View File

@ -1,12 +1,11 @@
import Component from "@glimmer/component";
import DButton from "discourse/components/d-button";
export default class ListAction extends Component {
<template>
<DButton
class="btn btn-flat"
@icon={{@item.icon}}
@translatedLabel={{@item.label}}
/>
</template>
}
const ListAction = <template>
<DButton
class="btn btn-flat"
@icon={{@item.icon}}
@translatedLabel={{@item.label}}
/>
</template>;
export default ListAction;

View File

@ -1,28 +1,27 @@
import Component from "@glimmer/component";
import { fn } from "@ember/helper";
import DButton from "discourse/components/d-button";
import concatClass from "discourse/helpers/concat-class";
import icon from "discourse-common/helpers/d-icon";
import ChatUserAvatar from "discourse/plugins/chat/discourse/components/chat-user-avatar";
export default class Member extends Component {
<template>
<DButton
class={{concatClass
"chat-message-creator__member btn-default"
(if @highlighted "-highlighted")
}}
@action={{fn @onSelect @member}}
>
<ChatUserAvatar
@user={{@member.model}}
@interactive={{false}}
@showPresence={{false}}
/>
<span class="chat-message-creator__member-username">
{{@member.model.username}}
</span>
{{icon "times"}}
</DButton>
</template>
}
const Member = <template>
<DButton
class={{concatClass
"chat-message-creator__member btn-default"
(if @highlighted "-highlighted")
}}
@action={{fn @onSelect @member}}
>
<ChatUserAvatar
@user={{@member.model}}
@interactive={{false}}
@showPresence={{false}}
/>
<span class="chat-message-creator__member-username">
{{@member.model.username}}
</span>
{{icon "times"}}
</DButton>
</template>;
export default Member;

View File

@ -1,15 +1,14 @@
import Component from "@glimmer/component";
import ChatEmojiAvatar from "../../chat-emoji-avatar";
import ChatUserAvatar from "../../chat-user-avatar";
export default class extends Component {
<template>
<div class="chat-message-avatar">
{{#if @message.chatWebhookEvent.emoji}}
<ChatEmojiAvatar @emoji={{@message.chatWebhookEvent.emoji}} />
{{else}}
<ChatUserAvatar @user={{@message.user}} @avatarSize="medium" />
{{/if}}
</div>
</template>
}
const Avatar = <template>
<div class="chat-message-avatar">
{{#if @message.chatWebhookEvent.emoji}}
<ChatEmojiAvatar @emoji={{@message.chatWebhookEvent.emoji}} />
{{else}}
<ChatUserAvatar @user={{@message.user}} @avatarSize="medium" />
{{/if}}
</div>
</template>;
export default Avatar;

View File

@ -1,30 +1,29 @@
import Component from "@glimmer/component";
import { fn } from "@ember/helper";
import DButton from "discourse/components/d-button";
import i18n from "discourse-common/helpers/i18n";
import eq from "truth-helpers/helpers/eq";
export default class extends Component {
<template>
{{#if @message.error}}
<div class="chat-message-error">
{{#if (eq @message.error "network_error")}}
<DButton
class="chat-message-error__retry-btn"
@action={{fn @onRetry @message}}
@icon="exclamation-circle"
>
<span class="chat-message-error__retry-btn-title">
{{i18n "chat.retry_staged_message.title"}}
</span>
<span class="chat-message-error__retry-btn-action">
{{i18n "chat.retry_staged_message.action"}}
</span>
</DButton>
{{else}}
{{@message.error}}
{{/if}}
</div>
{{/if}}
</template>
}
const Error = <template>
{{#if @message.error}}
<div class="chat-message-error">
{{#if (eq @message.error "network_error")}}
<DButton
class="chat-message-error__retry-btn"
@action={{fn @onRetry @message}}
@icon="exclamation-circle"
>
<span class="chat-message-error__retry-btn-title">
{{i18n "chat.retry_staged_message.title"}}
</span>
<span class="chat-message-error__retry-btn-action">
{{i18n "chat.retry_staged_message.action"}}
</span>
</DButton>
{{else}}
{{@message.error}}
{{/if}}
</div>
{{/if}}
</template>;
export default Error;

View File

@ -1,23 +1,22 @@
import Component from "@glimmer/component";
import DButton from "discourse/components/d-button";
import concatClass from "discourse/helpers/concat-class";
import dIcon from "discourse-common/helpers/d-icon";
export default class extends Component {
<template>
<div class="chat-scroll-to-bottom">
<DButton
class={{concatClass
"btn-flat"
"chat-scroll-to-bottom__button"
(if @isVisible "visible")
}}
@action={{@onScrollToBottom}}
>
<span class="chat-scroll-to-bottom__arrow">
{{dIcon "arrow-down"}}
</span>
</DButton>
</div>
</template>
}
const ScrollToBottomArrow = <template>
<div class="chat-scroll-to-bottom">
<DButton
class={{concatClass
"btn-flat"
"chat-scroll-to-bottom__button"
(if @isVisible "visible")
}}
@action={{@onScrollToBottom}}
>
<span class="chat-scroll-to-bottom__arrow">
{{dIcon "arrow-down"}}
</span>
</DButton>
</div>
</template>;
export default ScrollToBottomArrow;

View File

@ -1,4 +1,3 @@
import Component from "@glimmer/component";
import ChatComposer from "../chat-composer";
import ChatComposerMessageDetails from "../chat-composer-message-details";
import ChatHeaderIcon from "../chat-header-icon";
@ -15,25 +14,25 @@ import ChatModalThreadSettings from "../chat-modal-thread-settings";
import ChatModalToggleChannelStatus from "../chat-modal-toggle-channel-status";
import ChatThreadListItem from "../chat-thread-list-item";
export default class extends Component {
<template>
<ChatMessage />
<ChatComposer />
<ChatThreadListItem />
<ChatComposerMessageDetails />
<ChatHeaderIcon />
const ChatOrganism = <template>
<ChatMessage />
<ChatComposer />
<ChatThreadListItem />
<ChatComposerMessageDetails />
<ChatHeaderIcon />
<h2>Modals</h2>
<h2>Modals</h2>
<ChatModalArchiveChannel />
<ChatModalMoveMessageToChannel />
<ChatModalDeleteChannel />
<ChatModalEditChannelDescription />
<ChatModalEditChannelName />
<ChatModalThreadSettings />
<ChatModalCreateChannel />
<ChatModalToggleChannelStatus />
<ChatModalNewMessage />
<ChatModalChannelSummary />
</template>
}
<ChatModalArchiveChannel />
<ChatModalMoveMessageToChannel />
<ChatModalDeleteChannel />
<ChatModalEditChannelDescription />
<ChatModalEditChannelName />
<ChatModalThreadSettings />
<ChatModalCreateChannel />
<ChatModalToggleChannelStatus />
<ChatModalNewMessage />
<ChatModalChannelSummary />
</template>;
export default ChatOrganism;

View File

@ -1,7 +1,5 @@
import Component from "@glimmer/component";
const DummyComponent = <template>
My custom component with foo: {{@model.foo}}
</template>;
export default class DummyComponent extends Component {
<template>
My custom component with foo: {{@model.foo}}
</template>
}
export default DummyComponent;

View File

@ -1,3 +0,0 @@
import Component from "@glimmer/component";
export default class StyleguideComponent extends Component {}

View File

@ -1,3 +0,0 @@
import Component from "@glimmer/component";
export default class StyleguideControls extends Component {}

View File

@ -1,3 +0,0 @@
import Component from "@glimmer/component";
export default class StyleguideControlsToggle extends Component {}