@instructure/quiz-core 17.62.1-rc.0 → 17.62.1-rc.2

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 (29) hide show
  1. package/es/banks/api/banks.js +15 -0
  2. package/es/banks/api/copyingBanksPoller.js +99 -0
  3. package/es/banks/components/Banks/presenter.js +1 -2
  4. package/es/banks/components/BanksList/index.js +3 -1
  5. package/es/banks/components/BanksList/presenter.js +36 -13
  6. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/ChoiceInfo/index.js +2 -0
  7. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/ChoiceInfo/presenter.js +90 -0
  8. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/index.js +2 -0
  9. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/presenter.js +109 -0
  10. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/index.js +2 -0
  11. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/presenter.js +62 -0
  12. package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/theme.js +8 -0
  13. package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +32 -17
  14. package/es/reporting/components/resources/NewQuizAndItemAnalysis/propTypes.js +13 -0
  15. package/lib/banks/api/banks.js +19 -1
  16. package/lib/banks/api/copyingBanksPoller.js +116 -0
  17. package/lib/banks/components/Banks/presenter.js +1 -2
  18. package/lib/banks/components/BanksList/index.js +4 -1
  19. package/lib/banks/components/BanksList/presenter.js +36 -13
  20. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/ChoiceInfo/index.js +11 -0
  21. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/ChoiceInfo/presenter.js +110 -0
  22. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/index.js +11 -0
  23. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/presenter.js +132 -0
  24. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/index.js +11 -0
  25. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/presenter.js +83 -0
  26. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/theme.js +15 -0
  27. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +33 -17
  28. package/lib/reporting/components/resources/NewQuizAndItemAnalysis/propTypes.js +18 -2
  29. package/package.json +9 -9
@@ -77,6 +77,21 @@ export var getBank = function getBank(bankId) {
77
77
  });
78
78
  };
79
79
  };
80
+ export var getSpecificBanks = function getSpecificBanks() {
81
+ var bankIds = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
82
+ return function (dispatch, getState) {
83
+ var fetcher = new Fetcher({
84
+ onError: handleError(dispatch, t('Failed to fetch banks.'))
85
+ });
86
+ var param = {
87
+ ids: bankIds
88
+ };
89
+ return fetcher.get("".concat(banksApiEndpoint, "/batch_show"), param).then(function (response) {
90
+ dispatch(handleBanksResponse(response));
91
+ return response;
92
+ });
93
+ };
94
+ };
80
95
  export var createBank = function createBank(newBank, shareWithCourseUuid) {
81
96
  return function (dispatch, getState) {
82
97
  var newBankData = JSON.stringify({
@@ -0,0 +1,99 @@
1
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import t from '@instructure/quiz-i18n/es/format-message';
4
+ import { addError, addSuccess } from "../../common/actions/alerts.js";
5
+ import { getSpecificBanks } from "./banks.js";
6
+ var pollingBanks = [];
7
+ var currentlyPolling = false;
8
+ export var addToPolling = function addToPolling(bankId, bankTitle) {
9
+ var getSpecificBanksFn = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : getSpecificBanks;
10
+ return function (dispatch) {
11
+ pollingBanks.push({
12
+ id: bankId,
13
+ title: bankTitle
14
+ });
15
+
16
+ if (!currentlyPolling) {
17
+ currentlyPolling = true;
18
+ handlePollingBanks(dispatch, getSpecificBanksFn);
19
+ }
20
+ };
21
+ };
22
+
23
+ var handlePollingBanks = /*#__PURE__*/function () {
24
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(dispatch) {
25
+ var getSpecificBanksFn,
26
+ updatedPollingBanks,
27
+ updatedPollingBankIds,
28
+ finishedCopying,
29
+ finishedCopyingIds,
30
+ _args = arguments;
31
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
32
+ while (1) {
33
+ switch (_context.prev = _context.next) {
34
+ case 0:
35
+ getSpecificBanksFn = _args.length > 1 && _args[1] !== void 0 ? _args[1] : getSpecificBanks;
36
+ _context.next = 3;
37
+ return getSpecificBanksFn(pollingBanks.map(function (bank) {
38
+ return bank.id;
39
+ }))(dispatch);
40
+
41
+ case 3:
42
+ updatedPollingBanks = _context.sent;
43
+ updatedPollingBankIds = updatedPollingBanks.map(function (updatedBank) {
44
+ return updatedBank.id;
45
+ }); // banks that now have status 'waiting' have finished successfully
46
+ // banks that are no longer in the updated list but were in the previous list have
47
+ // failed to copy and therefore were archived
48
+
49
+ finishedCopying = updatedPollingBanks.filter(function (bank) {
50
+ return bank.status === 'waiting';
51
+ }).concat(pollingBanks.filter(function (prevBank) {
52
+ return !updatedPollingBankIds.includes(prevBank.id);
53
+ }));
54
+ finishedCopying.forEach(function (bank) {
55
+ var bankInfo = updatedPollingBanks.find(function (info) {
56
+ return info.id == bank.id;
57
+ });
58
+
59
+ if ((bankInfo === null || bankInfo === void 0 ? void 0 : bankInfo.status) === 'waiting') {
60
+ dispatch(addSuccess(t('Created "{name}" successfully! Duplicate can be seen in \'All Banks\' filter.', {
61
+ name: bank.title
62
+ })));
63
+ } else if (!bankInfo) {
64
+ dispatch(addError(t('Failed to create "{name}". Please try again.', {
65
+ name: bank.title
66
+ })));
67
+ }
68
+ });
69
+ finishedCopyingIds = finishedCopying.map(function (bank) {
70
+ return bank.id;
71
+ });
72
+ removeFinishedCopies(finishedCopyingIds);
73
+
74
+ if (pollingBanks.length > 0) {
75
+ setTimeout(function () {
76
+ handlePollingBanks(dispatch);
77
+ }, 3000);
78
+ } else {
79
+ currentlyPolling = false;
80
+ }
81
+
82
+ case 10:
83
+ case "end":
84
+ return _context.stop();
85
+ }
86
+ }
87
+ }, _callee);
88
+ }));
89
+
90
+ return function handlePollingBanks(_x) {
91
+ return _ref.apply(this, arguments);
92
+ };
93
+ }();
94
+
95
+ var removeFinishedCopies = function removeFinishedCopies(finishedCopyingIds) {
96
+ pollingBanks = pollingBanks.filter(function (bank) {
97
+ return !finishedCopyingIds.includes(bank.id);
98
+ });
99
+ };
@@ -174,8 +174,7 @@ export var Banks = (_dec = themeable(theme, styles), _dec(_class = (_temp = _cla
174
174
  minChars: _this.props.minChars,
175
175
  navigateToBank: _this.props.navigateToBank,
176
176
  onShare: _this.props.onShare,
177
- recordIds: recordIds,
178
- redirectAllBanks: _this.handleBankCreated
177
+ recordIds: recordIds
179
178
  });
180
179
  };
