@instructure/quiz-core 18.7.0 → 18.7.1-rc.0

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.
@@ -1,6 +1,7 @@
1
1
  import _regeneratorRuntime from "@babel/runtime/regenerator";
2
2
  import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
3
  import Fetcher from "../../common/util/Fetcher.js";
4
+ import { csvFormat } from "../components/resources/NewQuizAndItemAnalysis/exportFormats.js";
4
5
 
5
6
  var getFetcher = function getFetcher(format) {
6
7
  var mimeType = formatsToMimeTypes.get(format);
@@ -13,14 +14,13 @@ var getFetcher = function getFetcher(format) {
13
14
  headers: {
14
15
  'Accept': mimeType
15
16
  },
16
- injectUserToken: true,
17
+ injectMissingUserToken: true,
17
18
  asyncResponseHandler: function asyncResponseHandler(response) {
18
19
  return response;
19
20
  }
20
21
  });
21
22
  };
22
23
 
23
- export var csvFormat = 'csv';
24
24
  var formatsToMimeTypes = new Map().set(csvFormat, 'text/csv');
25
25
  export var getAnalysesExport = /*#__PURE__*/function () {
26
26
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(quizId, format) {
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import t from '@instructure/quiz-i18n/es/format-message';
4
+ import { quizAnalysisPropType } from "../propTypes.js";
5
+ import { Text } from '@instructure/ui-text';
6
+ import { Button } from '@instructure/ui-buttons';
7
+ export var ExportButton = function ExportButton(_ref) {
8
+ var quizAnalysis = _ref.quizAnalysis,
9
+ generationInProgress = _ref.generationInProgress,
10
+ handleExport = _ref.handleExport;
11
+
12
+ var renderExportButton = function renderExportButton(enabled) {
13
+ var interaction = enabled ? 'enabled' : 'disabled';
14
+ var color = enabled ? 'secondary' : 'primary-inverse';
15
+ return /*#__PURE__*/React.createElement(Button, {
16
+ color: color,
17
+ interaction: interaction,
18
+ onClick: handleExport,
19
+ theme: {
20
+ lineHeight: '24px'
21
+ }
22
+ }, /*#__PURE__*/React.createElement(Text, {
23
+ size: "medium"
24
+ }, t('Export CSV')));
25
+ };
26
+
27
+ if (generationInProgress || !quizAnalysis) {
28
+ return renderExportButton(false);
29
+ }
30
+
31
+ if (quizAnalysis) {
32
+ return renderExportButton(true);
33
+ }
34
+ };
35
+ ExportButton.propTypes = {
36
+ quizAnalysis: quizAnalysisPropType.isRequired,
37
+ generationInProgress: PropTypes.bool.isRequired,
38
+ handleExport: PropTypes.func.isRequired
39
+ };
40
+ export default ExportButton;
@@ -34,6 +34,8 @@ import AnalysisMetric from "../AnalysisMetric/index.js";
34
34
  import Spinner from "../../../../../common/components/shared/spinner/Spinner.js";
35
35
  import { AnalysisUpdateDate } from "../AnalysisUpdateDate/index.js";
36
36
  import { itemAnalysisPropType, quizAnalysisPropType } from "../propTypes.js";
37
+ import { csvFormat } from "../exportFormats.js";
38
+ import { ExportButton } from "../ExportButton/index.js";
37
39
  export var NewQuizAndItemAnalysisReportCardPresenter = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
38
40
  _inherits(NewQuizAndItemAnalysisReportCardPresenter, _Component);
39
41
 
@@ -56,6 +58,13 @@ export var NewQuizAndItemAnalysisReportCardPresenter = (_dec = themeable(theme,
56
58
  _this.props.generateReports(filter);
57
59
  };
58
60
 
61
+ _this.handleExport = function (_event) {
62
+ var format = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : csvFormat;
63
+ var filter = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'last_attempt';
64
+
65
+ _this.props.exportReports(format, filter);
66
+ };
67
+
59
68
  _this.renderMetrics = function () {
60
69
  var _quizAnalysis$scores, _quizAnalysis$scores2, _quizAnalysis$scores3;
61
70
 
@@ -151,26 +160,48 @@ export var NewQuizAndItemAnalysisReportCardPresenter = (_dec = themeable(theme,
151
160
  }, generationInProgress ? _this.renderSpinner(t('Generation In Progress')) : _this.renderGenerateReportButton())));
152
161
  };
153
162
 
163
+ _this.renderExport = function () {
164
+ var _this$props3 = _this.props,
165
+ quizAnalysis = _this$props3.quizAnalysis,
166
+ generationInProgress = _this$props3.generationInProgress;
167
+ return /*#__PURE__*/React.createElement(ExportButton, {
168
+ quizAnalysis: quizAnalysis,
169
+ generationInProgress: generationInProgress,
170
+ handleExport: _this.handleExport
171
+ });
172
+ };
173
+
174
+ _this.renderReportCardHeader = function () {
175
+ var _this$props4 = _this.props,
176
+ name = _this$props4.name,
177
+ exportEnabled = _this$props4.exportEnabled,
178
+ fetchInProgress = _this$props4.fetchInProgress;
179
+ return /*#__PURE__*/React.createElement("div", {
180
+ className: styles.titleContainer
181
+ }, /*#__PURE__*/React.createElement(Flex, {
182
+ direction: "row",
183
+ wrap: "wrap",
184
+ justifyItems: "space-between"
185
+ }, /*#__PURE__*/React.createElement(Flex.Item, null, /*#__PURE__*/React.createElement(Text, {
186
+ size: "medium",
187
+ weight: "bold"
188
+ }, name)), exportEnabled && !fetchInProgress && /*#__PURE__*/React.createElement(Flex.Item, null, _this.renderExport())));
189
+ };
190
+
154
191
  return _this;
155
192
  }
