@instructure/quiz-core 18.5.1-rc.4 → 18.5.1-rc.7

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 (31) hide show
  1. package/es/common/util/Fetcher.js +15 -3
  2. package/es/reporting/api/getAnalysesExport.js +1 -0
  3. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/AggregationType/presenter.js +19 -6
  4. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ChoiceType/presenter.js +9 -5
  5. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingType.js +67 -0
  6. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingTypeTable/index.js +1 -0
  7. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingTypeTable/presenter.js +180 -0
  8. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingTypeTable/theme.js +7 -0
  9. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/index.js +1 -0
  10. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/utils/matchingTypeOrderer.js +42 -0
  11. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/presenter.js +5 -0
  12. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AfsTableWrapper/presenter.js +9 -6
  13. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AggregationTable/presenter.js +19 -19
  14. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +1 -3
  15. package/es/reporting/components/resources/NewQuizAndItemAnalysis/propTypes.js +12 -1
  16. package/lib/common/util/Fetcher.js +15 -2
  17. package/lib/reporting/api/getAnalysesExport.js +1 -0
  18. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/AggregationType/presenter.js +23 -10
  19. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/ChoiceType/presenter.js +10 -5
  20. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingType.js +93 -0
  21. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingTypeTable/index.js +13 -0
  22. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingTypeTable/presenter.js +205 -0
  23. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/MatchingTypeTable/theme.js +14 -0
  24. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/index.js +13 -0
  25. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/MatchingType/utils/matchingTypeOrderer.js +52 -0
  26. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/presenter.js +6 -0
  27. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AfsTableWrapper/presenter.js +10 -6
  28. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerFrequencySummary/shared/AggregationTable/presenter.js +19 -19
  29. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +1 -3
  30. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/propTypes.js +16 -2
  31. package/package.json +9 -9
@@ -1,5 +1,6 @@
1
1
  import _regeneratorRuntime from "@babel/runtime/regenerator";
2
2
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3
4
  import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
4
5
  import _createClass from "@babel/runtime/helpers/esm/createClass";
5
6
  import { decamelizeKeys } from 'humps';
@@ -7,7 +8,7 @@ import queryString from 'query-string';
7
8
  import fetch from 'isomorphic-fetch';
8
9
  import t from '@instructure/quiz-i18n/es/format-message';
9
10
  import jsonify from "./jsonify.js";
10
- import { httpHeaders } from "./httpHeaders.js";
11
+ import { httpHeaders, jwtHeader } from "./httpHeaders.js";
11
12
  import store from "../../reduxStore.js";
12
13
  import { callbacksCompleteForCall, errorCallFor, startCallFor, successCallFor } from "./callHelpers.js";
13
14
  import { addError, addSuccess } from "../actions/alerts.js";
