diff --git a/.changeset/full-symbols-obey.md b/.changeset/full-symbols-obey.md new file mode 100644 index 0000000000..903395756e --- /dev/null +++ b/.changeset/full-symbols-obey.md @@ -0,0 +1,5 @@ +--- +"apostrophe": patch +--- + +Keyboard shortcuts for widget operations (copy, cut, paste, duplicate, remove) no longer block the browser's native clipboard behavior when no widget is focused. Previously, selecting and copying text on a page while logged in was prevented by the admin UI intercepting those shortcuts unconditionally. diff --git a/packages/apostrophe/modules/@apostrophecms/area/index.js b/packages/apostrophe/modules/@apostrophecms/area/index.js index 47b83516f1..a96d8248c8 100644 --- a/packages/apostrophe/modules/@apostrophecms/area/index.js +++ b/packages/apostrophe/modules/@apostrophecms/area/index.js @@ -19,7 +19,8 @@ module.exports = { action: { type: 'command-menu-area-cut-widget' }, - shortcut: 'Ctrl+X Meta+X' + shortcut: 'Ctrl+X Meta+X', + requireWidgetFocus: true }, [`${self.__meta.name}:copy-widget`]: { type: 'item', @@ -27,7 +28,8 @@ module.exports = { action: { type: 'command-menu-area-copy-widget' }, - shortcut: 'Ctrl+C Meta+C' + shortcut: 'Ctrl+C Meta+C', + requireWidgetFocus: true }, [`${self.__meta.name}:paste-widget`]: { type: 'item', @@ -35,7 +37,8 @@ module.exports = { action: { type: 'command-menu-area-paste-widget' }, - shortcut: 'Ctrl+V Meta+V' + shortcut: 'Ctrl+V Meta+V', + requireWidgetFocus: true }, [`${self.__meta.name}:duplicate-widget`]: { type: 'item', @@ -43,7 +46,8 @@ module.exports = { action: { type: 'command-menu-area-duplicate-widget' }, - shortcut: 'Ctrl+Shift+D Meta+Shift+D' + shortcut: 'Ctrl+Shift+D Meta+Shift+D', + requireWidgetFocus: true }, [`${self.__meta.name}:remove-widget`]: { type: 'item', @@ -51,7 +55,8 @@ module.exports = { action: { type: 'command-menu-area-remove-widget' }, - shortcut: 'Backspace' + shortcut: 'Backspace', + requireWidgetFocus: true } }, modal: { diff --git a/packages/apostrophe/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue b/packages/apostrophe/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue index 6712ec169e..6003a5830d 100644 --- a/packages/apostrophe/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue +++ b/packages/apostrophe/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue @@ -10,6 +10,7 @@ import { mapActions, mapState } from 'pinia'; import AposThemeMixin from 'Modules/@apostrophecms/ui/mixins/AposThemeMixin'; import { useModalStore } from 'Modules/@apostrophecms/ui/stores/modal'; +import { useWidgetStore } from 'Modules/@apostrophecms/ui/stores/widget'; export default { name: 'TheAposCommandMenu', @@ -50,7 +51,13 @@ export default { .flatMap(command => { return command.shortcut .split(' ') - .map(shortcut => [ shortcut.toUpperCase(), command.action ]); + .map(shortcut => [ + shortcut.toUpperCase(), + { + ...command.action, + requireWidgetFocus: command.requireWidgetFocus || false + } + ]); }); }) ); @@ -111,6 +118,9 @@ export default { ? keys.slice('SHIFT+'.length) : keys]; if (action) { + if (action.requireWidgetFocus && !useWidgetStore().focusedWidget) { + return; + } event.preventDefault(); apos.bus.$emit(action.type, action.payload); return;