From c9fdd0753f1a240914acd8e275c310e3a2160c2a Mon Sep 17 00:00:00 2001 From: Alexander Skvortsov Date: Sat, 19 Mar 2022 16:04:41 -0400 Subject: [PATCH] fix: eliminate `JSX.Element` from generated typings Either add JSDoc or TypeScript annotations so that `Mithril.Children` is always returned in favor of `JSX.Element`. --- .../flags/js/src/forum/components/FlagList.js | 3 ++ .../js/src/forum/components/FlagPostModal.js | 3 ++ .../js/src/forum/components/FlagsDropdown.js | 3 ++ .../js/src/forum/components/FlagsPage.js | 3 ++ .../js/src/admin/components/Updater.tsx | 2 +- .../js/src/admin/components/WhyNotModal.tsx | 2 +- .../src/admin/components/StatisticsWidget.js | 3 ++ .../js/src/admin/components/EditTagModal.tsx | 10 ++--- .../tags/js/src/admin/components/TagsPage.js | 5 ++- .../helpers/{tagIcon.js => tagIcon.tsx} | 5 ++- .../helpers/{tagLabel.js => tagLabel.tsx} | 19 ++++++--- .../helpers/{tagsLabel.js => tagsLabel.tsx} | 7 +++- .../forum/components/TagDiscussionModal.tsx | 3 ++ .../tags/js/src/forum/components/TagHero.js | 3 ++ .../js/src/forum/components/TagLinkButton.js | 3 ++ .../tags/js/src/forum/components/TagsPage.js | 3 ++ .../js/src/forum/components/ToggleButton.js | 3 ++ .../{AdminHeader.js => AdminHeader.tsx} | 12 ++++-- .../core/js/src/admin/components/AdminNav.js | 3 ++ .../js/src/admin/components/AppearancePage.js | 3 ++ .../js/src/admin/components/BasicsPage.js | 3 ++ .../admin/components/EditCustomCssModal.js | 3 ++ .../admin/components/EditCustomFooterModal.js | 3 ++ .../admin/components/EditCustomHeaderModal.js | 3 ++ .../js/src/admin/components/EditGroupModal.js | 3 ++ .../js/src/admin/components/ExtensionPage.tsx | 14 +++---- .../src/admin/components/ExtensionsWidget.js | 9 +++++ .../js/src/admin/components/HeaderPrimary.js | 3 ++ .../src/admin/components/HeaderSecondary.js | 3 ++ .../core/js/src/admin/components/MailPage.js | 3 ++ .../src/admin/components/PermissionGrid.tsx | 2 +- .../src/admin/components/PermissionsPage.js | 3 ++ .../js/src/admin/components/ReadmeModal.tsx | 2 +- .../src/admin/components/SessionDropdown.js | 6 +++ .../js/src/admin/components/SettingsModal.js | 6 +++ .../js/src/admin/components/StatusWidget.js | 3 ++ .../src/admin/components/UploadImageButton.js | 3 ++ .../js/src/admin/components/UserListPage.tsx | 2 +- .../core/js/src/common/components/Alert.tsx | 2 +- .../js/src/common/components/AlertManager.js | 31 --------------- .../js/src/common/components/AlertManager.tsx | 39 +++++++++++++++++++ .../core/js/src/common/components/Badge.js | 3 ++ .../core/js/src/common/components/Button.tsx | 2 +- .../core/js/src/common/components/Checkbox.js | 3 ++ .../common/components/ColorPreviewInput.tsx | 2 +- .../core/js/src/common/components/Dropdown.js | 6 +++ .../src/common/components/EditUserModal.tsx | 10 ++--- .../core/js/src/common/components/FieldSet.js | 3 ++ .../core/js/src/common/components/Link.js | 3 ++ .../common/components/LoadingIndicator.tsx | 3 +- .../core/js/src/common/components/Modal.tsx | 2 +- .../js/src/common/components/Navigation.js | 3 ++ .../js/src/common/components/Placeholder.js | 19 --------- .../js/src/common/components/Placeholder.tsx | 20 ++++++++++ .../common/components/RequestErrorModal.tsx | 3 +- .../core/js/src/common/components/Select.js | 3 ++ .../src/common/components/SelectDropdown.js | 3 ++ .../{Separator.js => Separator.tsx} | 11 +++--- .../js/src/common/components/SplitDropdown.js | 3 ++ .../js/src/common/components/TextEditor.js | 3 ++ .../src/common/components/TextEditorButton.js | 3 ++ .../js/src/common/states/AlertManagerState.ts | 2 +- .../js/src/forum/components/AvatarEditor.js | 3 ++ .../src/forum/components/ChangeEmailModal.js | 3 ++ .../forum/components/ChangePasswordModal.js | 3 ++ .../core/js/src/forum/components/Composer.js | 3 ++ .../js/src/forum/components/ComposerBody.js | 3 ++ .../forum/components/ComposerPostPreview.js | 3 ++ .../js/src/forum/components/DiscussionHero.js | 3 ++ .../js/src/forum/components/DiscussionList.js | 3 ++ .../forum/components/DiscussionListItem.tsx | 8 ++-- .../forum/components/DiscussionListPane.js | 3 ++ .../src/forum/components/DiscussionPage.tsx | 2 +- .../forum/components/DiscussionRenamedPost.js | 6 +++ .../forum/components/DiscussionsUserPage.js | 3 ++ .../forum/components/ForgotPasswordModal.tsx | 2 +- .../js/src/forum/components/HeaderPrimary.js | 3 ++ .../src/forum/components/HeaderSecondary.js | 3 ++ .../core/js/src/forum/components/IndexPage.js | 3 ++ .../{LoadingPost.js => LoadingPost.tsx} | 3 +- .../{LogInButtons.js => LogInButtons.tsx} | 7 ++-- .../js/src/forum/components/LogInModal.tsx | 12 +++--- .../js/src/forum/components/Notification.tsx | 2 +- .../src/forum/components/NotificationGrid.js | 3 ++ .../src/forum/components/NotificationList.js | 3 ++ .../forum/components/NotificationsDropdown.js | 9 +++++ .../src/forum/components/NotificationsPage.js | 3 ++ .../core/js/src/forum/components/Post.tsx | 2 +- .../js/src/forum/components/PostEdited.js | 3 ++ .../core/js/src/forum/components/PostMeta.js | 3 ++ .../js/src/forum/components/PostPreview.js | 3 ++ .../js/src/forum/components/PostStream.js | 3 ++ .../forum/components/PostStreamScrubber.js | 3 ++ .../core/js/src/forum/components/PostUser.js | 3 ++ .../js/src/forum/components/PostsUserPage.js | 3 ++ .../forum/components/RenameDiscussionModal.js | 6 +++ .../src/forum/components/ReplyPlaceholder.js | 3 ++ .../core/js/src/forum/components/Search.tsx | 2 +- .../src/forum/components/SessionDropdown.js | 6 +++ .../js/src/forum/components/SettingsPage.js | 3 ++ .../js/src/forum/components/SignUpModal.tsx | 12 +++--- .../js/src/forum/components/TerminalPost.js | 3 ++ .../core/js/src/forum/components/UserCard.js | 3 ++ .../js/src/forum/components/WelcomeHero.tsx | 2 +- 104 files changed, 391 insertions(+), 125 deletions(-) rename extensions/tags/js/src/common/helpers/{tagIcon.js => tagIcon.tsx} (67%) rename extensions/tags/js/src/common/helpers/{tagLabel.js => tagLabel.tsx} (66%) rename extensions/tags/js/src/common/helpers/{tagsLabel.js => tagsLabel.tsx} (63%) rename framework/core/js/src/admin/components/{AdminHeader.js => AdminHeader.tsx} (52%) delete mode 100644 framework/core/js/src/common/components/AlertManager.js create mode 100644 framework/core/js/src/common/components/AlertManager.tsx delete mode 100644 framework/core/js/src/common/components/Placeholder.js create mode 100644 framework/core/js/src/common/components/Placeholder.tsx rename framework/core/js/src/common/components/{Separator.js => Separator.tsx} (53%) rename framework/core/js/src/forum/components/{LoadingPost.js => LoadingPost.tsx} (91%) rename framework/core/js/src/forum/components/{LogInButtons.js => LogInButtons.tsx} (79%) diff --git a/extensions/flags/js/src/forum/components/FlagList.js b/extensions/flags/js/src/forum/components/FlagList.js index 115df12ad..adfe2ccc6 100644 --- a/extensions/flags/js/src/forum/components/FlagList.js +++ b/extensions/flags/js/src/forum/components/FlagList.js @@ -13,6 +13,9 @@ export default class FlagList extends Component { this.state = this.attrs.state; } + /** + * @return {import('mithril').Children} + */ view() { const flags = this.state.cache || []; diff --git a/extensions/flags/js/src/forum/components/FlagPostModal.js b/extensions/flags/js/src/forum/components/FlagPostModal.js index 49e438cd1..b28982669 100644 --- a/extensions/flags/js/src/forum/components/FlagPostModal.js +++ b/extensions/flags/js/src/forum/components/FlagPostModal.js @@ -24,6 +24,9 @@ export default class FlagPostModal extends Modal { return app.translator.trans('flarum-flags.forum.flag_post.title'); } + /** + * @return {import('mithril').Children} + */ content() { if (this.success) { return ( diff --git a/extensions/flags/js/src/forum/components/FlagsDropdown.js b/extensions/flags/js/src/forum/components/FlagsDropdown.js index 72b249a59..a161d92bf 100644 --- a/extensions/flags/js/src/forum/components/FlagsDropdown.js +++ b/extensions/flags/js/src/forum/components/FlagsDropdown.js @@ -11,6 +11,9 @@ export default class FlagsDropdown extends NotificationsDropdown { super.initAttrs(attrs); } + /** + * @return {import('mithril').Children} + */ getMenu() { return (
diff --git a/extensions/flags/js/src/forum/components/FlagsPage.js b/extensions/flags/js/src/forum/components/FlagsPage.js index 6e07ef555..9c54c52b1 100644 --- a/extensions/flags/js/src/forum/components/FlagsPage.js +++ b/extensions/flags/js/src/forum/components/FlagsPage.js @@ -18,6 +18,9 @@ export default class FlagsPage extends Page { this.bodyClass = 'App--flags'; } + /** + * @return {import('mithril').Children} + */ view() { return (
diff --git a/extensions/package-manager/js/src/admin/components/Updater.tsx b/extensions/package-manager/js/src/admin/components/Updater.tsx index 4acbfb860..ec6723ac4 100755 --- a/extensions/package-manager/js/src/admin/components/Updater.tsx +++ b/extensions/package-manager/js/src/admin/components/Updater.tsx @@ -64,7 +64,7 @@ export default class Updater extends Component { super.oninit(vnode); } - view() { + view(): Mithril.Children { const extensions = this.getExtensionUpdates(); let coreUpdate: UpdatedPackage | undefined = this.getCoreUpdate(); let core: any; diff --git a/extensions/package-manager/js/src/admin/components/WhyNotModal.tsx b/extensions/package-manager/js/src/admin/components/WhyNotModal.tsx index 352cc769a..8f0b39703 100644 --- a/extensions/package-manager/js/src/admin/components/WhyNotModal.tsx +++ b/extensions/package-manager/js/src/admin/components/WhyNotModal.tsx @@ -26,7 +26,7 @@ export default class WhyNotModal{this.loading ? :
{this.whyNot}
}
; } diff --git a/extensions/statistics/js/src/admin/components/StatisticsWidget.js b/extensions/statistics/js/src/admin/components/StatisticsWidget.js index f9ac9fb8a..8ae954b28 100644 --- a/extensions/statistics/js/src/admin/components/StatisticsWidget.js +++ b/extensions/statistics/js/src/admin/components/StatisticsWidget.js @@ -46,6 +46,9 @@ export default class StatisticsWidget extends DashboardWidget { return 'StatisticsWidget'; } + /** + * @return {import('mithril').Children} + */ content() { const thisPeriod = this.periods[this.selectedPeriod]; diff --git a/extensions/tags/js/src/admin/components/EditTagModal.tsx b/extensions/tags/js/src/admin/components/EditTagModal.tsx index f33025ed7..42c6be56b 100644 --- a/extensions/tags/js/src/admin/components/EditTagModal.tsx +++ b/extensions/tags/js/src/admin/components/EditTagModal.tsx @@ -7,7 +7,7 @@ import { slug } from 'flarum/common/utils/string'; import Stream from 'flarum/common/utils/Stream'; import tagLabel from '../../common/helpers/tagLabel'; -import type Mithril from 'mithril'; +import Mithril from 'mithril'; import type Tag from '../../common/models/Tag'; import extractText from 'flarum/common/utils/extractText'; import { ModelIdentifier } from 'flarum/common/Model'; @@ -50,13 +50,13 @@ export default class EditTagModal extends Modal { return 'EditTagModal Modal--small'; } - title() { + title(): Mithril.Children { return this.name() - ? tagLabel(app.store.createRecord('tags', { attributes: this.submitData() })) + ? tagLabel(app.store.createRecord('tags', { attributes: this.submitData() })) : app.translator.trans('flarum-tags.admin.edit_tag.title'); } - content() { + content(): Mithril.Children { return (
@@ -67,7 +67,7 @@ export default class EditTagModal extends Modal { } fields() { - const items = new ItemList(); + const items = new ItemList(); items.add('name',
diff --git a/extensions/tags/js/src/admin/components/TagsPage.js b/extensions/tags/js/src/admin/components/TagsPage.js index 142fd2193..52140e9ea 100644 --- a/extensions/tags/js/src/admin/components/TagsPage.js +++ b/extensions/tags/js/src/admin/components/TagsPage.js @@ -51,6 +51,9 @@ export default class TagsPage extends ExtensionPage { }); } + /** + * @return {import('mithril').Children} + */ content() { if (this.loading) { return ; @@ -63,7 +66,7 @@ export default class TagsPage extends ExtensionPage { const maxSecondaryTags = this.setting('flarum-tags.max_secondary_tags', 0); const tags = sortTags(app.store.all('tags').filter(tag => !tag.parent())); - + return (
diff --git a/extensions/tags/js/src/common/helpers/tagIcon.js b/extensions/tags/js/src/common/helpers/tagIcon.tsx similarity index 67% rename from extensions/tags/js/src/common/helpers/tagIcon.js rename to extensions/tags/js/src/common/helpers/tagIcon.tsx index c15430a50..a1aec6007 100644 --- a/extensions/tags/js/src/common/helpers/tagIcon.js +++ b/extensions/tags/js/src/common/helpers/tagIcon.tsx @@ -1,6 +1,9 @@ +import { ComponentAttrs } from 'flarum/common/Component'; import classList from 'flarum/common/utils/classList'; +import Tag from '../models/Tag'; +import type Mithril from 'mithril'; -export default function tagIcon(tag, attrs = {}, settings = {}) { +export default function tagIcon(tag: Tag, attrs: ComponentAttrs = {}, settings: {useColor?: boolean} = {}): Mithril.Children { const hasIcon = tag && tag.icon(); const { useColor = true } = settings; diff --git a/extensions/tags/js/src/common/helpers/tagLabel.js b/extensions/tags/js/src/common/helpers/tagLabel.tsx similarity index 66% rename from extensions/tags/js/src/common/helpers/tagLabel.js rename to extensions/tags/js/src/common/helpers/tagLabel.tsx index 8b5df2ae0..3e73fa458 100644 --- a/extensions/tags/js/src/common/helpers/tagLabel.js +++ b/extensions/tags/js/src/common/helpers/tagLabel.tsx @@ -1,8 +1,13 @@ +import app from 'flarum/common/app'; + import extract from 'flarum/common/utils/extract'; import Link from 'flarum/common/components/Link'; import tagIcon from './tagIcon'; +import Tag from '../models/Tag'; +import type { ComponentAttrs } from 'flarum/common/Component'; +import type Mithril from 'mithril'; -export default function tagLabel(tag, attrs = {}) { +export default function tagLabel(tag?: Tag, attrs: ComponentAttrs = {}): Mithril.Children { attrs.style = attrs.style || {}; attrs.className = 'TagLabel ' + (attrs.className || ''); @@ -28,11 +33,15 @@ export default function tagLabel(tag, attrs = {}) { attrs.className += ' untagged'; } - return ( - m((link ? Link : 'span'), attrs, - + const children = ( + {tag && tag.icon() && tagIcon(tag, {}, {useColor: false})} {tagText} - ) ); + + if (link) { + return {children} + } + + return {children}; } diff --git a/extensions/tags/js/src/common/helpers/tagsLabel.js b/extensions/tags/js/src/common/helpers/tagsLabel.tsx similarity index 63% rename from extensions/tags/js/src/common/helpers/tagsLabel.js rename to extensions/tags/js/src/common/helpers/tagsLabel.tsx index 370e66cd1..2477301f7 100644 --- a/extensions/tags/js/src/common/helpers/tagsLabel.js +++ b/extensions/tags/js/src/common/helpers/tagsLabel.tsx @@ -1,15 +1,18 @@ import extract from 'flarum/common/utils/extract'; import tagLabel from './tagLabel'; import sortTags from '../utils/sortTags'; +import Tag from '../models/Tag'; +import type { ComponentAttrs } from 'flarum/common/Component'; +import type Mithril from 'mithril'; -export default function tagsLabel(tags, attrs = {}) { +export default function tagsLabel(tags: Tag[], attrs: ComponentAttrs = {}): Mithril.Children { const children = []; const link = extract(attrs, 'link'); attrs.className = 'TagsLabel ' + (attrs.className || ''); if (tags) { - sortTags(tags).forEach(tag => { + sortTags(tags).forEach((tag: Tag) => { if (tag || tags.length === 1) { children.push(tagLabel(tag, {link})); } diff --git a/extensions/tags/js/src/forum/components/TagDiscussionModal.tsx b/extensions/tags/js/src/forum/components/TagDiscussionModal.tsx index 814522e8e..17b7cf64a 100644 --- a/extensions/tags/js/src/forum/components/TagDiscussionModal.tsx +++ b/extensions/tags/js/src/forum/components/TagDiscussionModal.tsx @@ -139,6 +139,9 @@ export default class TagDiscussionModal extends Modal { return ''; } + /** + * @return {import('mithril').Children} + */ content() { if (this.tagsLoading || !this.tags) { return ; diff --git a/extensions/tags/js/src/forum/components/TagHero.js b/extensions/tags/js/src/forum/components/TagHero.js index bd2b899a0..581588339 100644 --- a/extensions/tags/js/src/forum/components/TagHero.js +++ b/extensions/tags/js/src/forum/components/TagHero.js @@ -2,6 +2,9 @@ import Component from 'flarum/common/Component'; import tagIcon from '../../common/helpers/tagIcon'; export default class TagHero extends Component { + /** + * @return {import('mithril').Children} + */ view() { const tag = this.attrs.model; const color = tag.color(); diff --git a/extensions/tags/js/src/forum/components/TagLinkButton.js b/extensions/tags/js/src/forum/components/TagLinkButton.js index 9fb2f8b14..911ad9379 100644 --- a/extensions/tags/js/src/forum/components/TagLinkButton.js +++ b/extensions/tags/js/src/forum/components/TagLinkButton.js @@ -4,6 +4,9 @@ import classList from 'flarum/common/utils/classList'; import tagIcon from '../../common/helpers/tagIcon'; export default class TagLinkButton extends LinkButton { + /** + * @return {import('mithril').Children} + */ view(vnode) { const tag = this.attrs.model; const active = this.constructor.isActive(this.attrs); diff --git a/extensions/tags/js/src/forum/components/TagsPage.js b/extensions/tags/js/src/forum/components/TagsPage.js index c3bc1cb39..00313a694 100755 --- a/extensions/tags/js/src/forum/components/TagsPage.js +++ b/extensions/tags/js/src/forum/components/TagsPage.js @@ -35,6 +35,9 @@ export default class TagsPage extends Page { }); } + /** + * @return {import('mithril').Children} + */ view() { if (this.loading) { return ; diff --git a/extensions/tags/js/src/forum/components/ToggleButton.js b/extensions/tags/js/src/forum/components/ToggleButton.js index cbf4904ff..68a748ee5 100644 --- a/extensions/tags/js/src/forum/components/ToggleButton.js +++ b/extensions/tags/js/src/forum/components/ToggleButton.js @@ -6,6 +6,9 @@ import classList from 'flarum/common/utils/classList'; * @TODO move to core */ export default class ToggleButton extends Component { + /** + * @return {import('mithril').Children} + */ view(vnode) { const { className, isToggled, ...attrs } = this.attrs; const icon = isToggled ? 'far fa-check-circle' : 'far fa-circle'; diff --git a/framework/core/js/src/admin/components/AdminHeader.js b/framework/core/js/src/admin/components/AdminHeader.tsx similarity index 52% rename from framework/core/js/src/admin/components/AdminHeader.js rename to framework/core/js/src/admin/components/AdminHeader.tsx index 5472a8064..80c6e83fd 100644 --- a/framework/core/js/src/admin/components/AdminHeader.js +++ b/framework/core/js/src/admin/components/AdminHeader.tsx @@ -1,9 +1,15 @@ -import Component from '../../common/Component'; +import Component, { ComponentAttrs } from '../../common/Component'; import classList from '../../common/utils/classList'; import icon from '../../common/helpers/icon'; +import type Mithril from 'mithril'; -export default class AdminHeader extends Component { - view(vnode) { +export interface IAdminHeaderAttrs extends ComponentAttrs { + icon: string; + description: string; +} + +export default class AdminHeader extends Component { + view(vnode: Mithril.Vnode): Mithril.Children { return [
diff --git a/framework/core/js/src/admin/components/AdminNav.js b/framework/core/js/src/admin/components/AdminNav.js index 506334a0a..b39c1ae96 100644 --- a/framework/core/js/src/admin/components/AdminNav.js +++ b/framework/core/js/src/admin/components/AdminNav.js @@ -14,6 +14,9 @@ export default class AdminNav extends Component { this.query = Stream(''); } + /** + * @return {import('mithril').Children} + */ view() { return ( diff --git a/framework/core/js/src/admin/components/AppearancePage.js b/framework/core/js/src/admin/components/AppearancePage.js index 0550f3841..d983254f0 100644 --- a/framework/core/js/src/admin/components/AppearancePage.js +++ b/framework/core/js/src/admin/components/AppearancePage.js @@ -17,6 +17,9 @@ export default class AppearancePage extends AdminPage { }; } + /** + * @return {import('mithril').Children} + */ content() { return [
diff --git a/framework/core/js/src/admin/components/BasicsPage.js b/framework/core/js/src/admin/components/BasicsPage.js index 658eaca68..af427282a 100644 --- a/framework/core/js/src/admin/components/BasicsPage.js +++ b/framework/core/js/src/admin/components/BasicsPage.js @@ -38,6 +38,9 @@ export default class BasicsPage extends AdminPage { }; } + /** + * @return {import('mithril').Children} + */ content() { return [
diff --git a/framework/core/js/src/admin/components/EditCustomCssModal.js b/framework/core/js/src/admin/components/EditCustomCssModal.js index 432961074..068cbe7d0 100644 --- a/framework/core/js/src/admin/components/EditCustomCssModal.js +++ b/framework/core/js/src/admin/components/EditCustomCssModal.js @@ -10,6 +10,9 @@ export default class EditCustomCssModal extends SettingsModal { return app.translator.trans('core.admin.edit_css.title'); } + /** + * @return {import('mithril').Children} + */ form() { return [

diff --git a/framework/core/js/src/admin/components/EditCustomFooterModal.js b/framework/core/js/src/admin/components/EditCustomFooterModal.js index 97188ec83..bb5971b19 100644 --- a/framework/core/js/src/admin/components/EditCustomFooterModal.js +++ b/framework/core/js/src/admin/components/EditCustomFooterModal.js @@ -10,6 +10,9 @@ export default class EditCustomFooterModal extends SettingsModal { return app.translator.trans('core.admin.edit_footer.title'); } + /** + * @return {import('mithril').Children} + */ form() { return [

{app.translator.trans('core.admin.edit_footer.customize_text')}

, diff --git a/framework/core/js/src/admin/components/EditCustomHeaderModal.js b/framework/core/js/src/admin/components/EditCustomHeaderModal.js index 4da7afe9d..b30af60bf 100644 --- a/framework/core/js/src/admin/components/EditCustomHeaderModal.js +++ b/framework/core/js/src/admin/components/EditCustomHeaderModal.js @@ -10,6 +10,9 @@ export default class EditCustomHeaderModal extends SettingsModal { return app.translator.trans('core.admin.edit_header.title'); } + /** + * @return {import('mithril').Children} + */ form() { return [

{app.translator.trans('core.admin.edit_header.customize_text')}

, diff --git a/framework/core/js/src/admin/components/EditGroupModal.js b/framework/core/js/src/admin/components/EditGroupModal.js index a347a5995..654d147dd 100644 --- a/framework/core/js/src/admin/components/EditGroupModal.js +++ b/framework/core/js/src/admin/components/EditGroupModal.js @@ -41,6 +41,9 @@ export default class EditGroupModal extends Modal { ]; } + /** + * @return {import('mithril').Children} + */ content() { return (
diff --git a/framework/core/js/src/admin/components/ExtensionPage.tsx b/framework/core/js/src/admin/components/ExtensionPage.tsx index fa6acccaa..af4a1fa9d 100644 --- a/framework/core/js/src/admin/components/ExtensionPage.tsx +++ b/framework/core/js/src/admin/components/ExtensionPage.tsx @@ -15,7 +15,7 @@ import ReadmeModal from './ReadmeModal'; import RequestError from '../../common/utils/RequestError'; import { Extension } from '../AdminApplication'; import { IPageAttrs } from '../../common/components/Page'; -import type Mithril from 'mithril'; +import Mithril from 'mithril'; import extractText from '../../common/utils/extractText'; export interface ExtensionPageAttrs extends IPageAttrs { @@ -54,7 +54,7 @@ export default class ExtensionPage) { + view(vnode: Mithril.VnodeDOM): Mithril.Children { if (!this.extension) return null; return ( @@ -71,7 +71,7 @@ export default class ExtensionPage) { - const items = new ItemList(); + sections(vnode: Mithril.VnodeDOM): ItemList { + const items = new ItemList(); items.add('content', this.content(vnode)); @@ -131,7 +131,7 @@ export default class ExtensionPage) { + content(vnode: Mithril.VnodeDOM): Mithril.Children { const settings = app.extensionData.getSettings(this.extension.id); return ( @@ -150,7 +150,7 @@ export default class ExtensionPage { const items = new ItemList(); items.add('version', {this.extension.version}); diff --git a/framework/core/js/src/admin/components/ExtensionsWidget.js b/framework/core/js/src/admin/components/ExtensionsWidget.js index 0647f272f..ae61338f6 100644 --- a/framework/core/js/src/admin/components/ExtensionsWidget.js +++ b/framework/core/js/src/admin/components/ExtensionsWidget.js @@ -16,6 +16,9 @@ export default class ExtensionsWidget extends DashboardWidget { return 'ExtensionsWidget'; } + /** + * @return {import('mithril').Children} + */ content() { const categories = app.extensionCategories; @@ -26,6 +29,9 @@ export default class ExtensionsWidget extends DashboardWidget { ); } + /** + * @return {import('mithril').Children} + */ extensionCategory(category) { return (
@@ -35,6 +41,9 @@ export default class ExtensionsWidget extends DashboardWidget { ); } + /** + * @return {import('mithril').Children} + */ extensionWidget(extension) { return (
  • diff --git a/framework/core/js/src/admin/components/HeaderPrimary.js b/framework/core/js/src/admin/components/HeaderPrimary.js index 8246761a3..95a2bcbd0 100644 --- a/framework/core/js/src/admin/components/HeaderPrimary.js +++ b/framework/core/js/src/admin/components/HeaderPrimary.js @@ -7,6 +7,9 @@ import listItems from '../../common/helpers/listItems'; * default skin, these are shown just to the right of the forum title. */ export default class HeaderPrimary extends Component { + /** + * @return {import('mithril').Children} + */ view() { return
      {listItems(this.items().toArray())}
    ; } diff --git a/framework/core/js/src/admin/components/HeaderSecondary.js b/framework/core/js/src/admin/components/HeaderSecondary.js index 255815be2..8dcbfca06 100644 --- a/framework/core/js/src/admin/components/HeaderSecondary.js +++ b/framework/core/js/src/admin/components/HeaderSecondary.js @@ -9,6 +9,9 @@ import listItems from '../../common/helpers/listItems'; * The `HeaderSecondary` component displays secondary header controls. */ export default class HeaderSecondary extends Component { + /** + * @return {import('mithril').Children} + */ view() { return
      {listItems(this.items().toArray())}
    ; } diff --git a/framework/core/js/src/admin/components/MailPage.js b/framework/core/js/src/admin/components/MailPage.js index 9ff161ee2..cc7184e76 100644 --- a/framework/core/js/src/admin/components/MailPage.js +++ b/framework/core/js/src/admin/components/MailPage.js @@ -42,6 +42,9 @@ export default class MailPage extends AdminPage { }); } + /** + * @return {import('mithril').Children} + */ content() { if (this.loading) { return ; diff --git a/framework/core/js/src/admin/components/PermissionGrid.tsx b/framework/core/js/src/admin/components/PermissionGrid.tsx index 37741ff29..c2be231b0 100644 --- a/framework/core/js/src/admin/components/PermissionGrid.tsx +++ b/framework/core/js/src/admin/components/PermissionGrid.tsx @@ -33,7 +33,7 @@ export interface ScopeItem { export interface IPermissionGridAttrs extends ComponentAttrs {} export default class PermissionGrid extends Component { - view(vnode: Mithril.Vnode) { + view(vnode: Mithril.Vnode): Mithril.Children { const scopes = this.scopeItems().toArray(); const permissionCells = (permission: PermissionGridEntry | { children: PermissionGridEntry[] }) => { diff --git a/framework/core/js/src/admin/components/PermissionsPage.js b/framework/core/js/src/admin/components/PermissionsPage.js index c985fa35e..f2d0cfe00 100644 --- a/framework/core/js/src/admin/components/PermissionsPage.js +++ b/framework/core/js/src/admin/components/PermissionsPage.js @@ -16,6 +16,9 @@ export default class PermissionsPage extends AdminPage { }; } + /** + * @return {import('mithril').Children} + */ content() { return [
    diff --git a/framework/core/js/src/admin/components/ReadmeModal.tsx b/framework/core/js/src/admin/components/ReadmeModal.tsx index e2cc9f0bc..96a906a02 100644 --- a/framework/core/js/src/admin/components/ReadmeModal.tsx +++ b/framework/core/js/src/admin/components/ReadmeModal.tsx @@ -38,7 +38,7 @@ export default class ReadmeModal @@ -28,6 +31,9 @@ export default class SettingsModal extends Modal { ); } + /** + * @return {import('mithril').Children} + */ submitButton() { return (
    - ); - } -} diff --git a/framework/core/js/src/common/components/Placeholder.tsx b/framework/core/js/src/common/components/Placeholder.tsx new file mode 100644 index 000000000..60bb4d8ef --- /dev/null +++ b/framework/core/js/src/common/components/Placeholder.tsx @@ -0,0 +1,20 @@ +import type Mithril from 'mithril'; +import Component, { ComponentAttrs } from '../Component'; + +interface IPlaceholderAttrs extends ComponentAttrs { + text: Mithril.Children; +} + +/** + * The `Placeholder` component displays a muted text with some call to action, + * usually used as an empty state. + */ +export default class Placeholder extends Component { + view(): Mithril.Children { + return ( +
    +

    {this.attrs.text}

    +
    + ); + } +} diff --git a/framework/core/js/src/common/components/RequestErrorModal.tsx b/framework/core/js/src/common/components/RequestErrorModal.tsx index abada7796..64c73f4ca 100644 --- a/framework/core/js/src/common/components/RequestErrorModal.tsx +++ b/framework/core/js/src/common/components/RequestErrorModal.tsx @@ -1,3 +1,4 @@ +import type Mithril from 'mithril'; import type RequestError from '../utils/RequestError'; import Modal, { IInternalModalAttrs } from './Modal'; @@ -15,7 +16,7 @@ export default class RequestErrorModal` element rendered to the DOM. */ export default class Select extends Component { + /** + * @return {import('mithril').Children} + */ view() { const { options, diff --git a/framework/core/js/src/common/components/SelectDropdown.js b/framework/core/js/src/common/components/SelectDropdown.js index e7111ffe7..793350d59 100644 --- a/framework/core/js/src/common/components/SelectDropdown.js +++ b/framework/core/js/src/common/components/SelectDropdown.js @@ -41,6 +41,9 @@ export default class SelectDropdown extends Dropdown { attrs.className += ' Dropdown--select'; } + /** + * @return {import('mithril').Children} + */ getButtonContent(children) { const activeChild = children.find(isActive); let label = (activeChild && activeChild.children) || this.attrs.defaultLabel; diff --git a/framework/core/js/src/common/components/Separator.js b/framework/core/js/src/common/components/Separator.tsx similarity index 53% rename from framework/core/js/src/common/components/Separator.js rename to framework/core/js/src/common/components/Separator.tsx index 1b5ca4911..48ca91f00 100644 --- a/framework/core/js/src/common/components/Separator.js +++ b/framework/core/js/src/common/components/Separator.tsx @@ -1,14 +1,13 @@ +import type Mithril from 'mithril'; import Component from '../Component'; /** * The `Separator` component defines a menu separator item. */ -class Separator extends Component { - view() { +export default class Separator extends Component { + static isListItem = true; + + view(): Mithril.Children { return
  • ; } } - -Separator.isListItem = true; - -export default Separator; diff --git a/framework/core/js/src/common/components/SplitDropdown.js b/framework/core/js/src/common/components/SplitDropdown.js index fea79e6af..bae9d80b8 100644 --- a/framework/core/js/src/common/components/SplitDropdown.js +++ b/framework/core/js/src/common/components/SplitDropdown.js @@ -14,6 +14,9 @@ export default class SplitDropdown extends Dropdown { attrs.menuClassName += ' Dropdown-menu--right'; } + /** + * @return {import('mithril').Children} + */ getButton(children) { // Make a copy of the attrs of the first child component. We will assign // these attrs to a new button, so that it has exactly the same behaviour as diff --git a/framework/core/js/src/common/components/TextEditor.js b/framework/core/js/src/common/components/TextEditor.js index c4608ace3..600aa008b 100644 --- a/framework/core/js/src/common/components/TextEditor.js +++ b/framework/core/js/src/common/components/TextEditor.js @@ -38,6 +38,9 @@ export default class TextEditor extends Component { this.disabled = !!this.attrs.disabled; } + /** + * @return {import('mithril').Children} + */ view() { return (
    diff --git a/framework/core/js/src/common/components/TextEditorButton.js b/framework/core/js/src/common/components/TextEditorButton.js index fa517e627..bd82f756a 100644 --- a/framework/core/js/src/common/components/TextEditorButton.js +++ b/framework/core/js/src/common/components/TextEditorButton.js @@ -12,6 +12,9 @@ import Tooltip from './Tooltip'; * - `title` - Tooltip for the button */ export default class TextEditorButton extends Button { + /** + * @return {import('mithril').Children} + */ view(vnode) { const originalView = super.view(vnode); diff --git a/framework/core/js/src/common/states/AlertManagerState.ts b/framework/core/js/src/common/states/AlertManagerState.ts index f254ea502..5b3e63624 100644 --- a/framework/core/js/src/common/states/AlertManagerState.ts +++ b/framework/core/js/src/common/states/AlertManagerState.ts @@ -13,7 +13,7 @@ export interface AlertState { } export default class AlertManagerState { - protected activeAlerts: { [id: number]: AlertState } = {}; + protected activeAlerts: { [id: AlertIdentifier]: AlertState } = {}; protected alertId = 0; getActiveAlerts() { diff --git a/framework/core/js/src/forum/components/AvatarEditor.js b/framework/core/js/src/forum/components/AvatarEditor.js index fa2ff1266..84c0e5378 100644 --- a/framework/core/js/src/forum/components/AvatarEditor.js +++ b/framework/core/js/src/forum/components/AvatarEditor.js @@ -36,6 +36,9 @@ export default class AvatarEditor extends Component { this.isDraggedOver = false; } + /** + * @return {import('mithril').Children} + */ view() { const user = this.attrs.user; diff --git a/framework/core/js/src/forum/components/ChangeEmailModal.js b/framework/core/js/src/forum/components/ChangeEmailModal.js index 3d7cb6ef0..62dc0d17c 100644 --- a/framework/core/js/src/forum/components/ChangeEmailModal.js +++ b/framework/core/js/src/forum/components/ChangeEmailModal.js @@ -41,6 +41,9 @@ export default class ChangeEmailModal extends Modal { return app.translator.trans('core.forum.change_email.title'); } + /** + * @return {import('mithril').Children} + */ content() { if (this.success) { return ( diff --git a/framework/core/js/src/forum/components/ChangePasswordModal.js b/framework/core/js/src/forum/components/ChangePasswordModal.js index 4c3596e65..53cf25931 100644 --- a/framework/core/js/src/forum/components/ChangePasswordModal.js +++ b/framework/core/js/src/forum/components/ChangePasswordModal.js @@ -15,6 +15,9 @@ export default class ChangePasswordModal extends Modal { return app.translator.trans('core.forum.change_password.title'); } + /** + * @return {import('mithril').Children} + */ content() { return (
    diff --git a/framework/core/js/src/forum/components/Composer.js b/framework/core/js/src/forum/components/Composer.js index 71a178976..e98094c61 100644 --- a/framework/core/js/src/forum/components/Composer.js +++ b/framework/core/js/src/forum/components/Composer.js @@ -33,6 +33,9 @@ export default class Composer extends Component { this.prevPosition = this.state.position; } + /** + * @return {import('mithril').Children} + */ view() { const body = this.state.body; const classes = { diff --git a/framework/core/js/src/forum/components/ComposerBody.js b/framework/core/js/src/forum/components/ComposerBody.js index 58df9580e..6f28763d2 100644 --- a/framework/core/js/src/forum/components/ComposerBody.js +++ b/framework/core/js/src/forum/components/ComposerBody.js @@ -47,6 +47,9 @@ export default class ComposerBody extends Component { this.composer.fields.content(this.attrs.originalContent || ''); } + /** + * @return {import('mithril').Children} + */ view() { return ( diff --git a/framework/core/js/src/forum/components/ComposerPostPreview.js b/framework/core/js/src/forum/components/ComposerPostPreview.js index eb06add96..5cd3b7559 100644 --- a/framework/core/js/src/forum/components/ComposerPostPreview.js +++ b/framework/core/js/src/forum/components/ComposerPostPreview.js @@ -20,6 +20,9 @@ export default class ComposerPostPreview extends Component { attrs.surround = attrs.surround || ((preview) => preview()); } + /** + * @return {import('mithril').Children} + */ view() { return
    ; } diff --git a/framework/core/js/src/forum/components/DiscussionHero.js b/framework/core/js/src/forum/components/DiscussionHero.js index 659cf1a71..f50953295 100644 --- a/framework/core/js/src/forum/components/DiscussionHero.js +++ b/framework/core/js/src/forum/components/DiscussionHero.js @@ -10,6 +10,9 @@ import listItems from '../../common/helpers/listItems'; * - `discussion` */ export default class DiscussionHero extends Component { + /** + * @return {import('mithril').Children} + */ view() { return (
    diff --git a/framework/core/js/src/forum/components/DiscussionList.js b/framework/core/js/src/forum/components/DiscussionList.js index 3ba28f807..a30d6e3ad 100644 --- a/framework/core/js/src/forum/components/DiscussionList.js +++ b/framework/core/js/src/forum/components/DiscussionList.js @@ -13,6 +13,9 @@ import Placeholder from '../../common/components/Placeholder'; * - `state` A DiscussionListState object that represents the discussion lists's state. */ export default class DiscussionList extends Component { + /** + * @return {import('mithril').Children} + */ view() { /** * @type {import('../states/DiscussionListState').default} diff --git a/framework/core/js/src/forum/components/DiscussionListItem.tsx b/framework/core/js/src/forum/components/DiscussionListItem.tsx index 20e2946c8..ee44482ec 100644 --- a/framework/core/js/src/forum/components/DiscussionListItem.tsx +++ b/framework/core/js/src/forum/components/DiscussionListItem.tsx @@ -62,7 +62,7 @@ export default class DiscussionListItem { * - `state` A DiscussionListState object that represents the discussion lists's state. */ export default class DiscussionListPane extends Component { + /** + * @return {import('mithril').Children} + */ view() { if (!this.attrs.state.hasItems()) { return; diff --git a/framework/core/js/src/forum/components/DiscussionPage.tsx b/framework/core/js/src/forum/components/DiscussionPage.tsx index fd802ced9..506a5b27f 100644 --- a/framework/core/js/src/forum/components/DiscussionPage.tsx +++ b/framework/core/js/src/forum/components/DiscussionPage.tsx @@ -79,7 +79,7 @@ export default class DiscussionPage diff --git a/framework/core/js/src/forum/components/DiscussionRenamedPost.js b/framework/core/js/src/forum/components/DiscussionRenamedPost.js index 80aaa04f2..1514b114b 100644 --- a/framework/core/js/src/forum/components/DiscussionRenamedPost.js +++ b/framework/core/js/src/forum/components/DiscussionRenamedPost.js @@ -15,6 +15,9 @@ export default class DiscussionRenamedPost extends EventPost { return 'fas fa-pencil-alt'; } + /** + * @return {import('mithril').Children} + */ description(data) { const renamed = app.translator.trans('core.forum.post_stream.discussion_renamed_text', data); const oldName = app.translator.trans('core.forum.post_stream.discussion_renamed_old_tooltip', data); @@ -22,6 +25,9 @@ export default class DiscussionRenamedPost extends EventPost { return {renamed}; } + /** + * @return {Record} + */ descriptionData() { const post = this.attrs.post; const oldTitle = post.content()[0]; diff --git a/framework/core/js/src/forum/components/DiscussionsUserPage.js b/framework/core/js/src/forum/components/DiscussionsUserPage.js index c4f4b056d..20bbe5b01 100644 --- a/framework/core/js/src/forum/components/DiscussionsUserPage.js +++ b/framework/core/js/src/forum/components/DiscussionsUserPage.js @@ -24,6 +24,9 @@ export default class DiscussionsUserPage extends UserPage { this.state.refresh(); } + /** + * @return {import('mithril').Children} + */ content() { return
    {DiscussionList.component({ state: this.state })}
    ; } diff --git a/framework/core/js/src/forum/components/ForgotPasswordModal.tsx b/framework/core/js/src/forum/components/ForgotPasswordModal.tsx index d3da52a9b..6fe920156 100644 --- a/framework/core/js/src/forum/components/ForgotPasswordModal.tsx +++ b/framework/core/js/src/forum/components/ForgotPasswordModal.tsx @@ -36,7 +36,7 @@ export default class ForgotPasswordModal diff --git a/framework/core/js/src/forum/components/HeaderPrimary.js b/framework/core/js/src/forum/components/HeaderPrimary.js index 55282fd22..cab4a4fb2 100644 --- a/framework/core/js/src/forum/components/HeaderPrimary.js +++ b/framework/core/js/src/forum/components/HeaderPrimary.js @@ -7,6 +7,9 @@ import listItems from '../../common/helpers/listItems'; * default skin, these are shown just to the right of the forum title. */ export default class HeaderPrimary extends Component { + /** + * @return {import('mithril').Children} + */ view() { return
      {listItems(this.items().toArray())}
    ; } diff --git a/framework/core/js/src/forum/components/HeaderSecondary.js b/framework/core/js/src/forum/components/HeaderSecondary.js index bc2d68a61..38f26255b 100644 --- a/framework/core/js/src/forum/components/HeaderSecondary.js +++ b/framework/core/js/src/forum/components/HeaderSecondary.js @@ -16,6 +16,9 @@ import Search from '../components/Search'; * right side of the header. */ export default class HeaderSecondary extends Component { + /** + * @return {import('mithril').Children} + */ view() { return
      {listItems(this.items().toArray())}
    ; } diff --git a/framework/core/js/src/forum/components/IndexPage.js b/framework/core/js/src/forum/components/IndexPage.js index a9bd9f345..2e3469566 100644 --- a/framework/core/js/src/forum/components/IndexPage.js +++ b/framework/core/js/src/forum/components/IndexPage.js @@ -45,6 +45,9 @@ export default class IndexPage extends Page { this.scrollTopOnCreate = false; } + /** + * @return {import('mithril').Children} + */ view() { return (
    diff --git a/framework/core/js/src/forum/components/LoadingPost.js b/framework/core/js/src/forum/components/LoadingPost.tsx similarity index 91% rename from framework/core/js/src/forum/components/LoadingPost.js rename to framework/core/js/src/forum/components/LoadingPost.tsx index c902ec883..1854134d5 100644 --- a/framework/core/js/src/forum/components/LoadingPost.js +++ b/framework/core/js/src/forum/components/LoadingPost.tsx @@ -1,3 +1,4 @@ +import type Mithril from 'mithril'; import Component from '../../common/Component'; import avatar from '../../common/helpers/avatar'; @@ -6,7 +7,7 @@ import avatar from '../../common/helpers/avatar'; * indicating that the post is loading. */ export default class LoadingPost extends Component { - view() { + view(): Mithril.Children { return (
    diff --git a/framework/core/js/src/forum/components/LogInButtons.js b/framework/core/js/src/forum/components/LogInButtons.tsx similarity index 79% rename from framework/core/js/src/forum/components/LogInButtons.js rename to framework/core/js/src/forum/components/LogInButtons.tsx index 692fd852c..0689c8209 100644 --- a/framework/core/js/src/forum/components/LogInButtons.js +++ b/framework/core/js/src/forum/components/LogInButtons.tsx @@ -1,3 +1,4 @@ +import Mithril from 'mithril'; import Component from '../../common/Component'; import ItemList from '../../common/utils/ItemList'; @@ -5,16 +6,14 @@ import ItemList from '../../common/utils/ItemList'; * The `LogInButtons` component displays a collection of social login buttons. */ export default class LogInButtons extends Component { - view() { + view(): Mithril.Children { return
    {this.items().toArray()}
    ; } /** * Build a list of LogInButton components. - * - * @return {ItemList} */ items() { - return new ItemList(); + return new ItemList(); } } diff --git a/framework/core/js/src/forum/components/LogInModal.tsx b/framework/core/js/src/forum/components/LogInModal.tsx index 976cec7ad..6cd6d1f35 100644 --- a/framework/core/js/src/forum/components/LogInModal.tsx +++ b/framework/core/js/src/forum/components/LogInModal.tsx @@ -7,7 +7,7 @@ import LogInButtons from './LogInButtons'; import extractText from '../../common/utils/extractText'; import ItemList from '../../common/utils/ItemList'; import Stream from '../../common/utils/Stream'; -import type Mithril from 'mithril'; +import Mithril from 'mithril'; import RequestError from '../../common/utils/RequestError'; export interface ILoginModalAttrs extends IInternalModalAttrs { @@ -42,20 +42,20 @@ export default class LogInModal{this.body()}
    ,
    {this.footer()}
    ]; } - body() { + body(): Mithril.Children { return [,
    {this.fields().toArray()}
    ]; } fields() { - const items = new ItemList(); + const items = new ItemList(); const identificationLabel = extractText(app.translator.trans('core.forum.log_in.username_or_email_placeholder')); const passwordLabel = extractText(app.translator.trans('core.forum.log_in.password_placeholder')); @@ -124,7 +124,7 @@ export default class LogInModal {app.translator.trans('core.forum.log_in.forgot_password_link')} diff --git a/framework/core/js/src/forum/components/Notification.tsx b/framework/core/js/src/forum/components/Notification.tsx index a0acdac33..e10a69687 100644 --- a/framework/core/js/src/forum/components/Notification.tsx +++ b/framework/core/js/src/forum/components/Notification.tsx @@ -18,7 +18,7 @@ export interface INotificationAttrs extends ComponentAttrs { * Subclasses should implement the `icon`, `href`, and `content` methods. */ export default abstract class Notification extends Component { - view(vnode: Mithril.Vnode) { + view(vnode: Mithril.Vnode): Mithril.Children { const notification = this.attrs.notification; const href = this.href(); diff --git a/framework/core/js/src/forum/components/NotificationGrid.js b/framework/core/js/src/forum/components/NotificationGrid.js index 368829873..216372a4d 100644 --- a/framework/core/js/src/forum/components/NotificationGrid.js +++ b/framework/core/js/src/forum/components/NotificationGrid.js @@ -38,6 +38,9 @@ export default class NotificationGrid extends Component { this.types = this.notificationTypes().toArray(); } + /** + * @return {import('mithril').Children} + */ view() { const preferences = this.attrs.user.preferences(); diff --git a/framework/core/js/src/forum/components/NotificationList.js b/framework/core/js/src/forum/components/NotificationList.js index 8c63fc328..572525484 100644 --- a/framework/core/js/src/forum/components/NotificationList.js +++ b/framework/core/js/src/forum/components/NotificationList.js @@ -12,6 +12,9 @@ import ItemList from '../../common/utils/ItemList'; * notifications, grouped by discussion. */ export default class NotificationList extends Component { + /** + * @return {import('mithril').Children} + */ view() { const state = this.attrs.state; diff --git a/framework/core/js/src/forum/components/NotificationsDropdown.js b/framework/core/js/src/forum/components/NotificationsDropdown.js index 6ec3bc3f0..43daa382b 100644 --- a/framework/core/js/src/forum/components/NotificationsDropdown.js +++ b/framework/core/js/src/forum/components/NotificationsDropdown.js @@ -18,6 +18,9 @@ export default class NotificationsDropdown extends Dropdown { super.initAttrs(attrs); } + /** + * @return {import('mithril').Children} + */ getButton() { const newNotifications = this.getNewCount(); const vdom = super.getButton(); @@ -30,6 +33,9 @@ export default class NotificationsDropdown extends Dropdown { return vdom; } + /** + * @return {import('mithril').Children} + */ getButtonContent() { const unread = this.getUnreadCount(); @@ -40,6 +46,9 @@ export default class NotificationsDropdown extends Dropdown { ]; } + /** + * @return {import('mithril').Children} + */ getMenu() { return (
    diff --git a/framework/core/js/src/forum/components/NotificationsPage.js b/framework/core/js/src/forum/components/NotificationsPage.js index b88da964a..f4e8cbbb5 100644 --- a/framework/core/js/src/forum/components/NotificationsPage.js +++ b/framework/core/js/src/forum/components/NotificationsPage.js @@ -17,6 +17,9 @@ export default class NotificationsPage extends Page { this.bodyClass = 'App--notifications'; } + /** + * @return {import('mithril').Children} + */ view() { return (
    diff --git a/framework/core/js/src/forum/components/Post.tsx b/framework/core/js/src/forum/components/Post.tsx index a9683216a..d366ec9d0 100644 --- a/framework/core/js/src/forum/components/Post.tsx +++ b/framework/core/js/src/forum/components/Post.tsx @@ -45,7 +45,7 @@ export default abstract class Post ); } - view(vnode: Mithril.Vnode) { + view(vnode: Mithril.Vnode): Mithril.Children { const attrs = this.elementAttrs(); attrs.className = this.classes(attrs.className as string | undefined).join(' '); diff --git a/framework/core/js/src/forum/components/PostEdited.js b/framework/core/js/src/forum/components/PostEdited.js index 8d4db4cba..72eacb0a0 100644 --- a/framework/core/js/src/forum/components/PostEdited.js +++ b/framework/core/js/src/forum/components/PostEdited.js @@ -16,6 +16,9 @@ export default class PostEdited extends Component { super.oninit(vnode); } + /** + * @return {import('mithril').Children} + */ view() { const post = this.attrs.post; const editedUser = post.editedUser(); diff --git a/framework/core/js/src/forum/components/PostMeta.js b/framework/core/js/src/forum/components/PostMeta.js index d85d84e33..118683bfa 100644 --- a/framework/core/js/src/forum/components/PostMeta.js +++ b/framework/core/js/src/forum/components/PostMeta.js @@ -13,6 +13,9 @@ import fullTime from '../../common/helpers/fullTime'; * - `post` */ export default class PostMeta extends Component { + /** + * @return {import('mithril').Children} + */ view() { const post = this.attrs.post; const time = post.createdAt(); diff --git a/framework/core/js/src/forum/components/PostPreview.js b/framework/core/js/src/forum/components/PostPreview.js index 5293bd3c1..7cd4f1e24 100644 --- a/framework/core/js/src/forum/components/PostPreview.js +++ b/framework/core/js/src/forum/components/PostPreview.js @@ -14,6 +14,9 @@ import highlight from '../../common/helpers/highlight'; * - `post` */ export default class PostPreview extends Component { + /** + * @return {import('mithril').Children} + */ view() { const post = this.attrs.post; const user = post.user(); diff --git a/framework/core/js/src/forum/components/PostStream.js b/framework/core/js/src/forum/components/PostStream.js index c3ff521ce..aa2f62f4b 100644 --- a/framework/core/js/src/forum/components/PostStream.js +++ b/framework/core/js/src/forum/components/PostStream.js @@ -26,6 +26,9 @@ export default class PostStream extends Component { this.scrollListener = new ScrollListener(this.onscroll.bind(this)); } + /** + * @return {import('mithril').Children} + */ view() { let lastTime; diff --git a/framework/core/js/src/forum/components/PostStreamScrubber.js b/framework/core/js/src/forum/components/PostStreamScrubber.js index cbdfe6060..7402506b1 100644 --- a/framework/core/js/src/forum/components/PostStreamScrubber.js +++ b/framework/core/js/src/forum/components/PostStreamScrubber.js @@ -23,6 +23,9 @@ export default class PostStreamScrubber extends Component { this.scrollListener = new ScrollListener(this.updateScrubberValues.bind(this, { fromScroll: true, forceHeightChange: true })); } + /** + * @return {import('mithril').Children} + */ view() { const count = this.stream.count(); diff --git a/framework/core/js/src/forum/components/PostUser.js b/framework/core/js/src/forum/components/PostUser.js index d0b71c200..6b97d6c9b 100644 --- a/framework/core/js/src/forum/components/PostUser.js +++ b/framework/core/js/src/forum/components/PostUser.js @@ -15,6 +15,9 @@ import listItems from '../../common/helpers/listItems'; * - `post` */ export default class PostUser extends Component { + /** + * @return {import('mithril').Children} + */ view() { const post = this.attrs.post; const user = post.user(); diff --git a/framework/core/js/src/forum/components/PostsUserPage.js b/framework/core/js/src/forum/components/PostsUserPage.js index 5c8f1901a..2163a2e8d 100644 --- a/framework/core/js/src/forum/components/PostsUserPage.js +++ b/framework/core/js/src/forum/components/PostsUserPage.js @@ -45,6 +45,9 @@ export default class PostsUserPage extends UserPage { this.loadUser(m.route.param('username')); } + /** + * @return {import('mithril').Children} + */ content() { if (this.posts.length === 0 && !this.loading) { return ( diff --git a/framework/core/js/src/forum/components/RenameDiscussionModal.js b/framework/core/js/src/forum/components/RenameDiscussionModal.js index 5b0c06669..cd1d332eb 100644 --- a/framework/core/js/src/forum/components/RenameDiscussionModal.js +++ b/framework/core/js/src/forum/components/RenameDiscussionModal.js @@ -19,10 +19,16 @@ export default class RenameDiscussionModal extends Modal { return 'RenameDiscussionModal Modal--small'; } + /** + * @return {import('mithril').Children} + */ title() { return app.translator.trans('core.forum.rename_discussion.title'); } + /** + * @return {import('mithril').Children} + */ content() { return (
    diff --git a/framework/core/js/src/forum/components/ReplyPlaceholder.js b/framework/core/js/src/forum/components/ReplyPlaceholder.js index 2db3ca683..fcb9189a0 100644 --- a/framework/core/js/src/forum/components/ReplyPlaceholder.js +++ b/framework/core/js/src/forum/components/ReplyPlaceholder.js @@ -15,6 +15,9 @@ import listItems from '../../common/helpers/listItems'; * - `discussion` */ export default class ReplyPlaceholder extends Component { + /** + * @return {import('mithril').Children} + */ view() { if (app.composer.composingReplyTo(this.attrs.discussion)) { return ( diff --git a/framework/core/js/src/forum/components/Search.tsx b/framework/core/js/src/forum/components/Search.tsx index af15a207c..68e51702d 100644 --- a/framework/core/js/src/forum/components/Search.tsx +++ b/framework/core/js/src/forum/components/Search.tsx @@ -117,7 +117,7 @@ export default class Search extends Compone this.searchState = this.attrs.state; } - view() { + view(): Mithril.Children { const currentSearch = this.searchState.getInitialSearch(); // Initialize search sources in the view rather than the constructor so diff --git a/framework/core/js/src/forum/components/SessionDropdown.js b/framework/core/js/src/forum/components/SessionDropdown.js index 456069cd2..5f607c631 100644 --- a/framework/core/js/src/forum/components/SessionDropdown.js +++ b/framework/core/js/src/forum/components/SessionDropdown.js @@ -22,10 +22,16 @@ export default class SessionDropdown extends Dropdown { attrs.accessibleToggleLabel = app.translator.trans('core.forum.header.session_dropdown_accessible_label'); } + /** + * @return {import('mithril').Children} + */ view(vnode) { return super.view({ ...vnode, children: this.items().toArray() }); } + /** + * @return {import('mithril').Children} + */ getButtonContent() { const user = app.session.user; diff --git a/framework/core/js/src/forum/components/SettingsPage.js b/framework/core/js/src/forum/components/SettingsPage.js index 40f82e20b..acb482805 100644 --- a/framework/core/js/src/forum/components/SettingsPage.js +++ b/framework/core/js/src/forum/components/SettingsPage.js @@ -22,6 +22,9 @@ export default class SettingsPage extends UserPage { app.setTitle(app.translator.trans('core.forum.settings.title')); } + /** + * @return {import('mithril').Children} + */ content() { return (
    diff --git a/framework/core/js/src/forum/components/SignUpModal.tsx b/framework/core/js/src/forum/components/SignUpModal.tsx index 779ac1bd6..c012495ae 100644 --- a/framework/core/js/src/forum/components/SignUpModal.tsx +++ b/framework/core/js/src/forum/components/SignUpModal.tsx @@ -6,7 +6,7 @@ import LogInButtons from './LogInButtons'; import extractText from '../../common/utils/extractText'; import ItemList from '../../common/utils/ItemList'; import Stream from '../../common/utils/Stream'; -import type Mithril from 'mithril'; +import Mithril from 'mithril'; export interface ISignupModalAttrs extends IInternalModalAttrs { username?: string; @@ -49,11 +49,11 @@ export default class SignUpModal{this.body()}
    ,
    {this.footer()}
    ]; } @@ -61,12 +61,12 @@ export default class SignUpModal,
    {this.fields().toArray()}
    ]; } fields() { - const items = new ItemList(); + const items = new ItemList(); const usernameLabel = extractText(app.translator.trans('core.forum.sign_up.username_placeholder')); const emailLabel = extractText(app.translator.trans('core.forum.sign_up.email_placeholder')); @@ -136,7 +136,7 @@ export default class SignUpModal{app.translator.trans('core.forum.sign_up.log_in_text', { a: })}

    , ]; diff --git a/framework/core/js/src/forum/components/TerminalPost.js b/framework/core/js/src/forum/components/TerminalPost.js index a3323e855..35a410270 100644 --- a/framework/core/js/src/forum/components/TerminalPost.js +++ b/framework/core/js/src/forum/components/TerminalPost.js @@ -12,6 +12,9 @@ import icon from '../../common/helpers/icon'; * - `lastPost` */ export default class TerminalPost extends Component { + /** + * @return {import('mithril').Children} + */ view() { const discussion = this.attrs.discussion; const lastPost = this.attrs.lastPost && discussion.replyCount(); diff --git a/framework/core/js/src/forum/components/UserCard.js b/framework/core/js/src/forum/components/UserCard.js index 2236de191..2b2d56573 100644 --- a/framework/core/js/src/forum/components/UserCard.js +++ b/framework/core/js/src/forum/components/UserCard.js @@ -24,6 +24,9 @@ import listItems from '../../common/helpers/listItems'; * - `controlsButtonClassName` */ export default class UserCard extends Component { + /** + * @return {import('mithril').Children} + */ view() { const user = this.attrs.user; const controls = UserControls.controls(user, this).toArray(); diff --git a/framework/core/js/src/forum/components/WelcomeHero.tsx b/framework/core/js/src/forum/components/WelcomeHero.tsx index 55ec04682..034c7c466 100644 --- a/framework/core/js/src/forum/components/WelcomeHero.tsx +++ b/framework/core/js/src/forum/components/WelcomeHero.tsx @@ -21,7 +21,7 @@ export default class WelcomeHero extends Component { super.oninit(vnode); } - view(vnode: Mithril.Vnode) { + view(vnode: Mithril.Vnode): Mithril.Children { if (this.isHidden()) return null; const slideUp = () => {