@@ -33,7 +34,8 @@ export var Fetcher = /*#__PURE__*/function () {
33
34
  successMessage = _ref.successMessage,
34
35
  onError = _ref.onError,
35
36
  cloneResponseForError = _ref.cloneResponseForError,
36
- asyncResponseHandler = _ref.asyncResponseHandler;
37
+ asyncResponseHandler = _ref.asyncResponseHandler,
38
+ injectMissingUserToken = _ref.injectMissingUserToken;
37
39
 
38
40
  _classCallCheck(this, Fetcher);
39
41
 
@@ -43,6 +45,7 @@ export var Fetcher = /*#__PURE__*/function () {
43
45
  this.cloneResponseForError = cloneResponseForError || false;
44
46
  this.callType = callType;
45
47
  this.headers = headers;
48
+ this.injectMissingUserToken = injectMissingUserToken || false;
46
49
  this.successMessage = successMessage;
47
50
  this.onError = onError;
48
51
  this.asyncResponseHandler = asyncResponseHandler || jsonify;
@@ -91,7 +94,16 @@ export var Fetcher = /*#__PURE__*/function () {
91
94
  }, {
92
95
  key: "callHeaders",
93
96
  value: function callHeaders() {
94
- return this.headers || httpHeaders(this.getState().getIn(['config', 'userToken']));
97
+ if (!this.headers) {
98
+ return httpHeaders(this.getState().getIn(['config', 'userToken']));
99
+ }
100
+
101
+ if (!this.injectMissingUserToken) {
102
+ return this.headers;
103
+ }
104
+
105
+ var userToken = this.getState().getIn(['config', 'userToken']);
106
+ return _objectSpread(_objectSpread({}, jwtHeader(userToken)), this.headers);
95
107
  }
96
108
  }, {
97
109
  key: "handleSuccess",
@@ -13,6 +13,7 @@ var getFetcher = function getFetcher(format) {
13
13
  headers: {
14
14
  'Accept': mimeType
15
15
  },
16
+ injectUserToken: true,
16
17
  asyncResponseHandler: function asyncResponseHandler(response) {
17
18
  return response;
18
19
  }
@@ -1,12 +1,24 @@
1
1
  import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
2
  import _inherits from "@babel/runtime/helpers/esm/inherits";
3
3
  import _createSuper from "@babel/runtime/helpers/esm/createSuper";
4
+
5
+ var _dec, _class, _class2, _temp;
6
+
4
7
  import React, { Component } from 'react';
5
8
  import PropTypes from 'prop-types';
6
9
  import AggregationTable from "../shared/AggregationTable/index.js";
7
10
  import { onlyAggregatePropType } from "../../propTypes.js";
8
11
  import { AfsTableWrapper } from "../shared/AfsTableWrapper/presenter.js";
9
- export var AggregationType = /*#__PURE__*/function (_Component) {
12
+ import classNames from 'classnames';
13
+ var styles = {
14
+ componentId: 'JFhmr',
15
+ template: function template(theme) {
16
+ return "\n\n.JFhmr_cVld{max-width:100%;width:calc(25% + 350px)}";
17
+ },
18
+ 'answerFrequencySummaryContainer': 'JFhmr_cVld'
19
+ };
20
+ import { themeable } from '@instructure/ui-themeable';
21
+ export var AggregationType = (_dec = themeable({}, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
10
22
  _inherits(AggregationType, _Component);
11
23
 
12
24
  var _super = _createSuper(AggregationType);
@@ -26,18 +38,19 @@ export var AggregationType = /*#__PURE__*/function (_Component) {
26
38
  var _this$props = _this.props,
27
39
  answerSummary = _this$props.answerSummary,
28
40
  itemId = _this$props.itemId;
29
- return /*#__PURE__*/React.createElement(AfsTableWrapper, null, /*#__PURE__*/React.createElement(AggregationTable, {
41
+ return /*#__PURE__*/React.createElement(AfsTableWrapper, null, /*#__PURE__*/React.createElement("div", {
42
+ className: classNames(styles.answerFrequencySummaryContainer)
43
+ }, /*#__PURE__*/React.createElement(AggregationTable, {
30
44
  itemId: itemId,
31
45
  answerSummary: answerSummary
32
- }));
46
+ })));
33
47
  };
34
48
 
35
49
  return _this;
36
50
  }
37
51
 
38
52
  return AggregationType;
39
- }(Component);
40
- AggregationType.propTypes = {
53
+ }(Component), _class2.propTypes = {
41
54
  itemId: PropTypes.number.isRequired,
42
55
  answerSummary: onlyAggregatePropType
43
- }.isRequired;
56
+ }.isRequired, _temp)) || _class);
@@ -14,14 +14,16 @@ import PropTypes from 'prop-types';
14
14
  import ChoiceTypeTableRow from "./ChoiceTypeTableRow/index.js";
15
15
  import { choiceTypeAnswerSummaryPropType } from "../../propTypes.js";
16
16
  var styles = {
17
- componentId: 'ZuPLN',
17
+ componentId: 'cEPQa',
18
18
  template: function template(theme) {
19
- return "\n\n.ZuPLN_rMrG{display:flex;flex-basis:100%;flex-direction:column;padding-bottom:".concat(theme.tableBottomPadding || 'inherit', "}");
19
+ return "\n\n.cEPQa_rMrG{display:flex;flex-basis:100%;flex-direction:column;padding-bottom:".concat(theme.tableBottomPadding || 'inherit', "}\n\n.cEPQa_cVld{max-width:100%;width:calc(25% + 350px)}");
20
20
  },
21
- 'tableWrapper': 'ZuPLN_rMrG'
21
+ 'tableWrapper': 'cEPQa_rMrG',
22
+ 'answerFrequencySummaryContainer': 'cEPQa_cVld'
22
23
  };
23
24
  import theme from "./theme.js";
24
25
  import AfsTableWrapper from "../shared/AfsTableWrapper/index.js";
26
+ import classNames from 'classnames';
25
27
  export var ChoiceType = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
26
28
  _inherits(ChoiceType, _Component);
27
29
 
@@ -76,7 +78,9 @@ export var ChoiceType = (_dec = themeable(theme, styles), _dec(_class = (_temp =
76
78
  var answerHeaderId = "answer-frequency-summary-answer-".concat(itemId);
77
79
  var respondentsHeaderId = "answer-frequency-summary-respondents-".concat(itemId);
78
80
  var percentageHeaderId = "answer-frequency-summary-percentage-".concat(itemId);
79
- return /*#__PURE__*/React.createElement(AfsTableWrapper, null, /*#__PURE__*/React.createElement(Table, {
81
+ return /*#__PURE__*/React.createElement(AfsTableWrapper, null, /*#__PURE__*/React.createElement("div", {
82
+ className: classNames(styles.answerFrequencySummaryContainer)
83
+ }, /*#__PURE__*/React.createElement(Table, {
80
84
  caption: t('Answer Frequency Summary')
81
85
  }, /*#__PURE__*/React.createElement(Table.Head, null, /*#__PURE__*/React.createElement(Table.Row, null, /*#__PURE__*/React.createElement(Table.ColHeader, {
82
86
  id: spacingHeaderId,
@@ -91,7 +95,7 @@ export var ChoiceType = (_dec = themeable(theme, styles), _dec(_class = (_temp =
91
95
  id: percentageHeaderId,
92
96
  height: "47px",
93
97
  textAlign: "center"
94
- }, t('%')))), /*#__PURE__*/React.createElement(Table.Body, null, choices.map(this.renderRow), this.renderNoAnswer(noAnswer, numberOfChoices))));
98
+ }, t('%')))), /*#__PURE__*/React.createElement(Table.Body, null, choices.map(this.renderRow), this.renderNoAnswer(noAnswer, numberOfChoices)))));
95
99
  }
96
100
  }]);
