1
0
Fork 0
mirror of synced 2024-06-12 23:44:39 +12:00
budibase/packages/builder/src/components/backend/DataTable/Table.svelte

153 lines
3.5 KiB
Svelte
Raw Normal View History

2020-03-11 02:53:23 +13:00
<script>
2020-10-06 02:07:39 +13:00
import { fade } from "svelte/transition"
2021-03-18 00:40:24 +13:00
import { goto, params } from "@roxi/routify"
import { Table, Heading, Layout } from "@budibase/bbui"
2020-10-28 02:04:32 +13:00
import Spinner from "components/common/Spinner.svelte"
import {
TableNames,
UNEDITABLE_USER_FIELDS,
UNSORTABLE_TYPES,
} from "constants"
import RoleCell from "./cells/RoleCell.svelte"
2022-12-13 23:13:17 +13:00
import { createEventDispatcher } from "svelte"
2020-10-27 07:07:08 +13:00
export let schema = {}
export let data = []
2020-10-28 02:04:32 +13:00
export let tableId
export let title
export let loading = false
export let hideAutocolumns
export let rowCount
export let disableSorting = false
export let customPlaceholder = false
2023-05-15 20:14:18 +12:00
export let allowEditing = true
export let allowClickRows
2020-10-21 23:15:02 +13:00
2022-12-13 23:13:17 +13:00
const dispatch = createEventDispatcher()
2020-10-28 02:04:32 +13:00
let selectedRows = []
let customRenderers = []
2020-10-21 23:15:02 +13:00
2022-12-13 23:13:17 +13:00
$: selectedRows, dispatch("selectionUpdated", selectedRows)
$: isUsersTable = tableId === TableNames.USERS
$: data && resetSelectedRows()
$: {
UNSORTABLE_TYPES.forEach(type => {
2021-12-07 06:39:51 +13:00
Object.values(schema || {}).forEach(col => {
if (col.type === type) {
col.sortable = false
}
})
})
}
$: {
if (isUsersTable) {
customRenderers = [
2020-10-28 02:04:32 +13:00
{
column: "roleId",
component: RoleCell,
2020-10-28 02:04:32 +13:00
},
]
2021-05-04 22:32:22 +12:00
UNEDITABLE_USER_FIELDS.forEach(field => {
if (schema[field]) {
schema[field].editable = false
}
})
2021-05-27 01:44:16 +12:00
if (schema.email) {
schema.email.displayName = "Email"
}
if (schema.roleId) {
schema.roleId.displayName = "Role"
}
if (schema.firstName) {
schema.firstName.displayName = "First Name"
}
if (schema.lastName) {
schema.lastName.displayName = "Last Name"
}
if (schema.status) {
schema.status.displayName = "Status"
}
}
2020-10-21 23:15:02 +13:00
}
const resetSelectedRows = () => {
selectedRows = []
2020-10-21 23:15:02 +13:00
}
const selectRelationship = ({ tableId, rowId, fieldName }) => {
$goto(
`/builder/app/${$params.application}/data/table/${tableId}/relationship/${rowId}/${fieldName}`
)
}
2020-03-11 02:53:23 +13:00
</script>
<Layout noPadding gap="S">
<Layout noPadding gap="XS">
2021-12-07 06:39:51 +13:00
{#if title}
<div class="table-title">
<Heading size="M">{title}</Heading>
2021-12-07 06:39:51 +13:00
{#if loading}
<div transition:fade|local>
<Spinner size="10" />
</div>
{/if}
</div>
{/if}
<div class="popovers">
<slot />
</div>
</Layout>
{#key tableId}
<div class="table-wrapper">
<Table
{data}
{schema}
{loading}
{customRenderers}
{rowCount}
{disableSorting}
{customPlaceholder}
allowEditRows={allowEditing}
showAutoColumns={!hideAutocolumns}
{allowClickRows}
on:clickrelationship={e => selectRelationship(e.detail)}
on:sort
>
<slot slot="placeholder" name="placeholder" />
</Table>
</div>
{/key}
</Layout>
2020-03-11 02:53:23 +13:00
<style>
2020-10-28 04:26:07 +13:00
.table-title {
2020-10-24 00:25:22 +13:00
height: 24px;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
2020-10-28 04:26:07 +13:00
.table-title > div {
2020-10-24 00:25:22 +13:00
margin-left: var(--spacing-xs);
}
.table-wrapper {
overflow: hidden;
}
2020-10-24 00:25:22 +13:00
.popovers {
2020-10-06 02:07:39 +13:00
display: flex;
flex-direction: row;
justify-content: flex-start;
2020-10-06 02:07:39 +13:00
align-items: center;
2021-04-09 21:10:37 +12:00
gap: var(--spacing-s);
2020-10-06 02:07:39 +13:00
}
.popovers :global(button) {
font-weight: 600;
margin-top: var(--spacing-l);
2020-10-24 00:25:22 +13:00
}
.popovers :global(button svg) {
2020-10-06 02:07:39 +13:00
margin-right: var(--spacing-xs);
}
2020-03-11 05:06:30 +13:00
</style>