@instructure/quiz-core 20.7.1-rc.1 → 20.7.1-rc.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (19) hide show
  1. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ScoreDistributionType/Table/index.js +120 -0
  2. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ScoreDistributionType/Table/styles.js +38 -0
  3. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ScoreDistributionType/Table/theme.js +11 -0
  4. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ScoreDistributionType/index.js +55 -0
  5. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/presenter.js +9 -0
  6. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AfsTableWrapper/presenter.js +8 -2
  7. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AggregationTable/presenter.js +34 -39
  8. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/index.js +3 -1
  9. package/es/reporting/components/resources/NewQuizAndItemAnalysis/propTypes.js +17 -4
  10. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ScoreDistributionType/Table/index.js +140 -0
  11. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ScoreDistributionType/Table/styles.js +46 -0
  12. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ScoreDistributionType/Table/theme.js +19 -0
  13. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ScoreDistributionType/index.js +80 -0
  14. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/presenter.js +10 -0
  15. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AfsTableWrapper/presenter.js +8 -2
  16. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AggregationTable/presenter.js +33 -38
  17. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/index.js +3 -1
  18. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/propTypes.js +24 -5
  19. package/package.json +9 -9
@@ -0,0 +1,120 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
+ import _createClass from "@babel/runtime/helpers/esm/createClass";
3
+ import _inherits from "@babel/runtime/helpers/esm/inherits";
4
+ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
5
+
6
+ var _dec, _class, _class2, _temp;
7
+
8
+ /** @jsx jsx */
9
+ import { scoreDistributionType } from "../../../propTypes.js";
10
+ import { Component } from 'react';
11
+ import t from '@instructure/quiz-i18n/es/format-message';
12
+ import { Table } from '@instructure/ui-table';
13
+ import PropTypes from 'prop-types';
14
+ import { withStyle, jsx } from '@instructure/emotion';
15
+ import generateStyle from "./styles.js";
16
+ import generateComponentTheme from "./theme.js";
17
+ export var ScoreDistributionTypeTable = (_dec = withStyle(generateStyle, generateComponentTheme), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
18
+ _inherits(ScoreDistributionTypeTable, _Component);
19
+
20
+ var _super = _createSuper(ScoreDistributionTypeTable);
21
+
22
+ function ScoreDistributionTypeTable() {
23
+ var _this;
24
+
25
+ _classCallCheck(this, ScoreDistributionTypeTable);
26
+
27
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
28
+ args[_key] = arguments[_key];
29
+ }
30
+
31
+ _this = _super.call.apply(_super, [this].concat(args));
32
+
33
+ _this.renderFirstCell = function (content) {
34
+ return jsx("div", {
35
+ css: _this.props.styles.firstTextContainer
36
+ }, content);
37
+ };
38
+
39
+ _this.renderCell = function (content) {
40
+ return jsx("div", {
41
+ css: _this.props.styles.textContainer
42
+ }, content);
43
+ };
44
+
45
+ _this.renderRow = function (choice, choiceIndex) {
46
+ var count = choice.count,
47
+ score = choice.score,
48
+ percentage = choice.percentage;
49
+ return jsx(Table.Row, {
50
+ key: choiceIndex
51
+ }, jsx(Table.Cell, {
52
+ themeOverride: {
53
+ padding: '0'
54
+ }
55
+ }, _this.renderFirstCell(score)), jsx(Table.Cell, {
56
+ themeOverride: {
57
+ padding: '0'
58
+ }
59
+ }, _this.renderCell(count)), jsx(Table.Cell, {
60
+ themeOverride: {
61
+ padding: '0'
62
+ },
63
+ textAlign: "center"
64
+ }, _this.renderCell("".concat(percentage, "%"))));
65
+ };
66
+
67
+ return _this;
68
+ }
69
+
70
+ _createClass(ScoreDistributionTypeTable, [{
71
+ key: "componentDidMount",
72
+ value: function componentDidMount() {
73
+ this.props.makeStyles();
74
+ }
75
+ }, {
76
+ key: "componentDidUpdate",
77
+ value: function componentDidUpdate() {
78
+ this.props.makeStyles();
79
+ }
80
+ }, {
81
+ key: "render",
82
+ value: function render() {
83
+ var _this$props = this.props,
84
+ scores = _this$props.scores,
85
+ itemId = _this$props.itemId,
86
+ styles = _this$props.styles;
87
+ var pointsHeaderId = "answer-frequency-summary-points-".concat(itemId);
88
+ var respondentsHeaderId = "answer-frequency-summary-respondents-".concat(itemId);
89
+ var percentageHeaderId = "answer-frequency-summary-percentage-".concat(itemId);
90
+ return jsx("div", {
91
+ css: styles.tableContainer
92
+ }, jsx(Table, {
93
+ caption: t('Score Frequency Summary'),
94
+ elementRef: this.setTableRef
95
+ }, jsx(Table.Head, null, jsx(Table.Row, null, jsx(Table.ColHeader, {
96
+ id: pointsHeaderId,
97
+ height: "47px"
98
+ }, t('Points')), jsx(Table.ColHeader, {
99
+ id: respondentsHeaderId,
100
+ height: "47px",
101
+ textAlign: "center"
102
+ }, t('Respondents')), jsx(Table.ColHeader, {
103
+ id: percentageHeaderId,
104
+ height: "47px",
105
+ textAlign: "center"
106
+ }, t('%')))), jsx(Table.Body, null, scores.map(this.renderRow))));
107
+ }
108
+ }]);
109
+
110
+ ScoreDistributionTypeTable.displayName = "ScoreDistributionTypeTable";
111
+ return ScoreDistributionTypeTable;
112
+ }(Component), _class2.propTypes = {
113
+ itemId: PropTypes.number.isRequired,
114
+ scores: PropTypes.arrayOf(scoreDistributionType).isRequired,
115
+ // eslint-disable-next-line react/require-default-props
116
+ makeStyles: PropTypes.func,
117
+ // eslint-disable-next-line react/require-default-props,react/forbid-prop-types
118
+ styles: PropTypes.object
119
+ }, _temp)) || _class);
120
+ export default ScoreDistributionTypeTable;
@@ -0,0 +1,38 @@
1
+ var generateStyle = function generateStyle(componentTheme) {
2
+ var borderBottom = "solid 0.0625rem ".concat(componentTheme.colorGray);
3
+ return {
4
+ tableContainer: {
5
+ width: 'calc(25% + 350px)',
6
+ maxWidth: '100%',
7
+ '& table': {
8
+ borderCollapse: 'separate',
9
+ borderSpacing: '0 1px',
10
+ '& thead tr': {
11
+ '& th, & td': {
12
+ borderBottom: borderBottom
13
+ }
14
+ },
15
+ '& tbody tr': {
16
+ '& th, & td': {
17
+ width: '33.33%',
18
+ borderBottom: borderBottom
19
+ },
20
+ '& th': {
21
+ fontWeight: 400
22
+ }
23
+ }
24
+ }
25
+ },
26
+ textContainer: {
27
+ height: 'calc(100% - 4px)',
28
+ display: 'flex',
29
+ alignItems: 'center',
30
+ justifyContent: 'center'
31
+ },
32
+ firstTextContainer: {
33
+ padding: componentTheme.cellPadding
34
+ }
35
+ };
36
+ };
37
+
38
+ export default generateStyle;
@@ -0,0 +1,11 @@
1
+ var generateComponentTheme = function generateComponentTheme(_ref) {
2
+ var spacing = _ref.spacing,
3
+ colors = _ref.colors;
4
+ return {
5
+ tableBottomPadding: spacing === null || spacing === void 0 ? void 0 : spacing.medium,
6
+ colorGray: colors === null || colors === void 0 ? void 0 : colors.tiara,
7
+ cellPadding: "".concat(spacing === null || spacing === void 0 ? void 0 : spacing.small, " ").concat(spacing === null || spacing === void 0 ? void 0 : spacing.small)
8
+ };
9
+ };
10
+
11
+ export default generateComponentTheme;
@@ -0,0 +1,55 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
+ import _inherits from "@babel/runtime/helpers/esm/inherits";
3
+ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
4
+ import React, { Component } from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import ScoreDistributionTypeTable from "./Table/index.js";
7
+ import { scoreDistributionTypeAnswerSummaryPropType } from "../../propTypes.js";
8
+ import AggregationTable from "../shared/AggregationTable/index.js";
9
+ import { AfsPartsContainer } from "../shared/AfsPartsContainer/presenter.js";
10
+ import AfsTableWrapper from "../shared/AfsTableWrapper/index.js";
11
+ import t from '@instructure/quiz-i18n/es/format-message';
12
+ export var ScoreDistributionType = /*#__PURE__*/function (_Component) {
13
+ _inherits(ScoreDistributionType, _Component);
14
+
15
+ var _super = _createSuper(ScoreDistributionType);
16
+
17
+ function ScoreDistributionType() {
18
+ var _this;
19
+
20
+ _classCallCheck(this, ScoreDistributionType);
21
+
22
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
23
+ args[_key] = arguments[_key];
24
+ }
25
+
26
+ _this = _super.call.apply(_super, [this].concat(args));
27
+
28
+ _this.render = function () {
29
+ var _this$props = _this.props,
30
+ answerSummary = _this$props.answerSummary,
31
+ itemId = _this$props.itemId;
32
+ return /*#__PURE__*/React.createElement(AfsTableWrapper, {
33
+ tableHeader: t('Score Frequency Summary')
34
+ }, /*#__PURE__*/React.createElement(AfsPartsContainer, {
35
+ afsTable: /*#__PURE__*/React.createElement(ScoreDistributionTypeTable, {
36
+ itemId: itemId,
37
+ scores: answerSummary.score_distribution
38
+ }),
39
+ aggregationTable: /*#__PURE__*/React.createElement(AggregationTable, {
40
+ itemId: itemId,
41
+ answerSummary: answerSummary
42
+ })
43
+ }));
44
+ };
45
+
46
+ return _this;
47
+ }
48
+
49
+ return ScoreDistributionType;
50
+ }(Component);
51
+ ScoreDistributionType.propTypes = {
52
+ itemId: PropTypes.number,
53
+ answerSummary: scoreDistributionTypeAnswerSummaryPropType
54
+ }.isRequired;
55
+ export default ScoreDistributionType;
@@ -8,6 +8,7 @@ import ChoiceType from "./ChoiceType/index.js";
8
8
  import RichFillBlankType from "./RichFillBlankType/index.js";
