From 574f254dcad3a62a2077da768061116db371172d Mon Sep 17 00:00:00 2001 From: Colin Dawson Date: Thu, 26 Feb 2026 20:29:56 +0000 Subject: [PATCH] Now able to create a workflow template --- .../WorkflowTemplateDetails.tsx | 15 ++++--- ...AssigneesOfIApprovalTaskAssigneeEditor.tsx | 41 ++++++++----------- .../AssigneesOfITaskAssigneeEditor.tsx | 37 ++++++++--------- .../components/GeneralTab.tsx | 2 +- .../components/WorkflowTemplateTable.tsx | 4 +- .../components/capabilityEditorRegistry.ts | 4 +- .../services/WorkflowTemplateService.ts | 12 ++---- 7 files changed, 54 insertions(+), 61 deletions(-) diff --git a/src/modules/manager/workflowTemplates/WorkflowTemplateDetails.tsx b/src/modules/manager/workflowTemplates/WorkflowTemplateDetails.tsx index 3f78066..8f469ee 100644 --- a/src/modules/manager/workflowTemplates/WorkflowTemplateDetails.tsx +++ b/src/modules/manager/workflowTemplates/WorkflowTemplateDetails.tsx @@ -38,7 +38,7 @@ const WorkflowTemplateDetails: React.FC<{ editMode: boolean }> = ({ const form = useFormWithGuard({ loaded: false, data: { - name: "", + workflowName: "", domainId: {} as GeneralIdRef, activityNameTemplate: "", description: "", @@ -56,7 +56,10 @@ const WorkflowTemplateDetails: React.FC<{ editMode: boolean }> = ({ // Joi schema (same pattern as original GeneralTab) // ----------------------------- form.schema = { - name: Joi.string().required().max(450).label(t("WorkflowTemplateName")), + workflowName: Joi.string() + .required() + .max(450) + .label(t("WorkflowTemplateName")), activityNameTemplate: Joi.string() .required() .max(450) @@ -80,7 +83,7 @@ const WorkflowTemplateDetails: React.FC<{ editMode: boolean }> = ({ ); if (loadedData) { - newData.name = loadedData.name ?? ""; + newData.workflowName = loadedData.workflowName ?? ""; } } catch (ex: any) { form.handleGeneralError(ex); @@ -112,7 +115,9 @@ const WorkflowTemplateDetails: React.FC<{ editMode: boolean }> = ({ //await templateVersionsService.putTemplateVersion({ name }); toast.info(t("WorkflowTemplateEdited")); } else { - //await templateVersionsService.postTemplateVersion({ name }); + await templateVersionsService.postTemplateVersion( + data as CreateWorkflowTemplateVersion, + ); toast.info(t("WorkflowTemplateAdded")); } @@ -146,7 +151,7 @@ const WorkflowTemplateDetails: React.FC<{ editMode: boolean }> = ({ const generalTabValid = !( errors["domainId"] || - errors["name"] || + errors["workflowName"] || errors["activityNameTemplate"] || errors["description"] ); diff --git a/src/modules/manager/workflowTemplates/components/CapabilityEditors/AssigneesOfIApprovalTaskAssigneeEditor.tsx b/src/modules/manager/workflowTemplates/components/CapabilityEditors/AssigneesOfIApprovalTaskAssigneeEditor.tsx index fb9e73d..58dc3d2 100644 --- a/src/modules/manager/workflowTemplates/components/CapabilityEditors/AssigneesOfIApprovalTaskAssigneeEditor.tsx +++ b/src/modules/manager/workflowTemplates/components/CapabilityEditors/AssigneesOfIApprovalTaskAssigneeEditor.tsx @@ -16,10 +16,6 @@ import ErrorBlock from "../../../../../components/common/ErrorBlock"; import RolePicker from "../../../../../components/pickers/RolePicker"; import { getCurrentUser } from "../../../../frame/services/authenticationService"; import RaciPicker from "../../../../../components/pickers/RaciPicker"; -import VerdictPicker from "../../../../../components/pickers/VerdictPicker"; -import { renderInput } from "../../../../../components/common/formHelpers"; -import { InputType } from "../../../../../components/common/Input"; -import { error } from "console"; // --------------------------- // Domain Interfaces @@ -27,7 +23,7 @@ import { error } from "console"; export interface IApprovalTaskAssignee { role?: GeneralIdRef | null; - contact?: GeneralIdRef | null; + user?: GeneralIdRef | null; raci: string; // Raci enum as string allowNoVerdict: boolean; bypassable: boolean; @@ -60,7 +56,7 @@ export const AssigneesOfIApprovalTaskAssigneeEditor: React.FC< const list = clone.config.assignees ?? []; list.push({ role: null, - contact: null, + user: null, raci: "Responsible", allowNoVerdict: false, bypassable: false, @@ -82,13 +78,13 @@ export const AssigneesOfIApprovalTaskAssigneeEditor: React.FC< return (
- Select assigness (you can select either a role or a contact) + Select assigness (you can select either a role or a user) - + @@ -106,7 +102,7 @@ export const AssigneesOfIApprovalTaskAssigneeEditor: React.FC< @@ -127,13 +123,13 @@ export const AssigneesOfIApprovalTaskAssigneeEditor: React.FC< @@ -194,19 +190,18 @@ const runValidation = ( } assignees.forEach((a, i) => { - const noContactSelected = !a.contact || a.contact?.id === BigInt(0); + const noUserSelected = !a.user || a.user?.id === BigInt(0); const noRoleSelected = !a.role || a.role?.id === BigInt(0); - if (!noContactSelected && !noRoleSelected) { - errors[`${guid}.assignees[${i}].contact`] = - "Cannot select both a contact and a role."; + if (!noUserSelected && !noRoleSelected) { + errors[`${guid}.assignees[${i}].user`] = + "Cannot select both a user and a role."; errors[`${guid}.assignees[${i}].role`] = - "Cannot select both a contact and a role."; + "Cannot select both a user and a role."; } else { - if (!(!noContactSelected || !noRoleSelected)) { - if (noContactSelected) { - errors[`${guid}.assignees[${i}].contact`] = - "A contact must be selected."; + if (!(!noUserSelected || !noRoleSelected)) { + if (noUserSelected) { + errors[`${guid}.assignees[${i}].user`] = "A user must be selected."; } if (noRoleSelected) { diff --git a/src/modules/manager/workflowTemplates/components/CapabilityEditors/AssigneesOfITaskAssigneeEditor.tsx b/src/modules/manager/workflowTemplates/components/CapabilityEditors/AssigneesOfITaskAssigneeEditor.tsx index a426375..081dc56 100644 --- a/src/modules/manager/workflowTemplates/components/CapabilityEditors/AssigneesOfITaskAssigneeEditor.tsx +++ b/src/modules/manager/workflowTemplates/components/CapabilityEditors/AssigneesOfITaskAssigneeEditor.tsx @@ -23,7 +23,7 @@ import RaciPicker from "../../../../../components/pickers/RaciPicker"; export interface ITaskAssignee { role?: GeneralIdRef | null; - contact?: GeneralIdRef | null; + user?: GeneralIdRef | null; raci: string; // Raci enum as string } @@ -54,7 +54,7 @@ export const AssigneesOfITaskAssigneeEditor: React.FC = ( const list = clone.config.assignees ?? []; list.push({ role: null, - contact: null, + user: null, raci: "Responsible", }); clone.config.assignees = list; @@ -74,13 +74,13 @@ export const AssigneesOfITaskAssigneeEditor: React.FC = ( return (
- Select assigness (you can select either a role or a contact) + Select assigness (you can select either a role or a USER)
RoleContactUser RACI Allow No Verdict Bypassable - updateAssignee(index, { ...assignee, contact: val }) + updateAssignee(index, { ...assignee, user: val }) } />
- + @@ -182,19 +182,18 @@ const runValidation = ( } assignees.forEach((a, i) => { - const noContactSelected = !a.contact || a.contact?.id === BigInt(0); + const noUserSelected = !a.user || a.user?.id === BigInt(0); const noRoleSelected = !a.role || a.role?.id === BigInt(0); - if (!noContactSelected && !noRoleSelected) { - errors[`${guid}.assignees[${i}].contact`] = - "Cannot select both a contact and a role."; + if (!noUserSelected && !noRoleSelected) { + errors[`${guid}.assignees[${i}].user`] = + "Cannot select both a user and a role."; errors[`${guid}.assignees[${i}].role`] = - "Cannot select both a contact and a role."; + "Cannot select both a user and a role."; } else { - if (!(!noContactSelected || !noRoleSelected)) { - if (noContactSelected) { - errors[`${guid}.assignees[${i}].contact`] = - "A contact must be selected."; + if (!(!noUserSelected || !noRoleSelected)) { + if (noUserSelected) { + errors[`${guid}.assignees[${i}].user`] = "A user must be selected."; } if (noRoleSelected) { diff --git a/src/modules/manager/workflowTemplates/components/GeneralTab.tsx b/src/modules/manager/workflowTemplates/components/GeneralTab.tsx index b575f77..191b401 100644 --- a/src/modules/manager/workflowTemplates/components/GeneralTab.tsx +++ b/src/modules/manager/workflowTemplates/components/GeneralTab.tsx @@ -43,7 +43,7 @@ const GeneralTab: React.FC = ({ )} {renderInput( - "name", + "workflowName", t("WorkflowTemplateName"), data, errors, diff --git a/src/modules/manager/workflowTemplates/components/WorkflowTemplateTable.tsx b/src/modules/manager/workflowTemplates/components/WorkflowTemplateTable.tsx index 94e447c..89bf56a 100644 --- a/src/modules/manager/workflowTemplates/components/WorkflowTemplateTable.tsx +++ b/src/modules/manager/workflowTemplates/components/WorkflowTemplateTable.tsx @@ -17,10 +17,10 @@ const WorkflowTemplateManagerTable: React.FC< const columns: Column[] = useMemo( () => [ { - key: "name", + key: "workflowName", label: t("Name"), order: "asc", - link: canViewSite ? "/site/{0}" : undefined, + link: canViewSite ? "/workflowTemplates/{0}" : undefined, }, ], [t, canViewSite], diff --git a/src/modules/manager/workflowTemplates/components/capabilityEditorRegistry.ts b/src/modules/manager/workflowTemplates/components/capabilityEditorRegistry.ts index 2d38b0a..7143f97 100644 --- a/src/modules/manager/workflowTemplates/components/capabilityEditorRegistry.ts +++ b/src/modules/manager/workflowTemplates/components/capabilityEditorRegistry.ts @@ -15,8 +15,8 @@ export const capabilityEditorRegistry: Record< ITask: taskCoreEditorRegistryEntry, ITags: tagsEditorRegistryEntry, IBudget: budgetEditorRegistryEntry, - "IAssignees": assigneesOfITaskAssigneeRegistryEntry, - "IAssignees": + "IAssignees": assigneesOfITaskAssigneeRegistryEntry, + "IAssignees": assigneesOfIApprovalTaskAssigneeRegistryEntry, "IOutcome": outcomeOfApprovalVerdictRegistryEntry, // IFormTemplate: null, //ToDo implement this diff --git a/src/modules/manager/workflowTemplates/services/WorkflowTemplateService.ts b/src/modules/manager/workflowTemplates/services/WorkflowTemplateService.ts index e134474..3cfcd3b 100644 --- a/src/modules/manager/workflowTemplates/services/WorkflowTemplateService.ts +++ b/src/modules/manager/workflowTemplates/services/WorkflowTemplateService.ts @@ -33,7 +33,7 @@ export interface TaskDefinition> { } export interface CreateWorkflowTemplateVersion extends FormData { - name: string; + workflowName: string; domainId: GeneralIdRef; activityNameTemplate: string; description: string; @@ -105,15 +105,9 @@ export async function getTemplateVersion(id?: bigint, guid?: string) { } export async function postTemplateVersion( - name: string, - address: string, - status: string, + data: CreateWorkflowTemplateVersion, ): Promise { - return await httpService.post(apiEndpoint + "/templateVersion", { - name, - address, - status, - }); + return await httpService.post(apiEndpoint + "/templateVersion", data); } export async function putTemplateVersion(
RoleContactUser RACI - updateAssignee(index, { ...assignee, contact: val }) + updateAssignee(index, { ...assignee, user: val }) } />