Passed
Push — task/skillcategory-admin ( 2464ec...a87176 )
by
unknown
04:24
created

resources/assets/js/components/Application/ExperienceAccordions/ExperienceAwardAccordion.tsx   A

Complexity

Total Complexity 5
Complexity/F 0

Size

Lines of Code 193
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 5
eloc 157
mnd 5
bc 5
fnc 0
dl 0
loc 193
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import React from "react";
2
import { useIntl } from "react-intl";
3
import { accordionMessages } from "../applicationMessages";
4
import { getLocale, localizeFieldNonNull } from "../../../helpers/localize";
5
import { readableDate } from "../../../helpers/dates";
6
import { ExperienceAward, ExperienceSkill, Skill } from "../../../models/types";
7
import {
8
  ApplicationExperienceAccordion,
9
  ProfileExperienceAccordion,
10
} from "./ExperienceAccordionCommon";
11
12
const ExperienceAwardDetails: React.FC<{
13
  experience: ExperienceAward;
14
}> = ({ experience }): React.ReactElement => {
15
  const intl = useIntl();
16
  const locale = getLocale(intl.locale);
17
18
  const { title } = experience;
19
  const recipient = localizeFieldNonNull(
20
    locale,
21
    experience,
22
    "award_recipient_type",
23
  );
24
  const issuer = experience.issued_by;
25
  const scope = localizeFieldNonNull(
26
    locale,
27
    experience,
28
    "award_recognition_type",
29
  );
30
  const awardedDate = experience.awarded_date;
31
32
  const notApplicable = (
33
    <p data-c-color="gray">
34
      {intl.formatMessage(accordionMessages.notApplicable)}
35
    </p>
36
  );
37
  return (
38
    <div data-c-grid-item="base(1of1)">
39
      <div data-c-grid="gutter(all, 1)">
40
        <div data-c-grid-item="base(1of1)">
41
          <h4 data-c-color="c2" data-c-font-weight="bold">
42
            {intl.formatMessage(accordionMessages.detailsTitle)}
43
          </h4>
44
        </div>
45
        <div data-c-grid-item="base(1of2) tl(1of3)">
46
          <p data-c-font-weight="bold">
47
            {intl.formatMessage(accordionMessages.experienceTypeLabel)}
48
          </p>
49
          <p>
50
            <i
51
              className="fas fa-trophy"
52
              data-c-color="c1"
53
              data-c-margin="right(.25)"
54
            />
55
            {intl.formatMessage(accordionMessages.awardType)}
56
          </p>
57
        </div>
58
        <div data-c-grid-item="base(1of2) tl(1of3)">
59
          <p data-c-font-weight="bold">
60
            {intl.formatMessage(accordionMessages.awardTitleLabel)}
61
          </p>
62
          {title ? <p>{title}</p> : notApplicable}
63
        </div>
64
        <div data-c-grid-item="base(1of2) tl(1of3)">
65
          <p data-c-font-weight="bold">
66
            {intl.formatMessage(accordionMessages.awardRecipientLabel)}
67
          </p>
68
          {recipient ? <p>{recipient}</p> : notApplicable}
69
        </div>
70
        <div data-c-grid-item="base(1of2) tl(1of3)">
71
          <p data-c-font-weight="bold">
72
            {intl.formatMessage(accordionMessages.awardIssuerLabel)}
73
          </p>
74
          {issuer ? <p>{issuer}</p> : notApplicable}
75
        </div>
76
        <div data-c-grid-item="base(1of2) tl(1of3)">
77
          <p data-c-font-weight="bold">
78
            {intl.formatMessage(accordionMessages.awardScopeLabel)}
79
          </p>
80
          {scope ? <p>{scope}</p> : notApplicable}
81
        </div>
82
        <div data-c-grid-item="base(1of2) tl(1of3)">
83
          <p data-c-font-weight="bold">
84
            {intl.formatMessage(accordionMessages.awardDateLabel)}
85
          </p>
86
          {awardedDate ? (
87
            <p>{readableDate(locale, awardedDate)}</p>
88
          ) : (
89
            notApplicable
90
          )}
91
        </div>
92
      </div>
93
    </div>
94
  );
95
};
96
97
interface ProfileAwardAccordionProps {
98
  experience: ExperienceAward;
99
  relevantSkills: ExperienceSkill[];
100
  skillsById: { [id: number]: Skill };
101
  handleDelete: () => Promise<void>;
102
  handleEdit: () => void;
103
  handleEditSkill: (experienceSkillId: number) => void;
104
}
105
106
export const ProfileAwardAccordion: React.FC<ProfileAwardAccordionProps> = ({
107
  experience,
108
  relevantSkills,
109
  skillsById,
110
  handleDelete,
111
  handleEdit,
112
  handleEditSkill,
113
}) => {
114
  const intl = useIntl();
115
  const locale = getLocale(intl.locale);
116
117
  const accordionTitle = intl.formatMessage(accordionMessages.awardHeading, {
118
    title: experience.title,
119
    institution: experience.issued_by,
120
    b: (value) => <span data-c-font-weight="bold">{value}</span>,
121
  });
122
  const subtitle = intl.formatMessage(accordionMessages.awardSubheading, {
123
    date: readableDate(locale, experience.awarded_date),
124
  });
125
  return (
126
    <ProfileExperienceAccordion
127
      title={accordionTitle}
128
      subtitle={subtitle}
129
      iconClass="fa-trophy"
130
      relevantSkills={relevantSkills}
131
      skillsById={skillsById}
132
      handleDelete={handleDelete}
133
      handleEdit={handleEdit}
134
      handleEditSkill={handleEditSkill}
135
    >
136
      <ExperienceAwardDetails experience={experience} />
137
    </ProfileExperienceAccordion>
138
  );
139
};
140
141
interface ExperienceAwardAccordionProps {
142
  experience: ExperienceAward;
143
  relevantSkills: ExperienceSkill[];
144
  skills: Skill[];
145
  irrelevantSkillCount: number;
146
  showSkillDetails: boolean;
147
  showButtons: boolean;
148
  handleDelete: () => Promise<void>;
149
  handleEdit: () => void;
150
}
151
152
export const ExperienceAwardAccordion: React.FC<ExperienceAwardAccordionProps> = ({
153
  experience,
154
  relevantSkills,
155
  skills,
156
  irrelevantSkillCount,
157
  showSkillDetails,
158
  showButtons,
159
  handleDelete,
160
  handleEdit,
161
}) => {
162
  const intl = useIntl();
163
  const locale = getLocale(intl.locale);
164
165
  const accordionTitle = intl.formatMessage(accordionMessages.awardHeading, {
166
    title: experience.title,
167
    institution: experience.issued_by,
168
    b: (value) => <span data-c-font-weight="bold">{value}</span>,
169
  });
170
  const subtitle = intl.formatMessage(accordionMessages.awardSubheading, {
171
    date: readableDate(locale, experience.awarded_date),
172
  });
173
  return (
174
    <ApplicationExperienceAccordion
175
      title={accordionTitle}
176
      subtitle={subtitle}
177
      iconClass="fa-trophy"
178
      relevantSkills={relevantSkills}
179
      skills={skills}
180
      irrelevantSkillCount={irrelevantSkillCount}
181
      isEducationJustification={experience.is_education_requirement}
182
      showSkillDetails={showSkillDetails}
183
      showButtons={showButtons}
184
      handleDelete={handleDelete}
185
      handleEdit={handleEdit}
186
    >
187
      <ExperienceAwardDetails experience={experience} />
188
    </ApplicationExperienceAccordion>
189
  );
190
};
191
192
export default ExperienceAwardAccordion;
193