Passed
Push — feature/basic-application-endp... ( 39b0fe...edc7f1 )
by Chris
04:18
created

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

Complexity

Total Complexity 1
Complexity/F 0

Size

Lines of Code 117
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

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