From 8cf76dff84251756c67f4e8e0d2ff9ec1abcc435 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 14 Mar 2025 14:23:26 +0100 Subject: [PATCH 01/16] Type confirm dialog --- .../components/common/ConfirmDialog.svelte | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/builder/src/components/common/ConfirmDialog.svelte b/packages/builder/src/components/common/ConfirmDialog.svelte index f864b60fc6..e6dc78829b 100644 --- a/packages/builder/src/components/common/ConfirmDialog.svelte +++ b/packages/builder/src/components/common/ConfirmDialog.svelte @@ -1,16 +1,16 @@ - Date: Fri, 14 Mar 2025 14:32:21 +0100 Subject: [PATCH 03/16] Save before leaving --- .../integration/RestQueryViewer.svelte | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/builder/src/components/integration/RestQueryViewer.svelte b/packages/builder/src/components/integration/RestQueryViewer.svelte index 9508ca4005..4ca2a3012a 100644 --- a/packages/builder/src/components/integration/RestQueryViewer.svelte +++ b/packages/builder/src/components/integration/RestQueryViewer.svelte @@ -209,11 +209,14 @@ originalQuery = null queryNameLabel.disableEditingState() + return { ok: true } } catch (err) { notifications.error(`Error saving query`) } finally { saving = false } + + return { ok: false } } const validateQuery = async () => { @@ -482,7 +485,7 @@ return true } - return new Promise(resolve => { + const shouldSave = await new Promise(resolve => { const dialog = new ConfirmDialog({ target: document.body, props: { @@ -503,6 +506,19 @@ }) dialog.show() }) + + if (!shouldSave) { + // Leave without saving anything + return true + } + + const saveResult = await saveQuery() + if (!saveResult.ok) { + // We can't leave as the query was not properly saved + return false + } + + return true }) From 7f4d7a577cd772882f5ba86a380df45c50a3a3c6 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 14 Mar 2025 14:40:41 +0100 Subject: [PATCH 04/16] Create confirm utils --- .../integration/RestQueryViewer.svelte | 29 +++++------------ packages/builder/src/helpers/confirm.ts | 31 +++++++++++++++++++ packages/builder/src/helpers/index.ts | 1 + 3 files changed, 39 insertions(+), 22 deletions(-) create mode 100644 packages/builder/src/helpers/confirm.ts diff --git a/packages/builder/src/components/integration/RestQueryViewer.svelte b/packages/builder/src/components/integration/RestQueryViewer.svelte index 4ca2a3012a..d4119dd3bb 100644 --- a/packages/builder/src/components/integration/RestQueryViewer.svelte +++ b/packages/builder/src/components/integration/RestQueryViewer.svelte @@ -25,7 +25,7 @@ EditorModes, } from "@/components/common/CodeMirrorEditor.svelte" import RestBodyInput from "./RestBodyInput.svelte" - import { capitalise } from "@/helpers" + import { capitalise, confirm } from "@/helpers" import { onMount } from "svelte" import restUtils from "@/helpers/data/utils" import { @@ -37,7 +37,6 @@ } from "@/constants/backend" import JSONPreview from "@/components/integration/JSONPreview.svelte" import AccessLevelSelect from "@/components/integration/AccessLevelSelect.svelte" - import ConfirmDialog from "@/components/common/ConfirmDialog.svelte" import DynamicVariableModal from "./DynamicVariableModal.svelte" import Placeholder from "assets/bb-spaceship.svg" import { cloneDeep } from "lodash/fp" @@ -485,26 +484,12 @@ return true } - const shouldSave = await new Promise(resolve => { - const dialog = new ConfirmDialog({ - target: document.body, - props: { - title: "Some updates are not saved", - body: "Some of your changes are not yet saved. Do you want to save them before leaving?", - okText: "Save and continue", - cancelText: "Discard and continue", - size: "M", - onOk: () => { - dialog.$destroy() - resolve(true) - }, - onCancel: () => { - dialog.$destroy() - resolve(false) - }, - }, - }) - dialog.show() + const shouldSave = await confirm({ + title: "Some updates are not saved", + body: "Some of your changes are not yet saved. Do you want to save them before leaving?", + okText: "Save and continue", + cancelText: "Discard and continue", + size: "M", }) if (!shouldSave) { diff --git a/packages/builder/src/helpers/confirm.ts b/packages/builder/src/helpers/confirm.ts new file mode 100644 index 0000000000..305261c126 --- /dev/null +++ b/packages/builder/src/helpers/confirm.ts @@ -0,0 +1,31 @@ +import ConfirmDialog from "@/components/common/ConfirmDialog.svelte" + +export async function confirm(props: { + title: string + body?: string + okText?: string + cancelText?: string + size?: "S" | "M" | "L" | "XL" +}) { + return await new Promise(resolve => { + const dialog = new ConfirmDialog({ + target: document.body, + props: { + title: props.title, + body: props.body, + okText: props.okText, + cancelText: props.cancelText, + size: props.size, + onOk: () => { + dialog.$destroy() + resolve(true) + }, + onCancel: () => { + dialog.$destroy() + resolve(false) + }, + }, + }) + dialog.show() + }) +} diff --git a/packages/builder/src/helpers/index.ts b/packages/builder/src/helpers/index.ts index 0e61eeb9c6..717d9cdd85 100644 --- a/packages/builder/src/helpers/index.ts +++ b/packages/builder/src/helpers/index.ts @@ -11,3 +11,4 @@ export { } from "./helpers" export * as featureFlag from "./featureFlags" export * as bindings from "./bindings" +export * from "./confirm" From 7598d524c504d725214f7caed6abae7660b4ecbf Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 14 Mar 2025 14:49:23 +0100 Subject: [PATCH 05/16] Handle onClose --- .../components/common/ConfirmDialog.svelte | 4 ++- .../integration/RestQueryViewer.svelte | 31 ++++++++++--------- packages/builder/src/helpers/confirm.ts | 13 ++++++-- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/packages/builder/src/components/common/ConfirmDialog.svelte b/packages/builder/src/components/common/ConfirmDialog.svelte index 8d383cf581..1c58fb3f7c 100644 --- a/packages/builder/src/components/common/ConfirmDialog.svelte +++ b/packages/builder/src/components/common/ConfirmDialog.svelte @@ -8,6 +8,7 @@ export let size: "S" | "M" | "L" | "XL" | undefined = undefined export let onOk: (() => void) | undefined = undefined export let onCancel: (() => void) | undefined = undefined + export let onClose: (() => void) | undefined = undefined export let warning: boolean = true export let disabled: boolean = false @@ -21,9 +22,10 @@ } - + { + const saveResult = await saveQuery() + if (!saveResult.ok) { + // We can't leave as the query was not properly saved + return false + } + + return true + }, + onCancel: () => { + // Leave without saving anything + return true + }, + onClose: () => { + return false + }, }) - - if (!shouldSave) { - // Leave without saving anything - return true - } - - const saveResult = await saveQuery() - if (!saveResult.ok) { - // We can't leave as the query was not properly saved - return false - } - - return true }) diff --git a/packages/builder/src/helpers/confirm.ts b/packages/builder/src/helpers/confirm.ts index 305261c126..72a379303d 100644 --- a/packages/builder/src/helpers/confirm.ts +++ b/packages/builder/src/helpers/confirm.ts @@ -1,11 +1,16 @@ import ConfirmDialog from "@/components/common/ConfirmDialog.svelte" +export enum ConfirmOutput {} + export async function confirm(props: { title: string body?: string okText?: string cancelText?: string size?: "S" | "M" | "L" | "XL" + onConfirm?: () => void + onCancel?: () => void + onClose?: () => void }) { return await new Promise(resolve => { const dialog = new ConfirmDialog({ @@ -18,11 +23,15 @@ export async function confirm(props: { size: props.size, onOk: () => { dialog.$destroy() - resolve(true) + resolve(props.onConfirm?.() || true) }, onCancel: () => { dialog.$destroy() - resolve(false) + resolve(props.onCancel?.() || false) + }, + onClose: () => { + dialog.$destroy() + resolve(props.onClose?.() || false) }, }, }) From e705a23b74b7f1fa2c479ad4e35aaeb898bf45e6 Mon Sep 17 00:00:00 2001 From: melohagan <101575380+melohagan@users.noreply.github.com> Date: Fri, 14 Mar 2025 14:24:07 +0000 Subject: [PATCH 06/16] Bind the password form (#15748) * Bind the password form * Type fixes --- .../builder/src/pages/builder/auth/reset.svelte | 1 + .../src/components/PasswordRepeatInput.svelte | 13 +++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/builder/src/pages/builder/auth/reset.svelte b/packages/builder/src/pages/builder/auth/reset.svelte index ce2063c230..12786fa4f5 100644 --- a/packages/builder/src/pages/builder/auth/reset.svelte +++ b/packages/builder/src/pages/builder/auth/reset.svelte @@ -79,6 +79,7 @@ Reset your password Must contain at least 12 characters + - + Date: Fri, 14 Mar 2025 14:56:01 +0000 Subject: [PATCH 07/16] Support converting nested UI filters into queries, add tests, improve types and fix relationship pickers with filters applied caching options incorrectly --- .../app/forms/RelationshipField.svelte | 109 ++++++++---- packages/shared-core/src/filters.ts | 58 ++++--- .../shared-core/src/tests/filters.spec.ts | 156 ++++++++++++++++++ packages/types/src/api/web/searchFilter.ts | 15 +- 4 files changed, 284 insertions(+), 54 deletions(-) create mode 100644 packages/shared-core/src/tests/filters.spec.ts diff --git a/packages/client/src/components/app/forms/RelationshipField.svelte b/packages/client/src/components/app/forms/RelationshipField.svelte index b5906b72fa..41a9614843 100644 --- a/packages/client/src/components/app/forms/RelationshipField.svelte +++ b/packages/client/src/components/app/forms/RelationshipField.svelte @@ -1,17 +1,27 @@ + +