2026-01-10 02:09:50 +02:00
|
|
|
<script>
|
|
|
|
|
import { get, post } from "../../../modules/remote";
|
|
|
|
|
import { getApp } from "../../../app";
|
|
|
|
|
import { getLocaleName } from "../locale.svelte.js";
|
2026-01-10 13:40:33 +02:00
|
|
|
let {
|
|
|
|
|
channel,
|
|
|
|
|
record,
|
|
|
|
|
schemaField,
|
|
|
|
|
dataField,
|
|
|
|
|
locale,
|
|
|
|
|
validationError,
|
|
|
|
|
edgeRecordPreviews,
|
|
|
|
|
} = $props();
|
2026-01-10 02:09:50 +02:00
|
|
|
let originalValue = dataField?.value ?? schemaField.props.default;
|
|
|
|
|
let newValue = $state(originalValue);
|
|
|
|
|
let valuesChanged = $derived(newValue !== originalValue);
|
|
|
|
|
let errorMessage = $state("");
|
|
|
|
|
// let validationErrorState = $state(validationError);
|
|
|
|
|
let hasError = $derived(!!validationError);
|
|
|
|
|
const app = getApp();
|
|
|
|
|
|
|
|
|
|
let suggestionsLoaded = $state(false);
|
|
|
|
|
let suggestions = $state([]);
|
2026-01-10 13:40:33 +02:00
|
|
|
let selectedRecordIds = $state([]);
|
|
|
|
|
let dialog = $state();
|
2026-01-10 02:09:50 +02:00
|
|
|
|
2026-01-10 13:40:33 +02:00
|
|
|
function handleModalOpen(e) {
|
2026-01-10 02:09:50 +02:00
|
|
|
// Add logic to handle adding a record
|
2026-01-10 13:40:33 +02:00
|
|
|
dialog.showModal();
|
2026-01-10 02:09:50 +02:00
|
|
|
if (suggestionsLoaded) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
get(
|
|
|
|
|
app.url("records/suggest"),
|
|
|
|
|
{ schemas: schemaField.props.schemas },
|
|
|
|
|
(data, err) => {
|
|
|
|
|
suggestionsLoaded = true;
|
|
|
|
|
suggestions = data;
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-10 13:40:33 +02:00
|
|
|
function handleModalClose(e) {
|
|
|
|
|
dialog.close();
|
|
|
|
|
}
|
2026-01-10 02:09:50 +02:00
|
|
|
|
2026-01-10 13:40:33 +02:00
|
|
|
function handleInsertSelected() {
|
|
|
|
|
suggestionsLoaded = false;
|
2026-01-10 02:09:50 +02:00
|
|
|
post(
|
2026-01-10 13:40:33 +02:00
|
|
|
app.url("edges/many"),
|
2026-01-10 02:09:50 +02:00
|
|
|
{
|
2026-01-10 13:40:33 +02:00
|
|
|
toIds: selectedRecordIds,
|
|
|
|
|
from: record.id,
|
|
|
|
|
fieldId: schemaField.id,
|
2026-01-10 02:09:50 +02:00
|
|
|
locale: locale,
|
|
|
|
|
},
|
|
|
|
|
(data, err) => {
|
2026-01-10 13:40:33 +02:00
|
|
|
suggestionsLoaded = true;
|
|
|
|
|
dialog.close();
|
2026-01-12 19:25:40 +02:00
|
|
|
edgeRecordPreviews = data;
|
2026-01-10 02:09:50 +02:00
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<div style="min-width: 400px;">
|
|
|
|
|
<label>
|
|
|
|
|
{#if locale !== "main"}
|
|
|
|
|
{getLocaleName(channel, locale)} >
|
|
|
|
|
{/if}
|
|
|
|
|
{schemaField.name} <br />
|
2026-01-10 13:40:33 +02:00
|
|
|
</label>
|
|
|
|
|
{#if hasError}
|
|
|
|
|
<small id={schemaField.id + "-help"}>{validationError.message}</small>
|
|
|
|
|
{:else if schemaField.help != ""}
|
|
|
|
|
<small id={schemaField.id + "-help"}>{schemaField.help}</small>
|
|
|
|
|
{/if}
|
|
|
|
|
|
|
|
|
|
<button onclick={handleModalOpen}>Choose record</button>
|
|
|
|
|
|
|
|
|
|
<dialog bind:this={dialog}>
|
|
|
|
|
<article>
|
|
|
|
|
<header>
|
|
|
|
|
<button onclick={handleModalClose} aria-label="Close" rel="prev"
|
|
|
|
|
></button>
|
|
|
|
|
<p>
|
|
|
|
|
<strong>Records</strong>
|
|
|
|
|
</p>
|
|
|
|
|
</header>
|
2026-01-10 02:09:50 +02:00
|
|
|
{#if suggestionsLoaded}
|
2026-01-10 13:40:33 +02:00
|
|
|
<form>
|
|
|
|
|
<button onclick={handleInsertSelected}>
|
|
|
|
|
Insert selected
|
|
|
|
|
</button>
|
|
|
|
|
<table>
|
|
|
|
|
<tbody>
|
|
|
|
|
{#each suggestions as suggestion}
|
|
|
|
|
<tr>
|
|
|
|
|
<td>
|
|
|
|
|
<input
|
|
|
|
|
type="checkbox"
|
|
|
|
|
value={suggestion.id}
|
|
|
|
|
bind:group={selectedRecordIds}
|
|
|
|
|
/>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<a href="#">{suggestion.title}</a>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<a href="#">
|
|
|
|
|
{suggestion.schemaName}
|
|
|
|
|
</a>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
{/each}
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
</form>
|
2026-01-10 02:09:50 +02:00
|
|
|
{:else}
|
|
|
|
|
<progress />
|
|
|
|
|
{/if}
|
2026-01-10 13:40:33 +02:00
|
|
|
</article>
|
|
|
|
|
</dialog>
|
|
|
|
|
<div>
|
|
|
|
|
{#if edgeRecordPreviews.length == 0}
|
|
|
|
|
No relations exist
|
|
|
|
|
{:else}
|
|
|
|
|
{#each edgeRecordPreviews as edgeRecordPreview}
|
|
|
|
|
<div>
|
|
|
|
|
<a href="#">{edgeRecordPreview.recordPreview.title}</a>
|
|
|
|
|
{edgeRecordPreview.recordPreview.schemaName}
|
|
|
|
|
</div>
|
|
|
|
|
{/each}
|
2026-01-10 02:09:50 +02:00
|
|
|
{/if}
|
2026-01-10 13:40:33 +02:00
|
|
|
</div>
|
2026-01-10 02:09:50 +02:00
|
|
|
</div>
|