156
193
 
157
194
  _createClass(NewQuizAndItemAnalysisReportCardPresenter, [{
158
195
  key: "render",
159
196
  value: function render() {
160
- var _this$props3 = this.props,
161
- fetchInProgress = _this$props3.fetchInProgress,
162
- name = _this$props3.name,
163
- quizAnalysis = _this$props3.quizAnalysis,
164
- analysisError = _this$props3.analysisError;
197
+ var _this$props5 = this.props,
198
+ fetchInProgress = _this$props5.fetchInProgress,
199
+ quizAnalysis = _this$props5.quizAnalysis,
200
+ analysisError = _this$props5.analysisError;
165
201
  var reportCardStyles = classnames(styles.reportCard, _defineProperty({}, styles.emptyReportCard, !quizAnalysis && !analysisError));
166
202
  return /*#__PURE__*/React.createElement(Card, {
167
203
  className: reportCardStyles
168
- }, /*#__PURE__*/React.createElement("div", {
169
- className: styles.titleContainer
170
- }, /*#__PURE__*/React.createElement(Text, {
171
- size: "medium",
172
- weight: "bold"
173
- }, name)), !fetchInProgress && quizAnalysis && this.renderQuizAnalysisSummary(), fetchInProgress && this.renderSpinner(), !fetchInProgress && this.renderReportCardFooter());
204
+ }, this.renderReportCardHeader(), !fetchInProgress && quizAnalysis && this.renderQuizAnalysisSummary(), fetchInProgress && this.renderSpinner(), !fetchInProgress && this.renderReportCardFooter());
174
205
  }
175
206
  }]);
176
207
 
