From ed843718b2e5e55e71c5ca024b62ad470d2a11ba Mon Sep 17 00:00:00 2001 From: Austin Burdine Date: Mon, 13 Mar 2017 22:27:57 -0500 Subject: [PATCH] fix(psm): fix author dropdown in post-settings-menu closes https://github.com/TryGhost/Ghost/issues/8122 - because the PSM is now a component, some of the component lifecycle hooks can be employed to load things --- .../app/components/gh-post-settings-menu.js | 40 +++++++------------ .../components/gh-post-settings-menu.hbs | 2 +- ghost/admin/mirage/config/posts.js | 13 +++++- ghost/admin/tests/acceptance/editor-test.js | 26 ++++++++++++ 4 files changed, 53 insertions(+), 28 deletions(-) diff --git a/ghost/admin/app/components/gh-post-settings-menu.js b/ghost/admin/app/components/gh-post-settings-menu.js index d062f988d4..a965891493 100644 --- a/ghost/admin/app/components/gh-post-settings-menu.js +++ b/ghost/admin/app/components/gh-post-settings-menu.js @@ -4,7 +4,6 @@ import computed, {alias} from 'ember-computed'; import {guidFor} from 'ember-metal/utils'; import injectService from 'ember-service/inject'; import {htmlSafe} from 'ember-string'; -import observer from 'ember-metal/observer'; import {invokeAction} from 'ember-invoke-action'; @@ -13,10 +12,11 @@ import SettingsMenuMixin from 'ghost-admin/mixins/settings-menu-component'; import boundOneWay from 'ghost-admin/utils/bound-one-way'; import isNumber from 'ghost-admin/utils/isNumber'; -const {ArrayProxy, Handlebars, PromiseProxyMixin} = Ember; +const {Handlebars} = Ember; export default Component.extend(SettingsMenuMixin, { selectedAuthor: null, + authors: [], store: injectService(), config: injectService(), @@ -26,34 +26,22 @@ export default Component.extend(SettingsMenuMixin, { session: injectService(), timeZone: injectService(), - initializeSelectedAuthor: observer('model', function () { - return this.get('model.author').then((author) => { - this.set('selectedAuthor', author); - return author; - }); - }), - - authors: computed(function () { - // Loaded asynchronously, so must use promise proxies. - let deferred = {}; - - deferred.promise = this.get('store').query('user', {limit: 'all'}).then((users) => { - return users.rejectBy('id', 'me').sortBy('name'); - }).then((users) => { - return users.filter((user) => { - return user.get('active'); - }); - }); - - return ArrayProxy - .extend(PromiseProxyMixin) - .create(deferred); - }), - slugValue: boundOneWay('model.slug'), metaTitleScratch: alias('model.metaTitleScratch'), metaDescriptionScratch: alias('model.metaDescriptionScratch'), + didReceiveAttrs() { + this._super(...arguments); + + this.get('store').query('user', {limit: 'all'}).then((users) => { + this.set('authors', users.sortBy('name')); + }); + + this.get('model.author').then((author) => { + this.set('selectedAuthor', author); + }); + }, + seoTitle: computed('model.titleScratch', 'metaTitleScratch', function () { let metaTitle = this.get('metaTitleScratch') || ''; diff --git a/ghost/admin/app/templates/components/gh-post-settings-menu.hbs b/ghost/admin/app/templates/components/gh-post-settings-menu.hbs index 8e1fd9ae80..dc158ca003 100644 --- a/ghost/admin/app/templates/components/gh-post-settings-menu.hbs +++ b/ghost/admin/app/templates/components/gh-post-settings-menu.hbs @@ -68,12 +68,12 @@ {{one-way-select + selectedAuthor id="author-list" name="post-setting-author" options=authors optionValuePath="id" optionLabelPath="name" - value=selectedAuthor update=(action "changeAuthor") }} diff --git a/ghost/admin/mirage/config/posts.js b/ghost/admin/mirage/config/posts.js index dca6663a71..584712428a 100644 --- a/ghost/admin/mirage/config/posts.js +++ b/ghost/admin/mirage/config/posts.js @@ -51,7 +51,18 @@ export default function mockPosts(server) { }); }); - server.put('/posts/:id/'); + // Handle embedded author in post + server.put('/posts/:id/', ({posts}, request) => { + let {posts: [post]} = JSON.parse(request.requestBody); + let {author} = post; + delete post.author; + + let savedPost = posts.find(request.params.id).update(post); + savedPost.authorId = author; + savedPost.save(); + + return savedPost; + }); server.del('/posts/:id/'); } diff --git a/ghost/admin/tests/acceptance/editor-test.js b/ghost/admin/tests/acceptance/editor-test.js index ecf0a226e0..81af1ab964 100644 --- a/ghost/admin/tests/acceptance/editor-test.js +++ b/ghost/admin/tests/acceptance/editor-test.js @@ -506,5 +506,31 @@ describe('Acceptance: Editor', function() { }); }); + it('shows author list and allows switching of author in PSM', function () { + server.create('post', {authorId: 1}); + let role = server.create('role', {name: 'Author'}); + let author = server.create('user', {name: 'Waldo', roles: [role]}); + + visit('/editor/1'); + + andThen(() => { + expect(currentURL(), 'currentURL') + .to.equal('/editor/1'); + }); + + click('button.post-settings'); + + andThen(() => { + expect(find('select[name="post-setting-author"]').val()).to.equal('1'); + expect(find('select[name="post-setting-author"] option[value="2"]')).to.be.ok; + }); + + fillIn('select[name="post-setting-author"]', '2'); + + andThen(() => { + expect(find('select[name="post-setting-author"]').val()).to.equal('2'); + expect(server.db.posts[0].authorId).to.equal(author.id); + }); + }); }); });