From 8e5c63d035ef44a269b8c43430f43f5c8eebfb63 Mon Sep 17 00:00:00 2001 From: Ignat Beresnev Date: Fri, 10 Nov 2023 11:46:54 +0100 Subject: Restructure the project to utilize included builds (#3174) * Refactor and simplify artifact publishing * Update Gradle to 8.4 * Refactor and simplify convention plugins and build scripts Fixes #3132 --------- Co-authored-by: Adam <897017+aSemy@users.noreply.github.com> Co-authored-by: Oleg Yukhnevich --- .../src/main/components/utils/hotkey.ts | 62 ++++++++++++++++++++++ .../src/main/components/utils/os.ts | 18 +++++++ .../src/main/components/utils/requests.tsx | 11 ++++ 3 files changed, 91 insertions(+) create mode 100644 dokka-subprojects/plugin-base-frontend/src/main/components/utils/hotkey.ts create mode 100644 dokka-subprojects/plugin-base-frontend/src/main/components/utils/os.ts create mode 100644 dokka-subprojects/plugin-base-frontend/src/main/components/utils/requests.tsx (limited to 'dokka-subprojects/plugin-base-frontend/src/main/components/utils') diff --git a/dokka-subprojects/plugin-base-frontend/src/main/components/utils/hotkey.ts b/dokka-subprojects/plugin-base-frontend/src/main/components/utils/hotkey.ts new file mode 100644 index 00000000..ae813166 --- /dev/null +++ b/dokka-subprojects/plugin-base-frontend/src/main/components/utils/hotkey.ts @@ -0,0 +1,62 @@ +/* + * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +import {detectOsKind, OsKind} from "./os"; + +type ModifierKey = { + name: string + keyArg: string +} + +class ModifierKeys { + static metaKey: ModifierKey = {name: "Command", keyArg: "Meta"} + static ctrlKey: ModifierKey = {name: "Ctrl", keyArg: "Control"} + static altKey: ModifierKey = {name: "Alt", keyArg: "Alt"} + static shiftKey: ModifierKey = {name: "Shift", keyArg: "Shift"} +} + +const setOfKeys = [ModifierKeys.altKey, ModifierKeys.shiftKey, ModifierKeys.ctrlKey, ModifierKeys.metaKey] + +export class Hotkey { + private readonly osKind: OsKind; + + constructor() { + this.osKind = detectOsKind() + } + + public getOsAccelKeyName() { + return this.getOsAccelKey().name + } + + /** + * Register a hotkey of combination Accel key (Cmd/Ctrl depending on OS). + * The method also checks that other modifiers key is not pressed to avoid shortcuts intersection. + * E.g. don't trigger [Ctrl+K] if [Ctrl + Shift + K] pressed + */ + public registerHotkeyWithAccel = (event: () => void, letter: string) => { + const osMetaKey = this.getOsAccelKey() + document.onkeydown = (keyDownEvent) => { + const isMetaKeyPressed = keyDownEvent.getModifierState(osMetaKey.keyArg) + const isOtherModifierKeyPressed = setOfKeys + .filter(key => key !== osMetaKey) + .map((otherKeys: ModifierKey) => keyDownEvent.getModifierState(otherKeys.keyArg)) + .some(value => value) + + if (isMetaKeyPressed && !isOtherModifierKeyPressed && keyDownEvent.key === letter) { + keyDownEvent.preventDefault() + event() + } + }; + } + + private getOsAccelKey(): ModifierKey { + switch (this.osKind) { + case OsKind.MACOS: + return ModifierKeys.metaKey + default: + return ModifierKeys.ctrlKey + } + } +} + diff --git a/dokka-subprojects/plugin-base-frontend/src/main/components/utils/os.ts b/dokka-subprojects/plugin-base-frontend/src/main/components/utils/os.ts new file mode 100644 index 00000000..6130ef67 --- /dev/null +++ b/dokka-subprojects/plugin-base-frontend/src/main/components/utils/os.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +export enum OsKind{ + WINDOWS, + MACOS, + LINUX, + OTHER +} + +export const detectOsKind = (): OsKind => { + const userAgent = navigator.userAgent + if(userAgent.includes("Mac")) return OsKind.MACOS + else if (userAgent.includes("Win")) return OsKind.WINDOWS + else if (userAgent.includes("Linux")) return OsKind.LINUX + else return OsKind.OTHER +} diff --git a/dokka-subprojects/plugin-base-frontend/src/main/components/utils/requests.tsx b/dokka-subprojects/plugin-base-frontend/src/main/components/utils/requests.tsx new file mode 100644 index 00000000..568c331b --- /dev/null +++ b/dokka-subprojects/plugin-base-frontend/src/main/components/utils/requests.tsx @@ -0,0 +1,11 @@ +/* + * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +import {IWindow} from "../search/types" + +export const relativizeUrlForRequest = (filePath: string) : string => { + const pathToRoot = (window as IWindow).pathToRoot + const relativePath = pathToRoot == "" ? "." : pathToRoot + return relativePath.endsWith('/') ? `${relativePath}${filePath}` : `${relativePath}/${filePath}` +} -- cgit