@instructure/quiz-core 17.64.1-rc.5 → 17.64.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 (17) hide show
  1. package/es/common/reducers/analyses.js +1 -1
  2. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisMetric/presenter.js +2 -1
  3. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisPopoverMetric/presenter.js +3 -1
  4. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +2 -2
  5. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +38 -20
  6. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/theme.js +2 -0
  7. package/es/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +98 -35
  8. package/es/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +1 -1
  9. package/lib/common/reducers/analyses.js +1 -1
  10. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisMetric/presenter.js +2 -1
  11. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisPopoverMetric/presenter.js +3 -1
  12. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +2 -2
  13. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +40 -20
  14. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/theme.js +2 -0
  15. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +102 -34
  16. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/withAnalysisStatePresenter.js +1 -1
  17. package/package.json +9 -9
@@ -10,7 +10,7 @@ export var fetchInProgressKey = 'fetchInProgress';
10
10
  export var generationInProgressKey = 'generationInProgress';
11
11
  export var statusPollingInProgressKey = 'statusPollingInProgress';
12
12
  export var errorKey = 'analysisError';
13
- export var defaultState = fromJS((_fromJS = {}, _defineProperty(_fromJS, quizAnalysisKey, void 0), _defineProperty(_fromJS, itemAnalysesKey, void 0), _defineProperty(_fromJS, fetchInProgressKey, false), _defineProperty(_fromJS, generationInProgressKey, false), _defineProperty(_fromJS, statusPollingInProgressKey, false), _defineProperty(_fromJS, errorKey, void 0), _fromJS));
13
+ export var defaultState = fromJS((_fromJS = {}, _defineProperty(_fromJS, quizAnalysisKey, void 0), _defineProperty(_fromJS, itemAnalysesKey, void 0), _defineProperty(_fromJS, fetchInProgressKey, true), _defineProperty(_fromJS, generationInProgressKey, false), _defineProperty(_fromJS, statusPollingInProgressKey, false), _defineProperty(_fromJS, errorKey, void 0), _fromJS));
14
14
  export default (function () {
15
15
  var state = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : defaultState;
16
16
  var action = arguments.length > 1 ? arguments[1] : void 0;
@@ -57,8 +57,9 @@ export var AnalysisMetric = (_dec = themeable(theme, styles), _dec(_class = (_te
57
57
  }(Component), _class2.propTypes = {
58
58
  metricKey: PropTypes.string.isRequired,
59
59
  label: PropTypes.string.isRequired,
60
- value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.array]).isRequired,
60
+ value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.array]),
61
61
  suffix: PropTypes.string
62
62
  }, _class2.defaultProps = {
63
+ value: void 0,
63
64
  suffix: ''
64
65
  }, _temp)) || _class);
@@ -65,11 +65,13 @@ export var AnalysisPopoverMetric = (_dec = themeable(theme, styles), _dec(_class
65
65
  }(Component), _class2.propTypes = {
66
66
  metricKey: PropTypes.string.isRequired,
67
67
  label: PropTypes.string.isRequired,
68
- value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
68
+ value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
69
69
  popoverDescription: PropTypes.shape({
70
70
  title: PropTypes.string,
71
71
  subtitle: PropTypes.string,
72
72
  body: PropTypes.string,
73
73
  screenReaderLabel: PropTypes.string
74
74
  }).isRequired
75
+ }, _class2.defaultProps = {
76
+ value: void 0
75
77
  }, _temp)) || _class);
@@ -242,5 +242,5 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
242
242
  NewItemAnalysis.displayName = "NewItemAnalysis";
243
243
  return NewItemAnalysis;
244
244
  }(Component), _class2.propTypes = {
245
- itemAnalysis: itemAnalysisPropType.isRequired
246
- }, _temp)) || _class);
245
+ itemAnalysis: itemAnalysisPropType
246
+ }.isRequired, _temp)) || _class);
@@ -8,16 +8,17 @@ var _dec, _class, _class2, _temp;
8
8
  import { Heading } from '@instructure/ui-heading';
9
9
  import React, { Component } from 'react';
10
10
  var styles = {
11
- componentId: 'fQZVs',
11
+ componentId: 'ftlaC',
12
12
  template: function template(theme) {
13
- 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}");
13
+ return "\n\n.ftlaC_eDnN{display:flex;justify-content:space-between;padding-bottom:".concat(theme.headingPadding || 'inherit', "}\n\n.ftlaC_eKXQ{margin:").concat(theme.cardTopMargin || 'inherit', " auto ").concat(theme.cardBottomMargin || 'inherit', " auto;padding:").concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.ftlaC_dYbQ{align-items:center;display:flex;height:502px;justify-content:center;padding:").concat(theme.cardWrapperPadding || 'inherit', "}\n\n.ftlaC_crZr{padding-top:").concat(theme.metricGroupPaddingTop || 'inherit', "}\n\n.ftlaC_bTHH{position:absolute;right:").concat(theme.viewPaddingRight || 'inherit', ";top:").concat(theme.viewPaddingTop || 'inherit', "}\n\n.ftlaC_dPzc,.ftlaC_cpZE{column-gap:").concat(theme.metricsColumnGap || 'inherit', ";display:flex;flex-wrap:wrap;justify-content:flex-start;row-gap:1.5rem}");
14
14
  },
