@instructure/quiz-core 17.63.1-rc.1 → 17.63.1-rc.13

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 (43) hide show
  1. package/es/building/api/qtiImports.js +16 -10
  2. package/es/building/components/QTIImportModal/index.js +1 -1
  3. package/es/common/actions/analyses.js +7 -1
  4. package/es/common/components/shared/spinner/Spinner.js +33 -18
  5. package/es/common/components/shared/spinner/theme.js +2 -5
  6. package/es/common/reducers/analyses.js +10 -8
  7. package/es/common/selectors/analyses.js +3 -0
  8. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/ChoiceInfo/presenter.js +14 -7
  9. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/presenter.js +4 -0
  10. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +129 -143
  11. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/theme.js +2 -1
  12. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +9 -8
  13. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/theme.js +2 -1
  14. package/es/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/presenter.js +85 -30
  15. package/es/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/theme.js +4 -2
  16. package/es/reporting/components/resources/NewQuizAndItemAnalysis/errorMessages.js +3 -0
  17. package/es/reporting/components/resources/NewQuizAndItemAnalysis/fetchReports.js +15 -12
  18. package/es/reporting/components/resources/NewQuizAndItemAnalysis/fetchReportsStatus.js +45 -0
  19. package/es/reporting/components/resources/NewQuizAndItemAnalysis/generateReports.js +52 -0
  20. package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisState.js +10 -4
  21. package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +73 -18
  22. package/lib/building/api/qtiImports.js +16 -10
  23. package/lib/building/components/QTIImportModal/index.js +1 -1
  24. package/lib/common/actions/analyses.js +8 -0
  25. package/lib/common/components/shared/spinner/Spinner.js +34 -19
  26. package/lib/common/components/shared/spinner/theme.js +2 -5
  27. package/lib/common/reducers/analyses.js +13 -8
  28. package/lib/common/selectors/analyses.js +7 -1
  29. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/ChoiceInfo/presenter.js +14 -6
  30. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/presenter.js +5 -0
  31. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +132 -144
  32. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/theme.js +2 -1
  33. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +9 -8
  34. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/theme.js +2 -1
  35. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/presenter.js +84 -29
  36. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/theme.js +4 -2
  37. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/errorMessages.js +8 -2
  38. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/fetchReports.js +15 -12
  39. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/fetchReportsStatus.js +59 -0
  40. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/generateReports.js +67 -0
  41. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisState.js +10 -2
  42. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +74 -17
  43. package/package.json +9 -9
@@ -27,10 +27,6 @@ var _index = _interopRequireDefault(require("../Row/index.js"));
27
27
 
28
28
  var _propTypes = _interopRequireDefault(require("prop-types"));
29
29
 
