strapi-plugin-navigation 1.1.0 → 2.0.0-beta.2
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/README.md +7 -5
- package/admin/src/components/EmptyView/index.js +7 -16
- package/admin/src/components/Item/ItemCardBadge/index.js +8 -0
- package/admin/src/components/Item/ItemCardHeader/Wrapper.js +21 -0
- package/admin/src/components/Item/ItemCardHeader/index.js +59 -0
- package/admin/src/components/Item/Wrapper.js +39 -0
- package/admin/src/components/Item/index.js +76 -124
- package/admin/src/components/NavigationItemList/Wrapper.js +22 -0
- package/admin/src/components/NavigationItemList/index.js +54 -0
- package/admin/src/components/PluginIcon/index.js +6 -0
- package/admin/src/index.js +49 -45
- package/admin/src/pages/App/index.js +31 -0
- package/admin/src/{containers → pages}/DataManagerProvider/actions.js +0 -0
- package/admin/src/{containers → pages}/DataManagerProvider/index.js +81 -85
- package/admin/src/{containers → pages}/DataManagerProvider/init.js +0 -0
- package/admin/src/{containers → pages}/DataManagerProvider/reducer.js +0 -0
- package/admin/src/pages/View/components/NavigationContentHeader/index.js +18 -0
- package/admin/src/pages/View/components/NavigationHeader/index.js +60 -0
- package/admin/src/pages/View/components/NavigationItemForm/index.js +403 -0
- package/admin/src/{containers → pages}/View/components/NavigationItemForm/utils/form.js +2 -2
- package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js +40 -0
- package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js +20 -0
- package/admin/src/{containers → pages}/View/components/NavigationItemPopup/index.js +16 -16
- package/admin/src/pages/View/index.js +209 -0
- package/admin/src/{containers → pages}/View/utils/enums.js +0 -0
- package/admin/src/{containers → pages}/View/utils/form.js +1 -1
- package/admin/src/{containers → pages}/View/utils/index.js +0 -0
- package/admin/src/{containers → pages}/View/utils/parsers.js +13 -12
- package/admin/src/pluginId.js +3 -2
- package/admin/src/translations/en.json +47 -38
- package/admin/src/translations/fr.json +7 -1
- package/admin/src/utils/getTrad.js +2 -2
- package/package.json +14 -6
- package/server/bootstrap.js +41 -0
- package/server/config.js +8 -0
- package/server/content-types/audience/index.js +9 -0
- package/{models/audience.js → server/content-types/audience/lifecycle.js} +0 -0
- package/{models/audience.settings.json → server/content-types/audience/schema.json} +4 -2
- package/server/content-types/index.js +13 -0
- package/server/content-types/navigation/index.js +9 -0
- package/{models/navigation.js → server/content-types/navigation/lifecycle.js} +0 -0
- package/server/content-types/navigation/schema.js +45 -0
- package/server/content-types/navigation-item/index.js +9 -0
- package/{models/navigationItem.js → server/content-types/navigation-item/lifecycle.js} +0 -0
- package/{models/navigationItem.settings.json → server/content-types/navigation-item/schema.json} +16 -12
- package/server/content-types/navigations-items-related/index.js +9 -0
- package/{models/navigations_items_related.js → server/content-types/navigations-items-related/lifecycle.js} +0 -0
- package/{models/navigations_items_related.settings.json → server/content-types/navigations-items-related/schema.json} +4 -2
- package/server/controllers/index.js +7 -0
- package/{controllers → server/controllers}/navigation.js +7 -39
- package/server/routes/admin.js +38 -0
- package/server/routes/index.js +3 -0
- package/{services → server/services}/__tests__/navigation.test.js +0 -0
- package/server/services/index.js +7 -0
- package/server/services/navigation.js +463 -0
- package/{services → server/services}/utils/constant.js +3 -1
- package/server/services/utils/functions.js +103 -0
- package/strapi-admin.js +1 -0
- package/strapi-server.js +18 -0
- package/__mocks__/helpers/another-plugin/blog-post.settings.json +0 -31
- package/__mocks__/helpers/another-plugin/pages.settings.json +0 -28
- package/__mocks__/helpers/blog-post.settings.json +0 -31
- package/__mocks__/helpers/home-page.settings.json +0 -4
- package/__mocks__/helpers/my-homepage.settings.json +0 -27
- package/__mocks__/helpers/pages.settings.json +0 -27
- package/__mocks__/helpers/strapi.js +0 -101
- package/admin/src/assets/images/icon-cross-blue.svg +0 -1
- package/admin/src/assets/images/icon_remove.svg +0 -19
- package/admin/src/components/Container/index.js +0 -7
- package/admin/src/components/Input/index.js +0 -41
- package/admin/src/components/Item/CardItem.js +0 -46
- package/admin/src/components/Item/CardItemLevelAdd.js +0 -41
- package/admin/src/components/Item/CardItemLevelWrapper.js +0 -27
- package/admin/src/components/Item/CardItemPath.js +0 -9
- package/admin/src/components/Item/CardItemRestore.js +0 -19
- package/admin/src/components/Item/CardItemTitle.js +0 -5
- package/admin/src/components/Item/CardWrapper.js +0 -78
- package/admin/src/components/ItemFooter/CardItemError.js +0 -11
- package/admin/src/components/ItemFooter/CardItemRelation.js +0 -18
- package/admin/src/components/ItemFooter/CardItemRelationStatus.js +0 -17
- package/admin/src/components/ItemFooter/CardItemType.js +0 -18
- package/admin/src/components/ItemFooter/Wrapper.js +0 -26
- package/admin/src/components/ItemFooter/index.js +0 -66
- package/admin/src/components/ItemOrdering/CardOrderingButton.js +0 -24
- package/admin/src/components/ItemOrdering/Wrapper.js +0 -24
- package/admin/src/components/ItemOrdering/index.js +0 -36
- package/admin/src/components/List/Container.js +0 -34
- package/admin/src/components/List/ListLevelRoot.js +0 -18
- package/admin/src/components/List/index.js +0 -81
- package/admin/src/components/Option/OptionButton.js +0 -18
- package/admin/src/components/Option/OptionSet.js +0 -14
- package/admin/src/components/Option/Wrapper.js +0 -15
- package/admin/src/components/Option/index.js +0 -47
- package/admin/src/components/Search/index.js +0 -86
- package/admin/src/components/Select/ClearIndicator.js +0 -15
- package/admin/src/components/Select/DropdownIndicator.js +0 -39
- package/admin/src/components/Select/ErrorMessage.js +0 -10
- package/admin/src/components/Select/IndicatorSeparator.js +0 -3
- package/admin/src/components/Select/MultiValueContainer.js +0 -43
- package/admin/src/components/Select/StyledOption.js +0 -11
- package/admin/src/components/Select/index.js +0 -68
- package/admin/src/components/Select/utils/styles.js +0 -92
- package/admin/src/containers/App/Wrapper.js +0 -14
- package/admin/src/containers/App/index.js +0 -34
- package/admin/src/containers/DetailsView/Wrapper.js +0 -21
- package/admin/src/containers/DetailsView/index.js +0 -111
- package/admin/src/containers/Initializer/index.js +0 -26
- package/admin/src/containers/ListView/Footer.js +0 -56
- package/admin/src/containers/ListView/components.js +0 -138
- package/admin/src/containers/ListView/index.js +0 -54
- package/admin/src/containers/View/FadedWrapper.js +0 -51
- package/admin/src/containers/View/HeaderForm.js +0 -9
- package/admin/src/containers/View/HeaderFormCell.js +0 -25
- package/admin/src/containers/View/Wrapper.js +0 -17
- package/admin/src/containers/View/components/NavigationItemForm/ModalFooter.js +0 -45
- package/admin/src/containers/View/components/NavigationItemForm/index.js +0 -427
- package/admin/src/containers/View/components/NavigationItemPopup/MediumPopup.js +0 -6
- package/admin/src/containers/View/index.js +0 -240
- package/admin/src/lifecycles.js +0 -3
- package/admin/src/permissions.js +0 -14
- package/config/functions/bootstrap.js +0 -138
- package/config/routes.json +0 -60
- package/config/schema.graphql.js +0 -205
- package/examples/audit-log-integrations.js.md +0 -38
- package/models/navigation.settings.json +0 -43
- package/public/assets/preview.png +0 -0
- package/services/navigation.js +0 -730
- package/services/utils/functions.js +0 -186
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import React, { memo, useEffect, useReducer, useRef } from "react";
|
|
2
|
+
import { useLocation, useRouteMatch } from "react-router-dom";
|
|
3
|
+
import { useIntl } from 'react-intl';
|
|
2
4
|
import PropTypes from "prop-types";
|
|
3
5
|
import { get, find, first, isEmpty } from "lodash";
|
|
4
6
|
import {
|
|
5
7
|
request,
|
|
6
8
|
LoadingIndicatorPage,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
useNotification,
|
|
10
|
+
useAppInfos,
|
|
11
|
+
useStrapiApp,
|
|
12
|
+
} from "@strapi/helper-plugin";
|
|
10
13
|
import DataManagerContext from "../../contexts/DataManagerContext";
|
|
11
14
|
import getTrad from "../../utils/getTrad";
|
|
12
15
|
import pluginId from "../../pluginId";
|
|
@@ -30,16 +33,13 @@ import {
|
|
|
30
33
|
SUBMIT_NAVIGATION_ERROR,
|
|
31
34
|
} from './actions';
|
|
32
35
|
import { prepareItemToViewPayload } from '../View/utils/parsers';
|
|
33
|
-
import { getTradId } from "../../translations";
|
|
34
36
|
|
|
35
37
|
const DataManagerProvider = ({ children }) => {
|
|
36
38
|
const [reducerState, dispatch] = useReducer(reducer, initialState, init);
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
formatMessage,
|
|
42
|
-
} = useGlobalContext();
|
|
39
|
+
const toggleNotification = useNotification();
|
|
40
|
+
const { autoReload } = useAppInfos();
|
|
41
|
+
const { formatMessage } = useIntl();
|
|
42
|
+
|
|
43
43
|
const {
|
|
44
44
|
items,
|
|
45
45
|
config,
|
|
@@ -56,7 +56,8 @@ const DataManagerProvider = ({ children }) => {
|
|
|
56
56
|
error
|
|
57
57
|
} = reducerState.toJS();
|
|
58
58
|
const { pathname } = useLocation();
|
|
59
|
-
|
|
59
|
+
const { getPlugin } = useStrapiApp();
|
|
60
|
+
const { apis } = getPlugin(pluginId);
|
|
60
61
|
const formatMessageRef = useRef();
|
|
61
62
|
formatMessageRef.current = formatMessage;
|
|
62
63
|
|
|
@@ -64,8 +65,7 @@ const DataManagerProvider = ({ children }) => {
|
|
|
64
65
|
getLayoutSettingRef.current = (settingName) =>
|
|
65
66
|
get({}, ["settings", settingName], "");
|
|
66
67
|
|
|
67
|
-
const isInDevelopmentMode =
|
|
68
|
-
currentEnvironment === "development" && autoReload;
|
|
68
|
+
const isInDevelopmentMode = autoReload;
|
|
69
69
|
|
|
70
70
|
const abortController = new AbortController();
|
|
71
71
|
const { signal } = abortController;
|
|
@@ -95,9 +95,11 @@ const DataManagerProvider = ({ children }) => {
|
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
} catch (err) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
console.error({ err });
|
|
99
|
+
toggleNotification({
|
|
100
|
+
type: 'error',
|
|
101
|
+
message: { id: 'notification.error' },
|
|
102
|
+
});
|
|
101
103
|
}
|
|
102
104
|
};
|
|
103
105
|
|
|
@@ -110,7 +112,6 @@ const DataManagerProvider = ({ children }) => {
|
|
|
110
112
|
method: "GET",
|
|
111
113
|
signal,
|
|
112
114
|
});
|
|
113
|
-
|
|
114
115
|
dispatch({
|
|
115
116
|
type: GET_CONFIG_SUCCEEDED,
|
|
116
117
|
config,
|
|
@@ -134,7 +135,10 @@ const DataManagerProvider = ({ children }) => {
|
|
|
134
135
|
}
|
|
135
136
|
} catch (err) {
|
|
136
137
|
console.error({ err });
|
|
137
|
-
|
|
138
|
+
toggleNotification({
|
|
139
|
+
type: 'error',
|
|
140
|
+
message: { id: 'notification.error' },
|
|
141
|
+
});
|
|
138
142
|
}
|
|
139
143
|
};
|
|
140
144
|
|
|
@@ -152,40 +156,37 @@ const DataManagerProvider = ({ children }) => {
|
|
|
152
156
|
}, [isLoading, pathname]);
|
|
153
157
|
|
|
154
158
|
useEffect(() => {
|
|
155
|
-
if (
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
);
|
|
159
|
+
if (!autoReload) {
|
|
160
|
+
toggleNotification({
|
|
161
|
+
type: 'info',
|
|
162
|
+
message: { id: getTrad('notification.info.autoreaload-disable') },
|
|
163
|
+
});
|
|
161
164
|
}
|
|
162
|
-
}, [autoReload
|
|
165
|
+
}, [autoReload]);
|
|
163
166
|
|
|
164
|
-
const getContentTypeItems = async ({
|
|
167
|
+
const getContentTypeItems = async ({ modelUID, query }, plugin = "") => {
|
|
165
168
|
dispatch({
|
|
166
169
|
type: GET_CONTENT_TYPE_ITEMS,
|
|
167
170
|
});
|
|
168
|
-
const url
|
|
169
|
-
|
|
171
|
+
const url =`/navigation/content-type-items/${modelUID}`;
|
|
170
172
|
const queryParams = new URLSearchParams();
|
|
171
173
|
queryParams.append('_publicationState', 'preview');
|
|
172
174
|
if (query) {
|
|
173
175
|
queryParams.append('_q', query);
|
|
174
176
|
}
|
|
175
|
-
|
|
177
|
+
|
|
176
178
|
const contentTypeItems = await request(`${url}?${queryParams.toString()}`, {
|
|
177
179
|
method: "GET",
|
|
178
180
|
signal,
|
|
179
181
|
});
|
|
180
182
|
|
|
181
|
-
const fetchedContentType = find(config.contentTypes, ct => ct.
|
|
182
|
-
|
|
183
|
+
const fetchedContentType = find(config.contentTypes, ct => ct.uid === modelUID);
|
|
183
184
|
const isArray = Array.isArray(contentTypeItems);
|
|
184
185
|
dispatch({
|
|
185
186
|
type: GET_CONTENT_TYPE_ITEMS_SUCCEEDED,
|
|
186
187
|
contentTypeItems: (isArray ? contentTypeItems : [contentTypeItems]).map(item => ({
|
|
187
188
|
...item,
|
|
188
|
-
|
|
189
|
+
__collectionUid: get(fetchedContentType, 'collectionUid', modelUID),
|
|
189
190
|
})),
|
|
190
191
|
});
|
|
191
192
|
};
|
|
@@ -195,86 +196,81 @@ const DataManagerProvider = ({ children }) => {
|
|
|
195
196
|
};
|
|
196
197
|
|
|
197
198
|
const handleChangeNavigationPopupVisibility = (visible) => {
|
|
198
|
-
emitEvent("willChangeNavigationPopupVisibility");
|
|
199
199
|
dispatch({
|
|
200
200
|
type: CHANGE_NAVIGATION_POPUP_VISIBILITY,
|
|
201
201
|
navigationPopupOpened: visible,
|
|
202
202
|
});
|
|
203
|
-
emitEvent("didChangeNavigationPopupVisibility");
|
|
204
|
-
emitEvent(`navigationPopup${visible ? "Visible" : "Hidden"}`);
|
|
205
203
|
};
|
|
206
204
|
|
|
207
205
|
const handleChangeNavigationItemPopupVisibility = (visible) => {
|
|
208
|
-
emitEvent("willChangeNavigationItemPopupVisibility");
|
|
209
206
|
dispatch({
|
|
210
207
|
type: CHANGE_NAVIGATION_ITEM_POPUP_VISIBILITY,
|
|
211
208
|
navigationItemPopupOpened: visible,
|
|
212
209
|
});
|
|
213
|
-
emitEvent("didChangeNavigationItemPopupVisibility");
|
|
214
|
-
emitEvent(`navigationItemPopup${visible ? "Visible" : "Hidden"}`);
|
|
215
210
|
};
|
|
216
211
|
|
|
217
212
|
const handleChangeNavigationData = (payload, forceClosePopups) => {
|
|
218
|
-
emitEvent("willChangeNavigationData");
|
|
219
213
|
dispatch({
|
|
220
214
|
type: CHANGE_NAVIGATION_DATA,
|
|
221
215
|
changedActiveItem: payload,
|
|
222
216
|
forceClosePopups,
|
|
223
217
|
});
|
|
224
|
-
emitEvent("didChangeNavigationData");
|
|
225
218
|
};
|
|
226
219
|
|
|
227
220
|
const handleResetNavigationData = () => {
|
|
228
|
-
|
|
229
|
-
dispatch({
|
|
221
|
+
dispatch({
|
|
230
222
|
type: RESET_NAVIGATION_DATA,
|
|
231
223
|
activeItem,
|
|
232
224
|
});
|
|
233
|
-
emitEvent("didResetNavigationChanges");
|
|
234
225
|
};
|
|
235
226
|
|
|
236
227
|
const handleSubmitNavigation = async (formatMessage, payload = {}) => {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
228
|
+
try {
|
|
229
|
+
dispatch({
|
|
230
|
+
type: SUBMIT_NAVIGATION,
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
const nagivationId = payload.id ? `/${payload.id}` : "";
|
|
234
|
+
const method = payload.id ? "PUT" : "POST";
|
|
235
|
+
const navigation = await request(`/${pluginId}${nagivationId}`, {
|
|
236
|
+
method,
|
|
237
|
+
signal,
|
|
238
|
+
body: payload,
|
|
239
|
+
});
|
|
240
|
+
dispatch({
|
|
241
|
+
type: SUBMIT_NAVIGATION_SUCCEEDED,
|
|
242
|
+
navigation: {
|
|
243
|
+
...navigation,
|
|
244
|
+
items: prepareItemToViewPayload(navigation.items, null, config),
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
toggleNotification({
|
|
248
|
+
type: 'success',
|
|
249
|
+
message: { id: getTrad('notification.navigation.submit') },
|
|
250
|
+
});
|
|
251
|
+
} catch (err) {
|
|
252
|
+
dispatch({
|
|
253
|
+
type: SUBMIT_NAVIGATION_ERROR,
|
|
254
|
+
error: err.response.payload.data
|
|
255
|
+
});
|
|
256
|
+
console.error({ err: err.response });
|
|
257
|
+
|
|
258
|
+
if (err.response.payload.data && err.response.payload.data.errorTitles) {
|
|
259
|
+
return toggleNotification({
|
|
260
|
+
type: 'error',
|
|
261
|
+
message: {
|
|
262
|
+
id: formatMessage(
|
|
263
|
+
getTrad('notification.navigation.error'),
|
|
264
|
+
{ ...err.response.payload.data, errorTitles: err.response.payload.data.errorTitles.join(' and ') },
|
|
265
|
+
)
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
toggleNotification({
|
|
270
|
+
type: 'error',
|
|
271
|
+
message: { id: getTrad('notification.error') },
|
|
272
|
+
});
|
|
273
|
+
}
|
|
278
274
|
};
|
|
279
275
|
|
|
280
276
|
return (
|
|
@@ -313,4 +309,4 @@ DataManagerProvider.propTypes = {
|
|
|
313
309
|
children: PropTypes.node.isRequired,
|
|
314
310
|
};
|
|
315
311
|
|
|
316
|
-
export default memo(DataManagerProvider);
|
|
312
|
+
export default memo(DataManagerProvider);
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
import { Flex } from '@strapi/design-system/Flex';
|
|
4
|
+
|
|
5
|
+
const NavigationContentHeader = ({ startActions, endActions }) => {
|
|
6
|
+
return (
|
|
7
|
+
<Flex justifyContent="space-between" width="100%">
|
|
8
|
+
<Flex alignItems="space-between">
|
|
9
|
+
{startActions}
|
|
10
|
+
</Flex>
|
|
11
|
+
<Flex alignItems="space-between">
|
|
12
|
+
{endActions}
|
|
13
|
+
</Flex>
|
|
14
|
+
</Flex>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default NavigationContentHeader;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useIntl } from 'react-intl';
|
|
3
|
+
import { HeaderLayout } from '@strapi/design-system/Layout';
|
|
4
|
+
import { Stack } from '@strapi/design-system/Stack';
|
|
5
|
+
import { Button } from '@strapi/design-system/Button';
|
|
6
|
+
import { IconButton } from '@strapi/design-system/IconButton';
|
|
7
|
+
import Check from '@strapi/icons/Check';
|
|
8
|
+
import More from '@strapi/icons/More';
|
|
9
|
+
import Plus from '@strapi/icons/Plus';
|
|
10
|
+
import styled from 'styled-components';
|
|
11
|
+
import { getTrad } from '../../../../translations';
|
|
12
|
+
import { transformToRESTPayload } from '../../utils/parsers';
|
|
13
|
+
const MoreButton = styled(IconButton)`
|
|
14
|
+
margin: ${({ theme }) => `0 ${theme.spaces[2]}`};
|
|
15
|
+
padding: ${({ theme }) => theme.spaces[2]};
|
|
16
|
+
|
|
17
|
+
svg {
|
|
18
|
+
width: ${18 / 16}rem;
|
|
19
|
+
height: ${18 / 16}rem;
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
const NavigationHeader = ({
|
|
24
|
+
structureHasErrors,
|
|
25
|
+
handleSave,
|
|
26
|
+
}) => {
|
|
27
|
+
const { formatMessage } = useIntl();
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<HeaderLayout
|
|
31
|
+
primaryAction={
|
|
32
|
+
<Stack horizontal size={2}>
|
|
33
|
+
<Button
|
|
34
|
+
onClick={handleSave}
|
|
35
|
+
startIcon={<Check />}
|
|
36
|
+
disabled={structureHasErrors}
|
|
37
|
+
type="submit"
|
|
38
|
+
>
|
|
39
|
+
{formatMessage(getTrad('submit.cta.save'))}
|
|
40
|
+
</Button>
|
|
41
|
+
<MoreButton
|
|
42
|
+
id="more"
|
|
43
|
+
label="More"
|
|
44
|
+
icon={<More />}
|
|
45
|
+
/>
|
|
46
|
+
</Stack>
|
|
47
|
+
}
|
|
48
|
+
title={formatMessage({
|
|
49
|
+
id: getTrad('header.title'),
|
|
50
|
+
defaultMessage: 'UI Navigation',
|
|
51
|
+
})}
|
|
52
|
+
subtitle={formatMessage({
|
|
53
|
+
id: getTrad('header.description'),
|
|
54
|
+
defaultMessage: 'Define your portal navigation',
|
|
55
|
+
})}
|
|
56
|
+
/>
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export default NavigationHeader;
|