15
- 'heading': 'fQZVs_eDnN',
16
- 'cardWrapper': 'fQZVs_eKXQ',
17
- 'container': 'fQZVs_crZr',
18
- 'expandButtonContainer': 'fQZVs_bTHH',
19
- 'metricGroup': 'fQZVs_dPzc',
20
- 'metricsWrapper': 'fQZVs_cpZE'
15
+ 'heading': 'ftlaC_eDnN',
16
+ 'cardWrapper': 'ftlaC_eKXQ',
17
+ 'skeletonCardWrapper': 'ftlaC_dYbQ',
18
+ 'container': 'ftlaC_crZr',
19
+ 'expandButtonContainer': 'ftlaC_bTHH',
20
+ 'metricGroup': 'ftlaC_dPzc',
21
+ 'metricsWrapper': 'ftlaC_cpZE'
21
22
  };
22
23
  import t from '@instructure/quiz-i18n/es/format-message';
23
24
  import ExpandButton from "../../../../../common/components/shared/ExpandButton/index.js";
@@ -29,6 +30,8 @@ import AnalysisPopoverMetric from "../AnalysisPopoverMetric/index.js";
29
30
  import AnalysisMetric from "../AnalysisMetric/index.js";
30
31
  import { ScoreDistribution } from "../charts/ScoreDistribution/presenter.js";
31
32
  import { quizAnalysisPropType } from "../propTypes.js";
33
+ import PropTypes from 'prop-types';
34
+ import { Spinner } from '@instructure/ui-spinner';
32
35
  import { cronbachsAlpha, standardDeviation } from "./popoverContent.js";
33
36
  export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
34
37
  _inherits(NewQuizAnalysis, _Component);
@@ -74,17 +77,12 @@ export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
74
77
  })));
75
78
  };
76
79
 
77
- return _this;
78
- }
79
-
80
- _createClass(NewQuizAnalysis, [{
81
- key: "render",
82
- value: function render() {
83
- var quizAnalysis = this.props.quizAnalysis;
80
+ _this.renderContent = function () {
81
+ var quizAnalysis = _this.props.quizAnalysis;
84
82
  var scores = quizAnalysis.scores,
85
83
  attempts = quizAnalysis.attempts,
86
84
  metadata = quizAnalysis.metadata;
87
- var expanded = this.state.expanded;
85
+ var expanded = _this.state.expanded;
88
86
  return /*#__PURE__*/React.createElement(Card, {
89
87
  className: styles.cardWrapper
90
88
  }, /*#__PURE__*/React.createElement("div", {
@@ -126,19 +124,39 @@ export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
126
124
  })), /*#__PURE__*/React.createElement("div", {
127
125
  className: styles.expandButtonContainer
128
126
  }, /*#__PURE__*/React.createElement(ExpandButton, {
129
- onClick: this.handleToggle,
127
+ onClick: _this.handleToggle,
130
128
  title: expanded ? t('collapse quiz analysis') : t('expand quiz analysis'),
131
129
  isExpanded: expanded
132
- }))), expanded && this.renderExpanded(), /*#__PURE__*/React.createElement(ScoreDistribution, {
130
+ }))), expanded && _this.renderExpanded(), /*#__PURE__*/React.createElement(ScoreDistribution, {
133
131
  decileDistribution: scores === null || scores === void 0 ? void 0 : scores.decile_distribution
134
132
  }));
133
+ };
134
+
135
+ return _this;
136
+ }
137
+
138
+ _createClass(NewQuizAnalysis, [{
139
+ key: "render",
140
+ value: function render() {
141
+ var fetchInProgress = this.props.fetchInProgress;
142
+
143
+ if (fetchInProgress) {
144
+ return /*#__PURE__*/React.createElement(Card, {
145
+ className: styles.skeletonCardWrapper
146
+ }, /*#__PURE__*/React.createElement(Spinner, {
147
+ renderTitle: t('Loading quiz analysis data')
148
+ }));
149
+ } else {
150
+ return this.renderContent();
151
+ }
135
152
  }
136
153
  }]);
137
154
 
138
155
  NewQuizAnalysis.displayName = "NewQuizAnalysis";
139
156
  return NewQuizAnalysis;
140
157
  }(Component), _class2.propTypes = {
141
- quizAnalysis: quizAnalysisPropType.isRequired
142
- }, _class2.defaultProps = {
158
+ quizAnalysis: quizAnalysisPropType,
159
+ fetchInProgress: PropTypes.bool
160
+ }.isRequired, _class2.defaultProps = {
143
161
  quizAnalysis: {}
144
162
  }, _temp)) || _class);
