Passed
Push — dev ( 2cea8b...7299be )
by Tristan
04:19
created

resources/assets/js/components/StrategicTalentResponse/ResponseScreening/ResponseScreeningPage.tsx   A

Complexity

Total Complexity 14
Complexity/F 0

Size

Lines of Code 151
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 14
eloc 120
mnd 14
bc 14
fnc 0
dl 0
loc 151
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
/* eslint camelcase: "off", @typescript-eslint/camelcase: "off" */
2
import React, { useEffect } from "react";
3
import ReactDOM from "react-dom";
4
import { useDispatch, useSelector } from "react-redux";
5
import RootContainer from "../../RootContainer";
6
import {
7
  ResponseScreeningBuckets as BucketTypes,
8
  ResponseReviewStatusId,
9
} from "../../../models/lookupConstants";
10
import { ResponseScreeningBuckets } from "../../../models/localizedConstants";
11
import { getDepartments as getDepartmentsAction } from "../../../store/Department/deptActions";
12
import {
13
  Application,
14
  Department,
15
  ApplicationReview,
16
} from "../../../models/types";
17
import ApplicantBucket from "./ApplicantBucket";
18
import { Portal } from "../../../models/app";
19
import {
20
  fetchApplicationsForJob,
21
  updateApplicationReview as updateApplicationReviewAction,
22
} from "../../../store/Application/applicationActions";
23
import { getApplicationsByJob } from "../../../store/Application/applicationSelector";
24
import { RootState } from "../../../store/store";
25
import { getDepartments } from "../../../store/Department/deptSelector";
26
27
interface ResponseScreeningPageProps {
28
  applications: Application[];
29
  departments: Department[];
30
  handleUpdateReview: (review: ApplicationReview) => Promise<ApplicationReview>;
31
  portal: Portal;
32
}
33
34
const ResponseScreeningPage: React.FC<ResponseScreeningPageProps> = ({
35
  applications,
36
  departments,
37
  handleUpdateReview,
38
  portal,
39
}): React.ReactElement => (
40
  <>
41
    {Object.keys(ResponseScreeningBuckets).map((bucket) => {
42
      const bucketApplications = applications.filter((application) => {
43
        if (bucket === BucketTypes.ReadyToAllocate) {
44
          return (
45
            application.application_review?.review_status_id ===
46
            ResponseReviewStatusId.ReadyToAllocate
47
          );
48
        }
49
        if (bucket === BucketTypes.Allocated) {
50
          return (
51
            application.application_review?.review_status_id ===
52
            ResponseReviewStatusId.Allocated
53
          );
54
        }
55
        if (bucket === BucketTypes.Unavailable) {
56
          return (
57
            application.application_review?.review_status_id ===
58
            ResponseReviewStatusId.NotAvailable
59
          );
60
        }
61
        if (bucket === BucketTypes.DoesNotQualify) {
62
          return (
63
            application.application_review?.review_status_id ===
64
            ResponseReviewStatusId.ScreenedOut
65
          );
66
        }
67
        // Multiple statuses appear in the "Under Consideration" bucket
68
        return (
69
          application.application_review === undefined ||
70
          application.application_review?.review_status_id === null ||
71
          application.application_review?.review_status_id ===
72
            ResponseReviewStatusId.AssessmentRequired ||
73
          application.application_review?.review_status_id ===
74
            ResponseReviewStatusId.ReadyForReference
75
        );
76
      });
77
78
      return (
79
        <ApplicantBucket
80
          key={bucket}
81
          applications={bucketApplications}
82
          bucket={bucket}
83
          departments={departments}
84
          handleUpdateReview={handleUpdateReview}
85
          portal={portal}
86
        />
87
      );
88
    })}
89
  </>
90
);
91
92
interface ResponseScreeningDataFetcherProps {
93
  jobId: number;
94
  portal: Portal;
95
}
96
97
const ResponseScreeningDataFetcher: React.FC<ResponseScreeningDataFetcherProps> = ({
98
  jobId,
99
  portal,
100
}) => {
101
  const dispatch = useDispatch();
102
103
  // Load Applications for provided Job
104
  useEffect(() => {
105
    dispatch(fetchApplicationsForJob(jobId));
106
  }, [dispatch, jobId]);
107
  const applications = useSelector((state: RootState) =>
108
    getApplicationsByJob(state, { jobId }),
109
  );
110
111
  // Load all departments
112
  useEffect(() => {
113
    dispatch(getDepartmentsAction());
114
  }, [dispatch]);
115
  const departments = useSelector(getDepartments);
116
117
  const updateApplicationReview = async (
118
    review: ApplicationReview,
119
  ): Promise<ApplicationReview> => {
120
    const result = await dispatch(updateApplicationReviewAction(review));
121
    if (!result.error) {
122
      const resultReview = await result.payload;
123
      return resultReview;
124
    }
125
    return Promise.reject(result.payload);
126
  };
127
128
  return (
129
    <ResponseScreeningPage
130
      applications={applications}
131
      departments={departments}
132
      handleUpdateReview={updateApplicationReview}
133
      portal={portal}
134
    />
135
  );
136
};
137
138
const container = document.getElementById("response-screening-wrapper");
139
if (container !== null) {
140
  if ("jobId" in container.dataset && "portal" in container.dataset) {
141
    const jobId = Number(container.dataset.jobId as string);
142
    const portal = container.dataset.portal as Portal;
143
    ReactDOM.render(
144
      <RootContainer>
145
        <ResponseScreeningDataFetcher jobId={jobId} portal={portal} />
146
      </RootContainer>,
147
      container,
148
    );
149
  }
150
}
151