@pie-lib/editable-html 10.0.0-beta.7 → 10.0.0

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 (118) hide show
  1. package/CHANGELOG.json +1 -1
  2. package/CHANGELOG.md +81 -0
  3. package/LICENSE.md +5 -0
  4. package/lib/editor.js +410 -543
  5. package/lib/editor.js.map +1 -1
  6. package/lib/index.js +200 -101
  7. package/lib/index.js.map +1 -1
  8. package/lib/parse-html.js +5 -6
  9. package/lib/parse-html.js.map +1 -1
  10. package/lib/plugins/characters/custom-popper.js +12 -2
  11. package/lib/plugins/characters/custom-popper.js.map +1 -1
  12. package/lib/plugins/characters/index.js +71 -19
  13. package/lib/plugins/characters/index.js.map +1 -1
  14. package/lib/plugins/characters/utils.js.map +1 -1
  15. package/lib/plugins/html/icons/index.js +38 -0
  16. package/lib/plugins/html/icons/index.js.map +1 -0
  17. package/lib/plugins/html/index.js +75 -0
  18. package/lib/plugins/html/index.js.map +1 -0
  19. package/lib/plugins/image/alt-dialog.js +26 -0
  20. package/lib/plugins/image/alt-dialog.js.map +1 -1
  21. package/lib/plugins/image/component.js +124 -90
  22. package/lib/plugins/image/component.js.map +1 -1
  23. package/lib/plugins/image/image-toolbar.js +45 -7
  24. package/lib/plugins/image/image-toolbar.js.map +1 -1
  25. package/lib/plugins/image/index.js +91 -113
  26. package/lib/plugins/image/index.js.map +1 -1
  27. package/lib/plugins/image/insert-image-handler.js +54 -72
  28. package/lib/plugins/image/insert-image-handler.js.map +1 -1
  29. package/lib/plugins/index.js +71 -31
  30. package/lib/plugins/index.js.map +1 -1
  31. package/lib/plugins/list/index.js +129 -58
  32. package/lib/plugins/list/index.js.map +1 -1
  33. package/lib/plugins/math/index.js +152 -118
  34. package/lib/plugins/math/index.js.map +1 -1
  35. package/lib/plugins/media/index.js +185 -168
  36. package/lib/plugins/media/index.js.map +1 -1
  37. package/lib/plugins/media/media-dialog.js +197 -110
  38. package/lib/plugins/media/media-dialog.js.map +1 -1
  39. package/lib/plugins/media/media-toolbar.js +24 -4
  40. package/lib/plugins/media/media-toolbar.js.map +1 -1
  41. package/lib/plugins/media/media-wrapper.js +65 -23
  42. package/lib/plugins/media/media-wrapper.js.map +1 -1
  43. package/lib/plugins/respArea/drag-in-the-blank/choice.js +50 -10
  44. package/lib/plugins/respArea/drag-in-the-blank/choice.js.map +1 -1
  45. package/lib/plugins/respArea/drag-in-the-blank/index.js +22 -9
  46. package/lib/plugins/respArea/drag-in-the-blank/index.js.map +1 -1
  47. package/lib/plugins/respArea/explicit-constructed-response/index.js +9 -4
  48. package/lib/plugins/respArea/explicit-constructed-response/index.js.map +1 -1
  49. package/lib/plugins/respArea/icons/index.js +18 -1
  50. package/lib/plugins/respArea/icons/index.js.map +1 -1
  51. package/lib/plugins/respArea/index.js +133 -122
  52. package/lib/plugins/respArea/index.js.map +1 -1
  53. package/lib/plugins/respArea/inline-dropdown/index.js +10 -4
  54. package/lib/plugins/respArea/inline-dropdown/index.js.map +1 -1
  55. package/lib/plugins/respArea/utils.js +33 -15
  56. package/lib/plugins/respArea/utils.js.map +1 -1
  57. package/lib/plugins/table/icons/index.js +7 -0
  58. package/lib/plugins/table/icons/index.js.map +1 -1
  59. package/lib/plugins/table/index.js +279 -390
  60. package/lib/plugins/table/index.js.map +1 -1
  61. package/lib/plugins/table/table-toolbar.js +47 -14
  62. package/lib/plugins/table/table-toolbar.js.map +1 -1
  63. package/lib/plugins/toolbar/default-toolbar.js +63 -51
  64. package/lib/plugins/toolbar/default-toolbar.js.map +1 -1
  65. package/lib/plugins/toolbar/done-button.js +9 -1
  66. package/lib/plugins/toolbar/done-button.js.map +1 -1
  67. package/lib/plugins/toolbar/editor-and-toolbar.js +140 -83
  68. package/lib/plugins/toolbar/editor-and-toolbar.js.map +1 -1
  69. package/lib/plugins/toolbar/index.js +5 -0
  70. package/lib/plugins/toolbar/index.js.map +1 -1
  71. package/lib/plugins/toolbar/toolbar-buttons.js +39 -8
  72. package/lib/plugins/toolbar/toolbar-buttons.js.map +1 -1
  73. package/lib/plugins/toolbar/toolbar.js +261 -225
  74. package/lib/plugins/toolbar/toolbar.js.map +1 -1
  75. package/lib/plugins/utils.js +16 -19
  76. package/lib/plugins/utils.js.map +1 -1
  77. package/lib/serialization.js +70 -11
  78. package/lib/serialization.js.map +1 -1
  79. package/lib/theme.js.map +1 -1
  80. package/package.json +18 -17
  81. package/src/editor.jsx +139 -434
  82. package/src/index.jsx +96 -62
  83. package/src/plugins/characters/index.jsx +17 -12
  84. package/src/plugins/html/icons/index.jsx +19 -0
  85. package/src/plugins/html/index.jsx +68 -0
  86. package/src/plugins/image/component.jsx +38 -60
  87. package/src/plugins/image/index.jsx +42 -95
  88. package/src/plugins/image/insert-image-handler.js +27 -62
  89. package/src/plugins/index.jsx +39 -21
  90. package/src/plugins/list/index.jsx +90 -62
  91. package/src/plugins/math/index.jsx +70 -93
  92. package/src/plugins/media/index.jsx +117 -146
  93. package/src/plugins/media/media-dialog.js +9 -10
  94. package/src/plugins/media/media-wrapper.jsx +27 -29
  95. package/src/plugins/respArea/drag-in-the-blank/index.jsx +4 -5
  96. package/src/plugins/respArea/explicit-constructed-response/index.jsx +1 -2
  97. package/src/plugins/respArea/index.jsx +84 -114
  98. package/src/plugins/respArea/inline-dropdown/index.jsx +2 -3
  99. package/src/plugins/respArea/utils.jsx +28 -23
  100. package/src/plugins/table/index.jsx +214 -334
  101. package/src/plugins/table/table-toolbar.jsx +4 -3
  102. package/src/plugins/toolbar/default-toolbar.jsx +30 -48
  103. package/src/plugins/toolbar/editor-and-toolbar.jsx +114 -114
  104. package/src/plugins/toolbar/toolbar.jsx +224 -254
  105. package/src/plugins/utils.js +0 -16
  106. package/src/serialization.jsx +1 -1
  107. package/lib/components.js +0 -92
  108. package/lib/components.js.map +0 -1
  109. package/lib/new-serialization.js +0 -280
  110. package/lib/new-serialization.js.map +0 -1
  111. package/lib/plugins/hotKeys/index.js +0 -60
  112. package/lib/plugins/hotKeys/index.js.map +0 -1
  113. package/lib/test-serializer.js +0 -138
  114. package/lib/test-serializer.js.map +0 -1
  115. package/src/components.js +0 -135
  116. package/src/new-serialization.jsx +0 -310
  117. package/src/plugins/hotKeys/index.js +0 -54
  118. package/src/test-serializer.js +0 -132
