UNPKG

@eclipse-glsp/client

Version:

A sprotty-based client for GLSP

133 lines 5.92 kB
"use strict"; /******************************************************************************** * Copyright (c) 2023 Business Informatics Group (TU Wien) and others. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0. * * This Source Code may also be made available under the following Secondary * Licenses when the conditions for such availability set forth in the Eclipse * Public License v. 2.0 are satisfied: GNU General Public License, version 2 * with the GNU Classpath Exception which is available at * https://www.gnu.org/software/classpath/license.html. * * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var FocusTrackerTool_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.FocusTrackerTool = void 0; const sprotty_1 = require("@eclipse-glsp/sprotty"); const inversify_1 = require("inversify"); const messages_1 = require("../../../base/messages"); const toast_handler_1 = require("../toast/toast-handler"); let FocusTrackerTool = FocusTrackerTool_1 = class FocusTrackerTool { constructor() { this.isEditTool = false; this.focusInFunction = (event) => this.focusIn(event); this.focusOutFunction = (event) => this.focusOut(event); this.registered = false; } get id() { return FocusTrackerTool_1.ID; } enable() { if (!this.registered) { document.addEventListener('focusin', this.focusInFunction); document.addEventListener('focusout', this.focusOutFunction); } this.registered = true; } disable() { // the focus tracker cannot be disabled after enabling it } async focusOut(event) { await this.showToast(messages_1.messages.focus.focus_not_set); } async focusIn(event) { let message; const target = event.target; if (target instanceof HTMLElement) { const parent = this.parentWithAriaLabel(target); const textMessage = this.handleTextNode(target); // eslint-disable-next-line no-null/no-null if (target.ariaLabel !== null) { message = this.handleAriaLabel(target); } else { if (parent === undefined && textMessage !== undefined) { message = textMessage; } else if (parent !== undefined && textMessage === undefined) { message = `${messages_1.messages.focus.focus_within} ${parent.ariaLabel}`; } else if (parent !== undefined && textMessage !== undefined) { message = `${parent.ariaLabel} -> ${textMessage}`; } } } await this.showToast(message); } handleTextNode(target) { const textNode = Array.prototype.filter .call(target.childNodes, element => element.nodeType === Node.TEXT_NODE) .map(element => element.textContent) .join(''); if (textNode.trim().length !== 0) { return textNode; } return undefined; } handleAriaLabel(target) { // eslint-disable-next-line no-null/no-null return target.ariaLabel === null ? undefined : target.ariaLabel; } showToast(message) { return this.actionDispatcher.dispatchAll([ toast_handler_1.ShowToastMessageAction.create({ id: Symbol.for(FocusTrackerTool_1.ID), message: `${messages_1.messages.focus.focus_on} ${message !== null && message !== void 0 ? message : 'unknown'}`, position: 'left' }) ]); } parentWithAriaLabel(target) { let current = target.parentElement; while ( // eslint-disable-next-line no-null/no-null current !== null && current !== document.body && current !== document.getElementById(this.viewerOptions.baseDiv) && // eslint-disable-next-line no-null/no-null current.ariaLabel === null) { current = current.parentElement; } if (current === document.getElementById(this.viewerOptions.baseDiv) || current === document.body) { return undefined; } return current !== null && current !== void 0 ? current : undefined; } }; exports.FocusTrackerTool = FocusTrackerTool; FocusTrackerTool.ID = 'glsp.focus-tracker'; __decorate([ (0, inversify_1.inject)(sprotty_1.TYPES.IActionDispatcher), __metadata("design:type", Object) ], FocusTrackerTool.prototype, "actionDispatcher", void 0); __decorate([ (0, inversify_1.inject)(sprotty_1.TYPES.ViewerOptions), __metadata("design:type", Object) ], FocusTrackerTool.prototype, "viewerOptions", void 0); exports.FocusTrackerTool = FocusTrackerTool = FocusTrackerTool_1 = __decorate([ (0, inversify_1.injectable)() ], FocusTrackerTool); //# sourceMappingURL=focus-tracker-tool.js.map