dtable-utils 0.0.3 → 0.0.4-beta.1

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.
Files changed (152) hide show
  1. package/README.md +42 -5
  2. package/dist/index.js +1 -1
  3. package/es/cell-value-get/cell-value.js +250 -20
  4. package/es/cell-value-get/collaborator.js +16 -3
  5. package/es/cell-value-get/digital-sign.js +1 -1
  6. package/es/cell-value-get/duration.js +3 -3
  7. package/es/cell-value-get/geolocation.js +52 -30
  8. package/es/cell-value-get/long-text.js +1 -1
  9. package/es/cell-value-get/number.js +51 -19
  10. package/es/cell-value-get/option.js +33 -9
  11. package/es/cell-value-get/rate.js +11 -0
  12. package/es/cell-value-set/date.js +26 -0
  13. package/es/cell-value-set/number.js +53 -1
  14. package/es/color/column-color.js +437 -0
  15. package/es/color/gradient-color.js +100 -0
  16. package/es/color/row-color.js +289 -0
  17. package/es/column/{common.js → core.js} +2 -14
  18. package/es/column/date.js +1 -1
  19. package/es/column/number.js +1 -1
  20. package/es/column/option.js +145 -0
  21. package/es/common.js +23 -3
  22. package/es/constants/color.js +16 -0
  23. package/es/constants/column-permission.js +7 -0
  24. package/es/constants/column.js +127 -2
  25. package/es/constants/filter/index.js +5 -1
  26. package/es/constants/formula.js +2 -1
  27. package/es/constants/grid-header.js +6 -0
  28. package/es/constants/group.js +23 -0
  29. package/es/constants/limit.js +3 -0
  30. package/es/constants/reg.js +4 -0
  31. package/es/constants/row-color.js +11 -0
  32. package/es/constants/sort.js +11 -0
  33. package/es/date.js +1 -1
  34. package/es/filter/core.js +322 -0
  35. package/es/filter/filter-column/array.js +87 -0
  36. package/es/filter/filter-column/checkbox.js +14 -0
  37. package/es/filter/filter-column/collaborator.js +72 -0
  38. package/es/filter/filter-column/creator.js +59 -0
  39. package/es/filter/filter-column/date.js +102 -0
  40. package/es/filter/filter-column/digital-sign.js +29 -0
  41. package/es/filter/filter-column/file.js +27 -0
  42. package/es/filter/filter-column/formula.js +57 -0
  43. package/es/filter/filter-column/geolocation.js +58 -0
  44. package/es/filter/filter-column/link.js +20 -0
  45. package/es/filter/filter-column/long-text.js +28 -0
  46. package/es/filter/filter-column/multiple-select.js +64 -0
  47. package/es/filter/filter-column/number.js +97 -0
  48. package/es/filter/filter-column/single-select.js +45 -0
  49. package/es/filter/filter-column/text.js +60 -0
  50. package/es/filter/filter-row.js +233 -0
  51. package/es/group/core.js +116 -0
  52. package/es/group/group-row.js +402 -0
  53. package/es/index.js +63 -11
  54. package/es/link/core.js +78 -0
  55. package/es/number.js +21 -0
  56. package/es/row/core.js +180 -0
  57. package/es/sort/core.js +91 -0
  58. package/es/sort/sort-column/array.js +72 -0
  59. package/es/sort/sort-column/checkbox.js +22 -0
  60. package/es/sort/sort-column/collaborator.js +16 -0
  61. package/es/sort/sort-column/date.js +25 -0
  62. package/es/sort/sort-column/formula.js +49 -0
  63. package/es/sort/sort-column/link.js +32 -0
  64. package/es/sort/sort-column/multiple-select.js +45 -0
  65. package/es/sort/sort-column/number.js +25 -0
  66. package/es/sort/sort-column/single-select.js +30 -0
  67. package/es/sort/sort-column/text.js +61 -0
  68. package/es/sort/sort-row.js +110 -0
  69. package/es/table/column.js +27 -0
  70. package/es/table/core.js +14 -0
  71. package/es/table/row.js +25 -0
  72. package/es/validate/filter.js +1 -1
  73. package/es/validate/geolocation.js +5 -0
  74. package/es/view/core.js +134 -0
  75. package/es/view/formula.js +147 -0
  76. package/es/view/group.js +32 -0
  77. package/es/view/summaries.js +167 -0
  78. package/lib/cell-value-get/cell-value.js +254 -19
  79. package/lib/cell-value-get/collaborator.js +16 -2
  80. package/lib/cell-value-get/digital-sign.js +1 -1
  81. package/lib/cell-value-get/duration.js +3 -2
  82. package/lib/cell-value-get/geolocation.js +53 -30
  83. package/lib/cell-value-get/long-text.js +1 -1
  84. package/lib/cell-value-get/number.js +51 -18
  85. package/lib/cell-value-get/option.js +34 -8
  86. package/lib/cell-value-get/rate.js +15 -0
  87. package/lib/cell-value-set/date.js +30 -0
  88. package/lib/cell-value-set/number.js +53 -0
  89. package/lib/color/column-color.js +446 -0
  90. package/lib/color/gradient-color.js +110 -0
  91. package/lib/color/row-color.js +297 -0
  92. package/lib/column/{common.js → core.js} +1 -14
  93. package/lib/column/date.js +2 -2
  94. package/lib/column/number.js +3 -3
  95. package/lib/column/option.js +153 -0
  96. package/lib/common.js +27 -3
  97. package/lib/constants/color.js +20 -0
  98. package/lib/constants/column-permission.js +11 -0
  99. package/lib/constants/column.js +134 -1
  100. package/lib/constants/filter/index.js +5 -0
  101. package/lib/constants/formula.js +2 -0
  102. package/lib/constants/grid-header.js +10 -0
  103. package/lib/constants/group.js +36 -0
  104. package/lib/constants/limit.js +7 -0
  105. package/lib/constants/reg.js +9 -0
  106. package/lib/constants/row-color.js +17 -0
  107. package/lib/constants/sort.js +18 -0
  108. package/lib/filter/core.js +336 -0
  109. package/lib/filter/filter-column/array.js +91 -0
  110. package/lib/filter/filter-column/checkbox.js +18 -0
  111. package/lib/filter/filter-column/collaborator.js +80 -0
  112. package/lib/filter/filter-column/creator.js +63 -0
  113. package/lib/filter/filter-column/date.js +106 -0
  114. package/lib/filter/filter-column/digital-sign.js +33 -0
  115. package/lib/filter/filter-column/file.js +31 -0
  116. package/lib/filter/filter-column/formula.js +61 -0
  117. package/lib/filter/filter-column/geolocation.js +62 -0
  118. package/lib/filter/filter-column/link.js +24 -0
  119. package/lib/filter/filter-column/long-text.js +32 -0
  120. package/lib/filter/filter-column/multiple-select.js +72 -0
  121. package/lib/filter/filter-column/number.js +101 -0
  122. package/lib/filter/filter-column/single-select.js +49 -0
  123. package/lib/filter/filter-column/text.js +64 -0
  124. package/lib/filter/filter-row.js +239 -0
  125. package/lib/group/core.js +126 -0
  126. package/lib/group/group-row.js +413 -0
  127. package/lib/index.js +177 -7
  128. package/lib/link/core.js +90 -0
  129. package/lib/number.js +26 -0
  130. package/lib/row/core.js +189 -0
  131. package/lib/sort/core.js +102 -0
  132. package/lib/sort/sort-column/array.js +76 -0
  133. package/lib/sort/sort-column/checkbox.js +26 -0
  134. package/lib/sort/sort-column/collaborator.js +20 -0
  135. package/lib/sort/sort-column/date.js +29 -0
  136. package/lib/sort/sort-column/formula.js +53 -0
  137. package/lib/sort/sort-column/link.js +36 -0
  138. package/lib/sort/sort-column/multiple-select.js +49 -0
  139. package/lib/sort/sort-column/number.js +29 -0
  140. package/lib/sort/sort-column/single-select.js +34 -0
  141. package/lib/sort/sort-column/text.js +66 -0
  142. package/lib/sort/sort-row.js +115 -0
  143. package/lib/table/column.js +32 -0
  144. package/lib/table/core.js +18 -0
  145. package/lib/table/row.js +30 -0
  146. package/lib/validate/filter.js +3 -3
  147. package/lib/validate/geolocation.js +9 -0
  148. package/lib/view/core.js +143 -0
  149. package/lib/view/formula.js +154 -0
  150. package/lib/view/group.js +36 -0
  151. package/lib/view/summaries.js +173 -0
  152. package/package.json +5 -3
