@strapi/admin 5.50.1 → 5.51.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.
- package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useMenu.js +1 -1
- package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMenu.mjs +1 -1
- package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.js +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.js.map +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.mjs +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +3 -9
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +3 -9
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +14 -6
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +14 -6
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
- package/dist/admin/admin/src/reducer.js +3 -3
- package/dist/admin/admin/src/reducer.js.map +1 -1
- package/dist/admin/admin/src/reducer.mjs +4 -4
- package/dist/admin/admin/src/reducer.mjs.map +1 -1
- package/dist/admin/admin/src/render.js +6 -2
- package/dist/admin/admin/src/render.js.map +1 -1
- package/dist/admin/admin/src/render.mjs +6 -2
- package/dist/admin/admin/src/render.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +1 -2
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +1 -2
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/ko.json.js +157 -1
- package/dist/admin/admin/src/translations/ko.json.js.map +1 -1
- package/dist/admin/admin/src/translations/ko.json.mjs +157 -1
- package/dist/admin/admin/src/translations/ko.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/cookies.js +84 -2
- package/dist/admin/admin/src/utils/cookies.js.map +1 -1
- package/dist/admin/admin/src/utils/cookies.mjs +82 -3
- package/dist/admin/admin/src/utils/cookies.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +2 -2
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +3 -3
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getProjectType.js +22 -0
- package/dist/admin/admin/src/utils/getProjectType.js.map +1 -0
- package/dist/admin/admin/src/utils/getProjectType.mjs +20 -0
- package/dist/admin/admin/src/utils/getProjectType.mjs.map +1 -0
- package/dist/admin/ee/admin/src/pages/AuthResponse.js +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.mjs +2 -2
- package/dist/admin/ee/admin/src/pages/AuthResponse.mjs.map +1 -1
- package/dist/admin/shared/utils/auth-cookie-domain.js +41 -0
- package/dist/admin/shared/utils/auth-cookie-domain.js.map +1 -0
- package/dist/admin/shared/utils/auth-cookie-domain.mjs +38 -0
- package/dist/admin/shared/utils/auth-cookie-domain.mjs.map +1 -0
- package/dist/admin/shared/utils/auth-cookie-name.js +31 -0
- package/dist/admin/shared/utils/auth-cookie-name.js.map +1 -0
- package/dist/admin/shared/utils/auth-cookie-name.mjs +28 -0
- package/dist/admin/shared/utils/auth-cookie-name.mjs.map +1 -0
- package/dist/admin/shared/utils/auth-cookie-path.js +39 -0
- package/dist/admin/shared/utils/auth-cookie-path.js.map +1 -0
- package/dist/admin/shared/utils/auth-cookie-path.mjs +36 -0
- package/dist/admin/shared/utils/auth-cookie-path.mjs.map +1 -0
- package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +3 -3
- package/dist/admin/src/services/apiTokens.d.ts +2 -2
- package/dist/admin/src/services/webhooks.d.ts +2 -2
- package/dist/admin/src/utils/cookies.d.ts +26 -0
- package/dist/admin/src/utils/getProjectType.d.ts +16 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.d.ts +1 -1
- package/dist/ee/admin/src/services/ai.d.ts +3 -3
- package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
- package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts +1 -1
- package/dist/ee/server/src/controllers/admin.d.ts +2 -0
- package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/index.d.ts +2 -0
- package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +2 -0
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/ee/server/src/routes/index.d.ts +2 -2
- package/dist/ee/server/src/routes/sso.d.ts +2 -2
- package/dist/ee/server/src/services/auth.d.ts.map +1 -1
- package/dist/ee/server/src/services/index.d.ts +2 -2
- package/dist/ee/server/src/services/user.d.ts.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.js +1 -0
- package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.mjs +1 -0
- package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +10 -4
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +11 -5
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
- package/dist/server/ee/server/src/services/auth.js +5 -5
- package/dist/server/ee/server/src/services/auth.js.map +1 -1
- package/dist/server/ee/server/src/services/auth.mjs +5 -5
- package/dist/server/ee/server/src/services/auth.mjs.map +1 -1
- package/dist/server/ee/server/src/services/user.js +1 -0
- package/dist/server/ee/server/src/services/user.js.map +1 -1
- package/dist/server/ee/server/src/services/user.mjs +1 -0
- package/dist/server/ee/server/src/services/user.mjs.map +1 -1
- package/dist/server/server/src/content-types/User.js +6 -0
- package/dist/server/server/src/content-types/User.js.map +1 -1
- package/dist/server/server/src/content-types/User.mjs +6 -0
- package/dist/server/server/src/content-types/User.mjs.map +1 -1
- package/dist/server/server/src/controllers/authentication.js +12 -10
- package/dist/server/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/server/src/controllers/authentication.mjs +10 -8
- package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
- package/dist/server/server/src/routes/serve-admin-panel.js +17 -4
- package/dist/server/server/src/routes/serve-admin-panel.js.map +1 -1
- package/dist/server/server/src/routes/serve-admin-panel.mjs +17 -4
- package/dist/server/server/src/routes/serve-admin-panel.mjs.map +1 -1
- package/dist/server/server/src/services/auth.js +51 -6
- package/dist/server/server/src/services/auth.js.map +1 -1
- package/dist/server/server/src/services/auth.mjs +46 -6
- package/dist/server/server/src/services/auth.mjs.map +1 -1
- package/dist/server/server/src/services/index.js +1 -1
- package/dist/server/server/src/services/index.js.map +1 -1
- package/dist/server/server/src/services/user.js +1 -0
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/services/user.mjs +1 -0
- package/dist/server/server/src/services/user.mjs.map +1 -1
- package/dist/server/shared/utils/auth-cookie-domain.js +41 -0
- package/dist/server/shared/utils/auth-cookie-domain.js.map +1 -0
- package/dist/server/shared/utils/auth-cookie-domain.mjs +38 -0
- package/dist/server/shared/utils/auth-cookie-domain.mjs.map +1 -0
- package/dist/server/shared/utils/auth-cookie-name.js +31 -0
- package/dist/server/shared/utils/auth-cookie-name.js.map +1 -0
- package/dist/server/shared/utils/auth-cookie-name.mjs +28 -0
- package/dist/server/shared/utils/auth-cookie-name.mjs.map +1 -0
- package/dist/server/shared/utils/auth-cookie-path.js +39 -0
- package/dist/server/shared/utils/auth-cookie-path.js.map +1 -0
- package/dist/server/shared/utils/auth-cookie-path.mjs +36 -0
- package/dist/server/shared/utils/auth-cookie-path.mjs.map +1 -0
- package/dist/server/shared/utils/session-auth.js +59 -2
- package/dist/server/shared/utils/session-auth.js.map +1 -1
- package/dist/server/shared/utils/session-auth.mjs +55 -3
- package/dist/server/shared/utils/session-auth.mjs.map +1 -1
- package/dist/server/src/content-types/User.d.ts +6 -0
- package/dist/server/src/content-types/User.d.ts.map +1 -1
- package/dist/server/src/content-types/index.d.ts +6 -0
- package/dist/server/src/content-types/index.d.ts.map +1 -1
- package/dist/server/src/controllers/admin.d.ts +3 -3
- package/dist/server/src/controllers/authentication.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +3 -3
- package/dist/server/src/domain/user.d.ts +2 -1
- package/dist/server/src/domain/user.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +25 -19
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/middlewares/index.d.ts +1 -1
- package/dist/server/src/routes/serve-admin-panel.d.ts.map +1 -1
- package/dist/server/src/services/auth.d.ts +18 -0
- package/dist/server/src/services/auth.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +13 -13
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/user.d.ts.map +1 -1
- package/dist/shared/contracts/shared.d.ts +2 -1
- package/dist/shared/contracts/shared.d.ts.map +1 -1
- package/dist/shared/utils/__tests__/auth-cookie-domain.test.d.ts +1 -0
- package/dist/shared/utils/__tests__/auth-cookie-domain.test.d.ts.map +1 -0
- package/dist/shared/utils/__tests__/auth-cookie-name.test.d.ts +1 -0
- package/dist/shared/utils/__tests__/auth-cookie-name.test.d.ts.map +1 -0
- package/dist/shared/utils/__tests__/auth-cookie-path.test.d.ts +1 -0
- package/dist/shared/utils/__tests__/auth-cookie-path.test.d.ts.map +1 -0
- package/dist/shared/utils/__tests__/session-auth.test.d.ts +1 -0
- package/dist/shared/utils/__tests__/session-auth.test.d.ts.map +1 -0
- package/dist/shared/utils/auth-cookie-domain.d.ts +21 -0
- package/dist/shared/utils/auth-cookie-domain.d.ts.map +1 -0
- package/dist/shared/utils/auth-cookie-name.d.ts +14 -0
- package/dist/shared/utils/auth-cookie-name.d.ts.map +1 -0
- package/dist/shared/utils/auth-cookie-path.d.ts +17 -0
- package/dist/shared/utils/auth-cookie-path.d.ts.map +1 -0
- package/dist/shared/utils/session-auth.d.ts +16 -0
- package/dist/shared/utils/session-auth.d.ts.map +1 -1
- package/package.json +20 -17
|
@@ -446,19 +446,27 @@ const inheritConditionsAtPath = (data, pathToActionObject, actionId, subject, us
|
|
|
446
446
|
];
|
|
447
447
|
let nextModifiedDataState = cloneDeep(state.modifiedData);
|
|
448
448
|
const oldValues = get(nextModifiedDataState, pathToValue, {});
|
|
449
|
+
const root = pathToValue[0];
|
|
450
|
+
// Plugin & setting permissions are stored with `subject: null` and their real
|
|
451
|
+
// action id is the full `plugin::`/`admin::` leaf segment (not the UI subcategory).
|
|
452
|
+
// For those, let the checker derive the action from each leaf path (subject stays null).
|
|
453
|
+
const isPluginOrSetting = root === 'plugins' || root === 'settings';
|
|
449
454
|
let actionId;
|
|
450
455
|
let subject;
|
|
451
|
-
if (
|
|
452
|
-
subject =
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
|
|
456
|
+
if (isPluginOrSetting) {
|
|
457
|
+
subject = null;
|
|
458
|
+
} else {
|
|
459
|
+
if (pathToValue.length >= 2) {
|
|
460
|
+
subject = pathToValue[1];
|
|
461
|
+
}
|
|
462
|
+
if (pathToValue.length >= 3) {
|
|
463
|
+
actionId = pathToValue[2];
|
|
464
|
+
}
|
|
456
465
|
}
|
|
457
466
|
const permissionChecker = createDynamicActionPermissionChecker(subject, actionId, userPermissions);
|
|
458
467
|
const updatedValues = updateValuesWithPermissions(oldValues, value, permissionChecker);
|
|
459
468
|
// In App Token context, when enabling, inherit conditions from the user's permissions.
|
|
460
469
|
if (value === true && userPermissions !== undefined) {
|
|
461
|
-
const root = pathToValue[0];
|
|
462
470
|
const subjectForLookup = root === 'collectionTypes' || root === 'singleTypes' ? subject ?? null : null;
|
|
463
471
|
if (actionId !== undefined && subjectForLookup !== null) {
|
|
464
472
|
inheritConditionsAtPath(updatedValues, [], actionId, subjectForLookup, userPermissions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Permissions.mjs","sources":["../../../../../../../../../admin/src/pages/Settings/pages/Roles/components/Permissions.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Tabs } from '@strapi/design-system';\nimport { produce } from 'immer';\nimport cloneDeep from 'lodash/cloneDeep';\nimport get from 'lodash/get';\nimport has from 'lodash/has';\nimport isEmpty from 'lodash/isEmpty';\nimport set from 'lodash/set';\nimport { useIntl } from 'react-intl';\n\nimport * as PermissonContracts from '../../../../../../../shared/contracts/permissions';\nimport { Permission } from '../../../../../../../shared/contracts/shared';\nimport { Permission as AuthPermission } from '../../../../../features/Auth';\nimport { isObject } from '../../../../../utils/objects';\nimport {\n PermissionsDataManagerContextValue,\n PermissionsDataManagerProvider,\n} from '../hooks/usePermissionsDataManager';\nimport {\n createFieldPermissionChecker,\n createDynamicActionPermissionChecker,\n} from '../utils/createPermissionChecker';\nimport { difference } from '../utils/difference';\nimport {\n ConditionForm,\n Form,\n PropertyChildForm,\n createDefaultCTForm,\n createDefaultForm,\n} from '../utils/forms';\nimport { GenericLayout, formatLayout } from '../utils/layouts';\nimport { hasLocaleValidationErrors } from '../utils/localePermissionValidation';\nimport { formatPermissionsForAPI } from '../utils/permissions';\nimport { updateConditionsToFalse } from '../utils/updateConditionsToFalse';\nimport { updateValues, updateValuesWithPermissions } from '../utils/updateValues';\n\nimport { ContentTypes } from './ContentTypes';\nimport { PluginsAndSettingsPermissions } from './PluginsAndSettings';\n\nconst TAB_LABELS = [\n {\n labelId: 'app.components.LeftMenuLinkContainer.collectionTypes',\n defaultMessage: 'Collection Types',\n id: 'collectionTypes',\n },\n {\n labelId: 'app.components.LeftMenuLinkContainer.singleTypes',\n id: 'singleTypes',\n defaultMessage: 'Single Types',\n },\n {\n labelId: 'app.components.LeftMenuLinkContainer.plugins',\n defaultMessage: 'Plugins',\n id: 'plugins',\n },\n {\n labelId: 'app.components.LeftMenuLinkContainer.settings',\n defaultMessage: 'Settings',\n id: 'settings',\n },\n] as const;\n\n/* -------------------------------------------------------------------------------------------------\n * Permissions\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface PermissionsAPI {\n getPermissions: () => {\n didUpdateConditions: boolean;\n permissionsToSend: Omit<Permission, 'id' | 'createdAt' | 'updatedAt' | 'actionParameters'>[];\n };\n hasLocaleValidationErrors: () => boolean;\n resetForm: () => void;\n setFormAfterSubmit: () => void;\n}\n\ninterface PermissionsProps {\n isFormDisabled?: boolean;\n onLocaleValidationChange?: (hasErrors: boolean) => void;\n permissions?: Permission[];\n layout: PermissonContracts.GetAll.Response['data'];\n userPermissions?: AuthPermission[];\n}\n\nconst Permissions = React.forwardRef<PermissionsAPI, PermissionsProps>(\n (\n { layout, isFormDisabled, onLocaleValidationChange, permissions = [], userPermissions },\n api\n ) => {\n const [{ initialData, layouts, modifiedData }, dispatch] = React.useReducer(\n reducer,\n initialState,\n () => init(layout, permissions)\n );\n const { formatMessage } = useIntl();\n\n React.useEffect(() => {\n onLocaleValidationChange?.(hasLocaleValidationErrors(modifiedData));\n }, [modifiedData, onLocaleValidationChange]);\n\n React.useImperativeHandle(api, () => {\n return {\n getPermissions() {\n const collectionTypesDiff = difference(\n initialData.collectionTypes,\n modifiedData.collectionTypes\n );\n const singleTypesDiff = difference(initialData.singleTypes, modifiedData.singleTypes);\n\n const contentTypesDiff = { ...collectionTypesDiff, ...singleTypesDiff };\n\n let didUpdateConditions;\n\n if (isEmpty(contentTypesDiff)) {\n didUpdateConditions = false;\n } else {\n didUpdateConditions = Object.values(contentTypesDiff).some((permission = {}) => {\n return Object.values(permission).some((permissionValue) =>\n has(permissionValue, 'conditions')\n );\n });\n }\n\n const permissionsToSend = formatPermissionsForAPI(modifiedData).map((perm) =>\n restoreNullLocalesIfUnchanged(perm, permissions, initialData, modifiedData)\n );\n\n return { permissionsToSend, didUpdateConditions };\n },\n hasLocaleValidationErrors() {\n return hasLocaleValidationErrors(modifiedData);\n },\n resetForm() {\n dispatch({ type: 'RESET_FORM' });\n },\n setFormAfterSubmit() {\n dispatch({ type: 'SET_FORM_AFTER_SUBMIT' });\n },\n } satisfies PermissionsAPI;\n });\n\n const handleChangeCollectionTypeLeftActionRowCheckbox = React.useCallback(\n (\n pathToCollectionType: OnChangeCollectionTypeRowLeftCheckboxAction['pathToCollectionType'],\n propertyName: OnChangeCollectionTypeRowLeftCheckboxAction['propertyName'],\n rowName: OnChangeCollectionTypeRowLeftCheckboxAction['rowName'],\n value: OnChangeCollectionTypeRowLeftCheckboxAction['value']\n ) => {\n dispatch({\n type: 'ON_CHANGE_COLLECTION_TYPE_ROW_LEFT_CHECKBOX',\n pathToCollectionType,\n propertyName,\n rowName,\n value,\n userPermissions,\n });\n },\n [userPermissions]\n );\n\n const handleChangeCollectionTypeGlobalActionCheckbox = React.useCallback(\n (\n collectionTypeKind: OnChangeCollectionTypeGlobalActionCheckboxAction['collectionTypeKind'],\n actionId: OnChangeCollectionTypeGlobalActionCheckboxAction['actionId'],\n value: OnChangeCollectionTypeGlobalActionCheckboxAction['value']\n ) => {\n dispatch({\n type: 'ON_CHANGE_COLLECTION_TYPE_GLOBAL_ACTION_CHECKBOX',\n collectionTypeKind,\n actionId,\n value,\n userPermissions,\n });\n },\n [userPermissions]\n );\n\n const handleChangeConditions = React.useCallback(\n (conditions: OnChangeConditionsAction['conditions']) => {\n dispatch({ type: 'ON_CHANGE_CONDITIONS', conditions, userPermissions });\n },\n [userPermissions]\n );\n\n const handleChangeSimpleCheckbox: PermissionsDataManagerContextValue['onChangeSimpleCheckbox'] =\n React.useCallback(\n ({ target: { name, value } }) => {\n dispatch({\n type: 'ON_CHANGE_SIMPLE_CHECKBOX',\n keys: name,\n value,\n userPermissions,\n });\n },\n [userPermissions]\n );\n\n const handleChangeParentCheckbox: PermissionsDataManagerContextValue['onChangeParentCheckbox'] =\n React.useCallback(\n ({ target: { name, value } }) => {\n dispatch({\n type: 'ON_CHANGE_TOGGLE_PARENT_CHECKBOX',\n keys: name,\n value,\n userPermissions,\n });\n },\n [userPermissions]\n );\n\n return (\n <PermissionsDataManagerProvider\n availableConditions={layout.conditions}\n modifiedData={modifiedData}\n onChangeConditions={handleChangeConditions}\n onChangeSimpleCheckbox={handleChangeSimpleCheckbox}\n onChangeParentCheckbox={handleChangeParentCheckbox}\n onChangeCollectionTypeLeftActionRowCheckbox={\n handleChangeCollectionTypeLeftActionRowCheckbox\n }\n onChangeCollectionTypeGlobalActionCheckbox={handleChangeCollectionTypeGlobalActionCheckbox}\n userPermissions={userPermissions}\n >\n <Tabs.Root defaultValue={TAB_LABELS[0].id}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'Settings.permissions.users.tabs.label',\n defaultMessage: 'Tabs Permissions',\n })}\n >\n {TAB_LABELS.map((tabLabel) => (\n <Tabs.Trigger key={tabLabel.id} value={tabLabel.id}>\n {formatMessage({ id: tabLabel.labelId, defaultMessage: tabLabel.defaultMessage })}\n </Tabs.Trigger>\n ))}\n </Tabs.List>\n <Tabs.Content value={TAB_LABELS[0].id}>\n <ContentTypes\n layout={layouts.collectionTypes}\n kind=\"collectionTypes\"\n isFormDisabled={isFormDisabled}\n />\n </Tabs.Content>\n <Tabs.Content value={TAB_LABELS[1].id}>\n <ContentTypes\n layout={layouts.singleTypes}\n kind=\"singleTypes\"\n isFormDisabled={isFormDisabled}\n />\n </Tabs.Content>\n <Tabs.Content value={TAB_LABELS[2].id}>\n <PluginsAndSettingsPermissions\n layout={layouts.plugins}\n kind=\"plugins\"\n isFormDisabled={isFormDisabled}\n />\n </Tabs.Content>\n <Tabs.Content value={TAB_LABELS[3].id}>\n <PluginsAndSettingsPermissions\n layout={layouts.settings}\n kind=\"settings\"\n isFormDisabled={isFormDisabled}\n />\n </Tabs.Content>\n </Tabs.Root>\n </PermissionsDataManagerProvider>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * reducer\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PermissionForms {\n collectionTypes: Form;\n plugins: Record<string, Form>;\n settings: Record<string, Form>;\n singleTypes: Form;\n}\n\ninterface State {\n initialData: PermissionForms;\n modifiedData: PermissionForms;\n layouts: {\n collectionTypes: PermissonContracts.ContentPermission;\n singleTypes: PermissonContracts.ContentPermission;\n plugins: GenericLayout<PermissonContracts.PluginPermission>[];\n settings: GenericLayout<PermissonContracts.SettingPermission>[];\n };\n}\n\nconst initialState = {\n initialData: {},\n modifiedData: {},\n layouts: {},\n};\n\ninterface OnChangeCollectionTypeGlobalActionCheckboxAction {\n type: 'ON_CHANGE_COLLECTION_TYPE_GLOBAL_ACTION_CHECKBOX';\n collectionTypeKind: keyof PermissionForms;\n actionId: string;\n value: boolean;\n userPermissions?: AuthPermission[];\n}\n\ninterface OnChangeCollectionTypeRowLeftCheckboxAction {\n type: 'ON_CHANGE_COLLECTION_TYPE_ROW_LEFT_CHECKBOX';\n pathToCollectionType: string;\n propertyName: string;\n rowName: string;\n value: boolean;\n userPermissions?: AuthPermission[];\n}\n\ninterface OnChangeConditionsAction {\n type: 'ON_CHANGE_CONDITIONS';\n conditions: Record<string, ConditionForm>;\n userPermissions?: AuthPermission[];\n}\n\ninterface OnChangeSimpleCheckboxAction {\n type: 'ON_CHANGE_SIMPLE_CHECKBOX';\n keys: string;\n value: boolean;\n userPermissions?: AuthPermission[];\n}\n\ninterface OnChangeToggleParentCheckbox {\n type: 'ON_CHANGE_TOGGLE_PARENT_CHECKBOX';\n keys: string;\n value: boolean;\n userPermissions?: AuthPermission[];\n}\n\ninterface ResetFormAction {\n type: 'RESET_FORM';\n}\n\ninterface SetFormAfterSubmitAction {\n type: 'SET_FORM_AFTER_SUBMIT';\n}\n\ntype Action =\n | OnChangeCollectionTypeGlobalActionCheckboxAction\n | OnChangeCollectionTypeRowLeftCheckboxAction\n | OnChangeConditionsAction\n | OnChangeSimpleCheckboxAction\n | OnChangeToggleParentCheckbox\n | ResetFormAction\n | SetFormAfterSubmitAction;\n\nconst buildInheritedConditionsFromExisting = (\n existing: unknown,\n enabledConditions: string[] = []\n): Record<string, boolean> | undefined => {\n if (!isObject(existing)) {\n return undefined;\n }\n\n const enabled = new Set(enabledConditions);\n\n return Object.keys(existing).reduce<Record<string, boolean>>((acc, key) => {\n acc[key] = enabled.has(key);\n\n return acc;\n }, {});\n};\n\nconst inheritConditionsAtPath = (\n data: unknown,\n pathToActionObject: string[],\n actionId: string,\n subject: string | null,\n userPermissions: AuthPermission[] | undefined\n) => {\n if (userPermissions === undefined) {\n return;\n }\n\n const matchingPermission = userPermissions.find(\n (perm) => perm.action === actionId && perm.subject === subject\n );\n\n if (matchingPermission === undefined) {\n return;\n }\n\n const obj = data as Record<string, unknown>;\n const existingConditions = get(obj, [...pathToActionObject, 'conditions'], undefined);\n const nextConditions = buildInheritedConditionsFromExisting(\n existingConditions,\n matchingPermission.conditions ?? []\n );\n\n if (nextConditions) {\n set(obj, [...pathToActionObject, 'conditions'], nextConditions);\n }\n};\n\n/* eslint-disable consistent-return */\nconst reducer = (state: State, action: Action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'ON_CHANGE_COLLECTION_TYPE_GLOBAL_ACTION_CHECKBOX': {\n const { collectionTypeKind, actionId, value, userPermissions } = action;\n const pathToData = ['modifiedData', collectionTypeKind];\n\n Object.keys(get(state, pathToData)).forEach((collectionType) => {\n const collectionTypeActionData = get(\n state,\n [...pathToData, collectionType, actionId],\n undefined\n );\n\n if (collectionTypeActionData) {\n const subjectPermissionChecker = createFieldPermissionChecker(\n actionId,\n collectionType,\n userPermissions\n );\n\n let updatedValues = updateValuesWithPermissions(\n collectionTypeActionData,\n value,\n subjectPermissionChecker\n );\n\n if (value === true) {\n inheritConditionsAtPath(updatedValues, [], actionId, collectionType, userPermissions);\n }\n\n if (value === false && updatedValues.conditions !== undefined) {\n // @ts-expect-error – TODO: type better\n const updatedConditions = updateValues(updatedValues.conditions, false);\n\n updatedValues = { ...updatedValues, conditions: updatedConditions };\n }\n\n set(draftState, [...pathToData, collectionType, actionId], updatedValues);\n }\n });\n\n break;\n }\n case 'ON_CHANGE_COLLECTION_TYPE_ROW_LEFT_CHECKBOX': {\n const { pathToCollectionType, propertyName, rowName, value, userPermissions } = action;\n let nextModifiedDataState = cloneDeep(state.modifiedData);\n const pathToModifiedDataCollectionType = pathToCollectionType.split('..');\n\n const objToUpdate = get(nextModifiedDataState, pathToModifiedDataCollectionType, {});\n\n const subject =\n pathToModifiedDataCollectionType[pathToModifiedDataCollectionType.length - 1];\n\n Object.keys(objToUpdate).forEach((actionId) => {\n if (has(objToUpdate[actionId], `properties.${propertyName}`)) {\n const objValue = get(objToUpdate, [actionId, 'properties', propertyName, rowName]);\n const pathToDataToSet = [\n ...pathToModifiedDataCollectionType,\n actionId,\n 'properties',\n propertyName,\n rowName,\n ];\n\n if (!isObject(objValue)) {\n if (userPermissions !== undefined && propertyName === 'fields') {\n const hasPermission = userPermissions.some((perm) => {\n if (perm.action !== actionId || perm.subject !== subject) return false;\n\n const fields = perm.properties?.fields;\n if (fields === null || fields === undefined) return true;\n if (Array.isArray(fields) && fields.length === 0) return false;\n\n return (\n Array.isArray(fields) &&\n fields.some((f) => rowName === f || rowName.startsWith(`${f}.`))\n );\n });\n\n if (hasPermission === true) {\n set(nextModifiedDataState, pathToDataToSet, value);\n if (value === true) {\n inheritConditionsAtPath(\n nextModifiedDataState,\n [...pathToModifiedDataCollectionType, actionId],\n actionId,\n subject,\n userPermissions\n );\n }\n }\n } else {\n set(nextModifiedDataState, pathToDataToSet, value);\n if (value === true && userPermissions !== undefined) {\n inheritConditionsAtPath(\n nextModifiedDataState,\n [...pathToModifiedDataCollectionType, actionId],\n actionId,\n subject,\n userPermissions\n );\n }\n }\n } else {\n const permissionChecker =\n userPermissions !== undefined && propertyName === 'fields'\n ? (path: string[]) => {\n const fullFieldPath = [rowName, ...path].join('.');\n const checker = createFieldPermissionChecker(\n actionId,\n subject,\n userPermissions\n );\n return checker === undefined\n ? true\n : checker(['properties', 'fields', fullFieldPath]);\n }\n : undefined;\n\n const updatedValue = updateValuesWithPermissions(objValue, value, permissionChecker);\n\n set(nextModifiedDataState, pathToDataToSet, updatedValue);\n if (value === true && userPermissions !== undefined) {\n inheritConditionsAtPath(\n nextModifiedDataState,\n [...pathToModifiedDataCollectionType, actionId],\n actionId,\n subject,\n userPermissions\n );\n }\n }\n }\n });\n\n if (value === false) {\n // @ts-expect-error – TODO: type better\n nextModifiedDataState = updateConditionsToFalse(nextModifiedDataState);\n }\n\n set(draftState, 'modifiedData', nextModifiedDataState);\n\n break;\n }\n case 'ON_CHANGE_CONDITIONS': {\n // In App Token context, conditions are inherited from the user's permissions and must be read-only.\n if (action.userPermissions !== undefined) {\n break;\n }\n\n Object.entries(action.conditions).forEach((array) => {\n const [stringPathToData, conditionsToUpdate] = array;\n\n set(\n draftState,\n ['modifiedData', ...stringPathToData.split('..'), 'conditions'],\n conditionsToUpdate\n );\n });\n\n break;\n }\n case 'ON_CHANGE_SIMPLE_CHECKBOX': {\n let nextModifiedDataState = cloneDeep(state.modifiedData);\n\n const keysArray = action.keys.split('..');\n set(nextModifiedDataState, [...keysArray], action.value);\n\n // In App Token context, when enabling a permission, inherit the user's conditions.\n if (action.value === true && action.userPermissions !== undefined) {\n const propertiesIndex = keysArray.indexOf('properties');\n\n if (propertiesIndex > 0) {\n const actionId = keysArray[propertiesIndex - 1];\n const root = keysArray[0];\n\n if ((root === 'collectionTypes' || root === 'singleTypes') && keysArray.length >= 3) {\n const subject = keysArray[1];\n inheritConditionsAtPath(\n nextModifiedDataState,\n [root, subject, actionId],\n actionId,\n subject,\n action.userPermissions\n );\n } else {\n const pathToActionObject = keysArray.slice(0, propertiesIndex);\n inheritConditionsAtPath(\n nextModifiedDataState,\n pathToActionObject,\n actionId,\n null,\n action.userPermissions\n );\n }\n }\n }\n\n if (action.value === false) {\n // @ts-expect-error – TODO: type better\n nextModifiedDataState = updateConditionsToFalse(nextModifiedDataState);\n }\n\n set(draftState, 'modifiedData', nextModifiedDataState);\n\n break;\n }\n /*\n * Here the idea is to retrieve a specific value of the modifiedObject\n * then update all the boolean values of the retrieved one\n * and update the drafState.\n *\n * For instance in order to enable create action for all the fields and locales\n * of the restaurant content type we need to :\n * 1. Retrieve the modifiedData.collectionTypes.restaurant.create object\n * 2. Toggle all the end boolean values to the desired one\n * 3. Update the draftState\n *\n * Since the case works well in order to update what we called \"parent\" checkbox. We can\n * reuse the action when we need to toggle change all the values that depends on this one.\n * A parent checkbox is a checkbox which value is not a boolean but depends on its children ones, therefore,\n * a parent checkbox does not have a represented value in the draftState, they are just helpers.\n *\n * Given the following data:\n *\n * const data = {\n * restaurant: {\n * create: {\n * fields: { name: true },\n * locales: { en: false }\n * }\n * }\n * }\n *\n * The value of the create checkbox for the restaurant will be ƒalse since not all its children have\n * truthy values and in order to set its value to true when need to have all the values of its children set to true.\n *\n * Similarly, we can reuse the logic for the components attributes\n *\n */\n case 'ON_CHANGE_TOGGLE_PARENT_CHECKBOX': {\n const { keys, value, userPermissions } = action;\n const pathToValue = [...keys.split('..')];\n let nextModifiedDataState = cloneDeep(state.modifiedData);\n const oldValues = get(nextModifiedDataState, pathToValue, {});\n\n let actionId: string | undefined;\n let subject: string | undefined;\n\n if (pathToValue.length >= 2) {\n subject = pathToValue[1];\n }\n\n if (pathToValue.length >= 3) {\n actionId = pathToValue[2];\n }\n\n const permissionChecker = createDynamicActionPermissionChecker(\n subject,\n actionId,\n userPermissions\n );\n\n const updatedValues = updateValuesWithPermissions(oldValues, value, permissionChecker);\n\n // In App Token context, when enabling, inherit conditions from the user's permissions.\n if (value === true && userPermissions !== undefined) {\n const root = pathToValue[0];\n const subjectForLookup =\n root === 'collectionTypes' || root === 'singleTypes' ? (subject ?? null) : null;\n\n if (actionId !== undefined && subjectForLookup !== null) {\n inheritConditionsAtPath(updatedValues, [], actionId, subjectForLookup, userPermissions);\n } else if (isObject(updatedValues)) {\n const updatedValuesObj = updatedValues as Record<string, unknown>;\n\n Object.keys(updatedValuesObj).forEach((key) => {\n const maybeActionObj = updatedValuesObj[key];\n if (isObject(maybeActionObj)) {\n inheritConditionsAtPath(maybeActionObj, [], key, subjectForLookup, userPermissions);\n }\n });\n }\n }\n\n set(nextModifiedDataState, pathToValue, updatedValues);\n\n if (value === false) {\n // @ts-expect-error – TODO: type better\n nextModifiedDataState = updateConditionsToFalse(nextModifiedDataState);\n }\n\n set(draftState, ['modifiedData'], nextModifiedDataState);\n\n break;\n }\n case 'RESET_FORM': {\n draftState.modifiedData = state.initialData;\n break;\n }\n case 'SET_FORM_AFTER_SUBMIT': {\n draftState.initialData = state.modifiedData;\n break;\n }\n default:\n return draftState;\n }\n });\n\n/* -------------------------------------------------------------------------------------------------\n * restoreNullLocalesIfUnchanged\n * Extracted at module level to avoid nesting arrow functions more than 4 levels deep inside\n * the useImperativeHandle → getPermissions → map chain.\n * -----------------------------------------------------------------------------------------------*/\n\ntype SentPermission = Omit<Permission, 'id' | 'createdAt' | 'updatedAt' | 'actionParameters'>;\n\nconst restoreNullLocalesIfUnchanged = (\n perm: SentPermission,\n originalPermissions: Permission[],\n initialData: PermissionForms,\n modifiedData: PermissionForms\n): SentPermission => {\n if (!perm.subject) return perm;\n\n const original = originalPermissions.find(\n (p) => p.action === perm.action && p.subject === perm.subject\n );\n\n // null means \"all locales\" in legacy DBs — preserve it if the user hasn't changed anything\n if (original?.properties?.locales !== null) return perm;\n\n const kind =\n perm.subject in modifiedData.collectionTypes\n ? ('collectionTypes' as const)\n : perm.subject in modifiedData.singleTypes\n ? ('singleTypes' as const)\n : null;\n if (!kind) return perm;\n\n const initialActionForm = initialData[kind]?.[perm.subject]?.[perm.action];\n const modifiedActionForm = modifiedData[kind]?.[perm.subject]?.[perm.action];\n\n if (!initialActionForm || !modifiedActionForm) return perm;\n\n const initialLocaleEntry = (initialActionForm.properties as PropertyChildForm)['locales'];\n const modifiedLocaleEntry = (modifiedActionForm.properties as PropertyChildForm)['locales'];\n\n if (\n !initialLocaleEntry ||\n typeof initialLocaleEntry === 'boolean' ||\n !modifiedLocaleEntry ||\n typeof modifiedLocaleEntry === 'boolean'\n ) {\n return perm;\n }\n\n const localesUnchanged =\n Object.keys(initialLocaleEntry).length === Object.keys(modifiedLocaleEntry).length &&\n Object.entries(initialLocaleEntry).every(\n ([locale, val]) => modifiedLocaleEntry[locale] === val\n );\n\n if (!localesUnchanged) return perm;\n\n return { ...perm, properties: { ...perm.properties, locales: null } };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * init (reducer)\n * -----------------------------------------------------------------------------------------------*/\n\nconst init = (\n layout: PermissionsProps['layout'],\n permissions: PermissionsProps['permissions']\n): State => {\n const {\n conditions,\n sections: { collectionTypes, singleTypes, plugins, settings },\n } = layout;\n\n const layouts = {\n collectionTypes,\n singleTypes,\n plugins: formatLayout(plugins, 'plugin'),\n settings: formatLayout(settings, 'category'),\n };\n\n const defaultForm = {\n collectionTypes: createDefaultCTForm(collectionTypes, conditions, permissions),\n singleTypes: createDefaultCTForm(singleTypes, conditions, permissions),\n plugins: createDefaultForm(layouts.plugins, conditions, permissions),\n settings: createDefaultForm(layouts.settings, conditions, permissions),\n };\n\n return {\n initialData: defaultForm,\n modifiedData: defaultForm,\n layouts,\n };\n};\n\nexport { Permissions };\nexport type {\n State,\n OnChangeCollectionTypeRowLeftCheckboxAction,\n OnChangeConditionsAction,\n OnChangeCollectionTypeGlobalActionCheckboxAction,\n};\n"],"names":["TAB_LABELS","labelId","defaultMessage","id","Permissions","React","forwardRef","layout","isFormDisabled","onLocaleValidationChange","permissions","userPermissions","api","initialData","layouts","modifiedData","dispatch","useReducer","reducer","initialState","init","formatMessage","useIntl","useEffect","hasLocaleValidationErrors","useImperativeHandle","getPermissions","collectionTypesDiff","difference","collectionTypes","singleTypesDiff","singleTypes","contentTypesDiff","didUpdateConditions","isEmpty","Object","values","some","permission","permissionValue","has","permissionsToSend","formatPermissionsForAPI","map","perm","restoreNullLocalesIfUnchanged","resetForm","type","setFormAfterSubmit","handleChangeCollectionTypeLeftActionRowCheckbox","useCallback","pathToCollectionType","propertyName","rowName","value","handleChangeCollectionTypeGlobalActionCheckbox","collectionTypeKind","actionId","handleChangeConditions","conditions","handleChangeSimpleCheckbox","target","name","keys","handleChangeParentCheckbox","_jsx","PermissionsDataManagerProvider","availableConditions","onChangeConditions","onChangeSimpleCheckbox","onChangeParentCheckbox","onChangeCollectionTypeLeftActionRowCheckbox","onChangeCollectionTypeGlobalActionCheckbox","_jsxs","Tabs","Root","defaultValue","List","aria-label","tabLabel","Trigger","Content","ContentTypes","kind","PluginsAndSettingsPermissions","plugins","settings","buildInheritedConditionsFromExisting","existing","enabledConditions","isObject","undefined","enabled","Set","reduce","acc","key","inheritConditionsAtPath","data","pathToActionObject","subject","matchingPermission","find","action","obj","existingConditions","get","nextConditions","set","state","produce","draftState","pathToData","forEach","collectionType","collectionTypeActionData","subjectPermissionChecker","createFieldPermissionChecker","updatedValues","updateValuesWithPermissions","updatedConditions","updateValues","nextModifiedDataState","cloneDeep","pathToModifiedDataCollectionType","split","objToUpdate","length","objValue","pathToDataToSet","hasPermission","fields","properties","Array","isArray","f","startsWith","permissionChecker","path","fullFieldPath","join","checker","updatedValue","updateConditionsToFalse","entries","array","stringPathToData","conditionsToUpdate","keysArray","propertiesIndex","indexOf","root","slice","pathToValue","oldValues","createDynamicActionPermissionChecker","subjectForLookup","updatedValuesObj","maybeActionObj","originalPermissions","original","p","locales","initialActionForm","modifiedActionForm","initialLocaleEntry","modifiedLocaleEntry","localesUnchanged","every","locale","val","sections","formatLayout","defaultForm","createDefaultCTForm","createDefaultForm"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwCA,MAAMA,UAAAA,GAAa;AACjB,IAAA;QACEC,OAAAA,EAAS,sDAAA;QACTC,cAAAA,EAAgB,kBAAA;QAChBC,EAAAA,EAAI;AACN,KAAA;AACA,IAAA;QACEF,OAAAA,EAAS,kDAAA;QACTE,EAAAA,EAAI,aAAA;QACJD,cAAAA,EAAgB;AAClB,KAAA;AACA,IAAA;QACED,OAAAA,EAAS,8CAAA;QACTC,cAAAA,EAAgB,SAAA;QAChBC,EAAAA,EAAI;AACN,KAAA;AACA,IAAA;QACEF,OAAAA,EAAS,+CAAA;QACTC,cAAAA,EAAgB,UAAA;QAChBC,EAAAA,EAAI;AACN;AACD,CAAA;AAwBD,MAAMC,4BAAcC,KAAAA,CAAMC,UAAU,CAClC,CACE,EAAEC,MAAM,EAAEC,cAAc,EAAEC,wBAAwB,EAAEC,WAAAA,GAAc,EAAE,EAAEC,eAAe,EAAE,EACvFC,GAAAA,GAAAA;AAEA,IAAA,MAAM,CAAC,EAAEC,WAAW,EAAEC,OAAO,EAAEC,YAAY,EAAE,EAAEC,QAAAA,CAAS,GAAGX,MAAMY,UAAU,CACzEC,SACAC,YAAAA,EACA,IAAMC,KAAKb,MAAAA,EAAQG,WAAAA,CAAAA,CAAAA;IAErB,MAAM,EAAEW,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1BjB,IAAAA,KAAAA,CAAMkB,SAAS,CAAC,IAAA;AACdd,QAAAA,wBAAAA,GAA2Be,yBAAAA,CAA0BT,YAAAA,CAAAA,CAAAA;IACvD,CAAA,EAAG;AAACA,QAAAA,YAAAA;AAAcN,QAAAA;AAAyB,KAAA,CAAA;IAE3CJ,KAAAA,CAAMoB,mBAAmB,CAACb,GAAAA,EAAK,IAAA;QAC7B,OAAO;AACLc,YAAAA,cAAAA,CAAAA,GAAAA;AACE,gBAAA,MAAMC,sBAAsBC,UAAAA,CAC1Bf,WAAAA,CAAYgB,eAAe,EAC3Bd,aAAac,eAAe,CAAA;AAE9B,gBAAA,MAAMC,kBAAkBF,UAAAA,CAAWf,WAAAA,CAAYkB,WAAW,EAAEhB,aAAagB,WAAW,CAAA;AAEpF,gBAAA,MAAMC,gBAAAA,GAAmB;AAAE,oBAAA,GAAGL,mBAAmB;AAAE,oBAAA,GAAGG;AAAgB,iBAAA;gBAEtE,IAAIG,mBAAAA;AAEJ,gBAAA,IAAIC,QAAQF,gBAAAA,CAAAA,EAAmB;oBAC7BC,mBAAAA,GAAsB,KAAA;gBACxB,CAAA,MAAO;oBACLA,mBAAAA,GAAsBE,MAAAA,CAAOC,MAAM,CAACJ,gBAAAA,CAAAA,CAAkBK,IAAI,CAAC,CAACC,UAAAA,GAAa,EAAE,GAAA;wBACzE,OAAOH,MAAAA,CAAOC,MAAM,CAACE,UAAAA,CAAAA,CAAYD,IAAI,CAAC,CAACE,eAAAA,GACrCC,GAAAA,CAAID,eAAAA,EAAiB,YAAA,CAAA,CAAA;AAEzB,oBAAA,CAAA,CAAA;AACF,gBAAA;gBAEA,MAAME,iBAAAA,GAAoBC,uBAAAA,CAAwB3B,YAAAA,CAAAA,CAAc4B,GAAG,CAAC,CAACC,IAAAA,GACnEC,6BAAAA,CAA8BD,IAAAA,EAAMlC,WAAAA,EAAaG,WAAAA,EAAaE,YAAAA,CAAAA,CAAAA;gBAGhE,OAAO;AAAE0B,oBAAAA,iBAAAA;AAAmBR,oBAAAA;AAAoB,iBAAA;AAClD,YAAA,CAAA;AACAT,YAAAA,yBAAAA,CAAAA,GAAAA;AACE,gBAAA,OAAOA,yBAAAA,CAA0BT,YAAAA,CAAAA;AACnC,YAAA,CAAA;AACA+B,YAAAA,SAAAA,CAAAA,GAAAA;gBACE9B,QAAAA,CAAS;oBAAE+B,IAAAA,EAAM;AAAa,iBAAA,CAAA;AAChC,YAAA,CAAA;AACAC,YAAAA,kBAAAA,CAAAA,GAAAA;gBACEhC,QAAAA,CAAS;oBAAE+B,IAAAA,EAAM;AAAwB,iBAAA,CAAA;AAC3C,YAAA;AACF,SAAA;AACF,IAAA,CAAA,CAAA;AAEA,IAAA,MAAME,kDAAkD5C,KAAAA,CAAM6C,WAAW,CACvE,CACEC,oBAAAA,EACAC,cACAC,OAAAA,EACAC,KAAAA,GAAAA;QAEAtC,QAAAA,CAAS;YACP+B,IAAAA,EAAM,6CAAA;AACNI,YAAAA,oBAAAA;AACAC,YAAAA,YAAAA;AACAC,YAAAA,OAAAA;AACAC,YAAAA,KAAAA;AACA3C,YAAAA;AACF,SAAA,CAAA;IACF,CAAA,EACA;AAACA,QAAAA;AAAgB,KAAA,CAAA;AAGnB,IAAA,MAAM4C,iDAAiDlD,KAAAA,CAAM6C,WAAW,CACtE,CACEM,oBACAC,QAAAA,EACAH,KAAAA,GAAAA;QAEAtC,QAAAA,CAAS;YACP+B,IAAAA,EAAM,kDAAA;AACNS,YAAAA,kBAAAA;AACAC,YAAAA,QAAAA;AACAH,YAAAA,KAAAA;AACA3C,YAAAA;AACF,SAAA,CAAA;IACF,CAAA,EACA;AAACA,QAAAA;AAAgB,KAAA,CAAA;AAGnB,IAAA,MAAM+C,sBAAAA,GAAyBrD,KAAAA,CAAM6C,WAAW,CAC9C,CAACS,UAAAA,GAAAA;QACC3C,QAAAA,CAAS;YAAE+B,IAAAA,EAAM,sBAAA;AAAwBY,YAAAA,UAAAA;AAAYhD,YAAAA;AAAgB,SAAA,CAAA;IACvE,CAAA,EACA;AAACA,QAAAA;AAAgB,KAAA,CAAA;AAGnB,IAAA,MAAMiD,0BAAAA,GACJvD,KAAAA,CAAM6C,WAAW,CACf,CAAC,EAAEW,MAAAA,EAAQ,EAAEC,IAAI,EAAER,KAAK,EAAE,EAAE,GAAA;QAC1BtC,QAAAA,CAAS;YACP+B,IAAAA,EAAM,2BAAA;YACNgB,IAAAA,EAAMD,IAAAA;AACNR,YAAAA,KAAAA;AACA3C,YAAAA;AACF,SAAA,CAAA;IACF,CAAA,EACA;AAACA,QAAAA;AAAgB,KAAA,CAAA;AAGrB,IAAA,MAAMqD,0BAAAA,GACJ3D,KAAAA,CAAM6C,WAAW,CACf,CAAC,EAAEW,MAAAA,EAAQ,EAAEC,IAAI,EAAER,KAAK,EAAE,EAAE,GAAA;QAC1BtC,QAAAA,CAAS;YACP+B,IAAAA,EAAM,kCAAA;YACNgB,IAAAA,EAAMD,IAAAA;AACNR,YAAAA,KAAAA;AACA3C,YAAAA;AACF,SAAA,CAAA;IACF,CAAA,EACA;AAACA,QAAAA;AAAgB,KAAA,CAAA;AAGrB,IAAA,qBACEsD,GAAA,CAACC,8BAAAA,EAAAA;AACCC,QAAAA,mBAAAA,EAAqB5D,OAAOoD,UAAU;QACtC5C,YAAAA,EAAcA,YAAAA;QACdqD,kBAAAA,EAAoBV,sBAAAA;QACpBW,sBAAAA,EAAwBT,0BAAAA;QACxBU,sBAAAA,EAAwBN,0BAAAA;QACxBO,2CAAAA,EACEtB,+CAAAA;QAEFuB,0CAAAA,EAA4CjB,8CAAAA;QAC5C5C,eAAAA,EAAiBA,eAAAA;gCAEjB8D,IAAA,CAACC,KAAKC,IAAI,EAAA;AAACC,YAAAA,YAAAA,EAAc5E,UAAU,CAAC,CAAA,CAAE,CAACG,EAAE;;AACvC,8BAAA8D,GAAA,CAACS,KAAKG,IAAI,EAAA;AACRC,oBAAAA,YAAAA,EAAYzD,aAAAA,CAAc;wBACxBlB,EAAAA,EAAI,uCAAA;wBACJD,cAAAA,EAAgB;AAClB,qBAAA,CAAA;AAECF,oBAAAA,QAAAA,EAAAA,UAAAA,CAAW2C,GAAG,CAAC,CAACoC,QAAAA,iBACfd,GAAA,CAACS,KAAKM,OAAO,EAAA;AAAmB1B,4BAAAA,KAAAA,EAAOyB,SAAS5E,EAAE;sCAC/CkB,aAAAA,CAAc;AAAElB,gCAAAA,EAAAA,EAAI4E,SAAS9E,OAAO;AAAEC,gCAAAA,cAAAA,EAAgB6E,SAAS7E;AAAe,6BAAA;AAD9D6E,yBAAAA,EAAAA,QAAAA,CAAS5E,EAAE,CAAA;;AAKlC,8BAAA8D,GAAA,CAACS,KAAKO,OAAO,EAAA;AAAC3B,oBAAAA,KAAAA,EAAOtD,UAAU,CAAC,CAAA,CAAE,CAACG,EAAE;AACnC,oBAAA,QAAA,gBAAA8D,GAAA,CAACiB,YAAAA,EAAAA;AACC3E,wBAAAA,MAAAA,EAAQO,QAAQe,eAAe;wBAC/BsD,IAAAA,EAAK,iBAAA;wBACL3E,cAAAA,EAAgBA;;;AAGpB,8BAAAyD,GAAA,CAACS,KAAKO,OAAO,EAAA;AAAC3B,oBAAAA,KAAAA,EAAOtD,UAAU,CAAC,CAAA,CAAE,CAACG,EAAE;AACnC,oBAAA,QAAA,gBAAA8D,GAAA,CAACiB,YAAAA,EAAAA;AACC3E,wBAAAA,MAAAA,EAAQO,QAAQiB,WAAW;wBAC3BoD,IAAAA,EAAK,aAAA;wBACL3E,cAAAA,EAAgBA;;;AAGpB,8BAAAyD,GAAA,CAACS,KAAKO,OAAO,EAAA;AAAC3B,oBAAAA,KAAAA,EAAOtD,UAAU,CAAC,CAAA,CAAE,CAACG,EAAE;AACnC,oBAAA,QAAA,gBAAA8D,GAAA,CAACmB,6BAAAA,EAAAA;AACC7E,wBAAAA,MAAAA,EAAQO,QAAQuE,OAAO;wBACvBF,IAAAA,EAAK,SAAA;wBACL3E,cAAAA,EAAgBA;;;AAGpB,8BAAAyD,GAAA,CAACS,KAAKO,OAAO,EAAA;AAAC3B,oBAAAA,KAAAA,EAAOtD,UAAU,CAAC,CAAA,CAAE,CAACG,EAAE;AACnC,oBAAA,QAAA,gBAAA8D,GAAA,CAACmB,6BAAAA,EAAAA;AACC7E,wBAAAA,MAAAA,EAAQO,QAAQwE,QAAQ;wBACxBH,IAAAA,EAAK,UAAA;wBACL3E,cAAAA,EAAgBA;;;;;;AAM5B,CAAA;AAyBF,MAAMW,YAAAA,GAAe;AACnBN,IAAAA,WAAAA,EAAa,EAAC;AACdE,IAAAA,YAAAA,EAAc,EAAC;AACfD,IAAAA,OAAAA,EAAS;AACX,CAAA;AAwDA,MAAMyE,oCAAAA,GAAuC,CAC3CC,QAAAA,EACAC,iBAAAA,GAA8B,EAAE,GAAA;IAEhC,IAAI,CAACC,SAASF,QAAAA,CAAAA,EAAW;QACvB,OAAOG,SAAAA;AACT,IAAA;IAEA,MAAMC,OAAAA,GAAU,IAAIC,GAAAA,CAAIJ,iBAAAA,CAAAA;AAExB,IAAA,OAAOtD,OAAO4B,IAAI,CAACyB,UAAUM,MAAM,CAA0B,CAACC,GAAAA,EAAKC,GAAAA,GAAAA;AACjED,QAAAA,GAAG,CAACC,GAAAA,CAAI,GAAGJ,OAAAA,CAAQpD,GAAG,CAACwD,GAAAA,CAAAA;QAEvB,OAAOD,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACN,CAAA;AAEA,MAAME,uBAAAA,GAA0B,CAC9BC,IAAAA,EACAC,kBAAAA,EACA1C,UACA2C,OAAAA,EACAzF,eAAAA,GAAAA;AAEA,IAAA,IAAIA,oBAAoBgF,SAAAA,EAAW;AACjC,QAAA;AACF,IAAA;AAEA,IAAA,MAAMU,kBAAAA,GAAqB1F,eAAAA,CAAgB2F,IAAI,CAC7C,CAAC1D,IAAAA,GAASA,IAAAA,CAAK2D,MAAM,KAAK9C,QAAAA,IAAYb,IAAAA,CAAKwD,OAAO,KAAKA,OAAAA,CAAAA;AAGzD,IAAA,IAAIC,uBAAuBV,SAAAA,EAAW;AACpC,QAAA;AACF,IAAA;AAEA,IAAA,MAAMa,GAAAA,GAAMN,IAAAA;IACZ,MAAMO,kBAAAA,GAAqBC,IAAIF,GAAAA,EAAK;AAAIL,QAAAA,GAAAA,kBAAAA;AAAoB,QAAA;KAAa,EAAER,SAAAA,CAAAA;AAC3E,IAAA,MAAMgB,iBAAiBpB,oCAAAA,CACrBkB,kBAAAA,EACAJ,kBAAAA,CAAmB1C,UAAU,IAAI,EAAE,CAAA;AAGrC,IAAA,IAAIgD,cAAAA,EAAgB;AAClBC,QAAAA,GAAAA,CAAIJ,GAAAA,EAAK;AAAIL,YAAAA,GAAAA,kBAAAA;AAAoB,YAAA;SAAa,EAAEQ,cAAAA,CAAAA;AAClD,IAAA;AACF,CAAA;AAEA,uCACA,MAAMzF,OAAAA,GAAU,CAAC2F,OAAcN,MAAAA,GAC7BO,OAAAA,CAAQD,OAAO,CAACE,UAAAA,GAAAA;AACd,QAAA,OAAQR,OAAOxD,IAAI;YACjB,KAAK,kDAAA;AAAoD,gBAAA;oBACvD,MAAM,EAAES,kBAAkB,EAAEC,QAAQ,EAAEH,KAAK,EAAE3C,eAAe,EAAE,GAAG4F,MAAAA;AACjE,oBAAA,MAAMS,UAAAA,GAAa;AAAC,wBAAA,cAAA;AAAgBxD,wBAAAA;AAAmB,qBAAA;AAEvDrB,oBAAAA,MAAAA,CAAO4B,IAAI,CAAC2C,GAAAA,CAAIG,OAAOG,UAAAA,CAAAA,CAAAA,CAAaC,OAAO,CAAC,CAACC,cAAAA,GAAAA;wBAC3C,MAAMC,wBAAAA,GAA2BT,IAC/BG,KAAAA,EACA;AAAIG,4BAAAA,GAAAA,UAAAA;AAAYE,4BAAAA,cAAAA;AAAgBzD,4BAAAA;yBAAS,EACzCkC,SAAAA,CAAAA;AAGF,wBAAA,IAAIwB,wBAAAA,EAA0B;4BAC5B,MAAMC,wBAAAA,GAA2BC,4BAAAA,CAC/B5D,QAAAA,EACAyD,cAAAA,EACAvG,eAAAA,CAAAA;4BAGF,IAAI2G,aAAAA,GAAgBC,2BAAAA,CAClBJ,wBAAAA,EACA7D,KAAAA,EACA8D,wBAAAA,CAAAA;AAGF,4BAAA,IAAI9D,UAAU,IAAA,EAAM;AAClB2C,gCAAAA,uBAAAA,CAAwBqB,aAAAA,EAAe,EAAE,EAAE7D,QAAAA,EAAUyD,cAAAA,EAAgBvG,eAAAA,CAAAA;AACvE,4BAAA;AAEA,4BAAA,IAAI2C,KAAAA,KAAU,KAAA,IAASgE,aAAAA,CAAc3D,UAAU,KAAKgC,SAAAA,EAAW;;AAE7D,gCAAA,MAAM6B,iBAAAA,GAAoBC,YAAAA,CAAaH,aAAAA,CAAc3D,UAAU,EAAE,KAAA,CAAA;gCAEjE2D,aAAAA,GAAgB;AAAE,oCAAA,GAAGA,aAAa;oCAAE3D,UAAAA,EAAY6D;AAAkB,iCAAA;AACpE,4BAAA;AAEAZ,4BAAAA,GAAAA,CAAIG,UAAAA,EAAY;AAAIC,gCAAAA,GAAAA,UAAAA;AAAYE,gCAAAA,cAAAA;AAAgBzD,gCAAAA;6BAAS,EAAE6D,aAAAA,CAAAA;AAC7D,wBAAA;AACF,oBAAA,CAAA,CAAA;AAEA,oBAAA;AACF,gBAAA;YACA,KAAK,6CAAA;AAA+C,gBAAA;oBAClD,MAAM,EAAEnE,oBAAoB,EAAEC,YAAY,EAAEC,OAAO,EAAEC,KAAK,EAAE3C,eAAe,EAAE,GAAG4F,MAAAA;oBAChF,IAAImB,qBAAAA,GAAwBC,SAAAA,CAAUd,KAAAA,CAAM9F,YAAY,CAAA;oBACxD,MAAM6G,gCAAAA,GAAmCzE,oBAAAA,CAAqB0E,KAAK,CAAC,IAAA,CAAA;AAEpE,oBAAA,MAAMC,WAAAA,GAAcpB,GAAAA,CAAIgB,qBAAAA,EAAuBE,gCAAAA,EAAkC,EAAC,CAAA;AAElF,oBAAA,MAAMxB,UACJwB,gCAAgC,CAACA,gCAAAA,CAAiCG,MAAM,GAAG,CAAA,CAAE;AAE/E5F,oBAAAA,MAAAA,CAAO4B,IAAI,CAAC+D,WAAAA,CAAAA,CAAab,OAAO,CAAC,CAACxD,QAAAA,GAAAA;wBAChC,IAAIjB,GAAAA,CAAIsF,WAAW,CAACrE,QAAAA,CAAS,EAAE,CAAC,WAAW,EAAEL,YAAAA,CAAAA,CAAc,CAAA,EAAG;4BAC5D,MAAM4E,QAAAA,GAAWtB,IAAIoB,WAAAA,EAAa;AAACrE,gCAAAA,QAAAA;AAAU,gCAAA,YAAA;AAAcL,gCAAAA,YAAAA;AAAcC,gCAAAA;AAAQ,6BAAA,CAAA;AACjF,4BAAA,MAAM4E,eAAAA,GAAkB;AACnBL,gCAAAA,GAAAA,gCAAAA;AACHnE,gCAAAA,QAAAA;AACA,gCAAA,YAAA;AACAL,gCAAAA,YAAAA;AACAC,gCAAAA;AACD,6BAAA;4BAED,IAAI,CAACqC,SAASsC,QAAAA,CAAAA,EAAW;gCACvB,IAAIrH,eAAAA,KAAoBgF,SAAAA,IAAavC,YAAAA,KAAiB,QAAA,EAAU;AAC9D,oCAAA,MAAM8E,aAAAA,GAAgBvH,eAAAA,CAAgB0B,IAAI,CAAC,CAACO,IAAAA,GAAAA;wCAC1C,IAAIA,IAAAA,CAAK2D,MAAM,KAAK9C,QAAAA,IAAYb,KAAKwD,OAAO,KAAKA,SAAS,OAAO,KAAA;wCAEjE,MAAM+B,MAAAA,GAASvF,IAAAA,CAAKwF,UAAU,EAAED,MAAAA;AAChC,wCAAA,IAAIA,MAAAA,KAAW,IAAA,IAAQA,MAAAA,KAAWxC,SAAAA,EAAW,OAAO,IAAA;wCACpD,IAAI0C,KAAAA,CAAMC,OAAO,CAACH,MAAAA,CAAAA,IAAWA,OAAOJ,MAAM,KAAK,GAAG,OAAO,KAAA;AAEzD,wCAAA,OACEM,MAAMC,OAAO,CAACH,MAAAA,CAAAA,IACdA,MAAAA,CAAO9F,IAAI,CAAC,CAACkG,CAAAA,GAAMlF,OAAAA,KAAYkF,KAAKlF,OAAAA,CAAQmF,UAAU,CAAC,CAAA,EAAGD,CAAAA,CAAE,CAAC,CAAC,CAAA,CAAA;AAElE,oCAAA,CAAA,CAAA;AAEA,oCAAA,IAAIL,kBAAkB,IAAA,EAAM;AAC1BtB,wCAAAA,GAAAA,CAAIc,uBAAuBO,eAAAA,EAAiB3E,KAAAA,CAAAA;AAC5C,wCAAA,IAAIA,UAAU,IAAA,EAAM;AAClB2C,4CAAAA,uBAAAA,CACEyB,qBAAAA,EACA;AAAIE,gDAAAA,GAAAA,gCAAAA;AAAkCnE,gDAAAA;AAAS,6CAAA,EAC/CA,UACA2C,OAAAA,EACAzF,eAAAA,CAAAA;AAEJ,wCAAA;AACF,oCAAA;gCACF,CAAA,MAAO;AACLiG,oCAAAA,GAAAA,CAAIc,uBAAuBO,eAAAA,EAAiB3E,KAAAA,CAAAA;oCAC5C,IAAIA,KAAAA,KAAU,IAAA,IAAQ3C,eAAAA,KAAoBgF,SAAAA,EAAW;AACnDM,wCAAAA,uBAAAA,CACEyB,qBAAAA,EACA;AAAIE,4CAAAA,GAAAA,gCAAAA;AAAkCnE,4CAAAA;AAAS,yCAAA,EAC/CA,UACA2C,OAAAA,EACAzF,eAAAA,CAAAA;AAEJ,oCAAA;AACF,gCAAA;4BACF,CAAA,MAAO;AACL,gCAAA,MAAM8H,iBAAAA,GACJ9H,eAAAA,KAAoBgF,SAAAA,IAAavC,YAAAA,KAAiB,WAC9C,CAACsF,IAAAA,GAAAA;AACC,oCAAA,MAAMC,aAAAA,GAAgB;AAACtF,wCAAAA,OAAAA;AAAYqF,wCAAAA,GAAAA;AAAK,qCAAA,CAACE,IAAI,CAAC,GAAA,CAAA;oCAC9C,MAAMC,OAAAA,GAAUxB,4BAAAA,CACd5D,QAAAA,EACA2C,OAAAA,EACAzF,eAAAA,CAAAA;oCAEF,OAAOkI,OAAAA,KAAYlD,SAAAA,GACf,IAAA,GACAkD,OAAAA,CAAQ;AAAC,wCAAA,YAAA;AAAc,wCAAA,QAAA;AAAUF,wCAAAA;AAAc,qCAAA,CAAA;gCACrD,CAAA,GACAhD,SAAAA;gCAEN,MAAMmD,YAAAA,GAAevB,2BAAAA,CAA4BS,QAAAA,EAAU1E,KAAAA,EAAOmF,iBAAAA,CAAAA;AAElE7B,gCAAAA,GAAAA,CAAIc,uBAAuBO,eAAAA,EAAiBa,YAAAA,CAAAA;gCAC5C,IAAIxF,KAAAA,KAAU,IAAA,IAAQ3C,eAAAA,KAAoBgF,SAAAA,EAAW;AACnDM,oCAAAA,uBAAAA,CACEyB,qBAAAA,EACA;AAAIE,wCAAAA,GAAAA,gCAAAA;AAAkCnE,wCAAAA;AAAS,qCAAA,EAC/CA,UACA2C,OAAAA,EACAzF,eAAAA,CAAAA;AAEJ,gCAAA;AACF,4BAAA;AACF,wBAAA;AACF,oBAAA,CAAA,CAAA;AAEA,oBAAA,IAAI2C,UAAU,KAAA,EAAO;;AAEnBoE,wBAAAA,qBAAAA,GAAwBqB,uBAAAA,CAAwBrB,qBAAAA,CAAAA;AAClD,oBAAA;AAEAd,oBAAAA,GAAAA,CAAIG,YAAY,cAAA,EAAgBW,qBAAAA,CAAAA;AAEhC,oBAAA;AACF,gBAAA;YACA,KAAK,sBAAA;AAAwB,gBAAA;;oBAE3B,IAAInB,MAAAA,CAAO5F,eAAe,KAAKgF,SAAAA,EAAW;AACxC,wBAAA;AACF,oBAAA;AAEAxD,oBAAAA,MAAAA,CAAO6G,OAAO,CAACzC,MAAAA,CAAO5C,UAAU,CAAA,CAAEsD,OAAO,CAAC,CAACgC,KAAAA,GAAAA;wBACzC,MAAM,CAACC,gBAAAA,EAAkBC,kBAAAA,CAAmB,GAAGF,KAAAA;AAE/CrC,wBAAAA,GAAAA,CACEG,UAAAA,EACA;AAAC,4BAAA,cAAA;AAAmBmC,4BAAAA,GAAAA,gBAAAA,CAAiBrB,KAAK,CAAC,IAAA,CAAA;AAAO,4BAAA;yBAAa,EAC/DsB,kBAAAA,CAAAA;AAEJ,oBAAA,CAAA,CAAA;AAEA,oBAAA;AACF,gBAAA;YACA,KAAK,2BAAA;AAA6B,gBAAA;oBAChC,IAAIzB,qBAAAA,GAAwBC,SAAAA,CAAUd,KAAAA,CAAM9F,YAAY,CAAA;AAExD,oBAAA,MAAMqI,SAAAA,GAAY7C,MAAAA,CAAOxC,IAAI,CAAC8D,KAAK,CAAC,IAAA,CAAA;AACpCjB,oBAAAA,GAAAA,CAAIc,qBAAAA,EAAuB;AAAI0B,wBAAAA,GAAAA;AAAU,qBAAA,EAAE7C,OAAOjD,KAAK,CAAA;;AAGvD,oBAAA,IAAIiD,OAAOjD,KAAK,KAAK,QAAQiD,MAAAA,CAAO5F,eAAe,KAAKgF,SAAAA,EAAW;wBACjE,MAAM0D,eAAAA,GAAkBD,SAAAA,CAAUE,OAAO,CAAC,YAAA,CAAA;AAE1C,wBAAA,IAAID,kBAAkB,CAAA,EAAG;AACvB,4BAAA,MAAM5F,QAAAA,GAAW2F,SAAS,CAACC,eAAAA,GAAkB,CAAA,CAAE;4BAC/C,MAAME,IAAAA,GAAOH,SAAS,CAAC,CAAA,CAAE;4BAEzB,IAAKG,CAAAA,IAAAA,KAAS,iBAAA,IAAqBA,IAAAA,KAAS,aAAY,KAAMH,SAAAA,CAAUrB,MAAM,IAAI,CAAA,EAAG;gCACnF,MAAM3B,OAAAA,GAAUgD,SAAS,CAAC,CAAA,CAAE;AAC5BnD,gCAAAA,uBAAAA,CACEyB,qBAAAA,EACA;AAAC6B,oCAAAA,IAAAA;AAAMnD,oCAAAA,OAAAA;AAAS3C,oCAAAA;iCAAS,EACzBA,QAAAA,EACA2C,OAAAA,EACAG,MAAAA,CAAO5F,eAAe,CAAA;4BAE1B,CAAA,MAAO;AACL,gCAAA,MAAMwF,kBAAAA,GAAqBiD,SAAAA,CAAUI,KAAK,CAAC,CAAA,EAAGH,eAAAA,CAAAA;AAC9CpD,gCAAAA,uBAAAA,CACEyB,qBAAAA,EACAvB,kBAAAA,EACA1C,QAAAA,EACA,IAAA,EACA8C,OAAO5F,eAAe,CAAA;AAE1B,4BAAA;AACF,wBAAA;AACF,oBAAA;oBAEA,IAAI4F,MAAAA,CAAOjD,KAAK,KAAK,KAAA,EAAO;;AAE1BoE,wBAAAA,qBAAAA,GAAwBqB,uBAAAA,CAAwBrB,qBAAAA,CAAAA;AAClD,oBAAA;AAEAd,oBAAAA,GAAAA,CAAIG,YAAY,cAAA,EAAgBW,qBAAAA,CAAAA;AAEhC,oBAAA;AACF,gBAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCC,UACD,KAAK,kCAAA;AAAoC,gBAAA;AACvC,oBAAA,MAAM,EAAE3D,IAAI,EAAET,KAAK,EAAE3C,eAAe,EAAE,GAAG4F,MAAAA;AACzC,oBAAA,MAAMkD,WAAAA,GAAc;AAAI1F,wBAAAA,GAAAA,IAAAA,CAAK8D,KAAK,CAAC,IAAA;AAAM,qBAAA;oBACzC,IAAIH,qBAAAA,GAAwBC,SAAAA,CAAUd,KAAAA,CAAM9F,YAAY,CAAA;AACxD,oBAAA,MAAM2I,SAAAA,GAAYhD,GAAAA,CAAIgB,qBAAAA,EAAuB+B,WAAAA,EAAa,EAAC,CAAA;oBAE3D,IAAIhG,QAAAA;oBACJ,IAAI2C,OAAAA;oBAEJ,IAAIqD,WAAAA,CAAY1B,MAAM,IAAI,CAAA,EAAG;wBAC3B3B,OAAAA,GAAUqD,WAAW,CAAC,CAAA,CAAE;AAC1B,oBAAA;oBAEA,IAAIA,WAAAA,CAAY1B,MAAM,IAAI,CAAA,EAAG;wBAC3BtE,QAAAA,GAAWgG,WAAW,CAAC,CAAA,CAAE;AAC3B,oBAAA;oBAEA,MAAMhB,iBAAAA,GAAoBkB,oCAAAA,CACxBvD,OAAAA,EACA3C,QAAAA,EACA9C,eAAAA,CAAAA;oBAGF,MAAM2G,aAAAA,GAAgBC,2BAAAA,CAA4BmC,SAAAA,EAAWpG,KAAAA,EAAOmF,iBAAAA,CAAAA;;oBAGpE,IAAInF,KAAAA,KAAU,IAAA,IAAQ3C,eAAAA,KAAoBgF,SAAAA,EAAW;wBACnD,MAAM4D,IAAAA,GAAOE,WAAW,CAAC,CAAA,CAAE;AAC3B,wBAAA,MAAMG,mBACJL,IAAAA,KAAS,iBAAA,IAAqBA,IAAAA,KAAS,aAAA,GAAiBnD,WAAW,IAAA,GAAQ,IAAA;wBAE7E,IAAI3C,QAAAA,KAAakC,SAAAA,IAAaiE,gBAAAA,KAAqB,IAAA,EAAM;AACvD3D,4BAAAA,uBAAAA,CAAwBqB,aAAAA,EAAe,EAAE,EAAE7D,QAAAA,EAAUmG,gBAAAA,EAAkBjJ,eAAAA,CAAAA;wBACzE,CAAA,MAAO,IAAI+E,SAAS4B,aAAAA,CAAAA,EAAgB;AAClC,4BAAA,MAAMuC,gBAAAA,GAAmBvC,aAAAA;AAEzBnF,4BAAAA,MAAAA,CAAO4B,IAAI,CAAC8F,gBAAAA,CAAAA,CAAkB5C,OAAO,CAAC,CAACjB,GAAAA,GAAAA;gCACrC,MAAM8D,cAAAA,GAAiBD,gBAAgB,CAAC7D,GAAAA,CAAI;AAC5C,gCAAA,IAAIN,SAASoE,cAAAA,CAAAA,EAAiB;AAC5B7D,oCAAAA,uBAAAA,CAAwB6D,cAAAA,EAAgB,EAAE,EAAE9D,GAAAA,EAAK4D,gBAAAA,EAAkBjJ,eAAAA,CAAAA;AACrE,gCAAA;AACF,4BAAA,CAAA,CAAA;AACF,wBAAA;AACF,oBAAA;AAEAiG,oBAAAA,GAAAA,CAAIc,uBAAuB+B,WAAAA,EAAanC,aAAAA,CAAAA;AAExC,oBAAA,IAAIhE,UAAU,KAAA,EAAO;;AAEnBoE,wBAAAA,qBAAAA,GAAwBqB,uBAAAA,CAAwBrB,qBAAAA,CAAAA;AAClD,oBAAA;AAEAd,oBAAAA,GAAAA,CAAIG,UAAAA,EAAY;AAAC,wBAAA;qBAAe,EAAEW,qBAAAA,CAAAA;AAElC,oBAAA;AACF,gBAAA;YACA,KAAK,YAAA;AAAc,gBAAA;oBACjBX,UAAAA,CAAWhG,YAAY,GAAG8F,KAAAA,CAAMhG,WAAW;AAC3C,oBAAA;AACF,gBAAA;YACA,KAAK,uBAAA;AAAyB,gBAAA;oBAC5BkG,UAAAA,CAAWlG,WAAW,GAAGgG,KAAAA,CAAM9F,YAAY;AAC3C,oBAAA;AACF,gBAAA;AACA,YAAA;gBACE,OAAOgG,UAAAA;AACX;AACF,IAAA,CAAA,CAAA;AAUF,MAAMlE,6BAAAA,GAAgC,CACpCD,IAAAA,EACAmH,mBAAAA,EACAlJ,WAAAA,EACAE,YAAAA,GAAAA;AAEA,IAAA,IAAI,CAAC6B,IAAAA,CAAKwD,OAAO,EAAE,OAAOxD,IAAAA;AAE1B,IAAA,MAAMoH,WAAWD,mBAAAA,CAAoBzD,IAAI,CACvC,CAAC2D,IAAMA,CAAAA,CAAE1D,MAAM,KAAK3D,IAAAA,CAAK2D,MAAM,IAAI0D,CAAAA,CAAE7D,OAAO,KAAKxD,KAAKwD,OAAO,CAAA;;AAI/D,IAAA,IAAI4D,QAAAA,EAAU5B,UAAAA,EAAY8B,OAAAA,KAAY,IAAA,EAAM,OAAOtH,IAAAA;AAEnD,IAAA,MAAMuC,IAAAA,GACJvC,IAAAA,CAAKwD,OAAO,IAAIrF,aAAac,eAAe,GACvC,iBAAA,GACDe,IAAAA,CAAKwD,OAAO,IAAIrF,YAAAA,CAAagB,WAAW,GACrC,aAAA,GACD,IAAA;IACR,IAAI,CAACoD,MAAM,OAAOvC,IAAAA;AAElB,IAAA,MAAMuH,iBAAAA,GAAoBtJ,WAAW,CAACsE,IAAAA,CAAK,GAAGvC,IAAAA,CAAKwD,OAAO,CAAC,GAAGxD,IAAAA,CAAK2D,MAAM,CAAC;AAC1E,IAAA,MAAM6D,kBAAAA,GAAqBrJ,YAAY,CAACoE,IAAAA,CAAK,GAAGvC,IAAAA,CAAKwD,OAAO,CAAC,GAAGxD,IAAAA,CAAK2D,MAAM,CAAC;AAE5E,IAAA,IAAI,CAAC4D,iBAAAA,IAAqB,CAACC,kBAAAA,EAAoB,OAAOxH,IAAAA;AAEtD,IAAA,MAAMyH,qBAAqB,iBAACF,CAAkB/B,UAAgC,CAAC,SAAA,CAAU;AACzF,IAAA,MAAMkC,sBAAsB,kBAACF,CAAmBhC,UAAgC,CAAC,SAAA,CAAU;IAE3F,IACE,CAACiC,sBACD,OAAOA,kBAAAA,KAAuB,aAC9B,CAACC,mBAAAA,IACD,OAAOA,mBAAAA,KAAwB,SAAA,EAC/B;QACA,OAAO1H,IAAAA;AACT,IAAA;IAEA,MAAM2H,gBAAAA,GACJpI,MAAAA,CAAO4B,IAAI,CAACsG,kBAAAA,CAAAA,CAAoBtC,MAAM,KAAK5F,MAAAA,CAAO4B,IAAI,CAACuG,mBAAAA,CAAAA,CAAqBvC,MAAM,IAClF5F,MAAAA,CAAO6G,OAAO,CAACqB,kBAAAA,CAAAA,CAAoBG,KAAK,CACtC,CAAC,CAACC,MAAAA,EAAQC,GAAAA,CAAI,GAAKJ,mBAAmB,CAACG,MAAAA,CAAO,KAAKC,GAAAA,CAAAA;IAGvD,IAAI,CAACH,kBAAkB,OAAO3H,IAAAA;IAE9B,OAAO;AAAE,QAAA,GAAGA,IAAI;QAAEwF,UAAAA,EAAY;AAAE,YAAA,GAAGxF,KAAKwF,UAAU;YAAE8B,OAAAA,EAAS;AAAK;AAAE,KAAA;AACtE,CAAA;AAEA;;qGAIA,MAAM9I,IAAAA,GAAO,CACXb,MAAAA,EACAG,WAAAA,GAAAA;AAEA,IAAA,MAAM,EACJiD,UAAU,EACVgH,QAAAA,EAAU,EAAE9I,eAAe,EAAEE,WAAW,EAAEsD,OAAO,EAAEC,QAAQ,EAAE,EAC9D,GAAG/E,MAAAA;AAEJ,IAAA,MAAMO,OAAAA,GAAU;AACde,QAAAA,eAAAA;AACAE,QAAAA,WAAAA;AACAsD,QAAAA,OAAAA,EAASuF,aAAavF,OAAAA,EAAS,QAAA,CAAA;AAC/BC,QAAAA,QAAAA,EAAUsF,aAAatF,QAAAA,EAAU,UAAA;AACnC,KAAA;AAEA,IAAA,MAAMuF,WAAAA,GAAc;QAClBhJ,eAAAA,EAAiBiJ,mBAAAA,CAAoBjJ,iBAAiB8B,UAAAA,EAAYjD,WAAAA,CAAAA;QAClEqB,WAAAA,EAAa+I,mBAAAA,CAAoB/I,aAAa4B,UAAAA,EAAYjD,WAAAA,CAAAA;AAC1D2E,QAAAA,OAAAA,EAAS0F,iBAAAA,CAAkBjK,OAAAA,CAAQuE,OAAO,EAAE1B,UAAAA,EAAYjD,WAAAA,CAAAA;AACxD4E,QAAAA,QAAAA,EAAUyF,iBAAAA,CAAkBjK,OAAAA,CAAQwE,QAAQ,EAAE3B,UAAAA,EAAYjD,WAAAA;AAC5D,KAAA;IAEA,OAAO;QACLG,WAAAA,EAAagK,WAAAA;QACb9J,YAAAA,EAAc8J,WAAAA;AACd/J,QAAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"Permissions.mjs","sources":["../../../../../../../../../admin/src/pages/Settings/pages/Roles/components/Permissions.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Tabs } from '@strapi/design-system';\nimport { produce } from 'immer';\nimport cloneDeep from 'lodash/cloneDeep';\nimport get from 'lodash/get';\nimport has from 'lodash/has';\nimport isEmpty from 'lodash/isEmpty';\nimport set from 'lodash/set';\nimport { useIntl } from 'react-intl';\n\nimport * as PermissonContracts from '../../../../../../../shared/contracts/permissions';\nimport { Permission } from '../../../../../../../shared/contracts/shared';\nimport { Permission as AuthPermission } from '../../../../../features/Auth';\nimport { isObject } from '../../../../../utils/objects';\nimport {\n PermissionsDataManagerContextValue,\n PermissionsDataManagerProvider,\n} from '../hooks/usePermissionsDataManager';\nimport {\n createFieldPermissionChecker,\n createDynamicActionPermissionChecker,\n} from '../utils/createPermissionChecker';\nimport { difference } from '../utils/difference';\nimport {\n ConditionForm,\n Form,\n PropertyChildForm,\n createDefaultCTForm,\n createDefaultForm,\n} from '../utils/forms';\nimport { GenericLayout, formatLayout } from '../utils/layouts';\nimport { hasLocaleValidationErrors } from '../utils/localePermissionValidation';\nimport { formatPermissionsForAPI } from '../utils/permissions';\nimport { updateConditionsToFalse } from '../utils/updateConditionsToFalse';\nimport { updateValues, updateValuesWithPermissions } from '../utils/updateValues';\n\nimport { ContentTypes } from './ContentTypes';\nimport { PluginsAndSettingsPermissions } from './PluginsAndSettings';\n\nconst TAB_LABELS = [\n {\n labelId: 'app.components.LeftMenuLinkContainer.collectionTypes',\n defaultMessage: 'Collection Types',\n id: 'collectionTypes',\n },\n {\n labelId: 'app.components.LeftMenuLinkContainer.singleTypes',\n id: 'singleTypes',\n defaultMessage: 'Single Types',\n },\n {\n labelId: 'app.components.LeftMenuLinkContainer.plugins',\n defaultMessage: 'Plugins',\n id: 'plugins',\n },\n {\n labelId: 'app.components.LeftMenuLinkContainer.settings',\n defaultMessage: 'Settings',\n id: 'settings',\n },\n] as const;\n\n/* -------------------------------------------------------------------------------------------------\n * Permissions\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface PermissionsAPI {\n getPermissions: () => {\n didUpdateConditions: boolean;\n permissionsToSend: Omit<Permission, 'id' | 'createdAt' | 'updatedAt' | 'actionParameters'>[];\n };\n hasLocaleValidationErrors: () => boolean;\n resetForm: () => void;\n setFormAfterSubmit: () => void;\n}\n\ninterface PermissionsProps {\n isFormDisabled?: boolean;\n onLocaleValidationChange?: (hasErrors: boolean) => void;\n permissions?: Permission[];\n layout: PermissonContracts.GetAll.Response['data'];\n userPermissions?: AuthPermission[];\n}\n\nconst Permissions = React.forwardRef<PermissionsAPI, PermissionsProps>(\n (\n { layout, isFormDisabled, onLocaleValidationChange, permissions = [], userPermissions },\n api\n ) => {\n const [{ initialData, layouts, modifiedData }, dispatch] = React.useReducer(\n reducer,\n initialState,\n () => init(layout, permissions)\n );\n const { formatMessage } = useIntl();\n\n React.useEffect(() => {\n onLocaleValidationChange?.(hasLocaleValidationErrors(modifiedData));\n }, [modifiedData, onLocaleValidationChange]);\n\n React.useImperativeHandle(api, () => {\n return {\n getPermissions() {\n const collectionTypesDiff = difference(\n initialData.collectionTypes,\n modifiedData.collectionTypes\n );\n const singleTypesDiff = difference(initialData.singleTypes, modifiedData.singleTypes);\n\n const contentTypesDiff = { ...collectionTypesDiff, ...singleTypesDiff };\n\n let didUpdateConditions;\n\n if (isEmpty(contentTypesDiff)) {\n didUpdateConditions = false;\n } else {\n didUpdateConditions = Object.values(contentTypesDiff).some((permission = {}) => {\n return Object.values(permission).some((permissionValue) =>\n has(permissionValue, 'conditions')\n );\n });\n }\n\n const permissionsToSend = formatPermissionsForAPI(modifiedData).map((perm) =>\n restoreNullLocalesIfUnchanged(perm, permissions, initialData, modifiedData)\n );\n\n return { permissionsToSend, didUpdateConditions };\n },\n hasLocaleValidationErrors() {\n return hasLocaleValidationErrors(modifiedData);\n },\n resetForm() {\n dispatch({ type: 'RESET_FORM' });\n },\n setFormAfterSubmit() {\n dispatch({ type: 'SET_FORM_AFTER_SUBMIT' });\n },\n } satisfies PermissionsAPI;\n });\n\n const handleChangeCollectionTypeLeftActionRowCheckbox = React.useCallback(\n (\n pathToCollectionType: OnChangeCollectionTypeRowLeftCheckboxAction['pathToCollectionType'],\n propertyName: OnChangeCollectionTypeRowLeftCheckboxAction['propertyName'],\n rowName: OnChangeCollectionTypeRowLeftCheckboxAction['rowName'],\n value: OnChangeCollectionTypeRowLeftCheckboxAction['value']\n ) => {\n dispatch({\n type: 'ON_CHANGE_COLLECTION_TYPE_ROW_LEFT_CHECKBOX',\n pathToCollectionType,\n propertyName,\n rowName,\n value,\n userPermissions,\n });\n },\n [userPermissions]\n );\n\n const handleChangeCollectionTypeGlobalActionCheckbox = React.useCallback(\n (\n collectionTypeKind: OnChangeCollectionTypeGlobalActionCheckboxAction['collectionTypeKind'],\n actionId: OnChangeCollectionTypeGlobalActionCheckboxAction['actionId'],\n value: OnChangeCollectionTypeGlobalActionCheckboxAction['value']\n ) => {\n dispatch({\n type: 'ON_CHANGE_COLLECTION_TYPE_GLOBAL_ACTION_CHECKBOX',\n collectionTypeKind,\n actionId,\n value,\n userPermissions,\n });\n },\n [userPermissions]\n );\n\n const handleChangeConditions = React.useCallback(\n (conditions: OnChangeConditionsAction['conditions']) => {\n dispatch({ type: 'ON_CHANGE_CONDITIONS', conditions, userPermissions });\n },\n [userPermissions]\n );\n\n const handleChangeSimpleCheckbox: PermissionsDataManagerContextValue['onChangeSimpleCheckbox'] =\n React.useCallback(\n ({ target: { name, value } }) => {\n dispatch({\n type: 'ON_CHANGE_SIMPLE_CHECKBOX',\n keys: name,\n value,\n userPermissions,\n });\n },\n [userPermissions]\n );\n\n const handleChangeParentCheckbox: PermissionsDataManagerContextValue['onChangeParentCheckbox'] =\n React.useCallback(\n ({ target: { name, value } }) => {\n dispatch({\n type: 'ON_CHANGE_TOGGLE_PARENT_CHECKBOX',\n keys: name,\n value,\n userPermissions,\n });\n },\n [userPermissions]\n );\n\n return (\n <PermissionsDataManagerProvider\n availableConditions={layout.conditions}\n modifiedData={modifiedData}\n onChangeConditions={handleChangeConditions}\n onChangeSimpleCheckbox={handleChangeSimpleCheckbox}\n onChangeParentCheckbox={handleChangeParentCheckbox}\n onChangeCollectionTypeLeftActionRowCheckbox={\n handleChangeCollectionTypeLeftActionRowCheckbox\n }\n onChangeCollectionTypeGlobalActionCheckbox={handleChangeCollectionTypeGlobalActionCheckbox}\n userPermissions={userPermissions}\n >\n <Tabs.Root defaultValue={TAB_LABELS[0].id}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'Settings.permissions.users.tabs.label',\n defaultMessage: 'Tabs Permissions',\n })}\n >\n {TAB_LABELS.map((tabLabel) => (\n <Tabs.Trigger key={tabLabel.id} value={tabLabel.id}>\n {formatMessage({ id: tabLabel.labelId, defaultMessage: tabLabel.defaultMessage })}\n </Tabs.Trigger>\n ))}\n </Tabs.List>\n <Tabs.Content value={TAB_LABELS[0].id}>\n <ContentTypes\n layout={layouts.collectionTypes}\n kind=\"collectionTypes\"\n isFormDisabled={isFormDisabled}\n />\n </Tabs.Content>\n <Tabs.Content value={TAB_LABELS[1].id}>\n <ContentTypes\n layout={layouts.singleTypes}\n kind=\"singleTypes\"\n isFormDisabled={isFormDisabled}\n />\n </Tabs.Content>\n <Tabs.Content value={TAB_LABELS[2].id}>\n <PluginsAndSettingsPermissions\n layout={layouts.plugins}\n kind=\"plugins\"\n isFormDisabled={isFormDisabled}\n />\n </Tabs.Content>\n <Tabs.Content value={TAB_LABELS[3].id}>\n <PluginsAndSettingsPermissions\n layout={layouts.settings}\n kind=\"settings\"\n isFormDisabled={isFormDisabled}\n />\n </Tabs.Content>\n </Tabs.Root>\n </PermissionsDataManagerProvider>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * reducer\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PermissionForms {\n collectionTypes: Form;\n plugins: Record<string, Form>;\n settings: Record<string, Form>;\n singleTypes: Form;\n}\n\ninterface State {\n initialData: PermissionForms;\n modifiedData: PermissionForms;\n layouts: {\n collectionTypes: PermissonContracts.ContentPermission;\n singleTypes: PermissonContracts.ContentPermission;\n plugins: GenericLayout<PermissonContracts.PluginPermission>[];\n settings: GenericLayout<PermissonContracts.SettingPermission>[];\n };\n}\n\nconst initialState = {\n initialData: {},\n modifiedData: {},\n layouts: {},\n};\n\ninterface OnChangeCollectionTypeGlobalActionCheckboxAction {\n type: 'ON_CHANGE_COLLECTION_TYPE_GLOBAL_ACTION_CHECKBOX';\n collectionTypeKind: keyof PermissionForms;\n actionId: string;\n value: boolean;\n userPermissions?: AuthPermission[];\n}\n\ninterface OnChangeCollectionTypeRowLeftCheckboxAction {\n type: 'ON_CHANGE_COLLECTION_TYPE_ROW_LEFT_CHECKBOX';\n pathToCollectionType: string;\n propertyName: string;\n rowName: string;\n value: boolean;\n userPermissions?: AuthPermission[];\n}\n\ninterface OnChangeConditionsAction {\n type: 'ON_CHANGE_CONDITIONS';\n conditions: Record<string, ConditionForm>;\n userPermissions?: AuthPermission[];\n}\n\ninterface OnChangeSimpleCheckboxAction {\n type: 'ON_CHANGE_SIMPLE_CHECKBOX';\n keys: string;\n value: boolean;\n userPermissions?: AuthPermission[];\n}\n\ninterface OnChangeToggleParentCheckbox {\n type: 'ON_CHANGE_TOGGLE_PARENT_CHECKBOX';\n keys: string;\n value: boolean;\n userPermissions?: AuthPermission[];\n}\n\ninterface ResetFormAction {\n type: 'RESET_FORM';\n}\n\ninterface SetFormAfterSubmitAction {\n type: 'SET_FORM_AFTER_SUBMIT';\n}\n\ntype Action =\n | OnChangeCollectionTypeGlobalActionCheckboxAction\n | OnChangeCollectionTypeRowLeftCheckboxAction\n | OnChangeConditionsAction\n | OnChangeSimpleCheckboxAction\n | OnChangeToggleParentCheckbox\n | ResetFormAction\n | SetFormAfterSubmitAction;\n\nconst buildInheritedConditionsFromExisting = (\n existing: unknown,\n enabledConditions: string[] = []\n): Record<string, boolean> | undefined => {\n if (!isObject(existing)) {\n return undefined;\n }\n\n const enabled = new Set(enabledConditions);\n\n return Object.keys(existing).reduce<Record<string, boolean>>((acc, key) => {\n acc[key] = enabled.has(key);\n\n return acc;\n }, {});\n};\n\nconst inheritConditionsAtPath = (\n data: unknown,\n pathToActionObject: string[],\n actionId: string,\n subject: string | null,\n userPermissions: AuthPermission[] | undefined\n) => {\n if (userPermissions === undefined) {\n return;\n }\n\n const matchingPermission = userPermissions.find(\n (perm) => perm.action === actionId && perm.subject === subject\n );\n\n if (matchingPermission === undefined) {\n return;\n }\n\n const obj = data as Record<string, unknown>;\n const existingConditions = get(obj, [...pathToActionObject, 'conditions'], undefined);\n const nextConditions = buildInheritedConditionsFromExisting(\n existingConditions,\n matchingPermission.conditions ?? []\n );\n\n if (nextConditions) {\n set(obj, [...pathToActionObject, 'conditions'], nextConditions);\n }\n};\n\n/* eslint-disable consistent-return */\nconst reducer = (state: State, action: Action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'ON_CHANGE_COLLECTION_TYPE_GLOBAL_ACTION_CHECKBOX': {\n const { collectionTypeKind, actionId, value, userPermissions } = action;\n const pathToData = ['modifiedData', collectionTypeKind];\n\n Object.keys(get(state, pathToData)).forEach((collectionType) => {\n const collectionTypeActionData = get(\n state,\n [...pathToData, collectionType, actionId],\n undefined\n );\n\n if (collectionTypeActionData) {\n const subjectPermissionChecker = createFieldPermissionChecker(\n actionId,\n collectionType,\n userPermissions\n );\n\n let updatedValues = updateValuesWithPermissions(\n collectionTypeActionData,\n value,\n subjectPermissionChecker\n );\n\n if (value === true) {\n inheritConditionsAtPath(updatedValues, [], actionId, collectionType, userPermissions);\n }\n\n if (value === false && updatedValues.conditions !== undefined) {\n // @ts-expect-error – TODO: type better\n const updatedConditions = updateValues(updatedValues.conditions, false);\n\n updatedValues = { ...updatedValues, conditions: updatedConditions };\n }\n\n set(draftState, [...pathToData, collectionType, actionId], updatedValues);\n }\n });\n\n break;\n }\n case 'ON_CHANGE_COLLECTION_TYPE_ROW_LEFT_CHECKBOX': {\n const { pathToCollectionType, propertyName, rowName, value, userPermissions } = action;\n let nextModifiedDataState = cloneDeep(state.modifiedData);\n const pathToModifiedDataCollectionType = pathToCollectionType.split('..');\n\n const objToUpdate = get(nextModifiedDataState, pathToModifiedDataCollectionType, {});\n\n const subject =\n pathToModifiedDataCollectionType[pathToModifiedDataCollectionType.length - 1];\n\n Object.keys(objToUpdate).forEach((actionId) => {\n if (has(objToUpdate[actionId], `properties.${propertyName}`)) {\n const objValue = get(objToUpdate, [actionId, 'properties', propertyName, rowName]);\n const pathToDataToSet = [\n ...pathToModifiedDataCollectionType,\n actionId,\n 'properties',\n propertyName,\n rowName,\n ];\n\n if (!isObject(objValue)) {\n if (userPermissions !== undefined && propertyName === 'fields') {\n const hasPermission = userPermissions.some((perm) => {\n if (perm.action !== actionId || perm.subject !== subject) return false;\n\n const fields = perm.properties?.fields;\n if (fields === null || fields === undefined) return true;\n if (Array.isArray(fields) && fields.length === 0) return false;\n\n return (\n Array.isArray(fields) &&\n fields.some((f) => rowName === f || rowName.startsWith(`${f}.`))\n );\n });\n\n if (hasPermission === true) {\n set(nextModifiedDataState, pathToDataToSet, value);\n if (value === true) {\n inheritConditionsAtPath(\n nextModifiedDataState,\n [...pathToModifiedDataCollectionType, actionId],\n actionId,\n subject,\n userPermissions\n );\n }\n }\n } else {\n set(nextModifiedDataState, pathToDataToSet, value);\n if (value === true && userPermissions !== undefined) {\n inheritConditionsAtPath(\n nextModifiedDataState,\n [...pathToModifiedDataCollectionType, actionId],\n actionId,\n subject,\n userPermissions\n );\n }\n }\n } else {\n const permissionChecker =\n userPermissions !== undefined && propertyName === 'fields'\n ? (path: string[]) => {\n const fullFieldPath = [rowName, ...path].join('.');\n const checker = createFieldPermissionChecker(\n actionId,\n subject,\n userPermissions\n );\n return checker === undefined\n ? true\n : checker(['properties', 'fields', fullFieldPath]);\n }\n : undefined;\n\n const updatedValue = updateValuesWithPermissions(objValue, value, permissionChecker);\n\n set(nextModifiedDataState, pathToDataToSet, updatedValue);\n if (value === true && userPermissions !== undefined) {\n inheritConditionsAtPath(\n nextModifiedDataState,\n [...pathToModifiedDataCollectionType, actionId],\n actionId,\n subject,\n userPermissions\n );\n }\n }\n }\n });\n\n if (value === false) {\n // @ts-expect-error – TODO: type better\n nextModifiedDataState = updateConditionsToFalse(nextModifiedDataState);\n }\n\n set(draftState, 'modifiedData', nextModifiedDataState);\n\n break;\n }\n case 'ON_CHANGE_CONDITIONS': {\n // In App Token context, conditions are inherited from the user's permissions and must be read-only.\n if (action.userPermissions !== undefined) {\n break;\n }\n\n Object.entries(action.conditions).forEach((array) => {\n const [stringPathToData, conditionsToUpdate] = array;\n\n set(\n draftState,\n ['modifiedData', ...stringPathToData.split('..'), 'conditions'],\n conditionsToUpdate\n );\n });\n\n break;\n }\n case 'ON_CHANGE_SIMPLE_CHECKBOX': {\n let nextModifiedDataState = cloneDeep(state.modifiedData);\n\n const keysArray = action.keys.split('..');\n set(nextModifiedDataState, [...keysArray], action.value);\n\n // In App Token context, when enabling a permission, inherit the user's conditions.\n if (action.value === true && action.userPermissions !== undefined) {\n const propertiesIndex = keysArray.indexOf('properties');\n\n if (propertiesIndex > 0) {\n const actionId = keysArray[propertiesIndex - 1];\n const root = keysArray[0];\n\n if ((root === 'collectionTypes' || root === 'singleTypes') && keysArray.length >= 3) {\n const subject = keysArray[1];\n inheritConditionsAtPath(\n nextModifiedDataState,\n [root, subject, actionId],\n actionId,\n subject,\n action.userPermissions\n );\n } else {\n const pathToActionObject = keysArray.slice(0, propertiesIndex);\n inheritConditionsAtPath(\n nextModifiedDataState,\n pathToActionObject,\n actionId,\n null,\n action.userPermissions\n );\n }\n }\n }\n\n if (action.value === false) {\n // @ts-expect-error – TODO: type better\n nextModifiedDataState = updateConditionsToFalse(nextModifiedDataState);\n }\n\n set(draftState, 'modifiedData', nextModifiedDataState);\n\n break;\n }\n /*\n * Here the idea is to retrieve a specific value of the modifiedObject\n * then update all the boolean values of the retrieved one\n * and update the drafState.\n *\n * For instance in order to enable create action for all the fields and locales\n * of the restaurant content type we need to :\n * 1. Retrieve the modifiedData.collectionTypes.restaurant.create object\n * 2. Toggle all the end boolean values to the desired one\n * 3. Update the draftState\n *\n * Since the case works well in order to update what we called \"parent\" checkbox. We can\n * reuse the action when we need to toggle change all the values that depends on this one.\n * A parent checkbox is a checkbox which value is not a boolean but depends on its children ones, therefore,\n * a parent checkbox does not have a represented value in the draftState, they are just helpers.\n *\n * Given the following data:\n *\n * const data = {\n * restaurant: {\n * create: {\n * fields: { name: true },\n * locales: { en: false }\n * }\n * }\n * }\n *\n * The value of the create checkbox for the restaurant will be ƒalse since not all its children have\n * truthy values and in order to set its value to true when need to have all the values of its children set to true.\n *\n * Similarly, we can reuse the logic for the components attributes\n *\n */\n case 'ON_CHANGE_TOGGLE_PARENT_CHECKBOX': {\n const { keys, value, userPermissions } = action;\n const pathToValue = [...keys.split('..')];\n let nextModifiedDataState = cloneDeep(state.modifiedData);\n const oldValues = get(nextModifiedDataState, pathToValue, {});\n\n const root = pathToValue[0];\n // Plugin & setting permissions are stored with `subject: null` and their real\n // action id is the full `plugin::`/`admin::` leaf segment (not the UI subcategory).\n // For those, let the checker derive the action from each leaf path (subject stays null).\n const isPluginOrSetting = root === 'plugins' || root === 'settings';\n\n let actionId: string | undefined;\n let subject: string | null | undefined;\n\n if (isPluginOrSetting) {\n subject = null;\n } else {\n if (pathToValue.length >= 2) {\n subject = pathToValue[1];\n }\n\n if (pathToValue.length >= 3) {\n actionId = pathToValue[2];\n }\n }\n\n const permissionChecker = createDynamicActionPermissionChecker(\n subject,\n actionId,\n userPermissions\n );\n\n const updatedValues = updateValuesWithPermissions(oldValues, value, permissionChecker);\n\n // In App Token context, when enabling, inherit conditions from the user's permissions.\n if (value === true && userPermissions !== undefined) {\n const subjectForLookup =\n root === 'collectionTypes' || root === 'singleTypes' ? (subject ?? null) : null;\n\n if (actionId !== undefined && subjectForLookup !== null) {\n inheritConditionsAtPath(updatedValues, [], actionId, subjectForLookup, userPermissions);\n } else if (isObject(updatedValues)) {\n const updatedValuesObj = updatedValues as Record<string, unknown>;\n\n Object.keys(updatedValuesObj).forEach((key) => {\n const maybeActionObj = updatedValuesObj[key];\n if (isObject(maybeActionObj)) {\n inheritConditionsAtPath(maybeActionObj, [], key, subjectForLookup, userPermissions);\n }\n });\n }\n }\n\n set(nextModifiedDataState, pathToValue, updatedValues);\n\n if (value === false) {\n // @ts-expect-error – TODO: type better\n nextModifiedDataState = updateConditionsToFalse(nextModifiedDataState);\n }\n\n set(draftState, ['modifiedData'], nextModifiedDataState);\n\n break;\n }\n case 'RESET_FORM': {\n draftState.modifiedData = state.initialData;\n break;\n }\n case 'SET_FORM_AFTER_SUBMIT': {\n draftState.initialData = state.modifiedData;\n break;\n }\n default:\n return draftState;\n }\n });\n\n/* -------------------------------------------------------------------------------------------------\n * restoreNullLocalesIfUnchanged\n * Extracted at module level to avoid nesting arrow functions more than 4 levels deep inside\n * the useImperativeHandle → getPermissions → map chain.\n * -----------------------------------------------------------------------------------------------*/\n\ntype SentPermission = Omit<Permission, 'id' | 'createdAt' | 'updatedAt' | 'actionParameters'>;\n\nconst restoreNullLocalesIfUnchanged = (\n perm: SentPermission,\n originalPermissions: Permission[],\n initialData: PermissionForms,\n modifiedData: PermissionForms\n): SentPermission => {\n if (!perm.subject) return perm;\n\n const original = originalPermissions.find(\n (p) => p.action === perm.action && p.subject === perm.subject\n );\n\n // null means \"all locales\" in legacy DBs — preserve it if the user hasn't changed anything\n if (original?.properties?.locales !== null) return perm;\n\n const kind =\n perm.subject in modifiedData.collectionTypes\n ? ('collectionTypes' as const)\n : perm.subject in modifiedData.singleTypes\n ? ('singleTypes' as const)\n : null;\n if (!kind) return perm;\n\n const initialActionForm = initialData[kind]?.[perm.subject]?.[perm.action];\n const modifiedActionForm = modifiedData[kind]?.[perm.subject]?.[perm.action];\n\n if (!initialActionForm || !modifiedActionForm) return perm;\n\n const initialLocaleEntry = (initialActionForm.properties as PropertyChildForm)['locales'];\n const modifiedLocaleEntry = (modifiedActionForm.properties as PropertyChildForm)['locales'];\n\n if (\n !initialLocaleEntry ||\n typeof initialLocaleEntry === 'boolean' ||\n !modifiedLocaleEntry ||\n typeof modifiedLocaleEntry === 'boolean'\n ) {\n return perm;\n }\n\n const localesUnchanged =\n Object.keys(initialLocaleEntry).length === Object.keys(modifiedLocaleEntry).length &&\n Object.entries(initialLocaleEntry).every(\n ([locale, val]) => modifiedLocaleEntry[locale] === val\n );\n\n if (!localesUnchanged) return perm;\n\n return { ...perm, properties: { ...perm.properties, locales: null } };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * init (reducer)\n * -----------------------------------------------------------------------------------------------*/\n\nconst init = (\n layout: PermissionsProps['layout'],\n permissions: PermissionsProps['permissions']\n): State => {\n const {\n conditions,\n sections: { collectionTypes, singleTypes, plugins, settings },\n } = layout;\n\n const layouts = {\n collectionTypes,\n singleTypes,\n plugins: formatLayout(plugins, 'plugin'),\n settings: formatLayout(settings, 'category'),\n };\n\n const defaultForm = {\n collectionTypes: createDefaultCTForm(collectionTypes, conditions, permissions),\n singleTypes: createDefaultCTForm(singleTypes, conditions, permissions),\n plugins: createDefaultForm(layouts.plugins, conditions, permissions),\n settings: createDefaultForm(layouts.settings, conditions, permissions),\n };\n\n return {\n initialData: defaultForm,\n modifiedData: defaultForm,\n layouts,\n };\n};\n\nexport { Permissions };\nexport type {\n State,\n OnChangeCollectionTypeRowLeftCheckboxAction,\n OnChangeConditionsAction,\n OnChangeCollectionTypeGlobalActionCheckboxAction,\n};\n"],"names":["TAB_LABELS","labelId","defaultMessage","id","Permissions","React","forwardRef","layout","isFormDisabled","onLocaleValidationChange","permissions","userPermissions","api","initialData","layouts","modifiedData","dispatch","useReducer","reducer","initialState","init","formatMessage","useIntl","useEffect","hasLocaleValidationErrors","useImperativeHandle","getPermissions","collectionTypesDiff","difference","collectionTypes","singleTypesDiff","singleTypes","contentTypesDiff","didUpdateConditions","isEmpty","Object","values","some","permission","permissionValue","has","permissionsToSend","formatPermissionsForAPI","map","perm","restoreNullLocalesIfUnchanged","resetForm","type","setFormAfterSubmit","handleChangeCollectionTypeLeftActionRowCheckbox","useCallback","pathToCollectionType","propertyName","rowName","value","handleChangeCollectionTypeGlobalActionCheckbox","collectionTypeKind","actionId","handleChangeConditions","conditions","handleChangeSimpleCheckbox","target","name","keys","handleChangeParentCheckbox","_jsx","PermissionsDataManagerProvider","availableConditions","onChangeConditions","onChangeSimpleCheckbox","onChangeParentCheckbox","onChangeCollectionTypeLeftActionRowCheckbox","onChangeCollectionTypeGlobalActionCheckbox","_jsxs","Tabs","Root","defaultValue","List","aria-label","tabLabel","Trigger","Content","ContentTypes","kind","PluginsAndSettingsPermissions","plugins","settings","buildInheritedConditionsFromExisting","existing","enabledConditions","isObject","undefined","enabled","Set","reduce","acc","key","inheritConditionsAtPath","data","pathToActionObject","subject","matchingPermission","find","action","obj","existingConditions","get","nextConditions","set","state","produce","draftState","pathToData","forEach","collectionType","collectionTypeActionData","subjectPermissionChecker","createFieldPermissionChecker","updatedValues","updateValuesWithPermissions","updatedConditions","updateValues","nextModifiedDataState","cloneDeep","pathToModifiedDataCollectionType","split","objToUpdate","length","objValue","pathToDataToSet","hasPermission","fields","properties","Array","isArray","f","startsWith","permissionChecker","path","fullFieldPath","join","checker","updatedValue","updateConditionsToFalse","entries","array","stringPathToData","conditionsToUpdate","keysArray","propertiesIndex","indexOf","root","slice","pathToValue","oldValues","isPluginOrSetting","createDynamicActionPermissionChecker","subjectForLookup","updatedValuesObj","maybeActionObj","originalPermissions","original","p","locales","initialActionForm","modifiedActionForm","initialLocaleEntry","modifiedLocaleEntry","localesUnchanged","every","locale","val","sections","formatLayout","defaultForm","createDefaultCTForm","createDefaultForm"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwCA,MAAMA,UAAAA,GAAa;AACjB,IAAA;QACEC,OAAAA,EAAS,sDAAA;QACTC,cAAAA,EAAgB,kBAAA;QAChBC,EAAAA,EAAI;AACN,KAAA;AACA,IAAA;QACEF,OAAAA,EAAS,kDAAA;QACTE,EAAAA,EAAI,aAAA;QACJD,cAAAA,EAAgB;AAClB,KAAA;AACA,IAAA;QACED,OAAAA,EAAS,8CAAA;QACTC,cAAAA,EAAgB,SAAA;QAChBC,EAAAA,EAAI;AACN,KAAA;AACA,IAAA;QACEF,OAAAA,EAAS,+CAAA;QACTC,cAAAA,EAAgB,UAAA;QAChBC,EAAAA,EAAI;AACN;AACD,CAAA;AAwBD,MAAMC,4BAAcC,KAAAA,CAAMC,UAAU,CAClC,CACE,EAAEC,MAAM,EAAEC,cAAc,EAAEC,wBAAwB,EAAEC,WAAAA,GAAc,EAAE,EAAEC,eAAe,EAAE,EACvFC,GAAAA,GAAAA;AAEA,IAAA,MAAM,CAAC,EAAEC,WAAW,EAAEC,OAAO,EAAEC,YAAY,EAAE,EAAEC,QAAAA,CAAS,GAAGX,MAAMY,UAAU,CACzEC,SACAC,YAAAA,EACA,IAAMC,KAAKb,MAAAA,EAAQG,WAAAA,CAAAA,CAAAA;IAErB,MAAM,EAAEW,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1BjB,IAAAA,KAAAA,CAAMkB,SAAS,CAAC,IAAA;AACdd,QAAAA,wBAAAA,GAA2Be,yBAAAA,CAA0BT,YAAAA,CAAAA,CAAAA;IACvD,CAAA,EAAG;AAACA,QAAAA,YAAAA;AAAcN,QAAAA;AAAyB,KAAA,CAAA;IAE3CJ,KAAAA,CAAMoB,mBAAmB,CAACb,GAAAA,EAAK,IAAA;QAC7B,OAAO;AACLc,YAAAA,cAAAA,CAAAA,GAAAA;AACE,gBAAA,MAAMC,sBAAsBC,UAAAA,CAC1Bf,WAAAA,CAAYgB,eAAe,EAC3Bd,aAAac,eAAe,CAAA;AAE9B,gBAAA,MAAMC,kBAAkBF,UAAAA,CAAWf,WAAAA,CAAYkB,WAAW,EAAEhB,aAAagB,WAAW,CAAA;AAEpF,gBAAA,MAAMC,gBAAAA,GAAmB;AAAE,oBAAA,GAAGL,mBAAmB;AAAE,oBAAA,GAAGG;AAAgB,iBAAA;gBAEtE,IAAIG,mBAAAA;AAEJ,gBAAA,IAAIC,QAAQF,gBAAAA,CAAAA,EAAmB;oBAC7BC,mBAAAA,GAAsB,KAAA;gBACxB,CAAA,MAAO;oBACLA,mBAAAA,GAAsBE,MAAAA,CAAOC,MAAM,CAACJ,gBAAAA,CAAAA,CAAkBK,IAAI,CAAC,CAACC,UAAAA,GAAa,EAAE,GAAA;wBACzE,OAAOH,MAAAA,CAAOC,MAAM,CAACE,UAAAA,CAAAA,CAAYD,IAAI,CAAC,CAACE,eAAAA,GACrCC,GAAAA,CAAID,eAAAA,EAAiB,YAAA,CAAA,CAAA;AAEzB,oBAAA,CAAA,CAAA;AACF,gBAAA;gBAEA,MAAME,iBAAAA,GAAoBC,uBAAAA,CAAwB3B,YAAAA,CAAAA,CAAc4B,GAAG,CAAC,CAACC,IAAAA,GACnEC,6BAAAA,CAA8BD,IAAAA,EAAMlC,WAAAA,EAAaG,WAAAA,EAAaE,YAAAA,CAAAA,CAAAA;gBAGhE,OAAO;AAAE0B,oBAAAA,iBAAAA;AAAmBR,oBAAAA;AAAoB,iBAAA;AAClD,YAAA,CAAA;AACAT,YAAAA,yBAAAA,CAAAA,GAAAA;AACE,gBAAA,OAAOA,yBAAAA,CAA0BT,YAAAA,CAAAA;AACnC,YAAA,CAAA;AACA+B,YAAAA,SAAAA,CAAAA,GAAAA;gBACE9B,QAAAA,CAAS;oBAAE+B,IAAAA,EAAM;AAAa,iBAAA,CAAA;AAChC,YAAA,CAAA;AACAC,YAAAA,kBAAAA,CAAAA,GAAAA;gBACEhC,QAAAA,CAAS;oBAAE+B,IAAAA,EAAM;AAAwB,iBAAA,CAAA;AAC3C,YAAA;AACF,SAAA;AACF,IAAA,CAAA,CAAA;AAEA,IAAA,MAAME,kDAAkD5C,KAAAA,CAAM6C,WAAW,CACvE,CACEC,oBAAAA,EACAC,cACAC,OAAAA,EACAC,KAAAA,GAAAA;QAEAtC,QAAAA,CAAS;YACP+B,IAAAA,EAAM,6CAAA;AACNI,YAAAA,oBAAAA;AACAC,YAAAA,YAAAA;AACAC,YAAAA,OAAAA;AACAC,YAAAA,KAAAA;AACA3C,YAAAA;AACF,SAAA,CAAA;IACF,CAAA,EACA;AAACA,QAAAA;AAAgB,KAAA,CAAA;AAGnB,IAAA,MAAM4C,iDAAiDlD,KAAAA,CAAM6C,WAAW,CACtE,CACEM,oBACAC,QAAAA,EACAH,KAAAA,GAAAA;QAEAtC,QAAAA,CAAS;YACP+B,IAAAA,EAAM,kDAAA;AACNS,YAAAA,kBAAAA;AACAC,YAAAA,QAAAA;AACAH,YAAAA,KAAAA;AACA3C,YAAAA;AACF,SAAA,CAAA;IACF,CAAA,EACA;AAACA,QAAAA;AAAgB,KAAA,CAAA;AAGnB,IAAA,MAAM+C,sBAAAA,GAAyBrD,KAAAA,CAAM6C,WAAW,CAC9C,CAACS,UAAAA,GAAAA;QACC3C,QAAAA,CAAS;YAAE+B,IAAAA,EAAM,sBAAA;AAAwBY,YAAAA,UAAAA;AAAYhD,YAAAA;AAAgB,SAAA,CAAA;IACvE,CAAA,EACA;AAACA,QAAAA;AAAgB,KAAA,CAAA;AAGnB,IAAA,MAAMiD,0BAAAA,GACJvD,KAAAA,CAAM6C,WAAW,CACf,CAAC,EAAEW,MAAAA,EAAQ,EAAEC,IAAI,EAAER,KAAK,EAAE,EAAE,GAAA;QAC1BtC,QAAAA,CAAS;YACP+B,IAAAA,EAAM,2BAAA;YACNgB,IAAAA,EAAMD,IAAAA;AACNR,YAAAA,KAAAA;AACA3C,YAAAA;AACF,SAAA,CAAA;IACF,CAAA,EACA;AAACA,QAAAA;AAAgB,KAAA,CAAA;AAGrB,IAAA,MAAMqD,0BAAAA,GACJ3D,KAAAA,CAAM6C,WAAW,CACf,CAAC,EAAEW,MAAAA,EAAQ,EAAEC,IAAI,EAAER,KAAK,EAAE,EAAE,GAAA;QAC1BtC,QAAAA,CAAS;YACP+B,IAAAA,EAAM,kCAAA;YACNgB,IAAAA,EAAMD,IAAAA;AACNR,YAAAA,KAAAA;AACA3C,YAAAA;AACF,SAAA,CAAA;IACF,CAAA,EACA;AAACA,QAAAA;AAAgB,KAAA,CAAA;AAGrB,IAAA,qBACEsD,GAAA,CAACC,8BAAAA,EAAAA;AACCC,QAAAA,mBAAAA,EAAqB5D,OAAOoD,UAAU;QACtC5C,YAAAA,EAAcA,YAAAA;QACdqD,kBAAAA,EAAoBV,sBAAAA;QACpBW,sBAAAA,EAAwBT,0BAAAA;QACxBU,sBAAAA,EAAwBN,0BAAAA;QACxBO,2CAAAA,EACEtB,+CAAAA;QAEFuB,0CAAAA,EAA4CjB,8CAAAA;QAC5C5C,eAAAA,EAAiBA,eAAAA;gCAEjB8D,IAAA,CAACC,KAAKC,IAAI,EAAA;AAACC,YAAAA,YAAAA,EAAc5E,UAAU,CAAC,CAAA,CAAE,CAACG,EAAE;;AACvC,8BAAA8D,GAAA,CAACS,KAAKG,IAAI,EAAA;AACRC,oBAAAA,YAAAA,EAAYzD,aAAAA,CAAc;wBACxBlB,EAAAA,EAAI,uCAAA;wBACJD,cAAAA,EAAgB;AAClB,qBAAA,CAAA;AAECF,oBAAAA,QAAAA,EAAAA,UAAAA,CAAW2C,GAAG,CAAC,CAACoC,QAAAA,iBACfd,GAAA,CAACS,KAAKM,OAAO,EAAA;AAAmB1B,4BAAAA,KAAAA,EAAOyB,SAAS5E,EAAE;sCAC/CkB,aAAAA,CAAc;AAAElB,gCAAAA,EAAAA,EAAI4E,SAAS9E,OAAO;AAAEC,gCAAAA,cAAAA,EAAgB6E,SAAS7E;AAAe,6BAAA;AAD9D6E,yBAAAA,EAAAA,QAAAA,CAAS5E,EAAE,CAAA;;AAKlC,8BAAA8D,GAAA,CAACS,KAAKO,OAAO,EAAA;AAAC3B,oBAAAA,KAAAA,EAAOtD,UAAU,CAAC,CAAA,CAAE,CAACG,EAAE;AACnC,oBAAA,QAAA,gBAAA8D,GAAA,CAACiB,YAAAA,EAAAA;AACC3E,wBAAAA,MAAAA,EAAQO,QAAQe,eAAe;wBAC/BsD,IAAAA,EAAK,iBAAA;wBACL3E,cAAAA,EAAgBA;;;AAGpB,8BAAAyD,GAAA,CAACS,KAAKO,OAAO,EAAA;AAAC3B,oBAAAA,KAAAA,EAAOtD,UAAU,CAAC,CAAA,CAAE,CAACG,EAAE;AACnC,oBAAA,QAAA,gBAAA8D,GAAA,CAACiB,YAAAA,EAAAA;AACC3E,wBAAAA,MAAAA,EAAQO,QAAQiB,WAAW;wBAC3BoD,IAAAA,EAAK,aAAA;wBACL3E,cAAAA,EAAgBA;;;AAGpB,8BAAAyD,GAAA,CAACS,KAAKO,OAAO,EAAA;AAAC3B,oBAAAA,KAAAA,EAAOtD,UAAU,CAAC,CAAA,CAAE,CAACG,EAAE;AACnC,oBAAA,QAAA,gBAAA8D,GAAA,CAACmB,6BAAAA,EAAAA;AACC7E,wBAAAA,MAAAA,EAAQO,QAAQuE,OAAO;wBACvBF,IAAAA,EAAK,SAAA;wBACL3E,cAAAA,EAAgBA;;;AAGpB,8BAAAyD,GAAA,CAACS,KAAKO,OAAO,EAAA;AAAC3B,oBAAAA,KAAAA,EAAOtD,UAAU,CAAC,CAAA,CAAE,CAACG,EAAE;AACnC,oBAAA,QAAA,gBAAA8D,GAAA,CAACmB,6BAAAA,EAAAA;AACC7E,wBAAAA,MAAAA,EAAQO,QAAQwE,QAAQ;wBACxBH,IAAAA,EAAK,UAAA;wBACL3E,cAAAA,EAAgBA;;;;;;AAM5B,CAAA;AAyBF,MAAMW,YAAAA,GAAe;AACnBN,IAAAA,WAAAA,EAAa,EAAC;AACdE,IAAAA,YAAAA,EAAc,EAAC;AACfD,IAAAA,OAAAA,EAAS;AACX,CAAA;AAwDA,MAAMyE,oCAAAA,GAAuC,CAC3CC,QAAAA,EACAC,iBAAAA,GAA8B,EAAE,GAAA;IAEhC,IAAI,CAACC,SAASF,QAAAA,CAAAA,EAAW;QACvB,OAAOG,SAAAA;AACT,IAAA;IAEA,MAAMC,OAAAA,GAAU,IAAIC,GAAAA,CAAIJ,iBAAAA,CAAAA;AAExB,IAAA,OAAOtD,OAAO4B,IAAI,CAACyB,UAAUM,MAAM,CAA0B,CAACC,GAAAA,EAAKC,GAAAA,GAAAA;AACjED,QAAAA,GAAG,CAACC,GAAAA,CAAI,GAAGJ,OAAAA,CAAQpD,GAAG,CAACwD,GAAAA,CAAAA;QAEvB,OAAOD,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACN,CAAA;AAEA,MAAME,uBAAAA,GAA0B,CAC9BC,IAAAA,EACAC,kBAAAA,EACA1C,UACA2C,OAAAA,EACAzF,eAAAA,GAAAA;AAEA,IAAA,IAAIA,oBAAoBgF,SAAAA,EAAW;AACjC,QAAA;AACF,IAAA;AAEA,IAAA,MAAMU,kBAAAA,GAAqB1F,eAAAA,CAAgB2F,IAAI,CAC7C,CAAC1D,IAAAA,GAASA,IAAAA,CAAK2D,MAAM,KAAK9C,QAAAA,IAAYb,IAAAA,CAAKwD,OAAO,KAAKA,OAAAA,CAAAA;AAGzD,IAAA,IAAIC,uBAAuBV,SAAAA,EAAW;AACpC,QAAA;AACF,IAAA;AAEA,IAAA,MAAMa,GAAAA,GAAMN,IAAAA;IACZ,MAAMO,kBAAAA,GAAqBC,IAAIF,GAAAA,EAAK;AAAIL,QAAAA,GAAAA,kBAAAA;AAAoB,QAAA;KAAa,EAAER,SAAAA,CAAAA;AAC3E,IAAA,MAAMgB,iBAAiBpB,oCAAAA,CACrBkB,kBAAAA,EACAJ,kBAAAA,CAAmB1C,UAAU,IAAI,EAAE,CAAA;AAGrC,IAAA,IAAIgD,cAAAA,EAAgB;AAClBC,QAAAA,GAAAA,CAAIJ,GAAAA,EAAK;AAAIL,YAAAA,GAAAA,kBAAAA;AAAoB,YAAA;SAAa,EAAEQ,cAAAA,CAAAA;AAClD,IAAA;AACF,CAAA;AAEA,uCACA,MAAMzF,OAAAA,GAAU,CAAC2F,OAAcN,MAAAA,GAC7BO,OAAAA,CAAQD,OAAO,CAACE,UAAAA,GAAAA;AACd,QAAA,OAAQR,OAAOxD,IAAI;YACjB,KAAK,kDAAA;AAAoD,gBAAA;oBACvD,MAAM,EAAES,kBAAkB,EAAEC,QAAQ,EAAEH,KAAK,EAAE3C,eAAe,EAAE,GAAG4F,MAAAA;AACjE,oBAAA,MAAMS,UAAAA,GAAa;AAAC,wBAAA,cAAA;AAAgBxD,wBAAAA;AAAmB,qBAAA;AAEvDrB,oBAAAA,MAAAA,CAAO4B,IAAI,CAAC2C,GAAAA,CAAIG,OAAOG,UAAAA,CAAAA,CAAAA,CAAaC,OAAO,CAAC,CAACC,cAAAA,GAAAA;wBAC3C,MAAMC,wBAAAA,GAA2BT,IAC/BG,KAAAA,EACA;AAAIG,4BAAAA,GAAAA,UAAAA;AAAYE,4BAAAA,cAAAA;AAAgBzD,4BAAAA;yBAAS,EACzCkC,SAAAA,CAAAA;AAGF,wBAAA,IAAIwB,wBAAAA,EAA0B;4BAC5B,MAAMC,wBAAAA,GAA2BC,4BAAAA,CAC/B5D,QAAAA,EACAyD,cAAAA,EACAvG,eAAAA,CAAAA;4BAGF,IAAI2G,aAAAA,GAAgBC,2BAAAA,CAClBJ,wBAAAA,EACA7D,KAAAA,EACA8D,wBAAAA,CAAAA;AAGF,4BAAA,IAAI9D,UAAU,IAAA,EAAM;AAClB2C,gCAAAA,uBAAAA,CAAwBqB,aAAAA,EAAe,EAAE,EAAE7D,QAAAA,EAAUyD,cAAAA,EAAgBvG,eAAAA,CAAAA;AACvE,4BAAA;AAEA,4BAAA,IAAI2C,KAAAA,KAAU,KAAA,IAASgE,aAAAA,CAAc3D,UAAU,KAAKgC,SAAAA,EAAW;;AAE7D,gCAAA,MAAM6B,iBAAAA,GAAoBC,YAAAA,CAAaH,aAAAA,CAAc3D,UAAU,EAAE,KAAA,CAAA;gCAEjE2D,aAAAA,GAAgB;AAAE,oCAAA,GAAGA,aAAa;oCAAE3D,UAAAA,EAAY6D;AAAkB,iCAAA;AACpE,4BAAA;AAEAZ,4BAAAA,GAAAA,CAAIG,UAAAA,EAAY;AAAIC,gCAAAA,GAAAA,UAAAA;AAAYE,gCAAAA,cAAAA;AAAgBzD,gCAAAA;6BAAS,EAAE6D,aAAAA,CAAAA;AAC7D,wBAAA;AACF,oBAAA,CAAA,CAAA;AAEA,oBAAA;AACF,gBAAA;YACA,KAAK,6CAAA;AAA+C,gBAAA;oBAClD,MAAM,EAAEnE,oBAAoB,EAAEC,YAAY,EAAEC,OAAO,EAAEC,KAAK,EAAE3C,eAAe,EAAE,GAAG4F,MAAAA;oBAChF,IAAImB,qBAAAA,GAAwBC,SAAAA,CAAUd,KAAAA,CAAM9F,YAAY,CAAA;oBACxD,MAAM6G,gCAAAA,GAAmCzE,oBAAAA,CAAqB0E,KAAK,CAAC,IAAA,CAAA;AAEpE,oBAAA,MAAMC,WAAAA,GAAcpB,GAAAA,CAAIgB,qBAAAA,EAAuBE,gCAAAA,EAAkC,EAAC,CAAA;AAElF,oBAAA,MAAMxB,UACJwB,gCAAgC,CAACA,gCAAAA,CAAiCG,MAAM,GAAG,CAAA,CAAE;AAE/E5F,oBAAAA,MAAAA,CAAO4B,IAAI,CAAC+D,WAAAA,CAAAA,CAAab,OAAO,CAAC,CAACxD,QAAAA,GAAAA;wBAChC,IAAIjB,GAAAA,CAAIsF,WAAW,CAACrE,QAAAA,CAAS,EAAE,CAAC,WAAW,EAAEL,YAAAA,CAAAA,CAAc,CAAA,EAAG;4BAC5D,MAAM4E,QAAAA,GAAWtB,IAAIoB,WAAAA,EAAa;AAACrE,gCAAAA,QAAAA;AAAU,gCAAA,YAAA;AAAcL,gCAAAA,YAAAA;AAAcC,gCAAAA;AAAQ,6BAAA,CAAA;AACjF,4BAAA,MAAM4E,eAAAA,GAAkB;AACnBL,gCAAAA,GAAAA,gCAAAA;AACHnE,gCAAAA,QAAAA;AACA,gCAAA,YAAA;AACAL,gCAAAA,YAAAA;AACAC,gCAAAA;AACD,6BAAA;4BAED,IAAI,CAACqC,SAASsC,QAAAA,CAAAA,EAAW;gCACvB,IAAIrH,eAAAA,KAAoBgF,SAAAA,IAAavC,YAAAA,KAAiB,QAAA,EAAU;AAC9D,oCAAA,MAAM8E,aAAAA,GAAgBvH,eAAAA,CAAgB0B,IAAI,CAAC,CAACO,IAAAA,GAAAA;wCAC1C,IAAIA,IAAAA,CAAK2D,MAAM,KAAK9C,QAAAA,IAAYb,KAAKwD,OAAO,KAAKA,SAAS,OAAO,KAAA;wCAEjE,MAAM+B,MAAAA,GAASvF,IAAAA,CAAKwF,UAAU,EAAED,MAAAA;AAChC,wCAAA,IAAIA,MAAAA,KAAW,IAAA,IAAQA,MAAAA,KAAWxC,SAAAA,EAAW,OAAO,IAAA;wCACpD,IAAI0C,KAAAA,CAAMC,OAAO,CAACH,MAAAA,CAAAA,IAAWA,OAAOJ,MAAM,KAAK,GAAG,OAAO,KAAA;AAEzD,wCAAA,OACEM,MAAMC,OAAO,CAACH,MAAAA,CAAAA,IACdA,MAAAA,CAAO9F,IAAI,CAAC,CAACkG,CAAAA,GAAMlF,OAAAA,KAAYkF,KAAKlF,OAAAA,CAAQmF,UAAU,CAAC,CAAA,EAAGD,CAAAA,CAAE,CAAC,CAAC,CAAA,CAAA;AAElE,oCAAA,CAAA,CAAA;AAEA,oCAAA,IAAIL,kBAAkB,IAAA,EAAM;AAC1BtB,wCAAAA,GAAAA,CAAIc,uBAAuBO,eAAAA,EAAiB3E,KAAAA,CAAAA;AAC5C,wCAAA,IAAIA,UAAU,IAAA,EAAM;AAClB2C,4CAAAA,uBAAAA,CACEyB,qBAAAA,EACA;AAAIE,gDAAAA,GAAAA,gCAAAA;AAAkCnE,gDAAAA;AAAS,6CAAA,EAC/CA,UACA2C,OAAAA,EACAzF,eAAAA,CAAAA;AAEJ,wCAAA;AACF,oCAAA;gCACF,CAAA,MAAO;AACLiG,oCAAAA,GAAAA,CAAIc,uBAAuBO,eAAAA,EAAiB3E,KAAAA,CAAAA;oCAC5C,IAAIA,KAAAA,KAAU,IAAA,IAAQ3C,eAAAA,KAAoBgF,SAAAA,EAAW;AACnDM,wCAAAA,uBAAAA,CACEyB,qBAAAA,EACA;AAAIE,4CAAAA,GAAAA,gCAAAA;AAAkCnE,4CAAAA;AAAS,yCAAA,EAC/CA,UACA2C,OAAAA,EACAzF,eAAAA,CAAAA;AAEJ,oCAAA;AACF,gCAAA;4BACF,CAAA,MAAO;AACL,gCAAA,MAAM8H,iBAAAA,GACJ9H,eAAAA,KAAoBgF,SAAAA,IAAavC,YAAAA,KAAiB,WAC9C,CAACsF,IAAAA,GAAAA;AACC,oCAAA,MAAMC,aAAAA,GAAgB;AAACtF,wCAAAA,OAAAA;AAAYqF,wCAAAA,GAAAA;AAAK,qCAAA,CAACE,IAAI,CAAC,GAAA,CAAA;oCAC9C,MAAMC,OAAAA,GAAUxB,4BAAAA,CACd5D,QAAAA,EACA2C,OAAAA,EACAzF,eAAAA,CAAAA;oCAEF,OAAOkI,OAAAA,KAAYlD,SAAAA,GACf,IAAA,GACAkD,OAAAA,CAAQ;AAAC,wCAAA,YAAA;AAAc,wCAAA,QAAA;AAAUF,wCAAAA;AAAc,qCAAA,CAAA;gCACrD,CAAA,GACAhD,SAAAA;gCAEN,MAAMmD,YAAAA,GAAevB,2BAAAA,CAA4BS,QAAAA,EAAU1E,KAAAA,EAAOmF,iBAAAA,CAAAA;AAElE7B,gCAAAA,GAAAA,CAAIc,uBAAuBO,eAAAA,EAAiBa,YAAAA,CAAAA;gCAC5C,IAAIxF,KAAAA,KAAU,IAAA,IAAQ3C,eAAAA,KAAoBgF,SAAAA,EAAW;AACnDM,oCAAAA,uBAAAA,CACEyB,qBAAAA,EACA;AAAIE,wCAAAA,GAAAA,gCAAAA;AAAkCnE,wCAAAA;AAAS,qCAAA,EAC/CA,UACA2C,OAAAA,EACAzF,eAAAA,CAAAA;AAEJ,gCAAA;AACF,4BAAA;AACF,wBAAA;AACF,oBAAA,CAAA,CAAA;AAEA,oBAAA,IAAI2C,UAAU,KAAA,EAAO;;AAEnBoE,wBAAAA,qBAAAA,GAAwBqB,uBAAAA,CAAwBrB,qBAAAA,CAAAA;AAClD,oBAAA;AAEAd,oBAAAA,GAAAA,CAAIG,YAAY,cAAA,EAAgBW,qBAAAA,CAAAA;AAEhC,oBAAA;AACF,gBAAA;YACA,KAAK,sBAAA;AAAwB,gBAAA;;oBAE3B,IAAInB,MAAAA,CAAO5F,eAAe,KAAKgF,SAAAA,EAAW;AACxC,wBAAA;AACF,oBAAA;AAEAxD,oBAAAA,MAAAA,CAAO6G,OAAO,CAACzC,MAAAA,CAAO5C,UAAU,CAAA,CAAEsD,OAAO,CAAC,CAACgC,KAAAA,GAAAA;wBACzC,MAAM,CAACC,gBAAAA,EAAkBC,kBAAAA,CAAmB,GAAGF,KAAAA;AAE/CrC,wBAAAA,GAAAA,CACEG,UAAAA,EACA;AAAC,4BAAA,cAAA;AAAmBmC,4BAAAA,GAAAA,gBAAAA,CAAiBrB,KAAK,CAAC,IAAA,CAAA;AAAO,4BAAA;yBAAa,EAC/DsB,kBAAAA,CAAAA;AAEJ,oBAAA,CAAA,CAAA;AAEA,oBAAA;AACF,gBAAA;YACA,KAAK,2BAAA;AAA6B,gBAAA;oBAChC,IAAIzB,qBAAAA,GAAwBC,SAAAA,CAAUd,KAAAA,CAAM9F,YAAY,CAAA;AAExD,oBAAA,MAAMqI,SAAAA,GAAY7C,MAAAA,CAAOxC,IAAI,CAAC8D,KAAK,CAAC,IAAA,CAAA;AACpCjB,oBAAAA,GAAAA,CAAIc,qBAAAA,EAAuB;AAAI0B,wBAAAA,GAAAA;AAAU,qBAAA,EAAE7C,OAAOjD,KAAK,CAAA;;AAGvD,oBAAA,IAAIiD,OAAOjD,KAAK,KAAK,QAAQiD,MAAAA,CAAO5F,eAAe,KAAKgF,SAAAA,EAAW;wBACjE,MAAM0D,eAAAA,GAAkBD,SAAAA,CAAUE,OAAO,CAAC,YAAA,CAAA;AAE1C,wBAAA,IAAID,kBAAkB,CAAA,EAAG;AACvB,4BAAA,MAAM5F,QAAAA,GAAW2F,SAAS,CAACC,eAAAA,GAAkB,CAAA,CAAE;4BAC/C,MAAME,IAAAA,GAAOH,SAAS,CAAC,CAAA,CAAE;4BAEzB,IAAKG,CAAAA,IAAAA,KAAS,iBAAA,IAAqBA,IAAAA,KAAS,aAAY,KAAMH,SAAAA,CAAUrB,MAAM,IAAI,CAAA,EAAG;gCACnF,MAAM3B,OAAAA,GAAUgD,SAAS,CAAC,CAAA,CAAE;AAC5BnD,gCAAAA,uBAAAA,CACEyB,qBAAAA,EACA;AAAC6B,oCAAAA,IAAAA;AAAMnD,oCAAAA,OAAAA;AAAS3C,oCAAAA;iCAAS,EACzBA,QAAAA,EACA2C,OAAAA,EACAG,MAAAA,CAAO5F,eAAe,CAAA;4BAE1B,CAAA,MAAO;AACL,gCAAA,MAAMwF,kBAAAA,GAAqBiD,SAAAA,CAAUI,KAAK,CAAC,CAAA,EAAGH,eAAAA,CAAAA;AAC9CpD,gCAAAA,uBAAAA,CACEyB,qBAAAA,EACAvB,kBAAAA,EACA1C,QAAAA,EACA,IAAA,EACA8C,OAAO5F,eAAe,CAAA;AAE1B,4BAAA;AACF,wBAAA;AACF,oBAAA;oBAEA,IAAI4F,MAAAA,CAAOjD,KAAK,KAAK,KAAA,EAAO;;AAE1BoE,wBAAAA,qBAAAA,GAAwBqB,uBAAAA,CAAwBrB,qBAAAA,CAAAA;AAClD,oBAAA;AAEAd,oBAAAA,GAAAA,CAAIG,YAAY,cAAA,EAAgBW,qBAAAA,CAAAA;AAEhC,oBAAA;AACF,gBAAA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCC,UACD,KAAK,kCAAA;AAAoC,gBAAA;AACvC,oBAAA,MAAM,EAAE3D,IAAI,EAAET,KAAK,EAAE3C,eAAe,EAAE,GAAG4F,MAAAA;AACzC,oBAAA,MAAMkD,WAAAA,GAAc;AAAI1F,wBAAAA,GAAAA,IAAAA,CAAK8D,KAAK,CAAC,IAAA;AAAM,qBAAA;oBACzC,IAAIH,qBAAAA,GAAwBC,SAAAA,CAAUd,KAAAA,CAAM9F,YAAY,CAAA;AACxD,oBAAA,MAAM2I,SAAAA,GAAYhD,GAAAA,CAAIgB,qBAAAA,EAAuB+B,WAAAA,EAAa,EAAC,CAAA;oBAE3D,MAAMF,IAAAA,GAAOE,WAAW,CAAC,CAAA,CAAE;;;;oBAI3B,MAAME,iBAAAA,GAAoBJ,IAAAA,KAAS,SAAA,IAAaA,IAAAA,KAAS,UAAA;oBAEzD,IAAI9F,QAAAA;oBACJ,IAAI2C,OAAAA;AAEJ,oBAAA,IAAIuD,iBAAAA,EAAmB;wBACrBvD,OAAAA,GAAU,IAAA;oBACZ,CAAA,MAAO;wBACL,IAAIqD,WAAAA,CAAY1B,MAAM,IAAI,CAAA,EAAG;4BAC3B3B,OAAAA,GAAUqD,WAAW,CAAC,CAAA,CAAE;AAC1B,wBAAA;wBAEA,IAAIA,WAAAA,CAAY1B,MAAM,IAAI,CAAA,EAAG;4BAC3BtE,QAAAA,GAAWgG,WAAW,CAAC,CAAA,CAAE;AAC3B,wBAAA;AACF,oBAAA;oBAEA,MAAMhB,iBAAAA,GAAoBmB,oCAAAA,CACxBxD,OAAAA,EACA3C,QAAAA,EACA9C,eAAAA,CAAAA;oBAGF,MAAM2G,aAAAA,GAAgBC,2BAAAA,CAA4BmC,SAAAA,EAAWpG,KAAAA,EAAOmF,iBAAAA,CAAAA;;oBAGpE,IAAInF,KAAAA,KAAU,IAAA,IAAQ3C,eAAAA,KAAoBgF,SAAAA,EAAW;AACnD,wBAAA,MAAMkE,mBACJN,IAAAA,KAAS,iBAAA,IAAqBA,IAAAA,KAAS,aAAA,GAAiBnD,WAAW,IAAA,GAAQ,IAAA;wBAE7E,IAAI3C,QAAAA,KAAakC,SAAAA,IAAakE,gBAAAA,KAAqB,IAAA,EAAM;AACvD5D,4BAAAA,uBAAAA,CAAwBqB,aAAAA,EAAe,EAAE,EAAE7D,QAAAA,EAAUoG,gBAAAA,EAAkBlJ,eAAAA,CAAAA;wBACzE,CAAA,MAAO,IAAI+E,SAAS4B,aAAAA,CAAAA,EAAgB;AAClC,4BAAA,MAAMwC,gBAAAA,GAAmBxC,aAAAA;AAEzBnF,4BAAAA,MAAAA,CAAO4B,IAAI,CAAC+F,gBAAAA,CAAAA,CAAkB7C,OAAO,CAAC,CAACjB,GAAAA,GAAAA;gCACrC,MAAM+D,cAAAA,GAAiBD,gBAAgB,CAAC9D,GAAAA,CAAI;AAC5C,gCAAA,IAAIN,SAASqE,cAAAA,CAAAA,EAAiB;AAC5B9D,oCAAAA,uBAAAA,CAAwB8D,cAAAA,EAAgB,EAAE,EAAE/D,GAAAA,EAAK6D,gBAAAA,EAAkBlJ,eAAAA,CAAAA;AACrE,gCAAA;AACF,4BAAA,CAAA,CAAA;AACF,wBAAA;AACF,oBAAA;AAEAiG,oBAAAA,GAAAA,CAAIc,uBAAuB+B,WAAAA,EAAanC,aAAAA,CAAAA;AAExC,oBAAA,IAAIhE,UAAU,KAAA,EAAO;;AAEnBoE,wBAAAA,qBAAAA,GAAwBqB,uBAAAA,CAAwBrB,qBAAAA,CAAAA;AAClD,oBAAA;AAEAd,oBAAAA,GAAAA,CAAIG,UAAAA,EAAY;AAAC,wBAAA;qBAAe,EAAEW,qBAAAA,CAAAA;AAElC,oBAAA;AACF,gBAAA;YACA,KAAK,YAAA;AAAc,gBAAA;oBACjBX,UAAAA,CAAWhG,YAAY,GAAG8F,KAAAA,CAAMhG,WAAW;AAC3C,oBAAA;AACF,gBAAA;YACA,KAAK,uBAAA;AAAyB,gBAAA;oBAC5BkG,UAAAA,CAAWlG,WAAW,GAAGgG,KAAAA,CAAM9F,YAAY;AAC3C,oBAAA;AACF,gBAAA;AACA,YAAA;gBACE,OAAOgG,UAAAA;AACX;AACF,IAAA,CAAA,CAAA;AAUF,MAAMlE,6BAAAA,GAAgC,CACpCD,IAAAA,EACAoH,mBAAAA,EACAnJ,WAAAA,EACAE,YAAAA,GAAAA;AAEA,IAAA,IAAI,CAAC6B,IAAAA,CAAKwD,OAAO,EAAE,OAAOxD,IAAAA;AAE1B,IAAA,MAAMqH,WAAWD,mBAAAA,CAAoB1D,IAAI,CACvC,CAAC4D,IAAMA,CAAAA,CAAE3D,MAAM,KAAK3D,IAAAA,CAAK2D,MAAM,IAAI2D,CAAAA,CAAE9D,OAAO,KAAKxD,KAAKwD,OAAO,CAAA;;AAI/D,IAAA,IAAI6D,QAAAA,EAAU7B,UAAAA,EAAY+B,OAAAA,KAAY,IAAA,EAAM,OAAOvH,IAAAA;AAEnD,IAAA,MAAMuC,IAAAA,GACJvC,IAAAA,CAAKwD,OAAO,IAAIrF,aAAac,eAAe,GACvC,iBAAA,GACDe,IAAAA,CAAKwD,OAAO,IAAIrF,YAAAA,CAAagB,WAAW,GACrC,aAAA,GACD,IAAA;IACR,IAAI,CAACoD,MAAM,OAAOvC,IAAAA;AAElB,IAAA,MAAMwH,iBAAAA,GAAoBvJ,WAAW,CAACsE,IAAAA,CAAK,GAAGvC,IAAAA,CAAKwD,OAAO,CAAC,GAAGxD,IAAAA,CAAK2D,MAAM,CAAC;AAC1E,IAAA,MAAM8D,kBAAAA,GAAqBtJ,YAAY,CAACoE,IAAAA,CAAK,GAAGvC,IAAAA,CAAKwD,OAAO,CAAC,GAAGxD,IAAAA,CAAK2D,MAAM,CAAC;AAE5E,IAAA,IAAI,CAAC6D,iBAAAA,IAAqB,CAACC,kBAAAA,EAAoB,OAAOzH,IAAAA;AAEtD,IAAA,MAAM0H,qBAAqB,iBAACF,CAAkBhC,UAAgC,CAAC,SAAA,CAAU;AACzF,IAAA,MAAMmC,sBAAsB,kBAACF,CAAmBjC,UAAgC,CAAC,SAAA,CAAU;IAE3F,IACE,CAACkC,sBACD,OAAOA,kBAAAA,KAAuB,aAC9B,CAACC,mBAAAA,IACD,OAAOA,mBAAAA,KAAwB,SAAA,EAC/B;QACA,OAAO3H,IAAAA;AACT,IAAA;IAEA,MAAM4H,gBAAAA,GACJrI,MAAAA,CAAO4B,IAAI,CAACuG,kBAAAA,CAAAA,CAAoBvC,MAAM,KAAK5F,MAAAA,CAAO4B,IAAI,CAACwG,mBAAAA,CAAAA,CAAqBxC,MAAM,IAClF5F,MAAAA,CAAO6G,OAAO,CAACsB,kBAAAA,CAAAA,CAAoBG,KAAK,CACtC,CAAC,CAACC,MAAAA,EAAQC,GAAAA,CAAI,GAAKJ,mBAAmB,CAACG,MAAAA,CAAO,KAAKC,GAAAA,CAAAA;IAGvD,IAAI,CAACH,kBAAkB,OAAO5H,IAAAA;IAE9B,OAAO;AAAE,QAAA,GAAGA,IAAI;QAAEwF,UAAAA,EAAY;AAAE,YAAA,GAAGxF,KAAKwF,UAAU;YAAE+B,OAAAA,EAAS;AAAK;AAAE,KAAA;AACtE,CAAA;AAEA;;qGAIA,MAAM/I,IAAAA,GAAO,CACXb,MAAAA,EACAG,WAAAA,GAAAA;AAEA,IAAA,MAAM,EACJiD,UAAU,EACViH,QAAAA,EAAU,EAAE/I,eAAe,EAAEE,WAAW,EAAEsD,OAAO,EAAEC,QAAQ,EAAE,EAC9D,GAAG/E,MAAAA;AAEJ,IAAA,MAAMO,OAAAA,GAAU;AACde,QAAAA,eAAAA;AACAE,QAAAA,WAAAA;AACAsD,QAAAA,OAAAA,EAASwF,aAAaxF,OAAAA,EAAS,QAAA,CAAA;AAC/BC,QAAAA,QAAAA,EAAUuF,aAAavF,QAAAA,EAAU,UAAA;AACnC,KAAA;AAEA,IAAA,MAAMwF,WAAAA,GAAc;QAClBjJ,eAAAA,EAAiBkJ,mBAAAA,CAAoBlJ,iBAAiB8B,UAAAA,EAAYjD,WAAAA,CAAAA;QAClEqB,WAAAA,EAAagJ,mBAAAA,CAAoBhJ,aAAa4B,UAAAA,EAAYjD,WAAAA,CAAAA;AAC1D2E,QAAAA,OAAAA,EAAS2F,iBAAAA,CAAkBlK,OAAAA,CAAQuE,OAAO,EAAE1B,UAAAA,EAAYjD,WAAAA,CAAAA;AACxD4E,QAAAA,QAAAA,EAAU0F,iBAAAA,CAAkBlK,OAAAA,CAAQwE,QAAQ,EAAE3B,UAAAA,EAAYjD,WAAAA;AAC5D,KAAA;IAEA,OAAO;QACLG,WAAAA,EAAaiK,WAAAA;QACb/J,YAAAA,EAAc+J,WAAAA;AACdhK,QAAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
@@ -14,7 +14,7 @@ const getStoredToken = ()=>{
|
|
|
14
14
|
if (fromLocalStorage) {
|
|
15
15
|
return JSON.parse(fromLocalStorage);
|
|
16
16
|
}
|
|
17
|
-
const fromCookie = cookies.getCookieValue(
|
|
17
|
+
const fromCookie = cookies.getCookieValue(cookies.AUTH_COOKIE_NAME);
|
|
18
18
|
return fromCookie ?? null;
|
|
19
19
|
};
|
|
20
20
|
const adminSlice = toolkit.createSlice({
|
|
@@ -54,7 +54,7 @@ const adminSlice = toolkit.createSlice({
|
|
|
54
54
|
login (state, action) {
|
|
55
55
|
const { token, persist } = action.payload;
|
|
56
56
|
if (!persist) {
|
|
57
|
-
cookies.setCookie(
|
|
57
|
+
cookies.setCookie(cookies.AUTH_COOKIE_NAME, token);
|
|
58
58
|
} else {
|
|
59
59
|
window.localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));
|
|
60
60
|
}
|
|
@@ -63,7 +63,7 @@ const adminSlice = toolkit.createSlice({
|
|
|
63
63
|
},
|
|
64
64
|
logout (state) {
|
|
65
65
|
state.token = null;
|
|
66
|
-
cookies.deleteCookie(
|
|
66
|
+
cookies.deleteCookie(cookies.AUTH_COOKIE_NAME);
|
|
67
67
|
window.localStorage.removeItem(STORAGE_KEYS.TOKEN);
|
|
68
68
|
window.localStorage.removeItem(STORAGE_KEYS.STATUS);
|
|
69
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reducer.js","sources":["../../../../admin/src/reducer.ts"],"sourcesContent":["import { createSlice } from '@reduxjs/toolkit';\n\nimport { PermissionMap } from './types/permissions';\nimport { getCookieValue, setCookie, deleteCookie } from './utils/cookies';\n\nimport type { PayloadAction } from '@reduxjs/toolkit';\n\ntype ThemeName = 'light' | 'dark' | 'system';\n\ninterface AppState {\n language: {\n locale: string;\n localeNames: Record<string, string>;\n };\n permissions: Partial<PermissionMap>;\n theme: {\n currentTheme: ThemeName;\n availableThemes: string[];\n };\n token?: string | null;\n}\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n STATUS: 'isLoggedIn',\n};\n\nconst THEME_LOCAL_STORAGE_KEY = 'STRAPI_THEME';\nconst LANGUAGE_LOCAL_STORAGE_KEY = 'strapi-admin-language';\n\nexport const getStoredToken = (): string | null => {\n const fromLocalStorage = localStorage.getItem(STORAGE_KEYS.TOKEN);\n if (fromLocalStorage) {\n return JSON.parse(fromLocalStorage);\n }\n\n const fromCookie = getCookieValue(
|
|
1
|
+
{"version":3,"file":"reducer.js","sources":["../../../../admin/src/reducer.ts"],"sourcesContent":["import { createSlice } from '@reduxjs/toolkit';\n\nimport { PermissionMap } from './types/permissions';\nimport { AUTH_COOKIE_NAME, getCookieValue, setCookie, deleteCookie } from './utils/cookies';\n\nimport type { PayloadAction } from '@reduxjs/toolkit';\n\ntype ThemeName = 'light' | 'dark' | 'system';\n\ninterface AppState {\n language: {\n locale: string;\n localeNames: Record<string, string>;\n };\n permissions: Partial<PermissionMap>;\n theme: {\n currentTheme: ThemeName;\n availableThemes: string[];\n };\n token?: string | null;\n}\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n STATUS: 'isLoggedIn',\n};\n\nconst THEME_LOCAL_STORAGE_KEY = 'STRAPI_THEME';\nconst LANGUAGE_LOCAL_STORAGE_KEY = 'strapi-admin-language';\n\nexport const getStoredToken = (): string | null => {\n const fromLocalStorage = localStorage.getItem(STORAGE_KEYS.TOKEN);\n if (fromLocalStorage) {\n return JSON.parse(fromLocalStorage);\n }\n\n const fromCookie = getCookieValue(AUTH_COOKIE_NAME);\n return fromCookie ?? null;\n};\n\nconst adminSlice = createSlice({\n name: 'admin',\n initialState: () => {\n return {\n language: {\n locale: 'en',\n localeNames: { en: 'English' },\n },\n permissions: {},\n theme: {\n availableThemes: [],\n currentTheme: localStorage.getItem(THEME_LOCAL_STORAGE_KEY) || 'system',\n },\n token: null,\n } as AppState;\n },\n reducers: {\n setAppTheme(state, action: PayloadAction<ThemeName>) {\n state.theme.currentTheme = action.payload;\n window.localStorage.setItem(THEME_LOCAL_STORAGE_KEY, action.payload);\n },\n setAvailableThemes(state, action: PayloadAction<AppState['theme']['availableThemes']>) {\n state.theme.availableThemes = action.payload;\n },\n setLocale(state, action: PayloadAction<string>) {\n state.language.locale = action.payload;\n\n window.localStorage.setItem(LANGUAGE_LOCAL_STORAGE_KEY, action.payload);\n document.documentElement.setAttribute('lang', action.payload);\n },\n setToken(state, action: PayloadAction<string | null>) {\n state.token = action.payload;\n },\n login(state, action: PayloadAction<{ token: string; persist?: boolean }>) {\n const { token, persist } = action.payload;\n\n if (!persist) {\n setCookie(AUTH_COOKIE_NAME, token);\n } else {\n window.localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));\n }\n window.localStorage.setItem(STORAGE_KEYS.STATUS, 'true');\n state.token = token;\n },\n logout(state) {\n state.token = null;\n deleteCookie(AUTH_COOKIE_NAME);\n window.localStorage.removeItem(STORAGE_KEYS.TOKEN);\n window.localStorage.removeItem(STORAGE_KEYS.STATUS);\n },\n },\n});\n\nconst reducer = adminSlice.reducer;\n\nexport const { setAppTheme, setAvailableThemes, setLocale, setToken, logout, login } =\n adminSlice.actions;\n\nexport { reducer, THEME_LOCAL_STORAGE_KEY, LANGUAGE_LOCAL_STORAGE_KEY };\nexport type { AppState, ThemeName };\n"],"names":["STORAGE_KEYS","TOKEN","STATUS","THEME_LOCAL_STORAGE_KEY","LANGUAGE_LOCAL_STORAGE_KEY","getStoredToken","fromLocalStorage","localStorage","getItem","JSON","parse","fromCookie","getCookieValue","AUTH_COOKIE_NAME","adminSlice","createSlice","name","initialState","language","locale","localeNames","en","permissions","theme","availableThemes","currentTheme","token","reducers","setAppTheme","state","action","payload","window","setItem","setAvailableThemes","setLocale","document","documentElement","setAttribute","setToken","login","persist","setCookie","stringify","logout","deleteCookie","removeItem","reducer","actions"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createSlice } from '@reduxjs/toolkit';
|
|
2
|
-
import { deleteCookie, setCookie, getCookieValue } from './utils/cookies.mjs';
|
|
2
|
+
import { deleteCookie, setCookie, AUTH_COOKIE_NAME, getCookieValue } from './utils/cookies.mjs';
|
|
3
3
|
|
|
4
4
|
const STORAGE_KEYS = {
|
|
5
5
|
TOKEN: 'jwtToken',
|
|
@@ -12,7 +12,7 @@ const getStoredToken = ()=>{
|
|
|
12
12
|
if (fromLocalStorage) {
|
|
13
13
|
return JSON.parse(fromLocalStorage);
|
|
14
14
|
}
|
|
15
|
-
const fromCookie = getCookieValue(
|
|
15
|
+
const fromCookie = getCookieValue(AUTH_COOKIE_NAME);
|
|
16
16
|
return fromCookie ?? null;
|
|
17
17
|
};
|
|
18
18
|
const adminSlice = createSlice({
|
|
@@ -52,7 +52,7 @@ const adminSlice = createSlice({
|
|
|
52
52
|
login (state, action) {
|
|
53
53
|
const { token, persist } = action.payload;
|
|
54
54
|
if (!persist) {
|
|
55
|
-
setCookie(
|
|
55
|
+
setCookie(AUTH_COOKIE_NAME, token);
|
|
56
56
|
} else {
|
|
57
57
|
window.localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));
|
|
58
58
|
}
|
|
@@ -61,7 +61,7 @@ const adminSlice = createSlice({
|
|
|
61
61
|
},
|
|
62
62
|
logout (state) {
|
|
63
63
|
state.token = null;
|
|
64
|
-
deleteCookie(
|
|
64
|
+
deleteCookie(AUTH_COOKIE_NAME);
|
|
65
65
|
window.localStorage.removeItem(STORAGE_KEYS.TOKEN);
|
|
66
66
|
window.localStorage.removeItem(STORAGE_KEYS.STATUS);
|
|
67
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reducer.mjs","sources":["../../../../admin/src/reducer.ts"],"sourcesContent":["import { createSlice } from '@reduxjs/toolkit';\n\nimport { PermissionMap } from './types/permissions';\nimport { getCookieValue, setCookie, deleteCookie } from './utils/cookies';\n\nimport type { PayloadAction } from '@reduxjs/toolkit';\n\ntype ThemeName = 'light' | 'dark' | 'system';\n\ninterface AppState {\n language: {\n locale: string;\n localeNames: Record<string, string>;\n };\n permissions: Partial<PermissionMap>;\n theme: {\n currentTheme: ThemeName;\n availableThemes: string[];\n };\n token?: string | null;\n}\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n STATUS: 'isLoggedIn',\n};\n\nconst THEME_LOCAL_STORAGE_KEY = 'STRAPI_THEME';\nconst LANGUAGE_LOCAL_STORAGE_KEY = 'strapi-admin-language';\n\nexport const getStoredToken = (): string | null => {\n const fromLocalStorage = localStorage.getItem(STORAGE_KEYS.TOKEN);\n if (fromLocalStorage) {\n return JSON.parse(fromLocalStorage);\n }\n\n const fromCookie = getCookieValue(
|
|
1
|
+
{"version":3,"file":"reducer.mjs","sources":["../../../../admin/src/reducer.ts"],"sourcesContent":["import { createSlice } from '@reduxjs/toolkit';\n\nimport { PermissionMap } from './types/permissions';\nimport { AUTH_COOKIE_NAME, getCookieValue, setCookie, deleteCookie } from './utils/cookies';\n\nimport type { PayloadAction } from '@reduxjs/toolkit';\n\ntype ThemeName = 'light' | 'dark' | 'system';\n\ninterface AppState {\n language: {\n locale: string;\n localeNames: Record<string, string>;\n };\n permissions: Partial<PermissionMap>;\n theme: {\n currentTheme: ThemeName;\n availableThemes: string[];\n };\n token?: string | null;\n}\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n STATUS: 'isLoggedIn',\n};\n\nconst THEME_LOCAL_STORAGE_KEY = 'STRAPI_THEME';\nconst LANGUAGE_LOCAL_STORAGE_KEY = 'strapi-admin-language';\n\nexport const getStoredToken = (): string | null => {\n const fromLocalStorage = localStorage.getItem(STORAGE_KEYS.TOKEN);\n if (fromLocalStorage) {\n return JSON.parse(fromLocalStorage);\n }\n\n const fromCookie = getCookieValue(AUTH_COOKIE_NAME);\n return fromCookie ?? null;\n};\n\nconst adminSlice = createSlice({\n name: 'admin',\n initialState: () => {\n return {\n language: {\n locale: 'en',\n localeNames: { en: 'English' },\n },\n permissions: {},\n theme: {\n availableThemes: [],\n currentTheme: localStorage.getItem(THEME_LOCAL_STORAGE_KEY) || 'system',\n },\n token: null,\n } as AppState;\n },\n reducers: {\n setAppTheme(state, action: PayloadAction<ThemeName>) {\n state.theme.currentTheme = action.payload;\n window.localStorage.setItem(THEME_LOCAL_STORAGE_KEY, action.payload);\n },\n setAvailableThemes(state, action: PayloadAction<AppState['theme']['availableThemes']>) {\n state.theme.availableThemes = action.payload;\n },\n setLocale(state, action: PayloadAction<string>) {\n state.language.locale = action.payload;\n\n window.localStorage.setItem(LANGUAGE_LOCAL_STORAGE_KEY, action.payload);\n document.documentElement.setAttribute('lang', action.payload);\n },\n setToken(state, action: PayloadAction<string | null>) {\n state.token = action.payload;\n },\n login(state, action: PayloadAction<{ token: string; persist?: boolean }>) {\n const { token, persist } = action.payload;\n\n if (!persist) {\n setCookie(AUTH_COOKIE_NAME, token);\n } else {\n window.localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));\n }\n window.localStorage.setItem(STORAGE_KEYS.STATUS, 'true');\n state.token = token;\n },\n logout(state) {\n state.token = null;\n deleteCookie(AUTH_COOKIE_NAME);\n window.localStorage.removeItem(STORAGE_KEYS.TOKEN);\n window.localStorage.removeItem(STORAGE_KEYS.STATUS);\n },\n },\n});\n\nconst reducer = adminSlice.reducer;\n\nexport const { setAppTheme, setAvailableThemes, setLocale, setToken, logout, login } =\n adminSlice.actions;\n\nexport { reducer, THEME_LOCAL_STORAGE_KEY, LANGUAGE_LOCAL_STORAGE_KEY };\nexport type { AppState, ThemeName };\n"],"names":["STORAGE_KEYS","TOKEN","STATUS","THEME_LOCAL_STORAGE_KEY","LANGUAGE_LOCAL_STORAGE_KEY","getStoredToken","fromLocalStorage","localStorage","getItem","JSON","parse","fromCookie","getCookieValue","AUTH_COOKIE_NAME","adminSlice","createSlice","name","initialState","language","locale","localeNames","en","permissions","theme","availableThemes","currentTheme","token","reducers","setAppTheme","state","action","payload","window","setItem","setAvailableThemes","setLocale","document","documentElement","setAttribute","setToken","login","persist","setCookie","stringify","logout","deleteCookie","removeItem","reducer","actions"],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var client = require('react-dom/client');
|
|
4
4
|
var StrapiApp = require('./StrapiApp.js');
|
|
5
5
|
var getFetchClient = require('./utils/getFetchClient.js');
|
|
6
|
+
var getProjectType = require('./utils/getProjectType.js');
|
|
6
7
|
var urls = require('./utils/urls.js');
|
|
7
8
|
|
|
8
9
|
const renderAdmin = async (mountNode, { plugins, customisations, features })=>{
|
|
@@ -49,7 +50,7 @@ const renderAdmin = async (mountNode, { plugins, customisations, features })=>{
|
|
|
49
50
|
};
|
|
50
51
|
const { get } = getFetchClient.getFetchClient();
|
|
51
52
|
try {
|
|
52
|
-
const { data: { data: { isEE, isTrial, features, flags, ai } } } = await get('/admin/project-type');
|
|
53
|
+
const { data: { data: { isEE, isTrial, features, flags, ai, planPriceId } } } = await get('/admin/project-type');
|
|
53
54
|
window.strapi.isEE = isEE;
|
|
54
55
|
window.strapi.isTrialLicense = isTrial;
|
|
55
56
|
window.strapi.flags = flags;
|
|
@@ -57,7 +58,10 @@ const renderAdmin = async (mountNode, { plugins, customisations, features })=>{
|
|
|
57
58
|
...window.strapi.features,
|
|
58
59
|
isEnabled: (featureName)=>features.some((feature)=>feature.name === featureName)
|
|
59
60
|
};
|
|
60
|
-
window.strapi.projectType =
|
|
61
|
+
window.strapi.projectType = getProjectType.getProjectType({
|
|
62
|
+
isEE,
|
|
63
|
+
planPriceId
|
|
64
|
+
});
|
|
61
65
|
// eslint-disable-next-line
|
|
62
66
|
// @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.
|
|
63
67
|
window.strapi.ai = ai;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sources":["../../../../admin/src/render.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport { createRoot } from 'react-dom/client';\n\nimport { StrapiApp, StrapiAppConstructorArgs } from './StrapiApp';\nimport { getFetchClient } from './utils/getFetchClient';\nimport { createAbsoluteUrl } from './utils/urls';\n\nimport type { Modules } from '@strapi/types';\n\ninterface RenderAdminArgs {\n customisations: {\n register?: (app: StrapiApp) => Promise<void> | void;\n bootstrap?: (app: StrapiApp) => Promise<void> | void;\n config?: StrapiAppConstructorArgs['config'];\n };\n plugins: StrapiAppConstructorArgs['appPlugins'];\n features?: Modules.Features.FeaturesService['config'];\n}\n\nconst renderAdmin = async (\n mountNode: HTMLElement | null,\n { plugins, customisations, features }: RenderAdminArgs\n) => {\n if (!mountNode) {\n throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');\n }\n\n window.strapi = {\n /**\n * This ENV variable is passed from the strapi instance, by default no url is set\n * in the config and therefore the instance returns you an empty string so URLs are relative.\n *\n * To ensure that the backendURL is always set, we use the window.location.origin as a fallback.\n */\n backendURL: createAbsoluteUrl(process.env.STRAPI_ADMIN_BACKEND_URL),\n isEE: false,\n isTrial: false,\n telemetryDisabled: process.env.STRAPI_TELEMETRY_DISABLED === 'true',\n future: {\n isEnabled: (name: keyof NonNullable<Modules.Features.FeaturesConfig['future']>) => {\n return features?.future?.[name] === true;\n },\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision. Cannot use @ts-expect-error because of build:code and build:types context collision.\n features: {\n SSO: 'sso',\n AUDIT_LOGS: 'audit-logs',\n REVIEW_WORKFLOWS: 'review-workflows',\n /**\n * If we don't get the license then we know it's not EE\n * so no feature is enabled.\n */\n isEnabled: () => false,\n },\n projectType: 'Community',\n flags: {\n nps: false,\n promoteEE: true,\n docLinks: true,\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.\n ai: {\n enabled: true,\n },\n };\n\n const { get } = getFetchClient();\n\n interface ProjectType extends Pick<Window['strapi'], 'flags'> {\n isEE: boolean;\n isTrial: boolean;\n features: {\n name: string;\n }[];\n ai: {\n enabled: boolean;\n };\n }\n\n try {\n const {\n data: {\n data: { isEE, isTrial, features, flags, ai },\n },\n } = await get<{ data: ProjectType }>('/admin/project-type');\n\n window.strapi.isEE = isEE;\n window.strapi.isTrialLicense = isTrial;\n window.strapi.flags = flags;\n window.strapi.features = {\n ...window.strapi.features,\n isEnabled: (featureName: string | undefined) =>\n features.some((feature) => feature.name === featureName),\n };\n window.strapi.projectType = isEE
|
|
1
|
+
{"version":3,"file":"render.js","sources":["../../../../admin/src/render.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport { createRoot } from 'react-dom/client';\n\nimport { StrapiApp, StrapiAppConstructorArgs } from './StrapiApp';\nimport { getFetchClient } from './utils/getFetchClient';\nimport { getProjectType } from './utils/getProjectType';\nimport { createAbsoluteUrl } from './utils/urls';\n\nimport type { Modules } from '@strapi/types';\n\ninterface RenderAdminArgs {\n customisations: {\n register?: (app: StrapiApp) => Promise<void> | void;\n bootstrap?: (app: StrapiApp) => Promise<void> | void;\n config?: StrapiAppConstructorArgs['config'];\n };\n plugins: StrapiAppConstructorArgs['appPlugins'];\n features?: Modules.Features.FeaturesService['config'];\n}\n\nconst renderAdmin = async (\n mountNode: HTMLElement | null,\n { plugins, customisations, features }: RenderAdminArgs\n) => {\n if (!mountNode) {\n throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');\n }\n\n window.strapi = {\n /**\n * This ENV variable is passed from the strapi instance, by default no url is set\n * in the config and therefore the instance returns you an empty string so URLs are relative.\n *\n * To ensure that the backendURL is always set, we use the window.location.origin as a fallback.\n */\n backendURL: createAbsoluteUrl(process.env.STRAPI_ADMIN_BACKEND_URL),\n isEE: false,\n isTrial: false,\n telemetryDisabled: process.env.STRAPI_TELEMETRY_DISABLED === 'true',\n future: {\n isEnabled: (name: keyof NonNullable<Modules.Features.FeaturesConfig['future']>) => {\n return features?.future?.[name] === true;\n },\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision. Cannot use @ts-expect-error because of build:code and build:types context collision.\n features: {\n SSO: 'sso',\n AUDIT_LOGS: 'audit-logs',\n REVIEW_WORKFLOWS: 'review-workflows',\n /**\n * If we don't get the license then we know it's not EE\n * so no feature is enabled.\n */\n isEnabled: () => false,\n },\n projectType: 'Community',\n flags: {\n nps: false,\n promoteEE: true,\n docLinks: true,\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.\n ai: {\n enabled: true,\n },\n };\n\n const { get } = getFetchClient();\n\n interface ProjectType extends Pick<Window['strapi'], 'flags'> {\n isEE: boolean;\n isTrial: boolean;\n /**\n * The licensed plan price id, sent by the license registry (EE only).\n * Used to distinguish the Growth plan from other Enterprise plans.\n */\n planPriceId?: string;\n features: {\n name: string;\n }[];\n ai: {\n enabled: boolean;\n };\n }\n\n try {\n const {\n data: {\n data: { isEE, isTrial, features, flags, ai, planPriceId },\n },\n } = await get<{ data: ProjectType }>('/admin/project-type');\n\n window.strapi.isEE = isEE;\n window.strapi.isTrialLicense = isTrial;\n window.strapi.flags = flags;\n window.strapi.features = {\n ...window.strapi.features,\n isEnabled: (featureName: string | undefined) =>\n features.some((feature) => feature.name === featureName),\n };\n window.strapi.projectType = getProjectType({ isEE, planPriceId });\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.\n window.strapi.ai = ai;\n } catch (err) {\n /**\n * If this fails, we simply don't activate any EE features.\n * Should we warn clearer in the UI?\n */\n console.error(err);\n }\n\n const app = new StrapiApp({\n config: customisations?.config,\n appPlugins: plugins,\n });\n\n await app.register(customisations?.register);\n await app.bootstrap(customisations?.bootstrap);\n await app.loadTrads(customisations?.config?.translations);\n\n createRoot(mountNode).render(app.render());\n\n if (\n typeof module !== 'undefined' &&\n module &&\n 'hot' in module &&\n typeof module.hot === 'object' &&\n module.hot !== null &&\n 'accept' in module.hot &&\n typeof module.hot.accept === 'function'\n ) {\n module.hot.accept();\n }\n\n if (typeof import.meta.hot?.accept === 'function') {\n import.meta.hot.accept();\n }\n};\n\nexport { renderAdmin };\nexport type { RenderAdminArgs };\n"],"names":["renderAdmin","mountNode","plugins","customisations","features","Error","window","strapi","backendURL","createAbsoluteUrl","process","env","STRAPI_ADMIN_BACKEND_URL","isEE","isTrial","telemetryDisabled","STRAPI_TELEMETRY_DISABLED","future","isEnabled","name","SSO","AUDIT_LOGS","REVIEW_WORKFLOWS","projectType","flags","nps","promoteEE","docLinks","ai","enabled","get","getFetchClient","data","planPriceId","isTrialLicense","featureName","some","feature","getProjectType","err","console","error","app","StrapiApp","config","appPlugins","register","bootstrap","loadTrads","translations","createRoot","render","module","hot","accept"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createRoot } from 'react-dom/client';
|
|
2
2
|
import { StrapiApp } from './StrapiApp.mjs';
|
|
3
3
|
import { getFetchClient } from './utils/getFetchClient.mjs';
|
|
4
|
+
import { getProjectType } from './utils/getProjectType.mjs';
|
|
4
5
|
import { createAbsoluteUrl } from './utils/urls.mjs';
|
|
5
6
|
|
|
6
7
|
const renderAdmin = async (mountNode, { plugins, customisations, features })=>{
|
|
@@ -47,7 +48,7 @@ const renderAdmin = async (mountNode, { plugins, customisations, features })=>{
|
|
|
47
48
|
};
|
|
48
49
|
const { get } = getFetchClient();
|
|
49
50
|
try {
|
|
50
|
-
const { data: { data: { isEE, isTrial, features, flags, ai } } } = await get('/admin/project-type');
|
|
51
|
+
const { data: { data: { isEE, isTrial, features, flags, ai, planPriceId } } } = await get('/admin/project-type');
|
|
51
52
|
window.strapi.isEE = isEE;
|
|
52
53
|
window.strapi.isTrialLicense = isTrial;
|
|
53
54
|
window.strapi.flags = flags;
|
|
@@ -55,7 +56,10 @@ const renderAdmin = async (mountNode, { plugins, customisations, features })=>{
|
|
|
55
56
|
...window.strapi.features,
|
|
56
57
|
isEnabled: (featureName)=>features.some((feature)=>feature.name === featureName)
|
|
57
58
|
};
|
|
58
|
-
window.strapi.projectType =
|
|
59
|
+
window.strapi.projectType = getProjectType({
|
|
60
|
+
isEE,
|
|
61
|
+
planPriceId
|
|
62
|
+
});
|
|
59
63
|
// eslint-disable-next-line
|
|
60
64
|
// @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.
|
|
61
65
|
window.strapi.ai = ai;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.mjs","sources":["../../../../admin/src/render.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport { createRoot } from 'react-dom/client';\n\nimport { StrapiApp, StrapiAppConstructorArgs } from './StrapiApp';\nimport { getFetchClient } from './utils/getFetchClient';\nimport { createAbsoluteUrl } from './utils/urls';\n\nimport type { Modules } from '@strapi/types';\n\ninterface RenderAdminArgs {\n customisations: {\n register?: (app: StrapiApp) => Promise<void> | void;\n bootstrap?: (app: StrapiApp) => Promise<void> | void;\n config?: StrapiAppConstructorArgs['config'];\n };\n plugins: StrapiAppConstructorArgs['appPlugins'];\n features?: Modules.Features.FeaturesService['config'];\n}\n\nconst renderAdmin = async (\n mountNode: HTMLElement | null,\n { plugins, customisations, features }: RenderAdminArgs\n) => {\n if (!mountNode) {\n throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');\n }\n\n window.strapi = {\n /**\n * This ENV variable is passed from the strapi instance, by default no url is set\n * in the config and therefore the instance returns you an empty string so URLs are relative.\n *\n * To ensure that the backendURL is always set, we use the window.location.origin as a fallback.\n */\n backendURL: createAbsoluteUrl(process.env.STRAPI_ADMIN_BACKEND_URL),\n isEE: false,\n isTrial: false,\n telemetryDisabled: process.env.STRAPI_TELEMETRY_DISABLED === 'true',\n future: {\n isEnabled: (name: keyof NonNullable<Modules.Features.FeaturesConfig['future']>) => {\n return features?.future?.[name] === true;\n },\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision. Cannot use @ts-expect-error because of build:code and build:types context collision.\n features: {\n SSO: 'sso',\n AUDIT_LOGS: 'audit-logs',\n REVIEW_WORKFLOWS: 'review-workflows',\n /**\n * If we don't get the license then we know it's not EE\n * so no feature is enabled.\n */\n isEnabled: () => false,\n },\n projectType: 'Community',\n flags: {\n nps: false,\n promoteEE: true,\n docLinks: true,\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.\n ai: {\n enabled: true,\n },\n };\n\n const { get } = getFetchClient();\n\n interface ProjectType extends Pick<Window['strapi'], 'flags'> {\n isEE: boolean;\n isTrial: boolean;\n features: {\n name: string;\n }[];\n ai: {\n enabled: boolean;\n };\n }\n\n try {\n const {\n data: {\n data: { isEE, isTrial, features, flags, ai },\n },\n } = await get<{ data: ProjectType }>('/admin/project-type');\n\n window.strapi.isEE = isEE;\n window.strapi.isTrialLicense = isTrial;\n window.strapi.flags = flags;\n window.strapi.features = {\n ...window.strapi.features,\n isEnabled: (featureName: string | undefined) =>\n features.some((feature) => feature.name === featureName),\n };\n window.strapi.projectType = isEE
|
|
1
|
+
{"version":3,"file":"render.mjs","sources":["../../../../admin/src/render.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport { createRoot } from 'react-dom/client';\n\nimport { StrapiApp, StrapiAppConstructorArgs } from './StrapiApp';\nimport { getFetchClient } from './utils/getFetchClient';\nimport { getProjectType } from './utils/getProjectType';\nimport { createAbsoluteUrl } from './utils/urls';\n\nimport type { Modules } from '@strapi/types';\n\ninterface RenderAdminArgs {\n customisations: {\n register?: (app: StrapiApp) => Promise<void> | void;\n bootstrap?: (app: StrapiApp) => Promise<void> | void;\n config?: StrapiAppConstructorArgs['config'];\n };\n plugins: StrapiAppConstructorArgs['appPlugins'];\n features?: Modules.Features.FeaturesService['config'];\n}\n\nconst renderAdmin = async (\n mountNode: HTMLElement | null,\n { plugins, customisations, features }: RenderAdminArgs\n) => {\n if (!mountNode) {\n throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');\n }\n\n window.strapi = {\n /**\n * This ENV variable is passed from the strapi instance, by default no url is set\n * in the config and therefore the instance returns you an empty string so URLs are relative.\n *\n * To ensure that the backendURL is always set, we use the window.location.origin as a fallback.\n */\n backendURL: createAbsoluteUrl(process.env.STRAPI_ADMIN_BACKEND_URL),\n isEE: false,\n isTrial: false,\n telemetryDisabled: process.env.STRAPI_TELEMETRY_DISABLED === 'true',\n future: {\n isEnabled: (name: keyof NonNullable<Modules.Features.FeaturesConfig['future']>) => {\n return features?.future?.[name] === true;\n },\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision. Cannot use @ts-expect-error because of build:code and build:types context collision.\n features: {\n SSO: 'sso',\n AUDIT_LOGS: 'audit-logs',\n REVIEW_WORKFLOWS: 'review-workflows',\n /**\n * If we don't get the license then we know it's not EE\n * so no feature is enabled.\n */\n isEnabled: () => false,\n },\n projectType: 'Community',\n flags: {\n nps: false,\n promoteEE: true,\n docLinks: true,\n },\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.\n ai: {\n enabled: true,\n },\n };\n\n const { get } = getFetchClient();\n\n interface ProjectType extends Pick<Window['strapi'], 'flags'> {\n isEE: boolean;\n isTrial: boolean;\n /**\n * The licensed plan price id, sent by the license registry (EE only).\n * Used to distinguish the Growth plan from other Enterprise plans.\n */\n planPriceId?: string;\n features: {\n name: string;\n }[];\n ai: {\n enabled: boolean;\n };\n }\n\n try {\n const {\n data: {\n data: { isEE, isTrial, features, flags, ai, planPriceId },\n },\n } = await get<{ data: ProjectType }>('/admin/project-type');\n\n window.strapi.isEE = isEE;\n window.strapi.isTrialLicense = isTrial;\n window.strapi.flags = flags;\n window.strapi.features = {\n ...window.strapi.features,\n isEnabled: (featureName: string | undefined) =>\n features.some((feature) => feature.name === featureName),\n };\n window.strapi.projectType = getProjectType({ isEE, planPriceId });\n // eslint-disable-next-line\n // @ts-ignore – there's pollution from the global scope of Node. Cannot use @ts-expect-error because of build:code and build:types context collision.\n window.strapi.ai = ai;\n } catch (err) {\n /**\n * If this fails, we simply don't activate any EE features.\n * Should we warn clearer in the UI?\n */\n console.error(err);\n }\n\n const app = new StrapiApp({\n config: customisations?.config,\n appPlugins: plugins,\n });\n\n await app.register(customisations?.register);\n await app.bootstrap(customisations?.bootstrap);\n await app.loadTrads(customisations?.config?.translations);\n\n createRoot(mountNode).render(app.render());\n\n if (\n typeof module !== 'undefined' &&\n module &&\n 'hot' in module &&\n typeof module.hot === 'object' &&\n module.hot !== null &&\n 'accept' in module.hot &&\n typeof module.hot.accept === 'function'\n ) {\n module.hot.accept();\n }\n\n if (typeof import.meta.hot?.accept === 'function') {\n import.meta.hot.accept();\n }\n};\n\nexport { renderAdmin };\nexport type { RenderAdminArgs };\n"],"names":["renderAdmin","mountNode","plugins","customisations","features","Error","window","strapi","backendURL","createAbsoluteUrl","process","env","STRAPI_ADMIN_BACKEND_URL","isEE","isTrial","telemetryDisabled","STRAPI_TELEMETRY_DISABLED","future","isEnabled","name","SSO","AUDIT_LOGS","REVIEW_WORKFLOWS","projectType","flags","nps","promoteEE","docLinks","ai","enabled","get","getFetchClient","data","planPriceId","isTrialLicense","featureName","some","feature","getProjectType","err","console","error","app","StrapiApp","config","appPlugins","register","bootstrap","loadTrads","translations","createRoot","render","module","hot","accept"],"mappings":"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"}
|
|
@@ -166,8 +166,6 @@ var en = {
|
|
|
166
166
|
"Settings.application.customization.modal.upload.next": "Next",
|
|
167
167
|
"Settings.application.customization.size-details": "Max dimension: {dimension}×{dimension}, Max file size: {size}KB",
|
|
168
168
|
"Settings.application.description": "Administration panel’s global information",
|
|
169
|
-
"Settings.application.edition-title": "current edition",
|
|
170
|
-
"Settings.application.ee-or-ce": "{communityEdition, select, true {Community Edition} other {Enterprise Edition}}",
|
|
171
169
|
"Settings.application.ee.admin-seats.add-seats": "Manage subscription",
|
|
172
170
|
"Settings.application.ee.admin-seats.support": "Contact sales",
|
|
173
171
|
"Settings.application.ee.admin-seats.at-limit-tooltip": "At limit: add seats to invite more users",
|
|
@@ -176,6 +174,7 @@ var en = {
|
|
|
176
174
|
"Settings.application.link-pricing": "See all pricing plans",
|
|
177
175
|
"Settings.application.link-upgrade": "Upgrade your admin panel",
|
|
178
176
|
"Settings.application.node-version": "node version",
|
|
177
|
+
"Settings.application.plan-title": "current plan",
|
|
179
178
|
"Settings.application.strapi-version": "Strapi version",
|
|
180
179
|
"Settings.application.strapiVersion": "Strapi version",
|
|
181
180
|
"Settings.application.title": "Overview",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|