@reltio/components 1.4.2219 → 1.4.2220

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/ExportDialog/ExportDialog.d.ts +15 -0
  2. package/ExportDialog/ExportDialog.js +144 -0
  3. package/ExportDialog/ExportDialog.module.css.js +9 -0
  4. package/ExportDialog/ExportDialog.test.d.ts +1 -0
  5. package/ExportDialog/ExportDialog.test.js +285 -0
  6. package/ExportDialog/index.d.ts +1 -0
  7. package/ExportDialog/index.js +1 -0
  8. package/cjs/ExportDialog/ExportDialog.d.ts +15 -0
  9. package/cjs/ExportDialog/ExportDialog.js +174 -0
  10. package/cjs/ExportDialog/ExportDialog.module.css.js +9 -0
  11. package/cjs/ExportDialog/ExportDialog.test.d.ts +1 -0
  12. package/cjs/ExportDialog/ExportDialog.test.js +290 -0
  13. package/cjs/ExportDialog/index.d.ts +1 -0
  14. package/cjs/ExportDialog/index.js +5 -0
  15. package/cjs/contexts/MdmModuleContext/context.d.ts +2 -0
  16. package/cjs/contexts/MdmModuleContext/hooks.d.ts +1 -0
  17. package/cjs/contexts/MdmModuleContext/hooks.js +3 -1
  18. package/cjs/contexts/SnackbarContext/index.d.ts +9 -2
  19. package/cjs/features/workflow/ReassignButton/components/ReassignDialog/styles.d.ts +1 -1
  20. package/cjs/hooks/useExportController/index.d.ts +1 -0
  21. package/cjs/hooks/useExportController/index.js +5 -0
  22. package/cjs/hooks/useExportController/useExportController.d.ts +11 -0
  23. package/cjs/hooks/useExportController/useExportController.js +20 -0
  24. package/cjs/hooks/useInternalExport/index.d.ts +1 -0
  25. package/cjs/hooks/useInternalExport/index.js +5 -0
  26. package/cjs/hooks/useInternalExport/useInternalExport.d.ts +35 -0
  27. package/cjs/hooks/useInternalExport/useInternalExport.js +205 -0
  28. package/cjs/hooks/useSnackbar/useSnackbar.d.ts +2 -1
  29. package/cjs/hooks/useSnackbar/useSnackbar.js +23 -4
  30. package/cjs/index.d.ts +2 -0
  31. package/cjs/index.js +8 -4
  32. package/contexts/MdmModuleContext/context.d.ts +2 -0
  33. package/contexts/MdmModuleContext/hooks.d.ts +1 -0
  34. package/contexts/MdmModuleContext/hooks.js +1 -0
  35. package/contexts/SnackbarContext/index.d.ts +9 -2
  36. package/features/workflow/ReassignButton/components/ReassignDialog/styles.d.ts +1 -1
  37. package/hooks/useExportController/index.d.ts +1 -0
  38. package/hooks/useExportController/index.js +1 -0
  39. package/hooks/useExportController/useExportController.d.ts +11 -0
  40. package/hooks/useExportController/useExportController.js +16 -0
  41. package/hooks/useInternalExport/index.d.ts +1 -0
  42. package/hooks/useInternalExport/index.js +1 -0
  43. package/hooks/useInternalExport/useInternalExport.d.ts +35 -0
  44. package/hooks/useInternalExport/useInternalExport.js +198 -0
  45. package/hooks/useSnackbar/useSnackbar.d.ts +2 -1
  46. package/hooks/useSnackbar/useSnackbar.js +24 -5
  47. package/index.d.ts +2 -0
  48. package/index.js +2 -0
  49. package/package.json +2 -2