97
101
 
@@ -0,0 +1,67 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
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
+ import React, { Component } from 'react';
9
+ import AfsTableWrapper from "../shared/AfsTableWrapper/index.js";
10
+ import MatchingTypeTable from "./MatchingTypeTable/index.js";
11
+ import PropTypes from 'prop-types';
12
+ import { matchingTypeAnswerSummaryPropType } from "../../propTypes.js";
13
+ import MatchingTypeOrderer from "./utils/matchingTypeOrderer.js";
14
+ import classNames from 'classnames';
15
+ var styles = {
16
+ componentId: 'JFhmr',
17
+ template: function template(theme) {
18
+ return "\n\n.JFhmr_cVld{max-width:100%;width:calc(25% + 350px)}";
19
+ },
20
+ 'answerFrequencySummaryContainer': 'JFhmr_cVld'
21
+ };
22
+ import { themeable } from '@instructure/ui-themeable';
23
+ export var MatchingType = (_dec = themeable({}, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
24
+ _inherits(MatchingType, _Component);
25
+
26
+ var _super = _createSuper(MatchingType);
27
+
28
+ function MatchingType() {
29
+ var _this;
30
+
31
+ _classCallCheck(this, MatchingType);
32
+
33
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
34
+ args[_key] = arguments[_key];
35
+ }
36
+
37
+ _this = _super.call.apply(_super, [this].concat(args));
38
+
39
+ _this.render = function () {
40
+ var _this$props = _this.props,
41
+ itemId = _this$props.itemId,
42
+ answerSummary = _this$props.answerSummary;
43
+ var questions = answerSummary.questions;
44
+ var questionKeys = Object.keys(questions);
45
+ var exampleAnswers = questions[questionKeys[0]].answers;
46
+ var answerKeys = Object.keys(exampleAnswers);
47
+ var orderedAnswerKeys = MatchingTypeOrderer.orderAnswerKeysForDiagonal(answerSummary, answerKeys);
48
+ var orderedQuestionKeys = MatchingTypeOrderer.orderQuestionKeysForDiagonal(answerSummary, questionKeys, orderedAnswerKeys);
49
+ var containerHalfWidth = orderedAnswerKeys.length <= 3;
50
+ return /*#__PURE__*/React.createElement(AfsTableWrapper, null, /*#__PURE__*/React.createElement("div", {
51
+ className: classNames(_defineProperty({}, styles.answerFrequencySummaryContainer, containerHalfWidth))
52
+ }, /*#__PURE__*/React.createElement(MatchingTypeTable, {
53
+ itemId: itemId,
54
+ answerSummary: answerSummary,
55
+ orderedAnswerKeys: orderedAnswerKeys,
56
+ orderedQuestionKeys: orderedQuestionKeys
57
+ })));
58
+ };
59
+
60
+ return _this;
61
+ }
62
+
63
+ return MatchingType;
64
+ }(Component), _class2.propTypes = {
65
+ itemId: PropTypes.number,
66
+ answerSummary: matchingTypeAnswerSummaryPropType
67
+ }.isRequired, _temp)) || _class);
@@ -0,0 +1 @@
1
+ export { MatchingTypeTable as default } from "./presenter.js";
@@ -0,0 +1,180 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
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
+ import React, { Component } from 'react';
9
+ import { Flex } from '@instructure/ui-flex';
10
+ var styles = {
11
+ componentId: 'daSNV',
12
+ template: function template(theme) {
13
+ return "\n\n.daSNV_rMrG{display:flex;flex-basis:100%;flex-direction:column;padding-bottom:".concat(theme.tableBottomPadding || 'inherit', "}\n\n.daSNV_cvRx{align-items:center;display:flex;height:48px;justify-content:center;width:46px}\n\n.daSNV_EKAb{background-color:").concat(theme.colorGreen || 'inherit', "}\n\n.daSNV_EKAb svg{fill:#fff}\n\n.daSNV_tnta{border-color:").concat(theme.colorGreen || 'inherit', ";border-style:solid;border-width:2px 0}\n\n.daSNV_fvqY{border-radius:4px 4px 4px 4px;border-width:2px 2px 2px 2px}\n\n.daSNV_cVld{max-width:100%;width:calc(25% + 350px)}");
14
+ },
15
+ 'tableWrapper': 'daSNV_rMrG',
16
+ 'iconWrapper': 'daSNV_cvRx',
17
+ 'iconCorrect': 'daSNV_EKAb',
18
+ 'correctRowBorder': 'daSNV_tnta',
19
+ 'correctRowBorderRadius': 'daSNV_fvqY',
20
+ 'answerFrequencySummaryContainer': 'daSNV_cVld'
21
+ };
22
+ import t from '@instructure/quiz-i18n/es/format-message';
23
+ import { Table } from '@instructure/ui-table';
24
+ import { themeable } from '@instructure/ui-themeable';
25
+ import PropTypes from 'prop-types';
26
+ import { IconCheckSolid } from '@instructure/ui-icons';
27
+ import { matchingTypeAnswerSummaryPropType } from "../../../propTypes.js";
28
+ import classNames from 'classnames';
29
+ import theme from "./theme.js";
30
+
31
+ var _ref = /*#__PURE__*/React.createElement(IconCheckSolid, null);
32
+
33
+ var _ref2 = /*#__PURE__*/React.createElement(Flex.Item, {
34
+ width: "46px",
35
+ textAlign: "center"
36
+ });
37
+
38
+ export var MatchingTypeTable = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
39
+ _inherits(MatchingTypeTable, _Component);
40
+
41
+ var _super = _createSuper(MatchingTypeTable);
42
+
43
+ function MatchingTypeTable() {
44
+ var _this;
45
+
46
+ _classCallCheck(this, MatchingTypeTable);
47
+
48
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
49
+ args[_key] = arguments[_key];
50
+ }
51
+
52
+ _this = _super.call.apply(_super, [this].concat(args));
53
+
54
+ _this.renderIcon = function () {
55
+ var classes = classNames(styles.iconWrapper, styles.iconCorrect);
56
+ return /*#__PURE__*/React.createElement("div", {
57
+ className: classes
58
+ }, _ref);
59
+ };
60
+
61
+ _this.renderHeaderCell = function (key) {
62
+ var _this$props = _this.props,
63
+ answerSummary = _this$props.answerSummary,
64
+ itemId = _this$props.itemId;
65
+ var questions = answerSummary.questions;
66
+ var questionKeys = Object.keys(questions);
67
+ var exampleAnswers = questions[questionKeys[0]].answers;
68
+ var answer = exampleAnswers[key];
69
+ var answerNumberHeaderId = "answer-number-header-".concat(key, "-").concat(itemId);
70
+ return /*#__PURE__*/React.createElement(Table.ColHeader, {
71
+ id: answerNumberHeaderId,
72
+ key: answerNumberHeaderId,
73
+ theme: {
74
+ padding: '0 0 15px 0'
75
+ },
76
+ textAlign: "center"
77
+ }, /*#__PURE__*/React.createElement(Flex, {
78
+ direction: "row"
79
+ }, _ref2, /*#__PURE__*/React.createElement(Flex.Item, {
80
+ shouldShrink: true,
81
+ shouldGrow: true,
82
+ textAlign: "center"
83
+ }, answer.body)));
84
+ };
85
+
86
+ _this.renderCell = function (questionKey, answerKey) {
87
+ var _classNames;
88
+
89
+ var _this$props2 = _this.props,
90
+ answerSummary = _this$props2.answerSummary,
91
+ itemId = _this$props2.itemId;
92
+ var questions = answerSummary.questions;
93
+ var question = questions[questionKey];
94
+ var answer = question.answers[answerKey];
95
+ var correct = answer.correct,
96
+ count = answer.count;
97
+ var answerNumberCellId = "answer-number-cell-".concat(questionKey, "-").concat(answerKey, "-").concat(itemId);
98
+ var containerClassNames = classNames((_classNames = {}, _defineProperty(_classNames, styles.correctRowBorder, answer.correct), _defineProperty(_classNames, styles.correctRowBorderRadius, answer.correct), _classNames));
99
+ return /*#__PURE__*/React.createElement(Table.Cell, {
100
+ id: answerNumberCellId,
101
+ key: answerNumberCellId,
102
+ theme: {
103
+ padding: '0 0 0 0'
104
+ }
105
+ }, /*#__PURE__*/React.createElement("div", {
106
+ className: containerClassNames
107
+ }, /*#__PURE__*/React.createElement(Flex, {
108
+ direction: "row"
109
+ }, /*#__PURE__*/React.createElement(Flex.Item, {
110
+ width: "46px",
111
+ textAlign: "center"
112
+ }, correct && _this.renderIcon()), /*#__PURE__*/React.createElement(Flex.Item, {
113
+ shouldShrink: true,
114
+ shouldGrow: true,
115
+ width: "46px",
116
+ textAlign: "center"
117
+ }, count))));
118
+ };
119
+
120
+ _this.renderHeaderRow = function (orderedAnswerKeys) {
121
+ var itemId = _this.props.itemId;
122
+ var headerCells = orderedAnswerKeys.map(_this.renderHeaderCell);
123
+ var categoryHeaderId = "category-header-".concat(itemId);
124
+ var rowKey = "header-row-".concat(itemId);
125
+ return /*#__PURE__*/React.createElement(Table.Row, {
126
+ key: rowKey
127
+ }, /*#__PURE__*/React.createElement(Table.ColHeader, {
128
+ id: categoryHeaderId,
129
+ key: categoryHeaderId,
130
+ theme: {
131
+ padding: '0 0 15px 0'
132
+ },
133
+ textAlign: "start",
134
+ width: "250px"
135
+ }, t('Question')), headerCells);
136
+ };
137
+
138
+ _this.renderRow = function (orderedQuestionKey, orderedAnswerKeys) {
139
+ var _this$props3 = _this.props,
140
+ answerSummary = _this$props3.answerSummary,
141
+ itemId = _this$props3.itemId;
142
+ var questions = answerSummary.questions;
143
+ var question = questions[orderedQuestionKey];
144
+ var answerCells = orderedAnswerKeys.map(function (answerKey) {
145
+ return _this.renderCell(orderedQuestionKey, answerKey);
146
+ });
147
+ var questionRowHeaderId = "question-row-header-id-".concat(orderedQuestionKey, "-").concat(itemId);
148
+ var rowKey = "row-".concat(orderedQuestionKey, "-").concat(itemId);
149
+ return /*#__PURE__*/React.createElement(Table.Row, {
150
+ key: rowKey
151
+ }, /*#__PURE__*/React.createElement(Table.Cell, {
152
+ id: questionRowHeaderId,
153
+ key: questionRowHeaderId,
154
+ theme: {
155
+ padding: '0 0 1px 0'
156
+ }
157
+ }, question.body), answerCells);
158
+ };
159
+
160
+ _this.render = function () {
161
+ var _this$props4 = _this.props,
162
+ orderedAnswerKeys = _this$props4.orderedAnswerKeys,
163
+ orderedQuestionKeys = _this$props4.orderedQuestionKeys;
164
+ return /*#__PURE__*/React.createElement(Table, {
165
+ caption: t('Answer Frequency Summary')
166
+ }, /*#__PURE__*/React.createElement(Table.Head, null, _this.renderHeaderRow(orderedAnswerKeys)), /*#__PURE__*/React.createElement(Table.Body, null, orderedQuestionKeys.map(function (orderedQuestionKey) {
167
+ return _this.renderRow(orderedQuestionKey, orderedAnswerKeys);
168
+ })));
169
+ };
170
+
171
+ return _this;
172
+ }
173
+
174
+ return MatchingTypeTable;
175
+ }(Component), _class2.propTypes = {
176
+ itemId: PropTypes.number,
177
+ answerSummary: matchingTypeAnswerSummaryPropType,
178
+ orderedAnswerKeys: PropTypes.array.isRequired,
179
+ orderedQuestionKeys: PropTypes.array.isRequired
180
+ }.isRequired, _temp)) || _class);
@@ -0,0 +1,7 @@
1
+ export default function generator(_ref) {
2
+ var spacing = _ref.spacing;
3
+ return {
4
+ tableBottomPadding: spacing.medium,
5
+ colorGreen: '#0b874b'
6
+ };
7
+ }
@@ -0,0 +1 @@
1
+ export { MatchingType } from "./MatchingType.js";
@@ -0,0 +1,42 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
3
+
4
+ var MatchingTypeOrderer = function MatchingTypeOrderer() {
5
+ _classCallCheck(this, MatchingTypeOrderer);
6
+
7
+ this.orderAnswerKeysForDiagonal = function (answerSummary, answerKeys) {
8
+ var questions = answerSummary.questions;
9
+ var questionKeys = Object.keys(questions);
10
+
11
+ var orderedKeys = _toConsumableArray(answerKeys);
12
+
13
+ answerKeys.forEach(function (answerKey) {
14
+ questionKeys.forEach(function (questionKey) {
15
+ var question = questions[questionKey];
16
+
17
+ if (question.answers[answerKey].distractor) {
18
+ orderedKeys.splice(orderedKeys.indexOf(answerKey), 1);
19
+ orderedKeys.push(answerKey);
20
+ }
21
+ });
22
+ });
23
+ return orderedKeys;
24
+ };
25
+
26
+ this.orderQuestionKeysForDiagonal = function (answerSummary, questionKeys, orderedAnswerKeys) {
27
+ var questions = answerSummary.questions;
28
+ var orderedQuestionKeys = [];
29
+ orderedAnswerKeys.forEach(function (orderedAnswerKey) {
30
+ questionKeys.forEach(function (questionKey) {
31
+ var question = questions[questionKey];
32
+
33
+ if (question.answers[orderedAnswerKey].correct) {
34
+ orderedQuestionKeys.push(questionKey);
35
+ }
36
+ });
37
+ });
38
+ return orderedQuestionKeys;
39
+ };
40
+ };
41
+
42
+ export default new MatchingTypeOrderer();
@@ -5,6 +5,7 @@ import React, { Component } from 'react';
5
5
  import { PropTypes } from '@instructure/quiz-interactions';
