2021-11-11 23:37:42 +01:00
|
|
|
<script lang="ts">
|
2021-12-21 20:02:47 +01:00
|
|
|
import UpLink from "./display/UpLink.svelte";
|
2022-02-17 16:45:03 +01:00
|
|
|
import type { Component, UpType, Widget } from "../lib/types";
|
2022-09-04 23:29:41 +02:00
|
|
|
import EntryList from "./widgets/EntryList.svelte";
|
2021-12-19 19:20:09 +01:00
|
|
|
import type { UpEntry } from "upend";
|
2021-12-30 19:28:43 +01:00
|
|
|
import Icon from "./utils/Icon.svelte";
|
|
|
|
import IconButton from "./utils/IconButton.svelte";
|
2022-03-22 20:35:01 +01:00
|
|
|
import { createEventDispatcher } from "svelte";
|
|
|
|
const dispatch = createEventDispatcher();
|
2022-10-25 21:47:17 +02:00
|
|
|
import { i18n } from "../i18n";
|
2021-11-11 23:37:42 +01:00
|
|
|
|
2021-12-19 19:20:09 +01:00
|
|
|
export let entries: UpEntry[];
|
2021-11-11 23:37:42 +01:00
|
|
|
export let type: UpType | undefined = undefined;
|
2022-09-06 00:10:24 +02:00
|
|
|
export let widgets: Widget[] | undefined = undefined;
|
2022-01-28 16:46:08 +01:00
|
|
|
export let title: string | undefined = undefined;
|
2021-11-11 23:37:42 +01:00
|
|
|
export let editable = false;
|
|
|
|
export let reverse = false;
|
2022-03-22 20:35:01 +01:00
|
|
|
export let initialWidget: string | undefined = undefined;
|
2021-11-11 23:37:42 +01:00
|
|
|
|
2021-12-01 15:56:12 +01:00
|
|
|
let currentWidget: string | undefined;
|
2021-11-11 23:37:42 +01:00
|
|
|
|
2022-03-22 20:35:01 +01:00
|
|
|
function switchWidget(widget: string) {
|
|
|
|
currentWidget = widget;
|
|
|
|
dispatch("widgetSwitched", currentWidget);
|
|
|
|
}
|
|
|
|
|
2021-11-11 23:37:42 +01:00
|
|
|
let availableWidgets: Widget[] = [];
|
|
|
|
$: {
|
|
|
|
availableWidgets = [
|
2022-01-28 22:27:02 +01:00
|
|
|
{
|
2022-09-04 23:29:41 +02:00
|
|
|
name: "entrylist",
|
2021-11-11 23:37:42 +01:00
|
|
|
icon: "table",
|
|
|
|
components: [
|
|
|
|
{
|
2022-09-04 23:29:41 +02:00
|
|
|
component: EntryList,
|
2021-11-11 23:37:42 +01:00
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
];
|
|
|
|
|
2022-02-02 19:17:30 +01:00
|
|
|
if (type?.widgetInfo.length > 0) {
|
|
|
|
availableWidgets = [...type.widgetInfo, ...availableWidgets];
|
2021-11-11 23:37:42 +01:00
|
|
|
}
|
2022-09-04 23:29:41 +02:00
|
|
|
|
|
|
|
if (widgets?.length) {
|
|
|
|
availableWidgets = [...widgets, ...availableWidgets];
|
|
|
|
}
|
|
|
|
|
2022-03-22 20:35:01 +01:00
|
|
|
if (availableWidgets.map((w) => w.name).includes(initialWidget)) {
|
|
|
|
currentWidget = initialWidget;
|
|
|
|
} else {
|
|
|
|
currentWidget = availableWidgets[0].name;
|
|
|
|
}
|
2021-11-11 23:37:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
let components: Component[] = [];
|
|
|
|
$: {
|
|
|
|
components = availableWidgets.find(
|
|
|
|
(w) => w.name === currentWidget
|
2022-01-30 16:50:23 +01:00
|
|
|
).components;
|
2021-11-11 23:37:42 +01:00
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
2022-01-22 20:19:26 +01:00
|
|
|
<section class="attribute-view labelborder">
|
2021-11-11 23:37:42 +01:00
|
|
|
<header>
|
|
|
|
<h3>
|
2022-02-15 23:10:46 +01:00
|
|
|
{#if !title && type?.address}
|
2021-11-11 23:37:42 +01:00
|
|
|
<UpLink to={{ entity: type.address }}>
|
|
|
|
{#if type.icon}
|
2021-12-02 20:49:59 +01:00
|
|
|
<div class="icon">
|
2021-12-30 19:28:43 +01:00
|
|
|
<Icon name={type.icon} />
|
2021-12-02 20:49:59 +01:00
|
|
|
</div>
|
2021-11-11 23:37:42 +01:00
|
|
|
{/if}
|
2022-01-28 23:34:49 +01:00
|
|
|
{#if type.name != "HIER"}
|
|
|
|
{type.label || type.name || "???"}
|
|
|
|
{:else}
|
2022-10-25 21:47:17 +02:00
|
|
|
{$i18n.t("Members")}
|
2022-01-28 23:34:49 +01:00
|
|
|
{/if}
|
2021-11-11 23:37:42 +01:00
|
|
|
</UpLink>
|
|
|
|
{:else}
|
2022-02-15 23:10:46 +01:00
|
|
|
{title || ""}
|
2021-11-11 23:37:42 +01:00
|
|
|
{/if}
|
|
|
|
</h3>
|
|
|
|
|
2021-12-01 15:56:12 +01:00
|
|
|
{#if currentWidget && (availableWidgets.length > 1 || editable)}
|
2021-11-11 23:37:42 +01:00
|
|
|
<div class="views">
|
|
|
|
{#each availableWidgets as widget (widget.name)}
|
2021-12-30 19:28:43 +01:00
|
|
|
<IconButton
|
2021-11-11 23:37:42 +01:00
|
|
|
name={widget.icon || "question-diamond"}
|
2021-12-30 19:28:43 +01:00
|
|
|
active={widget.name === currentWidget}
|
|
|
|
--active-color="var(--foreground)"
|
2022-03-22 20:35:01 +01:00
|
|
|
on:click={() => switchWidget(widget.name)}
|
2021-11-11 23:37:42 +01:00
|
|
|
/>
|
|
|
|
{/each}
|
|
|
|
</div>
|
|
|
|
{/if}
|
|
|
|
</header>
|
2022-01-28 22:27:02 +01:00
|
|
|
<div class="content">
|
|
|
|
{#if !reverse}
|
|
|
|
{#each components as component}
|
|
|
|
<svelte:component
|
|
|
|
this={component.component}
|
2022-09-04 23:29:41 +02:00
|
|
|
{...(typeof component.props === "function"
|
|
|
|
? component.props(entries)
|
|
|
|
: component.props) || {}}
|
2022-01-28 22:27:02 +01:00
|
|
|
{entries}
|
|
|
|
{editable}
|
|
|
|
on:change
|
|
|
|
/>
|
|
|
|
{/each}
|
|
|
|
{:else}
|
2022-10-22 17:25:45 +02:00
|
|
|
<!-- shut up svelte check -->
|
|
|
|
<svelte:component
|
|
|
|
this={EntryList}
|
|
|
|
columns="entity, attribute"
|
|
|
|
{entries}
|
|
|
|
/>
|
2022-01-28 22:27:02 +01:00
|
|
|
{/if}
|
|
|
|
</div>
|
2021-11-11 23:37:42 +01:00
|
|
|
</section>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
2022-01-22 20:18:57 +01:00
|
|
|
@use "./util";
|
2021-11-11 23:37:42 +01:00
|
|
|
|
2022-01-22 20:19:26 +01:00
|
|
|
.icon {
|
|
|
|
display: inline-block;
|
|
|
|
font-size: 1.25em;
|
|
|
|
margin-top: -0.3em;
|
|
|
|
position: relative;
|
|
|
|
bottom: -2px;
|
|
|
|
}
|
2021-11-11 23:37:42 +01:00
|
|
|
|
2022-01-22 20:19:26 +01:00
|
|
|
.views {
|
|
|
|
display: flex;
|
|
|
|
right: 1ex;
|
|
|
|
font-size: 18px;
|
2021-11-11 23:37:42 +01:00
|
|
|
}
|
|
|
|
</style>
|