From b7e860c8b47490af30b91b5b3409d0ca2fb03bf8 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Mon, 16 Feb 2026 15:19:49 +1100 Subject: [PATCH] AP-7104 # Added salesforce picklist dynamic options --- CHANGELOG.md | 4 +++ package-lock.json | 16 ++++----- package.json | 2 +- src/apps/form-service.ts | 72 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6805215a7..d5c91c9b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- salesforce picklist dynamic options + ### Fixed - github action permissions to allow docs and github release jobs diff --git a/package-lock.json b/package-lock.json index e7fcd18a9..4e9a4ba6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@nylas/react": "^3.1.2", - "@oneblink/sdk-core": "^9.0.0", + "@oneblink/sdk-core": "^9.1.0-beta.2", "@oneblink/storage": "^5.0.0-beta.2", "@react-google-maps/api": "^2.20.8", "@react-input/mask": "^2.0.4", @@ -5028,9 +5028,9 @@ } }, "node_modules/@oneblink/sdk-core": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@oneblink/sdk-core/-/sdk-core-9.0.0.tgz", - "integrity": "sha512-k/al33qHiyts857eWN2KqZ+YO3Ms+obgwTXmo7k2MyeMii9wps3b5WXP3a9hxT50icAjLWVe10qQhGv99LNvmw==", + "version": "9.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@oneblink/sdk-core/-/sdk-core-9.1.0-beta.2.tgz", + "integrity": "sha512-TlHzOXhwsk2+cHOwVpO/fK07Uy3lCvDy02BJ+nXuQ8yt6pywa1eOvwnoiYWTxUmEqY17SmnlxMbiX7VqVkjZow==", "license": "GPL-3.0-only", "engines": { "node": ">=24", @@ -5054,7 +5054,7 @@ }, "node_modules/@oneblink/types": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/oneblink/types.git#f81919d5c609355523739b348b66e1ac2223ec51", + "resolved": "git+ssh://git@github.com/oneblink/types.git#796d45386f7219505ce72d14f1ff58460ad4eaac", "dev": true, "license": "GPL-3.0-only", "dependencies": { @@ -13408,9 +13408,9 @@ "dev": true }, "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index bf1c09ac4..cf8ffd670 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@nylas/react": "^3.1.2", - "@oneblink/sdk-core": "^9.0.0", + "@oneblink/sdk-core": "^9.1.0-beta.2", "@oneblink/storage": "^5.0.0-beta.2", "@react-google-maps/api": "^2.20.8", "@react-input/mask": "^2.0.4", diff --git a/src/apps/form-service.ts b/src/apps/form-service.ts index 57b7871f4..b18c27b99 100644 --- a/src/apps/form-service.ts +++ b/src/apps/form-service.ts @@ -620,6 +620,78 @@ async function getFormElementOptionsSetOptions( } } } + case 'SALESFORCE_PICKLIST': { + const formElementOptionSetEnvironmentSalesforcePicklist = + formElementOptionsSet.environments.find( + (environment) => + environment.formsAppEnvironmentId === formsAppEnvironmentId, + ) + if (!formElementOptionSetEnvironmentSalesforcePicklist) { + return { + type: 'ERROR', + error: new OneBlinkAppsError( + `Dynamic list configuration has not been completed yet. Please contact your administrator to rectify the issue.`, + { + title: 'Misconfigured Dynamic List', + originalError: new Error( + JSON.stringify( + { + formElementOptionsSetId: formElementOptionsSet.id, + formElementOptionsSetName: formElementOptionsSet.name, + formsAppEnvironmentId, + }, + null, + 2, + ), + ), + }, + ), + } + } + + try { + const { options } = await getRequest<{ options: unknown }>( + `${tenants.current.apiOrigin}/forms/${formId}/salesforce-picklist-options?formElementOptionsSetId=${formElementOptionsSet.id}`, + abortSignal, + ) + return { + type: 'OPTIONS', + options, + } + } catch (error) { + Sentry.captureException(error) + return { + type: 'ERROR', + error: new OneBlinkAppsError( + `Options could not be loaded. Please contact your administrator to rectify the issue.`, + { + title: 'Invalid List Response', + httpStatusCode: (error as HTTPError).status, + originalError: new OneBlinkAppsError( + JSON.stringify( + { + formsAppEnvironmentId, + formElementOptionsSetId: formElementOptionsSet.id, + formElementOptionsSetName: formElementOptionsSet.name, + salesforceObject: + formElementOptionSetEnvironmentSalesforcePicklist.object + .label, + salesforceField: + formElementOptionSetEnvironmentSalesforcePicklist.field + .label, + }, + null, + 2, + ), + { + originalError: error as HTTPError, + }, + ), + }, + ), + } + } + } case 'GOOD_TO_GO_CUSTOM_FIELD': { const formElementOptionSetEnvironmentGoodToGoCustomField = formElementOptionsSet.environments.find(