181
180
 
@@ -6,6 +6,7 @@ import { openModal, withConfirm } from "../../../common/actions/modal.js";
6
6
  import { deleteBank, createBankCloneJob } from "../../api/banks.js";
7
7
  import { featureOn } from "../../../common/util/featureCheck.js";
8
8
  import { addInfo } from "../../../common/actions/alerts.js";
9
+ import { addToPolling } from "../../api/copyingBanksPoller.js";
9
10
  export function mapStateToProps(state, props) {
10
11
  return {
11
12
  appContainer: state.getIn(['ui', 'appContainer']),
@@ -20,5 +21,6 @@ export default connect(mapStateToProps, {
20
21
  deleteBank: deleteBank,
21
22
  withConfirm: withConfirm,
22
23
  createBankCloneJob: createBankCloneJob,
23
- addInfo: addInfo
24
+ addInfo: addInfo,
25
+ addToPolling: addToPolling
24
26
  })(BanksList);
@@ -44,7 +44,7 @@ var styles = {
44
44
  };
45
45
  import theme from "./theme.js";
46
46
 
47
- var _ref3 = /*#__PURE__*/React.createElement(Spinner, {
47
+ var _ref4 = /*#__PURE__*/React.createElement(Spinner, {
48
48
  renderTitle: "Loading",
49
49
  size: "x-small"
50
50
  });
@@ -144,18 +144,41 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
144
144
 
145
145
  _this.openDuplicateBankModal = function (bank) {
146
146
  return function () {
147
- _this.createCloneJob = function () {
148
- _this.props.createBankCloneJob(bank.id, _this.props.currentUser.uuid);
147
+ var createCloneJob = /*#__PURE__*/function () {
148
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
149
+ var cloneJob;
150
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
151
+ while (1) {
152
+ switch (_context2.prev = _context2.next) {
153
+ case 0:
154
+ _context2.next = 2;
155
+ return _this.props.createBankCloneJob(bank.id, _this.props.currentUser.uuid);
156
+
157
+ case 2:
158
+ cloneJob = _context2.sent;
159
+
160
+ _this.props.addToPolling(cloneJob.cloned_bank_id, t('{name} Copy', {
161
+ name: bank.title
162
+ }));
163
+
164
+ _this.props.addInfo(t('Creating "{name} Copy". Duplicate will appear in \'All Banks\' filter.', {
165
+ name: bank.title
166
+ }));
167
+
168
+ case 5:
169
+ case "end":
170
+ return _context2.stop();
171
+ }
172
+ }
173
+ }, _callee2);
174
+ }));
149
175
 
150
- _this.props.addInfo( /*#__PURE__*/React.createElement(React.Fragment, null, t('Creating "{name} Copy". Duplicate will appear in ', {
151
- name: bank.title
152
- }), /*#__PURE__*/React.createElement(Link, {
153
- key: bank.id,
154
- onClick: _this.props.redirectAllBanks
155
- }, t('\'All Banks\'')), t(' filter.')));
156
- };
176
+ return function createCloneJob() {
177
+ return _ref3.apply(this, arguments);
178
+ };
179
+ }();
157
180
 
158
- _this.props.withConfirm(partial(_this.createCloneJob), {
181
+ _this.props.withConfirm(partial(createCloneJob), {
159
182
  text: t('Are you sure you want to duplicate this item bank?'),
160
183
  title: t('Duplicate Bank'),
161
184
  continueText: t('Duplicate'),
@@ -293,7 +316,7 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
293
316
  if (bank.status == 'copying') {
294
317
  return /*#__PURE__*/React.createElement("div", {
295
318
  className: styles.bankOptions
296
- }, _ref3);
319
+ }, _ref4);
297
320
  } else {
298
321
  return /*#__PURE__*/React.createElement("div", {
299
322
  className: styles.bankOptions
@@ -392,6 +415,7 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
392
415
  return BanksList;
393
416
  }(withI18nSupport(Component)), _class2.propTypes = {
394
417
  addInfo: PropTypes.func.isRequired,
418
+ addToPolling: PropTypes.func.isRequired,
395
419
  appContainer: CustomPropTypes.selectors.isRequired,
396
420
  banks: ImmutablePropTypes.list.isRequired,
397
421
  createBankCloneJob: PropTypes.func.isRequired,
@@ -414,7 +438,6 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
414
438
  navigateToBank: PropTypes.func.isRequired,
415
439
  onShare: PropTypes.func,
416
440
  openModal: PropTypes.func.isRequired,
417
- redirectAllBanks: PropTypes.func.isRequired,
418
441
  withConfirm: PropTypes.func.isRequired,
419
442
  locale: PropTypes.string,
420
443
  timezone: PropTypes.string
@@ -0,0 +1,2 @@
1
+ import { ChoiceInfo } from "./presenter.js";
2
+ export default ChoiceInfo;
@@ -0,0 +1,90 @@
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 t from '@instructure/quiz-i18n/es/format-message';
7
+ import { Table } from '@instructure/ui-table';
8
+ import Row from "../Row/index.js";
9
+ import PropTypes from 'prop-types';
10
+
11
+ var _ref = /*#__PURE__*/React.createElement(Table.ColHeader, {
12
+ width: "46px"
13
+ });
14
+
15
+ export var ChoiceInfo = /*#__PURE__*/function (_Component) {
16
+ _inherits(ChoiceInfo, _Component);
17
+
18
+ var _super = _createSuper(ChoiceInfo);
19
+
20
+ function ChoiceInfo() {
21
+ var _this;
22
+
23
+ _classCallCheck(this, ChoiceInfo);
24
+
25
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
26
+ args[_key] = arguments[_key];
27
+ }
28
+
29
+ _this = _super.call.apply(_super, [this].concat(args));
30
+
31
+ _this.renderRow = function (choice, choiceIndex) {
32
+ return /*#__PURE__*/React.createElement(Row, {
33
+ key: choiceIndex,
34
+ choice: choice,
35
+ choiceIndex: choiceIndex
36
+ });
37
+ };
38
+
39
+ _this.renderNoAnswer = function (payload, choiceIndex) {
40
+ var asChoice = {
41
+ body: t('(No answer)'),
42
+ percentage: payload.percentage,
43
+ correct: false,
44
+ count: payload.count
45
+ };
46
+ return /*#__PURE__*/React.createElement(Row, {
47
+ key: choiceIndex,
48
+ choice: asChoice,
49
+ choiceIndex: choiceIndex
50
+ });
51
+ };
52
+
53
+ return _this;
54
+ }
55
+
56
+ _createClass(ChoiceInfo, [{
57
+ key: "render",
58
+ value: function render() {
59
+ var _this$props = this.props,
60
+ choices = _this$props.choices,
61
+ noAnswer = _this$props.noAnswer;
62
+ var numberOfChoices = choices.length;
63
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Table, {
64
+ caption: t('Answer Frequency Summary')
65
+ }, /*#__PURE__*/React.createElement(Table.Head, null, /*#__PURE__*/React.createElement(Table.Row, null, _ref, /*#__PURE__*/React.createElement(Table.ColHeader, {
66
+ height: "47px"
67
+ }, t('Answer')), /*#__PURE__*/React.createElement(Table.ColHeader, {
68
+ height: "47px"
69
+ }, t('Respondents')), /*#__PURE__*/React.createElement(Table.ColHeader, {
70
+ height: "47px",
71
+ textAlign: "center"
72
+ }, t('%')))), /*#__PURE__*/React.createElement(Table.Body, null, choices.map(this.renderRow), this.renderNoAnswer(noAnswer, numberOfChoices))));
73
+ }
74
+ }]);
75
+
76
+ ChoiceInfo.displayName = "ChoiceInfo";
77
+ return ChoiceInfo;
78
+ }(Component);
79
+ ChoiceInfo.propTypes = {
80
+ choices: PropTypes.arrayOf(PropTypes.shape({
81
+ body: PropTypes.string,
82
+ correct: PropTypes.bool,
83
+ count: PropTypes.number,
84
+ percentage: PropTypes.number
85
+ })),
86
+ noAnswer: PropTypes.shape({
87
+ count: PropTypes.number,
88
+ percentage: PropTypes.number
89
+ })
90
+ }.isRequired;
@@ -0,0 +1,2 @@
1
+ import { Row } from "./presenter.js";
2
+ export default Row;
@@ -0,0 +1,109 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
3
+ import _inherits from "@babel/runtime/helpers/esm/inherits";
4
+ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
5
+
6
+ var _dec, _class, _class2, _temp;
7
+
8
+ import React, { Component } from 'react';
9
+ import { Table } from '@instructure/ui-table';
10
+ import { themeable } from '@instructure/ui-themeable';
11
+ import theme from "../theme.js";
12
+ var styles = {
13
+ componentId: 'fvXKN',
14
+ template: function template(theme) {
15
+ return "\n\n.fvXKN_rMrG{display:flex;flex-basis:100%;flex-direction:column;padding-bottom:".concat(theme.tableBottomPadding || 'inherit', "}\n\n.fvXKN_cvRx{align-items:center;display:flex;height:48px;justify-content:center;width:46px}\n\n.fvXKN_EKAb{background-color:").concat(theme.colorGreen || 'inherit', ";border-radius:4px 0 0 4px}\n\n.fvXKN_EKAb svg{filter:invert(100%) sepia(100%) saturate(0%) hue-rotate(288deg) brightness(102%) contrast(102%)}\n\n.fvXKN_tnta{border-color:").concat(theme.colorGreen || 'inherit', ";border-style:solid;border-width:2px 0;padding:").concat(theme.cellPadding || 'inherit', "}\n\n.fvXKN_fvqY{border-radius:0 4px 4px 0;border-width:2px 2px 2px 0}");
16
+ },
17
+ 'tableWrapper': 'fvXKN_rMrG',
18
+ 'iconWrapper': 'fvXKN_cvRx',
19
+ 'iconCorrect': 'fvXKN_EKAb',
20
+ 'correctRowBorder': 'fvXKN_tnta',
21
+ 'correctRowBorderRadius': 'fvXKN_fvqY'
22
+ };
23
+ import PropTypes from 'prop-types';
24
+ import { IconXSolid, IconCheckSolid } from '@instructure/ui-icons';
25
+ import classNames from 'classnames';
26
+ import { extractTextFromHtml } from '@instructure/quiz-interactions';
27
+
28
+ var _ref = /*#__PURE__*/React.createElement(IconCheckSolid, null);
29
+
30
+ var _ref2 = /*#__PURE__*/React.createElement(IconXSolid, null);
31
+
32
+ export var Row = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
33
+ _inherits(Row, _Component);
34
+
35
+ var _super = _createSuper(Row);
36
+
37
+ function Row() {
38
+ var _this;
39
+
40
+ _classCallCheck(this, Row);
41
+
42
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
43
+ args[_key] = arguments[_key];
44
+ }
45
+
46
+ _this = _super.call.apply(_super, [this].concat(args));
47
+
48
+ _this.renderIcon = function (correct) {
49
+ var className = classNames(styles.iconWrapper, _defineProperty({}, styles.iconCorrect, correct));
50
+ return /*#__PURE__*/React.createElement("div", {
51
+ className: className
52
+ }, correct ? _ref : _ref2);
53
+ };
54
+
55
+ _this.renderMiddleCell = function (correct, content) {
56
+ var className = classNames(_defineProperty({}, styles.correctRowBorder, correct));
57
+ return /*#__PURE__*/React.createElement("div", {
58
+ className: className
59
+ }, content);
60
+ };
61
+
62
+ _this.renderLastCell = function (correct, content) {
63
+ var _classNames3;
64
+
65
+ var className = classNames((_classNames3 = {}, _defineProperty(_classNames3, styles.correctRowBorder, correct), _defineProperty(_classNames3, styles.correctRowBorderRadius, correct), _classNames3));
66
+ return /*#__PURE__*/React.createElement("div", {
67
+ className: className
68
+ }, content);
69
+ };
70
+
71
+ _this.render = function () {
72
+ var correct = _this.props.choice.correct;
73
+ var cellPadding = correct ? '0' : _this.theme.cellPadding;
74
+ return /*#__PURE__*/React.createElement(Table.Row, {
75
+ key: _this.props.choiceIndex
76
+ }, /*#__PURE__*/React.createElement(Table.Cell, {
77
+ theme: {
78
+ padding: '0px'
79
+ }
80
+ }, _this.renderIcon(correct)), /*#__PURE__*/React.createElement(Table.RowHeader, {
81
+ theme: {
82
+ padding: cellPadding
83
+ },
84
+ className: styles.tableBody
85
+ }, _this.renderMiddleCell(correct, extractTextFromHtml(_this.props.choice.body))), /*#__PURE__*/React.createElement(Table.Cell, {
86
+ theme: {
87
+ padding: cellPadding
88
+ }
89
+ }, _this.renderMiddleCell(correct, _this.props.choice.count)), /*#__PURE__*/React.createElement(Table.Cell, {
90
+ theme: {
91
+ padding: cellPadding
92
+ },
93
+ textAlign: "center"
94
+ }, _this.renderLastCell(correct, "".concat(_this.props.choice.percentage, "%"))));
95
+ };
96
+
97
+ return _this;
98
+ }
99
+
100
+ return Row;
101
+ }(Component), _class2.propTypes = {
102
+ choice: PropTypes.shape({
103
+ body: PropTypes.string,
104
+ correct: PropTypes.bool,
105
+ count: PropTypes.number,
106
+ percentage: PropTypes.number
107
+ }),
108
+ choiceIndex: PropTypes.number
109
+ }.isRequired, _temp)) || _class);
@@ -0,0 +1,2 @@
1
+ import { AnswerSummaryTable } from "./presenter.js";
2
+ export default AnswerSummaryTable;
@@ -0,0 +1,62 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
+ import _inherits from "@babel/runtime/helpers/esm/inherits";
3
+ import _createSuper from "@babel/runtime/helpers/esm/createSuper";
4
+
5
+ var _dec, _class, _class2, _temp;
6
+
7
+ import React, { Component } from 'react';
8
+ import { Heading } from '@instructure/ui-heading';
9
+ import { themeable } from '@instructure/ui-themeable';
10
+ import theme from "./theme.js";
11
+ var styles = {
12
+ componentId: 'fvXKN',
13
+ template: function template(theme) {
14
+ return "\n\n.fvXKN_rMrG{display:flex;flex-basis:100%;flex-direction:column;padding-bottom:".concat(theme.tableBottomPadding || 'inherit', "}\n\n.fvXKN_cvRx{align-items:center;display:flex;height:48px;justify-content:center;width:46px}\n\n.fvXKN_EKAb{background-color:").concat(theme.colorGreen || 'inherit', ";border-radius:4px 0 0 4px}\n\n.fvXKN_EKAb svg{filter:invert(100%) sepia(100%) saturate(0%) hue-rotate(288deg) brightness(102%) contrast(102%)}\n\n.fvXKN_tnta{border-color:").concat(theme.colorGreen || 'inherit', ";border-style:solid;border-width:2px 0;padding:").concat(theme.cellPadding || 'inherit', "}\n\n.fvXKN_fvqY{border-radius:0 4px 4px 0;border-width:2px 2px 2px 0}");
15
+ },
16
+ 'tableWrapper': 'fvXKN_rMrG',
17
+ 'iconWrapper': 'fvXKN_cvRx',
18
+ 'iconCorrect': 'fvXKN_EKAb',
19
+ 'correctRowBorder': 'fvXKN_tnta',
20
+ 'correctRowBorderRadius': 'fvXKN_fvqY'
21
+ };
22
+ import { ChoiceInfo } from "./ChoiceInfo/presenter.js";
23
+ import t from '@instructure/quiz-i18n/es/format-message';
24
+ import { answerSummaryPropType } from "../propTypes.js";
25
+ export var AnswerSummaryTable = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
26
+ _inherits(AnswerSummaryTable, _Component);
27
+
28
+ var _super = _createSuper(AnswerSummaryTable);
29
+
30
+ function AnswerSummaryTable() {
31
+ var _this;
32
+
33
+ _classCallCheck(this, AnswerSummaryTable);
34
+
35
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
36
+ args[_key] = arguments[_key];
37
+ }
38
+
39
+ _this = _super.call.apply(_super, [this].concat(args));
40
+
41
+ _this.render = function () {
42
+ var _this$props$answerSum = _this.props.answerSummary,
43
+ choices = _this$props$answerSum.choices,
44
+ no_answer = _this$props$answerSum.no_answer;
45
+ return /*#__PURE__*/React.createElement("div", {
46
+ className: styles.tableWrapper
47
+ }, /*#__PURE__*/React.createElement(Heading, {
48
+ margin: "large 0 small 0",
49
+ level: "h3"
50
+ }, t('Answer Frequency Summary')), /*#__PURE__*/React.createElement(ChoiceInfo, {
51
+ choices: choices,
52
+ noAnswer: no_answer
53
+ }));
54
+ };
55
+
56
+ return _this;
57
+ }
58
+
59
+ return AnswerSummaryTable;
60
+ }(Component), _class2.propTypes = {
61
+ answerSummary: answerSummaryPropType
62
+ }.isRequired, _temp)) || _class);
@@ -0,0 +1,8 @@
1
+ export default function generator(_ref) {
2
+ var spacing = _ref.spacing;
3
+ return {
4
+ colorGreen: '#0b874b',
5
+ cellPadding: ' 0.75rem 0.75rem',
6
+ tableBottomPadding: spacing.medium
7
+ };
8
+ }
@@ -9,24 +9,27 @@ var _dec, _class, _class2, _temp;
9
9
  import { Heading } from '@instructure/ui-heading';
