@marimo-team/frontend 0.25.2-dev138 → 0.25.2-dev139
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.
- package/dist/assets/{CellStatus-CtjqYbWH.js → CellStatus-BP2mavAq.js} +1 -1
- package/dist/assets/{ErrorBoundary-F1payLgE.js → ErrorBoundary-Gl5nCA8C.js} +2 -2
- package/dist/assets/JsonOutput-D6HIIsCb.js +11 -0
- package/dist/assets/{MarimoErrorOutput-4jDnOIVr.js → MarimoErrorOutput-D60XkCny.js} +1 -1
- package/dist/assets/{RenderHTML-B5VPTO14.js → RenderHTML-BbOqmHy3.js} +1 -1
- package/dist/assets/{RunButton-BIzGc4XI.js → RunButton-CK3LhnP5.js} +1 -1
- package/dist/assets/{add-cell-with-ai-C9LKCZNX.js → add-cell-with-ai-8UBC0xwR.js} +1 -1
- package/dist/assets/{add-connection-dialog-DCpxcHW4.js → add-connection-dialog-DXQnd6eB.js} +1 -1
- package/dist/assets/{agent-panel-CMu56klN.js → agent-panel-D7kMZLG-.js} +1 -1
- package/dist/assets/{ai-model-dropdown-BXCbNMSF.js → ai-model-dropdown-B0z6-zhp.js} +1 -1
- package/dist/assets/{app-config-button-qT1E__GX.js → app-config-button-BKEG4x9u.js} +1 -1
- package/dist/assets/{blob-QvTM0DdL.js → blob-D5nfNHOo.js} +1 -1
- package/dist/assets/{cell-editor-DoRGJY9X.js → cell-editor-ADVfycpN.js} +1 -1
- package/dist/assets/{cell-link-CIHoy1VE.js → cell-link-LSth_8hT.js} +1 -1
- package/dist/assets/{cells-BWyR7TCJ.js → cells-BRkCaSsh.js} +3 -3
- package/dist/assets/{chat-display-BWWcq_KY.js → chat-display-Dnagy4Nv.js} +1 -1
- package/dist/assets/{chat-panel-C3eticc5.js → chat-panel-DQ6HkWEF.js} +1 -1
- package/dist/assets/{chat-ui-C9BSarmm.js → chat-ui-Df8Vcj6n.js} +1 -1
- package/dist/assets/{column-preview-BJr1QW8R.js → column-preview-Cm2D6vyX.js} +1 -1
- package/dist/assets/{command-palette-DSU3hKHj.js → command-palette-DTSQ7gOC.js} +1 -1
- package/dist/assets/{common-2ZN9KNv-.js → common-Cu6CDbuw.js} +1 -1
- package/dist/assets/{components-_sJpwVD4.js → components-CGw16R_N.js} +1 -1
- package/dist/assets/{datasource-C_fKqG0e.js → datasource-Cq6x_5ML.js} +1 -1
- package/dist/assets/dates-BbFQ2oE4.js +1 -0
- package/dist/assets/{dependency-graph-panel-DSol2xZ3.js → dependency-graph-panel--Kgtktcw.js} +1 -1
- package/dist/assets/{documentation-panel-BcxEbDPv.js → documentation-panel-BHmbeznw.js} +1 -1
- package/dist/assets/{download-B5cBmz55.js → download-DCJXy66H.js} +1 -1
- package/dist/assets/{edit-page-C77nq-kU.js → edit-page-ChcSgpke.js} +4 -4
- package/dist/assets/{en-US-BxZyFbza.js → en-US-Buu61juQ.js} +1 -1
- package/dist/assets/{error-entries-PrZ4UIKa.js → error-entries-Dk3VZ-OK.js} +1 -1
- package/dist/assets/{error-panel-Cuohhvyw.js → error-panel-BPRYmC5J.js} +1 -1
- package/dist/assets/feedback-button-B2gKC5cn.js +1 -0
- package/dist/assets/{feedback-button-aEZd8wqo.js → feedback-button-Bik2-e33.js} +1 -1
- package/dist/assets/{file-explorer-panel-DMrCYHTB.js → file-explorer-panel-BEEK5lcl.js} +1 -1
- package/dist/assets/{file-name-input-CRkt1da3.js → file-name-input-Cdc-TVqO.js} +1 -1
- package/dist/assets/{floating-outline-BnO_h00w.js → floating-outline-XD9FAV-f.js} +1 -1
- package/dist/assets/{gallery-page-g3iLOyQO.js → gallery-page-Dm6mGwBi.js} +1 -1
- package/dist/assets/{glide-data-editor-WZMQjVJd.js → glide-data-editor-J9CAb70d.js} +1 -1
- package/dist/assets/{home-page-DjnQBLCb.js → home-page-DMHnsRxm.js} +1 -1
- package/dist/assets/{hooks-CDfxP5gD.js → hooks-93IwHd2u.js} +1 -1
- package/dist/assets/{index-C369kLAD.js → index-s-M1OXjs.js} +4 -4
- package/dist/assets/{isValid-BFmJHgM5.js → isValid-q_Ad80ug.js} +1 -1
- package/dist/assets/{layout-BG315foV.js → layout-DmcNEu3P.js} +3 -3
- package/dist/assets/{logs-panel-Ct5o61k4.js → logs-panel-ABM16htT.js} +1 -1
- package/dist/assets/{markdown-renderer-bBVFObv0.js → markdown-renderer-BG3sp2rs.js} +1 -1
- package/dist/assets/{name-cell-input-RN-BHucn.js → name-cell-input-BgEBmqyL.js} +1 -1
- package/dist/assets/{outline-panel-B_GILrNI.js → outline-panel-DCXQ3_F6.js} +1 -1
- package/dist/assets/{packages-panel-PxjbX4U0.js → packages-panel-BMGOmZkR.js} +1 -1
- package/dist/assets/{panel-accordion-state-BF3wKXuD.js → panel-accordion-state-C1sdPp0m.js} +1 -1
- package/dist/assets/{panels-CNiQ8zQW.js → panels-CxVG8-v2.js} +1 -1
- package/dist/assets/{process-output-C_JmjPkt.js → process-output-D0KGq04R.js} +1 -1
- package/dist/assets/{readonly-code-display-Bsv-J4Xx.js → readonly-code-display-Do50PHI8.js} +1 -1
- package/dist/assets/{readonly-python-code-bOYKcbg4.js → readonly-python-code-DCSMIsTX.js} +1 -1
- package/dist/assets/{reveal-component-DVLj8BA7.js → reveal-component-ltaepAqw.js} +1 -1
- package/dist/assets/{run-page-CfK6z25Z.js → run-page-DF3c5cDk.js} +1 -1
- package/dist/assets/{runtime-details-state-ZkKdmmAJ.js → runtime-details-state-CSPobEdR.js} +1 -1
- package/dist/assets/{scratchpad-panel-DDm-83ap.js → scratchpad-panel-Dwd6W5PE.js} +1 -1
- package/dist/assets/{session-panel-DJ2aIlDv.js → session-panel-VdDhEBa-.js} +1 -1
- package/dist/assets/{snippets-panel-C-lvTkYT.js → snippets-panel-Bh1oTw4m.js} +1 -1
- package/dist/assets/{state-C1RQhToR.js → state-XsPO8hNi.js} +1 -1
- package/dist/assets/{state-DMZ8VJcq.js → state-_Qai_QyX.js} +1 -1
- package/dist/assets/toDate-DOj9Q6uC.js +1 -0
- package/dist/assets/{tracing-f3Wv0MqG.js → tracing-Di6pUmX8.js} +1 -1
- package/dist/assets/{tracing-panel-BDSbtHAO.js → tracing-panel-PeRXHD8_.js} +2 -2
- package/dist/assets/{tree-actions-PNciswRG.js → tree-actions-GM5E_bUs.js} +1 -1
- package/dist/assets/{useAddCell-mcL2PJTv.js → useAddCell-GR7eEQrT.js} +1 -1
- package/dist/assets/{useCellActionButton-CYjo2N8X.js → useCellActionButton-B-9eG5z_.js} +1 -1
- package/dist/assets/{useDeleteCell-hqk8CkzR.js → useDeleteCell-2_bMClHd.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-rJGeCoZQ.js → useDependencyPanelTab-k3C3M18S.js} +1 -1
- package/dist/assets/{useNotebookActions-CaICxpTf.js → useNotebookActions-NHN6A-cN.js} +1 -1
- package/dist/assets/{useRunCells-DIY1IVXx.js → useRunCells-B2vUhREg.js} +1 -1
- package/dist/assets/{useSplitCell-BGcgAf0Z.js → useSplitCell-DEb03htp.js} +1 -1
- package/dist/assets/{vega-component-DOWuVPTF.js → vega-component-CnadTgoE.js} +1 -1
- package/dist/index.html +23 -23
- package/package.json +1 -1
- package/src/components/data-table/__tests__/column_formatting.test.ts +30 -0
- package/src/components/data-table/__tests__/columns.test.tsx +70 -0
- package/src/components/data-table/column-formatting/feature.ts +20 -1
- package/src/components/data-table/columns.tsx +25 -18
- package/dist/assets/JsonOutput-Bhgwb5kV.js +0 -11
- package/dist/assets/dates-C7NNASps.js +0 -1
- package/dist/assets/feedback-button-5oy5W7Kx.js +0 -1
- package/dist/assets/toDate-DaZHg4Of.js +0 -1
package/dist/index.html
CHANGED
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
<marimo-server-token data-token="{{ server_token }}" hidden></marimo-server-token>
|
|
67
67
|
<!-- /TODO -->
|
|
68
68
|
<title>{{ title }}</title>
|
|
69
|
-
<script type="module" crossorigin src="./assets/index-
|
|
69
|
+
<script type="module" crossorigin src="./assets/index-s-M1OXjs.js"></script>
|
|
70
70
|
<link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-B0Z9INg1.js">
|
|
71
71
|
<link rel="modulepreload" crossorigin href="./assets/react-DVplv7_D.js">
|
|
72
72
|
<link rel="modulepreload" crossorigin href="./assets/compiler-runtime-BrajqUja.js">
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
<link rel="modulepreload" crossorigin href="./assets/tooltip-C9TuY18o.js">
|
|
106
106
|
<link rel="modulepreload" crossorigin href="./assets/paths-bkIFVj8h.js">
|
|
107
107
|
<link rel="modulepreload" crossorigin href="./assets/useLifecycle-Mq4gc5kS.js">
|
|
108
|
-
<link rel="modulepreload" crossorigin href="./assets/toDate-
|
|
108
|
+
<link rel="modulepreload" crossorigin href="./assets/toDate-DOj9Q6uC.js">
|
|
109
109
|
<link rel="modulepreload" crossorigin href="./assets/database-zap-B_PMVg8T.js">
|
|
110
110
|
<link rel="modulepreload" crossorigin href="./assets/alert-dialog-BaPGzeOK.js">
|
|
111
111
|
<link rel="modulepreload" crossorigin href="./assets/arrays-BqUx5USx.js">
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
<link rel="modulepreload" crossorigin href="./assets/useTheme-COhSHkCj.js">
|
|
140
140
|
<link rel="modulepreload" crossorigin href="./assets/useAsyncData-C7aJJz0Y.js">
|
|
141
141
|
<link rel="modulepreload" crossorigin href="./assets/purify.es--06brOip.js">
|
|
142
|
-
<link rel="modulepreload" crossorigin href="./assets/cells-
|
|
142
|
+
<link rel="modulepreload" crossorigin href="./assets/cells-BRkCaSsh.js">
|
|
143
143
|
<link rel="modulepreload" crossorigin href="./assets/coerce-CpE6kUdX.js">
|
|
144
144
|
<link rel="modulepreload" crossorigin href="./assets/get-DjNf4SIX.js">
|
|
145
145
|
<link rel="modulepreload" crossorigin href="./assets/_hasPath-BmRQipI0.js">
|
|
@@ -152,47 +152,47 @@
|
|
|
152
152
|
<link rel="modulepreload" crossorigin href="./assets/copy-D8O_CYCG.js">
|
|
153
153
|
<link rel="modulepreload" crossorigin href="./assets/micromark-factory-space-D9Dr-k4J.js">
|
|
154
154
|
<link rel="modulepreload" crossorigin href="./assets/chunk-YOKDWASO-BIpRENEC.js">
|
|
155
|
-
<link rel="modulepreload" crossorigin href="./assets/markdown-renderer-
|
|
155
|
+
<link rel="modulepreload" crossorigin href="./assets/markdown-renderer-BG3sp2rs.js">
|
|
156
156
|
<link rel="modulepreload" crossorigin href="./assets/copy-Djr5m5ac.js">
|
|
157
157
|
<link rel="modulepreload" crossorigin href="./assets/copy-icon-BIiRXh_3.js">
|
|
158
|
-
<link rel="modulepreload" crossorigin href="./assets/useRunCells-
|
|
159
|
-
<link rel="modulepreload" crossorigin href="./assets/RenderHTML-
|
|
160
|
-
<link rel="modulepreload" crossorigin href="./assets/blob-
|
|
158
|
+
<link rel="modulepreload" crossorigin href="./assets/useRunCells-B2vUhREg.js">
|
|
159
|
+
<link rel="modulepreload" crossorigin href="./assets/RenderHTML-BbOqmHy3.js">
|
|
160
|
+
<link rel="modulepreload" crossorigin href="./assets/blob-D5nfNHOo.js">
|
|
161
161
|
<link rel="modulepreload" crossorigin href="./assets/kbd-pdKBv96t.js">
|
|
162
162
|
<link rel="modulepreload" crossorigin href="./assets/useInstallPackage-iX1eufdl.js">
|
|
163
163
|
<link rel="modulepreload" crossorigin href="./assets/errors-DCrsa1nH.js">
|
|
164
164
|
<link rel="modulepreload" crossorigin href="./assets/api-BeC_VSGv.js">
|
|
165
165
|
<link rel="modulepreload" crossorigin href="./assets/share-BZW3tzEX.js">
|
|
166
166
|
<link rel="modulepreload" crossorigin href="./assets/events-CbeVJ6OD.js">
|
|
167
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
167
|
+
<link rel="modulepreload" crossorigin href="./assets/state-_Qai_QyX.js">
|
|
168
168
|
<link rel="modulepreload" crossorigin href="./assets/pair-CaQyK6En.js">
|
|
169
|
-
<link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-
|
|
169
|
+
<link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-Gl5nCA8C.js">
|
|
170
170
|
<link rel="modulepreload" crossorigin href="./assets/config-BOKzA3tF.js">
|
|
171
171
|
<link rel="modulepreload" crossorigin href="./assets/chevron-right-eAtVhbNZ.js">
|
|
172
172
|
<link rel="modulepreload" crossorigin href="./assets/dropdown-menu-C1rnl-0o.js">
|
|
173
173
|
<link rel="modulepreload" crossorigin href="./assets/html-to-image-DK9Zl1lU.js">
|
|
174
|
-
<link rel="modulepreload" crossorigin href="./assets/download-
|
|
174
|
+
<link rel="modulepreload" crossorigin href="./assets/download-DCJXy66H.js">
|
|
175
175
|
<link rel="modulepreload" crossorigin href="./assets/switch-CTaiAjrz.js">
|
|
176
176
|
<link rel="modulepreload" crossorigin href="./assets/tabs-BuQlZFbt.js">
|
|
177
177
|
<link rel="modulepreload" crossorigin href="./assets/table-DG7Ap4H4.js">
|
|
178
178
|
<link rel="modulepreload" crossorigin href="./assets/eye-off-CxVozGAC.js">
|
|
179
179
|
<link rel="modulepreload" crossorigin href="./assets/refresh-cw-Qw1f8Jhy.js">
|
|
180
|
-
<link rel="modulepreload" crossorigin href="./assets/tree-actions-
|
|
180
|
+
<link rel="modulepreload" crossorigin href="./assets/tree-actions-GM5E_bUs.js">
|
|
181
181
|
<link rel="modulepreload" crossorigin href="./assets/ellipsis-63DyBLHQ.js">
|
|
182
182
|
<link rel="modulepreload" crossorigin href="./assets/external-link-UrX9KO36.js">
|
|
183
183
|
<link rel="modulepreload" crossorigin href="./assets/spinner-DyNE-o8o.js">
|
|
184
184
|
<link rel="modulepreload" crossorigin href="./assets/message-circle-C3rKm8_a.js">
|
|
185
185
|
<link rel="modulepreload" crossorigin href="./assets/hat-glasses-C8RhSVii.js">
|
|
186
186
|
<link rel="modulepreload" crossorigin href="./assets/package-GSoSTiIK.js">
|
|
187
|
-
<link rel="modulepreload" crossorigin href="./assets/datasource-
|
|
187
|
+
<link rel="modulepreload" crossorigin href="./assets/datasource-Cq6x_5ML.js">
|
|
188
188
|
<link rel="modulepreload" crossorigin href="./assets/alert-DTaqCu_d.js">
|
|
189
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
190
|
-
<link rel="modulepreload" crossorigin href="./assets/cell-link-
|
|
191
|
-
<link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-
|
|
189
|
+
<link rel="modulepreload" crossorigin href="./assets/state-XsPO8hNi.js">
|
|
190
|
+
<link rel="modulepreload" crossorigin href="./assets/cell-link-LSth_8hT.js">
|
|
191
|
+
<link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-D60XkCny.js">
|
|
192
192
|
<link rel="modulepreload" crossorigin href="./assets/useDateFormatter-DA-62E-Y.js">
|
|
193
|
-
<link rel="modulepreload" crossorigin href="./assets/en-US-
|
|
194
|
-
<link rel="modulepreload" crossorigin href="./assets/isValid-
|
|
195
|
-
<link rel="modulepreload" crossorigin href="./assets/dates-
|
|
193
|
+
<link rel="modulepreload" crossorigin href="./assets/en-US-Buu61juQ.js">
|
|
194
|
+
<link rel="modulepreload" crossorigin href="./assets/isValid-q_Ad80ug.js">
|
|
195
|
+
<link rel="modulepreload" crossorigin href="./assets/dates-BbFQ2oE4.js">
|
|
196
196
|
<link rel="modulepreload" crossorigin href="./assets/defaultLocale-CNPGWpMu.js">
|
|
197
197
|
<link rel="modulepreload" crossorigin href="./assets/precisionRound-Bq_nmf5u.js">
|
|
198
198
|
<link rel="modulepreload" crossorigin href="./assets/defaultLocale-D5bOh7g6.js">
|
|
@@ -207,7 +207,7 @@
|
|
|
207
207
|
<link rel="modulepreload" crossorigin href="./assets/formats-yZ06h1Pl.js">
|
|
208
208
|
<link rel="modulepreload" crossorigin href="./assets/table-vrvqpuKJ.js">
|
|
209
209
|
<link rel="modulepreload" crossorigin href="./assets/react-resizable-panels.browser.esm-Dbe0MrFr.js">
|
|
210
|
-
<link rel="modulepreload" crossorigin href="./assets/JsonOutput-
|
|
210
|
+
<link rel="modulepreload" crossorigin href="./assets/JsonOutput-D6HIIsCb.js">
|
|
211
211
|
<link rel="modulepreload" crossorigin href="./assets/chart-no-axes-column-C4_v6fQW.js">
|
|
212
212
|
<link rel="modulepreload" crossorigin href="./assets/square-function-_W_Lo0P4.js">
|
|
213
213
|
<link rel="modulepreload" crossorigin href="./assets/spec-BfSBcO5B.js">
|
|
@@ -221,11 +221,11 @@
|
|
|
221
221
|
<link rel="modulepreload" crossorigin href="./assets/file-icons-CdJgUy-I.js">
|
|
222
222
|
<link rel="modulepreload" crossorigin href="./assets/globe-UdPdIbF7.js">
|
|
223
223
|
<link rel="modulepreload" crossorigin href="./assets/esm-CI_o7NhW.js">
|
|
224
|
-
<link rel="modulepreload" crossorigin href="./assets/useAddCell-
|
|
225
|
-
<link rel="modulepreload" crossorigin href="./assets/readonly-python-code-
|
|
224
|
+
<link rel="modulepreload" crossorigin href="./assets/useAddCell-GR7eEQrT.js">
|
|
225
|
+
<link rel="modulepreload" crossorigin href="./assets/readonly-python-code-DCSMIsTX.js">
|
|
226
226
|
<link rel="modulepreload" crossorigin href="./assets/data-grid-types-DgHVN_Zz.js">
|
|
227
227
|
<link rel="modulepreload" crossorigin href="./assets/glide-utils-CIrAxdjv.js">
|
|
228
|
-
<link rel="modulepreload" crossorigin href="./assets/column-preview-
|
|
228
|
+
<link rel="modulepreload" crossorigin href="./assets/column-preview-Cm2D6vyX.js">
|
|
229
229
|
<link rel="modulepreload" crossorigin href="./assets/square-BPmgQFnh.js">
|
|
230
230
|
<link rel="modulepreload" crossorigin href="./assets/triangle-alert-DmIqR8sY.js">
|
|
231
231
|
<link rel="modulepreload" crossorigin href="./assets/prop-types-Djf4O40e.js">
|
|
@@ -237,7 +237,7 @@
|
|
|
237
237
|
<link rel="modulepreload" crossorigin href="./assets/icons-CiZ_8zS-.js">
|
|
238
238
|
<link rel="modulepreload" crossorigin href="./assets/useDeepCompareMemoize-DFIVN9dn.js">
|
|
239
239
|
<link rel="modulepreload" crossorigin href="./assets/pathUtils-DPmlLd-r.js">
|
|
240
|
-
<link rel="modulepreload" crossorigin href="./assets/floating-outline-
|
|
240
|
+
<link rel="modulepreload" crossorigin href="./assets/floating-outline-XD9FAV-f.js">
|
|
241
241
|
<link rel="stylesheet" crossorigin href="./assets/cells-0PFKL3SH.css">
|
|
242
242
|
<link rel="stylesheet" crossorigin href="./assets/markdown-renderer-DjIHoF9Z.css">
|
|
243
243
|
<link rel="stylesheet" crossorigin href="./assets/JsonOutput-B0GmlMnR.css">
|
package/package.json
CHANGED
|
@@ -50,6 +50,36 @@ describe("applyFormat", () => {
|
|
|
50
50
|
}),
|
|
51
51
|
).toBe("10/1/23, 12:00:00 PM UTC");
|
|
52
52
|
});
|
|
53
|
+
|
|
54
|
+
it("should treat naive datetime strings as UTC", () => {
|
|
55
|
+
const naive = "2023-10-01 23:30:00";
|
|
56
|
+
expect(
|
|
57
|
+
applyFormat(naive, { locale, format: "Date", dataType: "datetime" }),
|
|
58
|
+
).toBe("10/1/23");
|
|
59
|
+
expect(
|
|
60
|
+
applyFormat(naive, {
|
|
61
|
+
locale,
|
|
62
|
+
format: "Datetime",
|
|
63
|
+
dataType: "datetime",
|
|
64
|
+
}),
|
|
65
|
+
).toBe("10/1/23, 11:30:00 PM UTC");
|
|
66
|
+
expect(
|
|
67
|
+
applyFormat(naive, { locale, format: "Time", dataType: "datetime" }),
|
|
68
|
+
).toBe("11:30:00 PM UTC");
|
|
69
|
+
expect(
|
|
70
|
+
applyFormat("2023-10-01T23:30:00.250", {
|
|
71
|
+
locale,
|
|
72
|
+
format: "Time",
|
|
73
|
+
dataType: "datetime",
|
|
74
|
+
}),
|
|
75
|
+
).toBe("11:30:00 PM UTC");
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("should keep the calendar date for date-only strings", () => {
|
|
79
|
+
expect(
|
|
80
|
+
applyFormat("2023-10-01", { locale, format: "Date", dataType: "date" }),
|
|
81
|
+
).toBe("10/1/23");
|
|
82
|
+
});
|
|
53
83
|
});
|
|
54
84
|
|
|
55
85
|
describe("number formatting", () => {
|
|
@@ -1268,6 +1268,76 @@ describe("renderCellValue with datetime values", () => {
|
|
|
1268
1268
|
}).not.toThrow();
|
|
1269
1269
|
});
|
|
1270
1270
|
});
|
|
1271
|
+
|
|
1272
|
+
it("should render the column format for datetime strings", () => {
|
|
1273
|
+
const mockColumn = {
|
|
1274
|
+
...createMockColumn(),
|
|
1275
|
+
getColumnFormatting: () => "Date",
|
|
1276
|
+
applyColumnFormatting: () => "FORMATTED",
|
|
1277
|
+
} as unknown as Column<unknown>;
|
|
1278
|
+
|
|
1279
|
+
const selectCell = vi.fn();
|
|
1280
|
+
const result = renderCellValue({
|
|
1281
|
+
column: mockColumn,
|
|
1282
|
+
renderValue: () => "2024-06-14 12:34:20",
|
|
1283
|
+
getValue: () => "2024-06-14 12:34:20",
|
|
1284
|
+
selectCell,
|
|
1285
|
+
cellStyles: "cell-styles",
|
|
1286
|
+
});
|
|
1287
|
+
const { container } = render(
|
|
1288
|
+
<I18nProvider locale="en-US">
|
|
1289
|
+
<TooltipProvider>{result}</TooltipProvider>
|
|
1290
|
+
</I18nProvider>,
|
|
1291
|
+
);
|
|
1292
|
+
expect(container.textContent).toContain("FORMATTED");
|
|
1293
|
+
expect(container.textContent).not.toContain("2024-06-14 12:34:20");
|
|
1294
|
+
|
|
1295
|
+
const wrapper = container.querySelector(".cell-styles");
|
|
1296
|
+
expect(wrapper).not.toBeNull();
|
|
1297
|
+
wrapper?.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
1298
|
+
expect(selectCell).toHaveBeenCalledTimes(1);
|
|
1299
|
+
});
|
|
1300
|
+
|
|
1301
|
+
it("should render the column format for Date instances", () => {
|
|
1302
|
+
const mockColumn = {
|
|
1303
|
+
...createMockColumn(),
|
|
1304
|
+
getColumnFormatting: () => "Date",
|
|
1305
|
+
applyColumnFormatting: () => "FORMATTED",
|
|
1306
|
+
} as unknown as Column<unknown>;
|
|
1307
|
+
const value = new Date("2024-06-14T12:34:20Z");
|
|
1308
|
+
|
|
1309
|
+
const result = renderCellValue({
|
|
1310
|
+
column: mockColumn,
|
|
1311
|
+
renderValue: () => value,
|
|
1312
|
+
getValue: () => value,
|
|
1313
|
+
selectCell: undefined,
|
|
1314
|
+
cellStyles: "",
|
|
1315
|
+
});
|
|
1316
|
+
const { container } = render(
|
|
1317
|
+
<I18nProvider locale="en-US">
|
|
1318
|
+
<TooltipProvider>{result}</TooltipProvider>
|
|
1319
|
+
</I18nProvider>,
|
|
1320
|
+
);
|
|
1321
|
+
expect(container.textContent).toContain("FORMATTED");
|
|
1322
|
+
});
|
|
1323
|
+
|
|
1324
|
+
it("should keep the raw string when no column format is set", () => {
|
|
1325
|
+
const mockColumn = createMockColumn();
|
|
1326
|
+
|
|
1327
|
+
const result = renderCellValue({
|
|
1328
|
+
column: mockColumn,
|
|
1329
|
+
renderValue: () => "2024-06-14",
|
|
1330
|
+
getValue: () => "2024-06-14",
|
|
1331
|
+
selectCell: undefined,
|
|
1332
|
+
cellStyles: "",
|
|
1333
|
+
});
|
|
1334
|
+
const { container } = render(
|
|
1335
|
+
<I18nProvider locale="en-US">
|
|
1336
|
+
<TooltipProvider>{result}</TooltipProvider>
|
|
1337
|
+
</I18nProvider>,
|
|
1338
|
+
);
|
|
1339
|
+
expect(container.textContent).toContain("2024-06-14");
|
|
1340
|
+
});
|
|
1271
1341
|
});
|
|
1272
1342
|
|
|
1273
1343
|
test("column_widths sets fixed size and meta.width", () => {
|
|
@@ -97,6 +97,7 @@ export const getFormatters = memoizeLastValue((locale: string) => {
|
|
|
97
97
|
|
|
98
98
|
const dateFormatter = new Intl.DateTimeFormat(locale, {
|
|
99
99
|
dateStyle: "short", // 3/4/2024
|
|
100
|
+
timeZone: "UTC",
|
|
100
101
|
});
|
|
101
102
|
|
|
102
103
|
const dateTimeFormatter = new Intl.DateTimeFormat(locale, {
|
|
@@ -123,6 +124,24 @@ export const getFormatters = memoizeLastValue((locale: string) => {
|
|
|
123
124
|
};
|
|
124
125
|
});
|
|
125
126
|
|
|
127
|
+
const TIMEZONE_SUFFIX = /(?:Z|[+-]\d{2}:?\d{2})$/i;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The date formatters render in UTC. A naive datetime string carries no
|
|
131
|
+
* offset, and `new Date` would read it as local time, so pin it to UTC
|
|
132
|
+
* to keep the wall-clock fields the backend sent.
|
|
133
|
+
*/
|
|
134
|
+
function parseDateAsUTC(value: unknown): Date {
|
|
135
|
+
if (typeof value !== "string") {
|
|
136
|
+
return new Date(value as number | Date);
|
|
137
|
+
}
|
|
138
|
+
const trimmed = value.trim();
|
|
139
|
+
if (TIMEZONE_SUFFIX.test(trimmed) || !trimmed.includes(":")) {
|
|
140
|
+
return new Date(trimmed);
|
|
141
|
+
}
|
|
142
|
+
return new Date(`${trimmed.replace(" ", "T")}Z`);
|
|
143
|
+
}
|
|
144
|
+
|
|
126
145
|
// Apply formatting to a value given a format and data type
|
|
127
146
|
export const applyFormat = (
|
|
128
147
|
value: unknown,
|
|
@@ -152,7 +171,7 @@ export const applyFormat = (
|
|
|
152
171
|
return value;
|
|
153
172
|
case "datetime":
|
|
154
173
|
case "date": {
|
|
155
|
-
const date =
|
|
174
|
+
const date = parseDateAsUTC(value);
|
|
156
175
|
switch (format) {
|
|
157
176
|
case "Date":
|
|
158
177
|
return dateFormatter.format(date);
|
|
@@ -6,14 +6,14 @@ import { Popover as PopoverPrimitive } from "radix-ui";
|
|
|
6
6
|
const PopoverClose = PopoverPrimitive.Close;
|
|
7
7
|
|
|
8
8
|
import type { Column, ColumnDef } from "@tanstack/react-table";
|
|
9
|
-
import {
|
|
9
|
+
import { isValid } from "date-fns";
|
|
10
10
|
import { useRef } from "react";
|
|
11
11
|
import { useLocale, useNumberFormatter } from "react-aria";
|
|
12
12
|
import { WithLocale } from "@/core/i18n/with-locale";
|
|
13
13
|
import type { DataType } from "@/core/kernel/messages";
|
|
14
14
|
import type { CalculateTopKRows } from "@/plugins/impl/DataTablePlugin";
|
|
15
15
|
import { cn } from "@/utils/cn";
|
|
16
|
-
import {
|
|
16
|
+
import { exactDateTime } from "@/utils/dates";
|
|
17
17
|
import { Events } from "@/utils/events";
|
|
18
18
|
import { Logger } from "@/utils/Logger";
|
|
19
19
|
import { Maps } from "@/utils/maps";
|
|
@@ -583,21 +583,19 @@ function renderDate({
|
|
|
583
583
|
value,
|
|
584
584
|
dataType,
|
|
585
585
|
dtype,
|
|
586
|
-
|
|
586
|
+
displayValue,
|
|
587
587
|
locale,
|
|
588
588
|
}: {
|
|
589
589
|
value: Date;
|
|
590
590
|
dataType?: DataType;
|
|
591
591
|
dtype?: string;
|
|
592
|
-
|
|
592
|
+
displayValue?: string;
|
|
593
593
|
locale: string;
|
|
594
594
|
}): React.ReactNode {
|
|
595
595
|
const type = dataType === "date" ? "date" : "datetime";
|
|
596
596
|
const timezone = extractTimezone(dtype);
|
|
597
597
|
|
|
598
|
-
const exactValue =
|
|
599
|
-
? formatDate(value, format)
|
|
600
|
-
: exactDateTime(value, timezone, locale);
|
|
598
|
+
const exactValue = displayValue ?? exactDateTime(value, timezone, locale);
|
|
601
599
|
|
|
602
600
|
return (
|
|
603
601
|
<DatePopover date={value} type={type}>
|
|
@@ -640,7 +638,8 @@ export function renderCellValue<TData, TValue>({
|
|
|
640
638
|
|
|
641
639
|
if (dataType === "datetime" && typeof value === "string") {
|
|
642
640
|
try {
|
|
643
|
-
|
|
641
|
+
const date = new Date(value);
|
|
642
|
+
if (!format || !isValid(date)) {
|
|
644
643
|
return (
|
|
645
644
|
<div onClick={selectCell} className={cellStyles}>
|
|
646
645
|
{value}
|
|
@@ -648,14 +647,15 @@ export function renderCellValue<TData, TValue>({
|
|
|
648
647
|
);
|
|
649
648
|
}
|
|
650
649
|
|
|
651
|
-
const
|
|
652
|
-
const format = getDateFormat(value);
|
|
650
|
+
const displayValue = String(column.applyColumnFormatting(value));
|
|
653
651
|
return (
|
|
654
|
-
<
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
652
|
+
<div onClick={selectCell} className={cellStyles}>
|
|
653
|
+
<WithLocale>
|
|
654
|
+
{(locale) =>
|
|
655
|
+
renderDate({ value: date, dataType, dtype, displayValue, locale })
|
|
656
|
+
}
|
|
657
|
+
</WithLocale>
|
|
658
|
+
</div>
|
|
659
659
|
);
|
|
660
660
|
} catch (error) {
|
|
661
661
|
Logger.error("Error parsing datetime, fallback to string", error);
|
|
@@ -672,10 +672,17 @@ export function renderCellValue<TData, TValue>({
|
|
|
672
672
|
}
|
|
673
673
|
|
|
674
674
|
// e.g. 2010-10-07 17:15:00
|
|
675
|
+
const displayValue = format
|
|
676
|
+
? String(column.applyColumnFormatting(value))
|
|
677
|
+
: undefined;
|
|
675
678
|
return (
|
|
676
|
-
<
|
|
677
|
-
|
|
678
|
-
|
|
679
|
+
<div onClick={selectCell} className={cellStyles}>
|
|
680
|
+
<WithLocale>
|
|
681
|
+
{(locale) =>
|
|
682
|
+
renderDate({ value, dataType, dtype, displayValue, locale })
|
|
683
|
+
}
|
|
684
|
+
</WithLocale>
|
|
685
|
+
</div>
|
|
679
686
|
);
|
|
680
687
|
}
|
|
681
688
|
|