6
6
  import ChoiceType from "./ChoiceType/index.js";
7
7
  import AggregationType from "./AggregationType/index.js";
8
+ import { MatchingType } from "./MatchingType/index.js";
8
9
  import { answerSummaryPropType } from "../propTypes.js";
9
10
  export var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
10
11
  _inherits(AnswerFrequencySummary, _Component);
@@ -31,6 +32,10 @@ export var AnswerFrequencySummary = /*#__PURE__*/function (_Component) {
31
32
  if (afsFlags.hotSpotEnabled) {
32
33
  _this.afsTableComponentMap.set('hot-spot', AggregationType);
33
34
  }
35
+
36
+ if (afsFlags.matchingEnabled) {
37
+ _this.afsTableComponentMap.set('matching', MatchingType);
38
+ }
34
39
  };
35
40
 
36
41
  _this.render = function () {
@@ -2,7 +2,7 @@ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
2
  import _inherits from "@babel/runtime/helpers/esm/inherits";
3
3
  import _createSuper from "@babel/runtime/helpers/esm/createSuper";
4
4
 
5
- var _dec, _class, _temp;
5
+ var _dec, _class, _class2, _temp;
6
6
 
7
7
  import React, { Component } from 'react';
8
8
  import t from '@instructure/quiz-i18n/es/format-message';
@@ -17,7 +17,8 @@ var styles = {
17
17
  import { themeable } from '@instructure/ui-themeable';
18
18
  import { Flex } from '@instructure/ui-flex';
19
19
  import { Heading } from '@instructure/ui-heading';
20
- export var AfsTableWrapper = (_dec = themeable(theme, styles), _dec(_class = (_temp = /*#__PURE__*/function (_Component) {
20
+ import PropTypes from 'prop-types';
21
+ export var AfsTableWrapper = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
21
22
  _inherits(AfsTableWrapper, _Component);
22
23
 
23
24
  var _super = _createSuper(AfsTableWrapper);
@@ -34,22 +35,24 @@ export var AfsTableWrapper = (_dec = themeable(theme, styles), _dec(_class = (_t
34
35
  _this = _super.call.apply(_super, [this].concat(args));
35
36
 
36
37
  _this.render = function () {
37
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Flex, {
38
+ return /*#__PURE__*/React.createElement(Flex, {
38
39
  direction: "row"
39
40
  }, /*#__PURE__*/React.createElement(Flex.Item, {
40
41
  shouldGrow: true
41
42
  }, /*#__PURE__*/React.createElement("div", {
42
43
  className: styles.tableWrapper
43
44
  }, /*#__PURE__*/React.createElement(Heading, {
44
- margin: "0 x-large small 0",
45
+ margin: "x-large x-large x-large 0",
45
46
  level: "h3",
46
47
  weight: "bold",
47
48
  color: "primary"
48
- }, t('Answer Frequency Summary')), _this.props.children))));
49
+ }, t('Answer Frequency Summary')), _this.props.children)));
49
50
  };
50
51
 
51
52
  return _this;
52
53
  }
53
54
 
54
55
  return AfsTableWrapper;
55
- }(Component), _temp)) || _class);
56
+ }(Component), _class2.propTypes = {
57
+ children: PropTypes.node.isRequired
58
+ }, _temp)) || _class);
@@ -14,27 +14,27 @@ import { IconCheckSolid, IconXSolid, IconNoSolid, IconOvalHalfSolid } from '@ins
14
14
  import { themeable } from '@instructure/ui-themeable';