@@ -184,7 +215,9 @@ export var NewQuizAndItemAnalysisReportCardPresenter = (_dec = themeable(theme,
184
215
  fetchInProgress: PropTypes.bool.isRequired,
185
216
  generationInProgress: PropTypes.bool.isRequired,
186
217
  analysisError: PropTypes.string,
187
- generateReports: PropTypes.func.isRequired
218
+ generateReports: PropTypes.func.isRequired,
219
+ exportReports: PropTypes.func.isRequired,
220
+ exportEnabled: PropTypes.bool.isRequired
188
221
  }, _class2.defaultProps = {
189
222
  name: void 0,
190
223
  href: void 0,
@@ -0,0 +1 @@
1
+ export var csvFormat = 'csv';
@@ -19,6 +19,8 @@ import { getFailedToFetchReports } from "./errorMessages.js";
19
19
  import { Img } from '@instructure/ui-img';
20
20
  import errorImage from './downForRepair.svg';
21
21
  import { PresentationContent, ScreenReaderContent } from '@instructure/ui-a11y-content';
22
+ import { csvFormat } from "./exportFormats.js";
23
+ import { ExportButton } from "./ExportButton/index.js";
22
24
 
23
25
  var _ref = /*#__PURE__*/React.createElement(Flex.Item, {
24
26
  align: "center"
@@ -130,6 +132,7 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
130
132
  };
131
133
 
132
134
  _this.renderRightSide = function () {
135
+ var exportEnabled = _this.props.exportEnabled;
133
136
  return /*#__PURE__*/React.createElement(Flex, {
134
137
  alignItems: "center",
135
138
  justifyItems: "space-between",
@@ -139,11 +142,24 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
139
142
  }, /*#__PURE__*/React.createElement(Flex.Item, {
140
143
  padding: "0 small 0 0",
141
144
  margin: "0 0 0 auto"
142
- }, _this.renderUpdateDateWithError()), /*#__PURE__*/React.createElement(Flex.Item, {
145
+ }, _this.renderUpdateDateWithError()), exportEnabled && /*#__PURE__*/React.createElement(Flex.Item, {
146
+ margin: "0 small 0 auto"
147
+ }, _this.renderExport()), /*#__PURE__*/React.createElement(Flex.Item, {
143
148
  margin: "0 0 0 auto"
144
149
  }, _this.renderGenerationButton()));
145
150
  };
146
151
 
152
+ _this.renderExport = function () {
153
+ var _this$props2 = _this.props,
154
+ quizAnalysis = _this$props2.quizAnalysis,
155
+ generationInProgress = _this$props2.generationInProgress;
156
+ return /*#__PURE__*/React.createElement(ExportButton, {
157
+ quizAnalysis: quizAnalysis,
158
+ generationInProgress: generationInProgress,
159
+ handleExport: _this.handleExport
160
+ });
161
+ };
162
+
147
163
  _this.renderTop = function () {
148
164
  return /*#__PURE__*/React.createElement(Flex, {
149
165
  justifyItems: "space-between",
@@ -156,12 +172,17 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
156
172
  };
157
173
 
158
174
  _this.renderTopOnFailedFetch = function () {
175
+ var exportEnabled = _this.props.exportEnabled;
159
176
  return /*#__PURE__*/React.createElement(Flex, {
160
- alignItems: "end",
161
- width: "82.5rem",
177
+ justifyItems: "end",
178
+ wrap: "wrap",
179
+ width: "auto",
162
180
  margin: "auto",
163
- direction: "column"
164
- }, /*#__PURE__*/React.createElement(Flex.Item, {
181
+ direction: "row"
182
+ }, exportEnabled && /*#__PURE__*/React.createElement(Flex.Item, {
183
+ margin: "small",
184
+ overflowY: "visible"
185
+ }, _this.renderExport()), /*#__PURE__*/React.createElement(Flex.Item, {
165
186
  overflowY: "visible"
166
187
  }, _this.renderGenerationButton()));
167
188
  };
@@ -200,9 +221,9 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
200
221
  };
201
222
 
202
223
  _this.renderBody = function () {
203
- var _this$props2 = _this.props,
204
- fetchInProgress = _this$props2.fetchInProgress,
205
- quizAnalysis = _this$props2.quizAnalysis; // TODO need to refactor the NewQuizAnalysis to move out spinner logic
224
+ var _this$props3 = _this.props,
225
+ fetchInProgress = _this$props3.fetchInProgress,
226
+ quizAnalysis = _this$props3.quizAnalysis; // TODO need to refactor the NewQuizAnalysis to move out spinner logic
206
227
 
207
228
  return /*#__PURE__*/React.createElement(React.Fragment, null, (fetchInProgress || quizAnalysis) && /*#__PURE__*/React.createElement(NewQuizAnalysis, {
208
229
  quizAnalysis: quizAnalysis,
@@ -216,15 +237,22 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
216
237
  _this.props.generateReports(filter);
217
238
  };
218
239
 
240
+ _this.handleExport = function (_event) {
241
+ var format = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : csvFormat;
242
+ var filter = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'last_attempt';
243
+
244
+ _this.props.exportReports(format, filter);
245
+ };
246
+
219
247
  return _this;
220
248
  }
221
249
 
222
250
  _createClass(NewQuizAndItemAnalysisPresenter, [{
223
251
  key: "render",
224
252
  value: function render() {
225
- var _this$props3 = this.props,
226
- analysisFetchError = _this$props3.analysisFetchError,
227
- fetchInProgress = _this$props3.fetchInProgress;
253
+ var _this$props4 = this.props,
254
+ analysisFetchError = _this$props4.analysisFetchError,
255
+ fetchInProgress = _this$props4.fetchInProgress;
228
256
  return /*#__PURE__*/React.createElement("div", {
229
257
  className: "fs-mask"
230
258
  }, !fetchInProgress && (analysisFetchError ? this.renderTopOnFailedFetch() : this.renderTop()), analysisFetchError ? this.renderErrorBody() : this.renderBody());
@@ -241,7 +269,9 @@ NewQuizAndItemAnalysisPresenter.propTypes = {
241
269
  generationInProgress: PropTypes.bool.isRequired,
242
270
  analysisFetchError: PropTypes.bool.isRequired,
243
271
  analysisError: PropTypes.string,
244
- generateReports: PropTypes.func.isRequired
272
+ generateReports: PropTypes.func.isRequired,
273
+ exportReports: PropTypes.func.isRequired,
274
+ exportEnabled: PropTypes.bool.isRequired
245
275
  };
246
276
  NewQuizAndItemAnalysisPresenter.defaultProps = {
247
277
  analysisError: void 0,
@@ -9,6 +9,7 @@ import { connect } from "../../../../common/react-redux.js";
9
9
  import { compose } from 'redux';
10
10
  import { getActiveQuizId } from "../../../../common/selectors/quizzes.js";
11
11
  import { addError } from "../../../../common/actions/alerts.js";
12
+ import { featureOn } from "../../../../common/util/featureCheck.js";
12
13
  var DEFAULT_POLLING_INTERVAL = 3000;
13
14
  export function mapStateToProps(state, ownProps) {
14
15
  return {
@@ -23,7 +24,8 @@ export function mapStateToProps(state, ownProps) {
23
24
  fetchItemAnalyses: fetchItemAnalyses,
24
25
  fetchAnalysesStatus: fetchAnalysesStatus,
25
26
  getAnalysesExport: getAnalysesExport,
26
- pollingInterval: ownProps.pollingInterval || DEFAULT_POLLING_INTERVAL
27
+ pollingInterval: ownProps.pollingInterval || DEFAULT_POLLING_INTERVAL,
28
+ exportEnabled: featureOn('item_analysis_csv')
27
29
  };
28
30
  }
29
31
  var mapDispatchToProps = {
@@ -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.getAnalysesExport = exports.csvFormat = void 0;
8
+ exports.getAnalysesExport = void 0;
9
9
 
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
 
@@ -13,6 +13,8 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
13
13
 
14
14
  var _Fetcher = _interopRequireDefault(require("../../common/util/Fetcher.js"));
15
15
 
16
+ var _exportFormats = require("../components/resources/NewQuizAndItemAnalysis/exportFormats.js");
17
+
16
18
  var getFetcher = function getFetcher(format) {
17
19
  var mimeType = formatsToMimeTypes.get(format);
18
20
 
@@ -24,16 +26,14 @@ var getFetcher = function getFetcher(format) {
24
26
  headers: {
25
27
  'Accept': mimeType
26
28
  },
27
- injectUserToken: true,
29
+ injectMissingUserToken: true,
28
30
  asyncResponseHandler: function asyncResponseHandler(response) {
29
31
  return response;
30
32
  }
31
33
  });
32
34
  };
33
35
 
34
- var csvFormat = 'csv';
35
- exports.csvFormat = csvFormat;
36
- var formatsToMimeTypes = new Map().set(csvFormat, 'text/csv');
36
+ var formatsToMimeTypes = new Map().set(_exportFormats.csvFormat, 'text/csv');
37
37
 
38
38
  var getAnalysesExport = /*#__PURE__*/function () {
39
39
  var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(quizId, format) {
@@ -0,0 +1,58 @@
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.ExportButton = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
15
+
16
+ var _propTypes2 = require("../propTypes.js");
17
+
18
+ var _uiText = require("@instructure/ui-text");
19
+
20
+ var _uiButtons = require("@instructure/ui-buttons");
21
+
22
+ var ExportButton = function ExportButton(_ref) {
23
+ var quizAnalysis = _ref.quizAnalysis,
24
+ generationInProgress = _ref.generationInProgress,
25
+ handleExport = _ref.handleExport;
26
+
27
+ var renderExportButton = function renderExportButton(enabled) {
28
+ var interaction = enabled ? 'enabled' : 'disabled';
29
+ var color = enabled ? 'secondary' : 'primary-inverse';
30
+ return /*#__PURE__*/_react.default.createElement(_uiButtons.Button, {
31
+ color: color,
32
+ interaction: interaction,
33
+ onClick: handleExport,
34
+ theme: {
35
+ lineHeight: '24px'
36
+ }
37
+ }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
38
+ size: "medium"
39
+ }, (0, _formatMessage.default)('Export CSV')));
40
+ };
41
+
42
+ if (generationInProgress || !quizAnalysis) {
43
+ return renderExportButton(false);
44
+ }
45
+
46
+ if (quizAnalysis) {
47
+ return renderExportButton(true);
48
+ }
49
+ };
50
+
51
+ exports.ExportButton = ExportButton;
52
+ ExportButton.propTypes = {
53
+ quizAnalysis: _propTypes2.quizAnalysisPropType.isRequired,
54
+ generationInProgress: _propTypes.default.bool.isRequired,
55
+ handleExport: _propTypes.default.func.isRequired
56
+ };
57
+ var _default = ExportButton;
58
+ exports.default = _default;
@@ -49,6 +49,10 @@ var _index3 = require("../AnalysisUpdateDate/index.js");
49
49
 
50
50
  var _propTypes2 = require("../propTypes.js");
51
51
 
52
+ var _exportFormats = require("../exportFormats.js");
53
+
54
+ var _index4 = require("../ExportButton/index.js");
55
+
52
56
  var _dec, _class, _class2, _temp;
53
57
 
54
58
  var styles = {
@@ -86,6 +90,13 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
86
90
  _this.props.generateReports(filter);
87
91
  };
88
92
 
93
+ _this.handleExport = function (_event) {
94
+ var format = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : _exportFormats.csvFormat;
95
+ var filter = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'last_attempt';
96
+
97
+ _this.props.exportReports(format, filter);
98
+ };
99
+
89
100
  _this.renderMetrics = function () {
90
101
  var _quizAnalysis$scores, _quizAnalysis$scores2, _quizAnalysis$scores3;
91
102
 
@@ -181,26 +192,48 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
181
192
  }, generationInProgress ? _this.renderSpinner((0, _formatMessage.default)('Generation In Progress')) : _this.renderGenerateReportButton())));
182
193
  };
183
194
 
195
+ _this.renderExport = function () {
196
+ var _this$props3 = _this.props,
197
+ quizAnalysis = _this$props3.quizAnalysis,
198
+ generationInProgress = _this$props3.generationInProgress;
199
+ return /*#__PURE__*/_react.default.createElement(_index4.ExportButton, {
200
+ quizAnalysis: quizAnalysis,
201
+ generationInProgress: generationInProgress,
202
+ handleExport: _this.handleExport
203
+ });
204
+ };
205
+
206
+ _this.renderReportCardHeader = function () {
207
+ var _this$props4 = _this.props,
208
+ name = _this$props4.name,
209
+ exportEnabled = _this$props4.exportEnabled,
210
+ fetchInProgress = _this$props4.fetchInProgress;
211
+ return /*#__PURE__*/_react.default.createElement("div", {
212
+ className: styles.titleContainer
213
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
214
+ direction: "row",
215
+ wrap: "wrap",
216
+ justifyItems: "space-between"
217
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
218
+ size: "medium",
219
+ weight: "bold"
220
+ }, name)), exportEnabled && !fetchInProgress && /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, _this.renderExport())));
221
+ };
222
+
184
223
  return _this;
185
224
  }
186
225
 
187
226
  (0, _createClass2.default)(NewQuizAndItemAnalysisReportCardPresenter, [{
188
227
  key: "render",
189
228
  value: function render() {
190
- var _this$props3 = this.props,
191
- fetchInProgress = _this$props3.fetchInProgress,
192
- name = _this$props3.name,
193
- quizAnalysis = _this$props3.quizAnalysis,
194
- analysisError = _this$props3.analysisError;
229
+ var _this$props5 = this.props,
230
+ fetchInProgress = _this$props5.fetchInProgress,
231
+ quizAnalysis = _this$props5.quizAnalysis,
232
+ analysisError = _this$props5.analysisError;
195
233
  var reportCardStyles = (0, _classnames2.default)(styles.reportCard, (0, _defineProperty2.default)({}, styles.emptyReportCard, !quizAnalysis && !analysisError));
196
234
  return /*#__PURE__*/_react.default.createElement(_index.default, {
197
235
  className: reportCardStyles
198
- }, /*#__PURE__*/_react.default.createElement("div", {
199
- className: styles.titleContainer
200
- }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
201
- size: "medium",
202
- weight: "bold"
203
- }, name)), !fetchInProgress && quizAnalysis && this.renderQuizAnalysisSummary(), fetchInProgress && this.renderSpinner(), !fetchInProgress && this.renderReportCardFooter());
236
+ }, this.renderReportCardHeader(), !fetchInProgress && quizAnalysis && this.renderQuizAnalysisSummary(), fetchInProgress && this.renderSpinner(), !fetchInProgress && this.renderReportCardFooter());
204
237
  }
205
238
  }]);
