strapi-plugin-navigation 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +17 -7
  2. package/admin/src/components/AdditionalFieldInput/index.d.ts +5 -0
  3. package/admin/src/components/AdditionalFieldInput/index.js +71 -0
  4. package/admin/src/components/AdditionalFieldInput/types.d.ts +14 -0
  5. package/admin/src/components/AdditionalFieldInput/types.js +3 -0
  6. package/admin/src/components/Item/index.js +2 -3
  7. package/admin/src/components/RestartAlert/index.d.ts +1 -1
  8. package/admin/src/components/TextArrayInput/index.d.ts +14 -0
  9. package/admin/src/components/TextArrayInput/index.js +45 -0
  10. package/admin/src/hooks/useAllContentTypes.d.ts +1 -4
  11. package/admin/src/hooks/useAllContentTypes.js +3 -7
  12. package/admin/src/hooks/useNavigationConfig.d.ts +1 -1
  13. package/admin/src/hooks/useNavigationConfig.js +6 -6
  14. package/admin/src/pages/DataManagerProvider/index.d.ts +1 -1
  15. package/admin/src/pages/DataManagerProvider/index.js +9 -11
  16. package/admin/src/pages/SettingsPage/components/CustomFieldForm/index.d.ts +12 -0
  17. package/admin/src/pages/SettingsPage/components/CustomFieldForm/index.js +112 -0
  18. package/admin/src/pages/SettingsPage/components/CustomFieldModal/index.d.ts +12 -0
  19. package/admin/src/pages/SettingsPage/components/CustomFieldModal/index.js +20 -0
  20. package/admin/src/pages/SettingsPage/components/CustomFieldTable/index.d.ts +11 -0
  21. package/admin/src/pages/SettingsPage/components/CustomFieldTable/index.js +105 -0
  22. package/admin/src/pages/SettingsPage/index.d.ts +2 -1
  23. package/admin/src/pages/SettingsPage/index.js +109 -74
  24. package/admin/src/pages/SettingsPage/types.d.ts +32 -0
  25. package/admin/src/pages/SettingsPage/types.js +3 -0
  26. package/admin/src/pages/SettingsPage/utils/form.d.ts +18 -0
  27. package/admin/src/pages/SettingsPage/utils/form.js +34 -0
  28. package/admin/src/pages/SettingsPage/utils/functions.d.ts +2 -2
  29. package/admin/src/pages/SettingsPage/utils/functions.js +1 -1
  30. package/admin/src/pages/View/components/NavigationItemForm/index.d.ts +3 -55
  31. package/admin/src/pages/View/components/NavigationItemForm/index.js +162 -177
  32. package/admin/src/pages/View/components/NavigationItemForm/types.d.ts +90 -0
  33. package/admin/src/pages/View/components/NavigationItemForm/types.js +3 -0
  34. package/admin/src/pages/View/components/NavigationItemForm/utils/form.d.ts +24 -43
  35. package/admin/src/pages/View/components/NavigationItemForm/utils/form.js +78 -45
  36. package/admin/src/pages/View/components/NavigationItemPopup/index.js +1 -2
  37. package/admin/src/pages/View/components/NavigationManager/AllNavigations/icons.d.ts +4 -0
  38. package/admin/src/pages/View/components/NavigationManager/AllNavigations/icons.js +11 -0
  39. package/admin/src/pages/View/components/NavigationManager/AllNavigations/index.d.ts +9 -0
  40. package/admin/src/pages/View/components/NavigationManager/{List → AllNavigations}/index.js +32 -31
  41. package/admin/src/pages/View/components/NavigationManager/DeletionConfirm/index.d.ts +9 -0
  42. package/admin/src/pages/View/components/NavigationManager/{Delete → DeletionConfirm}/index.js +18 -12
  43. package/admin/src/pages/View/components/NavigationManager/ErrorDetails/index.d.ts +9 -0
  44. package/admin/src/pages/View/components/NavigationManager/{Error → ErrorDetails}/index.js +10 -10
  45. package/admin/src/pages/View/components/NavigationManager/Footer/index.d.ts +24 -0
  46. package/admin/src/pages/View/components/NavigationManager/Footer/index.js +13 -0
  47. package/admin/src/pages/View/components/NavigationManager/Form/index.d.ts +3 -2
  48. package/admin/src/pages/View/components/NavigationManager/Form/index.js +7 -2
  49. package/admin/src/pages/View/components/NavigationManager/NavigationUpdate/index.d.ts +9 -0
  50. package/admin/src/pages/View/components/NavigationManager/{Edit → NavigationUpdate}/index.js +16 -11
  51. package/admin/src/pages/View/components/NavigationManager/NewNavigation/index.d.ts +10 -0
  52. package/admin/src/pages/View/components/NavigationManager/{Create → NewNavigation}/index.js +16 -11
  53. package/admin/src/pages/View/components/NavigationManager/index.d.ts +3 -2
  54. package/admin/src/pages/View/components/NavigationManager/index.js +22 -21
  55. package/admin/src/pages/View/components/NavigationManager/types.d.ts +2 -15
  56. package/admin/src/pages/View/index.d.ts +1 -1
  57. package/admin/src/pages/View/index.js +1 -1
  58. package/admin/src/pages/View/utils/parsers.d.ts +1 -0
  59. package/admin/src/pages/View/utils/parsers.js +8 -7
  60. package/admin/src/translations/en.json +37 -0
  61. package/admin/src/translations/index.d.ts +2 -1
  62. package/admin/src/translations/index.js +1 -1
  63. package/admin/src/utils/api.d.ts +8 -7
  64. package/admin/src/utils/api.js +6 -41
  65. package/admin/src/utils/enums.d.ts +25 -0
  66. package/admin/src/utils/enums.js +30 -0
  67. package/admin/src/utils/functions.d.ts +16 -0
  68. package/admin/src/utils/functions.js +46 -0
  69. package/admin/src/utils/index.d.ts +3 -17
  70. package/admin/src/utils/index.js +16 -39
  71. package/package.json +5 -5
  72. package/server/config/index.js +6 -4
  73. package/server/config/setupStrategy.js +13 -1
  74. package/server/content-types/index.d.ts +5 -25
  75. package/server/content-types/navigation/index.d.ts +0 -7
  76. package/server/content-types/navigation/index.js +0 -2
  77. package/server/content-types/navigation-item/index.d.ts +5 -13
  78. package/server/content-types/navigation-item/index.js +0 -2
  79. package/server/content-types/navigation-item/schema.d.ts +5 -0
  80. package/server/content-types/navigation-item/schema.js +5 -0
  81. package/server/content-types/navigations-items-related/index.d.ts +0 -5
  82. package/server/content-types/navigations-items-related/index.js +0 -2
  83. package/server/controllers/admin.js +1 -1
  84. package/server/controllers/client.js +2 -1
  85. package/server/graphql/types/navigation-item.d.ts +2 -1
  86. package/server/graphql/types/navigation-item.js +26 -2
  87. package/server/index.d.ts +5 -25
  88. package/server/services/admin.js +26 -14
  89. package/server/services/client.js +64 -21
  90. package/server/services/common.js +25 -6
  91. package/server/utils/constant.d.ts +0 -3
  92. package/server/utils/constant.js +1 -2
  93. package/server/utils/functions.d.ts +12 -12
  94. package/server/utils/functions.js +60 -22
  95. package/strapi-server.d.ts +5 -25
  96. package/tsconfig.tsbuildinfo +1 -1
  97. package/types/config.d.ts +6 -2
  98. package/types/contentTypes.d.ts +22 -1
  99. package/types/services.d.ts +14 -5
  100. package/types/utils.d.ts +6 -1
  101. package/types/utils.js +15 -1
  102. package/admin/src/pages/View/components/NavigationManager/Create/index.d.ts +0 -9
  103. package/admin/src/pages/View/components/NavigationManager/Delete/index.d.ts +0 -8
  104. package/admin/src/pages/View/components/NavigationManager/Edit/index.d.ts +0 -8
  105. package/admin/src/pages/View/components/NavigationManager/Error/index.d.ts +0 -8
  106. package/admin/src/pages/View/components/NavigationManager/List/index.d.ts +0 -8
  107. package/admin/src/pages/View/utils/enums.d.ts +0 -9
  108. package/admin/src/pages/View/utils/enums.js +0 -12
  109. package/admin/src/utils/getTrad.d.ts +0 -3
  110. package/admin/src/utils/getTrad.js +0 -9
  111. package/server/content-types/navigation/lifecycle.d.ts +0 -9
  112. package/server/content-types/navigation/lifecycle.js +0 -10
  113. package/server/content-types/navigation-item/lifecycle.d.ts +0 -16
  114. package/server/content-types/navigation-item/lifecycle.js +0 -31
  115. package/server/content-types/navigations-items-related/lifecycle.d.ts +0 -8
  116. package/server/content-types/navigations-items-related/lifecycle.js +0 -22