@@ -0,0 +1,198 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
23
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import { useState, useCallback, useMemo, useEffect } from 'react';
49
+ import i18n from 'ui-i18n';
50
+ import { count, length, map, pipe, prop, uniq } from 'ramda';
51
+ import { ExportDataFormat, exportData, ExportHeaderOrder, promiseAllSettled, getEntityType, isHiddenAttribute, getFirstLevelSearchUri } from '@reltio/mdm-sdk';
52
+ import { useMdmExportPath, useMdmTenant, useMdmMetadata } from '../../contexts/MdmModuleContext';
53
+ var ExportFormat;
54
+ (function (ExportFormat) {
55
+ ExportFormat["CSVFlattened"] = "csvFlattened";
56
+ ExportFormat["CSVExploded"] = "csvExploded";
57
+ ExportFormat["JSON"] = "json";
58
+ })(ExportFormat || (ExportFormat = {}));
59
+ var DEFAULT_EXPORT_NAME = 'Untitled Export Job';
60
+ // List of basic attributes:
61
+ // [createdBy, createdTime, updatedBy, updatedTime, uri, type, endDate, analyticsAttributes, label, secondaryLabel]
62
+ var BASIC_ATTRIBUTES_COUNT = 10;
63
+ export var useInternalExport = function (_a) {
64
+ var columnsByEntityType = _a.columnsByEntityType, dialogOpen = _a.dialogOpen, filter = _a.filter, activityFilter = _a.activityFilter, isSearchByOv = _a.isSearchByOv;
65
+ var exportPath = useMdmExportPath();
66
+ var tenant = useMdmTenant();
67
+ var metadata = useMdmMetadata();
68
+ var defaultFormat = useMemo(function () {
69
+ return {
70
+ value: ExportFormat.CSVFlattened,
71
+ label: i18n.text('CSV Flattened')
72
+ };
73
+ }, []);
74
+ var _b = useState(''), exportName = _b[0], setExportName = _b[1];
75
+ var _c = useState(), fileFormat = _c[0], setFileFormat = _c[1];
76
+ var formatOptions = useMemo(function () {
77
+ return [
78
+ defaultFormat,
79
+ {
80
+ value: ExportFormat.CSVExploded,
81
+ label: i18n.text('CSV Exploded')
82
+ },
83
+ {
84
+ value: ExportFormat.JSON,
85
+ label: i18n.text('JSON')
86
+ }
87
+ ];
88
+ }, [defaultFormat]);
89
+ var entityTypes = useMemo(function () { return Object.keys(columnsByEntityType); }, [columnsByEntityType]);
90
+ var entityTypesDetails = useMemo(function () {
91
+ return entityTypes.reduce(function (acc, entityTypeUri) {
92
+ var _a, _b, _c, _d, _e;
93
+ var entityType = getEntityType(metadata, entityTypeUri);
94
+ var attrCount = (_b = (_a = entityType.attributes) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;
95
+ var hiddenAttrCount = count(isHiddenAttribute, (_c = entityType.attributes) !== null && _c !== void 0 ? _c : []);
96
+ var analyticsAttrCount = (_e = (_d = entityType.analyticsAttributes) === null || _d === void 0 ? void 0 : _d.length) !== null && _e !== void 0 ? _e : 0;
97
+ var totalAttrCount = attrCount + analyticsAttrCount + BASIC_ATTRIBUTES_COUNT;
98
+ var columnsLength = pipe(prop(entityTypeUri), map(getFirstLevelSearchUri), uniq, length)(columnsByEntityType);
99
+ var defaultCount = totalAttrCount - hiddenAttrCount - analyticsAttrCount;
100
+ var selectedAttrCount = columnsLength > 0 ? columnsLength : defaultCount;
101
+ acc[entityTypeUri] = {
102
+ totalAttributesCount: totalAttrCount,
103
+ selectedAttributesCount: selectedAttrCount,
104
+ label: entityType === null || entityType === void 0 ? void 0 : entityType.label
105
+ };
106
+ return acc;
107
+ }, {});
108
+ }, [columnsByEntityType, entityTypes, metadata]);
109
+ var handleChangeExportName = useCallback(function (e) {
110
+ setExportName(e.target.value);
111
+ }, []);
112
+ var handleChangeFileFormat = useCallback(function (value) {
113
+ setFileFormat(value);
114
+ }, []);
115
+ var formatDateTime = useCallback(function (dateTime) {
116
+ var date = dateTime
117
+ .toLocaleDateString('en-US', { month: '2-digit', day: '2-digit', year: 'numeric' })
118
+ .replace(/\//g, '');
119
+ var time = dateTime.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit' });
120
+ return "".concat(date, "_").concat(time);
121
+ }, []);
122
+ var defaultExportName = useMemo(function () { return i18n.text(DEFAULT_EXPORT_NAME); }, []);
123
+ useEffect(function () {
124
+ if (dialogOpen) {
125
+ var now = new Date();
126
+ var defaultName = "".concat(defaultExportName, " ").concat(formatDateTime(now));
127
+ setExportName(defaultName);
128
+ setFileFormat(defaultFormat);
129
+ }
130
+ }, [dialogOpen, defaultFormat, formatDateTime, defaultExportName]);
131
+ var handleExport = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
132
+ var isCsv, baseOptions, tasks, typesWithSomeColumns, typesWithAllColumns, jobEntityTypes, options, results, failedJobs;
133
+ return __generator(this, function (_a) {
134
+ switch (_a.label) {
135
+ case 0:
136
+ if (!exportName || !fileFormat)
137
+ return [2 /*return*/];
138
+ isCsv = [ExportFormat.CSVFlattened, ExportFormat.CSVExploded].includes(fileFormat.value);
139
+ baseOptions = __assign(__assign({ fileFormat: isCsv ? ExportDataFormat.CSV : ExportDataFormat.JSON, filter: filter, activeness: activityFilter, options: isSearchByOv ? 'parallelExecution,searchByOv' : 'parallelExecution' }, (fileFormat.value === ExportFormat.CSVExploded ? { exploded: true } : {})), (isCsv ? { dateFormat: 'readable' } : {}));
140
+ tasks = [];
141
+ typesWithSomeColumns = entityTypes.filter(function (uri) { return columnsByEntityType[uri].length > 0; });
142
+ typesWithAllColumns = entityTypes.filter(function (uri) { return columnsByEntityType[uri].length === 0; });
143
+ jobEntityTypes = [];
144
+ typesWithSomeColumns.forEach(function (entityTypeUri) {
145
+ var options = __assign(__assign({}, baseOptions), { select: columnsByEntityType[entityTypeUri].join(','), name: "".concat(exportName, "_").concat(entityTypesDetails[entityTypeUri].label) });
146
+ var headerOrder = isCsv ? ExportHeaderOrder.Select : ExportHeaderOrder.Default;
147
+ tasks.push(exportData({
148
+ exportPath: exportPath,
149
+ tenant: tenant,
150
+ options: options,
151
+ includeType: [entityTypeUri],
152
+ headerOrder: headerOrder
153
+ }));
154
+ jobEntityTypes.push([entityTypeUri]);
155
+ });
156
+ if (typesWithAllColumns.length > 0) {
157
+ options = __assign(__assign({}, baseOptions), { name: "".concat(exportName, "_entities"), sendHidden: false });
158
+ tasks.push(exportData({
159
+ exportPath: exportPath,
160
+ tenant: tenant,
161
+ options: options,
162
+ includeType: typesWithAllColumns,
163
+ headerOrder: ExportHeaderOrder.Default
164
+ }));
165
+ jobEntityTypes.push(typesWithAllColumns);
166
+ }
167
+ return [4 /*yield*/, promiseAllSettled(tasks)];
168
+ case 1:
169
+ results = _a.sent();
170
+ failedJobs = results.flatMap(function (r, i) { return (r.status === 'rejected' ? jobEntityTypes[i] : []); });
171
+ return [2 /*return*/, {
172
+ failedJobs: failedJobs,
173
+ total: jobEntityTypes.flat().length
174
+ }];
175
+ }
176
+ });
177
+ }); }, [
178
+ exportName,
179
+ fileFormat,
180
+ filter,
181
+ activityFilter,
182
+ isSearchByOv,
183
+ entityTypes,
184
+ columnsByEntityType,
185
+ entityTypesDetails,
186
+ exportPath,
187
+ tenant
188
+ ]);
189
+ return {
190
+ exportName: exportName,
191
+ onChangeExportName: handleChangeExportName,
192
+ fileFormat: fileFormat,
193
+ onChangeFileFormat: handleChangeFileFormat,
194
+ formatOptions: formatOptions,
195
+ entityTypesDetails: entityTypesDetails,
196
+ onExport: handleExport
197
+ };
198
+ };
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { SnackbarOrigin } from '@mui/material/Snackbar';
3
+ import { SnackbarPayload } from '../../contexts/SnackbarContext';
3
4
  type SnackbarOptions = {
4
5
  anchorOrigin?: SnackbarOrigin;
5
6
  showDismiss?: boolean;
@@ -9,6 +10,6 @@ type SnackbarOptions = {
9
10
  };
10
11
  export declare const useSnackbar: ({ anchorOrigin, showDismiss, dismissTitle, autoHideDuration, onDismissClick }?: SnackbarOptions) => {
11
12
  SnackbarRenderer: () => React.JSX.Element;
12
- showSnackbarMessage: (message: any) => void;
13
+ showSnackbarMessage: (payload: SnackbarPayload) => void;
13
14
  };
14
15
  export {};
@@ -1,6 +1,6 @@
1
1
  import React, { useCallback, useState } from 'react';
2
2
  import i18n from 'ui-i18n';
3
- import { pipe, identity } from 'ramda';
3
+ import { identity } from 'ramda';
4
4
  import Portal from '@mui/material/Portal';
5
5
  import Button from '@mui/material/Button';
6
6
  import Snackbar from '@mui/material/Snackbar';
@@ -9,9 +9,11 @@ export var useSnackbar = function (_a) {
9
9
  var _b = _a === void 0 ? {} : _a, _c = _b.anchorOrigin, anchorOrigin = _c === void 0 ? { vertical: 'bottom', horizontal: 'center' } : _c, showDismiss = _b.showDismiss, _d = _b.dismissTitle, dismissTitle = _d === void 0 ? i18n.text('Dismiss') : _d, _e = _b.autoHideDuration, autoHideDuration = _e === void 0 ? FIVE_MINUTES : _e, _f = _b.onDismissClick, onDismissClick = _f === void 0 ? identity : _f;
10
10
  var _g = useState(false), isOpenSnackbar = _g[0], setIsOpenSnackbar = _g[1];
11
11
  var _h = useState(''), snackbarMessage = _h[0], setSnackbarMessage = _h[1];
12
+ var _j = useState(null), snackbarAction = _j[0], setSnackbarAction = _j[1];
12
13
  var closeSnackbar = useCallback(function () {
13
14
  setIsOpenSnackbar(false);
14
15
  setSnackbarMessage('');
16
+ setSnackbarAction(null);
15
17
  }, []);
16
18
  var handleSnackbarClose = useCallback(function (_, reason) {
17
19
  if (reason === 'clickaway') {
@@ -19,14 +21,31 @@ export var useSnackbar = function (_a) {
19
21
  }
20
22
  closeSnackbar();
21
23
  }, [closeSnackbar]);
22
- var showSnackbarMessage = useCallback(function (message) {
24
+ var showSnackbarMessage = useCallback(function (payload) {
25
+ if (typeof payload === 'object' && 'message' in payload && 'action' in payload) {
26
+ setSnackbarMessage(payload.message);
27
+ setSnackbarAction(payload.action);
28
+ }
29
+ else {
30
+ setSnackbarMessage(payload);
31
+ setSnackbarAction(null);
32
+ }
23
33
  setIsOpenSnackbar(true);
24
- setSnackbarMessage(message);
25
34
  }, []);
35
+ var handleDismissClick = useCallback(function () {
36
+ closeSnackbar();
37
+ onDismissClick();
38
+ }, [closeSnackbar, onDismissClick]);
39
+ var handleSnackbarActionClick = useCallback(function () {
40
+ closeSnackbar();
41
+ snackbarAction === null || snackbarAction === void 0 ? void 0 : snackbarAction.onClick();
42
+ }, [closeSnackbar, snackbarAction]);
26
43
  var SnackbarRenderer = useCallback(function () {
27
44
  return (React.createElement(Portal, { container: document.body },
28
- React.createElement(Snackbar, { open: isOpenSnackbar, anchorOrigin: anchorOrigin, autoHideDuration: autoHideDuration, onClose: handleSnackbarClose, message: snackbarMessage, style: { maxWidth: 500 }, action: showDismiss ? (React.createElement(Button, { color: "primary", onClick: pipe(closeSnackbar, onDismissClick) }, dismissTitle)) : undefined })));
45
+ React.createElement(Snackbar, { open: isOpenSnackbar, anchorOrigin: anchorOrigin, autoHideDuration: autoHideDuration, onClose: handleSnackbarClose, message: snackbarMessage, style: { maxWidth: 500 }, action: showDismiss || snackbarAction ? (React.createElement(React.Fragment, null,
46
+ showDismiss && (React.createElement(Button, { color: "primary", onClick: handleDismissClick }, dismissTitle)),
47
+ snackbarAction && (React.createElement(Button, { color: "primary", onClick: handleSnackbarActionClick }, snackbarAction.label)))) : undefined })));
29
48
  // eslint-disable-next-line react-hooks/exhaustive-deps
30
- }, [isOpenSnackbar, closeSnackbar, snackbarMessage]);
49
+ }, [isOpenSnackbar, closeSnackbar, snackbarMessage, snackbarAction]);
31
50
  return { SnackbarRenderer: SnackbarRenderer, showSnackbarMessage: showSnackbarMessage };
32
51
  };
