diff --git a/ghost/admin/app/controllers/settings/general.js b/ghost/admin/app/controllers/settings/general.js index 9e1fe7da3a..e69b04f90d 100644 --- a/ghost/admin/app/controllers/settings/general.js +++ b/ghost/admin/app/controllers/settings/general.js @@ -9,6 +9,7 @@ import { IMAGE_MIME_TYPES } from 'ghost-admin/components/gh-image-uploader'; import {TrackedObject} from 'tracked-built-ins'; +import {run} from '@ember/runloop'; import {task} from 'ember-concurrency'; import {tracked} from '@glimmer/tracking'; @@ -151,4 +152,19 @@ export default class GeneralController extends Controller { throw error; } } + + @action + saveViaKeyboard(event) { + event.preventDefault(); + + // trigger any set-on-blur actions + const focusedElement = document.activeElement; + focusedElement?.blur(); + + // schedule save for when set-on-blur actions have finished + run.schedule('actions', this, function () { + focusedElement?.focus(); + this.saveTask.perform(); + }); + } } diff --git a/ghost/admin/app/controllers/settings/staff/user.js b/ghost/admin/app/controllers/settings/staff/user.js index e01ed5f65c..4901a724ec 100644 --- a/ghost/admin/app/controllers/settings/staff/user.js +++ b/ghost/admin/app/controllers/settings/staff/user.js @@ -299,6 +299,20 @@ export default Controller.extend({ } }).group('saveHandlers'), + saveViaKeyboard: action(function (event) { + event.preventDefault(); + + // trigger any set-on-blur actions + const focusedElement = document.activeElement; + focusedElement?.blur(); + + // schedule save for when set-on-blur actions have finished + run.schedule('actions', this, function () { + focusedElement?.focus(); + this.save.perform(); + }); + }), + copyContentKey: task(function* () { copyTextToClipboard(this.personalToken); yield timeout(this.isTesting ? 50 : 3000); diff --git a/ghost/admin/app/routes/settings/general.js b/ghost/admin/app/routes/settings/general.js index 25ef8f707f..f243d1efe0 100644 --- a/ghost/admin/app/routes/settings/general.js +++ b/ghost/admin/app/routes/settings/general.js @@ -65,11 +65,6 @@ export default class GeneralSettingsRoute extends AdminRoute { return true; } - @action - save() { - return this.controller.send('save'); - } - @action reloadSettings() { return this.settings.reload(); diff --git a/ghost/admin/app/routes/settings/staff/user.js b/ghost/admin/app/routes/settings/staff/user.js index 33613975fb..d3c960c6db 100644 --- a/ghost/admin/app/routes/settings/staff/user.js +++ b/ghost/admin/app/routes/settings/staff/user.js @@ -88,11 +88,6 @@ export default class UserRoute extends AuthenticatedRoute { this.modelFor('settings.staff.user').get('errors').clear(); } - @action - save() { - this.controller.save.perform(); - } - buildRouteInfoMetadata() { return { titleToken: 'Staff - User' diff --git a/ghost/admin/app/templates/settings/general.hbs b/ghost/admin/app/templates/settings/general.hbs index 723ef69a6a..04a17a2bb6 100644 --- a/ghost/admin/app/templates/settings/general.hbs +++ b/ghost/admin/app/templates/settings/general.hbs @@ -1,4 +1,4 @@ -
+
diff --git a/ghost/admin/app/templates/settings/staff/user.hbs b/ghost/admin/app/templates/settings/staff/user.hbs index 99d36b0248..ef8ad7b26a 100644 --- a/ghost/admin/app/templates/settings/staff/user.hbs +++ b/ghost/admin/app/templates/settings/staff/user.hbs @@ -1,4 +1,4 @@ -
+
{{!-- Remove breadcrumbs for Authors and Contributors --}} {{#if this.currentUser.isAuthorOrContributor}} diff --git a/ghost/admin/tests/acceptance/settings/general-test.js b/ghost/admin/tests/acceptance/settings/general-test.js index 3700a12d2e..b19cb99d0a 100644 --- a/ghost/admin/tests/acceptance/settings/general-test.js +++ b/ghost/admin/tests/acceptance/settings/general-test.js @@ -1,8 +1,8 @@ -import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd'; import {authenticateSession, invalidateSession} from 'ember-simple-auth/test-support'; import {beforeEach, describe, it} from 'mocha'; import {blur, click, currentURL, fillIn, find, findAll, focus, triggerEvent} from '@ember/test-helpers'; import {expect} from 'chai'; +import {keyDown} from 'ember-keyboard/test-support/test-helpers'; import {setupApplicationTest} from 'ember-mocha'; import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../../helpers/visit'; @@ -82,11 +82,7 @@ describe('Acceptance: Settings - General', function () { // CMD-S shortcut works // -------------------------------------------------------------- // await fillIn('[data-test-title-input]', 'CMD-S Test'); - await triggerEvent('.gh-app', 'keydown', { - keyCode: 83, // s - metaKey: ctrlOrCmd === 'command', - ctrlKey: ctrlOrCmd === 'ctrl' - }); + await keyDown('cmd+s'); // we've already saved in this test so there's no on-screen indication // that we've had another save, check the request was fired instead let [lastRequest] = this.server.pretender.handledRequests.slice(-1); diff --git a/ghost/admin/tests/acceptance/staff-test.js b/ghost/admin/tests/acceptance/staff-test.js index 2dbae4e9b7..4f0957304d 100644 --- a/ghost/admin/tests/acceptance/staff-test.js +++ b/ghost/admin/tests/acceptance/staff-test.js @@ -1,13 +1,8 @@ -import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd'; import moment from 'moment-timezone'; import windowProxy from 'ghost-admin/utils/window-proxy'; import {Response} from 'miragejs'; import {afterEach, beforeEach, describe, it} from 'mocha'; import {authenticateSession, invalidateSession} from 'ember-simple-auth/test-support'; -import {enableLabsFlag} from '../helpers/labs-flag'; -import {enableMembers} from '../helpers/members'; -import {enableStripe} from '../helpers/stripe'; - import { blur, click, @@ -20,7 +15,11 @@ import { triggerEvent, triggerKeyEvent } from '@ember/test-helpers'; +import {enableLabsFlag} from '../helpers/labs-flag'; +import {enableMembers} from '../helpers/members'; +import {enableStripe} from '../helpers/stripe'; import {expect} from 'chai'; +import {keyDown} from 'ember-keyboard/test-support/test-helpers'; import {setupApplicationTest} from 'ember-mocha'; import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../helpers/visit'; @@ -521,11 +520,7 @@ describe('Acceptance: Staff', function () { // CMD-S shortcut works await fillIn('[data-test-slug-input]', 'Test User'); - await triggerEvent('.gh-app', 'keydown', { - keyCode: 83, // s - metaKey: ctrlOrCmd === 'command', - ctrlKey: ctrlOrCmd === 'ctrl' - }); + await keyDown('cmd+s'); // Since we reset save status so there's no on-screen indication // that we've had a save, check the request was fired instead