@@ -0,0 +1,105 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const lodash_1 = require("lodash");
30
+ const react_1 = __importStar(require("react"));
31
+ const helper_plugin_1 = require("@strapi/helper-plugin");
32
+ const VisuallyHidden_1 = require("@strapi/design-system/VisuallyHidden");
33
+ const Table_1 = require("@strapi/design-system/Table");
34
+ const icons_1 = require("@strapi/icons");
35
+ const Typography_1 = require("@strapi/design-system/Typography");
36
+ const Tooltip_1 = require("@strapi/design-system/Tooltip");
37
+ const Stack_1 = require("@strapi/design-system/Stack");
38
+ const IconButton_1 = require("@strapi/design-system/IconButton");
39
+ const utils_1 = require("../../../../utils");
40
+ const ConfirmationDialog_1 = __importDefault(require("../../../../components/ConfirmationDialog"));
41
+ const translations_1 = require("../../../../translations");
42
+ const refreshIcon = react_1.default.createElement(icons_1.Refresh, null);
43
+ const plusIcon = react_1.default.createElement(icons_1.Plus, null);
44
+ const tradPrefix = "pages.settings.form.customFields.table.";
45
+ const CustomFieldTable = ({ data, onOpenModal, onRemoveCustomField, onToggleCustomField, }) => {
46
+ const [confirmationVisible, setIsConfirmationVisible] = (0, react_1.useState)(false);
47
+ const [fieldToRemove, setFieldToRemove] = (0, react_1.useState)(null);
48
+ const toggleNotification = (0, helper_plugin_1.useNotification)();
49
+ const customFields = (0, react_1.useMemo)(() => (0, lodash_1.sortBy)(data, "name"), [data]);
50
+ const handleRemove = (0, react_1.useCallback)((field) => {
51
+ setFieldToRemove(field);
52
+ setIsConfirmationVisible(true);
53
+ }, [setFieldToRemove, setIsConfirmationVisible]);
54
+ const cleanup = (0, react_1.useCallback)(() => {
55
+ setFieldToRemove(null);
56
+ setIsConfirmationVisible(false);
57
+ }, [setFieldToRemove, setIsConfirmationVisible]);
58
+ const handleConfirm = (0, react_1.useCallback)(() => {
59
+ if (fieldToRemove === null) {
60
+ toggleNotification({
61
+ type: 'warning',
62
+ message: {
63
+ id: (0, translations_1.getTradId)(`${tradPrefix}confirmation.error`),
64
+ default: 'Something went wrong',
65
+ }
66
+ });
67
+ }
68
+ else {
69
+ onRemoveCustomField(fieldToRemove);
70
+ }
71
+ cleanup();
72
+ }, [cleanup, fieldToRemove, translations_1.getTradId, onRemoveCustomField, toggleNotification]);
73
+ return (react_1.default.createElement(react_1.default.Fragment, null,
74
+ react_1.default.createElement(ConfirmationDialog_1.default, { isVisible: confirmationVisible, header: (0, utils_1.getMessage)(`${tradPrefix}confirmation.header`), children: (0, utils_1.getMessage)(`${tradPrefix}confirmation.message`), labelConfirm: (0, utils_1.getMessage)(`${tradPrefix}confirmation.confirm`), iconConfirm: refreshIcon, mainIcon: refreshIcon, onConfirm: handleConfirm, onCancel: cleanup }),
75
+ react_1.default.createElement(Table_1.Table, { colCount: 4, rowCount: data.length + 1, footer: react_1.default.createElement(Table_1.TFooter, { onClick: (e) => { e.preventDefault(); onOpenModal(null); }, icon: plusIcon }, (0, utils_1.getMessage)(`${tradPrefix}footer`)) },
76
+ react_1.default.createElement(Table_1.Thead, null,
77
+ react_1.default.createElement(Table_1.Tr, null,
78
+ react_1.default.createElement(Table_1.Th, { width: "20%" },
79
+ react_1.default.createElement(Typography_1.Typography, { variant: "sigma", textColor: "neutral600" }, (0, utils_1.getMessage)(`${tradPrefix}header.name`))),
80
+ react_1.default.createElement(Table_1.Th, { width: "60%" },
81
+ react_1.default.createElement(Typography_1.Typography, { variant: "sigma", textColor: "neutral600" }, (0, utils_1.getMessage)(`${tradPrefix}header.label`))),
82
+ react_1.default.createElement(Table_1.Th, { width: "15%" },
83
+ react_1.default.createElement(Typography_1.Typography, { variant: "sigma", textColor: "neutral600" }, (0, utils_1.getMessage)(`${tradPrefix}header.type`))),
84
+ react_1.default.createElement(Table_1.Th, { width: "5%" },
85
+ react_1.default.createElement(Typography_1.Typography, { variant: "sigma", textColor: "neutral600" }, (0, utils_1.getMessage)(`${tradPrefix}header.required`))),
86
+ react_1.default.createElement(Table_1.Th, null,
87
+ react_1.default.createElement(VisuallyHidden_1.VisuallyHidden, null)))),
88
+ react_1.default.createElement(Table_1.Tbody, null, customFields.map(customField => (react_1.default.createElement(Table_1.Tr, { key: customField.name },
89
+ react_1.default.createElement(Table_1.Td, { width: '20%' },
90
+ react_1.default.createElement(Typography_1.Typography, { fontWeight: "semiBold", textColor: "neutral800" }, customField.name)),
91
+ react_1.default.createElement(Table_1.Td, { width: "60%" },
92
+ react_1.default.createElement(Typography_1.Typography, { textColor: "neutral800" }, customField.label)),
93
+ react_1.default.createElement(Table_1.Td, { width: "15%" },
94
+ react_1.default.createElement(Typography_1.Typography, { textColor: "neutral800" }, customField.type)),
95
+ react_1.default.createElement(Table_1.Td, { width: "5%" },
96
+ react_1.default.createElement(Tooltip_1.Tooltip, { description: (0, utils_1.getMessage)(`${tradPrefix}${customField.required ? "required" : "notRequired"}`) },
97
+ react_1.default.createElement(Typography_1.Typography, { textColor: "neutral800" }, customField.required ? react_1.default.createElement(icons_1.Check, null) : react_1.default.createElement(icons_1.Minus, null)))),
98
+ react_1.default.createElement(Table_1.Td, null,
99
+ react_1.default.createElement(Stack_1.Stack, { horizontal: true, size: 1 },
100
+ react_1.default.createElement(IconButton_1.IconButton, { onClick: () => onOpenModal(customField), label: (0, utils_1.getMessage)(`${tradPrefix}edit`), icon: react_1.default.createElement(icons_1.Pencil, null), noBorder: true }),
101
+ react_1.default.createElement(IconButton_1.IconButton, { onClick: () => onToggleCustomField(customField), label: (0, utils_1.getMessage)(`${tradPrefix}${customField.enabled ? 'disable' : 'enable'}`), icon: customField.enabled ? react_1.default.createElement(icons_1.Eye, null) : react_1.default.createElement(icons_1.EyeStriked, null), noBorder: true }),
102
+ react_1.default.createElement(IconButton_1.IconButton, { onClick: () => handleRemove(customField), label: (0, utils_1.getMessage)(`${tradPrefix}remove`), icon: react_1.default.createElement(icons_1.Trash, null), noBorder: true }))))))))));
103
+ };
104
+ exports.default = CustomFieldTable;
105
+ //# sourceMappingURL=index.js.map
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
2
+ declare const SettingsPage: () => JSX.Element;
1
3
  export default SettingsPage;
