Skip to content

Commit

Permalink
Merge pull request #194 from jadmsaadaot/SUBMIT-task#188
Browse files Browse the repository at this point in the history
Add the confirmation box in the review section
  • Loading branch information
jadmsaadaot authored Dec 9, 2024
2 parents d5cb269 + ffa59ca commit 5b18728
Show file tree
Hide file tree
Showing 25 changed files with 181 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"""
from alembic import op


# revision identifiers, used by Alembic.
revision = '55762031c812'
down_revision = 'bb5eb7bffbed'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
Create Date: 2024-12-05 12:29:55.576075
"""
from alembic import op
import sqlalchemy as sa
from alembic import op
from sqlalchemy.dialects import postgresql


# revision identifiers, used by Alembic.
revision = '640535864292'
down_revision = '79424fc490c5'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
Create Date: 2024-11-26 13:46:10.424276
"""
from alembic import op
import sqlalchemy as sa
from alembic import op


# revision identifiers, used by Alembic.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
Create Date: 2024-12-03 10:52:30.764167
"""
from alembic import op
import sqlalchemy as sa
from alembic import op
from sqlalchemy.dialects import postgresql


# revision identifiers, used by Alembic.
revision = '79424fc490c5'
down_revision = '55762031c812'
Expand Down
2 changes: 1 addition & 1 deletion submit-api/migrations/versions/bb5eb7bffbed_.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
Create Date: 2024-11-28 14:19:16.364418
"""
from alembic import op
import sqlalchemy as sa
from alembic import op


# revision identifiers, used by Alembic.
Expand Down
1 change: 1 addition & 0 deletions submit-api/src/submit_api/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

from submit_api.exceptions import PermissionDeniedError


jwt = (
JwtManager()
) # pylint: disable=invalid-name; lower case name as used by convention in most Flask apps
Expand Down
4 changes: 2 additions & 2 deletions submit-api/src/submit_api/models/submission_review_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ class SubmissionReviewEntry(BaseModel):
id = Column(db.Integer, primary_key=True, autoincrement=True)
review_id = Column(db.Integer, ForeignKey('submission_reviews.id'), nullable=False)
type = Column(db.Enum(SubmissionReviewEntryType), nullable=False)
created_by = Column(db.String, ForeignKey('users.auth_guid'), nullable=True)
created_by_user = db.relationship('User', foreign_keys=[created_by], lazy='joined')
updated_by = Column(db.String, ForeignKey('users.auth_guid'), nullable=True)
updated_by_user = db.relationship('User', foreign_keys=[updated_by], lazy='joined')
entry = Column(db.JSON, nullable=False)

__table_args__ = (
Expand Down
1 change: 1 addition & 0 deletions submit-api/src/submit_api/resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
from .staff.project import API as STAFF_PROJECT_API
from .staff.submission_item_note import API as STAFF_SUBMISSION_ITEM_NOTE_API


__all__ = ('API_BLUEPRINT', 'OPS_BLUEPRINT', 'STAFF_API_BLUEPRINT')

URL_PREFIX = '/api'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

from submit_api.auth import auth
from submit_api.resources.apihelper import Api as ApiHelper
from submit_api.schemas.submission_item_note import SubmissionItemNote, PostSubmissionItemNote
from submit_api.schemas.submission_item_note import PostSubmissionItemNote, SubmissionItemNote
from submit_api.services.submission_item_note import SubmissionItemNoteService
from submit_api.utils.util import cors_preflight

Expand Down
2 changes: 1 addition & 1 deletion submit-api/src/submit_api/schemas/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
from submit_api.schemas.internal_staff_document import InternalStaffDocument
from submit_api.schemas.item_type import ItemTypeSchema
from submit_api.schemas.submission import SubmittedDocumentSchema, SubmittedFormSchema
from submit_api.schemas.submission_review import SubmissionReviewSchema
from submit_api.schemas.submission_item_note import SubmissionItemNote
from submit_api.schemas.submission_review import SubmissionReviewSchema


class ItemSubmissionSchema(Schema):
Expand Down
1 change: 1 addition & 0 deletions submit-api/src/submit_api/schemas/submission_review.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class Meta: # pylint: disable=too-few-public-methods
type = fields.Enum(data_key="type", enum=SubmissionReviewEntryType)
created_by = fields.Str(data_key="created_by")
created_date = fields.DateTime(data_key="created_date")
updated_date = fields.DateTime(data_key="updated_date")
entry = fields.Dict(data_key="entry")


Expand Down
8 changes: 5 additions & 3 deletions submit-api/src/submit_api/services/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
from flask import current_app

from submit_api.enums.item_status import ItemStatus
from submit_api.exceptions import UnprocessableEntityError, ResourceNotFoundError
from submit_api.models import Item as ItemModel, PackageMetadata, Package as PackageModel, SubmissionReviewEntry
from submit_api.exceptions import ResourceNotFoundError, UnprocessableEntityError
from submit_api.models import Item as ItemModel
from submit_api.models import Package as PackageModel
from submit_api.models import PackageMetadata, SubmissionReviewEntry
from submit_api.models.db import session_scope
from submit_api.models.item_type import SubmissionItemType
from submit_api.models.package_metadata import PackageMetadataFields
Expand Down Expand Up @@ -106,7 +108,7 @@ def _save_submission_review_answers(cls, review, review_data, session):
form_answers = review_data.get('form_answers', {})
review_entry = cls.get_or_create_active_item_review_entry(review.id, review_type)
review_entry.entry = form_answers
review_entry.created_by = TokenInfo.get_id()
review_entry.updated_by = TokenInfo.get_id()
session.add(review_entry)
current_app.logger.debug(f"Submission review answers saved for review {review.id}.")
return review
Expand Down
2 changes: 1 addition & 1 deletion submit-api/src/submit_api/services/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def _create_package(session, account_project_id, request_data, package_type):
def _create_package_metadata(session, package_id, metadata):
"""Create package metadata."""
package_metadata = PackageMetadataModel(
package_id=package_id, package_meta=metadata
package_id=package_id, json=metadata
)
session.add(package_metadata)

Expand Down
33 changes: 33 additions & 0 deletions submit-web/src/components/Shared/LabelValuePair/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import {
Box,
Stack,
StackProps,
Typography,
TypographyProps,
} from "@mui/material";
import { ReactNode } from "@tanstack/react-router";

type LabelValuePairProps = {
label?: string;
value?: ReactNode;
labelProps?: TypographyProps;
valueProps?: TypographyProps;
};
export const LabelValuePair = ({
label = "",
value = "",
labelProps = {},
valueProps = {},
...otherProps
}: LabelValuePairProps & StackProps) => {
return (
<Stack direction="row" alignItems={"center"} {...otherProps}>
<Typography {...labelProps}>{label}:</Typography>
<Box>
<Typography color={"inherit"} {...valueProps}>
{value}
</Typography>
</Box>
</Stack>
);
};
15 changes: 15 additions & 0 deletions submit-web/src/components/Shared/SuccessBox/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Box, styled } from "@mui/material";
import { BCDesignTokens } from "epic.theme";

export const SuccessBox = styled(Box)({
border: `1px solid ${BCDesignTokens.supportBorderColorSuccess}`,
borderRadius: "4px",
display: "flex",
alignItems: "flex-start",
alignSelf: "stretch",
color: BCDesignTokens.supportBorderColorSuccess,
backgroundColor: BCDesignTokens.supportSurfaceColorSuccess,
padding: "10px 10px 10px 12px",
flexDirection: "column",
gap: "4px",
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import { LabelValuePair } from "@/components/Shared/LabelValuePair";
import { checkIfStaff } from "@/components/Shared/PermissionGate/utils";
import { SuccessBox } from "@/components/Shared/SuccessBox";
import { SubmissionStatusChip } from "@/components/SubmissionStatusChip";
import { getSubmissionItemForStaffQueryOptions } from "@/hooks/api/useItems";
import { SUBMISSION_STATUS } from "@/models/Submission";
import { SubmissionItem } from "@/models/SubmissionItem";
import {
SUBMISSION_REVIEW_ENTRY_TYPE,
SUBMISSION_REVIEW_STATUS,
} from "@/models/SubmissionReview";
import { useAccount } from "@/store/accountStore";
import { Grid, Stack, Typography } from "@mui/material";
import { useQueryClient } from "@tanstack/react-query";
import { useParams } from "@tanstack/react-router";

export const NotificationBox = () => {
const queryClient = useQueryClient();
const { roles } = useAccount();
const { submissionId: submissionItemId } = useParams({
from: "/staff/_staffLayout/projects/$projectId/_projectLayout/submission-packages/$submissionPackageId/_submissionLayout/submissions/$submissionId",
});

const submissionItem = queryClient.getQueryData<SubmissionItem>(
getSubmissionItemForStaffQueryOptions({ itemId: Number(submissionItemId) })
.queryKey,
);

const submissionReview = submissionItem?.review;
const staffRecommendation = submissionReview?.entries?.find(
(entry) => entry.type === SUBMISSION_REVIEW_ENTRY_TYPE.STAFF_RECOMMENDATION,
);
const managerConfirmation = submissionReview?.entries?.find(
(entry) => entry.type === SUBMISSION_REVIEW_ENTRY_TYPE.MANAGER_CONFIRMATION,
);

const isStaff = checkIfStaff(roles);

if (!submissionReview) {
return <></>;
}

if (
isStaff &&
submissionReview.status === SUBMISSION_REVIEW_STATUS.PENDING_MANAGER_REVIEW
) {
return (
<SuccessBox m="2em 0">
<Typography variant="body1" color="inherit">
Your recommendation has been successfully sent to a Manager
</Typography>
</SuccessBox>
);
}

if (submissionReview.status === SUBMISSION_REVIEW_STATUS.APPROVED) {
return (
<SuccessBox m="2em 0">
<Stack direction="row" alignItems={"center"} spacing={2}>
<Typography variant="body1" color="inherit">
The submission has been completed as:
</Typography>
<SubmissionStatusChip
status={SUBMISSION_STATUS.PASSED_CONSULTATION_CHECK.value}
/>
</Stack>
<Grid container color={"inherit"}>
<Grid item xs={12} container>
<Grid item container width="400px">
<Grid item xs={12}>
<LabelValuePair
label="Decision recommended by"
value={"Placeholder"}
labelProps={{ color: "inherit", width: "220px" }}
/>
</Grid>
<Grid item xs={12}>
<LabelValuePair
label="Confirmed by"
value="Placeholder"
labelProps={{ color: "inherit", width: "220px" }}
/>
</Grid>
</Grid>
<Grid item xs container>
<Grid item xs={12}>
<LabelValuePair
label="Date"
value={staffRecommendation?.updated_on}
labelProps={{ color: "inherit", width: "50px" }}
/>
</Grid>
<Grid item xs={12}>
<LabelValuePair
label="Date"
value={managerConfirmation?.updated_on}
labelProps={{ color: "inherit", width: "50px" }}
/>
</Grid>
</Grid>
</Grid>
</Grid>
</SuccessBox>
);
}

return <></>;
};
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { EPIC_SUBMIT_ROLE } from "@/models/Role";
import { useAccount } from "@/store/accountStore";
import PermissionsGate from "@/components/Shared/PermissionGate";
import { checkIfStaff } from "@/components/Shared/PermissionGate/utils";
import { NotificationBox } from "./NotificationBox";

type ConsultationForm = yup.InferType<typeof consultationSchema>;

Expand Down Expand Up @@ -151,6 +152,7 @@ export default function ReviewSection() {
</>
</PermissionsGate>
<NotesSection />
<NotificationBox />
<ActionButtons />
</form>
</FormProvider>
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ export const useSaveSubmissionReview = ({
queryClient.invalidateQueries({
queryKey: [STAFF_QUERY_KEY.ACCOUNT_PROJECT, accountProjectId],
});
queryClient.invalidateQueries({
queryClient.removeQueries({
queryKey: [STAFF_QUERY_KEY.ACCOUNT_PROJECTS],
});
},
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
4 changes: 2 additions & 2 deletions submit-web/src/models/SubmissionReview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export type SubmissionReviewEntry = {
id: number;
review_id: number;
type: SubmissionReviewEntryType;
created_by: string;
created_on: string;
updated_by: string;
updated_on: string;
entry: Record<string, unknown>;
};

0 comments on commit 5b18728

Please sign in to comment.