Passed
Push — dev ( 4ec5c1...56ac6b )
by Tristan
07:13 queued 03:21
created

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

Complexity

Total Complexity 6
Complexity/F 0

Size

Lines of Code 213
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 6
eloc 176
mnd 6
bc 6
fnc 0
dl 0
loc 213
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import React, { FunctionComponent } from "react";
2
import { useIntl } from "react-intl";
3
import { accordionMessages } from "../applicationMessages";
4
import { getLocale } from "../../../helpers/localize";
5
import { readableDate } from "../../../helpers/dates";
6
import {
7
  ExperiencePersonal,
8
  ExperienceSkill,
9
  Skill,
10
} from "../../../models/types";
11
import {
12
  ApplicationExperienceAccordion,
13
  ProfileExperienceAccordion,
14
  titleBarDateRange,
15
} from "./ExperienceAccordionCommon";
16
17
const ExperiencePersonalDetails: FunctionComponent<{
18
  experience: ExperiencePersonal;
19
}> = ({ experience }) => {
20
  const intl = useIntl();
21
  const locale = getLocale(intl.locale);
22
  const { title, description } = experience;
23
  const isShareable = experience.is_shareable;
24
  const startDate = experience.start_date;
25
  const endDate = experience.end_date;
26
  const isActive = experience.is_active;
27
28
  const notApplicable = (
29
    <p data-c-color="gray">
30
      {intl.formatMessage(accordionMessages.notApplicable)}
31
    </p>
32
  );
33
  const endDateOrNa = endDate ? (
34
    <p>{readableDate(locale, endDate)}</p>
35
  ) : (
36
    notApplicable
37
  );
38
  return (
39
    <div data-c-grid-item="base(1of1)">
40
      <div data-c-grid="gutter(all, 1)">
41
        <div data-c-grid-item="base(1of1)">
42
          <h4 data-c-color="c2" data-c-font-weight="bold">
43
            {intl.formatMessage(accordionMessages.detailsTitle)}
44
          </h4>
45
        </div>
46
        <div data-c-grid-item="base(1of2) tl(1of3)">
47
          <p data-c-font-weight="bold">
48
            {intl.formatMessage(accordionMessages.experienceTypeLabel)}
49
          </p>
50
          <p>
51
            <i
52
              className="fas fa-mountain"
53
              data-c-color="c1"
54
              data-c-margin="right(.25)"
55
            />
56
            {intl.formatMessage(accordionMessages.personalType)}
57
          </p>
58
        </div>
59
        <div data-c-grid-item="base(1of2) tl(1of3)">
60
          <p data-c-font-weight="bold">
61
            {intl.formatMessage(accordionMessages.personalTitleLabel)}
62
          </p>
63
          {title ? <p>{title}</p> : notApplicable}
64
        </div>
65
        <div data-c-grid-item="base(1of1)">
66
          <p data-c-font-weight="bold">
67
            {intl.formatMessage(accordionMessages.personalDescriptionLabel)}
68
          </p>
69
          {description ? <p>{description}</p> : notApplicable}
70
        </div>
71
        <div data-c-grid-item="base(1of2) tl(1of3)">
72
          <p data-c-font-weight="bold">
73
            {intl.formatMessage(accordionMessages.personalShareLabel)}
74
          </p>
75
          {isShareable ? (
76
            <p>
77
              <i
78
                className="fas fa-check-circle"
79
                data-c-color="go"
80
                data-c-margin="right(.25)"
81
              />
82
              {intl.formatMessage(accordionMessages.personalShareAllowed)}
83
            </p>
84
          ) : (
85
            <p>
86
              <i
87
                className="fas fa-check-circle"
88
                data-c-color="stop"
89
                data-c-margin="right(.25)"
90
              />
91
              {intl.formatMessage(accordionMessages.personalShareDenied)}
92
            </p>
93
          )}
94
        </div>
95
        <div data-c-grid-item="base(1of2) tl(1of3)">
96
          <p data-c-font-weight="bold">
97
            {intl.formatMessage(accordionMessages.startDateLabel)}
98
          </p>
99
          {startDate ? <p>{readableDate(locale, startDate)}</p> : notApplicable}
100
        </div>
101
        <div data-c-grid-item="base(1of2) tl(1of3)">
102
          <p data-c-font-weight="bold">
103
            {intl.formatMessage(accordionMessages.endDateLabel)}
104
          </p>
105
          {isActive ? (
106
            <p>{intl.formatMessage(accordionMessages.ongoing)}</p>
107
          ) : (
108
            endDateOrNa
109
          )}
110
        </div>
111
      </div>
112
    </div>
113
  );
114
};
115
116
interface ProfilePersonalAccordionProps {
117
  experience: ExperiencePersonal;
118
  relevantSkills: ExperienceSkill[];
119
  skillsById: { [id: number]: Skill };
120
  handleDelete: () => Promise<void>;
121
  handleEdit: () => void;
122
  handleEditSkill: (experieSkillId: number) => void;
123
}
124
125
export const ProfilePersonalAccordion: React.FC<ProfilePersonalAccordionProps> = ({
126
  experience,
127
  relevantSkills,
128
  skillsById,
129
  handleDelete,
130
  handleEdit,
131
  handleEditSkill,
132
}) => {
133
  const intl = useIntl();
134
  const locale = getLocale(intl.locale);
135
  const accordionTitle = (
136
    <span data-c-font-weight="bold">{experience.title}</span>
137
  );
138
  const subtitle = titleBarDateRange(
139
    experience.start_date,
140
    experience.end_date,
141
    experience.is_active,
142
    intl,
143
    locale,
144
  );
145
  return (
146
    <ProfileExperienceAccordion
147
      title={accordionTitle}
148
      subtitle={subtitle}
149
      iconClass="fa-mountain"
150
      relevantSkills={relevantSkills}
151
      skillsById={skillsById}
152
      handleDelete={handleDelete}
153
      handleEdit={handleEdit}
154
      handleEditSkill={handleEditSkill}
155
    >
156
      <ExperiencePersonalDetails experience={experience} />
157
    </ProfileExperienceAccordion>
158
  );
159
};
160
interface ExperiencePersonalAccordionProps {
161
  experience: ExperiencePersonal;
162
  relevantSkills: ExperienceSkill[];
163
  skills: Skill[];
164
  irrelevantSkillCount: number;
165
  showSkillDetails: boolean;
166
  showButtons: boolean;
167
  handleDelete: () => Promise<void>;
168
  handleEdit: () => void;
169
}
170
171
export const ExperiencePersonalAccordion: React.FC<ExperiencePersonalAccordionProps> = ({
172
  experience,
173
  relevantSkills,
174
  skills,
175
  irrelevantSkillCount,
176
  showSkillDetails,
177
  showButtons,
178
  handleDelete,
179
  handleEdit,
180
}) => {
181
  const intl = useIntl();
182
  const locale = getLocale(intl.locale);
183
  const accordionTitle = (
184
    <span data-c-font-weight="bold">{experience.title}</span>
185
  );
186
  const subtitle = titleBarDateRange(
187
    experience.start_date,
188
    experience.end_date,
189
    experience.is_active,
190
    intl,
191
    locale,
192
  );
193
  return (
194
    <ApplicationExperienceAccordion
195
      title={accordionTitle}
196
      subtitle={subtitle}
197
      iconClass="fa-mountain"
198
      relevantSkills={relevantSkills}
199
      skills={skills}
200
      irrelevantSkillCount={irrelevantSkillCount}
201
      isEducationJustification={experience.is_education_requirement}
202
      showSkillDetails={showSkillDetails}
203
      showButtons={showButtons}
204
      handleDelete={handleDelete}
205
      handleEdit={handleEdit}
206
    >
207
      <ExperiencePersonalDetails experience={experience} />
208
    </ApplicationExperienceAccordion>
209
  );
210
};
211
212
export default ExperiencePersonalAccordion;
213