schemas and fields

This commit is contained in:
2026-01-07 23:49:55 +02:00
parent 874ddd33e2
commit 53f9548966
17 changed files with 573 additions and 240 deletions
+19 -12
View File
@@ -1,9 +1,9 @@
<script>
import RenderField from "./RenderField.svelte";
import Avatar from "../account/Avatar.svelte";
import Avatar from "../../common/Avatar.svelte";
import Status from "../records/Status.svelte";
import {usernameById} from "../account/users";
import {friendlyDate} from "../../helpers";
import { usernameById } from "../account/users";
import { friendlyDate } from "../../helpers";
export let schema;
export let users;
@@ -12,7 +12,6 @@
export let sortParam;
export let sortField;
export let visibleColumns;
</script>
{#each visibleColumns as field, index}
@@ -20,7 +19,7 @@
class="field-ui-{field.info.name}"
class:is-sort={field.name === sortField.name}
>
<RenderField {record} {schema} {graph} {field}/>
<RenderField {record} {schema} {graph} {field} />
</td>
{/each}
{#if schema.visible?.includes("status")}
@@ -28,32 +27,40 @@
class="text-center"
class:is-sort={"-status" == sortParam || "status" == sortParam}
>
<Status status={record.status}/>
<Status status={record.status} />
</td>
{/if}
{#if schema.visible?.includes("_sys.createdBy")}
<td
class="text-center"
class:is-sort={"-_sys.createdBy" == sortParam || "_sys.createdBy" == sortParam}
class:is-sort={"-_sys.createdBy" == sortParam ||
"_sys.createdBy" == sortParam}
>
<Avatar name={usernameById(users, record._sys.createdBy)} side={24}/>
<Avatar name={usernameById(users, record._sys.createdBy)} side={24} />
</td>
{/if}
{#if schema.visible?.includes("_sys.updatedBy")}
<td
class="text-center"
class:is-sort={"-_sys.updatedBy" == sortParam || "_sys.updatedBy" == sortParam}
class:is-sort={"-_sys.updatedBy" == sortParam ||
"_sys.updatedBy" == sortParam}
>
<Avatar name={usernameById(users, record._sys.updatedBy)} side={24}/>
<Avatar name={usernameById(users, record._sys.updatedBy)} side={24} />
</td>
{/if}
{#if schema.visible?.includes("_sys.createdAt")}
<td class:is-sort={"-_sys.createdAt" == sortParam || "_sys.createdAt" == sortParam}>
<td
class:is-sort={"-_sys.createdAt" == sortParam ||
"_sys.createdAt" == sortParam}
>
{friendlyDate(record._sys.createdAt)}
</td>
{/if}
{#if schema.visible?.includes("_sys.updatedAt")}
<td class:is-sort={"-_sys.updatedAt" == sortParam || "_sys.updatedAt" == sortParam}>
<td
class:is-sort={"-_sys.updatedAt" == sortParam ||
"_sys.updatedAt" == sortParam}
>
{friendlyDate(record._sys.updatedAt)}
</td>
{/if}
+115 -92
View File
@@ -1,13 +1,13 @@
<script>
import RecordRow from "./RecordRow.svelte";
import {previewTitle} from "../records/Preview";
import {usernameById} from "../account/users";
import {getContext} from "svelte";
import Avatar from "../account/Avatar.svelte";
import {selectRecord, toggleAll} from "./functions/recordSelect.js";
import { previewTitle } from "../records/Preview";
import { usernameById } from "../account/users";
import { getContext } from "svelte";
import Avatar from "../../common/Avatar.svelte";
import { selectRecord, toggleAll } from "./functions/recordSelect.js";
import Checkbox from "../common/Checkbox.svelte";
import Preview from "../files/Preview.svelte";
import {fileurl} from "../files/imageserver.js";
import { fileurl } from "../files/imageserver.js";
const channel = getContext("channel");
@@ -23,107 +23,134 @@
export let selected = [];
function eventToggleAll(e) {
selected = toggleAll(e, records, selected)
selected = toggleAll(e, records, selected);
}
function select(record) {
selected = selectRecord(record, selected)
selected = selectRecord(record, selected);
}
$: visibleColumns = schema.fields.filter(c => schema.visible?.includes(c.name) ?? [])
$: visibleColumns = schema.fields.filter(
(c) => schema.visible?.includes(c.name) ?? [],
);
</script>
<div class="table mt-5 ">
<div class="table mt-5">
<table>
<thead>
<tr>
{#if isWritable}
<th>
<Checkbox
<tr>
{#if isWritable}
<th>
<Checkbox
value=""
on:change={eventToggleAll}
indeterminate={selected.length > 0 && selected.length < records.length}
indeterminate={selected.length > 0 &&
selected.length < records.length}
checked={selected.length === records.length}
>
</Checkbox>
</th>
{/if}
></Checkbox>
</th>
{/if}
{#each visibleColumns as field}
<th
{#each visibleColumns as field}
<th
class="field-ui-{field.info.name ?? field.ui}"
class:is-sort={field.name === sortField.name}
scope="col"
title={field.help}
>{field.label}</th
>
{/each}
{#each systemFields.filter(c => schema.visible?.includes(c.name)) as sysField}
<th class:is-sort={sysField.name === sortField.name}>{sysField.label}</th>
{/each}
<th></th>
</tr>
title={field.help}>{field.label}</th
>
{/each}
{#each systemFields.filter( (c) => schema.visible?.includes(c.name), ) as sysField}
<th class:is-sort={sysField.name === sortField.name}
>{sysField.label}</th
>
{/each}
<th></th>
</tr>
</thead>
<tbody>
{#each records as record (record.id)}
<tr>
<td class="title-td">
<div
class="title-td-contents"
>
{#if isWritable}
<Checkbox
{#each records as record (record.id)}
<tr>
<td class="title-td">
<div class="title-td-contents">
{#if isWritable}
<Checkbox
on:change={() => select(record)}
checked={selected.find((r) => r.id === record.id)}
checked={selected.find(
(r) => r.id === record.id,
)}
value={record}
>
</Checkbox>
></Checkbox>
{/if}
{#if record._file?.path}
<div class="file-table-row">
<Preview
{record}
size={record._file?.width > 0
? "medium"
: "small"}
/>
{/if}
{#if record._file?.path}
<div class="file-table-row">
<Preview record={record} size={record._file?.width > 0 ? "medium" : "small"}/>
<div>
{#if record.status === "draft"}
<span style="text-transform: uppercase;font-size:10px">{record.status}</span>
{/if}
<a
<div>
{#if record.status === "draft"}
<span
style="text-transform: uppercase;font-size:10px"
>{record.status}</span
>
{/if}
<a
href="{channel.lucentUrl}/records/{record.id}"
target={inModal ? "_blank" : "_self"}
>
{previewTitle(channel.schemas, record, graph)}
</a>
<span>{(record._file.size / 1024).toFixed(1)}kB</span>
target={inModal
? "_blank"
: "_self"}
>
{previewTitle(
channel.schemas,
record,
graph,
)}
</a>
<span
>{(
record._file.size / 1024
).toFixed(1)}kB</span
>
{#if record._file.width > 0}
<span>{record._file.width + "x" + record._file.height}</span>
{/if}
<a
href="{fileurl(channel,record)}"
{#if record._file.width > 0}
<span
>{record._file.width +
"x" +
record._file.height}</span
>
{/if}
<a
href={fileurl(channel, record)}
target="_blank"
>
Download
</a>
>
Download
</a>
</div>
</div>
</div>
{:else}
<a
{:else}
<a
href="{channel.lucentUrl}/records/{record.id}"
target={inModal ? "_blank" : "_self"}
>
{#if record.status === "draft"}
<span style="text-transform: uppercase;font-size:10px">{record.status}</span>
{/if}
{previewTitle(channel.schemas, record, graph)}
</a>
{/if}
</div>
</td>
<RecordRow
>
{#if record.status === "draft"}
<span
style="text-transform: uppercase;font-size:10px"
>{record.status}</span
>
{/if}
{previewTitle(
channel.schemas,
record,
graph,
)}
</a>
{/if}
</div>
</td>
<RecordRow
{record}
{graph}
{schema}
@@ -131,19 +158,15 @@
{sortParam}
{sortField}
{users}
/>
<td>
<Avatar
name={usernameById(
users,
record._sys.updatedBy
)}
side={24}
/>
</td>
</tr>
{/each}
<td>
<Avatar
name={usernameById(users, record._sys.updatedBy)}
side={24}
/>
</td>
</tr>
{/each}
</tbody>
</table>
</div>