Merge branch 'master' into Tidy-ups-and-implementing-new-BBUI-vars
This commit is contained in:
commit
980c0d8f8b
|
@ -5,7 +5,7 @@ xcontext('Create Components', () => {
|
||||||
cy.visit('localhost:4001/_builder')
|
cy.visit('localhost:4001/_builder')
|
||||||
// https://on.cypress.io/type
|
// https://on.cypress.io/type
|
||||||
cy.createApp('Model App', 'Model App Description')
|
cy.createApp('Model App', 'Model App Description')
|
||||||
cy.createModel('dog', 'name', 'age')
|
cy.createTable('dog', 'name', 'age')
|
||||||
cy.addRecord('bob', '15')
|
cy.addRecord('bob', '15')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
xcontext('Create a Model', () => {
|
|
||||||
|
|
||||||
before(() => {
|
|
||||||
cy.visit('localhost:4001/_builder')
|
|
||||||
// https://on.cypress.io/type
|
|
||||||
cy.createApp('Model App', 'Model App Description')
|
|
||||||
})
|
|
||||||
|
|
||||||
// https://on.cypress.io/interacting-with-elements
|
|
||||||
it('should create a new model', () => {
|
|
||||||
|
|
||||||
cy.createModel('dog', 'name', 'age')
|
|
||||||
|
|
||||||
// Check if model exists
|
|
||||||
cy.get('.title').should('have.text', 'dog')
|
|
||||||
})
|
|
||||||
it('should add a record', () => {
|
|
||||||
cy.addRecord('bob', '15')
|
|
||||||
|
|
||||||
cy.contains('bob').should('have.text', 'bob')
|
|
||||||
})
|
|
||||||
})
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
context('Create a Table', () => {
|
||||||
|
before(() => {
|
||||||
|
cy.visit('localhost:4001/_builder')
|
||||||
|
cy.createApp('Table App', 'Table App Description')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should create a new Table', () => {
|
||||||
|
cy.createTable('dog')
|
||||||
|
|
||||||
|
// Check if Table exists
|
||||||
|
cy.get('.title').should('have.text', 'dog')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('adds a new column to the table', () => {
|
||||||
|
cy.addColumn('dog', 'name', 'Plain Text')
|
||||||
|
|
||||||
|
cy.contains('name').should("be.visible")
|
||||||
|
})
|
||||||
|
|
||||||
|
it('creates a record in the table', () => {
|
||||||
|
cy.addRecord(["Rover"])
|
||||||
|
|
||||||
|
cy.contains('Rover').should("be.visible")
|
||||||
|
})
|
||||||
|
|
||||||
|
it('updates a column on the table', () => {
|
||||||
|
cy.contains("name").click()
|
||||||
|
cy.get("[data-cy='edit-column-header']").click()
|
||||||
|
|
||||||
|
cy.get("[placeholder=Name]").type("updated")
|
||||||
|
cy.get("select").select("Plain Text")
|
||||||
|
|
||||||
|
cy.contains("Save Column").click()
|
||||||
|
|
||||||
|
cy.contains('nameupdated').should('have.text', 'nameupdated ')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('edits a record', () => {
|
||||||
|
cy.get("tbody .ri-more-line").click()
|
||||||
|
cy.get("[data-cy=edit-row]").click()
|
||||||
|
cy.get(".actions input").type("updatedRecord")
|
||||||
|
cy.contains("Save").click()
|
||||||
|
|
||||||
|
cy.contains('updatedRecord').should('have.text', 'updatedRecord')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('deletes a record', () => {
|
||||||
|
cy.get("tbody .ri-more-line").click()
|
||||||
|
cy.get("[data-cy=delete-row]").click()
|
||||||
|
cy.get(".modal-actions").contains("Delete").click()
|
||||||
|
|
||||||
|
cy.contains('updatedRecord').should('not.exist')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('deletes a column', () => {
|
||||||
|
cy.contains("name").click()
|
||||||
|
cy.get("[data-cy='delete-column-header']").click()
|
||||||
|
|
||||||
|
cy.contains('nameupdated').should('not.exist')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('deletes a table', () => {
|
||||||
|
cy.contains("div", "dog").get(".ri-more-line").click()
|
||||||
|
cy.get("[data-cy=delete-table]").click()
|
||||||
|
cy.get(".modal-actions").contains("Delete").click()
|
||||||
|
|
||||||
|
cy.contains('dog').should('not.exist')
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
|
@ -9,7 +9,7 @@ xcontext('Create a workflow', () => {
|
||||||
|
|
||||||
// https://on.cypress.io/interacting-with-elements
|
// https://on.cypress.io/interacting-with-elements
|
||||||
it('should create a workflow', () => {
|
it('should create a workflow', () => {
|
||||||
cy.createModel('dog', 'name', 'age')
|
cy.createTable('dog', 'name', 'age')
|
||||||
|
|
||||||
cy.contains('workflow').click()
|
cy.contains('workflow').click()
|
||||||
cy.contains('Create New Workflow').click()
|
cy.contains('Create New Workflow').click()
|
||||||
|
|
|
@ -57,29 +57,37 @@ Cypress.Commands.add("createApp", name => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Cypress.Commands.add("createModel", modelName => {
|
Cypress.Commands.add("createTable", tableName => {
|
||||||
// Enter model name
|
// Enter model name
|
||||||
cy.contains("Create New Table").click()
|
cy.contains("Create New Table").click()
|
||||||
cy.get("[data-cy=table-name-input]").type(modelName)
|
cy.get("[placeholder='Table Name']").type(tableName)
|
||||||
|
|
||||||
// Add 'name' field
|
// Add 'name' field
|
||||||
cy.contains("Add").click()
|
|
||||||
cy.contains("Plain Text").click()
|
|
||||||
|
|
||||||
// Add 'age' field
|
|
||||||
cy.contains("Add").click()
|
|
||||||
cy.contains("Number").click()
|
|
||||||
|
|
||||||
cy.contains("Save").click()
|
cy.contains("Save").click()
|
||||||
|
cy.contains(tableName).should("be.visible")
|
||||||
cy.contains(modelName).click()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
Cypress.Commands.add("addRecord", (firstField, secondField) => {
|
Cypress.Commands.add("addColumn", (tableName, columnName, type) => {
|
||||||
cy.contains("Create New Record").click()
|
// Select Table
|
||||||
|
cy.contains(tableName).click()
|
||||||
|
cy.contains("Create New Column").click()
|
||||||
|
|
||||||
cy.get("[data-cy='Plain Text-input']").type(firstField)
|
cy.get("[placeholder=Name]").type(columnName)
|
||||||
cy.get("[data-cy=Number-input]").type(secondField)
|
cy.get("select").select(type)
|
||||||
|
|
||||||
|
cy.contains("Save Column")
|
||||||
|
|
||||||
|
cy.contains("Save").click()
|
||||||
|
})
|
||||||
|
|
||||||
|
Cypress.Commands.add("addRecord", values => {
|
||||||
|
cy.contains("Create New Row").click()
|
||||||
|
|
||||||
|
for (let i = 0; i < values.length; i++) {
|
||||||
|
cy.get("input")
|
||||||
|
.eq(i)
|
||||||
|
.type(values[i])
|
||||||
|
}
|
||||||
|
|
||||||
// Save
|
// Save
|
||||||
cy.contains("Save").click()
|
cy.contains("Save").click()
|
||||||
|
|
|
@ -68,6 +68,7 @@
|
||||||
"d3-selection": "^1.4.1",
|
"d3-selection": "^1.4.1",
|
||||||
"date-fns": "^1.29.0",
|
"date-fns": "^1.29.0",
|
||||||
"deepmerge": "^4.2.2",
|
"deepmerge": "^4.2.2",
|
||||||
|
"fast-sort": "^2.2.0",
|
||||||
"feather-icons": "^4.21.0",
|
"feather-icons": "^4.21.0",
|
||||||
"flatpickr": "^4.5.7",
|
"flatpickr": "^4.5.7",
|
||||||
"lodash": "^4.17.13",
|
"lodash": "^4.17.13",
|
||||||
|
@ -98,6 +99,7 @@
|
||||||
"cypress-terminal-report": "^1.4.1",
|
"cypress-terminal-report": "^1.4.1",
|
||||||
"eslint-plugin-cypress": "^2.11.1",
|
"eslint-plugin-cypress": "^2.11.1",
|
||||||
"http-proxy-middleware": "^0.19.1",
|
"http-proxy-middleware": "^0.19.1",
|
||||||
|
"identity-obj-proxy": "^3.0.0",
|
||||||
"jest": "^24.8.0",
|
"jest": "^24.8.0",
|
||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
|
|
|
@ -61,10 +61,9 @@ export const getBackendUiStore = () => {
|
||||||
state.draftModel = cloneDeep(model)
|
state.draftModel = cloneDeep(model)
|
||||||
state.selectedField = ""
|
state.selectedField = ""
|
||||||
state.selectedView = `all_${model._id}`
|
state.selectedView = `all_${model._id}`
|
||||||
state.tabs.SETUP_PANEL = "SETUP"
|
|
||||||
return state
|
return state
|
||||||
}),
|
}),
|
||||||
save: async ({ model }) => {
|
save: async model => {
|
||||||
const updatedModel = cloneDeep(model)
|
const updatedModel = cloneDeep(model)
|
||||||
|
|
||||||
// update any renamed schema keys to reflect their names
|
// update any renamed schema keys to reflect their names
|
||||||
|
@ -83,20 +82,35 @@ export const getBackendUiStore = () => {
|
||||||
const savedModel = await response.json()
|
const savedModel = await response.json()
|
||||||
await store.actions.models.fetch()
|
await store.actions.models.fetch()
|
||||||
store.actions.models.select(savedModel)
|
store.actions.models.select(savedModel)
|
||||||
|
return savedModel
|
||||||
},
|
},
|
||||||
addField: field => {
|
delete: async model => {
|
||||||
|
await api.delete(`/api/models/${model._id}/${model._rev}`)
|
||||||
store.update(state => {
|
store.update(state => {
|
||||||
if (!state.draftModel.schema) {
|
state.models = state.models.filter(
|
||||||
state.draftModel.schema = {}
|
existing => existing._id !== model._id
|
||||||
}
|
)
|
||||||
|
state.selectedModel = state.models[0] || {}
|
||||||
|
return state
|
||||||
|
})
|
||||||
|
},
|
||||||
|
saveField: ({ originalName, field }) => {
|
||||||
|
store.update(state => {
|
||||||
|
// delete the original if renaming
|
||||||
|
delete state.draftModel.schema[originalName]
|
||||||
|
|
||||||
state.draftModel.schema = {
|
state.draftModel.schema = {
|
||||||
...state.draftModel.schema,
|
...state.draftModel.schema,
|
||||||
[field.name]: cloneDeep(field),
|
[field.name]: cloneDeep(field),
|
||||||
}
|
}
|
||||||
state.selectedField = field.name
|
store.actions.models.save(state.draftModel)
|
||||||
state.tabs.NAVIGATION_PANEL = "NAVIGATE"
|
return state
|
||||||
|
})
|
||||||
|
},
|
||||||
|
deleteField: field => {
|
||||||
|
store.update(state => {
|
||||||
|
delete state.draftModel.schema[field.name]
|
||||||
|
store.actions.models.save(state.draftModel)
|
||||||
return state
|
return state
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,38 +1,19 @@
|
||||||
<script>
|
<script>
|
||||||
import { onMount, getContext } from "svelte"
|
import { onMount } from "svelte"
|
||||||
|
import fsort from "fast-sort"
|
||||||
import { store, backendUiStore } from "builderStore"
|
import { store, backendUiStore } from "builderStore"
|
||||||
import { Button } from "@budibase/bbui"
|
import { Button, Icon } from "@budibase/bbui"
|
||||||
import Select from "components/common/Select.svelte"
|
import Select from "components/common/Select.svelte"
|
||||||
import ActionButton from "components/common/ActionButton.svelte"
|
import ActionButton from "components/common/ActionButton.svelte"
|
||||||
import LinkedRecord from "./LinkedRecord.svelte"
|
import LinkedRecord from "./LinkedRecord.svelte"
|
||||||
import TablePagination from "./TablePagination.svelte"
|
import TablePagination from "./TablePagination.svelte"
|
||||||
import { DeleteRecordModal, CreateEditRecordModal } from "./modals"
|
import { DeleteRecordModal, CreateEditRecordModal } from "./modals"
|
||||||
|
import RowPopover from "./popovers/Row.svelte"
|
||||||
|
import ColumnPopover from "./popovers/Column.svelte"
|
||||||
|
import ColumnHeaderPopover from "./popovers/ColumnHeader.svelte"
|
||||||
|
import EditRowPopover from "./popovers/EditRow.svelte"
|
||||||
import * as api from "./api"
|
import * as api from "./api"
|
||||||
|
|
||||||
const { open, close } = getContext("simple-modal")
|
|
||||||
|
|
||||||
const editRecord = async row => {
|
|
||||||
open(
|
|
||||||
CreateEditRecordModal,
|
|
||||||
{
|
|
||||||
onClosed: close,
|
|
||||||
record: row,
|
|
||||||
},
|
|
||||||
{ styleContent: { padding: "0" } }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const deleteRecord = async row => {
|
|
||||||
open(
|
|
||||||
DeleteRecordModal,
|
|
||||||
{
|
|
||||||
onClosed: close,
|
|
||||||
record: row,
|
|
||||||
},
|
|
||||||
{ styleContent: { padding: "0" } }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const ITEMS_PER_PAGE = 10
|
const ITEMS_PER_PAGE = 10
|
||||||
// Internal headers we want to hide from the user
|
// Internal headers we want to hide from the user
|
||||||
const INTERNAL_HEADERS = ["_id", "_rev", "modelId", "type"]
|
const INTERNAL_HEADERS = ["_id", "_rev", "modelId", "type"]
|
||||||
|
@ -58,6 +39,8 @@
|
||||||
currentPage * ITEMS_PER_PAGE + ITEMS_PER_PAGE
|
currentPage * ITEMS_PER_PAGE + ITEMS_PER_PAGE
|
||||||
)
|
)
|
||||||
: []
|
: []
|
||||||
|
$: sort = $backendUiStore.sort
|
||||||
|
$: sorted = sort ? fsort(data)[sort.direction](sort.column) : data
|
||||||
|
|
||||||
$: headers = Object.keys($backendUiStore.selectedModel.schema).filter(
|
$: headers = Object.keys($backendUiStore.selectedModel.schema).filter(
|
||||||
id => !INTERNAL_HEADERS.includes(id)
|
id => !INTERNAL_HEADERS.includes(id)
|
||||||
|
@ -85,53 +68,41 @@
|
||||||
<section>
|
<section>
|
||||||
<div class="table-controls">
|
<div class="table-controls">
|
||||||
<h2 class="title">{$backendUiStore.selectedModel.name}</h2>
|
<h2 class="title">{$backendUiStore.selectedModel.name}</h2>
|
||||||
<Button primary on:click={createNewRecord}>
|
<div class="popovers">
|
||||||
<span class="button-inner">Create New Record</span>
|
<ColumnPopover />
|
||||||
</Button>
|
{#if Object.keys($backendUiStore.selectedModel.schema).length > 0}
|
||||||
|
<RowPopover />
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<table class="uk-table">
|
<table class="uk-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Edit</th>
|
<th class="edit-header">
|
||||||
|
<div>Edit</div>
|
||||||
|
</th>
|
||||||
{#each headers as header}
|
{#each headers as header}
|
||||||
<th>{$backendUiStore.selectedModel.schema[header].name}</th>
|
<th>
|
||||||
|
<ColumnHeaderPopover
|
||||||
|
field={$backendUiStore.selectedModel.schema[header]} />
|
||||||
|
</th>
|
||||||
{/each}
|
{/each}
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{#if paginatedData.length === 0}
|
{#if sorted.length === 0}
|
||||||
<div class="no-data">No Data.</div>
|
<div class="no-data">No Data.</div>
|
||||||
{/if}
|
{/if}
|
||||||
{#each paginatedData as row}
|
{#each sorted as row}
|
||||||
<tr class="hoverable">
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<div class="uk-inline">
|
<EditRowPopover {row} />
|
||||||
<i class="ri-more-line" />
|
|
||||||
<div uk-dropdown="mode: click">
|
|
||||||
<ul class="uk-nav uk-dropdown-nav">
|
|
||||||
<li
|
|
||||||
on:click={() => {
|
|
||||||
editRecord(row)
|
|
||||||
}}>
|
|
||||||
<i class="ri-edit-line" />
|
|
||||||
<div class="label">Edit</div>
|
|
||||||
</li>
|
|
||||||
<li
|
|
||||||
on:click={() => {
|
|
||||||
deleteRecord(row)
|
|
||||||
}}>
|
|
||||||
<i class="ri-delete-bin-2-line" />
|
|
||||||
<div class="label">Delete</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</td>
|
</td>
|
||||||
{#each headers as header}
|
{#each headers as header}
|
||||||
<td>
|
<td>
|
||||||
{#if schema[header].type === 'link'}
|
{#if schema[header].type === 'link'}
|
||||||
<LinkedRecord field={schema[header]} ids={row[header]} />
|
<LinkedRecord field={schema[header]} ids={row[header]} />
|
||||||
{:else}{row[header]}{/if}
|
{:else}{row[header] || ''}{/if}
|
||||||
</td>
|
</td>
|
||||||
{/each}
|
{/each}
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -164,7 +135,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
thead {
|
thead {
|
||||||
background: var(--blue-light);
|
height: 40px;
|
||||||
|
background: var(--grey-3);
|
||||||
border: 1px solid var(--grey-4);
|
border: 1px solid var(--grey-4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,6 +146,31 @@
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
text-rendering: optimizeLegibility;
|
text-rendering: optimizeLegibility;
|
||||||
|
transition: 0.5s all;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.edit-header {
|
||||||
|
width: 100px;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.edit-header:hover {
|
||||||
|
color: var(--ink);
|
||||||
|
}
|
||||||
|
|
||||||
|
th:hover {
|
||||||
|
color: var(--blue);
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
max-width: 200px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
border: 1px solid var(--grey-4);
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: pre;
|
||||||
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
tbody tr {
|
tbody tr {
|
||||||
|
@ -188,47 +185,15 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.table-controls {
|
.table-controls {
|
||||||
display: flex;
|
width: 100%;
|
||||||
justify-content: space-between;
|
|
||||||
align-items: baseline;
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.ri-more-line:hover,
|
.popovers {
|
||||||
.uk-dropdown-nav li:hover {
|
display: flex;
|
||||||
cursor: pointer;
|
gap: var(--spacing-m);
|
||||||
}
|
}
|
||||||
|
|
||||||
.no-data {
|
.no-data {
|
||||||
padding: 20px;
|
padding: 14px;
|
||||||
}
|
|
||||||
|
|
||||||
.button-inner {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
li {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
border-radius: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
i {
|
|
||||||
color: var(--grey-7);
|
|
||||||
margin-right: 8px;
|
|
||||||
font-size: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.label {
|
|
||||||
color: var(--grey-7);
|
|
||||||
font-size: 14px;
|
|
||||||
font-family: inter;
|
|
||||||
font-weight: 400;
|
|
||||||
margin: 12px 0px;
|
|
||||||
}
|
|
||||||
.label:hover {
|
|
||||||
color: var(--ink);
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
<script>
|
|
||||||
import { store } from "builderStore"
|
|
||||||
import Modal from "components/common/Modal.svelte"
|
|
||||||
import ActionButton from "components/common/ActionButton.svelte"
|
|
||||||
import * as api from "../api"
|
|
||||||
|
|
||||||
export let onClosed
|
|
||||||
|
|
||||||
let databaseName
|
|
||||||
|
|
||||||
async function createDatabase() {
|
|
||||||
const response = await api.createDatabase($store.appId, databaseName)
|
|
||||||
store.createDatabaseForApp(response)
|
|
||||||
onClosed()
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<section>
|
|
||||||
Database Name
|
|
||||||
<input class="uk-input" type="text" bind:value={databaseName} />
|
|
||||||
</section>
|
|
||||||
<footer>
|
|
||||||
<ActionButton alert on:click={onClosed}>Cancel</ActionButton>
|
|
||||||
<ActionButton disabled={!databaseName} on:click={createDatabase}>
|
|
||||||
Save
|
|
||||||
</ActionButton>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
section {
|
|
||||||
padding: 30px;
|
|
||||||
}
|
|
||||||
footer {
|
|
||||||
padding: 20px;
|
|
||||||
background: var(--grey-1);
|
|
||||||
border-radius: 0.5rem;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -0,0 +1,146 @@
|
||||||
|
<script>
|
||||||
|
import { onMount } from "svelte"
|
||||||
|
import { Input, TextArea, Button, Select } from "@budibase/bbui"
|
||||||
|
import { store, backendUiStore } from "builderStore"
|
||||||
|
import { FIELDS } from "constants/backend"
|
||||||
|
import { notifier } from "builderStore/store/notifications"
|
||||||
|
import Dropdown from "components/common/Dropdown.svelte"
|
||||||
|
import Textbox from "components/common/Textbox.svelte"
|
||||||
|
import ButtonGroup from "components/common/ButtonGroup.svelte"
|
||||||
|
import NumberBox from "components/common/NumberBox.svelte"
|
||||||
|
import ValuesList from "components/common/ValuesList.svelte"
|
||||||
|
import ErrorsBox from "components/common/ErrorsBox.svelte"
|
||||||
|
import Checkbox from "components/common/Checkbox.svelte"
|
||||||
|
import ActionButton from "components/common/ActionButton.svelte"
|
||||||
|
import DatePicker from "components/common/DatePicker.svelte"
|
||||||
|
import LinkedRecordSelector from "components/common/LinkedRecordSelector.svelte"
|
||||||
|
import * as api from "../api"
|
||||||
|
|
||||||
|
export let onClosed
|
||||||
|
export let field = {}
|
||||||
|
|
||||||
|
let originalName = field.name
|
||||||
|
|
||||||
|
$: required =
|
||||||
|
field.constraints &&
|
||||||
|
field.constraints.presence &&
|
||||||
|
!field.constraints.presence.allowEmpty
|
||||||
|
$: if (field.type) {
|
||||||
|
field.constraints = FIELDS[field.type.toUpperCase()].constraints
|
||||||
|
}
|
||||||
|
|
||||||
|
async function saveColumn() {
|
||||||
|
backendUiStore.update(state => {
|
||||||
|
backendUiStore.actions.models.saveField({
|
||||||
|
originalName,
|
||||||
|
field,
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
})
|
||||||
|
onClosed()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="actions">
|
||||||
|
<Input placeholder="Name" thin bind:value={field.name} />
|
||||||
|
|
||||||
|
<Select secondary thin bind:value={field.type}>
|
||||||
|
{#each Object.values(FIELDS) as field}
|
||||||
|
<option value={field.type}>{field.name}</option>
|
||||||
|
{/each}
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
<div class="info">
|
||||||
|
<div class="field">
|
||||||
|
<label>Required</label>
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
bind:checked={required}
|
||||||
|
on:change={() => (field.constraints.presence.allowEmpty = required)} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{#if field.type === 'string'}
|
||||||
|
<NumberBox
|
||||||
|
label="Max Length"
|
||||||
|
bind:value={field.constraints.length.maximum} />
|
||||||
|
<ValuesList
|
||||||
|
label="Categories"
|
||||||
|
bind:values={field.constraints.inclusion} />
|
||||||
|
{:else if field.type === 'datetime'}
|
||||||
|
<DatePicker
|
||||||
|
label="Min Value"
|
||||||
|
bind:value={field.constraints.datetime.earliest} />
|
||||||
|
<DatePicker
|
||||||
|
label="Max Value"
|
||||||
|
bind:value={field.constraints.datetime.latest} />
|
||||||
|
{:else if field.type === 'number'}
|
||||||
|
<NumberBox
|
||||||
|
label="Min Value"
|
||||||
|
bind:value={field.constraints.numericality.greaterThanOrEqualTo} />
|
||||||
|
<NumberBox
|
||||||
|
label="Max Value"
|
||||||
|
bind:value={field.constraints.numericality.lessThanOrEqualTo} />
|
||||||
|
{:else if field.type === 'link'}
|
||||||
|
<div class="field">
|
||||||
|
<label>Link</label>
|
||||||
|
<select class="budibase__input" bind:value={field.modelId}>
|
||||||
|
<option value={''} />
|
||||||
|
{#each $backendUiStore.models as model}
|
||||||
|
{#if model._id !== $backendUiStore.draftModel._id}
|
||||||
|
<option value={model._id}>{model.name}</option>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<div class="button-margin-3">
|
||||||
|
<Button secondary on:click={onClosed}>Cancel</Button>
|
||||||
|
</div>
|
||||||
|
<div class="button-margin-4">
|
||||||
|
<Button primary on:click={saveColumn}>Save Column</Button>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.actions {
|
||||||
|
padding: var(--spacing-l) var(--spacing-xl);
|
||||||
|
display: grid;
|
||||||
|
grid-gap: var(--spacing-xl);
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
padding: 20px 30px;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr 1fr 1fr;
|
||||||
|
gap: 20px;
|
||||||
|
background: var(--grey-1);
|
||||||
|
border-bottom-left-radius: 0.5rem;
|
||||||
|
border-bottom-left-radius: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: auto 20px 1fr;
|
||||||
|
align-items: center;
|
||||||
|
grid-gap: 5px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-bottom: var(--spacing-l);
|
||||||
|
font-family: var(--font-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-margin-3 {
|
||||||
|
grid-column-start: 3;
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-margin-4 {
|
||||||
|
grid-column-start: 4;
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,165 +0,0 @@
|
||||||
<script>
|
|
||||||
import { tick } from "svelte"
|
|
||||||
import Textbox from "components/common/Textbox.svelte"
|
|
||||||
import Button from "components/common/Button.svelte"
|
|
||||||
import Select from "components/common/Select.svelte"
|
|
||||||
import ActionButton from "components/common/ActionButton.svelte"
|
|
||||||
import getIcon from "components/common/icon"
|
|
||||||
import FieldView from "./FieldView.svelte"
|
|
||||||
import api from "builderStore/api"
|
|
||||||
import { store, backendUiStore } from "builderStore"
|
|
||||||
import { pipe } from "components/common/core"
|
|
||||||
import ErrorsBox from "components/common/ErrorsBox.svelte"
|
|
||||||
|
|
||||||
export let model = { schema: {} }
|
|
||||||
export let onClosed
|
|
||||||
|
|
||||||
let showFieldView = false
|
|
||||||
let fieldToEdit
|
|
||||||
|
|
||||||
$: modelFields = model.schema ? Object.entries(model.schema) : []
|
|
||||||
|
|
||||||
function editField() {}
|
|
||||||
|
|
||||||
function deleteField() {}
|
|
||||||
|
|
||||||
function onFinishedFieldEdit() {}
|
|
||||||
|
|
||||||
async function saveModel() {
|
|
||||||
const SAVE_MODEL_URL = `/api/models`
|
|
||||||
const response = await api.post(SAVE_MODEL_URL, model)
|
|
||||||
const newModel = await response.json()
|
|
||||||
backendUiStore.actions.models.create(newModel)
|
|
||||||
onClosed()
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div class="heading">
|
|
||||||
{#if !showFieldView}
|
|
||||||
<i class="ri-list-settings-line button--toggled" />
|
|
||||||
<h3 class="budibase__title--3">Create / Edit Table</h3>
|
|
||||||
{:else}
|
|
||||||
<i class="ri-file-list-line button--toggled" />
|
|
||||||
<h3 class="budibase__title--3">Create / Edit Field</h3>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
{#if !showFieldView}
|
|
||||||
<div class="padding">
|
|
||||||
{#if $store.errors && $store.errors.length > 0}
|
|
||||||
<ErrorsBox errors={$store.errors} />
|
|
||||||
{/if}
|
|
||||||
<div class="textbox">
|
|
||||||
<Textbox label="Name" bind:text={model.name} />
|
|
||||||
</div>
|
|
||||||
<div class="table-controls">
|
|
||||||
<span class="label">Fields</span>
|
|
||||||
<div
|
|
||||||
data-cy="add-new-model-field"
|
|
||||||
class="hoverable new-field"
|
|
||||||
on:click={() => (showFieldView = true)}>
|
|
||||||
Add new field
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<table class="uk-table fields-table budibase__table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Edit</th>
|
|
||||||
<th>Name</th>
|
|
||||||
<th>Type</th>
|
|
||||||
<th />
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{#each modelFields as [key, meta]}
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<i class="ri-more-line" on:click={() => editField(meta)} />
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<div>{key}</div>
|
|
||||||
</td>
|
|
||||||
<td>{meta.type}</td>
|
|
||||||
<td>
|
|
||||||
<i
|
|
||||||
class="ri-delete-bin-6-line hoverable"
|
|
||||||
on:click={() => deleteField(meta)} />
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{/each}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<footer>
|
|
||||||
<ActionButton color="secondary" on:click={saveModel}>Save</ActionButton>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
{:else}
|
|
||||||
<FieldView
|
|
||||||
field={fieldToEdit}
|
|
||||||
onFinished={onFinishedFieldEdit}
|
|
||||||
schema={model.schema}
|
|
||||||
goBack={() => (showFieldView = false)} />
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.padding {
|
|
||||||
padding-top: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.label {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.textbox {
|
|
||||||
margin: 0px 40px 0px 40px;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.new-field {
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: var(--blue);
|
|
||||||
}
|
|
||||||
|
|
||||||
.fields-table {
|
|
||||||
margin: 8px 40px 0px 40px;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 88%;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbody > tr:hover {
|
|
||||||
background-color: var(--grey-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.table-controls {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
margin: 0px 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ri-more-line:hover {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.heading {
|
|
||||||
padding: 40px 40px 0 40px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
margin: 0 0 0 10px;
|
|
||||||
color: var(--ink);
|
|
||||||
}
|
|
||||||
|
|
||||||
footer {
|
|
||||||
background-color: var(--grey-1);
|
|
||||||
margin-top: 40px;
|
|
||||||
padding: 20px 40px 20px 40px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-end;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -20,10 +20,6 @@
|
||||||
? Object.entries($backendUiStore.selectedModel.schema)
|
? Object.entries($backendUiStore.selectedModel.schema)
|
||||||
: []
|
: []
|
||||||
|
|
||||||
function closed() {
|
|
||||||
onClosed()
|
|
||||||
}
|
|
||||||
|
|
||||||
const isSelect = meta =>
|
const isSelect = meta =>
|
||||||
meta.type === "string" &&
|
meta.type === "string" &&
|
||||||
meta.constraints &&
|
meta.constraints &&
|
||||||
|
@ -68,10 +64,6 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<header>
|
|
||||||
<i class="ri-file-user-fill" />
|
|
||||||
<h4>Create / Edit Record</h4>
|
|
||||||
</header>
|
|
||||||
<ErrorsBox {errors} />
|
<ErrorsBox {errors} />
|
||||||
<form on:submit|preventDefault class="uk-form-stacked">
|
<form on:submit|preventDefault class="uk-form-stacked">
|
||||||
{#each modelSchema as [key, meta]}
|
{#each modelSchema as [key, meta]}
|
||||||
|
@ -97,42 +89,13 @@
|
||||||
<Button secondary on:click={onClosed}>Cancel</Button>
|
<Button secondary on:click={onClosed}>Cancel</Button>
|
||||||
</div>
|
</div>
|
||||||
<div class="button-margin-4">
|
<div class="button-margin-4">
|
||||||
<Button blue on:click={saveRecord}>Save</Button>
|
<Button primary on:click={saveRecord}>Save</Button>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
header {
|
|
||||||
margin-bottom: 40px;
|
|
||||||
display: grid;
|
|
||||||
grid-gap: 20px;
|
|
||||||
grid-template-columns: 40px 1fr;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
i {
|
|
||||||
height: 40px;
|
|
||||||
width: 40px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
background: var(--blue-light);
|
|
||||||
color: var(--grey-7);
|
|
||||||
font-size: 20px;
|
|
||||||
border-radius: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: sans-serif;
|
|
||||||
color: var(--ink);
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.actions {
|
.actions {
|
||||||
padding: 30px;
|
padding: var(--spacing-l) var(--spacing-xl);
|
||||||
}
|
}
|
||||||
|
|
||||||
footer {
|
footer {
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
<script>
|
||||||
|
import ActionButton from "components/common/ActionButton.svelte"
|
||||||
|
import { notifier } from "builderStore/store/notifications"
|
||||||
|
import { store, backendUiStore } from "builderStore"
|
||||||
|
import * as api from "../api"
|
||||||
|
|
||||||
|
export let table
|
||||||
|
export let onClosed
|
||||||
|
|
||||||
|
function deleteTable() {
|
||||||
|
backendUiStore.actions.models.delete(table)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<div class="content">
|
||||||
|
<heading>
|
||||||
|
<i class="ri-information-line alert" />
|
||||||
|
<h4 class="budibase__title--4">Delete Table</h4>
|
||||||
|
</heading>
|
||||||
|
<p>
|
||||||
|
Are you sure you want to delete this table? All of your data will be
|
||||||
|
permanently removed. This action cannot be undone.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-actions">
|
||||||
|
<ActionButton on:click={onClosed}>Cancel</ActionButton>
|
||||||
|
<ActionButton
|
||||||
|
alert
|
||||||
|
on:click={async () => {
|
||||||
|
await backendUiStore.actions.models.delete(table)
|
||||||
|
notifier.danger('Table deleted')
|
||||||
|
onClosed()
|
||||||
|
}}>
|
||||||
|
Delete
|
||||||
|
</ActionButton>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.alert {
|
||||||
|
color: rgba(255, 0, 31, 1);
|
||||||
|
background: var(--grey-1);
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-actions {
|
||||||
|
padding: 10px;
|
||||||
|
background: var(--grey-1);
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
heading {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.content {
|
||||||
|
padding: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
margin: 0 0 0 10px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,18 +1,13 @@
|
||||||
<script>
|
<script>
|
||||||
|
import { Input, Select } from "@budibase/bbui"
|
||||||
|
|
||||||
export let type = "text"
|
export let type = "text"
|
||||||
export let value = ""
|
export let value = ""
|
||||||
export let label
|
export let label
|
||||||
export let errors = []
|
|
||||||
export let options = []
|
export let options = []
|
||||||
|
|
||||||
let checked = type === "checkbox" ? value : false
|
let checked = type === "checkbox" ? value : false
|
||||||
|
|
||||||
const determineClassName = type => {
|
|
||||||
if (type === "checkbox") return "uk-checkbox"
|
|
||||||
if (type === "select") return "uk-select"
|
|
||||||
return "uk-input"
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleInput = event => {
|
const handleInput = event => {
|
||||||
if (event.target.type === "checkbox") {
|
if (event.target.type === "checkbox") {
|
||||||
value = event.target.checked
|
value = event.target.checked
|
||||||
|
@ -28,24 +23,21 @@
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<label>{label}</label>
|
|
||||||
|
|
||||||
{#if type === 'select'}
|
{#if type === 'select'}
|
||||||
<select
|
<Select thin secondary data-cy="{label}-select" bind:value>
|
||||||
data-cy="{label}-select"
|
|
||||||
class={determineClassName(type)}
|
|
||||||
bind:value
|
|
||||||
class:uk-form-danger={errors.length > 0}>
|
|
||||||
<option />
|
<option />
|
||||||
{#each options as opt}
|
{#each options as opt}
|
||||||
<option value={opt}>{opt}</option>
|
<option value={opt}>{opt}</option>
|
||||||
{/each}
|
{/each}
|
||||||
</select>
|
</Select>
|
||||||
{:else}
|
{:else}
|
||||||
<input
|
{#if type === 'checkbox'}
|
||||||
|
<label>{label}</label>
|
||||||
|
{/if}
|
||||||
|
<Input
|
||||||
|
thin
|
||||||
|
placeholder={label}
|
||||||
data-cy="{label}-input"
|
data-cy="{label}-input"
|
||||||
class={determineClassName(type)}
|
|
||||||
class:uk-form-danger={errors.length > 0}
|
|
||||||
{checked}
|
{checked}
|
||||||
{type}
|
{type}
|
||||||
{value}
|
{value}
|
||||||
|
@ -55,13 +47,9 @@
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
label {
|
label {
|
||||||
display: block;
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
margin-bottom: 12px;
|
font-size: var(--font-size-s);
|
||||||
}
|
float: left;
|
||||||
|
margin-right: 8px;
|
||||||
input {
|
|
||||||
color: var(--dark-grey);
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
export { default as DeleteRecordModal } from "./DeleteRecord.svelte"
|
export { default as DeleteRecordModal } from "./DeleteRecord.svelte"
|
||||||
export { default as CreateEditRecordModal } from "./CreateEditRecord.svelte"
|
export { default as CreateEditRecordModal } from "./CreateEditRecord.svelte"
|
||||||
export { default as CreateEditViewModal } from "./CreateEditView.svelte"
|
export { default as CreateEditViewModal } from "./CreateEditView.svelte"
|
||||||
export { default as CreateDatabaseModal } from "./CreateDatabase.svelte"
|
|
||||||
export { default as CreateUserModal } from "./CreateUser.svelte"
|
export { default as CreateUserModal } from "./CreateUser.svelte"
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
<script>
|
||||||
|
import { backendUiStore } from "builderStore"
|
||||||
|
import { DropdownMenu, Button, Icon, Input, Select } from "@budibase/bbui"
|
||||||
|
import { FIELDS } from "constants/backend"
|
||||||
|
import { ModelSetupNav } from "components/nav/ModelSetupNav"
|
||||||
|
import ModelFieldEditor from "components/nav/ModelSetupNav/ModelFieldEditor.svelte"
|
||||||
|
import CreateEditColumn from "../modals/CreateEditColumn.svelte"
|
||||||
|
|
||||||
|
let anchor
|
||||||
|
let dropdown
|
||||||
|
let fieldName
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div bind:this={anchor}>
|
||||||
|
<Button text small on:click={dropdown.show}>
|
||||||
|
<Icon name="addcolumn" />
|
||||||
|
Create New Column
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<DropdownMenu bind:this={dropdown} {anchor} align="left">
|
||||||
|
<h5>Create Column</h5>
|
||||||
|
<CreateEditColumn onClosed={dropdown.hide} />
|
||||||
|
</DropdownMenu>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
h5 {
|
||||||
|
padding: var(--spacing-xl) 0 0 var(--spacing-xl);
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,107 @@
|
||||||
|
<script>
|
||||||
|
import { backendUiStore } from "builderStore"
|
||||||
|
import { DropdownMenu, Button, Icon, Input, Select } from "@budibase/bbui"
|
||||||
|
import { FIELDS } from "constants/backend"
|
||||||
|
import { ModelSetupNav } from "components/nav/ModelSetupNav"
|
||||||
|
import ModelFieldEditor from "components/nav/ModelSetupNav/ModelFieldEditor.svelte"
|
||||||
|
import CreateEditColumn from "../modals/CreateEditColumn.svelte"
|
||||||
|
|
||||||
|
export let field
|
||||||
|
|
||||||
|
let anchor
|
||||||
|
let dropdown
|
||||||
|
|
||||||
|
let editing
|
||||||
|
|
||||||
|
$: sortColumn = $backendUiStore.sort && $backendUiStore.sort.column
|
||||||
|
$: sortDirection = $backendUiStore.sort && $backendUiStore.sort.direction
|
||||||
|
|
||||||
|
function showEditor() {
|
||||||
|
editing = true
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideEditor() {
|
||||||
|
dropdown.hide()
|
||||||
|
editing = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteField() {
|
||||||
|
backendUiStore.actions.models.deleteField(field)
|
||||||
|
}
|
||||||
|
|
||||||
|
function sort(direction, column) {
|
||||||
|
backendUiStore.update(state => {
|
||||||
|
state.sort = { direction, column }
|
||||||
|
return state
|
||||||
|
})
|
||||||
|
hideEditor()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div bind:this={anchor} on:click={dropdown.show}>
|
||||||
|
{field.name}
|
||||||
|
<Icon name="arrowdown" />
|
||||||
|
</div>
|
||||||
|
<DropdownMenu bind:this={dropdown} {anchor} align="left">
|
||||||
|
{#if editing}
|
||||||
|
<h5>Edit Column</h5>
|
||||||
|
<CreateEditColumn onClosed={hideEditor} {field} />
|
||||||
|
{:else}
|
||||||
|
<ul>
|
||||||
|
<li data-cy="edit-column-header" on:click={showEditor}>
|
||||||
|
<Icon name="edit" />
|
||||||
|
Edit
|
||||||
|
</li>
|
||||||
|
<li data-cy="delete-column-header" on:click={deleteField}>
|
||||||
|
<Icon name="delete" />
|
||||||
|
Delete
|
||||||
|
</li>
|
||||||
|
{#if sortDirection === 'desc' || sortColumn !== field.name}
|
||||||
|
<li on:click={() => sort('asc', field.name)}>
|
||||||
|
<Icon name="sortascending" />
|
||||||
|
Sort A - Z
|
||||||
|
</li>
|
||||||
|
{/if}
|
||||||
|
{#if sortDirection === 'asc' || sortColumn !== field.name}
|
||||||
|
<li on:click={() => sort('desc', field.name)}>
|
||||||
|
<Icon name="sortdescending" />
|
||||||
|
Sort Z - A
|
||||||
|
</li>
|
||||||
|
{/if}
|
||||||
|
</ul>
|
||||||
|
{/if}
|
||||||
|
</DropdownMenu>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
h5 {
|
||||||
|
padding: var(--spacing-xl) 0 0 var(--spacing-xl);
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: var(--spacing-s) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: flex;
|
||||||
|
font-family: var(--font-sans);
|
||||||
|
font-size: var(--font-size-xs);
|
||||||
|
color: var(--ink);
|
||||||
|
padding: var(--spacing-s) var(--spacing-m);
|
||||||
|
margin: auto 0px;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
li:hover {
|
||||||
|
background-color: var(--grey-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
li:active {
|
||||||
|
color: var(--blue);
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,97 @@
|
||||||
|
<script>
|
||||||
|
import { getContext } from "svelte"
|
||||||
|
import { backendUiStore } from "builderStore"
|
||||||
|
import { DropdownMenu, Button, Icon, Input, Select } from "@budibase/bbui"
|
||||||
|
import { FIELDS } from "constants/backend"
|
||||||
|
import CreateEditRecord from "../modals/CreateEditRecord.svelte"
|
||||||
|
import DeleteRecordModal from "../modals/DeleteRecord.svelte"
|
||||||
|
|
||||||
|
const { open, close } = getContext("simple-modal")
|
||||||
|
|
||||||
|
export let row
|
||||||
|
|
||||||
|
let anchor
|
||||||
|
let dropdown
|
||||||
|
|
||||||
|
let editing
|
||||||
|
|
||||||
|
function showEditor() {
|
||||||
|
editing = true
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideEditor() {
|
||||||
|
dropdown.hide()
|
||||||
|
editing = false
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteRow = () => {
|
||||||
|
open(
|
||||||
|
DeleteRecordModal,
|
||||||
|
{
|
||||||
|
onClosed: hideEditor,
|
||||||
|
record: row,
|
||||||
|
},
|
||||||
|
{ styleContent: { padding: "0" } }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div bind:this={anchor} on:click={dropdown.show}>
|
||||||
|
<i class="ri-more-line" />
|
||||||
|
</div>
|
||||||
|
<DropdownMenu bind:this={dropdown} {anchor} align="left">
|
||||||
|
{#if editing}
|
||||||
|
<h5>Edit Row</h5>
|
||||||
|
<CreateEditRecord onClosed={hideEditor} record={row} />
|
||||||
|
{:else}
|
||||||
|
<ul>
|
||||||
|
<li data-cy="edit-row" on:click={showEditor}>
|
||||||
|
<Icon name="edit" />
|
||||||
|
Edit
|
||||||
|
</li>
|
||||||
|
<li data-cy="delete-row" on:click={deleteRow}>
|
||||||
|
<Icon name="delete" />
|
||||||
|
Delete
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
{/if}
|
||||||
|
</DropdownMenu>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.ri-more-line:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
padding: var(--spacing-xl) 0 0 var(--spacing-xl);
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: var(--spacing-s) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: flex;
|
||||||
|
font-family: var(--font-sans);
|
||||||
|
font-size: var(--font-size-xs);
|
||||||
|
color: var(--ink);
|
||||||
|
padding: var(--spacing-s) var(--spacing-m);
|
||||||
|
margin: auto 0px;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
li:hover {
|
||||||
|
background-color: var(--grey-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
li:active {
|
||||||
|
color: var(--blue);
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,26 @@
|
||||||
|
<script>
|
||||||
|
import { DropdownMenu, Button, Icon } from "@budibase/bbui"
|
||||||
|
import CreateEditRecord from "../modals/CreateEditRecord.svelte"
|
||||||
|
|
||||||
|
let anchor
|
||||||
|
let dropdown
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div bind:this={anchor}>
|
||||||
|
<Button text small on:click={dropdown.show}>
|
||||||
|
<Icon name="addrow" />
|
||||||
|
Create New Row
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<DropdownMenu bind:this={dropdown} {anchor} align="left">
|
||||||
|
<h5>Add New Row</h5>
|
||||||
|
<CreateEditRecord onClosed={dropdown.hide} />
|
||||||
|
</DropdownMenu>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
h5 {
|
||||||
|
padding: var(--spacing-xl) 0 0 var(--spacing-xl);
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,91 +0,0 @@
|
||||||
<script>
|
|
||||||
import * as blockDefinitions from "constants/backend"
|
|
||||||
import { backendUiStore } from "builderStore"
|
|
||||||
import Block from "components/common/Block.svelte"
|
|
||||||
|
|
||||||
const HEADINGS = [
|
|
||||||
{
|
|
||||||
title: "Fields",
|
|
||||||
key: "FIELDS",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Blocks",
|
|
||||||
key: "BLOCKS",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
let selectedTab = "FIELDS"
|
|
||||||
|
|
||||||
function addField(blockDefinition) {
|
|
||||||
backendUiStore.actions.models.addField(blockDefinition)
|
|
||||||
backendUiStore.actions.models.fetch()
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<section>
|
|
||||||
<header>
|
|
||||||
{#each HEADINGS as tab}
|
|
||||||
<span
|
|
||||||
class:selected={selectedTab === tab.key}
|
|
||||||
on:click={() => (selectedTab = tab.key)}>
|
|
||||||
{tab.title}
|
|
||||||
</span>
|
|
||||||
{/each}
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div class="block-grid">
|
|
||||||
{#each Object.values(blockDefinitions[selectedTab]) as blockDefinition}
|
|
||||||
<Block
|
|
||||||
on:click={() => addField(blockDefinition)}
|
|
||||||
title={blockDefinition.name}
|
|
||||||
icon={blockDefinition.icon} />
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
header {
|
|
||||||
margin-top: 20px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(3, 1fr);
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
cursor: pointer;
|
|
||||||
display: grid;
|
|
||||||
justify-content: center;
|
|
||||||
align-content: center;
|
|
||||||
padding: 0px 16px;
|
|
||||||
height: 36px;
|
|
||||||
text-align: center;
|
|
||||||
background: #ffffff;
|
|
||||||
color: var(--grey-7);
|
|
||||||
border-radius: 5px;
|
|
||||||
font-family: inter;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 400;
|
|
||||||
transition: all 0.3s;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
border: none !important;
|
|
||||||
transition: 0.2s;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
span:hover {
|
|
||||||
color: var(--ink);
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected {
|
|
||||||
background: var(--grey-3);
|
|
||||||
color: var(--ink);
|
|
||||||
}
|
|
||||||
|
|
||||||
.block-grid {
|
|
||||||
margin-top: 20px;
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 1fr 1fr;
|
|
||||||
grid-gap: 20px;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
<script>
|
||||||
|
import { goto } from "@sveltech/routify"
|
||||||
|
import { backendUiStore } from "builderStore"
|
||||||
|
import { notifier } from "builderStore/store/notifications"
|
||||||
|
import { DropdownMenu, Button, Icon, Input, Select } from "@budibase/bbui"
|
||||||
|
|
||||||
|
export let table
|
||||||
|
|
||||||
|
let anchor
|
||||||
|
let dropdown
|
||||||
|
let name
|
||||||
|
|
||||||
|
async function saveTable() {
|
||||||
|
const model = await backendUiStore.actions.models.save({
|
||||||
|
name,
|
||||||
|
schema: {},
|
||||||
|
})
|
||||||
|
notifier.success(`Table ${name} created successfully.`)
|
||||||
|
$goto(`./model/${model._id}`)
|
||||||
|
dropdown.hide()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div bind:this={anchor}>
|
||||||
|
<Button primary wide on:click={dropdown.show}>Create New Table</Button>
|
||||||
|
</div>
|
||||||
|
<DropdownMenu bind:this={dropdown} {anchor} align="left">
|
||||||
|
<div class="container">
|
||||||
|
<h5>Create Table</h5>
|
||||||
|
<Input
|
||||||
|
data-cy="table-name-input"
|
||||||
|
placeholder="Table Name"
|
||||||
|
thin
|
||||||
|
bind:value={name} />
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<div class="button-margin-3">
|
||||||
|
<Button secondary on:click={dropdown.hide}>Cancel</Button>
|
||||||
|
</div>
|
||||||
|
<div class="button-margin-4">
|
||||||
|
<Button primary on:click={saveTable}>Save</Button>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</DropdownMenu>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
h5 {
|
||||||
|
margin-bottom: var(--spacing-l);
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
padding: var(--spacing-l);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
padding: 20px;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr 1fr 1fr;
|
||||||
|
gap: 20px;
|
||||||
|
background: var(--grey-1);
|
||||||
|
border-bottom-left-radius: 0.5rem;
|
||||||
|
border-bottom-left-radius: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-margin-3 {
|
||||||
|
grid-column-start: 3;
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-margin-4 {
|
||||||
|
grid-column-start: 4;
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,137 @@
|
||||||
|
<script>
|
||||||
|
import { getContext } from "svelte"
|
||||||
|
import { backendUiStore } from "builderStore"
|
||||||
|
import { DropdownMenu, Button, Icon, Input, Select } from "@budibase/bbui"
|
||||||
|
import { FIELDS } from "constants/backend"
|
||||||
|
import DeleteTableModal from "components/database/ModelDataTable/modals/DeleteTable.svelte"
|
||||||
|
|
||||||
|
const { open, close } = getContext("simple-modal")
|
||||||
|
|
||||||
|
export let table
|
||||||
|
|
||||||
|
let anchor
|
||||||
|
let dropdown
|
||||||
|
|
||||||
|
let editing
|
||||||
|
|
||||||
|
function showEditor() {
|
||||||
|
editing = true
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideEditor() {
|
||||||
|
dropdown.hide()
|
||||||
|
editing = false
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteTable = () => {
|
||||||
|
open(
|
||||||
|
DeleteTableModal,
|
||||||
|
{
|
||||||
|
onClosed: close,
|
||||||
|
table,
|
||||||
|
},
|
||||||
|
{ styleContent: { padding: "0" } }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function save() {
|
||||||
|
backendUiStore.actions.models.save(table)
|
||||||
|
hideEditor()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div bind:this={anchor} on:click={dropdown.show}>
|
||||||
|
<i class="ri-more-line" />
|
||||||
|
</div>
|
||||||
|
<DropdownMenu bind:this={dropdown} {anchor} align="left">
|
||||||
|
{#if editing}
|
||||||
|
<h5>Edit Table</h5>
|
||||||
|
<div class="container">
|
||||||
|
<Input placeholder="Table Name" thin bind:value={table.name} />
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<div class="button-margin-3">
|
||||||
|
<Button secondary on:click={hideEditor}>Cancel</Button>
|
||||||
|
</div>
|
||||||
|
<div class="button-margin-4">
|
||||||
|
<Button primary on:click={save}>Save</Button>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
{:else}
|
||||||
|
<ul>
|
||||||
|
<li on:click={showEditor}>
|
||||||
|
<Icon name="edit" />
|
||||||
|
Edit
|
||||||
|
</li>
|
||||||
|
<li data-cy="delete-table" on:click={deleteTable}>
|
||||||
|
<Icon name="delete" />
|
||||||
|
Delete
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
{/if}
|
||||||
|
</DropdownMenu>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
h5 {
|
||||||
|
padding: var(--spacing-xl) 0 0 var(--spacing-xl);
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
padding: var(--spacing-xl);
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
padding: var(--spacing-xl) 0 0 var(--spacing-xl);
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: var(--spacing-s) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: flex;
|
||||||
|
font-family: var(--font-sans);
|
||||||
|
font-size: var(--font-size-xs);
|
||||||
|
color: var(--ink);
|
||||||
|
padding: var(--spacing-s) var(--spacing-m);
|
||||||
|
margin: auto 0px;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
li:hover {
|
||||||
|
background-color: var(--grey-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
li:active {
|
||||||
|
color: var(--blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
padding: 20px;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr 1fr 1fr;
|
||||||
|
gap: 20px;
|
||||||
|
background: var(--grey-1);
|
||||||
|
border-bottom-left-radius: 0.5rem;
|
||||||
|
border-bottom-left-radius: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-margin-1 {
|
||||||
|
grid-column-start: 1;
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-margin-3 {
|
||||||
|
grid-column-start: 3;
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-margin-4 {
|
||||||
|
grid-column-start: 4;
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,107 +0,0 @@
|
||||||
<script>
|
|
||||||
import { backendUiStore } from "builderStore"
|
|
||||||
import { uuid } from "builderStore/uuid"
|
|
||||||
import { fade } from "svelte/transition"
|
|
||||||
import { notifier } from "builderStore/store/notifications"
|
|
||||||
import { FIELDS, BLOCKS, MODELS } from "constants/backend"
|
|
||||||
import Block from "components/common/Block.svelte"
|
|
||||||
|
|
||||||
function addNewField(field) {
|
|
||||||
backendUiStore.actions.models.addField(field)
|
|
||||||
}
|
|
||||||
|
|
||||||
function createModel(model) {
|
|
||||||
const { schema, ...rest } = $backendUiStore.selectedModel
|
|
||||||
|
|
||||||
backendUiStore.actions.models.save({
|
|
||||||
model: {
|
|
||||||
...model,
|
|
||||||
...rest,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
notifier.success(`${model.name} table created.`)
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<section transition:fade>
|
|
||||||
<header>
|
|
||||||
<h2>Create New Table</h2>
|
|
||||||
<p>Before you can view your table, you need to set it up.</p>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div class="block-row">
|
|
||||||
<span class="block-row-title">Fields</span>
|
|
||||||
<p>Blocks are pre-made fields and help you build your table quicker.</p>
|
|
||||||
<div class="blocks">
|
|
||||||
{#each Object.values(FIELDS) as field}
|
|
||||||
<Block
|
|
||||||
primary
|
|
||||||
title={field.name}
|
|
||||||
icon={field.icon}
|
|
||||||
on:click={() => addNewField(field)} />
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="block-row">
|
|
||||||
<span class="block-row-title">Blocks</span>
|
|
||||||
<p>Blocks are pre-made fields and help you build your table quicker.</p>
|
|
||||||
<div class="blocks">
|
|
||||||
{#each Object.values(BLOCKS) as field}
|
|
||||||
<Block
|
|
||||||
secondary
|
|
||||||
title={field.name}
|
|
||||||
icon={field.icon}
|
|
||||||
on:click={() => addNewField(field)} />
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="block-row">
|
|
||||||
<span class="block-row-title">Tables</span>
|
|
||||||
<p>Blocks are pre-made fields and help you build your table quicker.</p>
|
|
||||||
<div class="blocks">
|
|
||||||
{#each Object.values(MODELS) as model}
|
|
||||||
<Block
|
|
||||||
tertiary
|
|
||||||
title={model.name}
|
|
||||||
icon={model.icon}
|
|
||||||
on:click={() => createModel(model)} />
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
section {
|
|
||||||
height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-size: 20px;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.block-row-title {
|
|
||||||
font-weight: 500;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin-top: 8px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.block-row {
|
|
||||||
margin-top: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.block-row .blocks {
|
|
||||||
display: grid;
|
|
||||||
grid-auto-flow: column;
|
|
||||||
grid-auto-columns: 110px;
|
|
||||||
grid-gap: 20px;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -9,6 +9,7 @@
|
||||||
<div class:selected on:click class={className}>
|
<div class:selected on:click class={className}>
|
||||||
<i class:indented class={icon} />
|
<i class:indented class={icon} />
|
||||||
<span>{title}</span>
|
<span>{title}</span>
|
||||||
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
@ -20,7 +21,8 @@
|
||||||
padding: 0 10px 0 10px;
|
padding: 0 10px 0 10px;
|
||||||
height: 36px;
|
height: 36px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
display: flex;
|
display: grid;
|
||||||
|
grid-template-columns: 30px 1fr 20px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
transition: 0.3s background-color;
|
transition: 0.3s background-color;
|
||||||
color: var(--ink);
|
color: var(--ink);
|
||||||
|
|
|
@ -4,23 +4,13 @@
|
||||||
import { Switcher } from "@budibase/bbui"
|
import { Switcher } from "@budibase/bbui"
|
||||||
import { goto } from "@sveltech/routify"
|
import { goto } from "@sveltech/routify"
|
||||||
import { store, backendUiStore } from "builderStore"
|
import { store, backendUiStore } from "builderStore"
|
||||||
import BlockNavigator from "./BlockNavigator.svelte"
|
|
||||||
import ListItem from "./ListItem.svelte"
|
import ListItem from "./ListItem.svelte"
|
||||||
import { Button } from "@budibase/bbui"
|
import { Button } from "@budibase/bbui"
|
||||||
|
import CreateTablePopover from "./CreateTable.svelte"
|
||||||
|
import EditTablePopover from "./EditTable.svelte"
|
||||||
|
|
||||||
const { open, close } = getContext("simple-modal")
|
const { open, close } = getContext("simple-modal")
|
||||||
|
|
||||||
let HEADINGS = [
|
|
||||||
{
|
|
||||||
title: "Navigate",
|
|
||||||
key: "NAVIGATE",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Add",
|
|
||||||
key: "ADD",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
$: selectedTab = $backendUiStore.tabs.NAVIGATION_PANEL
|
$: selectedTab = $backendUiStore.tabs.NAVIGATION_PANEL
|
||||||
|
|
||||||
function selectModel(model, fieldId) {
|
function selectModel(model, fieldId) {
|
||||||
|
@ -33,59 +23,35 @@
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupForNewModel() {
|
|
||||||
backendUiStore.update(state => {
|
|
||||||
state.selectedModel = {}
|
|
||||||
state.draftModel = { schema: {} }
|
|
||||||
state.tabs.SETUP_PANEL = "SETUP"
|
|
||||||
return state
|
|
||||||
})
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="items-root">
|
<div class="items-root">
|
||||||
{#if $backendUiStore.selectedDatabase && $backendUiStore.selectedDatabase._id}
|
{#if $backendUiStore.selectedDatabase && $backendUiStore.selectedDatabase._id}
|
||||||
<div class="hierarchy">
|
<div class="hierarchy">
|
||||||
<div class="components-list-container">
|
<div class="components-list-container">
|
||||||
<Switcher
|
<h4>Tables</h4>
|
||||||
headings={HEADINGS}
|
<CreateTablePopover />
|
||||||
bind:value={$backendUiStore.tabs.NAVIGATION_PANEL}>
|
<div class="hierarchy-items-container">
|
||||||
{#if selectedTab === 'NAVIGATE'}
|
{#each $backendUiStore.models as model}
|
||||||
<Button purple wide on:click={setupForNewModel}>
|
<ListItem
|
||||||
Create New Table
|
selected={!$backendUiStore.selectedField && model._id === $backendUiStore.selectedModel._id}
|
||||||
</Button>
|
title={model.name}
|
||||||
<div class="hierarchy-items-container">
|
icon="ri-table-fill"
|
||||||
{#each $backendUiStore.models as model}
|
on:click={() => selectModel(model)}>
|
||||||
<ListItem
|
<EditTablePopover table={model} />
|
||||||
selected={!$backendUiStore.selectedField && model._id === $backendUiStore.selectedModel._id}
|
</ListItem>
|
||||||
title={model.name}
|
{/each}
|
||||||
icon="ri-table-fill"
|
</div>
|
||||||
on:click={() => selectModel(model)} />
|
|
||||||
{#if model._id === $backendUiStore.selectedModel._id}
|
|
||||||
<div in:slide>
|
|
||||||
{#each Object.keys(model.schema) as fieldName}
|
|
||||||
<ListItem
|
|
||||||
selected={model._id === $backendUiStore.selectedModel._id && fieldName === $backendUiStore.selectedField}
|
|
||||||
indented
|
|
||||||
icon="ri-layout-column-line"
|
|
||||||
title={model.schema[fieldName].name}
|
|
||||||
on:click={() => selectModel(model, fieldName)} />
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
{:else if selectedTab === 'ADD'}
|
|
||||||
<BlockNavigator />
|
|
||||||
{/if}
|
|
||||||
</Switcher>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
h4 {
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
.items-root {
|
.items-root {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
if (field) {
|
if (field) {
|
||||||
const name = model.schema[field].name
|
const name = model.schema[field].name
|
||||||
delete model.schema[field]
|
delete model.schema[field]
|
||||||
backendUiStore.actions.models.save({ model })
|
backendUiStore.actions.models.save(model)
|
||||||
notifier.danger(`Field ${name} deleted.`)
|
notifier.danger(`Field ${name} deleted.`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -81,9 +81,7 @@
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
await backendUiStore.actions.models.save({
|
await backendUiStore.actions.models.save($backendUiStore.draftModel)
|
||||||
model: $backendUiStore.draftModel,
|
|
||||||
})
|
|
||||||
notifier.success(
|
notifier.success(
|
||||||
"Success! Your changes have been saved. Please continue on with your greatness."
|
"Success! Your changes have been saved. Please continue on with your greatness."
|
||||||
)
|
)
|
||||||
|
|
|
@ -94,10 +94,6 @@
|
||||||
margin: 0 0 0 5px;
|
margin: 0 0 0 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
:global(svg) {
|
|
||||||
transition: 0.2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rotate :global(svg) {
|
.rotate :global(svg) {
|
||||||
transform: rotate(-90deg);
|
transform: rotate(-90deg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,10 +81,6 @@
|
||||||
color: var(--grey-7);
|
color: var(--grey-7);
|
||||||
}
|
}
|
||||||
|
|
||||||
:global(svg) {
|
|
||||||
transition: 0.2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rotate :global(svg) {
|
.rotate :global(svg) {
|
||||||
transform: rotate(-90deg);
|
transform: rotate(-90deg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,20 @@ export const layout = [
|
||||||
{ label: "no wrap", value: "noWrap" },
|
{ label: "no wrap", value: "noWrap" },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: "Gap",
|
||||||
|
key: "gap",
|
||||||
|
control: OptionSelect,
|
||||||
|
options: [
|
||||||
|
{ label: "None", value: "0px" },
|
||||||
|
{ label: "4px", value: "4px" },
|
||||||
|
{ label: "8px", value: "8px" },
|
||||||
|
{ label: "16px", value: "16px" },
|
||||||
|
{ label: "20px", value: "20px" },
|
||||||
|
{ label: "32px", value: "32px" },
|
||||||
|
{ label: "64px", value: "64px" },
|
||||||
|
],
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
export const margin = [
|
export const margin = [
|
||||||
|
|
|
@ -311,6 +311,174 @@ export default {
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "Card",
|
||||||
|
description: "Card components",
|
||||||
|
icon: "ri-layout-bottom-line",
|
||||||
|
commonProps: {},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
_component: "@budibase/standard-components/card",
|
||||||
|
name: "Vertical",
|
||||||
|
description:
|
||||||
|
"A basic card component that can contain content and actions.",
|
||||||
|
icon: "ri-layout-column-line",
|
||||||
|
children: [],
|
||||||
|
properties: {
|
||||||
|
design: { ...all },
|
||||||
|
settings: [
|
||||||
|
{
|
||||||
|
label: "Image",
|
||||||
|
key: "imageUrl",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Image",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Heading",
|
||||||
|
key: "heading",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Heading",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Description",
|
||||||
|
key: "description",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Description",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Link Text",
|
||||||
|
key: "linkText",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Link Text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Link Url",
|
||||||
|
key: "linkUrl",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Link URL",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Link Color",
|
||||||
|
key: "color",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Link Color",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Hover Color",
|
||||||
|
key: "linkHoverColor",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Hover Color",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Image Height",
|
||||||
|
key: "imageHeight",
|
||||||
|
control: OptionSelect,
|
||||||
|
options: ["12rem", "16rem", "20rem", "24rem"],
|
||||||
|
placeholder: "Image Height",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Card Width",
|
||||||
|
key: "cardWidth",
|
||||||
|
control: OptionSelect,
|
||||||
|
options: ["16rem", "20rem", "24rem"],
|
||||||
|
placeholder: "Card Width",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
_component: "@budibase/standard-components/cardhorizontal",
|
||||||
|
name: "Horizontal",
|
||||||
|
description:
|
||||||
|
"A basic card component that can contain content and actions.",
|
||||||
|
icon: "ri-layout-row-line",
|
||||||
|
children: [],
|
||||||
|
properties: {
|
||||||
|
design: { ...all },
|
||||||
|
settings: [
|
||||||
|
{
|
||||||
|
label: "Image",
|
||||||
|
key: "imageUrl",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Image",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Heading",
|
||||||
|
key: "heading",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Heading",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Description",
|
||||||
|
key: "description",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Description",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Subtext",
|
||||||
|
key: "subtext",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Subtext",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Link Text",
|
||||||
|
key: "linkText",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Link Text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Link Url",
|
||||||
|
key: "linkUrl",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Link URL",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Link Color",
|
||||||
|
key: "color",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Link Color",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Hover Color",
|
||||||
|
key: "linkHoverColor",
|
||||||
|
control: Input,
|
||||||
|
placeholder: "Hover Color",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Card Width",
|
||||||
|
key: "cardWidth",
|
||||||
|
control: OptionSelect,
|
||||||
|
options: [
|
||||||
|
"24rem",
|
||||||
|
"28rem",
|
||||||
|
"32rem",
|
||||||
|
"40rem",
|
||||||
|
"48rem",
|
||||||
|
"60rem",
|
||||||
|
"100%",
|
||||||
|
],
|
||||||
|
placeholder: "Card Height",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Image Width",
|
||||||
|
key: "imageWidth",
|
||||||
|
control: OptionSelect,
|
||||||
|
options: ["8rem", "12rem", "16rem"],
|
||||||
|
placeholder: "Image Width",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Image Height",
|
||||||
|
key: "imageHeight",
|
||||||
|
control: OptionSelect,
|
||||||
|
options: ["8rem", "12rem", "16rem", "auto"],
|
||||||
|
placeholder: "Image Height",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
_component: "@budibase/materialdesign-components/BasicCard",
|
_component: "@budibase/materialdesign-components/BasicCard",
|
||||||
name: "Card",
|
name: "Card",
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
export const FIELDS = {
|
export const FIELDS = {
|
||||||
PLAIN_TEXT: {
|
STRING: {
|
||||||
name: "Plain Text",
|
name: "Plain Text",
|
||||||
icon: "ri-text",
|
icon: "ri-text",
|
||||||
type: "string",
|
type: "string",
|
||||||
|
@ -65,15 +65,15 @@ export const FIELDS = {
|
||||||
// presence: { allowEmpty: true },
|
// presence: { allowEmpty: true },
|
||||||
// },
|
// },
|
||||||
// },
|
// },
|
||||||
LINKED_FIELDS: {
|
// LINKED_FIELDS: {
|
||||||
name: "Linked Fields",
|
// name: "Linked Fields",
|
||||||
icon: "ri-link",
|
// icon: "ri-link",
|
||||||
type: "link",
|
// type: "link",
|
||||||
modelId: null,
|
// modelId: null,
|
||||||
constraints: {
|
// constraints: {
|
||||||
type: "array",
|
// type: "array",
|
||||||
},
|
// },
|
||||||
},
|
// },
|
||||||
}
|
}
|
||||||
|
|
||||||
export const BLOCKS = {
|
export const BLOCKS = {
|
||||||
|
@ -195,36 +195,3 @@ export const BLOCKS = {
|
||||||
// },
|
// },
|
||||||
// },
|
// },
|
||||||
}
|
}
|
||||||
|
|
||||||
export const MODELS = {
|
|
||||||
CONTACTS: {
|
|
||||||
icon: "ri-contacts-book-line",
|
|
||||||
name: "Contacts",
|
|
||||||
schema: {
|
|
||||||
Name: BLOCKS.NAME,
|
|
||||||
"Phone Number": BLOCKS.PHONE_NUMBER,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
RECIPES: {
|
|
||||||
icon: "ri-link",
|
|
||||||
name: "Recipes",
|
|
||||||
schema: {
|
|
||||||
Name: BLOCKS.NAME,
|
|
||||||
Cuisine: {
|
|
||||||
...FIELDS.PLAIN_TEXT,
|
|
||||||
name: "Cuisine",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
SPORTS_TEAM: {
|
|
||||||
icon: "ri-basketball-line",
|
|
||||||
name: "Sports Team",
|
|
||||||
schema: {
|
|
||||||
Name: BLOCKS.NAME,
|
|
||||||
Championships: {
|
|
||||||
...FIELDS.NUMBER,
|
|
||||||
name: "Championships",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
|
@ -14,16 +14,13 @@
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
<div class="nav">
|
|
||||||
<ModelSetupNav />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.root {
|
.root {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 300px minmax(0, 1fr) 300px;
|
grid-template-columns: 300px minmax(0, 1fr);
|
||||||
background: var(--grey-1);
|
background: var(--grey-1);
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
<script>
|
<script>
|
||||||
import { getContext } from "svelte"
|
import { getContext } from "svelte"
|
||||||
import { Button } from "@budibase/bbui"
|
import { Button } from "@budibase/bbui"
|
||||||
import EmptyModel from "components/nav/ModelNavigator/EmptyModel.svelte"
|
|
||||||
import ModelDataTable from "components/database/ModelDataTable"
|
import ModelDataTable from "components/database/ModelDataTable"
|
||||||
import { backendUiStore } from "builderStore"
|
import { backendUiStore } from "builderStore"
|
||||||
import ActionButton from "components/common/ActionButton.svelte"
|
import ActionButton from "components/common/ActionButton.svelte"
|
||||||
|
@ -11,16 +10,6 @@
|
||||||
const { open, close } = getContext("simple-modal")
|
const { open, close } = getContext("simple-modal")
|
||||||
|
|
||||||
$: selectedModel = $backendUiStore.selectedModel
|
$: selectedModel = $backendUiStore.selectedModel
|
||||||
|
|
||||||
const createNewRecord = () => {
|
|
||||||
open(
|
|
||||||
CreateEditRecordModal,
|
|
||||||
{
|
|
||||||
onClosed: close,
|
|
||||||
},
|
|
||||||
{ styleContent: { padding: "0" } }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if $backendUiStore.selectedDatabase._id && selectedModel.name}
|
{#if $backendUiStore.selectedDatabase._id && selectedModel.name}
|
||||||
|
|
|
@ -782,21 +782,6 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
sirv-cli "^0.4.6"
|
sirv-cli "^0.4.6"
|
||||||
|
|
||||||
"@budibase/client@^0.1.1":
|
|
||||||
version "0.1.17"
|
|
||||||
resolved "https://registry.yarnpkg.com/@budibase/client/-/client-0.1.17.tgz#9ec8848c75711751c9d088361122f181e8eb44e1"
|
|
||||||
integrity sha512-6O9iWHkpIWksUMm+/ysN/Yb8QufF3FE4CfxCEFUVWaeYqyIXZifiqZxeAR380JIqwxjHltSC/23wgCWzhhiMUw==
|
|
||||||
dependencies:
|
|
||||||
"@nx-js/compiler-util" "^2.0.0"
|
|
||||||
bcryptjs "^2.4.3"
|
|
||||||
deep-equal "^2.0.1"
|
|
||||||
lodash "^4.17.15"
|
|
||||||
lunr "^2.3.5"
|
|
||||||
mustache "^4.0.1"
|
|
||||||
regexparam "^1.3.0"
|
|
||||||
shortid "^2.2.8"
|
|
||||||
svelte "^3.9.2"
|
|
||||||
|
|
||||||
"@budibase/colorpicker@^1.0.1":
|
"@budibase/colorpicker@^1.0.1":
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@budibase/colorpicker/-/colorpicker-1.0.1.tgz#940c180e7ebba0cb0756c4c8ef13f5dfab58e810"
|
resolved "https://registry.yarnpkg.com/@budibase/colorpicker/-/colorpicker-1.0.1.tgz#940c180e7ebba0cb0756c4c8ef13f5dfab58e810"
|
||||||
|
@ -1578,11 +1563,6 @@ array-equal@^1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
|
resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
|
||||||
integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
|
integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
|
||||||
|
|
||||||
array-filter@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83"
|
|
||||||
integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=
|
|
||||||
|
|
||||||
array-union@^2.1.0:
|
array-union@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
|
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
|
||||||
|
@ -1669,13 +1649,6 @@ atob@^2.1.2:
|
||||||
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
|
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
|
||||||
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
|
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
|
||||||
|
|
||||||
available-typed-arrays@^1.0.0, available-typed-arrays@^1.0.2:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5"
|
|
||||||
integrity sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==
|
|
||||||
dependencies:
|
|
||||||
array-filter "^1.0.0"
|
|
||||||
|
|
||||||
aws-sign2@~0.7.0:
|
aws-sign2@~0.7.0:
|
||||||
version "0.7.0"
|
version "0.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
|
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
|
||||||
|
@ -1789,11 +1762,6 @@ bcrypt-pbkdf@^1.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
tweetnacl "^0.14.3"
|
tweetnacl "^0.14.3"
|
||||||
|
|
||||||
bcryptjs@^2.4.3:
|
|
||||||
version "2.4.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
|
|
||||||
integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=
|
|
||||||
|
|
||||||
better-assert@~1.0.0:
|
better-assert@~1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
|
resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
|
||||||
|
@ -2971,26 +2939,6 @@ decode-uri-component@^0.2.0:
|
||||||
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
|
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
|
||||||
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
|
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
|
||||||
|
|
||||||
deep-equal@^2.0.1:
|
|
||||||
version "2.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.3.tgz#cad1c15277ad78a5c01c49c2dee0f54de8a6a7b0"
|
|
||||||
integrity sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==
|
|
||||||
dependencies:
|
|
||||||
es-abstract "^1.17.5"
|
|
||||||
es-get-iterator "^1.1.0"
|
|
||||||
is-arguments "^1.0.4"
|
|
||||||
is-date-object "^1.0.2"
|
|
||||||
is-regex "^1.0.5"
|
|
||||||
isarray "^2.0.5"
|
|
||||||
object-is "^1.1.2"
|
|
||||||
object-keys "^1.1.1"
|
|
||||||
object.assign "^4.1.0"
|
|
||||||
regexp.prototype.flags "^1.3.0"
|
|
||||||
side-channel "^1.0.2"
|
|
||||||
which-boxed-primitive "^1.0.1"
|
|
||||||
which-collection "^1.0.1"
|
|
||||||
which-typed-array "^1.1.2"
|
|
||||||
|
|
||||||
deep-is@~0.1.3:
|
deep-is@~0.1.3:
|
||||||
version "0.1.3"
|
version "0.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
|
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
|
||||||
|
@ -3291,36 +3239,6 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5:
|
||||||
string.prototype.trimleft "^2.1.1"
|
string.prototype.trimleft "^2.1.1"
|
||||||
string.prototype.trimright "^2.1.1"
|
string.prototype.trimright "^2.1.1"
|
||||||
|
|
||||||
es-abstract@^1.17.4:
|
|
||||||
version "1.17.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a"
|
|
||||||
integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==
|
|
||||||
dependencies:
|
|
||||||
es-to-primitive "^1.2.1"
|
|
||||||
function-bind "^1.1.1"
|
|
||||||
has "^1.0.3"
|
|
||||||
has-symbols "^1.0.1"
|
|
||||||
is-callable "^1.2.0"
|
|
||||||
is-regex "^1.1.0"
|
|
||||||
object-inspect "^1.7.0"
|
|
||||||
object-keys "^1.1.1"
|
|
||||||
object.assign "^4.1.0"
|
|
||||||
string.prototype.trimend "^1.0.1"
|
|
||||||
string.prototype.trimstart "^1.0.1"
|
|
||||||
|
|
||||||
es-get-iterator@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8"
|
|
||||||
integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==
|
|
||||||
dependencies:
|
|
||||||
es-abstract "^1.17.4"
|
|
||||||
has-symbols "^1.0.1"
|
|
||||||
is-arguments "^1.0.4"
|
|
||||||
is-map "^2.0.1"
|
|
||||||
is-set "^2.0.1"
|
|
||||||
is-string "^1.0.5"
|
|
||||||
isarray "^2.0.5"
|
|
||||||
|
|
||||||
es-to-primitive@^1.2.1:
|
es-to-primitive@^1.2.1:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
|
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
|
||||||
|
@ -3587,6 +3505,11 @@ fast-levenshtein@~2.0.6:
|
||||||
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
|
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
|
||||||
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
|
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
|
||||||
|
|
||||||
|
fast-sort@^2.2.0:
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/fast-sort/-/fast-sort-2.2.0.tgz#20903763531fbcbb41c9df5ab1bf5f2cefc8476a"
|
||||||
|
integrity sha512-W7zqnn2zsYoQA87FKmYtgOsbJohOrh7XrtZrCVHN5XZKqTBTv5UG+rSS3+iWbg/nepRQUOu+wnas8BwtK8kiCg==
|
||||||
|
|
||||||
fastq@^1.6.0:
|
fastq@^1.6.0:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.7.0.tgz#fcd79a08c5bd7ec5b55cd3f5c4720db551929801"
|
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.7.0.tgz#fcd79a08c5bd7ec5b55cd3f5c4720db551929801"
|
||||||
|
@ -3717,7 +3640,7 @@ for-in@^1.0.2:
|
||||||
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
|
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
|
||||||
integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
|
integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
|
||||||
|
|
||||||
foreach@^2.0.5, foreach@~2.0.1:
|
foreach@~2.0.1:
|
||||||
version "2.0.5"
|
version "2.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
|
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
|
||||||
integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
|
integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
|
||||||
|
@ -3940,6 +3863,11 @@ har-validator@~5.1.3:
|
||||||
ajv "^6.5.5"
|
ajv "^6.5.5"
|
||||||
har-schema "^2.0.0"
|
har-schema "^2.0.0"
|
||||||
|
|
||||||
|
harmony-reflect@^1.4.6:
|
||||||
|
version "1.6.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9"
|
||||||
|
integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==
|
||||||
|
|
||||||
has-ansi@^2.0.0:
|
has-ansi@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
|
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
|
||||||
|
@ -4136,6 +4064,13 @@ idb-wrapper@^1.5.0:
|
||||||
resolved "https://registry.yarnpkg.com/idb-wrapper/-/idb-wrapper-1.7.2.tgz#8251afd5e77fe95568b1c16152eb44b396767ea2"
|
resolved "https://registry.yarnpkg.com/idb-wrapper/-/idb-wrapper-1.7.2.tgz#8251afd5e77fe95568b1c16152eb44b396767ea2"
|
||||||
integrity sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==
|
integrity sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==
|
||||||
|
|
||||||
|
identity-obj-proxy@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14"
|
||||||
|
integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=
|
||||||
|
dependencies:
|
||||||
|
harmony-reflect "^1.4.6"
|
||||||
|
|
||||||
ignore@^5.1.1:
|
ignore@^5.1.1:
|
||||||
version "5.1.4"
|
version "5.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
|
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
|
||||||
|
@ -4236,21 +4171,11 @@ is-accessor-descriptor@^1.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
kind-of "^6.0.0"
|
kind-of "^6.0.0"
|
||||||
|
|
||||||
is-arguments@^1.0.4:
|
|
||||||
version "1.0.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
|
|
||||||
integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==
|
|
||||||
|
|
||||||
is-arrayish@^0.2.1:
|
is-arrayish@^0.2.1:
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
||||||
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
|
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
|
||||||
|
|
||||||
is-bigint@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.0.tgz#73da8c33208d00f130e9b5e15d23eac9215601c4"
|
|
||||||
integrity sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==
|
|
||||||
|
|
||||||
is-binary-path@^1.0.0:
|
is-binary-path@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
|
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
|
||||||
|
@ -4265,11 +4190,6 @@ is-binary-path@~2.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
binary-extensions "^2.0.0"
|
binary-extensions "^2.0.0"
|
||||||
|
|
||||||
is-boolean-object@^1.0.0:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e"
|
|
||||||
integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==
|
|
||||||
|
|
||||||
is-buffer@^1.1.5:
|
is-buffer@^1.1.5:
|
||||||
version "1.1.6"
|
version "1.1.6"
|
||||||
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
|
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
|
||||||
|
@ -4285,11 +4205,6 @@ is-callable@^1.1.4, is-callable@^1.1.5:
|
||||||
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
|
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
|
||||||
integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
|
integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
|
||||||
|
|
||||||
is-callable@^1.2.0:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb"
|
|
||||||
integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==
|
|
||||||
|
|
||||||
is-ci@2.0.0, is-ci@^2.0.0:
|
is-ci@2.0.0, is-ci@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
|
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
|
||||||
|
@ -4311,7 +4226,7 @@ is-data-descriptor@^1.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
kind-of "^6.0.0"
|
kind-of "^6.0.0"
|
||||||
|
|
||||||
is-date-object@^1.0.1, is-date-object@^1.0.2:
|
is-date-object@^1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
|
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
|
||||||
integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
|
integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
|
||||||
|
@ -4390,11 +4305,6 @@ is-installed-globally@0.1.0:
|
||||||
global-dirs "^0.1.0"
|
global-dirs "^0.1.0"
|
||||||
is-path-inside "^1.0.0"
|
is-path-inside "^1.0.0"
|
||||||
|
|
||||||
is-map@^2.0.1:
|
|
||||||
version "2.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1"
|
|
||||||
integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==
|
|
||||||
|
|
||||||
is-module@^1.0.0:
|
is-module@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
|
resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
|
||||||
|
@ -4407,11 +4317,6 @@ is-number-like@^1.0.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
lodash.isfinite "^3.3.2"
|
lodash.isfinite "^3.3.2"
|
||||||
|
|
||||||
is-number-object@^1.0.3:
|
|
||||||
version "1.0.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197"
|
|
||||||
integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==
|
|
||||||
|
|
||||||
is-number@^3.0.0:
|
is-number@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
|
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
|
||||||
|
@ -4481,18 +4386,6 @@ is-regex@^1.0.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
has "^1.0.3"
|
has "^1.0.3"
|
||||||
|
|
||||||
is-regex@^1.1.0:
|
|
||||||
version "1.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9"
|
|
||||||
integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==
|
|
||||||
dependencies:
|
|
||||||
has-symbols "^1.0.1"
|
|
||||||
|
|
||||||
is-set@^2.0.1:
|
|
||||||
version "2.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43"
|
|
||||||
integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==
|
|
||||||
|
|
||||||
is-stream@^1.1.0:
|
is-stream@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||||
|
@ -4503,11 +4396,6 @@ is-stream@^2.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
|
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
|
||||||
integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
|
integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
|
||||||
|
|
||||||
is-string@^1.0.4, is-string@^1.0.5:
|
|
||||||
version "1.0.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
|
|
||||||
integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
|
|
||||||
|
|
||||||
is-symbol@^1.0.2:
|
is-symbol@^1.0.2:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
|
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
|
||||||
|
@ -4515,16 +4403,6 @@ is-symbol@^1.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
has-symbols "^1.0.1"
|
has-symbols "^1.0.1"
|
||||||
|
|
||||||
is-typed-array@^1.1.3:
|
|
||||||
version "1.1.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.3.tgz#a4ff5a5e672e1a55f99c7f54e59597af5c1df04d"
|
|
||||||
integrity sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==
|
|
||||||
dependencies:
|
|
||||||
available-typed-arrays "^1.0.0"
|
|
||||||
es-abstract "^1.17.4"
|
|
||||||
foreach "^2.0.5"
|
|
||||||
has-symbols "^1.0.1"
|
|
||||||
|
|
||||||
is-typedarray@~1.0.0:
|
is-typedarray@~1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
|
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
|
||||||
|
@ -4535,16 +4413,6 @@ is-utf8@^0.2.0:
|
||||||
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
|
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
|
||||||
integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
|
integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
|
||||||
|
|
||||||
is-weakmap@^2.0.1:
|
|
||||||
version "2.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
|
|
||||||
integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
|
|
||||||
|
|
||||||
is-weakset@^2.0.1:
|
|
||||||
version "2.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83"
|
|
||||||
integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==
|
|
||||||
|
|
||||||
is-windows@^1.0.2:
|
is-windows@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
|
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
|
||||||
|
@ -4575,11 +4443,6 @@ isarray@2.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
|
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
|
||||||
integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=
|
integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=
|
||||||
|
|
||||||
isarray@^2.0.5:
|
|
||||||
version "2.0.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
|
|
||||||
integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
|
|
||||||
|
|
||||||
isbuffer@~0.0.0:
|
isbuffer@~0.0.0:
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/isbuffer/-/isbuffer-0.0.0.tgz#38c146d9df528b8bf9b0701c3d43cf12df3fc39b"
|
resolved "https://registry.yarnpkg.com/isbuffer/-/isbuffer-0.0.0.tgz#38c146d9df528b8bf9b0701c3d43cf12df3fc39b"
|
||||||
|
@ -5922,14 +5785,6 @@ object-inspect@^1.7.0:
|
||||||
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
|
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
|
||||||
integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
|
integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
|
||||||
|
|
||||||
object-is@^1.1.2:
|
|
||||||
version "1.1.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6"
|
|
||||||
integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==
|
|
||||||
dependencies:
|
|
||||||
define-properties "^1.1.3"
|
|
||||||
es-abstract "^1.17.5"
|
|
||||||
|
|
||||||
object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
|
object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
|
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
|
||||||
|
@ -6685,19 +6540,6 @@ regex-not@^1.0.0, regex-not@^1.0.2:
|
||||||
extend-shallow "^3.0.2"
|
extend-shallow "^3.0.2"
|
||||||
safe-regex "^1.1.0"
|
safe-regex "^1.1.0"
|
||||||
|
|
||||||
regexp.prototype.flags@^1.3.0:
|
|
||||||
version "1.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75"
|
|
||||||
integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==
|
|
||||||
dependencies:
|
|
||||||
define-properties "^1.1.3"
|
|
||||||
es-abstract "^1.17.0-next.1"
|
|
||||||
|
|
||||||
regexparam@^1.3.0:
|
|
||||||
version "1.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/regexparam/-/regexparam-1.3.0.tgz#2fe42c93e32a40eff6235d635e0ffa344b92965f"
|
|
||||||
integrity sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==
|
|
||||||
|
|
||||||
regexpu-core@^4.7.0:
|
regexpu-core@^4.7.0:
|
||||||
version "4.7.0"
|
version "4.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938"
|
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938"
|
||||||
|
@ -7250,21 +7092,13 @@ shellwords@^0.1.1:
|
||||||
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
|
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
|
||||||
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
|
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
|
||||||
|
|
||||||
shortid@^2.2.15, shortid@^2.2.8:
|
shortid@^2.2.15:
|
||||||
version "2.2.15"
|
version "2.2.15"
|
||||||
resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.15.tgz#2b902eaa93a69b11120373cd42a1f1fe4437c122"
|
resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.15.tgz#2b902eaa93a69b11120373cd42a1f1fe4437c122"
|
||||||
integrity sha512-5EaCy2mx2Jgc/Fdn9uuDuNIIfWBpzY4XIlhoqtXF6qsf+/+SGZ+FxDdX/ZsMZiWupIWNqAEmiNY4RC+LSmCeOw==
|
integrity sha512-5EaCy2mx2Jgc/Fdn9uuDuNIIfWBpzY4XIlhoqtXF6qsf+/+SGZ+FxDdX/ZsMZiWupIWNqAEmiNY4RC+LSmCeOw==
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid "^2.1.0"
|
nanoid "^2.1.0"
|
||||||
|
|
||||||
side-channel@^1.0.2:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947"
|
|
||||||
integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==
|
|
||||||
dependencies:
|
|
||||||
es-abstract "^1.17.0-next.1"
|
|
||||||
object-inspect "^1.7.0"
|
|
||||||
|
|
||||||
signal-exit@^3.0.0, signal-exit@^3.0.2:
|
signal-exit@^3.0.0, signal-exit@^3.0.2:
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
|
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
|
||||||
|
@ -7623,7 +7457,7 @@ string.prototype.padend@^3.0.0:
|
||||||
define-properties "^1.1.3"
|
define-properties "^1.1.3"
|
||||||
es-abstract "^1.17.0-next.1"
|
es-abstract "^1.17.0-next.1"
|
||||||
|
|
||||||
string.prototype.trimend@^1.0.0, string.prototype.trimend@^1.0.1:
|
string.prototype.trimend@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
|
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
|
||||||
integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
|
integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
|
||||||
|
@ -7649,7 +7483,7 @@ string.prototype.trimright@^2.1.1:
|
||||||
es-abstract "^1.17.5"
|
es-abstract "^1.17.5"
|
||||||
string.prototype.trimend "^1.0.0"
|
string.prototype.trimend "^1.0.0"
|
||||||
|
|
||||||
string.prototype.trimstart@^1.0.0, string.prototype.trimstart@^1.0.1:
|
string.prototype.trimstart@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
|
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
|
||||||
integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
|
integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
|
||||||
|
@ -7774,11 +7608,6 @@ svelte@3.23.x:
|
||||||
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.23.0.tgz#bbcd6887cf588c24a975b14467455abfff9acd3f"
|
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.23.0.tgz#bbcd6887cf588c24a975b14467455abfff9acd3f"
|
||||||
integrity sha512-cnyd96bK/Nw5DnYuB1hzm5cl6+I1fpmdKOteA7KLzU9KGLsLmvWsSkSKbcntzODCLmSySN3HjcgTHRo6/rJNTw==
|
integrity sha512-cnyd96bK/Nw5DnYuB1hzm5cl6+I1fpmdKOteA7KLzU9KGLsLmvWsSkSKbcntzODCLmSySN3HjcgTHRo6/rJNTw==
|
||||||
|
|
||||||
svelte@^3.9.2:
|
|
||||||
version "3.24.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.24.1.tgz#aca364937dd1df27fe131e2a4c234acb6061db4b"
|
|
||||||
integrity sha512-OX/IBVUJSFo1rnznXdwf9rv6LReJ3qQ0PwRjj76vfUWyTfbHbR9OXqJBnUrpjyis2dwYcbT2Zm1DFjOOF1ZbbQ==
|
|
||||||
|
|
||||||
symbol-observable@1.0.1:
|
symbol-observable@1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
|
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
|
||||||
|
@ -8222,27 +8051,6 @@ whatwg-url@^8.0.0:
|
||||||
tr46 "^2.0.2"
|
tr46 "^2.0.2"
|
||||||
webidl-conversions "^5.0.0"
|
webidl-conversions "^5.0.0"
|
||||||
|
|
||||||
which-boxed-primitive@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz#cbe8f838ebe91ba2471bb69e9edbda67ab5a5ec1"
|
|
||||||
integrity sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==
|
|
||||||
dependencies:
|
|
||||||
is-bigint "^1.0.0"
|
|
||||||
is-boolean-object "^1.0.0"
|
|
||||||
is-number-object "^1.0.3"
|
|
||||||
is-string "^1.0.4"
|
|
||||||
is-symbol "^1.0.2"
|
|
||||||
|
|
||||||
which-collection@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
|
|
||||||
integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
|
|
||||||
dependencies:
|
|
||||||
is-map "^2.0.1"
|
|
||||||
is-set "^2.0.1"
|
|
||||||
is-weakmap "^2.0.1"
|
|
||||||
is-weakset "^2.0.1"
|
|
||||||
|
|
||||||
which-module@^1.0.0:
|
which-module@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
|
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
|
||||||
|
@ -8253,18 +8061,6 @@ which-module@^2.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
|
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
|
||||||
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
|
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
|
||||||
|
|
||||||
which-typed-array@^1.1.2:
|
|
||||||
version "1.1.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.2.tgz#e5f98e56bda93e3dac196b01d47c1156679c00b2"
|
|
||||||
integrity sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==
|
|
||||||
dependencies:
|
|
||||||
available-typed-arrays "^1.0.2"
|
|
||||||
es-abstract "^1.17.5"
|
|
||||||
foreach "^2.0.5"
|
|
||||||
function-bind "^1.1.1"
|
|
||||||
has-symbols "^1.0.1"
|
|
||||||
is-typed-array "^1.1.3"
|
|
||||||
|
|
||||||
which@^1.2.9, which@^1.3.0:
|
which@^1.2.9, which@^1.3.0:
|
||||||
version "1.3.1"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
|
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
|
||||||
|
|
|
@ -268,6 +268,81 @@
|
||||||
"model": "models"
|
"model": "models"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"card": {
|
||||||
|
"name": "Card",
|
||||||
|
"props": {
|
||||||
|
"imageUrl": "string",
|
||||||
|
"heading": "string",
|
||||||
|
"description": "string",
|
||||||
|
"linkText": "string",
|
||||||
|
"linkUrl": "string",
|
||||||
|
"color": "string",
|
||||||
|
"linkHoverColor": "string",
|
||||||
|
"imageHeight": {
|
||||||
|
"type": "options",
|
||||||
|
"default": "20rem",
|
||||||
|
"options": [
|
||||||
|
"12rem",
|
||||||
|
"16rem",
|
||||||
|
"20rem",
|
||||||
|
"24rem"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"cardWidth": {
|
||||||
|
"type": "options",
|
||||||
|
"default": "20rem",
|
||||||
|
"options": [
|
||||||
|
"16rem",
|
||||||
|
"20rem",
|
||||||
|
"24rem"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cardhorizontal": {
|
||||||
|
"name": "Horizontal Card",
|
||||||
|
"props": {
|
||||||
|
"imageUrl": "string",
|
||||||
|
"heading": "string",
|
||||||
|
"description": "string",
|
||||||
|
"subtext": "string",
|
||||||
|
"linkText": "string",
|
||||||
|
"linkUrl": "string",
|
||||||
|
"color": "string",
|
||||||
|
"linkHoverColor": "string",
|
||||||
|
"imageWidth": {
|
||||||
|
"type": "options",
|
||||||
|
"default": "8rem",
|
||||||
|
"options": [
|
||||||
|
"8rem",
|
||||||
|
"12rem",
|
||||||
|
"16rem"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"cardWidth": {
|
||||||
|
"type": "options",
|
||||||
|
"default": "32rem",
|
||||||
|
"options": [
|
||||||
|
"24rem",
|
||||||
|
"28rem",
|
||||||
|
"32rem",
|
||||||
|
"40rem",
|
||||||
|
"48rem",
|
||||||
|
"60rem",
|
||||||
|
"100%"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"imageHeight": {
|
||||||
|
"type": "options",
|
||||||
|
"default": "8rem",
|
||||||
|
"options": [
|
||||||
|
"8rem",
|
||||||
|
"12rem",
|
||||||
|
"16rem"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"datamap": {
|
"datamap": {
|
||||||
"description": "shiny chart",
|
"description": "shiny chart",
|
||||||
"data": true,
|
"data": true,
|
||||||
|
@ -525,7 +600,7 @@
|
||||||
"bullet": {
|
"bullet": {
|
||||||
"description": "Bullet chart",
|
"description": "Bullet chart",
|
||||||
"data": true,
|
"data": true,
|
||||||
"props": {
|
"props": {
|
||||||
"model": "string",
|
"model": "string",
|
||||||
"color": "string",
|
"color": "string",
|
||||||
"customSubtitle": "string",
|
"customSubtitle": "string",
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
<script>
|
||||||
|
import { cssVars, createClasses } from "./cssVars"
|
||||||
|
|
||||||
|
export const className = ""
|
||||||
|
export let imageUrl = ""
|
||||||
|
export let heading = ""
|
||||||
|
export let description = ""
|
||||||
|
export let linkText = ""
|
||||||
|
export let linkUrl
|
||||||
|
export let color
|
||||||
|
export let linkHoverColor
|
||||||
|
export let imageHeight
|
||||||
|
export let cardWidth
|
||||||
|
|
||||||
|
$: cssVariables = {
|
||||||
|
color,
|
||||||
|
linkHoverColor,
|
||||||
|
imageHeight,
|
||||||
|
cardWidth,
|
||||||
|
}
|
||||||
|
|
||||||
|
$: showImage = !!imageUrl
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div use:cssVars={cssVariables} class="container">
|
||||||
|
{#if showImage}
|
||||||
|
<img class="image" src={imageUrl} alt="" />
|
||||||
|
{/if}
|
||||||
|
<div class="content">
|
||||||
|
<h2 class="heading">{heading}</h2>
|
||||||
|
<h4 class="text">{description}</h4>
|
||||||
|
<a href={linkUrl}>{linkText}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
width: var(--cardWidth);
|
||||||
|
overflow: hidden !important;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image {
|
||||||
|
width: 100% !important;
|
||||||
|
max-width: 100%;
|
||||||
|
height: var(--imageHeight);
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 1.5rem;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.heading {
|
||||||
|
font-size: 1.25rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
font-size: 1rem;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
margin: 0.5rem 0;
|
||||||
|
text-decoration: none;
|
||||||
|
color: var(--color);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: var(--linkHoverColor);
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,104 @@
|
||||||
|
<script>
|
||||||
|
import { cssVars, createClasses } from "./cssVars"
|
||||||
|
|
||||||
|
export const className = ""
|
||||||
|
export let imageUrl = ""
|
||||||
|
export let heading = ""
|
||||||
|
export let description = ""
|
||||||
|
export let subtext = ""
|
||||||
|
export let linkText = ""
|
||||||
|
export let linkUrl
|
||||||
|
export let color
|
||||||
|
export let linkHoverColor
|
||||||
|
export let cardWidth
|
||||||
|
export let imageWidth
|
||||||
|
export let imageHeight
|
||||||
|
|
||||||
|
$: cssVariables = {
|
||||||
|
color,
|
||||||
|
linkHoverColor,
|
||||||
|
imageWidth,
|
||||||
|
cardWidth,
|
||||||
|
imageHeight,
|
||||||
|
}
|
||||||
|
|
||||||
|
$: showImage = !!imageUrl
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div use:cssVars={cssVariables} class="container">
|
||||||
|
{#if showImage}
|
||||||
|
<img class="image" src={imageUrl} alt="" />
|
||||||
|
{/if}
|
||||||
|
<div class="content">
|
||||||
|
<main>
|
||||||
|
<h2 class="heading">{heading}</h2>
|
||||||
|
<p class="text">{description}</p>
|
||||||
|
</main>
|
||||||
|
<footer>
|
||||||
|
<p class="subtext">{subtext}</p>
|
||||||
|
<a href={linkUrl}>{linkText}</a>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.container {
|
||||||
|
height: 100%;
|
||||||
|
max-width: var(--cardWidth);
|
||||||
|
display: flex !important;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image {
|
||||||
|
width: var(--imageWidth);
|
||||||
|
height: var(--imageHeight);
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0.85rem 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.heading {
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
margin: 0.5rem 0 0 0;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 1.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtext {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #757575;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
margin: 0.5rem 0 0 0;
|
||||||
|
text-decoration: none;
|
||||||
|
color: var(--color);
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: var(--linkHoverColor);
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -23,5 +23,7 @@ export { default as list } from "./List.svelte"
|
||||||
export { default as datasearch } from "./DataSearch.svelte"
|
export { default as datasearch } from "./DataSearch.svelte"
|
||||||
export { default as embed } from "./Embed.svelte"
|
export { default as embed } from "./Embed.svelte"
|
||||||
export { default as stackedlist } from "./StackedList.svelte"
|
export { default as stackedlist } from "./StackedList.svelte"
|
||||||
|
export { default as card } from "./Card.svelte"
|
||||||
|
export { default as cardhorizontal } from "./CardHorizontal.svelte"
|
||||||
export { default as recorddetail } from "./RecordDetail.svelte"
|
export { default as recorddetail } from "./RecordDetail.svelte"
|
||||||
export * from "./Chart"
|
export * from "./Chart"
|
||||||
|
|
Loading…
Reference in New Issue