mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-01 22:02:11 +03:00
da49dc4922
refs https://github.com/TryGhost/Team/issues/496 reqs https://github.com/TryGhost/Ghost/pull/12925 The publish menu was meant to default to matching post visibility but that wasn't working consistently and didn't make sense for sites which don't email every post to their members. A "Default newsletter recipients" option has been added to the "Email newsletter" settings screen and the publish menu updated to reflect the option. The free/paid toggles in the publish menu have also been swapped out for a multi-select style component that will cater to more complex member segmentation.
76 lines
2.2 KiB
JavaScript
76 lines
2.2 KiB
JavaScript
import Ember from 'ember';
|
|
import RSVP from 'rsvp';
|
|
import Service, {inject as service} from '@ember/service';
|
|
import ValidationEngine from 'ghost-admin/mixins/validation-engine';
|
|
import {get} from '@ember/object';
|
|
|
|
// ember-cli-shims doesn't export _ProxyMixin
|
|
const {_ProxyMixin} = Ember;
|
|
|
|
export default Service.extend(_ProxyMixin, ValidationEngine, {
|
|
store: service(),
|
|
|
|
// will be set to the single Settings model, it's a reference so any later
|
|
// changes to the settings object in the store will be reflected
|
|
content: null,
|
|
|
|
validationType: 'setting',
|
|
_loadingPromise: null,
|
|
|
|
// this is an odd case where we only want to react to changes that we get
|
|
// back from the API rather than local updates
|
|
settledIcon: '',
|
|
|
|
// the settings API endpoint is a little weird as it's singular and we have
|
|
// to pass in all types - if we ever fetch settings without all types then
|
|
// save we have problems with the missing settings being removed or reset
|
|
_loadSettings() {
|
|
if (!this._loadingPromise) {
|
|
this._loadingPromise = this.store
|
|
.queryRecord('setting', {group: 'site,theme,private,members,portal,newsletter,email,amp,labs,slack,unsplash,views,firstpromoter,oauth,editor'})
|
|
.then((settings) => {
|
|
this._loadingPromise = null;
|
|
return settings;
|
|
});
|
|
}
|
|
|
|
return this._loadingPromise;
|
|
},
|
|
|
|
fetch() {
|
|
if (!this.content) {
|
|
return this.reload();
|
|
} else {
|
|
return RSVP.resolve(this);
|
|
}
|
|
},
|
|
|
|
reload() {
|
|
return this._loadSettings().then((settings) => {
|
|
this.set('content', settings);
|
|
this.set('settledIcon', get(settings, 'icon'));
|
|
return this;
|
|
});
|
|
},
|
|
|
|
async save() {
|
|
let settings = this.content;
|
|
|
|
if (!settings) {
|
|
return false;
|
|
}
|
|
|
|
await settings.save();
|
|
this.set('settledIcon', settings.icon);
|
|
return settings;
|
|
},
|
|
|
|
rollbackAttributes() {
|
|
return this.content?.rollbackAttributes();
|
|
},
|
|
|
|
changedAttributes() {
|
|
return this.content?.changedAttributes();
|
|
}
|
|
});
|