9
9
  import AggregationType from "./AggregationType/index.js";
10
10
  import { MatchingType, OrderingType, CategorizationType } from "./MatchingType/index.js";
11
+ import { ScoreDistributionType } from "./ScoreDistributionType/index.js";
11
12
  import { afsFlags, answerSummaryPropType } from "../propTypes.js";
12
13
  export var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
13
14
  _inherits(AnswerFrequencySummary, _Component);
@@ -62,6 +63,14 @@ export var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
62
63
  if (afsFlags.fillInTheBlankEnabled) {
63
64
  _this.afsTableComponentMap.set('rich-fill-blank', RichFillBlankType);
64
65
  }
66
+
67
+ if (afsFlags.essayEnabled) {
68
+ _this.afsTableComponentMap.set('essay', ScoreDistributionType);
69
+ }
70
+
71
+ if (afsFlags.fileUploadEnabled) {
72
+ _this.afsTableComponentMap.set('file-upload', ScoreDistributionType);
73
+ }
65
74
  };
66
75
 
67
76
  _this.render = function () {
@@ -28,6 +28,11 @@ export var AfsTableWrapper = (_dec = withStyle(generateStyle, null), _dec(_class
28
28
 
29
29
  _this = _super.call.apply(_super, [this].concat(args));
30
30
 
31
+ _this.getHeader = function () {
32
+ var tableHeader = _this.props.tableHeader;
33
+ return tableHeader || t('Answer Frequency Summary');
34
+ };
35
+
31
36
  _this.render = function () {
32
37
  return jsx(Flex, {
33
38
  direction: "row",
@@ -41,7 +46,7 @@ export var AfsTableWrapper = (_dec = withStyle(generateStyle, null), _dec(_class
41
46
  level: "h3",
42
47
  weight: "bold",
43
48
  color: "primary"
44
- }, t('Answer Frequency Summary')), _this.props.children)));
49
+ }, _this.getHeader()), _this.props.children)));
45
50
  };
46
51
 
47
52
  return _this;
@@ -50,5 +55,6 @@ export var AfsTableWrapper = (_dec = withStyle(generateStyle, null), _dec(_class
50
55
  return AfsTableWrapper;
51
56
  }(Component), _class2.propTypes = {
52
57
  children: PropTypes.node.isRequired,
53
- styles: PropTypes.object
58
+ styles: PropTypes.object,
59
+ tableHeader: PropTypes.string
54
60
  }, _temp)) || _class);
@@ -9,28 +9,28 @@ import t from '@instructure/quiz-i18n/es/format-message';
9
9
  import { Table } from '@instructure/ui-table';
10
10
  import { onlyAggregatePropType } from "../../../propTypes.js";
11
11
  import PropTypes from 'prop-types';
12
- import { IconCheckSolid, IconXSolid, IconNoSolid, IconOvalHalfSolid } from '@instructure/ui-icons';
12
+ import { IconCheckSolid, IconXSolid, IconNoSolid, IconGradebookSolid } from '@instructure/ui-icons';
13
13
  import { themeable } from '@instructure/ui-themeable';
14
14
  import theme from "./theme.js";
