You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

121 lines
3.8 KiB

<script lang="ts">
import { runCommand } from "$lib/client/lucifer";
import HSplit from "$lib/components/HSplit.svelte";
import HSplitPart from "$lib/components/HSplitPart.svelte";
import Modal from "$lib/components/Modal.svelte";
import ModalBody from "$lib/components/ModalBody.svelte";
import ModalSection from "$lib/components/ModalSection.svelte";
import ScriptLineBlock from "$lib/components/scripting/ScriptLineBlock.svelte";
import { getModalContext } from "$lib/contexts/ModalContext.svelte";
import { getSelectedContext } from "$lib/contexts/SelectContext.svelte";
import { getStateContext } from "$lib/contexts/StateContext.svelte";
import { toEditableScriptLine, type ScriptLineEditable, fromEditableScriptLine } from "$lib/models/script";
const { state } = getStateContext();
const { selectedMasks } = getSelectedContext();
const { modal } = getModalContext();
let show = false;
let disabled = false;
let selectedScript = "";
let runMatch = "";
let newScriptName = "New Script";
let current: ScriptLineEditable[] = [];
function onOpen() {
disabled = false;
current = [];
selectedScript = scriptNames?.[0] || "";
loadScript(selectedScript);
}
async function onSubmit() {
disabled = true;
try {
await runCommand({updateScript: { name: selectedScript || newScriptName, lines: current.map(fromEditableScriptLine) }});
if (runMatch !== "") {
await runCommand({executeScript: { name: selectedScript || newScriptName, match: runMatch, }});
}
await new Promise(resolve => setTimeout(resolve, 500));
selectedScript = selectedScript || newScriptName;
} catch(_) {}
disabled = false;
}
function loadScript(name: string) {
if (name === "") {
current = [];
} else {
current = $state?.scripts[name]?.map(toEditableScriptLine) || [];
}
}
function addLine() {
current = [
...current,
toEditableScriptLine({if: {
condition: { scope: "global", key: "", op: "eq" },
then: [],
else: [],
}})
]
}
$: if ($modal.kind === "script.edit") {
show = true;
onOpen();
} else {
show = false;
}
$: scriptNames = Object.keys($state?.scripts||{}).sort();
$: loadScript(selectedScript);
$: if (!$selectedMasks.includes(runMatch)) { runMatch = ""; }
</script>
<form novalidate on:submit|preventDefault={onSubmit}>
<Modal
ultrawide closable show={show}
titleText="Script Editor"
disabled={disabled || (selectedScript === "" && current.length === 0)}
submitText={(current.length > 0 || selectedScript === "") ? "Save Script" : "Delete Script"}
>
<ModalBody>
<HSplit>
<HSplitPart weight={33.3}>
<label for="mask">Script</label>
<select bind:value={selectedScript}>
{#each scriptNames as scriptName}
<option value={scriptName}>{scriptName}</option>
{/each}
<option value="">New Script</option>
</select>
</HSplitPart>
<HSplitPart weight={33.3}>
{#if selectedScript === ""}
<label for="mask">New Script Name</label>
<input type="text" bind:value={newScriptName}>
{/if}
</HSplitPart>
<HSplitPart weight={33.4}>
{#if $selectedMasks.length > 0}
<label for="mask">Run on Save</label>
<select bind:value={runMatch}>
<option value="">Don't Run</option>
{#each $selectedMasks as option (option)}
<option value={option}>{option}</option>
{/each}
</select>
{/if}
</HSplitPart>
</HSplit>
<ModalSection expanded disableExpandToggle title="Edit Script">
<ScriptLineBlock add on:add={addLine} label="Script" bind:value={current} />
</ModalSection>
</ModalBody>
</Modal>
</form>