15
15
  import theme from "./theme.js";
16
16
  var styles = {
17
- componentId: 'eADot',
17
+ componentId: 'fuOpc',
18
18
  template: function template(theme) {
19
- return "\n\n.eADot_cvRx{align-items:center;display:flex;height:48px;justify-content:center;width:46px}\n\n.eADot_fPIL table{border-collapse:separate;border-spacing:0 12px}\n\n.eADot_fPIL thead th{border-color:".concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}\n\n.eADot_euQM{padding-left:10px}\n\n.eADot_fuuc{padding-left:45px}\n\n.eADot_bTFA{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.eADot_bvau{background-color:").concat(theme.colorGreen || 'inherit', "}\n\n.eADot_dmcW{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.eADot_cxOH{background-color:").concat(theme.colorRed || 'inherit', "}\n\n.eADot_xOeH{border-color:").concat(theme.colorBlue || 'inherit', "}\n\n.eADot_eRkO{background-color:").concat(theme.colorBlue || 'inherit', "}\n\n.eADot_dlLI{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.eADot_eKcq{background-color:").concat(theme.colorGrey || 'inherit', "}\n\n.eADot_vDgC svg{fill:#fff}\n\n.eADot_fHMm{border-color:").concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}\n\n.eADot_WspM{border-radius:4px 0 0 4px;border-style:solid;border-width:2px 0 2px 2px}\n\n.eADot_fAnT{border-width:2px 0 2px 0}\n\n.eADot_bMPk,.eADot_fAnT{border-style:solid;padding:").concat(theme.cellPadding || 'inherit', "}\n\n.eADot_bMPk{border-radius:0 4px 4px 0;border-width:2px 2px 2px 0}");
19
+ return "\n\n.fuOpc_cvRx{align-items:center;display:flex;height:48px;justify-content:center;width:46px}\n\n.fuOpc_fPIL table{border-collapse:separate;border-spacing:0 12px}\n\n.fuOpc_fPIL thead th{border-color:".concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}\n\n.fuOpc_euQM{padding-left:10px}\n\n.fuOpc_fuuc{padding-left:45px}\n\n.fuOpc_bTFA{border-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fuOpc_bvau{background-color:").concat(theme.colorGreen || 'inherit', "}\n\n.fuOpc_dmcW{border-color:").concat(theme.colorRed || 'inherit', "}\n\n.fuOpc_cxOH{background-color:").concat(theme.colorRed || 'inherit', "}\n\n.fuOpc_xOeH{border-color:").concat(theme.colorBlue || 'inherit', "}\n\n.fuOpc_eRkO{background-color:").concat(theme.colorBlue || 'inherit', "}\n\n.fuOpc_dlLI{border-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fuOpc_eKcq{background-color:").concat(theme.colorGrey || 'inherit', "}\n\n.fuOpc_vDgC svg{fill:#fff}\n\n.fuOpc_fHMm{border-color:").concat(theme.colorHeaderBottomBorder || 'inherit', ";border-style:solid;border-width:0 0 1px 0}\n\n.fuOpc_WspM{border-radius:4px 0 0 4px;border-style:solid;border-width:2px 0 2px 2px}\n\n.fuOpc_fAnT{border-width:2px 0 2px 0}\n\n.fuOpc_bMPk,.fuOpc_fAnT{border-style:solid;padding:").concat(theme.cellPadding || 'inherit', "}\n\n.fuOpc_bMPk{border-radius:0 4px 4px 0;border-width:2px 2px 2px 0}");
20
20
  },
21
- 'iconWrapper': 'eADot_cvRx',
22
- 'collapsingTable': 'eADot_fPIL',
23
- 'labelWrapper': 'eADot_euQM',
24
- 'firstHeaderCell': 'eADot_fuuc',
25
- 'correctBorder': 'eADot_bTFA',
26
- 'correctBackground': 'eADot_bvau',
27
- 'incorrectBorder': 'eADot_dmcW',
28
- 'incorrectBackground': 'eADot_cxOH',
29
- 'partialCorrectBorder': 'eADot_xOeH',
30
- 'partialCorrectBackground': 'eADot_eRkO',
31
- 'noAnswerBorder': 'eADot_dlLI',
32
- 'noAnswerBackground': 'eADot_eKcq',
33
- 'iconWhite': 'eADot_vDgC',
34
- 'headerCell': 'eADot_fHMm',
35
- 'firstCell': 'eADot_WspM',
36
- 'middleCell': 'eADot_fAnT',
37
- 'lastCell': 'eADot_bMPk'
21
+ 'iconWrapper': 'fuOpc_cvRx',
22
+ 'collapsingTable': 'fuOpc_fPIL',
23
+ 'labelWrapper': 'fuOpc_euQM',
24
+ 'firstHeaderCell': 'fuOpc_fuuc',
25
+ 'correctBorder': 'fuOpc_bTFA',
26
+ 'correctBackground': 'fuOpc_bvau',
27
+ 'incorrectBorder': 'fuOpc_dmcW',
28
+ 'incorrectBackground': 'fuOpc_cxOH',
29
+ 'partialCorrectBorder': 'fuOpc_xOeH',
30
+ 'partialCorrectBackground': 'fuOpc_eRkO',
31
+ 'noAnswerBorder': 'fuOpc_dlLI',
32
+ 'noAnswerBackground': 'fuOpc_eKcq',
33
+ 'iconWhite': 'fuOpc_vDgC',
34
+ 'headerCell': 'fuOpc_fHMm',
35
+ 'firstCell': 'fuOpc_WspM',
36
+ 'middleCell': 'fuOpc_fAnT',
37
+ 'lastCell': 'fuOpc_bMPk'
38
38
  };
39
39
  import { Flex } from '@instructure/ui-flex';
40
40
  import classNames from 'classnames';
@@ -195,14 +195,12 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
195
195
  _this.renderAnswerSummaryTable = function (itemId, answer_summary, metricsClass, interactionType, afsFlags) {
196
196
  return /*#__PURE__*/React.createElement(Flex.Item, null, /*#__PURE__*/React.createElement("div", {
197
197
  className: metricsClass
198
- }, /*#__PURE__*/React.createElement("div", {
199
- className: styles.answerFrequencySummaryContainer
200
198
  }, /*#__PURE__*/React.createElement(AnswerFrequencySummary, {
201
199
  itemId: itemId,
202
200
  answerSummary: answer_summary,
203
201
  interactionType: interactionType,
204
202
  afsFlags: afsFlags
205
- }))));
203
+ })));
206
204
  };
207
205
 
208
206
  return _this;
@@ -65,7 +65,18 @@ export var choiceTypeAnswerSummaryPropType = PropTypes.shape({
65
65
  })),
66
66
  no_answer: aggregateDetailPropType
67
67
  });
68
- export var answerSummaryPropType = PropTypes.oneOfType([choiceTypeAnswerSummaryPropType, onlyAggregatePropType]);
68
+ export var matchingTypeAnswerSummaryPropType = PropTypes.shape({
69
+ questions: PropTypes.objectOf(PropTypes.shape({
70
+ body: PropTypes.string,
71
+ answers: PropTypes.objectOf(PropTypes.shape({
72
+ count: PropTypes.number,
73
+ correct: PropTypes.bool,
74
+ body: PropTypes.string,
75
+ distractor: PropTypes.bool
76
+ }))
77
+ }))
78
+ });
79
+ export var answerSummaryPropType = PropTypes.oneOfType([choiceTypeAnswerSummaryPropType, onlyAggregatePropType, matchingTypeAnswerSummaryPropType]);
69
80
  export var afsFlags = PropTypes.shape({
70
81
  formulaEnabled: PropTypes.bool.isRequired,
71
82
  matchingEnabled: PropTypes.bool.isRequired