datajunction-ui 0.0.1-a1

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 (154) hide show
  1. package/.babel-plugin-macrosrc.js +5 -0
  2. package/.env +3 -0
  3. package/.eslintrc.js +20 -0
  4. package/.gitattributes +201 -0
  5. package/.husky/pre-commit +6 -0
  6. package/.nvmrc +1 -0
  7. package/.prettierignore +6 -0
  8. package/.prettierrc +9 -0
  9. package/.stylelintrc +7 -0
  10. package/LICENSE +22 -0
  11. package/Makefile +3 -0
  12. package/README.md +10 -0
  13. package/dj-logo.svg +10 -0
  14. package/internals/testing/loadable.mock.tsx +6 -0
  15. package/package.json +189 -0
  16. package/public/favicon.ico +0 -0
  17. package/public/index.html +26 -0
  18. package/public/manifest.json +15 -0
  19. package/public/robots.txt +3 -0
  20. package/src/__tests__/reportWebVitals.test.jsx +44 -0
  21. package/src/app/__tests__/__snapshots__/index.test.tsx.snap +9 -0
  22. package/src/app/__tests__/index.test.tsx +14 -0
  23. package/src/app/components/DeleteNode.jsx +55 -0
  24. package/src/app/components/ListGroupItem.jsx +24 -0
  25. package/src/app/components/NamespaceHeader.jsx +31 -0
  26. package/src/app/components/QueryInfo.jsx +77 -0
  27. package/src/app/components/Tab.jsx +25 -0
  28. package/src/app/components/ToggleSwitch.jsx +20 -0
  29. package/src/app/components/__tests__/DeleteNode.test.jsx +53 -0
  30. package/src/app/components/__tests__/ListGroupItem.test.tsx +16 -0
  31. package/src/app/components/__tests__/NamespaceHeader.test.jsx +14 -0
  32. package/src/app/components/__tests__/QueryInfo.test.jsx +55 -0
  33. package/src/app/components/__tests__/Tab.test.jsx +27 -0
  34. package/src/app/components/__tests__/ToggleSwitch.test.jsx +43 -0
  35. package/src/app/components/__tests__/__snapshots__/ListGroupItem.test.tsx.snap +29 -0
  36. package/src/app/components/__tests__/__snapshots__/NamespaceHeader.test.jsx.snap +47 -0
  37. package/src/app/components/djgraph/Collapse.jsx +46 -0
  38. package/src/app/components/djgraph/DJNode.jsx +89 -0
  39. package/src/app/components/djgraph/DJNodeColumns.jsx +71 -0
  40. package/src/app/components/djgraph/DJNodeDimensions.jsx +75 -0
  41. package/src/app/components/djgraph/LayoutFlow.jsx +104 -0
  42. package/src/app/components/djgraph/__tests__/Collapse.test.jsx +51 -0
  43. package/src/app/components/djgraph/__tests__/DJNode.test.tsx +24 -0
  44. package/src/app/components/djgraph/__tests__/DJNodeColumns.test.jsx +83 -0
  45. package/src/app/components/djgraph/__tests__/DJNodeDimensions.test.jsx +118 -0
  46. package/src/app/components/djgraph/__tests__/__snapshots__/DJNode.test.tsx.snap +117 -0
  47. package/src/app/constants.js +2 -0
  48. package/src/app/icons/AlertIcon.jsx +32 -0
  49. package/src/app/icons/CollapsedIcon.jsx +15 -0
  50. package/src/app/icons/DJLogo.jsx +36 -0
  51. package/src/app/icons/DeleteIcon.jsx +21 -0
  52. package/src/app/icons/EditIcon.jsx +18 -0
  53. package/src/app/icons/ExpandedIcon.jsx +15 -0
  54. package/src/app/icons/HorizontalHierarchyIcon.jsx +15 -0
  55. package/src/app/icons/InvalidIcon.jsx +14 -0
  56. package/src/app/icons/LoadingIcon.jsx +14 -0
  57. package/src/app/icons/PythonIcon.jsx +52 -0
  58. package/src/app/icons/TableIcon.jsx +14 -0
  59. package/src/app/icons/ValidIcon.jsx +14 -0
  60. package/src/app/index.tsx +108 -0
  61. package/src/app/pages/AddEditNodePage/FormikSelect.jsx +46 -0
  62. package/src/app/pages/AddEditNodePage/FullNameField.jsx +37 -0
  63. package/src/app/pages/AddEditNodePage/Loadable.jsx +16 -0
  64. package/src/app/pages/AddEditNodePage/NodeQueryField.jsx +89 -0
  65. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormFailed.test.jsx +103 -0
  66. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormSuccess.test.jsx +132 -0
  67. package/src/app/pages/AddEditNodePage/__tests__/FormikSelect.test.jsx +75 -0
  68. package/src/app/pages/AddEditNodePage/__tests__/FullNameField.test.jsx +31 -0
  69. package/src/app/pages/AddEditNodePage/__tests__/NodeQueryField.test.jsx +30 -0
  70. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormFailed.test.jsx.snap +54 -0
  71. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormSuccess.test.jsx.snap +3 -0
  72. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/index.test.jsx.snap +3 -0
  73. package/src/app/pages/AddEditNodePage/__tests__/index.test.jsx +180 -0
  74. package/src/app/pages/AddEditNodePage/index.jsx +396 -0
  75. package/src/app/pages/AddEditTagPage/Loadable.jsx +16 -0
  76. package/src/app/pages/AddEditTagPage/__tests__/AddEditTagPage.test.jsx +107 -0
  77. package/src/app/pages/AddEditTagPage/index.jsx +132 -0
  78. package/src/app/pages/LoginPage/LoginForm.jsx +124 -0
  79. package/src/app/pages/LoginPage/SignupForm.jsx +156 -0
  80. package/src/app/pages/LoginPage/__tests__/index.test.jsx +97 -0
  81. package/src/app/pages/LoginPage/assets/sign-in-with-github.png +0 -0
  82. package/src/app/pages/LoginPage/assets/sign-in-with-google.png +0 -0
  83. package/src/app/pages/LoginPage/index.jsx +17 -0
  84. package/src/app/pages/NamespacePage/AddNamespacePopover.jsx +85 -0
  85. package/src/app/pages/NamespacePage/Explorer.jsx +57 -0
  86. package/src/app/pages/NamespacePage/Loadable.jsx +16 -0
  87. package/src/app/pages/NamespacePage/__tests__/index.test.jsx +217 -0
  88. package/src/app/pages/NamespacePage/index.jsx +199 -0
  89. package/src/app/pages/NodePage/AddBackfillPopover.jsx +166 -0
  90. package/src/app/pages/NodePage/AddMaterializationPopover.jsx +161 -0
  91. package/src/app/pages/NodePage/ClientCodePopover.jsx +46 -0
  92. package/src/app/pages/NodePage/EditColumnPopover.jsx +116 -0
  93. package/src/app/pages/NodePage/LinkDimensionPopover.jsx +149 -0
  94. package/src/app/pages/NodePage/Loadable.jsx +16 -0
  95. package/src/app/pages/NodePage/NodeColumnTab.jsx +200 -0
  96. package/src/app/pages/NodePage/NodeGraphTab.jsx +112 -0
  97. package/src/app/pages/NodePage/NodeHistory.jsx +212 -0
  98. package/src/app/pages/NodePage/NodeInfoTab.jsx +212 -0
  99. package/src/app/pages/NodePage/NodeLineageTab.jsx +84 -0
  100. package/src/app/pages/NodePage/NodeMaterializationTab.jsx +233 -0
  101. package/src/app/pages/NodePage/NodeSQLTab.jsx +82 -0
  102. package/src/app/pages/NodePage/NodeStatus.jsx +28 -0
  103. package/src/app/pages/NodePage/NodesWithDimension.jsx +42 -0
  104. package/src/app/pages/NodePage/PartitionColumnPopover.jsx +153 -0
  105. package/src/app/pages/NodePage/__tests__/AddBackfillPopover.test.jsx +47 -0
  106. package/src/app/pages/NodePage/__tests__/ClientCodePopover.test.jsx +49 -0
  107. package/src/app/pages/NodePage/__tests__/EditColumnPopover.test.jsx +148 -0
  108. package/src/app/pages/NodePage/__tests__/LinkDimensionPopover.test.jsx +165 -0
  109. package/src/app/pages/NodePage/__tests__/NodeGraphTab.test.jsx +591 -0
  110. package/src/app/pages/NodePage/__tests__/NodeLineageTab.test.jsx +57 -0
  111. package/src/app/pages/NodePage/__tests__/NodePage.test.jsx +757 -0
  112. package/src/app/pages/NodePage/__tests__/NodeWithDimension.test.jsx +175 -0
  113. package/src/app/pages/NodePage/__tests__/__snapshots__/NodePage.test.jsx.snap +403 -0
  114. package/src/app/pages/NodePage/index.jsx +210 -0
  115. package/src/app/pages/NotFoundPage/Loadable.tsx +14 -0
  116. package/src/app/pages/NotFoundPage/__tests__/index.test.jsx +16 -0
  117. package/src/app/pages/NotFoundPage/index.tsx +23 -0
  118. package/src/app/pages/RegisterTablePage/Loadable.jsx +16 -0
  119. package/src/app/pages/RegisterTablePage/__tests__/RegisterTablePage.test.jsx +110 -0
  120. package/src/app/pages/RegisterTablePage/__tests__/__snapshots__/RegisterTablePage.test.jsx.snap +37 -0
  121. package/src/app/pages/RegisterTablePage/index.jsx +142 -0
  122. package/src/app/pages/Root/Loadable.tsx +14 -0
  123. package/src/app/pages/Root/__tests__/index.test.jsx +77 -0
  124. package/src/app/pages/Root/assets/dj-logo.png +0 -0
  125. package/src/app/pages/Root/index.tsx +70 -0
  126. package/src/app/pages/SQLBuilderPage/Loadable.jsx +16 -0
  127. package/src/app/pages/SQLBuilderPage/__tests__/index.test.jsx +173 -0
  128. package/src/app/pages/SQLBuilderPage/index.jsx +390 -0
  129. package/src/app/pages/TagPage/Loadable.jsx +16 -0
  130. package/src/app/pages/TagPage/__tests__/TagPage.test.jsx +70 -0
  131. package/src/app/pages/TagPage/index.jsx +79 -0
  132. package/src/app/providers/djclient.jsx +5 -0
  133. package/src/app/services/DJService.js +665 -0
  134. package/src/app/services/__tests__/DJService.test.jsx +804 -0
  135. package/src/index.tsx +48 -0
  136. package/src/mocks/mockNodes.jsx +1430 -0
  137. package/src/react-app-env.d.ts +4 -0
  138. package/src/reportWebVitals.ts +15 -0
  139. package/src/setupTests.ts +36 -0
  140. package/src/styles/dag.css +228 -0
  141. package/src/styles/index.css +1083 -0
  142. package/src/styles/loading.css +34 -0
  143. package/src/styles/login.css +81 -0
  144. package/src/styles/node-creation.scss +197 -0
  145. package/src/styles/styles.scss +44 -0
  146. package/src/styles/styles.scss.d.ts +9 -0
  147. package/src/utils/__tests__/__snapshots__/loadable.test.tsx.snap +17 -0
  148. package/src/utils/__tests__/loadable.test.tsx +53 -0
  149. package/src/utils/__tests__/request.test.ts +82 -0
  150. package/src/utils/form.jsx +23 -0
  151. package/src/utils/loadable.tsx +30 -0
  152. package/src/utils/request.ts +54 -0
  153. package/tsconfig.json +34 -0
  154. package/webpack.config.js +118 -0
