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"> <div class="gh-publish-setting-title">
{{svg-jar "member"}} {{svg-jar "member"}}
<div class="gh-publish-setting-trigger"> <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}} {{#unless @data.publishOptions.onlyDefaultNewsletter}}
<span> <span>{{@data.publishOptions.newsletter.name}}</span>
Charts of the Week
</span>
{{/unless}} {{/unless}}
subscribers subscribers
</div> </div>

View File

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