Passed
Push — feature/summary-manager-view ( 785ff6...8b5a57 )
by Tristan
06:49 queued 11s
created

resources/assets/js/components/HRPortal/JobReviewHrPage.tsx   A

Complexity

Total Complexity 7
Complexity/F 0

Size

Lines of Code 179
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 145
mnd 7
bc 7
fnc 0
dl 0
loc 179
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import React, { useEffect } from "react";
2
import { useIntl, FormattedMessage, defineMessages } from "react-intl";
3
import { useDispatch, useSelector } from "react-redux";
4
import ReactDOM from "react-dom";
5
import RootContainer from "../RootContainer";
6
import {
7
  Job,
8
  JobPosterKeyTask,
9
  Criteria,
10
  Skill,
11
  Manager,
12
  Department,
13
} from "../../models/types";
14
import { hrJobSummary } from "../../helpers/routes";
15
import { RootState } from "../../store/store";
16
import {
17
  getJob,
18
  getTasksByJob,
19
  getCriteriaByJob,
20
} from "../../store/Job/jobSelector";
21
import { getSkills } from "../../store/Skill/skillSelector";
22
import {
23
  fetchJob,
24
  fetchJobTasks,
25
  fetchCriteria,
26
} from "../../store/Job/jobActions";
27
import { getDepartments as fetchDepartments } from "../../store/Department/deptActions";
28
import { getDepartments } from "../../store/Department/deptSelector";
29
import { getManagerById } from "../../store/Manager/managerSelector";
30
import { fetchManager } from "../../store/Manager/managerActions";
31
import { JobReviewDisplay } from "../JobBuilder/Review/JobReview";
32
import { fetchSkills } from "../../store/Skill/skillActions";
33
import Icon from "../Icon";
34
import JobReviewActivityFeed from "../JobBuilder/Review/JobReviewActivityFeed";
35
36
interface JobReviewHrPageProps {
37
  jobId: number;
38
  job: Job | null;
39
  skills: Skill[];
40
  keyTasks: JobPosterKeyTask[];
41
  criteria: Criteria[];
42
  departments: Department[];
43
  manager: Manager | null;
44
}
45
46
const JobReviewHrPage: React.FunctionComponent<JobReviewHrPageProps> = ({
47
  jobId,
48
  job,
49
  skills,
50
  keyTasks,
51
  criteria,
52
  departments,
53
  manager,
54
}): React.ReactElement => {
55
  const { locale, formatMessage } = useIntl();
56
  if (locale !== "en" && locale !== "fr") {
57
    throw new Error("Unexpected locale");
58
  }
59
  return (
60
    <div data-c-container="form" data-c-padding="top(triple) bottom(triple)">
61
      {job !== null ? (
62
        <>
63
          <JobReviewActivityFeed jobId={job.id} isHrAdvisor />
64
          <JobReviewDisplay
65
            job={job}
66
            manager={manager}
67
            tasks={keyTasks}
68
            criteria={criteria}
69
            skills={skills}
70
            departments={departments}
71
            hideBuilderLinks
72
          />
73
        </>
74
      ) : (
75
        <div data-c-alignment="base(centre)">
76
          <Icon
77
            icon="fa fa-spinner fa-spin"
78
            accessibleText="Data is loading..."
79
            sematicIcon
80
          />
81
        </div>
82
      )}
83
      <div data-c-grid="gutter">
84
        <div data-c-grid-item="base(1of1)">
85
          <hr data-c-margin="top(normal) bottom(normal)" />
86
        </div>
87
        <div
88
          data-c-alignment="base(centre) tp(left)"
89
          data-c-grid-item="tp(1of2)"
90
        >
91
          <a href={hrJobSummary(locale, jobId)} title="">
92
            <FormattedMessage
93
              id="jobReviewHr.summaryLink"
94
              defaultMessage="Return to Summary"
95
              description="Text for the Return to Summary link."
96
            />
97
          </a>
98
        </div>
99
      </div>
100
    </div>
101
  );
102
};
103
104
const JobReviewHrDataFetcher: React.FC<{ jobId: number }> = ({ jobId }) => {
105
  const dispatch = useDispatch();
106
107
  // Request and select the job
108
  useEffect(() => {
109
    dispatch(fetchJob(jobId));
110
  }, [dispatch, jobId]);
111
  const job = useSelector((state: RootState) => getJob(state, { jobId }));
112
113
  // Request and select the job tasks
114
  useEffect(() => {
115
    dispatch(fetchJobTasks(jobId));
116
  }, [dispatch, jobId]);
117
  const tasks = useSelector((state: RootState) =>
118
    getTasksByJob(state, { jobId }),
119
  );
120
121
  // Request and select job criteria
122
  useEffect(() => {
123
    dispatch(fetchCriteria(jobId));
124
  }, [dispatch, jobId]);
125
  const criteria = useSelector((state: RootState) =>
126
    getCriteriaByJob(state, { jobId }),
127
  );
128
129
  // Load all skills
130
  useEffect(() => {
131
    dispatch(fetchSkills());
132
  }, [dispatch]);
133
  const skills = useSelector(getSkills);
134
135
  // Load all departments
136
  useEffect(() => {
137
    dispatch(fetchDepartments());
138
  }, [dispatch]);
139
  const departments = useSelector(getDepartments);
140
141
  // Load manager after Job has loaded
142
  const managerId = job?.manager_id;
143
  useEffect(() => {
144
    if (managerId) {
145
      dispatch(fetchManager(managerId));
146
    }
147
  }, [dispatch, managerId]);
148
  const manager = useSelector((state: RootState) =>
149
    managerId ? getManagerById(state, { managerId }) : null,
150
  );
151
152
  return (
153
    <JobReviewHrPage
154
      jobId={jobId}
155
      job={job}
156
      manager={manager}
157
      keyTasks={tasks}
158
      criteria={criteria}
159
      skills={skills}
160
      departments={departments}
161
    />
162
  );
163
};
164
165
export default JobReviewHrDataFetcher;
166
167
const container = document.getElementById("job-review-hr");
168
if (container !== null) {
169
  if ("jobId" in container.dataset) {
170
    const jobId = Number(container.dataset.jobId as string);
171
    ReactDOM.render(
172
      <RootContainer>
173
        <JobReviewHrDataFetcher jobId={jobId} />
174
      </RootContainer>,
175
      container,
176
    );
177
  }
178
}
179