Ghost/ghost/admin/app/routes/lexical-editor.js
Kevin Ansfield 7b443d4b63 Removed need for .get() with config service
no issue

The `config` service has been a source of confusion when writing with modern Ember patterns because it's use of the deprecated `ProxyMixin` forced all property access/setting to go via `.get()` and `.set()` whereas the rest of the system has mostly (there are a few other uses of ProxyObjects remaining) eliminated the use of the non-native get/set methods.

- removed use of `ProxyMixin` in the `config` service by grabbing the API response after fetching and using `Object.defineProperty()` to add native getters/setters that pass through to a tracked object holding the API response data. Ember's autotracking automatically works across the native getters/setters so we can then use the service as if it was any other native object
- updated all code to use `config.{attrName}` directly for getting/setting instead of `.get()` and `.set()`
- removed unnecessary async around `config.availableTimezones` which wasn't making any async calls
2022-10-07 16:14:57 +01:00

75 lines
2.0 KiB
JavaScript

import $ from 'jquery';
import AuthenticatedRoute from 'ghost-admin/routes/authenticated';
import {run} from '@ember/runloop';
import {inject as service} from '@ember/service';
export default AuthenticatedRoute.extend({
config: service(),
feature: service(),
notifications: service(),
router: service(),
ui: service(),
classNames: ['editor'],
beforeModel() {
if (!this.config.editor?.url) {
return this.router.transitionTo('posts');
}
},
activate() {
this._super(...arguments);
this.ui.set('isFullScreen', true);
},
deactivate() {
this._super(...arguments);
this.ui.set('isFullScreen', false);
},
actions: {
save() {
this._blurAndScheduleAction(function () {
this.controller.send('save');
});
},
authorizationFailed() {
this.controller.send('toggleReAuthenticateModal');
},
willTransition(transition) {
// exit early if an upgrade is required because our extended route
// class will abort the transition and show an error
if (this.get('upgradeStatus.isRequired')) {
return this._super(...arguments);
}
this.controller.willTransition(transition);
}
},
buildRouteInfoMetadata() {
return {
titleToken: () => {
return this.get('controller.post.title') || 'Editor';
},
bodyClasses: ['gh-body-fullscreen'],
mainClasses: ['gh-main-white']
};
},
_blurAndScheduleAction(func) {
let selectedElement = $(document.activeElement);
// TODO: we should trigger a blur for textareas as well as text inputs
if (selectedElement.is('input[type="text"]')) {
selectedElement.trigger('focusout');
}
// wait for actions triggered by the focusout to finish before saving
run.scheduleOnce('actions', this, func);
}
});