diff --git a/src/app/configuration/actionBuilder/ActionBuilderApi.ts b/src/app/configuration/actionBuilder/ActionBuilderApi.ts index dd08187..a8f0ad2 100644 --- a/src/app/configuration/actionBuilder/ActionBuilderApi.ts +++ b/src/app/configuration/actionBuilder/ActionBuilderApi.ts @@ -68,7 +68,8 @@ export function deleteActionType(id: string): Promise { // ─── Field Definition Endpoints ────────────────────────────────────────────── export function getFieldDefinitions(actionTypeId: string): Promise { - return ApiClient.get(`/master-data/action-types/${actionTypeId}/fields`); + return ApiClient.get(`/master-data/action-types/${actionTypeId}/fields`) + .then(res => Array.isArray(res) ? res.sort((a, b) => (a.displayOrder ?? 0) - (b.displayOrder ?? 0)) : []); } export function createFieldDefinition(actionTypeId: string, payload: FieldDefinitionFormData): Promise { diff --git a/src/app/configuration/actionBuilder/index.tsx b/src/app/configuration/actionBuilder/index.tsx index 3b459b5..0a25a86 100644 --- a/src/app/configuration/actionBuilder/index.tsx +++ b/src/app/configuration/actionBuilder/index.tsx @@ -95,7 +95,7 @@ export default function ActionBuilderPage() { placeholder: '', helpText: '', width: 'full', - section: 'General Information', + section: '', displayOrder: 1, isActive: true, validationJson: { min: undefined, max: undefined, regex: '' }, @@ -387,7 +387,7 @@ export default function ActionBuilderPage() { placeholder: '', helpText: '', width: 'full', - section: 'General Information', + section: '', displayOrder: fields.length + 1, isActive: true, validationJson: { min: undefined, max: undefined, regex: '' }, @@ -409,7 +409,7 @@ export default function ActionBuilderPage() { placeholder: f.placeholder || '', helpText: f.helpText || '', width: f.width || 'full', - section: f.section || 'General Information', + section: f.section || '', displayOrder: f.displayOrder || 1, isActive: f.isActive !== false, validationJson: f.validationJson || { min: undefined, max: undefined, regex: '' }, diff --git a/src/app/policyEngine/PolicyEngineApi.ts b/src/app/policyEngine/PolicyEngineApi.ts index 1101d9c..ff1f773 100644 --- a/src/app/policyEngine/PolicyEngineApi.ts +++ b/src/app/policyEngine/PolicyEngineApi.ts @@ -210,7 +210,7 @@ export function getOperatorOptions(): Promise { export function getActionTypeFields(actionTypeId: string): Promise { if (!actionTypeId) return Promise.resolve([]); return ApiClient.get(`/master-data/action-types/${actionTypeId}/fields`) - .then((res) => (Array.isArray(res) ? res.filter((f) => f.isActive !== false) : [])) + .then((res) => (Array.isArray(res) ? res.filter((f) => f.isActive !== false).sort((a, b) => (a.displayOrder ?? 0) - (b.displayOrder ?? 0)) : [])) .catch(() => []); } @@ -321,7 +321,7 @@ export function getConditionGroupsForCategory(categoryCodeOrId: string): Promise export function getConditionFieldsForGroup(groupIdOrCode: string): Promise { if (!groupIdOrCode) return Promise.resolve([]); return ApiClient.get(`/master-data/condition-groups/${groupIdOrCode}/fields`) - .then((res) => (Array.isArray(res) ? res.filter((f) => f.isActive !== false) : [])) + .then((res) => (Array.isArray(res) ? res.filter((f) => f.isActive !== false).sort((a, b) => (a.displayOrder ?? 0) - (b.displayOrder ?? 0)) : [])) .catch(() => []); } diff --git a/src/app/policyEngine/components/AddPolicyEngine.tsx b/src/app/policyEngine/components/AddPolicyEngine.tsx index ae5ba7d..ce5126d 100644 --- a/src/app/policyEngine/components/AddPolicyEngine.tsx +++ b/src/app/policyEngine/components/AddPolicyEngine.tsx @@ -396,6 +396,17 @@ export default function AddPolicyEngine() { const fields = await getActionTypeFields(selectedTypeId); setActionTypeFieldsMap((prev) => ({ ...prev, [selectedTypeId]: fields })); + // Pre-populate default values for the new action + const initialFieldValues: Record = {}; + fields.forEach((f) => { + const defaultVal = f.defaultValue ?? (f as any).default_value ?? (f as any).defaultValueJson ?? (f as any).default_value_json; + if (defaultVal !== undefined && defaultVal !== null) { + initialFieldValues[f.fieldCode] = defaultVal; + } + }); + + handleUpdateAction(ruleId, actionId, { fieldValues: initialFieldValues }); + // Pre-fetch lookup options for fields requiring lookupSource const sourcesToFetch = new Set(); fields.forEach((f) => { @@ -413,6 +424,17 @@ export default function AddPolicyEngine() { } finally { setLoadingActionFields((prev) => ({ ...prev, [selectedTypeId]: false })); } + } else { + // Fields already loaded in map, just pre-populate default values + const fields = actionTypeFieldsMap[selectedTypeId] || []; + const initialFieldValues: Record = {}; + fields.forEach((f) => { + const defaultVal = f.defaultValue ?? (f as any).default_value ?? (f as any).defaultValueJson ?? (f as any).default_value_json; + if (defaultVal !== undefined && defaultVal !== null && defaultVal !== '') { + initialFieldValues[f.fieldCode] = defaultVal; + } + }); + handleUpdateAction(ruleId, actionId, { fieldValues: initialFieldValues }); } }; @@ -1422,7 +1444,7 @@ export default function AddPolicyEngine() { (field as any).default_value_json; const effectiveVal = - rawVal !== undefined && rawVal !== null && rawVal !== '' + rawVal !== undefined && rawVal !== null ? rawVal : defaultVal;