@instructure/quiz-core 17.60.0 → 17.60.1-rc.1

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 (23) hide show
  1. package/es/banks/components/Banks/presenter.js +1 -0
  2. package/es/banks/components/BanksList/presenter.js +1 -0
  3. package/es/banks/components/SharingModal/presenter.js +2 -2
  4. package/es/building/components/resources/BanksTray/presenter.js +1 -0
  5. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisUpdateDate/index.js +53 -0
  6. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +2 -23
  7. package/es/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/index.js +72 -20
  8. package/es/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/theme.js +12 -0
  9. package/es/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +4 -12
  10. package/es/reporting/components/resources/NewQuizAndItemAnalysis/propTypes.js +23 -0
  11. package/es/reporting/components/resources/ReportCard/index.js +1 -1
  12. package/lib/banks/components/Banks/presenter.js +1 -0
  13. package/lib/banks/components/BanksList/presenter.js +1 -0
  14. package/lib/banks/components/SharingModal/presenter.js +2 -2
  15. package/lib/building/components/resources/BanksTray/presenter.js +1 -0
  16. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnalysisUpdateDate/index.js +74 -0
  17. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewQuizAnalysis/presenter.js +3 -24
  18. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/index.js +77 -20
  19. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/ReportCard/theme.js +19 -0
  20. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/presenter.js +4 -13
  21. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/propTypes.js +35 -0
  22. package/lib/reporting/components/resources/ReportCard/index.js +1 -1
  23. package/package.json +10 -10