206
239
  NewQuizAndItemAnalysisReportCardPresenter.displayName = "NewQuizAndItemAnalysisReportCardPresenter";
@@ -213,7 +246,9 @@ var NewQuizAndItemAnalysisReportCardPresenter = (_dec = (0, _uiThemeable.themeab
213
246
  fetchInProgress: _propTypes.default.bool.isRequired,
214
247
  generationInProgress: _propTypes.default.bool.isRequired,
215
248
  analysisError: _propTypes.default.string,
216
- generateReports: _propTypes.default.func.isRequired
249
+ generateReports: _propTypes.default.func.isRequired,
250
+ exportReports: _propTypes.default.func.isRequired,
251
+ exportEnabled: _propTypes.default.bool.isRequired
217
252
  }, _class2.defaultProps = {
218
253
  name: void 0,
219
254
  href: void 0,
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.csvFormat = void 0;
7
+ var csvFormat = 'csv';
8
+ exports.csvFormat = csvFormat;
@@ -51,6 +51,10 @@ var _downForRepair = _interopRequireDefault(require("./downForRepair.svg"));
51
51
 
52
52
  var _uiA11yContent = require("@instructure/ui-a11y-content");
53
53
 
54
+ var _exportFormats = require("./exportFormats.js");
55
+
56
+ var _index4 = require("./ExportButton/index.js");
57
+
54
58
  var _ref = /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
55
59
  align: "center"
56
60
  }, /*#__PURE__*/_react.default.createElement(_uiA11yContent.PresentationContent, null, /*#__PURE__*/_react.default.createElement(_uiImg.Img, {
@@ -161,6 +165,7 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
161
165
  };
162
166
 
163
167
  _this.renderRightSide = function () {
168
+ var exportEnabled = _this.props.exportEnabled;
164
169
  return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
165
170
  alignItems: "center",
166
171
  justifyItems: "space-between",
@@ -170,11 +175,24 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
170
175
  }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
171
176
  padding: "0 small 0 0",
172
177
  margin: "0 0 0 auto"
173
- }, _this.renderUpdateDateWithError()), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
178
+ }, _this.renderUpdateDateWithError()), exportEnabled && /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
179
+ margin: "0 small 0 auto"
180
+ }, _this.renderExport()), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
174
181
  margin: "0 0 0 auto"
