Passed
Push — dev ( 4e83ce...723d39 )
by
unknown
03:56
created

resources/assets/js/components/AssessmentPlan/RatingGuideMissing.tsx   A

Complexity

Total Complexity 1
Complexity/F 0

Size

Lines of Code 118
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 1
eloc 91
mnd 1
bc 1
fnc 0
dl 0
loc 118
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import React from "react";
2
import { connect } from "react-redux";
3
import {
4
  FormattedMessage,
5
  WrappedComponentProps,
6
  injectIntl,
7
} from "react-intl";
8
import { Skill, Criteria } from "../../models/types";
9
import { CriteriaTypeId } from "../../models/lookupConstants";
10
import { RootState } from "../../store/store";
11
import {
12
  getCriteriaUnansweredForAssessmentType,
13
  getCriteriaToSkills,
14
} from "../../store/Job/jobSelectorComplex";
15
import { notEmpty } from "../../helpers/queries";
16
import { getLocale, localizeFieldNonNull } from "../../helpers/localize";
17
18
interface RatingGuideMissingProps {
19
  missingCriteria: Criteria[];
20
  criteriaToSkills: { [criteriaId: number]: Skill | null };
21
}
22
23
export const RatingGuideMissing: React.FunctionComponent<
24
  RatingGuideMissingProps & WrappedComponentProps
25
> = ({
26
  missingCriteria,
27
  criteriaToSkills,
28
  intl,
29
}): React.ReactElement | null => {
30
  const locale = getLocale(intl.locale);
31
  const getSkillsForCriteria: (criteria: Criteria[]) => Skill[] = (
32
    criteria,
33
  ): Skill[] =>
34
    criteria
35
      .map(
36
        (criterion: Criteria): Skill | null => criteriaToSkills[criterion.id],
37
      )
38
      .filter(notEmpty);
39
40
  const missingEssentialCriteria = missingCriteria.filter(
41
    (criterion): boolean =>
42
      criterion.criteria_type_id === CriteriaTypeId.Essential,
43
  );
44
  const missingAssetCriteria = missingCriteria.filter(
45
    (criterion): boolean => criterion.criteria_type_id === CriteriaTypeId.Asset,
46
  );
47
  const missingEssentialSkills: Skill[] = getSkillsForCriteria(
48
    missingEssentialCriteria,
49
  );
50
  const missingAssetSkills: Skill[] = getSkillsForCriteria(
51
    missingAssetCriteria,
52
  );
53
54
  if (missingEssentialSkills.length === 0 && missingAssetSkills.length === 0) {
55
    return null;
56
  }
57
  const essentialSkillNames = missingEssentialSkills.map(
58
    (skill: Skill): string => localizeFieldNonNull(locale, skill, "name"),
59
  );
60
  const assetSkillNames = missingAssetSkills.map((skill: Skill): string =>
61
    localizeFieldNonNull(locale, skill, "name"),
62
  );
63
64
  return (
65
    <div data-c-alignment="center" data-c-margin="bottom(normal)">
66
      {missingEssentialSkills.length > 0 && (
67
        <span data-c-font-weight="bold">
68
          <FormattedMessage
69
            id="ratingGuideBuilder.essentialMissing"
70
            defaultMessage="{count} Essential Missing: "
71
            description="Label for list of missing essential skills."
72
            values={{ count: missingEssentialSkills.length }}
73
          />
74
          <span data-c-colour="stop">{essentialSkillNames.join(", ")}</span>
75
        </span>
76
      )}
77
      {missingEssentialSkills.length > 0 && missingAssetSkills.length > 0 && (
78
        <span>{"   "}</span>
79
      )}
80
      {missingAssetSkills.length > 0 && (
81
        <span data-c-font-weight="bold">
82
          <FormattedMessage
83
            id="ratingGuideBuilder.assetMissing"
84
            defaultMessage="{count} Asset Missing: "
85
            description="Label for list of missing asset skills."
86
            values={{ count: missingAssetSkills.length }}
87
          />
88
          <span data-c-colour="stop">{assetSkillNames.join(", ")}</span>
89
        </span>
90
      )}
91
    </div>
92
  );
93
};
94
95
interface RatingGuideMissingContainerProps {
96
  jobId: number;
97
  assessmentTypeId: number;
98
}
99
100
const mapStateToProps = (
101
  state: RootState,
102
  ownProps: RatingGuideMissingContainerProps,
103
): {
104
  missingCriteria: Criteria[];
105
  criteriaToSkills: { [criteriaId: number]: Skill | null };
106
} => {
107
  return {
108
    missingCriteria: getCriteriaUnansweredForAssessmentType(state, ownProps),
109
    criteriaToSkills: getCriteriaToSkills(state),
110
  };
111
};
112
113
const RatingGuideMissingContainer = connect(mapStateToProps)(
114
  injectIntl(RatingGuideMissing),
115
);
116
117
export default RatingGuideMissingContainer;
118