30
- var _ref = /*#__PURE__*/_react.default.createElement(_uiTable.Table.ColHeader, {
31
- width: "46px"
32
- });
33
-
34
30
  var ChoiceInfo = /*#__PURE__*/function (_Component) {
35
31
  (0, _inherits2.default)(ChoiceInfo, _Component);
36
32
 
@@ -77,15 +73,26 @@ var ChoiceInfo = /*#__PURE__*/function (_Component) {
77
73
  value: function render() {
78
74
  var _this$props = this.props,
79
75
  choices = _this$props.choices,
80
- noAnswer = _this$props.noAnswer;
76
+ noAnswer = _this$props.noAnswer,
77
+ itemId = _this$props.itemId;
81
78
  var numberOfChoices = choices.length;
79
+ var spacingHeaderId = "answer-frequency-summary-spacing-".concat(itemId);
80
+ var answerHeaderId = "answer-frequency-summary-answer-".concat(itemId);
81
+ var respondentsHeaderId = "answer-frequency-summary-respondents-".concat(itemId);
82
+ var percentageHeaderId = "answer-frequency-summary-percentage-".concat(itemId);
82
83
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_uiTable.Table, {
83
84
  caption: (0, _formatMessage.default)('Answer Frequency Summary')
84
- }, /*#__PURE__*/_react.default.createElement(_uiTable.Table.Head, null, /*#__PURE__*/_react.default.createElement(_uiTable.Table.Row, null, _ref, /*#__PURE__*/_react.default.createElement(_uiTable.Table.ColHeader, {
85
+ }, /*#__PURE__*/_react.default.createElement(_uiTable.Table.Head, null, /*#__PURE__*/_react.default.createElement(_uiTable.Table.Row, null, /*#__PURE__*/_react.default.createElement(_uiTable.Table.ColHeader, {
86
+ id: spacingHeaderId,
87
+ width: "46px"
88
+ }), /*#__PURE__*/_react.default.createElement(_uiTable.Table.ColHeader, {
89
+ id: answerHeaderId,
85
90
  height: "47px"
86
91
  }, (0, _formatMessage.default)('Answer')), /*#__PURE__*/_react.default.createElement(_uiTable.Table.ColHeader, {
92
+ id: respondentsHeaderId,
87
93
  height: "47px"
88
94
  }, (0, _formatMessage.default)('Respondents')), /*#__PURE__*/_react.default.createElement(_uiTable.Table.ColHeader, {
95
+ id: percentageHeaderId,
89
96
  height: "47px",
90
97
  textAlign: "center"
91
98
  }, (0, _formatMessage.default)('%')))), /*#__PURE__*/_react.default.createElement(_uiTable.Table.Body, null, choices.map(this.renderRow), this.renderNoAnswer(noAnswer, numberOfChoices))));
@@ -97,6 +104,7 @@ var ChoiceInfo = /*#__PURE__*/function (_Component) {
97
104
 
98
105
  exports.ChoiceInfo = ChoiceInfo;
99
106
  ChoiceInfo.propTypes = {
107
+ itemId: _propTypes.default.number,
100
108
  choices: _propTypes.default.arrayOf(_propTypes.default.shape({
101
109
  body: _propTypes.default.string,
102
110
  correct: _propTypes.default.bool,
@@ -29,6 +29,8 @@ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/f
29
29
 
30
30
  var _propTypes = require("../propTypes.js");
31
31
 
32
+ var _quizInteractions = require("@instructure/quiz-interactions");
33
+
32
34
  var _dec, _class, _class2, _temp;
33
35
 
34
36
  var styles = {
@@ -62,12 +64,14 @@ var AnswerSummaryTable = (_dec = (0, _uiThemeable.themeable)(_theme.default, sty
62
64
  var _this$props$answerSum = _this.props.answerSummary,
63
65
  choices = _this$props$answerSum.choices,
64
66
  no_answer = _this$props$answerSum.no_answer;
67
+ var itemId = _this.props.itemId;
65
68
  return /*#__PURE__*/_react.default.createElement("div", {
66
69
  className: styles.tableWrapper
67
70
  }, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
68
71
  margin: "large 0 small 0",
69
72
  level: "h3"
70
73
  }, (0, _formatMessage.default)('Answer Frequency Summary')), /*#__PURE__*/_react.default.createElement(_presenter.ChoiceInfo, {
74
+ itemId: itemId,
71
75
  choices: choices,
72
76
  noAnswer: no_answer
73
77
  }));
@@ -78,6 +82,7 @@ var AnswerSummaryTable = (_dec = (0, _uiThemeable.themeable)(_theme.default, sty
78
82
 
79
83
  return AnswerSummaryTable;
80
84
  }(_react.Component), _class2.propTypes = {
85
+ itemId: _quizInteractions.PropTypes.number,
81
86
  answerSummary: _propTypes.answerSummaryPropType
82
87
  }.isRequired, _temp)) || _class);
83
88
  exports.AnswerSummaryTable = AnswerSummaryTable;
@@ -41,7 +41,7 @@ var _index3 = _interopRequireDefault(require("../AnalysisMetric/index.js"));
41
41
 
42
42
  var _index4 = _interopRequireDefault(require("../AnalysisPopoverMetric/index.js"));
43
43
 
44
- var _classnames2 = _interopRequireDefault(require("classnames"));
44
+ var _classnames3 = _interopRequireDefault(require("classnames"));
45
45
 
46
46
  var _interactionTypeMetadata = require("../../../../../common/util/interactionTypeMetadata.js");
47
47
 
@@ -49,30 +49,25 @@ var _index5 = _interopRequireDefault(require("../AnswerSummaryTable/index.js"));
49
49
 
50
50
  var _propTypes = require("../propTypes.js");
51
51
 
52
+ var _quizRce = require("@instructure/quiz-rce");
53
+
54
+ var _uiFlex = require("@instructure/ui-flex");
55
+
52
56
  var _dec, _class, _class2, _temp;
53
57
 
54
58
  var styles = {
55
- componentId: 'bCOJX',
59
+ componentId: 'bnyej',
56
60
  template: function template(theme) {
57
- return "\n\n.bCOJX_eDnN{display:flex;flex-basis:45%;flex-direction:column;overflow:hidden}\n\n.bCOJX_eKXQ{padding:".concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.bCOJX_eoBe{font-size:").concat(theme.metricNumberContextFontSize || 'inherit', ";font-weight:").concat(theme.metricNumberContextFontWeight || 'inherit', "}\n\n.bCOJX_eIAv{display:flex;position:relative}\n\n.bCOJX_ePHw{flex-basis:91%;overflow:hidden;padding-bottom:10px;text-overflow:ellipsis;white-space:nowrap}\n\n.bCOJX_dzsH{overflow:visible;text-overflow:unset;white-space:normal}\n\n.bCOJX_byoJ{position:absolute;right:7px;top:-8px}\n\n.bCOJX_evBt{flex-wrap:wrap;justify-content:space-between}\n\n.bCOJX_pAQb,.bCOJX_evBt{display:flex;flex-direction:row}\n\n.bCOJX_zefc{display:flex;flex-basis:55%;justify-content:flex-end}\n\n.bCOJX_dPzc{flex-direction:column}\n\n.bCOJX_dPzc,.bCOJX_dzph{display:flex;flex-basis:100%}\n\n.bCOJX_dzph{align-items:flex-start;box-sizing:border-box;column-gap:5px;justify-content:space-between;padding:0 30px 0 25px}\n\n.bCOJX_eobd{padding-top:1rem}\n\n.bCOJX_NpIG{position:absolute;right:").concat(theme.viewPadding || 'inherit', ";top:").concat(theme.viewPadding || 'inherit', "}\n\n.bCOJX_csiQ{display:flex;flex-basis:100%}\n\n.bCOJX_fjVl{display:flex;flex-basis:50%}\n\n.bCOJX_eZLI{display:flex;flex-basis:40%}\n\n@media screen and (--tabletBreakPoint){.bCOJX_zefc{flex-basis:100%;justify-content:flex-start}.bCOJX_ePHw{flex-basis:94%}.bCOJX_eDnN{flex-basis:100%}.bCOJX_dzph{padding:0}.bCOJX_eDnN h3{padding-right:30px}.bCOJX_NpIG{right:17px}.bCOJX_eIAv{margin-bottom:20px}.bCOJX_byoJ{right:-7px}.bCOJX_dzph{flex-wrap:wrap}}");
61
+ return "\n\n.bnyej_eKXQ{padding:".concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.bnyej_bwlc{align-items:flex-start;gap:24px;justify-content:space-between;row-gap:32px}\n\n.bnyej_bwlc,.bnyej_bqdH{display:flex;flex-direction:row;flex-wrap:wrap}\n\n.bnyej_bqdH{align-items:center;row-gap:24px}\n\n.bnyej_NpIG{position:absolute;right:").concat(theme.viewPaddingRight || 'inherit', ";top:").concat(theme.viewPaddingTop || 'inherit', "}\n\n.bnyej_eoBe{font-size:").concat(theme.metricNumberContextFontSize || 'inherit', ";font-weight:").concat(theme.metricNumberContextFontWeight || 'inherit', "}\n\n.bnyej_fFDJ{display:none}\n\n.bnyej_esVF{min-height:48px}\n\n.bnyej_eTZq{position:relative}\n\n.bnyej_eTZq:after{background:linear-gradient(180deg,hsla(0,0%,100%,0),#fff);content:\"\";height:48px;left:0;position:absolute;top:0;width:100%}");
58
62
  },
59
- 'heading': 'bCOJX_eDnN',
60
- 'cardWrapper': 'bCOJX_eKXQ',
61
- 'metricNumberContext': 'bCOJX_eoBe',
62
- 'bodyPresentation': 'bCOJX_eIAv',
63
- 'bodyExcerpt': 'bCOJX_ePHw',
64
- 'bodyExcerptExpanded': 'bCOJX_dzsH',
65
- 'bodyExpandButtonWrapper': 'bCOJX_byoJ',
66
- 'innerWrapper': 'bCOJX_evBt',
67
- 'expandableInnerWrapper': 'bCOJX_pAQb',
68
- 'metricsWithControls': 'bCOJX_zefc',
69
- 'metricGroup': 'bCOJX_dPzc',
70
- 'metricsRow': 'bCOJX_dzph',
71
- 'metricsRowPaginated': 'bCOJX_eobd',
72
- 'itemCardToggleButtonWrapper': 'bCOJX_NpIG',
73
- 'expandableContent': 'bCOJX_csiQ',
74
- 'tableColumn': 'bCOJX_fjVl',
75
- 'performanceColumn': 'bCOJX_eZLI'
63
+ 'cardWrapper': 'bnyej_eKXQ',
64
+ 'itemCardInnerContainer': 'bnyej_bwlc',
65
+ 'metricsContainer': 'bnyej_bqdH',
66
+ 'itemCardToggleButtonWrapper': 'bnyej_NpIG',
67
+ 'metricNumberContext': 'bnyej_eoBe',
68
+ 'hiddenMetrics': 'bnyej_fFDJ',
69
+ 'itemBody': 'bnyej_esVF',
70
+ 'hiddenItemBody': 'bnyej_eTZq'
76
71
  };
77
72
  var supportedTables = ['choice', 'true-false', 'multi-answer'];
78
73
  var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
@@ -91,9 +86,7 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
91
86
 
92
87
  _this = _super.call.apply(_super, [this].concat(args));
93
88
  _this.state = {
94
- bodyToggable: false,
95
89
  bodyExpanded: false,
96
- itemExpanded: false,
97
90
  metricsExpanded: false
98
91
  };
99
92
 
@@ -104,39 +97,10 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
104
97
  });
105
98
  };
106
99
 
107
- _this.buildItemCardHeadingId = function () {
108
- return "itemCardHeading-".concat(_this.props.itemAnalysis.metadata.item_id);
109
- };
110
-
111
- _this.buildItemCardBodyId = function () {
112
- return "itemCardBody-".concat(_this.props.itemAnalysis.metadata.item_id);
113
- };
114
-
115
- _this.bodyExceedsLimit = function (bodyElement, headingElement) {
116
- if (!bodyElement || !headingElement) {
117
- return;
118
- }
119
-
120
- return bodyElement.scrollWidth > headingElement.clientWidth || _this.state.bodyExpanded;
121
- };
122
-
123
- _this.handleBodyWidth = function () {
124
- var bodyElement = document.getElementById(_this.buildItemCardBodyId());
125
- var headingElement = document.getElementById(_this.buildItemCardHeadingId());
126
-
127
- _this.setState({
128
- bodyToggable: _this.bodyExceedsLimit(bodyElement, headingElement)
129
- });
130
- };
131
-
132
- _this.handleToggle = function () {
100
+ _this.handleMetricToggle = function () {
133
101
  _this.setState({
134
102
  metricsExpanded: !_this.state.metricsExpanded
135
103
  });
136
-
137
- _this.setState({
138
- itemExpanded: !_this.state.itemExpanded
139
- });
140
104
  };
141
105
 
142
106
  _this.handleBodyToggle = function () {
@@ -145,26 +109,6 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
145
109
  });
146
110
  };
147
111
 
148
- _this.renderExpandItemCardButton = function () {
149
- return /*#__PURE__*/_react.default.createElement("div", {
150
- className: styles.itemCardToggleButtonWrapper
151
- }, /*#__PURE__*/_react.default.createElement(_index.default, {
152
- onClick: _this.handleToggle,
153
- title: _this.state.metricsExpanded ? (0, _formatMessage.default)('collapse item card') : (0, _formatMessage.default)('expand item card'),
154
- isExpanded: _this.state.metricsExpanded
155
- }));
156
- };
157
-
158
- _this.renderBodyToggleButton = function () {
159
- return /*#__PURE__*/_react.default.createElement("div", {
160
- className: styles.bodyExpandButtonWrapper
161
- }, /*#__PURE__*/_react.default.createElement(_index.default, {
162
- onClick: _this.handleBodyToggle,
163
- title: _this.state.bodyExpanded ? (0, _formatMessage.default)('collapse question stem') : (0, _formatMessage.default)('expand question stem'),
164
- isExpanded: _this.state.bodyExpanded
165
- }));
166
- };
167
-
168
112
  _this.calculateValueWithPointsPossible = function (metricKey, metricValue) {
169
113
  var pointsPossible = _this.props.itemAnalysis.scores.points_possible;
170
114
  return _formatMessage.default.rich('{score, number}<s>/{possible, number} PTS</s>', {
@@ -180,103 +124,147 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
180
124
  });
181
125
  };
182
126
 
183
- _this.renderExpanded = function () {
184
- var scores = _this.props.itemAnalysis.scores;
185
- var classes = (0, _classnames2.default)(styles.metricsRow, styles.metricsRowPaginated);
186
- return /*#__PURE__*/_react.default.createElement("div", {
187
- className: classes
188
- }, /*#__PURE__*/_react.default.createElement(_index4.default, {
189
- metricKey: "pearson_correlation",
190
- label: (0, _formatMessage.default)('Pearson Correlation Coefficient'),
191
- value: _formatMessage.default.number(scores.pearson_correlation),
192
- popoverDescription: _popoverContent.pearsonCorrelation
193
- }));
194
- };
195
-
196
- return _this;
197
- }
198
-
199
- (0, _createClass2.default)(NewItemAnalysis, [{
200
- key: "componentDidMount",
201
- value: function componentDidMount() {
202
- this.handleBodyWidth();
203
- window.addEventListener('resize', this.handleBodyWidth);
204
- }
205
- }, {
206
- key: "componentWillUnmount",
207
- value: function componentWillUnmount() {
208
- window.removeEventListener('resize', this.handleBodyWidth);
209
- }
210
- }, {
211
- key: "render",
212
- value: function render() {
213
- var _this$props$itemAnaly = this.props.itemAnalysis,
214
- answer_summary = _this$props$itemAnaly.answer_summary,
215
- metadata = _this$props$itemAnaly.metadata,
216
- scores = _this$props$itemAnaly.scores;
217
- var bodyClass = (0, _classnames2.default)(styles.bodyExcerpt, (0, _defineProperty2.default)({}, styles.bodyExcerptExpanded, this.state.bodyExpanded));
218
- var headingId = this.buildItemCardHeadingId();
219
- var bodyId = this.buildItemCardBodyId();
220
- var isSupportedTable = supportedTables.includes(metadata.interaction_type);
221
- return /*#__PURE__*/_react.default.createElement(_index2.default, {
222
- className: styles.cardWrapper
223
- }, /*#__PURE__*/_react.default.createElement("div", {
224
- className: styles.innerWrapper
225
- }, /*#__PURE__*/_react.default.createElement("div", {
226
- id: headingId,
227
- className: styles.heading
228
- }, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
229
- margin: "0 0 small 0",
127
+ _this.renderTitle = function (title) {
128
+ return /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
129
+ margin: "0 x-large small 0",
230
130
  level: "h3",
231
131
  weight: "bold",
232
132
  color: "primary"
233
- }, metadata.item_title), /*#__PURE__*/_react.default.createElement(_uiText.Text, {
133
+ }, title);
134
+ };
135
+
136
+ _this.renderInteractionType = function (interactionType) {
137
+ return /*#__PURE__*/_react.default.createElement(_uiText.Text, {
234
138
  size: "small",
235
139
  weight: "bold",
236
140
  transform: "capitalize"
237
- }, this.mapInteractionTypeToTranslation(metadata.interaction_type)), /*#__PURE__*/_react.default.createElement("div", {
238
- id: "itemBody",
239
- className: styles.bodyPresentation
240
- }, /*#__PURE__*/_react.default.createElement("div", {
241
- id: bodyId,
242
- className: bodyClass
243
- }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
244
- size: "small"
245
- }, metadata.item_body)), this.state.bodyToggable && this.renderBodyToggleButton())), /*#__PURE__*/_react.default.createElement("div", {
246
- className: styles.metricsWithControls
141
+ }, _this.mapInteractionTypeToTranslation(interactionType));
142
+ };
143
+
144
+ _this.renderRichContent = function (itemBody, itemBodyClass) {
145
+ return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
146
+ direction: "row",
147
+ alignItems: "start"
148
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
149
+ shouldShrink: true,
150
+ shouldGrow: true
247
151
  }, /*#__PURE__*/_react.default.createElement("div", {
248
- className: styles.metricGroup
152
+ className: itemBodyClass
153
+ }, /*#__PURE__*/_react.default.createElement(_quizRce.RichContentRenderer, {
154
+ content: itemBody
155
+ }))), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
156
+ margin: "xx-small small none x-small",
157
+ size: "38px"
158
+ }, /*#__PURE__*/_react.default.createElement(_index.default, {
159
+ onClick: _this.handleBodyToggle,
160
+ title: _this.state.bodyExpanded ? (0, _formatMessage.default)('collapse question stem') : (0, _formatMessage.default)('expand question stem'),
161
+ isExpanded: _this.state.bodyExpanded
162
+ })));
163
+ };
164
+
165
+ _this.renderMetrics = function (scores, metricsClass) {
166
+ return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
167
+ direction: "column"
168
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
169
+ overflowY: "visible"
249
170
  }, /*#__PURE__*/_react.default.createElement("div", {
250
- className: styles.metricsRow
171
+ className: styles.metricsContainer
172
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
173
+ margin: "none medium none none"
251
174
  }, /*#__PURE__*/_react.default.createElement(_index4.default, {
252
175
  metricKey: "difficulty_index",
253
176
  label: (0, _formatMessage.default)('Item Difficulty'),
254
177
  value: _formatMessage.default.number(scores.difficulty_index),
255
178
  popoverDescription: _popoverContent.difficultyIndex
256
- }), /*#__PURE__*/_react.default.createElement(_index3.default, {
179
+ })), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
180
+ margin: "none medium none none"
181
+ }, /*#__PURE__*/_react.default.createElement(_index3.default, {
257
182
  metricKey: "mean",
258
183
  label: (0, _formatMessage.default)('Mean Earned Points'),
259
- value: this.calculateValueWithPointsPossible('mean', scores.mean)
260
- }), /*#__PURE__*/_react.default.createElement(_index3.default, {
184
+ value: _this.calculateValueWithPointsPossible('mean', scores.mean)
185
+ })), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
186
+ margin: "none medium none none"
187
+ }, /*#__PURE__*/_react.default.createElement(_index3.default, {
261
188
  metricKey: "median",
262
189
  label: (0, _formatMessage.default)('Median Earned Points'),
263
- value: this.calculateValueWithPointsPossible('median', scores.median)
264
- }), /*#__PURE__*/_react.default.createElement(_index4.default, {
190
+ value: _this.calculateValueWithPointsPossible('median', scores.median)
191
+ })), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
192
+ margin: "none large none none"
193
+ }, /*#__PURE__*/_react.default.createElement(_index4.default, {
265
194
  metricKey: "discrimination_index",
266
195
  label: (0, _formatMessage.default)('Discrimination Index'),
267
196
  value: _formatMessage.default.number(scores.discrimination_index),
268
197
  popoverDescription: _popoverContent.discriminationIndex
269
- }), this.renderExpandItemCardButton()), this.state.metricsExpanded && this.renderExpanded()))), this.state.itemExpanded && /*#__PURE__*/_react.default.createElement("div", {
270
- className: styles.expandableInnerWrapper
198
+ })))), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
199
+ overflowY: "visible",
200
+ margin: "medium none none none"
271
201
  }, /*#__PURE__*/_react.default.createElement("div", {
272
- className: styles.expandableContent
202
+ className: metricsClass
273
203
  }, /*#__PURE__*/_react.default.createElement("div", {
274
- className: styles.tableColumn
275
- }, isSupportedTable && /*#__PURE__*/_react.default.createElement(_index5.default, {
204
+ className: styles.metricsContainer
205
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
206
+ margin: "none medium none none"
207
+ }, /*#__PURE__*/_react.default.createElement(_index4.default, {
208
+ metricKey: "pearson_correlation",
209
+ label: (0, _formatMessage.default)('Corrected Item-Total Correlation Coefficient'),
210
+ value: _formatMessage.default.number(scores.pearson_correlation),
211
+ popoverDescription: _popoverContent.pearsonCorrelation
212
+ }))))));
213
+ };
214
+
215
+ _this.renderAnswerSummaryTable = function (itemId, answer_summary, isSupportedTable, metricsClass) {
216
+ return /*#__PURE__*/_react.default.createElement("div", {
217
+ className: metricsClass
218
+ }, isSupportedTable && /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
219
+ direction: "row"
220
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
221
+ size: "55%"
222
+ }, /*#__PURE__*/_react.default.createElement(_index5.default, {
223
+ itemId: itemId,
276
224
  answerSummary: answer_summary
277
- })), /*#__PURE__*/_react.default.createElement("div", {
278
- className: styles.performanceColumn
279
225
  }))));