package/index.d.ts CHANGED
@@ -196,6 +196,7 @@ export { FacetGroupTitle } from './FacetGroupTitle';
196
196
  export { FacetsSelector } from './FacetsSelector';
197
197
  export { FacetContainer } from './FacetContainer';
198
198
  export { RequestedData } from './RequestedData';
199
+ export { ExportDialog } from './ExportDialog';
199
200
  export { CollaborationButton } from './CollaborationButton';
200
201
  export { withTooltip } from './HOCs/withTooltip';
201
202
  export { withAsyncMount } from './HOCs/withAsyncMount';
@@ -296,6 +297,7 @@ export { useDynamicYAxisWidth } from './hooks/useDynamicYAxisWidth';
296
297
  export { useDndBasicTableScrollModifier } from './hooks/useDndBasicTableScrollModifier';
297
298
  export { useSegmentsLoader } from './hooks/useSegmentsLoader';
298
299
  export { useTableColumns } from './hooks/useTableColumns';
300
+ export { useInternalExport } from './hooks/useInternalExport';
299
301
  export { buildColumnsFilter, buildColumnsSizeById, columnFilterToMdmFilter, defaultGetRowCellHeight, defaultRenderRowCell } from './helpers/basicTable';
300
302
  export { enrichDataWithPercents } from './helpers/charts';
