@builttocreate/engine-utils 1.17.0-rc1 → 1.17.1-rc2

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.
@@ -0,0 +1,1160 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
+
5
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = exports.handleMoveTableRowDown = exports.handleMoveTableRowUp = exports.handleDuplicateTableRow = exports.handleCreateTableRow = exports.handleInsertTableRow = exports.handleTableCellChange = exports.getRowIndexLookup = exports.getInputGroupRowLookupWithPopulatedDropdownCells = exports.getTableRowLookupWithPopulatedDropdownCells = exports.generateInputGroupFields = exports.spreadOperandRange = exports.validFormulaString = exports.hasOperandRange = exports.hasCircularOperandReference = exports.resolveOperandValue = exports.getFormulaResult = exports.generateTableLookup = exports.generateTableLookupForRows = exports.generateTableFieldLookups = exports.generateRowTableLookup = exports.getCellOperand = exports.getTemplateColumnOperandLookup = exports.getIndexesFromTableCellOperand = exports.getColumnOperand = exports.sortColumns = exports.getColumns = exports.getColumnOrder = exports.getDefaultDropdownColumn = exports.getDefaultImageColumn = exports.getDefaultTextColumn = exports.getDefaultColumnOption = exports.handleMoveColumnRight = exports.handleMoveColumnLeft = exports.getTableFieldRowOrder = exports.getRowOrder = exports.getRowMap = exports.getFilteredRowOrder = exports.sortRows = exports.getRows = exports.getDefaultRow = exports.getTableFieldLookupKey = void 0;
11
+
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
14
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
+
16
+ var _hotFormulaParser = require("@builttocreate/hot-formula-parser");
17
+
18
+ var _generateObjectId = _interopRequireDefault(require("./generateObjectId"));
19
+
20
+ var _Table = _interopRequireWildcard(require("./constants/Table"));
21
+
22
+ var _FieldTypes = _interopRequireDefault(require("./constants/FieldTypes"));
23
+
24
+ var _FieldTableColumnTypes = _interopRequireDefault(require("./constants/FieldTableColumnTypes"));
25
+
26
+ var _FieldTableCustomColumnIds = _interopRequireDefault(require("./constants/FieldTableCustomColumnIds"));
27
+
28
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
29
+
30
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
31
+
32
+ var parser = new _hotFormulaParser.Parser();
33
+
34
+ var getTableFieldLookupKey = function getTableFieldLookupKey(fieldId, rowIndex, columnId) {
35
+ return "".concat(fieldId, "-").concat(rowIndex, "-").concat(columnId);
36
+ };
37
+
38
+ exports.getTableFieldLookupKey = getTableFieldLookupKey;
39
+
40
+ var getDefaultRow = function getDefaultRow() {
41
+ return {
42
+ _id: (0, _generateObjectId["default"])(),
43
+ deleted: false,
44
+ cells: {}
45
+ };
46
+ };
47
+
48
+ exports.getDefaultRow = getDefaultRow;
49
+
50
+ var getRows = function getRows(rows) {
51
+ var parsedRows = rows;
52
+
53
+ if (typeof parsedRows === 'string') {
54
+ parsedRows = JSON.parse(parsedRows);
55
+ }
56
+
57
+ return parsedRows ? parsedRows.filter(function (row) {
58
+ return !row.deleted;
59
+ }) : [];
60
+ };
61
+ /**
62
+ * Sort rows based on rowOrder
63
+ */
64
+
65
+
66
+ exports.getRows = getRows;
67
+
68
+ var sortRows = function sortRows(rows, rowOrder) {
69
+ if (!rowOrder) return rows;
70
+ var rowLookup = {};
71
+ rows.forEach(function (row) {
72
+ rowLookup[row._id] = row;
73
+ });
74
+ var sortedRows = [];
75
+ rowOrder.forEach(function (rowId) {
76
+ if (rowLookup[rowId]) sortedRows.push(rowLookup[rowId]);
77
+ });
78
+ return sortedRows;
79
+ };
80
+ /**
81
+ * Filter table row order by cell values
82
+ *
83
+ * @param {Array} rowOrder
84
+ * @param {Array} rows
85
+ * @param {Object} filters //{ colId: value, colId: value, ....}
86
+ */
87
+
88
+
89
+ exports.sortRows = sortRows;
90
+
91
+ var getFilteredRowOrder = function getFilteredRowOrder(rowOrder, rows, filters) {
92
+ var filteredColumnIds = filters ? Object.keys(filters) : [];
93
+ var validRowOrder = rowOrder;
94
+
95
+ if (!validRowOrder) {
96
+ var validRows = rows ? getRows(rows) : [];
97
+ validRowOrder = validRows.map(function (row) {
98
+ return row._id;
99
+ });
100
+ }
101
+ /**
102
+ * Remove any duplicate rowIds. We have had instances where
103
+ * users encounter duplicate rowIds in the rowOrder.
104
+ * See: https://github.com/zionlabs/Issues/issues/1589
105
+ */
106
+
107
+
108
+ var cleanedValidRowOrder = [];
109
+ validRowOrder.forEach(function (rowId) {
110
+ if (cleanedValidRowOrder.indexOf(rowId) === -1) cleanedValidRowOrder.push(rowId);
111
+ });
112
+
113
+ if (filteredColumnIds.length > 0) {
114
+ var matchedRows = {};
115
+ rows.forEach(function (row) {
116
+ if (row.deleted) return;
117
+ var rowMatched = true;
118
+ filteredColumnIds.forEach(function (columnId) {
119
+ var filter = filters[columnId] ? filters[columnId].toLowerCase() : '';
120
+ var value = row.cells && row.cells[columnId] ? row.cells[columnId].toLowerCase() : '';
121
+ if (filter && (!value || value.indexOf(filter) === -1)) rowMatched = false;
122
+ });
123
+ if (rowMatched) matchedRows[row._id] = true;
124
+ });
125
+ return cleanedValidRowOrder.filter(function (rowId) {
126
+ return matchedRows[rowId];
127
+ });
128
+ } else {
129
+ return cleanedValidRowOrder;
130
+ }
131
+ };
132
+ /**
133
+ * Create a table row map for simple value lookup
134
+ *
135
+ * For instance:
136
+ * {
137
+ * rowId: {columnId: value, columnId: value, ...},
138
+ * rowId: {columnId: value, columnId: value, ...},
139
+ * rowId: {columnId: value, columnId: value, ...}
140
+ * }
141
+ *
142
+ * @param {Array} rows
143
+ * @return {Object}
144
+ */
145
+
146
+
147
+ exports.getFilteredRowOrder = getFilteredRowOrder;
148
+
149
+ var getRowMap = function getRowMap() {
150
+ var rows = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
151
+ var items = getRows(rows);
152
+ var rowMap = {};
153
+ items.forEach(function (row) {
154
+ return rowMap[row._id] = row.cells || {};
155
+ });
156
+ return rowMap;
157
+ };
158
+ /**
159
+ * Get row order
160
+ *
161
+ * @param {Array} rows
162
+ * @param {Array} rowOrder
163
+ *
164
+ * @return {Array}
165
+ */
166
+
167
+
168
+ exports.getRowMap = getRowMap;
169
+
170
+ var getRowOrder = function getRowOrder(rowOrder, rows) {
171
+ return rowOrder || getRows(rows).map(function (row) {
172
+ return row._id;
173
+ });
174
+ };
175
+ /**
176
+ * Get row order for table field. If there isn't a row order set in the
177
+ * fieldSettings then it will default to the normal row array Ids.
178
+ *
179
+ * @param {String} fieldId
180
+ * @param {Object} fieldSettings
181
+ * @param {Array} rows
182
+ *
183
+ * @return {Array}
184
+ */
185
+
186
+
187
+ exports.getRowOrder = getRowOrder;
188
+
189
+ var getTableFieldRowOrder = function getTableFieldRowOrder(fieldId, fieldSettings, rows) {
190
+ var filteredRows = rows ? getRows(rows) : [];
191
+ return fieldSettings && fieldSettings[fieldId] && fieldSettings[fieldId].rowOrder ? (0, _toConsumableArray2["default"])(fieldSettings[fieldId].rowOrder) : filteredRows.map(function (row) {
192
+ return row._id;
193
+ });
194
+ };
195
+ /**
196
+ * Handle Move Column Left
197
+ *
198
+ * @param {Number} columnIndex
199
+ * @param {Func} callback
200
+ */
201
+
202
+
203
+ exports.getTableFieldRowOrder = getTableFieldRowOrder;
204
+
205
+ var handleMoveColumnLeft = function handleMoveColumnLeft(columnIndex, callback) {
206
+ //If first index then ignore
207
+ if (columnIndex === 0) return;
208
+ var targetIndex = columnIndex - 1;
209
+ if (callback) callback({
210
+ targetIndex: targetIndex
211
+ });
212
+ };
213
+ /**
214
+ * Handle Move Column Right
215
+ *
216
+ * @param {Array} columns
217
+ * @param {Number} columnIndex
218
+ * @param {Func} callback
219
+ */
220
+
221
+
222
+ exports.handleMoveColumnLeft = handleMoveColumnLeft;
223
+
224
+ var handleMoveColumnRight = function handleMoveColumnRight(columns, columnIndex, callback) {
225
+ //If last column index then ignore
226
+ if (columnIndex >= columns.length - 1) return;
227
+ var targetIndex = columnIndex + 1;
228
+ if (callback) callback({
229
+ targetIndex: targetIndex
230
+ });
231
+ };
232
+ /**
233
+ * Get default column option
234
+ *
235
+ * @param {String} value
236
+ * @return {Object}
237
+ */
238
+
239
+
240
+ exports.handleMoveColumnRight = handleMoveColumnRight;
241
+
242
+ var getDefaultColumnOption = function getDefaultColumnOption(value) {
243
+ return {
244
+ _id: (0, _generateObjectId["default"])(),
245
+ value: value || 'Option',
246
+ deleted: false
247
+ };
248
+ };
249
+ /**
250
+ * Get default text column for table field
251
+ *
252
+ * @param {Object} defaults //Overwrite any values with this defaults object
253
+ *
254
+ * @return {Object}
255
+ */
256
+
257
+
258
+ exports.getDefaultColumnOption = getDefaultColumnOption;
259
+
260
+ var getDefaultTextColumn = function getDefaultTextColumn() {
261
+ var defaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
262
+ return _objectSpread({
263
+ _id: (0, _generateObjectId["default"])(),
264
+ type: _FieldTableColumnTypes["default"].text,
265
+ title: 'Text Column',
266
+ deleted: false
267
+ }, defaults);
268
+ };
269
+ /**
270
+ * Get default dropdown column for table field
271
+ *
272
+ * @param {Object} defaults //Overwrite any values with this defaults object
273
+ *
274
+ * @return {Object}
275
+ */
276
+
277
+
278
+ exports.getDefaultTextColumn = getDefaultTextColumn;
279
+
280
+ var getDefaultImageColumn = function getDefaultImageColumn() {
281
+ var defaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
282
+ return _objectSpread({
283
+ _id: (0, _generateObjectId["default"])(),
284
+ type: _FieldTableColumnTypes["default"].image,
285
+ title: 'Image Column',
286
+ deleted: false
287
+ }, defaults);
288
+ };
289
+ /**
290
+ * Get default dropdown column for table field
291
+ *
292
+ * @param {Object} defaults //Overwrite any values with this defaults object
293
+ *
294
+ * @return {Object}
295
+ */
296
+
297
+
298
+ exports.getDefaultImageColumn = getDefaultImageColumn;
299
+
300
+ var getDefaultDropdownColumn = function getDefaultDropdownColumn() {
301
+ var defaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
302
+ var options = defaults.options || [getDefaultColumnOption('Yes'), getDefaultColumnOption('No'), getDefaultColumnOption('N/A')];
303
+ return _objectSpread({
304
+ _id: (0, _generateObjectId["default"])(),
305
+ type: _FieldTableColumnTypes["default"].dropdown,
306
+ title: 'Dropdown Column',
307
+ deleted: false,
308
+ options: options,
309
+ optionOrder: options.map(function (option) {
310
+ return option._id;
311
+ })
312
+ }, defaults);
313
+ };
314
+ /**
315
+ * Get column order
316
+ *
317
+ * @param {Array} columns
318
+ * @param {Array} columnOrder
319
+ *
320
+ * @return {Array}
321
+ */
322
+
323
+
324
+ exports.getDefaultDropdownColumn = getDefaultDropdownColumn;
325
+
326
+ var getColumnOrder = function getColumnOrder(columnOrder, columns) {
327
+ return columnOrder || getColumns(columns).map(function (column) {
328
+ return column._id;
329
+ });
330
+ };
331
+ /**
332
+ * Get table columns with added operands. Operands are the A, B, C, etc.
333
+ */
334
+
335
+
336
+ exports.getColumnOrder = getColumnOrder;
337
+
338
+ var getColumns = function getColumns(columns) {
339
+ var parsedColumns = columns;
340
+
341
+ if (typeof parsedColumns === 'string') {
342
+ parsedColumns = JSON.parse(parsedColumns);
343
+ }
344
+
345
+ return !parsedColumns ? [] : parsedColumns.filter(function (column) {
346
+ return !column.deleted;
347
+ }).map(function (column, i) {
348
+ var nextColumn = _objectSpread({}, column);
349
+
350
+ nextColumn.operand = getColumnOperand(i);
351
+ return nextColumn;
352
+ });
353
+ };
354
+ /**
355
+ * Sort columns based on columnOrder
356
+ */
357
+
358
+
359
+ exports.getColumns = getColumns;
360
+
361
+ var sortColumns = function sortColumns(columns, columnOrder) {
362
+ if (!columnOrder) return columns;
363
+ var columnLookup = {};
364
+ columns.forEach(function (col) {
365
+ columnLookup[col._id] = col;
366
+ });
367
+ var sortedColumns = [];
368
+ columnOrder.forEach(function (colId) {
369
+ if (columnLookup[colId]) sortedColumns.push(columnLookup[colId]);
370
+ });
371
+ return sortedColumns;
372
+ };
373
+ /**
374
+ * Return letter for a column index. For intance: A, B, C
375
+ *
376
+ * Used to create the table lookup operands: A1, B12, etc.
377
+ */
378
+
379
+
380
+ exports.sortColumns = sortColumns;
381
+
382
+ var getColumnOperand = function getColumnOperand(index) {
383
+ return String.fromCharCode(65 + index);
384
+ };
385
+ /**
386
+ * Return rowIndex and columnIndex for cellOperand
387
+ *
388
+ * Operand examples: A1, B12, etc.
389
+ *
390
+ * @param {String} cellOperand
391
+ * @returns {Object}
392
+ */
393
+
394
+
395
+ exports.getColumnOperand = getColumnOperand;
396
+
397
+ var getIndexesFromTableCellOperand = function getIndexesFromTableCellOperand(cellOperand) {
398
+ var letter = cellOperand.match(/[A-Z]*/gi).find(function (value) {
399
+ return value;
400
+ });
401
+ var rowIndex = cellOperand.match(/[0-9]*/gi).find(function (value) {
402
+ return value;
403
+ });
404
+ return {
405
+ columnIndex: _Table.operandLetterIndexes[letter],
406
+
407
+ /**
408
+ * Cell operands start at an index of 1. So to get the true
409
+ * index for the rowIndex we need to substract 1 so we can
410
+ * use a 0 based index.
411
+ */
412
+ rowIndex: rowIndex - 1
413
+ };
414
+ };
415
+ /**
416
+ * Get operand lookup for all table/inputGroup fields in a template.
417
+ *
418
+ * For instance: {
419
+ * fieldId: { colId: 'A', colId: 'B', ...},
420
+ * ....
421
+ * }
422
+ */
423
+
424
+
425
+ exports.getIndexesFromTableCellOperand = getIndexesFromTableCellOperand;
426
+
427
+ var getTemplateColumnOperandLookup = function getTemplateColumnOperandLookup(template) {
428
+ var operandLookup = {};
429
+ template.fields.forEach(function (field) {
430
+ if (field.type !== _FieldTypes["default"].table && field.type !== _FieldTypes["default"].inputGroup) return;
431
+ if (!operandLookup[field._id]) operandLookup[field._id] = {};
432
+ var columns = getColumns(field.tableColumns);
433
+ columns.forEach(function (col, colIndex) {
434
+ operandLookup[field._id][col._id] = getColumnOperand(colIndex);
435
+ });
436
+ });
437
+ return operandLookup;
438
+ };
439
+ /**
440
+ * Return operand for cell. For intance: A1, B2, C1
441
+ *
442
+ * @param {String} columnOperand //A, B, C, etc.
443
+ * @param {Number} rowIndex
444
+ */
445
+
446
+
447
+ exports.getTemplateColumnOperandLookup = getTemplateColumnOperandLookup;
448
+
449
+ var getCellOperand = function getCellOperand(columnOperand, rowIndex) {
450
+ return "".concat(columnOperand).concat(rowIndex);
451
+ };
452
+ /**
453
+ * Generate table lookup by rowIndex and column operand
454
+ *
455
+ * For instance:
456
+ * {
457
+ * rowIndex: {A1: value, B1: value, ...},
458
+ * rowIndex: {A2: value, B2: value, ...},
459
+ * rowIndex: {A3: value, B3: value, ...},
460
+ * ...
461
+ * }
462
+ *
463
+ * @param {Array} rows
464
+ * @param {Array} columns
465
+ * @param {Object} tableLookup
466
+ *
467
+ * @return {Object}
468
+
469
+ */
470
+
471
+
472
+ exports.getCellOperand = getCellOperand;
473
+
474
+ var generateRowTableLookup = function generateRowTableLookup(rows, columns, tableLookup) {
475
+ if (!rows || !columns || !tableLookup) return {};
476
+ var rowTableLookup = {};
477
+ rows.forEach(function (row, rowIndex) {
478
+ rowTableLookup[rowIndex] = {};
479
+ columns.forEach(function (column, columnIndex) {
480
+ var operand = getColumnOperand(columnIndex);
481
+ var cellOperand = getCellOperand(operand, rowIndex + 1);
482
+ rowTableLookup[rowIndex][cellOperand] = tableLookup[cellOperand];
483
+ });
484
+ });
485
+ return rowTableLookup;
486
+ };
487
+ /**
488
+ * Generate table lookups for each table field in template. It takes
489
+ * all table & inputGroup fields and generates a table lookup object for them.
490
+ *
491
+ * For instance if you have a template and doc like the ones below:
492
+ *
493
+ * template: {
494
+ * fields: [
495
+ * {_id: textFieldId, ...},
496
+ * {_id: tableFieldId1, ...},
497
+ * {_id: tableFieldId2, ...},
498
+ * {_id: numberFieldId, ...},
499
+ * ...
500
+ * ]
501
+ * }
502
+ *
503
+ * returned object would be: {
504
+ * tableFieldId1: { A1: value, B1: value, ...},
505
+ * tableFieldId2: { A2: value, B2: value, ...},
506
+ * ...
507
+ * }
508
+ */
509
+
510
+
511
+ exports.generateRowTableLookup = generateRowTableLookup;
512
+
513
+ var generateTableFieldLookups = function generateTableFieldLookups(doc, template) {
514
+ var tableFields = template.fields.filter(function (field) {
515
+ return (field.type === _FieldTypes["default"].table || field.type === _FieldTypes["default"].inputGroup) && !field.deleted;
516
+ });
517
+ var tableLookups = {};
518
+ tableFields.forEach(function (field) {
519
+ var docValue = doc.fields[field._id];
520
+ var rows = getRows(docValue);
521
+ var columns = getColumns(field.tableColumns);
522
+ var docFieldSettings = doc.fieldSettings || {};
523
+ var fieldSettings = docFieldSettings[field._id] || {};
524
+ var rowOrder = fieldSettings.rowOrder && fieldSettings.rowOrder.length !== 0 ? fieldSettings.rowOrder : rows.map(function (row) {
525
+ return row._id;
526
+ });
527
+ var validRows = sortRows(rows, rowOrder);
528
+ tableLookups[field._id] = generateTableLookup(validRows, columns);
529
+ });
530
+ return tableLookups;
531
+ };
532
+ /**
533
+ * Organize the table lookup on a row by row basis
534
+ * @param {Array} rows
535
+ * @param {Array} columns
536
+ * @retuns {Object}
537
+ *
538
+ * Example return object:
539
+ * {
540
+ * 1: {
541
+ * A1: 12,
542
+ * B1: 1,
543
+ * },
544
+ * 2: {
545
+ * A2: 10,
546
+ * B2: 4,
547
+ * },
548
+ * ...
549
+ * }
550
+ *
551
+ */
552
+
553
+
554
+ exports.generateTableFieldLookups = generateTableFieldLookups;
555
+
556
+ var generateTableLookupForRows = function generateTableLookupForRows(rows, columns) {
557
+ var tableLookup = generateTableLookup(rows, columns);
558
+ var rowLookup = {};
559
+ Object.keys(tableLookup).forEach(function (key) {
560
+ var rowIndex = key.match(/[0-9]*/gi).find(function (value) {
561
+ return value;
562
+ });
563
+ if (!rowLookup[rowIndex]) rowLookup[rowIndex] = {};
564
+ rowLookup[rowIndex][key] = tableLookup[key];
565
+ });
566
+ return rowLookup;
567
+ };
568
+ /**
569
+ * Generate Lookup Operand Lookup Table for Table Data. Supports converting
570
+ * formula cells to the calculated value.
571
+ *
572
+ * Operand examples: A1, B12, C25, etc.
573
+ *
574
+ * @param {Array} rows
575
+ * @param {Array} columns
576
+ * @retuns {Object}
577
+ *
578
+ * Example return object:
579
+ * {
580
+ * A1: 12,
581
+ * B1: 1,
582
+ * A2: 2,
583
+ * B2: 4,
584
+ * }
585
+ */
586
+
587
+
588
+ exports.generateTableLookupForRows = generateTableLookupForRows;
589
+
590
+ var generateTableLookup = function generateTableLookup(rows, columns) {
591
+ var tableLookup = {};
592
+ var columnOptionsLookup = {};
593
+ var tableColumns = [];
594
+ var filteredColumns = columns.filter(function (column) {
595
+ return !column.deleted //Used by both web and mobile
596
+ && column._id !== _FieldTableCustomColumnIds["default"].rowMenu //Used on mobile
597
+ && column._id !== _FieldTableCustomColumnIds["default"].rowNumber; //Used on mobile
598
+ });
599
+ filteredColumns.forEach(function (column, i) {
600
+ var nextColumn = _objectSpread({}, column);
601
+
602
+ nextColumn.operand = String.fromCharCode(65 + i);
603
+ tableColumns.push(nextColumn);
604
+
605
+ if (column.type === _FieldTableColumnTypes["default"].dropdown) {
606
+ columnOptionsLookup[column._id] = {};
607
+ column.options.forEach(function (option) {
608
+ columnOptionsLookup[column._id][option._id] = option.value;
609
+ });
610
+ }
611
+ });
612
+ var parsedRows = typeof rows === 'string' ? JSON.parse(rows) : rows;
613
+ var tableRows = parsedRows.filter(function (row) {
614
+ return !row.deleted;
615
+ });
616
+ var formulaCells = [];
617
+ tableRows.forEach(function (row, rowIndex) {
618
+ tableColumns.forEach(function (column) {
619
+ if (!column.operand) return;
620
+ var cellKey = "".concat(column.operand).concat(rowIndex + 1);
621
+ var cellRawValue = row.cells[column._id] ? row.cells[column._id] : undefined;
622
+ var cellValue = cellRawValue ? cellRawValue.trim() : undefined;
623
+ var formulaCell = cellValue !== undefined && cellValue.charAt(0) === '=';
624
+ var containsOperands = cellValue !== undefined && cellValue.match(/[A-Z]([0-9]{1,10})/gi);
625
+
626
+ if (cellValue && column.type === _FieldTableColumnTypes["default"].dropdown) {
627
+ tableLookup[cellKey] = columnOptionsLookup[column._id][cellValue];
628
+ } else if (cellValue && column.type === _FieldTableColumnTypes["default"].image) {
629
+ tableLookup[cellKey] = columnOptionsLookup[column._id][cellRawValue];
630
+ } else if (cellValue && formulaCell && containsOperands) {
631
+ formulaCells.push(cellKey);
632
+ tableLookup[cellKey] = cellValue;
633
+ } else {
634
+ tableLookup[cellKey] = cellValue || '';
635
+ }
636
+ });
637
+ });
638
+ formulaCells.forEach(function (sourceOperand) {
639
+ var formula = tableLookup[sourceOperand];
640
+ var invalidFormulaError = validFormulaString(sourceOperand, formula);
641
+ if (invalidFormulaError) return tableLookup[sourceOperand] = invalidFormulaError;
642
+ getFormulaResult(sourceOperand, formula, tableLookup);
643
+ });
644
+ return tableLookup;
645
+ };
646
+
647
+ exports.generateTableLookup = generateTableLookup;
648
+
649
+ var getFormulaResult = function getFormulaResult(sourceOperand, formula, tableLookup) {
650
+ formula = spreadOperandRange(formula);
651
+ var invalidFormulaError = validFormulaString(sourceOperand, formula);
652
+ if (invalidFormulaError) return tableLookup[sourceOperand] = invalidFormulaError;
653
+ var formulaOperands = formula.match(/[A-Z]([0-9]{1,10})/g);
654
+ if (!formulaOperands) return tableLookup[sourceOperand] = '*INVALID';
655
+ formulaOperands.forEach(function (operand) {
656
+ var operandValue = resolveOperandValue(sourceOperand, operand, tableLookup);
657
+ formula = formula.replace(operand, operandValue);
658
+ });
659
+ /**
660
+ * Add leading zeros to decimal numbers. hot-formula-parser throws an
661
+ * error if we try to parse non leading decimal numbers. For instace,
662
+ * a non leading decimal number is: .7 .001 etc. We convert these
663
+ * values to 0.7 & 0.001
664
+ */
665
+
666
+ var noLeadingZeroDecimalMatches = formula.match(/\D\./);
667
+
668
+ if (noLeadingZeroDecimalMatches && noLeadingZeroDecimalMatches.length > 0) {
669
+ noLeadingZeroDecimalMatches.forEach(function (val) {
670
+ var splitVals = val.split('');
671
+ var prefixCharacter = splitVals[0];
672
+ var newValue = "".concat(prefixCharacter, "0.");
673
+ formula = formula.replace(val, newValue);
674
+ });
675
+ }
676
+
677
+ formula = formula.replace('=', '');
678
+ var parsedValue = parser.parse(formula);
679
+ if (parsedValue.result) parsedValue.result = Math.round(100 * parsedValue.result) / 100;
680
+ tableLookup[sourceOperand] = parsedValue.result ? parsedValue.result.toString() : parsedValue.error;
681
+ return parsedValue;
682
+ };
683
+ /**
684
+ * Resolve operand value
685
+ * An operand is A1, B1, etc.
686
+ *
687
+ * @param sourceOperand //The cell that is requesting the value
688
+ * @param targetOperand //The cell you are trying to retrieve a value from
689
+ * @param tableLookup //The lookup of values contained in the table;
690
+ */
691
+
692
+
693
+ exports.getFormulaResult = getFormulaResult;
694
+
695
+ var resolveOperandValue = function resolveOperandValue(sourceOperand, targetOperand, tableLookup) {
696
+ var targetValue = tableLookup[targetOperand] && typeof tableLookup[targetOperand] === 'string' ? tableLookup[targetOperand].trim() : tableLookup[targetOperand]; // 1. If tableLookup doesn't have a value then return undefined
697
+
698
+ if (!targetValue) return 0; // 2. If tableLookup is already a number return the number value
699
+
700
+ if (typeof targetValue === 'number') return targetValue; // 3. If targetCell has circular reference return invalid.
701
+ //
702
+ // A circular reference can occur when C1 reference B1 and B1 references C1.
703
+ // It creates and infinite circular loop of trying to resovle a value
704
+ // because they both depend on eachother.
705
+
706
+ if (sourceOperand && hasCircularOperandReference(targetValue, sourceOperand) || targetOperand && hasCircularOperandReference(targetValue, targetOperand)) return '* INVALID - Circular Reference'; // 4. If targetCell has a formula value
707
+
708
+ if (targetValue !== undefined && targetValue.charAt(0) === '=') {
709
+ var result = getFormulaResult(sourceOperand, targetValue, tableLookup);
710
+ return result.result || result.error;
711
+ } // 5. If targetCell has a normal value or an already resolved
712
+ // formula cell then just return the cell value
713
+
714
+
715
+ if (targetValue) return targetValue;
716
+ };
717
+
718
+ exports.resolveOperandValue = resolveOperandValue;
719
+
720
+ var hasCircularOperandReference = function hasCircularOperandReference(targetValue, lookupOperand) {
721
+ var regExp = new RegExp(lookupOperand, 'gi');
722
+ var foundOperandReferences = targetValue.match(regExp);
723
+ return !!(foundOperandReferences && foundOperandReferences.length > 0);
724
+ };
725
+
726
+ exports.hasCircularOperandReference = hasCircularOperandReference;
727
+
728
+ var hasOperandRange = function hasOperandRange(targetValue) {
729
+ return /[A-Z]([0-9]{1,10}):[A-Z]([0-9]{1,10})/gi.test(targetValue);
730
+ };
731
+ /**
732
+ * Check for any invalid patterns inside of the formula string
733
+ */
734
+
735
+
736
+ exports.hasOperandRange = hasOperandRange;
737
+
738
+ var validFormulaString = function validFormulaString(sourceOperand, formula) {
739
+ if (sourceOperand && hasCircularOperandReference(formula, sourceOperand)) {
740
+ return '*INVALID - Circular Reference';
741
+ }
742
+
743
+ var lowercaseOperands = formula.match(/[a-z]/g);
744
+
745
+ if (lowercaseOperands && lowercaseOperands.length > 0) {
746
+ return '*INVALID - Lowercase Letters Not Supported';
747
+ }
748
+ };
749
+ /**
750
+ * Spread the operand range into individual operands.
751
+ * For instance: SUM(A1:A4) turns into SUM(A1, A2, A3, A4);
752
+ */
753
+
754
+
755
+ exports.validFormulaString = validFormulaString;
756
+
757
+ var spreadOperandRange = function spreadOperandRange(targetValue) {
758
+ if (!hasOperandRange(targetValue)) return targetValue;
759
+ var operandRangeMatches = targetValue.match(/[A-Z]([0-9]{1,10}):[A-Z]([0-9]{1,10})/gi);
760
+ var operandRange = operandRangeMatches[0];
761
+ var operands = operandRange.split(':');
762
+ var operandA = operands[0];
763
+ var operandALetter = operandA.match(/[A-Z]+/gi) ? operandA.match(/[A-Z]+/gi)[0] : null;
764
+ var operandAIndex = operandA.match(/[0-9]+/gi) ? operandA.match(/[0-9]+/gi)[0] : null;
765
+ var operandB = operands[1];
766
+ var operandBLetter = operandB.match(/[A-Z]+/gi) ? operandB.match(/[A-Z]+/gi)[0] : null;
767
+ var operandBIndex = operandB.match(/[0-9]+/gi) ? operandB.match(/[0-9]+/gi)[0] : null; // If any values are missing return orignal targetValue
768
+
769
+ if (!operandALetter || !operandAIndex || !operandBLetter || !operandBIndex) return targetValue; // Handle row range.
770
+ // For instance: C1:C8
771
+
772
+ if (operandALetter === operandBLetter) {
773
+ var columnOperand = operandALetter;
774
+ var startIndex = parseInt(operandAIndex, 10);
775
+ var endIndex = parseInt(operandBIndex, 10);
776
+ var operandRangeValues = operandA;
777
+ var i = startIndex + 1;
778
+
779
+ while (i <= endIndex) {
780
+ operandRangeValues += ",".concat(columnOperand).concat(i);
781
+ i++;
782
+ }
783
+
784
+ targetValue = targetValue.replace(/[A-Z](\d{1,10}):[A-Z](\d{1,10})/gi, operandRangeValues);
785
+ } // Handle column range
786
+ // For instance, A1:D1
787
+ else {
788
+ var _startIndex = parseInt(_Table["default"].operandLetters.indexOf(operandALetter.toUpperCase()), 10);
789
+
790
+ var _endIndex = parseInt(_Table["default"].operandLetters.indexOf(operandBLetter.toUpperCase()), 10);
791
+
792
+ var _operandRangeValues = operandA;
793
+
794
+ var _i = _startIndex + 1;
795
+
796
+ while (_i <= _endIndex) {
797
+ var nextOperandLetter = _Table["default"].operandLetters[_i];
798
+ _operandRangeValues += ",".concat(nextOperandLetter).concat(operandAIndex);
799
+ _i++;
800
+ }
801
+
802
+ targetValue = targetValue.replace(/[A-Z](\d{1,10}):[A-Z](\d{1,10})/gi, _operandRangeValues);
803
+ }
804
+
805
+ return targetValue;
806
+ };
807
+ /**
808
+ * Primarily used for Mobile
809
+ *
810
+ * Get list of input group fields in an array formt.
811
+ * This breaks the rows and cells down to a single array.
812
+ *
813
+ * @param {Object} field
814
+ * @param {Array} columns
815
+ * @param {Array} rows
816
+ *
817
+ */
818
+
819
+
820
+ exports.spreadOperandRange = spreadOperandRange;
821
+
822
+ var generateInputGroupFields = function generateInputGroupFields(field, columns) {
823
+ var rows = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [getDefaultRow()];
824
+ var fieldSettings = arguments.length > 3 ? arguments[3] : undefined;
825
+ var activity = arguments.length > 4 ? arguments[4] : undefined;
826
+ var tableReferences = [];
827
+ var tableColumns = getColumns(columns);
828
+ var columnOptionValueLookup = {};
829
+ tableColumns.forEach(function (column) {
830
+ if (column.type === _FieldTableColumnTypes["default"].dropdown && column.options) {
831
+ columnOptionValueLookup[column._id] = {};
832
+ column.options.forEach(function (option) {
833
+ return columnOptionValueLookup[column._id][option._id] = option.value;
834
+ });
835
+ }
836
+ });
837
+ var tableRows = getRows(rows);
838
+ var rowOrder = getTableFieldRowOrder(field._id, fieldSettings, tableRows);
839
+ var sortedTableRows = sortRows(tableRows, rowOrder);
840
+ var cellActivityLookup = {};
841
+
842
+ if (activity && activity.length > 0) {
843
+ activity.forEach(function (act) {
844
+ var rowId = act.document.row;
845
+ var columnId = act.document.column;
846
+ var cellKey = "".concat(field._id).concat(rowId).concat(columnId);
847
+ if (!cellActivityLookup[cellKey]) cellActivityLookup[cellKey] = 0;
848
+ cellActivityLookup[cellKey] += 1;
849
+ });
850
+ }
851
+
852
+ sortedTableRows.forEach(function (row, rowIndex) {
853
+ var firstRowIndex = rowIndex === 0;
854
+ var lastRowIndex = rowIndex === sortedTableRows.length - 1;
855
+ /**
856
+ * Step 1: Add InputGroup Row Header
857
+ */
858
+
859
+ tableReferences.push({
860
+ uniqueId: "".concat(field._id).concat(row._id),
861
+ _id: field._id,
862
+ title: field.title,
863
+ type: _Table.inputGroupFieldTypes.inputGroupRowHeader,
864
+ rowIndex: rowIndex,
865
+ rowId: row._id,
866
+ firstRowIndex: firstRowIndex,
867
+ lastRowIndex: lastRowIndex,
868
+ firstIndex: rowIndex === 0,
869
+ lastIndex: false
870
+ });
871
+ /**
872
+ * Step 2: Add Input Group Row Cells
873
+ */
874
+
875
+ tableColumns.forEach(function (column, columnIndex) {
876
+ var lastColumnIndex = columnIndex === tableColumns.length - 1;
877
+ var value = row && row.cells ? row.cells[column._id] : '';
878
+ var displayValue = column.type === _FieldTableColumnTypes["default"].dropdown ? columnOptionValueLookup[column._id][value] : value;
879
+ var cellKey = "".concat(field._id).concat(row._id).concat(column._id);
880
+ tableReferences.push({
881
+ uniqueId: cellKey,
882
+ _id: field._id,
883
+ title: column.title,
884
+ type: column.type === _FieldTableColumnTypes["default"].dropdown ? _Table.inputGroupFieldTypes.inputGroupDropdownCell : _Table.inputGroupFieldTypes.inputGroupTextCell,
885
+ rowIndex: rowIndex,
886
+ rowId: row._id,
887
+ activity: cellActivityLookup[cellKey] || 0,
888
+ columnId: column._id,
889
+ columnIndex: columnIndex,
890
+ value: value,
891
+ displayValue: displayValue,
892
+ firstRowIndex: firstRowIndex,
893
+ lastRowIndex: lastRowIndex,
894
+ firstIndex: false,
895
+ lastIndex: lastRowIndex && lastColumnIndex
896
+ });
897
+ });
898
+ });
899
+ return tableReferences;
900
+ };
901
+ /**
902
+ * Populate table rows with values
903
+ * - Dropdown cells will have chosen values
904
+ * - Formula cells will have the formula result
905
+ *
906
+ * Note: Columns should already have the options lookup populated before
907
+ * being sent into this function
908
+ *
909
+ * @param {*} columns -
910
+ * @param {*} rows
911
+ * @returns
912
+ */
913
+
914
+
915
+ exports.generateInputGroupFields = generateInputGroupFields;
916
+
917
+ var getTableRowLookupWithPopulatedDropdownCells = function getTableRowLookupWithPopulatedDropdownCells(columns, rows) {
918
+ var rowsLookup = {};
919
+ var tableLookup = generateTableLookup(rows, columns);
920
+ var validRows = getRows(rows);
921
+ var validColumns = getColumns(columns);
922
+ validRows.forEach(function (row, rowIndex) {
923
+ var nextRow = _objectSpread(_objectSpread({}, row), {}, {
924
+ cells: _objectSpread({}, row.cells)
925
+ });
926
+
927
+ validColumns.forEach(function (column) {
928
+ var cellOperand = getCellOperand(column.operand, rowIndex + 1);
929
+ var value = tableLookup[cellOperand];
930
+
931
+ if (value && column.type === _FieldTableColumnTypes["default"].dropdown) {
932
+ nextRow.cells[column._id] = column.optionsLookup[value] ? column.optionsLookup[value].value : value;
933
+ } else {
934
+ nextRow.cells[column._id] = value;
935
+ }
936
+ });
937
+ rowsLookup[nextRow._id] = nextRow;
938
+ });
939
+ return rowsLookup;
940
+ };
941
+ /**
942
+ * Populate inputGroup dropdown questions with chosen value
943
+ *
944
+ * Note: Columns should already have the options lookup populated before
945
+ * being sent into this function
946
+ *
947
+ * @param {*} columns
948
+ * @param {*} rows
949
+ * @returns
950
+ */
951
+
952
+
953
+ exports.getTableRowLookupWithPopulatedDropdownCells = getTableRowLookupWithPopulatedDropdownCells;
954
+
955
+ var getInputGroupRowLookupWithPopulatedDropdownCells = function getInputGroupRowLookupWithPopulatedDropdownCells(columns, rows) {
956
+ var rowsLookup = {};
957
+ var validRows = typeof rows === 'string' ? JSON.parse(rows) : rows;
958
+ validRows.forEach(function (row) {
959
+ var nextRow = _objectSpread(_objectSpread({}, row), {}, {
960
+ cells: _objectSpread({}, row.cells)
961
+ });
962
+
963
+ columns.forEach(function (column) {
964
+ var optionId = nextRow.cells[column._id];
965
+
966
+ if (optionId && column.type === _FieldTableColumnTypes["default"].dropdown) {
967
+ nextRow.cells[column._id] = column.optionsLookup[optionId] ? column.optionsLookup[optionId].value : optionId;
968
+ }
969
+ });
970
+ rowsLookup[nextRow._id] = nextRow;
971
+ });
972
+ return rowsLookup;
973
+ };
974
+ /**
975
+ * Generate row index lookup:
976
+ * @param {*} fieldId
977
+ * @param {*} fieldSettings
978
+ * @param {*} rows
979
+ * @returns
980
+ */
981
+
982
+
983
+ exports.getInputGroupRowLookupWithPopulatedDropdownCells = getInputGroupRowLookupWithPopulatedDropdownCells;
984
+
985
+ var getRowIndexLookup = function getRowIndexLookup(fieldId, fieldSettings, rows) {
986
+ var rowOrder = getTableFieldRowOrder(fieldId, fieldSettings, rows);
987
+ var rowIndexLookup = {};
988
+ rowOrder.forEach(function (rowId, index) {
989
+ rowIndexLookup[rowId] = index;
990
+ });
991
+ return rowIndexLookup;
992
+ };
993
+ /**
994
+ * Handle Table Cell Change
995
+ *
996
+ * @param {Array} rows //List of current table rows
997
+ * @param {String} rowId
998
+ * @param {String} columnId
999
+ * @param {String} value
1000
+ * @param {Func} callback
1001
+ */
1002
+
1003
+
1004
+ exports.getRowIndexLookup = getRowIndexLookup;
1005
+
1006
+ var handleTableCellChange = function handleTableCellChange(rows, rowId, columnId, val, callback) {
1007
+ var targetRowIndex = rows.findIndex(function (row) {
1008
+ return row._id === rowId;
1009
+ });
1010
+ var row = rows[targetRowIndex];
1011
+ var cells = row ? row.cells : {}; //Only save data if value has changed
1012
+
1013
+ if (cells[columnId] !== val && callback) {
1014
+ callback({
1015
+ targetRowIndex: targetRowIndex,
1016
+ row: {
1017
+ _id: rowId,
1018
+ cells: (0, _defineProperty2["default"])({}, columnId, val)
1019
+ }
1020
+ });
1021
+ }
1022
+ };
1023
+ /**
1024
+ * Handle Insert Table Row
1025
+ *
1026
+ * @param {Number} rowIndex
1027
+ * @param {Func} callback
1028
+ */
1029
+
1030
+
1031
+ exports.handleTableCellChange = handleTableCellChange;
1032
+
1033
+ var handleInsertTableRow = function handleInsertTableRow(rowIndex, callback) {
1034
+ if (callback) callback({
1035
+ targetRowIndex: rowIndex + 1,
1036
+ row: getDefaultRow()
1037
+ });
1038
+ };
1039
+ /**
1040
+ * Handle Create New Table Row
1041
+ *
1042
+ * @param {Array} rows //List of current table rows
1043
+ * @param {Func} callback
1044
+ */
1045
+
1046
+
1047
+ exports.handleInsertTableRow = handleInsertTableRow;
1048
+
1049
+ var handleCreateTableRow = function handleCreateTableRow(rows, callback) {
1050
+ var targetRowIndex = rows.length;
1051
+ if (callback) callback({
1052
+ targetRowIndex: targetRowIndex,
1053
+ row: getDefaultRow()
1054
+ });
1055
+ };
1056
+ /**
1057
+ * Handle Duplicate Table Row
1058
+ *
1059
+ * @param {Array} rows //List of current table rows
1060
+ * @param {String} rowId
1061
+ * @param {Number} rowIndex
1062
+ * @param {Func} callback
1063
+ */
1064
+
1065
+
1066
+ exports.handleCreateTableRow = handleCreateTableRow;
1067
+
1068
+ var handleDuplicateTableRow = function handleDuplicateTableRow(rows, rowId, rowIndex, callback) {
1069
+ var duplicateRow = rows.find(function (row) {
1070
+ return row._id === rowId;
1071
+ });
1072
+ var newRow = getDefaultRow();
1073
+ newRow.cells = duplicateRow && duplicateRow.cells ? _objectSpread({}, duplicateRow.cells) : {};
1074
+ var targetRowIndex = rowIndex + 1;
1075
+ if (callback) callback({
1076
+ targetRowIndex: targetRowIndex,
1077
+ row: newRow
1078
+ });
1079
+ };
1080
+ /**
1081
+ * Handle Move Table Row Up
1082
+ *
1083
+ * @param {Number} rowIndex
1084
+ * @param {Func} callback
1085
+ */
1086
+
1087
+
1088
+ exports.handleDuplicateTableRow = handleDuplicateTableRow;
1089
+
1090
+ var handleMoveTableRowUp = function handleMoveTableRowUp(rowIndex, callback) {
1091
+ //If first row then ignore
1092
+ if (rowIndex === 0) return;
1093
+ var targetRowIndex = rowIndex - 1;
1094
+ if (callback) callback({
1095
+ targetRowIndex: targetRowIndex
1096
+ });
1097
+ };
1098
+ /**
1099
+ * Handle Move Table Row Down
1100
+ *
1101
+ * @param {Array} rows
1102
+ * @param {Number} rowIndex
1103
+ * @param {Func} callback
1104
+ */
1105
+
1106
+
1107
+ exports.handleMoveTableRowUp = handleMoveTableRowUp;
1108
+
1109
+ var handleMoveTableRowDown = function handleMoveTableRowDown(rows, rowIndex, callback) {
1110
+ //If last row then ignore
1111
+ if (rowIndex >= rows.length - 1) return;
1112
+ var targetRowIndex = rowIndex + 1;
1113
+ if (callback) callback({
1114
+ targetRowIndex: targetRowIndex
1115
+ });
1116
+ };
1117
+
1118
+ exports.handleMoveTableRowDown = handleMoveTableRowDown;
1119
+ var _default = {
1120
+ generateTableLookup: generateTableLookup,
1121
+ generateTableLookupForRows: generateTableLookupForRows,
1122
+ generateInputGroupFields: generateInputGroupFields,
1123
+ getColumnOperand: getColumnOperand,
1124
+ getCellOperand: getCellOperand,
1125
+ getIndexesFromTableCellOperand: getIndexesFromTableCellOperand,
1126
+ getRowOrder: getRowOrder,
1127
+ getRows: getRows,
1128
+ sortRows: sortRows,
1129
+ getFilteredRowOrder: getFilteredRowOrder,
1130
+ getDefaultRow: getDefaultRow,
1131
+ getRowMap: getRowMap,
1132
+ getDefaultColumnOption: getDefaultColumnOption,
1133
+ getDefaultTextColumn: getDefaultTextColumn,
1134
+ getDefaultDropdownColumn: getDefaultDropdownColumn,
1135
+ getColumnOrder: getColumnOrder,
1136
+ getColumns: getColumns,
1137
+ sortColumns: sortColumns,
1138
+ getFormulaResult: getFormulaResult,
1139
+ resolveOperandValue: resolveOperandValue,
1140
+ hasCircularOperandReference: hasCircularOperandReference,
1141
+ validFormulaString: validFormulaString,
1142
+ hasOperandRange: hasOperandRange,
1143
+ spreadOperandRange: spreadOperandRange,
1144
+ getTableFieldLookupKey: getTableFieldLookupKey,
1145
+ getTableFieldRowOrder: getTableFieldRowOrder,
1146
+ getTableRowLookupWithPopulatedDropdownCells: getTableRowLookupWithPopulatedDropdownCells,
1147
+ getInputGroupRowLookupWithPopulatedDropdownCells: getInputGroupRowLookupWithPopulatedDropdownCells,
1148
+ getRowIndexLookup: getRowIndexLookup,
1149
+ handleMoveColumnLeft: handleMoveColumnLeft,
1150
+ handleMoveColumnRight: handleMoveColumnRight,
1151
+ handleTableCellChange: handleTableCellChange,
1152
+ handleInsertTableRow: handleInsertTableRow,
1153
+ handleCreateTableRow: handleCreateTableRow,
1154
+ handleDuplicateTableRow: handleDuplicateTableRow,
1155
+ handleMoveTableRowUp: handleMoveTableRowUp,
1156
+ handleMoveTableRowDown: handleMoveTableRowDown,
1157
+ FieldTableColumnTypes: _FieldTableColumnTypes["default"],
1158
+ FieldTableCustomColumnIds: _FieldTableCustomColumnIds["default"]
1159
+ };
1160
+ exports["default"] = _default;