10
10
  import React, { Component } from 'react';
11
11
  var styles = {
12
- componentId: 'eLWCD',
12
+ componentId: 'bCOJX',
13
13
  template: function template(theme) {
14
- return "\n\n.eLWCD_eDnN{display:flex;flex-basis:45%;flex-direction:column;overflow:hidden}\n\n.eLWCD_eKXQ{padding:".concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.eLWCD_eoBe{font-size:").concat(theme.metricNumberContextFontSize || 'inherit', ";font-weight:").concat(theme.metricNumberContextFontWeight || 'inherit', "}\n\n.eLWCD_eIAv{display:flex;position:relative}\n\n.eLWCD_ePHw{flex-basis:91%;overflow:hidden;padding-bottom:10px;text-overflow:ellipsis;white-space:nowrap}\n\n.eLWCD_dzsH{overflow:visible;text-overflow:unset;white-space:normal}\n\n.eLWCD_byoJ{position:absolute;right:7px;top:-8px}\n\n.eLWCD_evBt{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}\n\n.eLWCD_pAQb{display:flex;flex-direction:column;height:60px}\n\n.eLWCD_zefc{display:flex;flex-basis:55%;justify-content:flex-end}\n\n.eLWCD_dPzc{flex-direction:column}\n\n.eLWCD_dPzc,.eLWCD_dzph{display:flex;flex-basis:100%}\n\n.eLWCD_dzph{align-items:flex-start;box-sizing:border-box;column-gap:5px;justify-content:space-between;padding:0 30px 0 25px}\n\n.eLWCD_eobd{padding-top:1rem}\n\n.eLWCD_NpIG{position:absolute;right:").concat(theme.viewPadding || 'inherit', ";top:").concat(theme.viewPadding || 'inherit', "}\n\n@media screen and (--tabletBreakPoint){.eLWCD_zefc{flex-basis:100%;justify-content:flex-start}.eLWCD_ePHw{flex-basis:94%}.eLWCD_eDnN{flex-basis:100%}.eLWCD_dzph{padding:0}.eLWCD_eDnN h3{padding-right:30px}.eLWCD_NpIG{right:17px}.eLWCD_eIAv{margin-bottom:20px}.eLWCD_byoJ{right:-7px}.eLWCD_dzph{flex-wrap:wrap}}");
14
+ return "\n\n.bCOJX_eDnN{display:flex;flex-basis:45%;flex-direction:column;overflow:hidden}\n\n.bCOJX_eKXQ{padding:".concat(theme.cardWrapperPadding || 'inherit', ";position:relative}\n\n.bCOJX_eoBe{font-size:").concat(theme.metricNumberContextFontSize || 'inherit', ";font-weight:").concat(theme.metricNumberContextFontWeight || 'inherit', "}\n\n.bCOJX_eIAv{display:flex;position:relative}\n\n.bCOJX_ePHw{flex-basis:91%;overflow:hidden;padding-bottom:10px;text-overflow:ellipsis;white-space:nowrap}\n\n.bCOJX_dzsH{overflow:visible;text-overflow:unset;white-space:normal}\n\n.bCOJX_byoJ{position:absolute;right:7px;top:-8px}\n\n.bCOJX_evBt{flex-wrap:wrap;justify-content:space-between}\n\n.bCOJX_pAQb,.bCOJX_evBt{display:flex;flex-direction:row}\n\n.bCOJX_zefc{display:flex;flex-basis:55%;justify-content:flex-end}\n\n.bCOJX_dPzc{flex-direction:column}\n\n.bCOJX_dPzc,.bCOJX_dzph{display:flex;flex-basis:100%}\n\n.bCOJX_dzph{align-items:flex-start;box-sizing:border-box;column-gap:5px;justify-content:space-between;padding:0 30px 0 25px}\n\n.bCOJX_eobd{padding-top:1rem}\n\n.bCOJX_NpIG{position:absolute;right:").concat(theme.viewPadding || 'inherit', ";top:").concat(theme.viewPadding || 'inherit', "}\n\n.bCOJX_csiQ{display:flex;flex-basis:100%}\n\n.bCOJX_fjVl{display:flex;flex-basis:50%}\n\n.bCOJX_eZLI{display:flex;flex-basis:40%}\n\n@media screen and (--tabletBreakPoint){.bCOJX_zefc{flex-basis:100%;justify-content:flex-start}.bCOJX_ePHw{flex-basis:94%}.bCOJX_eDnN{flex-basis:100%}.bCOJX_dzph{padding:0}.bCOJX_eDnN h3{padding-right:30px}.bCOJX_NpIG{right:17px}.bCOJX_eIAv{margin-bottom:20px}.bCOJX_byoJ{right:-7px}.bCOJX_dzph{flex-wrap:wrap}}");
15
15
  },
16
- 'heading': 'eLWCD_eDnN',
17
- 'cardWrapper': 'eLWCD_eKXQ',
18
- 'metricNumberContext': 'eLWCD_eoBe',
19
- 'bodyPresentation': 'eLWCD_eIAv',
20
- 'bodyExcerpt': 'eLWCD_ePHw',
21
- 'bodyExcerptExpanded': 'eLWCD_dzsH',
22
- 'bodyExpandButtonWrapper': 'eLWCD_byoJ',
23
- 'innerWrapper': 'eLWCD_evBt',
24
- 'expandableInnerWrapper': 'eLWCD_pAQb',
25
- 'metricsWithControls': 'eLWCD_zefc',
26
- 'metricGroup': 'eLWCD_dPzc',
27
- 'metricsRow': 'eLWCD_dzph',
28
- 'metricsRowPaginated': 'eLWCD_eobd',
29
- 'itemCardToggleButtonWrapper': 'eLWCD_NpIG'
16
+ 'heading': 'bCOJX_eDnN',
17
+ 'cardWrapper': 'bCOJX_eKXQ',
18
+ 'metricNumberContext': 'bCOJX_eoBe',
19
+ 'bodyPresentation': 'bCOJX_eIAv',
20
+ 'bodyExcerpt': 'bCOJX_ePHw',
21
+ 'bodyExcerptExpanded': 'bCOJX_dzsH',
22
+ 'bodyExpandButtonWrapper': 'bCOJX_byoJ',
23
+ 'innerWrapper': 'bCOJX_evBt',
24
+ 'expandableInnerWrapper': 'bCOJX_pAQb',
25
+ 'metricsWithControls': 'bCOJX_zefc',
26
+ 'metricGroup': 'bCOJX_dPzc',
27
+ 'metricsRow': 'bCOJX_dzph',
28
+ 'metricsRowPaginated': 'bCOJX_eobd',
29
+ 'itemCardToggleButtonWrapper': 'bCOJX_NpIG',
30
+ 'expandableContent': 'bCOJX_csiQ',
31
+ 'tableColumn': 'bCOJX_fjVl',
32
+ 'performanceColumn': 'bCOJX_eZLI'
30
33
  };
