@@ -488,7 +472,7 @@
flex-direction: row;
gap: var(--spacing-l);
flex-wrap: wrap;
- align-items: center;
+ align-items: flex-end;
}
.side-panel-icons {
@@ -505,6 +489,13 @@
.date-picker {
flex-basis: calc(70% - 32px);
min-width: 100px;
+ display: flex;
+ flex-direction: row;
+ }
+ .date-picker :global(.date-range-picker),
+ .date-picker :global(.spectrum-Form-item) {
+ flex: 1 1 auto;
+ width: 0;
}
.freeSearch {
diff --git a/packages/client/manifest.json b/packages/client/manifest.json
index 9364e4b3f6..54c379b796 100644
--- a/packages/client/manifest.json
+++ b/packages/client/manifest.json
@@ -3869,12 +3869,6 @@
"key": "timeOnly",
"defaultValue": false
},
- {
- "type": "boolean",
- "label": "24-hour time",
- "key": "time24hr",
- "defaultValue": false
- },
{
"type": "boolean",
"label": "Ignore time zones",
@@ -6723,7 +6717,20 @@
"illegalChildren": ["section", "sidepanel"],
"showEmptyState": false,
"draggable": false,
- "info": "Side panels are hidden by default. They will only be revealed when triggered by the 'Open Side Panel' action."
+ "info": "Side panels are hidden by default. They will only be revealed when triggered by the 'Open Side Panel' action.",
+ "settings": [
+ {
+ "type": "boolean",
+ "key": "ignoreClicksOutside",
+ "label": "Ignore clicks outside",
+ "defaultValue": false
+ },
+ {
+ "type": "event",
+ "key": "onClose",
+ "label": "On close"
+ }
+ ]
},
"rowexplorer": {
"block": true,
diff --git a/packages/client/package.json b/packages/client/package.json
index 00f89a6445..71a9e2e055 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -24,14 +24,7 @@
"@budibase/shared-core": "0.0.0",
"@budibase/string-templates": "0.0.0",
"@budibase/types": "0.0.0",
- "@spectrum-css/button": "^3.0.3",
- "@spectrum-css/card": "^3.0.3",
- "@spectrum-css/divider": "^1.0.3",
- "@spectrum-css/link": "^3.1.3",
- "@spectrum-css/page": "^3.0.1",
- "@spectrum-css/tag": "^3.1.4",
- "@spectrum-css/typography": "^3.0.2",
- "@spectrum-css/vars": "^3.0.1",
+ "@spectrum-css/card": "3.0.3",
"apexcharts": "^3.22.1",
"dayjs": "^1.10.8",
"downloadjs": "1.4.7",
@@ -41,7 +34,6 @@
"screenfull": "^6.0.1",
"shortid": "^2.2.15",
"svelte-apexcharts": "^1.0.2",
- "svelte-flatpickr": "^3.3.4",
"svelte-spa-router": "^4.0.1"
},
"devDependencies": {
diff --git a/packages/client/src/components/ClientApp.svelte b/packages/client/src/components/ClientApp.svelte
index f8a245b4f3..b790ecd0d4 100644
--- a/packages/client/src/components/ClientApp.svelte
+++ b/packages/client/src/components/ClientApp.svelte
@@ -206,13 +206,6 @@
/>
{/key}
-
-
diff --git a/packages/client/src/components/CustomThemeWrapper.svelte b/packages/client/src/components/CustomThemeWrapper.svelte
index c9ab9c9dc1..f15cd29ed8 100644
--- a/packages/client/src/components/CustomThemeWrapper.svelte
+++ b/packages/client/src/components/CustomThemeWrapper.svelte
@@ -60,16 +60,6 @@
--spectrum-link-primary-m-text-color-hover: var(--primaryColorHover);
}
- /* Theme flatpickr */
- :global(.flatpickr-day.selected) {
- background: var(--primaryColor);
- border-color: var(--primaryColor);
- }
- :global(.flatpickr-day.selected:hover) {
- background: var(--primaryColorHover);
- border-color: var(--primaryColorHover);
- }
-
/* Custom scrollbars */
:global(::-webkit-scrollbar) {
width: 8px;
diff --git a/packages/client/src/components/app/DateRangePicker.svelte b/packages/client/src/components/app/DateRangePicker.svelte
index 5c710ad766..8131f3bd89 100644
--- a/packages/client/src/components/app/DateRangePicker.svelte
+++ b/packages/client/src/components/app/DateRangePicker.svelte
@@ -38,10 +38,8 @@
if (!field || !value) {
return null
}
-
let low = dayjs.utc().subtract(1, "year")
let high = dayjs.utc().add(1, "day")
-
if (value === "Last 1 day") {
low = dayjs.utc().subtract(1, "day")
} else if (value === "Last 7 days") {
@@ -53,7 +51,6 @@
} else if (value === "Last 6 months") {
low = dayjs.utc().subtract(6, "months")
}
-
return {
range: {
[field]: {
diff --git a/packages/client/src/components/app/GridBlock.svelte b/packages/client/src/components/app/GridBlock.svelte
index 55e5a2bd66..e365429cb6 100644
--- a/packages/client/src/components/app/GridBlock.svelte
+++ b/packages/client/src/components/app/GridBlock.svelte
@@ -50,6 +50,8 @@
metadata: { dataSource: table },
},
]
+ $: height = $component.styles?.normal?.height || "408px"
+ $: styles = getSanitisedStyles($component.styles)
// Provide additional data context for live binding eval
export const getAdditionalDataContext = () => {
@@ -106,39 +108,48 @@
},
}))
}
+
+ const getSanitisedStyles = styles => {
+ return {
+ ...styles,
+ normal: {
+ ...styles?.normal,
+ height: undefined,
+ },
+ }
+ }
-
-
- onRowClick?.({ row: e.detail })}
- />
-
+
+
+
+ onRowClick?.({ row: e.detail })}
+ />
+
+
diff --git a/packages/client/src/components/app/Layout.svelte b/packages/client/src/components/app/Layout.svelte
index 8508e943ff..eb1e0022cc 100644
--- a/packages/client/src/components/app/Layout.svelte
+++ b/packages/client/src/components/app/Layout.svelte
@@ -73,7 +73,10 @@
$context.device.width,
$context.device.height
)
- $: autoCloseSidePanel = !$builderStore.inBuilder && $sidePanelStore.open
+ $: autoCloseSidePanel =
+ !$builderStore.inBuilder &&
+ $sidePanelStore.open &&
+ !$sidePanelStore.ignoreClicksOutside
$: screenId = $builderStore.inBuilder
? `${$builderStore.screen?._id}-screen`
: "screen"
@@ -191,6 +194,11 @@
}
return url
}
+
+ const handleClickLink = () => {
+ mobileOpen = false
+ sidePanelStore.actions.close()
+ }
@@ -281,7 +289,7 @@
url={navItem.url}
subLinks={navItem.subLinks}
internalLink={navItem.internalLink}
- on:clickLink={() => (mobileOpen = false)}
+ on:clickLink={handleClickLink}
leftNav={navigation === "Left"}
{mobile}
{navStateStore}
diff --git a/packages/client/src/components/app/SidePanel.svelte b/packages/client/src/components/app/SidePanel.svelte
index 825b401bb8..bff5a78837 100644
--- a/packages/client/src/components/app/SidePanel.svelte
+++ b/packages/client/src/components/app/SidePanel.svelte
@@ -5,6 +5,9 @@
const { styleable, sidePanelStore, builderStore, dndIsDragging } =
getContext("sdk")
+ export let onClose
+ export let ignoreClicksOutside
+
// Automatically show and hide the side panel when inside the builder.
// For some unknown reason, svelte reactivity breaks if we reference the
// reactive variable "open" inside the following expression, or if we define
@@ -26,6 +29,10 @@
}
}
+ // $: {
+
+ // }
+
// Derive visibility
$: open = $sidePanelStore.contentId === $component.id
@@ -36,10 +43,17 @@
let renderKey = null
$: {
if (open) {
+ sidePanelStore.actions.setIgnoreClicksOutside(ignoreClicksOutside)
renderKey = Math.random()
}
}
+ const handleSidePanelClose = async () => {
+ if (onClose) {
+ await onClose()
+ }
+ }
+
const showInSidePanel = (el, visible) => {
const update = visible => {
const target = document.getElementById("side-panel-container")
@@ -51,6 +65,7 @@
} else {
if (target.contains(node)) {
target.removeChild(node)
+ handleSidePanelClose()
}
}
}
diff --git a/packages/client/src/components/app/forms/DateTimeField.svelte b/packages/client/src/components/app/forms/DateTimeField.svelte
index 8ab8e65a15..499f0443cb 100644
--- a/packages/client/src/components/app/forms/DateTimeField.svelte
+++ b/packages/client/src/components/app/forms/DateTimeField.svelte
@@ -49,7 +49,6 @@
readonly={fieldState.readonly}
error={fieldState.error}
id={fieldState.fieldId}
- appendTo={document.getElementById("flatpickr-root")}
{enableTime}
{timeOnly}
{time24hr}
diff --git a/packages/client/src/components/app/forms/validation.js b/packages/client/src/components/app/forms/validation.js
index cdedd85cf2..bdd7213cb0 100644
--- a/packages/client/src/components/app/forms/validation.js
+++ b/packages/client/src/components/app/forms/validation.js
@@ -1,5 +1,6 @@
-import flatpickr from "flatpickr"
+import dayjs from "dayjs"
import { FieldTypes } from "../../../constants"
+import { Helpers } from "@budibase/bbui"
/**
* Creates a validation function from a combination of schema-level constraints
@@ -81,7 +82,7 @@ export const createValidatorFromConstraints = (
// Date constraint
if (exists(schemaConstraints.datetime?.earliest)) {
const limit = schemaConstraints.datetime.earliest
- const limitString = flatpickr.formatDate(new Date(limit), "F j Y, H:i")
+ const limitString = Helpers.getDateDisplayValue(dayjs(limit))
rules.push({
type: "datetime",
constraint: "minValue",
@@ -91,7 +92,7 @@ export const createValidatorFromConstraints = (
}
if (exists(schemaConstraints.datetime?.latest)) {
const limit = schemaConstraints.datetime.latest
- const limitString = flatpickr.formatDate(new Date(limit), "F j Y, H:i")
+ const limitString = Helpers.getDateDisplayValue(dayjs(limit))
rules.push({
type: "datetime",
constraint: "maxValue",
diff --git a/packages/client/src/stores/sidePanel.js b/packages/client/src/stores/sidePanel.js
index 3b3b9f5f4d..b25914c484 100644
--- a/packages/client/src/stores/sidePanel.js
+++ b/packages/client/src/stores/sidePanel.js
@@ -3,6 +3,7 @@ import { writable, derived } from "svelte/store"
export const createSidePanelStore = () => {
const initialState = {
contentId: null,
+ ignoreClicksOutside: true,
}
const store = writable(initialState)
const derivedStore = derived(store, $store => {
@@ -32,11 +33,18 @@ export const createSidePanelStore = () => {
}, 50)
}
+ const setIgnoreClicksOutside = bool => {
+ store.update(state => {
+ state.ignoreClicksOutside = bool
+ return state
+ })
+ }
return {
subscribe: derivedStore.subscribe,
actions: {
open,
close,
+ setIgnoreClicksOutside,
},
}
}
diff --git a/packages/client/src/utils/buttonActions.js b/packages/client/src/utils/buttonActions.js
index d883ee1b55..4ab7490ae7 100644
--- a/packages/client/src/utils/buttonActions.js
+++ b/packages/client/src/utils/buttonActions.js
@@ -240,6 +240,7 @@ const triggerAutomationHandler = async action => {
const navigationHandler = action => {
const { url, peek, externalNewTab } = action.parameters
routeStore.actions.navigate(url, peek, externalNewTab)
+ closeSidePanelHandler()
}
const queryExecutionHandler = async action => {
diff --git a/packages/frontend-core/src/api/backups.js b/packages/frontend-core/src/api/backups.js
index 7663ae09af..40546b6f66 100644
--- a/packages/frontend-core/src/api/backups.js
+++ b/packages/frontend-core/src/api/backups.js
@@ -1,7 +1,4 @@
export const buildBackupsEndpoints = API => ({
- /**
- * Gets a list of users in the current tenant.
- */
searchBackups: async ({ appId, trigger, type, page, startDate, endDate }) => {
const opts = {}
if (page) {
diff --git a/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte b/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
index e7dc51e5d5..1a2494987a 100644
--- a/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
+++ b/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
@@ -1,6 +1,7 @@
-
+
+
+
- {#if value}
- {displayValue}
- {/if}
+ {displayValue}
{#if editable}
{/if}
-{#if editable}
-
- onChange(e.detail)}
- appendTo={document.documentElement}
- enableTime={!dateOnly}
- {timeOnly}
- time24hr
- ignoreTimezones={schema.ignoreTimezones}
- bind:flatpickr
- on:open={() => (isOpen = true)}
- on:close={() => (isOpen = false)}
+{#if isOpen}
+
+ (value = e.detail)}
+ {enableTime}
+ {timeOnly}
+ {ignoreTimezones}
/>
-
+
{/if}
diff --git a/packages/frontend-core/src/components/grid/cells/HeaderCell.svelte b/packages/frontend-core/src/components/grid/cells/HeaderCell.svelte
index 8a10556da9..af1f1b6b78 100644
--- a/packages/frontend-core/src/components/grid/cells/HeaderCell.svelte
+++ b/packages/frontend-core/src/components/grid/cells/HeaderCell.svelte
@@ -1,20 +1,14 @@
@@ -314,89 +307,88 @@
-
- {#if editIsOpen}
- {
- editIsOpen = false
- }}
- class="content"
- >
-
-
- {:else}
-
+
+
+
+
+
+
+
+ {#if $config.canEditColumns && column.schema.type === "link" && column.schema.tableId === TableNames.USERS}
+
+ {/if}
+
+ {/if}
+
+{/if}
diff --git a/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte b/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte
index d181fd72e9..f5a8351604 100644
--- a/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte
+++ b/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte
@@ -1,10 +1,11 @@
+
+
+ dispatch("close")}
+ on:wheel={e => e.stopPropagation()}
+ >
+
+
+
+
+
diff --git a/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte b/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte
index ed09301bb9..cef4144833 100644
--- a/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte
+++ b/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte
@@ -20,6 +20,7 @@
const ignoredOriginSelectors = [
".spectrum-Modal",
+ ".date-time-popover",
"#builder-side-panel-container",
"[data-grid-ignore]",
]
diff --git a/packages/frontend-core/src/components/grid/overlays/MenuOverlay.svelte b/packages/frontend-core/src/components/grid/overlays/MenuOverlay.svelte
index 55308d4c6e..13430a3f7d 100644
--- a/packages/frontend-core/src/components/grid/overlays/MenuOverlay.svelte
+++ b/packages/frontend-core/src/components/grid/overlays/MenuOverlay.svelte
@@ -1,7 +1,8 @@
+
+
{#if $menu.visible}
-
+ {#key style}
+
+
+
+
+
+
+
+
+
+
+
+ {/key}
{/if}
diff --git a/packages/frontend-core/src/components/grid/overlays/PopoverOverlay.svelte b/packages/frontend-core/src/components/grid/overlays/PopoverOverlay.svelte
new file mode 100644
index 0000000000..a03ba6d927
--- /dev/null
+++ b/packages/frontend-core/src/components/grid/overlays/PopoverOverlay.svelte
@@ -0,0 +1,9 @@
+
+
+
diff --git a/packages/frontend-core/src/components/grid/overlays/ScrollOverlay.svelte b/packages/frontend-core/src/components/grid/overlays/ScrollOverlay.svelte
index e0ead3727c..71d04ecbda 100644
--- a/packages/frontend-core/src/components/grid/overlays/ScrollOverlay.svelte
+++ b/packages/frontend-core/src/components/grid/overlays/ScrollOverlay.svelte
@@ -18,6 +18,7 @@
height,
isDragging,
menu,
+ focusedCellAPI,
} = getContext("grid")
// State for dragging bars
@@ -48,10 +49,11 @@
$: barLeft = ScrollBarSize + availWidth * ($scrollLeft / $maxScrollLeft)
// Helper to close the context menu if it's open
- const closeMenu = () => {
+ const closePopovers = () => {
if ($menu.visible) {
menu.actions.close()
}
+ $focusedCellAPI?.blur()
}
// V scrollbar drag handlers
@@ -64,7 +66,7 @@
document.addEventListener("mouseup", stopVDragging)
document.addEventListener("touchend", stopVDragging)
isDraggingV = true
- closeMenu()
+ closePopovers()
}
const moveVDragging = domDebounce(e => {
const delta = parseEventLocation(e).y - initialMouse
@@ -93,7 +95,7 @@
document.addEventListener("mouseup", stopHDragging)
document.addEventListener("touchend", stopHDragging)
isDraggingH = true
- closeMenu()
+ closePopovers()
}
const moveHDragging = domDebounce(e => {
const delta = parseEventLocation(e).x - initialMouse
diff --git a/packages/frontend-core/src/components/grid/stores/menu.js b/packages/frontend-core/src/components/grid/stores/menu.js
index 2d11b65bd4..ea32285a95 100644
--- a/packages/frontend-core/src/components/grid/stores/menu.js
+++ b/packages/frontend-core/src/components/grid/stores/menu.js
@@ -13,13 +13,13 @@ export const createStores = () => {
}
export const createActions = context => {
- const { menu, focusedCellId, rand } = context
+ const { menu, focusedCellId, gridID } = context
const open = (cellId, e) => {
e.preventDefault()
// Get DOM node for grid data wrapper to compute relative position to
- const gridNode = document.getElementById(`grid-${rand}`)
+ const gridNode = document.getElementById(gridID)
const dataNode = gridNode?.getElementsByClassName("grid-data-outer")?.[0]
if (!dataNode) {
return
diff --git a/packages/frontend-core/src/components/grid/stores/reorder.js b/packages/frontend-core/src/components/grid/stores/reorder.js
index c068f82cba..b3abbbabf3 100644
--- a/packages/frontend-core/src/components/grid/stores/reorder.js
+++ b/packages/frontend-core/src/components/grid/stores/reorder.js
@@ -32,7 +32,6 @@ export const createActions = context => {
scroll,
bounds,
stickyColumn,
- ui,
maxScrollLeft,
width,
} = context
@@ -45,7 +44,6 @@ export const createActions = context => {
const $visibleColumns = get(visibleColumns)
const $bounds = get(bounds)
const $stickyColumn = get(stickyColumn)
- ui.actions.blur()
// Generate new breakpoints for the current columns
let breakpoints = $visibleColumns.map(col => ({
@@ -97,7 +95,7 @@ export const createActions = context => {
// Check if we need to start auto-scrolling
const $reorder = get(reorder)
const proximityCutoff = Math.min(140, get(width) / 6)
- const speedFactor = 8
+ const speedFactor = 16
const rightProximity = Math.max(0, $reorder.gridLeft + $reorder.width - x)
const leftProximity = Math.max(0, x - $reorder.gridLeft)
if (rightProximity < proximityCutoff) {
diff --git a/packages/frontend-core/src/components/grid/stores/rows.js b/packages/frontend-core/src/components/grid/stores/rows.js
index 5dc9413ccd..fc941ecc7f 100644
--- a/packages/frontend-core/src/components/grid/stores/rows.js
+++ b/packages/frontend-core/src/components/grid/stores/rows.js
@@ -196,6 +196,20 @@ export const createActions = context => {
// Handles validation errors from the rows API and updates local validation
// state, storing error messages against relevant cells
const handleValidationError = (rowId, error) => {
+ // If the server doesn't reply with a valid error, assume that the source
+ // of the error is the focused cell's column
+ if (!error?.json?.validationErrors && error?.message) {
+ const focusedColumn = get(focusedCellId)?.split("-")[1]
+ if (focusedColumn) {
+ error = {
+ json: {
+ validationErrors: {
+ [focusedColumn]: error.message,
+ },
+ },
+ }
+ }
+ }
if (error?.json?.validationErrors) {
// Normal validation errors
const keys = Object.keys(error.json.validationErrors)
@@ -214,11 +228,19 @@ export const createActions = context => {
// Process errors for columns that we have
for (let column of erroredColumns) {
+ // Ensure we have a valid error to display
+ let err = error.json.validationErrors[column]
+ if (Array.isArray(err)) {
+ err = err[0]
+ }
+ if (typeof err !== "string" || !err.length) {
+ error = "Something went wrong"
+ }
+ // Set error against the cell
validation.actions.setError(
`${rowId}-${column}`,
- `${column} ${error.json.validationErrors[column]}`
+ Helpers.capitalise(err)
)
-
// Ensure the column is visible
const index = $columns.findIndex(x => x.name === column)
if (index !== -1 && !$columns[index].visible) {
@@ -523,6 +545,7 @@ export const initialise = context => {
previousFocusedCellId,
rows,
validation,
+ focusedCellId,
} = context
// Wipe the row change cache when changing row
@@ -537,12 +560,22 @@ export const initialise = context => {
// Ensure any unsaved changes are saved when changing cell
previousFocusedCellId.subscribe(async id => {
- const rowId = id?.split("-")[0]
- const hasErrors = validation.actions.rowHasErrors(rowId)
- const hasChanges = Object.keys(get(rowChangeCache)[rowId] || {}).length > 0
- const isSavingChanges = get(inProgressChanges)[rowId]
- if (rowId && !hasErrors && hasChanges && !isSavingChanges) {
- await rows.actions.applyRowChanges(rowId)
+ if (!id) {
+ return
+ }
+ // Stop if we changed row
+ const oldRowId = id.split("-")[0]
+ const oldColumn = id.split("-")[1]
+ const newRowId = get(focusedCellId)?.split("-")[0]
+ if (oldRowId !== newRowId) {
+ return
+ }
+ // Otherwise we just changed cell in the same row
+ const hasChanges = oldColumn in (get(rowChangeCache)[oldRowId] || {})
+ const hasErrors = validation.actions.rowHasErrors(oldRowId)
+ const isSavingChanges = get(inProgressChanges)[oldRowId]
+ if (oldRowId && !hasErrors && hasChanges && !isSavingChanges) {
+ await rows.actions.applyRowChanges(oldRowId)
}
})
}
diff --git a/packages/frontend-core/src/components/grid/stores/viewport.js b/packages/frontend-core/src/components/grid/stores/viewport.js
index 8df8acd0f4..96a5a954ee 100644
--- a/packages/frontend-core/src/components/grid/stores/viewport.js
+++ b/packages/frontend-core/src/components/grid/stores/viewport.js
@@ -1,7 +1,6 @@
import { derived } from "svelte/store"
import {
- MaxCellRenderHeight,
- MaxCellRenderWidthOverflow,
+ MaxCellRenderOverflow,
MinColumnWidth,
ScrollBarSize,
} from "../lib/constants"
@@ -95,11 +94,11 @@ export const deriveStores = context => {
// Compute the last row index with space to render popovers below it
const minBottom =
- $height - ScrollBarSize * 3 - MaxCellRenderHeight + offset
+ $height - ScrollBarSize * 3 - MaxCellRenderOverflow + offset
const lastIdx = Math.floor(minBottom / $rowHeight)
// Compute the first row index with space to render popovers above it
- const minTop = MaxCellRenderHeight + offset
+ const minTop = MaxCellRenderOverflow + offset
const firstIdx = Math.ceil(minTop / $rowHeight)
// Use the greater of the two indices so that we prefer content below,
@@ -117,7 +116,7 @@ export const deriveStores = context => {
let inversionIdx = $visibleColumns.length
for (let i = $visibleColumns.length - 1; i >= 0; i--, inversionIdx--) {
const rightEdge = $visibleColumns[i].left + $visibleColumns[i].width
- if (rightEdge + MaxCellRenderWidthOverflow <= cutoff) {
+ if (rightEdge + MaxCellRenderOverflow <= cutoff) {
break
}
}
diff --git a/packages/frontend-core/src/utils/rows.js b/packages/frontend-core/src/utils/rows.js
index ea43d63734..50f676983d 100644
--- a/packages/frontend-core/src/utils/rows.js
+++ b/packages/frontend-core/src/utils/rows.js
@@ -8,6 +8,10 @@ const isBetterSample = (newValue, oldValue) => {
return true
}
+ if (oldValue != null && newValue == null) {
+ return false
+ }
+
// Don't change type
const oldType = typeof oldValue
const newType = typeof newValue
diff --git a/packages/pro b/packages/pro
index 01bec5657e..479879246a 160000
--- a/packages/pro
+++ b/packages/pro
@@ -1 +1 @@
-Subproject commit 01bec5657e0c3c3bb29e883e6ac71258fee8710b
+Subproject commit 479879246aac5dd3073cc695945c62c41fae5b0e
diff --git a/packages/server/src/api/controllers/table/utils.ts b/packages/server/src/api/controllers/table/utils.ts
index f496c686f3..8eac30e4df 100644
--- a/packages/server/src/api/controllers/table/utils.ts
+++ b/packages/server/src/api/controllers/table/utils.ts
@@ -128,6 +128,7 @@ export async function importToRows(
for (let i = 0; i < data.length; i++) {
let row = data[i]
row._id = generateRowID(table._id!)
+ row.type = "row"
row.tableId = table._id
// We use a reference to table here and update it after input processing,
diff --git a/packages/server/src/api/routes/tests/search.spec.ts b/packages/server/src/api/routes/tests/search.spec.ts
index 698ea0c10b..cec686ba74 100644
--- a/packages/server/src/api/routes/tests/search.spec.ts
+++ b/packages/server/src/api/routes/tests/search.spec.ts
@@ -3,6 +3,7 @@ import { DatabaseName, getDatasource } from "../../../integrations/tests/utils"
import * as setup from "./utilities"
import {
+ AutoFieldSubType,
Datasource,
EmptyFilterOption,
FieldType,
@@ -18,15 +19,16 @@ import _ from "lodash"
jest.unmock("mssql")
describe.each([
- ["internal", undefined],
- ["internal-sqs", undefined],
+ ["lucene", undefined],
+ ["sqs", undefined],
[DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)],
[DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)],
[DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)],
[DatabaseName.MARIADB, getDatasource(DatabaseName.MARIADB)],
])("/api/:sourceId/search (%s)", (name, dsProvider) => {
- const isSqs = name === "internal-sqs"
- const isInternal = name === "internal"
+ const isSqs = name === "sqs"
+ const isLucene = name === "lucene"
+ const isInternal = isSqs || isLucene
const config = setup.getConfig()
let envCleanup: (() => void) | undefined
@@ -59,7 +61,7 @@ describe.each([
}
async function createRows(rows: Record
[]) {
- await Promise.all(rows.map(r => config.api.row.save(table._id!, r)))
+ await config.api.row.bulkImport(table._id!, { rows })
}
class SearchAssertion {
@@ -339,14 +341,14 @@ describe.each([
}).toFindNothing())
// We never implemented half-open ranges in Lucene.
- !isInternal &&
+ !isLucene &&
it("can search using just a low value", () =>
expectQuery({
range: { age: { low: 5 } },
}).toContainExactly([{ age: 10 }]))
// We never implemented half-open ranges in Lucene.
- !isInternal &&
+ !isLucene &&
it("can search using just a high value", () =>
expectQuery({
range: { age: { high: 5 } },
@@ -457,14 +459,14 @@ describe.each([
}).toFindNothing())
// We never implemented half-open ranges in Lucene.
- !isInternal &&
+ !isLucene &&
it("can search using just a low value", () =>
expectQuery({
range: { dob: { low: JAN_5TH } },
}).toContainExactly([{ dob: JAN_10TH }]))
// We never implemented half-open ranges in Lucene.
- !isInternal &&
+ !isLucene &&
it("can search using just a high value", () =>
expectQuery({
range: { dob: { high: JAN_5TH } },
@@ -642,7 +644,7 @@ describe.each([
// Range searches against bigints don't seem to work at all in Lucene, and I
// couldn't figure out why. Given that we're replacing Lucene with SQS,
// we've decided not to spend time on it.
- !isInternal &&
+ !isLucene &&
describe("range", () => {
it("successfully finds a row", () =>
expectQuery({
@@ -675,4 +677,137 @@ describe.each([
}).toContainExactly([{ num: SMALL }, { num: MEDIUM }]))
})
})
+
+ isInternal &&
+ describe("auto", () => {
+ beforeAll(async () => {
+ await createTable({
+ auto: {
+ name: "auto",
+ type: FieldType.AUTO,
+ autocolumn: true,
+ subtype: AutoFieldSubType.AUTO_ID,
+ },
+ })
+ await createRows(new Array(10).fill({}))
+ })
+
+ describe("equal", () => {
+ it("successfully finds a row", () =>
+ expectQuery({ equal: { auto: 1 } }).toContainExactly([{ auto: 1 }]))
+
+ it("fails to find nonexistent row", () =>
+ expectQuery({ equal: { auto: 0 } }).toFindNothing())
+ })
+
+ describe("not equal", () => {
+ it("successfully finds a row", () =>
+ expectQuery({ notEqual: { auto: 1 } }).toContainExactly([
+ { auto: 2 },
+ { auto: 3 },
+ { auto: 4 },
+ { auto: 5 },
+ { auto: 6 },
+ { auto: 7 },
+ { auto: 8 },
+ { auto: 9 },
+ { auto: 10 },
+ ]))
+
+ it("fails to find nonexistent row", () =>
+ expectQuery({ notEqual: { auto: 0 } }).toContainExactly([
+ { auto: 1 },
+ { auto: 2 },
+ { auto: 3 },
+ { auto: 4 },
+ { auto: 5 },
+ { auto: 6 },
+ { auto: 7 },
+ { auto: 8 },
+ { auto: 9 },
+ { auto: 10 },
+ ]))
+ })
+
+ describe("oneOf", () => {
+ it("successfully finds a row", () =>
+ expectQuery({ oneOf: { auto: [1] } }).toContainExactly([{ auto: 1 }]))
+
+ it("fails to find nonexistent row", () =>
+ expectQuery({ oneOf: { auto: [0] } }).toFindNothing())
+ })
+
+ describe("range", () => {
+ it("successfully finds a row", () =>
+ expectQuery({
+ range: { auto: { low: 1, high: 1 } },
+ }).toContainExactly([{ auto: 1 }]))
+
+ it("successfully finds multiple rows", () =>
+ expectQuery({
+ range: { auto: { low: 1, high: 2 } },
+ }).toContainExactly([{ auto: 1 }, { auto: 2 }]))
+
+ it("successfully finds a row with a high bound", () =>
+ expectQuery({
+ range: { auto: { low: 2, high: 2 } },
+ }).toContainExactly([{ auto: 2 }]))
+
+ it("successfully finds no rows", () =>
+ expectQuery({
+ range: { auto: { low: 0, high: 0 } },
+ }).toFindNothing())
+
+ isSqs &&
+ it("can search using just a low value", () =>
+ expectQuery({
+ range: { auto: { low: 9 } },
+ }).toContainExactly([{ auto: 9 }, { auto: 10 }]))
+
+ isSqs &&
+ it("can search using just a high value", () =>
+ expectQuery({
+ range: { auto: { high: 2 } },
+ }).toContainExactly([{ auto: 1 }, { auto: 2 }]))
+ })
+
+ isSqs &&
+ describe("sort", () => {
+ it("sorts ascending", () =>
+ expectSearch({
+ query: {},
+ sort: "auto",
+ sortOrder: SortOrder.ASCENDING,
+ }).toMatchExactly([
+ { auto: 1 },
+ { auto: 2 },
+ { auto: 3 },
+ { auto: 4 },
+ { auto: 5 },
+ { auto: 6 },
+ { auto: 7 },
+ { auto: 8 },
+ { auto: 9 },
+ { auto: 10 },
+ ]))
+
+ it("sorts descending", () =>
+ expectSearch({
+ query: {},
+ sort: "auto",
+ sortOrder: SortOrder.DESCENDING,
+ }).toMatchExactly([
+ { auto: 10 },
+ { auto: 9 },
+ { auto: 8 },
+ { auto: 7 },
+ { auto: 6 },
+ { auto: 5 },
+ { auto: 4 },
+ { auto: 3 },
+ { auto: 2 },
+ { auto: 1 },
+ ]))
+ })
+ })
})
diff --git a/packages/server/src/integrations/tests/utils/index.ts b/packages/server/src/integrations/tests/utils/index.ts
index 5034b5a8db..a54d0ac1a7 100644
--- a/packages/server/src/integrations/tests/utils/index.ts
+++ b/packages/server/src/integrations/tests/utils/index.ts
@@ -65,9 +65,7 @@ export async function rawQuery(ds: Datasource, sql: string): Promise {
}
export async function startContainer(container: GenericContainer) {
- if (process.env.REUSE_CONTAINERS) {
- container = container.withReuse()
- }
+ container = container.withReuse().withLabels({ "com.budibase": "true" })
const startedContainer = await container.start()
diff --git a/packages/server/src/sdk/app/rows/search/sqs.ts b/packages/server/src/sdk/app/rows/search/sqs.ts
index 10cc5aa6c6..dabccc4b55 100644
--- a/packages/server/src/sdk/app/rows/search/sqs.ts
+++ b/packages/server/src/sdk/app/rows/search/sqs.ts
@@ -131,11 +131,6 @@ export async function search(
},
relationships,
}
- // make sure only rows returned
- request.filters!.equal = {
- ...request.filters?.equal,
- type: "row",
- }
if (params.sort) {
const sortField = table.schema[params.sort]
diff --git a/packages/server/src/sdk/app/tables/internal/sqs.ts b/packages/server/src/sdk/app/tables/internal/sqs.ts
index 391e186bc0..92ff309cc9 100644
--- a/packages/server/src/sdk/app/tables/internal/sqs.ts
+++ b/packages/server/src/sdk/app/tables/internal/sqs.ts
@@ -33,7 +33,7 @@ const FieldTypeMap: Record = {
[FieldType.LONGFORM]: SQLiteType.TEXT,
[FieldType.NUMBER]: SQLiteType.REAL,
[FieldType.STRING]: SQLiteType.TEXT,
- [FieldType.AUTO]: SQLiteType.TEXT,
+ [FieldType.AUTO]: SQLiteType.REAL,
[FieldType.OPTIONS]: SQLiteType.TEXT,
[FieldType.JSON]: SQLiteType.BLOB,
[FieldType.INTERNAL]: SQLiteType.BLOB,
diff --git a/scripts/killTestcontainers.sh b/scripts/killTestcontainers.sh
new file mode 100755
index 0000000000..773d01a962
--- /dev/null
+++ b/scripts/killTestcontainers.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+# Find all Docker containers with the label "org.testcontainers=true"
+containers=$(docker ps -q -f "label=org.testcontainers=true")
+
+# Check if there are any containers to stop
+if [ -z "$containers" ]; then
+ echo "No containers with label 'org.testcontainers=true' found."
+else
+ # Stop the containers
+ echo "Stopping containers..."
+ docker stop $containers
+
+ # Remove the containers
+ echo "Removing containers..."
+ docker rm $containers
+
+ echo "Containers have been stopped and removed."
+fi
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 727a927df4..0f876f4fd3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1988,7 +1988,7 @@
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
-"@babel/runtime@^7.10.5", "@babel/runtime@^7.13.10":
+"@babel/runtime@^7.10.5":
version "7.23.9"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7"
integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==
@@ -2002,6 +2002,13 @@
dependencies:
regenerator-runtime "^0.14.0"
+"@babel/runtime@^7.13.10":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
+ integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
@@ -2751,7 +2758,7 @@
"@grpc/proto-loader" "^0.7.0"
"@types/node" ">=12.12.47"
-"@grpc/proto-loader@0.7.10", "@grpc/proto-loader@^0.7.0", "@grpc/proto-loader@^0.7.8":
+"@grpc/proto-loader@0.7.10", "@grpc/proto-loader@^0.7.0":
version "0.7.10"
resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.10.tgz#6bf26742b1b54d0a473067743da5d3189d06d720"
integrity sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==
@@ -2761,6 +2768,16 @@
protobufjs "^7.2.4"
yargs "^17.7.2"
+"@grpc/proto-loader@^0.7.8":
+ version "0.7.12"
+ resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.12.tgz#787b58e3e3771df30b1567c057b6ab89e3a42911"
+ integrity sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==
+ dependencies:
+ lodash.camelcase "^4.3.0"
+ long "^5.0.0"
+ protobufjs "^7.2.4"
+ yargs "^17.7.2"
+
"@hapi/hoek@^9.0.0":
version "9.3.0"
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb"
@@ -4776,17 +4793,17 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/button/-/button-3.0.1.tgz#6db8c3e851baecd0f1c2d88fef37d49d01c6e643"
integrity sha512-YXrBtjIYisk4Vaxnp0RiE4gdElQX04P2mc4Pi2GlQ27dJKlHmufYcF+kAqGdtiyK5yjdN/vKRcC8y13aA4rusA==
-"@spectrum-css/button@^3.0.3":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/button/-/button-3.0.3.tgz#2df1efaab6c7e0b3b06cb4b59e1eae59c7f1fc84"
- integrity sha512-6CnLPqqtaU/PcSSIGeGRi0iFIIxIUByYLKFO6zn5NEUc12KQ28dJ4PLwB6WBa0L8vRoAGlnWWH2ZZweTijbXgg==
-
"@spectrum-css/buttongroup@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@spectrum-css/buttongroup/-/buttongroup-3.0.2.tgz#fd3387973ca3131609e32112de42a1c0400a48d8"
integrity sha512-Wu7B4GJ/SAeVHz9SUGAkeIH8pLaZh4t+w2ykSKOPQIRuK2jCBoudkEClVxviNVwqekccf5XLFXg9GpYF1a3Uaw==
-"@spectrum-css/card@^3.0.3":
+"@spectrum-css/calendar@3.2.7":
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/@spectrum-css/calendar/-/calendar-3.2.7.tgz#10fd44176b6afbdf5baf29ce16728baa98b0d844"
+ integrity sha512-e2BGyuXzP+VOv0q855EIgrR+ne7e/EP8AMMuSAWazgq2fPZ4CoJIeLYP3tnniKnj2dlb3Gr1LH+6MPlUXS74RA==
+
+"@spectrum-css/card@3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@spectrum-css/card/-/card-3.0.3.tgz#56b2e2da6b80c1583228baa279de7407383bfb6b"
integrity sha512-+oKLUI2a0QmQP9EzySeq/G4FpUkkdaDNbuEbqCj2IkPMc/2v/nwzsPhh1fj2UIghGAiiUwXfPpzax1e8fyhQUg==
@@ -4808,13 +4825,6 @@
dependencies:
"@spectrum-css/vars" "^3.0.2"
-"@spectrum-css/divider@^1.0.3":
- version "1.0.27"
- resolved "https://registry.yarnpkg.com/@spectrum-css/divider/-/divider-1.0.27.tgz#435bf738a65b4eb15c899edf5c536bea22f2d679"
- integrity sha512-hWKPHOEo9lkOGN5zecpVVwVxE3x0SJHQJKDNx1g0xs/P/AthAboK+L1c9Rq29czNfcQ2kUjumi4igzQzcqABMQ==
- dependencies:
- "@spectrum-css/vars" "^8.0.0"
-
"@spectrum-css/dropzone@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@spectrum-css/dropzone/-/dropzone-3.0.2.tgz#34f137851054442b219fed7f32006b93fc5e0bcf"
@@ -4860,11 +4870,6 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/link/-/link-3.1.1.tgz#cb526a2e10b50ef5a7ae29cca7272e2610d597eb"
integrity sha512-Bi88lRhTY7g6nM/ryW1yY4Cji211ZYNtRxkxbV7n2lPvwMAAQtyx0qVD3ru4kTGj/FFVvmPR3XiOE10K13HSNA==
-"@spectrum-css/link@^3.1.3":
- version "3.1.23"
- resolved "https://registry.yarnpkg.com/@spectrum-css/link/-/link-3.1.23.tgz#9d9ff64c41366edbfdb19d04a5deec88bf2ea8fd"
- integrity sha512-CAJQGnGTrTtR4tF1L94ou9Y+c4vnx9d5rWhb3AMzKb2Focqz02xSkTyaCCH7OM/3CwD8TCLOMANon8LcRpGAjA==
-
"@spectrum-css/menu@3.0.1":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@spectrum-css/menu/-/menu-3.0.1.tgz#2a376f991acc24e12ec892bb6b9db2650fc41fbe"
@@ -4952,11 +4957,6 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/tabs/-/tabs-3.2.12.tgz#9b08f23d5aa881b3441af7757800c7173e5685ff"
integrity sha512-rPFUW9SSW4+3/UJ3UrtY2/l3sQvlqB1fqxHLPDjgykvbfrnMejcCTNV4ZrFNHXpE/6+kGnk+yVViSPtWGwJzkA==
-"@spectrum-css/tag@^3.1.4":
- version "3.3.15"
- resolved "https://registry.yarnpkg.com/@spectrum-css/tag/-/tag-3.3.15.tgz#971184fd8cb977b85a529f808313851863123278"
- integrity sha512-pF6Wh61Z7hmAy20twIlpjdDuivYj6UPtWIzK7giyJKr/qcn20BjVN2ChIeFB1N+vBamJdLsuQOewv4AJ3+LZ2Q==
-
"@spectrum-css/tags@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@spectrum-css/tags/-/tags-3.0.2.tgz#5bf35fb79c97cd9344de485bd4626ad5b9f07757"
@@ -4987,11 +4987,6 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/typography/-/typography-3.0.1.tgz#957dafd9b18c314fa37a88b549042ba2175f5b3f"
integrity sha512-XyR68K2rIZX3u4j7HhMLOqLVHDJZcapp3XUqgYMzMWccBFleA0qPxKpfRWqVIA5DzTMSIw0wEcZPYKWFZ2e6dA==
-"@spectrum-css/typography@^3.0.2":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@spectrum-css/typography/-/typography-3.0.2.tgz#ea3ca0a60e18064527819d48c8c4364cab4fcd38"
- integrity sha512-5ZOLmQe0edzsDMyhghUd4hBb5uxGsFrxzf+WasfcUw9klSfTsRZ09n1BsaaWbgrLjlMQ+EEHS46v5VNo0Ms2CA==
-
"@spectrum-css/underlay@2.0.9":
version "2.0.9"
resolved "https://registry.yarnpkg.com/@spectrum-css/underlay/-/underlay-2.0.9.tgz#fc10f971d1325cc844b727e6260f7217844060e8"
@@ -5012,11 +5007,6 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/vars/-/vars-4.3.1.tgz#d333fa41909f691c8750b5c15ad9ba029df2248e"
integrity sha512-rX6Iasu9BsFMVgEN0vGRPm9dmSxva+IK/uqQAa9HM0lliwqUiFrJxrFXHHpiAgNuux/U4srEJwbSpGzfF+CegQ==
-"@spectrum-css/vars@^8.0.0":
- version "8.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/vars/-/vars-8.0.4.tgz#dcf115551f240b25ba629a3b6c4d3eb1429bee15"
- integrity sha512-3jYj5HYxbVfkR4jLV9l+L3g6jS4R09m0lV+gupqnXWpwcThlP0EOjkCkevu195imoS4pZ/i2iLpd98l4qcTc2Q==
-
"@sveltejs/vite-plugin-svelte@1.4.0":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.4.0.tgz#412a735de489ca731d0c780c2b410f45dd95b392"
@@ -5756,9 +5746,9 @@
integrity sha512-7GgtHCs/QZrBrDzgIJnQtuSvhFSwhyYSI2uafSwZoNt1iOGhEN5fwNrQMjtONyHm9+/LoA4453jH0CMYcr06Pg==
"@types/node@>=8.1.0":
- version "20.11.10"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.10.tgz#6c3de8974d65c362f82ee29db6b5adf4205462f9"
- integrity sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==
+ version "20.12.4"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.4.tgz#af5921bd75ccdf3a3d8b3fa75bf3d3359268cd11"
+ integrity sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==
dependencies:
undici-types "~5.26.4"
@@ -8202,6 +8192,17 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5:
get-intrinsic "^1.2.1"
set-function-length "^1.1.1"
+call-bind@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+ integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.1"
+
call-me-maybe@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
@@ -9660,6 +9661,15 @@ define-data-property@^1.0.1, define-data-property@^1.1.0, define-data-property@^
gopd "^1.0.1"
has-property-descriptors "^1.0.0"
+define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
define-lazy-prop@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
@@ -10138,9 +10148,9 @@ dotenv@8.6.0, dotenv@^8.2.0:
integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
dotenv@^16.3.1:
- version "16.4.1"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.1.tgz#1d9931f1d3e5d2959350d1250efab299561f7f11"
- integrity sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==
+ version "16.4.5"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
+ integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
dotenv@~10.0.0:
version "10.0.0"
@@ -10509,6 +10519,18 @@ es-aggregate-error@^1.0.9:
has-property-descriptors "^1.0.0"
set-function-name "^2.0.1"
+es-define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+ integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
es-get-iterator@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6"
@@ -11189,9 +11211,9 @@ fast-xml-parser@4.2.5:
strnum "^1.0.5"
fast-xml-parser@^4.1.3:
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.3.3.tgz#aeaf5778392329f17168c40c51bcbfec8ff965be"
- integrity sha512-coV/D1MhrShMvU6D0I+VAK3umz6hUaxxhL0yp/9RjfiYUfAv14rDhGQL+PLForhMdr0wq3PiV07WtkkNjJjNHg==
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz#190f9d99097f0c8f2d3a0e681a10404afca052ff"
+ integrity sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==
dependencies:
strnum "^1.0.5"
@@ -11419,11 +11441,6 @@ flat@^5.0.2:
resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
-flatpickr@^4.5.2:
- version "4.6.13"
- resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.13.tgz#8a029548187fd6e0d670908471e43abe9ad18d94"
- integrity sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==
-
flatted@^3.1.0:
version "3.2.5"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
@@ -11521,9 +11538,9 @@ formidable@^2.1.2:
qs "^6.11.0"
fp-ts@^2.5.1:
- version "2.16.2"
- resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.2.tgz#7faa90f6fc2e8cf84c711d2c4e606afe2be9e342"
- integrity sha512-CkqAjnIKFqvo3sCyoBTqgJvF+bHrSik584S9nhTjtBESLx26cbtVMR/T9a6ApChOcSDAaM3JydDmWDUn4EEXng==
+ version "2.16.5"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.5.tgz#d79b97168aeafcf9612f18bbc017f513ecb20ac9"
+ integrity sha512-N8T8PwMSeTKKtkm9lkj/zSTAnPC/aJIIrQhnHxxkL0KLsRCNUPANksJOlMXxcKKCo7H1ORP3No9EMD+fP0tsdA==
fresh@^0.5.2, fresh@~0.5.2:
version "0.5.2"
@@ -11590,7 +11607,7 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
-fsevents@^2.3.2, fsevents@~2.3.1, fsevents@~2.3.2:
+fsevents@^2.3.2, fsevents@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
@@ -11753,6 +11770,17 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@
has-symbols "^1.0.3"
hasown "^2.0.0"
+get-intrinsic@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+ integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
get-object@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/get-object/-/get-object-0.2.0.tgz#d92ff7d5190c64530cda0543dac63a3d47fe8c0c"
@@ -12373,6 +12401,13 @@ has-property-descriptors@^1.0.0:
dependencies:
get-intrinsic "^1.1.1"
+has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
has-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
@@ -18520,9 +18555,9 @@ pprof-format@^2.0.7:
integrity sha512-1qWaGAzwMpaXJP9opRa23nPnt2Egi7RMNoNBptEE/XwHbcn4fC2b/4U4bKc5arkGkIh2ZabpF2bEb+c5GNHEKA==
preact@^10.19.3:
- version "10.19.3"
- resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899"
- integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==
+ version "10.20.1"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.20.1.tgz#1bc598ab630d8612978f7533da45809a8298542b"
+ integrity sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==
prebuild-install@^7.1.1:
version "7.1.1"
@@ -18918,7 +18953,14 @@ q@^1.1.2:
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==
-qs@^6.10.3, qs@^6.11.0, qs@^6.4.0:
+qs@^6.10.3:
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.0.tgz#edd40c3b823995946a8a0b1f208669c7a200db77"
+ integrity sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==
+ dependencies:
+ side-channel "^1.0.6"
+
+qs@^6.11.0, qs@^6.4.0:
version "6.11.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9"
integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==
@@ -19714,13 +19756,6 @@ rollup-pluginutils@^2.3.1, rollup-pluginutils@^2.5.0, rollup-pluginutils@^2.8.1,
dependencies:
estree-walker "^0.6.1"
-rollup@2.45.2:
- version "2.45.2"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.45.2.tgz#8fb85917c9f35605720e92328f3ccbfba6f78b48"
- integrity sha512-kRRU7wXzFHUzBIv0GfoFFIN3m9oteY4uAsKllIpQDId5cfnkWF2J130l+27dzDju0E6MScKiV0ZM5Bw8m4blYQ==
- optionalDependencies:
- fsevents "~2.3.1"
-
rollup@^2.36.2, rollup@^2.45.2:
version "2.79.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
@@ -20000,6 +20035,18 @@ set-function-length@^1.1.1:
gopd "^1.0.1"
has-property-descriptors "^1.0.0"
+set-function-length@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
set-function-name@^2.0.0, set-function-name@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a"
@@ -20091,6 +20138,16 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
+side-channel@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
+ integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ object-inspect "^1.13.1"
+
siginfo@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30"
@@ -20678,7 +20735,16 @@ string-similarity@^4.0.4:
resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b"
integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==
-"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
+"string-width-cjs@npm:string-width@^4.2.0":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -20768,7 +20834,7 @@ stringify-object@^3.2.1:
is-obj "^1.0.1"
is-regexp "^1.0.0"
-"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -20782,6 +20848,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
strip-ansi@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
@@ -21020,20 +21093,6 @@ svelte-dnd-action@^0.9.8:
postcss "^8.4.29"
postcss-scss "^4.0.8"
-svelte-flatpickr@3.2.3:
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/svelte-flatpickr/-/svelte-flatpickr-3.2.3.tgz#db5dd7ad832ef83262b45e09737955ad3d591fc8"
- integrity sha512-PNkqK4Napx8nTvCwkaUXdnKo8dISThaxEOK+szTUXcY6H0dQM0TSyuoMaVWY2yX7pM+PN5cpCQCcVe8YvTRFSw==
- dependencies:
- flatpickr "^4.5.2"
-
-svelte-flatpickr@^3.3.4:
- version "3.3.4"
- resolved "https://registry.yarnpkg.com/svelte-flatpickr/-/svelte-flatpickr-3.3.4.tgz#80b1ed2d6bc37df78b1660404e9326bfc0a206f4"
- integrity sha512-i+QqJRs8zPRKsxv8r2GIk1fsb8cI3ozn3/aHXtViAoNKLy0j4PV7OSWavgEZC1wlAa34qi2hMkUh+vg6qt2DRA==
- dependencies:
- flatpickr "^4.5.2"
-
svelte-hmr@^0.15.1:
version "0.15.3"
resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.15.3.tgz#df54ccde9be3f091bf5f18fc4ef7b8eb6405fbe6"
@@ -22718,7 +22777,7 @@ worker-farm@1.7.0:
dependencies:
errno "~0.1.7"
-"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -22736,6 +22795,15 @@ wrap-ansi@^5.1.0:
string-width "^3.0.0"
strip-ansi "^5.0.0"
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
@@ -23117,9 +23185,9 @@ z-schema@^5.0.1:
commander "^9.4.1"
zeebe-node@^8.2.5:
- version "8.3.1"
- resolved "https://registry.yarnpkg.com/zeebe-node/-/zeebe-node-8.3.1.tgz#e100bf3708464e305305b4efa1ffde53f9786c45"
- integrity sha512-68ascWO3g7g+9WwDzvfa3I9TkLKHku5auEgSINP+k5ktNfsfGW68ELDmEJA+XHZgzvGsdGILZqGRzVd5SC8aaQ==
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/zeebe-node/-/zeebe-node-8.3.2.tgz#64d156b715f03f8637054aeedb3d3024b4a09db4"
+ integrity sha512-3/xbiTvhaa668JHtMEwELv5dN6HR7Qw8gzmCdjp3Brj6ekdhROVx8x/0JWKSV3Mx64ac3+eEc+9nB5+ZXcO/bg==
dependencies:
"@grpc/grpc-js" "1.9.7"
"@grpc/proto-loader" "0.7.10"