@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 2.91 kB
JavaScript
import*as Platform from"../../core/platform/platform.js";import*as ARIAUtils from"./ARIAUtils.js";import{Keys}from"./KeyboardShortcut.js";import{ElementFocusRestorer,markBeingEdited}from"./UIUtils.js";let _defaultInstance=null;export class InplaceEditor{focusRestorer;static startEditing(e,t){return _defaultInstance||(_defaultInstance=new InplaceEditor),_defaultInstance.startEditing(e,t)}editorContent(e){const t=e.element;return"INPUT"===t.tagName&&"text"===t.type?t.value:t.textContent||""}setUpEditor(e){const t=e.element;t.classList.add("editing"),t.setAttribute("contenteditable","plaintext-only");const n=t.getAttribute("role");ARIAUtils.markAsTextBox(t),e.oldRole=n;const o=t.getAttribute("tabIndex");("number"!=typeof o||o<0)&&(t.tabIndex=0),this.focusRestorer=new ElementFocusRestorer(t),e.oldTabIndex=o}closeEditor(e){const t=e.element;t.classList.remove("editing"),t.removeAttribute("contenteditable"),"string"!=typeof e.oldRole?t.removeAttribute("role"):t.setAttribute("role",e.oldRole),"number"!=typeof e.oldTabIndex?t.removeAttribute("tabIndex"):t.setAttribute("tabIndex",e.oldTabIndex),t.scrollTop=0,t.scrollLeft=0}cancelEditing(e){const t=e.element;"INPUT"===t.tagName&&"text"===t.type?t.value=e.oldText||"":t.textContent=e.oldText}startEditing(e,t){if(!markBeingEdited(e,!0))return null;const n=t||new Config((function(){}),(function(){})),o={element:e,config:n,oldRole:null,oldTabIndex:null,oldText:null},r=n.commitHandler,i=n.cancelHandler,l=n.pasteHandler,s=n.context;let a="";const d=this;function c(t){n.blurHandler&&!n.blurHandler(e,t)||f.call(e)}function u(){markBeingEdited(e,!1),e.removeEventListener("blur",c,!1),e.removeEventListener("keydown",E,!0),l&&e.removeEventListener("paste",p,!0),d.focusRestorer&&d.focusRestorer.restore(),d.closeEditor(o)}function m(){d.cancelEditing(o),u(),i(this,s)}function f(){u(),r(this,d.editorContent(o),o.oldText||"",s,a)}function b(t,n){"commit"===t?(f.call(e),n.consume(!0)):"cancel"===t?(m.call(e),n.consume(!0)):t&&t.startsWith("move-")&&(a=t.substring(5),"Tab"===n.key&&n.consume(!0),c())}function p(e){if(!l)return;b(l(e),e)}function E(e){let t=function(e){return"Enter"===e.key?"commit":e.keyCode===Keys.Esc.code||e.key===Platform.KeyboardUtilities.ESCAPE_KEY?"cancel":"Tab"===e.key?"move-"+(e.shiftKey?"backward":"forward"):""}(e);if(!t&&n.postKeydownFinishHandler){const o=n.postKeydownFinishHandler(e);o&&(t=o)}b(t,e)}this.setUpEditor(o),o.oldText=this.editorContent(o),e.addEventListener("blur",c,!1),e.addEventListener("keydown",E,!0),void 0!==l&&e.addEventListener("paste",p,!0);return{cancel:m.bind(e),commit:f.bind(e)}}}export class Config{commitHandler;cancelHandler;context;blurHandler;pasteHandler;postKeydownFinishHandler;constructor(e,t,n,o){this.commitHandler=e,this.cancelHandler=t,this.context=n,this.blurHandler=o}setPasteHandler(e){this.pasteHandler=e}setPostKeydownFinishHandler(e){this.postKeydownFinishHandler=e}}