@@ -2,6 +2,8 @@ export default function generator(_ref) {
2
2
  var spacing = _ref.spacing;
3
3
  return {
4
4
  metricGroupPaddingTop: spacing.medium,
5
+ cardTopMargin: spacing.small,
6
+ cardBottomMargin: spacing.medium,
5
7
  viewPaddingRight: spacing.large,
6
8
  viewPaddingTop: spacing.medium,
7
9
  headingPadding: spacing.medium,
@@ -6,64 +6,122 @@ import React, { Component } from 'react';
6
6
  import { Heading } from '@instructure/ui-heading';
7
7
  import NewItemAnalysis from "./NewItemAnalysis/index.js";
8
8
  import NewQuizAnalysis from "./NewQuizAnalysis/index.js";
9
- import Spinner from "../../../../common/components/shared/spinner/Spinner.js";
10
9
  import t from '@instructure/quiz-i18n/es/format-message';
11
10
  import { Flex } from '@instructure/ui-flex';
12
11
  import { AnalysisUpdateDate } from "./AnalysisUpdateDate/index.js";
13
12
  import { itemAnalysisPropType, quizAnalysisPropType } from "./propTypes.js";
14
13
  import PropTypes from 'prop-types';
15
-
16
- var _ref = /*#__PURE__*/React.createElement(Spinner, null);
17
-
14
+ import { QuizzesSpinner } from "../../../../common/components/shared/spinner/Spinner.js";
15
+ import { Spinner } from '@instructure/ui-spinner';
16
+ import { Button } from '@instructure/ui-buttons';
17
+ import { Text } from '@instructure/ui-text';
18
18
  export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
19
19
  _inherits(NewQuizAndItemAnalysisPresenter, _Component);
20
20
 
21
21
  var _super = _createSuper(NewQuizAndItemAnalysisPresenter);
22
22
 
23
23
  function NewQuizAndItemAnalysisPresenter() {
24
+ var _this;
25
+
24
26
  _classCallCheck(this, NewQuizAndItemAnalysisPresenter);
25
27
 
26
- return _super.apply(this, arguments);
28
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
29
+ args[_key] = arguments[_key];
30
+ }
31
+
32
+ _this = _super.call.apply(_super, [this].concat(args));
33
+
34
+ _this.renderItemAnalyses = function () {
35
+ var itemAnalyses = _this.props.itemAnalyses;
36
+ return /*#__PURE__*/React.createElement("div", null, itemAnalyses.map(function (itemAnalysis) {
37
+ return /*#__PURE__*/React.createElement(NewItemAnalysis, {
38
+ key: itemAnalysis.metadata.item_id,
39
+ itemAnalysis: itemAnalysis
40
+ });
41
+ }));
42
+ };
43
+
44
+ _this.renderSpinner = function () {
45
+ return /*#__PURE__*/React.createElement(Flex, {
46
+ padding: "medium",
47
+ justifyItems: "center",
48
+ alignItems: "center"
49
+ }, /*#__PURE__*/React.createElement(Spinner, {
50
+ renderTitle: t('Loading item analyses data')
51
+ }));
52
+ };
53
+
54
+ _this.renderOngoingGenerationButton = function () {
55
+ return /*#__PURE__*/React.createElement(Button, {
56
+ color: "primary-inverse",
57
+ interaction: "disabled",
58
+ margin: "0 0 x-small 0"
59
+ }, /*#__PURE__*/React.createElement(QuizzesSpinner, {
60
+ size: "x-small",
61
+ color: "brand",
62
+ minHeight: "0",
63
+ mainText: t('Generation In Progress'),
64
+ fontSize: "medium"
65
+ }));
66
+ };
67
+
68
+ _this.renderStartGenerationButton = function () {
69
+ return /*#__PURE__*/React.createElement(Button, {
70
+ color: "primary-inverse",
71
+ margin: "0 0 x-small 0",
72
+ onClick: _this.handleGeneration,
73
+ theme: {
74
+ lineHeight: '24px'
75
+ }
76
+ }, /*#__PURE__*/React.createElement(Text, {
77
+ size: "medium"
78
+ }, t('Generate Report')));
79
+ };
80
+
81
+ _this.renderGenerationButton = function () {
82
+ return _this.props.generationInProgress ? _this.renderOngoingGenerationButton() : _this.renderStartGenerationButton();
83
+ };
84
+
85
+ _this.handleGeneration = function (_event) {
86
+ var filter = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 'last_attempt';
87
+
88
+ _this.props.generateReports(filter);
89
+ };
90
+
91
+ return _this;
27
92
  }
28
93
 
29
94
  _createClass(NewQuizAndItemAnalysisPresenter, [{
30
- key: "renderContent",
31
- value: function renderContent() {
95
+ key: "render",
96
+ value: function render() {
32
97
  var _this$props = this.props,
33
- quizAnalysis = _this$props.quizAnalysis,
34
- itemAnalyses = _this$props.itemAnalyses;
98
+ analysisError = _this$props.analysisError,
99
+ fetchInProgress = _this$props.fetchInProgress,
100
+ generationInProgress = _this$props.generationInProgress,
101
+ quizAnalysis = _this$props.quizAnalysis;
102
+ var shouldShowError = analysisError && !fetchInProgress && !generationInProgress;
35
103
  return /*#__PURE__*/React.createElement("div", {
36
104
  className: "fs-mask"
37
105
  }, /*#__PURE__*/React.createElement(Flex, {
38
- justifyItems: "end",
106
+ alignItems: "end",
39
107
  width: "82.5rem",
40
- margin: "auto"
41
- }, /*#__PURE__*/React.createElement(AnalysisUpdateDate, {
108
+ margin: "auto",
109
+ direction: "column"
110
+ }, /*#__PURE__*/React.createElement(Flex.Item, {
111
+ overflowY: "visible"
112
+ }, !fetchInProgress && this.renderGenerationButton()), /*#__PURE__*/React.createElement(Flex.Item, null, shouldShowError && /*#__PURE__*/React.createElement(Text, {
113
+ size: "x-small",
114
+ weight: "bold",
115
+ color: "danger"
116
+ }, analysisError)), /*#__PURE__*/React.createElement(Flex.Item, null, !fetchInProgress && /*#__PURE__*/React.createElement(AnalysisUpdateDate, {
42
117
  date: quizAnalysis.created_timestamp
43
- })), /*#__PURE__*/React.createElement(NewQuizAnalysis, {
44
- quizAnalysis: quizAnalysis
45
- }), /*#__PURE__*/React.createElement(Heading, {
118
+ }))), /*#__PURE__*/React.createElement(NewQuizAnalysis, {
119
+ quizAnalysis: quizAnalysis,
120
+ fetchInProgress: fetchInProgress
121
+ }), !fetchInProgress && /*#__PURE__*/React.createElement(Heading, {
46
122
  level: "h2",
47
123
  color: "primary"
48
- }, t('Item Analysis')), itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
49
- return /*#__PURE__*/React.createElement(NewItemAnalysis, {
50
- key: itemAnalysis.metadata.item_id,
51
- itemAnalysis: itemAnalysis
52
- });
53
- }));
54
- }
55
- }, {
56
- key: "render",
57
- value: function render() {
58
- var _this$props2 = this.props,
59
- quizAnalysis = _this$props2.quizAnalysis,
60
- itemAnalyses = _this$props2.itemAnalyses;
61
-
62
- if (quizAnalysis && itemAnalyses) {
63
- return this.renderContent();
64
- } else {
65
- return _ref;
66
- }
124
+ }, t('Item Analysis')), fetchInProgress ? this.renderSpinner() : this.renderItemAnalyses());
67
125
  }