226
+ };
227
+
228
+ return _this;
229
+ }
230
+
231
+ (0, _createClass2.default)(NewItemAnalysis, [{
232
+ key: "render",
233
+ value: function render() {
234
+ var _this$props$itemAnaly = this.props.itemAnalysis,
235
+ answer_summary = _this$props$itemAnaly.answer_summary,
236
+ metadata = _this$props$itemAnaly.metadata,
237
+ scores = _this$props$itemAnaly.scores;
238
+ var itemId = metadata.item_id;
239
+ var isSupportedTable = supportedTables.includes(metadata.interaction_type);
240
+ var metricsClass = (0, _classnames3.default)((0, _defineProperty2.default)({}, styles.hiddenMetrics, !this.state.metricsExpanded));
241
+ var itemBodyClass = (0, _classnames3.default)(styles.itemBody, (0, _defineProperty2.default)({}, styles.hiddenItemBody, !this.state.bodyExpanded));
242
+ return /*#__PURE__*/_react.default.createElement(_index2.default, {
243
+ className: styles.cardWrapper
244
+ }, /*#__PURE__*/_react.default.createElement("div", {
245
+ className: styles.itemCardToggleButtonWrapper
246
+ }, /*#__PURE__*/_react.default.createElement(_index.default, {
247
+ onClick: this.handleMetricToggle,
248
+ title: this.state.metricsExpanded ? (0, _formatMessage.default)('collapse item card') : (0, _formatMessage.default)('expand item card'),
249
+ isExpanded: this.state.metricsExpanded
250
+ })), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
251
+ direction: "column"
252
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
253
+ overflowY: "visible"
254
+ }, /*#__PURE__*/_react.default.createElement("div", {
255
+ className: styles.itemCardInnerContainer
256
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
257
+ shouldGrow: true,
258
+ shouldShrink: true,
259
+ size: "45%"
260
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
261
+ direction: "column",
262
+ justifyItems: "start"
263
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, this.renderTitle(metadata.item_title)), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, this.renderInteractionType(metadata.interaction_type)), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
264
+ shouldShrink: true,
265
+ overflowY: "hidden",
266
+ size: !this.state.bodyExpanded ? '48px' : void 0
267
+ }, this.renderRichContent(metadata.item_body, itemBodyClass)))), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, this.renderMetrics(scores, metricsClass)))), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, this.renderAnswerSummaryTable(itemId, answer_summary, isSupportedTable, metricsClass))));
280
268
  }
