@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 3.51 kB
JavaScript
import*as Common from"../../core/common/common.js";import*as ARIAUtils from"./ARIAUtils.js";import{GlassPane}from"./GlassPane.js";import{InspectorView}from"./InspectorView.js";import{KeyboardShortcut,Keys}from"./KeyboardShortcut.js";import{WidgetFocusRestorer}from"./Widget.js";import dialogStyles from"./dialog.css.legacy.js";export class Dialog extends(Common.ObjectWrapper.eventMixin(GlassPane)){tabIndexBehavior;tabIndexMap;focusRestorer;closeOnEscape;targetDocument;targetDocumentKeyDownHandler;escapeKeyCallback;constructor(){super(),this.registerRequiredCSS(dialogStyles),this.contentElement.tabIndex=0,this.contentElement.addEventListener("focus",(()=>this.widget().focus()),!1),this.widget().setDefaultFocusedElement(this.contentElement),this.setPointerEventsBehavior("BlockedByGlassPane"),this.setOutsideClickCallback((e=>{this.hide(),e.consume(!0)})),ARIAUtils.markAsModalDialog(this.contentElement),this.tabIndexBehavior=OutsideTabIndexBehavior.DisableAllOutsideTabIndex,this.tabIndexMap=new Map,this.focusRestorer=null,this.closeOnEscape=!0,this.targetDocumentKeyDownHandler=this.onKeyDown.bind(this),this.escapeKeyCallback=null}static hasInstance(){return Boolean(Dialog.instance)}show(e){const t=e instanceof Document?e:(e||InspectorView.instance().element).ownerDocument;this.targetDocument=t,this.targetDocument.addEventListener("keydown",this.targetDocumentKeyDownHandler,!0),Dialog.instance&&Dialog.instance.hide(),Dialog.instance=this,this.disableTabIndexOnElements(t),super.show(t),this.focusRestorer=new WidgetFocusRestorer(this.widget())}hide(){this.focusRestorer&&this.focusRestorer.restore(),super.hide(),this.targetDocument&&this.targetDocument.removeEventListener("keydown",this.targetDocumentKeyDownHandler,!0),this.restoreTabIndexOnElements(),this.dispatchEventToListeners("hidden"),Dialog.instance=null}setCloseOnEscape(e){this.closeOnEscape=e}setEscapeKeyCallback(e){this.escapeKeyCallback=e}addCloseButton(){this.contentElement.createChild("div","dialog-close-button","dt-close-button").addEventListener("click",(()=>this.hide()),!1)}setOutsideTabIndexBehavior(e){this.tabIndexBehavior=e}disableTabIndexOnElements(e){if(this.tabIndexBehavior===OutsideTabIndexBehavior.PreserveTabIndex)return;let t=null;this.tabIndexBehavior===OutsideTabIndexBehavior.PreserveMainViewTabIndex&&(t=this.getMainWidgetTabIndexElements(InspectorView.instance().ownerSplit())),this.tabIndexMap.clear();let s=e;for(;s;s=s.traverseNextNode(e))if(s instanceof HTMLElement){const e=s,n=e.tabIndex;t?.has(e)||(n>=0?(this.tabIndexMap.set(e,n),e.tabIndex=-1):e.hasAttribute("contenteditable")&&(this.tabIndexMap.set(e,e.hasAttribute("tabindex")?n:0),e.tabIndex=-1))}}getMainWidgetTabIndexElements(e){const t=new Set;if(!e)return t;const s=e.mainWidget();if(!s||!s.element)return t;let n=s.element;for(;n;n=n.traverseNextNode(s.element)){if(!(n instanceof HTMLElement))continue;const e=n;e.tabIndex<0||t.add(e)}return t}restoreTabIndexOnElements(){for(const e of this.tabIndexMap.keys())e.tabIndex=this.tabIndexMap.get(e);this.tabIndexMap.clear()}onKeyDown(e){if(e.keyCode===Keys.Esc.code&&KeyboardShortcut.hasNoModifiers(e)){if(this.escapeKeyCallback&&this.escapeKeyCallback(e),e.handled)return;this.closeOnEscape&&(e.consume(!0),this.hide())}}static instance=null}export var OutsideTabIndexBehavior;!function(e){e.DisableAllOutsideTabIndex="DisableAllTabIndex",e.PreserveMainViewTabIndex="PreserveMainViewTabIndex",e.PreserveTabIndex="PreserveTabIndex"}(OutsideTabIndexBehavior||(OutsideTabIndexBehavior={}));