From 0334b6c972e782e95d6b463fbb4f40d48da63fb0 Mon Sep 17 00:00:00 2001 From: David Wheatley Date: Mon, 20 Dec 2021 16:21:18 +0100 Subject: [PATCH] chore: use consistent empty vdom return types in core --- js/src/admin/components/DashboardWidget.js | 2 +- js/src/admin/components/ExtensionsWidget.js | 4 +-- js/src/admin/components/LoadingModal.tsx | 2 +- js/src/admin/components/PermissionGrid.tsx | 5 ++-- js/src/admin/components/UserListPage.tsx | 2 +- js/src/common/components/Dropdown.js | 4 +-- js/src/common/components/EditUserModal.tsx | 8 ++---- js/src/common/components/Modal.tsx | 2 +- js/src/common/components/Navigation.js | 4 +-- .../common/components/RequestErrorModal.tsx | 2 +- js/src/common/components/Switch.js | 2 +- js/src/forum/components/Composer.js | 2 +- js/src/forum/components/LogInModal.tsx | 21 +++++++-------- js/src/forum/components/NotificationList.js | 2 +- js/src/forum/components/Post.js | 11 ++++---- js/src/forum/components/PostMeta.js | 2 +- js/src/forum/components/PostPreview.js | 2 +- js/src/forum/components/PostUser.js | 5 +++- js/src/forum/components/UserCard.js | 27 +++++++++---------- js/src/forum/states/ComposerState.js | 2 +- 20 files changed, 54 insertions(+), 57 deletions(-) diff --git a/js/src/admin/components/DashboardWidget.js b/js/src/admin/components/DashboardWidget.js index 68bff531b..6d96824ec 100644 --- a/js/src/admin/components/DashboardWidget.js +++ b/js/src/admin/components/DashboardWidget.js @@ -20,6 +20,6 @@ export default class DashboardWidget extends Component { * @return {VirtualElement} */ content() { - return []; + return null; } } diff --git a/js/src/admin/components/ExtensionsWidget.js b/js/src/admin/components/ExtensionsWidget.js index 0647f272f..b764e99d0 100644 --- a/js/src/admin/components/ExtensionsWidget.js +++ b/js/src/admin/components/ExtensionsWidget.js @@ -21,7 +21,7 @@ export default class ExtensionsWidget extends DashboardWidget { return (
- {Object.keys(categories).map((category) => (this.categorizedExtensions[category] ? this.extensionCategory(category) : ''))} + {Object.keys(categories).map((category) => !!this.categorizedExtensions[category] && this.extensionCategory(category))}
); } @@ -41,7 +41,7 @@ export default class ExtensionsWidget extends DashboardWidget {
- {extension.icon ? icon(extension.icon.name) : ''} + {!!extension.icon && icon(extension.icon.name)} {extension.extra['flarum-extension'].title}
diff --git a/js/src/admin/components/LoadingModal.tsx b/js/src/admin/components/LoadingModal.tsx index 082efd002..36f223ff3 100644 --- a/js/src/admin/components/LoadingModal.tsx +++ b/js/src/admin/components/LoadingModal.tsx @@ -18,7 +18,7 @@ export default class LoadingModal ( {scope.label}{' '} - {scope.onremove - ? Button.component({ icon: 'fas fa-times', className: 'Button Button--text PermissionGrid-removeScope', onclick: scope.onremove }) - : ''} + {!!scope.onremove && + Button.component({ icon: 'fas fa-times', className: 'Button Button--text PermissionGrid-removeScope', onclick: scope.onremove })} ))} {this.scopeControlItems().toArray()} diff --git a/js/src/admin/components/UserListPage.tsx b/js/src/admin/components/UserListPage.tsx index 3502a24f9..a74694f1d 100644 --- a/js/src/admin/components/UserListPage.tsx +++ b/js/src/admin/components/UserListPage.tsx @@ -175,7 +175,7 @@ export default class UserListPage extends AdminPage { 'id', { name: app.translator.trans('core.admin.users.grid.columns.user_id.title'), - content: (user: User) => user.id() ?? '', + content: (user: User) => user.id() ?? null, }, 100 ); diff --git a/js/src/common/components/Dropdown.js b/js/src/common/components/Dropdown.js index 6ed232c94..bca00ac7f 100644 --- a/js/src/common/components/Dropdown.js +++ b/js/src/common/components/Dropdown.js @@ -128,9 +128,9 @@ export default class Dropdown extends Component { */ getButtonContent(children) { return [ - this.attrs.icon ? icon(this.attrs.icon, { className: 'Button-icon' }) : '', + !!this.attrs.icon && icon(this.attrs.icon, { className: 'Button-icon' }), {this.attrs.label}, - this.attrs.caretIcon ? icon(this.attrs.caretIcon, { className: 'Button-caret' }) : '', + !!this.attrs.caretIcon && icon(this.attrs.caretIcon, { className: 'Button-caret' }), ]; } diff --git a/js/src/common/components/EditUserModal.tsx b/js/src/common/components/EditUserModal.tsx index 994d6b8b3..b9d64fa36 100644 --- a/js/src/common/components/EditUserModal.tsx +++ b/js/src/common/components/EditUserModal.tsx @@ -89,7 +89,7 @@ export default class EditUserModal - {!this.isEmailConfirmed() && this.userIsAdmin(app.session.user) ? ( + {!this.isEmailConfirmed() && this.userIsAdmin(app.session.user) && (
{Button.component( { @@ -100,8 +100,6 @@ export default class EditUserModal - ) : ( - '' )}
, 30 @@ -126,7 +124,7 @@ export default class EditUserModal {app.translator.trans('core.lib.edit_user.set_password_label')} - {this.setPassword() ? ( + {this.setPassword() && ( - ) : ( - '' )} , diff --git a/js/src/common/components/Modal.tsx b/js/src/common/components/Modal.tsx index b8656860d..46c2a7591 100644 --- a/js/src/common/components/Modal.tsx +++ b/js/src/common/components/Modal.tsx @@ -105,7 +105,7 @@ export default abstract class Modal{this.title()} - {this.alertAttrs ?
{Alert.component(this.alertAttrs)}
: ''} + {!!this.alertAttrs &&
{Alert.component(this.alertAttrs)}
} {this.content()} diff --git a/js/src/common/components/Navigation.js b/js/src/common/components/Navigation.js index 140ca43d8..faac76736 100644 --- a/js/src/common/components/Navigation.js +++ b/js/src/common/components/Navigation.js @@ -65,7 +65,7 @@ export default class Navigation extends Component { getPaneButton() { const { pane } = app; - if (!pane || !pane.active) return ''; + if (!pane || !pane.active) return null; return Button.component({ className: 'Button Button--icon Navigation-pin' + (pane.pinned ? ' active' : ''), @@ -81,7 +81,7 @@ export default class Navigation extends Component { * @protected */ getDrawerButton() { - if (!this.attrs.drawer) return ''; + if (!this.attrs.drawer) return null; const { drawer } = app; const user = app.session.user; diff --git a/js/src/common/components/RequestErrorModal.tsx b/js/src/common/components/RequestErrorModal.tsx index 895ef5acc..d3dc6ac53 100644 --- a/js/src/common/components/RequestErrorModal.tsx +++ b/js/src/common/components/RequestErrorModal.tsx @@ -12,7 +12,7 @@ export default class RequestErrorModal
    {listItems(this.controlItems().toArray())}
- {body.componentClass ? body.componentClass.component({ ...body.attrs, composer: this.state, disabled: classes.minimized }) : ''} + {!!body.componentClass && body.componentClass.component({ ...body.attrs, composer: this.state, disabled: classes.minimized })}
); diff --git a/js/src/forum/components/LogInModal.tsx b/js/src/forum/components/LogInModal.tsx index 976cec7ad..d562ed5c9 100644 --- a/js/src/forum/components/LogInModal.tsx +++ b/js/src/forum/components/LogInModal.tsx @@ -125,17 +125,16 @@ export default class LogInModal - {app.translator.trans('core.forum.log_in.forgot_password_link')} -

, - - app.forum.attribute('allowSignUp') ? ( -

{app.translator.trans('core.forum.log_in.sign_up_text', { a: })}

- ) : ( - '' - ), - ]; + return ( + <> +

+ {app.translator.trans('core.forum.log_in.forgot_password_link')} +

+ {!!app.forum.attribute('allowSignUp') && ( +

{app.translator.trans('core.forum.log_in.sign_up_text', { a: })}

+ )} + + ); } /** diff --git a/js/src/forum/components/NotificationList.js b/js/src/forum/components/NotificationList.js index 8c63fc328..65cf5852b 100644 --- a/js/src/forum/components/NotificationList.js +++ b/js/src/forum/components/NotificationList.js @@ -96,7 +96,7 @@ export default class NotificationList extends Component {
    {group.notifications.map((notification) => { const NotificationComponent = app.notificationComponents[notification.contentType()]; - return NotificationComponent ?
  • {NotificationComponent.component({ notification })}
  • : ''; + return !!NotificationComponent &&
  • {NotificationComponent.component({ notification })}
  • ; })}
diff --git a/js/src/forum/components/Post.js b/js/src/forum/components/Post.js index b36b75c7f..5e45bda6d 100644 --- a/js/src/forum/components/Post.js +++ b/js/src/forum/components/Post.js @@ -59,7 +59,7 @@ export default class Post extends Component { @@ -114,7 +112,7 @@ export default class Post extends Component { * @return {Array} */ content() { - return []; + return null; } /** @@ -124,7 +122,10 @@ export default class Post extends Component { * @returns {string[]} */ classes(existing) { - let classes = (existing || '').split(' ').concat(['Post']); + const classes = (existing || '') + .split(' ') + .filter((x) => x.trim() !== '') + .concat(['Post']); const user = this.attrs.post.user(); const discussion = this.attrs.post.discussion(); diff --git a/js/src/forum/components/PostMeta.js b/js/src/forum/components/PostMeta.js index cbf2234ed..7e7430644 100644 --- a/js/src/forum/components/PostMeta.js +++ b/js/src/forum/components/PostMeta.js @@ -55,6 +55,6 @@ export default class PostMeta extends Component { * @returns {String} */ getPermalink(post) { - return window.location.origin + app.route.post(post); + return app.forum.attribute('baseUrl') + app.route.post(post); } } diff --git a/js/src/forum/components/PostPreview.js b/js/src/forum/components/PostPreview.js index 5293bd3c1..3e25b89d5 100644 --- a/js/src/forum/components/PostPreview.js +++ b/js/src/forum/components/PostPreview.js @@ -18,7 +18,7 @@ export default class PostPreview extends Component { const post = this.attrs.post; const user = post.user(); const content = post.contentType() === 'comment' && post.contentPlain(); - const excerpt = content ? highlight(content, this.attrs.highlight, 300) : ''; + const excerpt = !!content && highlight(content, this.attrs.highlight, 300); return ( diff --git a/js/src/forum/components/PostUser.js b/js/src/forum/components/PostUser.js index d0b71c200..2cb17e6b4 100644 --- a/js/src/forum/components/PostUser.js +++ b/js/src/forum/components/PostUser.js @@ -29,7 +29,10 @@ export default class PostUser extends Component { ); } - let card = ''; + /** + * @type {import('mithril').Children} + */ + let card = null; if (!post.isHidden() && this.attrs.cardVisible) { card = UserCard.component({ diff --git a/js/src/forum/components/UserCard.js b/js/src/forum/components/UserCard.js index bb9a39862..b086536f7 100644 --- a/js/src/forum/components/UserCard.js +++ b/js/src/forum/components/UserCard.js @@ -34,19 +34,18 @@ export default class UserCard extends Component {
- {controls.length - ? Dropdown.component( - { - className: 'UserCard-controls App-primaryControl', - menuClassName: 'Dropdown-menu--right', - buttonClassName: this.attrs.controlsButtonClassName, - label: app.translator.trans('core.forum.user_controls.button'), - accessibleToggleLabel: app.translator.trans('core.forum.user_controls.toggle_dropdown_accessible_label'), - icon: 'fas fa-ellipsis-v', - }, - controls - ) - : ''} + {!!controls.length && + Dropdown.component( + { + className: 'UserCard-controls App-primaryControl', + menuClassName: 'Dropdown-menu--right', + buttonClassName: this.attrs.controlsButtonClassName, + label: app.translator.trans('core.forum.user_controls.button'), + accessibleToggleLabel: app.translator.trans('core.forum.user_controls.toggle_dropdown_accessible_label'), + icon: 'fas fa-ellipsis-v', + }, + controls + )}

@@ -60,7 +59,7 @@ export default class UserCard extends Component { )}

- {badges.length ?
    {listItems(badges)}
: ''} + {!!badges.length &&
    {listItems(badges)}
}
    {listItems(this.infoItems().toArray())}
diff --git a/js/src/forum/states/ComposerState.js b/js/src/forum/states/ComposerState.js index afa46f714..a1e02d4e5 100644 --- a/js/src/forum/states/ComposerState.js +++ b/js/src/forum/states/ComposerState.js @@ -260,7 +260,7 @@ class ComposerState { // let the CSS decide how high it is. If it's fullscreen, then we need to // make it as high as the window. if (this.position === ComposerState.Position.MINIMIZED) { - return ''; + return null; } else if (this.position === ComposerState.Position.FULLSCREEN) { return $(window).height(); }