2
- declare function SettingsPage(): JSX.Element;
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -27,8 +27,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = __importStar(require("react"));
30
- const formik_1 = require("formik");
31
30
  const lodash_1 = require("lodash");
31
+ const formik_1 = require("formik");
32
32
  const helper_plugin_1 = require("@strapi/helper-plugin");
33
33
  const Main_1 = require("@strapi/design-system/Main");
34
34
  const Layout_1 = require("@strapi/design-system/Layout");
@@ -46,47 +46,69 @@ const icons_1 = require("@strapi/icons");
46
46
  const permissions_1 = __importDefault(require("../../permissions"));
47
47
  const useNavigationConfig_1 = __importDefault(require("../../hooks/useNavigationConfig"));
48
48
  const useAllContentTypes_1 = __importDefault(require("../../hooks/useAllContentTypes"));
49
- const enums_1 = require("../View/utils/enums");
49
+ const utils_1 = require("../../utils");
50
50
  const ConfirmationDialog_1 = __importDefault(require("../../components/ConfirmationDialog"));
51
51
  const RestartAlert_1 = __importDefault(require("../../components/RestartAlert"));
52
- const utils_1 = require("../../utils");
52
+ const utils_2 = require("../../utils");
53
53
  const functions_1 = require("./utils/functions");
54
54
  const styles_1 = require("../../components/Alert/styles");
55
55
  const DisableI18nModal_1 = require("./components/DisableI18nModal");
56
+ const CustomFieldModal_1 = __importDefault(require("./components/CustomFieldModal"));
57
+ const CustomFieldTable_1 = __importDefault(require("./components/CustomFieldTable"));
56
58
  const RESTART_NOT_REQUIRED = { required: false };
57
59
  const RESTART_REQUIRED = { required: true, reasons: [] };