175
182
  }, _this.renderGenerationButton()));
176
183
  };
177
184
 
185
+ _this.renderExport = function () {
186
+ var _this$props2 = _this.props,
187
+ quizAnalysis = _this$props2.quizAnalysis,
188
+ generationInProgress = _this$props2.generationInProgress;
189
+ return /*#__PURE__*/_react.default.createElement(_index4.ExportButton, {
190
+ quizAnalysis: quizAnalysis,
191
+ generationInProgress: generationInProgress,
192
+ handleExport: _this.handleExport
193
+ });
194
+ };
195
+
178
196
  _this.renderTop = function () {
179
197
  return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
180
198
  justifyItems: "space-between",
@@ -187,12 +205,17 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
187
205
  };
188
206
 
189
207
  _this.renderTopOnFailedFetch = function () {
208
+ var exportEnabled = _this.props.exportEnabled;
190
209
  return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
191
- alignItems: "end",
192
- width: "82.5rem",
210
+ justifyItems: "end",
211
+ wrap: "wrap",
212
+ width: "auto",
193
213
  margin: "auto",
194
- direction: "column"
195
- }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
214
+ direction: "row"
215
+ }, exportEnabled && /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
216
+ margin: "small",
217
+ overflowY: "visible"
218
+ }, _this.renderExport()), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
196
219
  overflowY: "visible"