68
126
  }]);
69
127
 
@@ -72,9 +130,14 @@ export var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component)
72
130
  }(Component);
73
131
  NewQuizAndItemAnalysisPresenter.propTypes = {
74
132
  quizAnalysis: quizAnalysisPropType,
75
- itemAnalyses: PropTypes.arrayOf(itemAnalysisPropType)
133
+ itemAnalyses: PropTypes.arrayOf(itemAnalysisPropType),
134
+ fetchInProgress: PropTypes.bool.isRequired,
135
+ generationInProgress: PropTypes.bool.isRequired,
136
+ analysisError: PropTypes.string,
137
+ generateReports: PropTypes.func.isRequired
76
138
  };
77
139
  NewQuizAndItemAnalysisPresenter.defaultProps = {
140
+ analysisError: void 0,
78
141
  quizAnalysis: void 0,
79
142
  itemAnalyses: void 0
80
143
  };
@@ -103,7 +103,7 @@ export var withAnalysisStatePresenter = function withAnalysisStatePresenter(Orig
103
103
  case 0:
104
104
  hasStoredAnalyses = quizAnalysis && itemAnalyses;
105
105
 
106
- if (!(!hasStoredAnalyses && !fetchInProgress)) {
106
+ if (hasStoredAnalyses) {
107
107
  _context.next = 4;
108
108
  break;
109
109
  }
@@ -27,7 +27,7 @@ var statusPollingInProgressKey = 'statusPollingInProgress';
27
27
  exports.statusPollingInProgressKey = statusPollingInProgressKey;
28
28
  var errorKey = 'analysisError';
29
29
  exports.errorKey = errorKey;
30
- var defaultState = (0, _immutable.fromJS)((_fromJS = {}, (0, _defineProperty2.default)(_fromJS, quizAnalysisKey, void 0), (0, _defineProperty2.default)(_fromJS, itemAnalysesKey, void 0), (0, _defineProperty2.default)(_fromJS, fetchInProgressKey, false), (0, _defineProperty2.default)(_fromJS, generationInProgressKey, false), (0, _defineProperty2.default)(_fromJS, statusPollingInProgressKey, false), (0, _defineProperty2.default)(_fromJS, errorKey, void 0), _fromJS));
30
+ var defaultState = (0, _immutable.fromJS)((_fromJS = {}, (0, _defineProperty2.default)(_fromJS, quizAnalysisKey, void 0), (0, _defineProperty2.default)(_fromJS, itemAnalysesKey, void 0), (0, _defineProperty2.default)(_fromJS, fetchInProgressKey, true), (0, _defineProperty2.default)(_fromJS, generationInProgressKey, false), (0, _defineProperty2.default)(_fromJS, statusPollingInProgressKey, false), (0, _defineProperty2.default)(_fromJS, errorKey, void 0), _fromJS));
31
31
  exports.defaultState = defaultState;
32
32
 
33
33
  var _default = function _default() {
@@ -75,9 +75,10 @@ var AnalysisMetric = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles)
75
75
  }(_react.Component), _class2.propTypes = {
76
76
  metricKey: _propTypes.default.string.isRequired,
77
77
  label: _propTypes.default.string.isRequired,
78
- value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string, _propTypes.default.array]).isRequired,
78
+ value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string, _propTypes.default.array]),
79
79
  suffix: _propTypes.default.string
