@builttocreate/engine-utils 2.6.0-beta.22 → 2.6.0-beta.24

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.
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.sortPages = exports.sortFieldPositionsByXAndYCoordinates = exports.mergeAssoicatedFieldPositionsForMobileView = exports.getPageOrder = exports.getMobileViewFromFile = exports.getDocumentFromTemplate = exports.getDefaultTemplate = exports.getDefaultJoyDocPage = exports.getDefaultJoyDocFile = exports.getDefaultJoyDoc = exports.getDefaultDocument = exports.getCleanedJoyDocPages = exports.getCleanedJoyDoc = exports.generateMobileViewPageFieldPositions = exports.generateMobileViewPage = exports.generateMobileViewFile = exports.duplicateDocumentPage = exports.duplicate = exports["default"] = exports.cleanPageOrder = void 0;
8
+ exports.sortPages = exports.sortFieldPositionsByXAndYCoordinates = exports.mergeAssoicatedFieldPositionsForMobileView = exports.getPageOrder = exports.getMobileViewFromFile = exports.getDocumentFromTemplate = exports.getDefaultTemplate = exports.getDefaultJoyDocPage = exports.getDefaultJoyDocFile = exports.getDefaultJoyDoc = exports.getDefaultDocument = exports.getCleanedJoyDocPages = exports.getCleanedJoyDoc = exports.generateMobileViewPageFieldPositions = exports.generateMobileViewPage = exports.generateMobileViewFile = exports.formatTableFieldPositions = exports.duplicateDocumentPage = exports.duplicate = exports["default"] = exports.cleanPageOrder = void 0;
9
9
 
10
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
11
 
@@ -805,8 +805,172 @@ var sortFieldPositionsByXAndYCoordinates = function sortFieldPositionsByXAndYCoo
805
805
  });
806
806
  return sortedFieldPositions;
807
807
  };
808
+ /**
809
+ * Formats individual table cell field positions that have already been merged with their associated field.
810
+ * This additional information is added and used for rendering the fieldPositions on the form.
811
+ *
812
+ * For instance, adds properties like columnType, calculatedCellValue, options, etc.
813
+ *
814
+ * @param {Array} fieldPositions
815
+ * @returns {Array}
816
+ */
817
+
808
818
 
809
819
  exports.sortFieldPositionsByXAndYCoordinates = sortFieldPositionsByXAndYCoordinates;
