swoop-common 2.1.18 → 2.1.20
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/rendering/components/ComponentPicker.d.ts +10 -0
- package/dist/rendering/components/ComponentPicker.js +209 -0
- package/dist/rendering/consts/region.d.ts +1 -0
- package/dist/rendering/consts/region.js +5 -0
- package/dist/rendering/contexts/ComponentPickerContext.d.ts +11 -0
- package/dist/rendering/contexts/ComponentPickerContext.js +48 -0
- package/dist/rendering/index.d.ts +1 -0
- package/dist/rendering/index.js +1 -0
- package/dist/rendering/renderers/ComponentPicker.js +8 -23
- package/dist/rendering/util/api.d.ts +8 -0
- package/dist/rendering/util/api.js +54 -0
- package/package.json +1 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { DTOComponentRead } from "../../api/generated/core/exports";
|
|
3
|
+
interface ComponentPickerModalProps {
|
|
4
|
+
open: boolean;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
onSelect: (component: DTOComponentRead) => void;
|
|
7
|
+
selectedComponent?: DTOComponentRead | null;
|
|
8
|
+
}
|
|
9
|
+
export default function ComponentPickerModal({ open, onClose, onSelect, selectedComponent, }: ComponentPickerModalProps): React.JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import React, { useState, useEffect } from "react";
|
|
11
|
+
import { Dialog, DialogTitle, DialogContent, DialogActions, Button, TextField, MenuItem, Box, List, ListItem, ListItemButton, ListItemText, Typography, Chip, InputAdornment, IconButton, Divider, CircularProgress, Pagination, Autocomplete, } from "@mui/material";
|
|
12
|
+
import { Search as SearchIcon, Clear as ClearIcon, FilterList as FilterIcon, } from "@mui/icons-material";
|
|
13
|
+
import { PARTNER_REGION_READABLE } from "../consts/region";
|
|
14
|
+
import { fetchComponents, getAllPartners } from "../util/api";
|
|
15
|
+
import { InternalServices } from "../../api/init";
|
|
16
|
+
export default function ComponentPickerModal({ open, onClose, onSelect, selectedComponent, }) {
|
|
17
|
+
const [searchTerm, setSearchTerm] = useState("");
|
|
18
|
+
const [selectedRegion, setSelectedRegion] = useState("");
|
|
19
|
+
const [selectedPartner, setSelectedPartner] = useState("");
|
|
20
|
+
const [selectedTemplate, setSelectedTemplate] = useState("");
|
|
21
|
+
const [components, setComponents] = useState([]);
|
|
22
|
+
const [templates, setTemplates] = useState([]);
|
|
23
|
+
const [partners, setPartners] = useState([]);
|
|
24
|
+
const [regions, setRegions] = useState([]);
|
|
25
|
+
const [loading, setLoading] = useState(false);
|
|
26
|
+
const [initialLoading, setInitialLoading] = useState(false);
|
|
27
|
+
const [page, setPage] = useState(1);
|
|
28
|
+
const [pageSize] = useState(10);
|
|
29
|
+
const [totalCount, setTotalCount] = useState(0);
|
|
30
|
+
const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const timer = setTimeout(() => {
|
|
33
|
+
setDebouncedSearchTerm(searchTerm);
|
|
34
|
+
}, 300);
|
|
35
|
+
return () => clearTimeout(timer);
|
|
36
|
+
}, [searchTerm]);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (open && templates.length === 0) {
|
|
39
|
+
loadInitialData();
|
|
40
|
+
}
|
|
41
|
+
}, [open]);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (open) {
|
|
44
|
+
fetchFilteredComponents();
|
|
45
|
+
}
|
|
46
|
+
}, [open, debouncedSearchTerm, selectedRegion, selectedPartner, selectedTemplate, page]);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (open) {
|
|
49
|
+
setPage(1);
|
|
50
|
+
}
|
|
51
|
+
}, [debouncedSearchTerm, selectedRegion, selectedPartner, selectedTemplate]);
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
if (open) {
|
|
54
|
+
setSearchTerm("");
|
|
55
|
+
setSelectedRegion("");
|
|
56
|
+
setSelectedPartner("");
|
|
57
|
+
setSelectedTemplate("");
|
|
58
|
+
}
|
|
59
|
+
}, [open]);
|
|
60
|
+
const loadInitialData = () => __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
setInitialLoading(true);
|
|
62
|
+
try {
|
|
63
|
+
const [templatesData, partnersData, regionsData] = yield Promise.all([
|
|
64
|
+
InternalServices.CoreService.templateList(),
|
|
65
|
+
getAllPartners(),
|
|
66
|
+
InternalServices.ItineraryService.regionList(),
|
|
67
|
+
]);
|
|
68
|
+
setTemplates(templatesData.data);
|
|
69
|
+
setPartners(partnersData);
|
|
70
|
+
setRegions(regionsData.data);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error("Error loading initial data:", error);
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
setInitialLoading(false);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
const fetchFilteredComponents = () => __awaiter(this, void 0, void 0, function* () {
|
|
80
|
+
setLoading(true);
|
|
81
|
+
try {
|
|
82
|
+
const query = {
|
|
83
|
+
limit: pageSize.toString(),
|
|
84
|
+
page: page.toString(),
|
|
85
|
+
};
|
|
86
|
+
if (debouncedSearchTerm)
|
|
87
|
+
query.search = debouncedSearchTerm;
|
|
88
|
+
if (selectedRegion)
|
|
89
|
+
query.regions = selectedRegion;
|
|
90
|
+
if (selectedPartner)
|
|
91
|
+
query.partners = selectedPartner;
|
|
92
|
+
if (selectedTemplate)
|
|
93
|
+
query.templateId = selectedTemplate;
|
|
94
|
+
const { data, pagination } = yield fetchComponents(query);
|
|
95
|
+
setComponents(data || []);
|
|
96
|
+
setTotalCount(pagination.total || 0);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error("Error fetching components:", error);
|
|
100
|
+
setComponents([]);
|
|
101
|
+
setTotalCount(0);
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
setLoading(false);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
const usedRegions = regions;
|
|
108
|
+
const usedPartners = partners;
|
|
109
|
+
const usedTemplates = templates;
|
|
110
|
+
const handleClearFilters = () => {
|
|
111
|
+
setSelectedRegion("");
|
|
112
|
+
setSelectedPartner("");
|
|
113
|
+
setSelectedTemplate("");
|
|
114
|
+
};
|
|
115
|
+
const handleClearSearch = () => setSearchTerm("");
|
|
116
|
+
const handleSelect = (component) => {
|
|
117
|
+
onSelect(component);
|
|
118
|
+
onClose();
|
|
119
|
+
};
|
|
120
|
+
const getComponentDetails = (component) => {
|
|
121
|
+
const template = templates.find(t => t.id === component.templateId);
|
|
122
|
+
const componentPartners = partners.filter(p => { var _a; return p.id && ((_a = component.partners) === null || _a === void 0 ? void 0 : _a.includes(p.id)); });
|
|
123
|
+
const componentRegions = regions.filter(r => { var _a; return (_a = component.regions) === null || _a === void 0 ? void 0 : _a.includes(r.id); });
|
|
124
|
+
return { template, partners: componentPartners, regions: componentRegions };
|
|
125
|
+
};
|
|
126
|
+
const hasActiveFilters = selectedRegion || selectedPartner || selectedTemplate;
|
|
127
|
+
if (initialLoading) {
|
|
128
|
+
return (React.createElement(Dialog, { open: open, onClose: onClose, maxWidth: "md", fullWidth: true, PaperProps: { sx: { height: "80vh", maxHeight: "800px" } } },
|
|
129
|
+
React.createElement(DialogContent, null,
|
|
130
|
+
React.createElement(Box, { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", py: 8 },
|
|
131
|
+
React.createElement(CircularProgress, { size: 48, sx: { mb: 2 } }),
|
|
132
|
+
React.createElement(Typography, { variant: "body1", color: "text.secondary" }, "Loading component data...")))));
|
|
133
|
+
}
|
|
134
|
+
return (React.createElement(Dialog, { open: open, onClose: onClose, maxWidth: "md", fullWidth: true, PaperProps: { sx: { height: "80vh", maxHeight: "800px" } } },
|
|
135
|
+
React.createElement(DialogTitle, null,
|
|
136
|
+
React.createElement(Box, { display: "flex", alignItems: "center", justifyContent: "space-between" },
|
|
137
|
+
React.createElement(Typography, { variant: "h6" }, "Select Component"),
|
|
138
|
+
hasActiveFilters && (React.createElement(Button, { size: "small", startIcon: React.createElement(ClearIcon, null), onClick: handleClearFilters }, "Clear Filters")))),
|
|
139
|
+
React.createElement(DialogContent, { dividers: true },
|
|
140
|
+
React.createElement(TextField, { fullWidth: true, placeholder: "Search components...", value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), InputProps: {
|
|
141
|
+
startAdornment: React.createElement(InputAdornment, { position: "start" },
|
|
142
|
+
React.createElement(SearchIcon, null)),
|
|
143
|
+
endAdornment: searchTerm && (React.createElement(InputAdornment, { position: "end" },
|
|
144
|
+
React.createElement(IconButton, { size: "small", onClick: handleClearSearch },
|
|
145
|
+
React.createElement(ClearIcon, null)))),
|
|
146
|
+
}, sx: { mb: 2 } }),
|
|
147
|
+
React.createElement(Box, { display: "flex", gap: 2, mb: 2, flexWrap: "wrap" },
|
|
148
|
+
React.createElement(Autocomplete, { size: "small", options: usedRegions, getOptionLabel: (option) => option.name, value: usedRegions.find(r => r.id === selectedRegion) || null, onChange: (_, newValue) => setSelectedRegion((newValue === null || newValue === void 0 ? void 0 : newValue.id) || ""), renderInput: (params) => React.createElement(TextField, Object.assign({}, params, { label: "Region" })), sx: { minWidth: 160 }, isOptionEqualToValue: (option, value) => option.id === value.id }),
|
|
149
|
+
React.createElement(TextField, { select: true, size: "small", label: "Partner", value: selectedPartner, onChange: (e) => setSelectedPartner(e.target.value), sx: { minWidth: 160 } },
|
|
150
|
+
React.createElement(MenuItem, { value: "" }, "All Partners"),
|
|
151
|
+
usedPartners.map((partner) => (React.createElement(MenuItem, { key: partner.id, value: partner.id }, partner.name)))),
|
|
152
|
+
React.createElement(TextField, { select: true, size: "small", label: "Type", value: selectedTemplate, onChange: (e) => setSelectedTemplate(e.target.value), sx: { minWidth: 160 } },
|
|
153
|
+
React.createElement(MenuItem, { value: "" }, "All Types"),
|
|
154
|
+
usedTemplates.map((template) => (React.createElement(MenuItem, { key: template.id, value: template.id },
|
|
155
|
+
template.name,
|
|
156
|
+
" v",
|
|
157
|
+
template.revision))))),
|
|
158
|
+
React.createElement(Box, { display: "flex", alignItems: "center", gap: 2, mb: 1 },
|
|
159
|
+
React.createElement(Typography, { variant: "body2", color: "text.secondary" },
|
|
160
|
+
totalCount,
|
|
161
|
+
" component",
|
|
162
|
+
totalCount !== 1 ? "s" : "",
|
|
163
|
+
" found"),
|
|
164
|
+
loading && React.createElement(CircularProgress, { size: 16 })),
|
|
165
|
+
React.createElement(List, { sx: { display: "flex", flexDirection: "column", flex: 1, overflow: "auto" } }, loading && components.length === 0 ? (React.createElement(Box, { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", py: 4 },
|
|
166
|
+
React.createElement(CircularProgress, { size: 48, sx: { mb: 2 } }),
|
|
167
|
+
React.createElement(Typography, { variant: "body1", color: "text.secondary" }, "Loading components..."))) : components.length === 0 ? (React.createElement(Box, { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", py: 4 },
|
|
168
|
+
React.createElement(FilterIcon, { sx: { fontSize: 48, color: "text.secondary", mb: 2 } }),
|
|
169
|
+
React.createElement(Typography, { variant: "body1", color: "text.secondary" }, "No components match your search criteria"),
|
|
170
|
+
React.createElement(Typography, { variant: "body2", color: "text.secondary" }, "Try adjusting your filters or search term"))) : (components.map((component, index) => {
|
|
171
|
+
const details = getComponentDetails(component);
|
|
172
|
+
const isSelected = (selectedComponent === null || selectedComponent === void 0 ? void 0 : selectedComponent.id) === component.id;
|
|
173
|
+
return (React.createElement(React.Fragment, { key: component.id },
|
|
174
|
+
React.createElement(ListItem, { disablePadding: true },
|
|
175
|
+
React.createElement(ListItemButton, { onClick: () => handleSelect(component), selected: isSelected, sx: {
|
|
176
|
+
flexDirection: "column",
|
|
177
|
+
alignItems: "flex-start",
|
|
178
|
+
py: 2,
|
|
179
|
+
"&.Mui-selected": {
|
|
180
|
+
backgroundColor: "primary.50",
|
|
181
|
+
borderLeft: "4px solid",
|
|
182
|
+
borderColor: "primary.main",
|
|
183
|
+
},
|
|
184
|
+
} },
|
|
185
|
+
React.createElement(Box, { width: "100%" },
|
|
186
|
+
React.createElement(ListItemText, { primary: React.createElement(Typography, { variant: "subtitle1", fontWeight: "medium" }, component.name), secondary: React.createElement(Box, { mt: 1 },
|
|
187
|
+
details.template && (React.createElement(Typography, { variant: "body2", color: "text.secondary" },
|
|
188
|
+
"Type: ",
|
|
189
|
+
details.template.name)),
|
|
190
|
+
details.regions.length > 0 && (React.createElement(Box, { display: "flex", alignItems: "center", gap: 1, mt: 0.5 },
|
|
191
|
+
React.createElement(Typography, { variant: "body2", color: "text.secondary" }, "Regions:"),
|
|
192
|
+
details.regions.map(region => (React.createElement(Chip, { key: region.id, label: region.name, size: "small", variant: "outlined" }))))),
|
|
193
|
+
details.partners.length > 0 && (React.createElement(Box, { display: "flex", alignItems: "center", gap: 1, mt: 0.5 },
|
|
194
|
+
React.createElement(Typography, { variant: "body2", color: "text.secondary" }, "Partners:"),
|
|
195
|
+
details.partners.slice(0, 3).map(partner => (React.createElement(Chip, { key: partner.id, label: `${partner.name} - ${PARTNER_REGION_READABLE[partner.id || "".split("-")[0]]}`, size: "small", variant: "outlined", color: "secondary" }))),
|
|
196
|
+
details.partners.length > 3 && (React.createElement(Typography, { variant: "body2", color: "text.secondary" },
|
|
197
|
+
"+",
|
|
198
|
+
details.partners.length - 3,
|
|
199
|
+
" more"))))) })))),
|
|
200
|
+
index < components.length - 1 && React.createElement(Divider, null)));
|
|
201
|
+
}))),
|
|
202
|
+
components.length > 0 && (React.createElement(Box, { display: "flex", justifyContent: "center", mt: 2 },
|
|
203
|
+
React.createElement(Pagination, { count: Math.ceil(totalCount / pageSize), page: page, onChange: (_, newPage) => setPage(newPage), color: "primary" })))),
|
|
204
|
+
React.createElement(DialogActions, null,
|
|
205
|
+
React.createElement(Button, { onClick: onClose }, "Cancel"),
|
|
206
|
+
selectedComponent && (React.createElement(Button, { variant: "contained", onClick: () => handleSelect(selectedComponent) },
|
|
207
|
+
"Select ",
|
|
208
|
+
selectedComponent.name)))));
|
|
209
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const PARTNER_REGION_READABLE: Record<string, string>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { DTOComponentRead } from '../../api/generated/core/exports';
|
|
3
|
+
interface ComponentPickerExports {
|
|
4
|
+
get: () => Promise<DTOComponentRead>;
|
|
5
|
+
}
|
|
6
|
+
interface Props {
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export declare const useComponentPicker: () => ComponentPickerExports;
|
|
10
|
+
declare const ComponentPickerProvider: React.FC<Props>;
|
|
11
|
+
export default ComponentPickerProvider;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import React, { createContext, useContext, useRef, useState } from 'react';
|
|
11
|
+
import ComponentPickerModal from '../components/ComponentPicker';
|
|
12
|
+
const ComponentSelectorContext = createContext(undefined);
|
|
13
|
+
export const useComponentPicker = () => {
|
|
14
|
+
const picker = useContext(ComponentSelectorContext);
|
|
15
|
+
if (!picker)
|
|
16
|
+
throw new Error("useComponentPicker used from outside selector context");
|
|
17
|
+
return picker;
|
|
18
|
+
};
|
|
19
|
+
const ComponentPickerProvider = ({ children }) => {
|
|
20
|
+
const [open, setOpen] = useState(false);
|
|
21
|
+
const changeProp = useRef(() => { });
|
|
22
|
+
const closeProp = useRef(() => { });
|
|
23
|
+
const getSelectedComponent = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
24
|
+
setOpen(true);
|
|
25
|
+
return new Promise((res, rej) => {
|
|
26
|
+
// In case of old refs being called (so i dont need to explicitly remove them)
|
|
27
|
+
let done = false;
|
|
28
|
+
changeProp.current = (value) => {
|
|
29
|
+
if (done)
|
|
30
|
+
return;
|
|
31
|
+
done = true;
|
|
32
|
+
res(value);
|
|
33
|
+
setOpen(false);
|
|
34
|
+
};
|
|
35
|
+
closeProp.current = () => {
|
|
36
|
+
if (done)
|
|
37
|
+
return;
|
|
38
|
+
done = true;
|
|
39
|
+
rej();
|
|
40
|
+
setOpen(false);
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
return (React.createElement(ComponentSelectorContext.Provider, { value: { get: getSelectedComponent } },
|
|
45
|
+
React.createElement(ComponentPickerModal, { open: open, onClose: closeProp.current, onSelect: changeProp.current }),
|
|
46
|
+
children));
|
|
47
|
+
};
|
|
48
|
+
export default ComponentPickerProvider;
|
|
@@ -9,3 +9,4 @@ export * from "./registry/types";
|
|
|
9
9
|
export { MasterSchema, Stage } from "./schema/formSchemaTypes";
|
|
10
10
|
export { FORM_BUILDER_JSON_SCHEMA } from "./schema/formBuilders/formBuilderJsonSchema";
|
|
11
11
|
export { FORM_BUILDER_UI_SCHEMA } from "./schema/formBuilders/formBuilderUiSchema";
|
|
12
|
+
export * from "./contexts/ComponentPickerContext";
|
package/dist/rendering/index.js
CHANGED
|
@@ -9,3 +9,4 @@ export * from "./registry/types";
|
|
|
9
9
|
export { Stage } from "./schema/formSchemaTypes";
|
|
10
10
|
export { FORM_BUILDER_JSON_SCHEMA } from "./schema/formBuilders/formBuilderJsonSchema";
|
|
11
11
|
export { FORM_BUILDER_UI_SCHEMA } from "./schema/formBuilders/formBuilderUiSchema";
|
|
12
|
+
export * from "./contexts/ComponentPickerContext";
|
|
@@ -8,36 +8,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
11
|
-
import { Paper,
|
|
11
|
+
import { Paper, Button } from '@mui/material';
|
|
12
12
|
import { useLocalErrors } from '../hooks/errors';
|
|
13
13
|
import { ComponentPool } from '../registry/types';
|
|
14
14
|
import { registerComponent } from '../registry/components';
|
|
15
15
|
import { CoreService } from '../../api/generated/core';
|
|
16
|
+
import { useComponentPicker } from '../contexts/ComponentPickerContext';
|
|
16
17
|
const FormComponentPicker = ({ components, selectedComponent, onChange, templateIds, getError, label, enabled }) => {
|
|
17
18
|
const selected = components.find(c => c.id === selectedComponent) || null;
|
|
19
|
+
const { get } = useComponentPicker();
|
|
18
20
|
return (React.createElement(Paper, { component: "form", sx: { display: 'flex', flexDirection: 'column', gap: 1, p: 2, mb: 1 }, noValidate: true, autoComplete: "off" },
|
|
19
|
-
React.createElement(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"& .MuiAutocomplete-endAdornment": {
|
|
25
|
-
cursor: enabled ? "pointer" : "default",
|
|
26
|
-
},
|
|
27
|
-
} }))), renderOption: (props, option) => (React.createElement("li", Object.assign({}, props, { style: { cursor: enabled ? "pointer" : "default" } }),
|
|
28
|
-
React.createElement(Box, null,
|
|
29
|
-
React.createElement(Typography, { variant: "body1" }, option.name),
|
|
30
|
-
React.createElement(Typography, { variant: "caption", color: "text.secondary" },
|
|
31
|
-
"Version: v",
|
|
32
|
-
option.revision)))), isOptionEqualToValue: (option, value) => option.id === value.id, sx: {
|
|
33
|
-
cursor: enabled ? "pointer" : "default",
|
|
34
|
-
"& .MuiAutocomplete-inputRoot": {
|
|
35
|
-
cursor: enabled ? "pointer" : "default",
|
|
36
|
-
},
|
|
37
|
-
"& .MuiAutocomplete-endAdornment": {
|
|
38
|
-
cursor: enabled ? "pointer" : "default",
|
|
39
|
-
},
|
|
40
|
-
} })));
|
|
21
|
+
React.createElement(Button, { onClick: (e) => {
|
|
22
|
+
get()
|
|
23
|
+
.then((comp) => onChange(comp.id))
|
|
24
|
+
.finally(() => { });
|
|
25
|
+
} }, (selected === null || selected === void 0 ? void 0 : selected.name) || label)));
|
|
41
26
|
};
|
|
42
27
|
const FormRendererComponentPicker = ({ data, handleChange, path, label, enabled, schema }) => {
|
|
43
28
|
const [components, setComponents] = useState([]);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DTOComponentRead, Pagination } from "../../api/generated/core/exports";
|
|
2
|
+
export declare const getAllPartners: () => Promise<any[]>;
|
|
3
|
+
export declare const fetchComponents: (filters?: Record<string, string>) => Promise<{
|
|
4
|
+
data: Array<DTOComponentRead & {
|
|
5
|
+
revisions: DTOComponentRead[];
|
|
6
|
+
}>;
|
|
7
|
+
pagination: Pagination;
|
|
8
|
+
}>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { OpenAPI } from "../../api/generated/core";
|
|
11
|
+
import { InternalServices } from "../../api/init";
|
|
12
|
+
const Regions = ['patagonia', 'arctic', 'antarctica'];
|
|
13
|
+
export const getAllPartners = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
14
|
+
try {
|
|
15
|
+
const finalData = [];
|
|
16
|
+
for (let index = 0; index < Regions.length; index++) {
|
|
17
|
+
const region = Regions[index];
|
|
18
|
+
const partners = yield InternalServices.SwoopService.partnersGetCollection(1, 500, region);
|
|
19
|
+
// @ts-expect-error
|
|
20
|
+
if (partners === null || partners === void 0 ? void 0 : partners.member) {
|
|
21
|
+
// @ts-expect-error
|
|
22
|
+
finalData.push(...partners.member);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return finalData;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.error("Failed to fetch members:", error);
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
export const fetchComponents = (filters) => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
|
+
const idToken = OpenAPI.TOKEN;
|
|
34
|
+
const query = new URLSearchParams(filters || {}).toString() || "limit=2000";
|
|
35
|
+
const response = yield fetch(`${OpenAPI.BASE}/core-data-service/v1/components?${query}`, {
|
|
36
|
+
headers: {
|
|
37
|
+
Authorization: `Bearer ${idToken}`,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
const data = yield response.json();
|
|
41
|
+
const componentsByGroup = new Map();
|
|
42
|
+
(data.data || []).forEach((component) => {
|
|
43
|
+
const groupId = component.revisionGroupId;
|
|
44
|
+
if (!componentsByGroup.has(groupId)) {
|
|
45
|
+
componentsByGroup.set(groupId, []);
|
|
46
|
+
}
|
|
47
|
+
componentsByGroup.get(groupId).push(component);
|
|
48
|
+
});
|
|
49
|
+
const latestComponents = Array.from(componentsByGroup.values()).map((components) => {
|
|
50
|
+
const sorted = components.sort((a, b) => b.revision - a.revision);
|
|
51
|
+
return Object.assign(Object.assign({}, sorted[0]), { revisions: sorted });
|
|
52
|
+
});
|
|
53
|
+
return { data: latestComponents, pagination: data.pagination };
|
|
54
|
+
});
|