'use client' import type { AccessPolicyWithBindings, ResourceOpenScope, ResourceUserAccessSetting, } from '@/models/access-control' import { Button } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' import AddAccessSubjectPopover from './add-access-subject-popover' import { ACCESS_RULE_TABLE_GRID } from './constants' import ResourceOpenScopeSection from './open-scope-section' import TitleInfotip from './title-infotip' import UserAccessPolicyRow from './user-access-policy-row' export type AccessRulesEditorProps = { rules: AccessPolicyWithBindings[] userAccessSettings: ResourceUserAccessSetting[] isLoadingRules: boolean isLoadingUserAccessSettings: boolean openScope?: ResourceOpenScope isUpdatingOpenScope: boolean updatingAccountId: string | null maintainerId?: string | null className?: string onOpenScopeChange?: (openScope: ResourceOpenScope) => void onUserAccessPoliciesChange?: (accountId: string, accessPolicyIds: string[]) => void onRemoveAccessPolicyMemberBinding?: (accountId: string, accessPolicyId: string) => void onAddAccessSubject?: (accountId: string, accessPolicyIds: string[]) => void } export default function AccessRulesEditor({ rules, userAccessSettings, isLoadingRules, isLoadingUserAccessSettings, openScope, isUpdatingOpenScope, updatingAccountId, maintainerId, className, onOpenScopeChange, onUserAccessPoliciesChange, onRemoveAccessPolicyMemberBinding, onAddAccessSubject, }: AccessRulesEditorProps) { const { t } = useTranslation() const isLoading = isLoadingRules || isLoadingUserAccessSettings const individualPermissionSettingsTip = t( ($) => $['accessRule.individualPermissionSettingsTip'], { ns: 'permission' }, ) const policyOptions = useMemo(() => { return rules.map((rule) => ({ id: rule.policy.id, name: rule.policy.name, })) }, [rules]) return (