budibase/packages/builder/src/components/backend/DataTable/DataTable.svelte

268 lines
7.0 KiB
Svelte
Raw Normal View History

2020-03-10 14:53:23 +01:00
<script>
import { fade } from "svelte/transition"
import { tables } from "stores/backend"
import CreateRowButton from "./buttons/CreateRowButton.svelte"
import CreateColumnButton from "./buttons/CreateColumnButton.svelte"
import CreateViewButton from "./buttons/CreateViewButton.svelte"
import ExistingRelationshipButton from "./buttons/ExistingRelationshipButton.svelte"
import ExportButton from "./buttons/ExportButton.svelte"
import ImportButton from "./buttons/ImportButton.svelte"
2020-12-04 09:27:42 +01:00
import EditRolesButton from "./buttons/EditRolesButton.svelte"
2021-02-10 19:18:31 +01:00
import ManageAccessButton from "./buttons/ManageAccessButton.svelte"
2021-02-16 14:56:40 +01:00
import HideAutocolumnButton from "./buttons/HideAutocolumnButton.svelte"
import TableFilterButton from "./buttons/TableFilterButton.svelte"
import Table from "./Table.svelte"
2020-12-04 09:27:42 +01:00
import { TableNames } from "constants"
import CreateEditRow from "./modals/CreateEditRow.svelte"
import {
Pagination,
Heading,
Body,
Modal,
Layout,
notifications,
} from "@budibase/bbui"
import { fetchData, Sheet } from "@budibase/frontend-core"
import { API } from "api"
import CreateEditColumn from "components/backend/DataTable/modals/CreateEditColumn.svelte"
2020-03-10 17:06:30 +01:00
let createColumnModal
let hideAutocolumns = true
let filters
let hasRows = true
$: isUsersTable = $tables.selected?._id === TableNames.USERS
$: type = $tables.selected?.type
$: isInternal = type !== "external"
$: schema = $tables.selected?.schema
$: enrichedSchema = enrichSchema($tables.selected?.schema)
$: id = $tables.selected?._id
$: hasCols = checkHasCols(schema)
$: id, (filters = null)
let appliedFilter
let rawFilter
let appliedSort
let selectedRows = []
$: enrichedSchema,
() => {
appliedFilter = null
rawFilter = null
appliedSort = null
selectedRows = []
}
const enrichSchema = schema => {
let tempSchema = { ...schema }
tempSchema._id = {
type: "internal",
editable: false,
displayName: "ID",
autocolumn: true,
}
if (isInternal) {
tempSchema._rev = {
type: "internal",
editable: false,
displayName: "Revision",
autocolumn: true,
}
}
return tempSchema
}
const checkHasCols = schema => {
if (!schema || Object.keys(schema).length === 0) {
return false
}
let fields = Object.values(schema)
for (let field of fields) {
if (!field.autocolumn) {
return true
}
}
return false
}
// Fetch data whenever sorting option changes
const onSort = async e => {
const sort = {
sortColumn: e.detail.column,
sortOrder: e.detail.order,
}
appliedSort = { ...sort }
appliedSort.sortOrder = appliedSort.sortOrder.toLowerCase()
selectedRows = []
}
// Fetch data whenever filters change
const onFilter = e => {
filters = e.detail
appliedFilter = e.detail
}
2020-03-10 14:53:23 +01:00
</script>
<div class="wrapper">
<div class="buttons">
<div class="left-buttons">
<CreateColumnButton
highlighted={!hasCols || !hasRows}
on:updatecolumns={null}
/>
{#if !isUsersTable}
<CreateRowButton
on:updaterows={null}
title="Create row"
modalContentComponent={CreateEditRow}
disabled={!hasCols}
highlighted={hasCols && !hasRows}
/>
{/if}
{#if isInternal}
<CreateViewButton disabled={!hasCols || !hasRows} />
{/if}
</div>
<div class="right-buttons">
<ManageAccessButton resourceId={$tables.selected?._id} />
{#if isUsersTable}
<EditRolesButton />
{/if}
{#if !isInternal}
<ExistingRelationshipButton
table={$tables.selected}
on:updatecolumns={null}
/>
{/if}
<ImportButton
disabled={$tables.selected?._id === "ta_users"}
tableId={$tables.selected?._id}
on:importrows={null}
/>
<ExportButton
disabled={!hasRows || !hasCols}
view={$tables.selected?._id}
filters={appliedFilter}
sorting={appliedSort}
{selectedRows}
/>
{#key id}
<TableFilterButton
{schema}
{filters}
on:change={onFilter}
disabled={!hasCols}
tableId={id}
/>
{/key}
</div>
</div>
<div class="sheet">
<Sheet
tableId={$tables.selected?._id}
{API}
filter={filters}
on:add-column={createColumnModal.show}
/>
</div>
</div>
<!--<div>-->
<!-- <Table-->
<!-- title={$tables.selected?.name}-->
<!-- schema={enrichedSchema}-->
<!-- {type}-->
<!-- tableId={id}-->
<!-- data={$fetch.rows}-->
<!-- bind:hideAutocolumns-->
<!-- loading={!$fetch.loaded}-->
<!-- on:sort={onSort}-->
<!-- allowEditing-->
<!-- disableSorting-->
<!-- on:updatecolumns={onUpdateColumns}-->
<!-- on:updaterows={onUpdateRows}-->
<!-- on:selectionUpdated={e => {-->
<!-- selectedRows = e.detail-->
<!-- }}-->
<!-- customPlaceholder-->
<!-- >-->
<!-- <div slot="placeholder">-->
<!-- <Layout gap="S">-->
<!-- {#if !hasCols}-->
<!-- <Heading>Let's create some columns</Heading>-->
<!-- <Body>-->
<!-- Start building out your table structure<br />-->
<!-- by adding some columns-->
<!-- </Body>-->
<!-- {:else}-->
<!-- <Heading>Now let's add a row</Heading>-->
<!-- <Body>-->
<!-- Add some data to your table<br />-->
<!-- by adding some rows-->
<!-- </Body>-->
<!-- {/if}-->
<!-- </Layout>-->
<!-- </div>-->
<!-- </Table>-->
<!-- {#key id}-->
<!-- <div in:fade={{ delay: 200, duration: 100 }}>-->
<!-- <div class="pagination">-->
<!-- <Pagination-->
<!-- page={$fetch.pageNumber + 1}-->
<!-- hasPrevPage={$fetch.hasPrevPage}-->
<!-- hasNextPage={$fetch.hasNextPage}-->
<!-- goToPrevPage={$fetch.loading ? null : fetch.prevPage}-->
<!-- goToNextPage={$fetch.loading ? null : fetch.nextPage}-->
<!-- />-->
<!-- </div>-->
<!-- </div>-->
<!-- {/key}-->
<!--</div>-->
<Modal bind:this={createColumnModal}>
<CreateEditColumn on:updatecolumns />
</Modal>
<style>
.wrapper {
flex: 1 1 auto;
margin: -28px -40px -40px -40px;
display: flex;
flex-direction: column;
background: var(--background);
}
.sheet {
flex: 1 1 auto;
display: flex;
flex-direction: column;
}
.pagination {
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: center;
margin-top: var(--spacing-xl);
}
.buttons {
flex: 0 0 48px;
border-bottom: 2px solid var(--spectrum-global-color-gray-200);
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
2022-04-08 11:35:13 +02:00
flex-wrap: wrap;
padding: 0 8px;
2022-04-08 11:35:13 +02:00
}
.left-buttons,
.right-buttons {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
2022-04-08 11:37:45 +02:00
gap: var(--spacing-m);
}
</style>