From b1471564aa81d639275a1dbf122ffd96aef55c58 Mon Sep 17 00:00:00 2001 From: sourabh-stackone Date: Sun, 28 Jun 2026 15:28:25 +0530 Subject: [PATCH 1/4] feat(ENG-12049): scopes actions to speific auth types --- .../components/IntegrationFields.tsx | 62 +++++++++++++++++++ src/modules/integration-picker/types.ts | 4 +- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/modules/integration-picker/components/IntegrationFields.tsx b/src/modules/integration-picker/components/IntegrationFields.tsx index 892b727..6570c7e 100644 --- a/src/modules/integration-picker/components/IntegrationFields.tsx +++ b/src/modules/integration-picker/components/IntegrationFields.tsx @@ -10,6 +10,8 @@ import { FlexJustify, Form, Input, + MultiSelect, + type MultiSelectOption, Padded, Spacer, TextArea, @@ -198,9 +200,69 @@ const FieldRenderer: React.FC = ({ ); } + if (field.type === 'multi-select') { + return ( + + ); + } + return null; }; +/** Multi-select field using Malachite MultiSelect with defaultValue (uncontrolled mode) */ +const MultiSelectField: React.FC<{ + field: ConnectorConfigField; + fieldKey: string; + errors: FieldErrors; + setValue: UseFormSetValue>; +}> = ({ field, fieldKey, errors, setValue }) => { + const delimiter = field.delimiter ?? ' '; + const initialValue = field.value?.toString() || ''; + const defaultValues = initialValue ? initialValue.split(delimiter).filter(Boolean) : []; + + const multiSelectOptions: MultiSelectOption[] = (field.options ?? []).map((opt) => ({ + value: opt.value, + label: opt.label, + })); + + const errorMessage = errors[fieldKey] && ( + + {errors[fieldKey]?.message as string} + + ); + + return ( + <> + { + setValue(fieldKey, selected.join(delimiter), { + shouldValidate: true, + }); + }} + placeholder={field.placeholder || 'Select...'} + size="medium" + error={!!errors[fieldKey]} + name={fieldKey} + label={field.label} + description={field.guide?.description ?? field.description} + tooltip={field.guide?.tooltip ?? field.tooltip} + required={field.required} + chips + chipsMax={4} + inlineSearch + /> + {errorMessage} + + ); +}; + const ErrorBlock = ({ error }: { error?: { message: string; provider_response: string } }) => { if (!error) { return null; diff --git a/src/modules/integration-picker/types.ts b/src/modules/integration-picker/types.ts index bf7543c..bc0bbd5 100644 --- a/src/modules/integration-picker/types.ts +++ b/src/modules/integration-picker/types.ts @@ -18,7 +18,7 @@ export interface HubData { } export interface ConnectorConfigField { - type?: 'text' | 'password' | 'number' | 'select' | 'text_area'; + type?: 'text' | 'password' | 'number' | 'select' | 'multi-select' | 'text_area'; label: string; key: string; required: boolean; @@ -43,6 +43,8 @@ export interface ConnectorConfigField { error?: string; }; display?: boolean; + /** Delimiter for joining multi-select values. Defaults to space. */ + delimiter?: string; } export interface LegacyConnectorConfig { From d29726db152f2f0f76b96c91468b50cb6f81fe05 Mon Sep 17 00:00:00 2001 From: sourabh-stackone Date: Sun, 28 Jun 2026 15:28:44 +0530 Subject: [PATCH 2/4] lint fixes --- .../integration-picker/components/IntegrationFields.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/modules/integration-picker/components/IntegrationFields.tsx b/src/modules/integration-picker/components/IntegrationFields.tsx index 6570c7e..0a35695 100644 --- a/src/modules/integration-picker/components/IntegrationFields.tsx +++ b/src/modules/integration-picker/components/IntegrationFields.tsx @@ -202,12 +202,7 @@ const FieldRenderer: React.FC = ({ if (field.type === 'multi-select') { return ( - + ); } From 3c1cb9725b34106750fb4da191471f0df5874597 Mon Sep 17 00:00:00 2001 From: sourabh-stackone Date: Sun, 28 Jun 2026 16:59:05 +0530 Subject: [PATCH 3/4] copilot fixes --- .../components/IntegrationFields.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/modules/integration-picker/components/IntegrationFields.tsx b/src/modules/integration-picker/components/IntegrationFields.tsx index 0a35695..f06ef2b 100644 --- a/src/modules/integration-picker/components/IntegrationFields.tsx +++ b/src/modules/integration-picker/components/IntegrationFields.tsx @@ -216,9 +216,14 @@ const MultiSelectField: React.FC<{ errors: FieldErrors; setValue: UseFormSetValue>; }> = ({ field, fieldKey, errors, setValue }) => { - const delimiter = field.delimiter ?? ' '; + const delimiter = field.delimiter?.trim() || ' '; const initialValue = field.value?.toString() || ''; - const defaultValues = initialValue ? initialValue.split(delimiter).filter(Boolean) : []; + const defaultValues = initialValue + ? initialValue + .split(delimiter) + .map((v) => v.trim()) + .filter(Boolean) + : []; const multiSelectOptions: MultiSelectOption[] = (field.options ?? []).map((opt) => ({ value: opt.value, @@ -249,6 +254,7 @@ const MultiSelectField: React.FC<{ description={field.guide?.description ?? field.description} tooltip={field.guide?.tooltip ?? field.tooltip} required={field.required} + disabled={field.readOnly} chips chipsMax={4} inlineSearch From cced1eba07b15050c2e2d3b95d43cd658db7c975 Mon Sep 17 00:00:00 2001 From: sourabh-stackone Date: Tue, 30 Jun 2026 18:38:56 +0530 Subject: [PATCH 4/4] multi-select field updates --- src/modules/integration-picker/hooks/useIntegrationPicker.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modules/integration-picker/hooks/useIntegrationPicker.ts b/src/modules/integration-picker/hooks/useIntegrationPicker.ts index ba4411d..e34635e 100644 --- a/src/modules/integration-picker/hooks/useIntegrationPicker.ts +++ b/src/modules/integration-picker/hooks/useIntegrationPicker.ts @@ -547,8 +547,11 @@ export const useIntegrationPicker = ({ }); } + const multiSelectKeys = new Set( + fields.filter((f) => f.type === 'multi-select').map((f) => f.key), + ); Object.keys(cleanedFormData).forEach((key) => { - if (cleanedFormData[key] === '') { + if (cleanedFormData[key] === '' && !multiSelectKeys.has(key)) { delete cleanedFormData[key]; } });