31
34
  import t from '@instructure/quiz-i18n/es/format-message';
32
35
  import ExpandButton from "../../../../../common/components/shared/ExpandButton/index.js";
@@ -39,7 +42,9 @@ import AnalysisMetric from "../AnalysisMetric/index.js";
39
42
  import AnalysisPopoverMetric from "../AnalysisPopoverMetric/index.js";
40
43
  import classnames from 'classnames';
41
44
  import { interactionTypesNameDictionary } from "../../../../../common/util/interactionTypeMetadata.js";
45
+ import AnswerSummaryTable from "../AnswerSummaryTable/index.js";
42
46
  import { itemAnalysisPropType } from "../propTypes.js";
47
+ var supportedTables = ['choice', 'true-false', 'multi-answer'];
43
48
  export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) {
44
49
  _inherits(NewItemAnalysis, _Component);
45
50
 
@@ -176,11 +181,13 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
176
181
  key: "render",
177
182
  value: function render() {
178
183
  var _this$props$itemAnaly = this.props.itemAnalysis,
184
+ answer_summary = _this$props$itemAnaly.answer_summary,
179
185
  metadata = _this$props$itemAnaly.metadata,
180
186
  scores = _this$props$itemAnaly.scores;
181
187
  var bodyClass = classnames(styles.bodyExcerpt, _defineProperty({}, styles.bodyExcerptExpanded, this.state.bodyExpanded));
182
188
  var headingId = this.buildItemCardHeadingId();
183
189
  var bodyId = this.buildItemCardBodyId();
190
+ var isSupportedTable = supportedTables.includes(metadata.interaction_type);
184
191
  return /*#__PURE__*/React.createElement(Card, {
185
192
  className: styles.cardWrapper
186
193
  }, /*#__PURE__*/React.createElement("div", {
@@ -231,7 +238,15 @@ export var NewItemAnalysis = (_dec = themeable(theme, styles), _dec(_class = (_t
231
238
  popoverDescription: discriminationIndex
232
239
  }), this.renderExpandItemCardButton()), this.state.metricsExpanded && this.renderExpanded()))), this.state.itemExpanded && /*#__PURE__*/React.createElement("div", {
233
240
  className: styles.expandableInnerWrapper
234
- }));
241
+ }, /*#__PURE__*/React.createElement("div", {
242
+ className: styles.expandableContent
243
+ }, /*#__PURE__*/React.createElement("div", {
244
+ className: styles.tableColumn
245
+ }, isSupportedTable && /*#__PURE__*/React.createElement(AnswerSummaryTable, {
246
+ answerSummary: answer_summary
247
+ })), /*#__PURE__*/React.createElement("div", {
248
+ className: styles.performanceColumn
249
+ }))));
235
250
  }