281
269
  }]);
282
270
  NewItemAnalysis.displayName = "NewItemAnalysis";
@@ -12,7 +12,8 @@ function generator(_ref) {
12
12
  return {
13
13
  tabletBreakPoint: "max-width: ".concat(breakpoints.large),
14
14
  cardWrapperPadding: spacing.medium,
15
- viewPadding: spacing.small,
15
+ viewPaddingRight: spacing.large,
16
+ viewPaddingTop: spacing.medium,
16
17
  metricNumberContextFontSize: typography.fontSizeMedium,
17
18
  metricNumberContextFontWeight: typography.fontWeightNormal
18
19
  };
@@ -44,16 +44,16 @@ var _propTypes = require("../propTypes.js");
44
44
  var _dec, _class, _class2, _temp;
45
45
 
46
46
  var styles = {
47
- componentId: 'bnEXV',
47
+ componentId: 'fQZVs',
48
48
  template: function template(theme) {
49
- return "\n\n.bnEXV_eDnN{display:flex;justify-content:space-between;padding-bottom:".concat(theme.headingPadding || 'inherit', "}\n\n.bnEXV_eKXQ{padding:").concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.bnEXV_crZr{padding-top:").concat(theme.metricGroupPaddingTop || 'inherit', "}\n\n.bnEXV_bTHH{position:absolute;right:").concat(theme.viewPadding || 'inherit', ";top:").concat(theme.viewPadding || 'inherit', "}\n\n.bnEXV_dPzc,.bnEXV_cpZE{column-gap:").concat(theme.metricsColumnGap || 'inherit', ";display:flex;flex-wrap:wrap;justify-content:flex-start;row-gap:1.5rem}");
49
+ return "\n\n.fQZVs_eDnN{display:flex;justify-content:space-between;padding-bottom:".concat(theme.headingPadding || 'inherit', "}\n\n.fQZVs_eKXQ{padding:").concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.fQZVs_crZr{padding-top:").concat(theme.metricGroupPaddingTop || 'inherit', "}\n\n.fQZVs_bTHH{position:absolute;right:").concat(theme.viewPaddingRight || 'inherit', ";top:").concat(theme.viewPaddingTop || 'inherit', "}\n\n.fQZVs_dPzc,.fQZVs_cpZE{column-gap:").concat(theme.metricsColumnGap || 'inherit', ";display:flex;flex-wrap:wrap;justify-content:flex-start;row-gap:1.5rem}");
50
50
  },
51
- 'heading': 'bnEXV_eDnN',
52
- 'cardWrapper': 'bnEXV_eKXQ',
53
- 'container': 'bnEXV_crZr',
54
- 'expandButtonContainer': 'bnEXV_bTHH',
55
- 'metricGroup': 'bnEXV_dPzc',
56
- 'metricsWrapper': 'bnEXV_cpZE'
51
+ 'heading': 'fQZVs_eDnN',
52
+ 'cardWrapper': 'fQZVs_eKXQ',
53
+ 'container': 'fQZVs_crZr',
54
+ 'expandButtonContainer': 'fQZVs_bTHH',
55
+ 'metricGroup': 'fQZVs_dPzc',
56
+ 'metricsWrapper': 'fQZVs_cpZE'
57
57
  };
58
58
  var stdDevPopoverTexts = {
59
59
  title: 'Lorem ipsum ',
@@ -128,6 +128,7 @@ var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
128
128
  className: styles.heading
129
129
  }, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
130
130
  level: "h4",
131
+ margin: "0 x-large 0 0",
131
132
  color: "primary"
132
133
  }, (0, _formatMessage.default)('Quiz summary:'), " ", metadata === null || metadata === void 0 ? void 0 : metadata.quiz_title)), /*#__PURE__*/_react.default.createElement("div", {
133
134
  className: styles.metricGroup
@@ -9,7 +9,8 @@ function generator(_ref) {
9
9
  var spacing = _ref.spacing;
10
10
  return {
11
11
  metricGroupPaddingTop: spacing.medium,
12
- viewPadding: spacing.small,
12
+ viewPaddingRight: spacing.large,
13
+ viewPaddingTop: spacing.medium,
13
14
  headingPadding: spacing.medium,
14
15
  cardWrapperPadding: spacing.medium,
15
16
  metricsColumnGap: '82px'
@@ -46,17 +46,17 @@ var _propTypes2 = require("../propTypes.js");
46
46
  var _dec, _class, _class2, _temp;
47
47
 
48
48
  var styles = {
49
- componentId: 'eJSiT',
49
+ componentId: 'boQPo',
50
50
  template: function template(theme) {
51
- return "\n\n.eJSiT_bqdH{column-gap:5px;display:flex;justify-content:space-between;padding:".concat(theme.metricsPadding || 'inherit', " 0}\n\n.eJSiT_fbIL{border-radius:").concat(theme.cardBorderRadius || 'inherit', ";box-shadow:").concat(theme.cardBoxShadow || 'inherit', ";display:inline-flex;flex-direction:column;margin:").concat(theme.cardMargin || 'inherit', ";padding:").concat(theme.cardPadding || 'inherit', ";width:").concat(theme.cardWidth || 'inherit', "}\n\n.eJSiT_blRb{max-width:160px;padding-right:10px}");
51
+ return "\n\n.boQPo_bqdH{column-gap:5px;display:flex;justify-content:space-between;padding-bottom:".concat(theme.metricsPadding || 'inherit', "}\n\n.boQPo_PFlN{border-radius:").concat(theme.cardBorderRadius || 'inherit', ";box-shadow:").concat(theme.cardBoxShadow || 'inherit', ";display:inline-flex;flex-direction:column;margin:").concat(theme.cardMargin || 'inherit', ";padding:").concat(theme.cardPadding || 'inherit', ";width:").concat(theme.cardWidth || 'inherit', "}\n\n.boQPo_blRb{max-width:160px;padding-right:10px}\n\n.boQPo_bxzy{border-bottom:1px solid ").concat(theme.quizSummaryBorderBottomColor || 'inherit', ";margin-bottom:15px;padding-bottom:15px}\n\n.boQPo_dKIc{padding-bottom:15px}\n\n.boQPo_cGHR{align-self:flex-end}");
52
52
  },
53
- 'metricsContainer': 'eJSiT_bqdH',
54
- 'card': 'eJSiT_fbIL',
55
- 'dateContainer': 'eJSiT_blRb'
53
+ 'metricsContainer': 'boQPo_bqdH',
54
+ 'reportCard': 'boQPo_PFlN',
55
+ 'dateContainer': 'boQPo_blRb',
56
+ 'quizAnalysisSummary': 'boQPo_bxzy',
57
+ 'titleContainer': 'boQPo_dKIc',
58
+ 'spinnerContainer': 'boQPo_cGHR'
56
59
  };
57
-
58
- var _ref = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
59
-
60
60
  var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
61
61
  (0, _inherits2.default)(NewQuizAndItemAnalysisReportCardPresenter, _Component);
62
62
 
@@ -73,6 +73,12 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
73
73
 
74
74
  _this = _super.call.apply(_super, [this].concat(args));
75
75
 
76
+ _this.handleGeneration = function (_event) {
77
+ var filter = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 'last_attempt';
78
+
79
+ _this.props.generateReports(filter);
80
+ };
81
+
76
82
  _this.renderMetrics = function () {
77
83
  var _quizAnalysis$scores, _quizAnalysis$scores2, _quizAnalysis$scores3;
78
84
 
@@ -97,20 +103,14 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
97
103
  }));
98
104
  };
99
105
 
100
- return _this;
101
- }
102
-
103
- (0, _createClass2.default)(NewQuizAndItemAnalysisReportCardPresenter, [{
104
- key: "renderContent",
105
- value: function renderContent() {
106
- var _this$props = this.props,
107
- name = _this$props.name,
108
- href = _this$props.href,
109
- quizAnalysis = _this$props.quizAnalysis;
110
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
111
- size: "medium",
112
- weight: "bold"
113
- }, name), this.renderMetrics(), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
106
+ _this.renderQuizAnalysisSummary = function () {
107
+ var _this$props = _this.props,
108
+ quizAnalysis = _this$props.quizAnalysis,
109
+ itemAnalyses = _this$props.itemAnalyses,
110
+ href = _this$props.href;
111
+ return /*#__PURE__*/_react.default.createElement("div", {
112
+ className: styles.quizAnalysisSummary
113
+ }, _this.renderMetrics(), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
114
114
  direction: "row",
115
115
  justifyItems: "space-between"
116
116
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -118,18 +118,65 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
118
118
  }, /*#__PURE__*/_react.default.createElement(_index3.AnalysisUpdateDate, {
119
119
  date: quizAnalysis.created_timestamp,
120
120
  multiline: true
121
- })), /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
121
+ })), quizAnalysis && itemAnalyses && /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
122
122
  href: href