60
+ const RELATION_ATTRIBUTE_TYPES = ['relation', 'media', 'component'];
61
+ const BOX_DEFAULT_PROPS = {
62
+ background: "neutral0",
63
+ hasRadius: true,
64
+ shadow: "filterShadow",
65
+ padding: 6,
66
+ };
58
67
  const SettingsPage = () => {
59
68
  const { lockApp, unlockApp } = (0, helper_plugin_1.useOverlayBlocker)();
60
69
  const { lockAppWithAutoreload, unlockAppWithAutoreload } = (0, helper_plugin_1.useAutoReloadOverlayBlocker)();
61
- const [isRestorePopupOpen, setIsRestorePopupOpen] = (0, react_1.useState)(false);
62
70
  const [restartStatus, setRestartStatus] = (0, react_1.useState)(RESTART_NOT_REQUIRED);
63
- const [contentTypeExpanded, setContentTypeExpanded] = (0, react_1.useState)(undefined);
64
71
  const [pruneObsoleteI18nNavigations, setPruneObsoleteI18nNavigations] = (0, react_1.useState)(false);
72
+ const [isCustomFieldModalOpen, setIsCustomFieldModalOpen] = (0, react_1.useState)(false);
73
+ const [customFieldSelected, setCustomFieldSelected] = (0, react_1.useState)(null);
74
+ const [customFields, setCustomFields] = (0, react_1.useState)([]);
75
+ const [isRestorePopupOpen, setIsRestorePopupOpen] = (0, react_1.useState)(false);
76
+ const [contentTypeExpanded, setContentTypeExpanded] = (0, react_1.useState)(undefined);
77
+ const { data: navigationConfigData, isLoading: isConfigLoading, error: configErr, submitMutation, restoreMutation, restartMutation } = (0, useNavigationConfig_1.default)();
78
+ const { data: allContentTypesData, isLoading: isContentTypesLoading, error: contentTypesErr } = (0, useAllContentTypes_1.default)();
79
+ const isLoading = isConfigLoading || isContentTypesLoading;
80
+ const isError = configErr || contentTypesErr;
81
+ const configContentTypes = navigationConfigData?.contentTypes || [];
82
+ const formikInitialValues = (0, react_1.useMemo)(() => ({
83
+ allowedLevels: (0, lodash_1.get)(navigationConfigData, "allowedLevels", 2),
84
+ audienceFieldChecked: (0, lodash_1.get)(navigationConfigData, "additionalFields", []).includes(utils_1.navigationItemAdditionalFields.AUDIENCE),
85
+ i18nEnabled: (0, lodash_1.get)(navigationConfigData, "i18nEnabled", false),
86
+ nameFields: (0, lodash_1.get)(navigationConfigData, "contentTypesNameFields", {}),
87
+ pathDefaultFields: (0, lodash_1.get)(navigationConfigData, "pathDefaultFields", {}),
88
+ populate: (0, lodash_1.get)(navigationConfigData, "contentTypesPopulate", {}),
89
+ selectedContentTypes: configContentTypes.map(item => item.uid),
90
+ }), [configContentTypes, navigationConfigData, utils_1.navigationItemAdditionalFields]);
65
91
  const { disableI18nModal, setDisableI18nModalOpened, setI18nModalOnCancel, } = (0, DisableI18nModal_1.useDisableI18nModal)(({ pruneNavigations }) => {
66
92
  setPruneObsoleteI18nNavigations(pruneNavigations);
67
93
  });
68
- const { data: navigationConfigData, isLoading: isConfigLoading, err: configErr, submitMutation, restoreMutation, restartMutation } = (0, useNavigationConfig_1.default)();
69
- const { data: allContentTypesData, isLoading: isContentTypesLoading, err: contentTypesErr } = (0, useAllContentTypes_1.default)();
70
- const isLoading = isConfigLoading || isContentTypesLoading;
71
- const isError = configErr || contentTypesErr;
72
- const boxDefaultProps = {
73
- background: "neutral0",
74
- hasRadius: true,
75
- shadow: "filterShadow",
76
- padding: 6,
77
- };
78
- const preparePayload = ({ form: { selectedContentTypes, nameFields, audienceFieldChecked, allowedLevels, i18nEnabled }, pruneObsoleteI18nNavigations }) => ({
79
- i18nEnabled,
94
+ (0, react_1.useEffect)(() => {
95
+ const additionalFields = navigationConfigData?.additionalFields
96
+ ?.filter((field) => field !== utils_1.navigationItemAdditionalFields.AUDIENCE);
97
+ setCustomFields(additionalFields || []);
98
+ }, [navigationConfigData]);
99
+ const preparePayload = (0, react_1.useCallback)(({ form: { allowedLevels, audienceFieldChecked, i18nEnabled, nameFields, pathDefaultFields, populate, selectedContentTypes, }, pruneObsoleteI18nNavigations }) => ({
100
+ additionalFields: audienceFieldChecked ? ['audience', ...customFields] : [...customFields],
80
101
  allowedLevels,
81
- pruneObsoleteI18nNavigations,
82
102
  contentTypes: selectedContentTypes,
83
103
  contentTypesNameFields: nameFields,
84
104
  contentTypesPopulate: populate,
85
- additionalFields: audienceFieldChecked ? [enums_1.navigationItemAdditionalFields.AUDIENCE] : [],
105
+ i18nEnabled,
106
+ pathDefaultFields,
107
+ pruneObsoleteI18nNavigations,
86
108
  gql: {
87
- navigationItemRelated: selectedContentTypes.map(uid => (0, functions_1.resolveGlobalLikeId)(uid)),
109
+ navigationItemRelated: selectedContentTypes.map((uid) => (0, functions_1.resolveGlobalLikeId)(uid)),
88
110
  }
89
- });
111
+ }), [customFields]);
90
112
  const onSave = async (form) => {
91
113
  lockApp();
92
114
  const payload = preparePayload({ form, pruneObsoleteI18nNavigations });
@@ -125,22 +147,17 @@ const SettingsPage = () => {
125
147
  const handleRestart = async () => {
126
148
  lockAppWithAutoreload();
127
149
  await restartMutation();
128
- setRestartStatus(RESTART_NOT_REQUIRED);
129
150
  unlockAppWithAutoreload();
151
+ setRestartStatus(RESTART_NOT_REQUIRED);
130
152
  };
131
153
  const handleRestartDiscard = () => setRestartStatus(RESTART_NOT_REQUIRED);
132
154
  const handleSetContentTypeExpanded = key => setContentTypeExpanded(key === contentTypeExpanded ? undefined : key);
133
- const prepareNameFieldFor = (uid, current, value) => ({
134
- ...current,
135
- [uid]: value && !(0, lodash_1.isEmpty)(value) ? [...value] : undefined,
136
- });
137
155
  if (isLoading || isError) {
138
156
  return (react_1.default.createElement(react_1.default.Fragment, null,
139
- react_1.default.createElement(helper_plugin_1.SettingsPageTitle, { name: (0, utils_1.getMessage)('Settings.email.plugin.title', 'Configuration') }),
157
+ react_1.default.createElement(helper_plugin_1.SettingsPageTitle, { name: (0, utils_2.getMessage)('Settings.email.plugin.title', 'Configuration') }),
140
158
  react_1.default.createElement(helper_plugin_1.LoadingIndicatorPage, null, "Fetching plugin config...")));
141
159
  }
142
- const configContentTypes = navigationConfigData?.contentTypes || [];
143
- const allContentTypes = !isLoading && Object.values(allContentTypesData).filter(({ uid }) => (0, functions_1.isContentTypeEligible)(uid, {
160
+ const allContentTypes = !isLoading ? Object.values(allContentTypesData).filter(({ uid }) => (0, functions_1.isContentTypeEligible)(uid, {
144
161
  allowedContentTypes: navigationConfigData?.allowedContentTypes,
145
162
  restrictedContentTypes: navigationConfigData?.restrictedContentTypes,
146
163
  })).map(ct => {
@@ -154,69 +171,81 @@ const SettingsPage = () => {
154
171
  };
155
172
  }
156
173
  return ct;
157
- });
158
- const selectedContentTypes = configContentTypes.map(item => item.uid);
159
- const audienceFieldChecked = navigationConfigData?.additionalFields.includes(enums_1.navigationItemAdditionalFields.AUDIENCE);
160
- const allowedLevels = navigationConfigData?.allowedLevels || 2;
161
- const nameFields = navigationConfigData?.contentTypesNameFields || {};
162
- const populate = navigationConfigData?.contentTypesPopulate || {};
163
- const i18nEnabled = navigationConfigData?.i18nEnabled ?? false;
174
+ }) : [];
164
175
  const isI18NPluginEnabled = navigationConfigData?.isI18NPluginEnabled;
165
176
  const defaultLocale = navigationConfigData?.defaultLocale;
177
+ const handleSubmitCustomField = (field) => {
178
+ const filteredFields = customFields.filter(f => f.name !== field.name);
179
+ setCustomFields([...filteredFields, field]);
180
+ setCustomFieldSelected(null);
181
+ setIsCustomFieldModalOpen(false);
182
+ };
183
+ const handleOpenCustomFieldModal = (field) => {
184
+ setCustomFieldSelected(field);
185
+ setIsCustomFieldModalOpen(true);
186
+ };
187
+ const handleRemoveCustomField = (field) => {
188
+ const filteredFields = customFields.filter(f => f.name !== field.name);
189
+ setCustomFields(filteredFields);
190
+ setCustomFieldSelected(null);
191
+ setIsCustomFieldModalOpen(false);
192
+ };
193
+ const handleToggleCustomField = (field) => {
194
+ const updatedField = { ...field, enabled: !(0, lodash_1.get)(field, 'enabled', false) };
195
+ const filteredFields = customFields.filter(f => f.name !== field.name);
196
+ setCustomFields([...filteredFields, updatedField]);
197
+ };
166
198
  return (react_1.default.createElement(react_1.default.Fragment, null,
167
- react_1.default.createElement(helper_plugin_1.SettingsPageTitle, { name: (0, utils_1.getMessage)('Settings.email.plugin.title', 'Configuration') }),
199
+ react_1.default.createElement(helper_plugin_1.SettingsPageTitle, { name: (0, utils_2.getMessage)('Settings.email.plugin.title', 'Configuration') }),
168
200
  react_1.default.createElement(Main_1.Main, { labelledBy: "title" },
169
- react_1.default.createElement(formik_1.Formik, { initialValues: {
170
- selectedContentTypes,
171
- audienceFieldChecked,
172
- allowedLevels,
173
- nameFields,
174
- populate,
175
- i18nEnabled,
176
- }, onSubmit: onSave }, ({ handleSubmit, setFieldValue, values }) => (react_1.default.createElement(helper_plugin_1.Form, { noValidate: true, onSubmit: handleSubmit },
177
- react_1.default.createElement(Layout_1.HeaderLayout, { title: (0, utils_1.getMessage)('pages.settings.header.title'), subtitle: (0, utils_1.getMessage)('pages.settings.header.description'), primaryAction: react_1.default.createElement(helper_plugin_1.CheckPermissions, { permissions: permissions_1.default.access },
178
- react_1.default.createElement(Button_1.Button, { type: "submit", startIcon: react_1.default.createElement(icons_1.Check, null), disabled: restartStatus.required }, (0, utils_1.getMessage)('pages.settings.actions.submit'))) }),
201
+ react_1.default.createElement(formik_1.Formik, { initialValues: formikInitialValues, onSubmit: onSave }, ({ handleSubmit, setFieldValue, values }) => (react_1.default.createElement(formik_1.Form, { noValidate: true, onSubmit: handleSubmit },
202
+ react_1.default.createElement(Layout_1.HeaderLayout, { title: (0, utils_2.getMessage)('pages.settings.header.title'), subtitle: (0, utils_2.getMessage)('pages.settings.header.description'), primaryAction: react_1.default.createElement(helper_plugin_1.CheckPermissions, { permissions: permissions_1.default.access },
203
+ react_1.default.createElement(Button_1.Button, { type: "submit", startIcon: react_1.default.createElement(icons_1.Check, null), disabled: restartStatus.required }, (0, utils_2.getMessage)('pages.settings.actions.submit'))) }),
179
204
  react_1.default.createElement(Layout_1.ContentLayout, null,
180
205
  react_1.default.createElement(Stack_1.Stack, { spacing: 7 },
181
- restartStatus.required && (react_1.default.createElement(RestartAlert_1.default, { closeLabel: (0, utils_1.getMessage)('pages.settings.actions.restart.alert.cancel'), title: (0, utils_1.getMessage)('pages.settings.actions.restart.alert.title'), action: react_1.default.createElement(Box_1.Box, null,
182
- react_1.default.createElement(Button_1.Button, { onClick: handleRestart, startIcon: react_1.default.createElement(icons_1.Play, null) }, (0, utils_1.getMessage)('pages.settings.actions.restart'))), onClose: handleRestartDiscard },
206
+ restartStatus.required && (react_1.default.createElement(RestartAlert_1.default, { closeLabel: (0, utils_2.getMessage)('pages.settings.actions.restart.alert.cancel'), title: (0, utils_2.getMessage)('pages.settings.actions.restart.alert.title'), action: react_1.default.createElement(Box_1.Box, null,
207
+ react_1.default.createElement(Button_1.Button, { onClick: handleRestart, startIcon: react_1.default.createElement(icons_1.Play, null) }, (0, utils_2.getMessage)('pages.settings.actions.restart'))), onClose: handleRestartDiscard },
183
208
  react_1.default.createElement(react_1.default.Fragment, null,
184
- react_1.default.createElement(Box_1.Box, { paddingBottom: 1 }, (0, utils_1.getMessage)('pages.settings.actions.restart.alert.description')),
185
- restartStatus.reasons.map((reason, i) => react_1.default.createElement(Box_1.Box, { paddingBottom: 1, key: i, children: (0, utils_1.getMessage)(`pages.settings.actions.restart.alert.reason.${reason}`) }))))),
186
- react_1.default.createElement(Box_1.Box, { ...boxDefaultProps },
209
+ react_1.default.createElement(Box_1.Box, { paddingBottom: 1 }, (0, utils_2.getMessage)('pages.settings.actions.restart.alert.description')),
210
+ restartStatus.reasons?.map((reason, i) => react_1.default.createElement(Box_1.Box, { paddingBottom: 1, key: i, children: (0, utils_2.getMessage)(`pages.settings.actions.restart.alert.reason.${reason}`) }))))),
211
+ react_1.default.createElement(Box_1.Box, { ...BOX_DEFAULT_PROPS },
187
212
  react_1.default.createElement(Stack_1.Stack, { size: 4 },
188
- react_1.default.createElement(Typography_1.Typography, { variant: "delta", as: "h2" }, (0, utils_1.getMessage)('pages.settings.general.title')),
213
+ react_1.default.createElement(Typography_1.Typography, { variant: "delta", as: "h2" }, (0, utils_2.getMessage)('pages.settings.general.title')),
189
214
  react_1.default.createElement(Grid_1.Grid, { gap: 4 },
190
215
  react_1.default.createElement(Grid_1.GridItem, { col: 12, s: 12, xs: 12 },
191
- react_1.default.createElement(Select_1.Select, { name: "selectedContentTypes", label: (0, utils_1.getMessage)('pages.settings.form.contentTypes.label'), placeholder: (0, utils_1.getMessage)('pages.settings.form.contentTypes.placeholder'), hint: (0, utils_1.getMessage)('pages.settings.form.contentTypes.hint'), onClear: () => setFieldValue('selectedContentTypes', [], false), value: values.selectedContentTypes, onChange: (value) => setFieldValue('selectedContentTypes', value, false), multi: true, withTags: true, disabled: restartStatus.required }, allContentTypes.map((item) => react_1.default.createElement(Select_1.Option, { key: item.uid, value: item.uid }, item.info.displayName)))),
216
+ react_1.default.createElement(Select_1.Select, { name: "selectedContentTypes", label: (0, utils_2.getMessage)('pages.settings.form.contentTypes.label'), placeholder: (0, utils_2.getMessage)('pages.settings.form.contentTypes.placeholder'), hint: (0, utils_2.getMessage)('pages.settings.form.contentTypes.hint'), onClear: () => setFieldValue('selectedContentTypes', [], false), value: values.selectedContentTypes, onChange: (value) => setFieldValue('selectedContentTypes', value, false), multi: true, withTags: true, disabled: restartStatus.required }, allContentTypes.map((item) => react_1.default.createElement(Select_1.Option, { key: item.uid, value: item.uid }, item.info.displayName)))),
192
217
  !(0, lodash_1.isEmpty)(values.selectedContentTypes) && (react_1.default.createElement(Grid_1.GridItem, { col: 12 },
193
- react_1.default.createElement(Accordion_1.AccordionGroup, { label: (0, utils_1.getMessage)('pages.settings.form.contentTypesSettings.label'), labelAction: react_1.default.createElement(Tooltip_1.Tooltip, { description: (0, utils_1.getMessage)('pages.settings.form.contentTypesSettings.tooltip') },
218
+ react_1.default.createElement(Accordion_1.AccordionGroup, { label: (0, utils_2.getMessage)('pages.settings.form.contentTypesSettings.label'), labelAction: react_1.default.createElement(Tooltip_1.Tooltip, { description: (0, utils_2.getMessage)('pages.settings.form.contentTypesSettings.tooltip') },
194
219
  react_1.default.createElement(icons_1.Information, { "aria-hidden": true })) }, (0, lodash_1.orderBy)(values.selectedContentTypes).map(uid => {
195
- const { attributes, info: { displayName }, available, isSingle } = allContentTypes.find(item => item.uid == uid);
220
+ const contentType = allContentTypes.find(item => item.uid == uid);
221
+ if (!contentType)
222
+ return;
223
+ const { attributes, info: { displayName }, available, isSingle } = contentType;
196
224
  const stringAttributes = Object.keys(attributes).filter(_ => attributes[_].type === 'string');
197
- const relationAttributes = Object.keys(attributes).filter(_ => attributes[_].type === 'relation');
225
+ const relationAttributes = Object.keys(attributes).filter(_ => RELATION_ATTRIBUTE_TYPES.includes(attributes[_].type));
198
226
  const key = `collectionSettings-${uid}`;
199
227
  return (react_1.default.createElement(Accordion_1.Accordion, { expanded: contentTypeExpanded === key, toggle: () => handleSetContentTypeExpanded(key), key: key, id: key, size: "S" },
200
- react_1.default.createElement(Accordion_1.AccordionToggle, { title: displayName, togglePosition: "left", startIcon: (isSingle && !available) && (react_1.default.createElement(icons_1.ExclamationMarkCircle, { "aria-hidden": true })) }),
228
+ react_1.default.createElement(Accordion_1.AccordionToggle, { title: displayName, togglePosition: "left", startIcon: (isSingle && !available) ? (react_1.default.createElement(icons_1.ExclamationMarkCircle, { "aria-hidden": true })) : null }),
201
229
  react_1.default.createElement(Accordion_1.AccordionContent, null,
202
230
  react_1.default.createElement(Box_1.Box, { padding: 6 },
203
231
  react_1.default.createElement(Stack_1.Stack, { size: 4 },
204
- (isSingle && !available) && (react_1.default.createElement(styles_1.PermanentAlert, { title: (0, utils_1.getMessage)('pages.settings.form.contentTypesSettings.initializationWarning.title'), variant: "danger", onClose: (e) => e.preventDefault() }, (0, utils_1.getMessage)('pages.settings.form.contentTypesSettings.initializationWarning.content'))),
205
- react_1.default.createElement(Select_1.Select, { name: `collectionSettings-${uid}-entryLabel`, label: (0, utils_1.getMessage)('pages.settings.form.nameField.label'), hint: (0, utils_1.getMessage)(`pages.settings.form.populate.${(0, lodash_1.isEmpty)(stringAttributes) ? 'empty' : 'hint'}`), placeholder: (0, utils_1.getMessage)('pages.settings.form.nameField.placeholder'), onClear: () => null, value: values.nameFields[uid] || [], onChange: (value) => setFieldValue('nameFields', prepareNameFieldFor(uid, values.nameFields, value)), multi: true, withTags: true, disabled: restartStatus.required || (0, lodash_1.isEmpty)(stringAttributes) }, stringAttributes.map(key => (react_1.default.createElement(Select_1.Option, { key: uid + key, value: key }, (0, lodash_1.capitalize)(key.split('_').join(' ')))))),
206
- react_1.default.createElement(Select_1.Select, { name: `collectionSettings-${uid}-populate`, label: (0, utils_1.getMessage)('pages.settings.form.populate.label'), hint: (0, utils_1.getMessage)(`pages.settings.form.populate.${(0, lodash_1.isEmpty)(relationAttributes) ? 'empty' : 'hint'}`), placeholder: (0, utils_1.getMessage)('pages.settings.form.populate.placeholder'), onClear: () => null, value: values.populate[uid] || [], onChange: (value) => setFieldValue('populate', prepareNameFieldFor(uid, values.populate, value)), multi: true, withTags: true, disabled: restartStatus.required || (0, lodash_1.isEmpty)(relationAttributes) }, relationAttributes.map(key => (react_1.default.createElement(Select_1.Option, { key: uid + key, value: key }, (0, lodash_1.capitalize)(key.split('_').join(' ')))))))))));
232
+ (isSingle && !available) && (react_1.default.createElement(styles_1.PermanentAlert, { title: (0, utils_2.getMessage)('pages.settings.form.contentTypesSettings.initializationWarning.title'), variant: "danger", onClose: (e) => e.preventDefault() }, (0, utils_2.getMessage)('pages.settings.form.contentTypesSettings.initializationWarning.content'))),
233
+ react_1.default.createElement(Select_1.Select, { name: `collectionSettings-${uid}-entryLabel`, label: (0, utils_2.getMessage)('pages.settings.form.nameField.label'), hint: (0, utils_2.getMessage)(`pages.settings.form.nameField.${(0, lodash_1.isEmpty)(stringAttributes) ? 'empty' : 'hint'}`), placeholder: (0, utils_2.getMessage)('pages.settings.form.nameField.placeholder'), onClear: () => setFieldValue('nameFields', (0, utils_1.prepareNewValueForRecord)(uid, values.nameFields, [])), value: values.nameFields[uid] || [], onChange: (value) => setFieldValue('nameFields', (0, utils_1.prepareNewValueForRecord)(uid, values.nameFields, value)), multi: true, withTags: true, disabled: restartStatus.required || (0, lodash_1.isEmpty)(stringAttributes) }, stringAttributes.map(key => (react_1.default.createElement(Select_1.Option, { key: uid + key, value: key }, (0, lodash_1.capitalize)(key.split('_').join(' ')))))),
234
+ react_1.default.createElement(Select_1.Select, { name: `collectionSettings-${uid}-populate`, label: (0, utils_2.getMessage)('pages.settings.form.populate.label'), hint: (0, utils_2.getMessage)(`pages.settings.form.populate.${(0, lodash_1.isEmpty)(relationAttributes) ? 'empty' : 'hint'}`), placeholder: (0, utils_2.getMessage)('pages.settings.form.populate.placeholder'), onClear: () => setFieldValue('populate', (0, utils_1.prepareNewValueForRecord)(uid, values.populate, [])), value: values.populate[uid] || [], onChange: (value) => setFieldValue('populate', (0, utils_1.prepareNewValueForRecord)(uid, values.populate, value)), multi: true, withTags: true, disabled: restartStatus.required || (0, lodash_1.isEmpty)(relationAttributes) }, relationAttributes.map(key => (react_1.default.createElement(Select_1.Option, { key: uid + key, value: key }, (0, lodash_1.capitalize)(key.split('_').join(' ')))))),
235
+ react_1.default.createElement(Select_1.Select, { name: `collectionSettings-${uid}-pathDefaultFields`, label: (0, utils_2.getMessage)('pages.settings.form.pathDefaultFields.label'), hint: (0, utils_2.getMessage)(`pages.settings.form.pathDefaultFields.${(0, lodash_1.isEmpty)(stringAttributes) ? 'empty' : 'hint'}`), placeholder: (0, utils_2.getMessage)('pages.settings.form.pathDefaultFields.placeholder'), onClear: () => setFieldValue('pathDefaultFields', (0, utils_1.prepareNewValueForRecord)(uid, values.pathDefaultFields, [])), value: values.pathDefaultFields[uid] || [], onChange: (value) => setFieldValue('pathDefaultFields', (0, utils_1.prepareNewValueForRecord)(uid, values.pathDefaultFields, value)), multi: true, withTags: true, disabled: restartStatus.required || (0, lodash_1.isEmpty)(stringAttributes) }, stringAttributes.map(key => (react_1.default.createElement(Select_1.Option, { key: uid + key, value: key }, (0, lodash_1.capitalize)(key.split('_').join(' ')))))))))));
207
236
  }))))))),
208
- react_1.default.createElement(Box_1.Box, { ...boxDefaultProps },
237
+ react_1.default.createElement(Box_1.Box, { ...BOX_DEFAULT_PROPS },
209
238
  react_1.default.createElement(Stack_1.Stack, { size: 4 },
210
- react_1.default.createElement(Typography_1.Typography, { variant: "delta", as: "h2" }, (0, utils_1.getMessage)('pages.settings.additional.title')),
239
+ react_1.default.createElement(Typography_1.Typography, { variant: "delta", as: "h2" }, (0, utils_2.getMessage)('pages.settings.additional.title')),
211
240
  react_1.default.createElement(Grid_1.Grid, { gap: 4 },
212
241
  react_1.default.createElement(Grid_1.GridItem, { col: 3, s: 6, xs: 12 },
213
- react_1.default.createElement(NumberInput_1.NumberInput, { name: "allowedLevels", label: (0, utils_1.getMessage)('pages.settings.form.allowedLevels.label'), placeholder: (0, utils_1.getMessage)('pages.settings.form.allowedLevels.placeholder'), hint: (0, utils_1.getMessage)('pages.settings.form.allowedLevels.hint'), onValueChange: (value) => setFieldValue('allowedLevels', value, false), value: values.allowedLevels, disabled: restartStatus.required })),
242
+ react_1.default.createElement(NumberInput_1.NumberInput, { name: "allowedLevels", label: (0, utils_2.getMessage)('pages.settings.form.allowedLevels.label'), placeholder: (0, utils_2.getMessage)('pages.settings.form.allowedLevels.placeholder'), hint: (0, utils_2.getMessage)('pages.settings.form.allowedLevels.hint'), onValueChange: (value) => setFieldValue('allowedLevels', value, false), value: values.allowedLevels, disabled: restartStatus.required })),
214
243
  react_1.default.createElement(Grid_1.GridItem, { col: 4, s: 12, xs: 12 },
215
- react_1.default.createElement(ToggleInput_1.ToggleInput, { name: "audienceFieldChecked", label: (0, utils_1.getMessage)('pages.settings.form.audience.label'), hint: (0, utils_1.getMessage)('pages.settings.form.audience.hint'), checked: values.audienceFieldChecked, onChange: ({ target: { checked } }) => setFieldValue('audienceFieldChecked', checked, false), onLabel: "Enabled", offLabel: "Disabled", disabled: restartStatus.required })),
244
+ react_1.default.createElement(ToggleInput_1.ToggleInput, { name: "audienceFieldChecked", label: (0, utils_2.getMessage)('pages.settings.form.audience.label'), hint: (0, utils_2.getMessage)('pages.settings.form.audience.hint'), checked: values.audienceFieldChecked, onChange: () => setFieldValue('audienceFieldChecked', !values.audienceFieldChecked, false), onLabel: "Enabled", offLabel: "Disabled", disabled: restartStatus.required })),
216
245
  isI18NPluginEnabled && (react_1.default.createElement(Grid_1.GridItem, { col: 4, s: 12, xs: 12 },
217
- react_1.default.createElement(ToggleInput_1.ToggleInput, { name: "i18nEnabled", label: (0, utils_1.getMessage)('pages.settings.form.i18n.label'), hint: defaultLocale
218
- ? (0, utils_1.getMessage)('pages.settings.form.i18n.hint')
219
- : (0, utils_1.getMessage)('pages.settings.form.i18n.hint.missingDefaultLocale'), checked: values.i18nEnabled, onChange: ({ target: { checked } }) => {
246
+ react_1.default.createElement(ToggleInput_1.ToggleInput, { name: "i18nEnabled", label: (0, utils_2.getMessage)('pages.settings.form.i18n.label'), hint: defaultLocale
247
+ ? (0, utils_2.getMessage)('pages.settings.form.i18n.hint')
248
+ : (0, utils_2.getMessage)('pages.settings.form.i18n.hint.missingDefaultLocale'), checked: values.i18nEnabled, onChange: ({ target: { checked } }) => {
220
249
  setFieldValue('i18nEnabled', checked, false);
221
250
  if (checked) {
222
251
  setPruneObsoleteI18nNavigations(false);
@@ -228,17 +257,23 @@ const SettingsPage = () => {
228
257
  });
229
258
  }
230
259
  }, onLabel: "Enabled", offLabel: "Disabled", disabled: restartStatus.required || !defaultLocale })))))),
231
- react_1.default.createElement(Box_1.Box, { ...boxDefaultProps },
260
+ react_1.default.createElement(Box_1.Box, { ...BOX_DEFAULT_PROPS },
261
+ react_1.default.createElement(Stack_1.Stack, { size: 4 },
262
+ react_1.default.createElement(Typography_1.Typography, { variant: "delta", as: "h2" }, (0, utils_2.getMessage)('pages.settings.customFields.title')),
263
+ react_1.default.createElement(CustomFieldTable_1.default, { data: customFields, onOpenModal: handleOpenCustomFieldModal, onRemoveCustomField: handleRemoveCustomField, onToggleCustomField: handleToggleCustomField }))),
264
+ react_1.default.createElement(Box_1.Box, { ...BOX_DEFAULT_PROPS },
232
265
  react_1.default.createElement(Stack_1.Stack, { size: 4 },
233
- react_1.default.createElement(Typography_1.Typography, { variant: "delta", as: "h2" }, (0, utils_1.getMessage)('pages.settings.restoring.title')),
266
+ react_1.default.createElement(Typography_1.Typography, { variant: "delta", as: "h2" }, (0, utils_2.getMessage)('pages.settings.restoring.title')),
234
267
  react_1.default.createElement(Grid_1.Grid, { gap: 4 },
235
268
  react_1.default.createElement(Grid_1.GridItem, { col: 12, s: 12, xs: 12 },
236
- react_1.default.createElement(Typography_1.Typography, null, (0, utils_1.getMessage)('pages.settings.actions.restore.description'))),
269
+ react_1.default.createElement(Typography_1.Typography, null, (0, utils_2.getMessage)('pages.settings.actions.restore.description'))),
237
270
  react_1.default.createElement(Grid_1.GridItem, { col: 6, s: 12, xs: 12 },
238
271
  react_1.default.createElement(helper_plugin_1.CheckPermissions, { permissions: permissions_1.default.access },
239
- react_1.default.createElement(Button_1.Button, { variant: "danger-light", startIcon: react_1.default.createElement(icons_1.Refresh, null), onClick: () => setIsRestorePopupOpen(true) }, (0, utils_1.getMessage)('pages.settings.actions.restore'))),
240
- react_1.default.createElement(ConfirmationDialog_1.default, { isVisible: isRestorePopupOpen, header: (0, utils_1.getMessage)('pages.settings.actions.restore.confirmation.header'), labelConfirm: (0, utils_1.getMessage)('pages.settings.actions.restore.confirmation.confirm'), iconConfirm: react_1.default.createElement(icons_1.Refresh, null), onConfirm: () => onPopupClose(true), onCancel: () => onPopupClose(false) }, (0, utils_1.getMessage)('pages.settings.actions.restore.confirmation.description')),
241
- disableI18nModal))))))))))));
272
+ react_1.default.createElement(Button_1.Button, { variant: "danger-light", startIcon: react_1.default.createElement(icons_1.Refresh, null), onClick: () => setIsRestorePopupOpen(true) }, (0, utils_2.getMessage)('pages.settings.actions.restore'))),
273
+ react_1.default.createElement(ConfirmationDialog_1.default, { isVisible: isRestorePopupOpen, header: (0, utils_2.getMessage)('pages.settings.actions.restore.confirmation.header'), labelConfirm: (0, utils_2.getMessage)('pages.settings.actions.restore.confirmation.confirm'), iconConfirm: react_1.default.createElement(icons_1.Refresh, null), onConfirm: () => onPopupClose(true), onCancel: () => onPopupClose(false) }, (0, utils_2.getMessage)('pages.settings.actions.restore.confirmation.description')),
274
+ disableI18nModal)))))))))),
275
+ isCustomFieldModalOpen &&
276
+ react_1.default.createElement(CustomFieldModal_1.default, { onClose: () => setIsCustomFieldModalOpen(false), onSubmit: handleSubmitCustomField, isOpen: isCustomFieldModalOpen, data: customFieldSelected, usedCustomFieldNames: customFields.filter(f => f.name !== customFieldSelected?.name).map(f => f.name) })));
242
277
  };
