Fixed PublishOptions newsletter setup

refs https://github.com/TryGhost/Team/issues/1542

- assigning the result of `peekAll('newsletter').filter()` to `newsletters` doesn't work because the live peekAll array gets transformed to a static array so it was always blank
  - assigned result of `peekAll('newsletter')` to `allNewsletters` and replaced `newsletters` property with a getter that uses `allNewsletters` to return an array of filtered and sorted newsletters
- fixed incorrect sort order for `defaultNewsletter`
- assigned default newsletter to tracked `newsletter` property as part of setup once newsletters have been fetched
- updated publish-flow template to show a real count and newsletter name
This commit is contained in:
Kevin Ansfield 2022-04-28 11:50:05 +01:00
parent 7ea5bdcdf8
commit 357bbf56cf
2 changed files with 23 additions and 10 deletions

View File

@ -33,11 +33,11 @@
<div class="gh-publish-setting-title">
{{svg-jar "member"}}
<div class="gh-publish-setting-trigger">
235
{{#let (members-count-fetcher query=(hash filter=@data.publishOptions.recipientFilter)) as |countFetcher|}}
{{countFetcher.count}}
{{/let}}
{{#unless @data.publishOptions.onlyDefaultNewsletter}}
<span>
Charts of the Week
</span>
<span>{{@data.publishOptions.newsletter.name}}</span>
{{/unless}}
subscribers
</div>

View File

@ -112,19 +112,30 @@ export class PublishOptions {
this.publishType = newValue;
}
// newsletter --------------------------------------------------------------
// recipients --------------------------------------------------------------
newsletters = []; // set in constructor
// set in constructor because services are not injected
allNewsletters = [];
@tracked newsletter = null; // set to default in constructor
get newsletters() {
return this.allNewsletters
.filter(n => n.status === 'active')
.sort(({sortOrder: a}, {sortOrder: b}) => a - b);
}
get defaultNewsletter() {
return this.newsletters.sort(({sortOrder: a}, {sortOrder: b}) => b - a)[0];
return this.newsletters[0];
}
get onlyDefaultNewsletter() {
return this.newsletters.length === 1;
}
// recipients --------------------------------------------------------------
get recipientFilter() {
return `newsletters:${this.newsletter.slug}`;
}
// setup -------------------------------------------------------------------
@ -138,7 +149,7 @@ export class PublishOptions {
// these need to be set here rather than class-level properties because
// unlike Ember-based classes the services are not injected so can't be
// used until after they are assigned above
this.newsletters = this.store.peekAll('newsletter').filter(n => n.status === 'active');
this.allNewsletters = this.store.peekAll('newsletter');
this.setupTask.perform();
}
@ -149,6 +160,8 @@ export class PublishOptions {
// TODO: set up initial state / defaults
this.newsletter = this.defaultNewsletter;
if (this.emailUnavailable || this.emailDisabled) {
this.publishType = 'publish';
}
@ -163,7 +176,7 @@ export class PublishOptions {
// TODO: query limit service
// newsletters
const fetchNewsletters = this.store.findAll('newsletter', {reload: true});
const fetchNewsletters = this.store.query('newsletter', {status: 'active', limit: 'all'});
yield Promise.all([countTotalMembers, fetchNewsletters]);
}