301
303
  export { showDefaultErrorMessage, showErrorMessage } from './helpers/errors';
package/index.js CHANGED
@@ -196,6 +196,7 @@ export { FacetGroupTitle } from './FacetGroupTitle';
196
196
  export { FacetsSelector } from './FacetsSelector';
197
197
  export { FacetContainer } from './FacetContainer';
198
198
  export { RequestedData } from './RequestedData';
199
+ export { ExportDialog } from './ExportDialog';
199
200
  export { CollaborationButton } from './CollaborationButton';
200
201
  // HOCs
201
202
  export { withTooltip } from './HOCs/withTooltip';
@@ -299,6 +300,7 @@ export { useDynamicYAxisWidth } from './hooks/useDynamicYAxisWidth';
299
300
  export { useDndBasicTableScrollModifier } from './hooks/useDndBasicTableScrollModifier';
300
301
  export { useSegmentsLoader } from './hooks/useSegmentsLoader';
301
302
  export { useTableColumns } from './hooks/useTableColumns';
303
+ export { useInternalExport } from './hooks/useInternalExport';
302
304
  // helpers
303
305
  export { buildColumnsFilter, buildColumnsSizeById, columnFilterToMdmFilter, defaultGetRowCellHeight, defaultRenderRowCell } from './helpers/basicTable';
304
306
  export { enrichDataWithPercents } from './helpers/charts';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reltio/components",
3
- "version": "1.4.2219",
3
+ "version": "1.4.2220",
4
4
  "license": "SEE LICENSE IN LICENSE FILE",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./index.js",
@@ -11,7 +11,7 @@
11
11
  "@fluentui/react-context-selector": "^9.1.26",
12
12
  "@googlemaps/markerclusterer": "^2.5.3",
13
13
  "@react-sigma/core": "3.4.0",
14
- "@reltio/mdm-sdk": "^1.4.2017",
14
+ "@reltio/mdm-sdk": "^1.4.2018",
15
15
  "@vis.gl/react-google-maps": "^1.3.0",
16
16
  "d3-cloud": "^1.2.5",
17
17
  "d3-geo": "^2.0.1",