@blockly/plugin-cross-tab-copy-paste
Version:
Allows copying blocks between multiple tabs with Blockly editors.
2 lines • 6.11 kB
JavaScript
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("blockly/core"));else if("function"==typeof define&&define.amd)define(["blockly/core"],t);else{var o="object"==typeof exports?t(require("blockly/core")):t(e.Blockly);for(var r in o)("object"==typeof exports?exports:e)[r]=o[r]}}(this,e=>(()=>{"use strict";var t={370:t=>{t.exports=e}},o={};function r(e){var s=o[e];if(void 0!==s)return s.exports;var i=o[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var s={};r.r(s),r.d(s,{CrossTabCopyPaste:()=>l});var i,n=r(370);function a(e){return!!(n.isCopyable(e)&&n.isDeletable(e)&&n.isDraggable(e))&&(e.isCopyable?e.isCopyable():e instanceof n.BlockSvg||e instanceof n.comments.RenderedWorkspaceComment?e.isOwnDeletable()&&e.isOwnMovable():e.isDeletable()&&e.isMovable())}function c(e){return a(e)&&n.isDeletable(e)&&e.isDeletable()}!function(e){e.ENABLED="enabled",e.DISABLED="disabled",e.HIDDEN="hidden"}(i||(i={}));class l{constructor(){this.localStorageKey="blocklyStash"}init({contextMenu:e=!0,shortcut:t=!0}={contextMenu:!0,shortcut:!0},o,r){r&&(this.localStorageKey=r),e&&(this.blockCopyToStorageContextMenu(),this.blockPasteFromStorageContextMenu(o)),t&&(n.ShortcutRegistry.registry.unregister(n.ShortcutItems.names.COPY),n.ShortcutRegistry.registry.unregister(n.ShortcutItems.names.CUT),n.ShortcutRegistry.registry.unregister(n.ShortcutItems.names.PASTE),this.blockCopyToStorageShortcut(),this.blockCutToStorageShortcut(),this.blockPasteFromStorageShortcut(o))}getCopyData(){const e=localStorage.getItem(this.localStorageKey);if(e)return JSON.parse(e)}copyPrecondition(e,t){const o=e.focusedNode;if(!o)return i.HIDDEN;if(!n.isCopyable(o))return i.HIDDEN;if(t||(t=o.workspace),!(t instanceof n.WorkspaceSvg))return i.HIDDEN;const r=t.isFlyout?t.targetWorkspace:t;return o&&r&&!r.isDragging()&&!n.getFocusManager().ephemeralFocusTaken()&&a(o)?i.ENABLED:i.DISABLED}copyCallback(e,t){const o=e.focusedNode;if(!o||!n.isCopyable(o)||!a(o))return!1;if(!(t instanceof n.WorkspaceSvg))return!1;const r=t.isFlyout?t.targetWorkspace:t;if(!r)return!1;o.workspace.isFlyout||r.hideChaff();const s=o.toCopyData();return!!s&&(localStorage.setItem(this.localStorageKey,JSON.stringify(s)),!0)}pastePrecondition(e){const t=this.getCopyData();return t?"typeCounts"in t&&!(null==e?void 0:e.isCapacityAvailable(t.typeCounts))||!e||e.isReadOnly()||e.isDragging()||n.getFocusManager().ephemeralFocusTaken()?i.DISABLED:i.ENABLED:i.DISABLED}getContextMenuText(e){return e.indexOf(")")===e.length-1&&(e=e.split(" (")[0]),e}blockCopyToStorageContextMenu(){const e={displayText:()=>n.Msg.CROSS_TAB_COPY?n.Msg.CROSS_TAB_COPY:this.getContextMenuText(n.Msg.COPY_SHORTCUT),preconditionFn:e=>this.copyPrecondition(e),callback:e=>{const t=e.focusedNode;if(!t||!n.isCopyable(t))return!1;const o=t.workspace;return this.copyCallback(e,o)},id:"blockCopyToStorage",weight:0};n.ContextMenuRegistry.registry.register(e)}blockPasteFromStorageContextMenu(e){const t={displayText:()=>n.Msg.CROSS_TAB_PASTE?n.Msg.CROSS_TAB_PASTE:this.getContextMenuText(n.Msg.PASTE_SHORTCUT),preconditionFn:e=>{if(!(e.focusedNode instanceof n.WorkspaceSvg)||e.focusedNode.isFlyout)return i.HIDDEN;const t=e.focusedNode;return this.pastePrecondition(t)},callback:(t,o,r,s)=>{const i=this.getCopyData();if(!i)return!1;const a=t.focusedNode;if(!(a instanceof n.WorkspaceSvg))return!1;const c=n.utils.svgMath.screenToWsCoordinates(a,s);try{return!!n.clipboard.paste(i,a,c)}catch(t){if(!(t instanceof TypeError&&e))throw t;e()}},id:"blockPasteFromStorage",weight:0};n.ContextMenuRegistry.registry.register(t)}blockCopyToStorageShortcut(){const e=n.ShortcutRegistry.registry.createSerializedKey(n.utils.KeyCodes.C,[n.utils.KeyCodes.CTRL]),t=n.ShortcutRegistry.registry.createSerializedKey(n.utils.KeyCodes.C,[n.utils.KeyCodes.META]),o={name:n.ShortcutItems.names.COPY,keyCodes:[e,t],preconditionFn:(e,t)=>this.copyPrecondition(t,e)===i.ENABLED,callback:(e,t,o,r)=>(t.preventDefault(),this.copyCallback(r,e))};n.ShortcutRegistry.registry.register(o)}blockCutToStorageShortcut(){const e=n.ShortcutRegistry.registry.createSerializedKey(n.utils.KeyCodes.X,[n.utils.KeyCodes.CTRL]),t=n.ShortcutRegistry.registry.createSerializedKey(n.utils.KeyCodes.X,[n.utils.KeyCodes.META]),o={name:n.ShortcutItems.names.CUT,keyCodes:[e,t],preconditionFn:(e,t)=>{const o=t.focusedNode;return!!o&&!e.isReadOnly()&&!e.isDragging()&&!n.getFocusManager().ephemeralFocusTaken()&&c(o)},callback:(e,t,o,r)=>{t.preventDefault();const s=r.focusedNode;if(!s||!c(s)||!n.isCopyable(s))return!1;const i=s.toCopyData();if(!i)return!1;if(s instanceof n.BlockSvg)s.checkAndDelete();else if(n.isDeletable(s)){const e=n.Events.getGroup();n.Events.setGroup(!0),s.dispose(),n.Events.setGroup(e)}return localStorage.setItem(this.localStorageKey,JSON.stringify(i)),!0}};n.ShortcutRegistry.registry.register(o)}blockPasteFromStorageShortcut(e){const t=n.ShortcutRegistry.registry.createSerializedKey(n.utils.KeyCodes.V,[n.utils.KeyCodes.CTRL]),o=n.ShortcutRegistry.registry.createSerializedKey(n.utils.KeyCodes.V,[n.utils.KeyCodes.META]),r={name:n.ShortcutItems.names.PASTE,keyCodes:[t,o],preconditionFn:e=>{const t=e.isFlyout?e.targetWorkspace:e;return!!t&&this.pastePrecondition(t)===i.ENABLED},callback:(t,o)=>{o.preventDefault();const r=this.getCopyData();if(!r)return!1;const s=t.isFlyout?t.targetWorkspace:t;if(!s)return!1;try{if(o instanceof PointerEvent){const e=n.utils.svgMath.screenToWsCoordinates(s,new n.utils.Coordinate(o.clientX,o.clientY));return!!n.clipboard.paste(r,s,e)}return!!n.clipboard.paste(r,s)}catch(o){if(!(o instanceof TypeError&&e))throw o;e()}return!0}};n.ShortcutRegistry.registry.register(r)}}return s})());
//# sourceMappingURL=index.js.map