@rebasepro/admin 0.9.1-canary.fd3754b → 0.10.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-DKGlYDPc.js → CollectionEditorDialog-BOlKGGg7.js} +149 -35
- package/dist/{CollectionEditorDialog-DKGlYDPc.js.map → CollectionEditorDialog-BOlKGGg7.js.map} +1 -1
- package/dist/{PropertyEditView-h0N-AMCY.js → PropertyEditView-i51tFOfM.js} +3 -3
- package/dist/PropertyEditView-i51tFOfM.js.map +1 -0
- package/dist/{RouterCollectionsStudioView-DdEStpFk.js → RouterCollectionsStudioView-Dh4W53PU.js} +4 -4
- package/dist/{RouterCollectionsStudioView-DdEStpFk.js.map → RouterCollectionsStudioView-Dh4W53PU.js.map} +1 -1
- package/dist/collection_editor_ui.js +4 -4
- package/dist/components/field_configs.d.ts +17 -0
- package/dist/contexts/BreacrumbsContext.d.ts +1 -1
- package/dist/editor.js.map +1 -1
- package/dist/export-BM6HPujv.js +518 -0
- package/dist/export-BM6HPujv.js.map +1 -0
- package/dist/{history-C0FdqGNz.js → history-CtIPJxvQ.js} +5 -5
- package/dist/history-CtIPJxvQ.js.map +1 -0
- package/dist/hooks/useSelectionDialog.d.ts +1 -1
- package/dist/import-DzQnT03v.js +328 -0
- package/dist/import-DzQnT03v.js.map +1 -0
- package/dist/index.js +3299 -1
- package/dist/index.js.map +1 -0
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/preview/util.d.ts +1 -0
- package/dist/util/view_mode.d.ts +54 -0
- package/dist/{src-DLAFyeZI.js → util-XFwQ9FEc.js} +17584 -21521
- package/dist/util-XFwQ9FEc.js.map +1 -0
- package/package.json +12 -17
- package/src/collection_editor/ui/collection_editor/CollectionRLSTab.tsx +139 -13
- package/src/collection_editor/ui/collection_editor/properties/CommonPropertyFields.tsx +1 -1
- package/src/collection_editor/ui/collection_editor/properties/EnumPropertyField.tsx +1 -1
- package/src/components/CollectionTableBinding/CollectionRowActions.tsx +1 -1
- package/src/components/CollectionTableBinding/fields/TableReferenceField.tsx +1 -1
- package/src/components/CollectionViewBinding/CollectionBoardViewBinding.tsx +1 -1
- package/src/components/CollectionViewBinding/CollectionViewActions.tsx +1 -1
- package/src/components/CollectionViewBinding/CollectionViewBinding.tsx +76 -126
- package/src/components/CollectionViewBinding/CollectionViewStartActions.tsx +4 -8
- package/src/components/CollectionViewBinding/FiltersDialog.tsx +18 -0
- package/src/components/CollectionViewBinding/SplitListView.tsx +114 -63
- package/src/components/CollectionViewBinding/useBoardDataController.tsx +9 -3
- package/src/components/DetailViewBinding.tsx +4 -2
- package/src/components/EditFormActions.tsx +2 -2
- package/src/components/EditViewBinding.tsx +3 -2
- package/src/components/EntityPreviewBinding.tsx +2 -1
- package/src/components/HomePage/ContentHomePage.tsx +2 -1
- package/src/components/HomePage/FavouritesView.tsx +1 -1
- package/src/components/RebaseNavigation.tsx +16 -1
- package/src/components/RebaseRouteDefs.tsx +1 -1
- package/src/components/ReferenceTable/SelectionTableBinding.tsx +2 -1
- package/src/components/ReferenceWidget.tsx +1 -1
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +1 -1
- package/src/components/SidePanelBinding.tsx +46 -8
- package/src/components/SidePanelProvider.tsx +14 -11
- package/src/components/field_configs.tsx +42 -25
- package/src/components/history/EntityHistoryView.tsx +3 -3
- package/src/contexts/BreacrumbsContext.tsx +1 -1
- package/src/data_import/components/ImportNewPropertyFieldPreview.tsx +2 -4
- package/src/data_import/import/ImportCollectionAction.tsx +6 -6
- package/src/editor/selectors/color-selector.tsx +1 -1
- package/src/editor/selectors/node-selector.tsx +1 -1
- package/src/editor/selectors/text-buttons.tsx +1 -1
- package/src/form/EntityForm.tsx +4 -1
- package/src/form/EntityFormBinding.tsx +3 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +2 -1
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +3 -2
- package/src/form/field_bindings/BlockFieldBinding.tsx +2 -1
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +2 -1
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +2 -1
- package/src/form/field_bindings/MapFieldBinding.tsx +2 -1
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +2 -1
- package/src/form/field_bindings/MultiSelectFieldBinding.tsx +2 -1
- package/src/form/field_bindings/MultipleRelationFieldBinding.tsx +2 -1
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -1
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +3 -2
- package/src/form/field_bindings/RelationFieldBinding.tsx +2 -1
- package/src/form/field_bindings/RepeatFieldBinding.tsx +2 -1
- package/src/form/field_bindings/SelectFieldBinding.tsx +2 -1
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +2 -1
- package/src/form/field_bindings/SwitchFieldBinding.tsx +2 -1
- package/src/form/field_bindings/TextFieldBinding.tsx +2 -1
- package/src/form/field_bindings/UserSelectFieldBinding.tsx +2 -1
- package/src/form/field_bindings/VectorFieldBinding.tsx +2 -1
- package/src/hooks/useBuildSidePanel.tsx +8 -0
- package/src/hooks/useResolvedNavigationFrom.tsx +4 -2
- package/src/hooks/useSelectionDialog.tsx +3 -3
- package/src/preview/components/ImagePreview.tsx +1 -1
- package/src/preview/components/ReferencePreview.tsx +1 -1
- package/src/preview/components/RelationPreview.tsx +2 -2
- package/src/preview/components/UrlComponentPreview.tsx +2 -9
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -1
- package/src/preview/property_previews/NumberPropertyPreview.tsx +1 -1
- package/src/preview/util.ts +9 -0
- package/src/routes/CustomViewRoute.tsx +2 -1
- package/src/routes/RebaseRoute.tsx +20 -25
- package/src/util/navigation_utils.ts +2 -5
- package/src/util/view_mode.ts +102 -0
- package/dist/PropertyEditView-h0N-AMCY.js.map +0 -1
- package/dist/history-C0FdqGNz.js.map +0 -1
- package/dist/src-DLAFyeZI.js.map +0 -1
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
|
|
2
|
+
import { tn as useCMSContext } from "./util-XFwQ9FEc.js";
|
|
3
|
+
import React, { useCallback } from "react";
|
|
4
|
+
import { Alert, BooleanSwitchWithLabel, Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle, DownloadIcon, IconButton, Label, RadioGroup, RadioGroupItem, Tooltip, iconSize } from "@rebasepro/ui";
|
|
5
|
+
import { getDefaultValuesFor } from "@rebasepro/common";
|
|
6
|
+
import { useData, useTranslation } from "@rebasepro/app";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { getArrayValuesCount, getValueInPath } from "@rebasepro/utils";
|
|
9
|
+
//#region src/data_export/export/export.ts
|
|
10
|
+
function downloadEntitiesExport({ data, additionalData, properties, propertiesOrder, name, flattenArrays, additionalHeaders, exportType, dateExportType }) {
|
|
11
|
+
console.debug("Downloading export", {
|
|
12
|
+
dataLength: data.length,
|
|
13
|
+
properties,
|
|
14
|
+
exportType,
|
|
15
|
+
dateExportType
|
|
16
|
+
});
|
|
17
|
+
if (exportType === "csv") {
|
|
18
|
+
const headers = getExportHeaders(properties, propertiesOrder, additionalHeaders, flattenArrays ? getArrayValuesCount(data.map((d) => d.values)) : {});
|
|
19
|
+
const exportableData = getEntityCSVExportableData(data, additionalData, properties, headers, dateExportType);
|
|
20
|
+
downloadBlob([entryToCSVRow(headers.map((h) => h.label)), ...exportableData.map((entry) => entryToCSVRow(entry))], `${name}.csv`, "text/csv");
|
|
21
|
+
} else {
|
|
22
|
+
const exportableData = getEntityJsonExportableData(data, additionalData, properties, dateExportType);
|
|
23
|
+
downloadBlob([JSON.stringify(exportableData, null, 2)], `${name}.json`, "application/json");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function getEntityCSVExportableData(data, additionalData, properties, headers, dateExportType) {
|
|
27
|
+
const mergedData = data.map((e) => ({
|
|
28
|
+
id: e.id,
|
|
29
|
+
...processValuesForExport(e.values, properties, "csv", dateExportType)
|
|
30
|
+
}));
|
|
31
|
+
if (additionalData) additionalData.forEach((additional, index) => {
|
|
32
|
+
mergedData[index] = {
|
|
33
|
+
...mergedData[index],
|
|
34
|
+
...additional
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
return mergedData && mergedData.map((entry) => {
|
|
38
|
+
return headers.map((header) => getValueInPath(entry, header.key));
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function getEntityJsonExportableData(data, additionalData, properties, dateExportType) {
|
|
42
|
+
const mergedData = data.map((e) => ({
|
|
43
|
+
id: e.id,
|
|
44
|
+
...processValuesForExport(e.values, properties, "json", dateExportType)
|
|
45
|
+
}));
|
|
46
|
+
if (additionalData) additionalData.forEach((additional, index) => {
|
|
47
|
+
mergedData[index] = {
|
|
48
|
+
...mergedData[index],
|
|
49
|
+
...additional
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
return mergedData;
|
|
53
|
+
}
|
|
54
|
+
function getExportHeaders(properties, propertiesOrder, additionalHeaders, arrayValuesCount) {
|
|
55
|
+
const headers = [{
|
|
56
|
+
label: "id",
|
|
57
|
+
key: "id"
|
|
58
|
+
}, ...(propertiesOrder ?? Object.keys(properties)).flatMap((childKey) => {
|
|
59
|
+
const property = properties[childKey];
|
|
60
|
+
if (!property) {
|
|
61
|
+
console.warn("Property not found", childKey, properties);
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
if (arrayValuesCount && arrayValuesCount[childKey] > 1) return Array.from({ length: arrayValuesCount[childKey] }, (_, i) => getHeaders(property, `${childKey}[${i}]`, "")).flat();
|
|
65
|
+
else return getHeaders(property, childKey, "");
|
|
66
|
+
})];
|
|
67
|
+
if (additionalHeaders) headers.push(...additionalHeaders.map((h) => ({
|
|
68
|
+
label: h,
|
|
69
|
+
key: h
|
|
70
|
+
})));
|
|
71
|
+
return headers;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get headers for property. There could be more than one header per property
|
|
75
|
+
* @param property
|
|
76
|
+
* @param propertyKey
|
|
77
|
+
* @param prefix
|
|
78
|
+
*/
|
|
79
|
+
function getHeaders(property, propertyKey, prefix = "") {
|
|
80
|
+
const currentKey = prefix ? `${prefix}.${propertyKey}` : propertyKey;
|
|
81
|
+
if (property.type === "map" && property.properties) return Object.entries(property.properties).map(([childKey, p]) => getHeaders(p, childKey, currentKey)).flat();
|
|
82
|
+
else return [{
|
|
83
|
+
label: currentKey,
|
|
84
|
+
key: currentKey
|
|
85
|
+
}];
|
|
86
|
+
}
|
|
87
|
+
function processValueForExport(inputValue, property, exportType, dateExportType) {
|
|
88
|
+
let value;
|
|
89
|
+
if (property.type === "map" && property.properties) value = processValuesForExport(inputValue, property.properties, exportType, dateExportType);
|
|
90
|
+
else if (property.type === "array") if (property.of && Array.isArray(inputValue)) if (Array.isArray(property.of)) value = property.of.map((p, i) => processValueForExport(inputValue[i], p, exportType, dateExportType));
|
|
91
|
+
else if (property.of.type === "map") value = exportType === "csv" ? inputValue.map((e) => JSON.stringify(e)) : inputValue.map((e) => processValueForExport(e, property.of, exportType, dateExportType));
|
|
92
|
+
else value = inputValue.map((e) => processValueForExport(e, property.of, exportType, dateExportType));
|
|
93
|
+
else value = inputValue;
|
|
94
|
+
else if (property.type === "reference" && inputValue && typeof inputValue === "object" && "isEntityReference" in inputValue && typeof inputValue.isEntityReference === "function" && inputValue.isEntityReference()) {
|
|
95
|
+
const ref = inputValue ? inputValue : void 0;
|
|
96
|
+
value = ref ? ref.fullPath : null;
|
|
97
|
+
} else if (property.type === "date" && inputValue instanceof Date) value = inputValue ? dateExportType === "timestamp" ? inputValue.getTime() : inputValue.toISOString() : null;
|
|
98
|
+
else value = inputValue;
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
function processValuesForExport(inputValues, properties, exportType, dateExportType) {
|
|
102
|
+
const updatedValues = Object.entries(properties).map(([key, property]) => {
|
|
103
|
+
const updatedValue = processValueForExport(inputValues && inputValues[key], property, exportType, dateExportType);
|
|
104
|
+
if (updatedValue === void 0) return {};
|
|
105
|
+
return { [key]: updatedValue };
|
|
106
|
+
}).reduce((a, b) => ({
|
|
107
|
+
...a,
|
|
108
|
+
...b
|
|
109
|
+
}), {});
|
|
110
|
+
return {
|
|
111
|
+
...inputValues,
|
|
112
|
+
...updatedValues
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function entryToCSVRow(entry) {
|
|
116
|
+
return entry.map((v) => {
|
|
117
|
+
if (v === null || v === void 0) return "";
|
|
118
|
+
if (Array.isArray(v)) return "\"" + JSON.stringify(v).replaceAll("\"", "\"\"") + "\"";
|
|
119
|
+
return "\"" + String(v).replaceAll("\"", "\"\"") + "\"";
|
|
120
|
+
}).join(",") + "\r\n";
|
|
121
|
+
}
|
|
122
|
+
function downloadBlob(content, filename, contentType) {
|
|
123
|
+
const blob = new Blob(content, { type: contentType });
|
|
124
|
+
const url = URL.createObjectURL(blob);
|
|
125
|
+
const pom = document.createElement("a");
|
|
126
|
+
pom.href = url;
|
|
127
|
+
pom.setAttribute("download", filename);
|
|
128
|
+
pom.click();
|
|
129
|
+
}
|
|
130
|
+
function downloadDataAsCsv(data, name) {
|
|
131
|
+
if (data.length === 0) return;
|
|
132
|
+
const headers = Object.keys(data[0]);
|
|
133
|
+
downloadBlob([[headers.join(","), ...data.map((row) => headers.map((header) => {
|
|
134
|
+
const value = row[header];
|
|
135
|
+
if (value === null || value === void 0) return "";
|
|
136
|
+
if (Array.isArray(value)) return `"${JSON.stringify(value).replace(/"/g, "\"\"")}"`;
|
|
137
|
+
return `"${String(value).replace(/"/g, "\"\"")}"`;
|
|
138
|
+
}).join(","))].join("\r\n")], `${name}.csv`, "text/csv");
|
|
139
|
+
}
|
|
140
|
+
//#endregion
|
|
141
|
+
//#region src/data_export/export/BasicExportAction.tsx
|
|
142
|
+
function BasicExportAction({ data, properties, propertiesOrder }) {
|
|
143
|
+
const { t } = useTranslation();
|
|
144
|
+
const dateRef = React.useRef(/* @__PURE__ */ new Date());
|
|
145
|
+
const [flattenArrays, setFlattenArrays] = React.useState(true);
|
|
146
|
+
const [exportType, setExportType] = React.useState("csv");
|
|
147
|
+
const [dateExportType, setDateExportType] = React.useState("string");
|
|
148
|
+
const [open, setOpen] = React.useState(false);
|
|
149
|
+
const handleClickOpen = useCallback(() => {
|
|
150
|
+
setOpen(true);
|
|
151
|
+
}, [setOpen]);
|
|
152
|
+
const handleClose = useCallback(() => {
|
|
153
|
+
setOpen(false);
|
|
154
|
+
}, [setOpen]);
|
|
155
|
+
const onOkClicked = useCallback(() => {
|
|
156
|
+
downloadEntitiesExport({
|
|
157
|
+
data,
|
|
158
|
+
additionalData: [],
|
|
159
|
+
properties,
|
|
160
|
+
propertiesOrder,
|
|
161
|
+
name: "export.csv",
|
|
162
|
+
flattenArrays,
|
|
163
|
+
additionalHeaders: [],
|
|
164
|
+
exportType,
|
|
165
|
+
dateExportType
|
|
166
|
+
});
|
|
167
|
+
handleClose();
|
|
168
|
+
}, []);
|
|
169
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Tooltip, {
|
|
170
|
+
title: "Export",
|
|
171
|
+
asChild: true,
|
|
172
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
173
|
+
size: "small",
|
|
174
|
+
color: "primary",
|
|
175
|
+
onClick: handleClickOpen,
|
|
176
|
+
children: /* @__PURE__ */ jsx(DownloadIcon, { size: "small" })
|
|
177
|
+
})
|
|
178
|
+
}), /* @__PURE__ */ jsxs(Dialog, {
|
|
179
|
+
open,
|
|
180
|
+
onOpenChange: setOpen,
|
|
181
|
+
maxWidth: "xl",
|
|
182
|
+
children: [
|
|
183
|
+
/* @__PURE__ */ jsx(DialogTitle, {
|
|
184
|
+
variant: "h6",
|
|
185
|
+
children: t("export_data")
|
|
186
|
+
}),
|
|
187
|
+
/* @__PURE__ */ jsxs(DialogContent, {
|
|
188
|
+
className: "flex flex-col gap-4 my-4",
|
|
189
|
+
children: [
|
|
190
|
+
/* @__PURE__ */ jsx("div", { children: t("download_table_csv") }),
|
|
191
|
+
/* @__PURE__ */ jsxs("div", {
|
|
192
|
+
className: "flex flex-row gap-4",
|
|
193
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
194
|
+
className: "p-4 flex flex-col",
|
|
195
|
+
children: /* @__PURE__ */ jsxs(RadioGroup, {
|
|
196
|
+
value: exportType,
|
|
197
|
+
onValueChange: (v) => setExportType(v),
|
|
198
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
199
|
+
className: "flex items-center gap-2",
|
|
200
|
+
children: [/* @__PURE__ */ jsx(RadioGroupItem, {
|
|
201
|
+
value: "csv",
|
|
202
|
+
id: "radio-csv"
|
|
203
|
+
}), /* @__PURE__ */ jsx(Label, {
|
|
204
|
+
htmlFor: "radio-csv",
|
|
205
|
+
children: t("csv")
|
|
206
|
+
})]
|
|
207
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
208
|
+
className: "flex items-center gap-2",
|
|
209
|
+
children: [/* @__PURE__ */ jsx(RadioGroupItem, {
|
|
210
|
+
value: "json",
|
|
211
|
+
id: "radio-json"
|
|
212
|
+
}), /* @__PURE__ */ jsx(Label, {
|
|
213
|
+
htmlFor: "radio-json",
|
|
214
|
+
children: t("json")
|
|
215
|
+
})]
|
|
216
|
+
})]
|
|
217
|
+
})
|
|
218
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
219
|
+
className: "p-4 flex flex-col",
|
|
220
|
+
children: /* @__PURE__ */ jsxs(RadioGroup, {
|
|
221
|
+
value: dateExportType,
|
|
222
|
+
onValueChange: (v) => setDateExportType(v),
|
|
223
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
224
|
+
className: "flex items-center gap-2",
|
|
225
|
+
children: [/* @__PURE__ */ jsx(RadioGroupItem, {
|
|
226
|
+
value: "timestamp",
|
|
227
|
+
id: "radio-timestamp"
|
|
228
|
+
}), /* @__PURE__ */ jsxs(Label, {
|
|
229
|
+
htmlFor: "radio-timestamp",
|
|
230
|
+
children: [
|
|
231
|
+
t("dates_as_timestamps"),
|
|
232
|
+
" (",
|
|
233
|
+
dateRef.current.getTime(),
|
|
234
|
+
")"
|
|
235
|
+
]
|
|
236
|
+
})]
|
|
237
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
238
|
+
className: "flex items-center gap-2",
|
|
239
|
+
children: [/* @__PURE__ */ jsx(RadioGroupItem, {
|
|
240
|
+
value: "string",
|
|
241
|
+
id: "radio-string"
|
|
242
|
+
}), /* @__PURE__ */ jsxs(Label, {
|
|
243
|
+
htmlFor: "radio-string",
|
|
244
|
+
children: [
|
|
245
|
+
t("dates_as_strings"),
|
|
246
|
+
" (",
|
|
247
|
+
dateRef.current.toISOString(),
|
|
248
|
+
")"
|
|
249
|
+
]
|
|
250
|
+
})]
|
|
251
|
+
})]
|
|
252
|
+
})
|
|
253
|
+
})]
|
|
254
|
+
}),
|
|
255
|
+
/* @__PURE__ */ jsx(BooleanSwitchWithLabel, {
|
|
256
|
+
size: "small",
|
|
257
|
+
disabled: exportType !== "csv",
|
|
258
|
+
value: flattenArrays,
|
|
259
|
+
onValueChange: setFlattenArrays,
|
|
260
|
+
label: t("flatten_arrays")
|
|
261
|
+
})
|
|
262
|
+
]
|
|
263
|
+
}),
|
|
264
|
+
/* @__PURE__ */ jsxs(DialogActions, { children: [/* @__PURE__ */ jsx(Button, {
|
|
265
|
+
onClick: handleClose,
|
|
266
|
+
variant: "text",
|
|
267
|
+
children: t("cancel")
|
|
268
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
269
|
+
onClick: onOkClicked,
|
|
270
|
+
children: t("download")
|
|
271
|
+
})] })
|
|
272
|
+
]
|
|
273
|
+
})] });
|
|
274
|
+
}
|
|
275
|
+
//#endregion
|
|
276
|
+
//#region src/data_export/export/ExportCollectionAction.tsx
|
|
277
|
+
var DOCS_LIMIT = 500;
|
|
278
|
+
function ExportCollectionAction({ collection, path, collectionEntitiesCount, onAnalyticsEvent, exportAllowed, notAllowedView }) {
|
|
279
|
+
const { t } = useTranslation();
|
|
280
|
+
const exportConfig = typeof collection.exportable === "object" ? collection.exportable : void 0;
|
|
281
|
+
const dateRef = React.useRef(/* @__PURE__ */ new Date());
|
|
282
|
+
const [includeUndefinedValues, setIncludeUndefinedValues] = React.useState(false);
|
|
283
|
+
const [flattenArrays, setFlattenArrays] = React.useState(true);
|
|
284
|
+
const [exportType, setExportType] = React.useState("csv");
|
|
285
|
+
const [dateExportType, setDateExportType] = React.useState("string");
|
|
286
|
+
const context = useCMSContext();
|
|
287
|
+
const dataClient = useData();
|
|
288
|
+
const canExport = !exportAllowed || exportAllowed({
|
|
289
|
+
collectionEntitiesCount: collectionEntitiesCount ?? 0,
|
|
290
|
+
path,
|
|
291
|
+
collection
|
|
292
|
+
});
|
|
293
|
+
const [dataLoading, setDataLoading] = React.useState(false);
|
|
294
|
+
const [dataLoadingError, setDataLoadingError] = React.useState();
|
|
295
|
+
const [open, setOpen] = React.useState(false);
|
|
296
|
+
const handleClickOpen = useCallback(() => {
|
|
297
|
+
setOpen(true);
|
|
298
|
+
}, [setOpen]);
|
|
299
|
+
const handleClose = useCallback(() => {
|
|
300
|
+
setOpen(false);
|
|
301
|
+
}, [setOpen]);
|
|
302
|
+
const fetchAdditionalFields = useCallback(async (entities) => {
|
|
303
|
+
const additionalExportFields = exportConfig?.additionalFields;
|
|
304
|
+
const additionalFields = collection.additionalFields;
|
|
305
|
+
const resolvedExportColumnsValues = additionalExportFields ? await Promise.all(entities.map(async (entity) => {
|
|
306
|
+
return (await Promise.all(additionalExportFields.map(async (column) => {
|
|
307
|
+
return { [column.key]: await column.builder({
|
|
308
|
+
entity,
|
|
309
|
+
context
|
|
310
|
+
}) };
|
|
311
|
+
}))).reduce((a, b) => ({
|
|
312
|
+
...a,
|
|
313
|
+
...b
|
|
314
|
+
}), {});
|
|
315
|
+
})) : [];
|
|
316
|
+
const resolvedColumnsValues = additionalFields ? await Promise.all(entities.map(async (entity) => {
|
|
317
|
+
return (await Promise.all(additionalFields.map(async (field) => {
|
|
318
|
+
if (!field.value) return {};
|
|
319
|
+
return { [field.key]: await field.value({
|
|
320
|
+
entity,
|
|
321
|
+
context
|
|
322
|
+
}) };
|
|
323
|
+
}))).reduce((a, b) => ({
|
|
324
|
+
...a,
|
|
325
|
+
...b
|
|
326
|
+
}), {});
|
|
327
|
+
})) : [];
|
|
328
|
+
return [...resolvedExportColumnsValues, ...resolvedColumnsValues];
|
|
329
|
+
}, [exportConfig?.additionalFields]);
|
|
330
|
+
const doDownload = useCallback(async (collection, exportConfig) => {
|
|
331
|
+
onAnalyticsEvent?.("export_collection", { collection: collection.slug });
|
|
332
|
+
setDataLoading(true);
|
|
333
|
+
dataClient.collection(path).find({}).then(async (res) => {
|
|
334
|
+
const data = res.data;
|
|
335
|
+
setDataLoadingError(void 0);
|
|
336
|
+
const additionalData = await fetchAdditionalFields(data);
|
|
337
|
+
const additionalHeaders = [...exportConfig?.additionalFields?.map((column) => column.key) ?? [], ...collection.additionalFields?.map((field) => field.key) ?? []];
|
|
338
|
+
downloadEntitiesExport({
|
|
339
|
+
data: includeUndefinedValues ? data.map((entity) => {
|
|
340
|
+
const defaultValues = getDefaultValuesFor(collection.properties);
|
|
341
|
+
return {
|
|
342
|
+
...entity,
|
|
343
|
+
values: {
|
|
344
|
+
...defaultValues,
|
|
345
|
+
...entity.values
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
}) : data,
|
|
349
|
+
additionalData,
|
|
350
|
+
properties: collection.properties,
|
|
351
|
+
propertiesOrder: collection.propertiesOrder,
|
|
352
|
+
name: collection.name,
|
|
353
|
+
flattenArrays,
|
|
354
|
+
additionalHeaders,
|
|
355
|
+
exportType,
|
|
356
|
+
dateExportType
|
|
357
|
+
});
|
|
358
|
+
onAnalyticsEvent?.("export_collection_success", { collection: collection.slug });
|
|
359
|
+
}).catch((e) => {
|
|
360
|
+
console.error("Error loading export data", e);
|
|
361
|
+
setDataLoadingError(e);
|
|
362
|
+
}).finally(() => setDataLoading(false));
|
|
363
|
+
}, [
|
|
364
|
+
onAnalyticsEvent,
|
|
365
|
+
dataClient,
|
|
366
|
+
path,
|
|
367
|
+
fetchAdditionalFields,
|
|
368
|
+
includeUndefinedValues,
|
|
369
|
+
flattenArrays,
|
|
370
|
+
exportType,
|
|
371
|
+
dateExportType
|
|
372
|
+
]);
|
|
373
|
+
const onOkClicked = useCallback(() => {
|
|
374
|
+
doDownload(collection, exportConfig);
|
|
375
|
+
handleClose();
|
|
376
|
+
}, [
|
|
377
|
+
doDownload,
|
|
378
|
+
collection,
|
|
379
|
+
exportConfig,
|
|
380
|
+
handleClose
|
|
381
|
+
]);
|
|
382
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Tooltip, {
|
|
383
|
+
title: "Export",
|
|
384
|
+
asChild: true,
|
|
385
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
386
|
+
size: "small",
|
|
387
|
+
color: "primary",
|
|
388
|
+
onClick: handleClickOpen,
|
|
389
|
+
children: /* @__PURE__ */ jsx(DownloadIcon, { size: iconSize.small })
|
|
390
|
+
})
|
|
391
|
+
}), /* @__PURE__ */ jsxs(Dialog, {
|
|
392
|
+
open,
|
|
393
|
+
onOpenChange: setOpen,
|
|
394
|
+
maxWidth: "xl",
|
|
395
|
+
children: [
|
|
396
|
+
/* @__PURE__ */ jsx(DialogTitle, {
|
|
397
|
+
variant: "h6",
|
|
398
|
+
children: t("export_data")
|
|
399
|
+
}),
|
|
400
|
+
/* @__PURE__ */ jsxs(DialogContent, {
|
|
401
|
+
className: "flex flex-col gap-4 my-4",
|
|
402
|
+
children: [
|
|
403
|
+
/* @__PURE__ */ jsx("div", { children: t("download_table_csv") }),
|
|
404
|
+
collectionEntitiesCount !== void 0 && collectionEntitiesCount > DOCS_LIMIT && /* @__PURE__ */ jsx(Alert, {
|
|
405
|
+
color: "warning",
|
|
406
|
+
children: /* @__PURE__ */ jsx("div", { children: t("large_number_of_documents", { count: collectionEntitiesCount.toString() }) })
|
|
407
|
+
}),
|
|
408
|
+
/* @__PURE__ */ jsxs("div", {
|
|
409
|
+
className: "flex flex-row gap-4",
|
|
410
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
411
|
+
className: "p-4 flex flex-col",
|
|
412
|
+
children: /* @__PURE__ */ jsxs(RadioGroup, {
|
|
413
|
+
value: exportType,
|
|
414
|
+
onValueChange: (v) => setExportType(v),
|
|
415
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
416
|
+
className: "flex items-center gap-2",
|
|
417
|
+
children: [/* @__PURE__ */ jsx(RadioGroupItem, {
|
|
418
|
+
value: "csv",
|
|
419
|
+
id: "radio-csv"
|
|
420
|
+
}), /* @__PURE__ */ jsx(Label, {
|
|
421
|
+
htmlFor: "radio-csv",
|
|
422
|
+
children: t("csv")
|
|
423
|
+
})]
|
|
424
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
425
|
+
className: "flex items-center gap-2",
|
|
426
|
+
children: [/* @__PURE__ */ jsx(RadioGroupItem, {
|
|
427
|
+
value: "json",
|
|
428
|
+
id: "radio-json"
|
|
429
|
+
}), /* @__PURE__ */ jsx(Label, {
|
|
430
|
+
htmlFor: "radio-json",
|
|
431
|
+
children: t("json")
|
|
432
|
+
})]
|
|
433
|
+
})]
|
|
434
|
+
})
|
|
435
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
436
|
+
className: "p-4 flex flex-col",
|
|
437
|
+
children: /* @__PURE__ */ jsxs(RadioGroup, {
|
|
438
|
+
value: dateExportType,
|
|
439
|
+
onValueChange: (v) => setDateExportType(v),
|
|
440
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
441
|
+
className: "flex items-center gap-2",
|
|
442
|
+
children: [/* @__PURE__ */ jsx(RadioGroupItem, {
|
|
443
|
+
value: "timestamp",
|
|
444
|
+
id: "radio-timestamp"
|
|
445
|
+
}), /* @__PURE__ */ jsxs(Label, {
|
|
446
|
+
htmlFor: "radio-timestamp",
|
|
447
|
+
children: [
|
|
448
|
+
t("dates_as_timestamps"),
|
|
449
|
+
" (",
|
|
450
|
+
dateRef.current.getTime(),
|
|
451
|
+
")"
|
|
452
|
+
]
|
|
453
|
+
})]
|
|
454
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
455
|
+
className: "flex items-center gap-2",
|
|
456
|
+
children: [/* @__PURE__ */ jsx(RadioGroupItem, {
|
|
457
|
+
value: "string",
|
|
458
|
+
id: "radio-string"
|
|
459
|
+
}), /* @__PURE__ */ jsxs(Label, {
|
|
460
|
+
htmlFor: "radio-string",
|
|
461
|
+
children: [
|
|
462
|
+
t("dates_as_strings"),
|
|
463
|
+
" (",
|
|
464
|
+
dateRef.current.toISOString(),
|
|
465
|
+
")"
|
|
466
|
+
]
|
|
467
|
+
})]
|
|
468
|
+
})]
|
|
469
|
+
})
|
|
470
|
+
})]
|
|
471
|
+
}),
|
|
472
|
+
/* @__PURE__ */ jsx(BooleanSwitchWithLabel, {
|
|
473
|
+
size: "small",
|
|
474
|
+
disabled: exportType !== "csv",
|
|
475
|
+
value: flattenArrays,
|
|
476
|
+
onValueChange: setFlattenArrays,
|
|
477
|
+
label: t("flatten_arrays")
|
|
478
|
+
}),
|
|
479
|
+
/* @__PURE__ */ jsx(BooleanSwitchWithLabel, {
|
|
480
|
+
size: "small",
|
|
481
|
+
value: includeUndefinedValues,
|
|
482
|
+
onValueChange: setIncludeUndefinedValues,
|
|
483
|
+
label: t("include_undefined_values")
|
|
484
|
+
}),
|
|
485
|
+
!canExport && notAllowedView
|
|
486
|
+
]
|
|
487
|
+
}),
|
|
488
|
+
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
489
|
+
dataLoading && /* @__PURE__ */ jsx(CircularProgress, { size: "smallest" }),
|
|
490
|
+
/* @__PURE__ */ jsx(Button, {
|
|
491
|
+
onClick: handleClose,
|
|
492
|
+
variant: "text",
|
|
493
|
+
children: t("cancel")
|
|
494
|
+
}),
|
|
495
|
+
/* @__PURE__ */ jsx(Button, {
|
|
496
|
+
onClick: onOkClicked,
|
|
497
|
+
disabled: dataLoading || !canExport,
|
|
498
|
+
children: t("download")
|
|
499
|
+
})
|
|
500
|
+
] })
|
|
501
|
+
]
|
|
502
|
+
})] });
|
|
503
|
+
}
|
|
504
|
+
//#endregion
|
|
505
|
+
//#region src/data_export/export/index.ts
|
|
506
|
+
var export_exports = /* @__PURE__ */ __exportAll({
|
|
507
|
+
BasicExportAction: () => BasicExportAction,
|
|
508
|
+
ExportCollectionAction: () => ExportCollectionAction,
|
|
509
|
+
downloadBlob: () => downloadBlob,
|
|
510
|
+
downloadDataAsCsv: () => downloadDataAsCsv,
|
|
511
|
+
downloadEntitiesExport: () => downloadEntitiesExport,
|
|
512
|
+
getEntityCSVExportableData: () => getEntityCSVExportableData,
|
|
513
|
+
getEntityJsonExportableData: () => getEntityJsonExportableData
|
|
514
|
+
});
|
|
515
|
+
//#endregion
|
|
516
|
+
export { downloadDataAsCsv as a, getEntityJsonExportableData as c, downloadBlob as i, ExportCollectionAction as n, downloadEntitiesExport as o, BasicExportAction as r, getEntityCSVExportableData as s, export_exports as t };
|
|
517
|
+
|
|
518
|
+
//# sourceMappingURL=export-BM6HPujv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-BM6HPujv.js","names":[],"sources":["../src/data_export/export/export.ts","../src/data_export/export/BasicExportAction.tsx","../src/data_export/export/ExportCollectionAction.tsx","../src/data_export/export/index.ts"],"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 { useTranslation } from \"@rebasepro/app\";\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 { t } = useTranslation();\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\"}>{t(\"export_data\")}</DialogTitle>\n\n <DialogContent className={\"flex flex-col gap-4 my-4\"}>\n\n <div>{t(\"download_table_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\">{t(\"csv\")}</Label>\n </div>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"json\" id=\"radio-json\"/>\n <Label htmlFor=\"radio-json\">{t(\"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\">{t(\"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\">{t(\"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={t(\"flatten_arrays\")}/>\n\n </DialogContent>\n\n <DialogActions>\n\n <Button onClick={handleClose}\n variant={\"text\"}>\n {t(\"cancel\")}\n </Button>\n\n <Button onClick={onOkClicked}>\n {t(\"download\")}\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 useTranslation\n} from \"@rebasepro/app\";\nimport { useCMSContext } from \"../../hooks\";\nimport { CollectionActionsProps, Entity, CollectionConfig, 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, CollectionConfig<M>> & {\n exportAllowed?: (props: { collectionEntitiesCount: number, path: string, collection: CollectionConfig }) => boolean;\n notAllowedView?: React.ReactNode;\n onAnalyticsEvent?: (event: string, params?: any) => void;\n}) {\n\n const { t } = useTranslation();\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: CollectionConfig<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\"}>{t(\"export_data\")}</DialogTitle>\n\n <DialogContent className={\"flex flex-col gap-4 my-4\"}>\n\n <div>{t(\"download_table_csv\")}</div>\n\n {collectionEntitiesCount !== undefined && collectionEntitiesCount > DOCS_LIMIT &&\n <Alert color={\"warning\"}>\n <div>\n {t(\"large_number_of_documents\", { count: collectionEntitiesCount.toString() })}\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\">{t(\"csv\")}</Label>\n </div>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"json\" id=\"radio-json\"/>\n <Label htmlFor=\"radio-json\">{t(\"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\">{t(\"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\">{t(\"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={t(\"flatten_arrays\")}/>\n\n <BooleanSwitchWithLabel\n size={\"small\"}\n value={includeUndefinedValues}\n onValueChange={setIncludeUndefinedValues}\n label={t(\"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 {t(\"cancel\")}\n </Button>\n\n <Button onClick={onOkClicked}\n disabled={dataLoading || !canExport}>\n {t(\"download\")}\n </Button>\n\n </DialogActions>\n\n </Dialog>\n\n </>;\n}\n","export * from \"./export\";\nexport * from \"./BasicExportAction\";\nexport * from \"./ExportCollectionAction\";\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { $ as useHistory, Vn as getPropertyInPath, mn as PropertyPreview } from "./util-XFwQ9FEc.js";
|
|
2
2
|
import { useEffect, useRef, useState } from "react";
|
|
3
3
|
import { ArrowLeftIcon, Chip, ErrorBoundary, HistoryIcon, IconButton, Label, Tooltip, Typography, cls, defaultBorderMixin, iconSize } from "@rebasepro/ui";
|
|
4
4
|
import { ConfirmationDialog, useAuthController, useSnackbarController } from "@rebasepro/app";
|
|
5
|
-
import { getValueInPath } from "@rebasepro/utils";
|
|
6
5
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { getValueInPath } from "@rebasepro/utils";
|
|
7
7
|
//#region src/components/history/UserChip.tsx
|
|
8
8
|
function UserChip({ user }) {
|
|
9
9
|
return /* @__PURE__ */ jsx(Tooltip, {
|
|
@@ -194,7 +194,7 @@ function EntityHistoryView({ entity, collection, formContext }) {
|
|
|
194
194
|
]);
|
|
195
195
|
if (!entity) return /* @__PURE__ */ jsx("div", {
|
|
196
196
|
className: "flex items-center justify-center h-full",
|
|
197
|
-
children: /* @__PURE__ */ jsx(Label, { children: "
|
|
197
|
+
children: /* @__PURE__ */ jsx(Label, { children: "History is only available for existing entities" })
|
|
198
198
|
});
|
|
199
199
|
async function doRevert(historyId) {
|
|
200
200
|
setIsReverting(true);
|
|
@@ -230,7 +230,7 @@ function EntityHistoryView({ entity, collection, formContext }) {
|
|
|
230
230
|
/* @__PURE__ */ jsx(Typography, {
|
|
231
231
|
variant: "h5",
|
|
232
232
|
className: "mt-24 ml-4",
|
|
233
|
-
children: "
|
|
233
|
+
children: "History"
|
|
234
234
|
}),
|
|
235
235
|
isLoading && entries.length === 0 && /* @__PURE__ */ jsx("div", {
|
|
236
236
|
className: "flex flex-col gap-4 mt-8 ml-4",
|
|
@@ -308,4 +308,4 @@ function EntityHistoryView({ entity, collection, formContext }) {
|
|
|
308
308
|
//#endregion
|
|
309
309
|
export { EntityHistoryView };
|
|
310
310
|
|
|
311
|
-
//# sourceMappingURL=history-
|
|
311
|
+
//# sourceMappingURL=history-CtIPJxvQ.js.map
|