243
278
  exports.default = SettingsPage;
244
279
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,32 @@
1
+ import { StrapiContentTypeFullSchema } from "strapi-typed";
2
+ import { Effect, NavigationPluginConfig } from "../../../../types";
3
+ export declare type RawPayload = {
4
+ allowedLevels: number;
5
+ audienceFieldChecked: boolean;
6
+ i18nEnabled: boolean;
7
+ nameFields: Record<string, string[]>;
8
+ pathDefaultFields: Record<string, string[]>;
9
+ populate: Record<string, string[]>;
10
+ selectedContentTypes: string[];
11
+ };
12
+ export declare type StrapiContentTypeSchema = StrapiContentTypeFullSchema & {
13
+ available: boolean;
14
+ isSingle: boolean;
15
+ plugin: string;
16
+ label: string;
17
+ };
18
+ export declare type PreparePayload = (payload: {
19
+ form: RawPayload;
20
+ pruneObsoleteI18nNavigations: boolean;
21
+ }) => Omit<NavigationPluginConfig, "slugify">;
22
+ export declare type OnSave = Effect<RawPayload>;
23
+ export declare type OnPopupClose = Effect<boolean>;
24
+ export declare type HandleSetContentTypeExpanded = Effect<string | undefined>;
25
+ export declare type RestartReasons = 'I18N' | 'GRAPH_QL' | 'I18N_NAVIGATIONS_PRUNE';
26
+ export declare type RestartStatus = {
27
+ required: true;
28
+ reasons?: RestartReasons[];
29
+ } | {
30
+ required: false;
31
+ };
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,18 @@
1
+ import { NavigationItemCustomField } from "../../../../../types";
2
+ export declare const schemaFactory: (usedCustomFieldNames: string[]) => import("yup/lib/object").OptionalObjectSchema<{
3
+ name: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
4
+ label: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
5
+ type: import("yup/lib/mixed").MixedSchema<any, Record<string, any>, any>;
6
+ required: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
7
+ multi: import("yup/lib/mixed").MixedSchema<any, Record<string, any>, any>;
8
+ options: import("yup/lib/mixed").MixedSchema<any, Record<string, any>, any>;
9
+ }, Record<string, any>, import("yup/lib/object").TypeOfShape<{
10
+ name: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
11
+ label: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
12
+ type: import("yup/lib/mixed").MixedSchema<any, Record<string, any>, any>;
13
+ required: import("yup/lib/boolean").RequiredBooleanSchema<boolean | undefined, Record<string, any>>;
14
+ multi: import("yup/lib/mixed").MixedSchema<any, Record<string, any>, any>;
15
+ options: import("yup/lib/mixed").MixedSchema<any, Record<string, any>, any>;
16
+ }>>;
17
+ export declare const defaultValues: NavigationItemCustomField;
18
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultValues = exports.schemaFactory = void 0;
4
+ const yup_1 = require("yup");
5
+ const helper_plugin_1 = require("@strapi/helper-plugin");
6
+ const translations_1 = require("../../../translations");
7
+ const schemaFactory = (usedCustomFieldNames) => {
8
+ return (0, yup_1.object)({
9
+ name: (0, yup_1.string)().matches(/^\S+$/, "Invalid name string. Name cannot contain spaces").required(helper_plugin_1.translatedErrors.required).notOneOf(usedCustomFieldNames, helper_plugin_1.translatedErrors.unique),
10
+ label: (0, yup_1.string)().required(helper_plugin_1.translatedErrors.required),
11
+ type: (0, yup_1.mixed)().required(helper_plugin_1.translatedErrors.required).oneOf(['string', 'boolean', 'select'], (0, translations_1.getTradId)("notification.error.customField.type")),
12
+ required: (0, yup_1.bool)().required(helper_plugin_1.translatedErrors.required),
13
+ multi: (0, yup_1.mixed)().when('type', {
14
+ is: (val) => val === 'select',
15
+ then: (0, yup_1.bool)().required(helper_plugin_1.translatedErrors.required),
16
+ otherwise: (0, yup_1.bool)().notRequired()
17
+ }),
18
+ options: (0, yup_1.mixed)().when('type', {
19
+ is: (val) => val === 'select',
20
+ then: (0, yup_1.array)().of((0, yup_1.string)()),
21
+ otherwise: (0, yup_1.mixed)().notRequired(),
22
+ })
23
+ });
24
+ };
25
+ exports.schemaFactory = schemaFactory;
26
+ exports.defaultValues = {
27
+ name: "",
28
+ label: "",
29
+ type: "string",
30
+ required: false,
31
+ multi: false,
32
+ options: [],
33
+ };
34
+ //# sourceMappingURL=form.js.map
@@ -1,5 +1,5 @@
1
1
  export function resolveGlobalLikeId(uid?: string): any;
