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

View File

@ -1,44 +1,46 @@
import Component from "@glimmer/component";
import CookText from "discourse/components/cook-text"; import CookText from "discourse/components/cook-text";
import i18n from "discourse-common/helpers/i18n"; import i18n from "discourse-common/helpers/i18n";
import and from "truth-helpers/helpers/and"; import and from "truth-helpers/helpers/and";
import not from "truth-helpers/helpers/not"; import not from "truth-helpers/helpers/not";
export default class DashboardNewFeatureItem extends Component { const DashboardNewFeatureItem = <template>
<template> <div class="admin-new-feature-item">
<div class="admin-new-feature-item"> <div class="admin-new-feature-item__content">
<div class="admin-new-feature-item__content"> <div class="admin-new-feature-item__header">
<div class="admin-new-feature-item__header"> {{#if (and @item.emoji (not @item.screenshot_url))}}
{{#if (and @item.emoji (not @item.screenshot_url))}} <div class="admin-new-feature-item__new-feature-emoji">
<div {{@item.emoji}}
class="admin-new-feature-item__new-feature-emoji" </div>
>{{@item.emoji}}</div> {{/if}}
{{/if}} <h3>
<h3> {{@item.title}}
{{@item.title}} </h3>
</h3> </div>
</div>
{{#if @item.screenshot_url}} {{#if @item.screenshot_url}}
<img <img
src={{@item.screenshot_url}} src={{@item.screenshot_url}}
class="admin-new-feature-item__screenshot" class="admin-new-feature-item__screenshot"
alt={{@item.title}} 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}} {{/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>
</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 * when building backwards-compatible versions of components. Any use of the parentView property
* of the component should be considered deprecated. * of the component should be considered deprecated.
*/ */
// eslint-disable-next-line ember/no-empty-glimmer-component-classes
export default class GlimmerComponentWithDeprecatedParentView extends Component {} export default class GlimmerComponentWithDeprecatedParentView extends Component {}
setInternalComponentManager( setInternalComponentManager(

View File

@ -1,13 +1,12 @@
import Component from "@glimmer/component";
import DButton from "discourse/components/d-button"; import DButton from "discourse/components/d-button";
export default class PasskeyLoginButton extends Component { const PasskeyLoginButton = <template>
<template> <DButton
<DButton @action={{@passkeyLogin}}
@action={{@passkeyLogin}} @icon="user"
@icon="user" @label="login.passkey.name"
@label="login.passkey.name" class="btn-social passkey-login-button"
class="btn btn-social passkey-login-button" />
/> </template>;
</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 { setupRenderingTest } from "discourse/tests/helpers/component-test";
import { registerTemporaryModule } from "../helpers/temporary-module-helper"; import { registerTemporaryModule } from "../helpers/temporary-module-helper";
// eslint-disable-next-line ember/no-empty-glimmer-component-classes
class MockColocatedComponent extends Component {} class MockColocatedComponent extends Component {}
setComponentTemplate(hbs`Colocated Original`, MockColocatedComponent); setComponentTemplate(hbs`Colocated Original`, MockColocatedComponent);
// eslint-disable-next-line ember/no-empty-glimmer-component-classes
class MockResolvedComponent extends Component {} class MockResolvedComponent extends Component {}
const MockResolvedComponentTemplate = hbs`Resolved Original`; const MockResolvedComponentTemplate = hbs`Resolved Original`;

View File

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

View File

@ -1,12 +1,11 @@
import Component from "@glimmer/component";
import replaceEmoji from "discourse/helpers/replace-emoji"; import replaceEmoji from "discourse/helpers/replace-emoji";
export default class extends Component { const ChatEmojiAvatar = <template>
<template> <div class="chat-emoji-avatar">
<div class="chat-emoji-avatar"> <div class="chat-emoji-avatar-container">
<div class="chat-emoji-avatar-container"> {{replaceEmoji @emoji}}
{{replaceEmoji @emoji}}
</div>
</div> </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 i18n from "discourse-common/helpers/i18n";
import and from "truth-helpers/helpers/and"; import and from "truth-helpers/helpers/and";
import not from "truth-helpers/helpers/not"; import not from "truth-helpers/helpers/not";
export default class extends Component { const ChatMessageSeparatorNew = <template>
<template> {{#if (and @message.newest (not @message.formattedFirstMessageDate))}}
{{#if (and @message.newest (not @message.formattedFirstMessageDate))}} <div class="chat-message-separator-new">
<div class="chat-message-separator-new"> <div class="chat-message-separator__text-container">
<div class="chat-message-separator__text-container"> <span class="chat-message-separator__text">
<span class="chat-message-separator__text"> {{i18n "chat.last_visit"}}
{{i18n "chat.last_visit"}} </span>
</span>
</div>
<div class="chat-message-separator__line-container">
<div class="chat-message-separator__line"></div>
</div>
</div> </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 { export default ChatSidePanelResizer;
<template>
<div class="chat-side-panel-resizer"></div>
</template>
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,3 @@
import Component from "@glimmer/component";
import ChatComposer from "../chat-composer"; import ChatComposer from "../chat-composer";
import ChatComposerMessageDetails from "../chat-composer-message-details"; import ChatComposerMessageDetails from "../chat-composer-message-details";
import ChatHeaderIcon from "../chat-header-icon"; 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 ChatModalToggleChannelStatus from "../chat-modal-toggle-channel-status";
import ChatThreadListItem from "../chat-thread-list-item"; import ChatThreadListItem from "../chat-thread-list-item";
export default class extends Component { const ChatOrganism = <template>
<template> <ChatMessage />
<ChatMessage /> <ChatComposer />
<ChatComposer /> <ChatThreadListItem />
<ChatThreadListItem /> <ChatComposerMessageDetails />
<ChatComposerMessageDetails /> <ChatHeaderIcon />
<ChatHeaderIcon />
<h2>Modals</h2> <h2>Modals</h2>
<ChatModalArchiveChannel /> <ChatModalArchiveChannel />
<ChatModalMoveMessageToChannel /> <ChatModalMoveMessageToChannel />
<ChatModalDeleteChannel /> <ChatModalDeleteChannel />
<ChatModalEditChannelDescription /> <ChatModalEditChannelDescription />
<ChatModalEditChannelName /> <ChatModalEditChannelName />
<ChatModalThreadSettings /> <ChatModalThreadSettings />
<ChatModalCreateChannel /> <ChatModalCreateChannel />
<ChatModalToggleChannelStatus /> <ChatModalToggleChannelStatus />
<ChatModalNewMessage /> <ChatModalNewMessage />
<ChatModalChannelSummary /> <ChatModalChannelSummary />
</template> </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 { export default DummyComponent;
<template>
My custom component with foo: {{@model.foo}}
</template>
}

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 {}