From 5cc6fc7d9be75c8b681d0688faed945589d1593f Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Tue, 25 May 2021 18:54:58 +0200 Subject: [PATCH] Use TextInputModal directly from svelte component * the only important thing is that it is not positioned within elements with display: none * I think we can treat the existence of the modal to be a kind of "precondition" that has to be met for the component to be used --- ts/components/contextKeys.ts | 1 + ts/deckoptions/BUILD.bazel | 2 -- ts/deckoptions/ConfigSelector.svelte | 31 ++++++++++++++++-- ts/deckoptions/DeckOptionsPage.svelte | 18 +---------- ts/deckoptions/SaveButton.svelte | 43 ++++++++++--------------- ts/deckoptions/TextInputModal.svelte | 46 ++++++++++++++------------- ts/deckoptions/index.ts | 5 ++- ts/deckoptions/textInputModal.ts | 32 ------------------- 8 files changed, 76 insertions(+), 102 deletions(-) delete mode 100644 ts/deckoptions/textInputModal.ts diff --git a/ts/components/contextKeys.ts b/ts/components/contextKeys.ts index 10979427f..008569399 100644 --- a/ts/components/contextKeys.ts +++ b/ts/components/contextKeys.ts @@ -6,3 +6,4 @@ export const disabledKey = Symbol("disabled"); export const buttonToolbarKey = Symbol("buttonToolbar"); export const buttonGroupKey = Symbol("buttonGroup"); export const dropdownKey = Symbol("dropdown"); +export const modalsKey = Symbol("modals"); diff --git a/ts/deckoptions/BUILD.bazel b/ts/deckoptions/BUILD.bazel index b4ab8312e..ce2c723ee 100644 --- a/ts/deckoptions/BUILD.bazel +++ b/ts/deckoptions/BUILD.bazel @@ -61,11 +61,9 @@ ts_library( "lib.ts", "steps.ts", "strings.ts", - "textInputModal.ts", ], module_name = "deckoptions", deps = [ - "TextInputModal", "//ts:image_module_support", "//ts/lib", "//ts/lib:backend_proto", diff --git a/ts/deckoptions/ConfigSelector.svelte b/ts/deckoptions/ConfigSelector.svelte index 836f53559..d75918f05 100644 --- a/ts/deckoptions/ConfigSelector.svelte +++ b/ts/deckoptions/ConfigSelector.svelte @@ -6,8 +6,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import * as tr from "lib/i18n"; import type { DeckOptionsState, ConfigListEntry } from "./lib"; - import WithTheming from "components/WithTheming.svelte"; + import TextInputModal from "./TextInputModal.svelte"; import StickyBar from "components/StickyBar.svelte"; + import WithTheming from "components/WithTheming.svelte"; import ButtonToolbar from "components/ButtonToolbar.svelte"; import ButtonToolbarItem from "components/ButtonToolbarItem.svelte"; import ButtonGroup from "components/ButtonGroup.svelte"; @@ -20,6 +21,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html export let state: DeckOptionsState; let configList = state.configList; + let addModalKey: string; + let renameModalKey: string; + function configLabel(entry: ConfigListEntry): string { const count = tr.deckConfigUsedByDecks({ decks: entry.useCount }); return `${entry.name} (${count})`; @@ -28,8 +32,31 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html function blur(event: Event): void { state.setCurrentIndex(parseInt((event.target! as HTMLSelectElement).value)); } + + function onAddConfig(text: string): void { + const trimmed = text.trim(); + if (trimmed.length) { + state.addConfig(trimmed); + } + } + + function onRenameConfig(text: string): void { + state.setCurrentName(text); + } + + + @@ -50,7 +77,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html - + diff --git a/ts/deckoptions/DeckOptionsPage.svelte b/ts/deckoptions/DeckOptionsPage.svelte index 809c93bda..32eacae6d 100644 --- a/ts/deckoptions/DeckOptionsPage.svelte +++ b/ts/deckoptions/DeckOptionsPage.svelte @@ -41,21 +41,5 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html onDestroy(() => registerCleanup?.()); - - - -
- - -
- -
-
+ diff --git a/ts/deckoptions/SaveButton.svelte b/ts/deckoptions/SaveButton.svelte index 9bc6d1f31..28a79dc5a 100644 --- a/ts/deckoptions/SaveButton.svelte +++ b/ts/deckoptions/SaveButton.svelte @@ -4,8 +4,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html --> @@ -78,8 +69,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html - Add Config - Rename Config + Add Config + Rename Config Remove Config save(true)}> diff --git a/ts/deckoptions/TextInputModal.svelte b/ts/deckoptions/TextInputModal.svelte index d1f24cd02..e694f8736 100644 --- a/ts/deckoptions/TextInputModal.svelte +++ b/ts/deckoptions/TextInputModal.svelte @@ -7,43 +7,40 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html @typescript-eslint/no-non-null-assertion: "off", */ import { onMount, onDestroy, getContext } from "svelte"; - import { nightModeKey } from "components/contextKeys"; + import { nightModeKey, modalsKey } from "components/contextKeys"; import Modal from "bootstrap/js/dist/modal"; export let title: string; export let prompt: string; - export let startingValue = ""; + export let value = ""; export let onOk: (text: string) => void; - let inputRef: HTMLInputElement; + export const modalKey: string = Math.random().toString(36).substring(2); + + const modals = getContext>(modalsKey); + + let modalRef: HTMLDivElement; let modal: Modal; - function onShown(): void { - inputRef.focus(); - } - - function onHidden(): void { - const container = document.getElementById("modal")!; - container.removeChild(container.firstElementChild!); - } + let inputRef: HTMLInputElement; function onOkClicked(): void { onOk(inputRef.value); modal.hide(); } + function onShown(): void { + inputRef.focus(); + } + onMount(() => { - const container = document.getElementById("modal")!; - container.addEventListener("shown.bs.modal", onShown); - container.addEventListener("hidden.bs.modal", onHidden); - modal = new Modal(container.firstElementChild!, {}); - modal.show(); + modalRef.addEventListener("shown.bs.modal", onShown); + modal = new Modal(modalRef); + modals.set(modalKey, modal); }); onDestroy(() => { - const container = document.getElementById("modal")!; - container.removeEventListener("shown.bs.modal", onShown); - container.removeEventListener("hidden.bs.modal", onHidden); + modalRef.removeEventListener("shown.bs.modal", onShown); }); const nightMode = getContext(nightModeKey); @@ -60,7 +57,12 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html } -