@instructure/quiz-core 17.60.1-rc.4 → 17.60.1-rc.6
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 +18 -0
- package/es/banks/components/Banks/presenter.js +9 -8
- package/es/banks/components/BanksList/index.js +8 -3
- package/es/banks/components/BanksList/presenter.js +103 -32
- package/es/reporting/api/getItemAnalyses.js +33 -0
- package/lib/banks/api/banks.js +24 -2
- package/lib/banks/components/Banks/presenter.js +9 -8
- package/lib/banks/components/BanksList/index.js +9 -2
- package/lib/banks/components/BanksList/presenter.js +103 -31
- package/lib/reporting/api/getItemAnalyses.js +48 -0
- package/package.json +9 -9
package/es/banks/api/banks.js
CHANGED
|
@@ -12,6 +12,7 @@ import t from '@instructure/quiz-i18n/es/format-message';
|
|
|
12
12
|
import { handleError } from "../../common/api/helpers.js";
|
|
13
13
|
import { BANKS_BANK_PAGINATION, BANKS_BANK_ENTRY_PAGINATION, DELETE_BANK_CALL, UPDATE_BANK_CALL, CAN_EDIT, READ_ONLY, REMOVED_ACCESS, SHARED_WITH_USER, SHARED_WITH_COURSE } from '@instructure/quiz-common';
|
|
14
14
|
import { noop } from 'lodash';
|
|
15
|
+
import { NIL } from 'uuid';
|
|
15
16
|
var banksApiEndpoint = '/api/banks';
|
|
16
17
|
var DEFAULT_PAGE_SIZE = 100;
|
|
17
18
|
|
|
@@ -340,4 +341,21 @@ export var updateSharedBankPermission = function updateSharedBankPermission(bank
|
|
|
340
341
|
}
|
|
341
342
|
});
|
|
342
343
|
};
|
|
344
|
+
};
|
|
345
|
+
export var createBankCloneJob = function createBankCloneJob(bankId) {
|
|
346
|
+
var userId = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : NIL;
|
|
347
|
+
var url = "".concat(banksApiEndpoint, "/").concat(bankId, "/bank_clone_jobs");
|
|
348
|
+
return function (dispatch, getState) {
|
|
349
|
+
var field_overrides = JSON.stringify({
|
|
350
|
+
field_overrides: {
|
|
351
|
+
creator: userId
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
var fetcher = new Fetcher({
|
|
355
|
+
onError: handleError(dispatch, t('Failed to create bank clone job.'))
|
|
356
|
+
});
|
|
357
|
+
return fetcher.post(url, {
|
|
358
|
+
body: field_overrides
|
|
359
|
+
});
|
|
360
|
+
};
|
|
343
361
|
};
|
|
@@ -174,7 +174,8 @@ 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
|
|
177
|
+
recordIds: recordIds,
|
|
178
|
+
redirectAllBanks: _this.handleBankCreated
|
|
178
179
|
});
|
|
179
180
|
};
|
|
180
181
|
|
|
@@ -386,6 +387,7 @@ export var Banks = (_dec = themeable(theme, styles), _dec(_class = (_temp = _cla
|
|
|
386
387
|
}),
|
|
387
388
|
// from consumer
|
|
388
389
|
clear: PropTypes.func,
|
|
390
|
+
filtersEnabled: PropTypes.bool,
|
|
389
391
|
getBanks: PropTypes.func.isRequired,
|
|
390
392
|
getCourseInfo: PropTypes.func,
|
|
391
393
|
// from consumer
|
|
@@ -397,29 +399,28 @@ export var Banks = (_dec = themeable(theme, styles), _dec(_class = (_temp = _cla
|
|
|
397
399
|
// from consumer,
|
|
398
400
|
getCourseAssignments: PropTypes.func,
|
|
399
401
|
// from consumer
|
|
400
|
-
minChars: PropTypes.number,
|
|
401
402
|
isCompact: PropTypes.bool,
|
|
403
|
+
merge: PropTypes.func.isRequired,
|
|
404
|
+
minChars: PropTypes.number,
|
|
402
405
|
navigateToBank: PropTypes.func.isRequired,
|
|
403
406
|
// can be from consumer
|
|
404
407
|
navigateToBuild: PropTypes.func,
|
|
405
408
|
// from consumer
|
|
409
|
+
newItemBankFilterNamesEnabled: PropTypes.bool,
|
|
406
410
|
onShare: PropTypes.func,
|
|
407
411
|
// from consumer
|
|
408
412
|
openModal: PropTypes.func.isRequired,
|
|
413
|
+
returnToUrl: PropTypes.string,
|
|
414
|
+
// from consumer
|
|
409
415
|
scope: PropTypes.shape({
|
|
410
416
|
type: PropTypes.string,
|
|
411
417
|
uuid: PropTypes.string,
|
|
412
418
|
title: PropTypes.string
|
|
413
419
|
}).isRequired,
|
|
414
|
-
returnToUrl: PropTypes.string,
|
|
415
|
-
// from consumer
|
|
416
|
-
filtersEnabled: PropTypes.bool,
|
|
417
|
-
merge: PropTypes.func.isRequired,
|
|
418
420
|
scopeType: PropTypes.string,
|
|
421
|
+
searchTerms: PropTypes.string,
|
|
419
422
|
sortBy: PropTypes.string,
|
|
420
423
|
sortOrder: PropTypes.string,
|
|
421
|
-
searchTerms: PropTypes.string,
|
|
422
|
-
newItemBankFilterNamesEnabled: PropTypes.bool,
|
|
423
424
|
usedByCourseEnabled: PropTypes.bool
|
|
424
425
|
}, _class2.defaultProps = {
|
|
425
426
|
closeTray: null,
|
|
@@ -3,17 +3,22 @@ import { connect } from "../../../common/react-redux.js";
|
|
|
3
3
|
import BanksList from "./presenter.js";
|
|
4
4
|
import Bank from "../../../common/records/Bank.js";
|
|
5
5
|
import { openModal, withConfirm } from "../../../common/actions/modal.js";
|
|
6
|
-
import { deleteBank } from "../../api/banks.js";
|
|
6
|
+
import { deleteBank, createBankCloneJob } from "../../api/banks.js";
|
|
7
|
+
import { featureOn } from "../../../common/util/featureCheck.js";
|
|
8
|
+
import { addInfo } from "../../../common/actions/alerts.js";
|
|
7
9
|
export function mapStateToProps(state, props) {
|
|
8
10
|
return {
|
|
9
11
|
appContainer: state.getIn(['ui', 'appContainer']),
|
|
10
12
|
banks: List(props.recordIds).map(function (id) {
|
|
11
13
|
return Bank.create(state.getIn(['banks', id]));
|
|
12
|
-
})
|
|
14
|
+
}),
|
|
15
|
+
duplicateItemBanks: featureOn('duplicate_item_banks')
|
|
13
16
|
};
|
|
14
17
|
}
|
|
15
18
|
export default connect(mapStateToProps, {
|
|
16
19
|
openModal: openModal,
|
|
17
20
|
deleteBank: deleteBank,
|
|
18
|
-
withConfirm: withConfirm
|
|
21
|
+
withConfirm: withConfirm,
|
|
22
|
+
createBankCloneJob: createBankCloneJob,
|
|
23
|
+
addInfo: addInfo
|
|
19
24
|
})(BanksList);
|
|
@@ -18,8 +18,9 @@ import { Link } from '@instructure/ui-link';
|
|
|
18
18
|
import { Heading } from '@instructure/ui-heading';
|
|
19
19
|
import { PresentationContent, ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
20
20
|
import { Button } from '@instructure/ui-buttons';
|
|
21
|
-
import { IconEditLine, IconTrashLine, IconShareSolid } from '@instructure/ui-icons';
|
|
21
|
+
import { IconEditLine, IconTrashLine, IconShareSolid, IconCopyLine } from '@instructure/ui-icons';
|
|
22
22
|
import { Alert } from '@instructure/ui-alerts';
|
|
23
|
+
import { Spinner } from '@instructure/ui-spinner';
|
|
23
24
|
import { themeable } from '@instructure/ui-themeable';
|
|
24
25
|
import { EDIT_BANK_MODAL, withI18nSupport } from '@instructure/quiz-common';
|
|
25
26
|
import CustomPropTypes from "../../../common/util/CustomPropTypes.js";
|
|
@@ -42,6 +43,12 @@ var styles = {
|
|
|
42
43
|
'deletePreface': 'dgJJi_eTBd'
|
|
43
44
|
};
|
|
44
45
|
import theme from "./theme.js";
|
|
46
|
+
|
|
47
|
+
var _ref3 = /*#__PURE__*/React.createElement(Spinner, {
|
|
48
|
+
renderTitle: "Loading",
|
|
49
|
+
size: "x-small"
|
|
50
|
+
});
|
|
51
|
+
|
|
45
52
|
export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_withI18nSupport) {
|
|
46
53
|
_inherits(BanksList, _withI18nSupport);
|
|
47
54
|
|
|
@@ -135,6 +142,29 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
|
|
|
135
142
|
}));
|
|
136
143
|
};
|
|
137
144
|
|
|
145
|
+
_this.openDuplicateBankModal = function (bank) {
|
|
146
|
+
return function () {
|
|
147
|
+
_this.createCloneJob = function () {
|
|
148
|
+
_this.props.createBankCloneJob(bank.id, _this.props.currentUser.uuid);
|
|
149
|
+
|
|
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
|
+
};
|
|
157
|
+
|
|
158
|
+
_this.props.withConfirm(partial(_this.createCloneJob), {
|
|
159
|
+
text: t('Are you sure you want to duplicate this item bank?'),
|
|
160
|
+
title: t('Duplicate Bank'),
|
|
161
|
+
continueText: t('Duplicate'),
|
|
162
|
+
continueVariant: null,
|
|
163
|
+
size: 'small'
|
|
164
|
+
});
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
|
|
138
168
|
_this.updateSharedCount = function (count) {
|
|
139
169
|
_this.setState({
|
|
140
170
|
sharingCount: count
|
|
@@ -184,24 +214,41 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
|
|
|
184
214
|
};
|
|
185
215
|
};
|
|
186
216
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
},
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
"
|
|
204
|
-
|
|
217
|
+
if (bank.status == 'copying') {
|
|
218
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
219
|
+
className: styles.bankInfo,
|
|
220
|
+
"data-automation": "sdk-bank-info",
|
|
221
|
+
tabIndex: "-1"
|
|
222
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
223
|
+
className: styles.bankTitle
|
|
224
|
+
}, /*#__PURE__*/React.createElement(Heading, {
|
|
225
|
+
as: "h2",
|
|
226
|
+
level: "reset",
|
|
227
|
+
"data-automation": "sdk-banks-list-bank-title-heading"
|
|
228
|
+
}, bank.title)), /*#__PURE__*/React.createElement("div", {
|
|
229
|
+
className: styles.bankDetails,
|
|
230
|
+
"data-automation": "sdk-banks-list-bank-details"
|
|
231
|
+
}, t('Currently duplicating')));
|
|
232
|
+
} else {
|
|
233
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
234
|
+
className: styles.bankInfo,
|
|
235
|
+
"data-automation": "sdk-bank-info",
|
|
236
|
+
tabIndex: "-1"
|
|
237
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
238
|
+
className: styles.bankTitle
|
|
239
|
+
}, /*#__PURE__*/React.createElement(Link, {
|
|
240
|
+
onClick: navigateToBank(bank.id),
|
|
241
|
+
theme: {
|
|
242
|
+
color: _this.theme.bankTitleLinkColor,
|
|
243
|
+
hoverColor: _this.theme.bankTitleLinkHoverColor
|
|
244
|
+
},
|
|
245
|
+
"data-automation": "sdk-banks-list-bank-title-link"
|
|
246
|
+
}, /*#__PURE__*/React.createElement(Heading, {
|
|
247
|
+
as: "h2",
|
|
248
|
+
level: "reset",
|
|
249
|
+
"data-automation": "sdk-banks-list-bank-title-heading"
|
|
250
|
+
}, bank.title))), _this.renderDetails(bank));
|
|
251
|
+
}
|
|
205
252
|
};
|
|
206
253
|
|
|
207
254
|
_this.renderBankOptions = function (bank) {
|
|
@@ -230,23 +277,42 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
|
|
|
230
277
|
}, /*#__PURE__*/React.createElement(ScreenReaderContent, null, t('Delete bank {name}', {
|
|
231
278
|
name: bank.title
|
|
232
279
|
}))));
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
name: "item_bank_sharing"
|
|
237
|
-
}, /*#__PURE__*/React.createElement(Button, {
|
|
238
|
-
onClick: _this.openSharingModal(bank),
|
|
239
|
-
name: "Share",
|
|
280
|
+
var duplicateBankOption = /*#__PURE__*/React.createElement(Button, {
|
|
281
|
+
onClick: _this.openDuplicateBankModal(bank),
|
|
282
|
+
name: "Duplicate",
|
|
240
283
|
size: "small",
|
|
241
284
|
variant: "icon",
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
title: t('Share bank {name}', {
|
|
285
|
+
icon: IconCopyLine,
|
|
286
|
+
title: t('Duplicate bank {name}', {
|
|
245
287
|
name: bank.title
|
|
246
288
|
})
|
|
247
|
-
}, /*#__PURE__*/React.createElement(ScreenReaderContent, null, t('
|
|
289
|
+
}, /*#__PURE__*/React.createElement(ScreenReaderContent, null, t('Duplicate bank {name}', {
|
|
248
290
|
name: bank.title
|
|
249
|
-
})))
|
|
291
|
+
})));
|
|
292
|
+
|
|
293
|
+
if (bank.status == 'copying') {
|
|
294
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
295
|
+
className: styles.bankOptions
|
|
296
|
+
}, _ref3);
|
|
297
|
+
} else {
|
|
298
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
299
|
+
className: styles.bankOptions
|
|
300
|
+
}, _this.props.duplicateItemBanks ? duplicateBankOption : null, /*#__PURE__*/React.createElement(IfFeature, {
|
|
301
|
+
name: "item_bank_sharing"
|
|
302
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
303
|
+
onClick: _this.openSharingModal(bank),
|
|
304
|
+
name: "Share",
|
|
305
|
+
size: "small",
|
|
306
|
+
variant: "icon",
|
|
307
|
+
"data-automation": "sdk-shared-bank-share-link",
|
|
308
|
+
icon: IconShareSolid,
|
|
309
|
+
title: t('Share bank {name}', {
|
|
310
|
+
name: bank.title
|
|
311
|
+
})
|
|
312
|
+
}, /*#__PURE__*/React.createElement(ScreenReaderContent, null, t('Share bank {name}', {
|
|
313
|
+
name: bank.title
|
|
314
|
+
})))), bank.canEdit() ? bankEditOptions : null);
|
|
315
|
+
}
|
|
250
316
|
};
|
|
251
317
|
|
|
252
318
|
_this.renderBank = function (bank) {
|
|
@@ -325,8 +391,10 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
|
|
|
325
391
|
BanksList.displayName = "BanksList";
|
|
326
392
|
return BanksList;
|
|
327
393
|
}(withI18nSupport(Component)), _class2.propTypes = {
|
|
394
|
+
addInfo: PropTypes.func.isRequired,
|
|
328
395
|
appContainer: CustomPropTypes.selectors.isRequired,
|
|
329
396
|
banks: ImmutablePropTypes.list.isRequired,
|
|
397
|
+
createBankCloneJob: PropTypes.func.isRequired,
|
|
330
398
|
currentUser: PropTypes.shape({
|
|
331
399
|
bank_admin: PropTypes.bool,
|
|
332
400
|
email: PropTypes.string,
|
|
@@ -337,6 +405,7 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
|
|
|
337
405
|
}),
|
|
338
406
|
focusCreateBankButton: PropTypes.func.isRequired,
|
|
339
407
|
deleteBank: PropTypes.func.isRequired,
|
|
408
|
+
duplicateItemBanks: PropTypes.bool,
|
|
340
409
|
getCourseInfo: PropTypes.func,
|
|
341
410
|
getUserInfo: PropTypes.func,
|
|
342
411
|
getShareableCourses: PropTypes.func,
|
|
@@ -345,6 +414,7 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
|
|
|
345
414
|
navigateToBank: PropTypes.func.isRequired,
|
|
346
415
|
onShare: PropTypes.func,
|
|
347
416
|
openModal: PropTypes.func.isRequired,
|
|
417
|
+
redirectAllBanks: PropTypes.func.isRequired,
|
|
348
418
|
withConfirm: PropTypes.func.isRequired,
|
|
349
419
|
locale: PropTypes.string,
|
|
350
420
|
timezone: PropTypes.string
|
|
@@ -357,7 +427,8 @@ export var BanksList = (_dec = themeable(theme, styles), _dec(_class = (_temp =
|
|
|
357
427
|
minChars: void 0,
|
|
358
428
|
locale: null,
|
|
359
429
|
timezone: null,
|
|
360
|
-
onShare: function onShare() {}
|
|
430
|
+
onShare: function onShare() {},
|
|
431
|
+
duplicateItemBanks: false
|
|
361
432
|
}, _class2.contextTypes = {
|
|
362
433
|
locale: PropTypes.string,
|
|
363
434
|
timezone: PropTypes.string
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
3
|
+
import Fetcher from "../../common/util/Fetcher.js";
|
|
4
|
+
var fetcher = new Fetcher();
|
|
5
|
+
export var getItemAnalyses = /*#__PURE__*/function () {
|
|
6
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(quizId) {
|
|
7
|
+
var filter,
|
|
8
|
+
url,
|
|
9
|
+
_args = arguments;
|
|
10
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
11
|
+
while (1) {
|
|
12
|
+
switch (_context.prev = _context.next) {
|
|
13
|
+
case 0:
|
|
14
|
+
filter = _args.length > 1 && _args[1] !== void 0 ? _args[1] : 'last_attempt';
|
|
15
|
+
url = "/api/quizzes/".concat(quizId, "/analyses/item_analyses?filter=").concat(filter);
|
|
16
|
+
_context.next = 4;
|
|
17
|
+
return fetcher.get(url);
|
|
18
|
+
|
|
19
|
+
case 4:
|
|
20
|
+
return _context.abrupt("return", _context.sent);
|
|
21
|
+
|
|
22
|
+
case 5:
|
|
23
|
+
case "end":
|
|
24
|
+
return _context.stop();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}, _callee);
|
|
28
|
+
}));
|
|
29
|
+
|
|
30
|
+
return function getItemAnalyses(_x) {
|
|
31
|
+
return _ref.apply(this, arguments);
|
|
32
|
+
};
|
|
33
|
+
}();
|
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.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.getBank = exports.getAllBanks = exports.getBanks = void 0;
|
|
10
10
|
|
|
11
11
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
12
12
|
|
|
@@ -36,6 +36,8 @@ var _quizCommon = require("@instructure/quiz-common");
|
|
|
36
36
|
|
|
37
37
|
var _lodash = require("lodash");
|
|
38
38
|
|
|
39
|
+
var _uuid = require("uuid");
|
|
40
|
+
|
|
39
41
|
var banksApiEndpoint = '/api/banks';
|
|
40
42
|
var DEFAULT_PAGE_SIZE = 100;
|
|
41
43
|
|
|
@@ -394,4 +396,24 @@ var updateSharedBankPermission = function updateSharedBankPermission(bankId, sha
|
|
|
394
396
|
};
|
|
395
397
|
};
|
|
396
398
|
|
|
397
|
-
exports.updateSharedBankPermission = updateSharedBankPermission;
|
|
399
|
+
exports.updateSharedBankPermission = updateSharedBankPermission;
|
|
400
|
+
|
|
401
|
+
var createBankCloneJob = function createBankCloneJob(bankId) {
|
|
402
|
+
var userId = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : _uuid.NIL;
|
|
403
|
+
var url = "".concat(banksApiEndpoint, "/").concat(bankId, "/bank_clone_jobs");
|
|
404
|
+
return function (dispatch, getState) {
|
|
405
|
+
var field_overrides = JSON.stringify({
|
|
406
|
+
field_overrides: {
|
|
407
|
+
creator: userId
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
var fetcher = new _Fetcher.default({
|
|
411
|
+
onError: (0, _helpers.handleError)(dispatch, (0, _formatMessage.default)('Failed to create bank clone job.'))
|
|
412
|
+
});
|
|
413
|
+
return fetcher.post(url, {
|
|
414
|
+
body: field_overrides
|
|
415
|
+
});
|
|
416
|
+
};
|
|
417
|
+
};
|
|
418
|
+
|
|
419
|
+
exports.createBankCloneJob = createBankCloneJob;
|
|
@@ -211,7 +211,8 @@ var Banks = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_c
|
|
|
211
211
|
minChars: _this.props.minChars,
|
|
212
212
|
navigateToBank: _this.props.navigateToBank,
|
|
213
213
|
onShare: _this.props.onShare,
|
|
214
|
-
recordIds: recordIds
|
|
214
|
+
recordIds: recordIds,
|
|
215
|
+
redirectAllBanks: _this.handleBankCreated
|
|
215
216
|
});
|
|
216
217
|
};
|
|
217
218
|
|
|
@@ -425,6 +426,7 @@ var Banks = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_c
|
|
|
425
426
|
}),
|
|
426
427
|
// from consumer
|
|
427
428
|
clear: _propTypes.default.func,
|
|
429
|
+
filtersEnabled: _propTypes.default.bool,
|
|
428
430
|
getBanks: _propTypes.default.func.isRequired,
|
|
429
431
|
getCourseInfo: _propTypes.default.func,
|
|
430
432
|
// from consumer
|
|
@@ -436,29 +438,28 @@ var Banks = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_c
|
|
|
436
438
|
// from consumer,
|
|
437
439
|
getCourseAssignments: _propTypes.default.func,
|
|
438
440
|
// from consumer
|
|
439
|
-
minChars: _propTypes.default.number,
|
|
440
441
|
isCompact: _propTypes.default.bool,
|
|
442
|
+
merge: _propTypes.default.func.isRequired,
|
|
443
|
+
minChars: _propTypes.default.number,
|
|
441
444
|
navigateToBank: _propTypes.default.func.isRequired,
|
|
442
445
|
// can be from consumer
|
|
443
446
|
navigateToBuild: _propTypes.default.func,
|
|
444
447
|
// from consumer
|
|
448
|
+
newItemBankFilterNamesEnabled: _propTypes.default.bool,
|
|
445
449
|
onShare: _propTypes.default.func,
|
|
446
450
|
// from consumer
|
|
447
451
|
openModal: _propTypes.default.func.isRequired,
|
|
452
|
+
returnToUrl: _propTypes.default.string,
|
|
453
|
+
// from consumer
|
|
448
454
|
scope: _propTypes.default.shape({
|
|
449
455
|
type: _propTypes.default.string,
|
|
450
456
|
uuid: _propTypes.default.string,
|
|
451
457
|
title: _propTypes.default.string
|
|
452
458
|
}).isRequired,
|
|
453
|
-
returnToUrl: _propTypes.default.string,
|
|
454
|
-
// from consumer
|
|
455
|
-
filtersEnabled: _propTypes.default.bool,
|
|
456
|
-
merge: _propTypes.default.func.isRequired,
|
|
457
459
|
scopeType: _propTypes.default.string,
|
|
460
|
+
searchTerms: _propTypes.default.string,
|
|
458
461
|
sortBy: _propTypes.default.string,
|
|
459
462
|
sortOrder: _propTypes.default.string,
|
|
460
|
-
searchTerms: _propTypes.default.string,
|
|
461
|
-
newItemBankFilterNamesEnabled: _propTypes.default.bool,
|
|
462
463
|
usedByCourseEnabled: _propTypes.default.bool
|
|
463
464
|
}, _class2.defaultProps = {
|
|
464
465
|
closeTray: null,
|
|
@@ -20,19 +20,26 @@ var _modal = require("../../../common/actions/modal.js");
|
|
|
20
20
|
|
|
21
21
|
var _banks = require("../../api/banks.js");
|
|
22
22
|
|
|
23
|
+
var _featureCheck = require("../../../common/util/featureCheck.js");
|
|
24
|
+
|
|
25
|
+
var _alerts = require("../../../common/actions/alerts.js");
|
|
26
|
+
|
|
23
27
|
function mapStateToProps(state, props) {
|
|
24
28
|
return {
|
|
25
29
|
appContainer: state.getIn(['ui', 'appContainer']),
|
|
26
30
|
banks: (0, _immutable.List)(props.recordIds).map(function (id) {
|
|
27
31
|
return _Bank.default.create(state.getIn(['banks', id]));
|
|
28
|
-
})
|
|
32
|
+
}),
|
|
33
|
+
duplicateItemBanks: (0, _featureCheck.featureOn)('duplicate_item_banks')
|
|
29
34
|
};
|
|
30
35
|
}
|
|
31
36
|
|
|
32
37
|
var _default = (0, _reactRedux.connect)(mapStateToProps, {
|
|
33
38
|
openModal: _modal.openModal,
|
|
34
39
|
deleteBank: _banks.deleteBank,
|
|
35
|
-
withConfirm: _modal.withConfirm
|
|
40
|
+
withConfirm: _modal.withConfirm,
|
|
41
|
+
createBankCloneJob: _banks.createBankCloneJob,
|
|
42
|
+
addInfo: _alerts.addInfo
|
|
36
43
|
})(_presenter.default);
|
|
37
44
|
|
|
38
45
|
exports.default = _default;
|
|
@@ -45,6 +45,8 @@ var _uiIcons = require("@instructure/ui-icons");
|
|
|
45
45
|
|
|
46
46
|
var _uiAlerts = require("@instructure/ui-alerts");
|
|
47
47
|
|
|
48
|
+
var _uiSpinner = require("@instructure/ui-spinner");
|
|
49
|
+
|
|
48
50
|
var _uiThemeable = require("@instructure/ui-themeable");
|
|
49
51
|
|
|
50
52
|
var _quizCommon = require("@instructure/quiz-common");
|
|
@@ -77,6 +79,12 @@ var styles = {
|
|
|
77
79
|
'deleteAlert': 'dgJJi_AHIw',
|
|
78
80
|
'deletePreface': 'dgJJi_eTBd'
|
|
79
81
|
};
|
|
82
|
+
|
|
83
|
+
var _ref3 = /*#__PURE__*/_react.default.createElement(_uiSpinner.Spinner, {
|
|
84
|
+
renderTitle: "Loading",
|
|
85
|
+
size: "x-small"
|
|
86
|
+
});
|
|
87
|
+
|
|
80
88
|
var BanksList = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _dec(_class = (_temp = _class2 = /*#__PURE__*/function (_withI18nSupport) {
|
|
81
89
|
(0, _inherits2.default)(BanksList, _withI18nSupport);
|
|
82
90
|
|
|
@@ -170,6 +178,29 @@ var BanksList = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _de
|
|
|
170
178
|
}));
|
|
171
179
|
};
|
|
172
180
|
|
|
181
|
+
_this.openDuplicateBankModal = function (bank) {
|
|
182
|
+
return function () {
|
|
183
|
+
_this.createCloneJob = function () {
|
|
184
|
+
_this.props.createBankCloneJob(bank.id, _this.props.currentUser.uuid);
|
|
185
|
+
|
|
186
|
+
_this.props.addInfo( /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _formatMessage.default)('Creating "{name} Copy". Duplicate will appear in ', {
|
|
187
|
+
name: bank.title
|
|
188
|
+
}), /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
|
|
189
|
+
key: bank.id,
|
|
190
|
+
onClick: _this.props.redirectAllBanks
|
|
191
|
+
}, (0, _formatMessage.default)('\'All Banks\'')), (0, _formatMessage.default)(' filter.')));
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
_this.props.withConfirm((0, _partial.default)(_this.createCloneJob), {
|
|
195
|
+
text: (0, _formatMessage.default)('Are you sure you want to duplicate this item bank?'),
|
|
196
|
+
title: (0, _formatMessage.default)('Duplicate Bank'),
|
|
197
|
+
continueText: (0, _formatMessage.default)('Duplicate'),
|
|
198
|
+
continueVariant: null,
|
|
199
|
+
size: 'small'
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
|
|
173
204
|
_this.updateSharedCount = function (count) {
|
|
174
205
|
_this.setState({
|
|
175
206
|
sharingCount: count
|
|
@@ -219,24 +250,41 @@ var BanksList = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _de
|
|
|
219
250
|
};
|
|
220
251
|
};
|
|
221
252
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
},
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
"
|
|
239
|
-
|
|
253
|
+
if (bank.status == 'copying') {
|
|
254
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
255
|
+
className: styles.bankInfo,
|
|
256
|
+
"data-automation": "sdk-bank-info",
|
|
257
|
+
tabIndex: "-1"
|
|
258
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
259
|
+
className: styles.bankTitle
|
|
260
|
+
}, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
|
|
261
|
+
as: "h2",
|
|
262
|
+
level: "reset",
|
|
263
|
+
"data-automation": "sdk-banks-list-bank-title-heading"
|
|
264
|
+
}, bank.title)), /*#__PURE__*/_react.default.createElement("div", {
|
|
265
|
+
className: styles.bankDetails,
|
|
266
|
+
"data-automation": "sdk-banks-list-bank-details"
|
|
267
|
+
}, (0, _formatMessage.default)('Currently duplicating')));
|
|
268
|
+
} else {
|
|
269
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
270
|
+
className: styles.bankInfo,
|
|
271
|
+
"data-automation": "sdk-bank-info",
|
|
272
|
+
tabIndex: "-1"
|
|
273
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
274
|
+
className: styles.bankTitle
|
|
275
|
+
}, /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
|
|
276
|
+
onClick: navigateToBank(bank.id),
|
|
277
|
+
theme: {
|
|
278
|
+
color: _this.theme.bankTitleLinkColor,
|
|
279
|
+
hoverColor: _this.theme.bankTitleLinkHoverColor
|
|
280
|
+
},
|
|
281
|
+
"data-automation": "sdk-banks-list-bank-title-link"
|
|
282
|
+
}, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
|
|
283
|
+
as: "h2",
|
|
284
|
+
level: "reset",
|
|
285
|
+
"data-automation": "sdk-banks-list-bank-title-heading"
|
|
286
|
+
}, bank.title))), _this.renderDetails(bank));
|
|
287
|
+
}
|
|
240
288
|
};
|
|
241
289
|
|
|
242
290
|
_this.renderBankOptions = function (bank) {
|
|
@@ -266,23 +314,42 @@ var BanksList = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _de
|
|
|
266
314
|
name: bank.title
|
|
267
315
|
}))));
|
|
268
316
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
name: "item_bank_sharing"
|
|
273
|
-
}, /*#__PURE__*/_react.default.createElement(_uiButtons.Button, {
|
|
274
|
-
onClick: _this.openSharingModal(bank),
|
|
275
|
-
name: "Share",
|
|
317
|
+
var duplicateBankOption = /*#__PURE__*/_react.default.createElement(_uiButtons.Button, {
|
|
318
|
+
onClick: _this.openDuplicateBankModal(bank),
|
|
319
|
+
name: "Duplicate",
|
|
276
320
|
size: "small",
|
|
277
321
|
variant: "icon",
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
title: (0, _formatMessage.default)('Share bank {name}', {
|
|
322
|
+
icon: _uiIcons.IconCopyLine,
|
|
323
|
+
title: (0, _formatMessage.default)('Duplicate bank {name}', {
|
|
281
324
|
name: bank.title
|
|
282
325
|
})
|
|
283
|
-
}, /*#__PURE__*/_react.default.createElement(_uiA11yContent.ScreenReaderContent, null, (0, _formatMessage.default)('
|
|
326
|
+
}, /*#__PURE__*/_react.default.createElement(_uiA11yContent.ScreenReaderContent, null, (0, _formatMessage.default)('Duplicate bank {name}', {
|
|
284
327
|
name: bank.title
|
|
285
|
-
})))
|
|
328
|
+
})));
|
|
329
|
+
|
|
330
|
+
if (bank.status == 'copying') {
|
|
331
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
332
|
+
className: styles.bankOptions
|
|
333
|
+
}, _ref3);
|
|
334
|
+
} else {
|
|
335
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
336
|
+
className: styles.bankOptions
|
|
337
|
+
}, _this.props.duplicateItemBanks ? duplicateBankOption : null, /*#__PURE__*/_react.default.createElement(_index.default, {
|
|
338
|
+
name: "item_bank_sharing"
|
|
339
|
+
}, /*#__PURE__*/_react.default.createElement(_uiButtons.Button, {
|
|
340
|
+
onClick: _this.openSharingModal(bank),
|
|
341
|
+
name: "Share",
|
|
342
|
+
size: "small",
|
|
343
|
+
variant: "icon",
|
|
344
|
+
"data-automation": "sdk-shared-bank-share-link",
|
|
345
|
+
icon: _uiIcons.IconShareSolid,
|
|
346
|
+
title: (0, _formatMessage.default)('Share bank {name}', {
|
|
347
|
+
name: bank.title
|
|
348
|
+
})
|
|
349
|
+
}, /*#__PURE__*/_react.default.createElement(_uiA11yContent.ScreenReaderContent, null, (0, _formatMessage.default)('Share bank {name}', {
|
|
350
|
+
name: bank.title
|
|
351
|
+
})))), bank.canEdit() ? bankEditOptions : null);
|
|
352
|
+
}
|
|
286
353
|
};
|
|
287
354
|
|
|
288
355
|
_this.renderBank = function (bank) {
|
|
@@ -362,8 +429,10 @@ var BanksList = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _de
|
|
|
362
429
|
BanksList.displayName = "BanksList";
|
|
363
430
|
return BanksList;
|
|
364
431
|
}((0, _quizCommon.withI18nSupport)(_react.Component)), _class2.propTypes = {
|
|
432
|
+
addInfo: _propTypes.default.func.isRequired,
|
|
365
433
|
appContainer: _CustomPropTypes.default.selectors.isRequired,
|
|
366
434
|
banks: _reactImmutableProptypes.default.list.isRequired,
|
|
435
|
+
createBankCloneJob: _propTypes.default.func.isRequired,
|
|
367
436
|
currentUser: _propTypes.default.shape({
|
|
368
437
|
bank_admin: _propTypes.default.bool,
|
|
369
438
|
email: _propTypes.default.string,
|
|
@@ -374,6 +443,7 @@ var BanksList = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _de
|
|
|
374
443
|
}),
|
|
375
444
|
focusCreateBankButton: _propTypes.default.func.isRequired,
|
|
376
445
|
deleteBank: _propTypes.default.func.isRequired,
|
|
446
|
+
duplicateItemBanks: _propTypes.default.bool,
|
|
377
447
|
getCourseInfo: _propTypes.default.func,
|
|
378
448
|
getUserInfo: _propTypes.default.func,
|
|
379
449
|
getShareableCourses: _propTypes.default.func,
|
|
@@ -382,6 +452,7 @@ var BanksList = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _de
|
|
|
382
452
|
navigateToBank: _propTypes.default.func.isRequired,
|
|
383
453
|
onShare: _propTypes.default.func,
|
|
384
454
|
openModal: _propTypes.default.func.isRequired,
|
|
455
|
+
redirectAllBanks: _propTypes.default.func.isRequired,
|
|
385
456
|
withConfirm: _propTypes.default.func.isRequired,
|
|
386
457
|
locale: _propTypes.default.string,
|
|
387
458
|
timezone: _propTypes.default.string
|
|
@@ -394,7 +465,8 @@ var BanksList = (_dec = (0, _uiThemeable.themeable)(_theme.default, styles), _de
|
|
|
394
465
|
minChars: void 0,
|
|
395
466
|
locale: null,
|
|
396
467
|
timezone: null,
|
|
397
|
-
onShare: function onShare() {}
|
|
468
|
+
onShare: function onShare() {},
|
|
469
|
+
duplicateItemBanks: false
|
|
398
470
|
}, _class2.contextTypes = {
|
|
399
471
|
locale: _propTypes.default.string,
|
|
400
472
|
timezone: _propTypes.default.string
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.getItemAnalyses = void 0;
|
|
9
|
+
|
|
10
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
|
+
|
|
12
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
13
|
+
|
|
14
|
+
var _Fetcher = _interopRequireDefault(require("../../common/util/Fetcher.js"));
|
|
15
|
+
|
|
16
|
+
var fetcher = new _Fetcher.default();
|
|
17
|
+
|
|
18
|
+
var getItemAnalyses = /*#__PURE__*/function () {
|
|
19
|
+
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(quizId) {
|
|
20
|
+
var filter,
|
|
21
|
+
url,
|
|
22
|
+
_args = arguments;
|
|
23
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
24
|
+
while (1) {
|
|
25
|
+
switch (_context.prev = _context.next) {
|
|
26
|
+
case 0:
|
|
27
|
+
filter = _args.length > 1 && _args[1] !== void 0 ? _args[1] : 'last_attempt';
|
|
28
|
+
url = "/api/quizzes/".concat(quizId, "/analyses/item_analyses?filter=").concat(filter);
|
|
29
|
+
_context.next = 4;
|
|
30
|
+
return fetcher.get(url);
|
|
31
|
+
|
|
32
|
+
case 4:
|
|
33
|
+
return _context.abrupt("return", _context.sent);
|
|
34
|
+
|
|
35
|
+
case 5:
|
|
36
|
+
case "end":
|
|
37
|
+
return _context.stop();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}, _callee);
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
return function getItemAnalyses(_x) {
|
|
44
|
+
return _ref.apply(this, arguments);
|
|
45
|
+
};
|
|
46
|
+
}();
|
|
47
|
+
|
|
48
|
+
exports.getItemAnalyses = getItemAnalyses;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instructure/quiz-core",
|
|
3
|
-
"version": "17.60.1-rc.
|
|
3
|
+
"version": "17.60.1-rc.6+bdeab6ece",
|
|
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.1-rc.
|
|
45
|
-
"@instructure/quiz-i18n": "17.60.1-rc.
|
|
46
|
-
"@instructure/quiz-interactions": "17.60.1-rc.
|
|
47
|
-
"@instructure/quiz-number-input": "17.60.1-rc.
|
|
48
|
-
"@instructure/quiz-rce": "17.60.1-rc.
|
|
44
|
+
"@instructure/quiz-common": "17.60.1-rc.6+bdeab6ece",
|
|
45
|
+
"@instructure/quiz-i18n": "17.60.1-rc.6+bdeab6ece",
|
|
46
|
+
"@instructure/quiz-interactions": "17.60.1-rc.6+bdeab6ece",
|
|
47
|
+
"@instructure/quiz-number-input": "17.60.1-rc.6+bdeab6ece",
|
|
48
|
+
"@instructure/quiz-rce": "17.60.1-rc.6+bdeab6ece",
|
|
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.1-rc.
|
|
109
|
+
"instructure-validations": "17.60.1-rc.6+bdeab6ece",
|
|
110
110
|
"ipaddr.js": "^1.5.4",
|
|
111
111
|
"isomorphic-fetch": "^2.2.0",
|
|
112
112
|
"isuuid": "^0.1.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.1-rc.
|
|
160
|
+
"quiz-presets": "17.60.1-rc.6+bdeab6ece",
|
|
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": "
|
|
176
|
+
"gitHead": "bdeab6ecedb1d4c4575562092261ff564075bdfc"
|
|
177
177
|
}
|