197
220
  }, _this.renderGenerationButton()));
198
221
  };
@@ -231,9 +254,9 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
231
254
  };
232
255
 
233
256
  _this.renderBody = function () {
234
- var _this$props2 = _this.props,
235
- fetchInProgress = _this$props2.fetchInProgress,
236
- quizAnalysis = _this$props2.quizAnalysis; // TODO need to refactor the NewQuizAnalysis to move out spinner logic
257
+ var _this$props3 = _this.props,
258
+ fetchInProgress = _this$props3.fetchInProgress,
259
+ quizAnalysis = _this$props3.quizAnalysis; // TODO need to refactor the NewQuizAnalysis to move out spinner logic
237
260
 
238
261
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (fetchInProgress || quizAnalysis) && /*#__PURE__*/_react.default.createElement(_index2.default, {
239
262
  quizAnalysis: quizAnalysis,
@@ -247,15 +270,22 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
247
270
  _this.props.generateReports(filter);
248
271
  };
249
272
 
273
+ _this.handleExport = function (_event) {
274
+ var format = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : _exportFormats.csvFormat;
275
+ var filter = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'last_attempt';
276
+
277
+ _this.props.exportReports(format, filter);
278
+ };
279
+
250
280
  return _this;
251
281
  }
252
282
 
253
283
  (0, _createClass2.default)(NewQuizAndItemAnalysisPresenter, [{
254
284
  key: "render",
255
285
  value: function render() {
256
- var _this$props3 = this.props,
257
- analysisFetchError = _this$props3.analysisFetchError,
258
- fetchInProgress = _this$props3.fetchInProgress;
286
+ var _this$props4 = this.props,
287
+ analysisFetchError = _this$props4.analysisFetchError,
288
+ fetchInProgress = _this$props4.fetchInProgress;
259
289
  return /*#__PURE__*/_react.default.createElement("div", {
260
290
  className: "fs-mask"
261
291
  }, !fetchInProgress && (analysisFetchError ? this.renderTopOnFailedFetch() : this.renderTop()), analysisFetchError ? this.renderErrorBody() : this.renderBody());
@@ -273,7 +303,9 @@ NewQuizAndItemAnalysisPresenter.propTypes = {
273
303
  generationInProgress: _propTypes2.default.bool.isRequired,
274
304
  analysisFetchError: _propTypes2.default.bool.isRequired,
275
305
  analysisError: _propTypes2.default.string,
276
- generateReports: _propTypes2.default.func.isRequired
306
+ generateReports: _propTypes2.default.func.isRequired,
307
+ exportReports: _propTypes2.default.func.isRequired,
308
+ exportEnabled: _propTypes2.default.bool.isRequired
277
309
  };
278
310
  NewQuizAndItemAnalysisPresenter.defaultProps = {
279
311
  analysisError: void 0,
@@ -28,6 +28,8 @@ var _quizzes = require("../../../../common/selectors/quizzes.js");
28
28
 
29
29
  var _alerts = require("../../../../common/actions/alerts.js");
30
30
 
31
+ var _featureCheck = require("../../../../common/util/featureCheck.js");
32
+
31
33
  var DEFAULT_POLLING_INTERVAL = 3000;
32
34
 
33
35
  function mapStateToProps(state, ownProps) {
@@ -43,7 +45,8 @@ function mapStateToProps(state, ownProps) {
43
45
  fetchItemAnalyses: _getItemAnalyses.getItemAnalyses,
44
46
  fetchAnalysesStatus: _getAnalysesStatus.getAnalysesStatus,
45
47
  getAnalysesExport: _getAnalysesExport.getAnalysesExport,
46
- pollingInterval: ownProps.pollingInterval || DEFAULT_POLLING_INTERVAL
48
+ pollingInterval: ownProps.pollingInterval || DEFAULT_POLLING_INTERVAL,
49
+ exportEnabled: (0, _featureCheck.featureOn)('item_analysis_csv')
47
50
  };
48
51
  }
49
52
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "18.7.0",
3
+ "version": "18.7.1-rc.0+1d4875e9a",
4
4
  "license": "MIT",
5
5
  "description": "The Quiz React SDK by Instructure Inc.",
6
6
  "author": "Instructure, Inc. Engineering and Product Design",
@@ -43,11 +43,11 @@
43
43
  "dependencies": {
44
44
  "@instructure/grading-utils": "^1.0.0",
45
45
  "@instructure/outcomes-ui": "^2.1.9",
46
- "@instructure/quiz-common": "^18.7.0",
47
- "@instructure/quiz-i18n": "^18.7.0",
48
- "@instructure/quiz-interactions": "^18.7.0",
49
- "@instructure/quiz-number-input": "^18.7.0",
50
- "@instructure/quiz-rce": "^18.7.0",
46
+ "@instructure/quiz-common": "18.7.1-rc.0+1d4875e9a",
47
+ "@instructure/quiz-i18n": "18.7.1-rc.0+1d4875e9a",
48
+ "@instructure/quiz-interactions": "18.7.1-rc.0+1d4875e9a",
49
+ "@instructure/quiz-number-input": "18.7.1-rc.0+1d4875e9a",
50
+ "@instructure/quiz-rce": "18.7.1-rc.0+1d4875e9a",
51
51
  "@instructure/ui-a11y-content": "^7.22.1",
52
52
  "@instructure/ui-alerts": "^7.22.1",
53
53
  "@instructure/ui-avatar": "^7.22.1",
@@ -109,7 +109,7 @@
109
109
  "file-saver": "~2.0.5",
110
110
  "humps": "^2.0.0",
111
111
  "immutable": "^3.8.1",
112
- "instructure-validations": "^18.7.0",
112
+ "instructure-validations": "18.7.1-rc.0+1d4875e9a",
113
113
  "ipaddr.js": "^1.5.4",
114
114
  "isomorphic-fetch": "^2.2.0",
115
115
  "isuuid": "^0.1.0",
@@ -141,7 +141,7 @@
141
141
  "uuid": "^3.2.1"
142
142
  },
143
143
  "devDependencies": {
144
- "@instructure/quiz-scripts": "^18.7.0",
144
+ "@instructure/quiz-scripts": "18.7.0",
145
145
  "@instructure/ui-axe-check": "^7.22.1",
146
146
  "@instructure/ui-babel-preset": "^7.22.1",
147
147
  "@instructure/ui-karma-config": "^7.22.1",
@@ -160,7 +160,7 @@
160
160
  "intl": "^1.2.4",
161
161
  "jquery": "^2.2.3",
162
162
  "most-subject": "^5.3.0",
163
- "quiz-presets": "^18.7.0",
163
+ "quiz-presets": "18.7.1-rc.0+1d4875e9a",
164
164
  "react": "^16.8.6",
165
165
  "react-addons-test-utils": "^15.6.2",
166
166
  "react-dom": "^16.8.6",
@@ -176,5 +176,5 @@
176
176
  "publishConfig": {
177
177
  "access": "public"
178
178
  },
179
- "gitHead": "2b56b4b27e10e47a912e3fb2763e587dbbbb1512"
179
+ "gitHead": "1d4875e9a6d81b08b142fbade051b72b2aa7ad46"
180
180
  }