@vegan-friendly/strapi-plugin-elasticsearch 0.1.0-alpha.1 → 0.1.0-alpha.3
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/admin/components/Initializer/index.d.ts +15 -0
- package/dist/admin/components/Initializer/index.js +25 -0
- package/dist/admin/components/PluginIcon/index.d.ts +8 -0
- package/dist/admin/components/PluginIcon/index.js +14 -0
- package/dist/admin/components/SubNavigation/index.d.ts +4 -0
- package/dist/admin/components/SubNavigation/index.js +40 -0
- package/dist/admin/index.d.ts +8 -0
- package/dist/admin/index.js +92 -0
- package/dist/admin/pages/App/index.d.ts +9 -0
- package/dist/admin/pages/App/index.js +29 -0
- package/dist/admin/pages/ConfigureCollection/index.d.ts +3 -0
- package/dist/admin/pages/ConfigureCollection/index.js +193 -0
- package/dist/admin/pages/ConfigureCollectionList/index.d.ts +3 -0
- package/dist/admin/pages/ConfigureCollectionList/index.js +228 -0
- package/dist/admin/pages/Homepage/index.d.ts +3 -0
- package/dist/admin/pages/Homepage/index.js +155 -0
- package/dist/admin/pages/ViewIndexingRunLog/index.d.ts +3 -0
- package/dist/admin/pages/ViewIndexingRunLog/index.js +125 -0
- package/dist/admin/pluginId.d.ts +2 -0
- package/dist/admin/pluginId.js +8 -0
- package/dist/admin/src/components/Initializer/index.d.ts +15 -0
- package/dist/admin/src/components/Initializer/index.js +25 -0
- package/dist/admin/src/components/PluginIcon/index.d.ts +8 -0
- package/dist/admin/src/components/PluginIcon/index.js +14 -0
- package/dist/admin/src/components/SubNavigation/index.d.ts +4 -0
- package/dist/admin/src/components/SubNavigation/index.js +40 -0
- package/dist/admin/src/index.d.ts +8 -0
- package/dist/admin/src/index.js +92 -0
- package/dist/admin/src/pages/App/index.d.ts +9 -0
- package/dist/admin/src/pages/App/index.js +29 -0
- package/dist/admin/src/pages/ConfigureCollection/index.d.ts +3 -0
- package/dist/admin/src/pages/ConfigureCollection/index.js +193 -0
- package/dist/admin/src/pages/ConfigureCollectionList/index.d.ts +3 -0
- package/dist/admin/src/pages/ConfigureCollectionList/index.js +228 -0
- package/dist/admin/src/pages/Homepage/index.d.ts +3 -0
- package/dist/admin/src/pages/Homepage/index.js +155 -0
- package/dist/admin/src/pages/ViewIndexingRunLog/index.d.ts +3 -0
- package/dist/admin/src/pages/ViewIndexingRunLog/index.js +125 -0
- package/dist/admin/src/pluginId.d.ts +2 -0
- package/dist/admin/src/pluginId.js +8 -0
- package/dist/admin/src/utils/apiUrls.d.ts +10 -0
- package/dist/admin/src/utils/apiUrls.js +20 -0
- package/dist/admin/src/utils/axiosInstance.d.ts +5 -0
- package/dist/admin/src/utils/axiosInstance.js +33 -0
- package/dist/admin/src/utils/getTrad.d.ts +2 -0
- package/dist/admin/src/utils/getTrad.js +8 -0
- package/dist/admin/utils/apiUrls.d.ts +10 -0
- package/dist/admin/utils/apiUrls.js +20 -0
- package/dist/admin/utils/axiosInstance.d.ts +5 -0
- package/dist/admin/utils/axiosInstance.js +33 -0
- package/dist/admin/utils/getTrad.d.ts +2 -0
- package/dist/admin/utils/getTrad.js +8 -0
- package/dist/server/bootstrap.js +125 -0
- package/dist/server/config/index.d.ts +0 -0
- package/dist/server/config/index.js +5 -0
- package/dist/server/content-types/index.d.ts +2 -0
- package/{server → dist/server}/content-types/index.js +7 -9
- package/dist/server/content-types/indexing-logs.d.ts +0 -0
- package/dist/server/content-types/indexing-logs.js +35 -0
- package/dist/server/content-types/name-prefix.d.ts +0 -0
- package/dist/server/content-types/name-prefix.js +1 -0
- package/dist/server/content-types/tasks.d.ts +0 -0
- package/dist/server/content-types/tasks.js +52 -0
- package/dist/server/controllers/configure-indexing.d.ts +0 -0
- package/dist/server/controllers/configure-indexing.js +58 -0
- package/dist/server/controllers/index.d.ts +5 -0
- package/{server → dist/server}/controllers/index.js +13 -15
- package/dist/server/controllers/log-indexing.d.ts +0 -0
- package/{server → dist/server}/controllers/log-indexing.js +10 -11
- package/dist/server/controllers/perform-indexing.d.ts +0 -0
- package/{server → dist/server}/controllers/perform-indexing.js +22 -28
- package/dist/server/controllers/perform-search.d.ts +1 -0
- package/dist/server/controllers/perform-search.js +29 -0
- package/dist/server/controllers/setup-info.d.ts +0 -0
- package/{server → dist/server}/controllers/setup-info.js +10 -14
- package/dist/server/destroy.d.ts +0 -0
- package/{server → dist/server}/destroy.js +4 -5
- package/dist/server/index.d.ts +10 -0
- package/{server → dist/server}/index.js +23 -25
- package/dist/server/middlewares/index.d.ts +0 -0
- package/{server → dist/server}/middlewares/index.js +2 -3
- package/dist/server/policies/index.d.ts +0 -0
- package/{server → dist/server}/policies/index.js +2 -3
- package/dist/server/register.d.ts +0 -0
- package/{server → dist/server}/register.js +4 -5
- package/dist/server/routes/configure-indexing.d.ts +0 -0
- package/dist/server/routes/configure-indexing.js +43 -0
- package/dist/server/routes/index.d.ts +5 -0
- package/{server → dist/server}/routes/index.js +13 -13
- package/dist/server/routes/perform-indexing.d.ts +0 -0
- package/dist/server/routes/perform-indexing.js +25 -0
- package/dist/server/routes/perform-search.d.ts +0 -0
- package/dist/server/routes/perform-search.js +15 -0
- package/dist/server/routes/run-log.d.ts +0 -0
- package/dist/server/routes/run-log.js +13 -0
- package/dist/server/routes/setup-info.d.ts +0 -0
- package/dist/server/routes/setup-info.js +13 -0
- package/dist/server/services/configure-indexing.d.ts +24 -0
- package/dist/server/services/configure-indexing.js +161 -0
- package/dist/server/services/es-interface.d.ts +4 -0
- package/dist/server/services/es-interface.js +161 -0
- package/dist/server/services/helper.d.ts +34 -0
- package/{server → dist/server}/services/helper.js +269 -305
- package/dist/server/services/index.d.ts +7 -0
- package/{server → dist/server}/services/index.js +17 -21
- package/dist/server/services/log-indexing.d.ts +0 -0
- package/{server → dist/server}/services/log-indexing.js +27 -26
- package/dist/server/services/perform-indexing.d.ts +0 -0
- package/{server → dist/server}/services/perform-indexing.js +147 -173
- package/dist/server/services/schedule-indexing.d.ts +0 -0
- package/{server → dist/server}/services/schedule-indexing.js +61 -65
- package/dist/server/services/transform-content.d.ts +2 -0
- package/{server → dist/server}/services/transform-content.js +21 -22
- package/dist/strapi-admin.d.ts +0 -0
- package/{strapi-admin.js → dist/strapi-admin.js} +2 -3
- package/dist/strapi-server.d.ts +0 -0
- package/{strapi-server.js → dist/strapi-server.js} +2 -3
- package/package.json +24 -3
- package/.prettierrc +0 -7
- package/.vscode/settings.json +0 -24
- package/admin/src/components/Initializer/index.js +0 -26
- package/admin/src/components/PluginIcon/index.js +0 -12
- package/admin/src/components/SubNavigation/index.js +0 -48
- package/admin/src/index.js +0 -63
- package/admin/src/pages/App/index.js +0 -29
- package/admin/src/pages/ConfigureCollection/index.js +0 -225
- package/admin/src/pages/ConfigureCollectionList/index.js +0 -266
- package/admin/src/pages/Homepage/index.js +0 -168
- package/admin/src/pages/ViewIndexingRunLog/index.js +0 -124
- package/admin/src/pluginId.js +0 -5
- package/admin/src/translations/en.json +0 -1
- package/admin/src/translations/fr.json +0 -1
- package/admin/src/utils/apiUrls.js +0 -14
- package/admin/src/utils/axiosInstance.js +0 -40
- package/admin/src/utils/getTrad.js +0 -5
- package/server/bootstrap.js +0 -142
- package/server/config/index.js +0 -6
- package/server/content-types/indexing-logs.js +0 -35
- package/server/content-types/tasks.js +0 -52
- package/server/controllers/configure-indexing.js +0 -66
- package/server/controllers/perform-search.js +0 -31
- package/server/routes/configure-indexing.js +0 -42
- package/server/routes/perform-indexing.js +0 -24
- package/server/routes/perform-search.js +0 -14
- package/server/routes/run-log.js +0 -12
- package/server/routes/setup-info.js +0 -12
- package/server/services/configure-indexing.js +0 -184
- package/server/services/es-interface.js +0 -187
- package/server/services/virtual-collections-registry.js +0 -346
- /package/{server/content-types/name-prefix.js → dist/server/bootstrap.d.ts} +0 -0
@@ -0,0 +1,228 @@
|
|
1
|
+
"use strict";
|
2
|
+
/*
|
3
|
+
*
|
4
|
+
* HomePage
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
8
|
+
if (k2 === undefined) k2 = k;
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
12
|
+
}
|
13
|
+
Object.defineProperty(o, k2, desc);
|
14
|
+
}) : (function(o, m, k, k2) {
|
15
|
+
if (k2 === undefined) k2 = k;
|
16
|
+
o[k2] = m[k];
|
17
|
+
}));
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
20
|
+
}) : function(o, v) {
|
21
|
+
o["default"] = v;
|
22
|
+
});
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
24
|
+
var ownKeys = function(o) {
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
26
|
+
var ar = [];
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
28
|
+
return ar;
|
29
|
+
};
|
30
|
+
return ownKeys(o);
|
31
|
+
};
|
32
|
+
return function (mod) {
|
33
|
+
if (mod && mod.__esModule) return mod;
|
34
|
+
var result = {};
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
36
|
+
__setModuleDefault(result, mod);
|
37
|
+
return result;
|
38
|
+
};
|
39
|
+
})();
|
40
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
41
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
42
|
+
};
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
44
|
+
const react_1 = __importStar(require("react"));
|
45
|
+
// import PropTypes from 'prop-types';
|
46
|
+
const pluginId_1 = __importDefault(require("../../pluginId"));
|
47
|
+
const SubNavigation_1 = require("../../components/SubNavigation");
|
48
|
+
;
|
49
|
+
const design_system_1 = require("@strapi/design-system");
|
50
|
+
const react_2 = require("react");
|
51
|
+
const apiUrls_1 = require("../../utils/apiUrls");
|
52
|
+
const axiosInstance_1 = __importDefault(require("../../utils/axiosInstance"));
|
53
|
+
const design_system_2 = require("@strapi/design-system");
|
54
|
+
const design_system_3 = require("@strapi/design-system");
|
55
|
+
const icons_1 = require("@strapi/icons");
|
56
|
+
const design_system_4 = require("@strapi/design-system");
|
57
|
+
const react_router_dom_1 = require("react-router-dom");
|
58
|
+
const design_system_5 = require("@strapi/design-system");
|
59
|
+
const design_system_6 = require("@strapi/design-system");
|
60
|
+
const design_system_7 = require("@strapi/design-system");
|
61
|
+
const helper_plugin_1 = require("@strapi/helper-plugin");
|
62
|
+
const exportContentConfig = () => {
|
63
|
+
return axiosInstance_1.default.get(apiUrls_1.apiGetContentConfig, {
|
64
|
+
responseType: 'blob'
|
65
|
+
})
|
66
|
+
.then((response) => {
|
67
|
+
const href = URL.createObjectURL(response.data);
|
68
|
+
const link = document.createElement('a');
|
69
|
+
link.href = href;
|
70
|
+
link.setAttribute('download', 'strapi-plugin-elasticsearch-contentconfig.json');
|
71
|
+
document.body.appendChild(link);
|
72
|
+
link.click();
|
73
|
+
document.body.removeChild(link);
|
74
|
+
URL.revokeObjectURL(href);
|
75
|
+
});
|
76
|
+
};
|
77
|
+
const importContentConfig = (conf) => {
|
78
|
+
return axiosInstance_1.default.post(apiUrls_1.apiImportContentConfig, {
|
79
|
+
data: conf
|
80
|
+
});
|
81
|
+
};
|
82
|
+
const loadContentConfig = () => {
|
83
|
+
return axiosInstance_1.default.get(apiUrls_1.apiGetContentConfig)
|
84
|
+
.then((resp) => resp.data);
|
85
|
+
};
|
86
|
+
const scheduleCollectionIndexing = (collectionName) => {
|
87
|
+
return axiosInstance_1.default.get((0, apiUrls_1.apiRequestCollectionIndexing)(collectionName));
|
88
|
+
};
|
89
|
+
const Configure = () => {
|
90
|
+
const [isInProgress, setIsInProgress] = (0, react_1.useState)(false);
|
91
|
+
const [displayImportModal, setDisplayImportModal] = (0, react_1.useState)(false);
|
92
|
+
const [isEnteredJsonValid, setIsEnteredJsonValid] = (0, react_1.useState)(true);
|
93
|
+
const [importJson, setImportJson] = (0, react_1.useState)(null);
|
94
|
+
const [config, setConfig] = (0, react_1.useState)(null);
|
95
|
+
const history = (0, react_router_dom_1.useHistory)();
|
96
|
+
const toggleNotification = (0, helper_plugin_1.useNotification)();
|
97
|
+
const performImport = () => {
|
98
|
+
const conf = importJson;
|
99
|
+
console.log(conf && conf.length > 0);
|
100
|
+
if (conf && conf.length > 0) {
|
101
|
+
setIsInProgress(true);
|
102
|
+
importContentConfig(conf)
|
103
|
+
.then(() => {
|
104
|
+
toggleNotification({
|
105
|
+
type: "success", message: "Collections configuration imported. Please refresh this view.", timeout: 5000
|
106
|
+
});
|
107
|
+
})
|
108
|
+
.catch((err) => {
|
109
|
+
toggleNotification({
|
110
|
+
type: "warning", message: "Importing collections configuration failed. An error was encountered.", timeout: 5000
|
111
|
+
});
|
112
|
+
console.log(err);
|
113
|
+
})
|
114
|
+
.finally(() => setIsInProgress(false));
|
115
|
+
}
|
116
|
+
};
|
117
|
+
const performExport = () => {
|
118
|
+
setIsInProgress(true);
|
119
|
+
exportContentConfig()
|
120
|
+
.then(() => {
|
121
|
+
toggleNotification({
|
122
|
+
type: "success", message: "Collections configuration exported.", timeout: 5000
|
123
|
+
});
|
124
|
+
})
|
125
|
+
.catch((err) => {
|
126
|
+
toggleNotification({
|
127
|
+
type: "warning", message: "Exporting collections configuration failed. An error was encountered.", timeout: 5000
|
128
|
+
});
|
129
|
+
console.log(err);
|
130
|
+
})
|
131
|
+
.finally(() => setIsInProgress(false));
|
132
|
+
};
|
133
|
+
(0, react_2.useEffect)(() => {
|
134
|
+
if (importJson && importJson.length > 0) {
|
135
|
+
try {
|
136
|
+
JSON.parse(importJson);
|
137
|
+
setIsEnteredJsonValid(true);
|
138
|
+
}
|
139
|
+
catch (e) {
|
140
|
+
setIsEnteredJsonValid(false);
|
141
|
+
}
|
142
|
+
}
|
143
|
+
}, [importJson]);
|
144
|
+
(0, react_2.useEffect)(() => {
|
145
|
+
setIsInProgress(true);
|
146
|
+
loadContentConfig()
|
147
|
+
.then((resp) => {
|
148
|
+
const displayConfig = [];
|
149
|
+
for (let r = 0; r < Object.keys(resp).length; r++) {
|
150
|
+
const item = { collectionName: Object.keys(resp)[r], indexed: [], notIndexed: [] };
|
151
|
+
const collectionName = item.collectionName;
|
152
|
+
for (let k = 0; k < Object.keys(resp[collectionName]).length; k++) {
|
153
|
+
const attribs = resp[collectionName];
|
154
|
+
for (let s = 0; s < Object.keys(attribs).length; s++) {
|
155
|
+
const attrName = Object.keys(attribs)[s];
|
156
|
+
const attr = attribs[attrName];
|
157
|
+
if (attr.index === false && !item.notIndexed.includes(attrName))
|
158
|
+
item.notIndexed.push(attrName);
|
159
|
+
else if (attr.index && !item.indexed.includes(attrName))
|
160
|
+
item.indexed.push(attrName);
|
161
|
+
}
|
162
|
+
}
|
163
|
+
displayConfig.push(item);
|
164
|
+
}
|
165
|
+
setConfig(displayConfig);
|
166
|
+
})
|
167
|
+
.catch((err) => {
|
168
|
+
toggleNotification({
|
169
|
+
type: "warning", message: "An error was encountered while fetching the configuration.", timeout: 5000
|
170
|
+
});
|
171
|
+
console.log(err);
|
172
|
+
})
|
173
|
+
.finally(() => {
|
174
|
+
setIsInProgress(false);
|
175
|
+
});
|
176
|
+
}, []);
|
177
|
+
if (config === null)
|
178
|
+
return react_1.default.createElement(helper_plugin_1.LoadingIndicatorPage, null);
|
179
|
+
else {
|
180
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
181
|
+
react_1.default.createElement(design_system_1.Flex, { alignItems: "stretch", gap: 4 },
|
182
|
+
react_1.default.createElement(SubNavigation_1.SubNavigation, { activeUrl: '/configure-collections/' }),
|
183
|
+
react_1.default.createElement(design_system_1.Box, { padding: 8, background: "neutral100" },
|
184
|
+
react_1.default.createElement(design_system_1.Box, { paddingBottom: 4 },
|
185
|
+
react_1.default.createElement(design_system_3.Typography, { variant: "alpha" }, "Configure Collections")),
|
186
|
+
config && (react_1.default.createElement(design_system_7.TwoColsLayout, { startCol: react_1.default.createElement(design_system_2.Table, { colCount: 4, rowCount: config.length },
|
187
|
+
react_1.default.createElement(design_system_2.Thead, null,
|
188
|
+
react_1.default.createElement(design_system_2.Tr, null,
|
189
|
+
react_1.default.createElement(design_system_2.Th, { style: { width: "250px" } },
|
190
|
+
react_1.default.createElement(design_system_3.Typography, { variant: "sigma" }, "Collection")),
|
191
|
+
react_1.default.createElement(design_system_2.Th, { style: { width: "250px" } },
|
192
|
+
react_1.default.createElement(design_system_3.Typography, { variant: "sigma" }, "Index")),
|
193
|
+
react_1.default.createElement(design_system_2.Th, { style: { width: "250px" } },
|
194
|
+
react_1.default.createElement(design_system_3.Typography, { variant: "sigma" }, "Do not Index")),
|
195
|
+
react_1.default.createElement(design_system_2.Th, null,
|
196
|
+
react_1.default.createElement(design_system_3.Typography, { variant: "sigma" }, "Actions")))),
|
197
|
+
react_1.default.createElement(design_system_2.Tbody, null, config.map((collection, idx) => {
|
198
|
+
return (react_1.default.createElement(design_system_2.Tr, { key: idx },
|
199
|
+
react_1.default.createElement(design_system_2.Td, null,
|
200
|
+
react_1.default.createElement(design_system_3.Typography, { textColor: "neutral600" }, collection.collectionName)),
|
201
|
+
react_1.default.createElement(design_system_2.Td, null, collection.indexed.map((i) => react_1.default.createElement(design_system_1.Box, { paddingBottom: 2 },
|
202
|
+
react_1.default.createElement(design_system_3.Typography, { textColor: "neutral600" }, i)))),
|
203
|
+
react_1.default.createElement(design_system_2.Td, null, collection.notIndexed.map((i) => react_1.default.createElement(design_system_1.Box, { paddingBottom: 2 },
|
204
|
+
react_1.default.createElement(design_system_3.Typography, { textColor: "neutral600" }, i)))),
|
205
|
+
react_1.default.createElement(design_system_2.Td, null,
|
206
|
+
react_1.default.createElement(design_system_4.IconButton, { onClick: () => history.push(`/plugins/${pluginId_1.default}/configure-collections/${collection.collectionName}`), label: "Edit collection configuration", noBorder: true, icon: react_1.default.createElement(icons_1.Pencil, null) }),
|
207
|
+
react_1.default.createElement(design_system_4.IconButton, { onClick: () => scheduleCollectionIndexing(collection.collectionName), label: "Schedule indexing for all items in this collection", noBorder: true, icon: react_1.default.createElement(icons_1.Server, null) }))));
|
208
|
+
}))), endCol: react_1.default.createElement(react_1.default.Fragment, null,
|
209
|
+
react_1.default.createElement(design_system_1.Box, { paddingLeft: 2, paddingRight: 2, paddingTop: 4, paddingBottom: 4 },
|
210
|
+
react_1.default.createElement(design_system_1.Box, { paddingTop: 4, paddingBottom: 4 },
|
211
|
+
react_1.default.createElement(design_system_3.Typography, { variant: "pi", fontWeight: "bold", textColor: "neutral600" }, "CONFIG ACTIONS")),
|
212
|
+
react_1.default.createElement(design_system_7.Divider, null),
|
213
|
+
react_1.default.createElement(design_system_1.Box, { paddingTop: 4, paddingBottom: 4 },
|
214
|
+
react_1.default.createElement(design_system_1.Box, { paddingTop: 2, paddingBottom: 2 },
|
215
|
+
react_1.default.createElement(design_system_5.Button, { loading: isInProgress, fullWidth: true, variant: "secondary", onClick: performExport }, "Export")),
|
216
|
+
react_1.default.createElement(design_system_1.Box, { paddingTop: 2, paddingBottom: 2 },
|
217
|
+
react_1.default.createElement(design_system_5.Button, { loading: isInProgress, fullWidth: true, variant: "secondary", onClick: () => setDisplayImportModal(true) }, "Import"))))) })),
|
218
|
+
displayImportModal &&
|
219
|
+
react_1.default.createElement(design_system_6.ModalLayout, { onClose: () => setDisplayImportModal(false), labelledBy: "title" },
|
220
|
+
react_1.default.createElement(design_system_6.ModalHeader, null,
|
221
|
+
react_1.default.createElement(design_system_3.Typography, { fontWeight: "bold", textColor: "neutral800", as: "h2", id: "title" }, "Import Search Configuration")),
|
222
|
+
react_1.default.createElement(design_system_6.ModalBody, null,
|
223
|
+
react_1.default.createElement(design_system_7.Textarea, { label: "Configuration Json", error: !isEnteredJsonValid ? 'Invalid Json' : undefined, onChange: e => setImportJson(e.target.value) }, importJson)),
|
224
|
+
react_1.default.createElement(design_system_6.ModalFooter, { startActions: react_1.default.createElement(design_system_5.Button, { onClick: () => setDisplayImportModal(false), variant: "tertiary" }, "Cancel"), endActions: react_1.default.createElement(react_1.default.Fragment, null,
|
225
|
+
react_1.default.createElement(design_system_5.Button, { loading: isInProgress, onClick: performImport, disabled: !isEnteredJsonValid && !importJson.length > 0 }, "Import")) }))))));
|
226
|
+
}
|
227
|
+
};
|
228
|
+
exports.default = Configure;
|
@@ -0,0 +1,155 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
19
|
+
var ownKeys = function(o) {
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
21
|
+
var ar = [];
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
23
|
+
return ar;
|
24
|
+
};
|
25
|
+
return ownKeys(o);
|
26
|
+
};
|
27
|
+
return function (mod) {
|
28
|
+
if (mod && mod.__esModule) return mod;
|
29
|
+
var result = {};
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
31
|
+
__setModuleDefault(result, mod);
|
32
|
+
return result;
|
33
|
+
};
|
34
|
+
})();
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
37
|
+
};
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
39
|
+
const react_1 = __importStar(require("react"));
|
40
|
+
const SubNavigation_1 = require("../../components/SubNavigation");
|
41
|
+
;
|
42
|
+
const design_system_1 = require("@strapi/design-system");
|
43
|
+
const design_system_2 = require("@strapi/design-system");
|
44
|
+
const apiUrls_1 = require("../../utils/apiUrls");
|
45
|
+
const axiosInstance_1 = __importDefault(require("../../utils/axiosInstance"));
|
46
|
+
const design_system_3 = require("@strapi/design-system");
|
47
|
+
const design_system_4 = require("@strapi/design-system");
|
48
|
+
const icons_1 = require("@strapi/icons");
|
49
|
+
const design_system_5 = require("@strapi/design-system");
|
50
|
+
const design_system_6 = require("@strapi/design-system");
|
51
|
+
const helper_plugin_1 = require("@strapi/helper-plugin");
|
52
|
+
const loadElasticsearchSetupInfo = () => {
|
53
|
+
return axiosInstance_1.default.get(apiUrls_1.apiGetElasticsearchSetupInfo)
|
54
|
+
.then((resp) => resp.data)
|
55
|
+
.then((data) => {
|
56
|
+
return data;
|
57
|
+
});
|
58
|
+
};
|
59
|
+
const Homepage = () => {
|
60
|
+
const [setupInfo, setSetupInfo] = (0, react_1.useState)(null);
|
61
|
+
const [isInProgress, setIsInProgress] = (0, react_1.useState)(false);
|
62
|
+
const toggleNotification = (0, helper_plugin_1.useNotification)();
|
63
|
+
const displayLabels = { 'connected': 'Connected',
|
64
|
+
'elasticCertificate': 'Certificate',
|
65
|
+
'elasticHost': 'Elasticsearch host',
|
66
|
+
'elasticIndexAlias': 'Elasticsearch index Alias name',
|
67
|
+
'elasticUserName': 'Elasticsearch username',
|
68
|
+
'indexingCronSchedule': 'Indexing cron schedule',
|
69
|
+
'initialized': 'Elasticsearch configuration loaded' };
|
70
|
+
const reloadElasticsearchSetupInfo = ({ showNotification }) => {
|
71
|
+
setIsInProgress(true);
|
72
|
+
loadElasticsearchSetupInfo()
|
73
|
+
.then(setSetupInfo)
|
74
|
+
.then(() => {
|
75
|
+
if (showNotification)
|
76
|
+
toggleNotification({
|
77
|
+
type: "success", message: "Elasticsearch setup information reloaded.", timeout: 5000
|
78
|
+
});
|
79
|
+
})
|
80
|
+
.finally(() => setIsInProgress(false));
|
81
|
+
};
|
82
|
+
const requestFullSiteReindexing = () => {
|
83
|
+
setIsInProgress(true);
|
84
|
+
return axiosInstance_1.default.get(apiUrls_1.apiRequestReIndexing)
|
85
|
+
.then(() => {
|
86
|
+
toggleNotification({
|
87
|
+
type: "success", message: "Rebuilding the index is triggered.", timeout: 5000
|
88
|
+
});
|
89
|
+
})
|
90
|
+
.catch(() => {
|
91
|
+
toggleNotification({
|
92
|
+
type: "warning", message: "An error was encountered.", timeout: 5000
|
93
|
+
});
|
94
|
+
})
|
95
|
+
.finally(() => setIsInProgress(false));
|
96
|
+
};
|
97
|
+
const triggerIndexingRun = () => {
|
98
|
+
setIsInProgress(true);
|
99
|
+
return axiosInstance_1.default.get(apiUrls_1.apiTriggerIndexing)
|
100
|
+
.then(() => {
|
101
|
+
toggleNotification({
|
102
|
+
type: "success", message: "The indexing job to process the pending tasks is started.", timeout: 5000
|
103
|
+
});
|
104
|
+
})
|
105
|
+
.catch(() => {
|
106
|
+
toggleNotification({
|
107
|
+
type: "warning", message: "An error was encountered.", timeout: 5000
|
108
|
+
});
|
109
|
+
})
|
110
|
+
.finally(() => setIsInProgress(false));
|
111
|
+
};
|
112
|
+
(0, react_1.useEffect)(() => {
|
113
|
+
reloadElasticsearchSetupInfo({ showNotification: false });
|
114
|
+
}, []);
|
115
|
+
if (setupInfo === null)
|
116
|
+
return react_1.default.createElement(helper_plugin_1.LoadingIndicatorPage, null);
|
117
|
+
else
|
118
|
+
return (react_1.default.createElement(design_system_1.Flex, { alignItems: "stretch", gap: 4 },
|
119
|
+
react_1.default.createElement(SubNavigation_1.SubNavigation, null),
|
120
|
+
react_1.default.createElement(design_system_1.Box, { padding: 8, background: "neutral100", width: "100%" },
|
121
|
+
react_1.default.createElement(design_system_1.Box, { paddingBottom: 4 },
|
122
|
+
react_1.default.createElement(design_system_2.Typography, { variant: "alpha" }, "Setup Information")),
|
123
|
+
react_1.default.createElement(design_system_1.Box, { width: "100%", paddingBottom: 4 },
|
124
|
+
react_1.default.createElement(design_system_5.TwoColsLayout, { startCol: react_1.default.createElement(react_1.default.Fragment, null,
|
125
|
+
react_1.default.createElement(design_system_4.Table, null, setupInfo && (Object.keys(setupInfo).map((k, idx) => {
|
126
|
+
return (react_1.default.createElement(design_system_4.Tr, { key: idx },
|
127
|
+
react_1.default.createElement(design_system_4.Td, null,
|
128
|
+
react_1.default.createElement(design_system_1.Box, { padding: 2 },
|
129
|
+
react_1.default.createElement(design_system_2.Typography, { textColor: "neutral600" },
|
130
|
+
displayLabels[k],
|
131
|
+
" :"))),
|
132
|
+
react_1.default.createElement(design_system_4.Td, null,
|
133
|
+
react_1.default.createElement(design_system_1.Box, { padding: 2 },
|
134
|
+
react_1.default.createElement(design_system_6.Grid, null,
|
135
|
+
react_1.default.createElement(design_system_6.GridItem, { padding: 2 },
|
136
|
+
k === 'connected' && setupInfo[k] === true &&
|
137
|
+
(react_1.default.createElement(design_system_2.Typography, { fontWeight: "bold", textColor: "success500" }, "Yes")),
|
138
|
+
k === 'connected' && setupInfo[k] === false &&
|
139
|
+
(react_1.default.createElement(design_system_2.Typography, { fontWeight: "bold", textColor: "danger500" }, "No")),
|
140
|
+
k !== 'connected' &&
|
141
|
+
(react_1.default.createElement(design_system_2.Typography, { textColor: "neutral600" }, String(setupInfo[k])))),
|
142
|
+
react_1.default.createElement(design_system_6.GridItem, { padding: 1 }, k === 'connected' ?
|
143
|
+
react_1.default.createElement(design_system_3.IconButton, { disabled: isInProgress, onClick: () => reloadElasticsearchSetupInfo({ showNotification: true }), label: "Refresh", icon: react_1.default.createElement(icons_1.Refresh, null) }) : null))))));
|
144
|
+
})))), endCol: react_1.default.createElement(react_1.default.Fragment, null,
|
145
|
+
react_1.default.createElement(design_system_1.Box, { paddingLeft: 2, paddingRight: 2, paddingTop: 4, paddingBottom: 4 },
|
146
|
+
react_1.default.createElement(design_system_1.Box, { paddingTop: 4, paddingBottom: 4 },
|
147
|
+
react_1.default.createElement(design_system_2.Typography, { variant: "pi", fontWeight: "bold", textColor: "neutral600" }, "ACTIONS")),
|
148
|
+
react_1.default.createElement(design_system_6.Divider, null),
|
149
|
+
react_1.default.createElement(design_system_1.Box, { paddingTop: 4, paddingBottom: 4 },
|
150
|
+
react_1.default.createElement(design_system_1.Box, { paddingTop: 2, paddingBottom: 2 },
|
151
|
+
react_1.default.createElement(design_system_5.Button, { loading: isInProgress, fullWidth: true, variant: "secondary", onClick: requestFullSiteReindexing }, "Rebuild Index")),
|
152
|
+
react_1.default.createElement(design_system_1.Box, { paddingTop: 2, paddingBottom: 2 },
|
153
|
+
react_1.default.createElement(design_system_5.Button, { loading: isInProgress, fullWidth: true, variant: "secondary", onClick: triggerIndexingRun }, "Trigger Indexing"))))) })))));
|
154
|
+
};
|
155
|
+
exports.default = Homepage;
|
@@ -0,0 +1,125 @@
|
|
1
|
+
"use strict";
|
2
|
+
/*
|
3
|
+
*
|
4
|
+
* HomePage
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
8
|
+
if (k2 === undefined) k2 = k;
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
12
|
+
}
|
13
|
+
Object.defineProperty(o, k2, desc);
|
14
|
+
}) : (function(o, m, k, k2) {
|
15
|
+
if (k2 === undefined) k2 = k;
|
16
|
+
o[k2] = m[k];
|
17
|
+
}));
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
20
|
+
}) : function(o, v) {
|
21
|
+
o["default"] = v;
|
22
|
+
});
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
24
|
+
var ownKeys = function(o) {
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
26
|
+
var ar = [];
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
28
|
+
return ar;
|
29
|
+
};
|
30
|
+
return ownKeys(o);
|
31
|
+
};
|
32
|
+
return function (mod) {
|
33
|
+
if (mod && mod.__esModule) return mod;
|
34
|
+
var result = {};
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
36
|
+
__setModuleDefault(result, mod);
|
37
|
+
return result;
|
38
|
+
};
|
39
|
+
})();
|
40
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
41
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
42
|
+
};
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
44
|
+
const react_1 = __importStar(require("react"));
|
45
|
+
const SubNavigation_1 = require("../../components/SubNavigation");
|
46
|
+
;
|
47
|
+
const design_system_1 = require("@strapi/design-system");
|
48
|
+
const apiUrls_1 = require("../../utils/apiUrls");
|
49
|
+
const axiosInstance_1 = __importDefault(require("../../utils/axiosInstance"));
|
50
|
+
const design_system_2 = require("@strapi/design-system");
|
51
|
+
const design_system_3 = require("@strapi/design-system");
|
52
|
+
const helper_plugin_1 = require("@strapi/helper-plugin");
|
53
|
+
const loadRecentIndexingRuns = () => {
|
54
|
+
return axiosInstance_1.default.get(apiUrls_1.apiFetchRecentIndexingRunLog)
|
55
|
+
.then((resp) => resp.data)
|
56
|
+
.then((data) => {
|
57
|
+
return data;
|
58
|
+
});
|
59
|
+
};
|
60
|
+
const formattedDate = (dateString) => {
|
61
|
+
const date = new Date(dateString);
|
62
|
+
const options = {
|
63
|
+
weekday: 'long',
|
64
|
+
year: 'numeric',
|
65
|
+
month: 'numeric',
|
66
|
+
day: 'numeric',
|
67
|
+
hour: 'numeric',
|
68
|
+
minute: 'numeric',
|
69
|
+
};
|
70
|
+
const dateTimeFormat = new Intl.DateTimeFormat('en-US', options);
|
71
|
+
const parts = dateTimeFormat.formatToParts(date);
|
72
|
+
let formattedDate = '';
|
73
|
+
parts.forEach((part) => {
|
74
|
+
if (part.type === "weekday")
|
75
|
+
formattedDate += `${part.value}, `;
|
76
|
+
if (part.type === "day")
|
77
|
+
formattedDate += `${part.value}/`;
|
78
|
+
if (part.type === "month")
|
79
|
+
formattedDate += `${part.value}/`;
|
80
|
+
if (part.type === "year")
|
81
|
+
formattedDate += `${part.value} `;
|
82
|
+
if (part.type === "hour")
|
83
|
+
formattedDate += `${part.value}:`;
|
84
|
+
if (part.type === "minute")
|
85
|
+
formattedDate += `${part.value}`;
|
86
|
+
});
|
87
|
+
return formattedDate;
|
88
|
+
};
|
89
|
+
const ViewIndexingRunLog = () => {
|
90
|
+
const [logTable, setLogTable] = (0, react_1.useState)(null);
|
91
|
+
(0, react_1.useEffect)(() => {
|
92
|
+
loadRecentIndexingRuns()
|
93
|
+
.then(setLogTable);
|
94
|
+
}, []);
|
95
|
+
if (logTable === null)
|
96
|
+
return react_1.default.createElement(helper_plugin_1.LoadingIndicatorPage, null);
|
97
|
+
else
|
98
|
+
return (react_1.default.createElement(design_system_1.Flex, { alignItems: "stretch", gap: 4 },
|
99
|
+
react_1.default.createElement(SubNavigation_1.SubNavigation, null),
|
100
|
+
react_1.default.createElement(design_system_1.Box, { padding: 8, background: "neutral100", width: "100%" },
|
101
|
+
react_1.default.createElement(design_system_1.Box, { paddingBottom: 4 },
|
102
|
+
react_1.default.createElement(design_system_3.Typography, { variant: "alpha" }, "Recent Indexing Run Logs")),
|
103
|
+
logTable && logTable.length > 0 && (react_1.default.createElement(react_1.default.Fragment, null,
|
104
|
+
react_1.default.createElement(design_system_2.Table, { colCount: 3, rowCount: logTable.length },
|
105
|
+
react_1.default.createElement(design_system_2.Thead, null,
|
106
|
+
react_1.default.createElement(design_system_2.Tr, null,
|
107
|
+
react_1.default.createElement(design_system_2.Th, null,
|
108
|
+
react_1.default.createElement(design_system_3.Typography, { variant: "sigma" }, "Date")),
|
109
|
+
react_1.default.createElement(design_system_2.Th, null,
|
110
|
+
react_1.default.createElement(design_system_3.Typography, { variant: "sigma" }, "Status")),
|
111
|
+
react_1.default.createElement(design_system_2.Th, null,
|
112
|
+
react_1.default.createElement(design_system_3.Typography, { variant: "sigma" }, "Details")))),
|
113
|
+
react_1.default.createElement(design_system_2.Tbody, null, logTable.map((data, index) => {
|
114
|
+
return (react_1.default.createElement(design_system_2.Tr, { key: index },
|
115
|
+
react_1.default.createElement(design_system_2.Td, null,
|
116
|
+
react_1.default.createElement(design_system_3.Typography, { textColor: "neutral600" }, formattedDate(data.createdAt))),
|
117
|
+
react_1.default.createElement(design_system_2.Td, null,
|
118
|
+
react_1.default.createElement(design_system_3.Typography, { textColor: "neutral600" }, data.status)),
|
119
|
+
react_1.default.createElement(design_system_2.Td, null,
|
120
|
+
react_1.default.createElement(design_system_3.Typography, { textColor: "neutral600" }, data.details))));
|
121
|
+
}))),
|
122
|
+
react_1.default.createElement(design_system_1.Box, { paddingTop: 2, paddingBottom: 2 },
|
123
|
+
react_1.default.createElement(design_system_3.Typography, { textColor: "neutral600" }, "This view lists the details of the 50 recent-most indexing runs.")))))));
|
124
|
+
};
|
125
|
+
exports.default = ViewIndexingRunLog;
|
@@ -0,0 +1,8 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const package_json_1 = __importDefault(require("../../package.json"));
|
7
|
+
const pluginId = package_json_1.default.strapi.name;
|
8
|
+
exports.default = pluginId;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/**
|
2
|
+
*
|
3
|
+
* Initializer
|
4
|
+
*
|
5
|
+
*/
|
6
|
+
import PropTypes from 'prop-types';
|
7
|
+
declare const Initializer: {
|
8
|
+
({ setPlugin }: {
|
9
|
+
setPlugin: any;
|
10
|
+
}): null;
|
11
|
+
propTypes: {
|
12
|
+
setPlugin: PropTypes.Validator<(...args: any[]) => any>;
|
13
|
+
};
|
14
|
+
};
|
15
|
+
export default Initializer;
|
@@ -0,0 +1,25 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
*
|
4
|
+
* Initializer
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
9
|
+
};
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
11
|
+
const react_1 = require("react");
|
12
|
+
const prop_types_1 = __importDefault(require("prop-types"));
|
13
|
+
const pluginId_1 = __importDefault(require("../../pluginId"));
|
14
|
+
const Initializer = ({ setPlugin }) => {
|
15
|
+
const ref = (0, react_1.useRef)();
|
16
|
+
ref.current = setPlugin;
|
17
|
+
(0, react_1.useEffect)(() => {
|
18
|
+
ref.current(pluginId_1.default);
|
19
|
+
}, []);
|
20
|
+
return null;
|
21
|
+
};
|
22
|
+
Initializer.propTypes = {
|
23
|
+
setPlugin: prop_types_1.default.func.isRequired,
|
24
|
+
};
|
25
|
+
exports.default = Initializer;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
*
|
4
|
+
* PluginIcon
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
9
|
+
};
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
11
|
+
const react_1 = __importDefault(require("react"));
|
12
|
+
const icons_1 = require("@strapi/icons");
|
13
|
+
const PluginIcon = () => react_1.default.createElement(icons_1.Search, null);
|
14
|
+
exports.default = PluginIcon;
|
@@ -0,0 +1,40 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.SubNavigation = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const icons_1 = require("@strapi/icons");
|
9
|
+
const design_system_1 = require("@strapi/design-system");
|
10
|
+
const v2_1 = require("@strapi/design-system/v2");
|
11
|
+
const react_router_dom_1 = require("react-router-dom");
|
12
|
+
const pluginId_1 = __importDefault(require("../../pluginId"));
|
13
|
+
const SubNavigation = ({ activeUrl }) => {
|
14
|
+
const links = [{
|
15
|
+
id: 1,
|
16
|
+
label: 'Setup Information',
|
17
|
+
icon: icons_1.Connector,
|
18
|
+
to: `/plugins/${pluginId_1.default}/home`,
|
19
|
+
},
|
20
|
+
{
|
21
|
+
id: 2,
|
22
|
+
label: 'Configure Collections',
|
23
|
+
icon: icons_1.Connector,
|
24
|
+
to: `/plugins/${pluginId_1.default}/configure-collections`,
|
25
|
+
},
|
26
|
+
{
|
27
|
+
id: 3,
|
28
|
+
label: 'Indexing Run Logs',
|
29
|
+
icon: icons_1.Connector,
|
30
|
+
to: `/plugins/${pluginId_1.default}/view-indexing-logs`,
|
31
|
+
}];
|
32
|
+
return (react_1.default.createElement(design_system_1.Box, { style: {
|
33
|
+
height: '100vh'
|
34
|
+
}, background: "neutral200" },
|
35
|
+
react_1.default.createElement(v2_1.SubNav, { ariaLabel: "Settings sub nav" },
|
36
|
+
react_1.default.createElement(v2_1.SubNavHeader, { label: "Strapi Elasticsearch" }),
|
37
|
+
react_1.default.createElement(v2_1.SubNavSections, null,
|
38
|
+
react_1.default.createElement(v2_1.SubNavSection, null, links.map(link => link.icon && react_1.default.createElement(v2_1.SubNavLink, { as: react_router_dom_1.NavLink, to: link.to, icon: link.icon, key: link.id }, link.label)))))));
|
39
|
+
};
|
40
|
+
exports.SubNavigation = SubNavigation;
|