json-renderers-build-table 1.9.1 → 1.17.3

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 (184) hide show
  1. package/package.json +5 -2
  2. package/src/index.js +2 -3
  3. package/src/v14/buildSpec/config/base.json +53 -0
  4. package/src/v14/buildSpec/config/columnInstructions.json +56 -0
  5. package/src/v14/buildSpec/config/optionsInstructions.json +82 -0
  6. package/src/v14/buildSpec/config/rowInstructions.json +20 -0
  7. package/src/v14/buildSpec/config/serialInstructions.json +82 -0
  8. package/src/v14/buildSpec/index.js +147 -0
  9. package/src/v14/buildSpec/writePath/index.js +55 -0
  10. package/src/v14/index.js +56 -0
  11. package/src/v14/register/index.js +30 -0
  12. package/src/v14/register/meta.js +6 -0
  13. package/src/v14/spec.json +65 -0
  14. package/src/v15/buildSpec/config/base.json +53 -0
  15. package/src/v15/buildSpec/config/columnInstructions.json +56 -0
  16. package/src/v15/buildSpec/config/optionsInstructions.json +82 -0
  17. package/src/v15/buildSpec/config/rowInstructions.json +20 -0
  18. package/src/v15/buildSpec/config/serialInstructions.json +82 -0
  19. package/src/v15/buildSpec/index.js +147 -0
  20. package/src/v15/buildSpec/writePath/index.js +55 -0
  21. package/src/v15/common/runner.js +33 -0
  22. package/src/v15/common/writePath.js +55 -0
  23. package/src/v15/index.js +85 -0
  24. package/src/v15/register/index.js +30 -0
  25. package/src/v15/register/meta.js +6 -0
  26. package/src/v15/simpleTable/config/base.json +31 -0
  27. package/src/v15/simpleTable/config/instructions.json +38 -0
  28. package/src/v15/simpleTable/index.js +58 -0
  29. package/src/v15/spec.json +65 -0
  30. package/src/v15/tableFullGrid/config/base.json +53 -0
  31. package/src/v15/tableFullGrid/config/instructions.json +234 -0
  32. package/src/v15/tableFullGrid/index.js +76 -0
  33. package/src/v15/tableHeadless/config/base.json +15 -0
  34. package/src/v15/tableHeadless/config/instructions.json +20 -0
  35. package/src/v15/tableHeadless/index.js +58 -0
  36. package/src/v15/tableWithButtonCell/config/base.json +38 -0
  37. package/src/v15/tableWithButtonCell/config/instructions.json +56 -0
  38. package/src/v15/tableWithButtonCell/index.js +57 -0
  39. package/src/v15/tableWithFooter/config/base.json +53 -0
  40. package/src/v15/tableWithFooter/config/instructions.json +74 -0
  41. package/src/v15/tableWithFooter/index.js +58 -0
  42. package/src/v15/tableWithOptions/config/base.json +38 -0
  43. package/src/v15/tableWithOptions/config/instructions.json +116 -0
  44. package/src/v15/tableWithOptions/index.js +66 -0
  45. package/src/v15/tableWithSerial/config/base.json +38 -0
  46. package/src/v15/tableWithSerial/config/instructions.json +116 -0
  47. package/src/v15/tableWithSerial/index.js +66 -0
  48. package/src/v15/tableWithWidths/config/base.json +38 -0
  49. package/src/v15/tableWithWidths/config/instructions.json +56 -0
  50. package/src/v15/tableWithWidths/index.js +58 -0
  51. package/src/v16/common/runner.js +33 -0
  52. package/src/v16/common/writePath.js +55 -0
  53. package/src/v16/index.js +7 -0
  54. package/src/v16/simpleTable/config/base.json +31 -0
  55. package/src/v16/simpleTable/config/instructions.json +38 -0
  56. package/src/v16/simpleTable/index.js +58 -0
  57. package/src/v16/spec.json +65 -0
  58. package/src/v16/tableWithOptions/config/base.json +38 -0
  59. package/src/v16/tableWithOptions/config/instructions.json +116 -0
  60. package/src/v16/tableWithOptions/index.js +66 -0
  61. package/src/v16/tableWithSerial/config/base.json +38 -0
  62. package/src/v16/tableWithSerial/config/instructions.json +116 -0
  63. package/src/v16/tableWithSerial/index.js +66 -0
  64. package/src/v17/index.js +5 -0
  65. package/src/v17/simple/base.json +53 -0
  66. package/src/v17/simple/index.js +56 -0
  67. package/src/v17/simple/instructions/double.json +19 -0
  68. package/src/v17/simple/instructions/single.json +38 -0
  69. package/src/v17/simple/spec.json +86 -0
  70. package/src/v17/simple/writePath/index.js +47 -0
  71. package/src/v17/spec.json +86 -0
  72. package/src/v5/index.js +0 -49
  73. package/src/v5/options/index.js +0 -18
  74. package/src/v5/options/showOptions/index.js +0 -39
  75. package/src/v5/options/showSerial/index.js +0 -19
  76. package/src/v5/render-requests.json +0 -70
  77. package/src/v5/table/body/cell/index.js +0 -12
  78. package/src/v5/table/body/cell/tag.json +0 -7
  79. package/src/v5/table/body/index.js +0 -17
  80. package/src/v5/table/body/row/index.js +0 -18
  81. package/src/v5/table/body/row/tag.json +0 -4
  82. package/src/v5/table/body/tag.json +0 -4
  83. package/src/v5/table/head/cell/index.js +0 -12
  84. package/src/v5/table/head/cell/tag.json +0 -7
  85. package/src/v5/table/head/index.js +0 -16
  86. package/src/v5/table/head/row/index.js +0 -14
  87. package/src/v5/table/head/row/tag.json +0 -4
  88. package/src/v5/table/head/tag.json +0 -4
  89. package/src/v5/table/index.js +0 -22
  90. package/src/v5/table/tag.json +0 -7
  91. package/src/v6/index.js +0 -29
  92. package/src/v6/options/index.js +0 -28
  93. package/src/v6/options/showFooter/cell/index.js +0 -16
  94. package/src/v6/options/showFooter/cell/tag.json +0 -4
  95. package/src/v6/options/showFooter/footer/index.js +0 -18
  96. package/src/v6/options/showFooter/footer/tag.json +0 -4
  97. package/src/v6/options/showFooter/index.js +0 -10
  98. package/src/v6/options/showFooter/input/index.js +0 -11
  99. package/src/v6/options/showFooter/input/tag.json +0 -7
  100. package/src/v6/options/showFooter/row/index.js +0 -35
  101. package/src/v6/options/showFooter/row/tag.json +0 -4
  102. package/src/v6/options/showFooterSave/button/tag.json +0 -7
  103. package/src/v6/options/showFooterSave/index.js +0 -14
  104. package/src/v6/options/showOptions/index.js +0 -39
  105. package/src/v6/options/showSerial/index.js +0 -19
  106. package/src/v6/render-requests.json +0 -90
  107. package/src/v6/table/body/cell/index.js +0 -12
  108. package/src/v6/table/body/cell/tag.json +0 -7
  109. package/src/v6/table/body/index.js +0 -17
  110. package/src/v6/table/body/row/index.js +0 -18
  111. package/src/v6/table/body/row/tag.json +0 -4
  112. package/src/v6/table/body/tag.json +0 -4
  113. package/src/v6/table/head/cell/index.js +0 -12
  114. package/src/v6/table/head/cell/tag.json +0 -7
  115. package/src/v6/table/head/index.js +0 -16
  116. package/src/v6/table/head/row/index.js +0 -14
  117. package/src/v6/table/head/row/tag.json +0 -4
  118. package/src/v6/table/head/tag.json +0 -4
  119. package/src/v6/table/index.js +0 -22
  120. package/src/v6/table/tag.json +0 -7
  121. package/src/v7/index.js +0 -29
  122. package/src/v7/options/index.js +0 -28
  123. package/src/v7/options/showFooter/cell/index.js +0 -16
  124. package/src/v7/options/showFooter/cell/tag.json +0 -4
  125. package/src/v7/options/showFooter/footer/index.js +0 -18
  126. package/src/v7/options/showFooter/footer/tag.json +0 -4
  127. package/src/v7/options/showFooter/index.js +0 -10
  128. package/src/v7/options/showFooter/input/index.js +0 -11
  129. package/src/v7/options/showFooter/input/tag.json +0 -7
  130. package/src/v7/options/showFooter/row/index.js +0 -35
  131. package/src/v7/options/showFooter/row/tag.json +0 -4
  132. package/src/v7/options/showFooterSave/button/tag.json +0 -7
  133. package/src/v7/options/showFooterSave/index.js +0 -14
  134. package/src/v7/options/showOptions/index.js +0 -39
  135. package/src/v7/options/showSerial/index.js +0 -19
  136. package/src/v7/render-requests.json +0 -90
  137. package/src/v7/table/body/cell/index.js +0 -12
  138. package/src/v7/table/body/cell/tag.json +0 -7
  139. package/src/v7/table/body/index.js +0 -17
  140. package/src/v7/table/body/row/index.js +0 -18
  141. package/src/v7/table/body/row/tag.json +0 -4
  142. package/src/v7/table/body/tag.json +0 -4
  143. package/src/v7/table/head/cell/index.js +0 -12
  144. package/src/v7/table/head/cell/tag.json +0 -7
  145. package/src/v7/table/head/index.js +0 -16
  146. package/src/v7/table/head/row/index.js +0 -14
  147. package/src/v7/table/head/row/tag.json +0 -4
  148. package/src/v7/table/head/tag.json +0 -4
  149. package/src/v7/table/index.js +0 -22
  150. package/src/v7/table/tag.json +0 -7
  151. package/src/v8/index.js +0 -29
  152. package/src/v8/options/index.js +0 -28
  153. package/src/v8/options/showFooter/cell/index.js +0 -16
  154. package/src/v8/options/showFooter/cell/tag.json +0 -4
  155. package/src/v8/options/showFooter/footer/index.js +0 -18
  156. package/src/v8/options/showFooter/footer/tag.json +0 -4
  157. package/src/v8/options/showFooter/index.js +0 -10
  158. package/src/v8/options/showFooter/input/index.js +0 -11
  159. package/src/v8/options/showFooter/input/tag.json +0 -7
  160. package/src/v8/options/showFooter/row/index.js +0 -35
  161. package/src/v8/options/showFooter/row/tag.json +0 -4
  162. package/src/v8/options/showFooterSave/button/tag.json +0 -7
  163. package/src/v8/options/showFooterSave/index.js +0 -14
  164. package/src/v8/options/showOptions/index.js +0 -39
  165. package/src/v8/options/showSerial/index.js +0 -19
  166. package/src/v8/render-requests.json +0 -90
  167. package/src/v8/table/body/cell/index.js +0 -12
  168. package/src/v8/table/body/cell/tag.json +0 -7
  169. package/src/v8/table/body/index.js +0 -17
  170. package/src/v8/table/body/row/index.js +0 -18
  171. package/src/v8/table/body/row/tag.json +0 -4
  172. package/src/v8/table/body/tag.json +0 -4
  173. package/src/v8/table/head/cell/index.js +0 -12
  174. package/src/v8/table/head/cell/tag.json +0 -7
  175. package/src/v8/table/head/index.js +0 -16
  176. package/src/v8/table/head/row/index.js +0 -14
  177. package/src/v8/table/head/row/tag.json +0 -4
  178. package/src/v8/table/head/tag.json +0 -4
  179. package/src/v8/table/index.js +0 -22
  180. package/src/v8/table/tag.json +0 -7
  181. package/src/v9/index.js +0 -28
  182. package/src/v9/table/index.js +0 -67
  183. package/src/v9/table/spec.json +0 -18
  184. package/src/v9/table/table.json +0 -24