820
+
821
+ var formatTableFieldPositions = function formatTableFieldPositions(fieldPositions) {
822
+ /**
823
+ * We only want to generate the table value calculated lookup for each table field once.
824
+ * We use these lookups because multiple table fieldPositions belonging to the same table
825
+ * field will all use the same table value calculated lookup.
826
+ */
827
+ var tableFieldLookup = {};
828
+ var nextFieldPositions = [];
829
+ (0, _toConsumableArray2["default"])(fieldPositions).forEach(function (fieldPosition) {
830
+ var nextFieldPosition = _objectSpread({}, fieldPosition);
831
+
832
+ if (fieldPosition.type === _FieldTypes["default"].table) {
833
+ var field = fieldPosition.field,
834
+ column = fieldPosition.column,
835
+ rowIndex = fieldPosition.rowIndex,
836
+ tableColumns = fieldPosition.tableColumns,
837
+ value = fieldPosition.value,
838
+ rowOrder = fieldPosition.rowOrder,
839
+ tableColumnOrder = fieldPosition.tableColumnOrder;
840
+ /**
841
+ * Step 1: Generate rows, rowOrder, tableColumns, etc. lookups for associated field. We only have to
842
+ * do this once per-field. This increases performance if there are multiple form positions associated
843
+ * with the same form.
844
+ */
845
+
846
+ if (!tableFieldLookup[field]) {
847
+ /**
848
+ * Step 1.1 Handle rows
849
+ */
850
+ var nextRows = (0, _tableHelper.getRows)(value);
851
+ var nextRowOrder = (0, _tableHelper.getCleanedRowOrder)(rowOrder, nextRows);
852
+ var nextSortedRows = (0, _tableHelper.sortRows)(nextRows, nextRowOrder);
853
+ /**
854
+ * Step 1.2 Handle columns
855
+ */
856
+
857
+ var nextTableColumnOrder = (0, _tableHelper.getCleanedColumnOrder)(tableColumnOrder, tableColumns);
858
+ var nextSortedTableColumns = (0, _tableHelper.sortColumns)(tableColumns, nextTableColumnOrder);
859
+ var nextTableColumns = (0, _tableHelper.getColumns)(nextSortedTableColumns);
860
+ var nextTableColumnLookup = {};
861
+ nextTableColumns.forEach(function (column) {
862
+ return nextTableColumnLookup[column._id] = column;
863
+ });
864
+ /**
865
+ * Step 1.3 Handle cell calculations
866
+ */
867
+
868
+ var calculatedValue = (0, _tableHelper.generateTableLookup)(nextSortedRows, nextSortedTableColumns);
869
+ tableFieldLookup[field] = {
870
+ value: nextSortedRows,
871
+ rowOrder: nextRowOrder,
872
+ tableColumns: nextTableColumns,
873
+ tableColumnOrder: nextTableColumnOrder,
874
+ tableColumnLookup: nextTableColumnLookup,
875
+ calculatedValue: calculatedValue
876
+ };
877
+ }
878
+ /**
879
+ * Ensure each table field has a properly formatted properties
880
+ */
881
+
882
+
883
+ nextFieldPosition.value = tableFieldLookup[field].value;
884
+ nextFieldPosition.rowOrder = tableFieldLookup[field].rowOrder;
885
+ nextFieldPosition.tableColumns = tableFieldLookup[field].tableColumns;
886
+ nextFieldPosition.tableColumnOrder = tableFieldLookup[field].tableColumnOrder;
887
+ /**
888
+ * Add calculated value lookup. For instance, { A1: '', B1: '', C1: '', ... }
889
+ */
890
+
891
+ nextFieldPosition.calculatedValue = tableFieldLookup[field].calculatedValue;
892
+ /**
893
+ * Individual Table Cell vs Entire Table
894
+ *
895
+ * Only add cellValue, calculatedCellValue, columnType, and column options to
896
+ * individually mapped table cell fieldPositions. Regular table fields (entire table)
897
+ * just simply use the fieldPositions.value parameter so we don't need the calculated
898
+ * values, etc.
899
+ *
900
+ * We determine an individual table cell fieldPosition vs an entire table
901
+ * fieldPosition by checking for column and rowIndex. Individual cells have
902
+ * column and rowIndex but regular tables do not.
903
+ *
904
+ * Note:
905
+ * rowIndex + 1 is used while calculating cell value since column operands
906
+ * start from 1 instead of zero in the table lookups
907
+ * (ie: [A1:{}, B1:{}] instead of [A0:{}, B0:{}])
908
+ *
909
+ * If tableRowIndex associated with a cell doesn't have a table row associated
910
+ * with it (ie rows[rowIndex] is undefined) it means that particular row is deleted
911
+ */
912
+
913
+ if (tableFieldLookup[field] && column && typeof rowIndex === 'number') {
914
+ var _tableFieldLookup$fie;
915
+
916
+ /**
917
+ * What is the difference between rowIndex and targetRowIndex?
918
+ *
919
+ * - The rowIndex on the fieldPosition is the saved index of where the rowId lives inside of the rowOrder.
920
+ * - The targetRowIndex is the actual index of the row object inside the value (array of row data) of the field.
921
+ *
922
+ * We use the fieldPosition.rowIndex to get the rowId from the rowOrder. Then we use the rowId to locate
923
+ * the assoicated row object data in the value property. The rowOrder and value (rows) do not follow the same
924
+ * order. The rowOrder is updated when users insert rows, move rows up or down, etc. it manages where rows
925
+ * are at in the list and how they should be rendered. This is why the rowIndex uses the rowOrder.
926
+ */
927
+ var targetColumn = tableFieldLookup[field].tableColumnLookup[column];
928
+ var targetRowId = tableFieldLookup[field].rowOrder[rowIndex];
929
+ var targetRowIndex = tableFieldLookup[field].value.findIndex(function (row) {
930
+ return (row === null || row === void 0 ? void 0 : row._id) === targetRowId;
931
+ });
932
+ /**
933
+ * Add proper rowId to the field position so that it can be used
934
+ * inside the element for change handlers;
935
+ */
936
+
937
+ nextFieldPosition.rowId = targetRowId;
938
+ /**
939
+ * If rows[rowIndex] is undefined, it means the row that was present
940
+ * at the particular rowIndex was deleted
941
+ */
942
+
943
+ nextFieldPosition.cellValue = ((_tableFieldLookup$fie = tableFieldLookup[field].value[targetRowIndex]) === null || _tableFieldLookup$fie === void 0 ? void 0 : _tableFieldLookup$fie.cells[column]) || '';
944
+ /**
945
+ * Skip any individual field position that is associated with a deleted column.
946
+ * targetColumn will appear as undefined if a column is deleted
947
+ */
948
+
949
+ if (targetColumn) {
950
+ nextFieldPosition.calculatedCellValue = tableFieldLookup[field].calculatedValue["".concat(targetColumn.operand).concat(targetRowIndex + 1)];
951
+ nextFieldPosition.columnType = targetColumn.type;
952
+ nextFieldPosition.options = targetColumn.options;
953
+ nextFieldPosition.columnIdentifier = targetColumn.identifier;
954
+ /**
955
+ * IMPORTANT NOTE: We only add individual table cell field position into
956
+ * the fieldPosition list if the associated column is not deleted.
957
+ */
958
+
959
+ nextFieldPositions.push(nextFieldPosition);
960
+ }
961
+ } else {
962
+ //Push table fields with original display type
963
+ nextFieldPositions.push(nextFieldPosition);
964
+ }
965
+ } else {
966
+ //Push other fields
967
+ nextFieldPositions.push(nextFieldPosition);
968
+ }
969
+ });
970
+ return nextFieldPositions;
971
+ };
972
+
973
+ exports.formatTableFieldPositions = formatTableFieldPositions;
810
974
  var _default = {
811
975
  getDefaultJoyDocPage: getDefaultJoyDocPage,
812
976
  getDefaultJoyDocFile: getDefaultJoyDocFile,
@@ -824,6 +988,7 @@ var _default = {
824
988
  mergeAssoicatedFieldPositionsForMobileView: mergeAssoicatedFieldPositionsForMobileView,
825
989
  generateMobileViewFile: generateMobileViewFile,
826
990
  generateMobileViewPage: generateMobileViewPage,
827
- generateMobileViewPageFieldPositions: generateMobileViewPageFieldPositions
991
+ generateMobileViewPageFieldPositions: generateMobileViewPageFieldPositions,
992
+ formatTableFieldPositions: formatTableFieldPositions
828
993
  };
829
994
  exports["default"] = _default;
@@ -7,7 +7,7 @@ var _typeof3 = require("@babel/runtime/helpers/typeof");
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
- 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.getColumns = exports.getColumnOrder = exports.getColumnOperand = exports.getCleanedRowOrder = exports.getCellOperand = exports.generateTableLookupForRows = exports.generateTableLookup = exports.generateTableFieldLookups = exports.generateRowTableLookup = exports.generateInputGroupFields = exports["default"] = void 0;
10
+ 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.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;
11
11
 
12
12
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
13
13
 
@@ -386,12 +386,60 @@ var getColumnOrder = function getColumnOrder(columnOrder, columns) {
386
386
  return column._id;
387
387
  });