80
80
  }, _class2.defaultProps = {
81
+ value: void 0,
81
82
  suffix: ''
82
83
  }, _temp)) || _class);
83
84
  exports.AnalysisMetric = AnalysisMetric;
@@ -84,12 +84,14 @@ var AnalysisPopoverMetric = (_dec = (0, _uiThemeable.themeable)(_theme.default,
84
84
  }(_react.Component), _class2.propTypes = {
85
85
  metricKey: _propTypes.default.string.isRequired,
86
86
  label: _propTypes.default.string.isRequired,
87
- value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]).isRequired,
87
+ value: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
88
88
  popoverDescription: _propTypes.default.shape({
89
89
  title: _propTypes.default.string,
90
90
  subtitle: _propTypes.default.string,
91
91
  body: _propTypes.default.string,
92
92
  screenReaderLabel: _propTypes.default.string
93
93
  }).isRequired
94
+ }, _class2.defaultProps = {
95
+ value: void 0
94
96
  }, _temp)) || _class);
95
97
  exports.AnalysisPopoverMetric = AnalysisPopoverMetric;
@@ -273,6 +273,6 @@ var NewItemAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
273
273
  NewItemAnalysis.displayName = "NewItemAnalysis";
274
274
  return NewItemAnalysis;
275
275
  }(_react.Component), _class2.propTypes = {
276
- itemAnalysis: _propTypes.itemAnalysisPropType.isRequired
277
- }, _temp)) || _class);
276
+ itemAnalysis: _propTypes.itemAnalysisPropType
277
+ }.isRequired, _temp)) || _class);
278
278
  exports.NewItemAnalysis = NewItemAnalysis;
@@ -41,21 +41,26 @@ var _presenter = require("../charts/ScoreDistribution/presenter.js");
41
41
 
42
42
  var _propTypes = require("../propTypes.js");
43
43
 
44
+ var _propTypes2 = _interopRequireDefault(require("prop-types"));
45
+
46
+ var _uiSpinner = require("@instructure/ui-spinner");
47
+
44
48
  var _popoverContent = require("./popoverContent.js");
45
49
 
46
50
  var _dec, _class, _class2, _temp;
47
51
 
48
52
  var styles = {
49
- componentId: 'fQZVs',
53
+ componentId: 'ftlaC',
50
54
  template: function template(theme) {
51
- 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}");
55
+ return "\n\n.ftlaC_eDnN{display:flex;justify-content:space-between;padding-bottom:".concat(theme.headingPadding || 'inherit', "}\n\n.ftlaC_eKXQ{margin:").concat(theme.cardTopMargin || 'inherit', " auto ").concat(theme.cardBottomMargin || 'inherit', " auto;padding:").concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.ftlaC_dYbQ{align-items:center;display:flex;height:502px;justify-content:center;padding:").concat(theme.cardWrapperPadding || 'inherit', "}\n\n.ftlaC_crZr{padding-top:").concat(theme.metricGroupPaddingTop || 'inherit', "}\n\n.ftlaC_bTHH{position:absolute;right:").concat(theme.viewPaddingRight || 'inherit', ";top:").concat(theme.viewPaddingTop || 'inherit', "}\n\n.ftlaC_dPzc,.ftlaC_cpZE{column-gap:").concat(theme.metricsColumnGap || 'inherit', ";display:flex;flex-wrap:wrap;justify-content:flex-start;row-gap:1.5rem}");
52
56
  },
53
- 'heading': 'fQZVs_eDnN',
54
- 'cardWrapper': 'fQZVs_eKXQ',
55
- 'container': 'fQZVs_crZr',
56
- 'expandButtonContainer': 'fQZVs_bTHH',
57
- 'metricGroup': 'fQZVs_dPzc',
58
- 'metricsWrapper': 'fQZVs_cpZE'
57
+ 'heading': 'ftlaC_eDnN',
58
+ 'cardWrapper': 'ftlaC_eKXQ',
59
+ 'skeletonCardWrapper': 'ftlaC_dYbQ',
60
+ 'container': 'ftlaC_crZr',
61
+ 'expandButtonContainer': 'ftlaC_bTHH',
62
+ 'metricGroup': 'ftlaC_dPzc',
63
+ 'metricsWrapper': 'ftlaC_cpZE'
59
64
  };
60
65
  var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
61
66
  (0, _inherits2.default)(NewQuizAnalysis, _Component);
@@ -101,17 +106,12 @@ var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
101
106
  })));
102
107
  };
103
108
 
