Merge branch 'develop' of github.com:Budibase/budibase into develop
This commit is contained in:
commit
07377ba54e
|
@ -158,6 +158,10 @@ spec:
|
||||||
{{ end }}
|
{{ end }}
|
||||||
- name: CDN_URL
|
- name: CDN_URL
|
||||||
value: {{ .Values.globals.cdnUrl }}
|
value: {{ .Values.globals.cdnUrl }}
|
||||||
|
{{ if .Values.services.tlsRejectUnauthorized }}
|
||||||
|
- name: NODE_TLS_REJECT_UNAUTHORIZED
|
||||||
|
value: {{ .Values.services.tlsRejectUnauthorized }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
image: budibase/apps:{{ .Values.globals.appVersion }}
|
image: budibase/apps:{{ .Values.globals.appVersion }}
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
|
|
|
@ -42,6 +42,7 @@ spec:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: {{ template "budibase.fullname" . }}
|
name: {{ template "budibase.fullname" . }}
|
||||||
key: objectStoreSecret
|
key: objectStoreSecret
|
||||||
|
|
||||||
image: minio/minio
|
image: minio/minio
|
||||||
imagePullPolicy: ""
|
imagePullPolicy: ""
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
|
|
|
@ -60,5 +60,6 @@ spec:
|
||||||
- name: redis-data
|
- name: redis-data
|
||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: redis-data
|
claimName: redis-data
|
||||||
|
|
||||||
status: {}
|
status: {}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
|
@ -149,6 +149,10 @@ spec:
|
||||||
{{ end }}
|
{{ end }}
|
||||||
- name: CDN_URL
|
- name: CDN_URL
|
||||||
value: {{ .Values.globals.cdnUrl }}
|
value: {{ .Values.globals.cdnUrl }}
|
||||||
|
{{ if .Values.services.tlsRejectUnauthorized }}
|
||||||
|
- name: NODE_TLS_REJECT_UNAUTHORIZED
|
||||||
|
value: {{ .Values.services.tlsRejectUnauthorized }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
image: budibase/worker:{{ .Values.globals.appVersion }}
|
image: budibase/worker:{{ .Values.globals.appVersion }}
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
|
|
|
@ -110,6 +110,7 @@ globals:
|
||||||
services:
|
services:
|
||||||
budibaseVersion: latest
|
budibaseVersion: latest
|
||||||
dns: cluster.local
|
dns: cluster.local
|
||||||
|
# tlsRejectUnauthorized: 0
|
||||||
|
|
||||||
proxy:
|
proxy:
|
||||||
port: 10000
|
port: 10000
|
||||||
|
|
|
@ -28,9 +28,9 @@
|
||||||
let loading = false
|
let loading = false
|
||||||
$: confirmDisabled = disabled || loading
|
$: confirmDisabled = disabled || loading
|
||||||
|
|
||||||
async function secondary() {
|
async function secondary(e) {
|
||||||
loading = true
|
loading = true
|
||||||
if (!secondaryAction || (await secondaryAction()) !== false) {
|
if (!secondaryAction || (await secondaryAction(e)) !== false) {
|
||||||
hide()
|
hide()
|
||||||
}
|
}
|
||||||
loading = false
|
loading = false
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
import { Table, Modal, Heading, notifications, Layout } from "@budibase/bbui"
|
import { Table, Modal, Heading, notifications, Layout } from "@budibase/bbui"
|
||||||
import { API } from "api"
|
import { API } from "api"
|
||||||
import Spinner from "components/common/Spinner.svelte"
|
import Spinner from "components/common/Spinner.svelte"
|
||||||
|
import ConfirmDialog from "components/common/ConfirmDialog.svelte"
|
||||||
import DeleteRowsButton from "./buttons/DeleteRowsButton.svelte"
|
import DeleteRowsButton from "./buttons/DeleteRowsButton.svelte"
|
||||||
import CreateEditRow from "./modals/CreateEditRow.svelte"
|
import CreateEditRow from "./modals/CreateEditRow.svelte"
|
||||||
import CreateEditUser from "./modals/CreateEditUser.svelte"
|
import CreateEditUser from "./modals/CreateEditUser.svelte"
|
||||||
|
@ -34,8 +35,8 @@
|
||||||
let editRowModal
|
let editRowModal
|
||||||
let editColumnModal
|
let editColumnModal
|
||||||
let customRenderers = []
|
let customRenderers = []
|
||||||
|
let confirmDelete
|
||||||
|
|
||||||
$: isInternal = type !== "external"
|
|
||||||
$: isUsersTable = tableId === TableNames.USERS
|
$: isUsersTable = tableId === TableNames.USERS
|
||||||
$: data && resetSelectedRows()
|
$: data && resetSelectedRows()
|
||||||
$: editRowComponent = isUsersTable ? CreateEditUser : CreateEditRow
|
$: editRowComponent = isUsersTable ? CreateEditUser : CreateEditRow
|
||||||
|
@ -89,15 +90,17 @@
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const deleteRows = async () => {
|
const deleteRows = async targetRows => {
|
||||||
try {
|
try {
|
||||||
await API.deleteRows({
|
await API.deleteRows({
|
||||||
tableId,
|
tableId,
|
||||||
rows: selectedRows,
|
rows: targetRows,
|
||||||
})
|
})
|
||||||
data = data.filter(row => !selectedRows.includes(row))
|
|
||||||
notifications.success(`Successfully deleted ${selectedRows.length} rows`)
|
const deletedRowIds = targetRows.map(row => row._id)
|
||||||
selectedRows = []
|
data = data.filter(row => deletedRowIds.indexOf(row._id))
|
||||||
|
|
||||||
|
notifications.success(`Successfully deleted ${targetRows.length} rows`)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
notifications.error("Error deleting rows")
|
notifications.error("Error deleting rows")
|
||||||
}
|
}
|
||||||
|
@ -133,7 +136,14 @@
|
||||||
<div class="popovers">
|
<div class="popovers">
|
||||||
<slot />
|
<slot />
|
||||||
{#if !isUsersTable && selectedRows.length > 0}
|
{#if !isUsersTable && selectedRows.length > 0}
|
||||||
<DeleteRowsButton on:updaterows {selectedRows} {deleteRows} />
|
<DeleteRowsButton
|
||||||
|
on:updaterows
|
||||||
|
{selectedRows}
|
||||||
|
deleteRows={async rows => {
|
||||||
|
await deleteRows(rows)
|
||||||
|
resetSelectedRows()
|
||||||
|
}}
|
||||||
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
@ -164,8 +174,33 @@
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|
||||||
<Modal bind:this={editRowModal}>
|
<Modal bind:this={editRowModal}>
|
||||||
<svelte:component this={editRowComponent} on:updaterows row={editableRow} />
|
<svelte:component
|
||||||
|
this={editRowComponent}
|
||||||
|
on:updaterows
|
||||||
|
on:deleteRows={() => {
|
||||||
|
confirmDelete.show()
|
||||||
|
}}
|
||||||
|
row={editableRow}
|
||||||
|
/>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
|
<ConfirmDialog
|
||||||
|
bind:this={confirmDelete}
|
||||||
|
okText="Delete"
|
||||||
|
onOk={async () => {
|
||||||
|
if (editableRow) {
|
||||||
|
await deleteRows([editableRow])
|
||||||
|
}
|
||||||
|
editableRow = undefined
|
||||||
|
}}
|
||||||
|
onCancel={async () => {
|
||||||
|
editRow(editableRow)
|
||||||
|
}}
|
||||||
|
title="Confirm Deletion"
|
||||||
|
>
|
||||||
|
Are you sure you want to delete this row?
|
||||||
|
</ConfirmDialog>
|
||||||
|
|
||||||
<Modal bind:this={editColumnModal}>
|
<Modal bind:this={editColumnModal}>
|
||||||
<CreateEditColumn
|
<CreateEditColumn
|
||||||
field={editableColumn}
|
field={editableColumn}
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
let modal
|
let modal
|
||||||
|
|
||||||
async function confirmDeletion() {
|
async function confirmDeletion() {
|
||||||
await deleteRows()
|
await deleteRows(selectedRows)
|
||||||
modal?.hide()
|
modal?.hide()
|
||||||
dispatch("updaterows")
|
dispatch("updaterows")
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,22 +50,34 @@
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<ModalContent
|
<span class="modal-wrap">
|
||||||
title={creating ? "Create Row" : "Edit Row"}
|
<ModalContent
|
||||||
confirmText={creating ? "Create Row" : "Save Row"}
|
title={creating ? "Create Row" : "Edit Row"}
|
||||||
onConfirm={saveRow}
|
confirmText={creating ? "Create Row" : "Save Row"}
|
||||||
>
|
onConfirm={saveRow}
|
||||||
{#each tableSchema as [key, meta]}
|
showCancelButton={creating}
|
||||||
{#if !meta.autocolumn && meta.type !== FORMULA_TYPE}
|
showSecondaryButton={!creating}
|
||||||
<div>
|
secondaryButtonWarning={!creating}
|
||||||
<RowFieldControl error={errors[key]} {meta} bind:value={row[key]} />
|
secondaryButtonText="Delete"
|
||||||
</div>
|
secondaryAction={() => {
|
||||||
{/if}
|
dispatch("deleteRows", row)
|
||||||
{/each}
|
}}
|
||||||
</ModalContent>
|
>
|
||||||
|
{#each tableSchema as [key, meta]}
|
||||||
|
{#if !meta.autocolumn && meta.type !== FORMULA_TYPE}
|
||||||
|
<div>
|
||||||
|
<RowFieldControl error={errors[key]} {meta} bind:value={row[key]} />
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</ModalContent>
|
||||||
|
</span>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
div {
|
div {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
.modal-wrap :global(.secondary-action) {
|
||||||
|
margin-right: unset;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -479,6 +479,7 @@
|
||||||
definition.name !== "Screenslot" &&
|
definition.name !== "Screenslot" &&
|
||||||
children.length === 0 &&
|
children.length === 0 &&
|
||||||
!instance._blockElementHasChildren &&
|
!instance._blockElementHasChildren &&
|
||||||
|
!definition.block &&
|
||||||
definition.skeleton !== false
|
definition.skeleton !== false
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
let dataProviderId
|
let dataProviderId
|
||||||
let repeaterId
|
let repeaterId
|
||||||
let schema
|
let schema
|
||||||
let schemaLoaded = false
|
|
||||||
|
|
||||||
$: fetchSchema(dataSource)
|
$: fetchSchema(dataSource)
|
||||||
$: enrichedSearchColumns = enrichSearchColumns(searchColumns, schema)
|
$: enrichedSearchColumns = enrichSearchColumns(searchColumns, schema)
|
||||||
|
@ -75,138 +74,135 @@
|
||||||
enrichRelationships: true,
|
enrichRelationships: true,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
schemaLoaded = true
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if schemaLoaded}
|
<Block>
|
||||||
<Block>
|
<BlockComponent
|
||||||
<BlockComponent
|
type="form"
|
||||||
type="form"
|
bind:id={formId}
|
||||||
bind:id={formId}
|
props={{ dataSource, disableValidation: true }}
|
||||||
props={{ dataSource, disableValidation: true }}
|
>
|
||||||
>
|
{#if title || enrichedSearchColumns?.length || showTitleButton}
|
||||||
{#if title || enrichedSearchColumns?.length || showTitleButton}
|
<BlockComponent
|
||||||
|
type="container"
|
||||||
|
props={{
|
||||||
|
direction: "row",
|
||||||
|
hAlign: "stretch",
|
||||||
|
vAlign: "middle",
|
||||||
|
gap: "M",
|
||||||
|
wrap: true,
|
||||||
|
}}
|
||||||
|
styles={{
|
||||||
|
normal: {
|
||||||
|
"margin-bottom": "20px",
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
order={0}
|
||||||
|
>
|
||||||
|
<BlockComponent
|
||||||
|
type="heading"
|
||||||
|
props={{
|
||||||
|
text: title,
|
||||||
|
}}
|
||||||
|
order={0}
|
||||||
|
/>
|
||||||
<BlockComponent
|
<BlockComponent
|
||||||
type="container"
|
type="container"
|
||||||
props={{
|
props={{
|
||||||
direction: "row",
|
direction: "row",
|
||||||
hAlign: "stretch",
|
hAlign: "left",
|
||||||
vAlign: "middle",
|
vAlign: "middle",
|
||||||
gap: "M",
|
gap: "M",
|
||||||
wrap: true,
|
wrap: true,
|
||||||
}}
|
}}
|
||||||
|
order={1}
|
||||||
|
>
|
||||||
|
{#if enrichedSearchColumns?.length}
|
||||||
|
{#each enrichedSearchColumns as column, idx}
|
||||||
|
<BlockComponent
|
||||||
|
type={column.componentType}
|
||||||
|
props={{
|
||||||
|
field: column.name,
|
||||||
|
placeholder: column.name,
|
||||||
|
text: column.name,
|
||||||
|
autoWidth: true,
|
||||||
|
}}
|
||||||
|
order={idx}
|
||||||
|
styles={{
|
||||||
|
normal: {
|
||||||
|
width: "192px",
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
{/each}
|
||||||
|
{/if}
|
||||||
|
{#if showTitleButton}
|
||||||
|
<BlockComponent
|
||||||
|
type="button"
|
||||||
|
props={{
|
||||||
|
onClick: titleButtonAction,
|
||||||
|
text: titleButtonText,
|
||||||
|
type: "cta",
|
||||||
|
}}
|
||||||
|
order={enrichedSearchColumns?.length ?? 0}
|
||||||
|
/>
|
||||||
|
{/if}
|
||||||
|
</BlockComponent>
|
||||||
|
</BlockComponent>
|
||||||
|
{/if}
|
||||||
|
<BlockComponent
|
||||||
|
type="dataprovider"
|
||||||
|
bind:id={dataProviderId}
|
||||||
|
props={{
|
||||||
|
dataSource,
|
||||||
|
filter: enrichedFilter,
|
||||||
|
sortColumn,
|
||||||
|
sortOrder,
|
||||||
|
paginate,
|
||||||
|
limit,
|
||||||
|
}}
|
||||||
|
order={1}
|
||||||
|
>
|
||||||
|
<BlockComponent
|
||||||
|
type="repeater"
|
||||||
|
bind:id={repeaterId}
|
||||||
|
context="repeater"
|
||||||
|
props={{
|
||||||
|
dataProvider: `{{ literal ${safe(dataProviderId)} }}`,
|
||||||
|
direction: "row",
|
||||||
|
hAlign: "stretch",
|
||||||
|
vAlign: "top",
|
||||||
|
gap: "M",
|
||||||
|
noRowsMessage: "No rows found",
|
||||||
|
}}
|
||||||
|
styles={{
|
||||||
|
custom: `display: grid;\ngrid-template-columns: repeat(auto-fill, minmax(min(${cardWidth}px, 100%), 1fr));`,
|
||||||
|
}}
|
||||||
|
order={0}
|
||||||
|
>
|
||||||
|
<BlockComponent
|
||||||
|
type="spectrumcard"
|
||||||
|
props={{
|
||||||
|
title: cardTitle,
|
||||||
|
subtitle: cardSubtitle,
|
||||||
|
description: cardDescription,
|
||||||
|
imageURL: cardImageURL,
|
||||||
|
horizontal: cardHorizontal,
|
||||||
|
showButton: showCardButton,
|
||||||
|
buttonText: cardButtonText,
|
||||||
|
buttonOnClick: cardButtonOnClick,
|
||||||
|
linkURL: fullCardURL,
|
||||||
|
linkPeek: cardPeek,
|
||||||
|
}}
|
||||||
styles={{
|
styles={{
|
||||||
normal: {
|
normal: {
|
||||||
"margin-bottom": "20px",
|
width: "auto",
|
||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
order={0}
|
order={0}
|
||||||
>
|
/>
|
||||||
<BlockComponent
|
|
||||||
type="heading"
|
|
||||||
props={{
|
|
||||||
text: title,
|
|
||||||
}}
|
|
||||||
order={0}
|
|
||||||
/>
|
|
||||||
<BlockComponent
|
|
||||||
type="container"
|
|
||||||
props={{
|
|
||||||
direction: "row",
|
|
||||||
hAlign: "left",
|
|
||||||
vAlign: "middle",
|
|
||||||
gap: "M",
|
|
||||||
wrap: true,
|
|
||||||
}}
|
|
||||||
order={1}
|
|
||||||
>
|
|
||||||
{#if enrichedSearchColumns?.length}
|
|
||||||
{#each enrichedSearchColumns as column, idx}
|
|
||||||
<BlockComponent
|
|
||||||
type={column.componentType}
|
|
||||||
props={{
|
|
||||||
field: column.name,
|
|
||||||
placeholder: column.name,
|
|
||||||
text: column.name,
|
|
||||||
autoWidth: true,
|
|
||||||
}}
|
|
||||||
order={idx}
|
|
||||||
styles={{
|
|
||||||
normal: {
|
|
||||||
width: "192px",
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
{/each}
|
|
||||||
{/if}
|
|
||||||
{#if showTitleButton}
|
|
||||||
<BlockComponent
|
|
||||||
type="button"
|
|
||||||
props={{
|
|
||||||
onClick: titleButtonAction,
|
|
||||||
text: titleButtonText,
|
|
||||||
type: "cta",
|
|
||||||
}}
|
|
||||||
order={enrichedSearchColumns?.length ?? 0}
|
|
||||||
/>
|
|
||||||
{/if}
|
|
||||||
</BlockComponent>
|
|
||||||
</BlockComponent>
|
|
||||||
{/if}
|
|
||||||
<BlockComponent
|
|
||||||
type="dataprovider"
|
|
||||||
bind:id={dataProviderId}
|
|
||||||
props={{
|
|
||||||
dataSource,
|
|
||||||
filter: enrichedFilter,
|
|
||||||
sortColumn,
|
|
||||||
sortOrder,
|
|
||||||
paginate,
|
|
||||||
limit,
|
|
||||||
}}
|
|
||||||
order={1}
|
|
||||||
>
|
|
||||||
<BlockComponent
|
|
||||||
type="repeater"
|
|
||||||
bind:id={repeaterId}
|
|
||||||
context="repeater"
|
|
||||||
props={{
|
|
||||||
dataProvider: `{{ literal ${safe(dataProviderId)} }}`,
|
|
||||||
direction: "row",
|
|
||||||
hAlign: "stretch",
|
|
||||||
vAlign: "top",
|
|
||||||
gap: "M",
|
|
||||||
noRowsMessage: "No rows found",
|
|
||||||
}}
|
|
||||||
styles={{
|
|
||||||
custom: `display: grid;\ngrid-template-columns: repeat(auto-fill, minmax(min(${cardWidth}px, 100%), 1fr));`,
|
|
||||||
}}
|
|
||||||
order={0}
|
|
||||||
>
|
|
||||||
<BlockComponent
|
|
||||||
type="spectrumcard"
|
|
||||||
props={{
|
|
||||||
title: cardTitle,
|
|
||||||
subtitle: cardSubtitle,
|
|
||||||
description: cardDescription,
|
|
||||||
imageURL: cardImageURL,
|
|
||||||
horizontal: cardHorizontal,
|
|
||||||
showButton: showCardButton,
|
|
||||||
buttonText: cardButtonText,
|
|
||||||
buttonOnClick: cardButtonOnClick,
|
|
||||||
linkURL: fullCardURL,
|
|
||||||
linkPeek: cardPeek,
|
|
||||||
}}
|
|
||||||
styles={{
|
|
||||||
normal: {
|
|
||||||
width: "auto",
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
order={0}
|
|
||||||
/>
|
|
||||||
</BlockComponent>
|
|
||||||
</BlockComponent>
|
</BlockComponent>
|
||||||
</BlockComponent>
|
</BlockComponent>
|
||||||
</Block>
|
</BlockComponent>
|
||||||
{/if}
|
</Block>
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
let newRowSidePanelId
|
let newRowSidePanelId
|
||||||
let schema
|
let schema
|
||||||
let primaryDisplay
|
let primaryDisplay
|
||||||
let schemaLoaded = false
|
|
||||||
|
|
||||||
$: fetchSchema(dataSource)
|
$: fetchSchema(dataSource)
|
||||||
$: enrichedSearchColumns = enrichSearchColumns(searchColumns, schema)
|
$: enrichedSearchColumns = enrichSearchColumns(searchColumns, schema)
|
||||||
|
@ -89,7 +88,6 @@
|
||||||
enrichRelationships: true,
|
enrichRelationships: true,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
schemaLoaded = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const getNormalFields = schema => {
|
const getNormalFields = schema => {
|
||||||
|
@ -113,162 +111,160 @@
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if schemaLoaded}
|
<Block>
|
||||||
<Block>
|
<BlockComponent
|
||||||
<BlockComponent
|
type="form"
|
||||||
type="form"
|
bind:id={formId}
|
||||||
bind:id={formId}
|
props={{
|
||||||
props={{
|
dataSource,
|
||||||
dataSource,
|
disableValidation: true,
|
||||||
disableValidation: true,
|
editAutoColumns: true,
|
||||||
editAutoColumns: true,
|
size,
|
||||||
size,
|
}}
|
||||||
}}
|
>
|
||||||
>
|
{#if title || enrichedSearchColumns?.length || showTitleButton}
|
||||||
{#if title || enrichedSearchColumns?.length || showTitleButton}
|
<BlockComponent
|
||||||
|
type="container"
|
||||||
|
props={{
|
||||||
|
direction: "row",
|
||||||
|
hAlign: "stretch",
|
||||||
|
vAlign: "middle",
|
||||||
|
gap: "M",
|
||||||
|
wrap: true,
|
||||||
|
}}
|
||||||
|
styles={{
|
||||||
|
normal: {
|
||||||
|
"margin-bottom": "20px",
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
order={0}
|
||||||
|
>
|
||||||
|
<BlockComponent
|
||||||
|
type="heading"
|
||||||
|
props={{
|
||||||
|
text: title,
|
||||||
|
}}
|
||||||
|
order={0}
|
||||||
|
/>
|
||||||
<BlockComponent
|
<BlockComponent
|
||||||
type="container"
|
type="container"
|
||||||
props={{
|
props={{
|
||||||
direction: "row",
|
direction: "row",
|
||||||
hAlign: "stretch",
|
hAlign: "left",
|
||||||
vAlign: "middle",
|
vAlign: "center",
|
||||||
gap: "M",
|
gap: "M",
|
||||||
wrap: true,
|
wrap: true,
|
||||||
}}
|
}}
|
||||||
styles={{
|
order={1}
|
||||||
normal: {
|
|
||||||
"margin-bottom": "20px",
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
order={0}
|
|
||||||
>
|
>
|
||||||
<BlockComponent
|
{#if enrichedSearchColumns?.length}
|
||||||
type="heading"
|
{#each enrichedSearchColumns as column, idx}
|
||||||
props={{
|
|
||||||
text: title,
|
|
||||||
}}
|
|
||||||
order={0}
|
|
||||||
/>
|
|
||||||
<BlockComponent
|
|
||||||
type="container"
|
|
||||||
props={{
|
|
||||||
direction: "row",
|
|
||||||
hAlign: "left",
|
|
||||||
vAlign: "center",
|
|
||||||
gap: "M",
|
|
||||||
wrap: true,
|
|
||||||
}}
|
|
||||||
order={1}
|
|
||||||
>
|
|
||||||
{#if enrichedSearchColumns?.length}
|
|
||||||
{#each enrichedSearchColumns as column, idx}
|
|
||||||
<BlockComponent
|
|
||||||
type={column.componentType}
|
|
||||||
props={{
|
|
||||||
field: column.name,
|
|
||||||
placeholder: column.name,
|
|
||||||
text: column.name,
|
|
||||||
autoWidth: true,
|
|
||||||
}}
|
|
||||||
styles={{
|
|
||||||
normal: {
|
|
||||||
width: "192px",
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
order={idx}
|
|
||||||
/>
|
|
||||||
{/each}
|
|
||||||
{/if}
|
|
||||||
{#if showTitleButton}
|
|
||||||
<BlockComponent
|
<BlockComponent
|
||||||
type="button"
|
type={column.componentType}
|
||||||
props={{
|
props={{
|
||||||
onClick: buttonClickActions,
|
field: column.name,
|
||||||
text: titleButtonText,
|
placeholder: column.name,
|
||||||
type: "cta",
|
text: column.name,
|
||||||
|
autoWidth: true,
|
||||||
}}
|
}}
|
||||||
order={enrichedSearchColumns?.length ?? 0}
|
styles={{
|
||||||
|
normal: {
|
||||||
|
width: "192px",
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
order={idx}
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/each}
|
||||||
</BlockComponent>
|
{/if}
|
||||||
|
{#if showTitleButton}
|
||||||
|
<BlockComponent
|
||||||
|
type="button"
|
||||||
|
props={{
|
||||||
|
onClick: buttonClickActions,
|
||||||
|
text: titleButtonText,
|
||||||
|
type: "cta",
|
||||||
|
}}
|
||||||
|
order={enrichedSearchColumns?.length ?? 0}
|
||||||
|
/>
|
||||||
|
{/if}
|
||||||
</BlockComponent>
|
</BlockComponent>
|
||||||
{/if}
|
</BlockComponent>
|
||||||
|
{/if}
|
||||||
|
<BlockComponent
|
||||||
|
type="dataprovider"
|
||||||
|
bind:id={dataProviderId}
|
||||||
|
props={{
|
||||||
|
dataSource,
|
||||||
|
filter: enrichedFilter,
|
||||||
|
sortColumn: sortColumn || primaryDisplay,
|
||||||
|
sortOrder,
|
||||||
|
paginate,
|
||||||
|
limit: rowCount,
|
||||||
|
}}
|
||||||
|
order={1}
|
||||||
|
>
|
||||||
<BlockComponent
|
<BlockComponent
|
||||||
type="dataprovider"
|
type="table"
|
||||||
bind:id={dataProviderId}
|
context="table"
|
||||||
props={{
|
props={{
|
||||||
dataSource,
|
dataProvider: `{{ literal ${safe(dataProviderId)} }}`,
|
||||||
filter: enrichedFilter,
|
columns: tableColumns,
|
||||||
sortColumn: sortColumn || primaryDisplay,
|
rowCount,
|
||||||
sortOrder,
|
quiet,
|
||||||
paginate,
|
compact,
|
||||||
limit: rowCount,
|
allowSelectRows,
|
||||||
|
size,
|
||||||
|
onClick: rowClickActions,
|
||||||
}}
|
}}
|
||||||
order={1}
|
/>
|
||||||
|
</BlockComponent>
|
||||||
|
{#if clickBehaviour === "details"}
|
||||||
|
<BlockComponent
|
||||||
|
name="Details side panel"
|
||||||
|
type="sidepanel"
|
||||||
|
bind:id={detailsSidePanelId}
|
||||||
|
context="details-side-panel"
|
||||||
|
order={2}
|
||||||
>
|
>
|
||||||
<BlockComponent
|
<BlockComponent
|
||||||
type="table"
|
name="Details form block"
|
||||||
context="table"
|
type="formblock"
|
||||||
|
bind:id={detailsFormBlockId}
|
||||||
props={{
|
props={{
|
||||||
dataProvider: `{{ literal ${safe(dataProviderId)} }}`,
|
dataSource,
|
||||||
columns: tableColumns,
|
showSaveButton: true,
|
||||||
rowCount,
|
showDeleteButton: true,
|
||||||
quiet,
|
actionType: "Update",
|
||||||
compact,
|
rowId: `{{ ${safe("state")}.${safe(stateKey)} }}`,
|
||||||
allowSelectRows,
|
fields: normalFields,
|
||||||
size,
|
title: editTitle,
|
||||||
onClick: rowClickActions,
|
labelPosition: "left",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</BlockComponent>
|
</BlockComponent>
|
||||||
{#if clickBehaviour === "details"}
|
{/if}
|
||||||
|
{#if showTitleButton && titleButtonClickBehaviour === "new"}
|
||||||
|
<BlockComponent
|
||||||
|
name="New row side panel"
|
||||||
|
type="sidepanel"
|
||||||
|
bind:id={newRowSidePanelId}
|
||||||
|
context="new-side-panel"
|
||||||
|
order={3}
|
||||||
|
>
|
||||||
<BlockComponent
|
<BlockComponent
|
||||||
name="Details side panel"
|
name="New row form block"
|
||||||
type="sidepanel"
|
type="formblock"
|
||||||
bind:id={detailsSidePanelId}
|
props={{
|
||||||
context="details-side-panel"
|
dataSource,
|
||||||
order={2}
|
showSaveButton: true,
|
||||||
>
|
showDeleteButton: false,
|
||||||
<BlockComponent
|
actionType: "Create",
|
||||||
name="Details form block"
|
fields: normalFields,
|
||||||
type="formblock"
|
title: "Create Row",
|
||||||
bind:id={detailsFormBlockId}
|
labelPosition: "left",
|
||||||
props={{
|
}}
|
||||||
dataSource,
|
/>
|
||||||
showSaveButton: true,
|
</BlockComponent>
|
||||||
showDeleteButton: true,
|
{/if}
|
||||||
actionType: "Update",
|
</BlockComponent>
|
||||||
rowId: `{{ ${safe("state")}.${safe(stateKey)} }}`,
|
</Block>
|
||||||
fields: normalFields,
|
|
||||||
title: editTitle,
|
|
||||||
labelPosition: "left",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</BlockComponent>
|
|
||||||
{/if}
|
|
||||||
{#if showTitleButton && titleButtonClickBehaviour === "new"}
|
|
||||||
<BlockComponent
|
|
||||||
name="New row side panel"
|
|
||||||
type="sidepanel"
|
|
||||||
bind:id={newRowSidePanelId}
|
|
||||||
context="new-side-panel"
|
|
||||||
order={3}
|
|
||||||
>
|
|
||||||
<BlockComponent
|
|
||||||
name="New row form block"
|
|
||||||
type="formblock"
|
|
||||||
props={{
|
|
||||||
dataSource,
|
|
||||||
showSaveButton: true,
|
|
||||||
showDeleteButton: false,
|
|
||||||
actionType: "Create",
|
|
||||||
fields: normalFields,
|
|
||||||
title: "Create Row",
|
|
||||||
labelPosition: "left",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</BlockComponent>
|
|
||||||
{/if}
|
|
||||||
</BlockComponent>
|
|
||||||
</Block>
|
|
||||||
{/if}
|
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
const context = getContext("context")
|
const context = getContext("context")
|
||||||
const { API, fetchDatasourceSchema } = getContext("sdk")
|
const { API, fetchDatasourceSchema } = getContext("sdk")
|
||||||
|
|
||||||
let loaded = false
|
|
||||||
let schema
|
let schema
|
||||||
let table
|
let table
|
||||||
|
|
||||||
|
@ -49,9 +48,6 @@
|
||||||
// Fetches the form schema from this form's dataSource
|
// Fetches the form schema from this form's dataSource
|
||||||
const fetchSchema = async dataSource => {
|
const fetchSchema = async dataSource => {
|
||||||
schema = (await fetchDatasourceSchema(dataSource)) || {}
|
schema = (await fetchDatasourceSchema(dataSource)) || {}
|
||||||
if (!loaded) {
|
|
||||||
loaded = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const fetchTable = async dataSource => {
|
const fetchTable = async dataSource => {
|
||||||
|
@ -70,21 +66,19 @@
|
||||||
)
|
)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if loaded}
|
{#key resetKey}
|
||||||
{#key resetKey}
|
<InnerForm
|
||||||
<InnerForm
|
{dataSource}
|
||||||
{dataSource}
|
{theme}
|
||||||
{theme}
|
{size}
|
||||||
{size}
|
{disabled}
|
||||||
{disabled}
|
{actionType}
|
||||||
{actionType}
|
{schema}
|
||||||
{schema}
|
{table}
|
||||||
{table}
|
{initialValues}
|
||||||
{initialValues}
|
{disableValidation}
|
||||||
{disableValidation}
|
{editAutoColumns}
|
||||||
{editAutoColumns}
|
>
|
||||||
>
|
<slot />
|
||||||
<slot />
|
</InnerForm>
|
||||||
</InnerForm>
|
{/key}
|
||||||
{/key}
|
|
||||||
{/if}
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { derived } from "svelte/store"
|
import { derived } from "svelte/store"
|
||||||
|
import { Constants } from "@budibase/frontend-core"
|
||||||
import { devToolsStore } from "../devTools.js"
|
import { devToolsStore } from "../devTools.js"
|
||||||
import { authStore } from "../auth.js"
|
import { authStore } from "../auth.js"
|
||||||
|
|
||||||
|
@ -6,6 +7,10 @@ import { authStore } from "../auth.js"
|
||||||
export const currentRole = derived(
|
export const currentRole = derived(
|
||||||
[devToolsStore, authStore],
|
[devToolsStore, authStore],
|
||||||
([$devToolsStore, $authStore]) => {
|
([$devToolsStore, $authStore]) => {
|
||||||
return ($devToolsStore.enabled && $devToolsStore.role) || $authStore?.roleId
|
return (
|
||||||
|
($devToolsStore.enabled && $devToolsStore.role) ||
|
||||||
|
$authStore?.roleId ||
|
||||||
|
Constants.Roles.PUBLIC
|
||||||
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue