From 6b5938aef6aa4021a12d2270627a736d0a6910a4 Mon Sep 17 00:00:00 2001 From: Dean Date: Fri, 22 Mar 2024 15:26:05 +0000 Subject: [PATCH 01/27] Merging --- packages/backend-core/src/environment.ts | 2 +- packages/bbui/src/Form/Core/Signature.svelte | 140 +++++++++++++++++ packages/bbui/src/Form/Core/index.js | 1 + .../DataTable/modals/CreateEditColumn.svelte | 1 + .../design/settings/componentSettings.js | 1 + .../controls/FieldConfiguration/utils.js | 1 + .../builder/src/constants/backend/index.js | 10 ++ .../new/_components/componentStructure.json | 1 + .../builder/src/templates/commonComponents.js | 1 + packages/client/manifest.json | 49 ++++++ .../app/blocks/FormBlockComponent.svelte | 1 + .../src/components/app/forms/Signature.svelte | 8 + .../app/forms/SignatureField.svelte | 6 + .../client/src/components/app/forms/index.js | 1 + .../grid/cells/SignatureCell.svelte | 143 ++++++++++++++++++ .../src/components/grid/lib/renderers.js | 2 + .../src/components/grid/lib/utils.js | 2 +- .../server/src/utilities/rowProcessor/map.ts | 8 + packages/shared-core/src/table.ts | 2 + packages/types/src/documents/app/row.ts | 1 + 20 files changed, 379 insertions(+), 2 deletions(-) create mode 100644 packages/bbui/src/Form/Core/Signature.svelte create mode 100644 packages/client/src/components/app/forms/Signature.svelte create mode 100644 packages/client/src/components/app/forms/SignatureField.svelte create mode 100644 packages/frontend-core/src/components/grid/cells/SignatureCell.svelte diff --git a/packages/backend-core/src/environment.ts b/packages/backend-core/src/environment.ts index 2da2a77d67..2f45c4a881 100644 --- a/packages/backend-core/src/environment.ts +++ b/packages/backend-core/src/environment.ts @@ -104,7 +104,7 @@ const environment = { JS_BCRYPT: process.env.JS_BCRYPT, JWT_SECRET: process.env.JWT_SECRET, JWT_SECRET_FALLBACK: process.env.JWT_SECRET_FALLBACK, - ENCRYPTION_KEY: process.env.ENCRYPTION_KEY, + ENCRYPTION_KEY: "wgeBLcM6sXQTmaH0UtjpO+hCQhCBDn/c7GQHlnqgPCc=", API_ENCRYPTION_KEY: getAPIEncryptionKey(), COUCH_DB_URL: process.env.COUCH_DB_URL || "http://localhost:4005", COUCH_DB_SQL_URL: process.env.COUCH_DB_SQL_URL || "http://localhost:4984", diff --git a/packages/bbui/src/Form/Core/Signature.svelte b/packages/bbui/src/Form/Core/Signature.svelte new file mode 100644 index 0000000000..74a022881c --- /dev/null +++ b/packages/bbui/src/Form/Core/Signature.svelte @@ -0,0 +1,140 @@ + + + +
+
{JSON.stringify(debugData, null, 2)}
+ { + touching = true + canvasMouseDown(e) + }} + on:touchend={e => { + touching = false + touchmove = false + stopTracking(e) + }} + on:touchmove={e => { + touchmove = true + handleDraw(e) + }} + on:touchleave={e => { + touching = false + touchmove = false + stopTracking(e) + }} + class:touching={touching && debug} + class:touchmove={touchmove && debug} + /> +
+ + diff --git a/packages/bbui/src/Form/Core/index.js b/packages/bbui/src/Form/Core/index.js index b0edf52748..806f15f1bf 100644 --- a/packages/bbui/src/Form/Core/index.js +++ b/packages/bbui/src/Form/Core/index.js @@ -14,3 +14,4 @@ export { default as CoreStepper } from "./Stepper.svelte" export { default as CoreRichTextField } from "./RichTextField.svelte" export { default as CoreSlider } from "./Slider.svelte" export { default as CoreFile } from "./File.svelte" +export { default as CoreSignature } from "./Signature.svelte" diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte index f6a4f29a06..796c805232 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte @@ -385,6 +385,7 @@ return [ FIELDS.STRING, FIELDS.BARCODEQR, + FIELDS.SIGNATURE, FIELDS.LONGFORM, FIELDS.OPTIONS, FIELDS.ARRAY, diff --git a/packages/builder/src/components/design/settings/componentSettings.js b/packages/builder/src/components/design/settings/componentSettings.js index f2d1520878..f6ff78b666 100644 --- a/packages/builder/src/components/design/settings/componentSettings.js +++ b/packages/builder/src/components/design/settings/componentSettings.js @@ -72,6 +72,7 @@ const componentMap = { "field/array": FormFieldSelect, "field/json": FormFieldSelect, "field/barcodeqr": FormFieldSelect, + "field/signature": FormFieldSelect, "field/bb_reference": FormFieldSelect, // Some validation types are the same as others, so not all types are // explicitly listed here. e.g. options uses string validation diff --git a/packages/builder/src/components/design/settings/controls/FieldConfiguration/utils.js b/packages/builder/src/components/design/settings/controls/FieldConfiguration/utils.js index c929263db1..420d542028 100644 --- a/packages/builder/src/components/design/settings/controls/FieldConfiguration/utils.js +++ b/packages/builder/src/components/design/settings/controls/FieldConfiguration/utils.js @@ -43,5 +43,6 @@ export const FieldTypeToComponentMap = { link: "relationshipfield", json: "jsonfield", barcodeqr: "codescanner", + signature: "signaturefield", bb_reference: "bbreferencefield", } diff --git a/packages/builder/src/constants/backend/index.js b/packages/builder/src/constants/backend/index.js index f1e3e1e2c2..edf49262d0 100644 --- a/packages/builder/src/constants/backend/index.js +++ b/packages/builder/src/constants/backend/index.js @@ -114,6 +114,16 @@ export const FIELDS = { presence: false, }, }, + // USE the single approach like Adrias update + SIGNATURE: { + name: "Signature", + type: FieldType.SIGNATURE, + icon: "AnnotatePen", + constraints: { + type: "array", + presence: false, + }, + }, LINK: { name: "Relationship", type: FieldType.LINK, diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/componentStructure.json b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/componentStructure.json index 96e8faf93c..7621aa763d 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/componentStructure.json +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/new/_components/componentStructure.json @@ -72,6 +72,7 @@ "multifieldselect", "s3upload", "codescanner", + "signaturefield", "bbreferencefield" ] }, diff --git a/packages/builder/src/templates/commonComponents.js b/packages/builder/src/templates/commonComponents.js index 1a953224a7..63a0c93f66 100644 --- a/packages/builder/src/templates/commonComponents.js +++ b/packages/builder/src/templates/commonComponents.js @@ -13,6 +13,7 @@ const fieldTypeToComponentMap = { attachment: "attachmentfield", link: "relationshipfield", json: "jsonfield", + signature: "signaturefield", barcodeqr: "codescanner", } diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 531e2c968a..3dd308a27b 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -4112,6 +4112,55 @@ } ] }, + "signaturefield": { + "name": "Signature", + "icon": "AnnotatePen", + "styles": ["size"], + "size": { + "width": 400, + "height": 50 + }, + "settings": [ + { + "type": "field/signature", + "label": "Field", + "key": "field", + "required": true + }, + { + "type": "text", + "label": "Label", + "key": "label" + }, + { + "type": "text", + "label": "Help text", + "key": "helpText" + }, + { + "type": "boolean", + "label": "Disabled", + "key": "disabled", + "defaultValue": false + }, + { + "type": "event", + "label": "On change", + "key": "onChange", + "context": [ + { + "label": "Field Value", + "key": "value" + } + ] + }, + { + "type": "validation/string", + "label": "Validation", + "key": "validation" + } + ] + }, "embeddedmap": { "name": "Embedded Map", "icon": "Location", diff --git a/packages/client/src/components/app/blocks/FormBlockComponent.svelte b/packages/client/src/components/app/blocks/FormBlockComponent.svelte index ea1c3b0a37..dff49fb43e 100644 --- a/packages/client/src/components/app/blocks/FormBlockComponent.svelte +++ b/packages/client/src/components/app/blocks/FormBlockComponent.svelte @@ -19,6 +19,7 @@ link: "relationshipfield", json: "jsonfield", barcodeqr: "codescanner", + signature: "signaturefield", bb_reference: "bbreferencefield", } diff --git a/packages/client/src/components/app/forms/Signature.svelte b/packages/client/src/components/app/forms/Signature.svelte new file mode 100644 index 0000000000..9f43fe181b --- /dev/null +++ b/packages/client/src/components/app/forms/Signature.svelte @@ -0,0 +1,8 @@ + + +
+ Sig Wrap + +
diff --git a/packages/client/src/components/app/forms/SignatureField.svelte b/packages/client/src/components/app/forms/SignatureField.svelte new file mode 100644 index 0000000000..6f9203bfbb --- /dev/null +++ b/packages/client/src/components/app/forms/SignatureField.svelte @@ -0,0 +1,6 @@ + + +
SignatureField
+ diff --git a/packages/client/src/components/app/forms/index.js b/packages/client/src/components/app/forms/index.js index 5804d3a79d..69acd3a627 100644 --- a/packages/client/src/components/app/forms/index.js +++ b/packages/client/src/components/app/forms/index.js @@ -15,4 +15,5 @@ export { default as formstep } from "./FormStep.svelte" export { default as jsonfield } from "./JSONField.svelte" export { default as s3upload } from "./S3Upload.svelte" export { default as codescanner } from "./CodeScannerField.svelte" +export { default as signaturefield } from "./SignatureField.svelte" export { default as bbreferencefield } from "./BBReferenceField.svelte" diff --git a/packages/frontend-core/src/components/grid/cells/SignatureCell.svelte b/packages/frontend-core/src/components/grid/cells/SignatureCell.svelte new file mode 100644 index 0000000000..ff133d7946 --- /dev/null +++ b/packages/frontend-core/src/components/grid/cells/SignatureCell.svelte @@ -0,0 +1,143 @@ + + + + +
+ signature cell: open {isOpen} +
+ +{#if isOpen} +
+ +
+ { + console.log("cell change") + }} + /> +
+
+{/if} + + diff --git a/packages/frontend-core/src/components/grid/lib/renderers.js b/packages/frontend-core/src/components/grid/lib/renderers.js index f5d4cfe297..3c10e47b44 100644 --- a/packages/frontend-core/src/components/grid/lib/renderers.js +++ b/packages/frontend-core/src/components/grid/lib/renderers.js @@ -10,12 +10,14 @@ import FormulaCell from "../cells/FormulaCell.svelte" import JSONCell from "../cells/JSONCell.svelte" import AttachmentCell from "../cells/AttachmentCell.svelte" import BBReferenceCell from "../cells/BBReferenceCell.svelte" +import SignatureCell from "../cells/SignatureCell.svelte" const TypeComponentMap = { text: TextCell, options: OptionsCell, datetime: DateCell, barcodeqr: TextCell, + signature: SignatureCell, longform: LongFormCell, array: MultiSelectCell, number: NumberCell, diff --git a/packages/frontend-core/src/components/grid/lib/utils.js b/packages/frontend-core/src/components/grid/lib/utils.js index 80bc3d9d67..5a87ae1ed1 100644 --- a/packages/frontend-core/src/components/grid/lib/utils.js +++ b/packages/frontend-core/src/components/grid/lib/utils.js @@ -10,6 +10,7 @@ const TypeIconMap = { options: "Dropdown", datetime: "Date", barcodeqr: "Camera", + signature: "AnnotatePen", longform: "TextAlignLeft", array: "Dropdown", number: "123", @@ -30,7 +31,6 @@ export const getColumnIcon = column => { return "MagicWand" } const { type, subtype } = column.schema - const result = typeof TypeIconMap[type] === "object" && subtype ? TypeIconMap[type][subtype] diff --git a/packages/server/src/utilities/rowProcessor/map.ts b/packages/server/src/utilities/rowProcessor/map.ts index 60fe5a001b..54198fd900 100644 --- a/packages/server/src/utilities/rowProcessor/map.ts +++ b/packages/server/src/utilities/rowProcessor/map.ts @@ -113,6 +113,14 @@ export const TYPE_TRANSFORM_MAP: any = { [undefined]: undefined, parse: parseArrayString, }, + //Review this + [FieldType.SIGNATURE]: { + //@ts-ignore + [null]: [], + //@ts-ignore + [undefined]: undefined, + parse: parseArrayString, + }, [FieldType.BOOLEAN]: { "": null, //@ts-ignore diff --git a/packages/shared-core/src/table.ts b/packages/shared-core/src/table.ts index 5eab2fc340..c17ff36174 100644 --- a/packages/shared-core/src/table.ts +++ b/packages/shared-core/src/table.ts @@ -15,6 +15,7 @@ const allowDisplayColumnByType: Record = { [FieldType.BOOLEAN]: false, [FieldType.ARRAY]: false, [FieldType.ATTACHMENT]: false, + [FieldType.SIGNATURE]: false, [FieldType.LINK]: false, [FieldType.JSON]: false, [FieldType.BB_REFERENCE]: false, @@ -35,6 +36,7 @@ const allowSortColumnByType: Record = { [FieldType.FORMULA]: false, [FieldType.ATTACHMENT]: false, + [FieldType.SIGNATURE]: false, [FieldType.ARRAY]: false, [FieldType.LINK]: false, [FieldType.BB_REFERENCE]: false, diff --git a/packages/types/src/documents/app/row.ts b/packages/types/src/documents/app/row.ts index b37412398d..5f99787faf 100644 --- a/packages/types/src/documents/app/row.ts +++ b/packages/types/src/documents/app/row.ts @@ -15,6 +15,7 @@ export enum FieldType { JSON = "json", INTERNAL = "internal", BARCODEQR = "barcodeqr", + SIGNATURE = "signature", BIGINT = "bigint", BB_REFERENCE = "bb_reference", } From 1e5506b8c3a35f29ef08ce15af9324242bc948be Mon Sep 17 00:00:00 2001 From: Dean Date: Fri, 5 Apr 2024 12:50:09 +0100 Subject: [PATCH 02/27] Full support for signature field type and some feedback changes --- packages/bbui/src/Form/Core/Signature.svelte | 313 +++++++++++++----- packages/bbui/src/Modal/Modal.svelte | 1 + packages/bbui/src/Modal/ModalContent.svelte | 23 +- .../backend/DataTable/TableDataTable.svelte | 5 + .../components/backend/DataTable/formula.js | 1 + .../design/settings/componentSettings.js | 1 + .../ValidationEditor/ValidationDrawer.svelte | 1 + .../builder/src/constants/backend/index.js | 1 - packages/client/manifest.json | 2 +- .../client/src/components/Component.svelte | 3 + .../src/components/app/GridBlock.svelte | 2 + .../src/components/app/forms/Signature.svelte | 8 - .../app/forms/SignatureField.svelte | 140 +++++++- .../src/components/app/forms/validation.js | 4 +- .../src/components/SignatureModal.svelte | 48 +++ .../grid/cells/SignatureCell.svelte | 146 +++++--- .../src/components/grid/layout/Grid.svelte | 2 + .../frontend-core/src/components/index.js | 1 + packages/server/src/sdk/app/rows/utils.ts | 6 +- .../src/utilities/rowProcessor/attachments.ts | 11 +- .../src/utilities/rowProcessor/index.ts | 12 +- 21 files changed, 572 insertions(+), 159 deletions(-) delete mode 100644 packages/client/src/components/app/forms/Signature.svelte create mode 100644 packages/frontend-core/src/components/SignatureModal.svelte diff --git a/packages/bbui/src/Form/Core/Signature.svelte b/packages/bbui/src/Form/Core/Signature.svelte index 74a022881c..de73c803ad 100644 --- a/packages/bbui/src/Form/Core/Signature.svelte +++ b/packages/bbui/src/Form/Core/Signature.svelte @@ -1,65 +1,80 @@ - -
-
{JSON.stringify(debugData, null, 2)}
- { - touching = true - canvasMouseDown(e) - }} - on:touchend={e => { - touching = false - touchmove = false - stopTracking(e) - }} - on:touchmove={e => { - touchmove = true - handleDraw(e) - }} - on:touchleave={e => { - touching = false - touchmove = false - stopTracking(e) - }} - class:touching={touching && debug} - class:touchmove={touchmove && debug} - /> +
+ {#if !disabled} +
+ {#if updated && saveIcon} + + { + dispatch("change", toDataUrl()) + }} + /> + + {/if} + {#if signature?.url && !updated} + + { + if (editable) { + clearCanvas() + } + dispatch("clear") + }} + /> + + {/if} +
+ {/if} + {#if !editable && signature?.url} + + {#if !urlFailed} + { + urlFailed = true + }} + /> + {:else} + Could not load signature + {/if} + {:else} +
+ + {#if editable} +
+
+ +
+
+
+ {/if} +
+ {/if}
diff --git a/packages/bbui/src/Modal/Modal.svelte b/packages/bbui/src/Modal/Modal.svelte index be9c338892..4656be69d1 100644 --- a/packages/bbui/src/Modal/Modal.svelte +++ b/packages/bbui/src/Modal/Modal.svelte @@ -173,6 +173,7 @@ } .spectrum-Modal { + border: 2px solid var(--spectrum-global-color-gray-200); overflow: visible; max-height: none; margin: 40px 0; diff --git a/packages/bbui/src/Modal/ModalContent.svelte b/packages/bbui/src/Modal/ModalContent.svelte index 189ef70c2b..ecad889031 100644 --- a/packages/bbui/src/Modal/ModalContent.svelte +++ b/packages/bbui/src/Modal/ModalContent.svelte @@ -27,6 +27,7 @@ export let secondaryButtonText = undefined export let secondaryAction = undefined export let secondaryButtonWarning = false + export let enableGrid = true const { hide, cancel } = getContext(Context.Modal) let loading = false @@ -63,12 +64,13 @@ class:spectrum-Dialog--medium={size === "M"} class:spectrum-Dialog--large={size === "L"} class:spectrum-Dialog--extraLarge={size === "XL"} + class:no-grid={!enableGrid} style="position: relative;" role="dialog" tabindex="-1" aria-modal="true" > -
+