104
- return _this;
105
- }
106
-
107
- (0, _createClass2.default)(NewQuizAnalysis, [{
108
- key: "render",
109
- value: function render() {
110
- var quizAnalysis = this.props.quizAnalysis;
109
+ _this.renderContent = function () {
110
+ var quizAnalysis = _this.props.quizAnalysis;
111
111
  var scores = quizAnalysis.scores,
112
112
  attempts = quizAnalysis.attempts,
113
113
  metadata = quizAnalysis.metadata;
114
- var expanded = this.state.expanded;
114
+ var expanded = _this.state.expanded;
115
115
  return /*#__PURE__*/_react.default.createElement(_index2.default, {
116
116
  className: styles.cardWrapper
117
117
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -153,19 +153,39 @@ var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
153
153
  })), /*#__PURE__*/_react.default.createElement("div", {
154
154
  className: styles.expandButtonContainer
155
155
  }, /*#__PURE__*/_react.default.createElement(_index.default, {
156
- onClick: this.handleToggle,
156
+ onClick: _this.handleToggle,
157
157
  title: expanded ? (0, _formatMessage.default)('collapse quiz analysis') : (0, _formatMessage.default)('expand quiz analysis'),
158
158
  isExpanded: expanded
159
- }))), expanded && this.renderExpanded(), /*#__PURE__*/_react.default.createElement(_presenter.ScoreDistribution, {
159
+ }))), expanded && _this.renderExpanded(), /*#__PURE__*/_react.default.createElement(_presenter.ScoreDistribution, {
160
160
  decileDistribution: scores === null || scores === void 0 ? void 0 : scores.decile_distribution
161
161
  }));
162
+ };
163
+
164
+ return _this;
165
+ }
166
+
167
+ (0, _createClass2.default)(NewQuizAnalysis, [{
168
+ key: "render",
169
+ value: function render() {
170
+ var fetchInProgress = this.props.fetchInProgress;
171
+
172
+ if (fetchInProgress) {
173
+ return /*#__PURE__*/_react.default.createElement(_index2.default, {
174
+ className: styles.skeletonCardWrapper
175
+ }, /*#__PURE__*/_react.default.createElement(_uiSpinner.Spinner, {
176
+ renderTitle: (0, _formatMessage.default)('Loading quiz analysis data')
177
+ }));
178
+ } else {
179
+ return this.renderContent();
180
+ }
162
181
  }
163
182
  }]);
164
183
  NewQuizAnalysis.displayName = "NewQuizAnalysis";
165
184
  return NewQuizAnalysis;
166
185
  }(_react.Component), _class2.propTypes = {
167
- quizAnalysis: _propTypes.quizAnalysisPropType.isRequired
168
- }, _class2.defaultProps = {
186
+ quizAnalysis: _propTypes.quizAnalysisPropType,
187
+ fetchInProgress: _propTypes2.default.bool
188
+ }.isRequired, _class2.defaultProps = {
169
189
  quizAnalysis: {}
170
190
  }, _temp)) || _class);
171
191
  exports.NewQuizAnalysis = NewQuizAnalysis;