@@ -0,0 +1,154 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var cellType = require('../constants/cell-type.js');
6
+ var formula = require('../constants/formula.js');
7
+
8
+ /**
9
+ * Transform the formats of link column to link-formula's
10
+ * @param {object} linkColumn e.g. { key, data: { display_column_key, ... }, ... }
11
+ * @returns converted link column, object
12
+ */
13
+ var transLink2LinkFormula = function transLink2LinkFormula(linkColumn) {
14
+ var key = linkColumn.key,
15
+ name = linkColumn.name,
16
+ data = linkColumn.data;
17
+ var display_column_key = data.display_column_key;
18
+ return {
19
+ key: key,
20
+ name: name,
21
+ type: cellType.CellType.LINK_FORMULA,
22
+ data: {
23
+ formula: 'lookup',
24
+ link_column_key: key,
25
+ level1_linked_table_column_key: display_column_key,
26
+ level2_linked_table_column_key: null,
27
+ operated_columns: []
28
+ }
29
+ };
30
+ };
31
+
32
+ /**
33
+ * Get sorted formula columns
34
+ * @param {array} formulaColumns the formula columns waiting to sort
35
+ * @param {object} table e.g. { columns, ... }
36
+ * @returns sorted formula columns, array
37
+ */
38
+ var getSortedFormulaColumns = function getSortedFormulaColumns(formulaColumns, table) {
39
+ if (!Array.isArray(formulaColumns) || !table || !Array.isArray(table.columns)) return [];
40
+ var keyColumnMap = {};
41
+ table.columns.forEach(function (column) {
42
+ var key = column.key,
43
+ type = column.type;
44
+ if (formula.FORMULA_COLUMN_TYPES_MAP[type]) {
45
+ keyColumnMap[key] = column;
46
+ } else if (type === cellType.CellType.LINK && column.data) {
47
+ keyColumnMap[key] = transLink2LinkFormula(column);
48
+ }
49
+ });
50
+
51
+ // get none-repeating formulas
52
+ var key_sorting_formula_column = {};
53
+ var sorting_formula_column_keys = [];
54
+ formulaColumns.forEach(function (column) {
55
+ var columnKey = column.key;
56
+ if (!key_sorting_formula_column[columnKey]) {
57
+ key_sorting_formula_column[columnKey] = column;
58
+ sorting_formula_column_keys.push(columnKey);
59
+ }
60
+ });
61
+
62
+ /**
63
+ * e.g. formula1 = formula2 + formula3
64
+ * e.g. formula2 = 1 + 2
65
+ * e.g. formula3 = formula2 + 3
66
+ * edges: formula2 --> formula1, formula2 --> formula3; formula3 --> formula1
67
+ * keyInDegreeMap, the total number of formula columns that depend on: { formula1_key: 2, formula2_key: 0, formula3_key: 1 }
68
+ * keyEdgesMap: { formula2_key: [formula1_key, formula3_key], formula3_kye: [formula1_key]}
69
+ */
70
+ var keyInDegreeMap = {};
71
+ var keyEdgesMap = {};
72
+ sorting_formula_column_keys.forEach(function (formulaColumnKey) {
73
+ var formulaColumn = key_sorting_formula_column[formulaColumnKey];
74
+ var data = formulaColumn.data;
75
+ var operated_columns = data.operated_columns;
76
+ keyInDegreeMap[formulaColumnKey] = 0;
77
+ if (Array.isArray(operated_columns)) {
78
+ operated_columns.forEach(function (dependColumnKey) {
79
+ var dependColumn = keyColumnMap[dependColumnKey];
80
+ if (!dependColumn) {
81
+ return;
82
+ }
83
+ keyInDegreeMap[formulaColumnKey] += 1;
84
+ if (keyEdgesMap[dependColumnKey]) {
85
+ keyEdgesMap[dependColumnKey].push(formulaColumnKey);
86
+ } else {
87
+ keyEdgesMap[dependColumnKey] = [formulaColumnKey];
88
+ }
89
+ });
90
+ }
91
+ });
92
+ var sortedList = [];
93
+ var waitingQueue = [];
94
+ sorting_formula_column_keys.forEach(function (formulaColumnKey) {
95
+ if (keyInDegreeMap[formulaColumnKey] === 0) {
96
+ waitingQueue.push(formulaColumnKey);
97
+ }
98
+ });
99
+ while (waitingQueue.length) {
100
+ var columnKey = waitingQueue.shift();
101
+ var edges = keyEdgesMap[columnKey];
102
+ sortedList.push(columnKey);
103
+ if (Array.isArray(edges)) {
104
+ edges.forEach(function (edge) {
105
+ keyInDegreeMap[edge] -= 1;
106
+ if (keyInDegreeMap[edge] === 0) {
107
+ waitingQueue.push(edge);
108
+ }
109
+ });
110
+ }
111
+ }
112
+ return sortedList.map(function (columnKey) {
113
+ return keyColumnMap[columnKey];
114
+ });
115
+ };
116
+
117
+ /**
118
+ * Get table formula columns and link columns
119
+ * @param {object} table e.g. { columns, ... }
120
+ * @returns formula and link columns, array
121
+ */
122
+ var getFormulaColumnsContainLinks = function getFormulaColumnsContainLinks(table) {
123
+ var columns = table.columns;
124
+ var formulaColumns = columns.filter(function (column) {
125
+ var type = column.type,
126
+ data = column.data;
127
+ if (type === cellType.CellType.LINK) {
128
+ return !!data;
129
+ }
130
+ return formula.FORMULA_COLUMN_TYPES_MAP[type] && data;
131
+ });
132
+ return formulaColumns.map(function (column) {
133
+ if (column.type === cellType.CellType.LINK) {
134
+ return transLink2LinkFormula(column);
135
+ }
136
+ return column;
137
+ });
138
+ };
139
+
140
+ /**
141
+ * Get sorted formula and link columns from table
142
+ * @param {object} table e.g. { columns, ... }
143
+ * @returns sorted formula and link columns, array
144
+ */
145
+ var getSortedFormulaColumnsContainLinks = function getSortedFormulaColumnsContainLinks(table) {
146
+ var formulaColumns = getFormulaColumnsContainLinks(table);
147
+ if (formulaColumns.length === 0) return [];
148
+ return getSortedFormulaColumns(formulaColumns, table);
149
+ };
150
+
151
+ exports.getFormulaColumnsContainLinks = getFormulaColumnsContainLinks;
152
+ exports.getSortedFormulaColumns = getSortedFormulaColumns;
153
+ exports.getSortedFormulaColumnsContainLinks = getSortedFormulaColumnsContainLinks;
154
+ exports.transLink2LinkFormula = transLink2LinkFormula;
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /**
6
+ * Get group by paths
7
+ * @param {array} paths e.g. [ 0, 1, 2 ]
8
+ * @param {array} groups grouped rows
9
+ * @returns group, object
10
+ */
11
+ var getGroupByPath = function getGroupByPath(paths, groups) {
12
+ if (!Array.isArray(paths) || !Array.isArray(groups)) {
13
+ return null;
14
+ }
15
+ var level0GroupIndex = paths[0];
16
+ if (level0GroupIndex < 0 || level0GroupIndex >= groups.length) {
17
+ return null;
18
+ }
19
+ var level = 1;
20
+ var foundGroup = groups[level0GroupIndex];
21
+ while (level < paths.length) {
22
+ if (!foundGroup) {
23
+ break;
24
+ }
25
+ var subGroups = foundGroup.subgroups;
26
+ var currentLevelGroupIndex = paths[level];
27
+ if (!Array.isArray(subGroups) || currentLevelGroupIndex < 0 || currentLevelGroupIndex >= subGroups.length) {
28
+ break;
29
+ }
30
+ foundGroup = subGroups[currentLevelGroupIndex];
31
+ level += 1;
32
+ }
33
+ return foundGroup;
34
+ };
35
+
36
+ exports.getGroupByPath = getGroupByPath;
@@ -0,0 +1,173 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var row = require('../table/row.js');
6
+ var core = require('../row/core.js');
7
+ var number = require('../column/number.js');
8
+ var number$1 = require('../number.js');
9
+ var formula = require('../constants/formula.js');
10
+
11
+ /**
12
+ * Calculate summaries of table numeric columns
13
+ * @param {object} table e.g. { columns, ... }
14
+ * @param {array} rows e.g. table rows: [{ _id, ...}, ...] | view rows: [ row._id, ... ]
15
+ * @param {object} formulaRows for numeric formula columns
16
+ * @returns summaries: { [column.key]: { sum, average, median, max, min, ... }, ... }, object
17
+ */
18
+ var getSummaries = function getSummaries(table, rows, formulaRows) {
19
+ var numericColumns = table.columns.filter(function (column) {
20
+ return number.isNumericColumn(column);
21
+ });
22
+ if (numericColumns.length === 0) {
23
+ return {};
24
+ }
25
+ var summaryRows = core.isTableRows(rows) ? rows : row.getRowsByIds(table, rows);
26
+ var summaries = {};
27
+ numericColumns.forEach(function (column) {
28
+ var type = column.type,
29
+ key = column.key;
30
+ var validNumbersCount = 0;
31
+ var medianArr = [];
32
+ var sum = 0;
33
+ var min;
34
+ var max;
35
+ var median;
36
+ summaryRows.forEach(function (row) {
37
+ var cellValue = row[key];
38
+ if (formula.FORMULA_COLUMN_TYPES_MAP[type]) {
39
+ var formulaRow = formulaRows && formulaRows[row._id];
40
+ cellValue = formulaRow && formulaRow[key];
41
+ if (Array.isArray(cellValue) && cellValue.length === 1) {
42
+ cellValue = cellValue[0];
43
+ }
44
+ }
45
+ if (number$1.isNumber(cellValue)) {
46
+ medianArr.push(cellValue);
47
+ validNumbersCount += 1;
48
+ sum += cellValue;
49
+ if (min === undefined) {
50
+ min = cellValue;
51
+ } else {
52
+ min = cellValue < min ? cellValue : min;
53
+ }
54
+ if (max === undefined) {
55
+ max = cellValue;
56
+ } else {
57
+ max = cellValue > max ? cellValue : max;
58
+ }
59
+ }
60
+ });
61
+ if (validNumbersCount > 0) {
62
+ medianArr.sort();
63
+ if (medianArr.length % 2 === 0) {
64
+ median = (medianArr[medianArr.length / 2 - 1] + medianArr[medianArr.length / 2]) / 2;
65
+ } else {
66
+ median = medianArr[parseInt(medianArr.length / 2)];
67
+ }
68
+ }
69
+ var average = validNumbersCount === 0 ? 0 : sum / validNumbersCount;
70
+ summaries[key] = {
71
+ sum: sum,
72
+ average: average,
73
+ median: median,
74
+ max: max,
75
+ min: min
76
+ };
77
+ });
78
+ return summaries;
79
+ };
80
+
81
+ /**
82
+ * Calculate group summaries by subgroup
83
+ * @param {array} subgroups e.g. [{ summaries, ... }, ...]
84
+ * @param {array} numericColumns
85
+ * @returns summaries: { [column.key]: { sum, average, median, max, min, ... }, ... }, object
86
+ */
87
+ var getSummariesWithSubgroups = function getSummariesWithSubgroups(subgroups, numericColumns) {
88
+ var subgroupsLen = subgroups.length;
89
+ var summaries = {};
90
+ numericColumns.forEach(function (column) {
91
+ var medianArr = [];
92
+ var sum = 0;
93
+ var average = 0;
94
+ var median;
95
+ var max;
96
+ var min;
97
+ subgroups.forEach(function (subgroup) {
98
+ var subSummaries = subgroup.summaries;
99
+ var summary = subSummaries[column.key];
100
+ var subgroupSum = summary.sum,
101
+ subgroupAverage = summary.average,
102
+ subgroupMedian = summary.median,
103
+ subgroupMax = summary.max,
104
+ subgroupMin = summary.min;
105
+ sum += subgroupSum || 0;
106
+ average += subgroupAverage || 0;
107
+ if (number$1.isNumber(subgroupMedian)) {
108
+ medianArr.push(subgroupMedian);
109
+ }
110
+ if (number$1.isNumber(subgroupMax)) {
111
+ if (max === undefined) {
112
+ max = subgroupMax;
113
+ } else {
114
+ max = subgroupMax > max ? subgroupMax : max;
115
+ }
116
+ }
117
+ if (number$1.isNumber(subgroupMin)) {
118
+ if (min === undefined) {
119
+ min = subgroupMin;
120
+ } else {
121
+ min = subgroupMin < min ? subgroupMin : min;
122
+ }
123
+ }
124
+ });
125
+ if (medianArr.length > 0) {
126
+ medianArr.sort();
127
+ if (medianArr.length % 2 === 0) {
128
+ median = (medianArr[medianArr.length / 2 - 1] + medianArr[medianArr.length / 2]) / 2;
129
+ } else {
130
+ median = medianArr[parseInt(medianArr.length / 2)];
131
+ }
132
+ }
133
+ average /= subgroupsLen;
134
+ summaries[column.key] = {
135
+ sum: sum,
136
+ average: average,
137
+ median: median,
138
+ max: max,
139
+ min: min
140
+ };
141
+ });
142
+ return summaries;
143
+ };
144
+
145
+ /**
146
+ * Calculate group summaries
147
+ * @param {array} groups e.g. [{ subgroups, row_ids, ... }, ...]
148
+ * @param {object} table e.g. { columns, ... }
149
+ * @param {object} formulaRows for numeric formula columns
150
+ * @returns void
151
+ */
152
+ var updateGroupSummaries = function updateGroupSummaries(groups, table, formulaRows) {
153
+ var numericColumns = table.columns.filter(function (column) {
154
+ return number.isNumericColumn(column);
155
+ });
156
+ if (!Array.isArray(groups) || numericColumns.length === 0) {
157
+ return;
158
+ }
159
+ groups.forEach(function (group) {
160
+ var subgroups = group.subgroups,
161
+ row_ids = group.row_ids;
162
+ if (Array.isArray(subgroups) && subgroups.length > 0) {
163
+ updateGroupSummaries(subgroups, table, formulaRows);
164
+ group.summaries = getSummariesWithSubgroups(subgroups, numericColumns);
165
+ } else if (row_ids) {
166
+ group.summaries = getSummaries(table, row_ids, formulaRows);
167
+ }
168
+ });
169
+ };
170
+
171
+ exports.getSummaries = getSummaries;
172
+ exports.getSummariesWithSubgroups = getSummariesWithSubgroups;
173
+ exports.updateGroupSummaries = updateGroupSummaries;
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "dtable-utils",
3
- "version": "0.0.3",
3
+ "version": "0.0.4-beta.1",
4
4
  "description": "dtable common utils",
5
5
  "main": "./lib/index.js",
6
6
  "module": "./es/index.js",
7
7
  "private": false,
8
8
  "scripts": {
9
- "test": "jest --coverage --watchAll",
9
+ "test": "jest -c --watchAll",
10
+ "test-cov": "jest --coverage --watchAll",
10
11
  "eslint": "eslint ./src/**",
11
12
  "build": "rm -rf dist lib es && rollup -c",
12
13
  "prepublishOnly": "npm run build"
@@ -23,7 +24,8 @@
23
24
  "package.json"
24
25
  ],
25
26
  "dependencies": {
26
- "dayjs": "1.10.7"
27
+ "dayjs": "1.10.7",
28
+ "deep-copy": "^1.4.2"
27
29
  },
28
30
  "devDependencies": {
29
31
  "@babel/core": "^7.22.5",