diff --git a/js/src/admin/components/EditCustomCssModal.js b/js/src/admin/components/EditCustomCssModal.js index c7686b085..bd855d545 100644 --- a/js/src/admin/components/EditCustomCssModal.js +++ b/js/src/admin/components/EditCustomCssModal.js @@ -2,7 +2,7 @@ import SettingsModal from './SettingsModal'; export default class EditCustomCssModal extends SettingsModal { className() { - return 'EditCustomCssModal Modal--large'; + return 'EditCustomCssModal TextareaCodeModal Modal--large'; } title() { diff --git a/js/src/admin/components/EditCustomFooterModal.js b/js/src/admin/components/EditCustomFooterModal.js index 88d97535e..43cfd29d4 100644 --- a/js/src/admin/components/EditCustomFooterModal.js +++ b/js/src/admin/components/EditCustomFooterModal.js @@ -2,7 +2,7 @@ import SettingsModal from './SettingsModal'; export default class EditCustomFooterModal extends SettingsModal { className() { - return 'EditCustomFooterModal Modal--large'; + return 'EditCustomFooterModal TextareaCodeModal Modal--large'; } title() { diff --git a/js/src/admin/components/EditCustomHeaderModal.js b/js/src/admin/components/EditCustomHeaderModal.js index 24625cbd7..11a1f8d4e 100644 --- a/js/src/admin/components/EditCustomHeaderModal.js +++ b/js/src/admin/components/EditCustomHeaderModal.js @@ -2,7 +2,7 @@ import SettingsModal from './SettingsModal'; export default class EditCustomHeaderModal extends SettingsModal { className() { - return 'EditCustomHeaderModal Modal--large'; + return 'EditCustomHeaderModal TextareaCodeModal Modal--large'; } title() { diff --git a/js/src/forum/components/NotificationList.js b/js/src/forum/components/NotificationList.js index 22a337efa..be100e780 100644 --- a/js/src/forum/components/NotificationList.js +++ b/js/src/forum/components/NotificationList.js @@ -12,7 +12,6 @@ import Discussion from '../../common/models/Discussion'; export default class NotificationList extends Component { view() { const state = this.attrs.state; - const pages = state.getPages(); return (
@@ -29,72 +28,73 @@ export default class NotificationList extends Component {
-
- {state.hasItems() - ? pages.map((page) => { - const groups = []; - const discussions = {}; - - page.items.forEach((notification) => { - const subject = notification.subject(); - - if (typeof subject === 'undefined') return; - - // Get the discussion that this notification is related to. If it's not - // directly related to a discussion, it may be related to a post or - // other entity which is related to a discussion. - let discussion = null; - if (subject instanceof Discussion) discussion = subject; - else if (subject && subject.discussion) discussion = subject.discussion(); - - // If the notification is not related to a discussion directly or - // indirectly, then we will assign it to a neutral group. - const key = discussion ? discussion.id() : 0; - discussions[key] = discussions[key] || { discussion: discussion, notifications: [] }; - discussions[key].notifications.push(notification); - - if (groups.indexOf(discussions[key]) === -1) { - groups.push(discussions[key]); - } - }); - - return groups.map((group) => { - const badges = group.discussion && group.discussion.badges().toArray(); - - return ( -
- {group.discussion ? ( - - {badges && badges.length && } - {group.discussion.title()} - - ) : ( -
{app.forum.attribute('title')}
- )} - - -
- ); - }); - }) - : ''} - {state.isLoading() ? ( - - ) : pages.length ? ( - '' - ) : ( -
{app.translator.trans('core.forum.notifications.empty_text')}
- )} -
+
{this.content(state)}
); } + content(state) { + if (state.isLoading()) { + return ; + } + + if (state.hasItems()) { + return state.getPages().map((page) => { + const groups = []; + const discussions = {}; + + page.items.forEach((notification) => { + const subject = notification.subject(); + + if (typeof subject === 'undefined') return; + + // Get the discussion that this notification is related to. If it's not + // directly related to a discussion, it may be related to a post or + // other entity which is related to a discussion. + let discussion = null; + if (subject instanceof Discussion) discussion = subject; + else if (subject && subject.discussion) discussion = subject.discussion(); + + // If the notification is not related to a discussion directly or + // indirectly, then we will assign it to a neutral group. + const key = discussion ? discussion.id() : 0; + discussions[key] = discussions[key] || { discussion: discussion, notifications: [] }; + discussions[key].notifications.push(notification); + + if (groups.indexOf(discussions[key]) === -1) { + groups.push(discussions[key]); + } + }); + + return groups.map((group) => { + const badges = group.discussion && group.discussion.badges().toArray(); + + return ( +
+ {group.discussion ? ( + + {badges && !!badges.length && } + {group.discussion.title()} + + ) : ( +
{app.forum.attribute('title')}
+ )} + + +
+ ); + }); + }); + } + + return
{app.translator.trans('core.forum.notifications.empty_text')}
; + } + oncreate(vnode) { super.oncreate(vnode); diff --git a/js/src/forum/utils/KeyboardNavigatable.ts b/js/src/forum/utils/KeyboardNavigatable.ts index 1e9dc5568..739a590fc 100644 --- a/js/src/forum/utils/KeyboardNavigatable.ts +++ b/js/src/forum/utils/KeyboardNavigatable.ts @@ -104,7 +104,9 @@ export default class KeyboardNavigatable { * Provide a callback that determines whether keyboard input should be handled. */ when(callback: ShouldHandle): KeyboardNavigatable { - return { ...this, whenCallback: callback }; + this.whenCallback = callback; + + return this; } /** diff --git a/less/admin/AppearancePage.less b/less/admin/AppearancePage.less index 18b5a46e7..0e7ba3471 100644 --- a/less/admin/AppearancePage.less +++ b/less/admin/AppearancePage.less @@ -37,7 +37,7 @@ margin-bottom: 15px; } -.EditCustomCssModal, .EditCustomHeaderModal { +.TextareaCodeModal { textarea { font-family: monospace; line-height: 1; diff --git a/src/User/Command/EditUserHandler.php b/src/User/Command/EditUserHandler.php index cdf183e51..51cdd6264 100644 --- a/src/User/Command/EditUserHandler.php +++ b/src/User/Command/EditUserHandler.php @@ -130,6 +130,7 @@ class EditUserHandler $user->afterSave(function (User $user) use ($newGroupIds) { $user->groups()->sync($newGroupIds); + $user->unsetRelation('groups'); }); }