@@ -9,6 +9,8 @@ function generator(_ref) {
9
9
  var spacing = _ref.spacing;
10
10
  return {
11
11
  metricGroupPaddingTop: spacing.medium,
12
+ cardTopMargin: spacing.small,
13
+ cardBottomMargin: spacing.medium,
12
14
  viewPaddingRight: spacing.large,
13
15
  viewPaddingTop: spacing.medium,
14
16
  headingPadding: spacing.medium,
@@ -25,8 +25,6 @@ var _index = _interopRequireDefault(require("./NewItemAnalysis/index.js"));
25
25
 
26
26
  var _index2 = _interopRequireDefault(require("./NewQuizAnalysis/index.js"));
27
27
 
28
- var _Spinner = _interopRequireDefault(require("../../../../common/components/shared/spinner/Spinner.js"));
29
-
30
28
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
31
29
 
32
30
  var _uiFlex = require("@instructure/ui-flex");
@@ -37,7 +35,13 @@ var _propTypes = require("./propTypes.js");
37
35
 
38
36
  var _propTypes2 = _interopRequireDefault(require("prop-types"));
39
37
 
40
- var _ref = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
38
+ var _Spinner = require("../../../../common/components/shared/spinner/Spinner.js");
39
+
40
+ var _uiSpinner = require("@instructure/ui-spinner");
41
+
42
+ var _uiButtons = require("@instructure/ui-buttons");
43
+
44
+ var _uiText = require("@instructure/ui-text");
41
45
 
42
46
  var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
43
47
  (0, _inherits2.default)(NewQuizAndItemAnalysisPresenter, _Component);
@@ -45,48 +49,107 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
45
49
  var _super = (0, _createSuper2.default)(NewQuizAndItemAnalysisPresenter);
46
50
 
47
51
  function NewQuizAndItemAnalysisPresenter() {
52
+ var _this;
53
+
48
54
  (0, _classCallCheck2.default)(this, NewQuizAndItemAnalysisPresenter);
49
- return _super.apply(this, arguments);
55
+
56
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
57
+ args[_key] = arguments[_key];
58
+ }
59
+
60
+ _this = _super.call.apply(_super, [this].concat(args));
61
+
62
+ _this.renderItemAnalyses = function () {
63
+ var itemAnalyses = _this.props.itemAnalyses;
64
+ return /*#__PURE__*/_react.default.createElement("div", null, itemAnalyses.map(function (itemAnalysis) {
65
+ return /*#__PURE__*/_react.default.createElement(_index.default, {
66
+ key: itemAnalysis.metadata.item_id,
67
+ itemAnalysis: itemAnalysis
68
+ });
69
+ }));
70
+ };
71
+
72
+ _this.renderSpinner = function () {
73
+ return /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
74
+ padding: "medium",
75
+ justifyItems: "center",
76
+ alignItems: "center"
77
+ }, /*#__PURE__*/_react.default.createElement(_uiSpinner.Spinner, {
78
+ renderTitle: (0, _formatMessage.default)('Loading item analyses data')
79
+ }));
80
+ };
81
+
82
+ _this.renderOngoingGenerationButton = function () {
83
+ return /*#__PURE__*/_react.default.createElement(_uiButtons.Button, {
84
+ color: "primary-inverse",
85
+ interaction: "disabled",
86
+ margin: "0 0 x-small 0"
87
+ }, /*#__PURE__*/_react.default.createElement(_Spinner.QuizzesSpinner, {
88
+ size: "x-small",
89
+ color: "brand",
90
+ minHeight: "0",
91
+ mainText: (0, _formatMessage.default)('Generation In Progress'),
92
+ fontSize: "medium"
93
+ }));
94
+ };
95
+
96
+ _this.renderStartGenerationButton = function () {
97
+ return /*#__PURE__*/_react.default.createElement(_uiButtons.Button, {
98
+ color: "primary-inverse",
99
+ margin: "0 0 x-small 0",
100
+ onClick: _this.handleGeneration,
101
+ theme: {
102
+ lineHeight: '24px'
103
+ }
104
+ }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
105
+ size: "medium"
106
+ }, (0, _formatMessage.default)('Generate Report')));
107
+ };
108
+
109
+ _this.renderGenerationButton = function () {
110
+ return _this.props.generationInProgress ? _this.renderOngoingGenerationButton() : _this.renderStartGenerationButton();
111
+ };
112
+
113
+ _this.handleGeneration = function (_event) {
114
+ var filter = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 'last_attempt';
115
+
116
+ _this.props.generateReports(filter);
117
+ };
118
+
119
+ return _this;
50
120
  }
51
121
 
52
122
  (0, _createClass2.default)(NewQuizAndItemAnalysisPresenter, [{
53
- key: "renderContent",
54
- value: function renderContent() {
123
+ key: "render",
124
+ value: function render() {
55
125
  var _this$props = this.props,
56
- quizAnalysis = _this$props.quizAnalysis,
57
- itemAnalyses = _this$props.itemAnalyses;
126
+ analysisError = _this$props.analysisError,
127
+ fetchInProgress = _this$props.fetchInProgress,
128
+ generationInProgress = _this$props.generationInProgress,
129
+ quizAnalysis = _this$props.quizAnalysis;
130
+ var shouldShowError = analysisError && !fetchInProgress && !generationInProgress;
58
131
  return /*#__PURE__*/_react.default.createElement("div", {
59
132
  className: "fs-mask"
60
133
  }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
61
- justifyItems: "end",
134
+ alignItems: "end",
62
135
  width: "82.5rem",
63
- margin: "auto"
64
- }, /*#__PURE__*/_react.default.createElement(_index3.AnalysisUpdateDate, {
136
+ margin: "auto",
137
+ direction: "column"
138
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
139
+ overflowY: "visible"
140
+ }, !fetchInProgress && this.renderGenerationButton()), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, shouldShowError && /*#__PURE__*/_react.default.createElement(_uiText.Text, {
141
+ size: "x-small",
142
+ weight: "bold",
143
+ color: "danger"
144
+ }, analysisError)), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, !fetchInProgress && /*#__PURE__*/_react.default.createElement(_index3.AnalysisUpdateDate, {
65
145
  date: quizAnalysis.created_timestamp
66
- })), /*#__PURE__*/_react.default.createElement(_index2.default, {
67
- quizAnalysis: quizAnalysis
68
- }), /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
146
+ }))), /*#__PURE__*/_react.default.createElement(_index2.default, {
147
+ quizAnalysis: quizAnalysis,
148
+ fetchInProgress: fetchInProgress
149
+ }), !fetchInProgress && /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
69
150
  level: "h2",
70
151
  color: "primary"
71
- }, (0, _formatMessage.default)('Item Analysis')), itemAnalyses === null || itemAnalyses === void 0 ? void 0 : itemAnalyses.map(function (itemAnalysis) {
72
- return /*#__PURE__*/_react.default.createElement(_index.default, {
73
- key: itemAnalysis.metadata.item_id,
74
- itemAnalysis: itemAnalysis
75
- });
76
- }));
77
- }
78
- }, {
79
- key: "render",
80
- value: function render() {
81
- var _this$props2 = this.props,
82
- quizAnalysis = _this$props2.quizAnalysis,
83
- itemAnalyses = _this$props2.itemAnalyses;
84
-
85
- if (quizAnalysis && itemAnalyses) {
86
- return this.renderContent();
87
- } else {
88
- return _ref;
89
- }
152
+ }, (0, _formatMessage.default)('Item Analysis')), fetchInProgress ? this.renderSpinner() : this.renderItemAnalyses());
90
153
  }