@@ -0,0 +1,116 @@
1
+ [
2
+ {
3
+ "narration": "Build the column widths for the table using the configured columns.",
4
+ "destinationPath": {
5
+ "fileName": "base",
6
+ "dataRole": "table-colgroup",
7
+ "filePath": [
8
+ "children"
9
+ ]
10
+ },
11
+ "sourcePath": {
12
+ "fileName": "data",
13
+ "filePath": [
14
+ "columns"
15
+ ]
16
+ },
17
+ "templateKey": "buildColGroup",
18
+ "func": "fromCollection"
19
+ },
20
+ {
21
+ "narration": "Build the table header row from the column metadata.",
22
+ "destinationPath": {
23
+ "fileName": "base",
24
+ "dataRole": "table-header-row",
25
+ "filePath": [
26
+ "children"
27
+ ]
28
+ },
29
+ "sourcePath": {
30
+ "fileName": "data",
31
+ "filePath": [
32
+ "columns"
33
+ ]
34
+ },
35
+ "templateKey": "buildHeader",
36
+ "func": "fromCollection"
37
+ },
38
+ {
39
+ "narration": "Create one table row for each record and place it into the table body container.",
40
+ "destinationPath": {
41
+ "fileName": "base",
42
+ "dataRole": "table-body",
43
+ "filePath": [
44
+ "children"
45
+ ]
46
+ },
47
+ "sourcePath": {
48
+ "fileName": "data",
49
+ "filePath": [
50
+ "data"
51
+ ]
52
+ },
53
+ "templateKey": "buildBodyTr",
54
+ "func": "fromCollection"
55
+ },
56
+ {
57
+ "narration": "Prepend the serial column width to the table colgroup.",
58
+ "destinationPath": {
59
+ "fileName": "base",
60
+ "dataRole": "table-colgroup",
61
+ "filePath": [
62
+ "children"
63
+ ],
64
+ "action": "unshift"
65
+ },
66
+ "sourcePath": {
67
+ "fileName": "data",
68
+ "filePath": [
69
+ "serial",
70
+ "col"
71
+ ]
72
+ },
73
+ "templateKey": "buildColGroup",
74
+ "func": "applyTemplate"
75
+ },
76
+ {
77
+ "narration": "Prepend the serial header cell to the table header row.",
78
+ "destinationPath": {
79
+ "fileName": "base",
80
+ "dataRole": "table-header-row",
81
+ "filePath": [
82
+ "children"
83
+ ],
84
+ "action": "unshift"
85
+ },
86
+ "sourcePath": {
87
+ "fileName": "data",
88
+ "filePath": [
89
+ "serial",
90
+ "header"
91
+ ]
92
+ },
93
+ "templateKey": "buildHeader",
94
+ "func": "applyTemplate"
95
+ },
96
+ {
97
+ "narration": "Prepend the serial number cell into each table body row.",
98
+ "destinationPath": {
99
+ "fileName": "base",
100
+ "dataRole": "table-body",
101
+ "filePath": [
102
+ "children"
103
+ ],
104
+ "action": "unshiftSerialToRows"
105
+ },
106
+ "sourcePath": {
107
+ "fileName": "data",
108
+ "filePath": [
109
+ "serial",
110
+ "body"
111
+ ]
112
+ },
113
+ "templateKey": "buildBodyCell",
114
+ "func": "applyTemplate"
115
+ }
116
+ ]
@@ -0,0 +1,66 @@
1
+ import { runInstructions, buildBody, findByRole } from "../common/runner.js";
2
+ import spec from "../spec.json" with { type: "json" };
3
+ import base from "./config/base.json" with { type: "json" };
4
+ import instructions from "./config/instructions.json" with { type: "json" };
5
+
6
+ const buildSpec = ({ inColumns = [], inData = [], inSerial = {} } = {}) => {
7
+ const localColumns = inColumns;
8
+ const localData = inData;
9
+ const localSerial = {
10
+ col: { width: "50px" },
11
+ header: { columnName: "#" },
12
+ body: {},
13
+ ...inSerial
14
+ };
15
+
16
+ const localBase = structuredClone(base);
17
+ const localSpec = structuredClone(spec);
18
+
19
+ const normalizedColumns = localColumns.map(col => {
20
+ const colCopy = structuredClone(col);
21
+ colCopy.template = {
22
+ bodyCell: "buildBodyCell",
23
+ ...(colCopy.template || {})
24
+ };
25
+ return colCopy;
26
+ });
27
+
28
+ const buildData = {
29
+ columns: normalizedColumns,
30
+ data: localData,
31
+ serial: localSerial
32
+ };
33
+
34
+ const registry = {
35
+ data: buildData,
36
+ base: localBase,
37
+ spec: localSpec
38
+ };
39
+
40
+ runInstructions({
41
+ inInstructions: instructions,
42
+ inRegistry: registry
43
+ });
44
+
45
+ const tbodyElement = findByRole(localBase, "table-body");
46
+ if (tbodyElement && Array.isArray(tbodyElement.children)) {
47
+ buildBody(tbodyElement.children, buildData, localSpec);
48
+ }
49
+
50
+ return localBase;
51
+ };
52
+
53
+ const startFunc = (input = {}) => {
54
+ const localInput = (input && typeof input === "object" && "inConfig" in input)
55
+ ? input.inConfig
56
+ : input;
57
+
58
+ return buildSpec({
59
+ inColumns: localInput.columns || [],
60
+ inData: localInput.data || [],
61
+ inSerial: localInput.serial || {}
62
+ });
63
+ };
64
+
65
+ export { buildSpec };
66
+ export default startFunc;
@@ -0,0 +1,38 @@
1
+ {
2
+ "tagName": "table",
3
+ "attributes": {
4
+ "class": "table table-hover table-striped align-middle border mb-0"
5
+ },
6
+ "children": [
7
+ {
8
+ "tagName": "colgroup",
9
+ "attributes": {
10
+ "data-role": "table-colgroup"
11
+ },
12
+ "children": []
13
+ },
14
+ {
15
+ "tagName": "thead",
16
+ "attributes": {
17
+ "class": "table-dark",
18
+ "data-role": "table-header"
19
+ },
20
+ "children": [
21
+ {
22
+ "tagName": "tr",
23
+ "attributes": {
24
+ "data-role": "table-header-row"
25
+ },
26
+ "children": []
27
+ }
28
+ ]
29
+ },
30
+ {
31
+ "tagName": "tbody",
32
+ "attributes": {
33
+ "data-role": "table-body"
34
+ },
35
+ "children": []
36
+ }
37
+ ]
38
+ }
@@ -0,0 +1,56 @@
1
+ [
2
+ {
3
+ "narration": "Build the column widths for the table using the configured columns.",
4
+ "destinationPath": {
5
+ "fileName": "base",
6
+ "dataRole": "table-colgroup",
7
+ "filePath": [
8
+ "children"
9
+ ]
10
+ },
11
+ "sourcePath": {
12
+ "fileName": "data",
13
+ "filePath": [
14
+ "columns"
15
+ ]
16
+ },
17
+ "templateKey": "buildColGroup",
18
+ "func": "fromCollection"
19
+ },
20
+ {
21
+ "narration": "Build the table header row from the column metadata.",
22
+ "destinationPath": {
23
+ "fileName": "base",
24
+ "dataRole": "table-header-row",
25
+ "filePath": [
26
+ "children"
27
+ ]
28
+ },
29
+ "sourcePath": {
30
+ "fileName": "data",
31
+ "filePath": [
32
+ "columns"
33
+ ]
34
+ },
35
+ "templateKey": "buildHeader",
36
+ "func": "fromCollection"
37
+ },
38
+ {
39
+ "narration": "Create one table row for each record and place it into the table body container.",
40
+ "destinationPath": {
41
+ "fileName": "base",
42
+ "dataRole": "table-body",
43
+ "filePath": [
44
+ "children"
45
+ ]
46
+ },
47
+ "sourcePath": {
48
+ "fileName": "data",
49
+ "filePath": [
50
+ "data"
51
+ ]
52
+ },
53
+ "templateKey": "buildBodyTr",
54
+ "func": "fromCollection"
55
+ }
56
+ ]
@@ -0,0 +1,58 @@
1
+ import { runInstructions, buildBody, findByRole } from "../common/runner.js";
2
+ import spec from "../spec.json" with { type: "json" };
3
+ import base from "./config/base.json" with { type: "json" };
4
+ import instructions from "./config/instructions.json" with { type: "json" };
5
+
6
+ const buildSpec = ({ inColumns = [], inData = [] } = {}) => {
7
+ const localColumns = inColumns;
8
+ const localData = inData;
9
+
10
+ const localBase = structuredClone(base);
11
+ const localSpec = structuredClone(spec);
12
+
13
+ const normalizedColumns = localColumns.map(col => {
14
+ const colCopy = structuredClone(col);
15
+ colCopy.template = {
16
+ bodyCell: "buildBodyCell",
17
+ ...(colCopy.template || {})
18
+ };
19
+ return colCopy;
20
+ });
21
+
22
+ const buildData = {
23
+ columns: normalizedColumns,
24
+ data: localData
25
+ };
26
+
27
+ const registry = {
28
+ data: buildData,
29
+ base: localBase,
30
+ spec: localSpec
31
+ };
32
+
33
+ runInstructions({
34
+ inInstructions: instructions,
35
+ inRegistry: registry
36
+ });
37
+
38
+ const tbodyElement = findByRole(localBase, "table-body");
39
+ if (tbodyElement && Array.isArray(tbodyElement.children)) {
40
+ buildBody(tbodyElement.children, buildData, localSpec);
41
+ }
42
+
43
+ return localBase;
44
+ };
45
+
46
+ const startFunc = (input = {}) => {
47
+ const localInput = (input && typeof input === "object" && "inConfig" in input)
48
+ ? input.inConfig
49
+ : input;
50
+
51
+ return buildSpec({
52
+ inColumns: localInput.columns || [],
53
+ inData: localInput.data || []
54
+ });
55
+ };
56
+
57
+ export { buildSpec };
58
+ export default startFunc;
@@ -0,0 +1,33 @@
1
+ import {
2
+ fromCollection, tableBody, buildBody,
3
+ findByRole, resolvePath, applyTemplate
4
+ } from "json-transformer-funcs";
5
+ import writePath from "./writePath.js";
6
+
7
+ const functions = {
8
+ fromCollection,
9
+ tableBody,
10
+ buildBody,
11
+ applyTemplate: (inSource, inTemplate) => applyTemplate(inTemplate, inSource)
12
+ };
13
+
14
+ export const runInstructions = ({ inInstructions, inRegistry }) => {
15
+ const localInstructions = inInstructions;
16
+ const localRegistry = inRegistry;
17
+
18
+ localInstructions.forEach(instruction => {
19
+ const source = resolvePath(localRegistry, instruction.sourcePath);
20
+
21
+ if (source) {
22
+ const result = functions[instruction.func](source, localRegistry.spec[instruction.templateKey]);
23
+ writePath({
24
+ inRegistry: localRegistry,
25
+ inPath: instruction.destinationPath,
26
+ inValue: result
27
+ });
28
+ }
29
+ });
30
+ };
31
+
32
+ export { findByRole, buildBody };
33
+ export default runInstructions;
@@ -0,0 +1,55 @@
1
+ import { findByRole } from "json-transformer-funcs";
2
+
3
+ const toArray = val => (Array.isArray(val) ? val : [val]);
4
+
5
+ const actions = {
6
+ set: (parent, key, value) => {
7
+ parent[key] = value;
8
+ },
9
+ push: (parent, key, value) => {
10
+ parent[key].push(...toArray(value));
11
+ },
12
+ unshift: (parent, key, value) => {
13
+ parent[key].unshift(...toArray(value));
14
+ },
15
+ pushToRows: (parent, key, value) => {
16
+ parent[key].forEach(row => {
17
+ row.children.push(...structuredClone(toArray(value)));
18
+ });
19
+ },
20
+ unshiftToRows: (parent, key, value) => {
21
+ parent[key].forEach(row => {
22
+ row.children.unshift(...structuredClone(toArray(value)));
23
+ });
24
+ },
25
+ unshiftSerialToRows: (parent, key, value) => {
26
+ parent[key].forEach((row, rowIndex) => {
27
+ const item = structuredClone(value);
28
+ item.textContent = rowIndex + 1;
29
+ row.children.unshift(item);
30
+ });
31
+ }
32
+ };
33
+
34
+ const writePath = ({ inRegistry, inPath, inValue }) => {
35
+ const localRegistry = inRegistry;
36
+ const localPath = inPath;
37
+ const localValue = inValue;
38
+
39
+ const root = localPath.dataRole
40
+ ? findByRole(localRegistry[localPath.fileName], localPath.dataRole)
41
+ : localRegistry[localPath.fileName];
42
+
43
+ if (!root) return;
44
+
45
+ const keys = [...(localPath.filePath ?? [])];
46
+ const lastKey = keys.pop();
47
+ const parent = keys.reduce((current, key) => current?.[key], root);
48
+
49
+ if (!parent) return;
50
+
51
+ const actionHandler = actions[localPath.action] || actions.set;
52
+ actionHandler(parent, lastKey, localValue);
53
+ };
54
+
55
+ export default writePath;
@@ -0,0 +1,7 @@
1
+ // V16 exposes three focused table scenarios. Each scenario owns its config and instructions.
2
+ // Only genuinely shared execution helpers live in ./common.
3
+ import simpleTable from "./simpleTable/index.js";
4
+ import tableWithSerial from "./tableWithSerial/index.js";
5
+ import tableWithOptions from "./tableWithOptions/index.js";
6
+
7
+ export { simpleTable, tableWithSerial, tableWithOptions };
@@ -0,0 +1,31 @@
1
+ {
2
+ "tagName": "table",
3
+ "attributes": {
4
+ "class": "table table-hover table-striped align-middle border mb-0"
5
+ },
6
+ "children": [
7
+ {
8
+ "tagName": "thead",
9
+ "attributes": {
10
+ "class": "table-dark",
11
+ "data-role": "table-header"
12
+ },
13
+ "children": [
14
+ {
15
+ "tagName": "tr",
16
+ "attributes": {
17
+ "data-role": "table-header-row"
18
+ },
19
+ "children": []
20
+ }
21
+ ]
22
+ },
23
+ {
24
+ "tagName": "tbody",
25
+ "attributes": {
26
+ "data-role": "table-body"
27
+ },
28
+ "children": []
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,38 @@
1
+ [
2
+ {
3
+ "narration": "Build the table header row from the column metadata.",
4
+ "destinationPath": {
5
+ "fileName": "base",
6
+ "dataRole": "table-header-row",
7
+ "filePath": [
8
+ "children"
9
+ ]
10
+ },
11
+ "sourcePath": {
12
+ "fileName": "data",
13
+ "filePath": [
14
+ "columns"
15
+ ]
16
+ },
17
+ "templateKey": "buildHeader",
18
+ "func": "fromCollection"
19
+ },
20
+ {
21
+ "narration": "Create one table row for each record and place it into the table body container.",
22
+ "destinationPath": {
23
+ "fileName": "base",
24
+ "dataRole": "table-body",
25
+ "filePath": [
26
+ "children"
27
+ ]
28
+ },
29
+ "sourcePath": {
30
+ "fileName": "data",
31
+ "filePath": [
32
+ "data"
33
+ ]
34
+ },
35
+ "templateKey": "buildBodyTr",
36
+ "func": "fromCollection"
37
+ }
38
+ ]
@@ -0,0 +1,58 @@
1
+ import { runInstructions, buildBody, findByRole } from "../common/runner.js";
2
+ import spec from "../spec.json" with { type: "json" };
3
+ import base from "./config/base.json" with { type: "json" };
4
+ import instructions from "./config/instructions.json" with { type: "json" };
5
+
6
+ const buildSpec = ({ inColumns = [], inData = [] } = {}) => {
7
+ const localColumns = inColumns;
8
+ const localData = inData;
9
+
10
+ const localBase = structuredClone(base);
11
+ const localSpec = structuredClone(spec);
12
+
13
+ const normalizedColumns = localColumns.map(col => {
14
+ const colCopy = structuredClone(col);
15
+ colCopy.template = {
16
+ bodyCell: "buildBodyCell",
17
+ ...(colCopy.template || {})
18
+ };
19
+ return colCopy;
20
+ });
21
+
22
+ const buildData = {
23
+ columns: normalizedColumns,
24
+ data: localData
25
+ };
26
+
27
+ const registry = {
28
+ data: buildData,
29
+ base: localBase,
30
+ spec: localSpec
31
+ };
32
+
33
+ runInstructions({
34
+ inInstructions: instructions,
35
+ inRegistry: registry
36
+ });
37
+
38
+ const tbodyElement = findByRole(localBase, "table-body");
39
+ if (tbodyElement && Array.isArray(tbodyElement.children)) {
40
+ buildBody(tbodyElement.children, buildData, localSpec);
41
+ }
42
+
43
+ return localBase;
44
+ };
45
+
46
+ const startFunc = (input = {}) => {
47
+ const localInput = (input && typeof input === "object" && "inConfig" in input)
48
+ ? input.inConfig
49
+ : input;
50
+
51
+ return buildSpec({
52
+ inColumns: localInput.columns || [],
53
+ inData: localInput.data || []
54
+ });
55
+ };
56
+
57
+ export { buildSpec };
58
+ export default startFunc;
@@ -0,0 +1,65 @@
1
+ {
2
+ "buildBodyTr": {
3
+ "tagName": "tr",
4
+ "attributes": {
5
+ "class": "align-middle"
6
+ },
7
+ "children": []
8
+ },
9
+ "buildColGroup": {
10
+ "tagName": "col",
11
+ "attributes": {
12
+ "width": "${width}"
13
+ }
14
+ },
15
+ "buildHeader": {
16
+ "tagName": "th",
17
+ "textContent": "${columnName}",
18
+ "attributes": {
19
+ "class": "py-3 px-3 fw-semibold text-uppercase small"
20
+ }
21
+ },
22
+ "buildFooter": {
23
+ "tagName": "td",
24
+ "children": [
25
+ {
26
+ "tagName": "input",
27
+ "attributes": {
28
+ "type": "text",
29
+ "placeholder": "enter ${columnName}",
30
+ "name": "${columnName}",
31
+ "class": "form-control"
32
+ }
33
+ }
34
+ ]
35
+ },
36
+ "buildBodyCell": {
37
+ "tagName": "td",
38
+ "textContent": "${rowValue}",
39
+ "attributes": {
40
+ "class": "py-3 px-3 text-secondary"
41
+ }
42
+ },
43
+ "button": {
44
+ "tagName": "button",
45
+ "textContent": "${columnName}",
46
+ "attributes": {
47
+ "class": "btn btn-primary btn-sm"
48
+ }
49
+ },
50
+ "buttonCell": {
51
+ "tagName": "td",
52
+ "attributes": {
53
+ "class": "py-2 px-3 text-center"
54
+ },
55
+ "children": [
56
+ {
57
+ "tagName": "button",
58
+ "textContent": "${agg:count}",
59
+ "attributes": {
60
+ "class": "btn btn-primary btn-sm"
61
+ }
62
+ }
63
+ ]
64
+ }
65
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "tagName": "table",
3
+ "attributes": {
4
+ "class": "table table-hover table-striped align-middle border mb-0"
5
+ },
6
+ "children": [
7
+ {
8
+ "tagName": "colgroup",
9
+ "attributes": {
10
+ "data-role": "table-colgroup"
11
+ },
12
+ "children": []
13
+ },
14
+ {
15
+ "tagName": "thead",
16
+ "attributes": {
17
+ "class": "table-dark",
18
+ "data-role": "table-header"
19
+ },
20
+ "children": [
21
+ {
22
+ "tagName": "tr",
23
+ "attributes": {
24
+ "data-role": "table-header-row"
25
+ },
26
+ "children": []
27
+ }
28
+ ]
29
+ },
30
+ {
31
+ "tagName": "tbody",
32
+ "attributes": {
33
+ "data-role": "table-body"
34
+ },
35
+ "children": []
36
+ }
37
+ ]
38
+ }