Files
lucent-laravel/front/js/svelte/content/Table.svelte
T

173 lines
7.0 KiB
Svelte
Raw Normal View History

2023-10-02 23:10:49 +03:00
<script>
import RecordRow from "./RecordRow.svelte";
2026-01-07 23:49:55 +02:00
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";
2024-08-15 18:52:53 +03:00
import Checkbox from "../common/Checkbox.svelte";
2024-08-15 22:11:26 +03:00
import Preview from "../files/Preview.svelte";
2026-01-07 23:49:55 +02:00
import { fileurl } from "../files/imageserver.js";
2023-10-02 23:10:49 +03:00
const channel = getContext("channel");
export let schema;
export let users;
export let records;
export let graph;
export let systemFields;
2023-10-23 19:43:59 +03:00
export let sortParam;
export let sortField;
2023-10-02 23:10:49 +03:00
export let inModal;
2023-10-17 22:57:25 +03:00
export let isWritable;
2023-10-02 23:10:49 +03:00
export let selected = [];
2023-11-17 21:22:26 +02:00
function eventToggleAll(e) {
2026-01-07 23:49:55 +02:00
selected = toggleAll(e, records, selected);
2023-10-02 23:10:49 +03:00
}
2023-11-17 21:22:26 +02:00
function select(record) {
2026-01-07 23:49:55 +02:00
selected = selectRecord(record, selected);
2023-10-02 23:10:49 +03:00
}
2026-01-07 23:49:55 +02:00
$: visibleColumns = schema.fields.filter(
(c) => schema.visible?.includes(c.name) ?? [],
);
2023-10-02 23:10:49 +03:00
</script>
2026-01-07 23:49:55 +02:00
<div class="table mt-5">
2024-08-15 18:52:53 +03:00
<table>
<thead>
2026-01-07 23:49:55 +02:00
<tr>
{#if isWritable}
<th>
<Checkbox
2024-08-15 22:11:26 +03:00
value=""
2024-08-15 18:52:53 +03:00
on:change={eventToggleAll}
2026-01-07 23:49:55 +02:00
indeterminate={selected.length > 0 &&
selected.length < records.length}
2024-08-15 18:52:53 +03:00
checked={selected.length === records.length}
2026-01-07 23:49:55 +02:00
></Checkbox>
</th>
{/if}
2023-10-02 23:10:49 +03:00
2026-01-07 23:49:55 +02:00
{#each visibleColumns as field}
<th
2023-11-17 21:22:26 +02:00
class="field-ui-{field.info.name ?? field.ui}"
2023-10-23 19:43:59 +03:00
class:is-sort={field.name === sortField.name}
2023-10-08 13:46:05 +03:00
scope="col"
2026-01-07 23:49:55 +02:00
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>
2023-10-02 23:10:49 +03:00
</thead>
<tbody>
2026-01-07 23:49:55 +02:00
{#each records as record (record.id)}
<tr>
<td class="title-td">
<div class="title-td-contents">
{#if isWritable}
<Checkbox
2024-08-15 18:52:53 +03:00
on:change={() => select(record)}
2026-01-07 23:49:55 +02:00
checked={selected.find(
(r) => r.id === record.id,
)}
2024-08-15 18:52:53 +03:00
value={record}
2026-01-07 23:49:55 +02:00
></Checkbox>
{/if}
{#if record._file?.path}
<div class="file-table-row">
<Preview
{record}
size={record._file?.width > 0
? "medium"
: "small"}
/>
2023-10-02 23:10:49 +03:00
2026-01-07 23:49:55 +02:00
<div>
{#if record.status === "draft"}
<span
style="text-transform: uppercase;font-size:10px"
>{record.status}</span
>
{/if}
<a
2024-08-17 20:31:04 +03:00
href="{channel.lucentUrl}/records/{record.id}"
2026-01-07 23:49:55 +02:00
target={inModal
? "_blank"
: "_self"}
>
{previewTitle(
channel.schemas,
record,
graph,
)}
</a>
<span
>{(
record._file.size / 1024
).toFixed(1)}kB</span
>
2024-08-17 20:31:04 +03:00
2026-01-07 23:49:55 +02:00
{#if record._file.width > 0}
<span
>{record._file.width +
"x" +
record._file.height}</span
>
{/if}
<a
href={fileurl(channel, record)}
2024-08-17 20:31:04 +03:00
target="_blank"
2026-01-07 23:49:55 +02:00
>
Download
</a>
</div>
2024-08-17 20:31:04 +03:00
</div>
2026-01-07 23:49:55 +02:00
{:else}
<a
2024-08-17 20:31:04 +03:00
href="{channel.lucentUrl}/records/{record.id}"
target={inModal ? "_blank" : "_self"}
2026-01-07 23:49:55 +02:00
>
{#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
2023-10-08 13:46:05 +03:00
{record}
{graph}
{schema}
{visibleColumns}
2023-10-23 19:43:59 +03:00
{sortParam}
{sortField}
2023-10-08 13:46:05 +03:00
{users}
2024-08-15 22:11:26 +03:00
/>
2026-01-07 23:49:55 +02:00
<td>
<Avatar
name={usernameById(users, record._sys.updatedBy)}
side={24}
/>
</td>
</tr>
{/each}
2023-10-02 23:10:49 +03:00
</tbody>
</table>
</div>