@instructure/quiz-core 17.60.1-rc.4 → 17.60.1-rc.5

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.
@@ -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
- return /*#__PURE__*/React.createElement("div", {
188
- className: styles.bankInfo,
189
- "data-automation": "sdk-bank-info",
190
- tabIndex: "-1"
191
- }, /*#__PURE__*/React.createElement("div", {
192
- className: styles.bankTitle
193
- }, /*#__PURE__*/React.createElement(Link, {
194
- onClick: navigateToBank(bank.id),
195
- theme: {
196
- color: _this.theme.bankTitleLinkColor,
197
- hoverColor: _this.theme.bankTitleLinkHoverColor
198
- },
199
- "data-automation": "sdk-banks-list-bank-title-link"
200
- }, /*#__PURE__*/React.createElement(Heading, {
201
- as: "h2",
202
- level: "reset",
203
- "data-automation": "sdk-banks-list-bank-title-heading"
204
- }, bank.title))), _this.renderDetails(bank));
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
- return /*#__PURE__*/React.createElement("div", {
234
- className: styles.bankOptions
235
- }, /*#__PURE__*/React.createElement(IfFeature, {
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
- "data-automation": "sdk-shared-bank-share-link",
243
- icon: IconShareSolid,
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('Share bank {name}', {
289
+ }, /*#__PURE__*/React.createElement(ScreenReaderContent, null, t('Duplicate bank {name}', {
248
290
  name: bank.title
249
- })))), bank.canEdit() ? bankEditOptions : null);
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
@@ -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
- return /*#__PURE__*/_react.default.createElement("div", {
223
- className: styles.bankInfo,
224
- "data-automation": "sdk-bank-info",
225
- tabIndex: "-1"
226
- }, /*#__PURE__*/_react.default.createElement("div", {
227
- className: styles.bankTitle
228
- }, /*#__PURE__*/_react.default.createElement(_uiLink.Link, {
229
- onClick: navigateToBank(bank.id),
230
- theme: {
231
- color: _this.theme.bankTitleLinkColor,
232
- hoverColor: _this.theme.bankTitleLinkHoverColor
233
- },
234
- "data-automation": "sdk-banks-list-bank-title-link"
235
- }, /*#__PURE__*/_react.default.createElement(_uiHeading.Heading, {
236
- as: "h2",
237
- level: "reset",
238
- "data-automation": "sdk-banks-list-bank-title-heading"
239
- }, bank.title))), _this.renderDetails(bank));
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
- return /*#__PURE__*/_react.default.createElement("div", {
270
- className: styles.bankOptions
271
- }, /*#__PURE__*/_react.default.createElement(_index.default, {
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
- "data-automation": "sdk-shared-bank-share-link",
279
- icon: _uiIcons.IconShareSolid,
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)('Share bank {name}', {
326
+ }, /*#__PURE__*/_react.default.createElement(_uiA11yContent.ScreenReaderContent, null, (0, _formatMessage.default)('Duplicate bank {name}', {
284
327
  name: bank.title
285
- })))), bank.canEdit() ? bankEditOptions : null);
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/quiz-core",
3
- "version": "17.60.1-rc.4+90a605aaa",
3
+ "version": "17.60.1-rc.5+74e6a5a81",
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.4+90a605aaa",
45
- "@instructure/quiz-i18n": "17.60.1-rc.4+90a605aaa",
46
- "@instructure/quiz-interactions": "17.60.1-rc.4+90a605aaa",
47
- "@instructure/quiz-number-input": "17.60.1-rc.4+90a605aaa",
48
- "@instructure/quiz-rce": "17.60.1-rc.4+90a605aaa",
44
+ "@instructure/quiz-common": "17.60.1-rc.5+74e6a5a81",
45
+ "@instructure/quiz-i18n": "17.60.1-rc.5+74e6a5a81",
46
+ "@instructure/quiz-interactions": "17.60.1-rc.5+74e6a5a81",
47
+ "@instructure/quiz-number-input": "17.60.1-rc.5+74e6a5a81",
48
+ "@instructure/quiz-rce": "17.60.1-rc.5+74e6a5a81",
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.4+90a605aaa",
109
+ "instructure-validations": "17.60.1-rc.5+74e6a5a81",
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.4+90a605aaa",
160
+ "quiz-presets": "17.60.1-rc.5+74e6a5a81",
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": "90a605aaabd1d3f576627723a511156419373887"
176
+ "gitHead": "74e6a5a81e4b8238adfa4b8463bbfd919c32d00d"
177
177
  }