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"
|
2023-04-13 23:01:16 +12:00
|
|
|
import { Table, Heading, Layout } from "@budibase/bbui"
|
2020-10-28 02:04:32 +13:00
|
|
|
import Spinner from "components/common/Spinner.svelte"
|
2021-11-09 06:25:05 +13:00
|
|
|
import {
|
|
|
|
TableNames,
|
|
|
|
UNEDITABLE_USER_FIELDS,
|
|
|
|
UNSORTABLE_TYPES,
|
|
|
|
} from "constants"
|
2021-04-10 01:21:27 +12:00
|
|
|
import RoleCell from "./cells/RoleCell.svelte"
|
2022-12-13 23:13:17 +13:00
|
|
|
import { createEventDispatcher } from "svelte"
|
2020-10-01 19:19:38 +13:00
|
|
|
|
2020-10-27 07:07:08 +13:00
|
|
|
export let schema = {}
|
2020-08-18 08:01:43 +12:00
|
|
|
export let data = []
|
2020-10-28 02:04:32 +13:00
|
|
|
export let tableId
|
2020-08-18 08:01:43 +12:00
|
|
|
export let title
|
2020-10-07 22:45:26 +13:00
|
|
|
export let loading = false
|
2021-02-17 07:29:38 +13:00
|
|
|
export let hideAutocolumns
|
2021-04-20 22:53:19 +12:00
|
|
|
export let rowCount
|
2021-09-24 03:08:47 +12:00
|
|
|
export let disableSorting = false
|
2022-04-08 02:30:55 +12:00
|
|
|
export let customPlaceholder = false
|
2023-05-15 20:14:18 +12:00
|
|
|
export let allowEditing = true
|
2023-05-03 22:22:38 +12:00
|
|
|
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 = []
|
2021-04-10 01:21:27 +12:00
|
|
|
let customRenderers = []
|
2020-10-21 23:15:02 +13:00
|
|
|
|
2022-12-13 23:13:17 +13:00
|
|
|
$: selectedRows, dispatch("selectionUpdated", selectedRows)
|
2020-12-08 08:05:39 +13:00
|
|
|
$: isUsersTable = tableId === TableNames.USERS
|
2021-04-13 01:45:41 +12:00
|
|
|
$: data && resetSelectedRows()
|
2021-11-09 06:25:05 +13:00
|
|
|
$: {
|
|
|
|
UNSORTABLE_TYPES.forEach(type => {
|
2021-12-07 06:39:51 +13:00
|
|
|
Object.values(schema || {}).forEach(col => {
|
2021-11-09 06:25:05 +13:00
|
|
|
if (col.type === type) {
|
|
|
|
col.sortable = false
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
2020-12-08 08:05:39 +13:00
|
|
|
$: {
|
|
|
|
if (isUsersTable) {
|
2021-04-10 01:21:27 +12:00
|
|
|
customRenderers = [
|
2020-10-28 02:04:32 +13:00
|
|
|
{
|
2021-04-10 01:21:27 +12: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 => {
|
2021-04-10 01:21:27 +12:00
|
|
|
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"
|
|
|
|
}
|
2021-02-24 06:13:46 +13:00
|
|
|
if (schema.status) {
|
2021-04-09 02:57:24 +12:00
|
|
|
schema.status.displayName = "Status"
|
2020-12-09 03:03:47 +13:00
|
|
|
}
|
|
|
|
}
|
2020-10-21 23:15:02 +13:00
|
|
|
}
|
2020-12-09 03:03:47 +13:00
|
|
|
|
2021-04-13 01:45:41 +12:00
|
|
|
const resetSelectedRows = () => {
|
|
|
|
selectedRows = []
|
2020-10-21 23:15:02 +13:00
|
|
|
}
|
2020-10-01 19:19:38 +13:00
|
|
|
|
2021-04-13 02:12:59 +12:00
|
|
|
const selectRelationship = ({ tableId, rowId, fieldName }) => {
|
2020-10-03 00:00:17 +13:00
|
|
|
$goto(
|
2021-05-07 19:17:21 +12:00
|
|
|
`/builder/app/${$params.application}/data/table/${tableId}/relationship/${rowId}/${fieldName}`
|
2020-10-03 00:00:17 +13:00
|
|
|
)
|
2020-10-01 19:19:38 +13:00
|
|
|
}
|
2020-03-11 02:53:23 +13:00
|
|
|
</script>
|
|
|
|
|
2021-09-24 03:08:47 +12:00
|
|
|
<Layout noPadding gap="S">
|
2022-04-08 21:28:07 +12:00
|
|
|
<Layout noPadding gap="XS">
|
2021-12-07 06:39:51 +13:00
|
|
|
{#if title}
|
|
|
|
<div class="table-title">
|
2022-04-08 21:28:07 +12:00
|
|
|
<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}
|
2021-09-24 03:08:47 +12:00
|
|
|
<div class="popovers">
|
|
|
|
<slot />
|
|
|
|
</div>
|
2022-04-08 21:28:07 +12:00
|
|
|
</Layout>
|
2021-09-24 03:08:47 +12:00
|
|
|
{#key tableId}
|
2022-02-19 03:12:29 +13:00
|
|
|
<div class="table-wrapper">
|
2021-09-29 22:33:55 +13:00
|
|
|
<Table
|
|
|
|
{data}
|
|
|
|
{schema}
|
|
|
|
{loading}
|
|
|
|
{customRenderers}
|
|
|
|
{rowCount}
|
|
|
|
{disableSorting}
|
2022-04-08 02:30:55 +12:00
|
|
|
{customPlaceholder}
|
2023-05-04 22:21:24 +12:00
|
|
|
allowEditRows={allowEditing}
|
2021-09-29 22:33:55 +13:00
|
|
|
showAutoColumns={!hideAutocolumns}
|
2023-05-03 22:22:38 +12:00
|
|
|
{allowClickRows}
|
2021-09-29 22:33:55 +13:00
|
|
|
on:clickrelationship={e => selectRelationship(e.detail)}
|
|
|
|
on:sort
|
2022-04-08 02:30:55 +12:00
|
|
|
>
|
|
|
|
<slot slot="placeholder" name="placeholder" />
|
|
|
|
</Table>
|
2021-09-29 22:33:55 +13:00
|
|
|
</div>
|
2021-09-24 03:08:47 +12:00
|
|
|
{/key}
|
|
|
|
</Layout>
|
2021-04-09 02:57:24 +12:00
|
|
|
|
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);
|
|
|
|
}
|
2021-09-30 00:07:35 +13:00
|
|
|
.table-wrapper {
|
|
|
|
overflow: hidden;
|
|
|
|
}
|
2020-10-24 00:25:22 +13:00
|
|
|
|
|
|
|
.popovers {
|
2020-10-06 02:07:39 +13:00
|
|
|
display: flex;
|
2020-10-07 22:45:26 +13:00
|
|
|
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
|
|
|
}
|
2021-09-29 21:05:04 +13:00
|
|
|
.popovers :global(button) {
|
2021-05-25 21:11:41 +12:00
|
|
|
font-weight: 600;
|
2020-10-29 04:20:56 +13:00
|
|
|
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-04-03 03:11:27 +13:00
|
|
|
}
|
2020-03-11 05:06:30 +13:00
|
|
|
</style>
|