388
388
  };
389
+ /**
390
+ * This method removes the columnIds of the deleted columns (or) any duplicate columnIds
391
+ * from the tableColumnOrder there by returning a cleaned tableColumnOrder
392
+ *
393
+ * @param {*} tableColumnOrder
394
+ * @param {*} tableColumns
395
+ *
396
+ * @returns {Array}
397
+ **/
398
+
399
+
400
+ exports.getColumnOrder = getColumnOrder;
401
+
402
+ var getCleanedColumnOrder = function getCleanedColumnOrder(columnOrder, columns) {
403
+ var nextColumnOrder = [];
404
+ /**
405
+ * Step 1: Handle generating or retrieving proper column order.
406
+ */
407
+
408
+ if (columnOrder && columnOrder.length > 0) {
409
+ nextColumnOrder = columnOrder;
410
+ } else if (columns && columns.length > 0) {
411
+ columns.forEach(function (column) {
412
+ if (!column.deleted) nextColumnOrder.push(column._id);
413
+ });
414
+ }
415
+ /**
416
+ * Step 2: Remove column Ids from columnOrder for columns that no longer exist or have been deleted
417
+ */
418
+
419
+
420
+ var columnLookup = {};
421
+ columns.forEach(function (column) {
422
+ return columnLookup[column._id] = column && !column.deleted;
423
+ });
424
+ nextColumnOrder = nextColumnOrder.filter(function (columnId) {
425
+ return columnLookup[columnId];
426
+ });
427
+ /**
428
+ * Step 3: Remove any duplicate column Id references in the column order.
429
+ */
430
+
431
+ var filteredNextColumnOrder = [];
432
+ nextColumnOrder.forEach(function (columnId) {
433
+ if (columnId && filteredNextColumnOrder.indexOf(columnId) === -1) filteredNextColumnOrder.push(columnId);
434
+ });
435
+ return filteredNextColumnOrder;
436
+ };
389
437
  /**
390
438
  * Get table columns with added operands. Operands are the A, B, C, etc.
391
439
  */
392
440
 
393
441
 
394
- exports.getColumnOrder = getColumnOrder;
442
+ exports.getCleanedColumnOrder = getCleanedColumnOrder;
395
443
 
396
444
  var getColumns = function getColumns(columns) {
397
445
  var parsedColumns = columns;
@@ -698,7 +746,9 @@ var generateTableLookup = function generateTableLookup(rows, columns) {
698
746
  if (!column.operand) return;
699
747
  var cellKey = "".concat(column.operand).concat(rowIndex + 1);
700
748
  var cellRawValue = row.cells[column._id] ? row.cells[column._id] : undefined;
701
- var cellValue = cellRawValue && typeof cellRawValue === 'string' ? cellRawValue.trim() : undefined;
749
+ var cellValue;
750
+ if (cellRawValue && typeof cellRawValue === 'string') cellValue = cellRawValue.trim();
751
+ if (cellRawValue && typeof cellRawValue === 'number') cellValue = cellRawValue.toString();
702
752
  var formulaCell = cellValue !== undefined && cellValue.charAt(0) === '=';
703
753
  var containsOperands = cellValue !== undefined && cellValue.match(/[A-Z]([0-9]{1,10})/gi);
704
754
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@builttocreate/engine-utils",
3
- "version": "2.6.0-beta.22",
3
+ "version": "2.6.0-beta.24",
4
4
  "description": "Utility library for common logic shared across web and mobile",
5
5
  "main": "dist/index.js",
6
6
  "files": [