@pie-element/categorize 11.3.4-next.3 → 12.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +0 -11
  2. package/configure/CHANGELOG.md +0 -11
  3. package/configure/lib/__tests__/main.test.js +100 -0
  4. package/configure/lib/__tests__/utils.js +39 -0
  5. package/configure/lib/defaults.js +3 -6
  6. package/configure/lib/defaults.js.map +1 -1
  7. package/configure/lib/design/__tests__/builder.test.js +34 -0
  8. package/configure/lib/design/__tests__/buttons.test.js +36 -0
  9. package/configure/lib/design/__tests__/header.test.js +37 -0
  10. package/configure/lib/design/__tests__/index.test.js +125 -0
  11. package/configure/lib/design/__tests__/input-header.test.js +41 -0
  12. package/configure/lib/design/builder.js +16 -34
  13. package/configure/lib/design/builder.js.map +1 -1
  14. package/configure/lib/design/buttons.js +42 -96
  15. package/configure/lib/design/buttons.js.map +1 -1
  16. package/configure/lib/design/categories/RowLabel.js +34 -47
  17. package/configure/lib/design/categories/RowLabel.js.map +1 -1
  18. package/configure/lib/design/categories/__tests__/alternateResponses.test.js +93 -0
  19. package/configure/lib/design/categories/__tests__/category.test.js +65 -0
  20. package/configure/lib/design/categories/__tests__/choice-preview.test.js +52 -0
  21. package/configure/lib/design/categories/__tests__/droppable-placeholder.test.js +63 -0
  22. package/configure/lib/design/categories/__tests__/index.test.js +91 -0
  23. package/configure/lib/design/categories/alternateResponses.js +97 -252
  24. package/configure/lib/design/categories/alternateResponses.js.map +1 -1
  25. package/configure/lib/design/categories/category.js +136 -209
  26. package/configure/lib/design/categories/category.js.map +1 -1
  27. package/configure/lib/design/categories/choice-preview.js +62 -127
  28. package/configure/lib/design/categories/choice-preview.js.map +1 -1
  29. package/configure/lib/design/categories/droppable-placeholder.js +74 -166
  30. package/configure/lib/design/categories/droppable-placeholder.js.map +1 -1
  31. package/configure/lib/design/categories/index.js +196 -385
  32. package/configure/lib/design/categories/index.js.map +1 -1
  33. package/configure/lib/design/choices/__tests__/choice.test.js +62 -0
  34. package/configure/lib/design/choices/__tests__/config.test.js +66 -0
  35. package/configure/lib/design/choices/__tests__/index.test.js +70 -0
  36. package/configure/lib/design/choices/choice.js +156 -265
  37. package/configure/lib/design/choices/choice.js.map +1 -1
  38. package/configure/lib/design/choices/config.js +43 -99
  39. package/configure/lib/design/choices/config.js.map +1 -1
  40. package/configure/lib/design/choices/index.js +149 -237
  41. package/configure/lib/design/choices/index.js.map +1 -1
  42. package/configure/lib/design/header.js +58 -112
  43. package/configure/lib/design/header.js.map +1 -1
  44. package/configure/lib/design/index.js +633 -478
  45. package/configure/lib/design/index.js.map +1 -1
  46. package/configure/lib/design/input-header.js +95 -151
  47. package/configure/lib/design/input-header.js.map +1 -1
  48. package/configure/lib/design/utils.js +5 -16
  49. package/configure/lib/design/utils.js.map +1 -1
  50. package/configure/lib/index.js +121 -184
  51. package/configure/lib/index.js.map +1 -1
  52. package/configure/lib/main.js +31 -75
  53. package/configure/lib/main.js.map +1 -1
  54. package/configure/lib/utils.js +23 -33
  55. package/configure/lib/utils.js.map +1 -1
  56. package/configure/package.json +15 -15
  57. package/controller/CHANGELOG.md +0 -11
  58. package/controller/lib/__tests__/index.test.js +526 -0
  59. package/controller/lib/defaults.js +3 -6
  60. package/controller/lib/defaults.js.map +1 -1
  61. package/controller/lib/index.js +238 -319
  62. package/controller/lib/index.js.map +1 -1
  63. package/controller/lib/utils.js +29 -66
  64. package/controller/lib/utils.js.map +1 -1
  65. package/controller/package.json +5 -5
  66. package/docs/demo/.pie/.configure/package.json +10 -0
  67. package/docs/demo/.pie/.configure/yarn.lock +2181 -0
  68. package/docs/demo/.pie/.controllers/package.json +10 -0
  69. package/docs/demo/.pie/.controllers/yarn.lock +110 -0
  70. package/docs/demo/.pie/info.entry.js +89 -0
  71. package/docs/demo/.pie/info.webpack.config.js +119 -0
  72. package/docs/demo/.pie/package.json +10 -0
  73. package/docs/demo/.pie/yarn.lock +2190 -0
  74. package/docs/demo/pie.manifest.json +11 -0
  75. package/lib/__tests__/index.test.js +197 -0
  76. package/lib/categorize/__tests__/categories.test.js +138 -0
  77. package/lib/categorize/__tests__/category.test.js +137 -0
  78. package/lib/categorize/__tests__/choice.test.js +88 -0
  79. package/lib/categorize/__tests__/choices.test.js +118 -0
  80. package/lib/categorize/__tests__/droppable-placeholder.test.js +96 -0
  81. package/lib/categorize/__tests__/grid-content.test.js +48 -0
  82. package/lib/categorize/__tests__/index.test.js +152 -0
  83. package/lib/categorize/categories.js +107 -165
  84. package/lib/categorize/categories.js.map +1 -1
  85. package/lib/categorize/category.js +74 -124
  86. package/lib/categorize/category.js.map +1 -1
  87. package/lib/categorize/choice.js +119 -246
  88. package/lib/categorize/choice.js.map +1 -1
  89. package/lib/categorize/choices.js +67 -132
  90. package/lib/categorize/choices.js.map +1 -1
  91. package/lib/categorize/droppable-placeholder.js +47 -104
  92. package/lib/categorize/droppable-placeholder.js.map +1 -1
  93. package/lib/categorize/grid-content.js +40 -88
  94. package/lib/categorize/grid-content.js.map +1 -1
  95. package/lib/categorize/index.js +342 -318
  96. package/lib/categorize/index.js.map +1 -1
  97. package/lib/index.js +286 -307
  98. package/lib/index.js.map +1 -1
  99. package/package.json +16 -14
  100. package/esm/configure.js +0 -34401
  101. package/esm/configure.js.map +0 -1
  102. package/esm/controller.js +0 -1468
  103. package/esm/controller.js.map +0 -1
  104. package/esm/element.js +0 -13134
  105. package/esm/element.js.map +0 -1
  106. package/esm/package.json +0 -3
@@ -1,445 +1,256 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports["default"] = exports.Categories = void 0;
9
-
10
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
-
12
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
-
14
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
-
16
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
17
-
18
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
-
20
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
-
22
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
-
7
+ exports.default = exports.Categories = void 0;
24
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
25
-
26
9
  var _react = _interopRequireDefault(require("react"));
