@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.
- package/dist/activityHelper.js +167 -0
- package/dist/changedKeys.js +34 -0
- package/dist/chartHelper.js +35 -0
- package/dist/constants/ActivityTypes.js +14 -0
- package/dist/constants/DocumentTypes.js +12 -0
- package/dist/constants/FieldDisplayTypes.js +38 -0
- package/dist/constants/FieldPresentationModes.js +18 -0
- package/dist/constants/FieldTableColumnTypes.js +16 -0
- package/dist/constants/FieldTableCustomColumnIds.js +12 -0
- package/dist/constants/FieldTypes.js +67 -0
- package/dist/constants/FileTypes.js +12 -0
- package/dist/constants/FileViews.js +10 -0
- package/dist/constants/FormStyleOptions.js +23 -0
- package/dist/constants/ListTypes.js +12 -0
- package/dist/constants/PageLayoutModes.js +15 -0
- package/dist/constants/PageTypes.js +15 -0
- package/dist/constants/Roles.js +36 -0
- package/dist/constants/Table.js +76 -0
- package/dist/fieldHelper.js +307 -0
- package/dist/fileHelper.js +26 -0
- package/dist/generateObjectId.js +18 -0
- package/dist/index.js +86 -0
- package/dist/joyDocHelper.js +936 -0
- package/dist/paginationHelper.js +35 -0
- package/dist/reduxApiMiddleware.js +91 -0
- package/dist/roleHelper.js +24 -0
- package/dist/tableHelper.js +1142 -0
- package/dist/validateObjectId.js +10 -0
- package/package.json +4 -5
|
@@ -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
|
+
};
|