datajunction-ui 0.0.1-rc.2 → 0.0.1-rc.20

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 (135) hide show
  1. package/.env +1 -0
  2. package/.prettierignore +3 -1
  3. package/dj-logo.svg +10 -0
  4. package/package.json +43 -13
  5. package/public/favicon.ico +0 -0
  6. package/src/__tests__/reportWebVitals.test.jsx +44 -0
  7. package/src/app/__tests__/__snapshots__/index.test.tsx.snap +5 -39
  8. package/src/app/components/DeleteNode.jsx +79 -0
  9. package/src/app/components/ListGroupItem.jsx +8 -1
  10. package/src/app/components/NamespaceHeader.jsx +4 -13
  11. package/src/app/components/QueryInfo.jsx +77 -0
  12. package/src/app/components/Tab.jsx +3 -2
  13. package/src/app/components/ToggleSwitch.jsx +20 -0
  14. package/src/app/components/__tests__/QueryInfo.test.jsx +55 -0
  15. package/src/app/components/__tests__/Tab.test.jsx +27 -0
  16. package/src/app/components/__tests__/ToggleSwitch.test.jsx +43 -0
  17. package/src/app/components/__tests__/__snapshots__/ListGroupItem.test.tsx.snap +3 -0
  18. package/src/app/components/__tests__/__snapshots__/NamespaceHeader.test.jsx.snap +2 -18
  19. package/src/app/components/djgraph/Collapse.jsx +46 -0
  20. package/src/app/components/djgraph/DJNode.jsx +60 -82
  21. package/src/app/components/djgraph/DJNodeColumns.jsx +71 -0
  22. package/src/app/components/djgraph/DJNodeDimensions.jsx +75 -0
  23. package/src/app/components/djgraph/LayoutFlow.jsx +104 -0
  24. package/src/app/components/djgraph/__tests__/Collapse.test.jsx +51 -0
  25. package/src/app/components/djgraph/__tests__/DJNodeColumns.test.jsx +83 -0
  26. package/src/app/components/djgraph/__tests__/DJNodeDimensions.test.jsx +118 -0
  27. package/src/app/components/djgraph/__tests__/__snapshots__/DJNode.test.tsx.snap +84 -40
  28. package/src/app/constants.js +2 -0
  29. package/src/app/icons/AlertIcon.jsx +32 -0
  30. package/src/app/icons/CollapsedIcon.jsx +15 -0
  31. package/src/app/icons/DJLogo.jsx +36 -0
  32. package/src/app/icons/DeleteIcon.jsx +21 -0
  33. package/src/app/icons/EditIcon.jsx +18 -0
  34. package/src/app/icons/ExpandedIcon.jsx +15 -0
  35. package/src/app/icons/HorizontalHierarchyIcon.jsx +15 -0
  36. package/src/app/icons/InvalidIcon.jsx +14 -0
  37. package/src/app/icons/PythonIcon.jsx +52 -0
  38. package/src/app/icons/TableIcon.jsx +14 -0
  39. package/src/app/icons/ValidIcon.jsx +14 -0
  40. package/src/app/index.tsx +79 -26
  41. package/src/app/pages/AddEditNodePage/FormikSelect.jsx +46 -0
  42. package/src/app/pages/AddEditNodePage/FullNameField.jsx +37 -0
  43. package/src/app/pages/AddEditNodePage/Loadable.jsx +16 -0
  44. package/src/app/pages/AddEditNodePage/NodeQueryField.jsx +89 -0
  45. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormFailed.test.jsx +77 -0
  46. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormSuccess.test.jsx +93 -0
  47. package/src/app/pages/AddEditNodePage/__tests__/FormikSelect.test.jsx +75 -0
  48. package/src/app/pages/AddEditNodePage/__tests__/FullNameField.test.jsx +31 -0
  49. package/src/app/pages/AddEditNodePage/__tests__/NodeQueryField.test.jsx +30 -0
  50. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormFailed.test.jsx.snap +53 -0
  51. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormSuccess.test.jsx.snap +53 -0
  52. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/index.test.jsx.snap +3 -0
  53. package/src/app/pages/AddEditNodePage/__tests__/index.test.jsx +178 -0
  54. package/src/app/pages/AddEditNodePage/index.jsx +357 -0
  55. package/src/app/pages/LoginPage/__tests__/index.test.jsx +70 -0
  56. package/src/app/pages/LoginPage/assets/sign-in-with-github.png +0 -0
  57. package/src/app/pages/LoginPage/assets/sign-in-with-google.png +0 -0
  58. package/src/app/pages/LoginPage/index.jsx +90 -0
  59. package/src/app/pages/NamespacePage/Explorer.jsx +57 -0
  60. package/src/app/pages/NamespacePage/Loadable.jsx +9 -7
  61. package/src/app/pages/NamespacePage/__tests__/index.test.jsx +95 -0
  62. package/src/app/pages/NamespacePage/index.jsx +131 -31
  63. package/src/app/pages/NodePage/ClientCodePopover.jsx +32 -0
  64. package/src/app/pages/NodePage/EditColumnPopover.jsx +102 -0
  65. package/src/app/pages/NodePage/LinkDimensionPopover.jsx +135 -0
  66. package/src/app/pages/NodePage/Loadable.jsx +9 -7
  67. package/src/app/pages/NodePage/NodeColumnTab.jsx +106 -27
  68. package/src/app/pages/NodePage/NodeGraphTab.jsx +94 -148
  69. package/src/app/pages/NodePage/NodeHistory.jsx +212 -0
  70. package/src/app/pages/NodePage/NodeInfoTab.jsx +166 -51
  71. package/src/app/pages/NodePage/NodeLineageTab.jsx +84 -0
  72. package/src/app/pages/NodePage/NodeMaterializationTab.jsx +174 -0
  73. package/src/app/pages/NodePage/NodeSQLTab.jsx +82 -0
  74. package/src/app/pages/NodePage/NodeStatus.jsx +14 -20
  75. package/src/app/pages/NodePage/NodesWithDimension.jsx +42 -0
  76. package/src/app/pages/NodePage/__tests__/ClientCodePopover.test.jsx +49 -0
  77. package/src/app/pages/NodePage/__tests__/EditColumnPopover.test.jsx +148 -0
  78. package/src/app/pages/NodePage/__tests__/LinkDimensionPopover.test.jsx +165 -0
  79. package/src/app/pages/NodePage/__tests__/NodeGraphTab.test.jsx +591 -0
  80. package/src/app/pages/NodePage/__tests__/NodeLineageTab.test.jsx +57 -0
  81. package/src/app/pages/NodePage/__tests__/NodePage.test.jsx +725 -0
  82. package/src/app/pages/NodePage/__tests__/NodeWithDimension.test.jsx +175 -0
  83. package/src/app/pages/NodePage/__tests__/__snapshots__/NodePage.test.jsx.snap +402 -0
  84. package/src/app/pages/NodePage/index.jsx +151 -41
  85. package/src/app/pages/NotFoundPage/__tests__/index.test.jsx +16 -0
  86. package/src/app/pages/RegisterTablePage/Loadable.jsx +16 -0
  87. package/src/app/pages/RegisterTablePage/index.jsx +163 -0
  88. package/src/app/pages/Root/__tests__/index.test.jsx +77 -0
  89. package/src/app/pages/Root/index.tsx +32 -4
  90. package/src/app/pages/SQLBuilderPage/Loadable.jsx +16 -0
  91. package/src/app/pages/SQLBuilderPage/__tests__/index.test.jsx +173 -0
  92. package/src/app/pages/SQLBuilderPage/index.jsx +390 -0
  93. package/src/app/providers/djclient.jsx +5 -0
  94. package/src/app/services/DJService.js +388 -22
  95. package/src/app/services/__tests__/DJService.test.jsx +609 -0
  96. package/src/mocks/mockNodes.jsx +1397 -0
  97. package/src/setupTests.ts +31 -1
  98. package/src/styles/dag.css +111 -5
  99. package/src/styles/index.css +467 -31
  100. package/src/styles/login.css +67 -0
  101. package/src/styles/node-creation.scss +197 -0
  102. package/src/styles/styles.scss +44 -0
  103. package/src/styles/styles.scss.d.ts +9 -0
  104. package/src/utils/form.jsx +23 -0
  105. package/tsconfig.json +1 -5
  106. package/webpack.config.js +29 -6
  107. package/.babelrc +0 -4
  108. package/.env.local +0 -4
  109. package/.env.production +0 -1
  110. package/.github/pull_request_template.md +0 -11
  111. package/.github/workflows/ci.yml +0 -33
  112. package/.vscode/extensions.json +0 -7
  113. package/.vscode/launch.json +0 -15
  114. package/.vscode/settings.json +0 -25
  115. package/Dockerfile +0 -7
  116. package/dist/5fa71a03d45dc2e3d61447f3013a303d.png +0 -0
  117. package/dist/index.html +0 -1
  118. package/dist/main.js +0 -23303
  119. package/dist/static/main.05a86d446163fd5f17d3.js +0 -2
  120. package/dist/static/main.05a86d446163fd5f17d3.js.LICENSE.txt +0 -98
  121. package/dist/static/main.9e53bed734dae98e5b10.js +0 -2
  122. package/dist/static/main.9e53bed734dae98e5b10.js.LICENSE.txt +0 -98
  123. package/dist/static/main.js +0 -2
  124. package/dist/static/main.js.LICENSE.txt +0 -98
  125. package/dist/static/vendor.05a86d446163fd5f17d3.js +0 -2
  126. package/dist/static/vendor.05a86d446163fd5f17d3.js.LICENSE.txt +0 -29
  127. package/dist/static/vendor.9e53bed734dae98e5b10.js +0 -2
  128. package/dist/static/vendor.9e53bed734dae98e5b10.js.LICENSE.txt +0 -29
  129. package/dist/static/vendor.js +0 -2
  130. package/dist/static/vendor.js.LICENSE.txt +0 -29
  131. package/dist/vendor.js +0 -281
  132. package/src/app/pages/ListNamespacesPage/Loadable.jsx +0 -14
  133. package/src/app/pages/ListNamespacesPage/index.jsx +0 -52
  134. package/src/app/pages/NamespacePage/__tests__/__snapshots__/index.test.tsx.snap +0 -45
  135. package/src/app/pages/NamespacePage/__tests__/index.test.tsx +0 -14