2
2
  export function resolveGlobalLikeId(uid?: string): any;
3
- export function isContentTypeEligible(uid?: string, config?: {}): boolean | "";
4
- export function isContentTypeEligible(uid?: string, config?: {}): boolean | "";
3
+ export function isContentTypeEligible(uid?: string, config?: {}): boolean;
4
+ export function isContentTypeEligible(uid?: string, config?: {}): boolean;
5
5
  //# sourceMappingURL=functions.d.ts.map
@@ -19,7 +19,7 @@ module.exports = {
19
19
  const { allowedContentTypes = [], restrictedContentTypes = [] } = config;
20
20
  const isOneOfAllowedType = allowedContentTypes.filter(_ => uid.includes(_) || (uid === _)).length > 0;
21
21
  const isNoneOfRestricted = restrictedContentTypes.filter(_ => uid.includes(_) || (uid === _)).length === 0;
22
- return uid && isOneOfAllowedType && isNoneOfRestricted;
22
+ return !!uid && isOneOfAllowedType && isNoneOfRestricted;
23
23
  },
24
24
  };
25
25
  //# sourceMappingURL=functions.js.map
@@ -1,57 +1,5 @@
1
+ import React from 'react';
2
+ import { NavigationItemFormProps } from './types';
3
+ declare const NavigationItemForm: React.FC<NavigationItemFormProps>;
1
4
  export default NavigationItemForm;
