Merge branch 'spectrum-bbui' into spectrum/kevs-bits-and-bobs-the-sequel
This commit is contained in:
commit
381ab45834
|
@ -41,14 +41,12 @@
|
||||||
class="spectrum-ActionButton spectrum-ActionButton--size{size}"
|
class="spectrum-ActionButton spectrum-ActionButton--size{size}"
|
||||||
{disabled}
|
{disabled}
|
||||||
on:longPress
|
on:longPress
|
||||||
on:click|preventDefault
|
on:click|preventDefault>
|
||||||
>
|
|
||||||
{#if longPressable}
|
{#if longPressable}
|
||||||
<svg
|
<svg
|
||||||
class="spectrum-Icon spectrum-UIIcon-CornerTriangle100 spectrum-ActionButton-hold"
|
class="spectrum-Icon spectrum-UIIcon-CornerTriangle100 spectrum-ActionButton-hold"
|
||||||
focusable="false"
|
focusable="false"
|
||||||
aria-hidden="true"
|
aria-hidden="true">
|
||||||
>
|
|
||||||
<use xlink:href="#spectrum-css-icon-CornerTriangle100" />
|
<use xlink:href="#spectrum-css-icon-CornerTriangle100" />
|
||||||
</svg>
|
</svg>
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -57,8 +55,7 @@
|
||||||
class="spectrum-Icon spectrum-Icon--size{size}"
|
class="spectrum-Icon spectrum-Icon--size{size}"
|
||||||
focusable="false"
|
focusable="false"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
aria-label={icon}
|
aria-label={icon}>
|
||||||
>
|
|
||||||
<use xlink:href="#spectrum-icon-18-{icon}" />
|
<use xlink:href="#spectrum-icon-18-{icon}" />
|
||||||
</svg>
|
</svg>
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -66,9 +63,3 @@
|
||||||
<span class="spectrum-ActionButton-label"><slot /></span>
|
<span class="spectrum-ActionButton-label"><slot /></span>
|
||||||
{/if}
|
{/if}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<style>
|
|
||||||
span {
|
|
||||||
text-transform: capitalize;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
setContext("actionMenu", { show, hide })
|
setContext("actionMenu", { show, hide })
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="contents" use:getAnchor on:click={openMenu}>
|
<div use:getAnchor on:click={openMenu}>
|
||||||
<slot name="control" />
|
<slot name="control" />
|
||||||
</div>
|
</div>
|
||||||
<Popover bind:this={dropdown} {anchor} align="left">
|
<Popover bind:this={dropdown} {anchor} align="left">
|
||||||
|
@ -36,9 +36,3 @@
|
||||||
<slot />
|
<slot />
|
||||||
</Menu>
|
</Menu>
|
||||||
</Popover>
|
</Popover>
|
||||||
|
|
||||||
<style>
|
|
||||||
div {
|
|
||||||
display: contents;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -3,14 +3,25 @@ import { localStorageStore } from "./localStorage"
|
||||||
export const getThemeStore = () => {
|
export const getThemeStore = () => {
|
||||||
const themeElement = document.documentElement
|
const themeElement = document.documentElement
|
||||||
const initialValue = {
|
const initialValue = {
|
||||||
darkMode: true,
|
theme: "darkest",
|
||||||
|
options: ["lightest", "light", "dark", "darkest"],
|
||||||
}
|
}
|
||||||
const store = localStorageStore("bb-theme", initialValue)
|
const store = localStorageStore("bb-theme", initialValue)
|
||||||
|
|
||||||
// Update theme when store changes
|
// Update theme class when store changes
|
||||||
store.subscribe(theme => {
|
store.subscribe(state => {
|
||||||
themeElement.classList.toggle("spectrum--darkest", theme.darkMode)
|
// Handle any old local storage values - this can be removed after the update
|
||||||
themeElement.classList.toggle("spectrum--lightest", !theme.darkMode)
|
if (state.darkMode !== undefined) {
|
||||||
|
store.set(initialValue)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
state.options.forEach(option => {
|
||||||
|
themeElement.classList.toggle(
|
||||||
|
`spectrum--${option}`,
|
||||||
|
option === state.theme
|
||||||
|
)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
return store
|
return store
|
||||||
|
|
|
@ -57,7 +57,7 @@
|
||||||
<CreateColumnButton />
|
<CreateColumnButton />
|
||||||
{#if schema && Object.keys(schema).length > 0}
|
{#if schema && Object.keys(schema).length > 0}
|
||||||
<CreateRowButton
|
<CreateRowButton
|
||||||
title={isUsersTable ? 'Create New User' : 'Create New Row'}
|
title={isUsersTable ? 'Create user' : 'Create row'}
|
||||||
modalContentComponent={isUsersTable ? CreateEditUser : CreateEditRow} />
|
modalContentComponent={isUsersTable ? CreateEditUser : CreateEditRow} />
|
||||||
<CreateViewButton />
|
<CreateViewButton />
|
||||||
<ManageAccessButton resourceId={$tables.selected?._id} />
|
<ManageAccessButton resourceId={$tables.selected?._id} />
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { Modal, Button } from "@budibase/bbui"
|
import { Modal, ActionButton } from "@budibase/bbui"
|
||||||
import CalculateModal from "../modals/CalculateModal.svelte"
|
import CalculateModal from "../modals/CalculateModal.svelte"
|
||||||
|
|
||||||
export let view = {}
|
export let view = {}
|
||||||
|
@ -7,15 +7,14 @@
|
||||||
let modal
|
let modal
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Button
|
<ActionButton
|
||||||
icon="Calculator"
|
icon="Calculator"
|
||||||
primary
|
|
||||||
size="S"
|
size="S"
|
||||||
quiet
|
quiet
|
||||||
on:click={modal.show}
|
on:click={modal.show}
|
||||||
active={view.field && view.calculation}>
|
active={view.field && view.calculation}>
|
||||||
Calculate
|
Calculate
|
||||||
</Button>
|
</ActionButton>
|
||||||
<Modal bind:this={modal}>
|
<Modal bind:this={modal}>
|
||||||
<CalculateModal {view} />
|
<CalculateModal {view} />
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
<script>
|
<script>
|
||||||
import { Button, Icon, Modal, ModalContent } from "@budibase/bbui"
|
import { ActionButton, Modal } from "@budibase/bbui"
|
||||||
import CreateEditColumn from "../modals/CreateEditColumn.svelte"
|
import CreateEditColumn from "../modals/CreateEditColumn.svelte"
|
||||||
|
|
||||||
let modal
|
let modal
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Button icon="AddCircle" primary size="S" quiet on:click={modal.show}>
|
<ActionButton icon="TableColumnAddRight" quiet size="S" on:click={modal.show}>
|
||||||
Create New Column
|
Create column
|
||||||
</Button>
|
</ActionButton>
|
||||||
<Modal bind:this={modal}>
|
<Modal bind:this={modal}>
|
||||||
<CreateEditColumn />
|
<CreateEditColumn />
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
<script>
|
<script>
|
||||||
import { Button, Icon, Modal } from "@budibase/bbui"
|
import { ActionButton, Modal } from "@budibase/bbui"
|
||||||
import CreateEditRow from "../modals/CreateEditRow.svelte"
|
import CreateEditRow from "../modals/CreateEditRow.svelte"
|
||||||
|
|
||||||
export let modalContentComponent = CreateEditRow
|
export let modalContentComponent = CreateEditRow
|
||||||
export let title = "Create New Row"
|
export let title = "Create row"
|
||||||
|
|
||||||
let modal
|
let modal
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Button icon="Add" primary size="S" quiet on:click={modal.show}>
|
<ActionButton icon="TableRowAddBottom" size="S" quiet on:click={modal.show}>
|
||||||
{title}
|
{title}
|
||||||
</Button>
|
</ActionButton>
|
||||||
<Modal bind:this={modal}>
|
<Modal bind:this={modal}>
|
||||||
<svelte:component this={modalContentComponent} />
|
<svelte:component this={modalContentComponent} />
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
<script>
|
<script>
|
||||||
import { Modal, Button } from "@budibase/bbui"
|
import { Modal, ActionButton } from "@budibase/bbui"
|
||||||
import CreateViewModal from "../modals/CreateViewModal.svelte"
|
import CreateViewModal from "../modals/CreateViewModal.svelte"
|
||||||
|
|
||||||
let modal
|
let modal
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Button icon="CollectionAdd" primary size="S" quiet on:click={modal.show}>
|
<ActionButton icon="CollectionAdd" size="S" quiet on:click={modal.show}>
|
||||||
Create New View
|
Create view
|
||||||
</Button>
|
</ActionButton>
|
||||||
<Modal bind:this={modal}>
|
<Modal bind:this={modal}>
|
||||||
<CreateViewModal />
|
<CreateViewModal />
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { Button, Modal } from "@budibase/bbui"
|
import { ActionButton, Modal } from "@budibase/bbui"
|
||||||
import ExportModal from "../modals/ExportModal.svelte"
|
import ExportModal from "../modals/ExportModal.svelte"
|
||||||
|
|
||||||
export let view
|
export let view
|
||||||
|
@ -7,9 +7,9 @@
|
||||||
let modal
|
let modal
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Button icon="Download" primary size="S" quiet on:click={modal.show}>
|
<ActionButton icon="Download" size="S" quiet on:click={modal.show}>
|
||||||
Export
|
Export
|
||||||
</Button>
|
</ActionButton>
|
||||||
<Modal bind:this={modal}>
|
<Modal bind:this={modal}>
|
||||||
<ExportModal {view} />
|
<ExportModal {view} />
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { Button, Modal } from "@budibase/bbui"
|
import { ActionButton, Modal } from "@budibase/bbui"
|
||||||
import FilterModal from "../modals/FilterModal.svelte"
|
import FilterModal from "../modals/FilterModal.svelte"
|
||||||
|
|
||||||
export let view = {}
|
export let view = {}
|
||||||
|
@ -7,15 +7,14 @@
|
||||||
let modal
|
let modal
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Button
|
<ActionButton
|
||||||
icon="Filter"
|
icon="Filter"
|
||||||
primary
|
|
||||||
size="S"
|
size="S"
|
||||||
quiet
|
quiet
|
||||||
on:click={modal.show}
|
on:click={modal.show}
|
||||||
active={view.filters?.length}>
|
active={view.filters?.length}>
|
||||||
Filter
|
Filter
|
||||||
</Button>
|
</ActionButton>
|
||||||
<Modal bind:this={modal}>
|
<Modal bind:this={modal}>
|
||||||
<FilterModal {view} />
|
<FilterModal {view} />
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
|
@ -1,28 +1,13 @@
|
||||||
<script>
|
<script>
|
||||||
import { Button } from "@budibase/bbui"
|
import { ActionButton } from "@budibase/bbui"
|
||||||
|
|
||||||
export let hideAutocolumns
|
export let hideAutocolumns
|
||||||
|
|
||||||
let anchor
|
|
||||||
let dropdown
|
|
||||||
|
|
||||||
function hideOrUnhide() {
|
function hideOrUnhide() {
|
||||||
hideAutocolumns = !hideAutocolumns
|
hideAutocolumns = !hideAutocolumns
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div bind:this={anchor}>
|
<ActionButton icon="MagicWand" primary size="S" quiet on:click={hideOrUnhide}>
|
||||||
<Button icon="MagicWand" primary size="S" quiet on:click={hideOrUnhide}>
|
{#if hideAutocolumns}Show auto columns{:else}Hide auto columns{/if}
|
||||||
{#if hideAutocolumns}
|
</ActionButton>
|
||||||
Show Auto Columns
|
|
||||||
{:else}
|
|
||||||
Hide Auto Columns
|
|
||||||
{/if}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
i {
|
|
||||||
margin-right: 4px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { Button, Modal } from "@budibase/bbui"
|
import { ActionButton, Modal } from "@budibase/bbui"
|
||||||
import { permissions } from "stores/backend"
|
import { permissions } from "stores/backend"
|
||||||
import ManageAccessModal from "../modals/ManageAccessModal.svelte"
|
import ManageAccessModal from "../modals/ManageAccessModal.svelte"
|
||||||
|
|
||||||
|
@ -14,9 +14,9 @@
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Button icon="LockClosed" primary size="S" quiet on:click={openDropdown}>
|
<ActionButton icon="LockClosed" size="S" quiet on:click={openDropdown}>
|
||||||
Manage Access
|
Manage access
|
||||||
</Button>
|
</ActionButton>
|
||||||
<Modal bind:this={modal}>
|
<Modal bind:this={modal}>
|
||||||
<ManageAccessModal
|
<ManageAccessModal
|
||||||
{resourceId}
|
{resourceId}
|
||||||
|
|
|
@ -34,11 +34,10 @@
|
||||||
{#each $tables.list as table, idx}
|
{#each $tables.list as table, idx}
|
||||||
<NavItem
|
<NavItem
|
||||||
border={idx > 0}
|
border={idx > 0}
|
||||||
icon={table._id === TableNames.USERS ? "UserGroup" : "Table"}
|
icon={table._id === TableNames.USERS ? 'UserGroup' : 'Table'}
|
||||||
text={table.name}
|
text={table.name}
|
||||||
selected={selectedView === `all_${table._id}`}
|
selected={selectedView === `all_${table._id}`}
|
||||||
on:click={() => selectTable(table)}
|
on:click={() => selectTable(table)}>
|
||||||
>
|
|
||||||
{#if table._id !== TableNames.USERS}
|
{#if table._id !== TableNames.USERS}
|
||||||
<EditTablePopover {table} />
|
<EditTablePopover {table} />
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -46,14 +45,12 @@
|
||||||
{#each Object.keys(table.views || {}) as viewName, idx (idx)}
|
{#each Object.keys(table.views || {}) as viewName, idx (idx)}
|
||||||
<NavItem
|
<NavItem
|
||||||
indentLevel={1}
|
indentLevel={1}
|
||||||
icon="ri-eye-line"
|
icon="Remove"
|
||||||
text={viewName}
|
text={viewName}
|
||||||
selected={selectedView === viewName}
|
selected={selectedView === viewName}
|
||||||
on:click={() => onClickView(table, viewName)}
|
on:click={() => onClickView(table, viewName)}>
|
||||||
>
|
|
||||||
<EditViewPopover
|
<EditViewPopover
|
||||||
view={{ name: viewName, ...table.views[viewName] }}
|
view={{ name: viewName, ...table.views[viewName] }} />
|
||||||
/>
|
|
||||||
</NavItem>
|
</NavItem>
|
||||||
{/each}
|
{/each}
|
||||||
{/each}
|
{/each}
|
||||||
|
|
|
@ -1,40 +1,30 @@
|
||||||
<script>
|
<script>
|
||||||
import { goto } from "@roxi/routify"
|
import { goto } from "@roxi/routify"
|
||||||
import { views } from "stores/backend"
|
import { views } from "stores/backend"
|
||||||
import { notifications } from "@budibase/bbui"
|
|
||||||
import { Icon, Popover, Button, Input } from "@budibase/bbui"
|
|
||||||
import ConfirmDialog from "components/common/ConfirmDialog.svelte"
|
import ConfirmDialog from "components/common/ConfirmDialog.svelte"
|
||||||
import { DropdownContainer, DropdownItem } from "components/common/Dropdowns"
|
import {
|
||||||
|
notifications,
|
||||||
|
Icon,
|
||||||
|
Input,
|
||||||
|
ActionMenu,
|
||||||
|
MenuItem,
|
||||||
|
Modal,
|
||||||
|
ModalContent,
|
||||||
|
} from "@budibase/bbui"
|
||||||
|
|
||||||
export let view
|
export let view
|
||||||
|
|
||||||
let anchor
|
let editorModal
|
||||||
let dropdown
|
let confirmDeleteDialogue
|
||||||
let editing
|
|
||||||
let originalName = view.name
|
let originalName = view.name
|
||||||
let confirmDeleteDialog
|
let confirmDeleteDialog
|
||||||
|
|
||||||
function showEditor() {
|
|
||||||
editing = true
|
|
||||||
}
|
|
||||||
|
|
||||||
function hideEditor() {
|
|
||||||
dropdown.hide()
|
|
||||||
editing = false
|
|
||||||
}
|
|
||||||
|
|
||||||
function showDelete() {
|
|
||||||
dropdown.hide()
|
|
||||||
confirmDeleteDialog.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
async function save() {
|
async function save() {
|
||||||
await views.save({
|
await views.save({
|
||||||
originalName,
|
originalName,
|
||||||
...view,
|
...view,
|
||||||
})
|
})
|
||||||
notifications.success("View renamed successfully")
|
notifications.success("View renamed successfully")
|
||||||
hideEditor()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function deleteView() {
|
async function deleteView() {
|
||||||
|
@ -46,69 +36,21 @@
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div on:click|stopPropagation>
|
<ActionMenu>
|
||||||
<div bind:this={anchor} class="icon" on:click={dropdown.show}>
|
<div slot="control" class="icon">
|
||||||
<Icon s hoverable name="MoreSmallList" />
|
<Icon s hoverable name="MoreSmallList" />
|
||||||
</div>
|
</div>
|
||||||
<Popover align="left" {anchor} bind:this={dropdown}>
|
<MenuItem icon="Edit" on:click={editorModal.show}>Edit</MenuItem>
|
||||||
{#if editing}
|
<MenuItem icon="Delete" on:click={confirmDeleteDialog.show}>Delete</MenuItem>
|
||||||
<div class="actions">
|
</ActionMenu>
|
||||||
<h5>Edit View</h5>
|
<Modal bind:this={editorModal}>
|
||||||
<Input label="View Name" thin bind:value={view.name} />
|
<ModalContent title="Edit View" onConfirm={save} confirmText="Save">
|
||||||
<footer>
|
<Input label="View Name" thin bind:value={view.name} />
|
||||||
<Button secondary on:click={hideEditor}>Cancel</Button>
|
</ModalContent>
|
||||||
<Button primary on:click={save}>Save</Button>
|
</Modal>
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
{:else}
|
|
||||||
<DropdownContainer>
|
|
||||||
<DropdownItem
|
|
||||||
icon="ri-edit-line"
|
|
||||||
data-cy="edit-view"
|
|
||||||
title="Edit"
|
|
||||||
on:click={showEditor}
|
|
||||||
/>
|
|
||||||
<DropdownItem
|
|
||||||
icon="ri-delete-bin-line"
|
|
||||||
title="Delete"
|
|
||||||
data-cy="delete-view"
|
|
||||||
on:click={showDelete}
|
|
||||||
/>
|
|
||||||
</DropdownContainer>
|
|
||||||
{/if}
|
|
||||||
</Popover>
|
|
||||||
</div>
|
|
||||||
<ConfirmDialog
|
<ConfirmDialog
|
||||||
bind:this={confirmDeleteDialog}
|
bind:this={confirmDeleteDialog}
|
||||||
body={`Are you sure you wish to delete the view '${view.name}'? Your data will be deleted and this action cannot be undone.`}
|
body={`Are you sure you wish to delete the view '${view.name}'? Your data will be deleted and this action cannot be undone.`}
|
||||||
okText="Delete View"
|
okText="Delete View"
|
||||||
onOk={deleteView}
|
onOk={deleteView}
|
||||||
title="Confirm Deletion"
|
title="Confirm Deletion" />
|
||||||
/>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
div.icon {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: flex-end;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.actions {
|
|
||||||
padding: var(--spacing-xl);
|
|
||||||
display: grid;
|
|
||||||
grid-gap: var(--spacing-xl);
|
|
||||||
min-width: 400px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h5 {
|
|
||||||
margin: 0;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
footer {
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-end;
|
|
||||||
gap: var(--spacing-m);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { Modal, ModalContent } from "@budibase/bbui"
|
import { Modal, ModalContent, Body } from "@budibase/bbui"
|
||||||
|
|
||||||
export let title = ""
|
export let title = ""
|
||||||
export let body = ""
|
export let body = ""
|
||||||
|
@ -20,15 +20,9 @@
|
||||||
|
|
||||||
<Modal bind:this={modal} on:hide={onCancel}>
|
<Modal bind:this={modal} on:hide={onCancel}>
|
||||||
<ModalContent onConfirm={onOk} {title} confirmText={okText} {cancelText} red>
|
<ModalContent onConfirm={onOk} {title} confirmText={okText} {cancelText} red>
|
||||||
<div class="body">
|
<Body s>
|
||||||
{body}
|
{body}
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</Body>
|
||||||
</ModalContent>
|
</ModalContent>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
<style>
|
|
||||||
.body {
|
|
||||||
font-size: var(--font-size-s);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
ActionGroup,
|
ActionGroup,
|
||||||
ActionButton,
|
ActionButton,
|
||||||
MenuItem,
|
MenuItem,
|
||||||
|
Icon,
|
||||||
} from "@budibase/bbui"
|
} from "@budibase/bbui"
|
||||||
import { store, currentAssetName } from "builderStore"
|
import { store, currentAssetName } from "builderStore"
|
||||||
import structure from "./componentStructure.json"
|
import structure from "./componentStructure.json"
|
||||||
|
@ -12,7 +13,7 @@
|
||||||
|
|
||||||
const enrichStructure = (structure, definitions) => {
|
const enrichStructure = (structure, definitions) => {
|
||||||
let enrichedStructure = []
|
let enrichedStructure = []
|
||||||
structure.forEach((item) => {
|
structure.forEach(item => {
|
||||||
if (typeof item === "string") {
|
if (typeof item === "string") {
|
||||||
const def = definitions[`@budibase/standard-components/${item}`]
|
const def = definitions[`@budibase/standard-components/${item}`]
|
||||||
if (def) {
|
if (def) {
|
||||||
|
@ -32,37 +33,65 @@
|
||||||
return enrichedStructure
|
return enrichedStructure
|
||||||
}
|
}
|
||||||
|
|
||||||
const onItemChosen = async (item) => {
|
const onItemChosen = async item => {
|
||||||
if (!item.isCategory) {
|
if (!item.isCategory) {
|
||||||
// Add this component
|
|
||||||
await store.actions.components.create(item.component)
|
await store.actions.components.create(item.component)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<ActionGroup>
|
<div class="components">
|
||||||
{#each enrichedStructure as item}
|
{#each enrichedStructure as item}
|
||||||
<ActionMenu disabled={!item.isCategory}>
|
<ActionMenu disabled={!item.isCategory}>
|
||||||
<ActionButton
|
<ActionButton
|
||||||
icon={item.icon}
|
icon={item.icon}
|
||||||
primary
|
|
||||||
quiet
|
quiet
|
||||||
|
size="S"
|
||||||
slot="control"
|
slot="control"
|
||||||
on:click={() => onItemChosen(item)}
|
on:click={() => onItemChosen(item)}>
|
||||||
>
|
<div class="buttonContent">
|
||||||
{item.name}
|
{item.name}
|
||||||
|
{#if item.isCategory}
|
||||||
|
<Icon size="S" name="ChevronDown" />
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
</ActionButton>
|
</ActionButton>
|
||||||
{#each item.children || [] as item}
|
{#each item.children || [] as item}
|
||||||
{#if !item.showOnAsset || item.showOnAsset.includes($currentAssetName)}
|
{#if !item.showOnAsset || item.showOnAsset.includes($currentAssetName)}
|
||||||
<MenuItem
|
<MenuItem
|
||||||
dataCy={`component-${item.name}`}
|
dataCy={`component-${item.name}`}
|
||||||
icon={item.icon}
|
icon={item.icon}
|
||||||
on:click={() => onItemChosen(item)}
|
on:click={() => onItemChosen(item)}>
|
||||||
>
|
|
||||||
{item.name}
|
{item.name}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
{/if}
|
{/if}
|
||||||
{/each}
|
{/each}
|
||||||
</ActionMenu>
|
</ActionMenu>
|
||||||
{/each}
|
{/each}
|
||||||
</ActionGroup>
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.components {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin-top: -10px;
|
||||||
|
}
|
||||||
|
.components :global(> *) {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttonContent {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: flex-end;
|
||||||
|
}
|
||||||
|
.buttonContent :global(svg) {
|
||||||
|
margin-left: 2px !important;
|
||||||
|
margin-right: 0 !important;
|
||||||
|
margin-bottom: -1px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
"search",
|
"search",
|
||||||
{
|
{
|
||||||
"name": "Form",
|
"name": "Form",
|
||||||
"icon": "ri-file-edit-line",
|
"icon": "Form",
|
||||||
"children": [
|
"children": [
|
||||||
"form",
|
"form",
|
||||||
"fieldgroup",
|
"fieldgroup",
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Card",
|
"name": "Card",
|
||||||
"icon": "ri-archive-drawer-line",
|
"icon": "Card",
|
||||||
"children": [
|
"children": [
|
||||||
"stackedlist",
|
"stackedlist",
|
||||||
"card",
|
"card",
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Chart",
|
"name": "Chart",
|
||||||
"icon": "ri-bar-chart-2-line",
|
"icon": "GraphBarVertical",
|
||||||
"children": [
|
"children": [
|
||||||
"bar",
|
"bar",
|
||||||
"line",
|
"line",
|
||||||
|
@ -46,7 +46,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Elements",
|
"name": "Elements",
|
||||||
"icon": "ri-paragraph",
|
"icon": "TextParagraph",
|
||||||
"children": [
|
"children": [
|
||||||
"heading",
|
"heading",
|
||||||
"text",
|
"text",
|
||||||
|
@ -59,7 +59,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Other",
|
"name": "Other",
|
||||||
"icon": "ri-more-2-line",
|
"icon": "More",
|
||||||
"children": [
|
"children": [
|
||||||
"screenslot",
|
"screenslot",
|
||||||
"navigation",
|
"navigation",
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
<script>
|
<script>
|
||||||
import { themeStore } from "builderStore"
|
import { themeStore } from "builderStore"
|
||||||
import { Toggle } from "@budibase/bbui"
|
import { Select } from "@budibase/bbui"
|
||||||
|
import { capitalise } from "../../helpers"
|
||||||
let showAdvanced = false
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Toggle text="Dark theme" bind:value={$themeStore.darkMode} />
|
<Select
|
||||||
|
options={$themeStore.options}
|
||||||
|
bind:value={$themeStore.theme}
|
||||||
|
placeholder={null}
|
||||||
|
getOptionLabel={capitalise} />
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.apps-card {
|
.apps-card {
|
||||||
background-color: var(--background-alt);
|
background-color: var(--background);
|
||||||
padding: var(--spacing-xl) var(--spacing-xl) var(--spacing-xl)
|
padding: var(--spacing-xl) var(--spacing-xl) var(--spacing-xl)
|
||||||
var(--spacing-xl);
|
var(--spacing-xl);
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"container": {
|
"container": {
|
||||||
"name": "Container",
|
"name": "Container",
|
||||||
"description": "This component contains things within itself",
|
"description": "This component contains things within itself",
|
||||||
"icon": "ri-layout-column-line",
|
"icon": "Sandbox",
|
||||||
"hasChildren": true,
|
"hasChildren": true,
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"transitionable": true,
|
"transitionable": true,
|
||||||
|
@ -10,14 +10,14 @@
|
||||||
},
|
},
|
||||||
"screenslot": {
|
"screenslot": {
|
||||||
"name": "Screenslot",
|
"name": "Screenslot",
|
||||||
"icon": "ri-artboard-2-line",
|
"icon": "WebPage",
|
||||||
"description": "Contains your app screens",
|
"description": "Contains your app screens",
|
||||||
"styleable": true
|
"styleable": true
|
||||||
},
|
},
|
||||||
"button": {
|
"button": {
|
||||||
"name": "Button",
|
"name": "Button",
|
||||||
"description": "A basic html button that is ready for styling",
|
"description": "A basic html button that is ready for styling",
|
||||||
"icon": "ri-share-box-line",
|
"icon": "Button",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
"repeater": {
|
"repeater": {
|
||||||
"name": "Repeater",
|
"name": "Repeater",
|
||||||
"description": "A configurable data list that attaches to your backend tables.",
|
"description": "A configurable data list that attaches to your backend tables.",
|
||||||
"icon": "ri-list-check-2",
|
"icon": "ViewList",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"hasChildren": true,
|
"hasChildren": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
|
@ -68,7 +68,7 @@
|
||||||
"search": {
|
"search": {
|
||||||
"name": "Search",
|
"name": "Search",
|
||||||
"description": "A searchable list of items.",
|
"description": "A searchable list of items.",
|
||||||
"icon": "ri-search-line",
|
"icon": "Search",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"hasChildren": true,
|
"hasChildren": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
|
@ -101,7 +101,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"stackedlist": {
|
"stackedlist": {
|
||||||
"name": "Stacked List",
|
"name": "TaskList",
|
||||||
"icon": "ri-archive-drawer-line",
|
"icon": "ri-archive-drawer-line",
|
||||||
"description": "A basic card component that can contain content and actions.",
|
"description": "A basic card component that can contain content and actions.",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
|
@ -132,7 +132,7 @@
|
||||||
"card": {
|
"card": {
|
||||||
"name": "Vertical Card",
|
"name": "Vertical Card",
|
||||||
"description": "A basic card component that can contain content and actions.",
|
"description": "A basic card component that can contain content and actions.",
|
||||||
"icon": "ri-layout-column-line",
|
"icon": "ViewColumn",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -192,7 +192,7 @@
|
||||||
"text": {
|
"text": {
|
||||||
"name": "Paragraph",
|
"name": "Paragraph",
|
||||||
"description": "A component for displaying paragraph text.",
|
"description": "A component for displaying paragraph text.",
|
||||||
"icon": "ri-paragraph",
|
"icon": "TextParagraph",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -204,7 +204,7 @@
|
||||||
},
|
},
|
||||||
"heading": {
|
"heading": {
|
||||||
"name": "Headline",
|
"name": "Headline",
|
||||||
"icon": "ri-heading",
|
"icon": "TextBold",
|
||||||
"description": "A component for displaying heading text",
|
"description": "A component for displaying heading text",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
|
@ -225,7 +225,7 @@
|
||||||
"image": {
|
"image": {
|
||||||
"name": "Image",
|
"name": "Image",
|
||||||
"description": "A basic component for displaying images",
|
"description": "A basic component for displaying images",
|
||||||
"icon": "ri-image-line",
|
"icon": "Image",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -238,7 +238,7 @@
|
||||||
"backgroundimage": {
|
"backgroundimage": {
|
||||||
"name": "Background Image",
|
"name": "Background Image",
|
||||||
"description": "A background image",
|
"description": "A background image",
|
||||||
"icon": "ri-image-line",
|
"icon": "Images",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -295,7 +295,7 @@
|
||||||
"icon": {
|
"icon": {
|
||||||
"name": "Icon",
|
"name": "Icon",
|
||||||
"description": "A basic component for displaying icons",
|
"description": "A basic component for displaying icons",
|
||||||
"icon": "ri-sun-fill",
|
"icon": "Bell",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -342,7 +342,7 @@
|
||||||
"login": {
|
"login": {
|
||||||
"name": "Login Form",
|
"name": "Login Form",
|
||||||
"description": "A component that automatically generates a login screen for your app.",
|
"description": "A component that automatically generates a login screen for your app.",
|
||||||
"icon": "ri-login-box-line",
|
"icon": "Login",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -365,7 +365,7 @@
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"name": "Nav Bar",
|
"name": "Nav Bar",
|
||||||
"description": "A component for handling the navigation within your app.",
|
"description": "A component for handling the navigation within your app.",
|
||||||
"icon": "ri-navigation-line",
|
"icon": "BreadcrumbNavigation",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"hasChildren": true,
|
"hasChildren": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
|
@ -379,7 +379,7 @@
|
||||||
"link": {
|
"link": {
|
||||||
"name": "Link",
|
"name": "Link",
|
||||||
"description": "A basic link component for internal and external links",
|
"description": "A basic link component for internal and external links",
|
||||||
"icon": "ri-link",
|
"icon": "Link",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -408,7 +408,7 @@
|
||||||
"cardhorizontal": {
|
"cardhorizontal": {
|
||||||
"name": "Horizontal Card",
|
"name": "Horizontal Card",
|
||||||
"description": "A basic card component that can contain content and actions.",
|
"description": "A basic card component that can contain content and actions.",
|
||||||
"icon": "ri-layout-row-line",
|
"icon": "ViewRow",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -480,7 +480,7 @@
|
||||||
"cardstat": {
|
"cardstat": {
|
||||||
"name": "Stat Card",
|
"name": "Stat Card",
|
||||||
"description": "A card component for displaying numbers.",
|
"description": "A card component for displaying numbers.",
|
||||||
"icon": "ri-dual-sim-2-line",
|
"icon": "Card",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -505,7 +505,7 @@
|
||||||
},
|
},
|
||||||
"embed": {
|
"embed": {
|
||||||
"name": "Embed",
|
"name": "Embed",
|
||||||
"icon": "ri-code-line",
|
"icon": "Code",
|
||||||
"description": "Embed content from 3rd party sources",
|
"description": "Embed content from 3rd party sources",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
|
@ -519,7 +519,7 @@
|
||||||
"bar": {
|
"bar": {
|
||||||
"name": "Bar Chart",
|
"name": "Bar Chart",
|
||||||
"description": "Bar chart",
|
"description": "Bar chart",
|
||||||
"icon": "ri-bar-chart-line",
|
"icon": "GraphBarVertical",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -619,7 +619,7 @@
|
||||||
"line": {
|
"line": {
|
||||||
"name": "Line Chart",
|
"name": "Line Chart",
|
||||||
"description": "Line chart",
|
"description": "Line chart",
|
||||||
"icon": "ri-line-chart-line",
|
"icon": "GraphTrend",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -720,7 +720,7 @@
|
||||||
"area": {
|
"area": {
|
||||||
"name": "Area Chart",
|
"name": "Area Chart",
|
||||||
"description": "Line chart",
|
"description": "Line chart",
|
||||||
"icon": "ri-line-chart-fill",
|
"icon": "GraphAreaStacked",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -833,7 +833,7 @@
|
||||||
"pie": {
|
"pie": {
|
||||||
"name": "Pie Chart",
|
"name": "Pie Chart",
|
||||||
"description": "Pie chart",
|
"description": "Pie chart",
|
||||||
"icon": "ri-pie-chart-line",
|
"icon": "GraphPie",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -910,7 +910,7 @@
|
||||||
"donut": {
|
"donut": {
|
||||||
"name": "Donut Chart",
|
"name": "Donut Chart",
|
||||||
"description": "Donut chart",
|
"description": "Donut chart",
|
||||||
"icon": "ri-donut-chart-line",
|
"icon": "GraphDonut",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -987,7 +987,7 @@
|
||||||
"candlestick": {
|
"candlestick": {
|
||||||
"name": "Candlestick Chart",
|
"name": "Candlestick Chart",
|
||||||
"description": "Candlestick chart",
|
"description": "Candlestick chart",
|
||||||
"icon": "ri-stock-line",
|
"icon": "GraphBarVerticalStacked",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -1068,7 +1068,7 @@
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"name": "Form",
|
"name": "Form",
|
||||||
"icon": "ri-file-text-line",
|
"icon": "Form",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"hasChildren": true,
|
"hasChildren": true,
|
||||||
"actions": [
|
"actions": [
|
||||||
|
@ -1133,7 +1133,7 @@
|
||||||
},
|
},
|
||||||
"fieldgroup": {
|
"fieldgroup": {
|
||||||
"name": "Field Group",
|
"name": "Field Group",
|
||||||
"icon": "ri-layout-row-line",
|
"icon": "Group",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"hasChildren": true,
|
"hasChildren": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
|
@ -1161,7 +1161,7 @@
|
||||||
},
|
},
|
||||||
"stringfield": {
|
"stringfield": {
|
||||||
"name": "Text Field",
|
"name": "Text Field",
|
||||||
"icon": "ri-t-box-line",
|
"icon": "Text",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -1189,7 +1189,7 @@
|
||||||
},
|
},
|
||||||
"numberfield": {
|
"numberfield": {
|
||||||
"name": "Number Field",
|
"name": "Number Field",
|
||||||
"icon": "ri-edit-box-line",
|
"icon": "123",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -1217,7 +1217,7 @@
|
||||||
},
|
},
|
||||||
"passwordfield": {
|
"passwordfield": {
|
||||||
"name": "Password Field",
|
"name": "Password Field",
|
||||||
"icon": "ri-lock-password-line",
|
"icon": "LockClosed",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -1245,7 +1245,7 @@
|
||||||
},
|
},
|
||||||
"optionsfield": {
|
"optionsfield": {
|
||||||
"name": "Options Picker",
|
"name": "Options Picker",
|
||||||
"icon": "ri-file-list-line",
|
"icon": "ViewList",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -1274,7 +1274,7 @@
|
||||||
},
|
},
|
||||||
"booleanfield": {
|
"booleanfield": {
|
||||||
"name": "Checkbox",
|
"name": "Checkbox",
|
||||||
"icon": "ri-checkbox-line",
|
"icon": "Checkmark",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -1302,7 +1302,7 @@
|
||||||
},
|
},
|
||||||
"longformfield": {
|
"longformfield": {
|
||||||
"name": "Rich Text",
|
"name": "Rich Text",
|
||||||
"icon": "ri-file-edit-line",
|
"icon": "TextParagraph",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -1331,7 +1331,7 @@
|
||||||
},
|
},
|
||||||
"datetimefield": {
|
"datetimefield": {
|
||||||
"name": "Date Picker",
|
"name": "Date Picker",
|
||||||
"icon": "ri-calendar-line",
|
"icon": "DateInput",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -1365,7 +1365,7 @@
|
||||||
},
|
},
|
||||||
"attachmentfield": {
|
"attachmentfield": {
|
||||||
"name": "Attachment",
|
"name": "Attachment",
|
||||||
"icon": "ri-image-edit-line",
|
"icon": "Attach",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -1388,7 +1388,7 @@
|
||||||
},
|
},
|
||||||
"relationshipfield": {
|
"relationshipfield": {
|
||||||
"name": "Relationship Picker",
|
"name": "Relationship Picker",
|
||||||
"icon": "ri-links-line",
|
"icon": "TaskList",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
{
|
{
|
||||||
|
@ -1416,7 +1416,7 @@
|
||||||
},
|
},
|
||||||
"dataprovider": {
|
"dataprovider": {
|
||||||
"name": "Data Provider",
|
"name": "Data Provider",
|
||||||
"icon": "ri-database-2-line",
|
"icon": "Data",
|
||||||
"styleable": false,
|
"styleable": false,
|
||||||
"hasChildren": true,
|
"hasChildren": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
|
@ -1476,7 +1476,7 @@
|
||||||
},
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"name": "Table",
|
"name": "Table",
|
||||||
"icon": "ri-table-line",
|
"icon": "Table",
|
||||||
"styleable": true,
|
"styleable": true,
|
||||||
"hasChildren": true,
|
"hasChildren": true,
|
||||||
"settings": [
|
"settings": [
|
||||||
|
|
Loading…
Reference in New Issue