@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.
- package/es/banks/api/banks.js +15 -0
- package/es/banks/api/copyingBanksPoller.js +99 -0
- package/es/banks/components/Banks/presenter.js +1 -2
- package/es/banks/components/BanksList/index.js +3 -1
- package/es/banks/components/BanksList/presenter.js +36 -13
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/ChoiceInfo/index.js +2 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/ChoiceInfo/presenter.js +90 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/index.js +2 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/presenter.js +109 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/index.js +2 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/presenter.js +62 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/theme.js +8 -0
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +32 -17
- package/es/reporting/components/resources/NewQuizAndItemAnalysis/propTypes.js +13 -0
- package/lib/banks/api/banks.js +19 -1
- package/lib/banks/api/copyingBanksPoller.js +116 -0
- package/lib/banks/components/Banks/presenter.js +1 -2
- package/lib/banks/components/BanksList/index.js +4 -1
- package/lib/banks/components/BanksList/presenter.js +36 -13
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/ChoiceInfo/index.js +11 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/ChoiceInfo/presenter.js +110 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/index.js +11 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/presenter.js +132 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/index.js +11 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/presenter.js +83 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/theme.js +15 -0
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js +33 -17
- package/lib/reporting/components/resources/NewQuizAndItemAnalysis/propTypes.js +18 -2
- package/package.json +9 -9
package/es/banks/api/banks.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
148
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
|
|
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(
|
|
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
|
-
},
|
|
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,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;
|
package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/Row/presenter.js
ADDED
|
@@ -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);
|
package/es/reporting/components/resources/NewQuizAndItemAnalysis/AnswerSummaryTable/presenter.js
ADDED
|
@@ -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);
|
package/es/reporting/components/resources/NewQuizAndItemAnalysis/NewItemAnalysis/presenter.js
CHANGED
|
@@ -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: '
|
|
12
|
+
componentId: 'bCOJX',
|
|
13
13
|
template: function template(theme) {
|
|
14
|
-
return "\n\n.
|
|
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': '
|
|
17
|
-
'cardWrapper': '
|
|
18
|
-
'metricNumberContext': '
|
|
19
|
-
'bodyPresentation': '
|
|
20
|
-
'bodyExcerpt': '
|
|
21
|
-
'bodyExcerptExpanded': '
|
|
22
|
-
'bodyExpandButtonWrapper': '
|
|
23
|
-
'innerWrapper': '
|
|
24
|
-
'expandableInnerWrapper': '
|
|
25
|
-
'metricsWithControls': '
|
|
26
|
-
'metricGroup': '
|
|
27
|
-
'metricsRow': '
|
|
28
|
-
'metricsRowPaginated': '
|
|
29
|
-
'itemCardToggleButtonWrapper': '
|
|
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
|
});
|
package/lib/banks/api/banks.js
CHANGED
|
@@ -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({
|