91
154
  }]);
92
155
  NewQuizAndItemAnalysisPresenter.displayName = "NewQuizAndItemAnalysisPresenter";
@@ -96,9 +159,14 @@ var NewQuizAndItemAnalysisPresenter = /*#__PURE__*/function (_Component) {
96
159
  exports.NewQuizAndItemAnalysisPresenter = NewQuizAndItemAnalysisPresenter;
97
160
  NewQuizAndItemAnalysisPresenter.propTypes = {
98
161
  quizAnalysis: _propTypes.quizAnalysisPropType,
99
- itemAnalyses: _propTypes2.default.arrayOf(_propTypes.itemAnalysisPropType)
162
+ itemAnalyses: _propTypes2.default.arrayOf(_propTypes.itemAnalysisPropType),
163
+ fetchInProgress: _propTypes2.default.bool.isRequired,
164
+ generationInProgress: _propTypes2.default.bool.isRequired,
165
+ analysisError: _propTypes2.default.string,
166
+ generateReports: _propTypes2.default.func.isRequired
100
167
  };
101
168
  NewQuizAndItemAnalysisPresenter.defaultProps = {
169
+ analysisError: void 0,
102
170
  quizAnalysis: void 0,
103
171
  itemAnalyses: void 0
104
172
  };
@@ -122,7 +122,7 @@ var withAnalysisStatePresenter = function withAnalysisStatePresenter(OriginalCom
122
122
  case 0:
123
123
  hasStoredAnalyses = quizAnalysis && itemAnalyses;
124
124
 
125
- if (!(!hasStoredAnalyses && !fetchInProgress)) {
125
+ if (hasStoredAnalyses) {
126
126
  _context.next = 4;
127
127
  break;
128
128
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "17.64.1-rc.5+7ab6e1fd3",
3
+ "version": "17.64.1-rc.7+7baf9c9a8",
4
4
  "license": "MIT",
5
5
  "description": "The Quiz React SDK by Instructure Inc.",
6
6
  "author": "Instructure, Inc. Engineering and Product Design",
@@ -42,11 +42,11 @@
42
42
  "dependencies": {
43
43
  "@instructure/grading-utils": "^1.0.0",
44
44
  "@instructure/outcomes-ui": "^2.1.9",
45
- "@instructure/quiz-common": "17.64.1-rc.5+7ab6e1fd3",
46
- "@instructure/quiz-i18n": "17.64.1-rc.5+7ab6e1fd3",
47
- "@instructure/quiz-interactions": "17.64.1-rc.5+7ab6e1fd3",
48
- "@instructure/quiz-number-input": "17.64.1-rc.5+7ab6e1fd3",
49
- "@instructure/quiz-rce": "17.64.1-rc.5+7ab6e1fd3",
45
+ "@instructure/quiz-common": "17.64.1-rc.7+7baf9c9a8",
46
+ "@instructure/quiz-i18n": "17.64.1-rc.7+7baf9c9a8",
47
+ "@instructure/quiz-interactions": "17.64.1-rc.7+7baf9c9a8",
48
+ "@instructure/quiz-number-input": "17.64.1-rc.7+7baf9c9a8",
49
+ "@instructure/quiz-rce": "17.64.1-rc.7+7baf9c9a8",
50
50
  "@instructure/ui-a11y-content": "^7.20.0",
51
51
  "@instructure/ui-alerts": "^7.20.0",
52
52
  "@instructure/ui-avatar": "^7.20.0",
@@ -107,7 +107,7 @@
107
107
  "eventemitter3": "^3.1.0",
108
108
  "humps": "^2.0.0",
109
109
  "immutable": "^3.8.1",
110
- "instructure-validations": "17.64.1-rc.5+7ab6e1fd3",
110
+ "instructure-validations": "17.64.1-rc.7+7baf9c9a8",
111
111
  "ipaddr.js": "^1.5.4",
112
112
  "isomorphic-fetch": "^2.2.0",
113
113
  "isuuid": "^0.1.0",
@@ -158,7 +158,7 @@
158
158
  "intl": "^1.2.4",
159
159
  "jquery": "^2.2.3",
160
160
  "most-subject": "^5.3.0",
161
- "quiz-presets": "17.64.1-rc.5+7ab6e1fd3",
161
+ "quiz-presets": "17.64.1-rc.7+7baf9c9a8",
162
162
  "react": "^16.8.6",
163
163
  "react-addons-test-utils": "^15.6.2",
164
164
  "react-dom": "^16.8.6",
@@ -174,5 +174,5 @@
174
174
  "publishConfig": {
175
175
  "access": "public"
176
176
  },
177
- "gitHead": "7ab6e1fd33c7aca23bea334c6a88cedaa883f812"
177
+ "gitHead": "7baf9c9a8a22dd8a278be8e588c085fc8e04b117"
178
178
  }