@rebasepro/admin 0.2.5 → 0.4.0
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/{CollectionEditorDialog-Cn8-tGyL.js → CollectionEditorDialog-Bo86h-d-.js} +3 -3
- package/dist/{CollectionEditorDialog-Cn8-tGyL.js.map → CollectionEditorDialog-Bo86h-d-.js.map} +1 -1
- package/dist/{CollectionsStudioView-C-Ts1rZt.js → CollectionsStudioView-bsg4AT_Z.js} +4 -4
- package/dist/{CollectionsStudioView-C-Ts1rZt.js.map → CollectionsStudioView-bsg4AT_Z.js.map} +1 -1
- package/dist/{ExportCollectionAction-BRdKM3DF.js → ExportCollectionAction-Cf-Id5uO.js} +35 -27
- package/dist/ExportCollectionAction-Cf-Id5uO.js.map +1 -0
- package/dist/{ImportCollectionAction-U-v7lGxO.js → ImportCollectionAction-LN5sreK9.js} +2 -2
- package/dist/{ImportCollectionAction-U-v7lGxO.js.map → ImportCollectionAction-LN5sreK9.js.map} +1 -1
- package/dist/{PropertyEditView-BDNYkfNf.js → PropertyEditView-jCWCxmCz.js} +2 -2
- package/dist/{PropertyEditView-BDNYkfNf.js.map → PropertyEditView-jCWCxmCz.js.map} +1 -1
- package/dist/collection_editor_ui.js +3 -3
- package/dist/components/CollectionPanel.d.ts +83 -0
- package/dist/components/EntityDetailView.d.ts +0 -3
- package/dist/components/EntityEditView.d.ts +2 -3
- package/dist/components/SelectableTable/SelectableTable.d.ts +2 -2
- package/dist/components/SelectableTable/SelectableTableContext.d.ts +1 -1
- package/dist/components/SelectableTable/SelectionStore.d.ts +3 -3
- package/dist/components/index.d.ts +1 -0
- package/dist/editor.js +15 -5
- package/dist/editor.js.map +1 -1
- package/dist/{index-DJSL_SCr.js → index-BrqSvMG0.js} +3 -3
- package/dist/index-BrqSvMG0.js.map +1 -0
- package/dist/{index-DHaOV-7A.js → index-Cb0bPnzZ.js} +3 -3
- package/dist/index-Cb0bPnzZ.js.map +1 -0
- package/dist/{index-XMII4H3d.js → index-z3H8iqsj.js} +2 -2
- package/dist/{index-XMII4H3d.js.map → index-z3H8iqsj.js.map} +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +142 -4
- package/dist/index.js.map +1 -1
- package/dist/util/entity_view_constants.d.ts +6 -0
- package/dist/util/resolutions.d.ts +1 -2
- package/dist/{util-0GYaJqL_.js → util-CvNp6A-r.js} +283 -168
- package/dist/util-CvNp6A-r.js.map +1 -0
- package/package.json +8 -8
- package/src/collection_editor/validateCollectionJson.ts +12 -12
- package/src/components/CollectionPanel.tsx +155 -0
- package/src/components/EntityCollectionView/EntityCollectionCardView.tsx +65 -35
- package/src/components/EntityCollectionView/EntityCollectionListView.tsx +1 -1
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +1 -1
- package/src/components/EntityCollectionView/hooks/useCollectionInlineEditor.ts +1 -0
- package/src/components/EntityCollectionView/useEntityPreviewSlots.ts +69 -18
- package/src/components/EntityDetailView.tsx +36 -37
- package/src/components/EntityEditView.tsx +108 -51
- package/src/components/EntityEditViewFormActions.tsx +4 -4
- package/src/components/EntitySidePanel.tsx +47 -14
- package/src/components/PropertyCollectionView.tsx +1 -0
- package/src/components/SelectableTable/SelectableTable.tsx +24 -22
- package/src/components/SelectableTable/SelectableTableContext.tsx +2 -1
- package/src/components/SelectableTable/SelectionStore.ts +4 -4
- package/src/components/index.ts +2 -0
- package/src/data_export/export/BasicExportAction.tsx +11 -9
- package/src/data_export/export/ExportCollectionAction.tsx +15 -13
- package/src/editor/editor.tsx +20 -4
- package/src/form/EntityForm.tsx +3 -3
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +3 -1
- package/src/hooks/navigation/useResolvedCollections.ts +2 -10
- package/src/hooks/useBuildSideEntityController.tsx +20 -3
- package/src/index.ts +4 -2
- package/src/util/entity_view_constants.ts +6 -0
- package/src/util/resolutions.ts +2 -6
- package/dist/ExportCollectionAction-BRdKM3DF.js.map +0 -1
- package/dist/index-DHaOV-7A.js.map +0 -1
- package/dist/index-DJSL_SCr.js.map +0 -1
- package/dist/util-0GYaJqL_.js.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
import React, { useCallback } from "react";
|
|
3
3
|
|
|
4
|
+
import { useTranslation } from "@rebasepro/core";
|
|
4
5
|
import { Entity, Properties } from "@rebasepro/types";
|
|
5
6
|
import {
|
|
6
7
|
BooleanSwitchWithLabel,
|
|
@@ -31,6 +32,7 @@ export function BasicExportAction({
|
|
|
31
32
|
propertiesOrder
|
|
32
33
|
}: BasicExportActionProps) {
|
|
33
34
|
|
|
35
|
+
const { t } = useTranslation();
|
|
34
36
|
const dateRef = React.useRef<Date>(new Date());
|
|
35
37
|
const [flattenArrays, setFlattenArrays] = React.useState<boolean>(true);
|
|
36
38
|
const [exportType, setExportType] = React.useState<"csv" | "json">("csv");
|
|
@@ -78,22 +80,22 @@ export function BasicExportAction({
|
|
|
78
80
|
onOpenChange={setOpen}
|
|
79
81
|
maxWidth={"xl"}>
|
|
80
82
|
|
|
81
|
-
<DialogTitle variant={"h6"}>
|
|
83
|
+
<DialogTitle variant={"h6"}>{t("export_data")}</DialogTitle>
|
|
82
84
|
|
|
83
85
|
<DialogContent className={"flex flex-col gap-4 my-4"}>
|
|
84
86
|
|
|
85
|
-
<div>
|
|
87
|
+
<div>{t("download_table_csv")}</div>
|
|
86
88
|
|
|
87
89
|
<div className={"flex flex-row gap-4"}>
|
|
88
90
|
<div className={"p-4 flex flex-col"}>
|
|
89
91
|
<RadioGroup value={exportType} onValueChange={(v) => setExportType(v as "csv" | "json")}>
|
|
90
92
|
<div className="flex items-center gap-2">
|
|
91
93
|
<RadioGroupItem value="csv" id="radio-csv"/>
|
|
92
|
-
<Label htmlFor="radio-csv">
|
|
94
|
+
<Label htmlFor="radio-csv">{t("csv")}</Label>
|
|
93
95
|
</div>
|
|
94
96
|
<div className="flex items-center gap-2">
|
|
95
97
|
<RadioGroupItem value="json" id="radio-json"/>
|
|
96
|
-
<Label htmlFor="radio-json">
|
|
98
|
+
<Label htmlFor="radio-json">{t("json")}</Label>
|
|
97
99
|
</div>
|
|
98
100
|
</RadioGroup>
|
|
99
101
|
</div>
|
|
@@ -102,11 +104,11 @@ export function BasicExportAction({
|
|
|
102
104
|
<RadioGroup value={dateExportType} onValueChange={(v) => setDateExportType(v as "timestamp" | "string")}>
|
|
103
105
|
<div className="flex items-center gap-2">
|
|
104
106
|
<RadioGroupItem value="timestamp" id="radio-timestamp"/>
|
|
105
|
-
<Label htmlFor="radio-timestamp">
|
|
107
|
+
<Label htmlFor="radio-timestamp">{t("dates_as_timestamps")} ({dateRef.current.getTime()})</Label>
|
|
106
108
|
</div>
|
|
107
109
|
<div className="flex items-center gap-2">
|
|
108
110
|
<RadioGroupItem value="string" id="radio-string"/>
|
|
109
|
-
<Label htmlFor="radio-string">
|
|
111
|
+
<Label htmlFor="radio-string">{t("dates_as_strings")} ({dateRef.current.toISOString()})</Label>
|
|
110
112
|
</div>
|
|
111
113
|
</RadioGroup>
|
|
112
114
|
</div>
|
|
@@ -117,7 +119,7 @@ export function BasicExportAction({
|
|
|
117
119
|
disabled={exportType !== "csv"}
|
|
118
120
|
value={flattenArrays}
|
|
119
121
|
onValueChange={setFlattenArrays}
|
|
120
|
-
label={"
|
|
122
|
+
label={t("flatten_arrays")}/>
|
|
121
123
|
|
|
122
124
|
</DialogContent>
|
|
123
125
|
|
|
@@ -125,11 +127,11 @@ export function BasicExportAction({
|
|
|
125
127
|
|
|
126
128
|
<Button onClick={handleClose}
|
|
127
129
|
variant={"text"}>
|
|
128
|
-
|
|
130
|
+
{t("cancel")}
|
|
129
131
|
</Button>
|
|
130
132
|
|
|
131
133
|
<Button onClick={onOkClicked}>
|
|
132
|
-
|
|
134
|
+
{t("download")}
|
|
133
135
|
</Button>
|
|
134
136
|
|
|
135
137
|
</DialogActions>
|
|
@@ -4,7 +4,8 @@ import React, { useCallback } from "react";
|
|
|
4
4
|
import {
|
|
5
5
|
useAuthController,
|
|
6
6
|
useCustomizationController,
|
|
7
|
-
useData
|
|
7
|
+
useData,
|
|
8
|
+
useTranslation
|
|
8
9
|
} from "@rebasepro/core";
|
|
9
10
|
import { useCMSContext } from "../../hooks";
|
|
10
11
|
import { CollectionActionsProps, Entity, EntityCollection, ExportConfig, RebaseContext, User } from "@rebasepro/types";
|
|
@@ -43,6 +44,8 @@ export function ExportCollectionAction<M extends Record<string, unknown>, USER e
|
|
|
43
44
|
onAnalyticsEvent?: (event: string, params?: any) => void;
|
|
44
45
|
}) {
|
|
45
46
|
|
|
47
|
+
const { t } = useTranslation();
|
|
48
|
+
|
|
46
49
|
const exportConfig = typeof collection.exportable === "object" ? collection.exportable : undefined;
|
|
47
50
|
|
|
48
51
|
const dateRef = React.useRef<Date>(new Date());
|
|
@@ -184,17 +187,16 @@ export function ExportCollectionAction<M extends Record<string, unknown>, USER e
|
|
|
184
187
|
onOpenChange={setOpen}
|
|
185
188
|
maxWidth={"xl"}>
|
|
186
189
|
|
|
187
|
-
<DialogTitle variant={"h6"}>
|
|
190
|
+
<DialogTitle variant={"h6"}>{t("export_data")}</DialogTitle>
|
|
188
191
|
|
|
189
192
|
<DialogContent className={"flex flex-col gap-4 my-4"}>
|
|
190
193
|
|
|
191
|
-
<div>
|
|
194
|
+
<div>{t("download_table_csv")}</div>
|
|
192
195
|
|
|
193
196
|
{collectionEntitiesCount !== undefined && collectionEntitiesCount > DOCS_LIMIT &&
|
|
194
197
|
<Alert color={"warning"}>
|
|
195
198
|
<div>
|
|
196
|
-
|
|
197
|
-
of documents ({collectionEntitiesCount}).
|
|
199
|
+
{t("large_number_of_documents", { count: collectionEntitiesCount.toString() })}
|
|
198
200
|
</div>
|
|
199
201
|
</Alert>}
|
|
200
202
|
|
|
@@ -203,11 +205,11 @@ export function ExportCollectionAction<M extends Record<string, unknown>, USER e
|
|
|
203
205
|
<RadioGroup value={exportType} onValueChange={(v) => setExportType(v as "csv" | "json")}>
|
|
204
206
|
<div className="flex items-center gap-2">
|
|
205
207
|
<RadioGroupItem value="csv" id="radio-csv"/>
|
|
206
|
-
<Label htmlFor="radio-csv">
|
|
208
|
+
<Label htmlFor="radio-csv">{t("csv")}</Label>
|
|
207
209
|
</div>
|
|
208
210
|
<div className="flex items-center gap-2">
|
|
209
211
|
<RadioGroupItem value="json" id="radio-json"/>
|
|
210
|
-
<Label htmlFor="radio-json">
|
|
212
|
+
<Label htmlFor="radio-json">{t("json")}</Label>
|
|
211
213
|
</div>
|
|
212
214
|
</RadioGroup>
|
|
213
215
|
</div>
|
|
@@ -216,11 +218,11 @@ export function ExportCollectionAction<M extends Record<string, unknown>, USER e
|
|
|
216
218
|
<RadioGroup value={dateExportType} onValueChange={(v) => setDateExportType(v as "timestamp" | "string")}>
|
|
217
219
|
<div className="flex items-center gap-2">
|
|
218
220
|
<RadioGroupItem value="timestamp" id="radio-timestamp"/>
|
|
219
|
-
<Label htmlFor="radio-timestamp">
|
|
221
|
+
<Label htmlFor="radio-timestamp">{t("dates_as_timestamps")} ({dateRef.current.getTime()})</Label>
|
|
220
222
|
</div>
|
|
221
223
|
<div className="flex items-center gap-2">
|
|
222
224
|
<RadioGroupItem value="string" id="radio-string"/>
|
|
223
|
-
<Label htmlFor="radio-string">
|
|
225
|
+
<Label htmlFor="radio-string">{t("dates_as_strings")} ({dateRef.current.toISOString()})</Label>
|
|
224
226
|
</div>
|
|
225
227
|
</RadioGroup>
|
|
226
228
|
</div>
|
|
@@ -231,13 +233,13 @@ export function ExportCollectionAction<M extends Record<string, unknown>, USER e
|
|
|
231
233
|
disabled={exportType !== "csv"}
|
|
232
234
|
value={flattenArrays}
|
|
233
235
|
onValueChange={setFlattenArrays}
|
|
234
|
-
label={"
|
|
236
|
+
label={t("flatten_arrays")}/>
|
|
235
237
|
|
|
236
238
|
<BooleanSwitchWithLabel
|
|
237
239
|
size={"small"}
|
|
238
240
|
value={includeUndefinedValues}
|
|
239
241
|
onValueChange={setIncludeUndefinedValues}
|
|
240
|
-
label={"
|
|
242
|
+
label={t("include_undefined_values")}/>
|
|
241
243
|
|
|
242
244
|
{!canExport && notAllowedView}
|
|
243
245
|
|
|
@@ -249,12 +251,12 @@ export function ExportCollectionAction<M extends Record<string, unknown>, USER e
|
|
|
249
251
|
|
|
250
252
|
<Button onClick={handleClose}
|
|
251
253
|
variant={"text"}>
|
|
252
|
-
|
|
254
|
+
{t("cancel")}
|
|
253
255
|
</Button>
|
|
254
256
|
|
|
255
257
|
<Button onClick={onOkClicked}
|
|
256
258
|
disabled={dataLoading || !canExport}>
|
|
257
|
-
|
|
259
|
+
{t("download")}
|
|
258
260
|
</Button>
|
|
259
261
|
|
|
260
262
|
</DialogActions>
|
package/src/editor/editor.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import React, { useEffect, useState, useRef, useMemo } from "react";
|
|
3
|
-
import { EditorState } from "prosemirror-state";
|
|
3
|
+
import { EditorState, Selection } from "prosemirror-state";
|
|
4
4
|
import { cls, defaultBorderMixin, Separator, useInjectStyles, TextareaAutosize } from "@rebasepro/ui";
|
|
5
5
|
import { useTranslation } from "@rebasepro/core";
|
|
6
6
|
import { EditorBubble, ImageBubble, SlashCommandMenu, TableBubble, type JSONContent } from "./components";
|
|
@@ -236,7 +236,7 @@ onJsonContentChange };
|
|
|
236
236
|
|
|
237
237
|
|
|
238
238
|
return (
|
|
239
|
-
<div className="relative min-h-[200px] w-full">
|
|
239
|
+
<div className="relative min-h-[200px] w-full flex flex-col">
|
|
240
240
|
<button
|
|
241
241
|
type="button"
|
|
242
242
|
onClick={handleToggleMarkdown}
|
|
@@ -249,10 +249,23 @@ onJsonContentChange };
|
|
|
249
249
|
<ProseMirrorContext.Provider value={useMemo(() => ({ state,
|
|
250
250
|
view }), [state, view])}>
|
|
251
251
|
|
|
252
|
-
<div style={{ display: isMarkdownMode ? "none" : "
|
|
252
|
+
<div style={{ display: isMarkdownMode ? "none" : "flex" }} className="flex-1 flex flex-col">
|
|
253
253
|
<div
|
|
254
254
|
ref={editorRef}
|
|
255
|
-
|
|
255
|
+
onClick={(e) => {
|
|
256
|
+
// If the click landed on the wrapper padding (not on the ProseMirror
|
|
257
|
+
// content), focus the editor and place the cursor at the nearest position.
|
|
258
|
+
if (view && e.target === e.currentTarget) {
|
|
259
|
+
view.focus();
|
|
260
|
+
// Place cursor at end of the document
|
|
261
|
+
const end = view.state.doc.content.size;
|
|
262
|
+
const tr = view.state.tr.setSelection(
|
|
263
|
+
Selection.near(view.state.doc.resolve(end), -1)
|
|
264
|
+
);
|
|
265
|
+
view.dispatch(tr);
|
|
266
|
+
}
|
|
267
|
+
}}
|
|
268
|
+
className={cls("relative prose dark:prose-invert cursor-text flex-1", proseClass, "prose-headings:font-title prose-headings:font-normal prose-strong:font-semibold prose-code:font-normal prose-blockquote:font-normal prose-a:font-normal font-default focus:outline-none max-w-full py-4")}
|
|
256
269
|
/>
|
|
257
270
|
|
|
258
271
|
{view && (
|
|
@@ -311,6 +324,9 @@ view }), [state, view])}>
|
|
|
311
324
|
const cssStyles = `
|
|
312
325
|
.ProseMirror {
|
|
313
326
|
box-shadow: none !important;
|
|
327
|
+
padding-left: 2rem;
|
|
328
|
+
padding-right: 2rem;
|
|
329
|
+
min-height: 100%;
|
|
314
330
|
}
|
|
315
331
|
.ProseMirror .is-editor-empty:first-child::before {
|
|
316
332
|
content: attr(data-placeholder);
|
package/src/form/EntityForm.tsx
CHANGED
|
@@ -311,7 +311,7 @@ export function EntityForm<M extends Record<string, unknown>>({
|
|
|
311
311
|
}
|
|
312
312
|
}
|
|
313
313
|
},
|
|
314
|
-
validation: async (values) => {
|
|
314
|
+
validation: async (values): Promise<Record<string, string>> => {
|
|
315
315
|
if (!validationSchema) return {};
|
|
316
316
|
const result = await validationSchema.safeParseAsync(values);
|
|
317
317
|
if (result.success) return {};
|
|
@@ -737,14 +737,14 @@ export function EntityForm<M extends Record<string, unknown>>({
|
|
|
737
737
|
entity={entity}
|
|
738
738
|
layout={forceActionsAtTheBottom ? "bottom" : "responsive"}
|
|
739
739
|
savingError={savingError}
|
|
740
|
-
formex={formex as
|
|
740
|
+
formex={formex as FormexController<Record<string, unknown>>}
|
|
741
741
|
disabled={actionsDisabled}
|
|
742
742
|
status={status}
|
|
743
743
|
pluginActions={pluginFormActions ?? []}
|
|
744
744
|
openEntityMode={openEntityMode}
|
|
745
745
|
showDefaultActions={showDefaultActions}
|
|
746
746
|
navigateBack={navigateBack}
|
|
747
|
-
formContext={formContext as
|
|
747
|
+
formContext={formContext as FormContext<Record<string, unknown>>}
|
|
748
748
|
/>;
|
|
749
749
|
|
|
750
750
|
return (
|
|
@@ -32,6 +32,8 @@ export function ReadOnlyFieldBinding({
|
|
|
32
32
|
// if (!context.entityId)
|
|
33
33
|
// throw new Error("ReadOnlyFieldBinding: Entity id is null");
|
|
34
34
|
|
|
35
|
+
const skipCardWrapper = property.type === "relation" || property.type === "reference";
|
|
36
|
+
|
|
35
37
|
return (
|
|
36
38
|
|
|
37
39
|
<>
|
|
@@ -45,7 +47,7 @@ export function ReadOnlyFieldBinding({
|
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
<div
|
|
48
|
-
className={cls(paperMixin, "w-full min-h-14
|
|
50
|
+
className={cls(!skipCardWrapper && paperMixin, "w-full min-h-14 overflow-x-scroll no-scrollbar", !skipCardWrapper && "p-4 md:p-6")}>
|
|
49
51
|
|
|
50
52
|
<ErrorBoundary>
|
|
51
53
|
<PropertyPreview propertyKey={propertyKey}
|
|
@@ -3,7 +3,7 @@ import { useCallback, useEffect, useRef, useState, useMemo } from "react";
|
|
|
3
3
|
|
|
4
4
|
import { AuthController, CollectionRegistryController, RebaseData, User } from "@rebasepro/types";
|
|
5
5
|
import type { EntityCollectionsBuilder } from "@rebasepro/types";
|
|
6
|
-
import { CollectionRegistry
|
|
6
|
+
import { CollectionRegistry } from "@rebasepro/common";
|
|
7
7
|
import { UserManagementDelegate } from "@rebasepro/types";
|
|
8
8
|
|
|
9
9
|
import { resolveCollections } from "./useNavigationResolution";
|
|
@@ -95,15 +95,7 @@ export function useResolvedCollections<EC extends EntityCollection, USER extends
|
|
|
95
95
|
|
|
96
96
|
if (cancelled) return;
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
// Map keyed by slug — last-write-wins, so developer collections overwrite defaults.
|
|
100
|
-
const defaults: EntityCollection[] = [];
|
|
101
|
-
if (userManagementRef.current) {
|
|
102
|
-
defaults.push(defaultUsersCollection);
|
|
103
|
-
}
|
|
104
|
-
const deduped = Array.from(
|
|
105
|
-
new Map([...defaults, ...resolved].map(c => [c.slug, c])).values()
|
|
106
|
-
);
|
|
98
|
+
const deduped = [...resolved];
|
|
107
99
|
|
|
108
100
|
// Register with the CollectionRegistry; returns true if changed
|
|
109
101
|
const changed = collectionRegistryController.collectionRegistryRef.current.registerMultiple(deduped);
|
|
@@ -26,7 +26,7 @@ export function getEntityViewWidth(props: EntitySidePanelProps<any>, small: bool
|
|
|
26
26
|
selectedSecondaryForm
|
|
27
27
|
} = resolvedSelectedEntityView(props.collection?.entityViews, customizationController, props.selectedTab);
|
|
28
28
|
|
|
29
|
-
const shouldUseSmallLayout = !props.selectedTab || props.selectedTab === JSON_TAB_VALUE || props.selectedTab === HISTORY_TAB_VALUE || Boolean(selectedSecondaryForm);
|
|
29
|
+
const shouldUseSmallLayout = !props.selectedTab || props.selectedTab === "edit" || props.selectedTab === JSON_TAB_VALUE || props.selectedTab === HISTORY_TAB_VALUE || Boolean(selectedSecondaryForm);
|
|
30
30
|
|
|
31
31
|
let resolvedWidth: string | undefined;
|
|
32
32
|
if (props.width) {
|
|
@@ -187,8 +187,8 @@ width: newWidth };
|
|
|
187
187
|
|
|
188
188
|
sideDialogsController.open(
|
|
189
189
|
propsToSidePanel({
|
|
190
|
-
|
|
191
|
-
|
|
190
|
+
...props,
|
|
191
|
+
selectedTab: props.selectedTab ?? defaultSelectedView,
|
|
192
192
|
},
|
|
193
193
|
urlController.buildUrlCollectionPath,
|
|
194
194
|
urlController.resolveDatabasePathsFrom,
|
|
@@ -241,6 +241,7 @@ export function buildSidePanelsFromUrl(path: string, collections: EntityCollecti
|
|
|
241
241
|
path: navigationEntry.slug,
|
|
242
242
|
entityId: navigationEntry.entityId,
|
|
243
243
|
copy: false,
|
|
244
|
+
collection: navigationEntry.parentCollection,
|
|
244
245
|
width: navigationEntry.parentCollection?.sideDialogWidth
|
|
245
246
|
};
|
|
246
247
|
} else if (navigationEntry.type === "custom_view") {
|
|
@@ -257,6 +258,22 @@ export function buildSidePanelsFromUrl(path: string, collections: EntityCollecti
|
|
|
257
258
|
|
|
258
259
|
}
|
|
259
260
|
|
|
261
|
+
// When the URL doesn't contain a tab segment but the collection has a
|
|
262
|
+
// defaultSelectedView, resolve it so the panel opens with the correct
|
|
263
|
+
// width and the URL is updated on the next replace() cycle.
|
|
264
|
+
if (sidePanel && !sidePanel.selectedTab && sidePanel.collection) {
|
|
265
|
+
const defaultView = resolveDefaultSelectedView(
|
|
266
|
+
sidePanel.collection.defaultSelectedView,
|
|
267
|
+
{
|
|
268
|
+
status: sidePanel.copy ? "copy" : (sidePanel.entityId ? "existing" : "new"),
|
|
269
|
+
entityId: sidePanel.entityId
|
|
270
|
+
}
|
|
271
|
+
);
|
|
272
|
+
if (defaultView) {
|
|
273
|
+
sidePanel.selectedTab = defaultView;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
260
277
|
if (newFlag) {
|
|
261
278
|
sidePanel = {
|
|
262
279
|
path: lastCollectionPath,
|
package/src/index.ts
CHANGED
|
@@ -53,12 +53,14 @@ export {
|
|
|
53
53
|
RebaseLayout,
|
|
54
54
|
RebaseRouteDefs,
|
|
55
55
|
SideDialogs,
|
|
56
|
-
useApp
|
|
56
|
+
useApp,
|
|
57
|
+
CollectionPanel
|
|
57
58
|
} from "./components";
|
|
58
59
|
export type {
|
|
59
60
|
EntityViewProps,
|
|
60
61
|
EntitySelectionProps,
|
|
61
|
-
SelectableTableProps
|
|
62
|
+
SelectableTableProps,
|
|
63
|
+
CollectionPanelProps
|
|
62
64
|
} from "./components";
|
|
63
65
|
|
|
64
66
|
export * from "./hooks";
|
package/src/util/resolutions.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { HistoryIcon } from "@rebasepro/ui";
|
|
2
|
-
import React
|
|
3
|
-
import type {
|
|
4
|
-
import type { CustomizationController, EntityAction } from "@rebasepro/types";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import type { CustomizationController, EntityAction, EntityCustomView } from "@rebasepro/types";
|
|
5
4
|
|
|
6
|
-
// Lazy-load: only resolved when HistoryIcon tab is visited
|
|
7
|
-
const EntityHistoryView = lazy(() => import("../components/history").then(m => ({ default: m.EntityHistoryView })));
|
|
8
5
|
/**
|
|
9
6
|
* Built-in entity views that are resolved by token name.
|
|
10
7
|
* These are always available without needing to be registered
|
|
@@ -15,7 +12,6 @@ const BUILTIN_ENTITY_VIEWS: Record<string, EntityCustomView> = {
|
|
|
15
12
|
key: "__rebase_history",
|
|
16
13
|
name: "History",
|
|
17
14
|
tabComponent: React.createElement(HistoryIcon, { size: 20 }),
|
|
18
|
-
Builder: EntityHistoryView,
|
|
19
15
|
position: "end"
|
|
20
16
|
}
|
|
21
17
|
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ExportCollectionAction-BRdKM3DF.js","sources":["../src/data_export/export/export.ts","../src/data_export/export/BasicExportAction.tsx","../src/data_export/export/ExportCollectionAction.tsx"],"sourcesContent":["import { Entity, EntityReference, Properties, Property } from \"@rebasepro/types\";\nimport { type ArrayValuesCount, getArrayValuesCount, getValueInPath } from \"@rebasepro/utils\";\n\ninterface Header {\n key: string;\n label: string;\n}\n\nexport interface DownloadEntitiesExportParams<M extends Record<string, unknown>> {\n data: Entity<M>[];\n additionalData: Record<string, unknown>[] | undefined;\n properties: Properties;\n propertiesOrder: string[] | undefined;\n name: string;\n flattenArrays: boolean;\n additionalHeaders: string[] | undefined;\n exportType: \"csv\" | \"json\";\n dateExportType: \"timestamp\" | \"string\";\n}\n\nexport function downloadEntitiesExport<M extends Record<string, unknown>>({\n data,\n additionalData,\n properties,\n propertiesOrder,\n name,\n flattenArrays,\n additionalHeaders,\n exportType,\n dateExportType\n}: DownloadEntitiesExportParams<M>\n) {\n\n console.debug(\"Downloading export\", {\n dataLength: data.length,\n properties,\n exportType,\n dateExportType\n });\n\n if (exportType === \"csv\") {\n const arrayValuesCount = flattenArrays ? getArrayValuesCount(data.map(d => d.values)) : {};\n const headers = getExportHeaders(properties, propertiesOrder, additionalHeaders, arrayValuesCount);\n const exportableData = getEntityCSVExportableData(data, additionalData, properties, headers, dateExportType);\n const headersData = entryToCSVRow(headers.map(h => h.label));\n const csvData = exportableData.map(entry => entryToCSVRow(entry));\n downloadBlob([headersData, ...csvData], `${name}.csv`, \"text/csv\");\n } else {\n const exportableData = getEntityJsonExportableData(data, additionalData, properties, dateExportType);\n const json = JSON.stringify(exportableData, null, 2);\n downloadBlob([json], `${name}.json`, \"application/json\");\n }\n}\n\nexport function getEntityCSVExportableData(data: Entity<Record<string, unknown>>[],\n additionalData: Record<string, unknown>[] | undefined,\n properties: Properties,\n headers: Header[],\n dateExportType: \"timestamp\" | \"string\"\n) {\n\n const mergedData: Record<string, unknown>[] = data.map(e => ({\n id: e.id,\n ...processValuesForExport(e.values, properties, \"csv\", dateExportType)\n }));\n\n if (additionalData) {\n additionalData.forEach((additional, index) => {\n mergedData[index] = { ...mergedData[index],\n...additional };\n });\n }\n\n return mergedData && mergedData.map((entry) => {\n return headers.map((header) => getValueInPath(entry, header.key));\n });\n}\n\nexport function getEntityJsonExportableData(data: Entity<Record<string, unknown>>[],\n additionalData: Record<string, unknown>[] | undefined,\n properties: Properties,\n dateExportType: \"timestamp\" | \"string\"\n) {\n\n const mergedData: Record<string, unknown>[] = data.map(e => ({\n id: e.id,\n ...processValuesForExport(e.values, properties, \"json\", dateExportType)\n }));\n\n if (additionalData) {\n additionalData.forEach((additional, index) => {\n mergedData[index] = { ...mergedData[index],\n...additional };\n });\n }\n\n return mergedData;\n}\n\nfunction getExportHeaders<M extends Record<string, unknown>>(properties: Properties,\n propertiesOrder: string[] | undefined,\n additionalHeaders: string[] | undefined,\n arrayValuesCount?: ArrayValuesCount): Header[] {\n\n const headers: Header[] = [\n {\n label: \"id\",\n key: \"id\"\n },\n ...(propertiesOrder ?? Object.keys(properties))\n .flatMap((childKey) => {\n const property = properties[childKey];\n if (!property) {\n console.warn(\"Property not found\", childKey, properties);\n return [];\n }\n if (arrayValuesCount && arrayValuesCount[childKey] > 1) {\n return Array.from({ length: arrayValuesCount[childKey] },\n (_, i) => getHeaders(property as Property, `${childKey}[${i}]`, \"\"))\n .flat();\n } else {\n return getHeaders(property as Property, childKey, \"\");\n }\n })\n ];\n\n if (additionalHeaders) {\n headers.push(...additionalHeaders.map(h => ({\n label: h,\n key: h\n })));\n }\n\n return headers;\n}\n\n/**\n * Get headers for property. There could be more than one header per property\n * @param property\n * @param propertyKey\n * @param prefix\n */\nfunction getHeaders(property: Property, propertyKey: string, prefix = \"\"): Header[] {\n const currentKey = prefix ? `${prefix}.${propertyKey}` : propertyKey;\n if (property.type === \"map\" && property.properties) {\n return Object.entries(property.properties)\n .map(([childKey, p]) => getHeaders(p, childKey, currentKey))\n .flat();\n } else {\n return [{\n label: currentKey,\n key: currentKey\n }];\n }\n}\n\nfunction processValueForExport(inputValue: unknown,\n property: Property,\n exportType: \"csv\" | \"json\",\n dateExportType: \"timestamp\" | \"string\"\n): unknown {\n\n let value: unknown;\n if (property.type === \"map\" && property.properties) {\n value = processValuesForExport(inputValue as Record<string, unknown>, property.properties as Properties, exportType, dateExportType);\n } else if (property.type === \"array\") {\n if (property.of && Array.isArray(inputValue)) {\n if (Array.isArray(property.of)) {\n value = property.of.map((p, i) => processValueForExport(inputValue[i], p, exportType, dateExportType));\n } else if (property.of.type === \"map\") {\n value = exportType === \"csv\"\n ? inputValue.map((e) => JSON.stringify(e))\n : inputValue.map((e) => processValueForExport(e, property.of as Property, exportType, dateExportType));\n ;\n } else {\n value = inputValue.map((e) => processValueForExport(e, property.of as Property, exportType, dateExportType));\n }\n } else {\n value = inputValue;\n }\n } else if (property.type === \"reference\" && inputValue && typeof inputValue === \"object\" && \"isEntityReference\" in inputValue && typeof (inputValue as EntityReference).isEntityReference === \"function\" && (inputValue as EntityReference).isEntityReference()) {\n const ref = inputValue ? inputValue as EntityReference : undefined;\n value = ref ? ref.fullPath : null;\n } else if (property.type === \"date\" && inputValue instanceof Date) {\n value = inputValue ? (dateExportType === \"timestamp\" ? inputValue.getTime() : inputValue.toISOString()) : null;\n } else {\n value = inputValue;\n }\n\n return value;\n}\n\nfunction processValuesForExport<M extends Record<string, unknown>>\n (inputValues: Record<string, unknown>,\n properties: Properties,\n exportType: \"csv\" | \"json\",\n dateExportType: \"timestamp\" | \"string\"\n ): Record<string, unknown> {\n const updatedValues = Object.entries(properties)\n .map(([key, property]) => {\n const inputValue = inputValues && (inputValues)[key];\n const updatedValue = processValueForExport(inputValue, property as Property, exportType, dateExportType);\n if (updatedValue === undefined) return {};\n return ({ [key]: updatedValue });\n })\n .reduce((a, b) => ({ ...a,\n...b }), {}) as Record<string, unknown>;\n return { ...inputValues,\n...updatedValues };\n}\n\nfunction entryToCSVRow(entry: unknown[]) {\n return entry\n .map((v: unknown) => {\n if (v === null || v === undefined) return \"\";\n if (Array.isArray(v))\n return \"\\\"\" + JSON.stringify(v).replaceAll(\"\\\"\", \"\\\"\\\"\") + \"\\\"\";\n const s = String(v);\n return \"\\\"\" + s.replaceAll(\"\\\"\", \"\\\"\\\"\") + \"\\\"\";\n })\n .join(\",\") + \"\\r\\n\";\n}\n\nexport function downloadBlob(content: BlobPart[], filename: string, contentType: string) {\n const blob = new Blob(content, { type: contentType });\n const url = URL.createObjectURL(blob);\n const pom = document.createElement(\"a\");\n pom.href = url;\n pom.setAttribute(\"download\", filename);\n pom.click();\n}\n\nexport function downloadDataAsCsv(data: object[], name: string) {\n if (data.length === 0) return;\n\n const headers = Object.keys(data[0]);\n const csvContent = [\n headers.join(\",\"),\n ...data.map(row => headers.map(header => {\n const value = (row as Record<string, unknown>)[header];\n if (value === null || value === undefined) return \"\";\n if (Array.isArray(value)) return `\"${JSON.stringify(value).replace(/\"/g, '\"\"')}\"`;\n return `\"${String(value).replace(/\"/g, '\"\"')}\"`;\n }).join(\",\"))\n ].join(\"\\r\\n\");\n\n downloadBlob([csvContent], `${name}.csv`, \"text/csv\");\n}\n","\nimport React, { useCallback } from \"react\";\n\nimport { Entity, Properties } from \"@rebasepro/types\";\nimport {\n BooleanSwitchWithLabel,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n DownloadIcon,\n IconButton,\n Label,\n RadioGroup,\n RadioGroupItem,\n Tooltip,\n Typography\n} from \"@rebasepro/ui\";\nimport { downloadEntitiesExport } from \"./export\";\n\nexport type BasicExportActionProps = {\n data: Entity<any>[];\n properties: Properties;\n propertiesOrder?: string[];\n}\n\nexport function BasicExportAction({\n data,\n properties,\n propertiesOrder\n}: BasicExportActionProps) {\n\n const dateRef = React.useRef<Date>(new Date());\n const [flattenArrays, setFlattenArrays] = React.useState<boolean>(true);\n const [exportType, setExportType] = React.useState<\"csv\" | \"json\">(\"csv\");\n const [dateExportType, setDateExportType] = React.useState<\"timestamp\" | \"string\">(\"string\");\n\n const [open, setOpen] = React.useState(false);\n\n const handleClickOpen = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onOkClicked = useCallback(() => {\n downloadEntitiesExport({\n data,\n additionalData: [],\n properties,\n propertiesOrder,\n name: \"export.csv\",\n flattenArrays,\n additionalHeaders: [],\n exportType,\n dateExportType\n });\n handleClose();\n }, []);\n\n return <>\n\n <Tooltip title={\"Export\"}\n asChild={true}>\n <IconButton\n size={\"small\"}\n color={\"primary\"} onClick={handleClickOpen}>\n <DownloadIcon\n size={\"small\"}/>\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onOpenChange={setOpen}\n maxWidth={\"xl\"}>\n\n <DialogTitle variant={\"h6\"}>Export data</DialogTitle>\n\n <DialogContent className={\"flex flex-col gap-4 my-4\"}>\n\n <div>DownloadIcon the the content of this table as a CSV</div>\n\n <div className={\"flex flex-row gap-4\"}>\n <div className={\"p-4 flex flex-col\"}>\n <RadioGroup value={exportType} onValueChange={(v) => setExportType(v as \"csv\" | \"json\")}>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"csv\" id=\"radio-csv\"/>\n <Label htmlFor=\"radio-csv\">CSV</Label>\n </div>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"json\" id=\"radio-json\"/>\n <Label htmlFor=\"radio-json\">JSON</Label>\n </div>\n </RadioGroup>\n </div>\n\n <div className={\"p-4 flex flex-col\"}>\n <RadioGroup value={dateExportType} onValueChange={(v) => setDateExportType(v as \"timestamp\" | \"string\")}>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"timestamp\" id=\"radio-timestamp\"/>\n <Label htmlFor=\"radio-timestamp\">Dates as timestamps ({dateRef.current.getTime()})</Label>\n </div>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"string\" id=\"radio-string\"/>\n <Label htmlFor=\"radio-string\">Dates as strings ({dateRef.current.toISOString()})</Label>\n </div>\n </RadioGroup>\n </div>\n </div>\n\n <BooleanSwitchWithLabel\n size={\"small\"}\n disabled={exportType !== \"csv\"}\n value={flattenArrays}\n onValueChange={setFlattenArrays}\n label={\"Flatten arrays\"}/>\n\n </DialogContent>\n\n <DialogActions>\n\n <Button onClick={handleClose}\n variant={\"text\"}>\n Cancel\n </Button>\n\n <Button onClick={onOkClicked}>\n DownloadIcon\n </Button>\n\n </DialogActions>\n\n </Dialog>\n\n </>;\n}\n","\nimport React, { useCallback } from \"react\";\n\nimport {\n useAuthController,\n useCustomizationController,\n useData\n} from \"@rebasepro/core\";\nimport { useCMSContext } from \"../../hooks\";\nimport { CollectionActionsProps, Entity, EntityCollection, ExportConfig, RebaseContext, User } from \"@rebasepro/types\";\nimport { getDefaultValuesFor } from \"@rebasepro/common\";\nimport {\n Alert,\n BooleanSwitchWithLabel,\n Button,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n DownloadIcon,\n IconButton,\n iconSize,\n Label,\n RadioGroup,\n RadioGroupItem,\n Tooltip\n} from \"@rebasepro/ui\";\nimport { downloadEntitiesExport } from \"./export\";\n\nconst DOCS_LIMIT = 500;\n\nexport function ExportCollectionAction<M extends Record<string, unknown>, USER extends User>({\n collection,\n path,\n collectionEntitiesCount,\n onAnalyticsEvent,\n exportAllowed,\n notAllowedView\n}: CollectionActionsProps<M, USER, EntityCollection<M>> & {\n exportAllowed?: (props: { collectionEntitiesCount: number, path: string, collection: EntityCollection }) => boolean;\n notAllowedView?: React.ReactNode;\n onAnalyticsEvent?: (event: string, params?: any) => void;\n}) {\n\n const exportConfig = typeof collection.exportable === \"object\" ? collection.exportable : undefined;\n\n const dateRef = React.useRef<Date>(new Date());\n\n const [includeUndefinedValues, setIncludeUndefinedValues] = React.useState<boolean>(false);\n const [flattenArrays, setFlattenArrays] = React.useState<boolean>(true);\n const [exportType, setExportType] = React.useState<\"csv\" | \"json\">(\"csv\");\n const [dateExportType, setDateExportType] = React.useState<\"timestamp\" | \"string\">(\"string\");\n\n const context = useCMSContext<USER>();\n const dataClient = useData();\n\n const canExport = !exportAllowed || exportAllowed({\n collectionEntitiesCount: collectionEntitiesCount ?? 0,\n path,\n collection\n });\n\n const [dataLoading, setDataLoading] = React.useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = React.useState<Error | undefined>();\n\n const [open, setOpen] = React.useState(false);\n\n const handleClickOpen = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const fetchAdditionalFields = useCallback(async (entities: Entity<M>[]) => {\n\n const additionalExportFields = exportConfig?.additionalFields;\n const additionalFields = collection.additionalFields;\n\n const resolvedExportColumnsValues: Record<string, any>[] = additionalExportFields\n ? await Promise.all(entities.map(async (entity) => {\n return (await Promise.all(additionalExportFields.map(async (column) => {\n return {\n [column.key]: await column.builder({\n entity,\n context: context as RebaseContext\n })\n };\n }))).reduce((a, b) => ({ ...a,\n...b }), {});\n }))\n : [];\n\n const resolvedColumnsValues: Record<string, any>[] = additionalFields\n ? await Promise.all(entities.map(async (entity) => {\n return (await Promise.all(additionalFields\n .map(async (field) => {\n if (!field.value)\n return {};\n return {\n [field.key]: await field.value({\n entity,\n context: context as RebaseContext\n })\n };\n }))).reduce((a, b) => ({ ...a,\n...b }), {});\n }))\n : [];\n return [...resolvedExportColumnsValues, ...resolvedColumnsValues];\n }, [exportConfig?.additionalFields]);\n\n const doDownload = useCallback(async (collection: EntityCollection<M>,\n exportConfig: ExportConfig<any> | undefined) => {\n\n onAnalyticsEvent?.(\"export_collection\", {\n collection: collection.slug\n });\n setDataLoading(true);\n dataClient.collection(path).find({})\n .then(async (res) => {\n const data = res.data as Entity<M>[];\n setDataLoadingError(undefined);\n const additionalData = await fetchAdditionalFields(data);\n const additionalHeaders = [\n ...exportConfig?.additionalFields?.map(column => column.key) ?? [],\n ...collection.additionalFields?.map(field => field.key) ?? []\n ];\n\n const dataWithDefaults = includeUndefinedValues\n ? data.map(entity => {\n const defaultValues = getDefaultValuesFor(collection.properties);\n return {\n ...entity,\n values: { ...defaultValues,\n...entity.values }\n };\n })\n : data;\n downloadEntitiesExport({\n data: dataWithDefaults,\n additionalData,\n properties: collection.properties,\n propertiesOrder: collection.propertiesOrder,\n name: collection.name,\n flattenArrays,\n additionalHeaders,\n exportType,\n dateExportType\n });\n onAnalyticsEvent?.(\"export_collection_success\", {\n collection: collection.slug\n });\n })\n .catch((e) => {\n console.error(\"Error loading export data\", e);\n setDataLoadingError(e);\n })\n .finally(() => setDataLoading(false));\n\n }, [onAnalyticsEvent, dataClient, path, fetchAdditionalFields, includeUndefinedValues, flattenArrays, exportType, dateExportType]);\n\n const onOkClicked = useCallback(() => {\n doDownload(collection, exportConfig);\n handleClose();\n }, [doDownload, collection, exportConfig, handleClose]);\n\n return <>\n\n <Tooltip title={\"Export\"}\n asChild={true}>\n <IconButton\n size={\"small\"}\n color={\"primary\"}\n onClick={handleClickOpen}>\n <DownloadIcon size={iconSize.small}/>\n </IconButton>\n </Tooltip>\n\n <Dialog\n open={open}\n onOpenChange={setOpen}\n maxWidth={\"xl\"}>\n\n <DialogTitle variant={\"h6\"}>Export data</DialogTitle>\n\n <DialogContent className={\"flex flex-col gap-4 my-4\"}>\n\n <div>DownloadIcon the the content of this table as a CSV</div>\n\n {collectionEntitiesCount !== undefined && collectionEntitiesCount > DOCS_LIMIT &&\n <Alert color={\"warning\"}>\n <div>\n This collections has a large number\n of documents ({collectionEntitiesCount}).\n </div>\n </Alert>}\n\n <div className={\"flex flex-row gap-4\"}>\n <div className={\"p-4 flex flex-col\"}>\n <RadioGroup value={exportType} onValueChange={(v) => setExportType(v as \"csv\" | \"json\")}>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"csv\" id=\"radio-csv\"/>\n <Label htmlFor=\"radio-csv\">CSV</Label>\n </div>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"json\" id=\"radio-json\"/>\n <Label htmlFor=\"radio-json\">JSON</Label>\n </div>\n </RadioGroup>\n </div>\n\n <div className={\"p-4 flex flex-col\"}>\n <RadioGroup value={dateExportType} onValueChange={(v) => setDateExportType(v as \"timestamp\" | \"string\")}>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"timestamp\" id=\"radio-timestamp\"/>\n <Label htmlFor=\"radio-timestamp\">Dates as timestamps ({dateRef.current.getTime()})</Label>\n </div>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"string\" id=\"radio-string\"/>\n <Label htmlFor=\"radio-string\">Dates as strings ({dateRef.current.toISOString()})</Label>\n </div>\n </RadioGroup>\n </div>\n </div>\n\n <BooleanSwitchWithLabel\n size={\"small\"}\n disabled={exportType !== \"csv\"}\n value={flattenArrays}\n onValueChange={setFlattenArrays}\n label={\"Flatten arrays\"}/>\n\n <BooleanSwitchWithLabel\n size={\"small\"}\n value={includeUndefinedValues}\n onValueChange={setIncludeUndefinedValues}\n label={\"Include undefined values\"}/>\n\n {!canExport && notAllowedView}\n\n </DialogContent>\n\n <DialogActions>\n\n {dataLoading && <CircularProgress size={\"smallest\"}/>}\n\n <Button onClick={handleClose}\n variant={\"text\"}>\n Cancel\n </Button>\n\n <Button onClick={onOkClicked}\n disabled={dataLoading || !canExport}>\n DownloadIcon\n </Button>\n\n </DialogActions>\n\n </Dialog>\n\n </>;\n}\n"],"names":["downloadEntitiesExport","data","additionalData","properties","propertiesOrder","name","flattenArrays","additionalHeaders","exportType","dateExportType","console","debug","dataLength","length","arrayValuesCount","getArrayValuesCount","map","d","values","headers","getExportHeaders","exportableData","getEntityCSVExportableData","headersData","entryToCSVRow","h","label","csvData","entry","downloadBlob","getEntityJsonExportableData","json","JSON","stringify","mergedData","e","id","processValuesForExport","forEach","additional","index","header","getValueInPath","key","Object","keys","flatMap","childKey","property","warn","Array","from","_","i","getHeaders","flat","push","propertyKey","prefix","currentKey","type","entries","p","processValueForExport","inputValue","value","of","isArray","isEntityReference","ref","undefined","fullPath","Date","getTime","toISOString","inputValues","updatedValues","updatedValue","reduce","a","b","v","replaceAll","s","String","join","content","filename","contentType","blob","Blob","url","URL","createObjectURL","pom","document","createElement","href","setAttribute","click","downloadDataAsCsv","csvContent","row","replace","BasicExportAction","dateRef","React","useRef","setFlattenArrays","useState","setExportType","setDateExportType","open","setOpen","handleClickOpen","useCallback","handleClose","onOkClicked","current","DOCS_LIMIT","ExportCollectionAction","collection","path","collectionEntitiesCount","onAnalyticsEvent","exportAllowed","notAllowedView","exportConfig","exportable","includeUndefinedValues","setIncludeUndefinedValues","context","useCMSContext","dataClient","useData","canExport","dataLoading","setDataLoading","dataLoadingError","setDataLoadingError","fetchAdditionalFields","entities","additionalExportFields","additionalFields","resolvedExportColumnsValues","Promise","all","entity","column","builder","resolvedColumnsValues","field","doDownload","slug","find","then","res","dataWithDefaults","defaultValues","getDefaultValuesFor","catch","error","finally","iconSize","small"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DHaOV-7A.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DJSL_SCr.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|