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 (
+
+ );
+ }
+}
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 = () => {