@@ -1,24 +1,29 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports["default"] = ResponseAreaPlugin;
8
9
  exports.serialization = void 0;
9
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+
10
11
  var _react = _interopRequireDefault(require("react"));
11
- var _slate = require("slate");
12
- var _slateHyperscript = require("slate-hyperscript");
12
+
13
13
  var _debug = _interopRequireDefault(require("debug"));
14
- var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
15
- var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
14
+
16
15
  var _isUndefined = _interopRequireDefault(require("lodash/isUndefined"));
16
+
17
17
  var _inlineDropdown = _interopRequireDefault(require("./inline-dropdown"));
18
+
18
19
  var _dragInTheBlank = _interopRequireDefault(require("./drag-in-the-blank"));
20
+
19
21
  var _explicitConstructedResponse = _interopRequireDefault(require("./explicit-constructed-response"));
22
+
20
23
  var _utils = require("./utils");
24
+
21
25
  var _icons = require("./icons");
26
+
22
27
  var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:respArea');
23
28
  var lastIndexMap = {};
24
29
  var elTypesMap = {
@@ -27,178 +32,165 @@ var elTypesMap = {
27
32
  'drag-in-the-blank': 'drag_in_the_blank'
28
33
  };
29
34
  var elTypesArray = Object.values(elTypesMap);
35
+
30
36
  function ResponseAreaPlugin(opts) {
31
37
  var isOfCurrentType = function isOfCurrentType(d) {
32
38
  return d.type === opts.type || d.type === elTypesMap[opts.type];
33
39
  };
40
+
34
41
  var toolbar = {
35
42
  icon: /*#__PURE__*/_react["default"].createElement(_icons.ToolbarIcon, null),
36
43
  buttonStyles: {
37
44
  margin: '0 20px 0 auto'
38
45
  },
39
- onClick: function onClick(editor) {
46
+ onClick: function onClick(value, onChange) {
40
47
  log('[toolbar] onClick');
41
- var currentRespAreaList = [];
42
- var descendants = Array.from(_slate.Node.descendants(editor, {
43
- reverse: true
44
- })).map(function (_ref) {
45
- var _ref2 = (0, _slicedToArray2["default"])(_ref, 1),
46
- d = _ref2[0];
47
- return d;
48
- });
49
- descendants.forEach(function (d) {
50
- if (isOfCurrentType(d)) {
51
- currentRespAreaList.push(d);
52
- }
53
- });
54
- if (currentRespAreaList.length >= opts.maxResponseAreas) {
48
+ var change = value.change();
49
+ var currentRespAreaList = change.value.document.filterDescendants(isOfCurrentType);
50
+
51
+ if (currentRespAreaList.size >= opts.maxResponseAreas) {
55
52
  return;
56
53
  }
54
+
57
55
  var type = opts.type.replace(/-/g, '_');
58
56
  var prevIndex = lastIndexMap[type];
59
- var newIndex = !prevIndex ? 0 : prevIndex + 1;
57
+ var newIndex = prevIndex === 0 ? prevIndex : prevIndex + 1;
60
58
  var newInline = (0, _utils.getDefaultElement)(opts, newIndex);
61
59
  lastIndexMap[type] += 1;
60
+
62
61
  if (newInline) {
63
- /* if (change.value.selection.startKey || change.value.selection.endKey) {
62
+ if (change.value.selection.startKey || change.value.selection.endKey) {
64
63
  change.insertInline(newInline);
65
64
  } else {
66
65
  // If the markup is empty and there's no focus
67
- const lastText = value.document.getLastText();
68
- if (!lastText) {
66
+ var lastText = value.document.getLastText();
67
+
68
+ if (!lastText) {
69
69
  return;
70
70
  }
71
- const parentNode = value.document.getParent(lastText.key);
72
- if (parentNode) {
73
- const index = parentNode.nodes.indexOf(lastText.key);
74
- if (parentNode.isVoid) return;
75
- change.insertNodeByKey(parentNode.key, index + 1, newInline);
71
+
72
+ var parentNode = value.document.getParent(lastText.key);
73
+
74
+ if (parentNode) {
75
+ var index = parentNode.nodes.indexOf(lastText.key);
76
+ if (parentNode.isVoid) return;
77
+ change.insertNodeByKey(parentNode.key, index + 1, newInline);
76
78
  }
77
79
  }
78
- if (newInline.type === 'drag_in_the_blank') {
79
- const nextText = change.value.document.getNextText(newInline.key);
80
- if (nextText) {
80
+
81
+ if (newInline.type === 'drag_in_the_blank') {
82
+ var nextText = change.value.document.getNextText(newInline.key);
83
+
84
+ if (nextText) {
81
85
  change.moveFocusTo(nextText.key, 0).moveAnchorTo(nextText.key, 0);
82
86
  }
83
- }*/
84
- editor.insertNode(newInline);
87
+ }
88
+
89
+ onChange(change);
85
90
  }
86
91
  },
87
92
  customToolbar: opts.respAreaToolbar,
93
+ supports: function supports(node) {
94
+ return node.object === 'inline' && elTypesArray.indexOf(node.type) >= 0;
95
+ },
88
96
  showDone: false
89
97
  };
90
98
  return {
91
99
  name: 'response_area',
92
100
  toolbar: toolbar,
93
- rules: function rules(editor) {
94
- var isVoid = editor.isVoid,
95
- isInline = editor.isInline,
96
- onChange = editor.onChange;
97
- editor.isVoid = function (element) {
98
- return elTypesArray.includes(element.type) ? true : isVoid(element);
99
- };
100
- editor.isInline = function (element) {
101
- return elTypesArray.includes(element.type) ? true : isInline(element);
102
- };
103
- var oldEditor = (0, _cloneDeep["default"])(editor);
104
- editor.onChange = function (options) {
105
- var descendants = Array.from(_slate.Node.descendants(editor, {
106
- reverse: true
107
- })).map(function (_ref3) {
108
- var _ref4 = (0, _slicedToArray2["default"])(_ref3, 1),
109
- d = _ref4[0];
110
- return d;
111
- });
112
- var type = opts.type.replace(/-/g, '_');
113
- if ((0, _isUndefined["default"])(lastIndexMap[type])) {
114
- lastIndexMap[type] = 0;
115
- descendants.forEach(function (d) {
116
- if (d.type === type) {
117
- var newIndex = parseInt(d.data.index, 10);
118
- if (newIndex > lastIndexMap[type]) {
119
- lastIndexMap[type] = newIndex;
120
- }
121
- }
122
- });
123
- }
124
- if ((0, _isEqual["default"])(editor, oldEditor)) {
125
- return;
126
- }
127
- var oldDescendants = Array.from(_slate.Node.descendants(oldEditor, {
128
- reverse: true
129
- })).map(function (_ref5) {
130
- var _ref6 = (0, _slicedToArray2["default"])(_ref5, 1),
131
- d = _ref6[0];
132
- return d;
133
- });
134
- var currentRespAreaList = descendants.filter(isOfCurrentType);
135
- var oldRespAreaList = oldDescendants.filter(isOfCurrentType);
136
- toolbar.disabled = currentRespAreaList.length >= opts.maxResponseAreas;
137
- var arrayToFilter = oldRespAreaList.length > currentRespAreaList.length ? oldRespAreaList : currentRespAreaList;
138
- var arrayToUseForFilter = arrayToFilter === oldRespAreaList ? currentRespAreaList : oldRespAreaList;
139
- var elementsWithChangedStatus = arrayToFilter.filter(function (d) {
140
- return !arrayToUseForFilter.find(function (e) {
141
- return e.data.index === d.data.index;
142
- });
143
- });
144
- if (elementsWithChangedStatus.length && oldRespAreaList.length > currentRespAreaList.length) {
145
- opts.onHandleAreaChange(elementsWithChangedStatus);
146
- }
147
- oldEditor = (0, _cloneDeep["default"])(editor);
148
- onChange(options);
149
- };
150
- return editor;
151
- },
152
101
  filterPlugins: function filterPlugins(node, plugins) {
153
102
  if (node.type === 'explicit_constructed_response' || node.type === 'drag_in_the_blank') {
154
103
  return [];
155
104
  }
105
+
156
106
  return plugins.filter(function (p) {
157
107
  return p.name !== 'response_area';
158
108
  });
159
109
  },
160
- deleteNode: function deleteNode(e, node, nodePath, editor, onChange) {
110
+ deleteNode: function deleteNode(e, node, value, onChange) {
161
111
  e.preventDefault();
162
- editor.apply({
163
- type: 'remove_node',
164
- path: nodePath
165
- });
166
- onChange(editor);
167
- },
168
- supports: function supports(node) {
169
- return elTypesArray.indexOf(node.type) >= 0;
112
+ var change = value.change().removeNodeByKey(node.key);
113
+ onChange(change);
170
114
  },
171
115
  renderNode: function renderNode(props) {
172
116
  var attributes = props.attributes,
173
- node = props.node;
174
- if (node.type === 'explicit_constructed_response') {
175
- var data = node.data;
117
+ n = props.node;
118
+
119
+ if (n.type === 'explicit_constructed_response') {
120
+ var data = n.data.toJSON();
176
121
  var error;
122
+
177
123
  if (opts.error) {
178
124
  error = opts.error();
179
125
  }
126
+
180
127
  return /*#__PURE__*/_react["default"].createElement(_explicitConstructedResponse["default"], {
181
128
  attributes: attributes,
182
129
  value: data.value,
183
130
  error: error && error[data.index] && error[data.index][0]
184
- }, props.children);
131
+ });
185
132
  }
186
- if (node.type === 'drag_in_the_blank') {
187
- var _data = node.data;
133
+
134
+ if (n.type === 'drag_in_the_blank') {
135
+ var _data = n.data.toJSON();
136
+
188
137
  return /*#__PURE__*/_react["default"].createElement(_dragInTheBlank["default"], {
189
138
  attributes: attributes,
190
139
  data: _data,
191
- n: node,
140
+ n: n,
192
141
  nodeProps: props,
193
142
  opts: opts
194
- }, props.children);
143
+ });
195
144
  }
196
- if (node.type === 'inline_dropdown') {
197
- var _data2 = node.data;
145
+
146
+ if (n.type === 'inline_dropdown') {
147
+ var _data2 = n.data.toJSON();
148
+
198
149
  return /*#__PURE__*/_react["default"].createElement(_inlineDropdown["default"], {
199
150
  attributes: attributes,
200
151
  selectedItem: _data2.value
201
- }, props.children);
152
+ });
153
+ }
154
+ },
155
+ onChange: function onChange(change, editor) {
156
+ var type = opts.type.replace(/-/g, '_');
157
+
158
+ if ((0, _isUndefined["default"])(lastIndexMap[type])) {
159
+ lastIndexMap[type] = 0;
160
+ change.value.document.forEachDescendant(function (d) {
161
+ if (d.type === type) {
162
+ var newIndex = parseInt(d.data.get('index'), 10);
163
+
164
+ if (newIndex > lastIndexMap[type]) {
165
+ lastIndexMap[type] = newIndex;
166
+ }
167
+ }
168
+ });
169
+ }
170
+
171
+ if (!editor.value) {
172
+ return;
173
+ }
174
+
175
+ var currentRespAreaList = change.value.document.filterDescendants(isOfCurrentType);
176
+ var oldRespAreaList = editor.value.document.filterDescendants(isOfCurrentType);
177
+
178
+ if (currentRespAreaList.size >= opts.maxResponseAreas) {
179
+ toolbar.disabled = true;
180
+ } else {
181
+ toolbar.disabled = false;
182
+ }
183
+
184
+ var arrayToFilter = oldRespAreaList.size > currentRespAreaList.size ? oldRespAreaList : currentRespAreaList;
185
+ var arrayToUseForFilter = arrayToFilter === oldRespAreaList ? currentRespAreaList : oldRespAreaList;
186
+ var elementsWithChangedStatus = arrayToFilter.filter(function (d) {
187
+ return !arrayToUseForFilter.find(function (e) {
188
+ return e.data.get('index') === d.data.get('index');
189
+ });
190
+ });
191
+
192
+ if (elementsWithChangedStatus.size && oldRespAreaList.size > currentRespAreaList.size) {
193
+ opts.onHandleAreaChange(elementsWithChangedStatus);
202
194
  }
203
195
  },
204
196
  onDrop: function onDrop(event, change, editor) {
@@ -206,67 +198,86 @@ function ResponseAreaPlugin(opts) {
206
198
  var inline = editor.value.document.findDescendant(function (d) {
207
199
  return d.key === closestEl.dataset.key;
208
200
  });
201
+
209
202
  if (inline.type === 'drag_in_the_blank') {
210
203
  return false;
211
204
  }
212
205
  }
213
206
  };
214
207
  }
208
+
215
209
  var serialization = {
216
210
  deserialize: function deserialize(el) {
217
211
  var type = el.dataset && el.dataset.type;
212
+
218
213
  switch (type) {
219
214
  case 'inline_dropdown':
220
- return (0, _slateHyperscript.jsx)('element', {
215
+ return {
216
+ object: 'inline',
221
217
  type: 'inline_dropdown',
218
+ isVoid: true,
222
219
  data: {
223
220
  index: el.dataset.index,
224
221
  value: el.dataset.value
225
222
  }
226
- });
223
+ };
224
+
227
225
  case 'explicit_constructed_response':
228
- return (0, _slateHyperscript.jsx)('element', {
226
+ return {
227
+ object: 'inline',
229
228
  type: 'explicit_constructed_response',
229
+ isVoid: true,
230
230
  data: {
231
231
  index: el.dataset.index,
232
232
  value: el.dataset.value
233
233
  }
234
- });
234
+ };
235
+
235
236
  case 'drag_in_the_blank':
236
- return (0, _slateHyperscript.jsx)('element', {
237
+ return {
238
+ object: 'inline',
237
239
  type: 'drag_in_the_blank',
240
+ isVoid: true,
238
241
  data: {
239
242
  index: el.dataset.index,
240
243
  id: el.dataset.id,
241
244
  value: el.dataset.value,
242
245
  inTable: el.dataset.inTable
243
246
  }
244
- });
247
+ };
245
248
  }
246
249
  },
247
250
  serialize: function serialize(object) {
251
+ if (object.object !== 'inline') {
252
+ return;
253
+ }
254
+
248
255
  switch (object.type) {
249
256
  case 'inline_dropdown':
250
257
  {
251
- var data = object.data;
258
+ var data = object.data.toJSON();
252
259
  return /*#__PURE__*/_react["default"].createElement("span", {
253
260
  "data-type": "inline_dropdown",
254
261
  "data-index": data.index,
255
262
  "data-value": data.value
256
263
  });
257
264
  }
265
+
258
266
  case 'explicit_constructed_response':
259
267
  {
260
- var _data3 = object.data;
268
+ var _data3 = object.data.toJSON();
269
+
261
270
  return /*#__PURE__*/_react["default"].createElement("span", {
262
271
  "data-type": "explicit_constructed_response",
263
272
  "data-index": _data3.index,
264
273
  "data-value": _data3.value
265
274
  });
266
275
  }
276
+
267
277
  case 'drag_in_the_blank':
268
278
  {
269
- var _data4 = object.data;
279
+ var _data4 = object.data.toJSON();
280
+
270
281
  return /*#__PURE__*/_react["default"].createElement("span", {
271
282
  "data-type": "drag_in_the_blank",
272
283
  "data-index": _data4.index,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_slate","_slateHyperscript","_debug","_cloneDeep","_isEqual","_isUndefined","_inlineDropdown","_dragInTheBlank","_explicitConstructedResponse","_utils","_icons","log","debug","lastIndexMap","elTypesMap","elTypesArray","Object","values","ResponseAreaPlugin","opts","isOfCurrentType","d","type","toolbar","icon","createElement","ToolbarIcon","buttonStyles","margin","onClick","editor","currentRespAreaList","descendants","Array","from","SlateNode","reverse","map","_ref","_ref2","_slicedToArray2","forEach","push","length","maxResponseAreas","replace","prevIndex","newIndex","newInline","getDefaultElement","insertNode","customToolbar","respAreaToolbar","showDone","name","rules","isVoid","isInline","onChange","element","includes","oldEditor","cloneDeep","options","_ref3","_ref4","isUndefined","parseInt","data","index","isEqual","oldDescendants","_ref5","_ref6","filter","oldRespAreaList","disabled","arrayToFilter","arrayToUseForFilter","elementsWithChangedStatus","find","e","onHandleAreaChange","filterPlugins","node","plugins","p","deleteNode","nodePath","preventDefault","apply","path","supports","indexOf","renderNode","props","attributes","error","value","children","n","nodeProps","selectedItem","onDrop","event","change","closestEl","target","closest","inline","document","findDescendant","key","dataset","serialization","deserialize","el","jsx","id","inTable","serialize","object","exports"],"sources":["../../../src/plugins/respArea/index.jsx"],"sourcesContent":["import React from 'react';\nimport { Node as SlateNode } from 'slate';\nimport { jsx } from 'slate-hyperscript';\nimport debug from 'debug';\n\nimport cloneDeep from 'lodash/cloneDeep';\nimport isEqual from 'lodash/isEqual';\nimport isUndefined from 'lodash/isUndefined';\nimport InlineDropdown from './inline-dropdown';\nimport DragInTheBlank from './drag-in-the-blank';\nimport ExplicitConstructedResponse from './explicit-constructed-response';\nimport { getDefaultElement } from './utils';\nimport { ToolbarIcon } from './icons';\n\nconst log = debug('@pie-lib:editable-html:plugins:respArea');\n\nconst lastIndexMap = {};\nconst elTypesMap = {\n 'inline-dropdown': 'inline_dropdown',\n 'explicit-constructed-response': 'explicit_constructed_response',\n 'drag-in-the-blank': 'drag_in_the_blank',\n};\nconst elTypesArray = Object.values(elTypesMap);\n\nexport default function ResponseAreaPlugin(opts) {\n const isOfCurrentType = (d) => d.type === opts.type || d.type === elTypesMap[opts.type];\n\n const toolbar = {\n icon: <ToolbarIcon />,\n buttonStyles: {\n margin: '0 20px 0 auto',\n },\n onClick: editor => {\n log('[toolbar] onClick');\n const currentRespAreaList = [];\n const descendants = Array.from(SlateNode.descendants(editor, { reverse: true })).map(\n ([d]) => d\n );\n\n descendants.forEach(d => {\n if (isOfCurrentType(d)) {\n currentRespAreaList.push(d);\n }\n });\n\n if (currentRespAreaList.length >= opts.maxResponseAreas) {\n return;\n }\n\n const type = opts.type.replace(/-/g, '_');\n const prevIndex = lastIndexMap[type];\n const newIndex = !prevIndex ? 0 : prevIndex + 1;\n const newInline = getDefaultElement(opts, newIndex);\n\n lastIndexMap[type] += 1;\n\n if (newInline) {\n /* if (change.value.selection.startKey || change.value.selection.endKey) {\n change.insertInline(newInline);\n } else {\n // If the markup is empty and there's no focus\n const lastText = value.document.getLastText();\n\n if (!lastText) {\n return;\n }\n const parentNode = value.document.getParent(lastText.key);\n\n if (parentNode) {\n const index = parentNode.nodes.indexOf(lastText.key);\n\n if (parentNode.isVoid) return;\n\n change.insertNodeByKey(parentNode.key, index + 1, newInline);\n }\n }\n\n if (newInline.type === 'drag_in_the_blank') {\n const nextText = change.value.document.getNextText(newInline.key);\n\n if (nextText) {\n change.moveFocusTo(nextText.key, 0).moveAnchorTo(nextText.key, 0);\n }\n }*/\n editor.insertNode(newInline);\n }\n },\n customToolbar: opts.respAreaToolbar,\n showDone: false,\n };\n\n return {\n name: 'response_area',\n toolbar,\n rules: editor => {\n const { isVoid, isInline, onChange } = editor;\n\n editor.isVoid = element => {\n return elTypesArray.includes(element.type) ? true : isVoid(element);\n };\n\n editor.isInline = element => {\n return elTypesArray.includes(element.type) ? true : isInline(element);\n };\n\n let oldEditor = cloneDeep(editor);\n\n editor.onChange = options => {\n const descendants = Array.from(SlateNode.descendants(editor, { reverse: true })).map(\n ([d]) => d\n );\n const type = opts.type.replace(/-/g, '_');\n\n if (isUndefined(lastIndexMap[type])) {\n lastIndexMap[type] = 0;\n\n descendants.forEach(d => {\n if (d.type === type) {\n const newIndex = parseInt(d.data.index, 10);\n\n if (newIndex > lastIndexMap[type]) {\n lastIndexMap[type] = newIndex;\n }\n }\n });\n }\n\n if (isEqual(editor, oldEditor)) {\n return;\n }\n\n const oldDescendants = Array.from(SlateNode.descendants(oldEditor, { reverse: true })).map(\n ([d]) => d\n );\n const currentRespAreaList = descendants.filter(isOfCurrentType);\n const oldRespAreaList = oldDescendants.filter(isOfCurrentType);\n\n toolbar.disabled = currentRespAreaList.length >= opts.maxResponseAreas;\n\n const arrayToFilter =\n oldRespAreaList.length > currentRespAreaList.length\n ? oldRespAreaList\n : currentRespAreaList;\n const arrayToUseForFilter =\n arrayToFilter === oldRespAreaList ? currentRespAreaList : oldRespAreaList;\n\n const elementsWithChangedStatus = arrayToFilter.filter(\n d => !arrayToUseForFilter.find(e => e.data.index === d.data.index)\n );\n\n if (\n elementsWithChangedStatus.length &&\n oldRespAreaList.length > currentRespAreaList.length\n ) {\n opts.onHandleAreaChange(elementsWithChangedStatus);\n }\n\n oldEditor = cloneDeep(editor);\n onChange(options);\n };\n\n return editor;\n },\n filterPlugins: (node, plugins) => {\n if (node.type === 'explicit_constructed_response' || node.type === 'drag_in_the_blank') {\n return [];\n }\n\n return plugins.filter((p) => p.name !== 'response_area');\n },\n deleteNode: (e, node, nodePath, editor, onChange) => {\n e.preventDefault();\n\n editor.apply({\n type: 'remove_node',\n path: nodePath\n });\n\n onChange(editor);\n },\n supports: node => elTypesArray.indexOf(node.type) >= 0,\n renderNode(props) {\n const { attributes, node } = props;\n\n if (node.type === 'explicit_constructed_response') {\n const { data } = node;\n let error;\n\n if (opts.error) {\n error = opts.error();\n }\n\n return (\n <ExplicitConstructedResponse\n attributes={attributes}\n value={data.value}\n error={error && error[data.index] && error[data.index][0]}\n >\n {props.children}\n </ExplicitConstructedResponse>\n );\n }\n\n if (node.type === 'drag_in_the_blank') {\n const { data } = node;\n\n return (\n <DragInTheBlank\n attributes={attributes}\n data={data}\n n={node}\n nodeProps={props}\n opts={opts}\n >\n {props.children}\n </DragInTheBlank>\n );\n }\n\n if (node.type === 'inline_dropdown') {\n const { data } = node;\n\n return (\n <InlineDropdown attributes={attributes} selectedItem={data.value}>\n {props.children}\n </InlineDropdown>\n );\n }\n },\n onDrop(event, change, editor) {\n const closestEl = event.target.closest('[data-key]');\n const inline = editor.value.document.findDescendant((d) => d.key === closestEl.dataset.key);\n\n if (inline.type === 'drag_in_the_blank') {\n return false;\n }\n },\n };\n}\n\nexport const serialization = {\n deserialize(el) {\n const type = el.dataset && el.dataset.type;\n\n switch (type) {\n case 'inline_dropdown':\n return jsx('element', {\n type: 'inline_dropdown',\n data: {\n index: el.dataset.index,\n value: el.dataset.value\n }\n });\n case 'explicit_constructed_response':\n return jsx('element', {\n type: 'explicit_constructed_response',\n data: {\n index: el.dataset.index,\n value: el.dataset.value\n }\n });\n case 'drag_in_the_blank':\n return jsx('element', {\n type: 'drag_in_the_blank',\n data: {\n index: el.dataset.index,\n id: el.dataset.id,\n value: el.dataset.value,\n inTable: el.dataset.inTable\n }\n });\n }\n },\n serialize(object) {\n switch (object.type) {\n case 'inline_dropdown': {\n const data = object.data;\n\n return <span data-type=\"inline_dropdown\" data-index={data.index} data-value={data.value} />;\n }\n case 'explicit_constructed_response': {\n const data = object.data;\n\n return <span data-type=\"explicit_constructed_response\" data-index={data.index} data-value={data.value} />;\n }\n case 'drag_in_the_blank': {\n const data = object.data;\n\n return (\n <span\n data-type=\"drag_in_the_blank\"\n data-index={data.index}\n data-id={data.id}\n data-value={data.value}\n data-in-table={data.inTable}\n />\n );\n }\n }\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/plugins/respArea/index.jsx"],"names":["log","lastIndexMap","elTypesMap","elTypesArray","Object","values","ResponseAreaPlugin","opts","isOfCurrentType","d","type","toolbar","icon","buttonStyles","margin","onClick","value","onChange","change","currentRespAreaList","document","filterDescendants","size","maxResponseAreas","replace","prevIndex","newIndex","newInline","selection","startKey","endKey","insertInline","lastText","getLastText","parentNode","getParent","key","index","nodes","indexOf","isVoid","insertNodeByKey","nextText","getNextText","moveFocusTo","moveAnchorTo","customToolbar","respAreaToolbar","supports","node","object","showDone","name","filterPlugins","plugins","filter","p","deleteNode","e","preventDefault","removeNodeByKey","renderNode","props","attributes","n","data","toJSON","error","editor","forEachDescendant","parseInt","get","oldRespAreaList","disabled","arrayToFilter","arrayToUseForFilter","elementsWithChangedStatus","find","onHandleAreaChange","onDrop","event","closestEl","target","closest","inline","findDescendant","dataset","serialization","deserialize","el","id","inTable","serialize"],"mappings":"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","sourcesContent":["import React from 'react';\nimport debug from 'debug';\nimport isUndefined from 'lodash/isUndefined';\n\nimport InlineDropdown from './inline-dropdown';\nimport DragInTheBlank from './drag-in-the-blank';\nimport ExplicitConstructedResponse from './explicit-constructed-response';\nimport { getDefaultElement } from './utils';\nimport { ToolbarIcon } from './icons';\n\nconst log = debug('@pie-lib:editable-html:plugins:respArea');\n\nconst lastIndexMap = {};\nconst elTypesMap = {\n 'inline-dropdown': 'inline_dropdown',\n 'explicit-constructed-response': 'explicit_constructed_response',\n 'drag-in-the-blank': 'drag_in_the_blank',\n};\nconst elTypesArray = Object.values(elTypesMap);\n\nexport default function ResponseAreaPlugin(opts) {\n const isOfCurrentType = (d) => d.type === opts.type || d.type === elTypesMap[opts.type];\n\n const toolbar = {\n icon: <ToolbarIcon />,\n buttonStyles: {\n margin: '0 20px 0 auto',\n },\n onClick: (value, onChange) => {\n log('[toolbar] onClick');\n const change = value.change();\n const currentRespAreaList = change.value.document.filterDescendants(isOfCurrentType);\n\n if (currentRespAreaList.size >= opts.maxResponseAreas) {\n return;\n }\n\n const type = opts.type.replace(/-/g, '_');\n const prevIndex = lastIndexMap[type];\n const newIndex = prevIndex === 0 ? prevIndex : prevIndex + 1;\n const newInline = getDefaultElement(opts, newIndex);\n\n lastIndexMap[type] += 1;\n\n if (newInline) {\n if (change.value.selection.startKey || change.value.selection.endKey) {\n change.insertInline(newInline);\n } else {\n // If the markup is empty and there's no focus\n const lastText = value.document.getLastText();\n\n if (!lastText) {\n return;\n }\n const parentNode = value.document.getParent(lastText.key);\n\n if (parentNode) {\n const index = parentNode.nodes.indexOf(lastText.key);\n\n if (parentNode.isVoid) return;\n\n change.insertNodeByKey(parentNode.key, index + 1, newInline);\n }\n }\n\n if (newInline.type === 'drag_in_the_blank') {\n const nextText = change.value.document.getNextText(newInline.key);\n\n if (nextText) {\n change.moveFocusTo(nextText.key, 0).moveAnchorTo(nextText.key, 0);\n }\n }\n\n onChange(change);\n }\n },\n customToolbar: opts.respAreaToolbar,\n supports: (node) => node.object === 'inline' && elTypesArray.indexOf(node.type) >= 0,\n showDone: false,\n };\n\n return {\n name: 'response_area',\n toolbar,\n filterPlugins: (node, plugins) => {\n if (node.type === 'explicit_constructed_response' || node.type === 'drag_in_the_blank') {\n return [];\n }\n\n return plugins.filter((p) => p.name !== 'response_area');\n },\n deleteNode: (e, node, value, onChange) => {\n e.preventDefault();\n\n const change = value.change().removeNodeByKey(node.key);\n\n onChange(change);\n },\n renderNode(props) {\n const { attributes, node: n } = props;\n\n if (n.type === 'explicit_constructed_response') {\n const data = n.data.toJSON();\n let error;\n\n if (opts.error) {\n error = opts.error();\n }\n\n return (\n <ExplicitConstructedResponse\n attributes={attributes}\n value={data.value}\n error={error && error[data.index] && error[data.index][0]}\n />\n );\n }\n\n if (n.type === 'drag_in_the_blank') {\n const data = n.data.toJSON();\n\n return <DragInTheBlank attributes={attributes} data={data} n={n} nodeProps={props} opts={opts} />;\n }\n\n if (n.type === 'inline_dropdown') {\n const data = n.data.toJSON();\n\n return <InlineDropdown attributes={attributes} selectedItem={data.value} />;\n }\n },\n onChange(change, editor) {\n const type = opts.type.replace(/-/g, '_');\n\n if (isUndefined(lastIndexMap[type])) {\n lastIndexMap[type] = 0;\n\n change.value.document.forEachDescendant((d) => {\n if (d.type === type) {\n const newIndex = parseInt(d.data.get('index'), 10);\n\n if (newIndex > lastIndexMap[type]) {\n lastIndexMap[type] = newIndex;\n }\n }\n });\n }\n\n if (!editor.value) {\n return;\n }\n\n const currentRespAreaList = change.value.document.filterDescendants(isOfCurrentType);\n const oldRespAreaList = editor.value.document.filterDescendants(isOfCurrentType);\n\n if (currentRespAreaList.size >= opts.maxResponseAreas) {\n toolbar.disabled = true;\n } else {\n toolbar.disabled = false;\n }\n\n const arrayToFilter = oldRespAreaList.size > currentRespAreaList.size ? oldRespAreaList : currentRespAreaList;\n const arrayToUseForFilter = arrayToFilter === oldRespAreaList ? currentRespAreaList : oldRespAreaList;\n\n const elementsWithChangedStatus = arrayToFilter.filter(\n (d) => !arrayToUseForFilter.find((e) => e.data.get('index') === d.data.get('index')),\n );\n\n if (elementsWithChangedStatus.size && oldRespAreaList.size > currentRespAreaList.size) {\n opts.onHandleAreaChange(elementsWithChangedStatus);\n }\n },\n onDrop(event, change, editor) {\n const closestEl = event.target.closest('[data-key]');\n const inline = editor.value.document.findDescendant((d) => d.key === closestEl.dataset.key);\n\n if (inline.type === 'drag_in_the_blank') {\n return false;\n }\n },\n };\n}\n\nexport const serialization = {\n deserialize(el) {\n const type = el.dataset && el.dataset.type;\n\n switch (type) {\n case 'inline_dropdown':\n return {\n object: 'inline',\n type: 'inline_dropdown',\n isVoid: true,\n data: {\n index: el.dataset.index,\n value: el.dataset.value,\n },\n };\n case 'explicit_constructed_response':\n return {\n object: 'inline',\n type: 'explicit_constructed_response',\n isVoid: true,\n data: {\n index: el.dataset.index,\n value: el.dataset.value,\n },\n };\n case 'drag_in_the_blank':\n return {\n object: 'inline',\n type: 'drag_in_the_blank',\n isVoid: true,\n data: {\n index: el.dataset.index,\n id: el.dataset.id,\n value: el.dataset.value,\n inTable: el.dataset.inTable,\n },\n };\n }\n },\n serialize(object) {\n if (object.object !== 'inline') {\n return;\n }\n\n switch (object.type) {\n case 'inline_dropdown': {\n const data = object.data.toJSON();\n\n return <span data-type=\"inline_dropdown\" data-index={data.index} data-value={data.value} />;\n }\n case 'explicit_constructed_response': {\n const data = object.data.toJSON();\n\n return <span data-type=\"explicit_constructed_response\" data-index={data.index} data-value={data.value} />;\n }\n case 'drag_in_the_blank': {\n const data = object.data.toJSON();\n\n return (\n <span\n data-type=\"drag_in_the_blank\"\n data-index={data.index}\n data-id={data.id}\n data-value={data.value}\n data-in-table={data.inTable}\n />\n );\n }\n }\n },\n};\n"],"file":"index.js"}
@@ -1,22 +1,27 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports["default"] = void 0;
9
+
8
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+
9
12
  var _react = _interopRequireDefault(require("react"));
13
+
10
14
  var _propTypes = _interopRequireDefault(require("prop-types"));
15
+
11
16
  var _icons = require("../icons");
17
+
12
18
  var InlineDropdown = function InlineDropdown(_ref) {
13
19
  var attributes = _ref.attributes,
14
- children = _ref.children,
15
- selectedItem = _ref.selectedItem;
20
+ selectedItem = _ref.selectedItem;
21
+ // TODO: Investigate
16
22
  // Needed because items with values inside have different positioning for some reason
17
23
  var html = selectedItem || '<div>&nbsp</div>';
18
24
  return /*#__PURE__*/_react["default"].createElement("span", (0, _extends2["default"])({}, attributes, {
19
- contentEditable: false,
20
25
  style: {
21
26
  display: 'inline-flex',
22
27
  height: '50px',
@@ -34,7 +39,7 @@ var InlineDropdown = function InlineDropdown(_ref) {
34
39
  borderRadius: '3px',
35
40
  position: 'relative'
36
41
  }
37
- }, children, /*#__PURE__*/_react["default"].createElement("div", {
42
+ }, /*#__PURE__*/_react["default"].createElement("div", {
38
43
  style: {
39
44
  flex: 1,
40
45
  overflow: 'hidden',
@@ -55,6 +60,7 @@ var InlineDropdown = function InlineDropdown(_ref) {
55
60
  }
56
61
  })));
57
62
  };
63
+
58
64
  InlineDropdown.propTypes = {
59
65
  attributes: _propTypes["default"].object,
60
66
  selectedItem: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].object])
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_propTypes","_icons","InlineDropdown","_ref","attributes","children","selectedItem","html","createElement","_extends2","contentEditable","style","display","height","margin","cursor","minWidth","background","border","boxSizing","borderRadius","position","flex","overflow","padding","whiteSpace","textOverflow","lineHeight","dangerouslySetInnerHTML","__html","Chevron","direction","top","right","propTypes","PropTypes","object","oneOfType","string","_default","exports"],"sources":["../../../../src/plugins/respArea/inline-dropdown/index.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Chevron } from '../icons';\n\nconst InlineDropdown = ({ attributes, children, selectedItem }) => {\n // Needed because items with values inside have different positioning for some reason\n const html = selectedItem || '<div>&nbsp</div>';\n\n return (\n <span\n {...attributes}\n contentEditable={false}\n style={{\n display: 'inline-flex',\n height: '50px',\n margin: '0 5px',\n cursor: 'pointer',\n }}\n >\n <div\n style={{\n display: 'inline-flex',\n minWidth: '178px',\n height: '36px',\n background: '#FFF',\n border: '1px solid #C0C3CF',\n boxSizing: 'border-box',\n borderRadius: '3px',\n position: 'relative',\n }}\n >\n {children}\n <div\n style={{\n flex: 1,\n overflow: 'hidden',\n padding: '0 25px 0 8px',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n lineHeight: '35px',\n }}\n dangerouslySetInnerHTML={{\n __html: html,\n }}\n />\n <Chevron\n direction=\"down\"\n style={{\n position: 'absolute',\n top: '5px',\n right: '5px',\n }}\n />\n </div>\n </span>\n );\n};\n\nInlineDropdown.propTypes = {\n attributes: PropTypes.object,\n selectedItem: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n};\n\nexport default InlineDropdown;\n"],"mappings":";;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAEA,IAAMG,cAAc,GAAG,SAAjBA,cAAcA,CAAAC,IAAA,EAA+C;EAAA,IAAzCC,UAAU,GAAAD,IAAA,CAAVC,UAAU;IAAEC,QAAQ,GAAAF,IAAA,CAARE,QAAQ;IAAEC,YAAY,GAAAH,IAAA,CAAZG,YAAY;EAC1D;EACA,IAAMC,IAAI,GAAGD,YAAY,IAAI,kBAAkB;EAE/C,oBACET,MAAA,YAAAW,aAAA,aAAAC,SAAA,iBACML,UAAU;IACdM,eAAe,EAAE,KAAM;IACvBC,KAAK,EAAE;MACLC,OAAO,EAAE,aAAa;MACtBC,MAAM,EAAE,MAAM;MACdC,MAAM,EAAE,OAAO;MACfC,MAAM,EAAE;IACV;EAAE,iBAEFlB,MAAA,YAAAW,aAAA;IACEG,KAAK,EAAE;MACLC,OAAO,EAAE,aAAa;MACtBI,QAAQ,EAAE,OAAO;MACjBH,MAAM,EAAE,MAAM;MACdI,UAAU,EAAE,MAAM;MAClBC,MAAM,EAAE,mBAAmB;MAC3BC,SAAS,EAAE,YAAY;MACvBC,YAAY,EAAE,KAAK;MACnBC,QAAQ,EAAE;IACZ;EAAE,GAEDhB,QAAQ,eACTR,MAAA,YAAAW,aAAA;IACEG,KAAK,EAAE;MACLW,IAAI,EAAE,CAAC;MACPC,QAAQ,EAAE,QAAQ;MAClBC,OAAO,EAAE,cAAc;MACvBC,UAAU,EAAE,QAAQ;MACpBC,YAAY,EAAE,UAAU;MACxBC,UAAU,EAAE;IACd,CAAE;IACFC,uBAAuB,EAAE;MACvBC,MAAM,EAAEtB;IACV;EAAE,CACH,CAAC,eACFV,MAAA,YAAAW,aAAA,CAACP,MAAA,CAAA6B,OAAO;IACNC,SAAS,EAAC,MAAM;IAChBpB,KAAK,EAAE;MACLU,QAAQ,EAAE,UAAU;MACpBW,GAAG,EAAE,KAAK;MACVC,KAAK,EAAE;IACT;EAAE,CACH,CACE,CACD,CAAC;AAEX,CAAC;AAED/B,cAAc,CAACgC,SAAS,GAAG;EACzB9B,UAAU,EAAE+B,qBAAS,CAACC,MAAM;EAC5B9B,YAAY,EAAE6B,qBAAS,CAACE,SAAS,CAAC,CAACF,qBAAS,CAACG,MAAM,EAAEH,qBAAS,CAACC,MAAM,CAAC;AACxE,CAAC;AAAC,IAAAG,QAAA,GAEarC,cAAc;AAAAsC,OAAA,cAAAD,QAAA"}
1
+ {"version":3,"sources":["../../../../src/plugins/respArea/inline-dropdown/index.jsx"],"names":["InlineDropdown","attributes","selectedItem","html","display","height","margin","cursor","minWidth","background","border","boxSizing","borderRadius","position","flex","overflow","padding","whiteSpace","textOverflow","lineHeight","__html","top","right","propTypes","PropTypes","object","oneOfType","string"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AAEA,IAAMA,cAAc,GAAG,SAAjBA,cAAiB,OAAkC;AAAA,MAA/BC,UAA+B,QAA/BA,UAA+B;AAAA,MAAnBC,YAAmB,QAAnBA,YAAmB;AACvD;AACA;AACA,MAAMC,IAAI,GAAGD,YAAY,IAAI,kBAA7B;AAEA,sBACE,sEACMD,UADN;AAEE,IAAA,KAAK,EAAE;AACLG,MAAAA,OAAO,EAAE,aADJ;AAELC,MAAAA,MAAM,EAAE,MAFH;AAGLC,MAAAA,MAAM,EAAE,OAHH;AAILC,MAAAA,MAAM,EAAE;AAJH;AAFT,mBASE;AACE,IAAA,KAAK,EAAE;AACLH,MAAAA,OAAO,EAAE,aADJ;AAELI,MAAAA,QAAQ,EAAE,OAFL;AAGLH,MAAAA,MAAM,EAAE,MAHH;AAILI,MAAAA,UAAU,EAAE,MAJP;AAKLC,MAAAA,MAAM,EAAE,mBALH;AAMLC,MAAAA,SAAS,EAAE,YANN;AAOLC,MAAAA,YAAY,EAAE,KAPT;AAQLC,MAAAA,QAAQ,EAAE;AARL;AADT,kBAYE;AACE,IAAA,KAAK,EAAE;AACLC,MAAAA,IAAI,EAAE,CADD;AAELC,MAAAA,QAAQ,EAAE,QAFL;AAGLC,MAAAA,OAAO,EAAE,cAHJ;AAILC,MAAAA,UAAU,EAAE,QAJP;AAKLC,MAAAA,YAAY,EAAE,UALT;AAMLC,MAAAA,UAAU,EAAE;AANP,KADT;AASE,IAAA,uBAAuB,EAAE;AACvBC,MAAAA,MAAM,EAAEjB;AADe;AAT3B,IAZF,eAyBE,gCAAC,cAAD;AACE,IAAA,SAAS,EAAC,MADZ;AAEE,IAAA,KAAK,EAAE;AACLU,MAAAA,QAAQ,EAAE,UADL;AAELQ,MAAAA,GAAG,EAAE,KAFA;AAGLC,MAAAA,KAAK,EAAE;AAHF;AAFT,IAzBF,CATF,CADF;AA8CD,CAnDD;;AAqDAtB,cAAc,CAACuB,SAAf,GAA2B;AACzBtB,EAAAA,UAAU,EAAEuB,sBAAUC,MADG;AAEzBvB,EAAAA,YAAY,EAAEsB,sBAAUE,SAAV,CAAoB,CAACF,sBAAUG,MAAX,EAAmBH,sBAAUC,MAA7B,CAApB;AAFW,CAA3B;eAKezB,c","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Chevron } from '../icons';\n\nconst InlineDropdown = ({ attributes, selectedItem }) => {\n // TODO: Investigate\n // Needed because items with values inside have different positioning for some reason\n const html = selectedItem || '<div>&nbsp</div>';\n\n return (\n <span\n {...attributes}\n style={{\n display: 'inline-flex',\n height: '50px',\n margin: '0 5px',\n cursor: 'pointer',\n }}\n >\n <div\n style={{\n display: 'inline-flex',\n minWidth: '178px',\n height: '36px',\n background: '#FFF',\n border: '1px solid #C0C3CF',\n boxSizing: 'border-box',\n borderRadius: '3px',\n position: 'relative',\n }}\n >\n <div\n style={{\n flex: 1,\n overflow: 'hidden',\n padding: '0 25px 0 8px',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n lineHeight: '35px',\n }}\n dangerouslySetInnerHTML={{\n __html: html,\n }}\n />\n <Chevron\n direction=\"down\"\n style={{\n position: 'absolute',\n top: '5px',\n right: '5px',\n }}\n />\n </div>\n </span>\n );\n};\n\nInlineDropdown.propTypes = {\n attributes: PropTypes.object,\n selectedItem: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n};\n\nexport default InlineDropdown;\n"],"file":"index.js"}