diff --git a/web/app/components/app/app-access-control/index.tsx b/web/app/components/app/app-access-control/index.tsx
index 56ad8ec7c1..53f60f2481 100644
--- a/web/app/components/app/app-access-control/index.tsx
+++ b/web/app/components/app/app-access-control/index.tsx
@@ -11,40 +11,57 @@ import SpecificGroupsOrMembers, { WebAppSSONotEnabledTip } from './specific-grou
import useAccessControlStore from './access-control-store'
import { useGlobalPublicStore } from '@/context/global-public-context'
import type { App } from '@/types/app'
-import { AccessMode } from '@/models/access-control'
+import type { Subject } from '@/models/access-control'
+import { AccessMode, SubjectType } from '@/models/access-control'
import { useUpdateAccessMode } from '@/service/access-control'
type AccessControlProps = {
app: App
onClose: () => void
+ onConfirm?: () => void
}
export default function AccessControl(props: AccessControlProps) {
+ const { app, onClose, onConfirm } = props
const { t } = useTranslation()
const systemFeatures = useGlobalPublicStore(s => s.systemFeatures)
const setAppId = useAccessControlStore(s => s.setAppId)
const specificGroups = useAccessControlStore(s => s.specificGroups)
const specificMembers = useAccessControlStore(s => s.specificMembers)
+ const currentMenu = useAccessControlStore(s => s.currentMenu)
+ const setCurrentMenu = useAccessControlStore(s => s.setCurrentMenu)
const hideTip = systemFeatures.enable_web_sso_switch_component && systemFeatures.sso_enforced_for_web
useEffect(() => {
- setAppId(props.app.id)
- }, [props.app, setAppId])
+ setAppId(app.id)
+ setCurrentMenu(app.access_mode ?? AccessMode.SPECIFIC_GROUPS_MEMBERS)
+ }, [app, setAppId])
const { isPending, mutateAsync: updateAccessMode } = useUpdateAccessMode()
const handleConfirm = useCallback(async () => {
- const subjectIds: string[] = []
- specificGroups.forEach((group) => {
- subjectIds.push(group.id)
- })
- specificMembers.forEach((member) => {
- subjectIds.push(member.id)
- },
- )
- await updateAccessMode({ appId: props.app.id, subjects: subjectIds })
+ const submitData: {
+ appId: string
+ accessMode: AccessMode
+ subjects?: Pick
[]
+ } = { appId: app.id, accessMode: currentMenu }
+ if (currentMenu === AccessMode.SPECIFIC_GROUPS_MEMBERS) {
+ const subjects: Pick[] = []
+ specificGroups.forEach((group) => {
+ subjects.push({ subjectId: group.id, subjectType: SubjectType.GROUP })
+ })
+ specificMembers.forEach((member) => {
+ subjects.push({
+ subjectId: member.id,
+ subjectType: SubjectType.ACCOUNT,
+ })
+ })
+ submitData.subjects = subjects
+ }
+ await updateAccessMode(submitData)
Toast.notify({ type: 'success', message: t('app.accessControlDialog.updateSuccess') })
- }, [updateAccessMode, props.app, specificGroups, specificMembers, t])
- return
+ onConfirm?.()
+ }, [updateAccessMode, app, specificGroups, specificMembers, t, onConfirm, currentMenu])
+ return
{t('app.accessControlDialog.title')}
@@ -74,7 +91,7 @@ export default function AccessControl(props: AccessControlProps) {
-
+
diff --git a/web/app/components/app/app-access-control/specific-groups-or-members.tsx b/web/app/components/app/app-access-control/specific-groups-or-members.tsx
index c0cd36bacb..414d8cce00 100644
--- a/web/app/components/app/app-access-control/specific-groups-or-members.tsx
+++ b/web/app/components/app/app-access-control/specific-groups-or-members.tsx
@@ -53,7 +53,7 @@ export default function SpecificGroupsOrMembers() {
-
@@ -67,11 +67,11 @@ function RenderGroupsAndMembers() {
if (specificGroups.length <= 0 && specificMembers.length <= 0)
return
{t('app.accessControlDialog.noGroupsOrMembers')}
return <>
-
{t('app.accessControlDialog.groups', { count: specificGroups.length ?? 0 })}
+
{t('app.accessControlDialog.groups', { count: specificGroups.length ?? 0 })}
{specificGroups.map((group, index) => )}
-
{t('app.accessControlDialog.members', { count: specificMembers.length ?? 0 })}
+
{t('app.accessControlDialog.members', { count: specificMembers.length ?? 0 })}
{specificMembers.map((member, index) => )}
diff --git a/web/models/access-control.ts b/web/models/access-control.ts
index bfbd228fa5..b0e4a097e9 100644
--- a/web/models/access-control.ts
+++ b/web/models/access-control.ts
@@ -1,12 +1,12 @@
export enum SubjectType {
- Group = 'group',
- Account = 'account',
+ GROUP = 'group',
+ ACCOUNT = 'account',
}
export enum AccessMode {
- PUBLIC = 'PUBLIC',
- SPECIFIC_GROUPS_MEMBERS = 'SPECIFIC_GROUPS_MEMBERS',
- ORGANIZATION = 'ORGANIZATION',
+ PUBLIC = 'public',
+ SPECIFIC_GROUPS_MEMBERS = 'private',
+ ORGANIZATION = 'private_all',
}
export type AccessControlGroup = {
diff --git a/web/service/access-control.ts b/web/service/access-control.ts
index 549ba43d7b..dbb72a3ae7 100644
--- a/web/service/access-control.ts
+++ b/web/service/access-control.ts
@@ -1,6 +1,6 @@
import { useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query'
import { get, post } from './base'
-import type { AccessControlAccount, AccessControlGroup, Subject } from '@/models/access-control'
+import type { AccessControlAccount, AccessControlGroup, AccessMode, Subject } from '@/models/access-control'
import type { App } from '@/types/app'
const NAME_SPACE = 'access-control'
@@ -45,7 +45,8 @@ export const useSearchForWhiteListCandidates = (query: { keyword?: string; resul
type UpdateAccessModeParams = {
appId: App['id']
- subjects: Subject['subjectId'][]
+ subjects?: Pick
[]
+ accessMode: AccessMode
}
export const useUpdateAccessMode = () => {
diff --git a/web/types/app.ts b/web/types/app.ts
index 101a31c09d..720f97134c 100644
--- a/web/types/app.ts
+++ b/web/types/app.ts
@@ -353,7 +353,7 @@ export type App = {
api_base_url: string
tags: Tag[]
/** access control */
- accessMode: AccessMode
+ access_mode: AccessMode
}
export type AppSSO = {