123
123
  }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
124
124
  size: "small"
125
125
  }, (0, _formatMessage.default)('View Report')))));
126
- }
127
- }, {
126
+ };
127
+
128
+ _this.renderSpinner = function (mainText) {
129
+ return /*#__PURE__*/_react.default.createElement(_Spinner.default, {
130
+ size: "x-small",
131
+ color: "brand",
132
+ minHeight: "0",
133
+ mainText: mainText,
134
+ fontSize: "x-small"
135
+ });
136
+ };
137
+
138
+ _this.renderReportCardFooter = function () {
139
+ var _this$props2 = _this.props,
140
+ generationInProgress = _this$props2.generationInProgress,
141
+ analysisError = _this$props2.analysisError;
142
+ return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
143
+ direction: "row",
144
+ justifyItems: "space-between"
145
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
146
+ shouldShrink: true
147
+ }, analysisError && !generationInProgress && /*#__PURE__*/_react.default.createElement(_uiText.Text, {
148
+ size: "x-small",
149
+ lineHeight: "fit",
150
+ weight: "bold",
151
+ color: "danger"
152
+ }, analysisError)), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, generationInProgress ? _this.renderSpinner((0, _formatMessage.default)('Generation In Progress')) : /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
153
+ onClick: _this.handleGeneration,
154
+ role: "button"
155
+ }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
156
+ size: "small"
157
+ }, (0, _formatMessage.default)('Generate Report')))));
158
+ };
159
+
160
+ return _this;
161
+ }
162
+
163
+ (0, _createClass2.default)(NewQuizAndItemAnalysisReportCardPresenter, [{
128
164
  key: "render",
129
165
  value: function render() {
166
+ var _this$props3 = this.props,
167
+ fetchInProgress = _this$props3.fetchInProgress,
168
+ name = _this$props3.name,
169
+ quizAnalysis = _this$props3.quizAnalysis;
130
170
  return /*#__PURE__*/_react.default.createElement(_index.default, {
131
- className: styles.card
132
- }, this.props.quizAnalysis ? this.renderContent() : _ref);
171
+ className: styles.reportCard
172
+ }, /*#__PURE__*/_react.default.createElement("div", {
173
+ className: styles.titleContainer
174
+ }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
175
+ size: "medium",
176
+ weight: "bold"
177
+ }, name)), !fetchInProgress && quizAnalysis && this.renderQuizAnalysisSummary(), fetchInProgress && /*#__PURE__*/_react.default.createElement("div", {
178
+ className: styles.spinnerContainer
179
+ }, this.renderSpinner()), !fetchInProgress && this.renderReportCardFooter());
133
180
  }
