Ghost/ghost/admin/app/controllers/posts.js
Simon Backx 1a8f7e6972 Fixed labs not working on posts page initial load
no issue

When reloading the posts page, the labs settings wouldn't work. The 'feature' service labs property would try to JSON.parse an undefined labs setting (settings.labs === undefined) because settings wasn't loaded yet. After loading the settings, it wouldn't update because Ember's 'computed' decorator isn't able to watch this.

This was all caused by trying to access the emailAnalytics feature in the controller's constructor (this feature doesn't exist any longer). Removing this fixed the issue.

We probably need some protection for this in the future.
2022-10-26 16:03:02 +02:00

167 lines
3.7 KiB
JavaScript

import Controller from '@ember/controller';
import {DEFAULT_QUERY_PARAMS} from 'ghost-admin/helpers/reset-query-params';
import {action} from '@ember/object';
import {inject as service} from '@ember/service';
import {tracked} from '@glimmer/tracking';
const TYPES = [{
name: 'All posts',
value: null
}, {
name: 'Draft posts',
value: 'draft'
}, {
name: 'Published posts',
value: 'published'
}, {
name: 'Scheduled posts',
value: 'scheduled'
}, {
name: 'Featured posts',
value: 'featured'
}];
const VISIBILITIES = [{
name: 'All access',
value: null
}, {
name: 'Public',
value: 'public'
}, {
name: 'Members-only',
value: 'members'
}, {
name: 'Paid members-only',
value: 'paid'
}];
const ORDERS = [{
name: 'Newest first',
value: null
}, {
name: 'Oldest first',
value: 'published_at asc'
}, {
name: 'Recently updated',
value: 'updated_at desc'
}];
export default class PostsController extends Controller {
@service config;
@service feature;
@service router;
@service session;
@service store;
// default values for these are set in constructor and defined in `helpers/reset-query-params`
queryParams = ['type', 'visibility', 'author', 'tag', 'order'];
@tracked type = null;
@tracked visibility = null;
@tracked author = null;
@tracked tag = null;
@tracked order = null;
availableTypes = TYPES;
availableVisibilities = VISIBILITIES;
availableOrders = ORDERS;
_availableTags = this.store.peekAll('tag');
_availableAuthors = this.store.peekAll('user');
_hasLoadedTags = false;
_hasLoadedAuthors = false;
constructor() {
super(...arguments);
Object.assign(this, DEFAULT_QUERY_PARAMS.posts);
}
get postsInfinityModel() {
return this.model;
}
get showingAll() {
const {type, author, tag, visibility} = this;
return !type && !visibility && !author && !tag;
}
get selectedType() {
return this.availableTypes.findBy('value', this.type) || {value: '!unknown'};
}
get selectedVisibility() {
return this.availableVisibilities.findBy('value', this.visibility) || {value: '!unknown'};
}
get selectedOrder() {
return this.availableOrders.findBy('value', this.order) || {value: '!unknown'};
}
get availableTags() {
const tags = this._availableTags
.filter(tag => tag.get('id') !== null)
.sort((tagA, tagB) => tagA.name.localeCompare(tagB.name, undefined, {ignorePunctuation: true}));
const options = tags.toArray();
options.unshift({name: 'All tags', slug: null});
return options;
}
get selectedTag() {
const tag = this.tag;
const tags = this.availableTags;
return tags.findBy('slug', tag) || {slug: '!unknown'};
}
get availableAuthors() {
const authors = this._availableAuthors;
const options = authors.toArray();
options.unshift({name: 'All authors', slug: null});
return options;
}
get selectedAuthor() {
let author = this.author;
let authors = this.availableAuthors;
return authors.findBy('slug', author) || {slug: '!unknown'};
}
@action
changeType(type) {
this.type = type.value;
}
@action
changeVisibility(visibility) {
this.visibility = visibility.value;
}
@action
changeAuthor(author) {
this.author = author.slug;
}
@action
changeTag(tag) {
this.tag = tag.slug;
}
@action
changeOrder(order) {
this.order = order.value;
}
@action
openEditor(post) {
this.router.transitionTo('editor.edit', 'post', post.id);
}
}