15
15
  var styles = {
16
- componentId: 'fSsSV',
16
+ componentId: 'fMmrG',
17
17
  template: function template(theme) {
18
- return "\n\n.fSsSV_cvRx{align-items:center;display:flex;height:100%;justify-content:center;min-height:47px;width:46px}\n\n.fSsSV_fPIL{min-width:500px}\n\n.fSsSV_fPIL table{border-collapse:separate;border-spacing:0 12px}\n\n.fSsSV_fPIL thead th{border-color:".concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}\n\n.fSsSV_fPIL table tbody tr td{border-style:solid;border-width:2px 0 2px 0;width:33.33%}\n\n.fSsSV_fPIL table tbody tr th:first-child{border-radius:4px 0 0 4px;border-style:solid;border-width:2px 0 2px 2px;font-weight:400}\n\n.fSsSV_fPIL table tbody tr td:last-child{border-radius:0 4px 4px 0;border-style:solid;border-width:2px 2px 2px 0}\n\n.fSsSV_dzqP table tbody tr:first-child td,.fSsSV_dzqP table tbody tr:first-child th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fSsSV_fZpZ table tbody tr:first-child td,.fSsSV_fZpZ table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fSsSV_fZpZ table tbody tr:nth-child(2) td,.fSsSV_fZpZ table tbody tr:nth-child(2) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fSsSV_dgTJ table tbody tr:first-child td,.fSsSV_dgTJ table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fSsSV_dgTJ table tbody tr:nth-child(2) td,.fSsSV_dgTJ table tbody tr:nth-child(2) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fSsSV_dgTJ table tbody tr:nth-child(3) td,.fSsSV_dgTJ table tbody tr:nth-child(3) th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fSsSV_bUPM table tbody tr:first-child td,.fSsSV_bUPM table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fSsSV_bUPM table tbody tr:nth-child(2) td,.fSsSV_bUPM table tbody tr:nth-child(2) th{border-color:").concat(theme.colorBlue || 'inherit', "}\n\n.fSsSV_bUPM table tbody tr:nth-child(3) td,.fSsSV_bUPM table tbody tr:nth-child(3) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fSsSV_bUPM table tbody tr:nth-child(4) td,.fSsSV_bUPM table tbody tr:nth-child(4) th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fSsSV_bvau{background-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fSsSV_cxOH{background-color:").concat(theme.colorRed || 'inherit', "}\n\n.fSsSV_eRkO{background-color:").concat(theme.colorBlue || 'inherit', "}\n\n.fSsSV_eKcq{background-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fSsSV_euQM{padding:12px 0 12px 10px}\n\n.fSsSV_fuuc{padding-left:45px}\n\n.fSsSV_vDgC svg{fill:#fff}\n\n.fSsSV_fHMm{border-color:").concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}");
18
+ return "\n\n.fMmrG_cvRx{align-items:center;display:flex;height:100%;justify-content:center;min-height:47px;width:46px}\n\n.fMmrG_fPIL{min-width:500px}\n\n.fMmrG_fPIL table{border-collapse:separate;border-spacing:0 12px}\n\n.fMmrG_fPIL thead th{border-color:".concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}\n\n.fMmrG_fPIL table tbody tr td{border-style:solid;border-width:2px 0 2px 0;width:33.33%}\n\n.fMmrG_fPIL table tbody tr th:first-child{border-radius:4px 0 0 4px;border-style:solid;border-width:2px 0 2px 2px;font-weight:400}\n\n.fMmrG_fPIL table tbody tr td:last-child{border-radius:0 4px 4px 0;border-style:solid;border-width:2px 2px 2px 0}\n\n.fMmrG_dzqP table tbody tr:first-child td,.fMmrG_dzqP table tbody tr:first-child th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fMmrG_fZpZ table tbody tr:first-child td,.fMmrG_fZpZ table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fMmrG_fZpZ table tbody tr:nth-child(2) td,.fMmrG_fZpZ table tbody tr:nth-child(2) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fMmrG_dgTJ table tbody tr:first-child td,.fMmrG_dgTJ table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fMmrG_dgTJ table tbody tr:nth-child(2) td,.fMmrG_dgTJ table tbody tr:nth-child(2) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fMmrG_dgTJ table tbody tr:nth-child(3) td,.fMmrG_dgTJ table tbody tr:nth-child(3) th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fMmrG_bYLj table tbody tr:first-child td,.fMmrG_bYLj table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fMmrG_bYLj table tbody tr:nth-child(2) td,.fMmrG_bYLj table tbody tr:nth-child(2) th{border-color:").concat(theme.colorBlue || 'inherit', "}\n\n.fMmrG_bYLj table tbody tr:nth-child(3) td,.fMmrG_bYLj table tbody tr:nth-child(3) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fMmrG_bYLj table tbody tr:nth-child(4) td,.fMmrG_bYLj table tbody tr:nth-child(4) th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fMmrG_bvau{background-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fMmrG_cxOH{background-color:").concat(theme.colorRed || 'inherit', "}\n\n.fMmrG_dsqS{background-color:").concat(theme.colorBlue || 'inherit', "}\n\n.fMmrG_eKcq{background-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fMmrG_euQM{padding:12px 0 12px 10px}\n\n.fMmrG_fuuc{padding-left:45px}\n\n.fMmrG_vDgC svg{fill:#fff}\n\n.fMmrG_fHMm{border-color:").concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}");
19
19
  },
20
- 'iconWrapper': 'fSsSV_cvRx',
21
- 'collapsingTable': 'fSsSV_fPIL',
22
- 'onlyNoanswer': 'fSsSV_dzqP',
23
- 'correctIncorrect': 'fSsSV_fZpZ',
24
- 'correctIncorrectNoanswer': 'fSsSV_dgTJ',
25
- 'correctIncorrectNoanswerPartial': 'fSsSV_bUPM',
26
- 'correctBackground': 'fSsSV_bvau',
27
- 'incorrectBackground': 'fSsSV_cxOH',
28
- 'partialCorrectBackground': 'fSsSV_eRkO',
29
- 'noAnswerBackground': 'fSsSV_eKcq',
30
- 'labelWrapper': 'fSsSV_euQM',
31
- 'firstHeaderCell': 'fSsSV_fuuc',
32
- 'iconWhite': 'fSsSV_vDgC',
33
- 'headerCell': 'fSsSV_fHMm'
20
+ 'iconWrapper': 'fMmrG_cvRx',
21
+ 'collapsingTable': 'fMmrG_fPIL',
22
+ 'onlyNoanswer': 'fMmrG_dzqP',
23
+ 'correctIncorrect': 'fMmrG_fZpZ',
24
+ 'correctIncorrectNoanswer': 'fMmrG_dgTJ',
25
+ 'correctIncorrectNoanswerGraded': 'fMmrG_bYLj',
26
+ 'correctBackground': 'fMmrG_bvau',
27
+ 'incorrectBackground': 'fMmrG_cxOH',
28
+ 'gradedBackground': 'fMmrG_dsqS',
29
+ 'noAnswerBackground': 'fMmrG_eKcq',
30
+ 'labelWrapper': 'fMmrG_euQM',
31
+ 'firstHeaderCell': 'fMmrG_fuuc',
32
+ 'iconWhite': 'fMmrG_vDgC',
33
+ 'headerCell': 'fMmrG_fHMm'
34
34
  };
35
35
  import { Flex } from '@instructure/ui-flex';
36
36
  import classNames from 'classnames';
@@ -40,11 +40,11 @@ import { noAnswerMissing } from "./popoverContent.js";
40
40
  var noAnswerKey = 'noAnswer';
41
41
  var incorrectKey = 'incorrect';
42
42
  var correctKey = 'correct';
43
- var partialCorrectKey = 'partialCorrect';
43
+ var gradedKey = 'graded';
44
44
 
45
45
  var _ref = /*#__PURE__*/React.createElement(IconCheckSolid, null);
46
46
 
47
- var _ref2 = /*#__PURE__*/React.createElement(IconOvalHalfSolid, null);
47
+ var _ref2 = /*#__PURE__*/React.createElement(IconGradebookSolid, null);
48
48
 
49
49
  var _ref3 = /*#__PURE__*/React.createElement(IconXSolid, null);
50
50
 
@@ -122,9 +122,9 @@ export var AggregationTable = (_dec = themeable(theme, styles), _dec(_class = (_
122
122
  }, /*#__PURE__*/React.createElement(Text, null, concatenatedPercentage)));
123
123
  };
124
124
 
125
- _this.partialCorrectExist = function () {
126
- var aggregate = _this.props.answerSummary.aggregate;
127
- return !!(aggregate === null || aggregate === void 0 ? void 0 : aggregate.partial_correct);
125
+ _this.gradedExist = function () {
126
+ var graded = _this.props.answerSummary.graded;
127
+ return !!graded;
128
128
  };
129
129
 
130
130
  _this.correctExist = function () {
@@ -142,24 +142,19 @@ export var AggregationTable = (_dec = themeable(theme, styles), _dec(_class = (_
142
142
  return !!no_answer;
143
143
  };
144
144
 
145
- _this.getCorrectLabel = function () {
146
- return _this.partialCorrectExist() ? t('Fully correct') : t('Correct');
147
- };
148
-
149
145
  _this.renderCorrect = function () {
150
146
  var aggregate = _this.props.answerSummary.aggregate;
151
147
  var correct = aggregate.correct;
152
148
  var correctCount = correct.count || 0;
153
149
  var correctPercentage = correct.percentage || 0;
154
- return _this.renderRow(correctKey, _ref, _this.getCorrectLabel(), correctCount, correctPercentage);
150
+ return _this.renderRow(correctKey, _ref, t('Correct'), correctCount, correctPercentage);
155
151
  };
156
152
 
157
- _this.renderPartialCorrect = function () {
158
- var aggregate = _this.props.answerSummary.aggregate;
159
- var partial_correct = aggregate.partial_correct;
160
- var partialCorrectCount = partial_correct.count || 0;
161
- var partialCorrectPercentage = partial_correct.percentage || 0;
162
- return _this.renderRow(partialCorrectKey, _ref2, t('Partially correct'), partialCorrectCount, partialCorrectPercentage);
153
+ _this.renderGraded = function () {
154
+ var graded = _this.props.answerSummary.graded;
155
+ var gradedCount = graded.count || 0;
156
+ var gradedPercentage = graded.percentage || 0;
157
+ return _this.renderRow(gradedKey, _ref2, t('Graded'), gradedCount, gradedPercentage);
163
158
  };
164
159
 
165
160
  _this.renderIncorrect = function () {
@@ -180,16 +175,16 @@ export var AggregationTable = (_dec = themeable(theme, styles), _dec(_class = (_
180
175
  _this.getColorProfile = function () {
181
176
  var colorProfile;
182
177
 
183
- var correctIncorrectNoAnswerPartial = _this.partialCorrectExist() && _this.noAnswerExist() && _this.correctExist() && _this.incorrectExist();
178
+ var correctIncorrectNoAnswerGraded = _this.gradedExist() && _this.noAnswerExist() && _this.correctExist() && _this.incorrectExist();
184
179
 
185
- var correctIncorrectNoAnswer = !_this.partialCorrectExist() && _this.noAnswerExist() && _this.correctExist() && _this.incorrectExist();
180
+ var correctIncorrectNoAnswer = !_this.gradedExist() && _this.noAnswerExist() && _this.correctExist() && _this.incorrectExist();
186
181
 
187
- var onlyNoAnswer = _this.noAnswerExist() && !_this.partialCorrectExist() && !_this.correctExist() && !_this.incorrectExist();
182
+ var onlyNoAnswer = _this.noAnswerExist() && !_this.gradedExist() && !_this.correctExist() && !_this.incorrectExist();
188
183
 
189
184
  if (correctIncorrectNoAnswer) {
190
185
  colorProfile = 'correctIncorrectNoanswer';
191
- } else if (correctIncorrectNoAnswerPartial) {
192
- colorProfile = 'correctIncorrectNoanswerPartial';
186
+ } else if (correctIncorrectNoAnswerGraded) {
187
+ colorProfile = 'correctIncorrectNoanswerGraded';
193
188
  } else if (onlyNoAnswer) {
194
189
  colorProfile = 'onlyNoanswer';
195
190
  } else {
@@ -205,7 +200,7 @@ export var AggregationTable = (_dec = themeable(theme, styles), _dec(_class = (_
205
200
  className: classNames(styles.collapsingTable, styles[_this.getColorProfile()])
206
201
  }, /*#__PURE__*/React.createElement(Table, {
207
202
  caption: t('Answer Frequency Summary Aggregates')
208
- }, _this.renderHeaderRow(popover), /*#__PURE__*/React.createElement(Table.Body, null, _this.correctExist() && _this.renderCorrect(), _this.partialCorrectExist() && _this.renderPartialCorrect(), _this.incorrectExist() && _this.renderIncorrect(), _this.noAnswerExist() && _this.renderNoAnswer())));
203
+ }, _this.renderHeaderRow(popover), /*#__PURE__*/React.createElement(Table.Body, null, _this.correctExist() && _this.renderCorrect(), _this.gradedExist() && _this.renderGraded(), _this.incorrectExist() && _this.renderIncorrect(), _this.noAnswerExist() && _this.renderNoAnswer())));
209
204
  };
210
205
 
211
206
  return _this;
@@ -13,7 +13,9 @@ function mapStateToProps(_state) {
13
13
  trueFalseEnabled: featureOn('ia_true_false_afs'),
14
14
  choiceEnabled: featureOn('ia_choice_afs'),
15
15
  multiAnswerEnabled: featureOn('ia_multi_answer_afs'),
16
- fillInTheBlankEnabled: featureOn('ia_rich_fill_blank_afs')
16
+ fillInTheBlankEnabled: featureOn('ia_rich_fill_blank_afs'),
17
+ essayEnabled: featureOn('ia_essay_afs'),
18
+ fileUploadEnabled: featureOn('ia_file_upload_afs')
17
19
  }
18
20
  };
19
21
  }
@@ -32,11 +32,11 @@ export var aggregateDetailPropType = PropTypes.shape({
32
32
  });
33
33
  export var aggregatePropType = PropTypes.shape({
34
34
  correct: aggregateDetailPropType.isRequired,
35
- incorrect: aggregateDetailPropType.isRequired,
36
- partial_correct: aggregateDetailPropType
35
+ incorrect: aggregateDetailPropType.isRequired
37
36
  });
38
37
  export var onlyAggregatePropType = PropTypes.shape({
39
38
  no_answer: aggregateDetailPropType,
39
+ graded: aggregateDetailPropType,
40
40
  aggregate: aggregatePropType
41
41
  });
42
42
  export var choiceTypeObject = PropTypes.shape({
@@ -50,6 +50,17 @@ export var choiceTypeAnswerSummaryPropType = PropTypes.shape({
50
50
  no_answer: aggregateDetailPropType,
51
51
  aggregate: aggregatePropType
52
52
  });
53
+ export var scoreDistributionTypeAnswerSummaryPropType = PropTypes.shape({
54
+ no_answer: aggregateDetailPropType.isRequired,
55
+ aggregate: aggregatePropType.isRequired,
56
+ graded: aggregateDetailPropType.isRequired,
57
+ score_distribution: PropTypes.arrayOf(scoreDistributionType).isRequired
58
+ });
59
+ export var scoreDistributionType = PropTypes.shape({
60
+ count: PropTypes.number.isRequired,
61
+ score: PropTypes.number.isRequired,
62
+ percentage: PropTypes.number.isRequired
63
+ });
53
64
  export var matchingTypeAnswerSummaryPropType = PropTypes.shape({
54
65
  questions: PropTypes.objectOf(PropTypes.shape({
55
66
  body: PropTypes.string,
@@ -77,7 +88,7 @@ export var richFillBlankTypeAnswerSummaryPropType = PropTypes.shape({
77
88
  no_answer: aggregateDetailPropType,
78
89
  aggregate: aggregatePropType
79
90
  });
80
- export var answerSummaryPropType = PropTypes.oneOfType([choiceTypeAnswerSummaryPropType, onlyAggregatePropType, matchingTypeAnswerSummaryPropType, richFillBlankTypeAnswerSummaryPropType]);
91
+ export var answerSummaryPropType = PropTypes.oneOfType([choiceTypeAnswerSummaryPropType, onlyAggregatePropType, matchingTypeAnswerSummaryPropType, richFillBlankTypeAnswerSummaryPropType, scoreDistributionTypeAnswerSummaryPropType]);
81
92
  export var itemAnalysisPropType = PropTypes.shape({
82
93
  attempts: PropTypes.shape({
83
94
  students_responded: PropTypes.number,
@@ -109,5 +120,7 @@ export var afsFlags = PropTypes.shape({
109
120
  trueFalseEnabled: PropTypes.bool.isRequired,
110
121
  choiceEnabled: PropTypes.bool.isRequired,
111
122
  multiAnswerEnabled: PropTypes.bool.isRequired,
112
- fillInTheBlankEnabled: PropTypes.bool.isRequired
123
+ fillInTheBlankEnabled: PropTypes.bool.isRequired,
124
+ essayEnabled: PropTypes.bool.isRequired,
125
+ fileUploadEnabled: PropTypes.bool.isRequired
113
126
  });
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = exports.ScoreDistributionTypeTable = void 0;
9
+
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+
14
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
+
16
+ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
17
+
18
+ var _propTypes = require("../../../propTypes.js");
19
+
20
+ var _react = require("react");
21
+
22
+ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
23
+
24
+ var _uiTable = require("@instructure/ui-table");
25
+
26
+ var _propTypes2 = _interopRequireDefault(require("prop-types"));
27
+
28
+ var _emotion = require("@instructure/emotion");
29
+
30
+ var _styles = _interopRequireDefault(require("./styles.js"));
31
+
32
+ var _theme = _interopRequireDefault(require("./theme.js"));
33
+
34
+ var _dec, _class, _class2, _temp;
35
+
36
+ var ScoreDistributionTypeTable = (_dec = (0, _emotion.withStyle)(_styles.default, _theme.default), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
37
+ (0, _inherits2.default)(ScoreDistributionTypeTable, _Component);
38
+
39
+ var _super = (0, _createSuper2.default)(ScoreDistributionTypeTable);
40
+
41
+ function ScoreDistributionTypeTable() {
42
+ var _this;
43
+
44
+ (0, _classCallCheck2.default)(this, ScoreDistributionTypeTable);
45
+
46
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
47
+ args[_key] = arguments[_key];
48
+ }
49
+
50
+ _this = _super.call.apply(_super, [this].concat(args));
51
+
52
+ _this.renderFirstCell = function (content) {
53
+ return (0, _emotion.jsx)("div", {
54
+ css: _this.props.styles.firstTextContainer
55
+ }, content);
56
+ };
57
+
58
+ _this.renderCell = function (content) {
59
+ return (0, _emotion.jsx)("div", {
60
+ css: _this.props.styles.textContainer
61
+ }, content);
62
+ };
63
+
64
+ _this.renderRow = function (choice, choiceIndex) {
65
+ var count = choice.count,
66
+ score = choice.score,
67
+ percentage = choice.percentage;
68
+ return (0, _emotion.jsx)(_uiTable.Table.Row, {
69
+ key: choiceIndex
70
+ }, (0, _emotion.jsx)(_uiTable.Table.Cell, {
71
+ themeOverride: {
72
+ padding: '0'
73
+ }
74
+ }, _this.renderFirstCell(score)), (0, _emotion.jsx)(_uiTable.Table.Cell, {
75
+ themeOverride: {
76
+ padding: '0'
77
+ }
78
+ }, _this.renderCell(count)), (0, _emotion.jsx)(_uiTable.Table.Cell, {
79
+ themeOverride: {
80
+ padding: '0'
81
+ },
82
+ textAlign: "center"
83
+ }, _this.renderCell("".concat(percentage, "%"))));
84
+ };
85
+
86
+ return _this;
87
+ }
88
+
89
+ (0, _createClass2.default)(ScoreDistributionTypeTable, [{
90
+ key: "componentDidMount",
91
+ value: function componentDidMount() {
92
+ this.props.makeStyles();
93
+ }
94
+ }, {
95
+ key: "componentDidUpdate",
96
+ value: function componentDidUpdate() {
97
+ this.props.makeStyles();
98
+ }
99
+ }, {
100
+ key: "render",
101
+ value: function render() {
102
+ var _this$props = this.props,
103
+ scores = _this$props.scores,
104
+ itemId = _this$props.itemId,
105
+ styles = _this$props.styles;
106
+ var pointsHeaderId = "answer-frequency-summary-points-".concat(itemId);
107
+ var respondentsHeaderId = "answer-frequency-summary-respondents-".concat(itemId);
108
+ var percentageHeaderId = "answer-frequency-summary-percentage-".concat(itemId);
109
+ return (0, _emotion.jsx)("div", {
110
+ css: styles.tableContainer
111
+ }, (0, _emotion.jsx)(_uiTable.Table, {
112
+ caption: (0, _formatMessage.default)('Score Frequency Summary'),
113
+ elementRef: this.setTableRef
114
+ }, (0, _emotion.jsx)(_uiTable.Table.Head, null, (0, _emotion.jsx)(_uiTable.Table.Row, null, (0, _emotion.jsx)(_uiTable.Table.ColHeader, {
115
+ id: pointsHeaderId,
116
+ height: "47px"
117
+ }, (0, _formatMessage.default)('Points')), (0, _emotion.jsx)(_uiTable.Table.ColHeader, {
118
+ id: respondentsHeaderId,
119
+ height: "47px",
120
+ textAlign: "center"
121
+ }, (0, _formatMessage.default)('Respondents')), (0, _emotion.jsx)(_uiTable.Table.ColHeader, {
122
+ id: percentageHeaderId,
123
+ height: "47px",
124
+ textAlign: "center"
125
+ }, (0, _formatMessage.default)('%')))), (0, _emotion.jsx)(_uiTable.Table.Body, null, scores.map(this.renderRow))));
126
+ }
127
+ }]);
128
+ ScoreDistributionTypeTable.displayName = "ScoreDistributionTypeTable";
129
+ return ScoreDistributionTypeTable;
130
+ }(_react.Component), _class2.propTypes = {
131
+ itemId: _propTypes2.default.number.isRequired,
132
+ scores: _propTypes2.default.arrayOf(_propTypes.scoreDistributionType).isRequired,
133
+ // eslint-disable-next-line react/require-default-props
134
+ makeStyles: _propTypes2.default.func,
135
+ // eslint-disable-next-line react/require-default-props,react/forbid-prop-types
136
+ styles: _propTypes2.default.object
137
+ }, _temp)) || _class);
138
+ exports.ScoreDistributionTypeTable = ScoreDistributionTypeTable;
139
+ var _default = ScoreDistributionTypeTable;
140
+ exports.default = _default;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var generateStyle = function generateStyle(componentTheme) {
9
+ var borderBottom = "solid 0.0625rem ".concat(componentTheme.colorGray);
10
+ return {
11
+ tableContainer: {
12
+ width: 'calc(25% + 350px)',
13
+ maxWidth: '100%',
14
+ '& table': {
15
+ borderCollapse: 'separate',
16
+ borderSpacing: '0 1px',
17
+ '& thead tr': {
18
+ '& th, & td': {
19
+ borderBottom: borderBottom
20
+ }
21
+ },
22
+ '& tbody tr': {
23
+ '& th, & td': {
24
+ width: '33.33%',
25
+ borderBottom: borderBottom
26
+ },
27
+ '& th': {
28
+ fontWeight: 400
29
+ }
30
+ }
31
+ }
32
+ },
33
+ textContainer: {
34
+ height: 'calc(100% - 4px)',
35
+ display: 'flex',
36
+ alignItems: 'center',
37
+ justifyContent: 'center'
38
+ },
39
+ firstTextContainer: {
40
+ padding: componentTheme.cellPadding
41
+ }
42
+ };
43
+ };
44
+
45
+ var _default = generateStyle;
46
+ exports.default = _default;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var generateComponentTheme = function generateComponentTheme(_ref) {
9
+ var spacing = _ref.spacing,
10
+ colors = _ref.colors;
11
+ return {
12
+ tableBottomPadding: spacing === null || spacing === void 0 ? void 0 : spacing.medium,
13
+ colorGray: colors === null || colors === void 0 ? void 0 : colors.tiara,
14
+ cellPadding: "".concat(spacing === null || spacing === void 0 ? void 0 : spacing.small, " ").concat(spacing === null || spacing === void 0 ? void 0 : spacing.small)
15
+ };
16
+ };
17
+
18
+ var _default = generateComponentTheme;
19
+ exports.default = _default;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
+
5
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = exports.ScoreDistributionType = void 0;
11
+
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
+
14
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
+
16
+ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
17
+
18
+ var _react = _interopRequireWildcard(require("react"));
19
+
20
+ var _propTypes = _interopRequireDefault(require("prop-types"));
21
+
22
+ var _index = _interopRequireDefault(require("./Table/index.js"));
23
+
24
+ var _propTypes2 = require("../../propTypes.js");
25
+
26
+ var _index2 = _interopRequireDefault(require("../shared/AggregationTable/index.js"));
27
+
28
+ var _presenter = require("../shared/AfsPartsContainer/presenter.js");
29
+
30
+ var _index3 = _interopRequireDefault(require("../shared/AfsTableWrapper/index.js"));
31
+
32
+ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
33
+
34
+ var ScoreDistributionType = /*#__PURE__*/function (_Component) {
35
+ (0, _inherits2.default)(ScoreDistributionType, _Component);
36
+
37
+ var _super = (0, _createSuper2.default)(ScoreDistributionType);
38
+
39
+ function ScoreDistributionType() {
40
+ var _this;
41
+
42
+ (0, _classCallCheck2.default)(this, ScoreDistributionType);
43
+
44
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
45
+ args[_key] = arguments[_key];
46
+ }
47
+
48
+ _this = _super.call.apply(_super, [this].concat(args));
49
+
50
+ _this.render = function () {
51
+ var _this$props = _this.props,
52
+ answerSummary = _this$props.answerSummary,
53
+ itemId = _this$props.itemId;
54
+ return /*#__PURE__*/_react.default.createElement(_index3.default, {
55
+ tableHeader: (0, _formatMessage.default)('Score Frequency Summary')
56
+ }, /*#__PURE__*/_react.default.createElement(_presenter.AfsPartsContainer, {
57
+ afsTable: /*#__PURE__*/_react.default.createElement(_index.default, {
58
+ itemId: itemId,
59
+ scores: answerSummary.score_distribution
60
+ }),
61
+ aggregationTable: /*#__PURE__*/_react.default.createElement(_index2.default, {
62
+ itemId: itemId,
63
+ answerSummary: answerSummary
64
+ })
65
+ }));
66
+ };
67
+
68
+ return _this;
69
+ }
70
+
71
+ return ScoreDistributionType;
72
+ }(_react.Component);
73
+
74
+ exports.ScoreDistributionType = ScoreDistributionType;
75
+ ScoreDistributionType.propTypes = {
76
+ itemId: _propTypes.default.number,
77
+ answerSummary: _propTypes2.scoreDistributionTypeAnswerSummaryPropType
78
+ }.isRequired;
79
+ var _default = ScoreDistributionType;
80
+ exports.default = _default;
@@ -29,6 +29,8 @@ var _index4 = _interopRequireDefault(require("./AggregationType/index.js"));
29
29
 
30
30
  var _index5 = require("./MatchingType/index.js");
31
31
 
32
+ var _index6 = require("./ScoreDistributionType/index.js");
33
+
32
34
  var _propTypes = require("../propTypes.js");
33
35
 
34
36
  var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
@@ -84,6 +86,14 @@ var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
84
86
  if (afsFlags.fillInTheBlankEnabled) {
85
87
  _this.afsTableComponentMap.set('rich-fill-blank', _index3.default);
86
88
  }
89
+
90
+ if (afsFlags.essayEnabled) {
91
+ _this.afsTableComponentMap.set('essay', _index6.ScoreDistributionType);
92
+ }
93
+
94
+ if (afsFlags.fileUploadEnabled) {
95
+ _this.afsTableComponentMap.set('file-upload', _index6.ScoreDistributionType);
96
+ }
87
97
  };
88
98
 
89
99
  _this.render = function () {
@@ -45,6 +45,11 @@ var AfsTableWrapper = (_dec = (0, _emotion.withStyle)(_styles.default, null), _d
45
45
 
46
46
  _this = _super.call.apply(_super, [this].concat(args));
47
47
 
48
+ _this.getHeader = function () {
49
+ var tableHeader = _this.props.tableHeader;
50
+ return tableHeader || (0, _formatMessage.default)('Answer Frequency Summary');
51
+ };
52
+
48
53
  _this.render = function () {
49
54
  return (0, _emotion.jsx)(_uiFlex.Flex, {
50
55
  direction: "row",
@@ -58,7 +63,7 @@ var AfsTableWrapper = (_dec = (0, _emotion.withStyle)(_styles.default, null), _d
58
63
  level: "h3",
59
64
  weight: "bold",
60
65
  color: "primary"
61
- }, (0, _formatMessage.default)('Answer Frequency Summary')), _this.props.children)));
66
+ }, _this.getHeader()), _this.props.children)));
62
67
  };
63
68
 
64
69
  return _this;
@@ -67,6 +72,7 @@ var AfsTableWrapper = (_dec = (0, _emotion.withStyle)(_styles.default, null), _d
67
72
  return AfsTableWrapper;
68
73
  }(_react.Component), _class2.propTypes = {
69
74
  children: _propTypes.default.node.isRequired,
70
- styles: _propTypes.default.object
75
+ styles: _propTypes.default.object,
76
+ tableHeader: _propTypes.default.string
71
77
  }, _temp)) || _class);
72
78
  exports.AfsTableWrapper = AfsTableWrapper;
@@ -44,33 +44,33 @@ var _popoverContent = require("./popoverContent.js");
44
44
  var _dec, _class, _class2, _temp;
45
45
 
46
46
  var styles = {
47
- componentId: 'fSsSV',
47
+ componentId: 'fMmrG',
48
48
  template: function template(theme) {
49
- return "\n\n.fSsSV_cvRx{align-items:center;display:flex;height:100%;justify-content:center;min-height:47px;width:46px}\n\n.fSsSV_fPIL{min-width:500px}\n\n.fSsSV_fPIL table{border-collapse:separate;border-spacing:0 12px}\n\n.fSsSV_fPIL thead th{border-color:".concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}\n\n.fSsSV_fPIL table tbody tr td{border-style:solid;border-width:2px 0 2px 0;width:33.33%}\n\n.fSsSV_fPIL table tbody tr th:first-child{border-radius:4px 0 0 4px;border-style:solid;border-width:2px 0 2px 2px;font-weight:400}\n\n.fSsSV_fPIL table tbody tr td:last-child{border-radius:0 4px 4px 0;border-style:solid;border-width:2px 2px 2px 0}\n\n.fSsSV_dzqP table tbody tr:first-child td,.fSsSV_dzqP table tbody tr:first-child th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fSsSV_fZpZ table tbody tr:first-child td,.fSsSV_fZpZ table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fSsSV_fZpZ table tbody tr:nth-child(2) td,.fSsSV_fZpZ table tbody tr:nth-child(2) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fSsSV_dgTJ table tbody tr:first-child td,.fSsSV_dgTJ table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fSsSV_dgTJ table tbody tr:nth-child(2) td,.fSsSV_dgTJ table tbody tr:nth-child(2) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fSsSV_dgTJ table tbody tr:nth-child(3) td,.fSsSV_dgTJ table tbody tr:nth-child(3) th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fSsSV_bUPM table tbody tr:first-child td,.fSsSV_bUPM table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fSsSV_bUPM table tbody tr:nth-child(2) td,.fSsSV_bUPM table tbody tr:nth-child(2) th{border-color:").concat(theme.colorBlue || 'inherit', "}\n\n.fSsSV_bUPM table tbody tr:nth-child(3) td,.fSsSV_bUPM table tbody tr:nth-child(3) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fSsSV_bUPM table tbody tr:nth-child(4) td,.fSsSV_bUPM table tbody tr:nth-child(4) th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fSsSV_bvau{background-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fSsSV_cxOH{background-color:").concat(theme.colorRed || 'inherit', "}\n\n.fSsSV_eRkO{background-color:").concat(theme.colorBlue || 'inherit', "}\n\n.fSsSV_eKcq{background-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fSsSV_euQM{padding:12px 0 12px 10px}\n\n.fSsSV_fuuc{padding-left:45px}\n\n.fSsSV_vDgC svg{fill:#fff}\n\n.fSsSV_fHMm{border-color:").concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}");
49
+ return "\n\n.fMmrG_cvRx{align-items:center;display:flex;height:100%;justify-content:center;min-height:47px;width:46px}\n\n.fMmrG_fPIL{min-width:500px}\n\n.fMmrG_fPIL table{border-collapse:separate;border-spacing:0 12px}\n\n.fMmrG_fPIL thead th{border-color:".concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}\n\n.fMmrG_fPIL table tbody tr td{border-style:solid;border-width:2px 0 2px 0;width:33.33%}\n\n.fMmrG_fPIL table tbody tr th:first-child{border-radius:4px 0 0 4px;border-style:solid;border-width:2px 0 2px 2px;font-weight:400}\n\n.fMmrG_fPIL table tbody tr td:last-child{border-radius:0 4px 4px 0;border-style:solid;border-width:2px 2px 2px 0}\n\n.fMmrG_dzqP table tbody tr:first-child td,.fMmrG_dzqP table tbody tr:first-child th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fMmrG_fZpZ table tbody tr:first-child td,.fMmrG_fZpZ table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fMmrG_fZpZ table tbody tr:nth-child(2) td,.fMmrG_fZpZ table tbody tr:nth-child(2) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fMmrG_dgTJ table tbody tr:first-child td,.fMmrG_dgTJ table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fMmrG_dgTJ table tbody tr:nth-child(2) td,.fMmrG_dgTJ table tbody tr:nth-child(2) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fMmrG_dgTJ table tbody tr:nth-child(3) td,.fMmrG_dgTJ table tbody tr:nth-child(3) th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fMmrG_bYLj table tbody tr:first-child td,.fMmrG_bYLj table tbody tr:first-child th{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fMmrG_bYLj table tbody tr:nth-child(2) td,.fMmrG_bYLj table tbody tr:nth-child(2) th{border-color:").concat(theme.colorBlue || 'inherit', "}\n\n.fMmrG_bYLj table tbody tr:nth-child(3) td,.fMmrG_bYLj table tbody tr:nth-child(3) th{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fMmrG_bYLj table tbody tr:nth-child(4) td,.fMmrG_bYLj table tbody tr:nth-child(4) th{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fMmrG_bvau{background-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fMmrG_cxOH{background-color:").concat(theme.colorRed || 'inherit', "}\n\n.fMmrG_dsqS{background-color:").concat(theme.colorBlue || 'inherit', "}\n\n.fMmrG_eKcq{background-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fMmrG_euQM{padding:12px 0 12px 10px}\n\n.fMmrG_fuuc{padding-left:45px}\n\n.fMmrG_vDgC svg{fill:#fff}\n\n.fMmrG_fHMm{border-color:").concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}");
50
50
  },
51
- 'iconWrapper': 'fSsSV_cvRx',
52
- 'collapsingTable': 'fSsSV_fPIL',
53
- 'onlyNoanswer': 'fSsSV_dzqP',
54
- 'correctIncorrect': 'fSsSV_fZpZ',
55
- 'correctIncorrectNoanswer': 'fSsSV_dgTJ',
56
- 'correctIncorrectNoanswerPartial': 'fSsSV_bUPM',
57
- 'correctBackground': 'fSsSV_bvau',
58
- 'incorrectBackground': 'fSsSV_cxOH',
59
- 'partialCorrectBackground': 'fSsSV_eRkO',
60
- 'noAnswerBackground': 'fSsSV_eKcq',
61
- 'labelWrapper': 'fSsSV_euQM',
62
- 'firstHeaderCell': 'fSsSV_fuuc',
63
- 'iconWhite': 'fSsSV_vDgC',
64
- 'headerCell': 'fSsSV_fHMm'
51
+ 'iconWrapper': 'fMmrG_cvRx',
52
+ 'collapsingTable': 'fMmrG_fPIL',
53
+ 'onlyNoanswer': 'fMmrG_dzqP',
54
+ 'correctIncorrect': 'fMmrG_fZpZ',
55
+ 'correctIncorrectNoanswer': 'fMmrG_dgTJ',
56
+ 'correctIncorrectNoanswerGraded': 'fMmrG_bYLj',
57
+ 'correctBackground': 'fMmrG_bvau',
58
+ 'incorrectBackground': 'fMmrG_cxOH',
59
+ 'gradedBackground': 'fMmrG_dsqS',
60
+ 'noAnswerBackground': 'fMmrG_eKcq',
61
+ 'labelWrapper': 'fMmrG_euQM',
62
+ 'firstHeaderCell': 'fMmrG_fuuc',
63
+ 'iconWhite': 'fMmrG_vDgC',
64
+ 'headerCell': 'fMmrG_fHMm'
65
65
  };
66
66
  var noAnswerKey = 'noAnswer';
67
67
  var incorrectKey = 'incorrect';
68
68
  var correctKey = 'correct';
69
- var partialCorrectKey = 'partialCorrect';
69
+ var gradedKey = 'graded';
70
70
 
71
71
  var _ref = /*#__PURE__*/_react.default.createElement(_uiIcons.IconCheckSolid, null);
72
72
 
73
- var _ref2 = /*#__PURE__*/_react.default.createElement(_uiIcons.IconOvalHalfSolid, null);
73
+ var _ref2 = /*#__PURE__*/_react.default.createElement(_uiIcons.IconGradebookSolid, null);
74
74
 
75
75
  var _ref3 = /*#__PURE__*/_react.default.createElement(_uiIcons.IconXSolid, null);
76
76
 
@@ -148,9 +148,9 @@ var AggregationTable = (_dec = (0, _uiThemeable.themeable)(_theme.default, style
148
148
  }, /*#__PURE__*/_react.default.createElement(_uiText.Text, null, concatenatedPercentage)));
149
149
  };
150
150
 
151
- _this.partialCorrectExist = function () {
152
- var aggregate = _this.props.answerSummary.aggregate;
153
- return !!(aggregate === null || aggregate === void 0 ? void 0 : aggregate.partial_correct);
151
+ _this.gradedExist = function () {
152
+ var graded = _this.props.answerSummary.graded;
153
+ return !!graded;
154
154
  };
155
155
 
156
156
  _this.correctExist = function () {
@@ -168,24 +168,19 @@ var AggregationTable = (_dec = (0, _uiThemeable.themeable)(_theme.default, style
168
168
  return !!no_answer;
169
169
  };
170
170
 
171
- _this.getCorrectLabel = function () {
172
- return _this.partialCorrectExist() ? (0, _formatMessage.default)('Fully correct') : (0, _formatMessage.default)('Correct');
173
- };
174
-
175
171
  _this.renderCorrect = function () {
176
172
  var aggregate = _this.props.answerSummary.aggregate;
177
173
  var correct = aggregate.correct;
178
174
  var correctCount = correct.count || 0;
179
175
  var correctPercentage = correct.percentage || 0;
180
- return _this.renderRow(correctKey, _ref, _this.getCorrectLabel(), correctCount, correctPercentage);
176
+ return _this.renderRow(correctKey, _ref, (0, _formatMessage.default)('Correct'), correctCount, correctPercentage);
181
177
  };
182
178
 
183
- _this.renderPartialCorrect = function () {
184
- var aggregate = _this.props.answerSummary.aggregate;
185
- var partial_correct = aggregate.partial_correct;
186
- var partialCorrectCount = partial_correct.count || 0;
187
- var partialCorrectPercentage = partial_correct.percentage || 0;
188
- return _this.renderRow(partialCorrectKey, _ref2, (0, _formatMessage.default)('Partially correct'), partialCorrectCount, partialCorrectPercentage);
179
+ _this.renderGraded = function () {
180
+ var graded = _this.props.answerSummary.graded;
181
+ var gradedCount = graded.count || 0;
182
+ var gradedPercentage = graded.percentage || 0;
183
+ return _this.renderRow(gradedKey, _ref2, (0, _formatMessage.default)('Graded'), gradedCount, gradedPercentage);
189
184
  };
190
185
 
191
186
  _this.renderIncorrect = function () {
@@ -206,16 +201,16 @@ var AggregationTable = (_dec = (0, _uiThemeable.themeable)(_theme.default, style
206
201
  _this.getColorProfile = function () {
207
202
  var colorProfile;
208
203
 
209
- var correctIncorrectNoAnswerPartial = _this.partialCorrectExist() && _this.noAnswerExist() && _this.correctExist() && _this.incorrectExist();
204
+ var correctIncorrectNoAnswerGraded = _this.gradedExist() && _this.noAnswerExist() && _this.correctExist() && _this.incorrectExist();
210
205
 
211
- var correctIncorrectNoAnswer = !_this.partialCorrectExist() && _this.noAnswerExist() && _this.correctExist() && _this.incorrectExist();
206
+ var correctIncorrectNoAnswer = !_this.gradedExist() && _this.noAnswerExist() && _this.correctExist() && _this.incorrectExist();
212
207
 
213
- var onlyNoAnswer = _this.noAnswerExist() && !_this.partialCorrectExist() && !_this.correctExist() && !_this.incorrectExist();
208
+ var onlyNoAnswer = _this.noAnswerExist() && !_this.gradedExist() && !_this.correctExist() && !_this.incorrectExist();
214
209
 
215
210
  if (correctIncorrectNoAnswer) {
216
211
  colorProfile = 'correctIncorrectNoanswer';
217
- } else if (correctIncorrectNoAnswerPartial) {
218
- colorProfile = 'correctIncorrectNoanswerPartial';
212
+ } else if (correctIncorrectNoAnswerGraded) {
213
+ colorProfile = 'correctIncorrectNoanswerGraded';
219
214
  } else if (onlyNoAnswer) {
220
215
  colorProfile = 'onlyNoanswer';
221
216
  } else {
@@ -231,7 +226,7 @@ var AggregationTable = (_dec = (0, _uiThemeable.themeable)(_theme.default, style
231
226
  className: (0, _classnames.default)(styles.collapsingTable, styles[_this.getColorProfile()])
232
227
  }, /*#__PURE__*/_react.default.createElement(_uiTable.Table, {
233
228
  caption: (0, _formatMessage.default)('Answer Frequency Summary Aggregates')
234
- }, _this.renderHeaderRow(popover), /*#__PURE__*/_react.default.createElement(_uiTable.Table.Body, null, _this.correctExist() && _this.renderCorrect(), _this.partialCorrectExist() && _this.renderPartialCorrect(), _this.incorrectExist() && _this.renderIncorrect(), _this.noAnswerExist() && _this.renderNoAnswer())));
229
+ }, _this.renderHeaderRow(popover), /*#__PURE__*/_react.default.createElement(_uiTable.Table.Body, null, _this.correctExist() && _this.renderCorrect(), _this.gradedExist() && _this.renderGraded(), _this.incorrectExist() && _this.renderIncorrect(), _this.noAnswerExist() && _this.renderNoAnswer())));
235
230
  };
236
231
 
237
232
  return _this;
@@ -22,7 +22,9 @@ function mapStateToProps(_state) {
22
22
  trueFalseEnabled: (0, _featureCheck.featureOn)('ia_true_false_afs'),
23
23
  choiceEnabled: (0, _featureCheck.featureOn)('ia_choice_afs'),
24
24
  multiAnswerEnabled: (0, _featureCheck.featureOn)('ia_multi_answer_afs'),
25
- fillInTheBlankEnabled: (0, _featureCheck.featureOn)('ia_rich_fill_blank_afs')
25
+ fillInTheBlankEnabled: (0, _featureCheck.featureOn)('ia_rich_fill_blank_afs'),
26
+ essayEnabled: (0, _featureCheck.featureOn)('ia_essay_afs'),
27
+ fileUploadEnabled: (0, _featureCheck.featureOn)('ia_file_upload_afs')
26
28
  }
27
29
  };
28
30
  }
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.afsFlags = exports.itemAnalysisPropType = exports.answerSummaryPropType = exports.richFillBlankTypeAnswerSummaryPropType = exports.matchingTypeAnswerSummaryPropType = exports.choiceTypeAnswerSummaryPropType = exports.choiceTypeObject = exports.onlyAggregatePropType = exports.aggregatePropType = exports.aggregateDetailPropType = exports.quizAnalysisPropType = exports.quizAnalysisMetadata = void 0;
8
+ exports.afsFlags = exports.itemAnalysisPropType = exports.answerSummaryPropType = exports.richFillBlankTypeAnswerSummaryPropType = exports.matchingTypeAnswerSummaryPropType = exports.scoreDistributionType = exports.scoreDistributionTypeAnswerSummaryPropType = exports.choiceTypeAnswerSummaryPropType = exports.choiceTypeObject = exports.onlyAggregatePropType = exports.aggregatePropType = exports.aggregateDetailPropType = exports.quizAnalysisPropType = exports.quizAnalysisMetadata = void 0;
9
9
 
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
 
@@ -51,14 +51,14 @@ exports.aggregateDetailPropType = aggregateDetailPropType;
51
51
 
52
52
  var aggregatePropType = _propTypes.default.shape({
53
53
  correct: aggregateDetailPropType.isRequired,
54
- incorrect: aggregateDetailPropType.isRequired,
55
- partial_correct: aggregateDetailPropType
54
+ incorrect: aggregateDetailPropType.isRequired
56
55
  });
57
56
 
58
57
  exports.aggregatePropType = aggregatePropType;
59
58
 
60
59
  var onlyAggregatePropType = _propTypes.default.shape({
61
60
  no_answer: aggregateDetailPropType,
61
+ graded: aggregateDetailPropType,
62
62
  aggregate: aggregatePropType
63
63
  });
64
64
 
@@ -81,6 +81,23 @@ var choiceTypeAnswerSummaryPropType = _propTypes.default.shape({
81
81
 
82
82
  exports.choiceTypeAnswerSummaryPropType = choiceTypeAnswerSummaryPropType;
83
83
 
84
+ var scoreDistributionTypeAnswerSummaryPropType = _propTypes.default.shape({
85
+ no_answer: aggregateDetailPropType.isRequired,
86
+ aggregate: aggregatePropType.isRequired,
87
+ graded: aggregateDetailPropType.isRequired,
88
+ score_distribution: _propTypes.default.arrayOf(scoreDistributionType).isRequired
89
+ });
90
+
91
+ exports.scoreDistributionTypeAnswerSummaryPropType = scoreDistributionTypeAnswerSummaryPropType;
92
+
93
+ var scoreDistributionType = _propTypes.default.shape({
94
+ count: _propTypes.default.number.isRequired,
95
+ score: _propTypes.default.number.isRequired,
96
+ percentage: _propTypes.default.number.isRequired
97
+ });
98
+
99
+ exports.scoreDistributionType = scoreDistributionType;
100
+
84
101
  var matchingTypeAnswerSummaryPropType = _propTypes.default.shape({
85
102
  questions: _propTypes.default.objectOf(_propTypes.default.shape({
86
103
  body: _propTypes.default.string,
@@ -114,7 +131,7 @@ var richFillBlankTypeAnswerSummaryPropType = _propTypes.default.shape({
114
131
 
115
132
  exports.richFillBlankTypeAnswerSummaryPropType = richFillBlankTypeAnswerSummaryPropType;
116
133
 
117
- var answerSummaryPropType = _propTypes.default.oneOfType([choiceTypeAnswerSummaryPropType, onlyAggregatePropType, matchingTypeAnswerSummaryPropType, richFillBlankTypeAnswerSummaryPropType]);
134
+ var answerSummaryPropType = _propTypes.default.oneOfType([choiceTypeAnswerSummaryPropType, onlyAggregatePropType, matchingTypeAnswerSummaryPropType, richFillBlankTypeAnswerSummaryPropType, scoreDistributionTypeAnswerSummaryPropType]);
118
135
 
119
136
  exports.answerSummaryPropType = answerSummaryPropType;
120
137
 
@@ -152,7 +169,9 @@ var afsFlags = _propTypes.default.shape({
152
169
  trueFalseEnabled: _propTypes.default.bool.isRequired,
153
170
  choiceEnabled: _propTypes.default.bool.isRequired,
154
171
  multiAnswerEnabled: _propTypes.default.bool.isRequired,
155
- fillInTheBlankEnabled: _propTypes.default.bool.isRequired
172
+ fillInTheBlankEnabled: _propTypes.default.bool.isRequired,
173
+ essayEnabled: _propTypes.default.bool.isRequired,
174
+ fileUploadEnabled: _propTypes.default.bool.isRequired
156
175
  });
157
176
 
158
177
  exports.afsFlags = afsFlags;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "20.7.1-rc.1+d22607b55",
3
+ "version": "20.7.1-rc.11+fa1890974",
4
4
  "license": "MIT",
5
5
  "description": "The Quiz React SDK by Instructure Inc.",
6
6
  "author": "Instructure, Inc. Engineering and Product Design",
@@ -44,11 +44,11 @@
44
44
  "@instructure/emotion": "^8.51.0",
45
45
  "@instructure/grading-utils": "^1.0.0",
46
46
  "@instructure/outcomes-ui": "^3.1.0",
47
- "@instructure/quiz-common": "20.7.1-rc.1+d22607b55",
48
- "@instructure/quiz-i18n": "20.7.1-rc.1+d22607b55",
49
- "@instructure/quiz-interactions": "20.7.1-rc.1+d22607b55",
50
- "@instructure/quiz-number-input": "20.7.1-rc.1+d22607b55",
51
- "@instructure/quiz-rce": "20.7.1-rc.1+d22607b55",
47
+ "@instructure/quiz-common": "20.7.1-rc.11+fa1890974",
48
+ "@instructure/quiz-i18n": "20.7.1-rc.11+fa1890974",
49
+ "@instructure/quiz-interactions": "20.7.1-rc.11+fa1890974",
50
+ "@instructure/quiz-number-input": "20.7.1-rc.11+fa1890974",
51
+ "@instructure/quiz-rce": "20.7.1-rc.11+fa1890974",
52
52
  "@instructure/ui-a11y-content": "^8.51.0",
53
53
  "@instructure/ui-alerts": "^8.51.0",
54
54
  "@instructure/ui-avatar": "^8.51.0",
@@ -112,7 +112,7 @@
112
112
  "file-saver": "~2.0.5",
113
113
  "humps": "^2.0.0",
114
114
  "immutable": "^3.8.1",
115
- "instructure-validations": "20.7.1-rc.1+d22607b55",
115
+ "instructure-validations": "20.7.1-rc.11+fa1890974",
116
116
  "ipaddr.js": "^1.5.4",
117
117
  "isomorphic-fetch": "^2.2.0",
118
118
  "isuuid": "^0.1.0",
@@ -163,7 +163,7 @@
163
163
  "intl": "^1.2.4",
164
164
  "jquery": "^2.2.3",
165
165
  "most-subject": "^5.3.0",
166
- "quiz-presets": "20.7.1-rc.1+d22607b55",
166
+ "quiz-presets": "20.7.1-rc.11+fa1890974",
167
167
  "react": "^16.8.6",
168
168
  "react-addons-test-utils": "^15.6.2",
169
169
  "react-dom": "^16.8.6",
@@ -179,5 +179,5 @@
179
179
  "publishConfig": {
180
180
  "access": "public"
181
181
  },
182
- "gitHead": "d22607b553db55ec666a470ef7015647ed9e618c"
182
+ "gitHead": "fa1890974baa639fabfc8e64371fef39cfc57bc8"
183
183
  }