@@ -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,403 @@
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
+ Schedule
108
+ </th>
109
+ <th>
110
+ Engine
111
+ </th>
112
+ <th>
113
+ Partitions
114
+ </th>
115
+ <th>
116
+ Output Tables
117
+ </th>
118
+ <th>
119
+ Backfills
120
+ </th>
121
+ <th>
122
+ URLs
123
+ </th>
124
+ </tr>
125
+ </thead>
126
+ <tbody>
127
+ <tr>
128
+ <td
129
+ class="text-start node_name"
130
+ >
131
+ <span
132
+ class="badge cron"
133
+ >
134
+ 0 * * * *
135
+ </span>
136
+ <div
137
+ class="cron-description"
138
+ >
139
+ Every hour
140
+
141
+ </div>
142
+ </td>
143
+ <td>
144
+ spark
145
+ <br />
146
+ 2.4.4
147
+ <button
148
+ aria-label="code-button"
149
+ class="code-button"
150
+ height="45px"
151
+ tabindex="0"
152
+ >
153
+ <svg
154
+ fill="none"
155
+ height="45px"
156
+ viewBox="0 0 64 64"
157
+ width="45px"
158
+ xmlns="http://www.w3.org/2000/svg"
159
+ >
160
+ <g
161
+ id="SVGRepo_bgCarrier"
162
+ stroke-width="0"
163
+ />
164
+ <g
165
+ id="SVGRepo_tracerCarrier"
166
+ stroke-linecap="round"
167
+ stroke-linejoin="round"
168
+ />
169
+ <g
170
+ id="SVGRepo_iconCarrier"
171
+ >
172
+ <path
173
+ 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"
174
+ fill="url(#a)"
175
+ />
176
+ <path
177
+ 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"
178
+ fill="url(#b)"
179
+ />
180
+ <defs>
181
+ <lineargradient
182
+ gradientUnits="userSpaceOnUse"
183
+ id="a"
184
+ x1="19.075"
185
+ x2="34.898"
186
+ y1="18.782"
187
+ y2="34.658"
188
+ >
189
+ <stop
190
+ stop-color="#387EB8"
191
+ />
192
+ <stop
193
+ offset="1"
194
+ stop-color="#366994"
195
+ />
196
+ </lineargradient>
197
+ <lineargradient
198
+ gradientUnits="userSpaceOnUse"
199
+ id="b"
200
+ x1="28.809"
201
+ x2="45.803"
202
+ y1="28.882"
203
+ y2="45.163"
204
+ >
205
+ <stop
206
+ stop-color="#FFE052"
207
+ />
208
+ <stop
209
+ offset="1"
210
+ stop-color="#FFC331"
211
+ />
212
+ </lineargradient>
213
+ </defs>
214
+ </g>
215
+ </svg>
216
+ </button>
217
+ <div
218
+ aria-label="client-code"
219
+ id="node-create-code"
220
+ role="dialog"
221
+ style="display: none;"
222
+ >
223
+ <pre
224
+ style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(1, 22, 39); color: rgb(214, 222, 235);"
225
+ >
226
+ <code
227
+ class="language-python"
228
+ style="white-space: pre;"
229
+ />
230
+ </pre>
231
+ </div>
232
+ </td>
233
+ <td />
234
+ <td>
235
+ <div
236
+ class="table__full"
237
+ >
238
+ <div
239
+ class="table__header"
240
+ >
241
+ <svg
242
+ class="bi bi-table"
243
+ fill="currentColor"
244
+ height="16"
245
+ viewBox="0 0 16 16"
246
+ width="16"
247
+ xmlns="http://www.w3.org/2000/svg"
248
+ >
249
+ <path
250
+ 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"
251
+ />
252
+ </svg>
253
+
254
+ <span
255
+ class="entity-info"
256
+ >
257
+ common.a
258
+ </span>
259
+ </div>
260
+ <div
261
+ class="table__body upstream_tables"
262
+ />
263
+ </div>
264
+ <div
265
+ class="table__full"
266
+ >
267
+ <div
268
+ class="table__header"
269
+ >
270
+ <svg
271
+ class="bi bi-table"
272
+ fill="currentColor"
273
+ height="16"
274
+ viewBox="0 0 16 16"
275
+ width="16"
276
+ xmlns="http://www.w3.org/2000/svg"
277
+ >
278
+ <path
279
+ 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"
280
+ />
281
+ </svg>
282
+
283
+ <span
284
+ class="entity-info"
285
+ >
286
+ common.b
287
+ </span>
288
+ </div>
289
+ <div
290
+ class="table__body upstream_tables"
291
+ />
292
+ </div>
293
+ </td>
294
+ <td>
295
+ <a
296
+ class="partitionLink"
297
+ >
298
+ <div
299
+ class="partition__full"
300
+ >
301
+ <div
302
+ class="partition__header"
303
+ />
304
+ <div
305
+ class="partition__body"
306
+ >
307
+ <span
308
+ class="badge partition_value"
309
+ >
310
+ 20230101
311
+ </span>
312
+ to
313
+ <span
314
+ class="badge partition_value"
315
+ >
316
+ 20230102
317
+ </span>
318
+ </div>
319
+ </div>
320
+ </a>
321
+ <button
322
+ aria-label="AddBackfill"
323
+ class="edit_button"
324
+ tabindex="0"
325
+ >
326
+ <span
327
+ class="add_node"
328
+ >
329
+ + Add Backfill
330
+ </span>
331
+ </button>
332
+ <div
333
+ class="fade modal-backdrop in"
334
+ style="display: none;"
335
+ />
336
+ <div
337
+ aria-label="client-code"
338
+ class="centerPopover"
339
+ role="dialog"
340
+ style="display: none; width: 50%;"
341
+ >
342
+ <form
343
+ action="#"
344
+ >
345
+ <h2>
346
+ Run Backfill
347
+ </h2>
348
+ <span
349
+ data-testid="edit-partition"
350
+ >
351
+ <label
352
+ for="engine"
353
+ style="padding-bottom: 1rem;"
354
+ >
355
+ Engine
356
+ </label>
357
+ <select
358
+ disabled=""
359
+ id="engine"
360
+ name="engine"
361
+ >
362
+ <option
363
+ value="spark"
364
+ >
365
+ spark
366
+
367
+ 2.4.4
368
+ </option>
369
+ </select>
370
+ </span>
371
+ <br />
372
+ <br />
373
+ <label
374
+ for="partition"
375
+ style="padding-bottom: 1rem;"
376
+ >
377
+ Partition Range
378
+ </label>
379
+ <br />
380
+ <button
381
+ aria-hidden="false"
382
+ aria-label="SaveEditColumn"
383
+ class="add_node"
384
+ type="submit"
385
+ >
386
+ Save
387
+ </button>
388
+ </form>
389
+ </div>
390
+ </td>
391
+ <td>
392
+ <a
393
+ href="http://fake.url/job"
394
+ >
395
+ [
396
+ 1
397
+ ]
398
+ </a>
399
+ </td>
400
+ </tr>
401
+ </tbody>
402
+ </table>
403
+ `;