@@ -377,6 +377,7 @@ export var Banks = (_dec = themeable(theme, styles), _dec(_class = (_temp = _cla
377
377
  closeTray: PropTypes.func,
378
378
  createBank: PropTypes.func.isRequired,
379
379
  currentUser: PropTypes.shape({
380
+ bank_admin: PropTypes.bool,
380
381
  email: PropTypes.string,
381
382
  enrollment_names: PropTypes.arrayOf(PropTypes.string),
382
383
  full_name: PropTypes.string,
@@ -328,6 +328,7 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
328
328
  appContainer: CustomPropTypes.selectors.isRequired,
329
329
  banks: ImmutablePropTypes.list.isRequired,
330
330
  currentUser: PropTypes.shape({
331
+ bank_admin: PropTypes.bool,
331
332
  email: PropTypes.string,
332
333
  enrollment_names: PropTypes.arrayOf(PropTypes.string),
333
334
  full_name: PropTypes.string,
@@ -453,9 +453,8 @@ export var SharingModalPresenter = (_dec = themeable(theme, styles), _dec(_class
453
453
  var _this$props2 = this.props,
454
454
  currentUser = _this$props2.currentUser,
455
455
  improvedBankSharingEnabled = _this$props2.improvedBankSharingEnabled;
456
- var roles = currentUser && currentUser.enrollment_names || [];
457
456
 
458
- if (improvedBankSharingEnabled && roles.includes('admin')) {
457
+ if (improvedBankSharingEnabled && (currentUser === null || currentUser === void 0 ? void 0 : currentUser.bank_admin)) {
459
458
  return /*#__PURE__*/React.createElement(View, {
460
459
  as: "div",
461
460
  margin: "0 0 medium 0"
@@ -555,6 +554,7 @@ export var SharingModalPresenter = (_dec = themeable(theme, styles), _dec(_class
555
554
  appContainer: CustomPropTypes.selectors.isRequired,
556
555
  bank: ImmutablePropTypes.record.isRequired,
557
556
  currentUser: PropTypes.shape({
557
+ bank_admin: PropTypes.bool,
558
558
  email: PropTypes.string,
559
559
  enrollment_names: PropTypes.arrayOf(PropTypes.string),
560
560
  full_name: PropTypes.string,
@@ -170,6 +170,7 @@ BanksTray.propTypes = {
170
170
  activeBankEntryId: PropTypes.string,
171
171
  clear: PropTypes.func.isRequired,
172
172
  currentUser: PropTypes.shape({
173
+ bank_admin: PropTypes.bool,
173
174
  email: PropTypes.string,
174
175
  enrollment_names: PropTypes.arrayOf(PropTypes.string),
175
176
  full_name: PropTypes.string,
@@ -0,0 +1,53 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
+ import _createClass from "@babel/runtime/helpers/esm/createClass";
3
+ import _inherits from "@babel/runtime/helpers/esm/inherits";
4
+ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
5
+ import React, { Component } from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import t from '@instructure/quiz-i18n/es/format-message';
8
+ import { displayDateAndTimeInTimezone } from "../../../../../common/util/formatTimespan.js";
9
+ import { Text } from '@instructure/ui-text';
10
+ import { Flex } from '@instructure/ui-flex';
11
+ export var AnalysisUpdateDate = /*#__PURE__*/function (_Component) {
12
+ _inherits(AnalysisUpdateDate, _Component);
13
+
14
+ var _super = _createSuper(AnalysisUpdateDate);
15
+
16
+ function AnalysisUpdateDate() {
17
+ _classCallCheck(this, AnalysisUpdateDate);
18
+
19
+ return _super.apply(this, arguments);
20
+ }
21
+
22
+ _createClass(AnalysisUpdateDate, [{
23
+ key: "render",
24
+ value: function render() {
25
+ var _this$context = this.context,
26
+ timezone = _this$context.timezone,
27
+ locale = _this$context.locale;
28
+ var _this$props = this.props,
29
+ date = _this$props.date,
30
+ multiline = _this$props.multiline;
31
+ return /*#__PURE__*/React.createElement(Text, {
32
+ size: "x-small"
33
+ }, /*#__PURE__*/React.createElement(Flex, {
34
+ direction: multiline ? 'column' : 'row',
35
+ alignItems: "start"
36
+ }, /*#__PURE__*/React.createElement("b", null, t('Data Last Updated:'), "\xA0"), /*#__PURE__*/React.createElement("span", null, displayDateAndTimeInTimezone(date, timezone, locale))));
37
+ }
38
+ }]);
39
+
40
+ AnalysisUpdateDate.displayName = "AnalysisUpdateDate";
41
+ return AnalysisUpdateDate;
42
+ }(Component);
43
+ AnalysisUpdateDate.propTypes = {
44
+ date: PropTypes.string.isRequired,
45
+ multiline: PropTypes.bool
46
+ };
47
+ AnalysisUpdateDate.contextTypes = {
48
+ timezone: PropTypes.string,
49
+ locale: PropTypes.string
50
+ };
51
+ AnalysisUpdateDate.defaultProps = {
52
+ multiline: false
53
+ };
@@ -24,11 +24,11 @@ import ExpandButton from "../../../../../common/components/shared/ExpandButton/i
24
24
  import { themeable } from '@instructure/ui-themeable';
25
25
  import theme from "./theme.js";
26
26
  import { formatTimeToFullNumeric } from "../../../../../common/util/formatTimespan.js";
27
- import PropTypes from 'prop-types';
28
27
  import Card from "../../../../../common/components/shared/Card/index.js";
29
28
  import AnalysisPopoverMetric from "../AnalysisPopoverMetric/index.js";
30
29
  import AnalysisMetric from "../AnalysisMetric/index.js";
31
30
  import { ScoreDistribution } from "../charts/ScoreDistribution/presenter.js";
31
+ import { quizAnalysisPropType } from "../propTypes.js";
32
32
  var stdDevPopoverTexts = {
33
33
  title: 'Lorem ipsum ',
34
34
  subtitle: 'subtitle',
@@ -152,28 +152,7 @@ export var NewQuizAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
152
152
  NewQuizAnalysis.displayName = "NewQuizAnalysis";
153
153
  return NewQuizAnalysis;
154
154
  }(Component), _class2.propTypes = {
155
- quizAnalysis: PropTypes.shape({
156
- created_timestamp: PropTypes.string.isRequired,
157
- metadata: PropTypes.shape({
158
- quiz_title: PropTypes.string
159
- }).isRequired,
160
- scores: PropTypes.shape({
161
- decile_distribution: PropTypes.arrayOf(PropTypes.number),
162
- cronbachs_alpha: PropTypes.number,
163
- stddev: PropTypes.number,
164
- median_percentage: PropTypes.number,
165
- max_percentage: PropTypes.number,
166
- min_percentage: PropTypes.number,
167
- mean_percentage: PropTypes.number
168
- }).isRequired,
169
- attempts: PropTypes.shape({
170
- mean_elapsed_sec: PropTypes.number,
171
- students_completed: PropTypes.number,
172
- students_not_finished: PropTypes.number,
173
- students_without_attempt: PropTypes.number,
174
- average_attempts: PropTypes.number
175
- }).isRequired
176
- }).isRequired
155
+ quizAnalysis: quizAnalysisPropType
177
156
  }, _class2.defaultProps = {
178
157
  quizAnalysis: {}
179
158
  }, _temp)) || _class);
@@ -14,45 +14,95 @@ import { Flex } from '@instructure/ui-flex';
14
14
  import { themeable } from '@instructure/ui-themeable';
15
15
  import Card from "../../../../../common/components/shared/Card/index.js";
16
16
  var styles = {
17
- componentId: 'eRzKS',
17
+ componentId: 'eJSiT',
18
18
  template: function template(theme) {
19
- return "\n\n.eRzKS_fbIL{border-radius:".concat(theme.cardBorderRadius || 'inherit', ";box-shadow:").concat(theme.cardBoxShadow || 'inherit', ";display:inline-flex;flex-direction:column;height:").concat(theme.cardHeight || 'inherit', ";margin:").concat(theme.cardMargin || 'inherit', ";padding:").concat(theme.cardPadding || 'inherit', ";width:").concat(theme.cardWidth || 'inherit', "}\n\n.eRzKS_ebWM{padding-top:").concat(theme.detailPadding || 'inherit', "}");
19
+ 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}");
20
20
  },
21
- 'card': 'eRzKS_fbIL',
22
- 'details': 'eRzKS_ebWM'
21
+ 'metricsContainer': 'eJSiT_bqdH',
22
+ 'card': 'eJSiT_fbIL',
23
+ 'dateContainer': 'eJSiT_blRb'
23
24
  };
24
- import theme from "../../ReportCard/theme.js";
25
+ import theme from "./theme.js";
26
+ import AnalysisMetric from "../AnalysisMetric/index.js";
27
+ import Spinner from "../../../../../common/components/shared/spinner/Spinner.js";
28
+ import { AnalysisUpdateDate } from "../AnalysisUpdateDate/index.js";
29
+ import { quizAnalysisPropType } from "../propTypes.js";
30
+
31
+ var _ref = /*#__PURE__*/React.createElement(Spinner, null);
32
+
25
33
  export var NewQuizAndItemAnalysisReportCard = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
26
34
  _inherits(NewQuizAndItemAnalysisReportCard, _Component);
27
35
 
28
36
  var _super = _createSuper(NewQuizAndItemAnalysisReportCard);
29
37
 
30
38
  function NewQuizAndItemAnalysisReportCard() {
39
+ var _this;
40
+
31
41
  _classCallCheck(this, NewQuizAndItemAnalysisReportCard);
32
42
 
33
- return _super.apply(this, arguments);
43
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
44
+ args[_key] = arguments[_key];
45
+ }
46
+
47
+ _this = _super.call.apply(_super, [this].concat(args));
48
+
49
+ _this.renderMetrics = function () {
50
+ var _quizAnalysis$scores, _quizAnalysis$scores2, _quizAnalysis$scores3;
51
+
52
+ var quizAnalysis = _this.props.quizAnalysis;
53
+ return /*#__PURE__*/React.createElement("div", {
54
+ className: styles.metricsContainer
55
+ }, /*#__PURE__*/React.createElement(AnalysisMetric, {
56
+ metricKey: "highscore",
57
+ label: t('high score'),
58
+ value: (_quizAnalysis$scores = quizAnalysis.scores) === null || _quizAnalysis$scores === void 0 ? void 0 : _quizAnalysis$scores.max_percentage,
59
+ suffix: "%"
60
+ }), /*#__PURE__*/React.createElement(AnalysisMetric, {
61
+ metricKey: "lowscore",
62
+ label: t('low score'),
63
+ value: (_quizAnalysis$scores2 = quizAnalysis.scores) === null || _quizAnalysis$scores2 === void 0 ? void 0 : _quizAnalysis$scores2.min_percentage,
64
+ suffix: "%"
65
+ }), /*#__PURE__*/React.createElement(AnalysisMetric, {
66
+ metricKey: "meanscore",
67
+ label: t('mean score'),
68
+ value: (_quizAnalysis$scores3 = quizAnalysis.scores) === null || _quizAnalysis$scores3 === void 0 ? void 0 : _quizAnalysis$scores3.mean_percentage,
69
+ suffix: "%"
70
+ }));
71
+ };
72
+
73
+ return _this;
34
74
  }
35
75
 
36
76
  _createClass(NewQuizAndItemAnalysisReportCard, [{
37
- key: "render",
38
- value: function render() {
77
+ key: "renderContent",
78
+ value: function renderContent() {
39
79
  var _this$props = this.props,
40
80
  name = _this$props.name,
41
- href = _this$props.href;
42
- return /*#__PURE__*/React.createElement(Card, {
43
- className: styles.card
44
- }, /*#__PURE__*/React.createElement(Flex, {
45
- direction: "column"
46
- }, /*#__PURE__*/React.createElement(Flex.Item, null, /*#__PURE__*/React.createElement(Text, {
81
+ href = _this$props.href,
82
+ quizAnalysis = _this$props.quizAnalysis;
83
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Text, {
47
84
  size: "medium",
48
85
  weight: "bold"
49
- }, name)), /*#__PURE__*/React.createElement(Flex.Item, {
50
- align: "end"
51
- }, /*#__PURE__*/React.createElement(Link, {
86
+ }, name), this.renderMetrics(), /*#__PURE__*/React.createElement(Flex, {
87
+ direction: "row",
88
+ justifyItems: "space-between"
89
+ }, /*#__PURE__*/React.createElement("div", {
90
+ className: styles.dateContainer
91
+ }, /*#__PURE__*/React.createElement(AnalysisUpdateDate, {
92
+ date: quizAnalysis.created_timestamp,
93
+ multiline: true
94
+ })), /*#__PURE__*/React.createElement(Link, {
52
95
  href: href
53
96
  }, /*#__PURE__*/React.createElement(Text, {
54
97
  size: "small"
55
- }, t('View Report'))))));
98
+ }, t('View Report')))));
99
+ }
100
+ }, {
101
+ key: "render",
102
+ value: function render() {
103
+ return /*#__PURE__*/React.createElement(Card, {
104
+ className: styles.card
105
+ }, this.props.quizAnalysis ? this.renderContent() : _ref);
56
106
  }
57
107
  }]);
58
108
 
@@ -60,9 +110,11 @@ export var NewQuizAndItemAnalysisReportCard = (_dec = themeable(theme, styles),
60
110
  return NewQuizAndItemAnalysisReportCard;
61
111
  }(Component), _class2.propTypes = {
62
112
  name: PropTypes.node,
63
- href: PropTypes.string
113
+ href: PropTypes.string,
114
+ quizAnalysis: quizAnalysisPropType
64
115
  }, _class2.defaultProps = {
65
116
  name: void 0,
66
- href: void 0
117
+ href: void 0,
118
+ quizAnalysis: {}
67
119
  }, _temp)) || _class);
68
120
  export default NewQuizAndItemAnalysisReportCard;
@@ -0,0 +1,12 @@
1
+ export default function generator(_ref) {
2
+ var spacing = _ref.spacing,
3
+ borders = _ref.borders;
4
+ return {
5
+ metricsPadding: spacing.medium,
6
+ cardWidth: '16rem',
7
+ cardPadding: spacing.medium,
8
+ cardMargin: spacing.xSmall,
9
+ cardBoxShadow: '1px 1px 3px 0 #ddd',
10
+ cardBorderRadius: borders.radiusMedium
11
+ };
12
+ }
@@ -11,9 +11,8 @@ import NewItemAnalysis from "./NewItemAnalysis/index.js";
11
11
  import Spinner from "../../../../common/components/shared/spinner/Spinner.js";
12
12
  import NewQuizAnalysis from "./NewQuizAnalysis/index.js";
13
13
  import t from '@instructure/quiz-i18n/es/format-message';
14
- import { Text } from '@instructure/ui-text';
15
14
  import { Flex } from '@instructure/ui-flex';
16
- import { displayDateAndTimeInTimezone } from "../../../../common/util/formatTimespan.js";
15
+ import { AnalysisUpdateDate } from "./AnalysisUpdateDate/index.js";
17
16
 
18
17
  var _ref3 = /*#__PURE__*/React.createElement(Spinner, null);
19
18
 
@@ -101,18 +100,15 @@ export var NewQuizAndItemAnalysis = /*#__PURE__*/function (_Component) {
101
100
  var _this$state = this.state,
102
101
  quizAnalysis = _this$state.quizAnalysis,
103
102
  itemAnalyses = _this$state.itemAnalyses;
104
- var _this$context = this.context,
105
- timezone = _this$context.timezone,
106
- locale = _this$context.locale;
107
103
  return /*#__PURE__*/React.createElement("div", {
108
104
  className: "fs-mask"
109
105
  }, /*#__PURE__*/React.createElement(Flex, {
110
106
  justifyItems: "end",
111
107
  width: "82.5rem",
112
108
  margin: "auto"
113
- }, /*#__PURE__*/React.createElement(Text, {
114
- size: "x-small"
115
- }, /*#__PURE__*/React.createElement("b", null, t('Data Last Updated:')), "\xA0", displayDateAndTimeInTimezone(quizAnalysis.created_timestamp, timezone, locale))), /*#__PURE__*/React.createElement(NewQuizAnalysis, {
109
+ }, /*#__PURE__*/React.createElement(AnalysisUpdateDate, {
110
+ date: quizAnalysis.created_timestamp
111
+ })), /*#__PURE__*/React.createElement(NewQuizAnalysis, {
116
112
  quizAnalysis: quizAnalysis
117
113
  }), /*#__PURE__*/React.createElement(Heading, {
118
114
  level: "h3",
@@ -142,10 +138,6 @@ export var NewQuizAndItemAnalysis = /*#__PURE__*/function (_Component) {
142
138
  NewQuizAndItemAnalysis.displayName = "NewQuizAndItemAnalysis";
143
139
  return NewQuizAndItemAnalysis;
144
140
  }(Component);
145
- NewQuizAndItemAnalysis.contextTypes = {
146
- timezone: PropTypes.string,
147
- locale: PropTypes.string
148
- };
149
141
  NewQuizAndItemAnalysis.propTypes = {
150
142
  activeQuizId: PropTypes.string.isRequired,
151
143
  getQuizAnalysis: PropTypes.func.isRequired,
@@ -0,0 +1,23 @@
1
+ import PropTypes from 'prop-types';
2
+ export var quizAnalysisPropType = PropTypes.shape({
3
+ created_timestamp: PropTypes.string.isRequired,
4
+ metadata: PropTypes.shape({
5
+ quiz_title: PropTypes.string
6
+ }).isRequired,
7
+ scores: PropTypes.shape({
8
+ decile_distribution: PropTypes.arrayOf(PropTypes.number),
9
+ cronbachs_alpha: PropTypes.number,
10
+ stddev: PropTypes.number,
11
+ median_percentage: PropTypes.number,
12
+ max_percentage: PropTypes.number,
13
+ min_percentage: PropTypes.number,
14
+ mean_percentage: PropTypes.number
15
+ }).isRequired,
16
+ attempts: PropTypes.shape({
17
+ mean_elapsed_sec: PropTypes.number,
18
+ students_completed: PropTypes.number,
19
+ students_not_finished: PropTypes.number,
20
+ students_without_attempt: PropTypes.number,
21
+ average_attempts: PropTypes.number
22
+ }).isRequired
23
+ }).isRequired;
@@ -12,7 +12,7 @@ import { Link } from '@instructure/ui-link';
12
12
  import { themeable } from '@instructure/ui-themeable';
13
13
  import Card from "../../../../common/components/shared/Card/index.js";
14
14
  var styles = {
15
- componentId: 'cNnNG',
15
+ componentId: 'eRzKS',
16
16
  template: function template(theme) {
17
17
  return "\n\n.eRzKS_fbIL{border-radius:".concat(theme.cardBorderRadius || 'inherit', ";box-shadow:").concat(theme.cardBoxShadow || 'inherit', ";display:inline-flex;flex-direction:column;height:").concat(theme.cardHeight || 'inherit', ";margin:").concat(theme.cardMargin || 'inherit', ";padding:").concat(theme.cardPadding || 'inherit', ";width:").concat(theme.cardWidth || 'inherit', "}\n\n.eRzKS_ebWM{padding-top:").concat(theme.detailPadding || 'inherit', "}");
18
18
  },
@@ -416,6 +416,7 @@ var Banks = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_c
416
416
  closeTray: _propTypes.default.func,
417
417
  createBank: _propTypes.default.func.isRequired,
418
418
  currentUser: _propTypes.default.shape({
419
+ bank_admin: _propTypes.default.bool,
419
420
  email: _propTypes.default.string,
420
421
  enrollment_names: _propTypes.default.arrayOf(_propTypes.default.string),
421
422
  full_name: _propTypes.default.string,
@@ -365,6 +365,7 @@ var BanksList = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _de
365
365
  appContainer: _CustomPropTypes.default.selectors.isRequired,
366
366
  banks: _reactImmutableProptypes.default.list.isRequired,
367
367
  currentUser: _propTypes.default.shape({
368
+ bank_admin: _propTypes.default.bool,
368
369
  email: _propTypes.default.string,
369
370
  enrollment_names: _propTypes.default.arrayOf(_propTypes.default.string),
370
371
  full_name: _propTypes.default.string,
@@ -494,9 +494,8 @@ var SharingModalPresenter = (_dec = (0, _uiThemeable.themeable)(_theme.default,
494
494
  var _this$props2 = this.props,
495
495
  currentUser = _this$props2.currentUser,
496
496
  improvedBankSharingEnabled = _this$props2.improvedBankSharingEnabled;
497
- var roles = currentUser && currentUser.enrollment_names || [];
498
497
 
499
- if (improvedBankSharingEnabled && roles.includes('admin')) {
498
+ if (improvedBankSharingEnabled && (currentUser === null || currentUser === void 0 ? void 0 : currentUser.bank_admin)) {
500
499
  return /*#__PURE__*/_react.default.createElement(_uiView.View, {
501
500
  as: "div",
502
501
  margin: "0 0 medium 0"
@@ -595,6 +594,7 @@ var SharingModalPresenter = (_dec = (0, _uiThemeable.themeable)(_theme.default,
595
594
  appContainer: _CustomPropTypes.default.selectors.isRequired,
596
595
  bank: _reactImmutableProptypes.default.record.isRequired,
597
596
  currentUser: _propTypes.default.shape({
597
+ bank_admin: _propTypes.default.bool,
598
598
  email: _propTypes.default.string,
599
599
  enrollment_names: _propTypes.default.arrayOf(_propTypes.default.string),
600
600
  full_name: _propTypes.default.string,
@@ -199,6 +199,7 @@ BanksTray.propTypes = {
199
199
  activeBankEntryId: _propTypes.default.string,
200
200
  clear: _propTypes.default.func.isRequired,
201
201
  currentUser: _propTypes.default.shape({
202
+ bank_admin: _propTypes.default.bool,
202
203
  email: _propTypes.default.string,
203
204
  enrollment_names: _propTypes.default.arrayOf(_propTypes.default.string),
204
205
  full_name: _propTypes.default.string,
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
+
5
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.AnalysisUpdateDate = void 0;
11
+
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
+
14
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
+
16
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
+
18
+ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
19
+
20
+ var _react = _interopRequireWildcard(require("react"));
21
+
22
+ var _propTypes = _interopRequireDefault(require("prop-types"));
23
+
24
+ var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
25
+
26
+ var _formatTimespan = require("../../../../../common/util/formatTimespan.js");
27
+
28
+ var _uiText = require("@instructure/ui-text");
29
+
30
+ var _uiFlex = require("@instructure/ui-flex");
31
+
32
+ var AnalysisUpdateDate = /*#__PURE__*/function (_Component) {
33
+ (0, _inherits2.default)(AnalysisUpdateDate, _Component);
34
+
35
+ var _super = (0, _createSuper2.default)(AnalysisUpdateDate);
36
+
37
+ function AnalysisUpdateDate() {
38
+ (0, _classCallCheck2.default)(this, AnalysisUpdateDate);
39
+ return _super.apply(this, arguments);
40
+ }
41
+
42
+ (0, _createClass2.default)(AnalysisUpdateDate, [{
43
+ key: "render",
44
+ value: function render() {
45
+ var _this$context = this.context,
46
+ timezone = _this$context.timezone,
47
+ locale = _this$context.locale;
48
+ var _this$props = this.props,
49
+ date = _this$props.date,
50
+ multiline = _this$props.multiline;
51
+ return /*#__PURE__*/_react.default.createElement(_uiText.Text, {
52
+ size: "x-small"
53
+ }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
54
+ direction: multiline ? 'column' : 'row',
55
+ alignItems: "start"
56
+ }, /*#__PURE__*/_react.default.createElement("b", null, (0, _formatMessage.default)('Data Last Updated:'), "\xA0"), /*#__PURE__*/_react.default.createElement("span", null, (0, _formatTimespan.displayDateAndTimeInTimezone)(date, timezone, locale))));
57
+ }
58
+ }]);
59
+ AnalysisUpdateDate.displayName = "AnalysisUpdateDate";
60
+ return AnalysisUpdateDate;
61
+ }(_react.Component);
62
+
63
+ exports.AnalysisUpdateDate = AnalysisUpdateDate;
64
+ AnalysisUpdateDate.propTypes = {
65
+ date: _propTypes.default.string.isRequired,
66
+ multiline: _propTypes.default.bool
67
+ };
68
+ AnalysisUpdateDate.contextTypes = {
69
+ timezone: _propTypes.default.string,
70
+ locale: _propTypes.default.string
71
+ };
72
+ AnalysisUpdateDate.defaultProps = {
73
+ multiline: false
74
+ };
@@ -31,8 +31,6 @@ var _theme = _interopRequireDefault(require("./theme.js"));
31
31
 
32
32
  var _formatTimespan = require("../../../../../common/util/formatTimespan.js");
33
33
 
34
- var _propTypes = _interopRequireDefault(require("prop-types"));
35
-
36
34
  var _index2 = _interopRequireDefault(require("../../../../../common/components/shared/Card/index.js"));
37
35
 
38
36
  var _index3 = _interopRequireDefault(require("../AnalysisPopoverMetric/index.js"));
@@ -41,6 +39,8 @@ var _index4 = _interopRequireDefault(require("../AnalysisMetric/index.js"));
41
39
 
42
40
  var _presenter = require("../charts/ScoreDistribution/presenter.js");
43
41
 
42
+ var _propTypes = require("../propTypes.js");
43
+
44
44
  var _dec, _class, _class2, _temp;
45
45
 
46
46
  var styles = {
@@ -177,28 +177,7 @@ var NewQuizAnalysis = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles
177
177
  NewQuizAnalysis.displayName = "NewQuizAnalysis";
178
178
  return NewQuizAnalysis;
179
179
  }(_react.Component), _class2.propTypes = {
180
- quizAnalysis: _propTypes.default.shape({
181
- created_timestamp: _propTypes.default.string.isRequired,
182
- metadata: _propTypes.default.shape({
183
- quiz_title: _propTypes.default.string
184
- }).isRequired,
185
- scores: _propTypes.default.shape({
186
- decile_distribution: _propTypes.default.arrayOf(_propTypes.default.number),
187
- cronbachs_alpha: _propTypes.default.number,
188
- stddev: _propTypes.default.number,
189
- median_percentage: _propTypes.default.number,
190
- max_percentage: _propTypes.default.number,
191
- min_percentage: _propTypes.default.number,
192
- mean_percentage: _propTypes.default.number
193
- }).isRequired,
194
- attempts: _propTypes.default.shape({
195
- mean_elapsed_sec: _propTypes.default.number,
196
- students_completed: _propTypes.default.number,
197
- students_not_finished: _propTypes.default.number,
198
- students_without_attempt: _propTypes.default.number,
199
- average_attempts: _propTypes.default.number
200
- }).isRequired
201
- }).isRequired
180
+ quizAnalysis: _propTypes.quizAnalysisPropType
202
181
  }, _class2.defaultProps = {
203
182
  quizAnalysis: {}
204
183
  }, _temp)) || _class);
@@ -33,58 +33,115 @@ var _uiThemeable = require("@instructure/ui-themeable");
33
33
 
34
34
  var _index = _interopRequireDefault(require("../../../../../common/components/shared/Card/index.js"));
35
35
 
36
- var _theme = _interopRequireDefault(require("../../ReportCard/theme.js"));
36
+ var _theme = _interopRequireDefault(require("./theme.js"));
37
+
38
+ var _index2 = _interopRequireDefault(require("../AnalysisMetric/index.js"));
39
+
40
+ var _Spinner = _interopRequireDefault(require("../../../../../common/components/shared/spinner/Spinner.js"));
41
+
42
+ var _index3 = require("../AnalysisUpdateDate/index.js");
43
+
44
+ var _propTypes2 = require("../propTypes.js");
37
45
 
38
46
  var _dec, _class, _class2, _temp;
39
47
 
40
48
  var styles = {
41
- componentId: 'eRzKS',
49
+ componentId: 'eJSiT',
42
50
  template: function template(theme) {
43
- return "\n\n.eRzKS_fbIL{border-radius:".concat(theme.cardBorderRadius || 'inherit', ";box-shadow:").concat(theme.cardBoxShadow || 'inherit', ";display:inline-flex;flex-direction:column;height:").concat(theme.cardHeight || 'inherit', ";margin:").concat(theme.cardMargin || 'inherit', ";padding:").concat(theme.cardPadding || 'inherit', ";width:").concat(theme.cardWidth || 'inherit', "}\n\n.eRzKS_ebWM{padding-top:").concat(theme.detailPadding || 'inherit', "}");
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}");
44
52
  },
45
- 'card': 'eRzKS_fbIL',
46
- 'details': 'eRzKS_ebWM'
53
+ 'metricsContainer': 'eJSiT_bqdH',
54
+ 'card': 'eJSiT_fbIL',
55
+ 'dateContainer': 'eJSiT_blRb'
47
56
  };
57
+
58
+ var _ref = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
59
+
48
60
  var NewQuizAndItemAnalysisReportCard = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
49
61
  (0, _inherits2.default)(NewQuizAndItemAnalysisReportCard, _Component);
50
62
 
51
63
  var _super = (0, _createSuper2.default)(NewQuizAndItemAnalysisReportCard);
52
64
 
53
65
  function NewQuizAndItemAnalysisReportCard() {
66
+ var _this;
67
+
54
68
  (0, _classCallCheck2.default)(this, NewQuizAndItemAnalysisReportCard);
55
- return _super.apply(this, arguments);
69
+
70
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
71
+ args[_key] = arguments[_key];
72
+ }
73
+
74
+ _this = _super.call.apply(_super, [this].concat(args));
75
+
76
+ _this.renderMetrics = function () {
77
+ var _quizAnalysis$scores, _quizAnalysis$scores2, _quizAnalysis$scores3;
78
+
79
+ var quizAnalysis = _this.props.quizAnalysis;
80
+ return /*#__PURE__*/_react.default.createElement("div", {
81
+ className: styles.metricsContainer
82
+ }, /*#__PURE__*/_react.default.createElement(_index2.default, {
83
+ metricKey: "highscore",
84
+ label: (0, _formatMessage.default)('high score'),
85
+ value: (_quizAnalysis$scores = quizAnalysis.scores) === null || _quizAnalysis$scores === void 0 ? void 0 : _quizAnalysis$scores.max_percentage,
86
+ suffix: "%"
87
+ }), /*#__PURE__*/_react.default.createElement(_index2.default, {
88
+ metricKey: "lowscore",
89
+ label: (0, _formatMessage.default)('low score'),
90
+ value: (_quizAnalysis$scores2 = quizAnalysis.scores) === null || _quizAnalysis$scores2 === void 0 ? void 0 : _quizAnalysis$scores2.min_percentage,
91
+ suffix: "%"
92
+ }), /*#__PURE__*/_react.default.createElement(_index2.default, {
93
+ metricKey: "meanscore",
94
+ label: (0, _formatMessage.default)('mean score'),
95
+ value: (_quizAnalysis$scores3 = quizAnalysis.scores) === null || _quizAnalysis$scores3 === void 0 ? void 0 : _quizAnalysis$scores3.mean_percentage,
96
+ suffix: "%"
97
+ }));
98
+ };
99
+
100
+ return _this;
56
101
  }
57
102
 
58
103
  (0, _createClass2.default)(NewQuizAndItemAnalysisReportCard, [{
59
- key: "render",
60
- value: function render() {
104
+ key: "renderContent",
105
+ value: function renderContent() {
61
106
  var _this$props = this.props,
62
107
  name = _this$props.name,
63
- href = _this$props.href;
64
- return /*#__PURE__*/_react.default.createElement(_index.default, {
65
- className: styles.card
66
- }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
67
- direction: "column"
68
- }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, null, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
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, {
69
111
  size: "medium",
70
112
  weight: "bold"
71
- }, name)), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex.Item, {
72
- align: "end"
73
- }, /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
113
+ }, name), this.renderMetrics(), /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
114
+ direction: "row",
115
+ justifyItems: "space-between"
116
+ }, /*#__PURE__*/_react.default.createElement("div", {
117
+ className: styles.dateContainer
118
+ }, /*#__PURE__*/_react.default.createElement(_index3.AnalysisUpdateDate, {
119
+ date: quizAnalysis.created_timestamp,
120
+ multiline: true
121
+ })), /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
74
122
  href: href
75
123
  }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
76
124
  size: "small"
77
- }, (0, _formatMessage.default)('View Report'))))));
125
+ }, (0, _formatMessage.default)('View Report')))));
126
+ }
127
+ }, {
128
+ key: "render",
129
+ value: function render() {
130
+ return /*#__PURE__*/_react.default.createElement(_index.default, {
131
+ className: styles.card
132
+ }, this.props.quizAnalysis ? this.renderContent() : _ref);
78
133
  }
79
134
  }]);
80
135
  NewQuizAndItemAnalysisReportCard.displayName = "NewQuizAndItemAnalysisReportCard";
81
136
  return NewQuizAndItemAnalysisReportCard;
82
137
  }(_react.Component), _class2.propTypes = {
83
138
  name: _propTypes.default.node,
84
- href: _propTypes.default.string
139
+ href: _propTypes.default.string,
140
+ quizAnalysis: _propTypes2.quizAnalysisPropType
85
141
  }, _class2.defaultProps = {
86
142
  name: void 0,
87
- href: void 0
143
+ href: void 0,
144
+ quizAnalysis: {}
88
145
  }, _temp)) || _class);
89
146
  exports.NewQuizAndItemAnalysisReportCard = NewQuizAndItemAnalysisReportCard;
90
147
  var _default = NewQuizAndItemAnalysisReportCard;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = generator;
7
+
8
+ function generator(_ref) {
9
+ var spacing = _ref.spacing,
10
+ borders = _ref.borders;
11
+ return {
12
+ metricsPadding: spacing.medium,
13
+ cardWidth: '16rem',
14
+ cardPadding: spacing.medium,
15
+ cardMargin: spacing.xSmall,
16
+ cardBoxShadow: '1px 1px 3px 0 #ddd',
17
+ cardBorderRadius: borders.radiusMedium
18
+ };
19
+ }
@@ -35,11 +35,9 @@ var _index2 = _interopRequireDefault(require("./NewQuizAnalysis/index.js"));
35
35
 
36
36
  var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/es/format-message"));
37
37
 
38
- var _uiText = require("@instructure/ui-text");
39
-
40
38
  var _uiFlex = require("@instructure/ui-flex");
41
39
 
42
- var _formatTimespan = require("../../../../common/util/formatTimespan.js");
40
+ var _index3 = require("./AnalysisUpdateDate/index.js");
43
41
 
44
42
  var _ref3 = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
45
43
 
@@ -126,18 +124,15 @@ var NewQuizAndItemAnalysis = /*#__PURE__*/function (_Component) {
126
124
  var _this$state = this.state,
127
125
  quizAnalysis = _this$state.quizAnalysis,
128
126
  itemAnalyses = _this$state.itemAnalyses;
129
- var _this$context = this.context,
130
- timezone = _this$context.timezone,
131
- locale = _this$context.locale;
132
127
  return /*#__PURE__*/_react.default.createElement("div", {
133
128
  className: "fs-mask"
134
129
  }, /*#__PURE__*/_react.default.createElement(_uiFlex.Flex, {
135
130
  justifyItems: "end",
136
131
  width: "82.5rem",
137
132
  margin: "auto"
138
- }, /*#__PURE__*/_react.default.createElement(_uiText.Text, {
139
- size: "x-small"
140
- }, /*#__PURE__*/_react.default.createElement("b", null, (0, _formatMessage.default)('Data Last Updated:')), "\xA0", (0, _formatTimespan.displayDateAndTimeInTimezone)(quizAnalysis.created_timestamp, timezone, locale))), /*#__PURE__*/_react.default.createElement(_index2.default, {
133
+ }, /*#__PURE__*/_react.default.createElement(_index3.AnalysisUpdateDate, {
134
+ date: quizAnalysis.created_timestamp
135
+ })), /*#__PURE__*/_react.default.createElement(_index2.default, {
141
136
  quizAnalysis: quizAnalysis
142
137
  }), /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
143
138
  level: "h3",
@@ -168,10 +163,6 @@ var NewQuizAndItemAnalysis = /*#__PURE__*/function (_Component) {
168
163
  }(_react.Component);
169
164
 
170
165
  exports.NewQuizAndItemAnalysis = NewQuizAndItemAnalysis;
171
- NewQuizAndItemAnalysis.contextTypes = {
172
- timezone: _propTypes.default.string,
173
- locale: _propTypes.default.string
174
- };
175
166
  NewQuizAndItemAnalysis.propTypes = {
176
167
  activeQuizId: _propTypes.default.string.isRequired,
177
168
  getQuizAnalysis: _propTypes.default.func.isRequired,
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.quizAnalysisPropType = void 0;
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var quizAnalysisPropType = _propTypes.default.shape({
13
+ created_timestamp: _propTypes.default.string.isRequired,
14
+ metadata: _propTypes.default.shape({
15
+ quiz_title: _propTypes.default.string
16
+ }).isRequired,
17
+ scores: _propTypes.default.shape({
18
+ decile_distribution: _propTypes.default.arrayOf(_propTypes.default.number),
19
+ cronbachs_alpha: _propTypes.default.number,
20
+ stddev: _propTypes.default.number,
21
+ median_percentage: _propTypes.default.number,
22
+ max_percentage: _propTypes.default.number,
23
+ min_percentage: _propTypes.default.number,
24
+ mean_percentage: _propTypes.default.number
25
+ }).isRequired,
26
+ attempts: _propTypes.default.shape({
27
+ mean_elapsed_sec: _propTypes.default.number,
28
+ students_completed: _propTypes.default.number,
29
+ students_not_finished: _propTypes.default.number,
30
+ students_without_attempt: _propTypes.default.number,
31
+ average_attempts: _propTypes.default.number
32
+ }).isRequired
33
+ }).isRequired;
34
+
35
+ exports.quizAnalysisPropType = quizAnalysisPropType;
@@ -34,7 +34,7 @@ var _theme = _interopRequireDefault(require("./theme.js"));
34
34
  var _dec, _class, _class2, _temp;
35
35
 
36
36
  var styles = {
37
- componentId: 'cNnNG',
37
+ componentId: 'eRzKS',
38
38
  template: function template(theme) {
39
39
  return "\n\n.eRzKS_fbIL{border-radius:".concat(theme.cardBorderRadius || 'inherit', ";box-shadow:").concat(theme.cardBoxShadow || 'inherit', ";display:inline-flex;flex-direction:column;height:").concat(theme.cardHeight || 'inherit', ";margin:").concat(theme.cardMargin || 'inherit', ";padding:").concat(theme.cardPadding || 'inherit', ";width:").concat(theme.cardWidth || 'inherit', "}\n\n.eRzKS_ebWM{padding-top:").concat(theme.detailPadding || 'inherit', "}");
40
40
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "17.60.0",
3
+ "version": "17.60.1-rc.1+8649b9f0a",
4
4
  "license": "MIT",
5
5
  "description": "The Quiz React SDK by Instructure Inc.",
6
6
  "author": "Instructure, Inc. Engineering and Product Design",
@@ -41,11 +41,11 @@
41
41
  ],
42
42
  "dependencies": {
43
43
  "@instructure/outcomes-ui": "^2.1.8",
44
- "@instructure/quiz-common": "^17.60.0",
45
- "@instructure/quiz-i18n": "^17.60.0",
46
- "@instructure/quiz-interactions": "^17.60.0",
47
- "@instructure/quiz-number-input": "^17.60.0",
48
- "@instructure/quiz-rce": "^17.60.0",
44
+ "@instructure/quiz-common": "17.60.1-rc.1+8649b9f0a",
45
+ "@instructure/quiz-i18n": "17.60.1-rc.1+8649b9f0a",
46
+ "@instructure/quiz-interactions": "17.60.1-rc.1+8649b9f0a",
47
+ "@instructure/quiz-number-input": "17.60.1-rc.1+8649b9f0a",
48
+ "@instructure/quiz-rce": "17.60.1-rc.1+8649b9f0a",
49
49
  "@instructure/ui-a11y-content": "^7.20.0",
50
50
  "@instructure/ui-alerts": "^7.20.0",
51
51
  "@instructure/ui-avatar": "^7.20.0",
@@ -106,7 +106,7 @@
106
106
  "eventemitter3": "^3.1.0",
107
107
  "humps": "^2.0.0",
108
108
  "immutable": "^3.8.1",
109
- "instructure-validations": "^17.60.0",
109
+ "instructure-validations": "17.60.1-rc.1+8649b9f0a",
110
110
  "ipaddr.js": "^1.5.4",
111
111
  "isomorphic-fetch": "^2.2.0",
112
112
  "isuuid": "^0.1.0",
@@ -138,7 +138,7 @@
138
138
  "uuid": "^3.2.1"
139
139
  },
140
140
  "devDependencies": {
141
- "@instructure/quiz-scripts": "^17.60.0",
141
+ "@instructure/quiz-scripts": "17.60.0",
142
142
  "@instructure/ui-axe-check": "^7.20.0",
143
143
  "@instructure/ui-babel-preset": "^7.20.0",
144
144
  "@instructure/ui-karma-config": "^7.20.0",
@@ -157,7 +157,7 @@
157
157
  "intl": "^1.2.4",
158
158
  "jquery": "^2.2.3",
159
159
  "most-subject": "^5.3.0",
160
- "quiz-presets": "^17.60.0",
160
+ "quiz-presets": "17.60.1-rc.1+8649b9f0a",
161
161
  "react": "^16.8.6",
162
162
  "react-addons-test-utils": "^15.6.2",
163
163
  "react-dom": "^16.8.6",
@@ -173,5 +173,5 @@
173
173
  "publishConfig": {
174
174
  "access": "public"
175
175
  },
176
- "gitHead": "f408821749d7af833bd66ad27ebb8d3f8e4b9ed3"
176
+ "gitHead": "8649b9f0a0d7ce1333bf3ccf3b9be06f4034d4dc"
177
177
  }