react-survey-builder 1.0.72 → 1.0.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/preview.js CHANGED
@@ -1,396 +1,425 @@
1
1
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
2
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
3
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
7
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
5
8
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
7
9
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
8
10
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
11
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
12
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
9
14
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
10
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
11
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
12
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
13
- function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
14
- function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
15
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
16
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
17
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
18
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
19
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
20
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
21
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
22
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
15
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
16
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
23
17
  import React from 'react';
24
- import update from 'immutability-helper';
25
18
  import store from './stores/store';
26
19
  import SurveyElementsEdit from './survey-dynamic-edit';
27
20
  import SortableFormElements from './sortable-form-elements';
28
21
  import CustomDragLayer from './survey-elements/component-drag-layer';
22
+ import { isListNotEmpty, isObjectNotEmpty, removeRecord, updateRecord } from './utils/objectUtils';
29
23
  var PlaceHolder = SortableFormElements.PlaceHolder;
30
- var Preview = /*#__PURE__*/function (_React$Component) {
31
- function Preview(props) {
32
- var _this;
33
- _classCallCheck(this, Preview);
34
- _this = _callSuper(this, Preview, [props]);
35
- _defineProperty(_this, "state", {
36
- items: [],
37
- answerData: {}
38
- });
39
- _defineProperty(_this, "editModeOff", function (e) {
40
- if (_this.editForm.current && !_this.editForm.current.contains(e.target)) {
41
- _this.manualEditModeOff();
42
- }
24
+ var Preview = function Preview(_ref) {
25
+ var _ref$items = _ref.items,
26
+ loadItems = _ref$items === void 0 ? [] : _ref$items,
27
+ _ref$showCorrectColum = _ref.showCorrectColumn,
28
+ showCorrectColumn = _ref$showCorrectColum === void 0 ? false : _ref$showCorrectColum,
29
+ _ref$showDescription = _ref.showDescription,
30
+ showDescription = _ref$showDescription === void 0 ? false : _ref$showDescription,
31
+ _ref$files = _ref.files,
32
+ files = _ref$files === void 0 ? [] : _ref$files,
33
+ renderEditForm = _ref.renderEditForm,
34
+ onLoad = _ref.onLoad,
35
+ onPost = _ref.onPost,
36
+ className = _ref.className,
37
+ _ref$editMode = _ref.editMode,
38
+ editMode = _ref$editMode === void 0 ? false : _ref$editMode,
39
+ setEditMode = _ref.setEditMode,
40
+ _ref$editElement = _ref.editElement,
41
+ editElement = _ref$editElement === void 0 ? null : _ref$editElement,
42
+ setEditElement = _ref.setEditElement,
43
+ _ref$variables = _ref.variables,
44
+ variables = _ref$variables === void 0 ? {} : _ref$variables,
45
+ url = _ref.url,
46
+ saveUrl = _ref.saveUrl,
47
+ _ref$saveAlways = _ref.saveAlways,
48
+ saveAlways = _ref$saveAlways === void 0 ? false : _ref$saveAlways,
49
+ registry = _ref.registry;
50
+ var _React$useState = React.useState(isListNotEmpty(loadItems) ? _toConsumableArray(loadItems) : []),
51
+ _React$useState2 = _slicedToArray(_React$useState, 2),
52
+ items = _React$useState2[0],
53
+ setItems = _React$useState2[1];
54
+ var _React$useState3 = React.useState({}),
55
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
56
+ answerData = _React$useState4[0],
57
+ setAnswerData = _React$useState4[1];
58
+ var _React$useState5 = React.useState(0),
59
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
60
+ seq = _React$useState6[0],
61
+ setSeq = _React$useState6[1];
62
+ var editForm = React.useRef();
63
+ var editModeOn = function editModeOn(item, e) {
64
+ e.preventDefault();
65
+ e.stopPropagation();
66
+ if (editMode) {
67
+ setEditMode(false);
68
+ setEditElement(null);
69
+ } else {
70
+ setEditMode(true);
71
+ setEditElement(item);
72
+ }
73
+ };
74
+ var editModeOff = function editModeOff(e) {
75
+ if (editForm.current && !editForm.current.contains(e.target)) {
76
+ manualEditModeOff();
77
+ }
78
+ };
79
+ var manualEditModeOff = function manualEditModeOff() {
80
+ if (editElement && editElement.dirty) {
81
+ editElement.dirty = false;
82
+ _updateElement(_objectSpread(_objectSpread({}, editElement), {}, {
83
+ dirty: false
84
+ }));
85
+ }
86
+ if (editMode) {
87
+ setEditMode(false);
88
+ setEditElement(null);
89
+ }
90
+ };
91
+ var _updateElement = function updateElement(element) {
92
+ var updatedElement = isObjectNotEmpty(element) ? _objectSpread({}, element) : {};
93
+ var existingList = isListNotEmpty(items) ? _toConsumableArray(items) : [];
94
+ var found = existingList.some(function (i) {
95
+ return updatedElement && updatedElement.id && i.id === updatedElement.id;
43
96
  });
44
- _defineProperty(_this, "manualEditModeOff", function () {
45
- var editElement = _this.props.editElement;
46
- if (editElement && editElement.dirty) {
47
- editElement.dirty = false;
48
- _this.updateElement(editElement);
97
+ var updatedList = updateRecord('id', updatedElement, existingList);
98
+ if (found) {
99
+ setSeq(seq > 100000 ? 0 : seq + 1);
100
+ store.dispatch('updateOrder', updatedList);
101
+ setEditElement(updatedElement);
102
+ }
103
+ };
104
+ var _onChange = function _onChange(stateItems) {
105
+ // console.log('_onChange', stateItems);
106
+ var updatedItems = isListNotEmpty(stateItems) ? _toConsumableArray(stateItems) : [];
107
+ var updatedAnswerData = _objectSpread({}, answerData);
108
+ updatedItems.forEach(function (item) {
109
+ if (item && item.readOnly && variables[item.variableKey]) {
110
+ updatedAnswerData[item.fieldName] = variables[item.variableKey];
49
111
  }
50
- _this.props.manualEditModeOff();
51
112
  });
52
- var onLoad = props.onLoad,
53
- onPost = props.onPost;
54
- store.setExternalHandler(onLoad, onPost);
55
- _this.editForm = /*#__PURE__*/React.createRef();
56
- _this.state = {
57
- items: props.items || [],
58
- answerData: {}
59
- };
60
- _this.seq = 0;
61
- _this._onUpdate = _this._onChange.bind(_this);
62
- _this.getItemById = _this.getItemById.bind(_this);
63
- _this.moveCard = _this.moveCard.bind(_this);
64
- _this.insertCard = _this.insertCard.bind(_this);
65
- _this.setAsChild = _this.setAsChild.bind(_this);
66
- _this.removeChild = _this.removeChild.bind(_this);
67
- _this._onDestroy = _this._onDestroy.bind(_this);
68
- return _this;
69
- }
70
- _inherits(Preview, _React$Component);
71
- return _createClass(Preview, [{
72
- key: "componentDidMount",
73
- value: function componentDidMount() {
74
- var _this2 = this;
75
- var _this$props = this.props,
76
- items = _this$props.items,
77
- url = _this$props.url,
78
- saveUrl = _this$props.saveUrl,
79
- saveAlways = _this$props.saveAlways;
80
- store.subscribe(function (state) {
81
- return _this2._onUpdate(state.items);
82
- });
83
- store.dispatch('load', {
84
- loadUrl: url,
85
- saveUrl: saveUrl,
86
- items: items || [],
87
- saveAlways: saveAlways
113
+ setItems(updatedItems);
114
+ setAnswerData(updatedAnswerData);
115
+ };
116
+ var _onDestroy = function _onDestroy(item) {
117
+ // console.log('_onDestroy', item);
118
+ var updatedList = _toConsumableArray(items);
119
+ if (isListNotEmpty(item.childItems)) {
120
+ item.childItems.forEach(function (childItem) {
121
+ updatedList = removeRecord('id', childItem === null || childItem === void 0 ? void 0 : childItem.id, _toConsumableArray(updatedList));
88
122
  });
89
- document.addEventListener('mousedown', this.editModeOff);
90
123
  }
91
- }, {
92
- key: "componentWillUnmount",
93
- value: function componentWillUnmount() {
94
- document.removeEventListener('mousedown', this.editModeOff);
124
+ updatedList = removeRecord('id', item.id, _toConsumableArray(updatedList));
125
+ store.dispatch('updateOrder', updatedList);
126
+ setItems(_toConsumableArray(updatedList));
127
+ };
128
+ var getItemById = function getItemById(id) {
129
+ return items.find(function (x) {
130
+ return x && x.id === id;
131
+ });
132
+ };
133
+ var swapChildren = function swapChildren(item, child, col) {
134
+ // console.log('swapping children', item, child, col);
135
+ if (child.col !== undefined && item.id !== child.parentId) {
136
+ return false;
95
137
  }
96
- }, {
97
- key: "_setValue",
98
- value: function _setValue(text) {
99
- return text.replace(/[^A-Z0-9]+/ig, '_').toLowerCase();
138
+ if (!(child.col !== undefined && child.col !== col && item.childItems[col])) {
139
+ // No child was assigned yet in both source and target.
140
+ return false;
100
141
  }
101
- }, {
102
- key: "updateElement",
103
- value: function updateElement(element) {
104
- var items = this.state.items;
105
- var found = false;
106
- for (var i = 0, len = items.length; i < len; i++) {
107
- if (element.id === items[i].id) {
108
- items[i] = element;
109
- found = true;
110
- break;
111
- }
112
- }
113
- if (found) {
114
- this.seq = this.seq > 100000 ? 0 : this.seq + 1;
115
- store.dispatch('updateOrder', items);
116
- }
142
+ var oldItems = _toConsumableArray(items);
143
+ var oldId = item.childItems[col];
144
+ var oldItem = oldItems.find(function (i) {
145
+ return i.id === oldId;
146
+ });
147
+ //const oldCol = child.col;
148
+ // eslint-disable-next-line no-param-reassign
149
+ var updatedChildItems = _toConsumableArray(item.childItems);
150
+ updatedChildItems[child.col] = oldId;
151
+ updatedChildItems[col] = child.id;
152
+ var updatedItem = _objectSpread(_objectSpread({}, item), {}, {
153
+ childItems: updatedChildItems
154
+ });
155
+ var updatedOldItem = _objectSpread(_objectSpread({}, oldItem), {}, {
156
+ col: child.col
157
+ });
158
+ var updatedChild = _objectSpread(_objectSpread({}, child), {}, {
159
+ col: col
160
+ });
161
+ var updatedItems = updateRecord('id', updatedItem, oldItems);
162
+ updatedItems = updateRecord('id', updatedOldItem, _toConsumableArray(updatedItems));
163
+ updatedItems = updateRecord('id', updatedChild, _toConsumableArray(updatedItems));
164
+ store.dispatch('updateOrder', updatedItems);
165
+ setItems(updatedItems);
166
+ return true;
167
+ };
168
+ var setAsChild = function setAsChild(item, child, childIsNew, childIndex, col, isBusy) {
169
+ // console.log('saveAsChild', item, child, childIsNew, childIndex, col, isBusy);
170
+ if (swapChildren(item, child, col)) {
171
+ return;
117
172
  }
118
- }, {
119
- key: "_onChange",
120
- value: function _onChange($dataItems) {
121
- var _this3 = this;
122
- var answerData = {};
123
- $dataItems.forEach(function (item) {
124
- if (item && item.readOnly && _this3.props.variables[item.variableKey]) {
125
- answerData[item.fieldName] = _this3.props.variables[item.variableKey];
126
- }
127
- });
128
- this.setState({
129
- items: $dataItems,
130
- answerData: answerData
131
- });
173
+ if (isBusy) {
174
+ return;
132
175
  }
133
- }, {
134
- key: "_onDestroy",
135
- value: function _onDestroy(item) {
136
- var _this4 = this;
137
- if (item.childItems) {
138
- item.childItems.forEach(function (childItem) {
139
- var child = _this4.getItemById(childItem);
140
- if (child) {
141
- store.dispatch('delete', child);
142
- }
143
- });
144
- }
145
- store.dispatch('delete', item);
176
+ var oldItems = _toConsumableArray(items);
177
+
178
+ // eslint-disable-next-line no-param-reassign
179
+ var updatedChildItems = isListNotEmpty(item.childItems) ? _toConsumableArray(item.childItems) : [];
180
+ updatedChildItems[col] = child.id;
181
+ var updatedItem = _objectSpread(_objectSpread({}, item), {}, {
182
+ childItems: updatedChildItems
183
+ });
184
+ var updatedChild = _objectSpread(_objectSpread({}, child), {}, {
185
+ col: col,
186
+ parentId: item.id,
187
+ parentIndex: oldItems.indexOf(item)
188
+ });
189
+ var oldParent = oldItems.find(function (i) {
190
+ return i.id === child.parentId;
191
+ });
192
+ var updatedParent = null;
193
+ if (oldParent) {
194
+ updatedParent = _objectSpread({}, oldParent);
195
+ var updatedParentChildItems = _toConsumableArray(oldParent.childItems);
196
+ updatedParentChildItems[child.col] = null;
146
197
  }
147
- }, {
148
- key: "getItemById",
149
- value: function getItemById(id) {
150
- var items = this.state.items;
151
- return items.find(function (x) {
152
- return x && x.id === id;
198
+ var list = oldItems.filter(function (x) {
199
+ return x && x.parentId === item.id;
200
+ });
201
+ var toRemove = list.filter(function (x) {
202
+ return item.childItems.indexOf(x.id) === -1;
203
+ });
204
+ var updatedList = _toConsumableArray(items);
205
+ if (toRemove.length) {
206
+ console.log('toRemove', toRemove);
207
+ updatedList = updatedList.filter(function (x) {
208
+ return toRemove.indexOf(x) === -1;
153
209
  });
154
210
  }
155
- }, {
156
- key: "swapChildren",
157
- value: function swapChildren($dataItems, item, child, col) {
158
- if (child.col !== undefined && item.id !== child.parentId) {
159
- return false;
160
- }
161
- if (!(child.col !== undefined && child.col !== col && item.childItems[col])) {
162
- // No child was assigned yet in both source and target.
163
- return false;
164
- }
165
- var oldId = item.childItems[col];
166
- var oldItem = this.getItemById(oldId);
167
- var oldCol = child.col;
168
- // eslint-disable-next-line no-param-reassign
169
- item.childItems[oldCol] = oldId;
170
- oldItem.col = oldCol;
171
- // eslint-disable-next-line no-param-reassign
172
- item.childItems[col] = child.id;
173
- child.col = col;
174
- store.dispatch('updateOrder', $dataItems);
175
- return true;
211
+ if (!updatedList.find(function (i) {
212
+ return i.id === child.id;
213
+ })) {
214
+ updatedList.push(updatedChild);
176
215
  }
177
- }, {
178
- key: "setAsChild",
179
- value: function setAsChild(item, child, col, isBusy) {
180
- var items = this.state.items;
181
- if (this.swapChildren(items, item, child, col)) {
182
- return;
183
- }
184
- if (isBusy) {
185
- return;
186
- }
187
- var oldParent = this.getItemById(child.parentId);
188
- var oldCol = child.col;
189
- // eslint-disable-next-line no-param-reassign
190
- item.childItems[col] = child.id;
191
- child.col = col;
192
- // eslint-disable-next-line no-param-reassign
193
- child.parentId = item.id;
194
- // eslint-disable-next-line no-param-reassign
195
- child.parentIndex = items.indexOf(item);
196
- if (oldParent) {
197
- oldParent.childItems[oldCol] = null;
198
- }
199
- var list = items.filter(function (x) {
200
- return x && x.parentId === item.id;
201
- });
202
- var toRemove = list.filter(function (x) {
203
- return item.childItems.indexOf(x.id) === -1;
204
- });
205
- var newData = items;
206
- if (toRemove.length) {
207
- // console.log('toRemove', toRemove);
208
- newData = items.filter(function (x) {
209
- return toRemove.indexOf(x) === -1;
210
- });
211
- }
212
- if (!this.getItemById(child.id)) {
213
- newData.push(child);
214
- }
215
- store.dispatch('updateOrder', newData);
216
+ if (childIsNew && childIndex > -1) {
217
+ var _oldItems$childIndex;
218
+ // Instance where child was hovered over main drop zone first and then
219
+ // dropped into a container, it will not be created yet due to race condition but will
220
+ // have an index equal to the position in the main drop zone where it was hovering prior
221
+ // to being dropped in the container. Therefore, we need to delete the item in the main
222
+ // drop zone so that there aren't duplicates since it was intended to go into the container.
223
+
224
+ // add item to toRemove list to be removed
225
+ updatedList = removeRecord('id', (_oldItems$childIndex = oldItems[childIndex]) === null || _oldItems$childIndex === void 0 ? void 0 : _oldItems$childIndex.id, _toConsumableArray(updatedList));
216
226
  }
217
- }, {
218
- key: "removeChild",
219
- value: function removeChild(item, col) {
220
- var items = this.state.items;
221
- var oldId = item.childItems[col];
222
- var oldItem = this.getItemById(oldId);
223
- if (oldItem) {
224
- var newData = items.filter(function (x) {
225
- return x !== oldItem;
226
- });
227
- // eslint-disable-next-line no-param-reassign
228
- item.childItems[col] = null;
229
- // delete oldItem.parentId;
230
- this.seq = this.seq > 100000 ? 0 : this.seq + 1;
231
- store.dispatch('updateOrder', newData);
232
- this.setState({
233
- items: newData
234
- });
235
- }
227
+ updatedList = updateRecord('id', updatedItem, _toConsumableArray(updatedList));
228
+ updatedList = updateRecord('id', updatedChild, _toConsumableArray(updatedList));
229
+ if (updatedParent) {
230
+ updatedList = updateRecord('id', updatedParent, _toConsumableArray(updatedList));
236
231
  }
237
- }, {
238
- key: "restoreCard",
239
- value: function restoreCard(item, id) {
240
- var items = this.state.items;
241
- var parent = this.getItemById(item.item.parentId);
242
- var oldItem = this.getItemById(id);
243
- if (parent && oldItem) {
244
- var newIndex = items.indexOf(oldItem);
245
- var newData = _toConsumableArray(items); // items.filter(x => x !== oldItem);
246
- // eslint-disable-next-line no-param-reassign
247
- parent.childItems[oldItem.col] = null;
248
- delete oldItem.parentId;
249
- // eslint-disable-next-line no-param-reassign
250
- delete item.setAsChild;
251
- // eslint-disable-next-line no-param-reassign
252
- delete item.parentIndex;
253
- // eslint-disable-next-line no-param-reassign
254
- item.index = newIndex;
255
- this.seq = this.seq > 100000 ? 0 : this.seq + 1;
256
- store.dispatch('updateOrder', newData);
257
- this.setState({
258
- items: newData
259
- });
232
+ store.dispatch('updateOrder', updatedList);
233
+ setItems(updatedList);
234
+ };
235
+ var removeChild = function removeChild(item, col) {
236
+ console.log('removeChild', item, col);
237
+ var existingList = _toConsumableArray(items);
238
+ var oldId = item.childItems[col];
239
+ var oldItem = existingList.find(function (i) {
240
+ return i.id === oldId;
241
+ });
242
+ if (oldItem) {
243
+ var updatedListWithoutChild = existingList.filter(function (x) {
244
+ return x !== oldItem;
245
+ });
246
+ // eslint-disable-next-line no-param-reassign
247
+ var updatedItem = _objectSpread({}, item);
248
+ // for multi-column containers, set back to null
249
+ // for fieldsets and steps, delete it
250
+ if (updatedItem.element === 'FieldSet' || updatedItem.element === 'Step') {
251
+ updatedItem.childItems.splice(col, 1);
252
+ } else {
253
+ updatedItem.childItems[col] = null;
260
254
  }
255
+
256
+ // delete oldItem.parentId;
257
+ setSeq(seq > 100000 ? 0 : seq + 1);
258
+ var updatedItems = updateRecord('id', updatedItem, _toConsumableArray(updatedListWithoutChild));
259
+ store.dispatch('updateOrder', updatedItems);
260
+ setItems(updatedItems);
261
261
  }
262
- }, {
263
- key: "insertCard",
264
- value: function insertCard(item, hoverIndex, id) {
265
- var items = this.state.items;
266
- if (id) {
267
- this.restoreCard(item, id);
262
+ };
263
+ var restoreCard = function restoreCard(item, id) {
264
+ // console.log('restoreCard', item, id);
265
+ var existingItems = _toConsumableArray(items);
266
+ var parent = existingItems.find(function (i) {
267
+ return i.id === item.item.parentId;
268
+ });
269
+ var oldItem = existingItems.find(function (i) {
270
+ return i.id === id;
271
+ });
272
+ if (parent && oldItem) {
273
+ var updatedParent = _objectSpread({}, parent);
274
+ var updatedOldItem = _objectSpread({}, oldItem);
275
+
276
+ // for multi-column containers, set back to null
277
+ // for fieldsets and steps, delete it
278
+ if (updatedParent.element === 'FieldSet' || updatedParent.element === 'Step') {
279
+ updatedParent.childItems.splice(oldItem.col, 1);
268
280
  } else {
269
- items.splice(hoverIndex, 0, item);
270
- this.saveData(item, hoverIndex, hoverIndex);
271
- store.dispatch('insertItem', item);
281
+ updatedParent.childItems[oldItem.col] = null;
272
282
  }
273
- }
274
- }, {
275
- key: "moveCard",
276
- value: function moveCard(dragIndex, hoverIndex) {
277
- var items = this.state.items;
278
- var dragCard = items[dragIndex];
279
- this.saveData(dragCard, dragIndex, hoverIndex);
280
- }
281
283
 
282
- // eslint-disable-next-line no-unused-vars
283
- }, {
284
- key: "cardPlaceHolder",
285
- value: function cardPlaceHolder(dragIndex, hoverIndex) {
286
- // Dummy
284
+ // eslint-disable-next-line no-param-reassign
285
+ delete updatedOldItem.parentId;
286
+ // eslint-disable-next-line no-param-reassign
287
+ delete updatedOldItem.setAsChild;
288
+ // eslint-disable-next-line no-param-reassign
289
+ delete updatedOldItem.parentIndex;
290
+ // eslint-disable-next-line no-param-reassign
291
+ delete updatedOldItem.col;
292
+ setSeq(seq > 100000 ? 0 : seq + 1);
293
+ var updatedItems = updateRecord('id', updatedOldItem, _toConsumableArray(items));
294
+ updatedItems = updateRecord('id', updatedParent, _toConsumableArray(updatedItems));
295
+ store.dispatch('updateOrder', updatedItems);
296
+ setItems(updatedItems);
287
297
  }
288
- }, {
289
- key: "saveData",
290
- value: function saveData(dragCard, dragIndex, hoverIndex) {
291
- var newData = update(this.state, {
292
- items: {
293
- $splice: [[dragIndex, 1], [hoverIndex, 0, dragCard]]
294
- }
295
- });
296
- this.setState(newData);
297
- store.dispatch('updateOrder', newData.items);
298
+ };
299
+ var insertCard = function insertCard(item, hoverIndex, id) {
300
+ // console.log('insertCard', item, hoverIndex, id);
301
+ var $dataItems = _toConsumableArray(items);
302
+ if (id) {
303
+ restoreCard(item, id);
304
+ } else {
305
+ // fixed bug where cards were getting wiped out when you dragged another card over a card to insert it. card should be inserted, not replacing existing cards. If an existing card should be removed, the remove button should be used
306
+ $dataItems.splice(hoverIndex, 0, item);
307
+ setItems($dataItems);
308
+ store.dispatch('updateOrder', $dataItems);
309
+ // store.dispatch('insertItem', { ...item });
298
310
  }
299
- }, {
300
- key: "getElement",
301
- value: function getElement(item, index) {
302
- if (item.custom) {
303
- if (!item.component || typeof item.component !== 'function') {
304
- // eslint-disable-next-line no-param-reassign
305
- item.component = this.props.registry.get(item.key);
306
- }
307
- }
308
- console.log('getElement', item);
309
- var SortableFormElement = SortableFormElements[item.element];
310
- if (SortableFormElement === null) {
311
- return null;
311
+ };
312
+ var moveCard = function moveCard(dragIndex, hoverIndex) {
313
+ // console.log('moveCard', dragIndex, hoverIndex);
314
+ var $dataItems = _toConsumableArray(items);
315
+ var dragCard = $dataItems[dragIndex];
316
+ $dataItems.splice(dragIndex, 1);
317
+ $dataItems.splice(hoverIndex, 0, dragCard);
318
+ setItems($dataItems);
319
+ store.dispatch('updateOrder', $dataItems);
320
+ };
321
+
322
+ // eslint-disable-next-line no-unused-vars
323
+ var cardPlaceHolder = function cardPlaceHolder(dragIndex, hoverIndex) {
324
+ // Dummy
325
+ };
326
+ var getElement = function getElement(item, index) {
327
+ var _item$fieldName;
328
+ if (item.custom) {
329
+ if (!item.component || typeof item.component !== 'function') {
330
+ // eslint-disable-next-line no-param-reassign
331
+ item.component = registry.get(item.key);
312
332
  }
313
- return /*#__PURE__*/React.createElement(SortableFormElement, {
314
- id: item.id,
315
- name: item.fieldName,
316
- seq: this.seq,
317
- index: index,
318
- moveCard: this.moveCard,
319
- insertCard: this.insertCard,
320
- mutable: false,
321
- parent: this.props.parent,
322
- editModeOn: this.props.editModeOn,
323
- isDraggable: true,
324
- key: item.id,
325
- sortData: item.id,
326
- item: _objectSpread(_objectSpread({}, item), {}, {
327
- mutable: false,
328
- readOnly: false,
329
- print: false
330
- }),
331
- getDataById: this.getItemById,
332
- setAsChild: this.setAsChild,
333
- removeChild: this.removeChild,
334
- _onDestroy: this._onDestroy
335
- });
336
333
  }
337
- }, {
338
- key: "showEditForm",
339
- value: function showEditForm() {
340
- var _this5 = this;
341
- var handleUpdateElement = function handleUpdateElement(element) {
342
- return _this5.updateElement(element);
343
- };
344
- handleUpdateElement.bind(this);
345
- var formElementEditProps = {
346
- showCorrectColumn: this.props.showCorrectColumn,
347
- files: this.props.files,
348
- manualEditModeOff: this.manualEditModeOff,
349
- preview: this,
350
- element: this.props.editElement,
351
- updateElement: handleUpdateElement
352
- };
353
- return this.props.renderEditForm(formElementEditProps);
334
+ var SortableFormElement = SortableFormElements[item.element];
335
+ if (SortableFormElement === null) {
336
+ return null;
354
337
  }
355
- }, {
356
- key: "render",
357
- value: function render() {
358
- var _this6 = this;
359
- var classes = this.props.className;
360
- if (this.props.editMode) {
361
- classes += ' is-editing';
338
+ return /*#__PURE__*/React.createElement(SortableFormElement, {
339
+ id: item.id,
340
+ name: (_item$fieldName = item.fieldName) !== null && _item$fieldName !== void 0 ? _item$fieldName : item.name,
341
+ seq: seq,
342
+ index: index,
343
+ moveCard: moveCard,
344
+ insertCard: insertCard,
345
+ mutable: false,
346
+ editModeOn: editModeOn,
347
+ isDraggable: true,
348
+ key: item.id,
349
+ sortData: item.id,
350
+ item: _objectSpread(_objectSpread({}, item), {}, {
351
+ mutable: false,
352
+ readOnly: false,
353
+ print: false
354
+ }),
355
+ getItemById: getItemById,
356
+ setAsChild: setAsChild,
357
+ removeChild: removeChild,
358
+ _onDestroy: _onDestroy
359
+ });
360
+ };
361
+ var showEditForm = function showEditForm() {
362
+ var editFormProps = {
363
+ showCorrectColumn: showCorrectColumn,
364
+ showDescription: showDescription,
365
+ files: files,
366
+ manualEditModeOff: manualEditModeOff,
367
+ element: editElement,
368
+ setElement: setEditElement,
369
+ updateElement: function updateElement(element) {
370
+ return _updateElement(element);
362
371
  }
363
- var $dataItems = this.state.items.filter(function (x) {
364
- return !!x && !x.parentId;
365
- });
366
- var items = $dataItems.map(function (item, index) {
367
- return _this6.getElement(item, index);
368
- });
369
- return /*#__PURE__*/React.createElement("div", {
370
- className: classes
371
- }, /*#__PURE__*/React.createElement("div", {
372
- className: "edit-form",
373
- ref: this.editForm
374
- }, this.props.editElement !== null && this.showEditForm()), /*#__PURE__*/React.createElement("div", {
375
- className: "Sortable"
376
- }, items), /*#__PURE__*/React.createElement(PlaceHolder, {
377
- id: "form-place-holder",
378
- show: items.length === 0,
379
- index: items.length,
380
- moveCard: this.cardPlaceHolder,
381
- insertCard: this.insertCard
382
- }), /*#__PURE__*/React.createElement(CustomDragLayer, null));
383
- }
384
- }]);
385
- }(React.Component);
386
- export { Preview as default };
372
+ };
373
+ return renderEditForm(editFormProps);
374
+ };
375
+ React.useEffect(function () {
376
+ store.setExternalHandler(onLoad, onPost);
377
+ }, [onLoad, onPost]);
378
+ React.useEffect(function () {
379
+ setItems(loadItems);
380
+ store.subscribe(function (state) {
381
+ _onChange(state.items);
382
+ });
383
+ store.dispatch('load', {
384
+ loadUrl: url,
385
+ saveUrl: saveUrl,
386
+ items: loadItems,
387
+ saveAlways: saveAlways
388
+ });
389
+ document.addEventListener('mousedown', editModeOff);
390
+ return function () {
391
+ document.removeEventListener('mousedown', editModeOff);
392
+ };
393
+ }, []);
394
+ var dataItems = items.filter(function (x) {
395
+ return !!x && !x.parentId;
396
+ });
397
+ var elementItems = dataItems.map(function (item, index) {
398
+ return getElement(item, index);
399
+ });
400
+ return /*#__PURE__*/React.createElement("div", {
401
+ className: editMode ? className + ' is-editing' : className
402
+ }, /*#__PURE__*/React.createElement("div", {
403
+ className: "edit-form",
404
+ ref: editForm
405
+ }, editElement !== undefined && editElement !== null && showEditForm()), /*#__PURE__*/React.createElement("div", {
406
+ className: "Sortable"
407
+ }, elementItems), /*#__PURE__*/React.createElement(PlaceHolder, {
408
+ id: "form-place-holder",
409
+ show: true,
410
+ index: elementItems.length,
411
+ moveCard: cardPlaceHolder,
412
+ insertCard: insertCard
413
+ }), /*#__PURE__*/React.createElement(CustomDragLayer, null));
414
+ };
387
415
  Preview.defaultProps = {
388
416
  showCorrectColumn: false,
389
417
  files: [],
390
418
  editMode: false,
391
419
  editElement: null,
392
420
  className: 'react-survey-builder-preview',
393
- renderEditForm: function renderEditForm(props) {
394
- return /*#__PURE__*/React.createElement(SurveyElementsEdit, props);
421
+ renderEditForm: function renderEditForm(editFormProps) {
422
+ return /*#__PURE__*/React.createElement(SurveyElementsEdit, editFormProps);
395
423
  }
396
- };
424
+ };
425
+ export default Preview;