@builttocreate/engine-utils 2.9.1-beta.758 → 2.9.1-beta.758.2

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