@viswa-test/creative-workspace-ui-component 0.0.72 → 0.0.74
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/_virtual/_tslib.js +1 -1
- package/dist/cjs/_virtual/_tslib.js +1 -1
- package/dist/cjs/components/AssignReminders/AssignReminderWrapper.js +1 -1
- package/dist/cjs/components/AssignReminders/components/LevelData.js +1 -1
- package/dist/cjs/components/PromptEditor/PromptEditor.js +2 -0
- package/dist/cjs/components/PromptEditor/PromptEditor.js.map +1 -0
- package/dist/cjs/components/ScopeTree/TreeTooltip.js +1 -1
- package/dist/cjs/features/lsc-guidelines/LscGuidelines.js +1 -1
- package/dist/cjs/features/lsc-guidelines/components/DataSourceCard.js +2 -0
- package/dist/cjs/features/lsc-guidelines/components/DataSourceCard.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/components/GuidelineAttachmentIcon.js +1 -1
- package/dist/cjs/features/lsc-guidelines/components/GuidelineCardMenu.js +1 -1
- package/dist/cjs/features/lsc-guidelines/components/GuidelineCart.js +1 -1
- package/dist/cjs/features/lsc-guidelines/components/GuidelineCartItem.js +1 -1
- package/dist/cjs/features/lsc-guidelines/components/GuidelineCreateForm.js +2 -0
- package/dist/cjs/features/lsc-guidelines/components/GuidelineCreateForm.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/components/GuidelineEditorWrapper.js +2 -0
- package/dist/cjs/features/lsc-guidelines/components/GuidelineEditorWrapper.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/components/GuidelineFilterPanel.js +2 -0
- package/dist/cjs/features/lsc-guidelines/components/GuidelineFilterPanel.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/components/GuidelineLandingPage.js +1 -1
- package/dist/cjs/features/lsc-guidelines/components/GuidelineLibrary.js +1 -1
- package/dist/cjs/features/lsc-guidelines/components/GuidelineLibraryCard.js +1 -1
- package/dist/cjs/features/lsc-guidelines/components/GuidelinePopoverCart.js +1 -1
- package/dist/cjs/features/lsc-guidelines/components/GuidelineTooltip.js +1 -1
- package/dist/cjs/features/lsc-guidelines/components/GuidelineWorkspaceHostProvider.js +2 -0
- package/dist/cjs/features/lsc-guidelines/components/GuidelineWorkspaceHostProvider.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/components/GuidelineWorkspacePage.js +2 -0
- package/dist/cjs/features/lsc-guidelines/components/GuidelineWorkspacePage.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/components/LearningManagementWrapper.js +2 -0
- package/dist/cjs/features/lsc-guidelines/components/LearningManagementWrapper.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/constants.js +1 -1
- package/dist/cjs/features/lsc-guidelines/hooks/useClearGuidelineCartOnReload.js +2 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useClearGuidelineCartOnReload.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useDebounce.js +2 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useDebounce.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useGuidelineCartMemstoreSync.js +2 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useGuidelineCartMemstoreSync.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useGuidelineDataCart.js +2 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useGuidelineDataCart.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useGuidelineSelection.js +1 -1
- package/dist/cjs/features/lsc-guidelines/hooks/useGuidelineWorkspaceLegacyBridge.js +2 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useGuidelineWorkspaceLegacyBridge.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useInstantLearningGuidelineCart.js +2 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useInstantLearningGuidelineCart.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useInstantLearningGuidelines.js +2 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useInstantLearningGuidelines.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useMemstoreGuidelineCart.js +2 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useMemstoreGuidelineCart.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useSavedGuidelines.js +2 -0
- package/dist/cjs/features/lsc-guidelines/hooks/useSavedGuidelines.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/index.js +1 -1
- package/dist/cjs/features/lsc-guidelines/queryClient.js +2 -0
- package/dist/cjs/features/lsc-guidelines/queryClient.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/services/guideline.api.js +2 -0
- package/dist/cjs/features/lsc-guidelines/services/guideline.api.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/services/guideline.cart.api.js +2 -0
- package/dist/cjs/features/lsc-guidelines/services/guideline.cart.api.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/services/guideline.content.js +2 -0
- package/dist/cjs/features/lsc-guidelines/services/guideline.content.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/services/guideline.runtime.config.js +2 -0
- package/dist/cjs/features/lsc-guidelines/services/guideline.runtime.config.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/services/guideline.session.js +2 -0
- package/dist/cjs/features/lsc-guidelines/services/guideline.session.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/services/instant-learning.api.js +2 -0
- package/dist/cjs/features/lsc-guidelines/services/instant-learning.api.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/services/instant-learning.wishlist.js +2 -0
- package/dist/cjs/features/lsc-guidelines/services/instant-learning.wishlist.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/theme.css +6 -0
- package/dist/cjs/features/lsc-guidelines/utils/addContextHelpers.js +2 -0
- package/dist/cjs/features/lsc-guidelines/utils/addContextHelpers.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/utils/cn.js +2 -0
- package/dist/cjs/features/lsc-guidelines/utils/cn.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/utils/guidelineFiles.js +2 -0
- package/dist/cjs/features/lsc-guidelines/utils/guidelineFiles.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/utils/guidelineOverlay.js +2 -0
- package/dist/cjs/features/lsc-guidelines/utils/guidelineOverlay.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/utils/guidelineSort.js +2 -0
- package/dist/cjs/features/lsc-guidelines/utils/guidelineSort.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/utils/microfrontend.js +2 -0
- package/dist/cjs/features/lsc-guidelines/utils/microfrontend.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/utils/session.js +2 -0
- package/dist/cjs/features/lsc-guidelines/utils/session.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/utils/url.js +2 -0
- package/dist/cjs/features/lsc-guidelines/utils/url.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/utils.js +1 -1
- package/dist/cjs/features/lsc-guidelines/workspace/GuidelineWorkspace.js +2 -0
- package/dist/cjs/features/lsc-guidelines/workspace/GuidelineWorkspace.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/workspace/GuidelineWorkspaceHydrator.js +2 -0
- package/dist/cjs/features/lsc-guidelines/workspace/GuidelineWorkspaceHydrator.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/workspace/GuidelineWorkspaceProvider.js +2 -0
- package/dist/cjs/features/lsc-guidelines/workspace/GuidelineWorkspaceProvider.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/workspace/useGuidelineWorkspace.js +2 -0
- package/dist/cjs/features/lsc-guidelines/workspace/useGuidelineWorkspace.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/workspace/workspace.context.js +2 -0
- package/dist/cjs/features/lsc-guidelines/workspace/workspace.context.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/workspace/workspace.runtime.js +2 -0
- package/dist/cjs/features/lsc-guidelines/workspace/workspace.runtime.js.map +1 -0
- package/dist/cjs/features/lsc-guidelines/workspace/workspace.selectors.js +2 -0
- package/dist/cjs/features/lsc-guidelines/workspace/workspace.selectors.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/node_modules/appsec-ui/dist/index.mjs.js +2 -0
- package/dist/cjs/node_modules/appsec-ui/dist/index.mjs.js.map +1 -0
- package/dist/cjs/node_modules/appsec-ui/node_modules/tailwind-merge/dist/bundle-mjs.mjs.js +2 -0
- package/dist/cjs/node_modules/appsec-ui/node_modules/tailwind-merge/dist/bundle-mjs.mjs.js.map +1 -0
- package/dist/cjs/node_modules/clsx/dist/clsx.mjs.js +2 -0
- package/dist/cjs/node_modules/clsx/dist/clsx.mjs.js.map +1 -0
- package/dist/cjs/node_modules/tailwind-merge/dist/bundle-mjs.mjs.js +2 -0
- package/dist/cjs/node_modules/tailwind-merge/dist/bundle-mjs.mjs.js.map +1 -0
- package/dist/cjs/node_modules/uuid/dist/native.js +2 -0
- package/dist/cjs/node_modules/uuid/dist/native.js.map +1 -0
- package/dist/cjs/node_modules/uuid/dist/rng.js +2 -0
- package/dist/cjs/node_modules/uuid/dist/rng.js.map +1 -0
- package/dist/cjs/node_modules/uuid/dist/stringify.js +2 -0
- package/dist/cjs/node_modules/uuid/dist/stringify.js.map +1 -0
- package/dist/cjs/node_modules/uuid/dist/v4.js +2 -0
- package/dist/cjs/node_modules/uuid/dist/v4.js.map +1 -0
- package/dist/components/AssignReminders/AssignReminderWrapper.js +1 -1
- package/dist/components/AssignReminders/components/LevelData.js +1 -1
- package/dist/components/PromptEditor/PromptEditor.js +2 -0
- package/dist/components/PromptEditor/PromptEditor.js.map +1 -0
- package/dist/components/ScopeTree/TreeTooltip.js +1 -1
- package/dist/features/lsc-guidelines/LscGuidelines.js +1 -1
- package/dist/features/lsc-guidelines/components/DataSourceCard.js +2 -0
- package/dist/features/lsc-guidelines/components/DataSourceCard.js.map +1 -0
- package/dist/features/lsc-guidelines/components/GuidelineAttachmentIcon.js +1 -1
- package/dist/features/lsc-guidelines/components/GuidelineCardMenu.js +1 -1
- package/dist/features/lsc-guidelines/components/GuidelineCart.js +1 -1
- package/dist/features/lsc-guidelines/components/GuidelineCartItem.js +1 -1
- package/dist/features/lsc-guidelines/components/GuidelineCreateForm.js +2 -0
- package/dist/features/lsc-guidelines/components/GuidelineCreateForm.js.map +1 -0
- package/dist/features/lsc-guidelines/components/GuidelineEditorWrapper.js +2 -0
- package/dist/features/lsc-guidelines/components/GuidelineEditorWrapper.js.map +1 -0
- package/dist/features/lsc-guidelines/components/GuidelineFilterPanel.js +2 -0
- package/dist/features/lsc-guidelines/components/GuidelineFilterPanel.js.map +1 -0
- package/dist/features/lsc-guidelines/components/GuidelineLandingPage.js +1 -1
- package/dist/features/lsc-guidelines/components/GuidelineLibrary.js +1 -1
- package/dist/features/lsc-guidelines/components/GuidelineLibraryCard.js +1 -1
- package/dist/features/lsc-guidelines/components/GuidelinePopoverCart.js +1 -1
- package/dist/features/lsc-guidelines/components/GuidelineTooltip.js +1 -1
- package/dist/features/lsc-guidelines/components/GuidelineWorkspaceHostProvider.js +2 -0
- package/dist/features/lsc-guidelines/components/GuidelineWorkspaceHostProvider.js.map +1 -0
- package/dist/features/lsc-guidelines/components/GuidelineWorkspacePage.js +2 -0
- package/dist/features/lsc-guidelines/components/GuidelineWorkspacePage.js.map +1 -0
- package/dist/features/lsc-guidelines/components/LearningManagementWrapper.js +2 -0
- package/dist/features/lsc-guidelines/components/LearningManagementWrapper.js.map +1 -0
- package/dist/features/lsc-guidelines/constants.js +1 -1
- package/dist/features/lsc-guidelines/hooks/useClearGuidelineCartOnReload.js +2 -0
- package/dist/features/lsc-guidelines/hooks/useClearGuidelineCartOnReload.js.map +1 -0
- package/dist/features/lsc-guidelines/hooks/useDebounce.js +2 -0
- package/dist/features/lsc-guidelines/hooks/useDebounce.js.map +1 -0
- package/dist/features/lsc-guidelines/hooks/useGuidelineCartMemstoreSync.js +2 -0
- package/dist/features/lsc-guidelines/hooks/useGuidelineCartMemstoreSync.js.map +1 -0
- package/dist/features/lsc-guidelines/hooks/useGuidelineDataCart.js +2 -0
- package/dist/features/lsc-guidelines/hooks/useGuidelineDataCart.js.map +1 -0
- package/dist/features/lsc-guidelines/hooks/useGuidelineSelection.js +1 -1
- package/dist/features/lsc-guidelines/hooks/useGuidelineWorkspaceLegacyBridge.js +2 -0
- package/dist/features/lsc-guidelines/hooks/useGuidelineWorkspaceLegacyBridge.js.map +1 -0
- package/dist/features/lsc-guidelines/hooks/useInstantLearningGuidelineCart.js +2 -0
- package/dist/features/lsc-guidelines/hooks/useInstantLearningGuidelineCart.js.map +1 -0
- package/dist/features/lsc-guidelines/hooks/useInstantLearningGuidelines.js +2 -0
- package/dist/features/lsc-guidelines/hooks/useInstantLearningGuidelines.js.map +1 -0
- package/dist/features/lsc-guidelines/hooks/useMemstoreGuidelineCart.js +2 -0
- package/dist/features/lsc-guidelines/hooks/useMemstoreGuidelineCart.js.map +1 -0
- package/dist/features/lsc-guidelines/hooks/useSavedGuidelines.js +2 -0
- package/dist/features/lsc-guidelines/hooks/useSavedGuidelines.js.map +1 -0
- package/dist/features/lsc-guidelines/index.js +1 -1
- package/dist/features/lsc-guidelines/queryClient.js +2 -0
- package/dist/features/lsc-guidelines/queryClient.js.map +1 -0
- package/dist/features/lsc-guidelines/services/guideline.api.js +2 -0
- package/dist/features/lsc-guidelines/services/guideline.api.js.map +1 -0
- package/dist/features/lsc-guidelines/services/guideline.cart.api.js +2 -0
- package/dist/features/lsc-guidelines/services/guideline.cart.api.js.map +1 -0
- package/dist/features/lsc-guidelines/services/guideline.content.js +2 -0
- package/dist/features/lsc-guidelines/services/guideline.content.js.map +1 -0
- package/dist/features/lsc-guidelines/services/guideline.runtime.config.js +2 -0
- package/dist/features/lsc-guidelines/services/guideline.runtime.config.js.map +1 -0
- package/dist/features/lsc-guidelines/services/guideline.session.js +2 -0
- package/dist/features/lsc-guidelines/services/guideline.session.js.map +1 -0
- package/dist/features/lsc-guidelines/services/instant-learning.api.js +2 -0
- package/dist/features/lsc-guidelines/services/instant-learning.api.js.map +1 -0
- package/dist/features/lsc-guidelines/services/instant-learning.wishlist.js +2 -0
- package/dist/features/lsc-guidelines/services/instant-learning.wishlist.js.map +1 -0
- package/dist/features/lsc-guidelines/theme.css +6 -0
- package/dist/features/lsc-guidelines/utils/addContextHelpers.js +2 -0
- package/dist/features/lsc-guidelines/utils/addContextHelpers.js.map +1 -0
- package/dist/features/lsc-guidelines/utils/cn.js +2 -0
- package/dist/features/lsc-guidelines/utils/cn.js.map +1 -0
- package/dist/features/lsc-guidelines/utils/guidelineFiles.js +2 -0
- package/dist/features/lsc-guidelines/utils/guidelineFiles.js.map +1 -0
- package/dist/features/lsc-guidelines/utils/guidelineOverlay.js +2 -0
- package/dist/features/lsc-guidelines/utils/guidelineOverlay.js.map +1 -0
- package/dist/features/lsc-guidelines/utils/guidelineSort.js +2 -0
- package/dist/features/lsc-guidelines/utils/guidelineSort.js.map +1 -0
- package/dist/features/lsc-guidelines/utils/microfrontend.js +2 -0
- package/dist/features/lsc-guidelines/utils/microfrontend.js.map +1 -0
- package/dist/features/lsc-guidelines/utils/session.js +2 -0
- package/dist/features/lsc-guidelines/utils/session.js.map +1 -0
- package/dist/features/lsc-guidelines/utils/url.js +2 -0
- package/dist/features/lsc-guidelines/utils/url.js.map +1 -0
- package/dist/features/lsc-guidelines/utils.js +1 -1
- package/dist/features/lsc-guidelines/workspace/GuidelineWorkspace.js +2 -0
- package/dist/features/lsc-guidelines/workspace/GuidelineWorkspace.js.map +1 -0
- package/dist/features/lsc-guidelines/workspace/GuidelineWorkspaceHydrator.js +2 -0
- package/dist/features/lsc-guidelines/workspace/GuidelineWorkspaceHydrator.js.map +1 -0
- package/dist/features/lsc-guidelines/workspace/GuidelineWorkspaceProvider.js +2 -0
- package/dist/features/lsc-guidelines/workspace/GuidelineWorkspaceProvider.js.map +1 -0
- package/dist/features/lsc-guidelines/workspace/useGuidelineWorkspace.js +2 -0
- package/dist/features/lsc-guidelines/workspace/useGuidelineWorkspace.js.map +1 -0
- package/dist/features/lsc-guidelines/workspace/workspace.context.js +2 -0
- package/dist/features/lsc-guidelines/workspace/workspace.context.js.map +1 -0
- package/dist/features/lsc-guidelines/workspace/workspace.runtime.js +2 -0
- package/dist/features/lsc-guidelines/workspace/workspace.runtime.js.map +1 -0
- package/dist/features/lsc-guidelines/workspace/workspace.selectors.js +2 -0
- package/dist/features/lsc-guidelines/workspace/workspace.selectors.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/node_modules/appsec-ui/dist/index.mjs.js +2 -0
- package/dist/node_modules/appsec-ui/dist/index.mjs.js.map +1 -0
- package/dist/node_modules/appsec-ui/node_modules/tailwind-merge/dist/bundle-mjs.mjs.js +2 -0
- package/dist/node_modules/appsec-ui/node_modules/tailwind-merge/dist/bundle-mjs.mjs.js.map +1 -0
- package/dist/node_modules/clsx/dist/clsx.mjs.js +2 -0
- package/dist/node_modules/clsx/dist/clsx.mjs.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.mjs.js +2 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.mjs.js.map +1 -0
- package/dist/node_modules/uuid/dist/native.js +2 -0
- package/dist/node_modules/uuid/dist/native.js.map +1 -0
- package/dist/node_modules/uuid/dist/rng.js +2 -0
- package/dist/node_modules/uuid/dist/rng.js.map +1 -0
- package/dist/node_modules/uuid/dist/stringify.js +2 -0
- package/dist/node_modules/uuid/dist/stringify.js.map +1 -0
- package/dist/node_modules/uuid/dist/v4.js +2 -0
- package/dist/node_modules/uuid/dist/v4.js.map +1 -0
- package/dist/types/components/AssignReminders/styles/AssignLevelsDatePickerStyles.d.ts +1 -0
- package/dist/types/components/AssignReminders/styles/AssignLevelsDatePickerStyles.d.ts.map +1 -1
- package/dist/types/components/AssignReminders/styles/AssignReminderStyles.d.ts +1 -0
- package/dist/types/components/AssignReminders/styles/AssignReminderStyles.d.ts.map +1 -1
- package/dist/types/components/AssignReminders/styles/AssignReminderWrapperStyles.d.ts +1 -0
- package/dist/types/components/AssignReminders/styles/AssignReminderWrapperStyles.d.ts.map +1 -1
- package/dist/types/components/AssignReminders/styles/ReviewStatusStyles.d.ts +1 -0
- package/dist/types/components/AssignReminders/styles/ReviewStatusStyles.d.ts.map +1 -1
- package/dist/types/components/PromptEditor/PromptEditor.d.ts +16 -0
- package/dist/types/components/PromptEditor/PromptEditor.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/LscGuidelines.d.ts +1 -1
- package/dist/types/features/lsc-guidelines/LscGuidelines.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/components/DataSourceCard.d.ts +5 -0
- package/dist/types/features/lsc-guidelines/components/DataSourceCard.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/components/GuidelineAttachmentIcon.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/components/GuidelineCardMenu.d.ts +1 -7
- package/dist/types/features/lsc-guidelines/components/GuidelineCardMenu.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/components/GuidelineCartItem.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/components/GuidelineCreateForm.d.ts +4 -0
- package/dist/types/features/lsc-guidelines/components/GuidelineCreateForm.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/components/GuidelineEditorWrapper.d.ts +11 -0
- package/dist/types/features/lsc-guidelines/components/GuidelineEditorWrapper.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/components/GuidelineFilterPanel.d.ts +9 -0
- package/dist/types/features/lsc-guidelines/components/GuidelineFilterPanel.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/components/GuidelineLandingPage.d.ts +1 -1
- package/dist/types/features/lsc-guidelines/components/GuidelineLandingPage.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/components/GuidelineLibrary.d.ts +21 -8
- package/dist/types/features/lsc-guidelines/components/GuidelineLibrary.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/components/GuidelineLibraryCard.d.ts +9 -2
- package/dist/types/features/lsc-guidelines/components/GuidelineLibraryCard.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/components/GuidelineWorkspaceHostProvider.d.ts +8 -0
- package/dist/types/features/lsc-guidelines/components/GuidelineWorkspaceHostProvider.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/components/GuidelineWorkspacePage.d.ts +24 -0
- package/dist/types/features/lsc-guidelines/components/GuidelineWorkspacePage.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/components/LearningManagementWrapper.d.ts +19 -0
- package/dist/types/features/lsc-guidelines/components/LearningManagementWrapper.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/constants.d.ts +47 -0
- package/dist/types/features/lsc-guidelines/constants.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/hooks/useClearGuidelineCartOnReload.d.ts +2 -0
- package/dist/types/features/lsc-guidelines/hooks/useClearGuidelineCartOnReload.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/hooks/useDebounce.d.ts +2 -0
- package/dist/types/features/lsc-guidelines/hooks/useDebounce.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/hooks/useGuidelineCartMemstoreSync.d.ts +15 -0
- package/dist/types/features/lsc-guidelines/hooks/useGuidelineCartMemstoreSync.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/hooks/useGuidelineDataCart.d.ts +6 -0
- package/dist/types/features/lsc-guidelines/hooks/useGuidelineDataCart.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/hooks/useGuidelineSelection.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/hooks/useGuidelineWorkspaceLegacyBridge.d.ts +5 -0
- package/dist/types/features/lsc-guidelines/hooks/useGuidelineWorkspaceLegacyBridge.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/hooks/useInstantLearningGuidelineCart.d.ts +191 -0
- package/dist/types/features/lsc-guidelines/hooks/useInstantLearningGuidelineCart.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/hooks/useInstantLearningGuidelines.d.ts +179 -0
- package/dist/types/features/lsc-guidelines/hooks/useInstantLearningGuidelines.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/hooks/useMemstoreGuidelineCart.d.ts +187 -0
- package/dist/types/features/lsc-guidelines/hooks/useMemstoreGuidelineCart.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/hooks/useSavedGuidelines.d.ts +177 -0
- package/dist/types/features/lsc-guidelines/hooks/useSavedGuidelines.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/index.d.ts +34 -2
- package/dist/types/features/lsc-guidelines/index.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/queryClient.d.ts +3 -0
- package/dist/types/features/lsc-guidelines/queryClient.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/services/guideline.api.d.ts +19 -0
- package/dist/types/features/lsc-guidelines/services/guideline.api.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/services/guideline.cart.api.d.ts +28 -0
- package/dist/types/features/lsc-guidelines/services/guideline.cart.api.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/services/guideline.chat.d.ts +2 -0
- package/dist/types/features/lsc-guidelines/services/guideline.chat.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/services/guideline.content.d.ts +3 -0
- package/dist/types/features/lsc-guidelines/services/guideline.content.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/services/guideline.runtime.config.d.ts +68 -0
- package/dist/types/features/lsc-guidelines/services/guideline.runtime.config.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/services/guideline.session.d.ts +10 -0
- package/dist/types/features/lsc-guidelines/services/guideline.session.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/services/instant-learning.api.d.ts +109 -0
- package/dist/types/features/lsc-guidelines/services/instant-learning.api.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/services/instant-learning.wishlist.d.ts +8 -0
- package/dist/types/features/lsc-guidelines/services/instant-learning.wishlist.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/types/add-context.types.d.ts +38 -0
- package/dist/types/features/lsc-guidelines/types/add-context.types.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/types/api.types.d.ts +116 -0
- package/dist/types/features/lsc-guidelines/types/api.types.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/types/file-item.d.ts +45 -0
- package/dist/types/features/lsc-guidelines/types/file-item.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/types/guideline.api.types.d.ts +11 -0
- package/dist/types/features/lsc-guidelines/types/guideline.api.types.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/types/guideline.types.d.ts +41 -0
- package/dist/types/features/lsc-guidelines/types/guideline.types.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/types.d.ts +214 -2
- package/dist/types/features/lsc-guidelines/types.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/utils/addContextHelpers.d.ts +7 -0
- package/dist/types/features/lsc-guidelines/utils/addContextHelpers.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/utils/cn.d.ts +3 -0
- package/dist/types/features/lsc-guidelines/utils/cn.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/utils/guidelineFiles.d.ts +17 -0
- package/dist/types/features/lsc-guidelines/utils/guidelineFiles.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/utils/guidelineOverlay.d.ts +3 -0
- package/dist/types/features/lsc-guidelines/utils/guidelineOverlay.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/utils/guidelineSort.d.ts +3 -0
- package/dist/types/features/lsc-guidelines/utils/guidelineSort.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/utils/microfrontend.d.ts +13 -0
- package/dist/types/features/lsc-guidelines/utils/microfrontend.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/utils/session.d.ts +4 -0
- package/dist/types/features/lsc-guidelines/utils/session.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/utils/url.d.ts +2 -0
- package/dist/types/features/lsc-guidelines/utils/url.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/utils.d.ts +10 -1
- package/dist/types/features/lsc-guidelines/utils.d.ts.map +1 -1
- package/dist/types/features/lsc-guidelines/workspace/GuidelineWorkspace.d.ts +23 -0
- package/dist/types/features/lsc-guidelines/workspace/GuidelineWorkspace.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/workspace/GuidelineWorkspaceHydrator.d.ts +2 -0
- package/dist/types/features/lsc-guidelines/workspace/GuidelineWorkspaceHydrator.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/workspace/GuidelineWorkspaceProvider.d.ts +8 -0
- package/dist/types/features/lsc-guidelines/workspace/GuidelineWorkspaceProvider.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/workspace/useGuidelineWorkspace.d.ts +44 -0
- package/dist/types/features/lsc-guidelines/workspace/useGuidelineWorkspace.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/workspace/workspace.context.d.ts +9 -0
- package/dist/types/features/lsc-guidelines/workspace/workspace.context.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/workspace/workspace.runtime.d.ts +12 -0
- package/dist/types/features/lsc-guidelines/workspace/workspace.runtime.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/workspace/workspace.selectors.d.ts +5 -0
- package/dist/types/features/lsc-guidelines/workspace/workspace.selectors.d.ts.map +1 -0
- package/dist/types/features/lsc-guidelines/workspace/workspace.types.d.ts +87 -0
- package/dist/types/features/lsc-guidelines/workspace/workspace.types.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +16 -7
- package/dist/cjs/components/AssignReminders/AssignReminderTest.js +0 -2
- package/dist/cjs/components/AssignReminders/AssignReminderTest.js.map +0 -1
- package/dist/cjs/node_modules/@floating-ui/core/dist/floating-ui.core.mjs.js +0 -2
- package/dist/cjs/node_modules/@floating-ui/core/dist/floating-ui.core.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs.js +0 -2
- package/dist/cjs/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs.js +0 -2
- package/dist/cjs/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs.js +0 -2
- package/dist/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs.js +0 -2
- package/dist/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/primitive/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/primitive/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-arrow/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-arrow/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-compose-refs/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-compose-refs/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-context/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-context/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-id/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-id/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-popper/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-popper/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-portal/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-portal/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-presence/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-presence/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-primitive/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-primitive/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-slot/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-slot/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-tooltip/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-tooltip/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-use-escape-keydown/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-use-escape-keydown/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-use-size/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-use-size/dist/index.mjs.js.map +0 -1
- package/dist/cjs/node_modules/@radix-ui/react-visually-hidden/dist/index.mjs.js +0 -2
- package/dist/cjs/node_modules/@radix-ui/react-visually-hidden/dist/index.mjs.js.map +0 -1
- package/dist/components/AssignReminders/AssignReminderTest.js +0 -2
- package/dist/components/AssignReminders/AssignReminderTest.js.map +0 -1
- package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.mjs.js +0 -2
- package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.mjs.js.map +0 -1
- package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs.js +0 -2
- package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs.js.map +0 -1
- package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs.js +0 -2
- package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs.js.map +0 -1
- package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs.js +0 -2
- package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs.js.map +0 -1
- package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs.js +0 -2
- package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/primitive/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/primitive/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-arrow/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-arrow/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-compose-refs/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-compose-refs/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-context/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-context/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-id/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-id/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-popper/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-popper/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-portal/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-portal/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-presence/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-presence/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-slot/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-slot/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-use-size/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-use-size/dist/index.mjs.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.mjs.js +0 -2
- package/dist/node_modules/@radix-ui/react-visually-hidden/dist/index.mjs.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs.js","sources":["../../../../../node_modules/appsec-ui/dist/index.mjs"],"sourcesContent":["import React11, { createContext, forwardRef, memo, useState, useRef, useMemo, useEffect, useCallback, useContext } from 'react';\nimport { QueryClient, useQueryClient, useMutation, useQuery, QueryClientProvider } from '@tanstack/react-query';\nimport { jsxs, jsx, Fragment } from 'react/jsx-runtime';\nimport { Search, X, Trash2, ChevronLeft, ChevronRight, FileText, Users, Share2, ChevronUp, ChevronDown, Layers, Pencil, Plus, AlertTriangle, ChevronsUpDown, Upload, Download, GripVertical, CheckCircle2, ArrowRight, Check, Copy, UserPlus, UserMinus, Box, Key, Shield, Network, Users2, Settings2, Info, XCircle, CheckCircle, Minimize2, Maximize2 } from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n// src/context/AppsecProvider.tsx\n\n// src/api/client.ts\nvar createApiClient = (baseUrl, getAuthToken) => {\n const request = async (path, options = {}) => {\n const token = getAuthToken?.();\n const res = await fetch(`${baseUrl}${path}`, {\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...token && { Authorization: `Bearer ${token}` },\n ...options.headers\n }\n });\n if (!res.ok) {\n let msg = `Request failed (${res.status})`;\n try {\n const body = await res.json();\n if (body?.message) msg = body.message;\n } catch {\n }\n throw new Error(msg);\n }\n return res.json();\n };\n return { request };\n};\n\n// src/api/adapter.ts\nvar createRbacApi = (client) => ({\n importConfig: (appId, data) => client.request(`/rbac/import-json`, {\n method: \"POST\",\n body: JSON.stringify(data)\n }),\n getAppId: (name) => client.request(`/apps?name=${name}`, {\n method: \"GET\"\n }),\n getModules: (appId, page, limit, name = \"\") => client.request(`/modules?appId=${appId}${page ? `&page=${page}` : \"\"}${limit ? `&limit=${limit}` : \"\"}${name ? `&name=${encodeURIComponent(name)}` : \"\"}`, {\n method: \"GET\"\n }),\n getRoles: (appId, page, limit, name = \"\") => client.request(`/roles?appId=${appId}${page ? `&page=${page}` : \"\"}${limit ? `&limit=${limit}` : \"\"}${name ? `&name=${encodeURIComponent(name)}` : \"\"}`, {\n method: \"GET\"\n }),\n getPermission: (appId, page, limit, name = \"\") => client.request(`/permissions?appId=${appId}${page ? `&page=${page}` : \"\"}${limit ? `&limit=${limit}` : \"\"}${name ? `&name=${encodeURIComponent(name)}` : \"\"}`, {\n method: \"GET\"\n }),\n getAcls: (appId, page = 1, limit = 50, resourceId, pagination = true) => client.request(\n `/acl?application=${appId}${pagination ? `&page=${page}&limit=${limit}` : \"&pagination=false\"}${resourceId ? `&resourceId=${resourceId}` : \"\"}`,\n {\n method: \"GET\"\n }\n ),\n getResourceForModuleId: (moduleId, page = 1, limit = 30) => client.request(`/resource?module=${moduleId}&page=${page}&limit=${limit}`, {\n method: \"GET\"\n }),\n getRoleModuleMapping: (appId) => client.request(`/modules/mapping?appId=${appId}`, {\n method: \"GET\"\n }),\n createAcl: (data) => client.request(\"/acl\", {\n method: \"POST\",\n body: JSON.stringify(data)\n }),\n deleteAcl: (id) => client.request(`/acl?_id=${id}`, {\n method: \"DELETE\"\n }),\n bulkUpdateAcl: (data) => client.request(\"/acl/bulkUpdate\", {\n method: \"PUT\",\n body: JSON.stringify(data)\n }),\n updateModule: (id, data) => client.request(`/modules/update/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(data)\n }),\n createModule: (data) => client.request(\"/modules/create\", {\n method: \"POST\",\n body: JSON.stringify(data)\n }),\n deleteModule: (id) => client.request(`/modules/${id}`, {\n method: \"DELETE\"\n }),\n createPermission: (data) => client.request(`/permissions`, {\n method: \"POST\",\n body: JSON.stringify(data)\n }),\n updatePermission: (id, data) => client.request(`/permissions/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(data)\n }),\n deletePermission: (id) => client.request(`/permissions?id=${id}`, {\n method: \"DELETE\"\n }),\n createRole: (data) => client.request(`/roles`, {\n method: \"POST\",\n body: JSON.stringify(data)\n }),\n updateRole: (id, data) => client.request(`/roles/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(data)\n }),\n deleteRole: (id) => client.request(`/roles/${id}`, {\n method: \"DELETE\"\n }),\n updateModuleMapping: (data) => client.request(`/modules/updateMapping`, {\n method: \"PUT\",\n body: JSON.stringify(data)\n }),\n getGroups: (appId, page = 1, limit = 30) => client.request(`/groups?appId=${appId}&page=${page}&limit=${limit}`, {\n method: \"GET\"\n }),\n updateGroup: (id, data) => client.request(`/groups/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(data)\n }),\n deleteGroup: (id) => client.request(`/groups/${id}`, {\n method: \"DELETE\"\n }),\n createGroup: (data) => client.request(`/groups`, {\n method: \"POST\",\n body: JSON.stringify(data)\n }),\n searchUsers: (query) => client.request(`/users/search?q=${encodeURIComponent(query)}`, {\n method: \"GET\"\n }),\n getResourceGroups: (appId, moduleId, page = 1, limit = 30) => client.request(\n `/resource-group?application=${appId}&module=${moduleId}&page=${page}&limit=${limit}`,\n {\n method: \"GET\"\n }\n ),\n createResourceGroup: (data) => client.request(\"/resource-group\", {\n method: \"POST\",\n body: JSON.stringify(data)\n }),\n updateResourceGroup: (id, data) => client.request(`/resource-group/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(data)\n }),\n deleteResourceGroup: (id) => client.request(`/resource-group/${id}`, {\n method: \"DELETE\"\n }),\n shareResourceGroup: (data) => client.request(\"/acl/resource-group\", {\n method: \"POST\",\n body: JSON.stringify(data)\n }),\n sendMail: (data) => client.request(\"/mail\", {\n method: \"POST\",\n body: JSON.stringify(data)\n }),\n deleteAclsByResourceGroup: (data) => client.request(\"/acl/resource-group\", {\n method: \"DELETE\",\n body: JSON.stringify(data)\n })\n});\nvar queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1e3,\n // 5 minutes\n gcTime: 10 * 60 * 1e3,\n // 10 minutes (formerly cacheTime)\n retry: (failureCount, error) => {\n if (error instanceof Error && error.message.includes(\"4\")) {\n return false;\n }\n return failureCount < 3;\n },\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false\n },\n mutations: {\n retry: false\n }\n }\n});\nfunction RbacQueryProvider({ children }) {\n return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children });\n}\nfunction cn(...inputs) {\n return twMerge(clsx(inputs));\n}\nvar ToastContext = createContext(null);\nvar ICONS = {\n success: /* @__PURE__ */ jsx(CheckCircle, { className: \"h-4 w-4 shrink-0 text-appsec-success\" }),\n error: /* @__PURE__ */ jsx(XCircle, { className: \"h-4 w-4 shrink-0 text-appsec-danger\" }),\n info: /* @__PURE__ */ jsx(Info, { className: \"h-4 w-4 shrink-0 text-appsec-primary\" })\n};\nvar STYLES = {\n success: \"border-appsec-success/30 bg-appsec-success-light text-appsec-text\",\n error: \"border-appsec-danger/30 bg-appsec-danger-light text-appsec-text\",\n info: \"border-appsec-primary/30 bg-appsec-primary-light text-appsec-text\"\n};\nvar AUTO_DISMISS_MS = 4e3;\nfunction ToastEntry({ toast, onDismiss }) {\n const [visible, setVisible] = useState(false);\n useEffect(() => {\n const raf = requestAnimationFrame(() => setVisible(true));\n return () => cancelAnimationFrame(raf);\n }, []);\n useEffect(() => {\n const t = setTimeout(() => {\n setVisible(false);\n setTimeout(onDismiss, 200);\n }, AUTO_DISMISS_MS);\n return () => clearTimeout(t);\n }, [onDismiss]);\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"flex items-start gap-2.5 px-3 py-2.5 rounded-appsec border shadow-sm max-w-xs w-full pointer-events-auto\",\n \"transition-all duration-200\",\n visible ? \"opacity-100 translate-x-0\" : \"opacity-0 translate-x-4\",\n STYLES[toast.type]\n ),\n children: [\n ICONS[toast.type],\n /* @__PURE__ */ jsx(\"p\", { className: \"flex-1 text-xs leading-snug\", children: toast.message }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => {\n setVisible(false);\n setTimeout(onDismiss, 200);\n },\n className: \"shrink-0 p-0.5 rounded hover:bg-black/10 transition-colors\",\n children: /* @__PURE__ */ jsx(X, { className: \"h-3 w-3 text-appsec-text-secondary\" })\n }\n )\n ]\n }\n );\n}\nfunction ToastProvider({ children }) {\n const [toasts, setToasts] = useState([]);\n const addToast = useCallback((type, message) => {\n const id = Math.random().toString(36).slice(2, 9);\n setToasts((prev) => [...prev, { id, type, message }]);\n }, []);\n const removeToast = useCallback((id) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n return /* @__PURE__ */ jsxs(ToastContext.Provider, { value: { addToast }, children: [\n children,\n /* @__PURE__ */ jsx(\"div\", { className: \"fixed top-4 right-4 z-[9999] flex flex-col gap-2 pointer-events-none\", children: toasts.map((t) => /* @__PURE__ */ jsx(ToastEntry, { toast: t, onDismiss: () => removeToast(t.id) }, t.id)) })\n ] });\n}\nfunction useToast() {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error(\"useToast must be used inside <ToastProvider>\");\n return {\n success: (message) => ctx.addToast(\"success\", message),\n error: (message) => ctx.addToast(\"error\", message),\n info: (message) => ctx.addToast(\"info\", message)\n };\n}\nvar DEFAULT_BADGE_COLORS = {\n admin: { bg: \"bg-appsec-danger-light\", text: \"text-appsec-danger\" },\n editor: { bg: \"bg-appsec-warning-light\", text: \"text-appsec-warning\" },\n viewer: { bg: \"bg-appsec-success-light\", text: \"text-appsec-success\" }\n};\nvar AppsecContext = createContext(null);\nfunction AppsecProvider({\n children,\n appId,\n mode,\n appsecUrl,\n roleTemplates = [],\n badgeColorMap = {},\n onError,\n baseUrl,\n getAuthToken\n}) {\n const [isLoading, setIsLoading] = useState(false);\n const [lastError, setLastError] = useState(null);\n const setLoading = useCallback((loading) => {\n setIsLoading(loading);\n }, []);\n const setError = useCallback(\n (err) => {\n setLastError(err);\n if (err && onError) onError(err);\n },\n [onError]\n );\n const clearError = useCallback(() => setLastError(null), []);\n const currentUserEmail = useMemo(() => {\n if (!getAuthToken) return \"\";\n try {\n const token = getAuthToken();\n const payload = JSON.parse(atob(token.split(\".\")[1]));\n return payload.email || \"\";\n } catch {\n return \"\";\n }\n }, [getAuthToken]);\n const finalAdapter = useMemo(() => {\n if (!baseUrl) {\n throw new Error(\"Either apiAdapter or baseUrl must be provided\");\n }\n const client = createApiClient(baseUrl, getAuthToken);\n return createRbacApi(client);\n }, [baseUrl, getAuthToken]);\n const mergedBadgeColors = {\n ...DEFAULT_BADGE_COLORS,\n ...badgeColorMap\n };\n const value = {\n adapter: finalAdapter,\n appId,\n baseUrl,\n appsecUrl,\n mode,\n roleTemplates,\n badgeColorMap: mergedBadgeColors,\n isLoading,\n setLoading,\n lastError,\n setError,\n clearError,\n currentUserEmail\n };\n return /* @__PURE__ */ jsx(RbacQueryProvider, { children: /* @__PURE__ */ jsx(AppsecContext.Provider, { value, children: /* @__PURE__ */ jsx(ToastProvider, { children }) }) });\n}\nfunction useAppsec() {\n const ctx = useContext(AppsecContext);\n if (!ctx) {\n throw new Error(\"useAppsec must be used inside <AppsecProvider>.\");\n }\n return ctx;\n}\nvar variantClasses = {\n primary: \"bg-appsec-primary text-white hover:opacity-90 disabled:opacity-50\",\n secondary: \"border border-appsec-border bg-appsec-bg text-appsec-text hover:bg-appsec-surface disabled:opacity-50\",\n danger: \"bg-appsec-danger text-white hover:opacity-90 disabled:opacity-50\",\n ghost: \"bg-transparent text-appsec-text-secondary hover:bg-appsec-surface disabled:opacity-50\",\n link: \"bg-transparent text-appsec-primary underline-offset-2 hover:underline p-0 h-auto disabled:opacity-50\"\n};\nvar sizeClasses = {\n sm: \"h-8 px-3 text-xs gap-1.5\",\n md: \"h-9 px-4 text-sm gap-2\",\n lg: \"h-10 px-5 text-sm gap-2\"\n};\nvar Button = forwardRef(\n ({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n iconLeft,\n iconRight,\n children,\n className,\n disabled,\n ...rest\n }, ref) => {\n const isDisabled = disabled || loading;\n return /* @__PURE__ */ jsxs(\n \"button\",\n {\n ref,\n disabled: isDisabled,\n className: cn(\n \"inline-flex items-center justify-center font-medium rounded-appsec transition-all\",\n \"select-none cursor-pointer disabled:cursor-not-allowed\",\n variantClasses[variant],\n variant !== \"link\" && sizeClasses[size],\n className\n ),\n ...rest,\n children: [\n loading ? /* @__PURE__ */ jsx(\"span\", { className: \"inline-block h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" }) : iconLeft,\n children && /* @__PURE__ */ jsx(\"span\", { children }),\n !loading && iconRight\n ]\n }\n );\n }\n);\nButton.displayName = \"Button\";\nvar Input = forwardRef(\n ({\n label,\n error,\n hint,\n iconLeft,\n iconRight,\n wrapperClassName,\n className,\n id,\n lscId,\n lscLabel,\n lscDescription,\n lscWhenToApply,\n lscWhenNotToApply,\n ...rest\n }, ref) => {\n const inputId = id ?? (label ? label.toLowerCase().replace(/\\s+/g, \"-\") : void 0);\n return /* @__PURE__ */ jsxs(\"div\", { className: cn(\"flex flex-col gap-1\", wrapperClassName), children: [\n label && /* @__PURE__ */ jsx(\n \"label\",\n {\n htmlFor: inputId,\n className: \"text-sm font-medium text-appsec-text\",\n children: label\n }\n ),\n /* @__PURE__ */ jsxs(\"div\", { className: \"relative flex items-center\", children: [\n iconLeft && /* @__PURE__ */ jsx(\"span\", { className: \"absolute left-3 text-appsec-text-tertiary flex items-center pointer-events-none\", children: iconLeft }),\n /* @__PURE__ */ jsx(\n \"input\",\n {\n ref,\n id: inputId,\n \"data-lsc-ui-id\": lscId,\n \"data-lsc-ui-type\": lscId ? \"input\" : void 0,\n \"data-lsc-ui-label\": lscLabel,\n \"data-lsc-ui-description\": lscDescription,\n \"data-lsc-ui-when-to-apply\": lscWhenToApply,\n \"data-lsc-ui-when-not-to-apply\": lscWhenNotToApply,\n \"data-lsc-ui-interact-behaviour-control\": lscId ? \"mode\" : void 0,\n className: cn(\n \"w-full h-9 rounded-appsec border border-appsec-border bg-appsec-bg px-3 py-2\",\n \"text-sm text-appsec-text placeholder:text-appsec-text-tertiary\",\n \"transition-colors outline-none\",\n \"focus:border-appsec-primary focus:ring-2 focus:ring-appsec-primary-light\",\n \"disabled:bg-appsec-surface disabled:cursor-not-allowed disabled:opacity-60\",\n error && \"border-appsec-danger focus:border-appsec-danger focus:ring-appsec-danger-light\",\n iconLeft && \"pl-9\",\n iconRight && \"pr-9\",\n className\n ),\n ...rest\n }\n ),\n iconRight && /* @__PURE__ */ jsx(\"span\", { className: \"absolute right-3 text-appsec-text-tertiary flex items-center pointer-events-none\", children: iconRight })\n ] }),\n error && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: error }),\n !error && hint && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-secondary\", children: hint })\n ] });\n }\n);\nInput.displayName = \"Input\";\n\n// src/utils/validators.ts\nfunction isNonEmpty(value) {\n return value.trim().length > 0;\n}\nfunction isWithinLength(value, max) {\n return value.trim().length <= max;\n}\nfunction validateAppRegistration(values) {\n const errors = {};\n if (!isNonEmpty(values.name)) errors.name = \"App name is required.\";\n else if (!isWithinLength(values.name, 80)) errors.name = \"App name must be 80 characters or fewer.\";\n return errors;\n}\nvar fallbackApiInstance = null;\nvar createRemoteMicroFrontendManager = () => {\n if (fallbackApiInstance) {\n return fallbackApiInstance;\n }\n const eventHandlers = /* @__PURE__ */ new Map();\n const api = {\n dispatch(eventName, payload) {\n console.log(\"[Remote] Dispatching event:\", eventName, payload);\n const handlers = eventHandlers.get(eventName);\n if (handlers) {\n handlers.forEach((handler) => handler(payload));\n }\n },\n subscribe(eventName, handler) {\n if (!eventHandlers.has(eventName)) {\n eventHandlers.set(eventName, /* @__PURE__ */ new Set());\n }\n const handlers = eventHandlers.get(eventName);\n handlers?.add(handler);\n console.log(\"[Remote] Subscribed to event:\", eventName);\n return () => api.unsubscribe(eventName, handler);\n },\n unsubscribe(eventName, handler) {\n const handlers = eventHandlers.get(eventName);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n eventHandlers.delete(eventName);\n }\n }\n }\n };\n fallbackApiInstance = api;\n return api;\n};\nvar useMicroFrontendApi = () => {\n const apiRef = useRef(null);\n if (!apiRef.current) {\n if (window.hostMicroFrontendApi) {\n apiRef.current = window.hostMicroFrontendApi;\n } else {\n console.warn(\"[Admin Settings] No hostMicroFrontendApi found. Creating fallback local manager.\");\n apiRef.current = createRemoteMicroFrontendManager();\n window.hostMicroFrontendApi = apiRef.current;\n }\n }\n return apiRef.current;\n};\nvar LABELS = {\n heading: \"Register your mode\",\n subheading: \"Tell us a bit about the app you want to manage access for.\",\n namePlaceholder: \"e.g. Admin Dashboard\",\n descriptionPlaceholder: \"Short description (optional)\",\n descriptionLabel: \"Description\",\n ownersLabel: \"App Owners\",\n ownersHint: \"These emails will receive the highest-level role automatically.\",\n ownerPlaceholder: \"owner@example.com\",\n addOwner: \"Add\",\n importConfig: \"Import Config\",\n exportConfig: \"Export Config\",\n importSuccess: \"Config loaded \\u2014 all steps pre-filled.\",\n importError: \"Invalid config file. Expected a valid RBAC export.\"\n};\nvar EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nfunction AppRegistration({\n initialValues = {},\n onChange,\n onImportConfig,\n onExportConfig\n}) {\n const mfApi = useMicroFrontendApi();\n useEffect(() => {\n if (!mfApi) return;\n mfApi.subscribe(\n \"MODE_UI_INTERACTION_TO_PERFORM\",\n (eventData) => {\n if (eventData.action === \"input\") {\n console.log(\"Event from library\", eventData);\n setValues((prev) => ({\n ...prev,\n name: eventData.value\n }));\n }\n }\n );\n }, [mfApi]);\n const [values, setValues] = useState({\n name: initialValues.name ?? \"\",\n description: initialValues.description ?? \"\",\n ownerEmails: initialValues.ownerEmails ?? []\n });\n const [touched, setTouched] = useState({ name: false });\n const [ownerInput, setOwnerInput] = useState(\"\");\n const [ownerError, setOwnerError] = useState(\"\");\n const [importStatus, setImportStatus] = useState(\n null\n );\n const fileInputRef = useRef(null);\n const errors = validateAppRegistration(values);\n function generateId5() {\n return Math.random().toString(36).slice(2, 9);\n }\n const update = (patch) => {\n const next = { ...values, ...patch };\n setValues(next);\n const nextErrors = validateAppRegistration(next);\n onChange(next, Object.keys(nextErrors).length === 0);\n };\n const addOwner = () => {\n const email = ownerInput.trim().toLowerCase();\n if (!email) return;\n if (!EMAIL_RE.test(email)) {\n setOwnerError(\"Enter a valid email.\");\n return;\n }\n if (values.ownerEmails.includes(email)) {\n setOwnerError(\"Already added.\");\n return;\n }\n setOwnerError(\"\");\n setOwnerInput(\"\");\n update({ ownerEmails: [...values.ownerEmails, email] });\n };\n const removeOwner = (email) => update({ ownerEmails: values.ownerEmails.filter((e) => e !== email) });\n const handleFileChange = (e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = (evt) => {\n try {\n const parsed = JSON.parse(evt.target?.result);\n if (!parsed?.app || !parsed.app.name || !Array.isArray(parsed.app.permissions) || !Array.isArray(parsed.app.roles) || !Array.isArray(parsed.app.modules)) {\n throw new Error(\"Invalid RBAC schema\");\n }\n const permissions = parsed.app.permissions.map((p) => ({\n id: generateId5(),\n name: p.name,\n label: p.name\n }));\n const roles = parsed.app.roles.map((r) => ({\n id: generateId5(),\n name: r.name,\n description: \"\",\n permissions: r.permissions.map(\n (permName) => permissions.find((p) => p.name === permName)\n ).filter((p) => !!p)\n // remove undefined\n }));\n const modules = parsed.app.modules.map((m) => ({\n id: generateId5(),\n name: m.module_type,\n roles: m.roles\n }));\n const mapping = parsed.app.modules.flatMap(\n (m) => m.roles.map((roleName) => {\n const role = roles.find((r) => r.name === roleName);\n const module = modules.find((mod) => mod.name === m.module_type);\n if (!role || !module) return null;\n return {\n roleId: role.id,\n moduleId: module.id\n };\n })\n ).filter(Boolean);\n setImportStatus(\"success\");\n setValues((prev) => ({\n ...prev,\n name: parsed.app.name\n }));\n onImportConfig?.({\n app: {\n name: parsed.app.name,\n modules,\n permissions,\n roles\n }\n });\n } catch (err) {\n console.error(err);\n setImportStatus(\"error\");\n }\n };\n reader.readAsText(file);\n e.target.value = \"\";\n };\n return /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-5\", children: [\n /* @__PURE__ */ jsxs(\"div\", { children: [\n /* @__PURE__ */ jsx(\"h2\", { className: \"text-lg font-semibold text-appsec-text\", children: LABELS.heading }),\n /* @__PURE__ */ jsx(\"p\", { className: \"mt-1 text-sm text-appsec-text-secondary\", children: LABELS.subheading })\n ] }),\n (onImportConfig || onExportConfig) && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2 p-3 rounded-appsec border border-appsec-border bg-appsec-surface\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"flex-1 text-xs text-appsec-text-secondary\", children: [\n importStatus === \"success\" && /* @__PURE__ */ jsx(\"span\", { className: \"text-appsec-success font-medium\", children: LABELS.importSuccess }),\n importStatus === \"error\" && /* @__PURE__ */ jsx(\"span\", { className: \"text-appsec-danger font-medium\", children: LABELS.importError }),\n !importStatus && \"Import an existing RBAC config to skip manual setup.\"\n ] }),\n onImportConfig && /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n \"input\",\n {\n ref: fileInputRef,\n type: \"file\",\n accept: \".json\",\n className: \"hidden\",\n onChange: handleFileChange\n }\n ),\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"sm\",\n iconLeft: /* @__PURE__ */ jsx(Upload, { className: \"h-3.5 w-3.5\" }),\n onClick: () => {\n setImportStatus(null);\n fileInputRef.current?.click();\n },\n children: LABELS.importConfig\n }\n )\n ] }),\n onExportConfig && /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"sm\",\n iconLeft: /* @__PURE__ */ jsx(Download, { className: \"h-3.5 w-3.5\" }),\n onClick: onExportConfig,\n children: LABELS.exportConfig\n }\n )\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-4\", children: [\n /* @__PURE__ */ jsx(\n Input,\n {\n lscId: \"app-name-input\",\n lscLabel: \"Application\",\n lscDescription: \"Enter the application name. This is a unique identifier for the application.\",\n lscWhenToApply: \"when user provides an application name, when creating or updating application\",\n lscWhenNotToApply: \"\",\n label: \"Application\",\n value: values.name,\n placeholder: LABELS.namePlaceholder,\n onChange: (e) => update({ name: e.target.value }),\n onBlur: () => setTouched((t) => ({ ...t, name: true })),\n error: touched.name ? errors.name : void 0,\n required: true\n }\n ),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"label\",\n {\n className: \"text-sm font-medium text-appsec-text\",\n htmlFor: \"app-description\",\n children: LABELS.descriptionLabel\n }\n ),\n /* @__PURE__ */ jsx(\n \"textarea\",\n {\n id: \"app-description\",\n value: values.description,\n placeholder: LABELS.descriptionPlaceholder,\n onChange: (e) => update({ description: e.target.value }),\n rows: 2,\n className: \"w-full rounded-appsec border border-appsec-border bg-appsec-bg px-3 py-2 text-sm text-appsec-text placeholder:text-appsec-text-tertiary resize-none outline-none transition-colors focus:border-appsec-primary focus:ring-2 focus:ring-appsec-primary-light\"\n }\n )\n ] })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [\n /* @__PURE__ */ jsxs(\"div\", { children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-sm font-medium text-appsec-text\", children: LABELS.ownersLabel }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-secondary mt-0.5\", children: LABELS.ownersHint })\n ] }),\n values.ownerEmails.length > 0 && /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-wrap gap-1.5\", children: values.ownerEmails.map((email) => /* @__PURE__ */ jsxs(\n \"span\",\n {\n className: \"inline-flex items-center gap-1 pl-2.5 pr-1 py-0.5 rounded-full text-xs font-medium bg-appsec-primary-light border border-appsec-primary/30 text-appsec-primary\",\n children: [\n email,\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => removeOwner(email),\n className: \"text-appsec-primary/60 hover:text-appsec-danger transition-colors rounded-full p-0.5\",\n \"aria-label\": `Remove ${email}`,\n children: /* @__PURE__ */ jsx(X, { className: \"h-3 w-3\" })\n }\n )\n ]\n },\n email\n )) }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex gap-2 items-start\", children: [\n /* @__PURE__ */ jsx(\n Input,\n {\n value: ownerInput,\n placeholder: LABELS.ownerPlaceholder,\n onChange: (e) => {\n setOwnerInput(e.target.value);\n setOwnerError(\"\");\n },\n onKeyDown: (e) => e.key === \"Enter\" && addOwner(),\n error: ownerError || void 0,\n wrapperClassName: \"flex-1\",\n type: \"email\"\n }\n ),\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"md\",\n iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-4 w-4\" }),\n onClick: addOwner,\n disabled: !ownerInput.trim(),\n className: \"shrink-0\",\n children: LABELS.addOwner\n }\n )\n ] })\n ] })\n ] });\n}\nfunction EmptyState({ icon, title, description, action, dashed = false, className }) {\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"flex flex-col items-center justify-center gap-3 rounded-appsec p-10 text-center\",\n dashed ? \"border-2 border-dashed border-appsec-border\" : \"bg-appsec-surface border border-appsec-border\",\n className\n ),\n children: [\n icon && /* @__PURE__ */ jsx(\"span\", { className: \"text-appsec-text-tertiary\", children: icon }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-1\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-sm font-semibold text-appsec-text\", children: title }),\n description && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-secondary max-w-xs\", children: description })\n ] }),\n action && /* @__PURE__ */ jsx(\"div\", { className: \"mt-1\", children: action })\n ]\n }\n );\n}\n\n// src/utils/importExport.ts\nfunction downloadCsv(rows, filename) {\n const content = rows.map((r) => r.join(\",\")).join(\"\\n\");\n const blob = new Blob([content], { type: \"text/csv\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\nfunction CsvImportButton({\n onImport,\n templateHeaders,\n templateExamples,\n templateFilename\n}) {\n const fileRef = useRef(null);\n const handleChange = (e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n e.target.value = \"\";\n const reader = new FileReader();\n reader.onload = (evt) => onImport(evt.target?.result ?? \"\");\n reader.readAsText(file);\n };\n const downloadTemplate = () => {\n downloadCsv([templateHeaders, ...templateExamples], templateFilename);\n };\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"input\",\n {\n ref: fileRef,\n type: \"file\",\n accept: \".csv,.txt\",\n className: \"hidden\",\n onChange: handleChange\n }\n ),\n /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onClick: () => fileRef.current?.click(),\n className: \"flex items-center gap-1 px-2.5 py-1 rounded-appsec text-xs border border-appsec-border bg-appsec-bg text-appsec-text-secondary hover:border-appsec-primary hover:text-appsec-primary transition-all cursor-pointer\",\n children: [\n /* @__PURE__ */ jsx(Upload, { className: \"h-3.5 w-3.5\" }),\n \"Import CSV\"\n ]\n }\n ),\n /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onClick: downloadTemplate,\n className: \"flex items-center gap-1 px-2 py-1 rounded-appsec text-xs text-appsec-text-tertiary hover:text-appsec-primary transition-colors cursor-pointer\",\n children: [\n /* @__PURE__ */ jsx(Download, { className: \"h-3.5 w-3.5\" }),\n \"Template\"\n ]\n }\n )\n ] });\n}\nfunction generateId() {\n return Math.random().toString(36).slice(2, 9);\n}\nvar CSV_HEADERS = [\"name\"];\nvar CSV_EXAMPLES = [[\"Dashboard\"], [\"Billing\"], [\"Reports\"], [\"User Management\"]];\nfunction ModuleDeclaration({ modules, onChange }) {\n const [errors, setErrors] = useState({});\n const [csvError, setCsvError] = useState(\"\");\n const addModule = () => onChange([...modules, { id: generateId(), name: \"\" }]);\n const removeModule = (id) => {\n onChange(modules.filter((m) => m.id !== id));\n setErrors((e) => {\n const next = { ...e };\n delete next[id];\n return next;\n });\n };\n const updateModule = (id, name) => {\n onChange(modules.map((m) => m.id === id ? { ...m, name } : m));\n setErrors((e) => ({ ...e, [id]: name.trim() ? void 0 : \"Name is required.\" }));\n };\n const handleImport = (text) => {\n const names = text.split(/[\\n,]+/).map((s) => s.trim()).filter(Boolean);\n if (names.length === 0) {\n setCsvError(\"No names found.\");\n return;\n }\n setCsvError(\"\");\n const existing = new Set(modules.map((m) => m.name.toLowerCase()));\n const newMods = names.filter((n) => !existing.has(n.toLowerCase())).map((name) => ({ id: generateId(), name }));\n if (newMods.length > 0) onChange([...modules, ...newMods]);\n };\n return /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-4\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-start justify-between gap-4\", children: [\n /* @__PURE__ */ jsxs(\"div\", { children: [\n /* @__PURE__ */ jsx(\"h2\", { className: \"text-lg font-semibold text-appsec-text\", children: \"Declare your modules\" }),\n /* @__PURE__ */ jsx(\"p\", { className: \"mt-1 text-sm text-appsec-text-secondary\", children: \"Top-level sections of your app (e.g. Reports, Users, Billing).\" })\n ] }),\n /* @__PURE__ */ jsx(\n CsvImportButton,\n {\n onImport: handleImport,\n templateHeaders: CSV_HEADERS,\n templateExamples: CSV_EXAMPLES,\n templateFilename: \"modules-template.csv\"\n }\n )\n ] }),\n csvError && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: csvError }),\n modules.length === 0 ? /* @__PURE__ */ jsx(\n EmptyState,\n {\n dashed: true,\n title: \"No modules yet\",\n description: \"Add at least one module to continue.\",\n action: /* @__PURE__ */ jsx(Button, { size: \"sm\", iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-4 w-4\" }), onClick: addModule, children: \"Add Module\" })\n }\n ) : /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-2\", children: [\n modules.map((mod, idx) => /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-xs text-appsec-text-tertiary w-5 shrink-0 text-right\", children: [\n idx + 1,\n \".\"\n ] }),\n /* @__PURE__ */ jsx(\"div\", { className: \"flex-1\", children: /* @__PURE__ */ jsx(\n Input,\n {\n value: mod.name,\n placeholder: \"e.g. Reports\",\n onChange: (e) => updateModule(mod.id, e.target.value),\n error: errors[mod.id]\n }\n ) }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => removeModule(mod.id),\n className: \"text-appsec-text-tertiary hover:text-appsec-danger transition-colors shrink-0\",\n \"aria-label\": \"Remove module\",\n children: /* @__PURE__ */ jsx(Trash2, { className: \"h-4 w-4\" })\n }\n )\n ] }, mod.id)),\n /* @__PURE__ */ jsx(Button, { variant: \"secondary\", size: \"sm\", iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-4 w-4\" }), onClick: addModule, className: \"mt-2\", children: \"Add Module\" })\n ] })\n ] });\n}\nvar COMMON_PERMISSIONS = [\"read\", \"write\", \"delete\", \"admin\"];\nvar CSV_HEADERS2 = [\"name\", \"label\"];\nvar CSV_EXAMPLES2 = [\n [\"read\", \"Read access\"],\n [\"write\", \"Write access\"],\n [\"delete\", \"Delete records\"],\n [\"approve_invoice\", \"Approve Invoice\"]\n];\nfunction generateId2() {\n return Math.random().toString(36).slice(2, 9);\n}\nfunction PermissionDefinition({ permissions, onChange }) {\n const [draftName, setDraftName] = useState(\"\");\n const [draftLabel, setDraftLabel] = useState(\"\");\n const [csvError, setCsvError] = useState(\"\");\n const [editingId, setEditingId] = useState(null);\n const [editingName, setEditingName] = useState(\"\");\n const [editingLabel, setEditingLabel] = useState(\"\");\n const nameInputRef = useRef(null);\n const editNameRef = useRef(null);\n const addPerm = () => {\n const name = draftName.trim();\n if (!name) return;\n if (permissions.some((p) => p.name === name)) return;\n onChange([...permissions, { id: generateId2(), name, label: draftLabel.trim() }]);\n setDraftName(\"\");\n setDraftLabel(\"\");\n setTimeout(() => nameInputRef.current?.focus(), 0);\n };\n const addQuick = (name) => {\n if (permissions.some((p) => p.name === name)) return;\n onChange([...permissions, { id: generateId2(), name, label: \"\" }]);\n };\n const removePerm = (id) => onChange(permissions.filter((p) => p.id !== id));\n const clonePerm = (perm) => {\n const existing = new Set(permissions.map((p) => p.name));\n let candidate = `${perm.name}_copy`;\n let n = 2;\n while (existing.has(candidate)) {\n candidate = `${perm.name}_copy_${n++}`;\n }\n onChange([...permissions, { id: generateId2(), name: candidate, label: perm.label }]);\n };\n const startEdit = (perm) => {\n setEditingId(perm.id);\n setEditingName(perm.name);\n setEditingLabel(perm.label);\n setTimeout(() => editNameRef.current?.focus(), 0);\n };\n const commitEdit = (id) => {\n const name = editingName.trim();\n if (!name) {\n cancelEdit();\n return;\n }\n if (permissions.some((p) => p.id !== id && p.name === name)) {\n cancelEdit();\n return;\n }\n onChange(permissions.map((p) => p.id === id ? { ...p, name, label: editingLabel.trim() } : p));\n setEditingId(null);\n };\n const cancelEdit = () => setEditingId(null);\n const handleImport = (text) => {\n const lines = text.split(/\\n/).map((s) => s.trim()).filter(Boolean);\n if (lines.length === 0) {\n setCsvError(\"No rows found.\");\n return;\n }\n setCsvError(\"\");\n const existing = new Set(permissions.map((p) => p.name));\n const newPerms = [];\n for (const line of lines) {\n const [rawName, rawLabel = \"\"] = line.split(\",\");\n const name = rawName.trim();\n if (!name || existing.has(name)) continue;\n existing.add(name);\n newPerms.push({ id: generateId2(), name, label: rawLabel.trim() });\n }\n if (newPerms.length > 0) onChange([...permissions, ...newPerms]);\n else setCsvError(\"All permissions already exist.\");\n };\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-4\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-start justify-between gap-4\", children: [\n /* @__PURE__ */ jsxs(\"div\", { children: [\n /* @__PURE__ */ jsx(\"h2\", { className: \"text-lg font-semibold text-appsec-text\", children: \"Define permissions\" }),\n /* @__PURE__ */ jsx(\"p\", { className: \"mt-1 text-sm text-appsec-text-secondary\", children: \"Standalone permissions \\u2014 assigned to roles in next step.\" })\n ] }),\n /* @__PURE__ */ jsx(\n CsvImportButton,\n {\n onImport: handleImport,\n templateHeaders: CSV_HEADERS2,\n templateExamples: CSV_EXAMPLES2,\n templateFilename: \"permissions-template.csv\"\n }\n )\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-wrap items-center gap-1.5\", children: [\n /* @__PURE__ */ jsx(\"span\", { className: \"text-xs text-appsec-text-secondary\", children: \"Quick add:\" }),\n COMMON_PERMISSIONS.map((p) => {\n const exists = permissions.some((x) => x.name === p);\n return /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n disabled: exists,\n onClick: () => addQuick(p),\n className: cn(\n \"px-2 py-0.5 rounded-full text-xs border transition-all\",\n exists ? \"bg-appsec-surface-alt text-appsec-text-tertiary border-transparent cursor-default\" : \"bg-appsec-bg text-appsec-primary border-appsec-primary hover:bg-appsec-primary-light cursor-pointer\"\n ),\n children: exists ? `\\u2713 ${p}` : `+ ${p}`\n },\n p\n );\n }),\n csvError && /* @__PURE__ */ jsx(\"span\", { className: \"text-xs text-appsec-danger\", children: csvError })\n ] }),\n permissions.length > 0 ? /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-wrap gap-1.5 p-3 rounded-appsec bg-appsec-surface border border-appsec-border min-h-12 overflow-y-auto\", style: { maxHeight: \"260px\" }, children: permissions.map((perm) => {\n const isEditing = editingId === perm.id;\n if (isEditing) {\n return /* @__PURE__ */ jsxs(\n \"span\",\n {\n className: \"inline-flex items-center gap-1 pl-1.5 pr-1 py-0.5 rounded-full text-xs bg-appsec-primary-light border border-appsec-primary\",\n children: [\n /* @__PURE__ */ jsx(\n \"input\",\n {\n ref: editNameRef,\n value: editingName,\n onChange: (e) => setEditingName(e.target.value),\n onKeyDown: (e) => {\n if (e.key === \"Enter\") commitEdit(perm.id);\n if (e.key === \"Escape\") cancelEdit();\n },\n onBlur: () => commitEdit(perm.id),\n className: \"bg-transparent outline-none text-appsec-primary font-medium w-20 min-w-0\",\n placeholder: \"name\"\n }\n ),\n /* @__PURE__ */ jsx(\"span\", { className: \"text-appsec-text-tertiary\", children: \"\\xB7\" }),\n /* @__PURE__ */ jsx(\n \"input\",\n {\n value: editingLabel,\n onChange: (e) => setEditingLabel(e.target.value),\n onKeyDown: (e) => {\n if (e.key === \"Enter\") commitEdit(perm.id);\n if (e.key === \"Escape\") cancelEdit();\n },\n onBlur: () => commitEdit(perm.id),\n className: \"bg-transparent outline-none text-appsec-text-secondary w-24 min-w-0\",\n placeholder: \"label\"\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onMouseDown: (e) => {\n e.preventDefault();\n cancelEdit();\n },\n className: \"text-appsec-text-tertiary hover:text-appsec-danger p-0.5 rounded-full\",\n title: \"Cancel\",\n children: /* @__PURE__ */ jsx(X, { className: \"h-3 w-3\" })\n }\n )\n ]\n },\n perm.id\n );\n }\n return /* @__PURE__ */ jsxs(\n \"span\",\n {\n className: \"inline-flex items-center gap-0.5 pl-2.5 pr-1 py-0.5 rounded-full text-xs font-medium bg-appsec-bg border border-appsec-border text-appsec-text hover:border-appsec-primary group transition-colors\",\n title: \"Click name to edit\",\n children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => startEdit(perm),\n className: \"hover:text-appsec-primary transition-colors cursor-text\",\n title: \"Click to edit\",\n children: perm.name\n }\n ),\n perm.label && perm.label !== perm.name && /* @__PURE__ */ jsxs(\"span\", { className: \"text-appsec-text-tertiary ml-1\", children: [\n \"\\xB7 \",\n perm.label\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => clonePerm(perm),\n className: \"ml-0.5 text-appsec-text-tertiary hover:text-appsec-primary transition-colors rounded-full hover:bg-appsec-primary-light p-0.5\",\n title: \"Clone\",\n children: /* @__PURE__ */ jsx(Copy, { className: \"h-3 w-3\" })\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => removePerm(perm.id),\n className: \"text-appsec-text-tertiary group-hover:text-appsec-danger transition-colors rounded-full hover:bg-appsec-danger-light p-0.5\",\n title: \"Remove\",\n children: /* @__PURE__ */ jsx(X, { className: \"h-3 w-3\" })\n }\n )\n ]\n },\n perm.id\n );\n }) }) : /* @__PURE__ */ jsx(\"div\", { className: \"flex items-center justify-center p-6 rounded-appsec border border-dashed border-appsec-border text-sm text-appsec-text-tertiary\", children: \"No permissions yet \\u2014 use quick add, CSV, or type below.\" }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex gap-2 items-end\", children: [\n /* @__PURE__ */ jsx(\n Input,\n {\n ref: nameInputRef,\n value: draftName,\n placeholder: \"Permission name (e.g. read)\",\n onChange: (e) => setDraftName(e.target.value),\n wrapperClassName: \"flex-1\",\n onKeyDown: (e) => e.key === \"Enter\" && addPerm()\n }\n ),\n /* @__PURE__ */ jsx(\n Input,\n {\n value: draftLabel,\n placeholder: \"Display label (optional)\",\n onChange: (e) => setDraftLabel(e.target.value),\n wrapperClassName: \"flex-1\",\n onKeyDown: (e) => e.key === \"Enter\" && addPerm()\n }\n ),\n /* @__PURE__ */ jsx(\n Button,\n {\n size: \"md\",\n iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-4 w-4\" }),\n onClick: addPerm,\n disabled: !draftName.trim(),\n className: \"shrink-0\",\n children: \"Add\"\n }\n )\n ] }),\n permissions.length > 0 && /* @__PURE__ */ jsxs(\"p\", { className: \"text-xs text-appsec-text-tertiary\", children: [\n permissions.length,\n \" permission\",\n permissions.length !== 1 ? \"s\" : \"\",\n \" defined\"\n ] })\n ] });\n}\nfunction RoleTemplates({ templates, selectedIds, onSelect }) {\n if (templates.length === 0) return null;\n return /* @__PURE__ */ jsx(\"div\", { className: \"grid grid-cols-1 sm:grid-cols-2 gap-3\", children: templates.map((tpl) => {\n const isSelected = selectedIds.includes(tpl.name.toLowerCase());\n return /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onClick: () => onSelect(tpl),\n disabled: isSelected,\n className: cn(\n \"flex items-start gap-3 rounded-appsec border p-4 text-left transition-colors\",\n isSelected ? \"border-appsec-primary bg-appsec-primary-light cursor-default\" : \"border-appsec-border bg-appsec-bg hover:border-appsec-primary hover:bg-appsec-surface\"\n ),\n children: [\n /* @__PURE__ */ jsx(\n \"span\",\n {\n className: cn(\n \"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors\",\n isSelected ? \"border-appsec-primary bg-appsec-primary text-white\" : \"border-appsec-border\"\n ),\n children: isSelected && /* @__PURE__ */ jsx(Check, { className: \"h-3 w-3\" })\n }\n ),\n /* @__PURE__ */ jsxs(\"div\", { children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-sm font-semibold text-appsec-text\", children: tpl.name }),\n /* @__PURE__ */ jsx(\"p\", { className: \"mt-0.5 text-xs text-appsec-text-secondary\", children: tpl.description }),\n tpl.suggestedPermissions.length > 0 && /* @__PURE__ */ jsxs(\"p\", { className: \"mt-1.5 text-xs text-appsec-text-tertiary\", children: [\n \"Permissions: \",\n tpl.suggestedPermissions.join(\", \")\n ] })\n ] })\n ]\n },\n tpl.id\n );\n }) });\n}\nvar LABELS2 = {\n heading: \"Create roles\",\n subheading: \"Define roles and assign permissions to each.\",\n fromTemplates: \"Start from templates\",\n customRoles: \"Custom roles\",\n addRole: \"Add Role\",\n emptyTitle: \"No roles yet\",\n emptyDescription: \"Add at least one role to continue.\",\n namePlaceholder: \"e.g. Billing Manager\",\n descPlaceholder: \"Description (optional)\",\n noPerms: \"No permissions defined yet \\u2014 go back to add some.\"\n};\nfunction generateId3() {\n return Math.random().toString(36).slice(2, 9);\n}\nfunction RoleCreation({ roles, permissions, onChange, roleTemplates = [] }) {\n const [nameErrors, setNameErrors] = useState({});\n const [csvError, setCsvError] = useState(\"\");\n const addBlankRole = () => {\n onChange([...roles, { id: generateId3(), name: \"\", description: \"\", permissionIds: [] }]);\n };\n const applyTemplate2 = (tpl) => {\n if (roles.some((r) => r.name.toLowerCase() === tpl.name.toLowerCase())) return;\n const matchedIds = permissions.filter((p) => tpl.suggestedPermissions.includes(p.name)).map((p) => p.id);\n onChange([...roles, { id: generateId3(), name: tpl.name, description: tpl.description, permissionIds: matchedIds }]);\n };\n const removeRole = (id) => {\n onChange(roles.filter((r) => r.id !== id));\n setNameErrors((e) => {\n const next = { ...e };\n delete next[id];\n return next;\n });\n };\n const cloneRole = (role) => {\n const existing = new Set(roles.map((r) => r.name.toLowerCase()));\n let candidate = `${role.name} (copy)`;\n let n = 2;\n while (existing.has(candidate.toLowerCase())) {\n candidate = `${role.name} (copy ${n++})`;\n }\n onChange([...roles, { id: generateId3(), name: candidate, description: role.description, permissionIds: [...role.permissionIds] }]);\n };\n const updateRole = (id, patch) => {\n onChange(roles.map((r) => r.id === id ? { ...r, ...patch } : r));\n if (patch.name !== void 0) {\n setNameErrors((e) => ({ ...e, [id]: patch.name.trim() ? void 0 : \"Name is required.\" }));\n }\n };\n const togglePerm = (roleId, permId) => {\n const role = roles.find((r) => r.id === roleId);\n if (!role) return;\n const has = role.permissionIds.includes(permId);\n updateRole(roleId, {\n permissionIds: has ? role.permissionIds.filter((id) => id !== permId) : [...role.permissionIds, permId]\n });\n };\n const handleImport = (text) => {\n const lines = text.split(/\\n/).map((s) => s.trim()).filter(Boolean);\n if (lines.length === 0) {\n setCsvError(\"No rows found.\");\n return;\n }\n setCsvError(\"\");\n const existingNames = new Set(roles.map((r) => r.name.toLowerCase()));\n const newRoles = [];\n for (const line of lines) {\n const [rawName, rawDesc = \"\"] = line.split(\",\");\n const name = rawName.trim();\n if (!name || existingNames.has(name.toLowerCase())) continue;\n existingNames.add(name.toLowerCase());\n newRoles.push({ id: generateId3(), name, description: rawDesc.trim(), permissionIds: [] });\n }\n if (newRoles.length > 0) onChange([...roles, ...newRoles]);\n else setCsvError(\"All roles already exist.\");\n };\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col h-full\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-start justify-between gap-4 mb-3\", children: [\n /* @__PURE__ */ jsxs(\"div\", { children: [\n /* @__PURE__ */ jsx(\"h2\", { className: \"text-lg font-semibold text-appsec-text\", children: LABELS2.heading }),\n /* @__PURE__ */ jsx(\"p\", { className: \"mt-1 text-sm text-appsec-text-secondary\", children: LABELS2.subheading })\n ] }),\n /* @__PURE__ */ jsx(\n CsvImportButton,\n {\n onImport: handleImport,\n templateHeaders: [\"name\", \"description\"],\n templateExamples: [\n [\"Admin\", \"Full access to everything\"],\n [\"Editor\", \"Can read and write\"],\n [\"Viewer\", \"Read-only access\"]\n ],\n templateFilename: \"roles-template.csv\"\n }\n )\n ] }),\n csvError && /* @__PURE__ */ jsx(\"p\", { className: \"mb-2 text-xs text-appsec-danger\", children: csvError }),\n roleTemplates.length > 0 && /* @__PURE__ */ jsxs(\"div\", { className: \"mb-4\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs font-semibold uppercase tracking-wide text-appsec-text-secondary mb-2\", children: LABELS2.fromTemplates }),\n /* @__PURE__ */ jsx(\n RoleTemplates,\n {\n templates: roleTemplates,\n selectedIds: roles.map((r) => r.name.toLowerCase()),\n onSelect: applyTemplate2\n }\n )\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col flex-1 min-h-0\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between mb-2\", children: [\n /* @__PURE__ */ jsxs(\"p\", { className: \"text-xs font-semibold uppercase tracking-wide text-appsec-text-secondary\", children: [\n LABELS2.customRoles,\n roles.length > 0 && /* @__PURE__ */ jsxs(\"span\", { className: \"ml-2 normal-case font-normal text-appsec-text-tertiary\", children: [\n \"(\",\n roles.length,\n \")\"\n ] })\n ] }),\n roles.length > 0 && /* @__PURE__ */ jsx(Button, { variant: \"secondary\", size: \"sm\", iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-3.5 w-3.5\" }), onClick: addBlankRole, children: LABELS2.addRole })\n ] }),\n roles.length === 0 ? /* @__PURE__ */ jsx(\n EmptyState,\n {\n dashed: true,\n title: LABELS2.emptyTitle,\n description: LABELS2.emptyDescription,\n action: /* @__PURE__ */ jsx(Button, { size: \"sm\", iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-4 w-4\" }), onClick: addBlankRole, children: LABELS2.addRole })\n }\n ) : /* @__PURE__ */ jsx(\"div\", { className: \"overflow-y-auto flex-1 space-y-3 pr-1\", style: { maxHeight: \"340px\" }, children: roles.map((role) => /* @__PURE__ */ jsxs(\"div\", { className: \"rounded-appsec border border-appsec-border overflow-hidden\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2 bg-appsec-surface px-3 py-2\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex-1 grid grid-cols-2 gap-2\", children: [\n /* @__PURE__ */ jsx(\n Input,\n {\n value: role.name,\n placeholder: LABELS2.namePlaceholder,\n onChange: (e) => updateRole(role.id, { name: e.target.value }),\n error: nameErrors[role.id]\n }\n ),\n /* @__PURE__ */ jsx(\n Input,\n {\n value: role.description,\n placeholder: LABELS2.descPlaceholder,\n onChange: (e) => updateRole(role.id, { description: e.target.value })\n }\n )\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => cloneRole(role),\n className: \"text-appsec-text-tertiary hover:text-appsec-primary transition-colors shrink-0\",\n title: \"Clone role\",\n children: /* @__PURE__ */ jsx(Copy, { className: \"h-4 w-4\" })\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => removeRole(role.id),\n className: \"text-appsec-text-tertiary hover:text-appsec-danger transition-colors shrink-0\",\n title: \"Remove role\",\n children: /* @__PURE__ */ jsx(Trash2, { className: \"h-4 w-4\" })\n }\n )\n ] }),\n permissions.length > 0 ? /* @__PURE__ */ jsx(\"div\", { className: \"px-3 py-2.5 bg-appsec-bg border-t border-appsec-border\", children: /* @__PURE__ */ jsx(\"div\", { className: \"grid grid-cols-2 sm:grid-cols-3 gap-x-4 gap-y-1.5\", children: permissions.map((perm) => {\n const checked = role.permissionIds.includes(perm.id);\n return /* @__PURE__ */ jsxs(\n \"label\",\n {\n className: \"flex items-center gap-2 cursor-pointer group\",\n children: [\n /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n checked,\n onChange: () => togglePerm(role.id, perm.id),\n className: \"h-3.5 w-3.5 rounded border-appsec-border text-appsec-primary accent-appsec-primary cursor-pointer\"\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: cn(\n \"text-xs transition-colors\",\n checked ? \"text-appsec-text font-medium\" : \"text-appsec-text-secondary group-hover:text-appsec-text\"\n ), children: [\n perm.name,\n perm.label && perm.label !== perm.name && /* @__PURE__ */ jsxs(\"span\", { className: \"text-appsec-text-tertiary ml-1\", children: [\n \"\\xB7 \",\n perm.label\n ] })\n ] })\n ]\n },\n perm.id\n );\n }) }) }) : /* @__PURE__ */ jsx(\"div\", { className: \"px-3 py-2 bg-appsec-bg border-t border-appsec-border\", children: /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary italic\", children: LABELS2.noPerms }) })\n ] }, role.id)) })\n ] })\n ] });\n}\nvar LABELS3 = {\n heading: \"Map roles to modules\",\n subheading: \"Drag roles into module drop zones to assign access.\",\n roles: \"Roles\",\n moduleZones: \"Module Drop Zones\",\n hint: \"Drag & drop roles into modules. \\xD7 to remove.\",\n noRoles: \"No roles defined \\u2014 go back and add some.\",\n noModules: \"No modules defined \\u2014 go back and add some.\"\n};\nfunction RoleModuleMapping({ roles, modules, mapping, onChange }) {\n const [dragRoleId, setDragRoleId] = useState(null);\n const [overModuleId, setOverModuleId] = useState(null);\n const rolesInModule = (moduleId) => mapping.filter((e) => e.moduleId === moduleId).map((e) => roles.find((r) => r.id === e.roleId)).filter((r) => !!r);\n const addMapping = (roleId, moduleId) => {\n if (mapping.some((e) => e.roleId === roleId && e.moduleId === moduleId)) return;\n onChange([...mapping, { roleId, moduleId }]);\n };\n const removeMapping = (roleId, moduleId) => {\n onChange(mapping.filter((e) => !(e.roleId === roleId && e.moduleId === moduleId)));\n };\n const handleDragStart = (roleId) => setDragRoleId(roleId);\n const handleDragEnd = () => {\n setDragRoleId(null);\n setOverModuleId(null);\n };\n const handleDragOver = (e, moduleId) => {\n e.preventDefault();\n setOverModuleId(moduleId);\n };\n const handleDrop = (e, moduleId) => {\n e.preventDefault();\n if (dragRoleId) addMapping(dragRoleId, moduleId);\n setDragRoleId(null);\n setOverModuleId(null);\n };\n if (roles.length === 0) {\n return /* @__PURE__ */ jsx(\"p\", { className: \"text-sm text-appsec-text-secondary\", children: LABELS3.noRoles });\n }\n if (modules.length === 0) {\n return /* @__PURE__ */ jsx(\"p\", { className: \"text-sm text-appsec-text-secondary\", children: LABELS3.noModules });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-6\", children: [\n /* @__PURE__ */ jsxs(\"div\", { children: [\n /* @__PURE__ */ jsx(\"h2\", { className: \"text-lg font-semibold text-appsec-text\", children: LABELS3.heading }),\n /* @__PURE__ */ jsx(\"p\", { className: \"mt-1 text-sm text-appsec-text-secondary\", children: LABELS3.subheading })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-wrap gap-6\", style: { minHeight: 0 }, children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"w-36 shrink-0 flex flex-col\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs font-semibold uppercase tracking-wide text-appsec-text-secondary mb-3\", children: LABELS3.roles }),\n /* @__PURE__ */ jsx(\"div\", { className: \"overflow-y-auto flex flex-col gap-2 pr-1\", style: { maxHeight: \"340px\" }, children: roles.map((role) => /* @__PURE__ */ jsx(\n \"div\",\n {\n draggable: true,\n onDragStart: () => handleDragStart(role.id),\n onDragEnd: handleDragEnd,\n className: cn(\n \"px-3 py-2 rounded-appsec border border-appsec-primary bg-appsec-primary-light\",\n \"text-sm font-medium text-appsec-primary text-center\",\n \"cursor-grab active:cursor-grabbing select-none transition-opacity\",\n dragRoleId === role.id && \"opacity-40\"\n ),\n children: role.name || \"(unnamed)\"\n },\n role.id\n )) })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"grow shrink basis-80 min-w-0 flex flex-col\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs font-semibold uppercase tracking-wide text-appsec-text-secondary mb-3\", children: LABELS3.moduleZones }),\n /* @__PURE__ */ jsx(\"div\", { className: \"overflow-y-auto flex flex-col gap-3 pr-1\", style: { maxHeight: \"340px\" }, children: modules.map((mod) => {\n const assigned = rolesInModule(mod.id);\n const isOver = overModuleId === mod.id;\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n onDragOver: (e) => handleDragOver(e, mod.id),\n onDragLeave: () => setOverModuleId(null),\n onDrop: (e) => handleDrop(e, mod.id),\n className: cn(\n \"min-h-18 rounded-appsec border-2 border-dashed p-3 transition-colors\",\n isOver ? \"border-appsec-primary bg-appsec-primary-light\" : \"border-appsec-border bg-appsec-surface\"\n ),\n children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs font-semibold text-appsec-text mb-2\", children: mod.name }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-wrap gap-2\", children: [\n assigned.map((role) => /* @__PURE__ */ jsxs(\n \"span\",\n {\n className: \"inline-flex items-center gap-1 px-2.5 py-1 rounded-full bg-appsec-primary-light border border-appsec-primary text-appsec-primary text-xs font-medium\",\n children: [\n role.name,\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => removeMapping(role.id, mod.id),\n className: \"text-appsec-danger hover:opacity-70 transition-opacity\",\n \"aria-label\": `Remove ${role.name}`,\n children: /* @__PURE__ */ jsx(X, { className: \"h-3 w-3\" })\n }\n )\n ]\n },\n role.id\n )),\n assigned.length === 0 && !isOver && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary italic\", children: \"Drop a role here\\u2026\" })\n ] })\n ]\n },\n mod.id\n );\n }) })\n ] })\n ] }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-secondary\", children: LABELS3.hint })\n ] });\n}\nvar LABELS4 = {\n heading: \"You're all set!\",\n description: (appName, modules, roles) => `${appName} has been configured with ${modules} module${modules !== 1 ? \"s\" : \"\"} and ${roles} role${roles !== 1 ? \"s\" : \"\"}.`,\n cta: \"Finish Mode Onboarding\"\n};\nfunction OnboardingSuccess({\n appName,\n moduleCount,\n roleCount,\n onComplete\n}) {\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col items-center justify-center gap-6 py-10 text-center\", children: [\n /* @__PURE__ */ jsx(\"span\", { className: \"text-appsec-success\", children: /* @__PURE__ */ jsx(CheckCircle2, { className: \"h-16 w-16\", strokeWidth: 1.5 }) }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-2 max-w-md\", children: [\n /* @__PURE__ */ jsx(\"h2\", { className: \"text-xl font-bold text-appsec-text\", children: LABELS4.heading }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-sm text-appsec-text-secondary\", children: LABELS4.description(appName, moduleCount, roleCount) })\n ] }),\n /* @__PURE__ */ jsx(\n Button,\n {\n size: \"lg\",\n onClick: onComplete,\n iconRight: /* @__PURE__ */ jsx(ArrowRight, { className: \"h-4 w-4\" }),\n children: LABELS4.cta\n }\n )\n ] });\n}\nvar STEPS = [\n { key: \"app\", label: \"App\" },\n { key: \"modules\", label: \"Modules\" },\n { key: \"permissions\", label: \"Permissions\" },\n { key: \"roles\", label: \"Roles\" },\n { key: \"mapping\", label: \"Access\" }\n];\nvar LABELS5 = {\n back: \"Back\",\n next: \"Next\",\n finish: (mode) => mode === \"update\" ? \"Save Changes\" : \"Finish Setup\",\n saving: \"Saving\\u2026\"\n};\nfunction StepIndicator({ steps, current }) {\n return /* @__PURE__ */ jsx(\"nav\", { \"aria-label\": \"Progress\", className: \"flex items-center mb-8 px-1\", children: steps.map((step, idx) => {\n const isDone = idx < current;\n const isActive = idx === current;\n return /* @__PURE__ */ jsxs(React11.Fragment, { children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col items-center gap-1 shrink-0\", children: [\n /* @__PURE__ */ jsx(\n \"span\",\n {\n className: cn(\n \"flex h-7 w-7 items-center justify-center rounded-full text-xs font-bold border-2 transition-all\",\n isDone ? \"border-appsec-primary bg-appsec-primary text-white\" : isActive ? \"border-appsec-primary bg-appsec-bg text-appsec-primary\" : \"border-appsec-border bg-appsec-bg text-appsec-text-tertiary\"\n ),\n children: isDone ? /* @__PURE__ */ jsx(Check, { className: \"h-3.5 w-3.5\" }) : /* @__PURE__ */ jsx(\"span\", { children: idx + 1 })\n }\n ),\n /* @__PURE__ */ jsx(\n \"span\",\n {\n className: cn(\n \"text-[11px] font-medium leading-none\",\n isActive ? \"text-appsec-primary\" : isDone ? \"text-appsec-text-secondary\" : \"text-appsec-text-tertiary\"\n ),\n children: step.label\n }\n )\n ] }),\n idx < steps.length - 1 && /* @__PURE__ */ jsx(\n \"div\",\n {\n className: cn(\n \"flex-1 h-px mb-4 mx-2 transition-colors\",\n isDone ? \"bg-appsec-primary\" : \"bg-appsec-border\"\n )\n }\n )\n ] }, step.key);\n }) });\n}\nfunction generateId4() {\n return Math.random().toString(36).slice(2, 9);\n}\nfunction OnboardingStepper({ mode = \"create\", initialData, onComplete, className }) {\n const { adapter, baseUrl, appId, roleTemplates, setLoading, setError } = useAppsec();\n const toast = useToast();\n const mfApi = useMicroFrontendApi();\n const [currentStep, setCurrentStep] = useState(0);\n const [saving, setSaving] = useState(false);\n const [done, setDone] = useState(false);\n useEffect(() => {\n if (!mfApi) {\n console.warn(\"Remote MicroFrontend API not initialized\");\n return;\n }\n console.log(\"Mf api\", mfApi);\n }, [mfApi]);\n const [state, setState] = useState({\n app: { name: \"\", description: \"\", ownerEmails: [], ...initialData?.app },\n appValid: mode === \"update\",\n // update mode starts valid — data already exists\n modules: initialData?.modules ?? [],\n permissions: initialData?.permissions ?? [],\n roles: initialData?.roles ?? [],\n mapping: initialData?.mapping ?? []\n });\n const handleImportConfig = (data) => {\n try {\n if (!data?.app || !data.app.name || !Array.isArray(data.app.permissions) || !Array.isArray(data.app.roles) || !Array.isArray(data.app.modules)) {\n throw new Error(\"Invalid import schema\");\n }\n const permissions = data.app.permissions.map((p) => ({\n id: p.id,\n name: p.name,\n label: p.name\n }));\n const roles = data.app.roles.map((r) => ({\n id: generateId4(),\n name: r.name,\n description: \"\",\n permissionIds: r.permissions.map((perm) => perm.id)\n }));\n const modules = data.app.modules.map((m) => ({\n id: generateId4(),\n name: m.name\n }));\n const mapping = data.app.modules.flatMap(\n (m) => m.roles.map((roleName) => {\n const role = roles.find((r) => r.name === roleName);\n const module = modules.find((mod) => mod.name === m.name);\n if (!role || !module) return null;\n return {\n roleId: role.id,\n moduleId: module.id\n };\n })\n ).filter((x) => !!x);\n setState((s) => ({\n ...s,\n app: {\n ...s.app,\n name: data.app.name\n },\n modules,\n permissions,\n roles,\n mapping\n }));\n } catch (err) {\n toast.error(err instanceof Error ? err.message : \"Failed to import config.\");\n }\n };\n const canNext = useCallback(() => {\n const key = STEPS[currentStep].key;\n if (key === \"app\") return state.appValid;\n return true;\n }, [currentStep, state]);\n const handleFinish = async () => {\n setSaving(true);\n setLoading(true);\n try {\n const permissions = state.permissions.map((p) => ({\n name: p.name\n }));\n const roles = state.roles.map((r) => ({\n name: r.name,\n permissions: (r.permissionIds ?? []).map((pid) => state.permissions.find((p) => p.id === pid)?.name).filter((name) => !!name)\n }));\n const moduleRoleMap = /* @__PURE__ */ new Map();\n for (const entry of state.mapping) {\n if (!moduleRoleMap.has(entry.moduleId)) {\n moduleRoleMap.set(entry.moduleId, /* @__PURE__ */ new Set());\n }\n const roleName = state.roles.find((r) => r.id === entry.roleId)?.name;\n if (roleName) {\n moduleRoleMap.get(entry.moduleId).add(roleName);\n }\n }\n const modules = state.modules.map((m) => ({\n module_type: m.name.toUpperCase().replace(/\\s+/g, \"_\"),\n roles: Array.from(moduleRoleMap.get(m.id) ?? [])\n }));\n const payload = {\n app: {\n name: state.app.name,\n permissions,\n roles,\n modules\n }\n };\n await adapter.importConfig(appId, payload);\n setDone(true);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : \"Setup failed.\");\n } finally {\n setSaving(false);\n setLoading(false);\n }\n };\n if (done) {\n return /* @__PURE__ */ jsx(\n OnboardingSuccess,\n {\n appName: state.app.name,\n moduleCount: state.modules.length,\n roleCount: state.roles.length,\n onComplete: onComplete ?? (() => {\n })\n }\n );\n }\n const isLastStep = currentStep === STEPS.length - 1;\n return /* @__PURE__ */ jsxs(\"div\", { className: cn(\"flex flex-col font-appsec\", className), children: [\n /* @__PURE__ */ jsx(StepIndicator, { steps: STEPS, current: currentStep }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex-1 min-h-0\", children: [\n currentStep === 0 && /* @__PURE__ */ jsx(\n AppRegistration,\n {\n initialValues: state.app,\n onChange: (data, isValid) => setState((s) => ({ ...s, app: data, appValid: isValid })),\n onImportConfig: handleImportConfig,\n onExportConfig: (\n // state.modules.length > 0 || state.roles.length > 0\n // ? handleExportConfig\n void 0\n )\n }\n ),\n currentStep === 1 && /* @__PURE__ */ jsx(\n ModuleDeclaration,\n {\n modules: state.modules,\n onChange: (modules) => setState((s) => ({ ...s, modules }))\n }\n ),\n currentStep === 2 && /* @__PURE__ */ jsx(\n PermissionDefinition,\n {\n permissions: state.permissions,\n onChange: (permissions) => setState((s) => ({ ...s, permissions }))\n }\n ),\n currentStep === 3 && /* @__PURE__ */ jsx(\n RoleCreation,\n {\n roles: state.roles,\n permissions: state.permissions,\n onChange: (roles) => setState((s) => ({ ...s, roles })),\n roleTemplates\n }\n ),\n currentStep === 4 && /* @__PURE__ */ jsx(\n RoleModuleMapping,\n {\n roles: state.roles,\n modules: state.modules,\n mapping: state.mapping,\n onChange: (mapping) => setState((s) => ({ ...s, mapping }))\n }\n )\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between mt-8 pt-4 border-t border-appsec-border\", children: [\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"md\",\n onClick: () => setCurrentStep((s) => s - 1),\n disabled: currentStep === 0 || saving,\n children: LABELS5.back\n }\n ),\n isLastStep ? /* @__PURE__ */ jsx(Button, { size: \"md\", onClick: handleFinish, loading: saving, children: saving ? LABELS5.saving : LABELS5.finish(mode) }) : /* @__PURE__ */ jsx(Button, { size: \"md\", onClick: () => setCurrentStep((s) => s + 1), disabled: !canNext(), children: LABELS5.next })\n ] })\n ] });\n}\nfunction Tabs({ items, activeKey, onChange, className }) {\n return /* @__PURE__ */ jsx(\n \"div\",\n {\n role: \"tablist\",\n className: cn(\n \"flex border-b border-appsec-border gap-0\",\n className\n ),\n children: items.map((tab) => {\n const isActive = tab.key === activeKey;\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center\", children: [\n tab.separator && /* @__PURE__ */ jsx(\"div\", { className: \"self-stretch w-px bg-appsec-border mx-1.5 my-2\" }),\n /* @__PURE__ */ jsxs(\n \"button\",\n {\n id: `${tab.label}`,\n \"data-lsc-ui-type\": \"button\",\n \"data-lsc-ui-label\": `${tab.label}`,\n \"data-lsc-description\": `Open ${tab.label} tab, click ${tab.label} tab,Open config tab, click ${tab.label}`,\n \"data-lsc-when-to-apply\": `when user request to click or open the or ${tab.label}`,\n role: \"tab\",\n \"aria-selected\": isActive,\n \"aria-disabled\": tab.disabled,\n disabled: tab.disabled,\n onClick: () => !tab.disabled && onChange(tab.key),\n className: cn(\n \"inline-flex items-center gap-1.5 px-4 py-2.5 text-sm font-medium border-b-2 transition-colors\",\n \"-mb-px\",\n // overlap border-b of parent\n isActive ? \"border-appsec-primary text-appsec-primary\" : \"border-transparent text-appsec-text-secondary hover:text-appsec-text hover:border-appsec-border\",\n tab.disabled && \"opacity-40 cursor-not-allowed\"\n ),\n children: [\n tab.icon,\n tab.label,\n tab.count !== void 0 && /* @__PURE__ */ jsx(\n \"span\",\n {\n className: cn(\n \"inline-flex items-center justify-center min-w-[1.25rem] h-5 rounded-full px-1.5 text-xs font-semibold\",\n isActive ? \"bg-appsec-primary-light text-appsec-primary\" : \"bg-appsec-surface-alt text-appsec-text-secondary\"\n ),\n children: tab.count\n }\n )\n ]\n },\n tab.key\n )\n ] }, tab.key);\n })\n }\n );\n}\nfunction TabPanel({\n tabKey,\n activeKey,\n children,\n className,\n lscId,\n lscLabel,\n lscDescription,\n lscWhenToApply,\n lscWhenNotToApply\n}) {\n if (tabKey !== activeKey) return null;\n return /* @__PURE__ */ jsx(\n \"div\",\n {\n \"data-lsc-ui-id\": lscId,\n \"data-lsc-ui-type\": lscId ? \"input\" : void 0,\n \"data-lsc-ui-label\": lscLabel,\n \"data-lsc-ui-description\": lscDescription,\n \"data-lsc-ui-when-to-apply\": lscWhenToApply,\n \"data-lsc-ui-when-not-to-apply\": lscWhenNotToApply,\n \"data-lsc-ui-interact-behaviour-control\": lscId ? \"mode\" : void 0,\n role: \"tabpanel\",\n className: cn(\"py-4\", className),\n children\n }\n );\n}\nvar sizeClasses2 = {\n xs: \"h-6 w-6 text-[10px]\",\n sm: \"h-8 w-8 text-xs\",\n md: \"h-9 w-9 text-sm\",\n lg: \"h-11 w-11 text-base\"\n};\nvar COLORS = [\n \"bg-blue-500\",\n \"bg-purple-500\",\n \"bg-green-600\",\n \"bg-orange-500\",\n \"bg-pink-500\",\n \"bg-teal-500\",\n \"bg-indigo-500\",\n \"bg-rose-500\"\n];\nfunction getColor(name) {\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return COLORS[Math.abs(hash) % COLORS.length];\n}\nfunction getInitials(name) {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\nfunction Avatar({ name, src, size = \"md\", className }) {\n if (src) {\n return /* @__PURE__ */ jsx(\n \"img\",\n {\n src,\n alt: name,\n className: cn(\n \"rounded-full object-cover shrink-0\",\n sizeClasses2[size],\n className\n )\n }\n );\n }\n return /* @__PURE__ */ jsx(\n \"span\",\n {\n className: cn(\n \"inline-flex items-center justify-center rounded-full text-white font-semibold shrink-0\",\n getColor(name),\n sizeClasses2[size],\n className\n ),\n \"aria-label\": name,\n children: getInitials(name)\n }\n );\n}\nvar variantMap = {\n admin: { bg: \"bg-appsec-danger-light\", text: \"text-appsec-danger\" },\n editor: { bg: \"bg-appsec-warning-light\", text: \"text-appsec-warning\" },\n viewer: { bg: \"bg-appsec-success-light\", text: \"text-appsec-success\" },\n neutral: { bg: \"bg-appsec-surface-alt\", text: \"text-appsec-text-secondary\" },\n primary: { bg: \"bg-appsec-primary-light\", text: \"text-appsec-primary\" }\n};\nfunction Badge({ label, variant = \"neutral\", bgClass, textClass, className }) {\n const { bg, text } = variantMap[variant];\n return /* @__PURE__ */ jsx(\n \"span\",\n {\n className: cn(\n \"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium\",\n bgClass ?? bg,\n textClass ?? text,\n className\n ),\n children: label\n }\n );\n}\nfunction Chip({ label, onRemove, icon, disabled = false, className }) {\n return /* @__PURE__ */ jsxs(\n \"span\",\n {\n className: cn(\n \"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full\",\n \"bg-appsec-surface-alt border border-appsec-border\",\n \"text-xs font-medium text-appsec-text\",\n className\n ),\n children: [\n icon && /* @__PURE__ */ jsx(\"span\", { className: \"text-appsec-text-secondary\", children: icon }),\n /* @__PURE__ */ jsx(\"span\", { children: label }),\n onRemove && !disabled && /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onRemove,\n className: \"text-appsec-text-tertiary hover:text-appsec-danger transition-colors ml-0.5\",\n \"aria-label\": `Remove ${label}`,\n children: /* @__PURE__ */ jsx(X, { className: \"h-3 w-3\" })\n }\n )\n ]\n }\n );\n}\nvar sizeClasses3 = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-2xl\"\n};\nfunction Modal({\n open,\n onClose,\n title,\n description,\n size = \"md\",\n children,\n footer,\n className\n}) {\n const overlayRef = useRef(null);\n useEffect(() => {\n if (!open) return;\n const onKey = (e) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, onClose]);\n if (!open) return null;\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n ref: overlayRef,\n role: \"dialog\",\n \"aria-modal\": \"true\",\n \"aria-labelledby\": title ? \"modal-title\" : void 0,\n className: \"fixed inset-0 z-50 flex items-center justify-center p-4\",\n children: [\n /* @__PURE__ */ jsx(\n \"div\",\n {\n className: \"absolute inset-0 bg-black/40 backdrop-blur-sm\",\n onClick: onClose,\n \"aria-hidden\": \"true\"\n }\n ),\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"relative z-10 w-full bg-appsec-bg rounded-appsec shadow-xl\",\n \"border border-appsec-border\",\n \"flex flex-col max-h-[90vh]\",\n sizeClasses3[size],\n className\n ),\n children: [\n (title || description) && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-start justify-between gap-4 px-6 py-4 border-b border-appsec-border\", children: [\n /* @__PURE__ */ jsxs(\"div\", { children: [\n title && /* @__PURE__ */ jsx(\"h2\", { id: \"modal-title\", className: \"text-base font-semibold text-appsec-text\", children: title }),\n description && /* @__PURE__ */ jsx(\"p\", { className: \"mt-1 text-sm text-appsec-text-secondary\", children: description })\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onClose,\n className: \"text-appsec-text-tertiary hover:text-appsec-text transition-colors shrink-0\",\n \"aria-label\": \"Close\",\n children: /* @__PURE__ */ jsx(X, { className: \"h-5 w-5\" })\n }\n )\n ] }),\n /* @__PURE__ */ jsx(\"div\", { className: \"overflow-y-auto px-6 py-4 flex-1\", children }),\n footer && /* @__PURE__ */ jsx(\"div\", { className: \"flex items-center justify-end gap-2 px-6 py-4 border-t border-appsec-border\", children: footer })\n ]\n }\n )\n ]\n }\n );\n}\nvar LABELS6 = {\n defaultTitle: \"Are you sure?\",\n confirm: \"Confirm\",\n cancel: \"Cancel\"\n};\nfunction ConfirmDialog({\n open,\n onClose,\n onConfirm,\n title = LABELS6.defaultTitle,\n message,\n confirmLabel = LABELS6.confirm,\n cancelLabel = LABELS6.cancel,\n variant = \"danger\",\n loading = false\n}) {\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose,\n size: \"sm\",\n footer: /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(Button, { variant: \"secondary\", size: \"sm\", onClick: onClose, disabled: loading, children: cancelLabel }),\n /* @__PURE__ */ jsx(Button, { variant, size: \"sm\", onClick: onConfirm, loading, children: confirmLabel })\n ] }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-start gap-4\", children: [\n variant === \"danger\" && /* @__PURE__ */ jsx(\"span\", { className: \"shrink-0 mt-0.5 text-appsec-danger\", children: /* @__PURE__ */ jsx(AlertTriangle, { className: \"h-5 w-5\" }) }),\n /* @__PURE__ */ jsxs(\"div\", { children: [\n /* @__PURE__ */ jsx(\"h3\", { className: \"text-sm font-semibold text-appsec-text mb-1\", children: title }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-sm text-appsec-text-secondary\", children: message })\n ] })\n ] })\n }\n );\n}\nvar SearchBar = forwardRef(\n ({ value, onChange, onClear, placeholder = \"Search\\u2026\", className, ...rest }, ref) => {\n return /* @__PURE__ */ jsxs(\"div\", { className: cn(\"relative flex items-center\", className), children: [\n /* @__PURE__ */ jsx(Search, { className: \"absolute left-3 h-4 w-4 text-appsec-text-tertiary pointer-events-none\" }),\n /* @__PURE__ */ jsx(\n \"input\",\n {\n ref,\n type: \"search\",\n value,\n onChange: (e) => onChange(e.target.value),\n placeholder,\n className: cn(\n \"h-9 w-full rounded-appsec border border-appsec-border bg-appsec-bg\",\n \"pl-9 pr-8 py-2 text-sm text-appsec-text placeholder:text-appsec-text-tertiary\",\n \"transition-colors outline-none\",\n \"focus:border-appsec-primary focus:ring-2 focus:ring-appsec-primary-light\",\n \"[&::-webkit-search-cancel-button]:hidden\"\n ),\n ...rest\n }\n ),\n value && /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => {\n onChange(\"\");\n onClear?.();\n },\n className: \"absolute right-2.5 text-appsec-text-tertiary hover:text-appsec-text transition-colors\",\n \"aria-label\": \"Clear search\",\n children: /* @__PURE__ */ jsx(X, { className: \"h-4 w-4\" })\n }\n )\n ] });\n }\n);\nSearchBar.displayName = \"SearchBar\";\n\n// src/utils/search.ts\nfunction createSearchMatcher(query) {\n const trimmed = query.trim();\n if (!trimmed) return () => true;\n try {\n const regex = new RegExp(trimmed, \"i\");\n return (value) => regex.test(String(value ?? \"\"));\n } catch {\n const normalized = trimmed.toLowerCase();\n return (value) => String(value ?? \"\").toLowerCase().includes(normalized);\n }\n}\nfunction matchesAny(query, values) {\n const matches = createSearchMatcher(query);\n return values.some(matches);\n}\nfunction useDebouncedValue(value, delay = 300) {\n const [debouncedValue, setDebouncedValue] = useState(value);\n useEffect(() => {\n const timeout = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timeout);\n }, [value, delay]);\n return debouncedValue;\n}\nvar rbacQueryKeys = {\n app: (appId) => [\"rbac\", \"app\", appId],\n modules: (appId) => [\"rbac\", \"modules\", appId],\n roles: (appId) => [\"rbac\", \"roles\", appId],\n permissions: (appId) => [\"rbac\", \"permissions\", appId],\n acls: (appId, resourceId) => [\n \"rbac\",\n \"acls\",\n appId,\n resourceId\n ],\n roleModuleMapping: (appId) => [\"rbac\", \"roleModuleMapping\", appId],\n groups: (appId) => [\"rbac\", \"groups\", appId],\n resources: (moduleId) => [\"rbac\", \"resources\", moduleId],\n resourceGroups: (appId, moduleId) => [\n \"rbac\",\n \"resourceGroups\",\n appId,\n moduleId\n ],\n users: (query) => [\"rbac\", \"users\", query]\n};\nfunction useAppQuery(appId) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: rbacQueryKeys.app(appId),\n queryFn: () => adapter.getAppId(appId),\n enabled: !!appId,\n staleTime: 5 * 60 * 1e3,\n // 5 minutes\n refetchOnWindowFocus: false,\n refetchOnMount: false\n });\n}\nfunction useModulesQuery(appMongoId) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: rbacQueryKeys.modules(appMongoId),\n queryFn: () => adapter.getModules(appMongoId),\n enabled: !!appMongoId,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false\n });\n}\nfunction useRolesQuery(appMongoId) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: rbacQueryKeys.roles(appMongoId),\n queryFn: () => adapter.getRoles(appMongoId),\n enabled: !!appMongoId,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false\n });\n}\nfunction useAllRolesQuery(appMongoId) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: [...rbacQueryKeys.roles(appMongoId), \"all\"],\n queryFn: async () => {\n const PAGE_SIZE2 = 100;\n const CONCURRENCY = 10;\n const first = await adapter.getRoles(appMongoId, 1, PAGE_SIZE2);\n const totalPages = first?.pagination?.totalPages ?? 1;\n if (totalPages <= 1) return first;\n const remaining = Array.from({ length: totalPages - 1 }, (_, i) => i + 2);\n const results = [];\n for (let i = 0; i < remaining.length; i += CONCURRENCY) {\n const batch = remaining.slice(i, i + CONCURRENCY);\n const pages = await Promise.all(\n batch.map((page) => adapter.getRoles(appMongoId, page, PAGE_SIZE2))\n );\n results.push(...pages);\n }\n return {\n ...first,\n data: [...first.data ?? [], ...results.flatMap((r) => r.data ?? [])]\n };\n },\n enabled: !!appMongoId,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false\n });\n}\nfunction usePermissionsQuery(appMongoId) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: rbacQueryKeys.permissions(appMongoId),\n queryFn: () => adapter.getPermission(appMongoId),\n enabled: !!appMongoId,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false\n });\n}\nfunction useModulesPaginatedQuery(appMongoId, page, limit = 10, name = \"\") {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: [...rbacQueryKeys.modules(appMongoId), \"paginated\", page, limit, name],\n queryFn: () => adapter.getModules(appMongoId, page, limit, name),\n enabled: !!appMongoId,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n placeholderData: (prev) => prev\n });\n}\nfunction useRolesPaginatedQuery(appMongoId, page, limit = 10, name = \"\") {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: [...rbacQueryKeys.roles(appMongoId), \"paginated\", page, limit, name],\n queryFn: () => adapter.getRoles(appMongoId, page, limit, name),\n enabled: !!appMongoId,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n placeholderData: (prev) => prev\n });\n}\nfunction usePermissionsPaginatedQuery(appMongoId, page, limit = 10, name = \"\", enabled = true) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: [...rbacQueryKeys.permissions(appMongoId), \"paginated\", page, limit, name],\n queryFn: () => adapter.getPermission(appMongoId, page, limit, name),\n enabled: !!appMongoId && enabled,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n placeholderData: (prev) => prev\n });\n}\nfunction useAclsQuery(appMongoId, resourceId) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: rbacQueryKeys.acls(appMongoId, resourceId),\n queryFn: () => adapter.getAcls(appMongoId, 1, 50, resourceId),\n enabled: !!appMongoId,\n staleTime: 2 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false\n });\n}\nfunction useAllAclsQuery(appMongoId) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: [...rbacQueryKeys.acls(appMongoId), \"all\"],\n queryFn: () => adapter.getAcls(appMongoId, 1, 50, void 0, false),\n enabled: !!appMongoId,\n staleTime: 2 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false\n });\n}\nfunction useRoleModuleMappingQuery(appMongoId) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: rbacQueryKeys.roleModuleMapping(appMongoId),\n queryFn: () => adapter.getRoleModuleMapping(appMongoId),\n enabled: !!appMongoId,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false\n });\n}\nfunction useGroupsQuery(appMongoId) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: rbacQueryKeys.groups(appMongoId),\n queryFn: () => adapter.getGroups(appMongoId),\n enabled: !!appMongoId,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false\n });\n}\nfunction useUsersSearchQuery(query) {\n const { appsecUrl } = useAppsec();\n return useQuery({\n queryKey: rbacQueryKeys.users(query),\n queryFn: async () => {\n const res = await fetch(\n `${appsecUrl}/api/user/get-by-query-v2?search=${encodeURIComponent(\n query\n )}`,\n {\n method: \"GET\",\n credentials: \"include\"\n }\n );\n const data = await res.json();\n if (data?.success) {\n return (data.data || []).map((u) => ({\n email: u.email,\n displayName: u.displayName ?? u.firstname ? `${u.firstname} ${u.lastname}`.trim() : u.email\n }));\n } else {\n return [];\n }\n },\n enabled: query.length > 2,\n // Only search when query is meaningful\n staleTime: 10 * 60 * 1e3\n // 10 minutes for user search results\n });\n}\nfunction useCreateAclMutation() {\n const { adapter } = useAppsec();\n const queryClient2 = useQueryClient();\n const toast = useToast();\n return useMutation({\n mutationFn: (data) => adapter.createAcl(data),\n onSuccess: () => {\n queryClient2.invalidateQueries({ queryKey: [\"rbac\", \"acls\"] });\n },\n onError: (error) => {\n toast.error(error.message || \"Failed to grant access.\");\n }\n });\n}\nfunction useDeleteAclMutation() {\n const { adapter } = useAppsec();\n const queryClient2 = useQueryClient();\n const toast = useToast();\n return useMutation({\n mutationFn: (entryId) => adapter.deleteAcl(entryId),\n onSuccess: () => {\n queryClient2.invalidateQueries({ queryKey: [\"rbac\", \"acls\"] });\n toast.success(\"Access removed successfully.\");\n },\n onError: (error) => {\n toast.error(error.message || \"Failed to remove access.\");\n }\n });\n}\nfunction useDeleteAclsByResourceGroupMutation() {\n const { adapter } = useAppsec();\n const queryClient2 = useQueryClient();\n const toast = useToast();\n return useMutation({\n mutationFn: (data) => adapter.deleteAclsByResourceGroup(data),\n onSuccess: () => {\n queryClient2.invalidateQueries({ queryKey: [\"rbac\", \"acls\"] });\n },\n onError: (error) => {\n toast.error(\n error.message || \"Failed to remove access from resource group.\"\n );\n }\n });\n}\nfunction useShareResourceGroupMutation() {\n const { adapter } = useAppsec();\n const queryClient2 = useQueryClient();\n const toast = useToast();\n return useMutation({\n mutationFn: (data) => adapter.shareResourceGroup(data),\n onSuccess: () => {\n queryClient2.invalidateQueries({ queryKey: [\"rbac\", \"acls\"] });\n },\n onError: (error) => {\n toast.error(error.message || \"Failed to grant access to resource group.\");\n }\n });\n}\nfunction useBulkUpdateAclMutation() {\n const { adapter } = useAppsec();\n const queryClient2 = useQueryClient();\n const toast = useToast();\n return useMutation({\n mutationFn: (data) => adapter.bulkUpdateAcl(data),\n onSuccess: () => {\n queryClient2.invalidateQueries({ queryKey: [\"rbac\", \"acls\"] });\n toast.success(\"Roles updated successfully.\");\n },\n onError: (error) => {\n toast.error(error.message || \"Failed to update roles.\");\n }\n });\n}\nfunction useResourcesPaginatedQuery(moduleId, page, limit = 20, disabled = false) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: [...rbacQueryKeys.resources(moduleId), \"paginated\", page, limit],\n queryFn: () => adapter.getResourceForModuleId(moduleId, page, limit),\n enabled: !!moduleId && !disabled,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n placeholderData: (prev) => prev\n });\n}\nfunction useResourceGroupsPaginatedQuery(appMongoId, moduleId, page, limit = 20) {\n const { adapter } = useAppsec();\n return useQuery({\n queryKey: [...rbacQueryKeys.resourceGroups(appMongoId, moduleId), \"paginated\", page, limit],\n queryFn: () => adapter.getResourceGroups(appMongoId, moduleId, page, limit),\n enabled: !!appMongoId && !!moduleId,\n staleTime: 5 * 60 * 1e3,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n placeholderData: (prev) => prev\n });\n}\nvar getPaginationTotalItems = (pagination, fallback = 0) => Number(pagination?.totalItems ?? pagination?.total ?? fallback);\nvar getPaginationTotalPages = (pagination, totalItems, pageSize) => Number(pagination?.totalPages ?? Math.ceil(totalItems / pageSize) ?? 1);\nmemo(function ShareModal2({\n open,\n onClose,\n resource,\n roles,\n groups,\n onShare,\n onSearchUsers,\n roleModuleMapping\n}) {\n const [mode, setMode] = useState(\"user\");\n const [selectedUsers, setSelectedUsers] = useState([]);\n const [inputValue, setInputValue] = useState(\"\");\n const [suggestions, setSuggestions] = useState([]);\n const [showDropdown, setShowDropdown] = useState(false);\n const [searching, setSearching] = useState(false);\n const inputRef = useRef(null);\n const dropdownRef = useRef(null);\n const [groupId, setGroupId] = useState(\"\");\n const [roleId, setRoleId] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const submittingRef = useRef(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [buttonDisabled, setButtonDisabled] = useState(false);\n const filteredRoles = useMemo(\n () => roles.filter(\n (role) => roleModuleMapping.some(\n (m) => m.roleId?._id === role._id && m.moduleId?._id === resource.module\n )\n ),\n [roles, roleModuleMapping, resource.module]\n );\n useEffect(() => {\n if (open) {\n setMode(\"user\");\n setSelectedUsers([]);\n setInputValue(\"\");\n setSuggestions([]);\n setShowDropdown(false);\n setGroupId(\"\");\n setRoleId(\"\");\n setError(\"\");\n setLoading(false);\n submittingRef.current = false;\n setIsSubmitting(false);\n setButtonDisabled(false);\n }\n }, [open]);\n useEffect(() => {\n if (inputValue.trim().length < 2) {\n setSuggestions([]);\n setShowDropdown(false);\n return;\n }\n const timer = setTimeout(async () => {\n setSearching(true);\n try {\n const results = await onSearchUsers(inputValue.trim());\n setSuggestions(\n results.filter(\n (u) => !selectedUsers.some((s) => s.email === u.email)\n )\n );\n setShowDropdown(true);\n } catch {\n setSuggestions([]);\n } finally {\n setSearching(false);\n }\n }, 300);\n return () => clearTimeout(timer);\n }, [inputValue, selectedUsers, onSearchUsers]);\n useEffect(() => {\n if (!showDropdown) return;\n const handler = (e) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {\n setShowDropdown(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [showDropdown]);\n const addUser = (user) => {\n setSelectedUsers((prev) => [...prev, user]);\n setInputValue(\"\");\n setSuggestions([]);\n setShowDropdown(false);\n inputRef.current?.focus();\n };\n const addRawEmail = () => {\n const trimmed = inputValue.trim().toLowerCase();\n if (!trimmed || selectedUsers.some((u) => u.email === trimmed)) return;\n setSelectedUsers((prev) => [\n ...prev,\n { email: trimmed, displayName: trimmed }\n ]);\n setInputValue(\"\");\n setSuggestions([]);\n setShowDropdown(false);\n };\n const removeUser = (email) => {\n setSelectedUsers((prev) => prev.filter((u) => u.email !== email));\n };\n const handleKeyDown = (e) => {\n if ((e.key === \"Enter\" || e.key === \",\") && inputValue.trim()) {\n e.preventDefault();\n if (suggestions.length > 0) addUser(suggestions[0]);\n else addRawEmail();\n }\n if (e.key === \"Backspace\" && !inputValue && selectedUsers.length > 0) {\n setSelectedUsers((prev) => prev.slice(0, -1));\n }\n if (e.key === \"Escape\") setShowDropdown(false);\n };\n const submit = async () => {\n if (mode === \"user\" && selectedUsers.length === 0) {\n setError(\"Add at least one email.\");\n return;\n }\n if (mode === \"group\" && !groupId) {\n setError(\"Select a group.\");\n return;\n }\n if (!roleId) {\n setError(\"Select a role.\");\n return;\n }\n submittingRef.current = true;\n setIsSubmitting(true);\n setLoading(true);\n setError(\"\");\n try {\n await onShare(\n selectedUsers.map((u) => u.email),\n roleId,\n mode === \"group\" ? groupId : void 0\n );\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Share failed.\");\n } finally {\n setLoading(false);\n submittingRef.current = false;\n setIsSubmitting(false);\n setButtonDisabled(false);\n }\n };\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose,\n title: `Share \\u2014 ${resource.name}`,\n description: \"Grant access to this document.\",\n size: \"sm\",\n footer: /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"sm\",\n onClick: onClose,\n disabled: loading || isSubmitting,\n children: \"Cancel\"\n }\n ),\n /* @__PURE__ */ jsx(\n Button,\n {\n size: \"sm\",\n onClick: (e) => {\n e.preventDefault();\n e.stopPropagation();\n submit();\n },\n loading,\n disabled: loading || isSubmitting || buttonDisabled,\n children: \"Share\"\n }\n )\n ] }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-4\", children: [\n /* @__PURE__ */ jsx(\"div\", { className: \"flex gap-1 p-1 rounded-appsec bg-appsec-surface border border-appsec-border\", children: [\"user\", \"group\"].map((m) => /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => {\n setMode(m);\n setError(\"\");\n },\n className: cn(\n \"flex-1 py-1.5 text-xs font-medium rounded transition-colors capitalize\",\n mode === m ? \"bg-appsec-bg text-appsec-text shadow-sm border border-appsec-border\" : \"text-appsec-text-secondary hover:text-appsec-text\"\n ),\n children: m === \"user\" ? \"By Email\" : \"By Group\"\n },\n m\n )) }),\n mode === \"user\" ? /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Add people\" }),\n /* @__PURE__ */ jsxs(\"div\", { ref: dropdownRef, className: \"relative\", children: [\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"flex flex-wrap gap-1.5 p-2 min-h-10 rounded-appsec border bg-appsec-bg cursor-text transition-colors\",\n showDropdown || document.activeElement === inputRef.current ? \"border-appsec-primary\" : \"border-appsec-border\"\n ),\n onClick: () => inputRef.current?.focus(),\n children: [\n selectedUsers.map((u) => /* @__PURE__ */ jsx(\n Chip,\n {\n label: u.displayName !== u.email ? u.displayName : u.email,\n onRemove: () => removeUser(u.email)\n },\n u.email\n )),\n /* @__PURE__ */ jsx(\n \"input\",\n {\n ref: inputRef,\n type: \"text\",\n value: inputValue,\n onChange: (e) => setInputValue(e.target.value),\n onKeyDown: handleKeyDown,\n onFocus: () => inputValue.trim().length >= 2 && suggestions.length > 0 && setShowDropdown(true),\n placeholder: selectedUsers.length === 0 ? \"Search by name or email\\u2026\" : \"\",\n className: \"flex-1 min-w-32 bg-transparent outline-none text-sm text-appsec-text placeholder:text-appsec-text-tertiary\"\n }\n ),\n searching && /* @__PURE__ */ jsx(\"span\", { className: \"self-center ml-1\", children: /* @__PURE__ */ jsxs(\n \"svg\",\n {\n className: \"animate-spin h-3.5 w-3.5 text-appsec-text-secondary\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n children: [\n /* @__PURE__ */ jsx(\n \"circle\",\n {\n className: \"opacity-25\",\n cx: \"12\",\n cy: \"12\",\n r: \"10\",\n stroke: \"currentColor\",\n strokeWidth: \"4\"\n }\n ),\n /* @__PURE__ */ jsx(\n \"path\",\n {\n className: \"opacity-75\",\n fill: \"currentColor\",\n d: \"M4 12a8 8 0 018-8v8H4z\"\n }\n )\n ]\n }\n ) })\n ]\n }\n ),\n showDropdown && suggestions.length > 0 && /* @__PURE__ */ jsx(\"div\", { className: \"absolute z-50 mt-1 w-full rounded-appsec border border-appsec-border bg-appsec-bg shadow-lg overflow-hidden\", children: suggestions.map((u) => /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onMouseDown: (e) => {\n e.preventDefault();\n addUser(u);\n },\n className: \"flex items-center gap-3 w-full px-3 py-2.5 text-left hover:bg-appsec-surface transition-colors\",\n children: [\n /* @__PURE__ */ jsx(Avatar, { name: u.displayName, size: \"sm\" }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col min-w-0\", children: [\n /* @__PURE__ */ jsx(\"span\", { className: \"text-sm font-medium text-appsec-text truncate\", children: u.displayName }),\n /* @__PURE__ */ jsx(\"span\", { className: \"text-xs text-appsec-text-secondary truncate\", children: u.email })\n ] })\n ]\n },\n u.email\n )) })\n ] }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary\", children: \"Press Enter or comma to add a raw email address.\" })\n ] }) : /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Group\" }),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: groupId,\n onChange: (e) => setGroupId(e.target.value),\n className: \"h-9 text-sm rounded-appsec border border-appsec-border bg-appsec-bg px-3 pr-8 appearance-none outline-none focus:border-appsec-primary text-appsec-text\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"Select group\\u2026\" }),\n groups.map((g) => /* @__PURE__ */ jsxs(\"option\", { value: g._id, children: [\n g.name,\n g.description ? ` \\u2014 ${g.description}` : \"\"\n ] }, g._id))\n ]\n }\n )\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Role\" }),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: roleId,\n onChange: (e) => setRoleId(e.target.value),\n className: \"h-9 text-sm rounded-appsec border border-appsec-border bg-appsec-bg px-3 pr-8 appearance-none outline-none focus:border-appsec-primary text-appsec-text\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"Select role\\u2026\" }),\n filteredRoles.map((r) => /* @__PURE__ */ jsx(\"option\", { value: r._id, children: r.name }, r._id))\n ]\n }\n )\n ] }),\n error && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: error })\n ] })\n }\n );\n});\nvar TYPE_OPTIONS = [\"all\", \"user\", \"group\"];\nvar ACL_PAGE_SIZE = 10;\nvar AccessList = memo(function AccessList2({\n entries,\n roles,\n users,\n groups,\n onRemove,\n onBulkRoleChange,\n roleModuleMapping,\n module\n}) {\n const toast = useToast();\n const [selected, setSelected] = useState(/* @__PURE__ */ new Set());\n const [bulkRole, setBulkRole] = useState(\"\");\n const [removing, setRemoving] = useState(null);\n const [bulkLoading, setBulkLoading] = useState(false);\n const [confirmRemove, setConfirmRemove] = useState(null);\n const [aclPage, setAclPage] = useState(0);\n const [search, setSearch] = useState(\"\");\n const debouncedSearch = useDebouncedValue(search.trim(), 300);\n const [roleFilter, setRoleFilter] = useState(\"\");\n const [typeFilter, setTypeFilter] = useState(\"all\");\n const filteredRoles = useMemo(\n () => roles.filter(\n (role) => roleModuleMapping.some(\n (m) => m.roleId?._id === role._id && m.moduleId?._id === module._id\n )\n ),\n [roles, roleModuleMapping, module._id]\n );\n const isGroupEntry = (entry) => !!entry.groupId;\n const groupFor = (groupId) => groups.find((g) => g._id === groupId);\n const normalizedEntries = useMemo(\n () => entries.map((e) => ({\n ...e,\n id: e.id || e._id\n })),\n [entries]\n );\n const availableRoles = useMemo(\n () => [\n ...new Set(normalizedEntries.map((e) => e.role?.name).filter(Boolean))\n ].sort(),\n [normalizedEntries]\n );\n const visibleEntries = useMemo(() => {\n let result = normalizedEntries;\n if (typeFilter !== \"all\") {\n result = result.filter(\n (e) => typeFilter === \"group\" ? isGroupEntry(e) : !isGroupEntry(e)\n );\n }\n if (roleFilter) {\n result = result.filter((e) => e.role?.name === roleFilter);\n }\n if (debouncedSearch) {\n result = result.filter((e) => {\n if (isGroupEntry(e)) {\n const group = groupFor(e.groupId);\n return matchesAny(debouncedSearch, [\n group?.name,\n group?.description,\n \"group\",\n e.role?.name,\n e.grantedBy ? decodeURIComponent(e.grantedBy) : \"\",\n e.grantedAt,\n e.resourceId\n ]);\n }\n return matchesAny(debouncedSearch, [\n e.user_email,\n \"user\",\n e.role?.name,\n e.grantedBy ? decodeURIComponent(e.grantedBy) : \"\",\n e.grantedAt,\n e.resourceId\n ]);\n });\n }\n return result;\n }, [normalizedEntries, typeFilter, roleFilter, debouncedSearch]);\n const totalAclPages = Math.max(1, Math.ceil(visibleEntries.length / ACL_PAGE_SIZE));\n const pageEntries = useMemo(\n () => visibleEntries.slice(aclPage * ACL_PAGE_SIZE, (aclPage + 1) * ACL_PAGE_SIZE),\n [visibleEntries, aclPage]\n );\n useEffect(() => {\n setAclPage(0);\n }, [search, roleFilter, typeFilter, module._id]);\n const allPageSelected = useMemo(\n () => pageEntries.length > 0 && pageEntries.every((e) => selected.has(e.id)),\n [pageEntries, selected]\n );\n const toggleAll = useCallback(\n () => setSelected((s) => {\n const n = new Set(s);\n if (allPageSelected) {\n pageEntries.forEach((e) => n.delete(e.id));\n } else {\n pageEntries.forEach((e) => n.add(e.id));\n }\n return n;\n }),\n [allPageSelected, pageEntries]\n );\n const toggleOne = (id) => setSelected((s) => {\n const n = new Set(s);\n n.has(id) ? n.delete(id) : n.add(id);\n return n;\n });\n const handleRemove = async (entryId) => {\n setRemoving(entryId);\n try {\n await onRemove(entryId);\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Failed to remove access.\"\n );\n } finally {\n setRemoving(null);\n setConfirmRemove(null);\n }\n };\n const handleBulkApply = async () => {\n if (!bulkRole || selected.size === 0) return;\n setBulkLoading(true);\n try {\n await onBulkRoleChange([...selected], bulkRole);\n toast.success(\n `Role updated for ${selected.size} user${selected.size !== 1 ? \"s\" : \"\"}.`\n );\n setSelected(/* @__PURE__ */ new Set());\n setBulkRole(\"\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Failed to update roles.\"\n );\n } finally {\n setBulkLoading(false);\n }\n };\n const userFor = (email) => users.find((u) => u.email === email);\n if (normalizedEntries.length === 0) {\n return /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary py-3 text-center\", children: \"No one has access yet. Use Share to grant access.\" });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2 flex-wrap\", children: [\n /* @__PURE__ */ jsx(\n SearchBar,\n {\n value: search,\n onChange: setSearch,\n placeholder: \"Search by email or group name\\u2026\",\n className: \"flex-1 min-w-40\"\n }\n ),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: roleFilter,\n onChange: (e) => setRoleFilter(e.target.value),\n className: \"h-8 text-xs rounded-appsec border border-appsec-border bg-appsec-bg px-2 pr-6 appearance-none outline-none focus:border-appsec-primary text-appsec-text\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"All Roles\" }),\n availableRoles.map((r) => /* @__PURE__ */ jsx(\"option\", { value: r, children: r }, r))\n ]\n }\n ),\n /* @__PURE__ */ jsx(\"div\", { className: \"flex gap-0.5 p-0.5 rounded-appsec bg-appsec-surface border border-appsec-border\", children: TYPE_OPTIONS.map((t) => /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setTypeFilter(t),\n className: cn(\n \"px-2.5 py-1 text-[11px] font-medium rounded capitalize transition-colors\",\n typeFilter === t ? \"bg-appsec-bg text-appsec-text shadow-sm border border-appsec-border\" : \"text-appsec-text-secondary hover:text-appsec-text\"\n ),\n children: t\n },\n t\n )) })\n ] }),\n selected.size > 0 && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2 px-3 py-2 rounded-appsec bg-appsec-primary-light border border-appsec-primary/30\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-xs font-semibold text-appsec-primary\", children: [\n selected.size,\n \" selected\"\n ] }),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: bulkRole,\n onChange: (e) => setBulkRole(e.target.value),\n className: \"h-7 text-xs rounded-appsec border px-2\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"Change role\\u2026\" }),\n filteredRoles.map((r) => /* @__PURE__ */ jsx(\"option\", { value: r._id, children: r.name }, r._id))\n ]\n }\n ),\n /* @__PURE__ */ jsx(\n Button,\n {\n size: \"sm\",\n variant: \"secondary\",\n disabled: !bulkRole || bulkLoading,\n onClick: handleBulkApply,\n children: \"Apply\"\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n onClick: () => setSelected(/* @__PURE__ */ new Set()),\n className: \"text-xs ml-auto\",\n children: \"\\u2715 Clear\"\n }\n )\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col divide-y border rounded-appsec overflow-x-auto\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-3 px-3 py-2 bg-appsec-surface\", children: [\n /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n checked: allPageSelected,\n onChange: toggleAll,\n className: \"shrink-0\"\n }\n ),\n /* @__PURE__ */ jsx(\"span\", { className: \"min-w-0 flex-1 text-xs font-semibold\", children: \"Subject\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"w-14 shrink-0 text-xs font-semibold\", children: \"Type\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"w-36 shrink-0 text-xs font-semibold\", children: \"Role\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"w-28 shrink-0 text-xs font-semibold\", children: \"Granted\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"w-36 shrink-0 text-xs font-semibold\", children: \"Granted By\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"w-8 shrink-0\" })\n ] }),\n visibleEntries.length === 0 ? /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary py-4 text-center\", children: \"No results match your filters.\" }) : pageEntries.map((entry) => {\n const isSelected = selected.has(entry.id);\n const user = userFor(entry.user_email);\n const group = groupFor(entry.groupId);\n const isGroup = isGroupEntry(entry);\n const subjectLabel = isGroup ? group?.name || \"Unknown Group\" : entry.user_email;\n const subjectDetail = isGroup ? `${group?.users?.length || 0} members` : entry.user_email;\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"flex min-w-0 items-center gap-3 px-3 py-2\",\n isSelected && \"bg-appsec-primary-light\"\n ),\n children: [\n /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n checked: isSelected,\n onChange: () => toggleOne(entry.id),\n className: \"shrink-0\"\n }\n ),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex min-w-0 flex-1 items-center gap-2\", children: [\n /* @__PURE__ */ jsx(\n Avatar,\n {\n name: subjectLabel,\n src: user?.avatarUrl,\n size: \"xs\"\n }\n ),\n /* @__PURE__ */ jsxs(\"div\", { className: \"min-w-0\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"truncate text-xs font-medium\", title: subjectLabel, children: subjectLabel }),\n /* @__PURE__ */ jsx(\"p\", { className: \"truncate text-[10px] text-gray-500\", title: subjectDetail, children: subjectDetail })\n ] })\n ] }),\n /* @__PURE__ */ jsx(\"div\", { className: \"w-14 shrink-0\", children: /* @__PURE__ */ jsx(Badge, { label: isGroup ? \"Group\" : \"User\", variant: \"neutral\" }) }),\n /* @__PURE__ */ jsx(\"div\", { className: \"w-36 min-w-0 shrink-0\", children: /* @__PURE__ */ jsx(\n Badge,\n {\n label: entry.role?.name || \"\\u2014\",\n variant: \"neutral\",\n className: \"max-w-full whitespace-normal break-words rounded-xl px-3 py-2 text-left leading-snug\"\n }\n ) }),\n /* @__PURE__ */ jsx(\"div\", { className: \"w-28 shrink-0 text-[10px] text-gray-500\", children: new Date(entry.grantedAt).toLocaleDateString() }),\n /* @__PURE__ */ jsx(\"div\", { className: \"w-36 shrink-0 truncate text-[10px] text-appsec-primary\", children: entry.grantedBy ? decodeURIComponent(entry.grantedBy) : \"\\u2014\" }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: removing === entry.id,\n onClick: () => setConfirmRemove(entry.id),\n className: \"w-8 shrink-0\",\n children: /* @__PURE__ */ jsx(Trash2, { className: \"h-3.5 w-3.5\" })\n }\n )\n ]\n },\n entry.id\n );\n })\n ] }),\n totalAclPages > 1 && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between px-1\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-tertiary\", children: [\n aclPage * ACL_PAGE_SIZE + 1,\n \"\\u2013\",\n Math.min((aclPage + 1) * ACL_PAGE_SIZE, visibleEntries.length),\n \" of \",\n visibleEntries.length\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setAclPage((p) => Math.max(0, p - 1)),\n disabled: aclPage === 0,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 disabled:cursor-default transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronLeft, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-secondary px-1\", children: [\n aclPage + 1,\n \" / \",\n totalAclPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setAclPage((p) => Math.min(totalAclPages - 1, p + 1)),\n disabled: aclPage >= totalAclPages - 1,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 disabled:cursor-default transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronRight, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] }),\n /* @__PURE__ */ jsx(\n ConfirmDialog,\n {\n open: !!confirmRemove,\n onClose: () => setConfirmRemove(null),\n onConfirm: () => confirmRemove && handleRemove(confirmRemove),\n title: \"Remove access\",\n message: \"Remove this subject's access?\",\n confirmLabel: \"Remove\",\n variant: \"danger\",\n loading: removing !== null\n }\n )\n ] });\n});\nvar ResourceRow = memo(function ResourceRow2({\n resource,\n roles,\n users,\n groups,\n aclEntries,\n onShare,\n onRemoveAccess,\n onBulkRoleChange,\n roleModuleMapping,\n module,\n mfApi\n}) {\n const clickLock = useRef(false);\n useEffect(() => {\n if (!mfApi) return;\n mfApi.subscribe(\n \"MODE_UI_INTERACTION_TO_PERFORM\",\n (eventData) => {\n console.log(\"Event received\", eventData);\n if (eventData.action === \"input\" && eventData.elementId === `expand-${resource.name}`) {\n console.log(\"Clicking expand\", resource.name);\n setExpanded(true);\n }\n }\n );\n }, [mfApi]);\n const [expanded, setExpanded] = useState(false);\n const resourceEntries = useMemo(\n () => aclEntries.filter((e) => e.resourceId === resource._id),\n [aclEntries, resource._id]\n );\n return /* @__PURE__ */ jsxs(\"div\", { className: \"border border-appsec-border rounded-appsec overflow-hidden\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-3 px-4 py-3 bg-appsec-bg hover:bg-appsec-surface transition-colors\", children: [\n /* @__PURE__ */ jsx(FileText, { className: \"h-4 w-4 text-appsec-text-tertiary shrink-0\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"text-sm text-appsec-text flex-1 truncate\", children: resource.name }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1 text-xs text-appsec-text-secondary shrink-0\", children: [\n /* @__PURE__ */ jsx(Users, { className: \"h-3.5 w-3.5\" }),\n /* @__PURE__ */ jsx(\"span\", { children: resourceEntries.length })\n ] }),\n /* @__PURE__ */ jsx(\n Button,\n {\n id: `share-${resource.name}`,\n \"data-lsc-ui-type\": \"button\",\n \"data-lsc-ui-label\": `share-${resource.name}`,\n \"data-lsc-description\": `Share ${resource.name}`,\n \"data-lsc-when-to-apply\": `when user request to Share the ${resource.name}`,\n size: \"sm\",\n variant: \"secondary\",\n iconLeft: /* @__PURE__ */ jsx(Share2, { className: \"h-3.5 w-3.5\" }),\n onClick: () => onShare(resource),\n className: \"shrink-0\",\n children: \"Share\"\n },\n `share-${resource._id}`\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n id: `expand-${resource.name}`,\n \"data-lsc-ui-type\": \"button\",\n \"data-lsc-ui-label\": `expand-${resource.name}`,\n \"data-lsc-description\": `Expand ${resource.name}`,\n \"data-lsc-when-to-apply\": `when user request to click or open or expand the ${resource.name}`,\n type: \"button\",\n \"aria-label\": expanded ? \"Collapse\" : \"Show access list\",\n onClick: (e) => {\n e.stopPropagation();\n if (clickLock.current) return;\n clickLock.current = true;\n setExpanded((prev) => !prev);\n setTimeout(() => {\n clickLock.current = false;\n }, 0);\n },\n className: cn(\n \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-text transition-colors\",\n resourceEntries.length === 0 && \"opacity-30 cursor-default pointer-events-none\"\n ),\n children: expanded ? /* @__PURE__ */ jsx(ChevronUp, { className: \"h-4 w-4\" }) : /* @__PURE__ */ jsx(ChevronDown, { className: \"h-4 w-4\" })\n },\n `expand-${resource._id}`\n )\n ] }),\n expanded && /* @__PURE__ */ jsx(\"div\", { className: \"border-t border-appsec-border bg-appsec-surface px-4 py-3\", children: /* @__PURE__ */ jsx(\n AccessList,\n {\n entries: resourceEntries,\n roles,\n users,\n groups,\n onRemove: onRemoveAccess,\n onBulkRoleChange,\n roleModuleMapping,\n module\n }\n ) })\n ] });\n});\nfunction ResourceGroupFormModal({\n open,\n onClose,\n moduleId,\n existing,\n onSave\n}) {\n const RESOURCE_PAGE_SIZE = 10;\n const [form, setForm] = useState({\n name: \"\",\n description: \"\",\n resources: []\n });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const [resourceSearch, setResourceSearch] = useState(\"\");\n const debouncedResourceSearch = useDebouncedValue(resourceSearch.trim(), 300);\n const [resourcePage, setResourcePage] = useState(1);\n const resourcesQuery = useResourcesPaginatedQuery(moduleId, resourcePage, RESOURCE_PAGE_SIZE, !open);\n const resources = resourcesQuery.data?.data || [];\n const resourcePagination = resourcesQuery.data?.pagination;\n const resTotalCount = getPaginationTotalItems(resourcePagination);\n const totalResourcePages = Math.max(\n 1,\n getPaginationTotalPages(resourcePagination, resTotalCount, RESOURCE_PAGE_SIZE)\n );\n const filteredModalResources = useMemo(() => {\n if (!debouncedResourceSearch) return resources;\n return resources.filter(\n (r) => matchesAny(debouncedResourceSearch, [r.name, r.description, r._id])\n );\n }, [resources, debouncedResourceSearch]);\n useEffect(() => {\n setResourcePage(1);\n }, [resourceSearch]);\n useEffect(() => {\n if (open) {\n setForm({\n name: existing?.name ?? \"\",\n description: existing?.description ?? \"\",\n resources: (existing?.resources ?? []).map(\n (r) => typeof r === \"string\" ? r : String(r._id ?? r)\n )\n });\n setError(\"\");\n setResourceSearch(\"\");\n setResourcePage(1);\n }\n }, [open, existing]);\n const toggleResource = (id) => setForm((f) => ({\n ...f,\n resources: f.resources.includes(id) ? f.resources.filter((r) => r !== id) : [...f.resources, id]\n }));\n const submit = async () => {\n if (!form.name.trim()) {\n setError(\"Name is required.\");\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n await onSave(form);\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Save failed.\");\n } finally {\n setLoading(false);\n }\n };\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose,\n title: existing ? \"Edit resource group\" : \"Create resource group\",\n size: \"sm\",\n footer: /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"sm\",\n onClick: onClose,\n disabled: loading,\n children: \"Cancel\"\n }\n ),\n /* @__PURE__ */ jsx(Button, { size: \"sm\", onClick: submit, loading, children: existing ? \"Save\" : \"Create\" })\n ] }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-3\", children: [\n /* @__PURE__ */ jsx(\n Input,\n {\n label: \"Name\",\n value: form.name,\n onChange: (e) => setForm((f) => ({ ...f, name: e.target.value })),\n placeholder: \"e.g. Finance Documents\",\n required: true\n }\n ),\n /* @__PURE__ */ jsx(\n Input,\n {\n label: \"Description\",\n value: form.description,\n onChange: (e) => setForm((f) => ({ ...f, description: e.target.value })),\n placeholder: \"Optional\"\n }\n ),\n resources.length > 0 && /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1.5\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between\", children: [\n /* @__PURE__ */ jsxs(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: [\n \"Resources\",\n /* @__PURE__ */ jsxs(\"span\", { className: \"ml-1.5 text-xs font-normal text-appsec-text-tertiary\", children: [\n \"(\",\n form.resources.length,\n \" selected)\"\n ] })\n ] }),\n form.resources.length > 0 && /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setForm((f) => ({ ...f, resources: [] })),\n className: \"text-[11px] text-appsec-text-tertiary hover:text-appsec-danger transition-colors\",\n children: \"Clear all\"\n }\n )\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"relative\", children: [\n /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"text\",\n value: resourceSearch,\n onChange: (e) => setResourceSearch(e.target.value),\n placeholder: \"Search resources\\u2026\",\n className: \"w-full h-8 pl-8 pr-3 text-xs rounded-appsec border border-appsec-border bg-appsec-bg text-appsec-text placeholder:text-appsec-text-tertiary outline-none focus:border-appsec-primary transition-colors\"\n }\n ),\n /* @__PURE__ */ jsx(\n \"svg\",\n {\n className: \"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-appsec-text-tertiary pointer-events-none\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n children: /* @__PURE__ */ jsx(\n \"path\",\n {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M21 21l-4.35-4.35M17 11A6 6 0 1 1 5 11a6 6 0 0 1 12 0z\"\n }\n )\n }\n )\n ] }),\n /* @__PURE__ */ jsx(\"div\", { className: \"rounded-appsec border border-appsec-border bg-appsec-surface overflow-hidden\", children: filteredModalResources.length === 0 ? /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary text-center py-4\", children: \"No resources match your search.\" }) : /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-col divide-y divide-appsec-border\", children: filteredModalResources.map((r) => /* @__PURE__ */ jsxs(\n \"label\",\n {\n className: \"flex items-center gap-2 cursor-pointer py-2 px-3 hover:bg-appsec-bg transition-colors\",\n children: [\n /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n checked: form.resources.includes(r._id),\n onChange: () => toggleResource(r._id),\n className: \"h-3.5 w-3.5 rounded border-appsec-border accent-appsec-primary cursor-pointer shrink-0\"\n }\n ),\n /* @__PURE__ */ jsx(\"span\", { className: \"text-xs text-appsec-text truncate\", children: r.name })\n ]\n },\n r._id\n )) }) }),\n totalResourcePages > 1 && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between px-0.5\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-tertiary\", children: [\n (resourcePage - 1) * RESOURCE_PAGE_SIZE + 1,\n \"\\u2013\",\n Math.min(resourcePage * RESOURCE_PAGE_SIZE, resTotalCount),\n \" of \",\n resTotalCount\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setResourcePage((p) => Math.max(1, p - 1)),\n disabled: resourcePage === 1,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 disabled:cursor-default transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronLeft, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-secondary px-1\", children: [\n resourcePage,\n \" / \",\n totalResourcePages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setResourcePage((p) => Math.min(totalResourcePages, p + 1)),\n disabled: resourcePage >= totalResourcePages,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 disabled:cursor-default transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronRight, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] })\n ] }),\n error && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: error })\n ] })\n }\n );\n}\nvar ResourceGroupRow = memo(function ResourceGroupRow2({\n group,\n roles,\n users,\n groups: userGroups,\n aclEntries,\n onShare,\n onBulkRoleChange,\n onEdit,\n onDelete,\n roleModuleMapping,\n module,\n allResources\n}) {\n const [expanded, setExpanded] = useState(false);\n const [resourcesPopoverOpen, setResourcesPopoverOpen] = useState(false);\n const [popoverPos, setPopoverPos] = useState({ top: 0, left: 0 });\n const resourcesBtnRef = React11.useRef(null);\n const deleteGroupAclMutation = useDeleteAclsByResourceGroupMutation();\n const groupEntries = useMemo(() => {\n const resourceIds = new Set(\n group.resources.map(\n (r) => typeof r === \"string\" ? r : String(r._id ?? r)\n )\n );\n const totalResources = resourceIds.size;\n if (totalResources === 0) return [];\n const byPrincipal = /* @__PURE__ */ new Map();\n for (const entry of aclEntries) {\n if (!resourceIds.has(String(entry.resourceId))) continue;\n const principal = entry.user_email || entry.group_id || \"\";\n if (!principal) continue;\n if (!byPrincipal.has(principal)) byPrincipal.set(principal, []);\n byPrincipal.get(principal).push(entry);\n }\n const result = [];\n for (const entries of byPrincipal.values()) {\n const covered = new Set(entries.map((e) => String(e.resourceId)));\n if (covered.size === totalResources) {\n result.push(entries[0]);\n }\n }\n return result;\n }, [aclEntries, group.resources]);\n const handleRemoveFromGroup = useCallback(\n async (entryId) => {\n const entry = groupEntries.find((e) => e._id === entryId);\n if (!entry) return;\n await deleteGroupAclMutation.mutateAsync({\n resource_group_id: group._id,\n ...entry.user_email ? { user_email: entry.user_email } : { group_id: entry.group_id }\n });\n },\n [groupEntries, group._id, deleteGroupAclMutation]\n );\n const asShareable = {\n _id: group._id,\n name: group.name,\n module: module._id,\n application: group.application,\n isResourceGroup: true\n };\n return /* @__PURE__ */ jsxs(\"div\", { className: \"border border-appsec-border rounded-appsec overflow-hidden\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-3 px-4 py-3 bg-appsec-bg hover:bg-appsec-surface transition-colors\", children: [\n /* @__PURE__ */ jsx(Layers, { className: \"h-4 w-4 text-appsec-primary shrink-0\" }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [\n /* @__PURE__ */ jsx(\"span\", { className: \"text-sm font-medium text-appsec-text truncate block\", children: group.name }),\n group.description && /* @__PURE__ */ jsx(\"span\", { className: \"text-xs text-appsec-text-secondary truncate block\", children: group.description })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"relative shrink-0\", children: [\n /* @__PURE__ */ jsxs(\n \"button\",\n {\n ref: resourcesBtnRef,\n type: \"button\",\n onClick: () => {\n if (!resourcesPopoverOpen && resourcesBtnRef.current) {\n const r = resourcesBtnRef.current.getBoundingClientRect();\n setPopoverPos({ top: r.bottom + 6, left: r.left });\n }\n setResourcesPopoverOpen((v) => !v);\n },\n className: \"flex items-center gap-1.5 text-xs font-medium text-white bg-appsec-primary hover:bg-appsec-primary/90 active:scale-95 px-2.5 py-1 rounded-full transition-all cursor-pointer shadow-sm\",\n title: \"View resources in this group\",\n children: [\n /* @__PURE__ */ jsx(FileText, { className: \"h-3.5 w-3.5 text-white\" }),\n /* @__PURE__ */ jsx(\"span\", { children: group.resources.length })\n ]\n }\n ),\n resourcesPopoverOpen && /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n \"div\",\n {\n className: \"fixed inset-0 z-40\",\n onClick: () => setResourcesPopoverOpen(false)\n }\n ),\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: \"fixed z-50 min-w-45 max-w-65 bg-appsec-bg border border-appsec-border rounded-appsec shadow-lg py-1\",\n style: { top: popoverPos.top, left: popoverPos.left },\n children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"px-3 py-1.5 text-[10px] font-semibold uppercase tracking-wide text-appsec-text-secondary border-b border-appsec-border\", children: \"Resources\" }),\n group.resources.length === 0 ? /* @__PURE__ */ jsx(\"p\", { className: \"px-3 py-2 text-xs text-appsec-text-tertiary\", children: \"No resources\" }) : group.resources.map((rId) => {\n const id = typeof rId === \"string\" ? rId : rId._id;\n const res = allResources.find((r) => r._id === id);\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2 px-3 py-1.5 hover:bg-appsec-surface\", children: [\n /* @__PURE__ */ jsx(FileText, { className: \"h-3 w-3 text-appsec-text-tertiary shrink-0\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"text-xs text-appsec-text truncate\", children: res?.name ?? id })\n ] }, id);\n })\n ]\n }\n )\n ] })\n ] }),\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: \"flex items-center gap-1 text-xs text-appsec-text-secondary shrink-0\",\n title: \"Access entries\",\n children: [\n /* @__PURE__ */ jsx(Users, { className: \"h-3.5 w-3.5\" }),\n /* @__PURE__ */ jsx(\"span\", { children: groupEntries.length })\n ]\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onEdit,\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-primary hover:bg-appsec-primary-light transition-colors shrink-0\",\n title: \"Edit group\",\n children: /* @__PURE__ */ jsx(Pencil, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onDelete,\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-danger hover:bg-appsec-danger-light transition-colors shrink-0\",\n title: \"Delete group\",\n children: /* @__PURE__ */ jsx(Trash2, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsx(\n Button,\n {\n size: \"sm\",\n variant: \"secondary\",\n iconLeft: /* @__PURE__ */ jsx(Share2, { className: \"h-3.5 w-3.5\" }),\n onClick: () => onShare(asShareable),\n className: \"shrink-0\",\n children: \"Share\"\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setExpanded((e) => !e),\n className: cn(\n \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-text transition-colors\",\n groupEntries.length === 0 && \"opacity-30 cursor-default pointer-events-none\"\n ),\n title: expanded ? \"Collapse\" : \"Show access list\",\n children: expanded ? /* @__PURE__ */ jsx(ChevronUp, { className: \"h-4 w-4\" }) : /* @__PURE__ */ jsx(ChevronDown, { className: \"h-4 w-4\" })\n }\n )\n ] }),\n expanded && /* @__PURE__ */ jsx(\"div\", { className: \"border-t border-appsec-border bg-appsec-surface px-4 py-3\", children: /* @__PURE__ */ jsx(\n AccessList,\n {\n entries: groupEntries,\n roles,\n users,\n groups: userGroups,\n onRemove: handleRemoveFromGroup,\n onBulkRoleChange,\n roleModuleMapping,\n module\n }\n ) })\n ] });\n});\nvar RES_PAGE_SIZE = 10;\nvar ModuleTabContent = memo(function ModuleTabContent2({\n module,\n roles,\n users,\n groups,\n aclEntries,\n mfApi,\n appMongoId,\n onShare,\n onRemoveAccess,\n onBulkRoleChange,\n roleModuleMapping\n}) {\n const { adapter } = useAppsec();\n const queryClient2 = useQueryClient();\n const toast = useToast();\n const [view, setView] = useState(\"resources\");\n const [search, setSearch] = useState(\"\");\n const debouncedSearch = useDebouncedValue(search.trim(), 300);\n const [resPage, setResPage] = useState(1);\n const [rgPage, setRgPage] = useState(1);\n const resourcesQuery = useResourcesPaginatedQuery(module._id, resPage, RES_PAGE_SIZE);\n const resources = resourcesQuery.data?.data || [];\n const resourcePagination = resourcesQuery.data?.pagination;\n const resTotalCount = getPaginationTotalItems(resourcePagination);\n const totalResPages = Math.max(\n 1,\n getPaginationTotalPages(resourcePagination, resTotalCount, RES_PAGE_SIZE)\n );\n const resourceGroupsQuery = useResourceGroupsPaginatedQuery(appMongoId, module._id, rgPage, RES_PAGE_SIZE);\n const resourceGroups = resourceGroupsQuery.data?.data || [];\n const resourceGroupPagination = resourceGroupsQuery.data?.pagination;\n const rgTotalCount = getPaginationTotalItems(resourceGroupPagination);\n const totalRgPages = Math.max(\n 1,\n getPaginationTotalPages(resourceGroupPagination, rgTotalCount, RES_PAGE_SIZE)\n );\n const loading = view === \"resources\" ? resourcesQuery.isLoading : resourceGroupsQuery.isLoading;\n const [createGroupOpen, setCreateGroupOpen] = useState(false);\n const [editingGroup, setEditingGroup] = useState(null);\n const [deleteGroupTarget, setDeleteGroupTarget] = useState(null);\n const [deleteGroupLoading, setDeleteGroupLoading] = useState(false);\n useEffect(() => {\n setResPage(1);\n setRgPage(1);\n }, [view, search]);\n const filteredResources = useMemo(() => {\n if (!debouncedSearch) return resources;\n return resources.filter(\n (r) => matchesAny(debouncedSearch, [r.name, r.description, r._id, r.module])\n );\n }, [resources, debouncedSearch]);\n const filteredGroups = useMemo(() => {\n if (!debouncedSearch) return resourceGroups;\n return resourceGroups.filter(\n (g) => matchesAny(debouncedSearch, [g.name, g.description, g._id, g.module])\n );\n }, [resourceGroups, debouncedSearch]);\n const handleCreateGroup = async (d) => {\n const payload = {\n name: d.name,\n description: d.description,\n resources: d.resources,\n module: module._id,\n application: appMongoId\n };\n await adapter.createResourceGroup(payload);\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.resourceGroups(appMongoId, module._id)\n });\n toast.success(\"Resource group created.\");\n };\n const handleEditGroup = async (d) => {\n if (!editingGroup) return;\n await adapter.updateResourceGroup(editingGroup._id, {\n name: d.name,\n description: d.description,\n resources: d.resources\n });\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.resourceGroups(appMongoId, module._id)\n });\n toast.success(\"Resource group updated.\");\n setEditingGroup(null);\n };\n const handleDeleteGroup = async () => {\n if (!deleteGroupTarget) return;\n setDeleteGroupLoading(true);\n try {\n await adapter.deleteResourceGroup(deleteGroupTarget._id);\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.resourceGroups(appMongoId, module._id)\n });\n toast.success(\"Resource group deleted.\");\n setDeleteGroupTarget(null);\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Failed to delete resource group.\"\n );\n } finally {\n setDeleteGroupLoading(false);\n }\n };\n if (loading) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-col gap-2\", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsx(\n \"div\",\n {\n className: \"h-12 rounded-appsec bg-appsec-surface animate-pulse\"\n },\n i\n )) });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-3\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2\", children: [\n /* @__PURE__ */ jsx(\"div\", { className: \"flex gap-1 p-1 rounded-appsec bg-appsec-surface border border-appsec-border\", children: [\n {\n key: \"resources\",\n label: \"Resources\",\n icon: /* @__PURE__ */ jsx(FileText, { className: \"h-3 w-3\" })\n },\n {\n key: \"groups\",\n label: \"Resource Groups\",\n icon: /* @__PURE__ */ jsx(Layers, { className: \"h-3 w-3\" })\n }\n ].map((t) => /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onClick: () => {\n setView(t.key);\n setSearch(\"\");\n },\n className: cn(\n \"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded transition-colors\",\n view === t.key ? \"bg-appsec-bg text-appsec-text shadow-sm border border-appsec-border\" : \"text-appsec-text-secondary hover:text-appsec-text\"\n ),\n children: [\n t.icon,\n t.label\n ]\n },\n t.key\n )) }),\n view === \"groups\" && /* @__PURE__ */ jsx(\"div\", { className: \"ml-auto\", children: /* @__PURE__ */ jsx(\n Button,\n {\n size: \"sm\",\n iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-3.5 w-3.5\" }),\n onClick: () => setCreateGroupOpen(true),\n children: \"Create Group\"\n }\n ) })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2\", children: [\n /* @__PURE__ */ jsx(\n SearchBar,\n {\n value: search,\n onChange: setSearch,\n placeholder: view === \"resources\" ? \"Search resources\\u2026\" : \"Search resource groups\\u2026\",\n className: \"flex-1\"\n }\n ),\n /* @__PURE__ */ jsx(\"span\", { className: \"text-[11px] text-appsec-text-tertiary shrink-0\", children: view === \"resources\" ? `${resTotalCount} resource${resTotalCount !== 1 ? \"s\" : \"\"}` : `${rgTotalCount} group${rgTotalCount !== 1 ? \"s\" : \"\"}` })\n ] }),\n view === \"resources\" && /* @__PURE__ */ jsxs(Fragment, { children: [\n filteredResources.length === 0 ? /* @__PURE__ */ jsx(\"p\", { className: \"text-sm text-appsec-text-tertiary text-center py-6\", children: search ? \"No resources match your search.\" : \"No resources found.\" }) : filteredResources.map((resource) => /* @__PURE__ */ jsx(\n ResourceRow,\n {\n resource,\n roles,\n users,\n groups,\n aclEntries,\n onShare,\n onRemoveAccess,\n onBulkRoleChange,\n roleModuleMapping,\n module,\n mfApi\n },\n resource._id\n )),\n totalResPages > 1 && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between px-1\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-tertiary\", children: [\n (resPage - 1) * RES_PAGE_SIZE + 1,\n \"\\u2013\",\n Math.min(resPage * RES_PAGE_SIZE, resTotalCount),\n \" of \",\n resTotalCount\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setResPage((p) => Math.max(1, p - 1)),\n disabled: resPage === 1,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 disabled:cursor-default transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronLeft, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-secondary px-1\", children: [\n resPage,\n \" / \",\n totalResPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setResPage((p) => Math.min(totalResPages, p + 1)),\n disabled: resPage >= totalResPages,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 disabled:cursor-default transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronRight, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] })\n ] }),\n view === \"groups\" && /* @__PURE__ */ jsxs(Fragment, { children: [\n filteredGroups.length === 0 ? /* @__PURE__ */ jsx(\"p\", { className: \"text-sm text-appsec-text-tertiary text-center py-6\", children: search ? \"No groups match your search.\" : \"No resource groups yet. Create one to get started.\" }) : filteredGroups.map((group) => /* @__PURE__ */ jsx(\n ResourceGroupRow,\n {\n group,\n roles,\n users,\n groups,\n aclEntries,\n onShare,\n onBulkRoleChange,\n onEdit: () => setEditingGroup(group),\n onDelete: () => setDeleteGroupTarget(group),\n roleModuleMapping,\n module,\n allResources: resources\n },\n group._id\n )),\n totalRgPages > 1 && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between px-1\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-tertiary\", children: [\n (rgPage - 1) * RES_PAGE_SIZE + 1,\n \"\\u2013\",\n Math.min(rgPage * RES_PAGE_SIZE, rgTotalCount),\n \" of \",\n rgTotalCount\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setRgPage((p) => Math.max(1, p - 1)),\n disabled: rgPage === 1,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 disabled:cursor-default transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronLeft, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-secondary px-1\", children: [\n rgPage,\n \" / \",\n totalRgPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setRgPage((p) => Math.min(totalRgPages, p + 1)),\n disabled: rgPage >= totalRgPages,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 disabled:cursor-default transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronRight, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] })\n ] }),\n /* @__PURE__ */ jsx(\n ResourceGroupFormModal,\n {\n open: createGroupOpen,\n onClose: () => setCreateGroupOpen(false),\n moduleId: module._id,\n onSave: handleCreateGroup\n }\n ),\n /* @__PURE__ */ jsx(\n ResourceGroupFormModal,\n {\n open: !!editingGroup,\n onClose: () => setEditingGroup(null),\n moduleId: module._id,\n existing: editingGroup ?? void 0,\n onSave: handleEditGroup\n }\n ),\n /* @__PURE__ */ jsx(\n ConfirmDialog,\n {\n open: !!deleteGroupTarget,\n onClose: () => setDeleteGroupTarget(null),\n onConfirm: handleDeleteGroup,\n title: \"Delete resource group\",\n message: `Delete \"${deleteGroupTarget?.name}\"? This cannot be undone.`,\n confirmLabel: \"Delete\",\n variant: \"danger\",\n loading: deleteGroupLoading\n }\n )\n ] }, module._id);\n});\nfunction useModuleSharedState() {\n const { appId, appsecUrl } = useAppsec();\n const toast = useToast();\n const [shareResource, setShareResource] = useState(null);\n const appQuery = useAppQuery(appId);\n const appMongoId = appQuery.data?.data?.[0]?._id || \"\";\n const modulesQuery = useModulesQuery(appMongoId);\n const rolesQuery = useAllRolesQuery(appMongoId);\n const permissionsQuery = usePermissionsQuery(appMongoId);\n const aclsQuery = useAllAclsQuery(appMongoId);\n const roleModuleMappingQuery = useRoleModuleMappingQuery(appMongoId);\n const groupsQuery = useGroupsQuery(appMongoId);\n const createAclMutation = useCreateAclMutation();\n const deleteAclMutation = useDeleteAclMutation();\n const bulkUpdateAclMutation = useBulkUpdateAclMutation();\n const shareResourceGroupMutation = useShareResourceGroupMutation();\n const modules = modulesQuery.data?.data || [];\n const roles = rolesQuery.data?.data || [];\n const permissions = permissionsQuery.data?.data || [];\n const aclEntries = aclsQuery.data?.data ?? [];\n const roleModuleMapping = roleModuleMappingQuery.data?.data || [];\n const groups = groupsQuery.data?.data ?? [];\n const users = [];\n const loading = appQuery.isLoading || modulesQuery.isLoading || rolesQuery.isLoading || permissionsQuery.isLoading || aclsQuery.isLoading || roleModuleMappingQuery.isLoading || groupsQuery.isLoading;\n const handleShare = useCallback(\n async (emails, roleId, groupId) => {\n if (!shareResource) return;\n const roleObj = roles.find((r) => r._id === roleId);\n if (!roleObj) throw new Error(\"Role not found\");\n if (shareResource.isResourceGroup) {\n if (groupId) {\n await shareResourceGroupMutation.mutateAsync({\n resource_group_id: shareResource._id,\n group_id: groupId,\n role: roleId,\n is_inherited: true\n });\n const group = groups.find((g) => g._id === groupId);\n toast.success(\n `Resource group shared with group \"${group?.name ?? groupId}\".`\n );\n } else {\n await Promise.all(\n emails.map(\n (email) => shareResourceGroupMutation.mutateAsync({\n resource_group_id: shareResource._id,\n user_email: email,\n role: roleId,\n is_inherited: true\n })\n )\n );\n toast.success(\n `Resource group shared with ${emails.length} user${emails.length !== 1 ? \"s\" : \"\"}.`\n );\n }\n return;\n }\n if (groupId) {\n const group = groups.find((g) => g._id === groupId);\n if (!group) throw new Error(\"Group not found\");\n await createAclMutation.mutateAsync({\n resource_type: shareResource.module,\n resource_id: shareResource._id,\n group_id: groupId,\n is_inherited: true,\n role: roleId\n });\n toast.success(`Access granted to group \"${group.name}\".`);\n } else {\n const existingEmails = aclEntries.filter(\n (acl) => acl.resourceId === shareResource._id && acl.resourceType === shareResource.module\n ).map((acl) => acl.user_email);\n const newEmails = emails.filter((e) => !existingEmails.includes(e));\n const skipped = emails.length - newEmails.length;\n if (newEmails.length === 0) {\n toast.info(\n \"All selected users already have access to this resource.\"\n );\n return;\n }\n const aclPromises = newEmails.map(\n (email) => createAclMutation.mutateAsync({\n resource_type: shareResource.module,\n resource_id: shareResource._id,\n user_email: email,\n is_inherited: false,\n role: roleId\n })\n );\n await Promise.all(aclPromises);\n if (skipped > 0) {\n toast.info(\n `Access granted to ${newEmails.length} user${newEmails.length !== 1 ? \"s\" : \"\"}. ${skipped} already had access.`\n );\n } else {\n toast.success(\n `Access granted to ${newEmails.length} user${newEmails.length !== 1 ? \"s\" : \"\"}.`\n );\n }\n }\n },\n [\n shareResource,\n roles,\n groups,\n aclEntries,\n createAclMutation,\n shareResourceGroupMutation,\n toast\n ]\n );\n const searchUsers = useCallback(\n async (query) => {\n const res = await fetch(\n `${appsecUrl}/api/user/get-by-query-v2?search=${encodeURIComponent(\n query\n )}`,\n {\n method: \"GET\",\n credentials: \"include\"\n }\n );\n const data = await res.json();\n if (data?.success) {\n return (data.data || []).map((u) => ({\n email: u.email,\n displayName: u.displayName ?? u.firstname ? `${u.firstname} ${u.lastname}`.trim() : u.email\n }));\n } else {\n return [];\n }\n },\n [appsecUrl]\n );\n const handleRemoveAccess = useCallback(\n async (entryId) => {\n await deleteAclMutation.mutateAsync(entryId);\n },\n [deleteAclMutation]\n );\n const handleBulkRoleChange = useCallback(\n async (entryIds, roleId) => {\n const payload = entryIds.map((id) => ({\n _id: id,\n role: roleId\n }));\n await bulkUpdateAclMutation.mutateAsync(payload);\n },\n [bulkUpdateAclMutation, roles]\n );\n return useMemo(\n () => ({\n modules,\n roles,\n permissions,\n users,\n groups,\n aclEntries,\n loading,\n appMongoId,\n shareResource,\n setShareResource,\n handleShare,\n searchUsers,\n handleRemoveAccess,\n roleModuleMapping,\n handleBulkRoleChange\n }),\n [\n modules,\n roles,\n permissions,\n users,\n groups,\n aclEntries,\n loading,\n appMongoId,\n shareResource,\n roleModuleMapping,\n handleBulkRoleChange,\n handleRemoveAccess,\n searchUsers,\n handleShare\n ]\n );\n}\nfunction Tooltip({ label, children, className, side = \"top\" }) {\n return /* @__PURE__ */ jsxs(\"span\", { className: cn(\"group/tt relative inline-flex\", className), children: [\n children,\n /* @__PURE__ */ jsx(\n \"span\",\n {\n role: \"tooltip\",\n className: cn(\n \"pointer-events-none absolute z-50 whitespace-nowrap rounded-appsec bg-appsec-text px-2 py-1 text-[11px] font-medium text-white opacity-0 shadow-sm transition-opacity group-hover/tt:opacity-100 group-focus-within/tt:opacity-100\",\n side === \"top\" && \"bottom-full left-1/2 mb-1.5 -translate-x-1/2\",\n side === \"bottom\" && \"top-full left-1/2 mt-1.5 -translate-x-1/2\",\n side === \"left\" && \"right-full top-1/2 mr-1.5 -translate-y-1/2\",\n side === \"right\" && \"left-full top-1/2 ml-1.5 -translate-y-1/2\"\n ),\n children: label\n }\n )\n ] });\n}\nfunction GroupFormModal({ open, onClose, roles, existing, onSave }) {\n const [name, setName] = useState(existing?.name ?? \"\");\n const [description, setDescription] = useState(existing?.description ?? \"\");\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n useEffect(() => {\n if (open) {\n setName(existing?.name ?? \"\");\n setDescription(existing?.description ?? \"\");\n setError(\"\");\n }\n }, [open, existing]);\n const submit = async () => {\n if (!name.trim()) {\n setError(\"Group name is required.\");\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n await onSave({ name: name.trim(), description: description.trim() });\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Save failed.\");\n } finally {\n setLoading(false);\n }\n };\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose,\n title: existing ? \"Edit group\" : \"Create group\",\n size: \"sm\",\n footer: /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(Button, { variant: \"secondary\", size: \"sm\", onClick: onClose, disabled: loading, children: \"Cancel\" }),\n /* @__PURE__ */ jsx(Button, { size: \"sm\", onClick: submit, loading, children: existing ? \"Save Changes\" : \"Create Group\" })\n ] }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-3\", children: [\n /* @__PURE__ */ jsx(\n Input,\n {\n label: \"Group name\",\n value: name,\n placeholder: \"e.g. Billing Team\",\n onChange: (e) => setName(e.target.value),\n required: true\n }\n ),\n /* @__PURE__ */ jsx(\n Input,\n {\n label: \"Description\",\n value: description,\n placeholder: \"Short description (optional)\",\n onChange: (e) => setDescription(e.target.value)\n }\n ),\n error && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: error })\n ] })\n }\n );\n}\nfunction AddMembersModal({\n open,\n onClose,\n currentMemberIds,\n onAdd\n}) {\n const { appsecUrl } = useAppsec();\n const { success, error } = useToast();\n const [search, setSearch] = useState(\"\");\n const [users, setUsers] = useState([]);\n const [loading, setLoading] = useState(false);\n const [adding, setAdding] = useState(null);\n const [recentlyAdded, setRecentlyAdded] = useState(null);\n useEffect(() => {\n if (!search.trim()) {\n setUsers([]);\n return;\n }\n const timeout = setTimeout(async () => {\n try {\n setLoading(true);\n const res = await fetch(\n `${appsecUrl}/api/user/get-by-query-v2?search=${encodeURIComponent(search)}`,\n {\n method: \"GET\",\n credentials: \"include\"\n }\n );\n const data = await res.json();\n if (data?.success) {\n setUsers(data.data || []);\n } else {\n setUsers([]);\n }\n } catch (err) {\n console.error(\"Search failed:\", err);\n setUsers([]);\n } finally {\n setLoading(false);\n }\n }, 300);\n return () => clearTimeout(timeout);\n }, [search]);\n const eligible = users.filter(\n (u) => u?.email && !currentMemberIds.includes(u.email)\n );\n const handleAdd = async (userId) => {\n setAdding(userId);\n try {\n await onAdd(userId);\n setRecentlyAdded(userId);\n success(\"User added to group\");\n } catch (err) {\n console.error(\"Add member failed:\", err);\n error(\"Could not add user to group\");\n } finally {\n setAdding(null);\n }\n };\n useEffect(() => {\n if (!open) {\n setRecentlyAdded(null);\n }\n }, [open]);\n useEffect(() => {\n if (!recentlyAdded) return;\n const timeout = window.setTimeout(() => setRecentlyAdded(null), 4e3);\n return () => window.clearTimeout(timeout);\n }, [recentlyAdded]);\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose,\n title: \"Add members\",\n size: \"sm\",\n footer: /* @__PURE__ */ jsx(Button, { variant: \"secondary\", size: \"sm\", onClick: onClose, children: \"Done\" }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-3\", children: [\n /* @__PURE__ */ jsx(\n SearchBar,\n {\n value: search,\n onChange: setSearch,\n placeholder: \"Search users\\u2026\"\n }\n ),\n recentlyAdded && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-success\", children: \"User added to the group.\" }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1 max-h-64 overflow-y-auto\", children: [\n loading && /* @__PURE__ */ jsx(\"p\", { className: \"py-4 text-center text-xs text-appsec-text-tertiary\", children: \"Searching...\" }),\n !loading && search && eligible.length === 0 && /* @__PURE__ */ jsx(\"p\", { className: \"py-4 text-center text-xs text-appsec-text-tertiary\", children: \"No users found.\" }),\n !loading && eligible.map((user) => {\n const fullName = `${user.firstname || \"\"} ${user.lastname || \"\"}`.trim();\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: \"flex items-center gap-3 px-2 py-2 rounded-appsec hover:bg-appsec-surface transition-colors\",\n children: [\n /* @__PURE__ */ jsx(Avatar, { name: fullName, size: \"sm\" }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-sm font-medium text-appsec-text truncate\", children: fullName || \"Unnamed User\" }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-secondary truncate\", children: user.email })\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n disabled: adding === user._id,\n onClick: () => handleAdd(user.email),\n className: \"shrink-0 p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-primary hover:bg-appsec-primary-light transition-colors disabled:opacity-50\",\n children: /* @__PURE__ */ jsx(UserPlus, { className: \"h-3.5 w-3.5\" })\n }\n )\n ]\n },\n user._id\n );\n })\n ] })\n ] })\n }\n );\n}\nvar MEMBER_PAGE_SIZE = 5;\nfunction GroupCard({ group, roles, onEdit, onDelete, onAddMembers, onRemoveMember }) {\n const [expanded, setExpanded] = useState(false);\n const [removingId, setRemovingId] = useState(null);\n const [memberPage, setMemberPage] = useState(0);\n useEffect(() => {\n setMemberPage(0);\n }, [expanded, group.users.length]);\n const totalMemberPages = Math.ceil(group.users.length / MEMBER_PAGE_SIZE);\n const visibleMembers = group.users.slice(\n memberPage * MEMBER_PAGE_SIZE,\n (memberPage + 1) * MEMBER_PAGE_SIZE\n );\n const handleRemove = async (userId) => {\n setRemovingId(userId);\n try {\n await onRemoveMember(userId);\n } finally {\n setRemovingId(null);\n }\n };\n return /* @__PURE__ */ jsxs(\"div\", { className: \"rounded-appsec border border-appsec-border bg-appsec-bg overflow-hidden\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-3 px-4 py-3\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2\", children: [\n /* @__PURE__ */ jsx(Users, { className: \"h-4 w-4 text-appsec-accent shrink-0\" }),\n /* @__PURE__ */ jsx(Tooltip, { label: group.name, className: \"min-w-0\", children: /* @__PURE__ */ jsx(\"span\", { className: \"text-sm font-semibold text-appsec-text truncate block\", children: group.name }) })\n ] }),\n group.description && /* @__PURE__ */ jsx(Tooltip, { label: group.description, className: \"w-full min-w-0\", children: /* @__PURE__ */ jsx(\"span\", { className: \"mt-0.5 text-xs text-appsec-text-secondary pl-6 truncate block\", children: group.description }) })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"text-center shrink-0\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs font-semibold text-appsec-text\", children: group.users.length }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-[10px] text-appsec-text-tertiary\", children: \"members\" })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1 shrink-0\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onEdit,\n className: \"px-2.5 py-1 text-xs rounded-appsec border border-appsec-border text-appsec-text-secondary hover:text-appsec-primary hover:border-appsec-primary transition-colors\",\n children: \"Edit\"\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onAddMembers,\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-primary hover:bg-appsec-primary-light transition-colors\",\n children: /* @__PURE__ */ jsx(UserPlus, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onDelete,\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-danger hover:bg-appsec-danger-light transition-colors\",\n children: /* @__PURE__ */ jsx(Trash2, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setExpanded((e) => !e),\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-text transition-colors\",\n children: expanded ? /* @__PURE__ */ jsx(ChevronUp, { className: \"h-3.5 w-3.5\" }) : /* @__PURE__ */ jsx(ChevronDown, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] }),\n expanded && /* @__PURE__ */ jsx(\"div\", { className: \"border-t border-appsec-border bg-appsec-surface px-4 py-3 flex flex-col gap-2\", children: group.users.length === 0 ? /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary\", children: \"No members yet. Add some!\" }) : /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-col gap-1.5\", children: visibleMembers.map((user) => /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2.5\", children: [\n /* @__PURE__ */ jsx(Avatar, { name: user, size: \"xs\" }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [\n /* @__PURE__ */ jsx(Tooltip, { label: user, className: \"w-full min-w-0\", children: /* @__PURE__ */ jsx(\"span\", { className: \"text-xs font-medium text-appsec-text truncate block\", children: user }) }),\n /* @__PURE__ */ jsx(\"span\", { className: \"text-[10px] text-appsec-text-secondary truncate block\", children: user })\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n disabled: removingId === user,\n onClick: () => handleRemove(user),\n className: \"p-1 rounded-appsec text-appsec-text-tertiary hover:text-appsec-danger hover:bg-appsec-danger-light transition-colors disabled:opacity-50\",\n children: /* @__PURE__ */ jsx(UserMinus, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] }, user)) }),\n totalMemberPages > 1 && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between pt-1\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-tertiary\", children: [\n memberPage * MEMBER_PAGE_SIZE + 1,\n \"\\u2013\",\n Math.min((memberPage + 1) * MEMBER_PAGE_SIZE, group.users.length),\n \" of \",\n group.users.length\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setMemberPage((p) => Math.max(0, p - 1)),\n disabled: memberPage === 0,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 disabled:cursor-default transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronLeft, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-secondary px-1\", children: [\n memberPage + 1,\n \" / \",\n totalMemberPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setMemberPage((p) => Math.min(totalMemberPages - 1, p + 1)),\n disabled: memberPage >= totalMemberPages - 1,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 disabled:cursor-default transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronRight, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] })\n ] }) })\n ] });\n}\nfunction UserGroupsTab({ appMongoId }) {\n const { adapter } = useAppsec();\n const queryClient2 = useQueryClient();\n const groupsQuery = useGroupsQuery(appMongoId);\n const rolesQuery = useRolesQuery(appMongoId);\n const groups = groupsQuery.data?.data || [];\n const roles = rolesQuery.data?.data || [];\n const loading = groupsQuery.isLoading || rolesQuery.isLoading;\n const [search, setSearch] = useState(\"\");\n const debouncedSearch = useDebouncedValue(search.trim(), 300);\n const [createOpen, setCreateOpen] = useState(false);\n const [editingGroup, setEditingGroup] = useState(null);\n const [deleteTarget, setDeleteTarget] = useState(null);\n const [deleteLoading, setDeleteLoading] = useState(false);\n const [addMembersGroup, setAddMembersGroup] = useState(null);\n const filtered = groups.filter(\n (g) => matchesAny(debouncedSearch, [\n g.name,\n g.description,\n g._id,\n ...g.users ?? []\n ])\n );\n const handleCreate = async (data) => {\n const payload = { name: data.name, appId: appMongoId, description: data.description };\n await adapter.createGroup(payload);\n queryClient2.invalidateQueries({ queryKey: rbacQueryKeys.groups(appMongoId) });\n setCreateOpen(false);\n };\n const handleEdit = async (data) => {\n if (!editingGroup) return;\n const payload = { name: data.name, description: data.description };\n await adapter.updateGroup(editingGroup._id, payload);\n queryClient2.invalidateQueries({ queryKey: rbacQueryKeys.groups(appMongoId) });\n setEditingGroup(null);\n };\n const handleDelete = async () => {\n if (!deleteTarget) return;\n setDeleteLoading(true);\n try {\n await adapter.deleteGroup(deleteTarget._id);\n queryClient2.invalidateQueries({ queryKey: rbacQueryKeys.groups(appMongoId) });\n setDeleteTarget(null);\n } finally {\n setDeleteLoading(false);\n }\n };\n const handleAddMember = async (userId) => {\n if (!addMembersGroup) return;\n const payload = {\n name: addMembersGroup.name,\n description: addMembersGroup.description,\n users: [...addMembersGroup.users, userId],\n isActive: addMembersGroup.isActive\n };\n await adapter.updateGroup(addMembersGroup._id, payload);\n setAddMembersGroup(\n (prev) => prev ? { ...prev, users: [...prev.users, userId] } : null\n );\n queryClient2.invalidateQueries({ queryKey: rbacQueryKeys.groups(appMongoId) });\n };\n const handleRemoveMember = async (group, userId) => {\n const payload = {\n name: group.name,\n description: group.description,\n users: group.users.filter((g) => g !== userId),\n isActive: group.isActive\n };\n await adapter.updateGroup(group._id, payload);\n queryClient2.invalidateQueries({ queryKey: rbacQueryKeys.groups(appMongoId) });\n };\n if (loading) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"flex items-center justify-center py-16 text-sm text-appsec-text-secondary\", children: \"Loading groups\\u2026\" });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-4\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2 flex-wrap\", children: [\n /* @__PURE__ */ jsx(\n SearchBar,\n {\n value: search,\n onChange: setSearch,\n placeholder: \"Search groups\\u2026\",\n className: \"w-56\"\n }\n ),\n /* @__PURE__ */ jsx(\"div\", { className: \"ml-auto\", children: /* @__PURE__ */ jsx(Button, { size: \"sm\", iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-3.5 w-3.5\" }), onClick: () => setCreateOpen(true), children: \"Create Group\" }) })\n ] }),\n /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-col gap-2\", children: filtered.length === 0 ? /* @__PURE__ */ jsx(\"div\", { className: \"flex items-center justify-center py-12 text-sm text-appsec-text-tertiary\", children: \"No groups found.\" }) : filtered.map((group) => /* @__PURE__ */ jsx(\n GroupCard,\n {\n group,\n roles,\n onEdit: () => setEditingGroup(group),\n onDelete: () => setDeleteTarget(group),\n onAddMembers: () => setAddMembersGroup(group),\n onRemoveMember: (userId) => handleRemoveMember(group, userId)\n },\n group._id\n )) }),\n /* @__PURE__ */ jsxs(\"p\", { className: \"text-xs text-appsec-text-tertiary\", children: [\n filtered.length,\n \" of \",\n groups.length,\n \" group\",\n groups.length !== 1 ? \"s\" : \"\"\n ] }),\n /* @__PURE__ */ jsx(\n GroupFormModal,\n {\n open: createOpen,\n onClose: () => setCreateOpen(false),\n roles,\n onSave: handleCreate\n }\n ),\n /* @__PURE__ */ jsx(\n GroupFormModal,\n {\n open: !!editingGroup,\n onClose: () => setEditingGroup(null),\n roles,\n existing: editingGroup ?? void 0,\n onSave: handleEdit\n }\n ),\n /* @__PURE__ */ jsx(\n AddMembersModal,\n {\n open: !!addMembersGroup,\n onClose: () => setAddMembersGroup(null),\n currentMemberIds: addMembersGroup?.users ?? [],\n onAdd: handleAddMember\n }\n ),\n /* @__PURE__ */ jsx(\n ConfirmDialog,\n {\n open: !!deleteTarget,\n onClose: () => setDeleteTarget(null),\n onConfirm: handleDelete,\n title: \"Delete group\",\n message: `Delete group \"${deleteTarget?.name}\"? Members will not be removed from the app \\u2014 only from this group.`,\n confirmLabel: \"Delete\",\n variant: \"danger\",\n loading: deleteLoading\n }\n )\n ] });\n}\nvar PERMISSION_TOOLTIP_DELAY_MS = 75;\nfunction PermissionName({\n value,\n expanded\n}) {\n const textRef = useRef(null);\n const timerRef = useRef(null);\n const [tooltip, setTooltip] = useState(null);\n const clearTooltipTimer = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n const showTooltip = () => {\n clearTooltipTimer();\n timerRef.current = setTimeout(() => {\n const rect = textRef.current?.getBoundingClientRect();\n if (!rect) return;\n const viewportPadding = 12;\n const maxWidth = Math.min(360, window.innerWidth - viewportPadding * 2);\n const left = Math.min(\n Math.max(rect.left, viewportPadding),\n window.innerWidth - maxWidth - viewportPadding\n );\n setTooltip({\n top: rect.bottom + 6,\n left,\n maxWidth\n });\n }, PERMISSION_TOOLTIP_DELAY_MS);\n };\n const hideTooltip = () => {\n clearTooltipTimer();\n setTooltip(null);\n };\n useEffect(() => clearTooltipTimer, []);\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n \"span\",\n {\n ref: textRef,\n onMouseEnter: showTooltip,\n onMouseLeave: hideTooltip,\n className: `min-w-0 text-xs leading-snug text-appsec-text transition-colors group-hover:text-appsec-primary ${expanded ? \"whitespace-normal break-words\" : \"truncate\"}`,\n children: value\n }\n ),\n tooltip && /* @__PURE__ */ jsx(\n \"span\",\n {\n role: \"tooltip\",\n className: \"pointer-events-none fixed z-[60] rounded-appsec border border-appsec-border bg-appsec-text px-2.5 py-1.5 text-xs leading-snug text-appsec-bg shadow-lg\",\n style: {\n top: tooltip.top,\n left: tooltip.left,\n maxWidth: tooltip.maxWidth\n },\n children: value\n }\n )\n ] });\n}\nfunction RoleFormModal({\n open,\n onClose,\n appMongoId,\n existing,\n onSave\n}) {\n const [name, setName] = useState(existing?.name ?? \"\");\n const [description, setDescription] = useState(existing?.description ?? \"\");\n const [permissionIds, setPermissionIds] = useState(\n existing?.permissions ?? []\n );\n const [permissionSearch, setPermissionSearch] = useState(\"\");\n const [debouncedPermissionSearch, setDebouncedPermissionSearch] = useState(\"\");\n const [permissionPage, setPermissionPage] = useState(1);\n const [permissionsExpanded, setPermissionsExpanded] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const permissionsQuery = usePermissionsPaginatedQuery(\n appMongoId,\n permissionPage,\n 10,\n debouncedPermissionSearch,\n open\n );\n const permissions = permissionsQuery.data?.data || [];\n const permissionsPagination = permissionsQuery.data?.pagination;\n useEffect(() => {\n if (open) {\n setName(existing?.name ?? \"\");\n setDescription(existing?.description ?? \"\");\n setPermissionIds(existing?.permissions ?? []);\n setPermissionSearch(\"\");\n setDebouncedPermissionSearch(\"\");\n setPermissionPage(1);\n setPermissionsExpanded(false);\n setError(\"\");\n }\n }, [open, existing]);\n useEffect(() => {\n const timeout = setTimeout(() => {\n setDebouncedPermissionSearch(permissionSearch.trim());\n setPermissionPage(1);\n }, 300);\n return () => clearTimeout(timeout);\n }, [permissionSearch]);\n const togglePerm = (id) => {\n setPermissionIds((prev) => {\n const exists = prev.some((p) => p._id === id);\n if (exists) {\n return prev.filter((p) => p._id !== id);\n }\n const permObj = permissions.find((p) => p._id === id);\n if (!permObj) return prev;\n return [...prev, permObj];\n });\n };\n const submit = async () => {\n if (!name.trim()) {\n setError(\"Name is required.\");\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n const n = name.trim().toLowerCase();\n await onSave({\n name: name.trim(),\n description: description.trim(),\n permissions: permissionIds\n });\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Save failed.\");\n } finally {\n setLoading(false);\n }\n };\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose,\n title: existing ? \"Edit role\" : \"Create role\",\n size: \"md\",\n footer: /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"sm\",\n onClick: onClose,\n disabled: loading,\n children: \"Cancel\"\n }\n ),\n /* @__PURE__ */ jsx(Button, { size: \"sm\", onClick: submit, loading, children: existing ? \"Save Changes\" : \"Create Role\" })\n ] }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-4\", children: [\n /* @__PURE__ */ jsx(\n Input,\n {\n label: \"Role name\",\n value: name,\n placeholder: \"e.g. Billing Manager\",\n onChange: (e) => setName(e.target.value),\n required: true\n }\n ),\n /* @__PURE__ */ jsx(\n Input,\n {\n label: \"Description\",\n value: description,\n placeholder: \"Short description (optional)\",\n onChange: (e) => setDescription(e.target.value)\n }\n ),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between gap-3\", children: [\n /* @__PURE__ */ jsxs(\"p\", { className: \"text-sm font-medium text-appsec-text\", children: [\n \"Permissions\",\n /* @__PURE__ */ jsxs(\"span\", { className: \"ml-1.5 text-xs font-normal text-appsec-text-tertiary\", children: [\n \"(\",\n permissionIds.length,\n \" selected)\"\n ] })\n ] }),\n /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onClick: () => setPermissionsExpanded((expanded) => !expanded),\n className: \"inline-flex items-center gap-1 rounded-appsec px-2 py-1 text-xs font-medium text-appsec-text-secondary transition-colors hover:bg-appsec-surface hover:text-appsec-text\",\n \"aria-expanded\": permissionsExpanded,\n children: [\n permissionsExpanded ? /* @__PURE__ */ jsx(Minimize2, { className: \"h-3.5 w-3.5\" }) : /* @__PURE__ */ jsx(Maximize2, { className: \"h-3.5 w-3.5\" }),\n permissionsExpanded ? \"Collapse\" : \"Expand\"\n ]\n }\n )\n ] }),\n /* @__PURE__ */ jsx(\n SearchBar,\n {\n value: permissionSearch,\n onChange: setPermissionSearch,\n placeholder: \"Search permissions...\",\n className: \"w-full\"\n }\n ),\n /* @__PURE__ */ jsx(\"div\", { className: \"rounded-appsec bg-appsec-surface border border-appsec-border overflow-hidden\", children: permissionsQuery.isLoading ? /* @__PURE__ */ jsx(\"div\", { className: \"px-3 py-8 text-center text-xs text-appsec-text-tertiary\", children: \"Loading permissions...\" }) : permissions.length === 0 ? /* @__PURE__ */ jsx(\"div\", { className: \"px-3 py-8 text-center text-xs text-appsec-text-tertiary\", children: \"No permissions found.\" }) : /* @__PURE__ */ jsx(\n \"div\",\n {\n className: `grid grid-cols-1 gap-1.5 overflow-y-auto p-3 ${permissionsExpanded ? \"\" : \"sm:grid-cols-2\"}`,\n style: { maxHeight: permissionsExpanded ? \"20rem\" : \"12rem\" },\n children: permissions.map((p) => /* @__PURE__ */ jsxs(\n \"label\",\n {\n className: \"group flex min-w-0 cursor-pointer items-start gap-2 rounded-appsec px-1 py-1 transition-colors hover:bg-appsec-bg\",\n children: [\n /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n checked: permissionIds.some((perm) => perm._id === p._id),\n onChange: () => togglePerm(p._id),\n className: \"mt-0.5 h-3.5 w-3.5 shrink-0 cursor-pointer rounded border-appsec-border accent-appsec-primary\"\n }\n ),\n /* @__PURE__ */ jsx(\n PermissionName,\n {\n value: p.label || p.name,\n expanded: permissionsExpanded\n }\n )\n ]\n },\n p._id\n ))\n }\n ) }),\n permissionsPagination?.enabled && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between px-1\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-tertiary\", children: [\n \"Page \",\n permissionsPagination.page,\n \" of \",\n permissionsPagination.totalPages\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setPermissionPage((page) => Math.max(1, page - 1)),\n disabled: !permissionsPagination.hasPrevPage || permissionsQuery.isFetching,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 transition-colors\",\n \"aria-label\": \"Previous permissions page\",\n children: /* @__PURE__ */ jsx(ChevronLeft, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-secondary px-1\", children: [\n permissionsPagination.page,\n \" / \",\n permissionsPagination.totalPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setPermissionPage((page) => page + 1),\n disabled: !permissionsPagination.hasNextPage || permissionsQuery.isFetching,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 transition-colors\",\n \"aria-label\": \"Next permissions page\",\n children: /* @__PURE__ */ jsx(ChevronRight, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] })\n ] }),\n error && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: error })\n ] })\n }\n );\n}\nfunction RoleCard({\n role,\n userCount,\n onEdit,\n onClone,\n onDelete\n}) {\n const [expanded, setExpanded] = useState(false);\n const assignedPerms = role.permissions;\n return /* @__PURE__ */ jsxs(\"div\", { className: \"rounded-appsec border border-appsec-border bg-appsec-bg overflow-hidden\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-3 px-4 py-3\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2\", children: [\n /* @__PURE__ */ jsx(Shield, { className: \"h-4 w-4 text-appsec-primary shrink-0\" }),\n /* @__PURE__ */ jsx(Tooltip, { label: role.name, className: \"min-w-0\", children: /* @__PURE__ */ jsx(\"span\", { className: \"text-sm font-semibold text-appsec-text truncate block\", children: role.name }) }),\n role.isSystem && /* @__PURE__ */ jsx(\"span\", { className: \"text-[10px] font-medium px-1.5 py-0.5 rounded bg-appsec-surface-alt text-appsec-text-tertiary border border-appsec-border\", children: \"system\" })\n ] }),\n role.description && /* @__PURE__ */ jsx(Tooltip, { label: role.description ?? \"\", className: \"w-full min-w-0\", children: /* @__PURE__ */ jsx(\"span\", { className: \"mt-0.5 text-xs text-appsec-text-secondary pl-6 truncate block\", children: role.description }) })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-4 shrink-0\", children: [\n /* @__PURE__ */ jsx(\"div\", { className: \"text-center\" }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"text-center\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs font-semibold text-appsec-text\", children: assignedPerms.length }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-[10px] text-appsec-text-tertiary\", children: \"perms\" })\n ] })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1 shrink-0\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onEdit,\n className: \"px-2.5 py-1 text-xs rounded-appsec border border-appsec-border text-appsec-text-secondary hover:text-appsec-primary hover:border-appsec-primary transition-colors\",\n children: \"Edit\"\n }\n ),\n !role.isSystem && /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onDelete,\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-danger hover:bg-appsec-danger-light transition-colors\",\n children: /* @__PURE__ */ jsx(Trash2, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setExpanded((e) => !e),\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-text transition-colors\",\n children: expanded ? /* @__PURE__ */ jsx(ChevronUp, { className: \"h-3.5 w-3.5\" }) : /* @__PURE__ */ jsx(ChevronDown, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] }),\n expanded && /* @__PURE__ */ jsx(\"div\", { className: \"border-t border-appsec-border bg-appsec-surface px-4 py-3\", children: assignedPerms.length === 0 ? /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary\", children: \"No permissions assigned.\" }) : /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-wrap gap-1.5\", children: assignedPerms.map((p) => /* @__PURE__ */ jsx(\n \"span\",\n {\n className: \"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-appsec-bg border border-appsec-border text-appsec-text\",\n children: p.label || p.name\n },\n p._id\n )) }) })\n ] });\n}\nfunction RolesTab({ appMongoId }) {\n const { adapter } = useAppsec();\n const toast = useToast();\n const queryClient2 = useQueryClient();\n const [rolesPage, setRolesPage] = useState(1);\n const [search, setSearch] = useState(\"\");\n const debouncedSearch = useDebouncedValue(search.trim(), 300);\n const pageSize = 10;\n const rolesQuery = useRolesPaginatedQuery(appMongoId, rolesPage, pageSize, debouncedSearch);\n const roles = rolesQuery.data?.data || [];\n const rolesPagination = rolesQuery.data?.pagination;\n const loading = rolesQuery.isLoading;\n const [createOpen, setCreateOpen] = useState(false);\n const [editingRole, setEditingRole] = useState(null);\n const [deleteTarget, setDeleteTarget] = useState(null);\n const [deleteLoading, setDeleteLoading] = useState(false);\n const filtered = roles;\n const handleCreate = async (data) => {\n const payload = {\n name: data.name,\n appId: appMongoId,\n permissions: data.permissions.map((p) => p._id)\n };\n const response = await adapter.createRole(payload);\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.roles(appMongoId)\n });\n toast.success(response.message ?? \"Role created successfully.\");\n setCreateOpen(false);\n };\n const handleEdit = async (data) => {\n if (!editingRole) return;\n const payload = {\n name: data.name,\n appId: appMongoId,\n permissions: data.permissions.map((p) => p._id)\n };\n const response = await adapter.updateRole(editingRole._id, payload);\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.roles(appMongoId)\n });\n toast.success(response.message ?? \"Role updated successfully.\");\n setEditingRole(null);\n };\n const handleClone = async (_role) => {\n };\n const handleDelete = async () => {\n if (!deleteTarget) return;\n setDeleteLoading(true);\n try {\n const res = await adapter.deleteRole(deleteTarget._id);\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.roles(appMongoId)\n });\n toast.success(res?.message ?? \"Role deleted successfully.\");\n setDeleteTarget(null);\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Failed to delete role.\"\n );\n } finally {\n setDeleteLoading(false);\n }\n };\n if (loading) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"flex items-center justify-center py-16 text-sm text-appsec-text-secondary\", children: \"Loading roles\\u2026\" });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-4\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2 flex-wrap\", children: [\n /* @__PURE__ */ jsx(\n SearchBar,\n {\n value: search,\n onChange: (value) => {\n setSearch(value);\n setRolesPage(1);\n },\n placeholder: \"Search roles\\u2026\",\n className: \"w-56\"\n }\n ),\n /* @__PURE__ */ jsx(\"div\", { className: \"ml-auto\", children: /* @__PURE__ */ jsx(\n Button,\n {\n size: \"sm\",\n iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-3.5 w-3.5\" }),\n onClick: () => setCreateOpen(true),\n children: \"Create Role\"\n }\n ) })\n ] }),\n /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-col gap-2\", children: filtered.length === 0 ? /* @__PURE__ */ jsx(\"div\", { className: \"flex items-center justify-center py-12 text-sm text-appsec-text-tertiary\", children: \"No roles found.\" }) : filtered.map((role) => /* @__PURE__ */ jsx(\n RoleCard,\n {\n role,\n userCount: 0,\n onEdit: () => setEditingRole(role),\n onClone: () => handleClone(),\n onDelete: () => setDeleteTarget(role)\n },\n role._id\n )) }),\n rolesPagination?.enabled && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between px-1\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-tertiary\", children: [\n \"Page \",\n rolesPagination.page,\n \" of \",\n rolesPagination.totalPages,\n \" \\xB7 \",\n rolesPagination.totalItems,\n \" total\"\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setRolesPage((page) => Math.max(1, page - 1)),\n disabled: !rolesPagination.hasPrevPage || rolesQuery.isFetching,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 transition-colors\",\n \"aria-label\": \"Previous roles page\",\n children: /* @__PURE__ */ jsx(ChevronLeft, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-secondary px-1\", children: [\n rolesPagination.page,\n \" / \",\n rolesPagination.totalPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setRolesPage((page) => page + 1),\n disabled: !rolesPagination.hasNextPage || rolesQuery.isFetching,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 transition-colors\",\n \"aria-label\": \"Next roles page\",\n children: /* @__PURE__ */ jsx(ChevronRight, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] }),\n /* @__PURE__ */ jsx(\n RoleFormModal,\n {\n open: createOpen,\n onClose: () => setCreateOpen(false),\n appMongoId,\n onSave: handleCreate\n }\n ),\n /* @__PURE__ */ jsx(\n RoleFormModal,\n {\n open: !!editingRole,\n onClose: () => setEditingRole(null),\n appMongoId,\n existing: editingRole ?? void 0,\n onSave: handleEdit\n }\n ),\n /* @__PURE__ */ jsx(\n ConfirmDialog,\n {\n open: !!deleteTarget,\n onClose: () => setDeleteTarget(null),\n onConfirm: handleDelete,\n title: \"Delete role\",\n message: `Delete \"${deleteTarget?.name}\"? Users with this role will lose it. This cannot be undone.`,\n confirmLabel: \"Delete\",\n variant: \"danger\",\n loading: deleteLoading\n }\n )\n ] });\n}\nvar SECTIONS = [\n { key: \"modules\", label: \"Modules\", icon: /* @__PURE__ */ jsx(Box, { className: \"h-3.5 w-3.5\" }) },\n {\n key: \"permissions\",\n label: \"Permissions\",\n icon: /* @__PURE__ */ jsx(Key, { className: \"h-3.5 w-3.5\" })\n },\n { key: \"roles\", label: \"Roles\", icon: /* @__PURE__ */ jsx(Shield, { className: \"h-3.5 w-3.5\" }) },\n {\n key: \"mapping\",\n label: \"Mapping\",\n icon: /* @__PURE__ */ jsx(Network, { className: \"h-3.5 w-3.5\" })\n }\n];\nfunction ModuleFormModal({\n open,\n onClose,\n existing,\n onSave\n}) {\n const [form, setForm] = useState({\n name: \"\",\n key: \"\",\n description: \"\",\n order: \"0\"\n });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n useEffect(() => {\n if (open) {\n setForm({\n name: existing?.module_type ?? \"\",\n key: existing?.key ?? \"\",\n description: existing?.description ?? \"\",\n order: String(existing?.order ?? \"0\")\n });\n setError(\"\");\n }\n }, [open, existing]);\n const set = (k) => (e) => setForm((f) => ({ ...f, [k]: e.target.value }));\n const handleNameChange = (e) => {\n const name = e.target.value;\n setForm((f) => ({\n ...f,\n name,\n key: existing ? f.key : name.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\")\n }));\n };\n const submit = async () => {\n if (!form.name.trim()) {\n setError(\"Name is required.\");\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n await onSave(form);\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Save failed.\");\n } finally {\n setLoading(false);\n }\n };\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose,\n title: existing ? \"Edit module\" : \"Add module\",\n size: \"sm\",\n footer: /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"sm\",\n onClick: onClose,\n disabled: loading,\n children: \"Cancel\"\n }\n ),\n /* @__PURE__ */ jsx(Button, { size: \"sm\", onClick: submit, loading, children: existing ? \"Save\" : \"Add\" })\n ] }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-3\", children: [\n /* @__PURE__ */ jsx(\n Input,\n {\n label: \"Name\",\n value: form.name,\n onChange: handleNameChange,\n placeholder: \"e.g. Contracts\",\n required: true\n }\n ),\n /* @__PURE__ */ jsx(\n Input,\n {\n label: \"Description\",\n value: form.description,\n onChange: set(\"description\"),\n placeholder: \"Short description (optional)\"\n }\n ),\n error && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: error })\n ] })\n }\n );\n}\nfunction PageControls({\n pagination,\n isFetching,\n onPrevPage,\n onNextPage\n}) {\n if (!pagination?.enabled) return null;\n const page = pagination.page ?? 1;\n const totalPages = pagination.totalPages ?? 1;\n const totalItems = pagination.totalItems ?? 0;\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between px-1\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-tertiary\", children: [\n \"Page \",\n page,\n \" of \",\n totalPages,\n \" \\xB7 \",\n totalItems,\n \" total\"\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onPrevPage,\n disabled: !pagination.hasPrevPage || isFetching,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 transition-colors\",\n \"aria-label\": \"Previous page\",\n children: /* @__PURE__ */ jsx(ChevronLeft, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-secondary px-1\", children: [\n page,\n \" / \",\n totalPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: onNextPage,\n disabled: !pagination.hasNextPage || isFetching,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 transition-colors\",\n \"aria-label\": \"Next page\",\n children: /* @__PURE__ */ jsx(ChevronRight, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] });\n}\nfunction ModulesSection({\n appMongoId,\n modules = [],\n search = \"\",\n onSearchChange = () => {\n },\n pagination,\n isFetching,\n onPrevPage,\n onNextPage\n}) {\n const { adapter } = useAppsec();\n const toast = useToast();\n const queryClient2 = useQueryClient();\n const [items, setItems] = useState(modules);\n const [loading, setLoading] = useState(false);\n const [addOpen, setAddOpen] = useState(false);\n const [editing, setEditing] = useState(null);\n const [delTarget, setDelTarget] = useState(null);\n const [delLoading, setDelLoading] = useState(false);\n useEffect(() => {\n setItems(modules);\n }, [modules]);\n const handleSave = async (d) => {\n if (editing) {\n const payload = {\n name: d.name.trim(),\n description: d.description.trim()\n };\n const response = await adapter.updateModule(editing._id, payload);\n const updated = response.data;\n setItems(\n (prev) => prev.map((m) => m._id === updated._id ? updated : m)\n );\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.modules(appMongoId)\n });\n toast.success(response.message ?? \"Module updated successfully.\");\n setEditing(null);\n } else {\n const payload = {\n name: d.name.trim(),\n appId: appMongoId,\n description: d.description.trim()\n };\n const created = await adapter.createModule(payload);\n setItems((prev) => [...prev, created.data]);\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.modules(appMongoId)\n });\n toast.success(created.message ?? \"Module created successfully.\");\n setAddOpen(false);\n }\n };\n const handleDelete = async () => {\n if (!delTarget) return;\n setDelLoading(true);\n try {\n const res = await adapter.deleteModule(delTarget._id);\n setItems((prev) => prev.filter((m) => m._id !== delTarget._id));\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.modules(appMongoId)\n });\n toast.success(res?.message ?? \"Module deleted successfully.\");\n setDelTarget(null);\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Failed to delete module.\"\n );\n } finally {\n setDelLoading(false);\n }\n };\n const filtered = items;\n if (loading) return /* @__PURE__ */ jsx(SectionSkeleton, {});\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-4\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2\", children: [\n /* @__PURE__ */ jsx(\n SearchBar,\n {\n value: search,\n onChange: onSearchChange,\n placeholder: \"Search modules\\u2026\",\n className: \"w-56\"\n }\n ),\n /* @__PURE__ */ jsx(\"div\", { className: \"ml-auto\", children: /* @__PURE__ */ jsx(\n Button,\n {\n size: \"sm\",\n iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-3.5 w-3.5\" }),\n onClick: () => setAddOpen(true),\n children: \"Add Module\"\n }\n ) })\n ] }),\n /* @__PURE__ */ jsx(\"div\", { className: \"rounded-appsec border border-appsec-border overflow-x-auto\", children: /* @__PURE__ */ jsxs(\"table\", { className: \"w-full text-sm\", children: [\n /* @__PURE__ */ jsx(\"thead\", { children: /* @__PURE__ */ jsxs(\"tr\", { className: \"border-b border-appsec-border bg-appsec-surface\", children: [\n /* @__PURE__ */ jsx(\"th\", { className: \"px-4 py-2.5 text-left text-[11px] font-semibold text-appsec-text-secondary uppercase tracking-wide\", children: \"Name\" }),\n /* @__PURE__ */ jsx(\"th\", { className: \"px-4 py-2.5 text-left text-[11px] font-semibold text-appsec-text-secondary uppercase tracking-wide \", children: \"Description\" }),\n /* @__PURE__ */ jsx(\"th\", { className: \"w-20\" })\n ] }) }),\n /* @__PURE__ */ jsx(\"tbody\", { className: \"divide-y divide-appsec-border\", children: filtered.length === 0 ? /* @__PURE__ */ jsx(\"tr\", { children: /* @__PURE__ */ jsx(\n \"td\",\n {\n colSpan: 3,\n className: \"px-4 py-10 text-center text-xs text-appsec-text-tertiary\",\n children: \"No modules found.\"\n }\n ) }) : filtered.sort((a, b) => (a.order ?? 0) - (b.order ?? 0)).map((m) => /* @__PURE__ */ jsxs(\n \"tr\",\n {\n className: \"bg-appsec-bg hover:bg-appsec-surface transition-colors\",\n children: [\n /* @__PURE__ */ jsx(\"td\", { className: \"px-4 py-2.5 font-medium text-appsec-text\", children: m.module_type }),\n /* @__PURE__ */ jsx(\"td\", { className: \"px-4 py-2.5 text-xs text-appsec-text-secondary truncate max-w-xs\", children: m.description ?? \"\\u2014\" }),\n /* @__PURE__ */ jsx(\"td\", { className: \"px-4 py-2.5\", children: /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1 justify-end\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setEditing(m),\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-primary hover:bg-appsec-primary-light transition-colors\",\n children: /* @__PURE__ */ jsx(Pencil, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setDelTarget(m),\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-danger hover:bg-appsec-danger-light transition-colors\",\n children: /* @__PURE__ */ jsx(Trash2, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] }) })\n ]\n },\n m._id\n )) })\n ] }) }),\n /* @__PURE__ */ jsx(\n PageControls,\n {\n pagination,\n isFetching,\n onPrevPage,\n onNextPage\n }\n ),\n /* @__PURE__ */ jsx(\n ModuleFormModal,\n {\n open: addOpen,\n onClose: () => setAddOpen(false),\n onSave: handleSave\n }\n ),\n /* @__PURE__ */ jsx(\n ModuleFormModal,\n {\n open: !!editing,\n onClose: () => setEditing(null),\n existing: editing ?? void 0,\n onSave: handleSave\n }\n ),\n /* @__PURE__ */ jsx(\n ConfirmDialog,\n {\n open: !!delTarget,\n onClose: () => setDelTarget(null),\n onConfirm: handleDelete,\n title: \"Delete module\",\n message: `Delete \"${delTarget?.module_type}\"? This cannot be undone.`,\n confirmLabel: \"Delete\",\n variant: \"danger\",\n loading: delLoading\n }\n )\n ] });\n}\nfunction PermissionFormModal({\n open,\n onClose,\n existing,\n onSave\n}) {\n const [form, setForm] = useState({\n _id: \"\",\n name: \"\",\n label: \"\",\n description: \"\"\n });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n useEffect(() => {\n if (!existing) return;\n if (open) {\n setForm({\n _id: existing._id ?? \"\",\n name: existing?.name ?? \"\",\n label: existing?.label ?? \"\",\n description: existing?.description ?? \"\"\n });\n setError(\"\");\n }\n }, [open, existing]);\n const set = (k) => (e) => setForm((f) => ({ ...f, [k]: e.target.value }));\n const handleNameChange = (e) => {\n const name = e.target.value;\n setForm((f) => ({ ...f, name, label: existing ? f.label : name }));\n };\n const submit = async () => {\n if (!form.name.trim()) {\n setError(\"Name is required.\");\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n await onSave({\n _id: form._id,\n name: form.name.trim(),\n label: form.label.trim(),\n description: form.description.trim()\n });\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Save failed.\");\n } finally {\n setLoading(false);\n }\n };\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose,\n title: existing ? \"Edit permission\" : \"Add permission\",\n size: \"sm\",\n footer: /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"sm\",\n onClick: onClose,\n disabled: loading,\n children: \"Cancel\"\n }\n ),\n /* @__PURE__ */ jsx(Button, { size: \"sm\", onClick: submit, loading, children: existing ? \"Save\" : \"Add\" })\n ] }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-3\", children: [\n /* @__PURE__ */ jsx(\n Input,\n {\n label: \"Name\",\n value: form.name,\n onChange: handleNameChange,\n placeholder: \"e.g. read\",\n className: \"font-mono\",\n required: true\n }\n ),\n /* @__PURE__ */ jsx(\n Input,\n {\n label: \"Description\",\n value: form.description,\n onChange: set(\"description\"),\n placeholder: \"Optional\"\n }\n ),\n error && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: error })\n ] })\n }\n );\n}\nfunction PermissionsSection({\n appMongoId,\n permissions = [],\n search = \"\",\n onSearchChange = () => {\n },\n pagination,\n isFetching,\n onPrevPage,\n onNextPage\n}) {\n const { adapter, appId } = useAppsec();\n const toast = useToast();\n const queryClient2 = useQueryClient();\n const [items, setItems] = useState(permissions);\n const [loading, setLoading] = useState(false);\n const [addOpen, setAddOpen] = useState(false);\n const [editing, setEditing] = useState(null);\n const [delTarget, setDelTarget] = useState(null);\n const [delLoading, setDelLoading] = useState(false);\n useEffect(() => {\n setItems(permissions);\n }, [permissions]);\n const handleSave = async (d) => {\n if (editing) {\n const payload = {\n _id: d._id,\n name: d.name,\n appId: appMongoId\n };\n const response = await adapter.updatePermission(payload._id, payload);\n const updated = response.data;\n setItems(\n (prev) => prev.map((p) => p._id === updated._id ? updated : p)\n );\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.permissions(appMongoId)\n });\n toast.success(response.message ?? \"Permission updated successfully.\");\n setEditing(null);\n } else {\n const payload = {\n name: d.name,\n appId: appMongoId\n };\n const response = await adapter.createPermission(payload);\n setItems((prev) => [...prev, response.data]);\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.permissions(appMongoId)\n });\n toast.success(response.message ?? \"Permission created successfully.\");\n setAddOpen(false);\n }\n };\n const handleDelete = async () => {\n if (!delTarget) return;\n setDelLoading(true);\n try {\n const res = await adapter.deletePermission(delTarget._id);\n setItems((prev) => prev.filter((p) => p._id !== delTarget._id));\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.permissions(appMongoId)\n });\n toast.success(res?.message ?? \"Permission deleted successfully.\");\n setDelTarget(null);\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Failed to delete permission.\"\n );\n } finally {\n setDelLoading(false);\n }\n };\n const filtered = items;\n if (loading) return /* @__PURE__ */ jsx(SectionSkeleton, {});\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-4\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2\", children: [\n /* @__PURE__ */ jsx(\n SearchBar,\n {\n value: search,\n onChange: onSearchChange,\n placeholder: \"Search permissions\\u2026\",\n className: \"w-56\"\n }\n ),\n /* @__PURE__ */ jsx(\"div\", { className: \"ml-auto\", children: /* @__PURE__ */ jsx(\n Button,\n {\n size: \"sm\",\n iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-3.5 w-3.5\" }),\n onClick: () => setAddOpen(true),\n children: \"Add Permission\"\n }\n ) })\n ] }),\n /* @__PURE__ */ jsx(\"div\", { className: \"rounded-appsec border border-appsec-border overflow-x-auto\", children: /* @__PURE__ */ jsxs(\"table\", { className: \"w-full text-sm\", children: [\n /* @__PURE__ */ jsx(\"thead\", { children: /* @__PURE__ */ jsxs(\"tr\", { className: \"border-b border-appsec-border bg-appsec-surface\", children: [\n /* @__PURE__ */ jsx(\"th\", { className: \"px-4 py-2.5 text-left text-[11px] font-semibold text-appsec-text-secondary uppercase tracking-wide\", children: \"Name\" }),\n /* @__PURE__ */ jsx(\"th\", { className: \"px-4 py-2.5 text-left text-[11px] font-semibold text-appsec-text-secondary uppercase tracking-wide \", children: \"Description\" }),\n /* @__PURE__ */ jsx(\"th\", { className: \"w-20\" })\n ] }) }),\n /* @__PURE__ */ jsx(\"tbody\", { className: \"divide-y divide-appsec-border\", children: filtered.length === 0 ? /* @__PURE__ */ jsx(\"tr\", { children: /* @__PURE__ */ jsx(\n \"td\",\n {\n colSpan: 3,\n className: \"px-4 py-10 text-center text-xs text-appsec-text-tertiary\",\n children: \"No permissions found.\"\n }\n ) }) : filtered.map((p) => /* @__PURE__ */ jsxs(\n \"tr\",\n {\n className: \"bg-appsec-bg hover:bg-appsec-surface transition-colors\",\n children: [\n /* @__PURE__ */ jsx(\"td\", { className: \"px-4 py-2.5 font-mono text-xs text-appsec-text\", children: p.name }),\n /* @__PURE__ */ jsx(\"td\", { className: \"px-4 py-2.5 text-xs text-appsec-text-secondary truncate max-w-xs\", children: p.description ?? \"\\u2014\" }),\n /* @__PURE__ */ jsx(\"td\", { className: \"px-4 py-2.5\", children: /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1 justify-end\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setEditing(p),\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-primary hover:bg-appsec-primary-light transition-colors\",\n children: /* @__PURE__ */ jsx(Pencil, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setDelTarget(p),\n className: \"p-1.5 rounded-appsec text-appsec-text-tertiary hover:text-appsec-danger hover:bg-appsec-danger-light transition-colors\",\n children: /* @__PURE__ */ jsx(Trash2, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] }) })\n ]\n },\n p._id\n )) })\n ] }) }),\n /* @__PURE__ */ jsx(\n PageControls,\n {\n pagination,\n isFetching,\n onPrevPage,\n onNextPage\n }\n ),\n /* @__PURE__ */ jsx(\n PermissionFormModal,\n {\n open: addOpen,\n onClose: () => setAddOpen(false),\n onSave: handleSave\n }\n ),\n /* @__PURE__ */ jsx(\n PermissionFormModal,\n {\n open: !!editing,\n onClose: () => setEditing(null),\n existing: editing ?? void 0,\n onSave: handleSave\n }\n ),\n /* @__PURE__ */ jsx(\n ConfirmDialog,\n {\n open: !!delTarget,\n onClose: () => setDelTarget(null),\n onConfirm: handleDelete,\n title: \"Delete permission\",\n message: `Delete \"${delTarget?.label || delTarget?.name}\"? Roles using it will lose it.`,\n confirmLabel: \"Delete\",\n variant: \"danger\",\n loading: delLoading\n }\n )\n ] });\n}\nfunction MappingSection({\n appMongoId,\n modules,\n roleModuleMapping\n}) {\n const { adapter, appId } = useAppsec();\n const allRolesQuery = useAllRolesQuery(appMongoId);\n const roles = allRolesQuery.data?.data || [];\n const queryClient2 = useQueryClient();\n const [mapping, setMapping] = useState([]);\n const [saving, setSaving] = useState(false);\n const [dirty, setDirty] = useState(false);\n const [dragRoleId, setDragRoleId] = useState(null);\n const [overModuleId, setOverModuleId] = useState(null);\n useEffect(() => {\n const normalizedMapping = roleModuleMapping.map(\n (e) => ({\n roleId: e.roleId && typeof e.roleId === \"object\" ? e.roleId._id : e.roleId,\n moduleId: e.moduleId && typeof e.moduleId === \"object\" ? e.moduleId._id : e.moduleId\n })\n );\n setMapping(normalizedMapping);\n setDirty(false);\n }, [roleModuleMapping]);\n const sortedModules = useMemo(\n () => modules.slice().sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\n [modules]\n );\n const rolesInModule = (moduleId) => mapping.filter((e) => {\n const mId = typeof e.moduleId === \"object\" ? e.moduleId._id : e.moduleId;\n return mId === moduleId;\n }).map((e) => roles.find((r) => r._id === e.roleId)).filter((r) => !!r);\n const getId3 = (val) => typeof val === \"object\" && val !== null ? val._id : val;\n const addEntry = (roleId, moduleId) => {\n const exists = mapping.some((e) => {\n const mId = getId3(e.moduleId);\n return e.roleId === roleId && mId === moduleId;\n });\n if (exists) return;\n setMapping((prev) => [...prev, { roleId, moduleId }]);\n setDirty(true);\n };\n const removeEntry = (roleId, moduleId) => {\n setMapping(\n (prev) => prev.filter((e) => {\n const mId = getId3(e.moduleId);\n return !(e.roleId === roleId && mId === moduleId);\n })\n );\n setDirty(true);\n };\n const handleSave = async () => {\n setSaving(true);\n try {\n const payload = {\n appId: appMongoId,\n mappings: mapping\n };\n await adapter.updateModuleMapping(payload);\n queryClient2.invalidateQueries({\n queryKey: rbacQueryKeys.roleModuleMapping(appMongoId)\n });\n setDirty(false);\n } finally {\n setSaving(false);\n }\n };\n if (roles.length === 0)\n return /* @__PURE__ */ jsx(\"p\", { className: \"text-sm text-appsec-text-secondary\", children: \"No roles defined \\u2014 add some in the Roles section.\" });\n if (sortedModules.length === 0)\n return /* @__PURE__ */ jsx(\"p\", { className: \"text-sm text-appsec-text-secondary\", children: \"No modules defined \\u2014 add some in the Modules section.\" });\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-5\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-secondary\", children: \"Drag roles into module drop zones to assign access. \\xD7 to remove.\" }),\n dirty && /* @__PURE__ */ jsx(Button, { size: \"sm\", loading: saving, onClick: handleSave, children: \"Save mapping\" })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col\", style: { height: 520 }, children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"shrink-0 pb-4 border-b border-appsec-border\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-[11px] font-semibold uppercase tracking-wide text-appsec-text-secondary mb-2\", children: \"Roles\" }),\n /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-wrap gap-1.5 max-h-24 overflow-y-auto pr-1\", children: roles.map((role) => /* @__PURE__ */ jsx(\n \"div\",\n {\n draggable: true,\n onDragStart: () => setDragRoleId(role._id),\n onDragEnd: () => {\n setDragRoleId(null);\n setOverModuleId(null);\n },\n className: cn(\n \"px-2 py-0.5 rounded-appsec border border-appsec-primary bg-appsec-primary-light\",\n \"text-xs font-medium text-appsec-primary text-center\",\n \"cursor-grab active:cursor-grabbing select-none transition-opacity\",\n dragRoleId === role._id && \"opacity-40\"\n ),\n children: role.name\n },\n role._id\n )) })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-2 flex-1 overflow-y-auto pt-4 pr-1\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-[11px] font-semibold uppercase tracking-wide text-appsec-text-secondary shrink-0\", children: \"Module Drop Zones\" }),\n /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-col gap-3\", children: sortedModules.map((mod) => {\n const assigned = rolesInModule(mod._id);\n const isOver = overModuleId === mod._id;\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n onDragOver: (e) => {\n e.preventDefault();\n setOverModuleId(mod._id);\n },\n onDragLeave: () => setOverModuleId(null),\n onDrop: (e) => {\n e.preventDefault();\n if (dragRoleId) addEntry(dragRoleId, mod._id);\n setDragRoleId(null);\n setOverModuleId(null);\n },\n className: cn(\n \"min-h-16 rounded-appsec border-2 border-dashed p-3 transition-colors\",\n isOver ? \"border-appsec-primary bg-appsec-primary-light\" : \"border-appsec-border bg-appsec-surface\"\n ),\n children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs font-semibold text-appsec-text mb-2\", children: mod.module_type }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-wrap gap-2\", children: [\n assigned.map((role) => /* @__PURE__ */ jsxs(\n \"span\",\n {\n className: \"inline-flex items-center gap-1 px-2.5 py-1 rounded-full bg-appsec-primary-light border border-appsec-primary text-appsec-primary text-xs font-medium\",\n children: [\n role.name,\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => removeEntry(role._id, mod._id),\n className: \"hover:opacity-70 transition-opacity leading-none\",\n \"aria-label\": `Remove ${role.name}`,\n children: /* @__PURE__ */ jsx(X, { className: \"h-3 w-3\" })\n }\n )\n ]\n },\n role._id\n )),\n assigned.length === 0 && !isOver && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary italic\", children: \"Drop a role here\\u2026\" })\n ] })\n ]\n },\n mod._id\n );\n }) })\n ] })\n ] })\n ] });\n}\nfunction SectionSkeleton() {\n return /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-col gap-3\", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsx(\n \"div\",\n {\n className: \"h-12 rounded-appsec bg-appsec-surface animate-pulse\"\n },\n i\n )) });\n}\nfunction ConfigTab({ appMongoId }) {\n const [modulesPage, setModulesPage] = useState(1);\n const [rolesPage, setRolesPage] = useState(1);\n const [permissionsPage, setPermissionsPage] = useState(1);\n const [modulesSearch, setModulesSearch] = useState(\"\");\n const [permissionsSearch, setPermissionsSearch] = useState(\"\");\n const debouncedModulesSearch = useDebouncedValue(modulesSearch.trim(), 300);\n const debouncedPermissionsSearch = useDebouncedValue(permissionsSearch.trim(), 300);\n const pageSize = 10;\n const modulesQuery = useModulesPaginatedQuery(appMongoId, modulesPage, pageSize, debouncedModulesSearch);\n const rolesQuery = useRolesPaginatedQuery(appMongoId, rolesPage, pageSize);\n const permissionsQuery = usePermissionsPaginatedQuery(appMongoId, permissionsPage, pageSize, debouncedPermissionsSearch);\n const roleModuleMappingQuery = useRoleModuleMappingQuery(appMongoId);\n const modules = modulesQuery.data?.data || [];\n const roles = rolesQuery.data?.data || [];\n const permissions = permissionsQuery.data?.data || [];\n const roleModuleMapping = roleModuleMappingQuery.data?.data || [];\n modulesQuery.isLoading || rolesQuery.isLoading || permissionsQuery.isLoading || roleModuleMappingQuery.isLoading;\n const [section, setSection] = useState(\"modules\");\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-5\", children: [\n /* @__PURE__ */ jsx(\"div\", { className: \"flex gap-1 p-1 rounded-appsec bg-appsec-surface border border-appsec-border self-start\", children: SECTIONS.map((s) => /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onClick: () => setSection(s.key),\n className: cn(\n \"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded transition-colors\",\n section === s.key ? \"bg-appsec-bg text-appsec-text shadow-sm border border-appsec-border\" : \"text-appsec-text-secondary hover:text-appsec-text\"\n ),\n children: [\n s.icon,\n s.label\n ]\n },\n s.key\n )) }),\n section === \"modules\" && /* @__PURE__ */ jsx(\n ModulesSection,\n {\n appMongoId,\n modules,\n search: modulesSearch,\n onSearchChange: (value) => {\n setModulesSearch(value);\n setModulesPage(1);\n },\n pagination: modulesQuery.data?.pagination,\n isFetching: modulesQuery.isFetching,\n onPrevPage: () => setModulesPage((page) => Math.max(1, page - 1)),\n onNextPage: () => setModulesPage((page) => page + 1)\n }\n ),\n section === \"permissions\" && /* @__PURE__ */ jsx(\n PermissionsSection,\n {\n appMongoId,\n permissions,\n search: permissionsSearch,\n onSearchChange: (value) => {\n setPermissionsSearch(value);\n setPermissionsPage(1);\n },\n pagination: permissionsQuery.data?.pagination,\n isFetching: permissionsQuery.isFetching,\n onPrevPage: () => setPermissionsPage((page) => Math.max(1, page - 1)),\n onNextPage: () => setPermissionsPage((page) => page + 1)\n }\n ),\n section === \"roles\" && /* @__PURE__ */ jsx(RolesTab, { appMongoId }),\n section === \"mapping\" && /* @__PURE__ */ jsx(\n MappingSection,\n {\n appMongoId,\n modules,\n roles,\n roleModuleMapping\n }\n )\n ] });\n}\nvar getId = (value) => typeof value === \"string\" ? value : String(value?._id ?? value?.id ?? \"\");\nvar stripHtml = (html) => html.replace(/<style[\\s\\S]*?<\\/style>/gi, \"\").replace(/<script[\\s\\S]*?<\\/script>/gi, \"\").replace(/<[^>]+>/g, \" \").replace(/\\s+/g, \" \").trim();\nvar applyTemplate = (template, recipientEmail, grantedBy, additionalData) => template.split(\"{{recipient_email}}\").join(recipientEmail).split(\"{{granted_by}}\").join(grantedBy).split(\"{{additional_data}}\").join(additionalData);\nvar ShareAccessModal = memo(function ShareAccessModal2({\n resourceId,\n moduleId,\n title,\n description,\n notifyByEmail = false,\n sendAdditionalMessage = false,\n emailTemplate,\n open = true,\n onSuccess,\n onClose,\n resourceName,\n isResourceGroup = false\n}) {\n const { adapter, appId, currentUserEmail } = useAppsec();\n const toast = useToast();\n const [mode, setMode] = useState(\"user\");\n const [selectedUsers, setSelectedUsers] = useState([]);\n const [inputValue, setInputValue] = useState(\"\");\n const [debouncedInput, setDebouncedInput] = useState(\"\");\n const [showDropdown, setShowDropdown] = useState(false);\n const [groupId, setGroupId] = useState(\"\");\n const [roleId, setRoleId] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const [notifyPeople, setNotifyPeople] = useState(false);\n const [additionalMessage, setAdditionalMessage] = useState(\"\");\n const inputRef = useRef(null);\n const dropdownRef = useRef(null);\n const appQuery = useAppQuery(appId);\n const appMongoId = appQuery.data?.data?.[0]?._id || \"\";\n const rolesQuery = useAllRolesQuery(appMongoId);\n const groupsQuery = useGroupsQuery(appMongoId);\n const roleModuleMappingQuery = useRoleModuleMappingQuery(appMongoId);\n const aclsQuery = useAllAclsQuery(appMongoId);\n const usersQuery = useUsersSearchQuery(debouncedInput);\n const createAclMutation = useCreateAclMutation();\n const shareResourceGroupMutation = useShareResourceGroupMutation();\n const sendMailMutation = useMutation({\n mutationFn: (payload) => adapter.sendMail(payload)\n });\n const roles = rolesQuery.data?.data || [];\n const groups = groupsQuery.data?.data ?? [];\n const roleModuleMapping = roleModuleMappingQuery.data?.data || [];\n const aclEntries = aclsQuery.data?.data ?? [];\n const suggestions = useMemo(\n () => (usersQuery.data || []).filter(\n (u) => !selectedUsers.some((s) => s.email === u.email)\n ),\n [usersQuery.data, selectedUsers]\n );\n const filteredRoles = useMemo(\n () => {\n if (!moduleId || roleModuleMapping.length === 0) return [];\n return roles.filter(\n (role) => roleModuleMapping.some((m) => {\n const mappedRoleId = getId(m.roleId ?? m.role);\n const mappedModuleId = getId(m.moduleId ?? m.module);\n return mappedRoleId === role._id && mappedModuleId === moduleId;\n })\n );\n },\n [roles, roleModuleMapping, moduleId]\n );\n useEffect(() => {\n if (!open) return;\n setMode(\"user\");\n setSelectedUsers([]);\n setInputValue(\"\");\n setDebouncedInput(\"\");\n setShowDropdown(false);\n setGroupId(\"\");\n setRoleId(\"\");\n setError(\"\");\n setLoading(false);\n setNotifyPeople(false);\n setAdditionalMessage(\"\");\n }, [open]);\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedInput(inputValue.trim()), 300);\n return () => clearTimeout(timer);\n }, [inputValue]);\n useEffect(() => {\n if (suggestions.length > 0 && inputValue.trim().length >= 2) {\n setShowDropdown(true);\n } else {\n setShowDropdown(false);\n }\n }, [suggestions, inputValue]);\n useEffect(() => {\n if (!showDropdown) return;\n const handler = (e) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {\n setShowDropdown(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [showDropdown]);\n const addUser = (user) => {\n setSelectedUsers((prev) => [...prev, user]);\n setInputValue(\"\");\n setDebouncedInput(\"\");\n setShowDropdown(false);\n inputRef.current?.focus();\n };\n const addRawEmail = () => {\n const trimmed = inputValue.trim().toLowerCase();\n if (!trimmed || selectedUsers.some((u) => u.email === trimmed)) return;\n setSelectedUsers((prev) => [\n ...prev,\n { email: trimmed, displayName: trimmed }\n ]);\n setInputValue(\"\");\n setDebouncedInput(\"\");\n setShowDropdown(false);\n };\n const removeUser = (email) => {\n setSelectedUsers((prev) => prev.filter((u) => u.email !== email));\n };\n const handleKeyDown = (e) => {\n if ((e.key === \"Enter\" || e.key === \",\") && inputValue.trim()) {\n e.preventDefault();\n if (suggestions.length > 0) addUser(suggestions[0]);\n else addRawEmail();\n }\n if (e.key === \"Backspace\" && !inputValue && selectedUsers.length > 0) {\n setSelectedUsers((prev) => prev.slice(0, -1));\n }\n if (e.key === \"Escape\") setShowDropdown(false);\n };\n const sendNotifications = async (emails) => {\n if (!notifyByEmail || !notifyPeople || !emailTemplate || emails.length === 0) {\n return;\n }\n const grantedBy = currentUserEmail || \"\";\n const additionalData = sendAdditionalMessage ? additionalMessage : \"\";\n await Promise.all(\n emails.map((email) => {\n const subject = applyTemplate(\n emailTemplate.subject,\n email,\n grantedBy,\n additionalData\n );\n const html = applyTemplate(\n emailTemplate.html,\n email,\n grantedBy,\n additionalData\n );\n return sendMailMutation.mutateAsync({\n recipients: {\n to: [email],\n cc: [],\n bcc: []\n },\n mail: {\n subject,\n html,\n text: stripHtml(html)\n }\n });\n })\n );\n };\n const submit = async () => {\n if (mode === \"user\" && selectedUsers.length === 0) {\n setError(\"Add at least one email.\");\n return;\n }\n if (mode === \"group\" && !groupId) {\n setError(\"Select a group.\");\n return;\n }\n if (!roleId) {\n setError(\"Select a role.\");\n return;\n }\n if (!appMongoId) {\n setError(\"Application is still loading.\");\n return;\n }\n if (notifyByEmail && notifyPeople && (!emailTemplate?.subject.trim() || !emailTemplate?.html.trim())) {\n setError(\"Email template is required when notifyByEmail is true.\");\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n const emails = selectedUsers.map((u) => u.email);\n let grantedEmails = [];\n const roleObj = roles.find((role) => role._id === roleId);\n if (!roleObj) throw new Error(\"Role not found\");\n if (isResourceGroup) {\n if (groupId) {\n const group = groups.find((g) => g._id === groupId);\n await shareResourceGroupMutation.mutateAsync({\n resource_group_id: resourceId,\n group_id: groupId,\n role: roleId,\n is_inherited: true\n });\n grantedEmails = (group?.users ?? []).filter(\n (email) => email.includes(\"@\")\n );\n await sendNotifications(grantedEmails);\n toast.success(\n `Resource group shared with group \"${group?.name ?? groupId}\".`\n );\n } else {\n grantedEmails = emails;\n await Promise.all(\n emails.map(\n (email) => shareResourceGroupMutation.mutateAsync({\n resource_group_id: resourceId,\n user_email: email,\n role: roleId,\n is_inherited: true\n })\n )\n );\n await sendNotifications(emails);\n toast.success(\n `Resource group shared with ${emails.length} user${emails.length !== 1 ? \"s\" : \"\"}.`\n );\n }\n } else if (groupId) {\n const group = groups.find((g) => g._id === groupId);\n if (!group) throw new Error(\"Group not found\");\n await createAclMutation.mutateAsync({\n resource_type: moduleId,\n resource_id: resourceId,\n group_id: groupId,\n is_inherited: true,\n role: roleId\n });\n grantedEmails = group.users.filter((email) => email.includes(\"@\"));\n await sendNotifications(grantedEmails);\n toast.success(`Access granted to group \"${group.name}\".`);\n } else {\n const existingEmails = aclEntries.filter(\n (acl) => acl.resourceId === resourceId && acl.resourceType === moduleId\n ).map((acl) => acl.user_email);\n const newEmails = emails.filter((email) => !existingEmails.includes(email));\n const skipped = emails.length - newEmails.length;\n if (newEmails.length === 0) {\n toast.info(\"All selected users already have access to this resource.\");\n setLoading(false);\n return;\n }\n grantedEmails = newEmails;\n await Promise.all(\n newEmails.map(\n (email) => createAclMutation.mutateAsync({\n resource_type: moduleId,\n resource_id: resourceId,\n user_email: email,\n is_inherited: false,\n role: roleId\n })\n )\n );\n await sendNotifications(newEmails);\n if (skipped > 0) {\n toast.info(\n `Access granted to ${newEmails.length} user${newEmails.length !== 1 ? \"s\" : \"\"}. ${skipped} already had access.`\n );\n } else {\n toast.success(\n `Access granted to ${newEmails.length} user${newEmails.length !== 1 ? \"s\" : \"\"}.`\n );\n }\n }\n onSuccess?.({\n emails: grantedEmails,\n roleId,\n groupId: mode === \"group\" ? groupId : void 0\n });\n onClose?.();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Share failed.\");\n } finally {\n setLoading(false);\n }\n };\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose: () => onClose?.(),\n title: title || (resourceName ? `Share - ${resourceName}` : \"Share Access\"),\n description,\n size: \"sm\",\n footer: /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"sm\",\n onClick: () => onClose?.(),\n disabled: loading,\n children: \"Cancel\"\n }\n ),\n /* @__PURE__ */ jsx(Button, { size: \"sm\", onClick: submit, loading, disabled: loading, children: \"Share\" })\n ] }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-4\", children: [\n /* @__PURE__ */ jsx(\"div\", { className: \"flex gap-1 p-1 rounded-appsec bg-appsec-surface border border-appsec-border\", children: [\"user\", \"group\"].map((m) => /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => {\n setMode(m);\n setError(\"\");\n },\n className: cn(\n \"flex-1 py-1.5 text-xs font-medium rounded transition-colors capitalize\",\n mode === m ? \"bg-appsec-bg text-appsec-text shadow-sm border border-appsec-border\" : \"text-appsec-text-secondary hover:text-appsec-text\"\n ),\n children: m === \"user\" ? \"By Email\" : \"By Group\"\n },\n m\n )) }),\n mode === \"user\" ? /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Add people\" }),\n /* @__PURE__ */ jsxs(\"div\", { ref: dropdownRef, className: \"relative\", children: [\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"flex flex-wrap gap-1.5 p-2 min-h-10 rounded-appsec border bg-appsec-bg cursor-text transition-colors\",\n showDropdown || document.activeElement === inputRef.current ? \"border-appsec-primary\" : \"border-appsec-border\"\n ),\n onClick: () => inputRef.current?.focus(),\n children: [\n selectedUsers.map((u) => /* @__PURE__ */ jsx(\n Chip,\n {\n label: u.displayName !== u.email ? u.displayName : u.email,\n onRemove: () => removeUser(u.email)\n },\n u.email\n )),\n /* @__PURE__ */ jsx(\n \"input\",\n {\n ref: inputRef,\n type: \"text\",\n value: inputValue,\n onChange: (e) => setInputValue(e.target.value),\n onKeyDown: handleKeyDown,\n onFocus: () => inputValue.trim().length >= 2 && suggestions.length > 0 && setShowDropdown(true),\n placeholder: selectedUsers.length === 0 ? \"Search by name or email...\" : \"\",\n className: \"flex-1 min-w-32 bg-transparent outline-none text-sm text-appsec-text placeholder:text-appsec-text-tertiary\"\n }\n ),\n usersQuery.isFetching && /* @__PURE__ */ jsx(\"span\", { className: \"self-center ml-1\", children: /* @__PURE__ */ jsxs(\n \"svg\",\n {\n className: \"animate-spin h-3.5 w-3.5 text-appsec-text-secondary\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n children: [\n /* @__PURE__ */ jsx(\n \"circle\",\n {\n className: \"opacity-25\",\n cx: \"12\",\n cy: \"12\",\n r: \"10\",\n stroke: \"currentColor\",\n strokeWidth: \"4\"\n }\n ),\n /* @__PURE__ */ jsx(\n \"path\",\n {\n className: \"opacity-75\",\n fill: \"currentColor\",\n d: \"M4 12a8 8 0 018-8v8H4z\"\n }\n )\n ]\n }\n ) })\n ]\n }\n ),\n showDropdown && suggestions.length > 0 && /* @__PURE__ */ jsx(\"div\", { className: \"absolute z-50 mt-1 w-full rounded-appsec border border-appsec-border bg-appsec-bg shadow-lg overflow-hidden\", children: suggestions.map((u) => /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onMouseDown: (e) => {\n e.preventDefault();\n addUser(u);\n },\n className: \"flex items-center gap-3 w-full px-3 py-2.5 text-left hover:bg-appsec-surface transition-colors\",\n children: [\n /* @__PURE__ */ jsx(Avatar, { name: u.displayName, size: \"sm\" }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col min-w-0\", children: [\n /* @__PURE__ */ jsx(\"span\", { className: \"text-sm font-medium text-appsec-text truncate\", children: u.displayName }),\n /* @__PURE__ */ jsx(\"span\", { className: \"text-xs text-appsec-text-secondary truncate\", children: u.email })\n ] })\n ]\n },\n u.email\n )) })\n ] }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary\", children: \"Press Enter or comma to add a raw email address.\" })\n ] }) : /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Group\" }),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: groupId,\n onChange: (e) => setGroupId(e.target.value),\n className: \"h-9 text-sm rounded-appsec border border-appsec-border bg-appsec-bg px-3 pr-8 appearance-none outline-none focus:border-appsec-primary text-appsec-text\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"Select group...\" }),\n groups.map((g) => /* @__PURE__ */ jsxs(\"option\", { value: g._id, children: [\n g.name,\n g.description ? ` - ${g.description}` : \"\"\n ] }, g._id))\n ]\n }\n )\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Role\" }),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: roleId,\n onChange: (e) => setRoleId(e.target.value),\n className: \"h-9 text-sm rounded-appsec border border-appsec-border bg-appsec-bg px-3 pr-8 appearance-none outline-none focus:border-appsec-primary text-appsec-text\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"Select role...\" }),\n filteredRoles.length === 0 && /* @__PURE__ */ jsx(\"option\", { value: \"\", disabled: true, children: \"No roles mapped to this module\" }),\n filteredRoles.map((role) => /* @__PURE__ */ jsxs(\"option\", { value: role._id, children: [\n role.name,\n role.description ? ` - ${role.description}` : \"\"\n ] }, role._id))\n ]\n }\n )\n ] }),\n notifyByEmail && /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-2\", children: [\n /* @__PURE__ */ jsxs(\"label\", { className: \"inline-flex items-center gap-2 text-sm font-medium text-appsec-text\", children: [\n /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n checked: notifyPeople,\n onChange: (e) => setNotifyPeople(e.target.checked),\n className: \"h-4 w-4 accent-appsec-primary\"\n }\n ),\n /* @__PURE__ */ jsx(\"span\", { children: \"Notify people by email\" })\n ] }),\n notifyPeople && sendAdditionalMessage && /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Additional Message\" }),\n /* @__PURE__ */ jsx(\n \"textarea\",\n {\n value: additionalMessage,\n onChange: (e) => setAdditionalMessage(e.target.value),\n rows: 3,\n className: \"w-full rounded-appsec border border-appsec-border bg-appsec-bg px-3 py-2 text-sm text-appsec-text placeholder:text-appsec-text-tertiary outline-none transition-colors focus:border-appsec-primary focus:ring-2 focus:ring-appsec-primary-light\"\n }\n )\n ] })\n ] }),\n error && /* @__PURE__ */ jsx(\"div\", { className: \"rounded-appsec bg-appsec-danger-light px-3 py-2 text-sm text-appsec-danger\", children: error })\n ] })\n }\n );\n});\nvar SECTION_TOGGLE = [\n { key: \"access\", label: \"Access Management\", icon: /* @__PURE__ */ jsx(Layers, { className: \"h-3.5 w-3.5\" }) },\n { key: \"rbac\", label: \"RBAC Configuration\", icon: /* @__PURE__ */ jsx(Shield, { className: \"h-3.5 w-3.5\" }) }\n];\nvar RBAC_TABS = [\n { key: \"groups\", label: \"User Groups\", icon: /* @__PURE__ */ jsx(Users2, { className: \"h-3.5 w-3.5\" }) },\n { key: \"config\", label: \"Configuration\", icon: /* @__PURE__ */ jsx(Settings2, { className: \"h-3.5 w-3.5\" }) }\n];\nfunction RBACConfiguration({ defaultTab = \"groups\", className }) {\n const { appId } = useAppsec();\n const appQuery = useAppQuery(appId);\n const appMongoId = appQuery.data?.data?.[0]?._id || \"\";\n const [rbacTab, setRbacTab] = useState(defaultTab);\n if (appQuery.isLoading) {\n return /* @__PURE__ */ jsx(\"div\", { className: cn(\"flex items-center justify-center py-16 text-sm text-appsec-text-secondary\", className), children: \"Loading RBAC configuration...\" });\n }\n if (!appMongoId) {\n return /* @__PURE__ */ jsx(\"div\", { className: cn(\"flex items-center justify-center py-16 text-sm text-appsec-text-secondary\", className), children: \"App not found.\" });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: cn(\"flex flex-col gap-0\", className), children: [\n /* @__PURE__ */ jsx(Tabs, { items: RBAC_TABS, activeKey: rbacTab, onChange: setRbacTab }),\n /* @__PURE__ */ jsx(TabPanel, { tabKey: \"groups\", activeKey: rbacTab, children: /* @__PURE__ */ jsx(UserGroupsTab, { appMongoId }) }),\n /* @__PURE__ */ jsx(TabPanel, { tabKey: \"config\", activeKey: rbacTab, children: /* @__PURE__ */ jsx(\"div\", { className: \"p-4\", children: /* @__PURE__ */ jsx(ConfigTab, { appMongoId }) }) })\n ] });\n}\nfunction RBACManagement({\n defaultTab,\n className,\n mfApi: mfApiProp,\n onRegisterEventHandler,\n onUnregisterEventHandler\n}) {\n const {\n modules,\n roles,\n permissions,\n users,\n groups,\n aclEntries,\n loading,\n appMongoId,\n shareResource,\n setShareResource,\n handleRemoveAccess,\n roleModuleMapping,\n handleBulkRoleChange\n } = useModuleSharedState();\n const [section, setSection] = useState(\"access\");\n const [activeTab, setActiveTab] = useState(defaultTab ?? \"\");\n const [rbacTab, setRbacTab] = useState(\"groups\");\n const mfApiInternal = useMicroFrontendApi();\n const mfApi = mfApiProp ?? mfApiInternal;\n const handleEvent = useCallback((eventData) => {\n if (eventData.action === \"click\") {\n if (eventData.elementId === \"Configuration\") {\n setSection(\"rbac\");\n setRbacTab(\"config\");\n } else if (eventData.elementId === \"User Groups\") {\n setSection(\"rbac\");\n setRbacTab(\"groups\");\n } else {\n setActiveTab(eventData.elementId);\n }\n }\n }, []);\n useEffect(() => {\n if (onRegisterEventHandler) {\n onRegisterEventHandler(handleEvent);\n return () => onUnregisterEventHandler?.();\n }\n const unsubscribe = mfApi.subscribe(\"MODE_UI_INTERACTION_TO_PERFORM\", handleEvent);\n return () => unsubscribe();\n }, [mfApi, handleEvent, onRegisterEventHandler, onUnregisterEventHandler]);\n useEffect(() => {\n if (!mfApi) return;\n return mfApi.subscribe(\"MODE_UI_INTERACTION_TO_PERFORM\", handleEvent);\n }, [mfApi, handleEvent]);\n useEffect(() => {\n if (!loading && modules.length > 0 && !activeTab) {\n setActiveTab(modules[0]._id);\n }\n }, [loading]);\n const moduleTabItems = useMemo(\n () => modules.map((m) => ({ key: m._id, label: m.module_type })),\n [modules]\n );\n if (loading) {\n return /* @__PURE__ */ jsxs(\"div\", { className: cn(\"flex flex-col gap-0\", className), children: [\n /* @__PURE__ */ jsx(\"div\", { className: \"flex gap-1 border-b border-appsec-border px-1 pb-0\", children: [1, 2, 3, 4].map((i) => /* @__PURE__ */ jsx(\"div\", { className: \"h-9 w-20 rounded-t-appsec bg-appsec-surface animate-pulse\" }, i)) }),\n /* @__PURE__ */ jsx(\"div\", { className: \"flex flex-col gap-3 p-4\", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsx(\"div\", { className: \"h-12 rounded-appsec bg-appsec-surface animate-pulse\" }, i)) })\n ] });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: cn(\"flex flex-col gap-0\", className), children: [\n /* @__PURE__ */ jsx(\"div\", { className: \"flex items-center gap-3 px-4 py-3 border-b border-appsec-border bg-appsec-bg\", children: /* @__PURE__ */ jsx(\"div\", { className: \"flex gap-1 p-1 rounded-appsec bg-appsec-surface border border-appsec-border\", children: SECTION_TOGGLE.map(({ key, label, icon }) => /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onClick: () => setSection(key),\n className: cn(\n \"flex items-center gap-2 px-3 py-1.5 rounded text-sm font-medium transition-colors\",\n section === key ? \"bg-appsec-bg text-appsec-text shadow-sm border border-appsec-border\" : \"text-appsec-text-secondary hover:text-appsec-text\"\n ),\n children: [\n icon,\n label\n ]\n },\n key\n )) }) }),\n section === \"access\" && /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(Tabs, { items: moduleTabItems, activeKey: activeTab, onChange: setActiveTab }),\n modules.filter((module) => module._id === activeTab).map((module) => /* @__PURE__ */ jsx(TabPanel, { tabKey: module._id, activeKey: activeTab, children: /* @__PURE__ */ jsx(\"div\", { className: \"p-4\", children: /* @__PURE__ */ jsx(\n ModuleTabContent,\n {\n module,\n roles,\n users,\n groups,\n aclEntries,\n appMongoId,\n onShare: setShareResource,\n onRemoveAccess: handleRemoveAccess,\n onBulkRoleChange: handleBulkRoleChange,\n roleModuleMapping\n }\n ) }) }, module._id))\n ] }),\n section === \"rbac\" && /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(Tabs, { items: RBAC_TABS, activeKey: rbacTab, onChange: setRbacTab }),\n /* @__PURE__ */ jsx(TabPanel, { tabKey: \"groups\", activeKey: rbacTab, children: /* @__PURE__ */ jsx(UserGroupsTab, { appMongoId }) }),\n /* @__PURE__ */ jsx(TabPanel, { tabKey: \"config\", activeKey: rbacTab, children: /* @__PURE__ */ jsx(\"div\", { className: \"p-4\", children: /* @__PURE__ */ jsx(ConfigTab, { appMongoId }) }) })\n ] }),\n shareResource && /* @__PURE__ */ jsx(\n ShareAccessModal,\n {\n open: !!shareResource,\n onClose: () => setShareResource(null),\n resourceId: shareResource._id,\n moduleId: shareResource.module,\n title: `Share - ${shareResource.name}`,\n description: \"Grant access to this document.\",\n resourceName: shareResource.name,\n isResourceGroup: shareResource.isResourceGroup\n }\n )\n ] });\n}\nvar Select = forwardRef(\n ({ label, error, hint, options, placeholder, wrapperClassName, className, id, ...rest }, ref) => {\n const selectId = id ?? (label ? label.toLowerCase().replace(/\\s+/g, \"-\") : void 0);\n return /* @__PURE__ */ jsxs(\"div\", { className: cn(\"flex flex-col gap-1\", wrapperClassName), children: [\n label && /* @__PURE__ */ jsx(\"label\", { htmlFor: selectId, className: \"text-sm font-medium text-appsec-text\", children: label }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"relative flex items-center\", children: [\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n ref,\n id: selectId,\n className: cn(\n \"w-full h-9 appearance-none rounded-appsec border border-appsec-border bg-appsec-bg pl-3 pr-8 py-2\",\n \"text-sm text-appsec-text\",\n \"transition-colors outline-none\",\n \"focus:border-appsec-primary focus:ring-2 focus:ring-appsec-primary-light\",\n \"disabled:bg-appsec-surface disabled:cursor-not-allowed disabled:opacity-60\",\n error && \"border-appsec-danger focus:border-appsec-danger focus:ring-appsec-danger-light\",\n className\n ),\n ...rest,\n children: [\n placeholder && /* @__PURE__ */ jsx(\"option\", { value: \"\", disabled: true, children: placeholder }),\n options.map((opt) => /* @__PURE__ */ jsx(\"option\", { value: opt.value, disabled: opt.disabled, children: opt.label }, opt.value))\n ]\n }\n ),\n /* @__PURE__ */ jsx(\n ChevronDown,\n {\n className: \"absolute right-2.5 h-4 w-4 text-appsec-text-tertiary pointer-events-none\"\n }\n )\n ] }),\n error && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: error }),\n !error && hint && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-secondary\", children: hint })\n ] });\n }\n);\nSelect.displayName = \"Select\";\nfunction TableRoot({ children, className, ...rest }) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"w-full overflow-x-auto rounded-appsec border border-appsec-border\", children: /* @__PURE__ */ jsx(\n \"table\",\n {\n className: cn(\"w-full border-collapse text-sm\", className),\n ...rest,\n children\n }\n ) });\n}\nfunction TableHeader({ children, className, ...rest }) {\n return /* @__PURE__ */ jsx(\"thead\", { className: cn(\"bg-appsec-surface\", className), ...rest, children });\n}\nfunction TableBody({ children, className, ...rest }) {\n return /* @__PURE__ */ jsx(\"tbody\", { className: cn(\"divide-y divide-appsec-border bg-appsec-bg\", className), ...rest, children });\n}\nfunction TableRow({ children, className, ...rest }) {\n return /* @__PURE__ */ jsx(\n \"tr\",\n {\n className: cn(\"hover:bg-appsec-surface transition-colors\", className),\n ...rest,\n children\n }\n );\n}\nfunction TableHead({\n children,\n sortable = false,\n sortKey,\n sortState,\n onSort,\n className,\n ...rest\n}) {\n const isActive = sortState && sortKey && sortState.column === sortKey;\n const nextDirection = isActive && sortState.direction === \"asc\" ? \"desc\" : \"asc\";\n const handleClick = () => {\n if (sortable && sortKey && onSort) {\n onSort(sortKey, nextDirection);\n }\n };\n return /* @__PURE__ */ jsx(\n \"th\",\n {\n className: cn(\n \"px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-appsec-text-secondary\",\n sortable && \"cursor-pointer select-none hover:text-appsec-text\",\n className\n ),\n onClick: sortable ? handleClick : void 0,\n ...rest,\n children: /* @__PURE__ */ jsxs(\"span\", { className: \"inline-flex items-center gap-1\", children: [\n children,\n sortable && /* @__PURE__ */ jsx(\"span\", { className: \"text-appsec-text-tertiary\", children: isActive ? sortState.direction === \"asc\" ? /* @__PURE__ */ jsx(ChevronUp, { className: \"h-3.5 w-3.5\" }) : /* @__PURE__ */ jsx(ChevronDown, { className: \"h-3.5 w-3.5\" }) : /* @__PURE__ */ jsx(ChevronsUpDown, { className: \"h-3.5 w-3.5\" }) })\n ] })\n }\n );\n}\nfunction TableCell({ children, className, ...rest }) {\n return /* @__PURE__ */ jsx(\n \"td\",\n {\n className: cn(\"px-4 py-3 text-appsec-text align-middle\", className),\n ...rest,\n children\n }\n );\n}\nvar Table = Object.assign(TableRoot, {\n Header: TableHeader,\n Body: TableBody,\n Row: TableRow,\n Head: TableHead,\n Cell: TableCell\n});\nfunction DragList({\n items,\n onReorder,\n renderItem,\n keyExtractor = (item) => item.id,\n className,\n itemClassName\n}) {\n const [dragIndex, setDragIndex] = useState(null);\n const [overIndex, setOverIndex] = useState(null);\n const handleDragStart = useCallback((index) => {\n setDragIndex(index);\n }, []);\n const handleDragOver = useCallback(\n (e, index) => {\n e.preventDefault();\n if (index !== overIndex) setOverIndex(index);\n },\n [overIndex]\n );\n const handleDrop = useCallback(() => {\n if (dragIndex === null || overIndex === null || dragIndex === overIndex) {\n setDragIndex(null);\n setOverIndex(null);\n return;\n }\n const next = [...items];\n const [removed] = next.splice(dragIndex, 1);\n next.splice(overIndex, 0, removed);\n onReorder(next);\n setDragIndex(null);\n setOverIndex(null);\n }, [dragIndex, overIndex, items, onReorder]);\n const handleDragEnd = useCallback(() => {\n setDragIndex(null);\n setOverIndex(null);\n }, []);\n return /* @__PURE__ */ jsx(\"ul\", { className: cn(\"flex flex-col gap-1\", className), children: items.map((item, index) => /* @__PURE__ */ jsxs(\n \"li\",\n {\n draggable: true,\n onDragStart: () => handleDragStart(index),\n onDragOver: (e) => handleDragOver(e, index),\n onDrop: handleDrop,\n onDragEnd: handleDragEnd,\n className: cn(\n \"flex items-center gap-2 rounded-appsec border border-appsec-border bg-appsec-bg px-3 py-2\",\n \"transition-colors select-none\",\n dragIndex === index && \"opacity-40\",\n overIndex === index && dragIndex !== index && \"border-appsec-primary bg-appsec-primary-light\",\n itemClassName\n ),\n children: [\n /* @__PURE__ */ jsx(\"span\", { className: \"text-appsec-text-tertiary cursor-grab active:cursor-grabbing shrink-0\", children: /* @__PURE__ */ jsx(GripVertical, { className: \"h-4 w-4\" }) }),\n /* @__PURE__ */ jsx(\"div\", { className: \"flex-1 min-w-0\", children: renderItem(item, index) })\n ]\n },\n keyExtractor(item)\n )) });\n}\nvar LABELS7 = {\n dropHere: \"Drop files here, or click to browse\"};\nfunction DropZone({\n onDrop,\n accept,\n multiple = false,\n disabled = false,\n label = LABELS7.dropHere,\n hint,\n icon,\n className\n}) {\n const [isDragOver, setIsDragOver] = useState(false);\n const handleDragOver = useCallback((e) => {\n e.preventDefault();\n if (!disabled) setIsDragOver(true);\n }, [disabled]);\n const handleDragLeave = useCallback(() => {\n setIsDragOver(false);\n }, []);\n const handleDrop = useCallback(\n (e) => {\n e.preventDefault();\n setIsDragOver(false);\n if (disabled) return;\n if (e.dataTransfer.files.length > 0) {\n onDrop(e.dataTransfer.files);\n }\n },\n [disabled, onDrop]\n );\n const handleFileInput = useCallback(\n (e) => {\n if (e.target.files && e.target.files.length > 0) {\n onDrop(e.target.files);\n }\n },\n [onDrop]\n );\n return /* @__PURE__ */ jsxs(\n \"label\",\n {\n className: cn(\n \"flex flex-col items-center justify-center gap-3 rounded-appsec p-8 text-center\",\n \"border-2 border-dashed transition-colors cursor-pointer\",\n isDragOver ? \"border-appsec-primary bg-appsec-primary-light\" : \"border-appsec-border bg-appsec-surface hover:border-appsec-primary hover:bg-appsec-surface-alt\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n ),\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDrop: handleDrop,\n children: [\n /* @__PURE__ */ jsx(\"span\", { className: \"text-appsec-text-tertiary\", children: icon ?? /* @__PURE__ */ jsx(Upload, { className: \"h-8 w-8\" }) }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-1\", children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-sm font-medium text-appsec-text\", children: label }),\n hint && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-secondary\", children: hint })\n ] }),\n /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"file\",\n accept,\n multiple,\n disabled,\n onChange: handleFileInput,\n className: \"sr-only\"\n }\n )\n ]\n }\n );\n}\nvar PAGE_SIZE = 10;\nvar TYPE_OPTIONS2 = [\"all\", \"user\", \"group\"];\nvar getId2 = (value) => typeof value === \"string\" ? value : String(value?._id ?? value?.id ?? \"\");\nvar AddModal = memo(function AddModal2({\n open,\n onClose,\n resourceId,\n moduleId,\n roles,\n groups,\n mode,\n roleModuleMapping,\n createAcl,\n allAcls\n}) {\n const [localMode, setLocalMode] = useState(\n mode === \"groups\" ? \"group\" : \"user\"\n );\n const [selectedUsers, setSelectedUsers] = useState([]);\n const [inputValue, setInputValue] = useState(\"\");\n const [debouncedInput, setDebouncedInput] = useState(\"\");\n const [showDropdown, setShowDropdown] = useState(false);\n const [groupId, setGroupId] = useState(\"\");\n const [roleId, setRoleId] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const inputRef = useRef(null);\n const dropdownRef = useRef(null);\n const usersQuery = useUsersSearchQuery(debouncedInput);\n const suggestions = useMemo(\n () => (usersQuery.data || []).filter(\n (u) => !selectedUsers.some((s) => s.email === u.email)\n ),\n [usersQuery.data, selectedUsers]\n );\n const filteredRoles = useMemo(() => {\n if (!moduleId) return roles;\n return roles.filter(\n (role) => roleModuleMapping.some(\n (m) => m.roleId?._id === role._id && m.moduleId?._id === moduleId\n )\n );\n }, [roles, roleModuleMapping, moduleId]);\n useEffect(() => {\n if (open) {\n setLocalMode(mode === \"groups\" ? \"group\" : \"user\");\n setSelectedUsers([]);\n setInputValue(\"\");\n setDebouncedInput(\"\");\n setShowDropdown(false);\n setGroupId(\"\");\n setRoleId(\"\");\n setError(\"\");\n setLoading(false);\n }\n }, [open, mode]);\n useEffect(() => {\n const t = setTimeout(() => setDebouncedInput(inputValue.trim()), 300);\n return () => clearTimeout(t);\n }, [inputValue]);\n useEffect(() => {\n if (suggestions.length > 0 && inputValue.trim().length >= 2)\n setShowDropdown(true);\n else setShowDropdown(false);\n }, [suggestions, inputValue]);\n useEffect(() => {\n if (!showDropdown) return;\n const handler = (e) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target))\n setShowDropdown(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [showDropdown]);\n const addUser = (user) => {\n setSelectedUsers((prev) => [...prev, user]);\n setInputValue(\"\");\n setDebouncedInput(\"\");\n setShowDropdown(false);\n inputRef.current?.focus();\n };\n const addRawEmail = () => {\n const trimmed = inputValue.trim().toLowerCase();\n if (!trimmed || selectedUsers.some((u) => u.email === trimmed)) return;\n setSelectedUsers((prev) => [\n ...prev,\n { email: trimmed, displayName: trimmed }\n ]);\n setInputValue(\"\");\n setDebouncedInput(\"\");\n setShowDropdown(false);\n };\n const removeUser = (email) => setSelectedUsers((prev) => prev.filter((u) => u.email !== email));\n const handleKeyDown = (e) => {\n if ((e.key === \"Enter\" || e.key === \",\") && inputValue.trim()) {\n e.preventDefault();\n if (suggestions.length > 0) addUser(suggestions[0]);\n else addRawEmail();\n }\n if (e.key === \"Backspace\" && !inputValue && selectedUsers.length > 0)\n setSelectedUsers((prev) => prev.slice(0, -1));\n if (e.key === \"Escape\") setShowDropdown(false);\n };\n const submit = async () => {\n if (localMode === \"user\" && selectedUsers.length === 0) {\n setError(\"Add at least one email.\");\n return;\n }\n if (localMode === \"group\" && !groupId) {\n setError(\"Select a group.\");\n return;\n }\n if (!roleId) {\n setError(\"Select a role.\");\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n if (localMode === \"group\") {\n await createAcl({\n resource_type: moduleId || \"\",\n resource_id: resourceId,\n group_id: groupId,\n is_inherited: true,\n role: roleId\n });\n } else {\n const existingEmails = allAcls.map((a) => a.user_email);\n const newEmails = selectedUsers.map((u) => u.email).filter((e) => !existingEmails.includes(e));\n if (newEmails.length === 0) {\n setError(\"All selected users already have access.\");\n setLoading(false);\n return;\n }\n await Promise.all(\n newEmails.map(\n (email) => createAcl({\n resource_type: moduleId || \"\",\n resource_id: resourceId,\n user_email: email,\n is_inherited: false,\n role: roleId\n })\n )\n );\n }\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to grant access.\");\n } finally {\n setLoading(false);\n }\n };\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose,\n title: \"Add Access\",\n description: \"Grant access to this resource.\",\n size: \"sm\",\n footer: /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"sm\",\n onClick: onClose,\n disabled: loading,\n children: \"Cancel\"\n }\n ),\n /* @__PURE__ */ jsx(\n Button,\n {\n size: \"sm\",\n onClick: submit,\n loading,\n disabled: loading,\n children: localMode === \"group\" ? \"Add Group\" : \"Add Users\"\n }\n )\n ] }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-4\", children: [\n mode === \"both\" && /* @__PURE__ */ jsx(\"div\", { className: \"flex gap-1 p-1 rounded-appsec bg-appsec-surface border border-appsec-border\", children: [\"user\", \"group\"].map((m) => /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => {\n setLocalMode(m);\n setError(\"\");\n },\n className: cn(\n \"flex-1 py-1.5 text-xs font-medium rounded transition-colors capitalize\",\n localMode === m ? \"bg-appsec-bg text-appsec-text shadow-sm border border-appsec-border\" : \"text-appsec-text-secondary hover:text-appsec-text\"\n ),\n children: m === \"user\" ? \"By Email\" : \"By Group\"\n },\n m\n )) }),\n localMode === \"user\" ? /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Add people\" }),\n /* @__PURE__ */ jsxs(\"div\", { ref: dropdownRef, className: \"relative\", children: [\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"flex flex-wrap gap-1.5 p-2 min-h-10 rounded-appsec border bg-appsec-bg cursor-text transition-colors\",\n showDropdown ? \"border-appsec-primary\" : \"border-appsec-border\"\n ),\n onClick: () => inputRef.current?.focus(),\n children: [\n selectedUsers.map((u) => /* @__PURE__ */ jsx(\n Chip,\n {\n label: u.displayName !== u.email ? u.displayName : u.email,\n onRemove: () => removeUser(u.email)\n },\n u.email\n )),\n /* @__PURE__ */ jsx(\n \"input\",\n {\n ref: inputRef,\n type: \"text\",\n value: inputValue,\n onChange: (e) => setInputValue(e.target.value),\n onKeyDown: handleKeyDown,\n placeholder: selectedUsers.length === 0 ? \"Search by name or email\\u2026\" : \"\",\n className: \"flex-1 min-w-32 bg-transparent outline-none text-sm text-appsec-text placeholder:text-appsec-text-tertiary\"\n }\n ),\n usersQuery.isFetching && /* @__PURE__ */ jsx(\"span\", { className: \"self-center ml-1\", children: /* @__PURE__ */ jsxs(\n \"svg\",\n {\n className: \"animate-spin h-3.5 w-3.5 text-appsec-text-secondary\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n children: [\n /* @__PURE__ */ jsx(\n \"circle\",\n {\n className: \"opacity-25\",\n cx: \"12\",\n cy: \"12\",\n r: \"10\",\n stroke: \"currentColor\",\n strokeWidth: \"4\"\n }\n ),\n /* @__PURE__ */ jsx(\n \"path\",\n {\n className: \"opacity-75\",\n fill: \"currentColor\",\n d: \"M4 12a8 8 0 018-8v8H4z\"\n }\n )\n ]\n }\n ) })\n ]\n }\n ),\n showDropdown && suggestions.length > 0 && /* @__PURE__ */ jsx(\"div\", { className: \"absolute z-50 mt-1 w-full rounded-appsec border border-appsec-border bg-appsec-bg shadow-lg overflow-hidden\", children: suggestions.map((u) => /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onMouseDown: (e) => {\n e.preventDefault();\n addUser(u);\n },\n className: \"flex items-center gap-3 w-full px-3 py-2.5 text-left hover:bg-appsec-surface transition-colors\",\n children: [\n /* @__PURE__ */ jsx(Avatar, { name: u.displayName, size: \"sm\" }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col min-w-0\", children: [\n /* @__PURE__ */ jsx(\"span\", { className: \"text-sm font-medium text-appsec-text truncate\", children: u.displayName }),\n /* @__PURE__ */ jsx(\"span\", { className: \"text-xs text-appsec-text-secondary truncate\", children: u.email })\n ] })\n ]\n },\n u.email\n )) })\n ] }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary\", children: \"Press Enter or comma to add a raw email address.\" })\n ] }) : /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Group\" }),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: groupId,\n onChange: (e) => setGroupId(e.target.value),\n className: \"h-9 text-sm rounded-appsec border border-appsec-border bg-appsec-bg px-3 pr-8 appearance-none outline-none focus:border-appsec-primary text-appsec-text\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"Select group\\u2026\" }),\n groups.map((g) => /* @__PURE__ */ jsxs(\"option\", { value: g._id, children: [\n g.name,\n g.description ? ` \\u2014 ${g.description}` : \"\"\n ] }, g._id))\n ]\n }\n )\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Role\" }),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: roleId,\n onChange: (e) => setRoleId(e.target.value),\n className: \"h-9 text-sm rounded-appsec border border-appsec-border bg-appsec-bg px-3 pr-8 appearance-none outline-none focus:border-appsec-primary text-appsec-text\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"Select role\\u2026\" }),\n filteredRoles.map((r) => /* @__PURE__ */ jsx(\"option\", { value: r._id, children: r.name }, r._id))\n ]\n }\n )\n ] }),\n error && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: error })\n ] })\n }\n );\n});\nvar EditModal = memo(function EditModal2({\n open,\n onClose,\n entry,\n roles,\n groups,\n moduleId,\n roleModuleMapping,\n bulkUpdateAcl\n}) {\n const [roleId, setRoleId] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const filteredRoles = useMemo(() => {\n if (!moduleId) return roles;\n return roles.filter(\n (role) => roleModuleMapping.some(\n (m) => m.roleId?._id === role._id && m.moduleId?._id === moduleId\n )\n );\n }, [roles, roleModuleMapping, moduleId]);\n useEffect(() => {\n if (open && entry) {\n setRoleId(entry.role?._id || \"\");\n setError(\"\");\n setLoading(false);\n }\n }, [open, entry]);\n const submit = async () => {\n if (!entry || !roleId) {\n setError(\"Select a role.\");\n return;\n }\n setLoading(true);\n setError(\"\");\n try {\n await bulkUpdateAcl([{ _id: entry._id, role: roleId }]);\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to update role.\");\n } finally {\n setLoading(false);\n }\n };\n const isGroup = !!entry?.groupId;\n const groupName = isGroup ? groups.find((g) => g._id === entry?.groupId)?.name : null;\n const subject = isGroup ? groupName || \"Unknown Group\" : entry?.user_email || \"\";\n return /* @__PURE__ */ jsx(\n Modal,\n {\n open,\n onClose,\n title: \"Edit Role\",\n size: \"sm\",\n footer: /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n Button,\n {\n variant: \"secondary\",\n size: \"sm\",\n onClick: onClose,\n disabled: loading,\n children: \"Cancel\"\n }\n ),\n /* @__PURE__ */ jsx(\n Button,\n {\n size: \"sm\",\n onClick: submit,\n loading,\n disabled: loading || !roleId,\n children: \"Save\"\n }\n )\n ] }),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"space-y-4\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2 p-2 rounded-appsec bg-appsec-surface\", children: [\n /* @__PURE__ */ jsx(Avatar, { name: subject, size: \"sm\" }),\n /* @__PURE__ */ jsxs(\"div\", { children: [\n /* @__PURE__ */ jsx(\"p\", { className: \"text-sm font-medium text-appsec-text\", children: subject }),\n /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-secondary\", children: isGroup ? \"Group\" : \"User\" })\n ] })\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [\n /* @__PURE__ */ jsx(\"label\", { className: \"text-sm font-medium text-appsec-text\", children: \"Role\" }),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: roleId,\n onChange: (e) => setRoleId(e.target.value),\n className: \"h-9 text-sm rounded-appsec border border-appsec-border bg-appsec-bg px-3 pr-8 appearance-none outline-none focus:border-appsec-primary text-appsec-text\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"Select role\\u2026\" }),\n filteredRoles.map((r) => /* @__PURE__ */ jsx(\"option\", { value: r._id, children: r.name }, r._id))\n ]\n }\n )\n ] }),\n error && /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-danger\", children: error })\n ] })\n }\n );\n});\nvar AccessListPanel = memo(function AccessListPanel2({\n resourceId,\n moduleId,\n mode = \"both\",\n canAddUser = false,\n canEditUser = false,\n canDeleteUser = false,\n canAddGroup = false,\n canEditGroup = false,\n canDeleteGroup = false\n}) {\n const uPerms = {\n canAdd: canAddUser,\n canEdit: canEditUser,\n canDelete: canDeleteUser,\n canBulkEdit: canEditUser\n };\n const gPerms = {\n canAdd: canAddGroup,\n canEdit: canEditGroup,\n canDelete: canDeleteGroup,\n canBulkEdit: canEditGroup\n };\n const { appId } = useAppsec();\n const toast = useToast();\n const appQuery = useAppQuery(appId);\n const appMongoId = appQuery.data?.data?.[0]?._id || \"\";\n const aclsQuery = useAclsQuery(appMongoId, resourceId);\n const rolesQuery = useAllRolesQuery(appMongoId);\n const groupsQuery = useGroupsQuery(appMongoId);\n const roleModuleMappingQuery = useRoleModuleMappingQuery(appMongoId);\n const createAclMutation = useCreateAclMutation();\n const deleteAclMutation = useDeleteAclMutation();\n const bulkUpdateAclMutation = useBulkUpdateAclMutation();\n const allAcls = aclsQuery.data?.data || [];\n const roles = rolesQuery.data?.data || [];\n const groups = groupsQuery.data?.data || [];\n const roleModuleMapping = roleModuleMappingQuery.data?.data || [];\n const entries = allAcls;\n const resolvedModuleId = useMemo(() => {\n if (moduleId) return moduleId;\n const existing = entries.find((e) => e.resourceType);\n return getId2(existing?.resourceType);\n }, [moduleId, entries]);\n const [selected, setSelected] = useState(/* @__PURE__ */ new Set());\n const [bulkRole, setBulkRole] = useState(\"\");\n const [removing, setRemoving] = useState(null);\n const [bulkLoading, setBulkLoading] = useState(false);\n const [confirmRemove, setConfirmRemove] = useState(null);\n const [page, setPage] = useState(0);\n const [search, setSearch] = useState(\"\");\n const debouncedSearch = useDebouncedValue(search.trim(), 300);\n const [roleFilter, setRoleFilter] = useState(\"\");\n const [typeFilter, setTypeFilter] = useState(\"all\");\n const [addModalOpen, setAddModalOpen] = useState(false);\n const [editEntry, setEditEntry] = useState(null);\n useEffect(() => {\n if (mode === \"users\") setTypeFilter(\"user\");\n else if (mode === \"groups\") setTypeFilter(\"group\");\n else setTypeFilter(\"all\");\n }, [mode]);\n const filteredRoles = useMemo(() => {\n if (!resolvedModuleId) return roles;\n return roles.filter(\n (role) => roleModuleMapping.some(\n (m) => m.roleId?._id === role._id && m.moduleId?._id === resolvedModuleId\n )\n );\n }, [roles, roleModuleMapping, resolvedModuleId]);\n const isGroupEntry = (entry) => !!entry.groupId;\n const groupFor = (groupId) => groups.find((g) => g._id === groupId);\n const normalizedEntries = useMemo(\n () => entries.map((e) => ({\n ...e,\n id: e.id || e._id\n })),\n [entries]\n );\n const availableRoles = useMemo(\n () => [\n ...new Set(normalizedEntries.map((e) => e.role?.name).filter(Boolean))\n ].sort(),\n [normalizedEntries]\n );\n const visibleEntries = useMemo(() => {\n let result = normalizedEntries;\n if (typeFilter !== \"all\") {\n result = result.filter(\n (e) => typeFilter === \"group\" ? isGroupEntry(e) : !isGroupEntry(e)\n );\n }\n if (roleFilter) {\n result = result.filter((e) => e.role?.name === roleFilter);\n }\n if (debouncedSearch) {\n result = result.filter((e) => {\n const group = isGroupEntry(e) ? groupFor(e.groupId) : null;\n return matchesAny(debouncedSearch, [\n isGroupEntry(e) ? group?.name : e.user_email,\n isGroupEntry(e) ? \"group\" : \"user\",\n group?.description,\n e.user_email,\n e.role?.name,\n e.grantedBy ? decodeURIComponent(e.grantedBy) : \"\",\n e.grantedAt,\n e.resourceId\n ]);\n });\n }\n return result;\n }, [normalizedEntries, typeFilter, roleFilter, debouncedSearch]);\n useEffect(() => {\n setPage(0);\n }, [search, roleFilter, typeFilter, resourceId]);\n const totalPages = Math.max(1, Math.ceil(visibleEntries.length / PAGE_SIZE));\n const pageEntries = useMemo(\n () => visibleEntries.slice(page * PAGE_SIZE, (page + 1) * PAGE_SIZE),\n [visibleEntries, page]\n );\n const allPageSelected = useMemo(\n () => pageEntries.length > 0 && pageEntries.every((e) => selected.has(e.id)),\n [pageEntries, selected]\n );\n const toggleAll = useCallback(\n () => setSelected((s) => {\n const n = new Set(s);\n if (allPageSelected) pageEntries.forEach((e) => n.delete(e.id));\n else pageEntries.forEach((e) => n.add(e.id));\n return n;\n }),\n [allPageSelected, pageEntries]\n );\n const toggleOne = (id) => setSelected((s) => {\n const n = new Set(s);\n n.has(id) ? n.delete(id) : n.add(id);\n return n;\n });\n const handleRemove = async (entryId) => {\n setRemoving(entryId);\n try {\n await deleteAclMutation.mutateAsync(entryId);\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Failed to remove access.\"\n );\n } finally {\n setRemoving(null);\n setConfirmRemove(null);\n }\n };\n const handleBulkApply = async () => {\n if (!bulkRole || selected.size === 0) return;\n setBulkLoading(true);\n try {\n const payload = [...selected].map((id) => ({ _id: id, role: bulkRole }));\n await bulkUpdateAclMutation.mutateAsync(payload);\n setSelected(/* @__PURE__ */ new Set());\n setBulkRole(\"\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Failed to update roles.\"\n );\n } finally {\n setBulkLoading(false);\n }\n };\n const isLoading = appQuery.isLoading || aclsQuery.isLoading || rolesQuery.isLoading || groupsQuery.isLoading;\n if (isLoading) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"flex items-center justify-center py-8 text-appsec-text-secondary text-sm\", children: \"Loading\\u2026\" });\n }\n const showAddUser = mode !== \"groups\" && uPerms.canAdd;\n const showAddGroup = mode !== \"users\" && gPerms.canAdd;\n const showAddButton = showAddUser || showAddGroup;\n const showBulkCheckbox = uPerms.canBulkEdit || gPerms.canBulkEdit;\n const addModalMode = showAddUser && showAddGroup ? \"both\" : showAddGroup ? \"groups\" : \"users\";\n return /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2 flex-wrap\", children: [\n /* @__PURE__ */ jsx(\n SearchBar,\n {\n value: search,\n onChange: setSearch,\n placeholder: \"Search by email or group name\\u2026\",\n className: \"flex-1 min-w-40\"\n }\n ),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: roleFilter,\n onChange: (e) => setRoleFilter(e.target.value),\n className: \"h-8 text-xs rounded-appsec border border-appsec-border bg-appsec-bg px-2 pr-6 appearance-none outline-none focus:border-appsec-primary text-appsec-text\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"All Roles\" }),\n availableRoles.map((r) => /* @__PURE__ */ jsx(\"option\", { value: r, children: r }, r))\n ]\n }\n ),\n mode === \"both\" && /* @__PURE__ */ jsx(\"div\", { className: \"flex gap-0.5 p-0.5 rounded-appsec bg-appsec-surface border border-appsec-border\", children: TYPE_OPTIONS2.map((t) => /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setTypeFilter(t),\n className: cn(\n \"px-2.5 py-1 text-[11px] font-medium rounded capitalize transition-colors\",\n typeFilter === t ? \"bg-appsec-bg text-appsec-text shadow-sm border border-appsec-border\" : \"text-appsec-text-secondary hover:text-appsec-text\"\n ),\n children: t\n },\n t\n )) }),\n showAddButton && /* @__PURE__ */ jsxs(\n Button,\n {\n size: \"sm\",\n iconLeft: /* @__PURE__ */ jsx(Plus, { className: \"h-3.5 w-3.5\" }),\n onClick: () => setAddModalOpen(true),\n children: [\n \"Add \",\n showAddGroup && !showAddUser ? \"Group\" : \"User\"\n ]\n }\n )\n ] }),\n selected.size > 0 && showBulkCheckbox && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-2 px-3 py-2 rounded-appsec bg-appsec-primary-light border border-appsec-primary/30\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-xs font-semibold text-appsec-primary\", children: [\n selected.size,\n \" selected\"\n ] }),\n /* @__PURE__ */ jsxs(\n \"select\",\n {\n value: bulkRole,\n onChange: (e) => setBulkRole(e.target.value),\n className: \"h-7 text-xs rounded-appsec border px-2\",\n children: [\n /* @__PURE__ */ jsx(\"option\", { value: \"\", children: \"Change role\\u2026\" }),\n filteredRoles.map((r) => /* @__PURE__ */ jsx(\"option\", { value: r._id, children: r.name }, r._id))\n ]\n }\n ),\n /* @__PURE__ */ jsx(\n Button,\n {\n size: \"sm\",\n variant: \"secondary\",\n disabled: !bulkRole || bulkLoading,\n onClick: handleBulkApply,\n children: \"Apply\"\n }\n ),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n onClick: () => setSelected(/* @__PURE__ */ new Set()),\n className: \"text-xs ml-auto\",\n children: \"\\u2715 Clear\"\n }\n )\n ] }),\n /* @__PURE__ */ jsx(\"div\", { className: \"border rounded-appsec overflow-hidden\", children: /* @__PURE__ */ jsx(\"div\", { className: \"overflow-x-auto\", children: /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col divide-y min-w-[640px]\", children: [\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-3 px-3 py-2 bg-appsec-surface\", children: [\n showBulkCheckbox && /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n checked: allPageSelected,\n onChange: toggleAll,\n className: \"shrink-0\"\n }\n ),\n /* @__PURE__ */ jsx(\"span\", { className: \"min-w-0 flex-1 text-xs font-semibold\", children: \"Subject\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"w-14 shrink-0 text-xs font-semibold\", children: \"Type\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"w-36 shrink-0 text-xs font-semibold\", children: \"Role\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"w-28 shrink-0 text-xs font-semibold\", children: \"Granted\" }),\n /* @__PURE__ */ jsx(\"span\", { className: \"w-32 shrink-0 text-xs font-semibold\", children: \"Granted By\" }),\n (uPerms.canEdit || gPerms.canEdit) && /* @__PURE__ */ jsx(\"span\", { className: \"w-8 shrink-0\" }),\n (uPerms.canDelete || gPerms.canDelete) && /* @__PURE__ */ jsx(\"span\", { className: \"w-8 shrink-0\" })\n ] }),\n normalizedEntries.length === 0 ? /* @__PURE__ */ jsxs(\"p\", { className: \"text-xs text-appsec-text-tertiary py-4 text-center\", children: [\n \"No one has access yet.\",\n showAddButton ? \" Use Add to grant access.\" : \"\"\n ] }) : pageEntries.length === 0 ? /* @__PURE__ */ jsx(\"p\", { className: \"text-xs text-appsec-text-tertiary py-4 text-center\", children: \"No results match your filters.\" }) : pageEntries.map((entry) => {\n const isSelected = selected.has(entry.id);\n const group = groupFor(entry.groupId);\n const isGroup = isGroupEntry(entry);\n const perms = isGroup ? gPerms : uPerms;\n const canCheck = perms.canBulkEdit;\n const canEdit = perms.canEdit;\n const canDelete = perms.canDelete;\n const subjectLabel = isGroup ? group?.name || \"Unknown Group\" : entry.user_email;\n const subjectDetail = isGroup ? `${group?.users?.length || 0} members` : entry.user_email;\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"flex min-w-0 items-center gap-3 px-3 py-2\",\n isSelected && \"bg-appsec-primary-light\"\n ),\n children: [\n showBulkCheckbox && /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n checked: isSelected,\n disabled: !canCheck,\n onChange: () => canCheck && toggleOne(entry.id),\n className: \"shrink-0 disabled:opacity-30\"\n }\n ),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex min-w-0 flex-1 items-center gap-2\", children: [\n /* @__PURE__ */ jsx(\n Avatar,\n {\n name: subjectLabel,\n size: \"xs\"\n }\n ),\n /* @__PURE__ */ jsxs(\"div\", { className: \"min-w-0\", children: [\n /* @__PURE__ */ jsx(Tooltip, { label: subjectLabel, className: \"w-full min-w-0\", children: /* @__PURE__ */ jsx(\"span\", { className: \"truncate text-xs font-medium block\", children: subjectLabel }) }),\n /* @__PURE__ */ jsx(Tooltip, { label: subjectDetail, className: \"w-full min-w-0\", children: /* @__PURE__ */ jsx(\"span\", { className: \"truncate text-[10px] text-gray-500 block\", children: subjectDetail }) })\n ] })\n ] }),\n /* @__PURE__ */ jsx(\"div\", { className: \"w-14 shrink-0\", children: /* @__PURE__ */ jsx(Badge, { label: isGroup ? \"Group\" : \"User\", variant: \"neutral\" }) }),\n /* @__PURE__ */ jsx(\"div\", { className: \"w-36 min-w-0 shrink-0\", children: /* @__PURE__ */ jsx(\n Badge,\n {\n label: entry.role?.name || \"\\u2014\",\n variant: \"neutral\",\n className: \"max-w-full whitespace-normal break-words rounded-xl px-3 py-2 text-left leading-snug\"\n }\n ) }),\n /* @__PURE__ */ jsx(\"div\", { className: \"w-28 shrink-0 text-[10px] text-gray-500\", children: new Date(entry.grantedAt).toLocaleDateString() }),\n /* @__PURE__ */ jsx(\n Tooltip,\n {\n label: entry.grantedBy ? decodeURIComponent(entry.grantedBy) : \"\\u2014\",\n className: \"w-32 shrink-0 min-w-0\",\n children: /* @__PURE__ */ jsx(\"span\", { className: \"truncate text-[10px] text-appsec-text-secondary block w-full\", children: entry.grantedBy ? decodeURIComponent(entry.grantedBy) : \"\\u2014\" })\n }\n ),\n (uPerms.canEdit || gPerms.canEdit) && (canEdit ? /* @__PURE__ */ jsx(\n \"button\",\n {\n onClick: () => setEditEntry(entry),\n className: \"w-8 shrink-0 text-appsec-text-secondary hover:text-appsec-text transition-colors rounded-appsec\",\n children: /* @__PURE__ */ jsx(Pencil, { className: \"h-3.5 w-3.5\" })\n }\n ) : /* @__PURE__ */ jsx(\"span\", { className: \"w-8 shrink-0\" })),\n (uPerms.canDelete || gPerms.canDelete) && (canDelete ? /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: removing === entry.id,\n onClick: () => setConfirmRemove(entry.id),\n className: \"w-8 shrink-0 text-appsec-danger hover:text-appsec-danger/80 disabled:opacity-50 transition-colors\",\n children: /* @__PURE__ */ jsx(Trash2, { className: \"h-3.5 w-3.5\" })\n }\n ) : /* @__PURE__ */ jsx(\"span\", { className: \"w-8 shrink-0\" }))\n ]\n },\n entry.id\n );\n })\n ] }) }) }),\n totalPages > 1 && /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center justify-between px-1\", children: [\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-tertiary\", children: [\n page * PAGE_SIZE + 1,\n \"\\u2013\",\n Math.min((page + 1) * PAGE_SIZE, visibleEntries.length),\n \" of\",\n \" \",\n visibleEntries.length,\n visibleEntries.length !== normalizedEntries.length && ` (filtered from ${normalizedEntries.length})`\n ] }),\n /* @__PURE__ */ jsxs(\"div\", { className: \"flex items-center gap-1\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setPage((p) => Math.max(0, p - 1)),\n disabled: page === 0,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronLeft, { className: \"h-3.5 w-3.5\" })\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"text-[11px] text-appsec-text-secondary px-1\", children: [\n page + 1,\n \" / \",\n totalPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n onClick: () => setPage((p) => Math.min(totalPages - 1, p + 1)),\n disabled: page >= totalPages - 1,\n className: \"p-1 rounded-appsec text-appsec-text-secondary hover:text-appsec-text disabled:opacity-30 transition-colors\",\n children: /* @__PURE__ */ jsx(ChevronRight, { className: \"h-3.5 w-3.5\" })\n }\n )\n ] })\n ] }),\n /* @__PURE__ */ jsx(\n ConfirmDialog,\n {\n open: !!confirmRemove,\n onClose: () => setConfirmRemove(null),\n onConfirm: () => confirmRemove && handleRemove(confirmRemove),\n title: \"Remove access\",\n message: \"Remove this subject's access?\",\n confirmLabel: \"Remove\",\n variant: \"danger\",\n loading: removing !== null\n }\n ),\n /* @__PURE__ */ jsx(\n AddModal,\n {\n open: addModalOpen,\n onClose: () => setAddModalOpen(false),\n resourceId,\n moduleId: resolvedModuleId,\n roles,\n groups,\n mode: addModalMode,\n roleModuleMapping,\n createAcl: (data) => createAclMutation.mutateAsync(data),\n allAcls\n }\n ),\n /* @__PURE__ */ jsx(\n EditModal,\n {\n open: !!editEntry,\n onClose: () => setEditEntry(null),\n entry: editEntry,\n roles,\n groups,\n moduleId: resolvedModuleId,\n roleModuleMapping,\n bulkUpdateAcl: (data) => bulkUpdateAclMutation.mutateAsync(data)\n }\n )\n ] });\n});\nvar ICONS2 = {\n \"application-access\": /* @__PURE__ */ jsx(Layers, { className: \"h-4 w-4\" }),\n \"rbac-management\": /* @__PURE__ */ jsx(Shield, { className: \"h-4 w-4\" })\n};\nfunction AccessControlSidebar({\n items,\n activeKey,\n onChange,\n className,\n classNames = {},\n title,\n description,\n showWhenSingle = false\n}) {\n const visibleItems = items.filter((item) => !item.hidden);\n if (visibleItems.length === 0 || visibleItems.length === 1 && !showWhenSingle) {\n return null;\n }\n return /* @__PURE__ */ jsxs(\n \"aside\",\n {\n className: cn(\n \"w-60 shrink-0 border-r border-appsec-border bg-appsec-bg p-3\",\n className,\n classNames.sidebarContainer\n ),\n children: [\n (title || description) && /* @__PURE__ */ jsxs(\"div\", { className: cn(\"mb-5\", classNames.sidebarHeader), children: [\n title && /* @__PURE__ */ jsx(\n \"p\",\n {\n className: cn(\n \"text-sm font-semibold text-appsec-text\",\n classNames.sidebarTitle\n ),\n children: title\n }\n ),\n description && /* @__PURE__ */ jsx(\n \"p\",\n {\n className: cn(\n \"mt-1 text-xs text-appsec-text-secondary\",\n classNames.sidebarDescription\n ),\n children: description\n }\n )\n ] }),\n /* @__PURE__ */ jsx(\n \"nav\",\n {\n className: cn(\n \"flex flex-col gap-1\",\n classNames.sidebarNav\n ),\n children: visibleItems.map((item) => {\n const isActive = item.key === activeKey;\n const icon = item.icon === void 0 ? ICONS2[item.key] : item.icon;\n return /* @__PURE__ */ jsxs(\n \"button\",\n {\n type: \"button\",\n onClick: () => onChange(item.key),\n className: cn(\n \"flex min-w-0 items-start gap-3 rounded-appsec px-4 py-3 text-left transition-colors\",\n isActive ? \"border border-appsec-border bg-appsec-bg text-appsec-text shadow-sm\" : \"text-appsec-text-secondary hover:bg-appsec-surface hover:text-appsec-text\",\n classNames.navItem,\n isActive ? classNames.activeNavItem : classNames.inactiveNavItem\n ),\n children: [\n icon !== false && /* @__PURE__ */ jsx(\"span\", { className: \"mt-0.5 shrink-0 text-appsec-text-secondary\", children: icon }),\n /* @__PURE__ */ jsxs(\"span\", { className: cn(\"min-w-0\", classNames.navContent), children: [\n /* @__PURE__ */ jsx(\n \"span\",\n {\n className: cn(\n \"block truncate text-sm font-semibold\",\n classNames.navLabel\n ),\n children: item.label\n }\n ),\n item.description && /* @__PURE__ */ jsx(\n \"span\",\n {\n className: cn(\n \"mt-0.5 block text-xs leading-snug text-appsec-text-tertiary\",\n classNames.navDescription\n ),\n children: item.description\n }\n )\n ] })\n ]\n },\n item.key\n );\n })\n }\n )\n ]\n }\n );\n}\nvar DEFAULT_RESTRICTED_FALLBACK = /* @__PURE__ */ jsx(\"div\", { className: \"flex min-h-56 items-center justify-center rounded-appsec border border-appsec-border bg-appsec-surface text-sm text-appsec-text-secondary\", children: \"You do not have permission to view access control.\" });\nvar DEFAULT_LOADING_FALLBACK = /* @__PURE__ */ jsx(\"div\", { className: \"flex min-h-56 items-center justify-center rounded-appsec border border-appsec-border bg-appsec-surface text-sm text-appsec-text-secondary\", children: \"Loading access control...\" });\nfunction getFirstVisibleSection(props, preferred) {\n const showApplicationAccess = props.showApplicationAccess === true;\n const showRBACManagement = props.showRBACManagement === true;\n if (preferred === \"application-access\" && showApplicationAccess) return preferred;\n if (preferred === \"rbac-management\" && showRBACManagement) return preferred;\n if (showApplicationAccess) return \"application-access\";\n return \"rbac-management\";\n}\nfunction AccessControl(props) {\n const { appId } = useAppsec();\n const [activeSection, setActiveSection] = useState(\n () => getFirstVisibleSection(props, props.defaultSection)\n );\n const sidebarItems = useMemo(() => {\n const DEFAULT_ORDER = [\n \"application-access\",\n \"rbac-management\"\n ];\n const itemDefs = {\n \"application-access\": {\n key: \"application-access\",\n label: props.sidebarItems?.[\"application-access\"]?.title ?? \"Application Access\",\n description: props.sidebarItems?.[\"application-access\"]?.description ?? \"Manage users and groups for this application.\",\n pageTitle: props.sidebarItems?.[\"application-access\"]?.pageTitle,\n pageDescription: props.sidebarItems?.[\"application-access\"]?.pageDescription,\n pageTitleClassName: props.sidebarItems?.[\"application-access\"]?.pageTitleClassName,\n pageDescriptionClassName: props.sidebarItems?.[\"application-access\"]?.pageDescriptionClassName,\n icon: props.sidebarItems?.[\"application-access\"]?.icon,\n hidden: props.showApplicationAccess !== true\n },\n \"rbac-management\": {\n key: \"rbac-management\",\n label: props.sidebarItems?.[\"rbac-management\"]?.title ?? \"RBAC Management\",\n description: props.sidebarItems?.[\"rbac-management\"]?.description ?? \"Manage access across application modules.\",\n pageTitle: props.sidebarItems?.[\"rbac-management\"]?.pageTitle,\n pageDescription: props.sidebarItems?.[\"rbac-management\"]?.pageDescription,\n pageTitleClassName: props.sidebarItems?.[\"rbac-management\"]?.pageTitleClassName,\n pageDescriptionClassName: props.sidebarItems?.[\"rbac-management\"]?.pageDescriptionClassName,\n icon: props.sidebarItems?.[\"rbac-management\"]?.icon,\n hidden: props.showRBACManagement !== true\n }\n };\n const configuredOrder = props.sidebarItems ? Object.keys(props.sidebarItems) : DEFAULT_ORDER;\n const orderedKeys = [\n ...configuredOrder,\n ...DEFAULT_ORDER.filter((k) => !configuredOrder.includes(k))\n ];\n return orderedKeys.map((key) => itemDefs[key]);\n }, [\n props.showApplicationAccess,\n props.showRBACManagement,\n props.sidebarItems\n ]);\n useEffect(() => {\n const currentItem = sidebarItems.find((item) => item.key === activeSection);\n if (currentItem && !currentItem.hidden) return;\n const nextItem = sidebarItems.find((item) => !item.hidden);\n if (nextItem) setActiveSection(nextItem.key);\n }, [activeSection, sidebarItems]);\n if (props.isLoading) {\n return /* @__PURE__ */ jsx(Fragment, { children: props.loadingFallback ?? DEFAULT_LOADING_FALLBACK });\n }\n if (props.isRestricted) {\n return /* @__PURE__ */ jsx(Fragment, { children: props.restrictedFallback ?? DEFAULT_RESTRICTED_FALLBACK });\n }\n const permissions = props.permissions ?? {};\n const hasVisibleSection = sidebarItems.some((item) => !item.hidden);\n const activeSidebarItem = sidebarItems.find((item) => item.key === activeSection);\n const pageTitle = activeSidebarItem?.pageTitle ?? props.title ?? activeSidebarItem?.label ?? \"Access Control\";\n const pageDescription = activeSidebarItem?.pageDescription ?? props.description ?? `Manage access for ${appId}.`;\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"flex min-h-[560px] flex-row overflow-hidden rounded-appsec border border-appsec-border bg-appsec-bg font-appsec\",\n props.className,\n props.classNames?.pageContainer\n ),\n children: [\n /* @__PURE__ */ jsx(\n AccessControlSidebar,\n {\n items: sidebarItems,\n activeKey: activeSection,\n onChange: setActiveSection,\n classNames: props.classNames?.sidebar,\n title: props.sidebarTitle,\n description: props.sidebarDescription,\n showWhenSingle: props.showSidebarWhenSingle\n }\n ),\n /* @__PURE__ */ jsx(\n \"main\",\n {\n className: cn(\n \"min-w-0 flex-1 bg-appsec-bg p-4\",\n props.classNames?.contentPanel\n ),\n children: /* @__PURE__ */ jsxs(\"div\", { className: \"flex flex-col h-full rounded-appsec border border-appsec-border overflow-hidden\", children: [\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"border-b border-appsec-border px-5 py-4\",\n props.classNames?.pageHeader\n ),\n children: [\n /* @__PURE__ */ jsx(\n \"h1\",\n {\n className: cn(\n \"text-xl font-bold text-appsec-text\",\n props.classNames?.pageTitle,\n activeSidebarItem?.pageTitleClassName\n ),\n children: pageTitle\n }\n ),\n pageDescription && /* @__PURE__ */ jsx(\n \"p\",\n {\n className: cn(\n \"mt-1 text-sm text-appsec-text-secondary\",\n props.classNames?.pageDescription,\n activeSidebarItem?.pageDescriptionClassName\n ),\n children: pageDescription\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: cn(\n \"p-4 flex-1 overflow-y-auto\",\n props.classNames?.contentArea\n ),\n children: [\n !hasVisibleSection && /* @__PURE__ */ jsx(\"div\", { className: \"flex min-h-40 items-center justify-center rounded-appsec border border-appsec-border bg-appsec-surface text-sm text-appsec-text-secondary\", children: \"No access control sections are enabled.\" }),\n activeSection === \"application-access\" && props.showApplicationAccess === true && (props.resourceId ? /* @__PURE__ */ jsx(\n AccessListPanel,\n {\n resourceId: props.resourceId,\n moduleId: props.moduleId,\n mode: props.accessMode ?? \"both\",\n canAddUser: permissions.canAddUser,\n canEditUser: permissions.canEditUser,\n canDeleteUser: permissions.canDeleteUser,\n canAddGroup: permissions.canAddGroup,\n canEditGroup: permissions.canEditGroup,\n canDeleteGroup: permissions.canDeleteGroup\n }\n ) : /* @__PURE__ */ jsx(\"div\", { className: \"flex min-h-40 items-center justify-center rounded-appsec border border-appsec-border bg-appsec-surface text-sm text-appsec-text-secondary\", children: \"No resource selected.\" })),\n activeSection === \"rbac-management\" && props.showRBACManagement === true && /* @__PURE__ */ jsx(RBACManagement, {})\n ]\n }\n )\n ] })\n }\n )\n ]\n }\n );\n}\nvar AccessControlPage = AccessControl;\n\nexport { AccessControl, AccessControlPage, AccessListPanel, AppRegistration, AppsecProvider, Avatar, Badge, Button, Chip, ConfigTab, ConfirmDialog, CsvImportButton, DragList, DropZone, EmptyState, Input, Modal, ModuleTabContent, OnboardingStepper, RBACConfiguration, RBACManagement, RbacQueryProvider, SearchBar, Select, ShareAccessModal, TabPanel, Table, Tabs, ToastProvider, UserGroupsTab, queryClient, useAppsec, useToast };\n//# sourceMappingURL=index.mjs.map\n//# sourceMappingURL=index.mjs.map"],"names":["queryClient","QueryClient","defaultOptions","queries","staleTime","gcTime","retry","failureCount","error","Error","message","includes","refetchOnWindowFocus","refetchOnMount","refetchOnReconnect","mutations","RbacQueryProvider","children","jsx","QueryClientProvider","client","cn","inputs","twMerge","clsx","ToastContext","createContext","ICONS","success","CheckCircle","className","XCircle","info","Info","STYLES","ToastEntry","toast","onDismiss","visible","setVisible","useState","useEffect","raf","requestAnimationFrame","cancelAnimationFrame","t","setTimeout","clearTimeout","jsxs","type","onClick","X","ToastProvider","toasts","setToasts","addToast","useCallback","id","Math","random","toString","slice","prev","removeToast","filter","Provider","value","map","useToast","ctx","useContext","DEFAULT_BADGE_COLORS","admin","bg","text","editor","viewer","AppsecContext","useAppsec","variantClasses","primary","secondary","danger","ghost","link","sizeClasses","sm","md","lg","Button","forwardRef","variant","size","loading","iconLeft","iconRight","disabled","rest","ref","isDisabled","displayName","Input","label","hint","wrapperClassName","lscId","lscLabel","lscDescription","lscWhenToApply","lscWhenNotToApply","inputId","toLowerCase","replace","htmlFor","sizeClasses2","xs","COLORS","getColor","name","hash","i","length","charCodeAt","abs","getInitials","parts","trim","split","toUpperCase","Avatar","src","alt","variantMap","neutral","Badge","bgClass","textClass","Chip","onRemove","icon","sizeClasses3","xl","Modal","open","onClose","title","description","footer","overlayRef","useRef","onKey","e","key","document","addEventListener","removeEventListener","role","LABELS6","ConfirmDialog","onConfirm","confirmLabel","cancelLabel","Fragment","AlertTriangle","SearchBar","onChange","onClear","placeholder","Search","target","matchesAny","query","values","matches","trimmed","regex","RegExp","test","String","normalized","createSearchMatcher","some","useDebouncedValue","delay","debouncedValue","setDebouncedValue","timeout","rbacQueryKeys","appId","resourceId","moduleId","useAppQuery","adapter","useQuery","queryKey","queryFn","getAppId","enabled","useAllRolesQuery","appMongoId","async","first","getRoles","totalPages","pagination","remaining","Array","from","_","results","batch","pages","Promise","all","page","push","data","flatMap","r","useRoleModuleMappingQuery","getRoleModuleMapping","useGroupsQuery","getGroups","useUsersSearchQuery","appsecUrl","res","fetch","encodeURIComponent","method","credentials","json","u","email","firstname","lastname","useCreateAclMutation","queryClient2","useQueryClient","useMutation","mutationFn","createAcl","onSuccess","invalidateQueries","onError","useResourcesPaginatedQuery","limit","getResourceForModuleId","placeholderData","getPaginationTotalItems","fallback","Number","totalItems","total","getPaginationTotalPages","pageSize","ceil","memo","resource","roles","groups","onShare","onSearchUsers","roleModuleMapping","mode","setMode","selectedUsers","setSelectedUsers","inputValue","setInputValue","suggestions","setSuggestions","showDropdown","setShowDropdown","searching","setSearching","inputRef","dropdownRef","groupId","setGroupId","roleId","setRoleId","setLoading","setError","submittingRef","isSubmitting","setIsSubmitting","buttonDisabled","setButtonDisabled","filteredRoles","useMemo","m","_id","module","current","timer","s","handler","contains","addUser","user","focus","preventDefault","stopPropagation","submit","activeElement","removeUser","onKeyDown","addRawEmail","onFocus","fill","viewBox","cx","cy","stroke","strokeWidth","d","onMouseDown","g","TYPE_OPTIONS","AccessList","entries","users","onBulkRoleChange","selected","setSelected","Set","bulkRole","setBulkRole","removing","setRemoving","bulkLoading","setBulkLoading","confirmRemove","setConfirmRemove","aclPage","setAclPage","search","setSearch","debouncedSearch","roleFilter","setRoleFilter","typeFilter","setTypeFilter","isGroupEntry","entry","groupFor","find","normalizedEntries","availableRoles","Boolean","sort","visibleEntries","result","group","grantedBy","decodeURIComponent","grantedAt","user_email","totalAclPages","max","pageEntries","allPageSelected","every","has","toggleAll","n","forEach","delete","add","err","checked","isSelected","isGroup","subjectLabel","subjectDetail","toggleOne","avatarUrl","Date","toLocaleDateString","Trash2","min","p","ChevronLeft","ChevronRight","entryId","handleRemove","ResourceRow","aclEntries","onRemoveAccess","mfApi","clickLock","subscribe","eventData","console","log","action","elementId","setExpanded","expanded","resourceEntries","FileText","Users","Share2","ChevronUp","ChevronDown","ResourceGroupFormModal","existing","onSave","form","setForm","resources","resourceSearch","setResourceSearch","debouncedResourceSearch","resourcePage","setResourcePage","resourcesQuery","resourcePagination","resTotalCount","totalResourcePages","filteredModalResources","f","required","strokeLinecap","strokeLinejoin","toggleResource","ResourceGroupRow","userGroups","onEdit","onDelete","allResources","resourcesPopoverOpen","setResourcesPopoverOpen","popoverPos","setPopoverPos","top","left","resourcesBtnRef","React11","deleteGroupAclMutation","deleteAclsByResourceGroup","useDeleteAclsByResourceGroupMutation","groupEntries","resourceIds","totalResources","byPrincipal","Map","principal","group_id","set","get","handleRemoveFromGroup","mutateAsync","resource_group_id","asShareable","application","isResourceGroup","Layers","getBoundingClientRect","bottom","v","style","rId","Pencil","RES_PAGE_SIZE","Tooltip","side","view","setView","resPage","setResPage","rgPage","setRgPage","totalResPages","resourceGroupsQuery","getResourceGroups","useResourceGroupsPaginatedQuery","resourceGroups","resourceGroupPagination","rgTotalCount","totalRgPages","isLoading","createGroupOpen","setCreateGroupOpen","editingGroup","setEditingGroup","deleteGroupTarget","setDeleteGroupTarget","deleteGroupLoading","setDeleteGroupLoading","filteredResources","filteredGroups","Plus","payload","createResourceGroup","updateResourceGroup","deleteResourceGroup","getId","stripHtml","html","applyTemplate","template","recipientEmail","additionalData","join","ShareAccessModal","notifyByEmail","sendAdditionalMessage","emailTemplate","resourceName","currentUserEmail","debouncedInput","setDebouncedInput","notifyPeople","setNotifyPeople","additionalMessage","setAdditionalMessage","appQuery","rolesQuery","groupsQuery","roleModuleMappingQuery","aclsQuery","getAcls","useAllAclsQuery","usersQuery","createAclMutation","shareResourceGroupMutation","shareResourceGroup","useShareResourceGroupMutation","sendMailMutation","sendMail","mappedRoleId","mappedModuleId","sendNotifications","emails","subject","recipients","to","cc","bcc","mail","grantedEmails","is_inherited","resource_type","resource_id","existingEmails","acl","resourceType","newEmails","skipped","isFetching","rows","Select","options","selectId","opt","Object","assign","Header","Body","Row","Head","sortable","sortKey","sortState","onSort","isActive","column","nextDirection","direction","ChevronsUpDown","Cell","TYPE_OPTIONS2","AddModal","allAcls","localMode","setLocalMode","a","EditModal","bulkUpdateAcl","groupName","canAddUser","canEditUser","canDeleteUser","canAddGroup","canEditGroup","canDeleteGroup","uPerms","canAdd","canEdit","canDelete","canBulkEdit","gPerms","useAclsQuery","deleteAclMutation","deleteAcl","useDeleteAclMutation","bulkUpdateAclMutation","useBulkUpdateAclMutation","resolvedModuleId","setPage","addModalOpen","setAddModalOpen","editEntry","setEditEntry","showAddUser","showAddGroup","showAddButton","showBulkCheckbox","addModalMode","perms","canCheck","roleTemplates","badgeColorMap","baseUrl","getAuthToken","setIsLoading","lastError","setLastError","clearError","token","JSON","parse","atob","finalAdapter","request","path","headers","Authorization","ok","msg","status","body","createApiClient","importConfig","stringify","getModules","getPermission","updateModule","createModule","deleteModule","createPermission","updatePermission","deletePermission","createRole","updateRole","deleteRole","updateModuleMapping","updateGroup","deleteGroup","createGroup","searchUsers","createRbacApi","mergedBadgeColors"],"mappings":"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"}
|