upend/webui/src/components/AttributeView.svelte

139 lines
3.4 KiB
Svelte
Raw Normal View History

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";
import type { UpEntry } from "upend";
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();
import { i18n } from "../i18n";
2021-11-11 23:37:42 +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
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>
<section class="attribute-view labelborder">
2021-11-11 23:37:42 +01:00
<header>
<h3>
{#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">
<Icon name={type.icon} />
2021-12-02 20:49:59 +01:00
</div>
2021-11-11 23:37:42 +01:00
{/if}
{#if type.name != "HIER"}
{type.label || type.name || "???"}
{:else}
{$i18n.t("Members")}
{/if}
2021-11-11 23:37:42 +01:00
</UpLink>
{:else}
{title || ""}
2021-11-11 23:37:42 +01:00
{/if}
</h3>
{#if currentWidget && (availableWidgets.length > 1 || editable)}
2021-11-11 23:37:42 +01:00
<div class="views">
{#each availableWidgets as widget (widget.name)}
<IconButton
2021-11-11 23:37:42 +01:00
name={widget.icon || "question-diamond"}
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">
@use "./util";
2021-11-11 23:37:42 +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
.views {
display: flex;
right: 1ex;
font-size: 18px;
2021-11-11 23:37:42 +01:00
}
</style>