2
- declare function NavigationItemForm({ config, availableLocale, isLoading: isPreloading, inputsPrefix, data, contentTypes, contentTypeEntities, usedContentTypeEntities, availableAudience, additionalFields, contentTypesNameFields, onSubmit, onCancel, getContentTypeEntities, usedContentTypesData, appendLabelPublicationStatus, locale, readNavigationItemFromLocale, }: {
3
- config: any;
4
- availableLocale: any;
5
- isLoading: any;
6
- inputsPrefix: any;
7
- data?: {} | undefined;
8
- contentTypes?: any[] | undefined;
9
- contentTypeEntities?: any[] | undefined;
10
- usedContentTypeEntities?: any[] | undefined;
11
- availableAudience?: any[] | undefined;
12
- additionalFields?: any[] | undefined;
13
- contentTypesNameFields?: {} | undefined;
14
- onSubmit: any;
15
- onCancel: any;
16
- getContentTypeEntities: any;
17
- usedContentTypesData: any;
18
- appendLabelPublicationStatus?: (() => string) | undefined;
19
- locale: any;
20
- readNavigationItemFromLocale: any;
21
- }): JSX.Element;
22
- declare namespace NavigationItemForm {
23
- namespace defaultProps {
24
- const fieldsToDisable: never[];
25
- const formErrors: {};
26
- const inputsPrefix: string;
27
- function onSubmit(e: any): any;
28
- const requestError: null;
29
- }
30
- namespace propTypes {
31
- export const config: PropTypes.Validator<object>;
32
- export const availableLocale: PropTypes.Requireable<(string | null | undefined)[]>;
33
- export const isLoading: PropTypes.Requireable<boolean>;
34
- const fieldsToDisable_1: PropTypes.Requireable<any[]>;
35
- export { fieldsToDisable_1 as fieldsToDisable };
36
- const formErrors_1: PropTypes.Validator<object>;
37
- export { formErrors_1 as formErrors };
38
- const inputsPrefix_1: PropTypes.Requireable<string>;
39
- export { inputsPrefix_1 as inputsPrefix };
40
- export const data: PropTypes.Validator<object>;
41
- const onSubmit_1: PropTypes.Requireable<(...args: any[]) => any>;
42
- export { onSubmit_1 as onSubmit };
43
- const requestError_1: PropTypes.Requireable<object>;
44
- export { requestError_1 as requestError };
45
- export const contentTypes: PropTypes.Requireable<any[]>;
46
- export const contentTypeEntities: PropTypes.Requireable<any[]>;
47
- export const usedContentTypeEntities: PropTypes.Requireable<any[]>;
48
- export const availableAudience: PropTypes.Requireable<any[]>;
49
- export const additionalFields: PropTypes.Requireable<any[]>;
50
- export const getContentTypeEntities: PropTypes.Validator<(...args: any[]) => any>;
51
- export const appendLabelPublicationStatus: PropTypes.Requireable<(...args: any[]) => any>;
52
- export const onCancel: PropTypes.Requireable<(...args: any[]) => any>;
53
- export const readNavigationItemFromLocale: PropTypes.Validator<(...args: any[]) => any>;
54
- }
55
- }
56
- import PropTypes from "prop-types";
57
5
  //# sourceMappingURL=index.d.ts.map