MapComplete/src/UI/Studio/MappingInput.svelte

71 lines
2.2 KiB
Svelte
Raw Normal View History

2023-08-23 11:11:53 +02:00
<script lang="ts">
import EditLayerState from "./EditLayerState";
import { UIEventSource } from "../../Logic/UIEventSource";
import type { TagConfigJson } from "../../Models/ThemeConfig/Json/TagConfigJson";
import { TagUtils } from "../../Logic/Tags/TagUtils";
import FromHtml from "../Base/FromHtml.svelte";
import { PencilIcon } from "@rgossiaux/svelte-heroicons/outline";
import Region from "./Region.svelte";
import type { ConfigMeta } from "./configMeta";
import configs from "../../assets/schemas/questionabletagrenderingconfigmeta.json";
import { Utils } from "../../Utils";
2023-11-05 12:05:00 +01:00
import ToSvelte from "../Base/ToSvelte.svelte";
import { VariableUiElement } from "../Base/VariableUIElement";
2023-08-23 11:11:53 +02:00
export let state: EditLayerState;
export let path: (string | number)[];
let tag: UIEventSource<TagConfigJson> = state.getStoreFor([...path, "if"]);
let parsedTag = tag.map(t => t ? TagUtils.Tag(t) : undefined);
let exampleTags = parsedTag.map(pt => {
if (!pt) {
return {};
}
const keys = pt.usedKeys();
const o = {};
for (const key of keys) {
o[key] = "value";
}
return o;
});
let uploadableOnly: boolean = true;
2023-11-05 12:05:00 +01:00
let thenText: UIEventSource<Record<string, string>> = state.getStoreFor([...path, "then"])
let thenTextEn = thenText .mapD(translation => typeof translation === "string" ? translation : translation["en"] )
let editMode = Object.keys($thenText ?? {})?.length === 0;
2023-08-23 11:11:53 +02:00
2023-11-05 12:05:00 +01:00
let mappingConfigs: ConfigMeta[] = configs.filter(c => c.path[0] === "mappings")
2023-08-23 11:11:53 +02:00
.map(c => <ConfigMeta>Utils.Clone(c))
.map(c => {
c.path.splice(0, 1);
return c;
})
.filter(c => c.path.length == 1 && c.hints.group !== "hidden");
</script>
<button on:click={() => {editMode = !editMode}}>
<PencilIcon class="w-6 h-6" />
</button>
{#if editMode}
<div class="flex justify-between items-start w-full">
<div class="flex flex-col w-full">
<Region {state} configs={mappingConfigs} path={path} />
</div>
<slot name="delete" />
</div>
{:else}
<div>
2023-11-05 12:05:00 +01:00
{#if Object.keys($thenText).length > 0}
2023-08-23 11:11:53 +02:00
<b>
2023-11-05 12:05:00 +01:00
{$thenTextEn}
2023-08-23 11:11:53 +02:00
</b>
{:else}
<i>No then is set</i>
{/if}
<FromHtml src={ $parsedTag?.asHumanString(false, false, $exampleTags)} />
</div>
{/if}