@@ -0,0 +1,175 @@
1
+ import React from 'react';
2
+ import { render, waitFor, screen } from '@testing-library/react';
3
+ import NodesWithDimension from '../NodesWithDimension';
4
+
5
+ describe('<NodesWithDimension />', () => {
6
+ const mockDjClient = {
7
+ nodesWithDimension: jest.fn(),
8
+ };
9
+
10
+ const mockNodesWithDimension = [
11
+ {
12
+ node_revision_id: 2,
13
+ node_id: 2,
14
+ type: 'source',
15
+ name: 'default.repair_order_details',
16
+ display_name: 'Default: Repair Order Details',
17
+ version: 'v1.0',
18
+ status: 'valid',
19
+ mode: 'published',
20
+ catalog: {
21
+ id: 1,
22
+ uuid: '0fc18295-e1a2-4c3c-b72a-894725c12488',
23
+ created_at: '2023-08-21T16:48:51.146121+00:00',
24
+ updated_at: '2023-08-21T16:48:51.146122+00:00',
25
+ extra_params: {},
26
+ name: 'warehouse',
27
+ },
28
+ schema_: 'roads',
29
+ table: 'repair_order_details',
30
+ description: 'Details on repair orders',
31
+ query: null,
32
+ availability: null,
33
+ columns: [
34
+ {
35
+ name: 'repair_order_id',
36
+ type: 'int',
37
+ attributes: [],
38
+ dimension: {
39
+ name: 'default.repair_order',
40
+ },
41
+ },
42
+ {
43
+ name: 'repair_type_id',
44
+ type: 'int',
45
+ attributes: [],
46
+ dimension: null,
47
+ },
48
+ {
49
+ name: 'price',
50
+ type: 'float',
51
+ attributes: [],
52
+ dimension: null,
53
+ },
54
+ {
55
+ name: 'quantity',
56
+ type: 'int',
57
+ attributes: [],
58
+ dimension: null,
59
+ },
60
+ {
61
+ name: 'discount',
62
+ type: 'float',
63
+ attributes: [],
64
+ dimension: null,
65
+ },
66
+ ],
67
+ updated_at: '2023-08-21T16:48:52.981201+00:00',
68
+ materializations: [],
69
+ parents: [],
70
+ },
71
+ {
72
+ node_revision_id: 1,
73
+ node_id: 1,
74
+ type: 'source',
75
+ name: 'default.repair_orders',
76
+ display_name: 'Default: Repair Orders',
77
+ version: 'v1.0',
78
+ status: 'valid',
79
+ mode: 'published',
80
+ catalog: {
81
+ id: 1,
82
+ uuid: '0fc18295-e1a2-4c3c-b72a-894725c12488',
83
+ created_at: '2023-08-21T16:48:51.146121+00:00',
84
+ updated_at: '2023-08-21T16:48:51.146122+00:00',
85
+ extra_params: {},
86
+ name: 'warehouse',
87
+ },
88
+ schema_: 'roads',
89
+ table: 'repair_orders',
90
+ description: 'Repair orders',
91
+ query: null,
92
+ availability: null,
93
+ columns: [
94
+ {
95
+ name: 'repair_order_id',
96
+ type: 'int',
97
+ attributes: [],
98
+ dimension: {
99
+ name: 'default.repair_order',
100
+ },
101
+ },
102
+ {
103
+ name: 'municipality_id',
104
+ type: 'string',
105
+ attributes: [],
106
+ dimension: null,
107
+ },
108
+ {
109
+ name: 'hard_hat_id',
110
+ type: 'int',
111
+ attributes: [],
112
+ dimension: null,
113
+ },
114
+ {
115
+ name: 'order_date',
116
+ type: 'date',
117
+ attributes: [],
118
+ dimension: null,
119
+ },
120
+ {
121
+ name: 'required_date',
122
+ type: 'date',
123
+ attributes: [],
124
+ dimension: null,
125
+ },
126
+ {
127
+ name: 'dispatched_date',
128
+ type: 'date',
129
+ attributes: [],
130
+ dimension: null,
131
+ },
132
+ {
133
+ name: 'dispatcher_id',
134
+ type: 'int',
135
+ attributes: [],
136
+ dimension: null,
137
+ },
138
+ ],
139
+ updated_at: '2023-08-21T16:48:52.880498+00:00',
140
+ materializations: [],
141
+ parents: [],
142
+ },
143
+ ];
144
+
145
+ const defaultProps = {
146
+ node: {
147
+ name: 'TestNode',
148
+ },
149
+ djClient: mockDjClient,
150
+ };
151
+
152
+ beforeEach(() => {
153
+ // Reset the mocks before each test
154
+ mockDjClient.nodesWithDimension.mockReset();
155
+ });
156
+
157
+ it('renders nodes with dimensions', async () => {
158
+ mockDjClient.nodesWithDimension.mockReturnValue(mockNodesWithDimension);
159
+ render(<NodesWithDimension {...defaultProps} />);
160
+ await waitFor(() => {
161
+ // calls nodesWithDimension with the correct node name
162
+ expect(mockDjClient.nodesWithDimension).toHaveBeenCalledWith(
163
+ defaultProps.node.name,
164
+ );
165
+ for (const node of mockNodesWithDimension) {
166
+ // renders nodes based on nodesWithDimension data
167
+ expect(screen.getByText(node.display_name)).toBeInTheDocument();
168
+
169
+ // renders links to the correct URLs
170
+ const link = screen.getByText(node.display_name).closest('a');
171
+ expect(link).toHaveAttribute('href', `/nodes/${node.name}`);
172
+ }
173
+ });
174
+ });
175
+ });
@@ -0,0 +1,402 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<NodePage /> renders the NodeHistory tab correctly 1`] = `
4
+ <table
5
+ aria-label="Revisions"
6
+ class="card-inner-table table"
7
+ >
8
+ <thead
9
+ class="fs-7 fw-bold text-gray-400 border-bottom-0"
10
+ >
11
+ <tr>
12
+ <th
13
+ class="text-start"
14
+ >
15
+ Version
16
+ </th>
17
+ <th>
18
+ Display Name
19
+ </th>
20
+ <th>
21
+ Description
22
+ </th>
23
+ <th>
24
+ Query
25
+ </th>
26
+ <th>
27
+ Tags
28
+ </th>
29
+ </tr>
30
+ </thead>
31
+ <tbody>
32
+ <tr>
33
+ <td
34
+ class="text-start"
35
+ >
36
+ <span
37
+ class="badge node_type__source"
38
+ >
39
+ v1.0
40
+ </span>
41
+ </td>
42
+ <td>
43
+ Default: Avg Repair Price
44
+ </td>
45
+ <td>
46
+ Average repair price
47
+ </td>
48
+ <td>
49
+ SELECT avg(price) default_DOT_avg_repair_price
50
+ FROM default.repair_order_details
51
+
52
+
53
+ </td>
54
+ <td />
55
+ </tr>
56
+ </tbody>
57
+ </table>
58
+ `;
59
+
60
+ exports[`<NodePage /> renders the NodeInfo tab correctly 1`] = `
61
+ HTMLCollection [
62
+ <code
63
+ class="language-sql"
64
+ style="white-space: pre;"
65
+ >
66
+ <span
67
+ style="color: rgb(0, 153, 153);"
68
+ >
69
+ SELECT
70
+ </span>
71
+ <span>
72
+
73
+ </span>
74
+ <span
75
+ class="hljs-built_in"
76
+ >
77
+ count
78
+ </span>
79
+ <span>
80
+ (repair_order_id) default_DOT_num_repair_orders
81
+ </span>
82
+ <span
83
+ style="color: rgb(0, 153, 153);"
84
+ >
85
+ FROM
86
+ </span>
87
+ <span>
88
+ default.repair_orders
89
+ </span>
90
+ </code>,
91
+ ]
92
+ `;
93
+
94
+ exports[`<NodePage /> renders the NodeMaterialization tab with materializations correctly 1`] = `
95
+ <table
96
+ aria-hidden="false"
97
+ aria-label="Materializations"
98
+ class="card-inner-table table"
99
+ >
100
+ <thead
101
+ class="fs-7 fw-bold text-gray-400 border-bottom-0"
102
+ >
103
+ <tr>
104
+ <th
105
+ class="text-start"
106
+ >
107
+ Name
108
+ </th>
109
+ <th>
110
+ Schedule
111
+ </th>
112
+ <th>
113
+ Engine
114
+ </th>
115
+ <th>
116
+ Partitions
117
+ </th>
118
+ <th>
119
+ Output Tables
120
+ </th>
121
+ <th>
122
+ Backfills
123
+ </th>
124
+ <th>
125
+ URLs
126
+ </th>
127
+ </tr>
128
+ </thead>
129
+ <tbody>
130
+ <tr>
131
+ <td
132
+ class="text-start node_name"
133
+ >
134
+ <a
135
+ href="http://fake.url/job"
136
+ >
137
+ country_birth_date_contractor_id_379232101
138
+ </a>
139
+ <button
140
+ aria-label="code-button"
141
+ class="code-button"
142
+ height="45px"
143
+ tabindex="0"
144
+ >
145
+ <svg
146
+ fill="none"
147
+ height="45px"
148
+ viewBox="0 0 64 64"
149
+ width="45px"
150
+ xmlns="http://www.w3.org/2000/svg"
151
+ >
152
+ <g
153
+ id="SVGRepo_bgCarrier"
154
+ stroke-width="0"
155
+ />
156
+ <g
157
+ id="SVGRepo_tracerCarrier"
158
+ stroke-linecap="round"
159
+ stroke-linejoin="round"
160
+ />
161
+ <g
162
+ id="SVGRepo_iconCarrier"
163
+ >
164
+ <path
165
+ d="M31.885 16c-8.124 0-7.617 3.523-7.617 3.523l.01 3.65h7.752v1.095H21.197S16 23.678 16 31.876c0 8.196 4.537 7.906 4.537 7.906h2.708v-3.804s-.146-4.537 4.465-4.537h7.688s4.32.07 4.32-4.175v-7.019S40.374 16 31.885 16zm-4.275 2.454c.771 0 1.395.624 1.395 1.395s-.624 1.395-1.395 1.395a1.393 1.393 0 0 1-1.395-1.395c0-.771.624-1.395 1.395-1.395z"
166
+ fill="url(#a)"
167
+ />
168
+ <path
169
+ d="M32.115 47.833c8.124 0 7.617-3.523 7.617-3.523l-.01-3.65H31.97v-1.095h10.832S48 40.155 48 31.958c0-8.197-4.537-7.906-4.537-7.906h-2.708v3.803s.146 4.537-4.465 4.537h-7.688s-4.32-.07-4.32 4.175v7.019s-.656 4.247 7.833 4.247zm4.275-2.454a1.393 1.393 0 0 1-1.395-1.395c0-.77.624-1.394 1.395-1.394s1.395.623 1.395 1.394c0 .772-.624 1.395-1.395 1.395z"
170
+ fill="url(#b)"
171
+ />
172
+ <defs>
173
+ <lineargradient
174
+ gradientUnits="userSpaceOnUse"
175
+ id="a"
176
+ x1="19.075"
177
+ x2="34.898"
178
+ y1="18.782"
179
+ y2="34.658"
180
+ >
181
+ <stop
182
+ stop-color="#387EB8"
183
+ />
184
+ <stop
185
+ offset="1"
186
+ stop-color="#366994"
187
+ />
188
+ </lineargradient>
189
+ <lineargradient
190
+ gradientUnits="userSpaceOnUse"
191
+ id="b"
192
+ x1="28.809"
193
+ x2="45.803"
194
+ y1="28.882"
195
+ y2="45.163"
196
+ >
197
+ <stop
198
+ stop-color="#FFE052"
199
+ />
200
+ <stop
201
+ offset="1"
202
+ stop-color="#FFC331"
203
+ />
204
+ </lineargradient>
205
+ </defs>
206
+ </g>
207
+ </svg>
208
+ </button>
209
+ <div
210
+ aria-label="client-code"
211
+ id="node-create-code"
212
+ role="dialog"
213
+ style="display: none;"
214
+ >
215
+ <pre
216
+ style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(1, 22, 39); color: rgb(214, 222, 235);"
217
+ >
218
+ <code
219
+ class="language-python"
220
+ style="white-space: pre;"
221
+ />
222
+ </pre>
223
+ </div>
224
+ </td>
225
+ <td>
226
+ <span
227
+ class="badge cron"
228
+ >
229
+ 0 * * * *
230
+ </span>
231
+ <div
232
+ class="cron-description"
233
+ >
234
+ Every hour
235
+
236
+ </div>
237
+ </td>
238
+ <td>
239
+ spark
240
+ <br />
241
+ 2.4.4
242
+ </td>
243
+ <td>
244
+ <div
245
+ class="partition__full"
246
+ >
247
+ <div
248
+ class="partition__header"
249
+ >
250
+ country
251
+ </div>
252
+ <div
253
+ class="partition__body"
254
+ >
255
+ <span
256
+ class="badge partition_value"
257
+ >
258
+ DE
259
+ </span>
260
+ <span
261
+ class="badge partition_value"
262
+ >
263
+ MY
264
+ </span>
265
+ </div>
266
+ </div>
267
+ <div
268
+ class="partition__full"
269
+ >
270
+ <div
271
+ class="partition__header"
272
+ >
273
+ contractor_id
274
+ </div>
275
+ <div
276
+ class="partition__body"
277
+ >
278
+ <div>
279
+ <span
280
+ class="badge partition_value"
281
+ >
282
+ <span
283
+ class="badge partition_value"
284
+ >
285
+ 1
286
+ </span>
287
+ to
288
+ <span
289
+ class="badge partition_value"
290
+ >
291
+ 10
292
+ </span>
293
+ </span>
294
+ </div>
295
+ </div>
296
+ </div>
297
+ </td>
298
+ <td>
299
+ <div
300
+ class="table__full"
301
+ >
302
+ <div
303
+ class="table__header"
304
+ >
305
+ <svg
306
+ class="bi bi-table"
307
+ fill="currentColor"
308
+ height="16"
309
+ viewBox="0 0 16 16"
310
+ width="16"
311
+ xmlns="http://www.w3.org/2000/svg"
312
+ >
313
+ <path
314
+ d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm15 2h-4v3h4V4zm0 4h-4v3h4V8zm0 4h-4v3h3a1 1 0 0 0 1-1v-2zm-5 3v-3H6v3h4zm-5 0v-3H1v2a1 1 0 0 0 1 1h3zm-4-4h4V8H1v3zm0-4h4V4H1v3zm5-3v3h4V4H6zm4 4H6v3h4V8z"
315
+ />
316
+ </svg>
317
+
318
+ <span
319
+ class="entity-info"
320
+ >
321
+ common.a
322
+ </span>
323
+ </div>
324
+ <div
325
+ class="table__body upstream_tables"
326
+ />
327
+ </div>
328
+ <div
329
+ class="table__full"
330
+ >
331
+ <div
332
+ class="table__header"
333
+ >
334
+ <svg
335
+ class="bi bi-table"
336
+ fill="currentColor"
337
+ height="16"
338
+ viewBox="0 0 16 16"
339
+ width="16"
340
+ xmlns="http://www.w3.org/2000/svg"
341
+ >
342
+ <path
343
+ d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm15 2h-4v3h4V4zm0 4h-4v3h4V8zm0 4h-4v3h3a1 1 0 0 0 1-1v-2zm-5 3v-3H6v3h4zm-5 0v-3H1v2a1 1 0 0 0 1 1h3zm-4-4h4V8H1v3zm0-4h4V4H1v3zm5-3v3h4V4H6zm4 4H6v3h4V8z"
344
+ />
345
+ </svg>
346
+
347
+ <span
348
+ class="entity-info"
349
+ >
350
+ common.b
351
+ </span>
352
+ </div>
353
+ <div
354
+ class="table__body upstream_tables"
355
+ />
356
+ </div>
357
+ </td>
358
+ <td>
359
+ <div
360
+ class="partition__full"
361
+ >
362
+ <div
363
+ class="partition__header"
364
+ >
365
+ birth_date
366
+ </div>
367
+ <div
368
+ class="partition__body"
369
+ >
370
+ <div>
371
+ <span
372
+ class="badge partition_value"
373
+ >
374
+ <span
375
+ class="badge partition_value"
376
+ >
377
+ 20010101
378
+ </span>
379
+ to
380
+ <span
381
+ class="badge partition_value"
382
+ >
383
+ 20020101
384
+ </span>
385
+ </span>
386
+ </div>
387
+ </div>
388
+ </div>
389
+ </td>
390
+ <td>
391
+ <a
392
+ href="http://fake.url/job"
393
+ >
394
+ [
395
+ 1
396
+ ]
397
+ </a>
398
+ </td>
399
+ </tr>
400
+ </tbody>
401
+ </table>
402
+ `;