27
-
28
- var _reactDom = _interopRequireDefault(require("react-dom"));
29
-
30
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
31
-
32
- var _styles = require("@material-ui/core/styles");
33
-
11
+ var _styles = require("@mui/material/styles");
34
12
  var _configUi = require("@pie-lib/config-ui");
35
-
36
- var _classnames = _interopRequireDefault(require("classnames"));
37
-
38
- var _Info = _interopRequireDefault(require("@material-ui/icons/Info"));
39
-
40
- var _Tooltip = _interopRequireDefault(require("@material-ui/core/Tooltip"));
41
-
13
+ var _Info = _interopRequireDefault(require("@mui/icons-material/Info"));
14
+ var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
42
15
  var _categorize = require("@pie-lib/categorize");
43
-
44
16
  var _category = _interopRequireDefault(require("./category"));
45
-
46
17
  var _header = _interopRequireDefault(require("../header"));
47
-
48
18
  var _utils = require("../../utils");
49
-
50
19
  var _RowLabel = require("./RowLabel");
51
-
52
- var _mathRendering = require("@pie-lib/math-rendering");
53
-
54
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
55
-
56
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
57
-
58
- var styles = function styles(theme) {
59
- return {
60
- categories: {
61
- marginBottom: theme.spacing.unit * 3
62
- },
63
- categoriesHolder: {
64
- display: 'grid',
65
- gridRowGap: "".concat(theme.spacing.unit, "px"),
66
- gridColumnGap: "".concat(theme.spacing.unit, "px")
67
- },
68
- row: {
69
- display: 'grid',
70
- gridTemplateColumns: 'repeat(2, 1fr)',
71
- gridColumnGap: "".concat(theme.spacing.unit, "px"),
72
- alignItems: 'baseline',
73
- width: '100%',
74
- marginTop: theme.spacing.unit,
75
- marginBottom: 2 * theme.spacing.unit
76
- },
77
- rowLabel: {
78
- gridColumn: '1/3'
79
- },
80
- rowLabelHolder: {
81
- width: '100%'
82
- },
83
- tooltip: {
84
- fontSize: theme.typography.fontSize - 2,
85
- whiteSpace: 'pre',
86
- maxWidth: '500px'
87
- },
88
- errorText: {
89
- fontSize: theme.typography.fontSize - 2,
90
- color: theme.palette.error.main,
91
- paddingTop: theme.spacing.unit / 2
92
- }
93
- };
94
- };
95
-
96
- var Categories = /*#__PURE__*/function (_React$Component) {
97
- (0, _inherits2["default"])(Categories, _React$Component);
98
-
99
- var _super = _createSuper(Categories);
100
-
101
- function Categories() {
102
- var _this;
103
-
104
- (0, _classCallCheck2["default"])(this, Categories);
105
-
106
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
107
- args[_key] = arguments[_key];
108
- }
109
-
110
- _this = _super.call.apply(_super, [this].concat(args));
111
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
20
+ const CategoriesContainer = (0, _styles.styled)('div')(({
21
+ theme
22
+ }) => ({
23
+ marginBottom: theme.spacing(3)
24
+ }));
25
+ const CategoriesHolder = (0, _styles.styled)('div')(({
26
+ theme
27
+ }) => ({
28
+ display: 'grid',
29
+ gridRowGap: `${theme.spacing(1)}px`,
30
+ gridColumnGap: `${theme.spacing(1)}px`
31
+ }));
32
+ const StyledTooltip = (0, _styles.styled)(_Tooltip.default)(({
33
+ theme
34
+ }) => ({
35
+ '& .MuiTooltip-tooltip': {
36
+ fontSize: theme.typography.fontSize - 2,
37
+ whiteSpace: 'pre',
38
+ maxWidth: '500px'
39
+ }
40
+ }));
41
+ const ErrorText = (0, _styles.styled)('div')(({
42
+ theme
43
+ }) => ({
44
+ fontSize: theme.typography.fontSize - 2,
45
+ color: theme.palette.error.main,
46
+ paddingTop: theme.spacing(0.5)
47
+ }));
48
+ class Categories extends _react.default.Component {
49
+ constructor(...args) {
50
+ super(...args);
51
+ (0, _defineProperty2.default)(this, "state", {
112
52
  focusedEl: null
113
53
  });
114
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "add", function () {
115
- var _this$props = _this.props,
116
- model = _this$props.model,
117
- oldCategories = _this$props.categories;
118
- var categoriesPerRow = model.categoriesPerRow,
119
- correctResponse = model.correctResponse,
120
- allowAlternateEnabled = model.allowAlternateEnabled;
121
-
122
- var id = _configUi.choiceUtils.firstAvailableIndex(model.categories.map(function (a) {
123
- return a.id;
124
- }), 1);
125
-
126
- var data = {
127
- id: id,
54
+ (0, _defineProperty2.default)(this, "add", () => {
55
+ const {
56
+ model,
57
+ categories: oldCategories
58
+ } = this.props;
59
+ const {
60
+ categoriesPerRow,
61
+ correctResponse,
62
+ allowAlternateEnabled
63
+ } = model;
64
+ const id = _configUi.choiceUtils.firstAvailableIndex(model.categories.map(a => a.id), 1);
65
+ const data = {
66
+ id,
128
67
  label: 'Category ' + id
129
68
  };
130
- var addRowLabel = model.categories.length % categoriesPerRow === 0;
131
- var rowLabels = (0, _toConsumableArray2["default"])(model.rowLabels);
132
-
69
+ const addRowLabel = model.categories.length % categoriesPerRow === 0;
70
+ const rowLabels = [...model.rowLabels];
133
71
  if (addRowLabel) {
134
72
  rowLabels.push('');
135
73
  }
136
-
137
- _this.setState({
74
+ this.setState({
138
75
  focusedEl: oldCategories.length
139
- }, function () {
140
- _this.props.onModelChanged({
141
- rowLabels: rowLabels,
76
+ }, () => {
77
+ this.props.onModelChanged({
78
+ rowLabels,
142
79
  categories: model.categories.concat([data]),
143
- correctResponse: allowAlternateEnabled ? [].concat((0, _toConsumableArray2["default"])(correctResponse), [{
80
+ correctResponse: allowAlternateEnabled ? [...correctResponse, {
144
81
  category: id,
145
82
  choices: [],
146
83
  alternateResponses: []
147
- }]) : correctResponse
84
+ }] : correctResponse
148
85
  });
149
86
  });
150
87
  });
151
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "deleteFocusedEl", function () {
152
- _this.setState({
88
+ (0, _defineProperty2.default)(this, "deleteFocusedEl", () => {
89
+ this.setState({
153
90
  focusedEl: null
154
91
  });
155
92
  });
156
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "delete", function (category) {
157
- var _this$props2 = _this.props,
158
- model = _this$props2.model,
159
- onModelChanged = _this$props2.onModelChanged;
160
- var index = model.categories.findIndex(function (a) {
161
- return a.id === category.id;
162
- });
163
-
93
+ (0, _defineProperty2.default)(this, "delete", category => {
94
+ const {
95
+ model,
96
+ onModelChanged
97
+ } = this.props;
98
+ const index = model.categories.findIndex(a => a.id === category.id);
164
99
  if (index !== -1) {
165
100
  model.categories.splice(index, 1);
166
101
  model.correctResponse = (0, _categorize.removeCategory)(category.id, model.correctResponse);
167
102
  onModelChanged(model);
168
103
  }
169
104
  });
170
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "change", function (c) {
171
- var categories = _this.props.categories;
172
- var index = categories.findIndex(function (a) {
173
- return a.id === c.id;
174
- });
175
-
105
+ (0, _defineProperty2.default)(this, "change", c => {
106
+ const {
107
+ categories
108
+ } = this.props;
109
+ const index = categories.findIndex(a => a.id === c.id);
176
110
  if (index !== -1) {
177
111
  categories.splice(index, 1, c);
178
-
179
- _this.props.onModelChanged({
180
- categories: categories
112
+ this.props.onModelChanged({
113
+ categories
181
114
  });
182
115
  }
183
116
  });
184
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "addChoiceToCategory", function (addedChoice, categoryId) {
185
- var _this$props3 = _this.props,
186
- model = _this$props3.model,
187
- onModelChanged = _this$props3.onModelChanged;
188
-
189
- var _ref = model || {},
190
- _ref$choices = _ref.choices,
191
- choices = _ref$choices === void 0 ? [] : _ref$choices,
192
- _ref$correctResponse = _ref.correctResponse,
193
- correctResponse = _ref$correctResponse === void 0 ? [] : _ref$correctResponse,
194
- _ref$maxChoicesPerCat = _ref.maxChoicesPerCategory,
195
- maxChoicesPerCategory = _ref$maxChoicesPerCat === void 0 ? 0 : _ref$maxChoicesPerCat;
196
-
197
- var choice = (choices || []).find(function (choice) {
198
- return choice.id === addedChoice.id;
199
- });
200
- correctResponse = (0, _categorize.moveChoiceToCategory)(addedChoice.id, undefined, categoryId, 0, model.correctResponse); // if multiplePlacements not allowed, ensure the consistency in the other categories
201
-
202
- if (choice.categoryCount !== 0) {
203
- correctResponse = (0, _categorize.verifyAllowMultiplePlacements)(addedChoice, categoryId, correctResponse);
204
- }
205
-
206
- var maxCategoryChoices = (0, _utils.getMaxCategoryChoices)(model); // when maxChoicesPerCategory is set to 0, there is no limit so it should not be updated
207
-
208
- onModelChanged({
209
- correctResponse: correctResponse,
210
- maxChoicesPerCategory: maxChoicesPerCategory !== 0 && maxChoicesPerCategory < maxCategoryChoices ? maxChoicesPerCategory + 1 : maxChoicesPerCategory
211
- });
212
- });
213
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "deleteChoiceFromCategory", function (category, choice, choiceIndex) {
214
- var _this$props4 = _this.props,
215
- model = _this$props4.model,
216
- onModelChanged = _this$props4.onModelChanged;
217
- var correctResponse = (0, _categorize.removeChoiceFromCategory)(choice.id, category.id, choiceIndex, model.correctResponse);
218
- onModelChanged({
219
- correctResponse: correctResponse
220
- });
221
- });
222
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "moveChoice", function (choiceId, from, to, choiceIndex) {
223
- var _this$props5 = _this.props,
224
- model = _this$props5.model,
225
- onModelChanged = _this$props5.onModelChanged;
226
-
227
- var _ref2 = model || {},
228
- choices = _ref2.choices,
229
- _ref2$correctResponse = _ref2.correctResponse,
230
- correctResponse = _ref2$correctResponse === void 0 ? [] : _ref2$correctResponse,
231
- _ref2$maxChoicesPerCa = _ref2.maxChoicesPerCategory,
232
- maxChoicesPerCategory = _ref2$maxChoicesPerCa === void 0 ? 0 : _ref2$maxChoicesPerCa;
233
-
234
- var choice = (choices || []).find(function (choice) {
235
- return choice.id === choiceId;
236
- });
237
-
238
- if (to === from || !choice) {
239
- return;
240
- }
241
-
242
- if (choice.categoryCount !== 0) {
243
- correctResponse = (0, _categorize.moveChoiceToCategory)(choice.id, from, to, choiceIndex, correctResponse);
244
- correctResponse = (0, _categorize.verifyAllowMultiplePlacements)(choice, to, correctResponse);
245
- } else if (choice.categoryCount === 0) {
246
- correctResponse = (0, _categorize.moveChoiceToCategory)(choice.id, undefined, to, 0, correctResponse);
247
- }
248
-
249
- var maxCategoryChoices = (0, _utils.getMaxCategoryChoices)(model); // when maxChoicesPerCategory is set to 0, there is no limit so it should not be updated
250
-
117
+ (0, _defineProperty2.default)(this, "deleteChoiceFromCategory", (category, choice, choiceIndex) => {
118
+ const {
119
+ model,
120
+ onModelChanged
121
+ } = this.props;
122
+ const correctResponse = (0, _categorize.removeChoiceFromCategory)(choice.id, category.id, choiceIndex, model.correctResponse);
251
123
  onModelChanged({
252
- correctResponse: correctResponse,
253
- maxChoicesPerCategory: maxChoicesPerCategory !== 0 && maxChoicesPerCategory < maxCategoryChoices ? maxChoicesPerCategory + 1 : maxChoicesPerCategory
124
+ correctResponse
254
125
  });
255
126
  });
256
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeRowLabel", function (val, index) {
257
- var model = _this.props.model;
258
- var rowLabels = model.rowLabels;
259
- var newRowLabels = (0, _toConsumableArray2["default"])(rowLabels);
260
-
127
+ (0, _defineProperty2.default)(this, "changeRowLabel", (val, index) => {
128
+ const {
129
+ model
130
+ } = this.props;
131
+ const {
132
+ rowLabels
133
+ } = model;
134
+ const newRowLabels = [...rowLabels];
261
135
  if (newRowLabels.length < index) {
262
136
  newRowLabels.push(val);
263
137
  } else {
264
138
  newRowLabels[index] = val;
265
139
  }
266
-
267
- _this.props.onModelChanged({
140
+ this.props.onModelChanged({
268
141
  rowLabels: newRowLabels
269
142
  });
270
143
  });
271
- return _this;
272
144
  }
273
-
274
- (0, _createClass2["default"])(Categories, [{
275
- key: "componentDidMount",
276
- value: function componentDidMount() {
277
- try {
278
- // eslint-disable-next-line react/no-find-dom-node
279
- var domNode = _reactDom["default"].findDOMNode(this);
280
-
281
- (0, _mathRendering.renderMath)(domNode);
282
- } catch (e) {
283
- // Added try-catch block to handle "Unable to find node on an unmounted component" error from tests, thrown because of the usage of shallow
284
- console.error('DOM not mounted');
285
- }
286
- }
287
- }, {
288
- key: "componentDidUpdate",
289
- value: function componentDidUpdate() {
290
- try {
291
- // eslint-disable-next-line react/no-find-dom-node
292
- var domNode = _reactDom["default"].findDOMNode(this);
293
-
294
- (0, _mathRendering.renderMath)(domNode);
295
- } catch (e) {
296
- // Added try-catch block to handle "Unable to find node on an unmounted component" error from tests, thrown because of the usage of shallow
297
- console.error('DOM not mounted');
298
- }
299
- }
300
- }, {
301
- key: "render",
302
- value: function render() {
303
- var _this2 = this;
304
-
305
- var _this$props6 = this.props,
306
- model = _this$props6.model,
307
- classes = _this$props6.classes,
308
- className = _this$props6.className,
309
- categories = _this$props6.categories,
310
- imageSupport = _this$props6.imageSupport,
311
- uploadSoundSupport = _this$props6.uploadSoundSupport,
312
- toolbarOpts = _this$props6.toolbarOpts,
313
- spellCheck = _this$props6.spellCheck,
314
- configuration = _this$props6.configuration,
315
- defaultImageMaxHeight = _this$props6.defaultImageMaxHeight,
316
- defaultImageMaxWidth = _this$props6.defaultImageMaxWidth,
317
- _this$props6$mathMlOp = _this$props6.mathMlOptions,
318
- mathMlOptions = _this$props6$mathMlOp === void 0 ? {} : _this$props6$mathMlOp;
319
- var categoriesPerRow = model.categoriesPerRow,
320
- rowLabels = model.rowLabels,
321
- errors = model.errors;
322
-
323
- var _ref3 = errors || {},
324
- associationError = _ref3.associationError,
325
- categoriesError = _ref3.categoriesError,
326
- categoriesErrors = _ref3.categoriesErrors;
327
-
328
- var _ref4 = configuration || {},
329
- maxCategories = _ref4.maxCategories,
330
- _ref4$maxImageWidth = _ref4.maxImageWidth,
331
- maxImageWidth = _ref4$maxImageWidth === void 0 ? {} : _ref4$maxImageWidth,
332
- _ref4$maxImageHeight = _ref4.maxImageHeight,
333
- maxImageHeight = _ref4$maxImageHeight === void 0 ? {} : _ref4$maxImageHeight;
334
-
335
- var holderStyle = {
336
- gridTemplateColumns: "repeat(".concat(categoriesPerRow, ", 1fr)")
337
- };
338
- var validationMessage = (0, _utils.generateValidationMessage)(configuration);
339
- return /*#__PURE__*/_react["default"].createElement("div", {
340
- className: (0, _classnames["default"])(classes.categories, className)
341
- }, /*#__PURE__*/_react["default"].createElement(_header["default"], {
342
- label: "Categories",
343
- buttonLabel: "ADD A CATEGORY",
344
- onAdd: this.add,
345
- info: /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
346
- classes: {
347
- tooltip: classes.tooltip
348
- },
349
- disableFocusListener: true,
350
- disableTouchListener: true,
351
- placement: 'right',
352
- title: validationMessage
353
- }, /*#__PURE__*/_react["default"].createElement(_Info["default"], {
354
- fontSize: 'small',
355
- color: 'primary',
356
- style: {
357
- marginLeft: '5px'
358
- }
359
- })),
360
- buttonDisabled: maxCategories && categories && maxCategories === categories.length
361
- }), /*#__PURE__*/_react["default"].createElement("div", {
362
- className: classes.categoriesHolder,
363
- style: holderStyle
364
- }, categories.map(function (category, index) {
365
- var hasRowLabel = index % categoriesPerRow === 0;
366
- var rowIndex = index / categoriesPerRow;
367
- return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, {
368
- key: index
369
- }, hasRowLabel && /*#__PURE__*/_react["default"].createElement(_RowLabel.RowLabel, {
370
- categoriesPerRow: categoriesPerRow,
371
- disabled: false,
372
- rowIndex: rowIndex,
373
- markup: rowLabels[rowIndex] || '',
374
- onChange: function onChange(val) {
375
- return _this2.changeRowLabel(val, rowIndex);
376
- },
377
- imageSupport: imageSupport,
378
- toolbarOpts: toolbarOpts,
379
- spellCheck: spellCheck,
380
- maxImageWidth: maxImageWidth && maxImageWidth.rowLabel || defaultImageMaxWidth,
381
- maxImageHeight: maxImageHeight && maxImageHeight.rowLabel || defaultImageMaxHeight,
382
- uploadSoundSupport: uploadSoundSupport,
383
- mathMlOptions: mathMlOptions,
384
- configuration: configuration
385
- }), /*#__PURE__*/_react["default"].createElement(_category["default"], {
386
- imageSupport: imageSupport,
387
- focusedEl: _this2.state.focusedEl,
388
- deleteFocusedEl: _this2.deleteFocusedEl,
389
- index: index,
390
- category: category,
391
- error: categoriesErrors && categoriesErrors[category.id],
392
- onChange: _this2.change,
393
- onDelete: function onDelete() {
394
- return _this2["delete"](category);
395
- },
396
- onAddChoice: _this2.addChoiceToCategory,
397
- onMoveChoice: function onMoveChoice(choiceId, from, to, choiceIndex) {
398
- return _this2.moveChoice(choiceId, from, to, choiceIndex);
399
- },
400
- toolbarOpts: toolbarOpts,
401
- spellCheck: spellCheck,
402
- onDeleteChoice: function onDeleteChoice(choice, choiceIndex) {
403
- return _this2.deleteChoiceFromCategory(category, choice, choiceIndex);
404
- },
405
- maxImageWidth: maxImageWidth && maxImageWidth.categoryLabel || defaultImageMaxWidth,
406
- maxImageHeight: maxImageHeight && maxImageHeight.categoryLabel || defaultImageMaxHeight,
407
- uploadSoundSupport: uploadSoundSupport,
408
- configuration: configuration
409
- }));
410
- })), associationError && /*#__PURE__*/_react["default"].createElement("div", {
411
- className: classes.errorText
412
- }, associationError), categoriesError && /*#__PURE__*/_react["default"].createElement("div", {
413
- className: classes.errorText
414
- }, categoriesError));
415
- }
416
- }]);
417
- return Categories;
418
- }(_react["default"].Component);
419
-
145
+ render() {
146
+ const {
147
+ model,
148
+ categories,
149
+ imageSupport,
150
+ uploadSoundSupport,
151
+ toolbarOpts,
152
+ spellCheck,
153
+ configuration,
154
+ defaultImageMaxHeight,
155
+ defaultImageMaxWidth,
156
+ mathMlOptions = {}
157
+ } = this.props;
158
+ const {
159
+ categoriesPerRow,
160
+ rowLabels,
161
+ errors
162
+ } = model;
163
+ const {
164
+ associationError,
165
+ categoriesError,
166
+ categoriesErrors
167
+ } = errors || {};
168
+ const {
169
+ maxCategories,
170
+ maxImageWidth = {},
171
+ maxImageHeight = {}
172
+ } = configuration || {};
173
+ const holderStyle = {
174
+ gridTemplateColumns: `repeat(${categoriesPerRow}, 1fr)`
175
+ };
176
+ const validationMessage = (0, _utils.generateValidationMessage)(configuration);
177
+ return /*#__PURE__*/_react.default.createElement(CategoriesContainer, null, /*#__PURE__*/_react.default.createElement(_header.default, {
178
+ label: "Categories",
179
+ buttonLabel: "ADD A CATEGORY",
180
+ onAdd: this.add,
181
+ info: /*#__PURE__*/_react.default.createElement(StyledTooltip, {
182
+ disableFocusListener: true,
183
+ disableTouchListener: true,
184
+ placement: 'right',
185
+ title: validationMessage
186
+ }, /*#__PURE__*/_react.default.createElement(_Info.default, {
187
+ fontSize: 'small',
188
+ color: 'primary',
189
+ style: {
190
+ marginLeft: '5px'
191
+ }
192
+ })),
193
+ buttonDisabled: maxCategories && categories && maxCategories === categories.length
194
+ }), /*#__PURE__*/_react.default.createElement(CategoriesHolder, {
195
+ style: holderStyle
196
+ }, categories.map((category, index) => {
197
+ const hasRowLabel = index % categoriesPerRow === 0;
198
+ const rowIndex = index / categoriesPerRow;
199
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {
200
+ key: index
201
+ }, hasRowLabel && /*#__PURE__*/_react.default.createElement(_RowLabel.RowLabel, {
202
+ categoriesPerRow: categoriesPerRow,
203
+ disabled: false,
204
+ rowIndex: rowIndex,
205
+ markup: rowLabels[rowIndex] || '',
206
+ onChange: val => this.changeRowLabel(val, rowIndex),
207
+ imageSupport: imageSupport,
208
+ toolbarOpts: toolbarOpts,
209
+ spellCheck: spellCheck,
210
+ maxImageWidth: maxImageWidth && maxImageWidth.rowLabel || defaultImageMaxWidth,
211
+ maxImageHeight: maxImageHeight && maxImageHeight.rowLabel || defaultImageMaxHeight,
212
+ uploadSoundSupport: uploadSoundSupport,
213
+ mathMlOptions: mathMlOptions,
214
+ configuration: configuration
215
+ }), /*#__PURE__*/_react.default.createElement(_category.default, {
216
+ imageSupport: imageSupport,
217
+ focusedEl: this.state.focusedEl,
218
+ deleteFocusedEl: this.deleteFocusedEl,
219
+ index: index,
220
+ category: category,
221
+ error: categoriesErrors && categoriesErrors[category.id],
222
+ onChange: this.change,
223
+ onDelete: () => this.delete(category),
224
+ toolbarOpts: toolbarOpts,
225
+ spellCheck: spellCheck,
226
+ onDeleteChoice: (choice, choiceIndex) => this.deleteChoiceFromCategory(category, choice, choiceIndex),
227
+ maxImageWidth: maxImageWidth && maxImageWidth.categoryLabel || defaultImageMaxWidth,
228
+ maxImageHeight: maxImageHeight && maxImageHeight.categoryLabel || defaultImageMaxHeight,
229
+ uploadSoundSupport: uploadSoundSupport,
230
+ configuration: configuration,
231
+ alternateResponseIndex: undefined
232
+ }));
233
+ })), associationError && /*#__PURE__*/_react.default.createElement(ErrorText, null, associationError), categoriesError && /*#__PURE__*/_react.default.createElement(ErrorText, null, categoriesError));
234
+ }
235
+ }
420
236
  exports.Categories = Categories;
421
- (0, _defineProperty2["default"])(Categories, "propTypes", {
422
- defaultImageMaxHeight: _propTypes["default"].number,
423
- defaultImageMaxWidth: _propTypes["default"].number,
424
- imageSupport: _propTypes["default"].shape({
425
- add: _propTypes["default"].func.isRequired,
426
- "delete": _propTypes["default"].func.isRequired
237
+ (0, _defineProperty2.default)(Categories, "propTypes", {
238
+ defaultImageMaxHeight: _propTypes.default.number,
239
+ defaultImageMaxWidth: _propTypes.default.number,
240
+ imageSupport: _propTypes.default.shape({
241
+ add: _propTypes.default.func.isRequired,
242
+ delete: _propTypes.default.func.isRequired
427
243
  }),
428
- uploadSoundSupport: _propTypes["default"].shape({
429
- add: _propTypes["default"].func.isRequired,
430
- "delete": _propTypes["default"].func.isRequired
244
+ uploadSoundSupport: _propTypes.default.shape({
245
+ add: _propTypes.default.func.isRequired,
246
+ delete: _propTypes.default.func.isRequired
431
247
  }),
432
- classes: _propTypes["default"].object.isRequired,
433
- className: _propTypes["default"].string,
434
- categories: _propTypes["default"].array,
435
- onModelChanged: _propTypes["default"].func,
436
- model: _propTypes["default"].object.isRequired,
437
- configuration: _propTypes["default"].object.isRequired,
438
- toolbarOpts: _propTypes["default"].object,
439
- spellCheck: _propTypes["default"].bool
248
+ categories: _propTypes.default.array,
249
+ onModelChanged: _propTypes.default.func,
250
+ model: _propTypes.default.object.isRequired,
251
+ configuration: _propTypes.default.object.isRequired,
252
+ toolbarOpts: _propTypes.default.object,
253
+ spellCheck: _propTypes.default.bool
440
254
  });
441
-
442
- var _default = (0, _styles.withStyles)(styles)(Categories);
443
-
444
- exports["default"] = _default;
445
- //# sourceMappingURL=index.js.map
255
+ var _default = exports.default = Categories;
256
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfc3R5bGVzIiwiX2NvbmZpZ1VpIiwiX0luZm8iLCJfVG9vbHRpcCIsIl9jYXRlZ29yaXplIiwiX2NhdGVnb3J5IiwiX2hlYWRlciIsIl91dGlscyIsIl9Sb3dMYWJlbCIsIkNhdGVnb3JpZXNDb250YWluZXIiLCJzdHlsZWQiLCJ0aGVtZSIsIm1hcmdpbkJvdHRvbSIsInNwYWNpbmciLCJDYXRlZ29yaWVzSG9sZGVyIiwiZGlzcGxheSIsImdyaWRSb3dHYXAiLCJncmlkQ29sdW1uR2FwIiwiU3R5bGVkVG9vbHRpcCIsIlRvb2x0aXAiLCJmb250U2l6ZSIsInR5cG9ncmFwaHkiLCJ3aGl0ZVNwYWNlIiwibWF4V2lkdGgiLCJFcnJvclRleHQiLCJjb2xvciIsInBhbGV0dGUiLCJlcnJvciIsIm1haW4iLCJwYWRkaW5nVG9wIiwiQ2F0ZWdvcmllcyIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJhcmdzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJmb2N1c2VkRWwiLCJtb2RlbCIsImNhdGVnb3JpZXMiLCJvbGRDYXRlZ29yaWVzIiwicHJvcHMiLCJjYXRlZ29yaWVzUGVyUm93IiwiY29ycmVjdFJlc3BvbnNlIiwiYWxsb3dBbHRlcm5hdGVFbmFibGVkIiwiaWQiLCJ1dGlscyIsImZpcnN0QXZhaWxhYmxlSW5kZXgiLCJtYXAiLCJhIiwiZGF0YSIsImxhYmVsIiwiYWRkUm93TGFiZWwiLCJsZW5ndGgiLCJyb3dMYWJlbHMiLCJwdXNoIiwic2V0U3RhdGUiLCJvbk1vZGVsQ2hhbmdlZCIsImNvbmNhdCIsImNhdGVnb3J5IiwiY2hvaWNlcyIsImFsdGVybmF0ZVJlc3BvbnNlcyIsImluZGV4IiwiZmluZEluZGV4Iiwic3BsaWNlIiwicmVtb3ZlQ2F0ZWdvcnkiLCJjIiwiY2hvaWNlIiwiY2hvaWNlSW5kZXgiLCJyZW1vdmVDaG9pY2VGcm9tQ2F0ZWdvcnkiLCJ2YWwiLCJuZXdSb3dMYWJlbHMiLCJyZW5kZXIiLCJpbWFnZVN1cHBvcnQiLCJ1cGxvYWRTb3VuZFN1cHBvcnQiLCJ0b29sYmFyT3B0cyIsInNwZWxsQ2hlY2siLCJjb25maWd1cmF0aW9uIiwiZGVmYXVsdEltYWdlTWF4SGVpZ2h0IiwiZGVmYXVsdEltYWdlTWF4V2lkdGgiLCJtYXRoTWxPcHRpb25zIiwiZXJyb3JzIiwiYXNzb2NpYXRpb25FcnJvciIsImNhdGVnb3JpZXNFcnJvciIsImNhdGVnb3JpZXNFcnJvcnMiLCJtYXhDYXRlZ29yaWVzIiwibWF4SW1hZ2VXaWR0aCIsIm1heEltYWdlSGVpZ2h0IiwiaG9sZGVyU3R5bGUiLCJncmlkVGVtcGxhdGVDb2x1bW5zIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJnZW5lcmF0ZVZhbGlkYXRpb25NZXNzYWdlIiwiY3JlYXRlRWxlbWVudCIsImJ1dHRvbkxhYmVsIiwib25BZGQiLCJhZGQiLCJpbmZvIiwiZGlzYWJsZUZvY3VzTGlzdGVuZXIiLCJkaXNhYmxlVG91Y2hMaXN0ZW5lciIsInBsYWNlbWVudCIsInRpdGxlIiwic3R5bGUiLCJtYXJnaW5MZWZ0IiwiYnV0dG9uRGlzYWJsZWQiLCJoYXNSb3dMYWJlbCIsInJvd0luZGV4IiwiRnJhZ21lbnQiLCJrZXkiLCJSb3dMYWJlbCIsImRpc2FibGVkIiwibWFya3VwIiwib25DaGFuZ2UiLCJjaGFuZ2VSb3dMYWJlbCIsInJvd0xhYmVsIiwic3RhdGUiLCJkZWxldGVGb2N1c2VkRWwiLCJjaGFuZ2UiLCJvbkRlbGV0ZSIsImRlbGV0ZSIsIm9uRGVsZXRlQ2hvaWNlIiwiZGVsZXRlQ2hvaWNlRnJvbUNhdGVnb3J5IiwiY2F0ZWdvcnlMYWJlbCIsImFsdGVybmF0ZVJlc3BvbnNlSW5kZXgiLCJ1bmRlZmluZWQiLCJleHBvcnRzIiwiUHJvcFR5cGVzIiwibnVtYmVyIiwic2hhcGUiLCJmdW5jIiwiaXNSZXF1aXJlZCIsImFycmF5Iiwib2JqZWN0IiwiYm9vbCIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Rlc2lnbi9jYXRlZ29yaWVzL2luZGV4LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCB7IGNob2ljZVV0aWxzIGFzIHV0aWxzIH0gZnJvbSAnQHBpZS1saWIvY29uZmlnLXVpJztcbmltcG9ydCBJbmZvIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvSW5mbyc7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICdAbXVpL21hdGVyaWFsL1Rvb2x0aXAnO1xuaW1wb3J0IHtcbiAgcmVtb3ZlQ2F0ZWdvcnksXG4gIHJlbW92ZUNob2ljZUZyb21DYXRlZ29yeSxcbn0gZnJvbSAnQHBpZS1saWIvY2F0ZWdvcml6ZSc7XG5cbmltcG9ydCBDYXRlZ29yeSBmcm9tICcuL2NhdGVnb3J5JztcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi4vaGVhZGVyJztcbmltcG9ydCB7IGdlbmVyYXRlVmFsaWRhdGlvbk1lc3NhZ2UgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBSb3dMYWJlbCB9IGZyb20gJy4vUm93TGFiZWwnO1xuXG5jb25zdCBDYXRlZ29yaWVzQ29udGFpbmVyID0gc3R5bGVkKCdkaXYnKSgoeyB0aGVtZSB9KSA9PiAoe1xuICBtYXJnaW5Cb3R0b206IHRoZW1lLnNwYWNpbmcoMyksXG59KSk7XG5cbmNvbnN0IENhdGVnb3JpZXNIb2xkZXIgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGRpc3BsYXk6ICdncmlkJyxcbiAgZ3JpZFJvd0dhcDogYCR7dGhlbWUuc3BhY2luZygxKX1weGAsXG4gIGdyaWRDb2x1bW5HYXA6IGAke3RoZW1lLnNwYWNpbmcoMSl9cHhgLFxufSkpO1xuXG5jb25zdCBTdHlsZWRUb29sdGlwID0gc3R5bGVkKFRvb2x0aXApKCh7IHRoZW1lIH0pID0+ICh7XG4gICcmIC5NdWlUb29sdGlwLXRvb2x0aXAnOiB7XG4gICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkuZm9udFNpemUgLSAyLFxuICAgIHdoaXRlU3BhY2U6ICdwcmUnLFxuICAgIG1heFdpZHRoOiAnNTAwcHgnLFxuICB9LFxufSkpO1xuXG5jb25zdCBFcnJvclRleHQgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGZvbnRTaXplOiB0aGVtZS50eXBvZ3JhcGh5LmZvbnRTaXplIC0gMixcbiAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygwLjUpLFxufSkpO1xuXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcmllcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgZGVmYXVsdEltYWdlTWF4SGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGRlZmF1bHRJbWFnZU1heFdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGltYWdlU3VwcG9ydDogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGFkZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGRlbGV0ZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB9KSxcbiAgICB1cGxvYWRTb3VuZFN1cHBvcnQ6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBhZGQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBkZWxldGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgfSksXG4gICAgY2F0ZWdvcmllczogUHJvcFR5cGVzLmFycmF5LFxuICAgIG9uTW9kZWxDaGFuZ2VkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBtb2RlbDogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIGNvbmZpZ3VyYXRpb246IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICB0b29sYmFyT3B0czogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBzcGVsbENoZWNrOiBQcm9wVHlwZXMuYm9vbCxcbiAgfTtcblxuICBzdGF0ZSA9IHtcbiAgICBmb2N1c2VkRWw6IG51bGwsXG4gIH07XG5cbiAgYWRkID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwsIGNhdGVnb3JpZXM6IG9sZENhdGVnb3JpZXMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBjYXRlZ29yaWVzUGVyUm93LCBjb3JyZWN0UmVzcG9uc2UsIGFsbG93QWx0ZXJuYXRlRW5hYmxlZCB9ID0gbW9kZWw7XG5cbiAgICBjb25zdCBpZCA9IHV0aWxzLmZpcnN0QXZhaWxhYmxlSW5kZXgoXG4gICAgICBtb2RlbC5jYXRlZ29yaWVzLm1hcCgoYSkgPT4gYS5pZCksXG4gICAgICAxLFxuICAgICk7XG4gICAgY29uc3QgZGF0YSA9IHsgaWQsIGxhYmVsOiAnQ2F0ZWdvcnkgJyArIGlkIH07XG4gICAgY29uc3QgYWRkUm93TGFiZWwgPSBtb2RlbC5jYXRlZ29yaWVzLmxlbmd0aCAlIGNhdGVnb3JpZXNQZXJSb3cgPT09IDA7XG4gICAgY29uc3Qgcm93TGFiZWxzID0gWy4uLm1vZGVsLnJvd0xhYmVsc107XG5cbiAgICBpZiAoYWRkUm93TGFiZWwpIHtcbiAgICAgIHJvd0xhYmVscy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKFxuICAgICAge1xuICAgICAgICBmb2N1c2VkRWw6IG9sZENhdGVnb3JpZXMubGVuZ3RoLFxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbk1vZGVsQ2hhbmdlZCh7XG4gICAgICAgICAgcm93TGFiZWxzLFxuICAgICAgICAgIGNhdGVnb3JpZXM6IG1vZGVsLmNhdGVnb3JpZXMuY29uY2F0KFtkYXRhXSksXG4gICAgICAgICAgY29ycmVjdFJlc3BvbnNlOiBhbGxvd0FsdGVybmF0ZUVuYWJsZWRcbiAgICAgICAgICAgID8gWy4uLmNvcnJlY3RSZXNwb25zZSwgeyBjYXRlZ29yeTogaWQsIGNob2ljZXM6IFtdLCBhbHRlcm5hdGVSZXNwb25zZXM6IFtdIH1dXG4gICAgICAgICAgICA6IGNvcnJlY3RSZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG4gIH07XG5cbiAgZGVsZXRlRm9jdXNlZEVsID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZm9jdXNlZEVsOiBudWxsLFxuICAgIH0pO1xuICB9O1xuXG4gIGRlbGV0ZSA9IChjYXRlZ29yeSkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwsIG9uTW9kZWxDaGFuZ2VkIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGluZGV4ID0gbW9kZWwuY2F0ZWdvcmllcy5maW5kSW5kZXgoKGEpID0+IGEuaWQgPT09IGNhdGVnb3J5LmlkKTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIG1vZGVsLmNhdGVnb3JpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIG1vZGVsLmNvcnJlY3RSZXNwb25zZSA9IHJlbW92ZUNhdGVnb3J5KGNhdGVnb3J5LmlkLCBtb2RlbC5jb3JyZWN0UmVzcG9uc2UpO1xuICAgICAgb25Nb2RlbENoYW5nZWQobW9kZWwpO1xuICAgIH1cbiAgfTtcblxuICBjaGFuZ2UgPSAoYykgPT4ge1xuICAgIGNvbnN0IHsgY2F0ZWdvcmllcyB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBpbmRleCA9IGNhdGVnb3JpZXMuZmluZEluZGV4KChhKSA9PiBhLmlkID09PSBjLmlkKTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGNhdGVnb3JpZXMuc3BsaWNlKGluZGV4LCAxLCBjKTtcbiAgICAgIHRoaXMucHJvcHMub25Nb2RlbENoYW5nZWQoeyBjYXRlZ29yaWVzIH0pO1xuICAgIH1cbiAgfTtcblxuICBkZWxldGVDaG9pY2VGcm9tQ2F0ZWdvcnkgPSAoY2F0ZWdvcnksIGNob2ljZSwgY2hvaWNlSW5kZXgpID0+IHtcbiAgICBjb25zdCB7IG1vZGVsLCBvbk1vZGVsQ2hhbmdlZCB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBjb3JyZWN0UmVzcG9uc2UgPSByZW1vdmVDaG9pY2VGcm9tQ2F0ZWdvcnkoY2hvaWNlLmlkLCBjYXRlZ29yeS5pZCwgY2hvaWNlSW5kZXgsIG1vZGVsLmNvcnJlY3RSZXNwb25zZSk7XG5cbiAgICBvbk1vZGVsQ2hhbmdlZCh7IGNvcnJlY3RSZXNwb25zZSB9KTtcbiAgfTtcblxuICBjaGFuZ2VSb3dMYWJlbCA9ICh2YWwsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgeyBtb2RlbCB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHJvd0xhYmVscyB9ID0gbW9kZWw7XG4gICAgY29uc3QgbmV3Um93TGFiZWxzID0gWy4uLnJvd0xhYmVsc107XG5cbiAgICBpZiAobmV3Um93TGFiZWxzLmxlbmd0aCA8IGluZGV4KSB7XG4gICAgICBuZXdSb3dMYWJlbHMucHVzaCh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdSb3dMYWJlbHNbaW5kZXhdID0gdmFsO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMub25Nb2RlbENoYW5nZWQoe1xuICAgICAgcm93TGFiZWxzOiBuZXdSb3dMYWJlbHMsXG4gICAgfSk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1vZGVsLFxuICAgICAgY2F0ZWdvcmllcyxcbiAgICAgIGltYWdlU3VwcG9ydCxcbiAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydCxcbiAgICAgIHRvb2xiYXJPcHRzLFxuICAgICAgc3BlbGxDaGVjayxcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICBkZWZhdWx0SW1hZ2VNYXhIZWlnaHQsXG4gICAgICBkZWZhdWx0SW1hZ2VNYXhXaWR0aCxcbiAgICAgIG1hdGhNbE9wdGlvbnMgPSB7fSxcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IHsgY2F0ZWdvcmllc1BlclJvdywgcm93TGFiZWxzLCBlcnJvcnMgfSA9IG1vZGVsO1xuICAgIGNvbnN0IHsgYXNzb2NpYXRpb25FcnJvciwgY2F0ZWdvcmllc0Vycm9yLCBjYXRlZ29yaWVzRXJyb3JzIH0gPSBlcnJvcnMgfHwge307XG4gICAgY29uc3QgeyBtYXhDYXRlZ29yaWVzLCBtYXhJbWFnZVdpZHRoID0ge30sIG1heEltYWdlSGVpZ2h0ID0ge30gfSA9IGNvbmZpZ3VyYXRpb24gfHwge307XG4gICAgY29uc3QgaG9sZGVyU3R5bGUgPSB7XG4gICAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiBgcmVwZWF0KCR7Y2F0ZWdvcmllc1BlclJvd30sIDFmcilgLFxuICAgIH07XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZSA9IGdlbmVyYXRlVmFsaWRhdGlvbk1lc3NhZ2UoY29uZmlndXJhdGlvbik7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPENhdGVnb3JpZXNDb250YWluZXI+XG4gICAgICAgIDxIZWFkZXJcbiAgICAgICAgICBsYWJlbD1cIkNhdGVnb3JpZXNcIlxuICAgICAgICAgIGJ1dHRvbkxhYmVsPVwiQUREIEEgQ0FURUdPUllcIlxuICAgICAgICAgIG9uQWRkPXt0aGlzLmFkZH1cbiAgICAgICAgICBpbmZvPXtcbiAgICAgICAgICAgIDxTdHlsZWRUb29sdGlwXG4gICAgICAgICAgICAgIGRpc2FibGVGb2N1c0xpc3RlbmVyXG4gICAgICAgICAgICAgIGRpc2FibGVUb3VjaExpc3RlbmVyXG4gICAgICAgICAgICAgIHBsYWNlbWVudD17J3JpZ2h0J31cbiAgICAgICAgICAgICAgdGl0bGU9e3ZhbGlkYXRpb25NZXNzYWdlfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8SW5mbyBmb250U2l6ZT17J3NtYWxsJ30gY29sb3I9eydwcmltYXJ5J30gc3R5bGU9e3sgbWFyZ2luTGVmdDogJzVweCcgfX0gLz5cbiAgICAgICAgICAgIDwvU3R5bGVkVG9vbHRpcD5cbiAgICAgICAgICB9XG4gICAgICAgICAgYnV0dG9uRGlzYWJsZWQ9e21heENhdGVnb3JpZXMgJiYgY2F0ZWdvcmllcyAmJiBtYXhDYXRlZ29yaWVzID09PSBjYXRlZ29yaWVzLmxlbmd0aH1cbiAgICAgICAgLz5cblxuICAgICAgICA8Q2F0ZWdvcmllc0hvbGRlciBzdHlsZT17aG9sZGVyU3R5bGV9PlxuICAgICAgICAgIHtjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnksIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYXNSb3dMYWJlbCA9IGluZGV4ICUgY2F0ZWdvcmllc1BlclJvdyA9PT0gMDtcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gaW5kZXggLyBjYXRlZ29yaWVzUGVyUm93O1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmRleH0+XG4gICAgICAgICAgICAgICAge2hhc1Jvd0xhYmVsICYmIChcbiAgICAgICAgICAgICAgICAgIDxSb3dMYWJlbFxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzUGVyUm93PXtjYXRlZ29yaWVzUGVyUm93fVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4PXtyb3dJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgbWFya3VwPXtyb3dMYWJlbHNbcm93SW5kZXhdIHx8ICcnfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbCkgPT4gdGhpcy5jaGFuZ2VSb3dMYWJlbCh2YWwsIHJvd0luZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VTdXBwb3J0PXtpbWFnZVN1cHBvcnR9XG4gICAgICAgICAgICAgICAgICAgIHRvb2xiYXJPcHRzPXt0b29sYmFyT3B0c31cbiAgICAgICAgICAgICAgICAgICAgc3BlbGxDaGVjaz17c3BlbGxDaGVja31cbiAgICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VXaWR0aD17KG1heEltYWdlV2lkdGggJiYgbWF4SW1hZ2VXaWR0aC5yb3dMYWJlbCkgfHwgZGVmYXVsdEltYWdlTWF4V2lkdGh9XG4gICAgICAgICAgICAgICAgICAgIG1heEltYWdlSGVpZ2h0PXsobWF4SW1hZ2VIZWlnaHQgJiYgbWF4SW1hZ2VIZWlnaHQucm93TGFiZWwpIHx8IGRlZmF1bHRJbWFnZU1heEhlaWdodH1cbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkU291bmRTdXBwb3J0PXt1cGxvYWRTb3VuZFN1cHBvcnR9XG4gICAgICAgICAgICAgICAgICAgIG1hdGhNbE9wdGlvbnM9e21hdGhNbE9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb249e2NvbmZpZ3VyYXRpb259XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICA8Q2F0ZWdvcnlcbiAgICAgICAgICAgICAgICAgIGltYWdlU3VwcG9ydD17aW1hZ2VTdXBwb3J0fVxuICAgICAgICAgICAgICAgICAgZm9jdXNlZEVsPXt0aGlzLnN0YXRlLmZvY3VzZWRFbH1cbiAgICAgICAgICAgICAgICAgIGRlbGV0ZUZvY3VzZWRFbD17dGhpcy5kZWxldGVGb2N1c2VkRWx9XG4gICAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAgICBjYXRlZ29yeT17Y2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICBlcnJvcj17Y2F0ZWdvcmllc0Vycm9ycyAmJiBjYXRlZ29yaWVzRXJyb3JzW2NhdGVnb3J5LmlkXX1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmNoYW5nZX1cbiAgICAgICAgICAgICAgICAgIG9uRGVsZXRlPXsoKSA9PiB0aGlzLmRlbGV0ZShjYXRlZ29yeSl9XG4gICAgICAgICAgICAgICAgICB0b29sYmFyT3B0cz17dG9vbGJhck9wdHN9XG4gICAgICAgICAgICAgICAgICBzcGVsbENoZWNrPXtzcGVsbENoZWNrfVxuICAgICAgICAgICAgICAgICAgb25EZWxldGVDaG9pY2U9eyhjaG9pY2UsIGNob2ljZUluZGV4KSA9PiB0aGlzLmRlbGV0ZUNob2ljZUZyb21DYXRlZ29yeShjYXRlZ29yeSwgY2hvaWNlLCBjaG9pY2VJbmRleCl9XG4gICAgICAgICAgICAgICAgICBtYXhJbWFnZVdpZHRoPXsobWF4SW1hZ2VXaWR0aCAmJiBtYXhJbWFnZVdpZHRoLmNhdGVnb3J5TGFiZWwpIHx8IGRlZmF1bHRJbWFnZU1heFdpZHRofVxuICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VIZWlnaHQ9eyhtYXhJbWFnZUhlaWdodCAmJiBtYXhJbWFnZUhlaWdodC5jYXRlZ29yeUxhYmVsKSB8fCBkZWZhdWx0SW1hZ2VNYXhIZWlnaHR9XG4gICAgICAgICAgICAgICAgICB1cGxvYWRTb3VuZFN1cHBvcnQ9e3VwbG9hZFNvdW5kU3VwcG9ydH1cbiAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb249e2NvbmZpZ3VyYXRpb259XG4gICAgICAgICAgICAgICAgICBhbHRlcm5hdGVSZXNwb25zZUluZGV4PXt1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvQ2F0ZWdvcmllc0hvbGRlcj5cblxuICAgICAgICB7YXNzb2NpYXRpb25FcnJvciAmJiA8RXJyb3JUZXh0Pnthc3NvY2lhdGlvbkVycm9yfTwvRXJyb3JUZXh0Pn1cbiAgICAgICAge2NhdGVnb3JpZXNFcnJvciAmJiA8RXJyb3JUZXh0PntjYXRlZ29yaWVzRXJyb3J9PC9FcnJvclRleHQ+fVxuICAgICAgPC9DYXRlZ29yaWVzQ29udGFpbmVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2F0ZWdvcmllcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENB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