134
181
  }]);
135
182
  NewQuizAndItemAnalysisReportCardPresenter.displayName = "NewQuizAndItemAnalysisReportCardPresenter";
@@ -137,10 +184,18 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
137
184
  }(_react.Component), _class2.propTypes = {
138
185
  name: _propTypes.default.node,
139
186
  href: _propTypes.default.string,
140
- quizAnalysis: _propTypes2.quizAnalysisPropType
187
+ quizAnalysis: _propTypes2.quizAnalysisPropType,
188
+ itemAnalyses: _propTypes.default.arrayOf(_propTypes2.itemAnalysisPropType),
189
+ fetchInProgress: _propTypes.default.bool.isRequired,
190
+ generationInProgress: _propTypes.default.bool.isRequired,
191
+ analysisError: _propTypes.default.string,
192
+ generateReports: _propTypes.default.func.isRequired
141
193
  }, _class2.defaultProps = {
142
194
  name: void 0,
143
195
  href: void 0,
144
- quizAnalysis: void 0
196
+ analysisError: void 0,
197
+ generationInProgress: void 0,
198
+ quizAnalysis: void 0,
199
+ itemAnalyses: void 0
145
200
  }, _temp)) || _class);
146
201
  exports.NewQuizAndItemAnalysisReportCardPresenter = NewQuizAndItemAnalysisReportCardPresenter;