From ea95b0747d3d3ff5175eb3b6aa196fb76ce71c34 Mon Sep 17 00:00:00 2001 From: Colin Dawson Date: Wed, 18 Mar 2026 20:34:43 +0000 Subject: [PATCH] Basic Layout for the assignment completion page is now present. --- src/Sass/_assignmentComplete.scss | 113 ++++++++++++++++++ .../task/assignments/AssignmentComplete.tsx | 76 +++++++++++- .../services/assignmentCompleteService.ts | 37 ++++-- 3 files changed, 213 insertions(+), 13 deletions(-) create mode 100644 src/Sass/_assignmentComplete.scss diff --git a/src/Sass/_assignmentComplete.scss b/src/Sass/_assignmentComplete.scss new file mode 100644 index 0000000..5a915da --- /dev/null +++ b/src/Sass/_assignmentComplete.scss @@ -0,0 +1,113 @@ +@import "./_esuiteVariables.scss"; + +$assignmentComplete-border-color: darken($mode--light-bg, 50%); + +.assignmentComplete { + display: flex; + flex-direction: column; + flex: 1 1 auto; + height: 100%; + max-height: 100%; + min-height: 0; + overflow: hidden; + + .topMenu { + display: flex; + align-items: center; + gap: 12px; + padding: 16px 20px; + border-bottom: 1px solid $assignmentComplete-border-color; + + h1 { + font-size: 2.5em; + } + + h2 { + font-size: 1.25em; + } + + h1, + h2 { + margin: 0; + } + + .actions { + margin-left: auto; + display: flex; + align-items: center; + justify-content: flex-end; + } + } + + .mainContent { + display: flex; + flex: 1 1 auto; + min-height: 0; + overflow-y: auto; + overflow-x: hidden; + + .workarea { + flex: 1; + min-width: 0; + padding: 20px; + overflow-x: auto; + overflow-y: visible; + + .workareaInner { + min-width: 420px; + } + } + + .information { + flex: 0 0 360px; + max-width: 360px; + width: 360px; + padding: 20px; + + .taskDetails { + border: 1px solid $assignmentComplete-border-color; + border-radius: 4px; + padding: 12px; + margin-bottom: 12px; + + .taskDetailsHeader { + background-color: $assignmentComplete-border-color; + margin: -12px -12px 12px; + padding: 8px 12px; + } + + .taskDetailsLabel { + font-weight: 600; + } + } + + .assigneeDetailsLabel { + font-weight: 600; + } + } + } +} + +@media (max-width: 900px) { + .assignmentComplete { + .topMenu { + flex-wrap: wrap; + + .actions { + width: 100%; + margin-left: 0; + } + } + + .mainContent { + flex-direction: column; + + .information { + width: 100%; + max-width: 100%; + border-left: 0; + border-top: 1px solid $assignmentComplete-border-color; + } + } + } +} diff --git a/src/modules/manager/task/assignments/AssignmentComplete.tsx b/src/modules/manager/task/assignments/AssignmentComplete.tsx index 55583c6..9c53d08 100644 --- a/src/modules/manager/task/assignments/AssignmentComplete.tsx +++ b/src/modules/manager/task/assignments/AssignmentComplete.tsx @@ -6,12 +6,18 @@ import { Namespaces } from "../../../../i18n/i18n"; import assignmentCompleteService, { GetAssignmentForCompletion, } from "./services/assignmentCompleteService"; +import { DateView } from "../../../../components/common/DateView"; +import LoadingPanel from "../../../../components/common/LoadingPanel"; +import AssigneePanel from "../../tasks/components/AssigneePanel"; +import TaskTypeAndNameDisplayPanel from "../../workflowTemplates/components/TaskTypeAndNameDisplayPanel"; +import Button, { ButtonType } from "../../../../components/common/Button"; +import "../../../../Sass/_assignmentComplete.scss"; const AssignmentComplete: React.FC = () => { const { assignmentId } = useParams<{ assignmentId: string }>(); const { t } = useTranslation(Namespaces.Common); - const [assignment, setAssignment] = - useState(null); + const [assignmentDetails, setAssignmentDetails] = + useState(); const loadAssignment = useCallback(async () => { if (assignmentId === undefined) { @@ -24,7 +30,7 @@ const AssignmentComplete: React.FC = () => { BigInt(assignmentId), ); if (assignmentDetails) { - setAssignment(assignmentDetails); + setAssignmentDetails(assignmentDetails); } } catch (ex: any) { toast.error(ex.message); @@ -35,10 +41,68 @@ const AssignmentComplete: React.FC = () => { void loadAssignment(); }, [loadAssignment]); + if (assignmentDetails === undefined) { + return ; + } + + var taskDefinition = assignmentDetails.workflowTemplateVersion.tasks.find( + (t) => t.config.guid == assignmentDetails.task.taskGuid, + )!; + return ( - <> - {assignment ? <>{assignment.taskName} : <>{t("CompleteAssignment")}} - +
+
+
+

+ +

+

{assignmentDetails.activity.name}

+
+
+ +
+
+
+
+
+
{taskDefinition.config.description}
+ +
Comments
+
{assignmentDetails.assignment.comments}
+
+
+ +
+
+
Current Task Info
+
+
Name
+
{assignmentDetails.task.taskName}
+
Started
+
+ +
+
+
+ +
+
Assigned to
+
Contacts
+
+ +
+
Roles
+
+ +
+
+
+
+
); }; diff --git a/src/modules/manager/task/assignments/services/assignmentCompleteService.ts b/src/modules/manager/task/assignments/services/assignmentCompleteService.ts index 8db99a8..be1d972 100644 --- a/src/modules/manager/task/assignments/services/assignmentCompleteService.ts +++ b/src/modules/manager/task/assignments/services/assignmentCompleteService.ts @@ -3,19 +3,42 @@ import { GeneralIdRef, MakeGeneralIdRefParams, } from "../../../../../utils/GeneralIdRef"; +import { ReadWorkflowTemplateVersion } from "../../../workflowTemplates/services/WorkflowTemplateService"; const apiEndpoint = "/Tasks"; -export interface GetAssignmentForCompletion { +export interface GetAssignment { + id: bigint; + guid: string; + startDateTime: Date; + raci: string; + allowNoVerdict: boolean; + outcomes: string[]; + roleId: GeneralIdRef; + userId: GeneralIdRef; + comments: string; +} + +export interface GetTask { id: bigint; guid: string; - taskType: string; taskName: string; - activityId: GeneralIdRef; - activityName: string; - user?: GeneralIdRef; - role?: GeneralIdRef; - startDateTime?: Date; + taskType: string; + taskGuid: string; +} + +export interface GetActivity { + id: bigint; + guid: string; + name: string; + workflowVersionId: bigint; +} + +export interface GetAssignmentForCompletion { + assignment: GetAssignment; + task: GetTask; + activity: GetActivity; + workflowTemplateVersion: ReadWorkflowTemplateVersion; } export async function getAssignmentForCompletion(