236
251
  }]);
237
252
 
@@ -40,5 +40,18 @@ export var itemAnalysisPropType = PropTypes.shape({
40
40
  pearson_correlation: PropTypes.number,
41
41
  points_possible: PropTypes.number,
42
42
  quartile_distribution: PropTypes.arrayOf(PropTypes.number)
43
+ }),
44
+ answer_summary: answerSummaryPropType
45
+ });
46
+ export var answerSummaryPropType = PropTypes.shape({
47
+ choices: PropTypes.arrayOf(PropTypes.shape({
48
+ body: PropTypes.string,
49
+ correct: PropTypes.bool,
50
+ count: PropTypes.number,
51
+ percentage: PropTypes.number
52
+ })),
53
+ no_answer: PropTypes.shape({
54
+ count: PropTypes.number,
55
+ percentage: PropTypes.number
43
56
  })
44
57
  });
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.getExistingBankAndEntries = getExistingBankAndEntries;
9
- exports.createBankCloneJob = exports.updateSharedBankPermission = exports.getSharedBanks = exports.getSharedBank = exports.shareBank = exports.deleteBank = exports.updateBank = exports.createBank = exports.getBank = exports.getAllBanks = exports.getBanks = void 0;
9
+ exports.createBankCloneJob = exports.updateSharedBankPermission = exports.getSharedBanks = exports.getSharedBank = exports.shareBank = exports.deleteBank = exports.updateBank = exports.createBank = exports.getSpecificBanks = exports.getBank = exports.getAllBanks = exports.getBanks = void 0;
10
10
 
11
11
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
12
12
 
@@ -111,6 +111,24 @@ var getBank = function getBank(bankId) {
111
111
 
112
112
  exports.getBank = getBank;
113
113
 
114
+ var getSpecificBanks = function getSpecificBanks() {
115
+ var bankIds = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : [];
116
+ return function (dispatch, getState) {
117
+ var fetcher = new _Fetcher.default({
118
+ onError: (0, _helpers.handleError)(dispatch, (0, _formatMessage.default)('Failed to fetch banks.'))
119
+ });
120
+ var param = {
121
+ ids: bankIds
122
+ };
123
+ return fetcher.get("".concat(banksApiEndpoint, "/batch_show"), param).then(function (response) {
124
+ dispatch((0, _callHandlers.handleBanksResponse)(response));
125
+ return response;
126
+ });
127
+ };
128
+ };
129
+
130
+ exports.getSpecificBanks = getSpecificBanks;
131
+
114
132
  var createBank = function createBank(newBank, shareWithCourseUuid) {
115
133
  return function (dispatch, getState) {
116
134
  var newBankData = JSON.stringify({