Switched per-user custom views to shared custom views

requires fdeb7daf40

- swapped to using settings model for storing custom views instead of user accessibility field
- added conditional that checks current user is an admin/owner when displaying the manage custom views button in the content filter (only admins/owners can edit settings model)
  - passed `session.user` into the `<GhContentFilter>` component as an argument so that the conditional getter doesn't need to handle async user access
- fixed no-shadow linting error in settings service
This commit is contained in:
Kevin Ansfield 2020-06-04 21:30:06 +01:00
parent e31ae2f3fa
commit 4a53587f3b
11 changed files with 39 additions and 22 deletions

View File

@ -1,5 +1,5 @@
<div class="gh-contentfilter" ...attributes>
{{#unless this.session.user.isContributor}}
{{#unless @currentUser.isContributor}}
<div class="gh-contentfilter-menu gh-contentfilter-type {{if @selectedType.value "gh-contentfilter-selected"}}" data-test-type-select="true">
<PowerSelect
@selected={{@selectedType}}
@ -17,7 +17,7 @@
</div>
{{/unless}}
{{#unless this.session.user.isAuthorOrContributor}}
{{#unless @currentUser.isAuthorOrContributor}}
<div class="gh-contentfilter-menu gh-contentfilter-author {{if @selectedAuthor.slug "gh-contentfilter-selected"}}" data-test-author-select="true">
<PowerSelect
@selected={{@selectedAuthor}}
@ -36,7 +36,7 @@
</div>
{{/unless}}
{{#unless this.session.user.isContributor}}
{{#unless @currentUser.isContributor}}
<div class="gh-contentfilter-menu gh-contentfilter-tag {{if @selectedTag.slug "gh-contentfilter-selected"}}" data-test-tag-select="true">
<PowerSelect
@selected={{@selectedTag}}
@ -72,7 +72,7 @@
</PowerSelect>
</div>
{{#if (and (eq this.router.currentRouteName "posts") (or @selectedType.value @selectedAuthor.slug @selectedTag.slug @selectedOrder.value) (not this.customViews.activeView.isDefault))}}
{{#if this.showCustomViewManagement}}
<div class="dropdown gh-contentfilter-menu gh-contentfilter-actions">
{{#if this.customViews.activeView}}
<button

View File

@ -1,10 +1,22 @@
import Component from '@glimmer/component';
import {get} from '@ember/object';
import {inject as service} from '@ember/service';
export default class GhContentfilterComponent extends Component {
@service customViews;
@service router;
@service session;
get showCustomViewManagement() {
let isOwnerOrAdmin = get(this.args.currentUser || {}, 'isOwnerOrAdmin');
let onPostsScreen = this.router.currentRouteName === 'posts';
let isDefaultView = this.customViews?.activeView?.isDefault;
let hasFilter = this.args.selectedType.value
|| this.args.selectedAuthor.slug
|| this.args.selectedTag.slug
|| this.args.selectedOrder.value;
return isOwnerOrAdmin && onPostsScreen && !isDefaultView && hasFilter;
}
calculateActionsDropdownPosition(trigger, content) {
let {top, left, width, height} = trigger.getBoundingClientRect();

View File

@ -52,7 +52,7 @@
class="gh-btn"
{{action "closeModal"}}
{{!-- disable mouseDown so it doesn't trigger focus-out validations --}}
{{action (optional this.noop) on="mouseDown"}}
{{on "mousedown" (optional this.noop)}}
data-test-button="cancel-custom-view-form"
>
<span>Cancel</span>

View File

@ -34,7 +34,7 @@ const ORDERS = [{
}];
export default Controller.extend({
session: service(),
store: service(),
// default values for these are set in `init` and defined in `helpers/reset-query-params`

View File

@ -41,5 +41,6 @@ export default Model.extend(ValidationEngine, {
ogTitle: attr('string'),
ogDescription: attr('string'),
ogImage: attr('string'),
bulkEmailSettings: attr('json-string')
bulkEmailSettings: attr('json-string'),
sharedViews: attr('string')
});

View File

@ -105,6 +105,7 @@ let isViewEqual = function (viewA, viewB) {
export default class CustomViewsService extends Service {
@service router;
@service session;
@service settings;
@tracked viewList = [];
@tracked showFormModal = false;
@ -115,22 +116,24 @@ export default class CustomViewsService extends Service {
}
// eslint-disable-next-line ghost/ember/no-observers
@observes('session.isAuthenticated', 'session.user.accessibility')
@observes('settings.sharedViews', 'session.isAuthenticated')
async updateViewList() {
let {settings, session} = this;
// avoid fetching user before authenticated otherwise the 403 can fire
// during authentication and cause errors during setup/signin
if (!this.session.isAuthenticated) {
if (!session.isAuthenticated) {
return;
}
let user = await this.session.user;
let views = JSON.parse(user.get('accessibility') || '{}').views;
let views = JSON.parse(settings.get('sharedViews') || '{}');
views = isArray(views) ? views : [];
let viewList = [];
// contributors can only see their own draft posts so it doesn't make
// sense to show them default views which change the status/type filter
let user = await session.user;
if (!user.isContributor) {
viewList.push(...DEFAULT_VIEWS);
}
@ -232,10 +235,8 @@ export default class CustomViewsService extends Service {
}
async _saveViewSettings() {
let user = await this.session.user;
let userSettings = JSON.parse(user.get('accessibility')) || {};
userSettings.views = this.viewList.reject(view => view.isDefault).map(view => view.toJSON());
user.set('accessibility', JSON.stringify(userSettings));
return user.save();
let sharedViews = this.viewList.reject(view => view.isDefault).map(view => view.toJSON());
this.settings.set('sharedViews', JSON.stringify(sharedViews));
return this.settings.save();
}
}

View File

@ -53,17 +53,16 @@ export default Service.extend(_ProxyMixin, ValidationEngine, {
});
},
save() {
async save() {
let settings = this.content;
if (!settings) {
return false;
}
return settings.save().then((settings) => {
this.set('settledIcon', get(settings, 'icon'));
return settings;
});
await settings.save();
this.set('settledIcon', settings.icon);
return settings;
},
rollbackAttributes() {

View File

@ -3,6 +3,7 @@
<GhCustomViewTitle @title="Pages" @query={{reset-query-params "posts"}} />
<section class="view-actions">
<GhContentfilter
@currentUser={{this.session.user}}
@selectedType={{this.selectedType}}
@availableTypes={{this.availableTypes}}
@onTypeChange={{action (mut k)}}

View File

@ -4,6 +4,7 @@
<section class="view-actions">
<GhContentfilter
@currentUser={{this.session.user}}
@selectedType={{this.selectedType}}
@availableTypes={{this.availableTypes}}
@onTypeChange={{action "changeType"}}

View File

@ -3,6 +3,7 @@
<GhCustomViewTitle @title="Posts" @query={{reset-query-params "posts"}} />
<section class="view-actions">
<GhContentfilter
@currentUser={{this.session.user}}
@selectedType={{this.selectedType}}
@availableTypes={{this.availableTypes}}
@onTypeChange={{action (mut k)}}

View File

@ -4,6 +4,7 @@
<section class="view-actions">
<GhContentfilter
@currentUser={{this.session.user}}
@selectedType={{this.selectedType}}
@availableTypes={{this.availableTypes}}
@onTypeChange={{action "changeType"}}