@famgia/omnify-react-sso 2.2.3 → 2.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/ant/index.cjs +3235 -0
  2. package/dist/ant/index.cjs.map +1 -0
  3. package/dist/ant/index.d.cts +685 -0
  4. package/dist/ant/index.d.ts +685 -0
  5. package/dist/ant/index.js +3268 -0
  6. package/dist/ant/index.js.map +1 -0
  7. package/dist/core/index.cjs +2432 -0
  8. package/dist/core/index.cjs.map +1 -0
  9. package/dist/core/index.d.cts +112 -0
  10. package/dist/core/index.d.ts +112 -0
  11. package/dist/core/index.js +2360 -0
  12. package/dist/core/index.js.map +1 -0
  13. package/dist/{testing → core/testing}/index.cjs +1 -1
  14. package/dist/core/testing/index.cjs.map +1 -0
  15. package/dist/{testing → core/testing}/index.d.cts +1 -1
  16. package/dist/{testing → core/testing}/index.d.ts +1 -1
  17. package/dist/{testing → core/testing}/index.js +1 -1
  18. package/dist/core/testing/index.js.map +1 -0
  19. package/dist/index-CHuDTvHg.d.ts +2250 -0
  20. package/dist/index-DVssHZFD.d.cts +2250 -0
  21. package/dist/index.cjs +2464 -784
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +10 -1822
  24. package/dist/index.d.ts +10 -1822
  25. package/dist/index.js +2528 -771
  26. package/dist/index.js.map +1 -1
  27. package/dist/{types-bD5deLxs.d.cts → types-BxClyvTX.d.cts} +2 -3
  28. package/dist/{types-bD5deLxs.d.ts → types-BxClyvTX.d.ts} +2 -3
  29. package/dist/userService-DH9-vPSg.d.cts +269 -0
  30. package/dist/userService-DH9-vPSg.d.ts +269 -0
  31. package/package.json +32 -53
  32. package/dist/@omnify-base/package.json +0 -16
  33. package/dist/@omnify-base/schemas/Branch.ts +0 -131
  34. package/dist/@omnify-base/schemas/BranchCache.ts +0 -131
  35. package/dist/@omnify-base/schemas/OrganizationCache.ts +0 -117
  36. package/dist/@omnify-base/schemas/Permission.ts +0 -114
  37. package/dist/@omnify-base/schemas/Role.ts +0 -128
  38. package/dist/@omnify-base/schemas/RolePermission.ts +0 -97
  39. package/dist/@omnify-base/schemas/Team.ts +0 -110
  40. package/dist/@omnify-base/schemas/TeamCache.ts +0 -110
  41. package/dist/@omnify-base/schemas/TeamPermission.ts +0 -109
  42. package/dist/@omnify-base/schemas/User.ts +0 -135
  43. package/dist/@omnify-base/schemas/UserCache.ts +0 -142
  44. package/dist/@omnify-base/schemas/common.ts +0 -47
  45. package/dist/@omnify-base/schemas/i18n.ts +0 -118
  46. package/dist/schemas/index.cjs +0 -645
  47. package/dist/schemas/index.cjs.map +0 -1
  48. package/dist/schemas/index.d.cts +0 -260
  49. package/dist/schemas/index.d.ts +0 -260
  50. package/dist/schemas/index.js +0 -557
  51. package/dist/schemas/index.js.map +0 -1
  52. package/dist/testing/index.cjs.map +0 -1
  53. package/dist/testing/index.js.map +0 -1
  54. package/scripts/build-schemas.ts +0 -191
  55. package/scripts/postinstall.cjs +0 -43
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ant/index.ts","../../src/ant/components/SsoCallback/SsoCallback.tsx","../../src/core/context/SsoContext.tsx","../../src/ant/components/OrganizationSwitcher/OrganizationSwitcher.tsx","../../src/core/hooks/useOrganization.ts","../../src/ant/components/ProtectedRoute/ProtectedRoute.tsx","../../src/core/hooks/useAuth.ts","../../src/ant/components/OrgBranchSelectorModal/OrgBranchSelectorModal.tsx","../../src/core/services/utils.ts","../../src/core/services/branchService.ts","../../src/core/queryKeys.ts","../../src/ant/components/BranchGate/BranchGate.tsx","../../src/ant/components/ProTable/ProTable.tsx","../../src/ant/components/PageContainer/PageContainer.tsx","../../src/ant/components/LocaleSwitcher/LocaleSwitcher.tsx","../../src/core/i18n/index.tsx","../../src/ant/components/UserRoleAssignModal/UserRoleAssignModal.tsx","../../src/ant/components/ScopeUtils/ScopeUtils.tsx","../../src/ant/components/UserPermissionsModal/UserPermissionsModal.tsx","../../src/ant/components/UserDetailCard/UserDetailCard.tsx","../../src/ant/components/RoleCreateModal/RoleCreateModal.tsx","../../src/ant/components/RolesListCard/RolesListCard.tsx","../../src/ant/components/PermissionsListCard/PermissionsListCard.tsx","../../src/ant/components/TeamsListCard/TeamsListCard.tsx","../../src/ant/theme/AntdThemeProvider.tsx"],"sourcesContent":["/**\n * Ant Design Module\n * \n * All Ant Design based components, theme, and utilities.\n * Optimized for Japanese enterprise applications.\n */\n\n// Components\nexport * from './components';\n\n// Theme\nexport * from './theme';\n","'use client';\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useSsoContext } from '../../../core/context/SsoContext';\nimport type { SsoCallbackProps, SsoCallbackResponse, SsoOrganization, SsoUser } from '../../../core/types';\n\n/**\n * Transform backend response to frontend format\n */\nfunction transformUser(data: SsoCallbackResponse['user']): SsoUser {\n return {\n id: data.id,\n consoleUserId: data.console_user_id,\n email: data.email,\n name: data.name,\n };\n}\n\n/**\n * Transform organizations from backend format\n */\nfunction transformOrganizations(\n data: SsoCallbackResponse['organizations']\n): SsoOrganization[] {\n return data.map((org) => ({\n id: org.organization_id,\n slug: org.organization_slug,\n name: org.organization_name,\n orgRole: org.org_role,\n serviceRole: org.service_role,\n }));\n}\n\n/**\n * Default loading component\n */\nfunction DefaultLoading() {\n return (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px'\n }}>\n <div>Authenticating...</div>\n </div>\n );\n}\n\n/**\n * Default error component\n */\nfunction DefaultError({ error }: { error: Error }) {\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n color: 'red'\n }}>\n <div>Authentication Error</div>\n <div style={{ fontSize: '0.875rem', marginTop: '0.5rem' }}>{error.message}</div>\n </div>\n );\n}\n\n/**\n * SSO Callback component\n * \n * Place this component at your callback route (e.g., /sso/callback)\n * It handles the SSO code exchange and redirects after successful login.\n *\n * @example\n * ```tsx\n * // pages/sso/callback.tsx or app/sso/callback/page.tsx\n * export default function CallbackPage() {\n * return (\n * <SsoCallback\n * redirectTo=\"/dashboard\"\n * onSuccess={(user, orgs) => console.log('Logged in:', user)}\n * onError={(error) => console.error('Login failed:', error)}\n * />\n * );\n * }\n * ```\n */\nexport function SsoCallback({\n onSuccess,\n onError,\n redirectTo = '/',\n loadingComponent,\n errorComponent,\n}: SsoCallbackProps) {\n const { config, refreshUser } = useSsoContext();\n const [error, setError] = useState<Error | null>(null);\n const [isProcessing, setIsProcessing] = useState(true);\n // 二重呼び出し防止フラグ(React Strict Mode対応)\n const isProcessingRef = useRef(false);\n\n useEffect(() => {\n // 既に処理中の場合はスキップ\n if (isProcessingRef.current) {\n return;\n }\n isProcessingRef.current = true;\n\n const processCallback = async () => {\n try {\n // Get code from URL\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n const redirectParam = urlParams.get('redirect');\n\n if (!code) {\n throw new Error('No authorization code received');\n }\n\n // Get CSRF cookie first (required for Sanctum SPA auth)\n await fetch(`${config.apiUrl}/sanctum/csrf-cookie`, {\n credentials: 'include',\n });\n\n // Get XSRF token from cookie\n const xsrfToken = document.cookie\n .split('; ')\n .find(row => row.startsWith('XSRF-TOKEN='))\n ?.split('=')[1];\n\n // Exchange code for session\n const response = await fetch(`${config.apiUrl}/api/sso/callback`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n ...(xsrfToken ? { 'X-XSRF-TOKEN': decodeURIComponent(xsrfToken) } : {}),\n },\n credentials: 'include',\n body: JSON.stringify({ code }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || 'Failed to authenticate');\n }\n\n const data: SsoCallbackResponse = await response.json();\n\n // Transform data\n const user = transformUser(data.user);\n const organizations = transformOrganizations(data.organizations);\n\n // Refresh context\n await refreshUser();\n\n // Call success callback\n onSuccess?.(user, organizations);\n\n // Redirect\n const finalRedirect = redirectParam || redirectTo;\n window.location.href = finalRedirect;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Authentication failed');\n setError(error);\n onError?.(error);\n // エラー時はフラグをリセットして再試行可能に\n isProcessingRef.current = false;\n } finally {\n setIsProcessing(false);\n }\n };\n\n processCallback();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (error) {\n if (errorComponent) {\n return <>{errorComponent(error)}</>;\n }\n return <DefaultError error={error} />;\n }\n\n if (isProcessing) {\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n return <DefaultLoading />;\n }\n\n return null;\n}\n","'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { SsoContextValue } from '../types';\n\n/**\n * SSO Context\n */\nexport const SsoContext = createContext<SsoContextValue | null>(null);\n\n/**\n * Hook to access SSO context\n * @throws Error if used outside SsoProvider\n */\nexport function useSsoContext(): SsoContextValue {\n const context = useContext(SsoContext);\n\n if (!context) {\n throw new Error('useSsoContext must be used within a SsoProvider');\n }\n\n return context;\n}\n","'use client';\n\nimport React, { useCallback, useMemo } from 'react';\nimport { Dropdown, Button, Space, Typography, Badge } from 'antd';\nimport { SwapOutlined, CheckOutlined } from '@ant-design/icons';\nimport type { MenuProps } from 'antd';\nimport { useOrganization } from '../../../core/hooks/useOrganization';\nimport type { OrganizationSwitcherProps, SsoOrganization } from '../../../core/types';\n\nconst { Text } = Typography;\n\n/**\n * Organization Switcher component using Ant Design\n *\n * A dropdown component for switching between organizations.\n * Only renders if user has access to multiple organizations.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <OrganizationSwitcher />\n *\n * // With custom styling\n * <OrganizationSwitcher className=\"my-switcher\" />\n *\n * // With custom render\n * <OrganizationSwitcher\n * renderTrigger={(org, isOpen) => (\n * <Button>{org?.name} {isOpen ? '▲' : '▼'}</Button>\n * )}\n * renderOption={(org, isSelected) => (\n * <div className={isSelected ? 'selected' : ''}>{org.name}</div>\n * )}\n * />\n * ```\n */\nexport function OrganizationSwitcher({\n className,\n renderTrigger,\n renderOption,\n onChange,\n}: OrganizationSwitcherProps) {\n const { organizations, currentOrg, hasMultipleOrgs, switchOrg } = useOrganization();\n const [isOpen, setIsOpen] = React.useState(false);\n\n const handleSelect = useCallback(\n (org: SsoOrganization) => {\n switchOrg(org.slug);\n setIsOpen(false);\n onChange?.(org);\n },\n [switchOrg, onChange]\n );\n\n const menuItems: MenuProps['items'] = useMemo(() => {\n return organizations.map((org) => {\n const isSelected = currentOrg?.slug === org.slug;\n\n if (renderOption) {\n return {\n key: org.slug,\n label: (\n <div onClick={() => handleSelect(org)}>\n {renderOption(org, isSelected)}\n </div>\n ),\n };\n }\n\n return {\n key: org.slug,\n label: (\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <Space direction=\"vertical\" size={0}>\n <Text strong={isSelected}>{org.name}</Text>\n {org.serviceRole && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {org.serviceRole}\n </Text>\n )}\n </Space>\n {isSelected && <CheckOutlined style={{ color: '#1890ff' }} />}\n </Space>\n ),\n onClick: () => handleSelect(org),\n };\n });\n }, [organizations, currentOrg, renderOption, handleSelect]);\n\n // Don't render if only one org\n if (!hasMultipleOrgs) {\n return null;\n }\n\n // Custom trigger\n if (renderTrigger) {\n return (\n <Dropdown\n menu={{ items: menuItems }}\n trigger={['click']}\n open={isOpen}\n onOpenChange={setIsOpen}\n className={className}\n >\n <div style={{ cursor: 'pointer' }}>\n {renderTrigger(currentOrg, isOpen)}\n </div>\n </Dropdown>\n );\n }\n\n // Default Ant Design trigger\n return (\n <Dropdown\n menu={{ items: menuItems }}\n trigger={['click']}\n open={isOpen}\n onOpenChange={setIsOpen}\n className={className}\n >\n <Button>\n <Space>\n <Badge status=\"success\" />\n <span>{currentOrg?.name ?? 'Select Organization'}</span>\n <SwapOutlined />\n </Space>\n </Button>\n </Dropdown>\n );\n}\n","'use client';\n\nimport { useCallback, useMemo } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoOrganization } from '../types';\n\n/**\n * Hook return type for organization management\n */\nexport interface UseOrganizationReturn {\n /** List of organizations user has access to */\n organizations: SsoOrganization[];\n /** Currently selected organization */\n currentOrg: SsoOrganization | null;\n /** Whether user has multiple organizations */\n hasMultipleOrgs: boolean;\n /** Switch to a different organization */\n switchOrg: (orgId: string) => void;\n /** Get current org's role */\n currentRole: string | null;\n /** Check if user has at least the given role in current org */\n hasRole: (role: string) => boolean;\n}\n\n/**\n * Role levels for comparison\n */\nconst ROLE_LEVELS: Record<string, number> = {\n admin: 100,\n manager: 50,\n member: 10,\n};\n\n/**\n * Hook for organization management\n *\n * @example\n * ```tsx\n * function OrgInfo() {\n * const { currentOrg, organizations, switchOrg, hasRole } = useOrganization();\n *\n * return (\n * <div>\n * <p>Current: {currentOrg?.name}</p>\n * {hasRole('admin') && <AdminPanel />}\n * <select onChange={(e) => switchOrg(e.target.value)}>\n * {organizations.map((org) => (\n * <option key={org.slug} value={org.slug}>{org.name}</option>\n * ))}\n * </select>\n * </div>\n * );\n * }\n * ```\n */\nexport function useOrganization(): UseOrganizationReturn {\n const { organizations, currentOrg, switchOrg } = useSsoContext();\n\n const hasMultipleOrgs = organizations.length > 1;\n\n const currentRole = currentOrg?.serviceRole ?? null;\n\n const hasRole = useCallback(\n (role: string): boolean => {\n if (!currentRole) return false;\n\n const requiredLevel = ROLE_LEVELS[role] ?? 0;\n const userLevel = ROLE_LEVELS[currentRole] ?? 0;\n\n return userLevel >= requiredLevel;\n },\n [currentRole]\n );\n\n const handleSwitchOrg = useCallback(\n (orgId: string) => {\n switchOrg(orgId);\n },\n [switchOrg]\n );\n\n return useMemo(\n () => ({\n organizations,\n currentOrg,\n hasMultipleOrgs,\n switchOrg: handleSwitchOrg,\n currentRole,\n hasRole,\n }),\n [organizations, currentOrg, hasMultipleOrgs, handleSwitchOrg, currentRole, hasRole]\n );\n}\n","'use client';\n\nimport React, { useEffect } from 'react';\nimport { useAuth } from '../../../core/hooks/useAuth';\nimport { useOrganization } from '../../../core/hooks/useOrganization';\nimport type { ProtectedRouteProps } from '../../../core/types';\n\n/**\n * Default loading component\n */\nfunction DefaultLoading() {\n return (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px'\n }}>\n <div>Loading...</div>\n </div>\n );\n}\n\n/**\n * Default login fallback\n */\nfunction DefaultLoginFallback({ login }: { login: () => void }) {\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n gap: '1rem'\n }}>\n <div>Please log in to continue</div>\n <button\n onClick={login}\n style={{\n padding: '0.5rem 1rem',\n background: '#0070f3',\n color: 'white',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n }}\n >\n Log In\n </button>\n </div>\n );\n}\n\n/**\n * Default access denied component\n */\nfunction DefaultAccessDenied({ reason }: { reason: string }) {\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n color: '#dc2626'\n }}>\n <div style={{ fontSize: '1.5rem', fontWeight: 600 }}>Access Denied</div>\n <div style={{ marginTop: '0.5rem' }}>{reason}</div>\n </div>\n );\n}\n\n/**\n * Protected Route component\n *\n * Wraps content that requires authentication and optionally specific roles/permissions.\n *\n * @example\n * ```tsx\n * // Basic protection\n * <ProtectedRoute>\n * <Dashboard />\n * </ProtectedRoute>\n *\n * // With role requirement\n * <ProtectedRoute requiredRole=\"admin\">\n * <AdminPanel />\n * </ProtectedRoute>\n *\n * // With custom fallbacks\n * <ProtectedRoute\n * fallback={<Spinner />}\n * loginFallback={<CustomLoginPage />}\n * onAccessDenied={(reason) => console.log(reason)}\n * >\n * <ProtectedContent />\n * </ProtectedRoute>\n * ```\n */\nexport function ProtectedRoute({\n children,\n fallback,\n loginFallback,\n requiredRole,\n requiredPermission,\n onAccessDenied,\n}: ProtectedRouteProps) {\n const { user, isLoading, isAuthenticated, login } = useAuth();\n const { hasRole, currentOrg } = useOrganization();\n\n // Handle access denied callback\n useEffect(() => {\n if (isLoading) return;\n\n if (!isAuthenticated) {\n onAccessDenied?.('unauthenticated');\n } else if (requiredRole && !hasRole(requiredRole)) {\n onAccessDenied?.('insufficient_role');\n }\n // Note: Permission checking would need to be implemented with a permissions hook\n }, [isLoading, isAuthenticated, requiredRole, hasRole, onAccessDenied]);\n\n // Loading state\n if (isLoading) {\n return <>{fallback ?? <DefaultLoading />}</>;\n }\n\n // Not authenticated\n if (!isAuthenticated) {\n if (loginFallback) {\n return <>{loginFallback}</>;\n }\n return <DefaultLoginFallback login={() => login()} />;\n }\n\n // Check role requirement\n if (requiredRole && !hasRole(requiredRole)) {\n return (\n <DefaultAccessDenied\n reason={`This page requires ${requiredRole} role. Your role: ${currentOrg?.serviceRole ?? 'none'}`}\n />\n );\n }\n\n // Note: Permission checking would need a separate implementation\n // with a hook that checks permissions via the backend\n\n // All checks passed\n return <>{children}</>;\n}\n","'use client';\n\nimport { useCallback } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoUser } from '../types';\n\n/**\n * Hook for authentication actions and state\n */\nexport interface UseAuthReturn {\n /** Current user or null */\n user: SsoUser | null;\n /** Whether auth is being loaded */\n isLoading: boolean;\n /** Whether user is authenticated */\n isAuthenticated: boolean;\n /** Redirect to login */\n login: (redirectTo?: string) => void;\n /** Logout from service only */\n logout: () => Promise<void>;\n /** Logout from service and Console */\n globalLogout: (redirectTo?: string) => void;\n /** Refresh user data */\n refreshUser: () => Promise<void>;\n}\n\n/**\n * Hook for authentication\n *\n * @example\n * ```tsx\n * function LoginButton() {\n * const { isAuthenticated, login, logout, user } = useAuth();\n *\n * if (isAuthenticated) {\n * return (\n * <div>\n * <span>Hello, {user?.name}</span>\n * <button onClick={() => logout()}>Logout</button>\n * </div>\n * );\n * }\n *\n * return <button onClick={() => login()}>Login</button>;\n * }\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { user, isLoading, isAuthenticated, login, logout, globalLogout, refreshUser } =\n useSsoContext();\n\n const handleLogin = useCallback(\n (redirectTo?: string) => {\n login(redirectTo);\n },\n [login]\n );\n\n const handleLogout = useCallback(async () => {\n await logout();\n }, [logout]);\n\n const handleGlobalLogout = useCallback(\n (redirectTo?: string) => {\n globalLogout(redirectTo);\n },\n [globalLogout]\n );\n\n return {\n user,\n isLoading,\n isAuthenticated,\n login: handleLogin,\n logout: handleLogout,\n globalLogout: handleGlobalLogout,\n refreshUser,\n };\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Modal, Select, Form, Space, Typography, Spin, Alert, Badge } from 'antd';\nimport { BankOutlined, ApartmentOutlined, CheckCircleFilled } from '@ant-design/icons';\nimport { useQuery } from '@tanstack/react-query';\nimport { useOrganization } from '../../../core/hooks/useOrganization';\nimport { useSsoContext } from '../../../core/context/SsoContext';\nimport { createBranchService, type BranchesResponse } from '../../../core/services/branchService';\nimport { ssoQueryKeys } from '../../../core/queryKeys';\nimport type { OrgBranchSelectorModalProps, SsoOrganization, SsoBranch } from '../../../core/types';\n\nconst { Text, Title } = Typography;\n\n/**\n * Organization and Branch Selector Modal\n * \n * A modal component for selecting organization and branch.\n * - If user has only one organization, it's auto-selected\n * - If user has only one branch, it's auto-selected\n * - Shows selection UI only when there are multiple options\n * \n * @example\n * ```tsx\n * function CreateProjectButton() {\n * const [modalOpen, setModalOpen] = useState(false);\n * \n * const handleConfirm = (orgId: number, branchId: number) => {\n * // Create project with selected org and branch\n * createProject({ organization_id: orgId, branch_id: branchId });\n * setModalOpen(false);\n * };\n * \n * return (\n * <>\n * <Button onClick={() => setModalOpen(true)}>\n * Create Project\n * </Button>\n * <OrgBranchSelectorModal\n * open={modalOpen}\n * onClose={() => setModalOpen(false)}\n * onConfirm={handleConfirm}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function OrgBranchSelectorModal({\n open,\n onClose,\n onConfirm,\n title = 'Select Organization & Branch',\n requireBranch = true,\n loadingComponent,\n}: OrgBranchSelectorModalProps) {\n const { config } = useSsoContext();\n const { organizations, currentOrg, hasMultipleOrgs } = useOrganization();\n const [form] = Form.useForm();\n\n // Selected organization state (for fetching branches)\n const [selectedOrgSlug, setSelectedOrgSlug] = useState<string | null>(\n currentOrg?.slug ?? null\n );\n\n // Branch service\n const branchService = useMemo(\n () => createBranchService({ apiUrl: config.apiUrl }),\n [config.apiUrl]\n );\n\n // Fetch branches for selected organization\n const {\n data: branchesData,\n isLoading: branchesLoading,\n error: branchesError,\n } = useQuery<BranchesResponse>({\n queryKey: ssoQueryKeys.branches.list(selectedOrgSlug ?? undefined),\n queryFn: () => branchService.list(selectedOrgSlug ?? undefined),\n enabled: open && !!selectedOrgSlug,\n });\n\n const branches = branchesData?.branches ?? [];\n const hasMultipleBranches = branches.length > 1;\n\n // Find selected organization object\n const selectedOrg = useMemo(\n () => organizations.find(o => o.slug === selectedOrgSlug) ?? null,\n [organizations, selectedOrgSlug]\n );\n\n // Auto-select logic\n useEffect(() => {\n if (!open) return;\n\n // Auto-select organization if only one\n if (organizations.length === 1 && !selectedOrgSlug) {\n setSelectedOrgSlug(organizations[0].slug);\n form.setFieldValue('organization_id', organizations[0].id);\n } else if (currentOrg && !selectedOrgSlug) {\n setSelectedOrgSlug(currentOrg.slug);\n form.setFieldValue('organization_id', currentOrg.id);\n }\n }, [open, organizations, currentOrg, selectedOrgSlug, form]);\n\n // Auto-select branch if only one\n useEffect(() => {\n if (!open || branchesLoading) return;\n\n if (branches.length === 1) {\n form.setFieldValue('branch_id', branches[0].id);\n } else if (branches.length > 0) {\n // Try to select primary or headquarters\n const primaryId = branchesData?.primary_branch_id;\n if (primaryId) {\n form.setFieldValue('branch_id', primaryId);\n } else {\n const hq = branches.find(b => b.is_headquarters);\n if (hq) {\n form.setFieldValue('branch_id', hq.id);\n }\n }\n }\n }, [open, branches, branchesLoading, branchesData, form]);\n\n // Auto-confirm if both are auto-selected\n useEffect(() => {\n if (!open || branchesLoading) return;\n\n const orgId = form.getFieldValue('organization_id');\n const branchId = form.getFieldValue('branch_id');\n\n // If we have auto-selected values and no multiple choices needed\n if (orgId && branchId && !hasMultipleOrgs && !hasMultipleBranches) {\n // Small delay to ensure UI renders\n const timer = setTimeout(() => {\n onConfirm(orgId, branchId);\n }, 100);\n return () => clearTimeout(timer);\n }\n }, [open, branchesLoading, hasMultipleOrgs, hasMultipleBranches, form, onConfirm]);\n\n const handleOrgChange = useCallback((orgId: number) => {\n const org = organizations.find(o => o.id === orgId);\n if (org) {\n setSelectedOrgSlug(org.slug);\n // Reset branch selection when org changes\n form.setFieldValue('branch_id', undefined);\n }\n }, [organizations, form]);\n\n const handleSubmit = useCallback(() => {\n form.validateFields().then(values => {\n onConfirm(values.organization_id, values.branch_id);\n });\n }, [form, onConfirm]);\n\n const handleClose = useCallback(() => {\n form.resetFields();\n setSelectedOrgSlug(currentOrg?.slug ?? null);\n onClose();\n }, [form, currentOrg, onClose]);\n\n // If loading and no branches yet, show loading\n const isInitialLoading = open && (!organizations.length || (selectedOrgSlug && branchesLoading && !branches.length));\n\n // Check if we need to show the modal at all\n const needsSelection = hasMultipleOrgs || hasMultipleBranches;\n\n return (\n <Modal\n title={\n <Space>\n <BankOutlined />\n <span>{title}</span>\n </Space>\n }\n open={open}\n onCancel={handleClose}\n onOk={handleSubmit}\n okText=\"Confirm\"\n cancelText=\"Cancel\"\n destroyOnHidden\n width={480}\n >\n {isInitialLoading ? (\n <div style={{ textAlign: 'center', padding: 40 }}>\n {loadingComponent ?? <Spin size=\"large\" />}\n <div style={{ marginTop: 16 }}>\n <Text type=\"secondary\">Loading...</Text>\n </div>\n </div>\n ) : (\n <Form\n form={form}\n layout=\"vertical\"\n style={{ marginTop: 16 }}\n >\n {branchesError && (\n <Alert\n type=\"error\"\n message=\"Failed to load branches\"\n description={(branchesError as Error).message}\n style={{ marginBottom: 16 }}\n />\n )}\n\n {/* Organization Selection */}\n <Form.Item\n name=\"organization_id\"\n label={\n <Space>\n <BankOutlined />\n <span>Organization</span>\n {!hasMultipleOrgs && selectedOrg && (\n <Badge status=\"success\" text=\"Auto-selected\" />\n )}\n </Space>\n }\n rules={[{ required: true, message: 'Please select an organization' }]}\n >\n {hasMultipleOrgs ? (\n <Select\n placeholder=\"Select organization\"\n onChange={handleOrgChange}\n size=\"large\"\n optionLabelProp=\"label\"\n >\n {organizations.map((org) => (\n <Select.Option\n key={org.id}\n value={org.id}\n label={org.name}\n >\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <div>\n <Text strong>{org.name}</Text>\n {org.serviceRole && (\n <Text type=\"secondary\" style={{ marginLeft: 8, fontSize: 12 }}>\n ({org.serviceRole})\n </Text>\n )}\n </div>\n {org.slug === currentOrg?.slug && (\n <CheckCircleFilled style={{ color: '#52c41a' }} />\n )}\n </Space>\n </Select.Option>\n ))}\n </Select>\n ) : (\n <div\n style={{\n padding: '8px 12px',\n background: '#f5f5f5',\n borderRadius: 6,\n border: '1px solid #d9d9d9',\n }}\n >\n <Space>\n <BankOutlined style={{ color: '#1677ff' }} />\n <Text strong>{selectedOrg?.name}</Text>\n </Space>\n </div>\n )}\n </Form.Item>\n\n {/* Branch Selection */}\n {selectedOrgSlug && (\n <Form.Item\n name=\"branch_id\"\n label={\n <Space>\n <ApartmentOutlined />\n <span>Branch</span>\n {!hasMultipleBranches && branches.length === 1 && (\n <Badge status=\"success\" text=\"Auto-selected\" />\n )}\n </Space>\n }\n rules={requireBranch ? [{ required: true, message: 'Please select a branch' }] : undefined}\n >\n {branchesLoading ? (\n <div style={{ padding: '8px 12px', textAlign: 'center' }}>\n <Spin size=\"small\" />\n <Text type=\"secondary\" style={{ marginLeft: 8 }}>\n Loading branches...\n </Text>\n </div>\n ) : hasMultipleBranches ? (\n <Select\n placeholder=\"Select branch\"\n size=\"large\"\n optionLabelProp=\"label\"\n >\n {branches.map((branch) => (\n <Select.Option\n key={branch.id}\n value={branch.id}\n label={branch.name}\n >\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <div>\n <Text strong>{branch.name}</Text>\n <Text type=\"secondary\" style={{ marginLeft: 8, fontSize: 12 }}>\n {branch.code}\n </Text>\n </div>\n <Space size={4}>\n {branch.is_headquarters && (\n <Badge color=\"blue\" text=\"HQ\" />\n )}\n {branch.is_primary && (\n <Badge color=\"green\" text=\"Primary\" />\n )}\n </Space>\n </Space>\n </Select.Option>\n ))}\n </Select>\n ) : branches.length === 1 ? (\n <div\n style={{\n padding: '8px 12px',\n background: '#f5f5f5',\n borderRadius: 6,\n border: '1px solid #d9d9d9',\n }}\n >\n <Space>\n <ApartmentOutlined style={{ color: '#1677ff' }} />\n <Text strong>{branches[0].name}</Text>\n <Text type=\"secondary\">({branches[0].code})</Text>\n </Space>\n </div>\n ) : (\n <Alert\n type=\"warning\"\n message=\"No branches available\"\n description=\"You don't have access to any branches in this organization.\"\n />\n )}\n </Form.Item>\n )}\n\n {/* Info message when everything is auto-selected */}\n {!needsSelection && selectedOrg && branches.length > 0 && (\n <Alert\n type=\"info\"\n message=\"Auto-selected\"\n description={`Using ${selectedOrg.name} / ${branches[0]?.name ?? 'Default'}`}\n icon={<CheckCircleFilled />}\n showIcon\n />\n )}\n </Form>\n )}\n </Modal>\n );\n}\n","/**\n * Shared utilities for SSO services\n */\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nexport function getXsrfToken(): string | undefined {\n if (typeof document === \"undefined\") return undefined;\n return document.cookie\n .split(\"; \")\n .find((row) => row.startsWith(\"XSRF-TOKEN=\"))\n ?.split(\"=\")[1];\n}\n\n/**\n * Build headers with XSRF token and optional organization ID\n */\nexport function buildHeaders(orgId?: string): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n const xsrfToken = getXsrfToken();\n if (xsrfToken) {\n headers[\"X-XSRF-TOKEN\"] = decodeURIComponent(xsrfToken);\n }\n\n if (orgId) {\n headers[\"X-Organization-Id\"] = orgId;\n }\n\n return headers;\n}\n\n/**\n * Fetch CSRF cookie from backend\n */\nexport async function csrf(apiUrl: string): Promise<void> {\n await fetch(`${apiUrl}/sanctum/csrf-cookie`, {\n credentials: \"include\",\n });\n}\n\n/**\n * Make API request with proper error handling\n */\nexport async function request<T>(\n apiUrl: string,\n path: string,\n options: RequestInit = {}\n): Promise<T> {\n const response = await fetch(`${apiUrl}${path}`, {\n ...options,\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.message || `HTTP ${response.status}`);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n}\n\n/**\n * Base service configuration\n */\nexport interface ServiceConfig {\n apiUrl: string;\n}\n","/**\n * Branch Service - Branch Management\n *\n * Provides methods to fetch branches for the current user/organization\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\nimport type { BranchCache } from \"../schemas/base/BranchCache\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Branch from SSO API - extends BranchCache with SSO-specific fields\n */\nexport interface Branch extends Omit<BranchCache, 'id' | 'console_branch_id' | 'console_org_id' | 'is_active' | 'created_at' | 'updated_at' | 'deleted_at'> {\n /** SSO Branch ID (number from API) */\n id: number;\n /** Is user's primary branch */\n is_primary: boolean;\n /** Is branch assigned to user */\n is_assigned: boolean;\n /** Access type */\n access_type: \"explicit\" | \"implicit\";\n /** Timezone */\n timezone: string | null;\n /** Currency */\n currency: string | null;\n /** Locale */\n locale: string | null;\n}\n\nexport interface BranchesResponse {\n all_branches_access: boolean;\n branches: Branch[];\n primary_branch_id: number | null;\n organization: {\n id: number;\n slug: string;\n name: string;\n };\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createBranchService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Get branches for current user in organization\n * GET /api/sso/branches\n * @param orgId - Organization ID or slug (sent via X-Organization-Id header)\n */\n list: async (orgId?: string): Promise<BranchesResponse> => {\n return request(apiUrl, `/api/sso/branches`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get a specific branch by ID\n * GET /api/sso/branches/{id}\n */\n get: async (branchId: number): Promise<Branch> => {\n const response = await request<{ data: Branch } | Branch>(\n apiUrl,\n `/api/sso/branches/${branchId}`,\n { headers: buildHeaders() }\n );\n return \"data\" in response ? response.data : response;\n },\n\n /**\n * Get headquarters branch for organization\n * @param orgId - Organization ID or slug (sent via X-Organization-Id header)\n */\n getHeadquarters: async (orgId?: string): Promise<Branch | null> => {\n try {\n const data = await request<BranchesResponse>(\n apiUrl,\n `/api/sso/branches`,\n { headers: buildHeaders(orgId) }\n );\n return data.branches.find((b) => b.is_headquarters) ?? null;\n } catch {\n return null;\n }\n },\n\n /**\n * Get primary branch for current user\n * @param orgId - Organization ID or slug (sent via X-Organization-Id header)\n */\n getPrimary: async (orgId?: string): Promise<Branch | null> => {\n try {\n const data = await request<BranchesResponse>(\n apiUrl,\n `/api/sso/branches`,\n { headers: buildHeaders(orgId) }\n );\n if (data.primary_branch_id) {\n return data.branches.find((b) => b.id === data.primary_branch_id) ?? null;\n }\n return null;\n } catch {\n return null;\n }\n },\n };\n}\n\n// Export type for the service\nexport type BranchService = ReturnType<typeof createBranchService>;\n","/**\n * SSO Query Keys - For TanStack Query / React Query\n *\n * Centralized key management for SSO-related queries.\n * Structure matches the service organization.\n */\n\nexport const ssoQueryKeys = {\n all: [\"sso\"] as const,\n\n // =========================================================================\n // Auth (authService)\n // =========================================================================\n auth: {\n all: () => [...ssoQueryKeys.all, \"auth\"] as const,\n user: () => [...ssoQueryKeys.auth.all(), \"user\"] as const,\n globalLogoutUrl: (redirectUri?: string) =>\n [...ssoQueryKeys.auth.all(), \"global-logout-url\", redirectUri] as const,\n },\n\n // =========================================================================\n // Tokens (tokenService)\n // =========================================================================\n tokens: {\n all: () => [...ssoQueryKeys.all, \"tokens\"] as const,\n list: () => [...ssoQueryKeys.tokens.all(), \"list\"] as const,\n },\n\n // =========================================================================\n // Roles (roleService)\n // =========================================================================\n roles: {\n all: () => [...ssoQueryKeys.all, \"roles\"] as const,\n list: () => [...ssoQueryKeys.roles.all(), \"list\"] as const,\n detail: (id: number | string) =>\n [...ssoQueryKeys.roles.all(), \"detail\", id] as const,\n permissions: (id: number | string) =>\n [...ssoQueryKeys.roles.all(), id, \"permissions\"] as const,\n },\n\n // =========================================================================\n // Permissions (permissionService)\n // =========================================================================\n permissions: {\n all: () => [...ssoQueryKeys.all, \"permissions\"] as const,\n list: (params?: { group?: string; search?: string; grouped?: boolean }) =>\n [...ssoQueryKeys.permissions.all(), \"list\", params] as const,\n detail: (id: number | string) =>\n [...ssoQueryKeys.permissions.all(), \"detail\", id] as const,\n matrix: () => [...ssoQueryKeys.permissions.all(), \"matrix\"] as const,\n },\n\n // =========================================================================\n // Teams (teamService)\n // =========================================================================\n teams: {\n all: () => [...ssoQueryKeys.all, \"teams\"] as const,\n list: () => [...ssoQueryKeys.teams.all(), \"list\"] as const,\n permissions: (teamId: number) =>\n [...ssoQueryKeys.teams.all(), teamId, \"permissions\"] as const,\n orphaned: () => [...ssoQueryKeys.teams.all(), \"orphaned\"] as const,\n },\n\n // =========================================================================\n // User Roles (userRoleService) - Scoped Role Assignments\n // =========================================================================\n userRoles: {\n all: () => [...ssoQueryKeys.all, \"user-roles\"] as const,\n list: (userId: string) =>\n [...ssoQueryKeys.userRoles.all(), userId] as const,\n byBranch: (userId: string, orgId: string, branchId: string | null) =>\n [...ssoQueryKeys.userRoles.all(), userId, orgId, branchId] as const,\n },\n\n // =========================================================================\n // Branches (branchService)\n // =========================================================================\n branches: {\n all: () => [...ssoQueryKeys.all, \"branches\"] as const,\n list: (orgId?: string) =>\n [...ssoQueryKeys.branches.all(), \"list\", orgId] as const,\n detail: (branchId: number) =>\n [...ssoQueryKeys.branches.all(), \"detail\", branchId] as const,\n headquarters: (orgId?: string) =>\n [...ssoQueryKeys.branches.all(), \"headquarters\", orgId] as const,\n primary: (orgId?: string) =>\n [...ssoQueryKeys.branches.all(), \"primary\", orgId] as const,\n },\n\n // =========================================================================\n // Admin variants (with org context)\n // =========================================================================\n admin: {\n roles: {\n all: (orgId: string) =>\n [...ssoQueryKeys.all, \"admin\", orgId, \"roles\"] as const,\n list: (orgId: string) =>\n [...ssoQueryKeys.admin.roles.all(orgId), \"list\"] as const,\n detail: (orgId: string, id: number | string) =>\n [...ssoQueryKeys.admin.roles.all(orgId), \"detail\", id] as const,\n permissions: (orgId: string, id: number | string) =>\n [...ssoQueryKeys.admin.roles.all(orgId), id, \"permissions\"] as const,\n },\n\n permissions: {\n all: (orgId: string) =>\n [...ssoQueryKeys.all, \"admin\", orgId, \"permissions\"] as const,\n list: (orgId: string, params?: { group?: string; search?: string; grouped?: boolean }) =>\n [...ssoQueryKeys.admin.permissions.all(orgId), \"list\", params] as const,\n detail: (orgId: string, id: number | string) =>\n [...ssoQueryKeys.admin.permissions.all(orgId), \"detail\", id] as const,\n matrix: (orgId: string) =>\n [...ssoQueryKeys.admin.permissions.all(orgId), \"matrix\"] as const,\n },\n\n teams: {\n all: (orgId: string) =>\n [...ssoQueryKeys.all, \"admin\", orgId, \"teams\"] as const,\n list: (orgId: string) =>\n [...ssoQueryKeys.admin.teams.all(orgId), \"list\"] as const,\n permissions: (orgId: string, teamId: number) =>\n [...ssoQueryKeys.admin.teams.all(orgId), teamId, \"permissions\"] as const,\n orphaned: (orgId: string) =>\n [...ssoQueryKeys.admin.teams.all(orgId), \"orphaned\"] as const,\n },\n\n userRoles: {\n all: (orgId: string) =>\n [...ssoQueryKeys.all, \"admin\", orgId, \"user-roles\"] as const,\n list: (orgId: string, userId: string) =>\n [...ssoQueryKeys.admin.userRoles.all(orgId), userId] as const,\n byBranch: (orgId: string, userId: string, consoleOrgId: string, branchId: string | null) =>\n [...ssoQueryKeys.admin.userRoles.all(orgId), userId, consoleOrgId, branchId] as const,\n },\n\n users: {\n all: (orgId: string) =>\n [...ssoQueryKeys.all, \"admin\", orgId, \"users\"] as const,\n list: (orgId: string, params?: { search?: string }) =>\n [...ssoQueryKeys.admin.users.all(orgId), \"list\", params] as const,\n detail: (orgId: string, id: string) =>\n [...ssoQueryKeys.admin.users.all(orgId), \"detail\", id] as const,\n permissions: (orgId: string, userId: string, consoleOrgId?: string, branchId?: string) =>\n [...ssoQueryKeys.admin.users.all(orgId), userId, \"permissions\", consoleOrgId, branchId] as const,\n },\n },\n} as const;\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { Modal, Select, Space, Typography, Badge, Spin, Button, Alert } from 'antd';\nimport { BankOutlined, ApartmentOutlined, CheckCircleFilled } from '@ant-design/icons';\nimport { useQuery } from '@tanstack/react-query';\nimport { useOrganization } from '../../../core/hooks/useOrganization';\nimport { useSsoContext } from '../../../core/context/SsoContext';\nimport { createBranchService, type BranchesResponse } from '../../../core/services/branchService';\nimport { ssoQueryKeys } from '../../../core/queryKeys';\nimport type { BranchGateProps } from '../../../core/types';\n\nconst { Text, Title } = Typography;\n\nconst DEFAULT_STORAGE_KEY = 'omnify_branch_gate_selection';\n\n// Re-export type from types.ts\nexport type { BranchGateSelection } from '../../../core/types';\n\ntype StoredSelection = {\n orgId: string;\n orgName: string;\n branchId: string;\n branchName: string;\n branchCode: string;\n};\n\n/**\n * BranchGate - Ensures user has selected an org/branch before accessing the app.\n * \n * Different from OrgBranchSelectorModal:\n * - OrgBranchSelectorModal: Modal for one-time selection (e.g., creating a project)\n * - BranchGate: Gate that blocks app access until selection is made, persists globally\n * \n * Auto-selection behavior:\n * - If user has only 1 org and 1 branch: auto-selects and allows access\n * - If user has multiple options: shows selection modal first\n * - Stores selection in localStorage for persistence\n * \n * @example\n * ```tsx\n * // In your app layout\n * function DashboardLayout({ children }) {\n * return (\n * <BranchGate\n * onSelectionChange={(selection) => {\n * // Set API headers globally\n * api.defaults.headers['X-Branch-Id'] = selection.branchId;\n * api.defaults.headers['X-Organization-Id'] = selection.orgId;\n * }}\n * >\n * {children}\n * </BranchGate>\n * );\n * }\n * ```\n */\nexport function BranchGate({\n children,\n onSelectionChange,\n storageKey = DEFAULT_STORAGE_KEY,\n loadingComponent,\n title,\n description,\n}: BranchGateProps) {\n const { config, isAuthenticated } = useSsoContext();\n const { organizations, currentOrg, hasMultipleOrgs } = useOrganization();\n\n // Stored selection\n const [storedSelection, setStoredSelection] = useState<StoredSelection | null>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n\n // Temp selection (UI state before confirm)\n const [tempOrgId, setTempOrgId] = useState<string | null>(null);\n const [tempBranchId, setTempBranchId] = useState<string | null>(null);\n\n // Branch service\n const branchService = React.useMemo(\n () => createBranchService({ apiUrl: config.apiUrl }),\n [config.apiUrl]\n );\n\n // Get org slug for branch fetching\n const activeOrgSlug = React.useMemo(() => {\n if (tempOrgId) {\n return organizations.find(o => String(o.id) === tempOrgId)?.slug;\n }\n return storedSelection?.orgId ?? currentOrg?.slug;\n }, [tempOrgId, organizations, storedSelection, currentOrg]);\n\n // Fetch branches\n const { data: branchesData, isLoading: branchesLoading } = useQuery<BranchesResponse>({\n queryKey: ssoQueryKeys.branches.list(activeOrgSlug),\n queryFn: () => branchService.list(activeOrgSlug),\n enabled: isAuthenticated && !!activeOrgSlug,\n });\n\n const branches = branchesData?.branches ?? [];\n const hasMultipleBranches = branches.length > 1;\n\n // Load from localStorage on mount\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const saved = localStorage.getItem(storageKey);\n if (saved) {\n try {\n const parsed = JSON.parse(saved) as StoredSelection;\n setStoredSelection(parsed);\n onSelectionChange?.(parsed);\n } catch {\n localStorage.removeItem(storageKey);\n }\n }\n setIsInitialized(true);\n }, [storageKey, onSelectionChange]);\n\n // Auto-select org if only one\n useEffect(() => {\n if (!isAuthenticated || !isInitialized || storedSelection) return;\n\n if (organizations.length === 1 && !tempOrgId) {\n setTempOrgId(String(organizations[0].id));\n }\n }, [isAuthenticated, isInitialized, organizations, storedSelection, tempOrgId]);\n\n // Auto-select branch if only one\n useEffect(() => {\n if (!tempOrgId || branchesLoading || storedSelection) return;\n\n if (branches.length === 1 && !tempBranchId) {\n setTempBranchId(String(branches[0].id));\n } else if (branches.length > 0 && !tempBranchId) {\n // Auto-select primary or HQ\n const primaryId = branchesData?.primary_branch_id;\n if (primaryId) {\n setTempBranchId(String(primaryId));\n } else {\n const hq = branches.find(b => b.is_headquarters);\n if (hq) {\n setTempBranchId(String(hq.id));\n }\n }\n }\n }, [tempOrgId, branches, branchesLoading, branchesData, storedSelection, tempBranchId]);\n\n // Auto-confirm if both are auto-selected and no UI needed\n useEffect(() => {\n if (storedSelection || !isInitialized) return;\n if (!tempOrgId || !tempBranchId || branchesLoading) return;\n\n // If no multiple choices, auto-confirm\n if (!hasMultipleOrgs && !hasMultipleBranches) {\n confirmSelection();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tempOrgId, tempBranchId, branchesLoading, hasMultipleOrgs, hasMultipleBranches, storedSelection, isInitialized]);\n\n const confirmSelection = React.useCallback(() => {\n if (!tempOrgId || !tempBranchId) return;\n\n const org = organizations.find(o => String(o.id) === tempOrgId);\n const branch = branches.find(b => String(b.id) === tempBranchId);\n\n if (!org || !branch) return;\n\n const selection: StoredSelection = {\n orgId: org.slug,\n orgName: org.name,\n branchId: String(branch.id),\n branchName: branch.name,\n branchCode: branch.code,\n };\n\n localStorage.setItem(storageKey, JSON.stringify(selection));\n setStoredSelection(selection);\n onSelectionChange?.(selection);\n\n // Clear temp\n setTempOrgId(null);\n setTempBranchId(null);\n }, [tempOrgId, tempBranchId, organizations, branches, storageKey, onSelectionChange]);\n\n const clearSelection = React.useCallback(() => {\n localStorage.removeItem(storageKey);\n setStoredSelection(null);\n onSelectionChange?.(null);\n }, [storageKey, onSelectionChange]);\n\n // Determine if selection is needed\n const needsSelection = isAuthenticated && isInitialized && !storedSelection && (hasMultipleOrgs || hasMultipleBranches);\n const isLoading = !isAuthenticated || !isInitialized || (!!activeOrgSlug && branchesLoading && !storedSelection);\n\n // Show loading while checking\n if (isLoading && !needsSelection) {\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n return (\n <div style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '100vh',\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n }}>\n <Spin size=\"large\" />\n </div>\n );\n }\n\n // Show selection modal if needed\n if (needsSelection) {\n const canConfirm = tempOrgId && tempBranchId;\n\n return (\n <div style={{\n minHeight: '100vh',\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 24,\n }}>\n <div style={{\n background: '#fff',\n borderRadius: 16,\n padding: 32,\n maxWidth: 480,\n width: '100%',\n boxShadow: '0 20px 60px rgba(0,0,0,0.3)',\n }}>\n <div style={{ textAlign: 'center', marginBottom: 24 }}>\n <div style={{\n width: 64,\n height: 64,\n borderRadius: '50%',\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '0 auto 16px',\n }}>\n <BankOutlined style={{ fontSize: 28, color: '#fff' }} />\n </div>\n <Title level={3} style={{ margin: 0 }}>\n {title ?? 'Select Organization'}\n </Title>\n <Text type=\"secondary\">\n {description ?? 'Please select your organization and branch to continue'}\n </Text>\n </div>\n\n {/* Organization Selection */}\n <div style={{ marginBottom: 20 }}>\n <Text strong style={{ display: 'block', marginBottom: 8 }}>\n <Space>\n <BankOutlined />\n <span>Organization</span>\n {!hasMultipleOrgs && <Badge status=\"success\" text=\"Auto-selected\" />}\n </Space>\n </Text>\n {hasMultipleOrgs ? (\n <Select\n value={tempOrgId}\n onChange={(value) => {\n setTempOrgId(String(value));\n setTempBranchId(null);\n }}\n placeholder=\"Select organization\"\n size=\"large\"\n style={{ width: '100%' }}\n optionLabelProp=\"label\"\n >\n {organizations.map((org) => (\n <Select.Option key={org.id} value={String(org.id)} label={org.name}>\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <div>\n <Text strong>{org.name}</Text>\n {org.serviceRole && (\n <Text type=\"secondary\" style={{ marginLeft: 8, fontSize: 12 }}>\n ({org.serviceRole})\n </Text>\n )}\n </div>\n </Space>\n </Select.Option>\n ))}\n </Select>\n ) : (\n <div style={{\n padding: '8px 12px',\n background: '#f5f5f5',\n borderRadius: 6,\n border: '1px solid #d9d9d9',\n }}>\n <Space>\n <BankOutlined style={{ color: '#1677ff' }} />\n <Text strong>{organizations[0]?.name}</Text>\n </Space>\n </div>\n )}\n </div>\n\n {/* Branch Selection */}\n {tempOrgId && (\n <div style={{ marginBottom: 24 }}>\n <Text strong style={{ display: 'block', marginBottom: 8 }}>\n <Space>\n <ApartmentOutlined />\n <span>Branch</span>\n {!hasMultipleBranches && branches.length === 1 && (\n <Badge status=\"success\" text=\"Auto-selected\" />\n )}\n </Space>\n </Text>\n {branchesLoading ? (\n <div style={{ padding: '12px', textAlign: 'center' }}>\n <Spin size=\"small\" />\n <Text type=\"secondary\" style={{ marginLeft: 8 }}>\n Loading...\n </Text>\n </div>\n ) : hasMultipleBranches ? (\n <Select\n value={tempBranchId}\n onChange={(value) => setTempBranchId(String(value))}\n placeholder=\"Select branch\"\n size=\"large\"\n style={{ width: '100%' }}\n optionLabelProp=\"label\"\n >\n {branches.map((branch) => (\n <Select.Option key={branch.id} value={String(branch.id)} label={branch.name}>\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <div>\n <Text strong>{branch.name}</Text>\n <Text type=\"secondary\" style={{ marginLeft: 8, fontSize: 12 }}>\n {branch.code}\n </Text>\n </div>\n <Space size={4}>\n {branch.is_headquarters && <Badge color=\"blue\" text=\"HQ\" />}\n {branch.is_primary && <Badge color=\"green\" text=\"Primary\" />}\n </Space>\n </Space>\n </Select.Option>\n ))}\n </Select>\n ) : branches.length === 1 ? (\n <div style={{\n padding: '8px 12px',\n background: '#f5f5f5',\n borderRadius: 6,\n border: '1px solid #d9d9d9',\n }}>\n <Space>\n <ApartmentOutlined style={{ color: '#1677ff' }} />\n <Text strong>{branches[0].name}</Text>\n <Text type=\"secondary\">({branches[0].code})</Text>\n </Space>\n </div>\n ) : (\n <Alert\n type=\"warning\"\n message=\"No branches available\"\n description=\"You don't have access to any branches in this organization.\"\n />\n )}\n </div>\n )}\n\n {/* Confirm Button */}\n <Button\n type=\"primary\"\n size=\"large\"\n block\n disabled={!canConfirm}\n onClick={confirmSelection}\n icon={<CheckCircleFilled />}\n style={{\n height: 48,\n fontSize: 16,\n background: canConfirm\n ? 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)'\n : undefined,\n border: 'none',\n }}\n >\n Confirm\n </Button>\n </div>\n </div>\n );\n }\n\n // Selection complete - render children\n return <>{children}</>;\n}\n\n// Export hook for accessing current selection\nexport function useBranchGate(storageKey = DEFAULT_STORAGE_KEY) {\n const [selection, setSelection] = useState<StoredSelection | null>(null);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const saved = localStorage.getItem(storageKey);\n if (saved) {\n try {\n setSelection(JSON.parse(saved));\n } catch {\n // ignore\n }\n }\n\n // Listen for storage changes\n const handleStorage = (e: StorageEvent) => {\n if (e.key === storageKey) {\n if (e.newValue) {\n try {\n setSelection(JSON.parse(e.newValue));\n } catch {\n setSelection(null);\n }\n } else {\n setSelection(null);\n }\n }\n };\n\n window.addEventListener('storage', handleStorage);\n return () => window.removeEventListener('storage', handleStorage);\n }, [storageKey]);\n\n const clearSelection = React.useCallback(() => {\n localStorage.removeItem(storageKey);\n setSelection(null);\n }, [storageKey]);\n\n return {\n selection,\n selectedOrg: selection ? { id: selection.orgId, slug: selection.orgId, name: selection.orgName } : null,\n selectedBranch: selection ? { id: selection.branchId, name: selection.branchName, code: selection.branchCode } : null,\n clearSelection,\n };\n}\n","'use client';\n\nimport {\n PlusOutlined,\n ReloadOutlined,\n SettingOutlined,\n DownOutlined,\n UpOutlined,\n} from '@ant-design/icons';\nimport { useQuery } from '@tanstack/react-query';\nimport {\n Card,\n Table,\n Form,\n Input,\n Select,\n DatePicker,\n InputNumber,\n Button,\n Space,\n Row,\n Col,\n Tooltip,\n Divider,\n Typography,\n Popconfirm,\n theme,\n} from 'antd';\nimport type { TableProps, TablePaginationConfig, TableColumnType } from 'antd';\nimport type { SorterResult, FilterValue, TableCurrentDataSource } from 'antd/es/table/interface';\nimport { useState, useMemo, useCallback, type ReactNode, type ComponentType } from 'react';\nimport type {\n ProTableProps,\n ProTableColumn,\n SearchField,\n QueryParams,\n ApiResponse,\n StatusConfig,\n} from './types.js';\n\nconst { Link } = Typography;\nconst { RangePicker } = DatePicker;\n\n// Try to import Inertia Link if available\nlet InertiaLink: ComponentType<{ href: string; children: ReactNode }> | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n InertiaLink = require('@inertiajs/react').Link;\n} catch {\n // Inertia not available, will use regular <a> tags\n}\n\n/**\n * Default i18n texts (Japanese)\n * Can be overridden via props\n */\nexport const DEFAULT_TEXTS = {\n search: '検索',\n reset: 'リセット',\n expand: '展開',\n collapse: '収納',\n add: '新規',\n refresh: '更新',\n columnSettings: '列設定',\n actions: '操作',\n yes: 'はい',\n no: 'いいえ',\n cancel: 'キャンセル',\n totalItems: (total: number) => `全 ${total} 件`,\n selectPlaceholder: '選択してください',\n inputPlaceholder: '入力してください',\n startDate: '開始日',\n endDate: '終了日',\n};\n\n// Default status colors\nconst DEFAULT_STATUS_CONFIG: StatusConfig = {\n active: { color: '#52c41a', text: '有効' },\n Active: { color: '#52c41a', text: '有効' },\n inactive: { color: '#d9d9d9', text: '無効' },\n Inactive: { color: '#d9d9d9', text: '無効' },\n pending: { color: '#faad14', text: '保留中' },\n Pending: { color: '#faad14', text: '保留中' },\n error: { color: '#ff4d4f', text: 'エラー' },\n Error: { color: '#ff4d4f', text: 'エラー' },\n closed: { color: '#ff4d4f', text: '閉鎖' },\n Closed: { color: '#ff4d4f', text: '閉鎖' },\n};\n\n/**\n * Render search field based on type\n */\nfunction renderSearchField(field: SearchField, texts: typeof DEFAULT_TEXTS): ReactNode {\n switch (field.type) {\n case 'select':\n return (\n <Select\n allowClear\n placeholder={field.placeholder || texts.selectPlaceholder}\n options={field.options}\n style={{ width: '100%' }}\n />\n );\n case 'date':\n return (\n <DatePicker\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n );\n case 'dateRange':\n return (\n <RangePicker\n placeholder={[texts.startDate, texts.endDate]}\n style={{ width: '100%' }}\n />\n );\n case 'number':\n return (\n <InputNumber\n placeholder={field.placeholder}\n style={{ width: '100%' }}\n />\n );\n default:\n return (\n <Input\n allowClear\n placeholder={field.placeholder || texts.inputPlaceholder}\n />\n );\n }\n}\n\n/**\n * Smart Link component - uses Inertia if available, otherwise regular <a>\n */\nfunction SmartLink({ href, children }: { href: string; children: ReactNode }) {\n if (InertiaLink) {\n return <InertiaLink href={href}>{children}</InertiaLink>;\n }\n return <a href={href}>{children}</a>;\n}\n\n/**\n * Render value based on valueType\n */\nfunction renderValue(\n value: unknown,\n valueType?: string,\n statusConfig?: StatusConfig\n): ReactNode {\n if (value === null || value === undefined) {\n return '-';\n }\n\n switch (valueType) {\n case 'status': {\n const config = { ...DEFAULT_STATUS_CONFIG, ...statusConfig };\n const statusValue = String(value);\n const status = config[statusValue] || { color: '#d9d9d9', text: statusValue };\n return (\n <Space>\n <span\n style={{\n display: 'inline-block',\n width: 6,\n height: 6,\n borderRadius: '50%',\n backgroundColor: status.color,\n }}\n />\n {status.text}\n </Space>\n );\n }\n case 'date':\n return value ? new Date(String(value)).toLocaleDateString('ja-JP') : '-';\n case 'datetime':\n return value ? new Date(String(value)).toLocaleString('ja-JP') : '-';\n case 'number':\n return typeof value === 'number' ? value.toLocaleString('ja-JP') : String(value);\n case 'currency':\n return typeof value === 'number'\n ? `¥${value.toLocaleString('ja-JP')}`\n : String(value);\n case 'boolean':\n return value ? 'はい' : 'いいえ';\n default:\n return String(value);\n }\n}\n\n/**\n * ProTable Component\n * A feature-rich table with search, filter, sort, and pagination\n */\nexport function ProTable<T extends object>({\n // Header\n title,\n icon,\n subTitle,\n \n // Search\n searchFields = [],\n defaultSearchValues = {},\n \n // Columns\n columns,\n \n // Data\n dataSource: externalDataSource,\n rowKey = 'id',\n loading: externalLoading,\n \n // Query\n queryKey,\n queryFn,\n queryResult: externalQueryResult,\n queryEnabled = true,\n \n // Toolbar\n onAdd,\n addButtonLink,\n addLabel = '新規',\n toolbarExtra,\n showRefresh = true,\n showColumnSettings = true,\n \n // Row actions\n rowActions,\n \n // Pagination\n pagination = true,\n defaultPageSize = 15,\n \n // Events\n onSearch,\n onReset,\n onChange,\n \n // Style\n className,\n style,\n cardStyle,\n tableProps,\n \n // i18n\n texts: customTexts,\n}: ProTableProps<T>) {\n const { token } = theme.useToken();\n const texts = { ...DEFAULT_TEXTS, ...customTexts };\n const [searchForm] = Form.useForm();\n const [expanded, setExpanded] = useState(false);\n const [queryParams, setQueryParams] = useState<QueryParams>({\n page: 1,\n per_page: defaultPageSize,\n ...defaultSearchValues,\n });\n\n // Separate visible and hidden search fields\n const visibleFields = searchFields.filter((f) => !f.hidden);\n const hiddenFields = searchFields.filter((f) => f.hidden);\n const hasHiddenFields = hiddenFields.length > 0;\n\n // Internal query if queryFn provided\n const internalQuery = useQuery({\n queryKey: queryKey ? [...queryKey, queryParams] : ['proTable', queryParams],\n queryFn: () => queryFn!(queryParams),\n enabled: !!queryFn && queryEnabled,\n });\n\n // Use external or internal query result\n const queryResult = externalQueryResult || internalQuery;\n const dataSource = externalDataSource || queryResult.data?.data || [];\n const loading = externalLoading ?? queryResult.isLoading;\n const meta = queryResult.data?.meta;\n\n // Handle search\n const handleSearch = useCallback((values: Record<string, unknown>) => {\n const newParams = {\n ...queryParams,\n ...values,\n page: 1,\n };\n setQueryParams(newParams);\n onSearch?.(values);\n }, [queryParams, onSearch]);\n\n // Handle reset\n const handleReset = useCallback(() => {\n searchForm.resetFields();\n const newParams = {\n page: 1,\n per_page: defaultPageSize,\n };\n setQueryParams(newParams);\n onReset?.();\n }, [searchForm, defaultPageSize, onReset]);\n\n // Handle table change (pagination, sort)\n const handleTableChange = useCallback(\n (\n pag: TablePaginationConfig,\n _filters: Record<string, FilterValue | null>,\n sorter: SorterResult<T> | SorterResult<T>[],\n _extra: TableCurrentDataSource<T>\n ) => {\n const sortInfo = Array.isArray(sorter) ? sorter[0] : sorter;\n const newParams: QueryParams = {\n ...queryParams,\n page: pag.current || 1,\n per_page: pag.pageSize || defaultPageSize,\n };\n\n if (sortInfo?.field && sortInfo?.order) {\n newParams.sort = String(sortInfo.field);\n newParams.order = sortInfo.order === 'ascend' ? 'asc' : 'desc';\n } else {\n delete newParams.sort;\n delete newParams.order;\n }\n\n setQueryParams(newParams);\n onChange?.(pag, _filters, sorter, _extra);\n },\n [queryParams, defaultPageSize, onChange]\n );\n\n // Build table columns\n const tableColumns = useMemo(() => {\n const cols: TableColumnType<T>[] = columns\n .filter((col) => !col.hidden)\n .map((col) => ({\n ...col,\n key: col.key || (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : col.dataIndex),\n sorter: col.sortable ? true : undefined,\n render: col.render\n ? col.render\n : (value: unknown) => renderValue(value, col.valueType, col.statusConfig),\n }));\n\n // Add actions column if rowActions provided\n if (rowActions) {\n cols.push({\n title: texts.actions,\n key: '_actions',\n width: 150,\n render: (_: unknown, record: T) => {\n const actions = rowActions(record).filter(\n (a) => !a.hidden?.(record)\n );\n return (\n <Space size={0}>\n {actions.map((action, idx) => {\n const isLast = idx === actions.length - 1;\n \n let actionElement: ReactNode;\n \n // If action has href, render as Smart Link\n if (action.href) {\n actionElement = (\n <SmartLink href={action.href}>\n <Link style={action.danger ? { color: token.colorError } : undefined}>\n {action.label}\n </Link>\n </SmartLink>\n );\n } else {\n const linkElement = (\n <Link\n style={action.danger ? { color: token.colorError } : undefined}\n onClick={\n action.confirm\n ? undefined\n : () => action.onClick?.(record)\n }\n >\n {action.label}\n </Link>\n );\n\n if (action.confirm) {\n actionElement = (\n <Popconfirm\n title={\n typeof action.confirm === 'string'\n ? action.confirm\n : `${action.label}しますか?`\n }\n onConfirm={() => action.onClick?.(record)}\n okText={texts.yes}\n cancelText={texts.cancel}\n okButtonProps={action.danger ? { danger: true } : undefined}\n >\n {linkElement}\n </Popconfirm>\n );\n } else {\n actionElement = linkElement;\n }\n }\n \n return (\n <span key={idx}>\n {actionElement}\n {!isLast && <Divider type=\"vertical\" />}\n </span>\n );\n })}\n </Space>\n );\n },\n });\n }\n\n return cols;\n }, [columns, rowActions, texts]);\n\n // Pagination config\n const paginationConfig = useMemo(() => {\n if (pagination === false) return false;\n \n return {\n current: meta?.current_page || queryParams.page,\n pageSize: meta?.per_page || queryParams.per_page,\n total: meta?.total || 0,\n showSizeChanger: true,\n showTotal: texts.totalItems,\n ...(typeof pagination === 'object' ? pagination : {}),\n };\n }, [pagination, meta, queryParams, texts]);\n\n return (\n <div className={className} style={style}>\n {/* Search Card */}\n {searchFields.length > 0 && (\n <Card style={{ marginBottom: 24, ...cardStyle }}>\n <Form\n form={searchForm}\n layout=\"horizontal\"\n onFinish={handleSearch}\n labelCol={{ flex: '100px' }}\n wrapperCol={{ flex: 1 }}\n initialValues={defaultSearchValues}\n >\n <Row gutter={24}>\n {visibleFields.map((field) => (\n <Col key={field.name} span={8}>\n <Form.Item name={field.name} label={field.label}>\n {renderSearchField(field, texts)}\n </Form.Item>\n </Col>\n ))}\n <Col span={visibleFields.length === 1 ? 16 : 8} style={{ textAlign: 'right' }}>\n <Space>\n <Button onClick={handleReset}>{texts.reset}</Button>\n <Button type=\"primary\" htmlType=\"submit\">\n {texts.search}\n </Button>\n {hasHiddenFields && (\n <Button\n type=\"link\"\n onClick={() => setExpanded(!expanded)}\n >\n {expanded ? texts.collapse : texts.expand}\n {expanded ? <UpOutlined /> : <DownOutlined />}\n </Button>\n )}\n </Space>\n </Col>\n </Row>\n\n {/* Expanded fields */}\n {expanded && hiddenFields.length > 0 && (\n <Row gutter={24} style={{ marginTop: 16 }}>\n {hiddenFields.map((field) => (\n <Col key={field.name} span={8}>\n <Form.Item name={field.name} label={field.label}>\n {renderSearchField(field, texts)}\n </Form.Item>\n </Col>\n ))}\n </Row>\n )}\n </Form>\n </Card>\n )}\n\n {/* List Card */}\n <Card\n title={\n <Space>\n {icon}\n {title}\n {subTitle && (\n <span style={{ \n fontWeight: 'normal', \n fontSize: 14,\n color: token.colorTextSecondary \n }}>\n {subTitle}\n </span>\n )}\n </Space>\n }\n extra={\n <Space size=\"small\">\n {toolbarExtra}\n {addButtonLink && (\n <SmartLink href={addButtonLink}>\n <Button type=\"primary\" icon={<PlusOutlined />}>\n {addLabel || texts.add}\n </Button>\n </SmartLink>\n )}\n {onAdd && !addButtonLink && (\n <Button type=\"primary\" icon={<PlusOutlined />} onClick={onAdd}>\n {addLabel || texts.add}\n </Button>\n )}\n {showRefresh && (\n <Tooltip title={texts.refresh}>\n <Button\n icon={<ReloadOutlined />}\n onClick={() => queryResult.refetch?.()}\n loading={queryResult.isFetching}\n />\n </Tooltip>\n )}\n {showColumnSettings && (\n <Tooltip title={texts.columnSettings}>\n <Button icon={<SettingOutlined />} />\n </Tooltip>\n )}\n </Space>\n }\n style={cardStyle}\n >\n <Table<T>\n {...tableProps}\n columns={tableColumns}\n dataSource={dataSource as T[]}\n rowKey={rowKey}\n loading={loading}\n pagination={paginationConfig}\n onChange={handleTableChange}\n />\n </Card>\n </div>\n );\n}\n\nexport default ProTable;\n","'use client';\n\nimport { Breadcrumb, Space, theme } from 'antd';\nimport type { BreadcrumbProps } from 'antd';\nimport type { ReactNode } from 'react';\n\nexport interface PageContainerProps {\n /**\n * Page title\n */\n title?: ReactNode;\n /**\n * Subtitle displayed below the title\n */\n subTitle?: ReactNode;\n /**\n * Icon displayed before the title\n */\n icon?: ReactNode;\n /**\n * Extra content displayed on the right side of the header\n */\n extra?: ReactNode;\n /**\n * Breadcrumb configuration\n * Can be BreadcrumbProps or array of { title: string, href?: string }\n */\n breadcrumb?: BreadcrumbProps | { title: ReactNode; href?: string }[];\n /**\n * Content of the page\n */\n children?: ReactNode;\n /**\n * Whether to show the header background\n * @default true\n */\n showHeader?: boolean;\n /**\n * Custom className for the container\n */\n className?: string;\n /**\n * Custom style for the container\n */\n style?: React.CSSProperties;\n}\n\n/**\n * PageContainer - A standard page layout component\n *\n * Provides consistent page structure with:\n * - Breadcrumb navigation\n * - Page title with optional icon and subtitle\n * - Extra actions area (right side)\n * - Content area\n *\n * @example\n * ```tsx\n * <PageContainer\n * title=\"従業員管理\"\n * subTitle=\"従業員情報の一覧と管理\"\n * icon={<UserOutlined />}\n * breadcrumb={[\n * { title: 'リスト' },\n * { title: '従業員管理' },\n * ]}\n * extra={\n * <Button type=\"primary\" icon={<PlusOutlined />}>\n * 新規\n * </Button>\n * }\n * >\n * <Card>...</Card>\n * </PageContainer>\n * ```\n */\nexport function PageContainer({\n title,\n subTitle,\n icon,\n extra,\n breadcrumb,\n children,\n showHeader = true,\n className,\n style,\n}: PageContainerProps) {\n const { token } = theme.useToken();\n\n // Convert breadcrumb array to BreadcrumbProps if needed\n const breadcrumbProps: BreadcrumbProps | undefined = breadcrumb\n ? Array.isArray(breadcrumb)\n ? { items: breadcrumb }\n : breadcrumb\n : undefined;\n\n const hasHeader = showHeader && (title || subTitle || breadcrumb);\n\n return (\n <div className={className} style={style}>\n {/* Header Section */}\n {hasHeader && (\n <div\n style={{\n marginBottom: 24,\n }}\n >\n {/* Breadcrumb */}\n {breadcrumbProps && (\n <Breadcrumb\n {...breadcrumbProps}\n style={{\n marginBottom: 12,\n ...breadcrumbProps.style,\n }}\n />\n )}\n\n {/* Title Row */}\n {(title || extra) && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n }}\n >\n {/* Title & Subtitle */}\n <div>\n {title && (\n <h1\n style={{\n margin: 0,\n fontSize: 20,\n fontWeight: 600,\n lineHeight: 1.4,\n color: token.colorText,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n {icon && (\n <span style={{ fontSize: 20 }}>{icon}</span>\n )}\n {title}\n </h1>\n )}\n {subTitle && (\n <div\n style={{\n marginTop: 4,\n fontSize: 14,\n color: token.colorTextSecondary,\n }}\n >\n {subTitle}\n </div>\n )}\n </div>\n\n {/* Extra Actions */}\n {extra && (\n <div style={{ flexShrink: 0 }}>\n {extra}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Content */}\n {children}\n </div>\n );\n}\n\nexport default PageContainer;\n","'use client';\n\nimport { GlobalOutlined } from '@ant-design/icons';\nimport { Select } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { locales, localeNames, type Locale } from '../../../core/i18n';\n\nexport default function LocaleSwitcher() {\n const { i18n } = useTranslation();\n const locale = (i18n.language as Locale) || 'ja';\n\n const handleChange = (newLocale: Locale) => {\n i18n.changeLanguage(newLocale);\n document.cookie = `locale=${newLocale};path=/;max-age=31536000`;\n };\n\n return (\n <Select\n value={locale}\n onChange={handleChange}\n style={{ width: 100 }}\n size=\"small\"\n suffixIcon={<GlobalOutlined />}\n options={locales.map((l) => ({\n value: l,\n label: localeNames[l],\n }))}\n />\n );\n}\n","'use client';\n\nimport { createContext, useContext, useCallback, useState, useEffect, useMemo, type ReactNode } from 'react';\nimport { useTranslation, I18nextProvider, initReactI18next } from 'react-i18next';\nimport i18n from 'i18next';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type Locale = 'ja' | 'en' | 'vi';\n\nexport const locales: Locale[] = ['ja', 'en', 'vi'];\n\nexport const localeNames: Record<Locale, string> = {\n ja: '日本語',\n en: 'English',\n vi: 'Tiếng Việt',\n};\n\nexport const defaultLocale: Locale = 'ja';\n\nexport interface I18nContextValue {\n locale: Locale;\n setLocale: (locale: Locale) => void;\n t: (key: string, options?: Record<string, unknown>) => string;\n}\n\nexport interface I18nProviderProps {\n children: ReactNode;\n defaultLocale?: Locale;\n fallbackLocale?: Locale;\n translations?: Record<string, Record<string, unknown>>;\n}\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst I18nContext = createContext<I18nContextValue | null>(null);\n\n// =============================================================================\n// i18n Initialization\n// =============================================================================\n\nlet i18nInitialized = false;\n\nfunction initializeI18n(\n initialLocale: Locale,\n fallbackLocale: Locale,\n translations?: Record<string, Record<string, unknown>>\n) {\n if (i18nInitialized) {\n return i18n;\n }\n\n const resources: Record<string, { translation: Record<string, unknown> }> = {};\n\n // Add default SSO translations\n for (const locale of locales) {\n resources[locale] = {\n translation: {\n ...defaultTranslations[locale],\n ...(translations?.[locale] || {}),\n },\n };\n }\n\n i18n.use(initReactI18next).init({\n resources,\n lng: initialLocale,\n fallbackLng: fallbackLocale,\n interpolation: {\n escapeValue: false,\n },\n react: {\n useSuspense: false,\n },\n });\n\n i18nInitialized = true;\n return i18n;\n}\n\n// =============================================================================\n// Provider\n// =============================================================================\n\nexport function I18nProvider({\n children,\n defaultLocale: initialLocale = 'ja',\n fallbackLocale = 'ja',\n translations,\n}: I18nProviderProps) {\n // Initialize i18n on first render\n const i18nInstance = useMemo(\n () => initializeI18n(initialLocale, fallbackLocale, translations),\n [initialLocale, fallbackLocale, translations]\n );\n\n return (\n <I18nextProvider i18n={i18nInstance}>\n <I18nProviderInner initialLocale={initialLocale}>\n {children}\n </I18nProviderInner>\n </I18nextProvider>\n );\n}\n\nfunction I18nProviderInner({\n children,\n initialLocale,\n}: {\n children: ReactNode;\n initialLocale: Locale;\n}) {\n const [locale, setLocaleState] = useState<Locale>(initialLocale);\n const { t: translate, i18n: i18nInstance } = useTranslation();\n\n const setLocale = useCallback((newLocale: Locale) => {\n setLocaleState(newLocale);\n i18nInstance?.changeLanguage(newLocale);\n // Store in cookie for SSR\n if (typeof document !== 'undefined') {\n document.cookie = `locale=${newLocale};path=/;max-age=31536000`;\n }\n }, [i18nInstance]);\n\n const t = useCallback((key: string, options?: Record<string, unknown>): string => {\n return String(translate(key, options as never));\n }, [translate]);\n\n // Initialize locale from cookie or browser\n useEffect(() => {\n if (typeof document !== 'undefined') {\n const cookieLocale = document.cookie\n .split('; ')\n .find(row => row.startsWith('locale='))\n ?.split('=')[1] as Locale | undefined;\n\n if (cookieLocale && locales.includes(cookieLocale)) {\n setLocale(cookieLocale);\n }\n }\n }, [setLocale]);\n\n return (\n <I18nContext.Provider value={{ locale, setLocale, t }}>\n {children}\n </I18nContext.Provider>\n );\n}\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nexport function useLocale(): Locale {\n const context = useContext(I18nContext);\n const { i18n: i18nInstance } = useTranslation();\n\n if (context) {\n return context.locale;\n }\n\n // Fallback to i18next language\n return (i18nInstance?.language as Locale) || defaultLocale;\n}\n\nexport function useTranslations() {\n const { t } = useTranslation();\n return t;\n}\n\nexport function useSsoTranslation() {\n return useTranslation('sso');\n}\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport function getCurrentLocale(): Locale {\n if (typeof document !== 'undefined') {\n const cookieLocale = document.cookie\n .split('; ')\n .find(row => row.startsWith('locale='))\n ?.split('=')[1] as Locale | undefined;\n\n if (cookieLocale && locales.includes(cookieLocale)) {\n return cookieLocale;\n }\n }\n return defaultLocale;\n}\n\nexport function changeLanguage(locale: Locale): void {\n i18n.changeLanguage(locale);\n if (typeof document !== 'undefined') {\n document.cookie = `locale=${locale};path=/;max-age=31536000`;\n }\n}\n\n// =============================================================================\n// Default Translations (SSO namespace)\n// =============================================================================\n\nexport const ssoNamespace = 'sso';\n\nexport const defaultTranslations = {\n ja: {\n login: 'ログイン',\n logout: 'ログアウト',\n loading: '読み込み中...',\n error: 'エラーが発生しました',\n retry: '再試行',\n cancel: 'キャンセル',\n save: '保存',\n delete: '削除',\n edit: '編集',\n create: '新規作成',\n search: '検索',\n reset: 'リセット',\n noData: 'データがありません',\n confirmDelete: '削除してもよろしいですか?',\n },\n en: {\n login: 'Login',\n logout: 'Logout',\n loading: 'Loading...',\n error: 'An error occurred',\n retry: 'Retry',\n cancel: 'Cancel',\n save: 'Save',\n delete: 'Delete',\n edit: 'Edit',\n create: 'Create',\n search: 'Search',\n reset: 'Reset',\n noData: 'No data',\n confirmDelete: 'Are you sure you want to delete?',\n },\n vi: {\n login: 'Đăng nhập',\n logout: 'Đăng xuất',\n loading: 'Đang tải...',\n error: 'Đã xảy ra lỗi',\n retry: 'Thử lại',\n cancel: 'Hủy',\n save: 'Lưu',\n delete: 'Xóa',\n edit: 'Sửa',\n create: 'Tạo mới',\n search: 'Tìm kiếm',\n reset: 'Đặt lại',\n noData: 'Không có dữ liệu',\n confirmDelete: 'Bạn có chắc chắn muốn xóa?',\n },\n};\n","'use client';\n\nimport {\n SafetyOutlined,\n GlobalOutlined,\n BankOutlined,\n BranchesOutlined,\n} from '@ant-design/icons';\nimport {\n Modal,\n Form,\n Select,\n Radio,\n Button,\n Space,\n Tag,\n Typography,\n} from 'antd';\nimport { useState } from 'react';\nimport type { Role } from '../../../core/services/roleService';\n\n// Use minimal types for flexibility\nexport interface OrganizationLike {\n id: string | number;\n name: string;\n slug?: string;\n}\n\nexport interface BranchLike {\n id: string | number;\n name: string;\n}\nimport { ScopeLabel, getScopeColor } from '../ScopeUtils';\n\nconst { Text } = Typography;\n\nexport interface UserRoleAssignModalProps {\n open: boolean;\n userName?: string;\n roles: Role[];\n organizations: OrganizationLike[];\n branches?: BranchLike[];\n currentOrgId?: string;\n loading?: boolean;\n onAssign: (values: {\n role_id: string;\n scope: 'global' | 'org-wide' | 'branch';\n org_id?: string;\n branch_ids?: string[];\n }) => void | Promise<void>;\n onCancel: () => void;\n translations?: {\n title?: string;\n selectRole?: string;\n scope?: string;\n global?: string;\n orgWide?: string;\n branchSpecific?: string;\n organization?: string;\n selectBranches?: string;\n assign?: string;\n cancel?: string;\n assignRole?: string;\n required?: string;\n };\n}\n\nconst defaultTranslations = {\n title: 'ロール割り当て',\n selectRole: 'ロールを選択',\n scope: 'スコープ',\n global: 'グローバル',\n orgWide: '組織全体',\n branchSpecific: '拠点限定',\n organization: '組織',\n selectBranches: '拠点を選択',\n assign: '割り当て',\n cancel: 'キャンセル',\n assignRole: 'ロール割り当て',\n required: '必須項目です',\n};\n\nexport function UserRoleAssignModal({\n open,\n userName,\n roles,\n organizations,\n branches,\n currentOrgId,\n loading = false,\n onAssign,\n onCancel,\n translations: t = {},\n}: UserRoleAssignModalProps) {\n const [form] = Form.useForm();\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const labels = { ...defaultTranslations, ...t };\n\n const handleFinish = async (values: {\n role_id: string;\n scope: 'global' | 'org-wide' | 'branch';\n org_id?: string;\n branch_ids?: string[];\n }) => {\n setIsSubmitting(true);\n try {\n await onAssign(values);\n form.resetFields();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleCancel = () => {\n form.resetFields();\n onCancel();\n };\n\n return (\n <Modal\n title={\n <Space>\n <SafetyOutlined />\n {labels.title} {userName ? `- ${userName}` : ''}\n </Space>\n }\n open={open}\n onCancel={handleCancel}\n footer={null}\n destroyOnHidden\n >\n <Form\n form={form}\n layout=\"vertical\"\n onFinish={handleFinish}\n initialValues={{ scope: 'org-wide', org_id: currentOrgId }}\n >\n <Form.Item\n name=\"role_id\"\n label={labels.selectRole}\n rules={[{ required: true, message: labels.required }]}\n >\n <Select placeholder={labels.selectRole}>\n {roles.map((role) => (\n <Select.Option key={role.id} value={role.id}>\n {role.name}\n </Select.Option>\n ))}\n </Select>\n </Form.Item>\n\n <Form.Item name=\"scope\" label={labels.scope}>\n <Radio.Group>\n <Radio value=\"global\">\n <ScopeLabel scope=\"global\" label={labels.global} />\n </Radio>\n <Radio value=\"org-wide\">\n <ScopeLabel scope=\"org-wide\" label={labels.orgWide} />\n </Radio>\n <Radio value=\"branch\">\n <ScopeLabel scope=\"branch\" label={labels.branchSpecific} />\n </Radio>\n </Radio.Group>\n </Form.Item>\n\n {/* Org selector - show when org-wide or branch scope */}\n <Form.Item noStyle shouldUpdate={(prev, curr) => prev.scope !== curr.scope}>\n {({ getFieldValue }) =>\n (getFieldValue('scope') === 'org-wide' || getFieldValue('scope') === 'branch') && (\n <Form.Item\n name=\"org_id\"\n label={labels.organization}\n rules={[{ required: true, message: labels.required }]}\n >\n <Select placeholder={labels.organization}>\n {organizations.map((org) => (\n <Select.Option key={org.id} value={String(org.id)}>\n <Space>\n <BankOutlined />\n {org.name}\n </Space>\n </Select.Option>\n ))}\n </Select>\n </Form.Item>\n )\n }\n </Form.Item>\n\n {/* Branch selector - show when branch scope */}\n <Form.Item noStyle shouldUpdate={(prev, curr) => prev.scope !== curr.scope}>\n {({ getFieldValue }) =>\n getFieldValue('scope') === 'branch' && (\n <Form.Item\n name=\"branch_ids\"\n label={labels.selectBranches}\n rules={[{ required: true, message: labels.required }]}\n >\n <Select mode=\"multiple\" placeholder={labels.selectBranches}>\n {branches?.map((branch) => (\n <Select.Option key={branch.id} value={String(branch.id)}>\n {branch.name}\n </Select.Option>\n ))}\n </Select>\n </Form.Item>\n )\n }\n </Form.Item>\n\n {/* Preview text */}\n <Form.Item noStyle shouldUpdate>\n {({ getFieldValue }) => {\n const scope = getFieldValue('scope');\n const selectedOrgId = getFieldValue('org_id');\n const selectedBranchIds = getFieldValue('branch_ids') || [];\n const selectedRole = roles.find((r) => r.id === getFieldValue('role_id'));\n const selectedOrg = organizations.find((o) => String(o.id) === selectedOrgId);\n const selectedBranches =\n branches?.filter((b) => selectedBranchIds.includes(String(b.id))) || [];\n\n if (!selectedRole) return null;\n\n let scopeText = '';\n if (scope === 'global') {\n scopeText = labels.global;\n } else if (scope === 'org-wide' && selectedOrg) {\n scopeText = `${selectedOrg.name} (${labels.orgWide})`;\n } else if (scope === 'branch' && selectedBranches.length > 0) {\n scopeText = selectedBranches.map((b) => b.name).join(', ');\n }\n\n return scopeText ? (\n <div\n style={{\n padding: '8px 12px',\n background: '#f5f5f5',\n borderRadius: 4,\n marginBottom: 16,\n }}\n >\n <Text type=\"secondary\">\n {labels.assignRole}: <Text strong>{selectedRole.name}</Text>\n {' → '}\n <Tag color={getScopeColor(scope)}>{scopeText}</Tag>\n </Text>\n </div>\n ) : null;\n }}\n </Form.Item>\n\n <Form.Item>\n <Space>\n <Button type=\"primary\" htmlType=\"submit\" loading={loading || isSubmitting}>\n {labels.assign}\n </Button>\n <Button onClick={handleCancel}>{labels.cancel}</Button>\n </Space>\n </Form.Item>\n </Form>\n </Modal>\n );\n}\n","'use client';\n\nimport { GlobalOutlined, BankOutlined, BranchesOutlined } from '@ant-design/icons';\nimport { Tag, Space } from 'antd';\nimport type { ReactNode } from 'react';\n\nexport type ScopeType = 'global' | 'org-wide' | 'branch';\n\n/**\n * Get icon for scope type\n */\nexport function getScopeIcon(scope: ScopeType | string): ReactNode {\n switch (scope) {\n case 'global':\n return <GlobalOutlined />;\n case 'org-wide':\n return <BankOutlined />;\n case 'branch':\n return <BranchesOutlined />;\n default:\n return null;\n }\n}\n\n/**\n * Get color for scope type\n */\nexport function getScopeColor(scope: ScopeType | string): string {\n switch (scope) {\n case 'global':\n return 'purple';\n case 'org-wide':\n return 'blue';\n case 'branch':\n return 'green';\n default:\n return 'default';\n }\n}\n\nexport interface ScopeTagProps {\n scope: ScopeType | string;\n label?: string;\n showIcon?: boolean;\n}\n\n/**\n * Tag component for displaying scope\n */\nexport function ScopeTag({ scope, label, showIcon = true }: ScopeTagProps) {\n return (\n <Tag color={getScopeColor(scope)} icon={showIcon ? getScopeIcon(scope) : undefined}>\n {label || scope}\n </Tag>\n );\n}\n\nexport interface ScopeLabelProps {\n scope: ScopeType | string;\n label: string;\n}\n\n/**\n * Label with icon for scope\n */\nexport function ScopeLabel({ scope, label }: ScopeLabelProps) {\n return (\n <Space>\n {getScopeIcon(scope)}\n {label}\n </Space>\n );\n}\n","'use client';\n\nimport {\n UserOutlined,\n SafetyOutlined,\n GlobalOutlined,\n BankOutlined,\n BranchesOutlined,\n TeamOutlined,\n PlusOutlined,\n DeleteOutlined,\n} from '@ant-design/icons';\nimport {\n Modal,\n Card,\n Tag,\n Space,\n Collapse,\n Empty,\n Spin,\n Button,\n Popconfirm,\n Typography,\n} from 'antd';\nimport type { UserPermissionsBreakdown } from '../../../core/services/userService';\n\n// Use minimal types for flexibility\nexport interface OrganizationLike {\n id: string | number;\n name: string;\n slug?: string;\n}\n\nexport interface BranchLike {\n id: string | number;\n name: string;\n}\nimport { getScopeIcon, getScopeColor } from '../ScopeUtils';\n\nconst { Text } = Typography;\n\nexport interface UserPermissionsModalProps {\n open: boolean;\n userName?: string;\n permissions?: UserPermissionsBreakdown | null;\n loading?: boolean;\n currentOrg?: OrganizationLike | null;\n currentBranch?: BranchLike | null;\n branches?: BranchLike[];\n onClose: () => void;\n onAddRole?: () => void;\n onAddTeam?: () => void;\n onRemoveRole?: (roleId: string, orgId?: string | null, branchId?: string | null) => void;\n translations?: {\n permissionBreakdown?: string;\n userInfo?: string;\n email?: string;\n primaryOrganization?: string;\n global?: string;\n currentContext?: string;\n roleAssignments?: string;\n noRolesAssigned?: string;\n add?: string;\n permissions?: string;\n teamMemberships?: string;\n noTeamMemberships?: string;\n teamLeader?: string;\n teamsFromConsole?: string;\n aggregatedPermissions?: string;\n noData?: string;\n ungrouped?: string;\n orgWide?: string;\n confirmRemoveRole?: string;\n };\n}\n\nconst defaultTranslations = {\n permissionBreakdown: '権限ブレークダウン',\n userInfo: 'ユーザー情報',\n email: 'メール',\n primaryOrganization: '所属組織',\n global: 'グローバル',\n currentContext: '現在のコンテキスト',\n roleAssignments: 'ロール割り当て',\n noRolesAssigned: 'ロールが割り当てられていません',\n add: '追加',\n permissions: '権限',\n teamMemberships: 'チームメンバーシップ',\n noTeamMemberships: 'チームに所属していません',\n teamLeader: 'リーダー',\n teamsFromConsole: 'チームはコンソールから管理します',\n aggregatedPermissions: '集約された権限',\n noData: 'データがありません',\n ungrouped: '未分類',\n orgWide: '組織全体',\n confirmRemoveRole: 'このロールを削除してもよろしいですか?',\n};\n\nexport function UserPermissionsModal({\n open,\n userName,\n permissions,\n loading = false,\n currentOrg,\n currentBranch,\n branches,\n onClose,\n onAddRole,\n onAddTeam,\n onRemoveRole,\n translations: t = {},\n}: UserPermissionsModalProps) {\n const labels = { ...defaultTranslations, ...t };\n\n const getBranchName = (branchId: string | null) => {\n if (!branchId || !branches) return '';\n const branch = branches.find((b) => String(b.id) === branchId);\n return branch?.name || branchId;\n };\n\n return (\n <Modal\n title={\n <Space>\n <UserOutlined />\n {userName} - {labels.permissionBreakdown}\n </Space>\n }\n open={open}\n onCancel={onClose}\n footer={null}\n width={800}\n destroyOnHidden\n >\n {loading ? (\n <div style={{ textAlign: 'center', padding: 40 }}>\n <Spin size=\"large\" />\n </div>\n ) : permissions ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {/* User Info with Primary Organization */}\n <Card size=\"small\" title={labels.userInfo}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <div>\n <Text type=\"secondary\">{labels.email}: </Text>\n <Text>{permissions.user?.email}</Text>\n </div>\n <div>\n <Text type=\"secondary\">{labels.primaryOrganization}: </Text>\n {permissions.user?.organization ? (\n <Tag icon={<BankOutlined />} color=\"blue\">\n {permissions.user.organization.name}\n </Tag>\n ) : (\n <Tag icon={<GlobalOutlined />} color=\"purple\">\n {labels.global}\n </Tag>\n )}\n </div>\n </div>\n </Card>\n\n {/* Current Context */}\n <Card size=\"small\" title={labels.currentContext}>\n <Space wrap>\n {currentOrg && (\n <Tag icon={<BankOutlined />} color=\"blue\">\n {currentOrg.name}\n </Tag>\n )}\n {currentBranch && (\n <Tag icon={<BranchesOutlined />} color=\"green\">\n {currentBranch.name}\n </Tag>\n )}\n </Space>\n </Card>\n\n {/* Role Assignments */}\n <Card\n size=\"small\"\n title={\n <Space>\n <SafetyOutlined />\n {labels.roleAssignments} ({permissions.role_assignments.length})\n </Space>\n }\n extra={\n onAddRole && (\n <Button type=\"primary\" size=\"small\" icon={<PlusOutlined />} onClick={onAddRole}>\n {labels.add}\n </Button>\n )\n }\n >\n {permissions.role_assignments.length === 0 ? (\n <Empty description={labels.noRolesAssigned} />\n ) : (\n <Collapse ghost>\n {permissions.role_assignments.map((assignment, index) => (\n <Collapse.Panel\n key={index}\n header={\n <Space wrap>\n {getScopeIcon(assignment.scope)}\n <Text strong>{assignment.role.name}</Text>\n <Tag color={getScopeColor(assignment.scope)}>\n {assignment.scope === 'global'\n ? labels.global\n : assignment.scope === 'org-wide'\n ? assignment.org_name || labels.orgWide\n : assignment.branch_name ||\n getBranchName(assignment.console_branch_id)}\n </Tag>\n {assignment.scope === 'branch' && assignment.org_name && (\n <Tag color=\"blue\" icon={<BankOutlined />}>\n {assignment.org_name}\n </Tag>\n )}\n <Tag>\n {assignment.permissions.length} {labels.permissions}\n </Tag>\n {onRemoveRole && (\n <Popconfirm\n title={labels.confirmRemoveRole}\n onConfirm={() => {\n onRemoveRole(\n assignment.role.id,\n assignment.console_org_id,\n assignment.console_branch_id\n );\n }}\n >\n <Button\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => e.stopPropagation()}\n />\n </Popconfirm>\n )}\n </Space>\n }\n >\n {Object.entries(\n assignment.permissions.reduce(\n (\n groups: Record<string, Array<{ slug: string; name: string }>>,\n perm\n ) => {\n const group = perm.group || labels.ungrouped;\n if (!groups[group]) groups[group] = [];\n groups[group].push({ slug: perm.slug, name: perm.name });\n return groups;\n },\n {}\n )\n ).map(([group, perms]) => (\n <div key={group} style={{ marginBottom: 8 }}>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {group}\n </Text>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4, marginTop: 4 }}>\n {perms.map((perm) => (\n <Tag key={perm.slug} color=\"blue\">\n {perm.name}\n </Tag>\n ))}\n </div>\n </div>\n ))}\n </Collapse.Panel>\n ))}\n </Collapse>\n )}\n </Card>\n\n {/* Team Memberships */}\n <Card\n size=\"small\"\n title={\n <Space>\n <TeamOutlined />\n {labels.teamMemberships} ({permissions.team_memberships.length})\n </Space>\n }\n extra={\n onAddTeam && (\n <Button size=\"small\" icon={<PlusOutlined />} onClick={onAddTeam}>\n {labels.add}\n </Button>\n )\n }\n >\n {permissions.team_memberships.length === 0 ? (\n <Empty description={labels.noTeamMemberships} />\n ) : (\n <Collapse ghost>\n {permissions.team_memberships.map((membership, index) => (\n <Collapse.Panel\n key={index}\n header={\n <Space>\n <TeamOutlined />\n <Text strong>{membership.team.name}</Text>\n {membership.is_leader && <Tag color=\"gold\">{labels.teamLeader}</Tag>}\n <Tag>\n {membership.permissions.length} {labels.permissions}\n </Tag>\n </Space>\n }\n >\n {Object.entries(\n membership.permissions.reduce(\n (\n groups: Record<string, Array<{ slug: string; name: string }>>,\n perm\n ) => {\n const group = perm.group || labels.ungrouped;\n if (!groups[group]) groups[group] = [];\n groups[group].push({ slug: perm.slug, name: perm.name });\n return groups;\n },\n {}\n )\n ).map(([group, perms]) => (\n <div key={group} style={{ marginBottom: 8 }}>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {group}\n </Text>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4, marginTop: 4 }}>\n {perms.map((perm) => (\n <Tag key={perm.slug} color=\"cyan\">\n {perm.name}\n </Tag>\n ))}\n </div>\n </div>\n ))}\n </Collapse.Panel>\n ))}\n </Collapse>\n )}\n </Card>\n\n {/* Aggregated Permissions - Grouped */}\n <Card\n size=\"small\"\n title={\n <Space>\n <SafetyOutlined />\n {labels.aggregatedPermissions} ({permissions.aggregated_permissions.length})\n </Space>\n }\n >\n {permissions.aggregated_permissions.length === 0 ? (\n <Empty description={labels.noData} />\n ) : (\n <Collapse ghost>\n {Object.entries(\n permissions.aggregated_permissions.reduce(\n (groups: Record<string, string[]>, perm: string) => {\n const parts = perm.split('.');\n const group = parts.length > 1 ? parts.slice(0, -1).join('.') : labels.ungrouped;\n if (!groups[group]) groups[group] = [];\n groups[group].push(perm);\n return groups;\n },\n {}\n )\n ).map(([group, perms]) => (\n <Collapse.Panel\n key={group}\n header={\n <Space>\n <SafetyOutlined />\n <Text strong>{group}</Text>\n <Tag color=\"green\">{(perms as string[]).length}</Tag>\n </Space>\n }\n >\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {(perms as string[]).map((perm) => (\n <Tag key={perm} color=\"green\">\n {perm.split('.').pop()}\n </Tag>\n ))}\n </div>\n </Collapse.Panel>\n ))}\n </Collapse>\n )}\n </Card>\n </div>\n ) : null}\n </Modal>\n );\n}\n","'use client';\n\nimport {\n SafetyOutlined,\n GlobalOutlined,\n BankOutlined,\n BranchesOutlined,\n TeamOutlined,\n DeleteOutlined,\n PlusOutlined,\n ReloadOutlined,\n KeyOutlined,\n} from '@ant-design/icons';\nimport {\n Card,\n Typography,\n Button,\n Space,\n Tag,\n Table,\n Tabs,\n Input,\n Select,\n Popconfirm,\n Empty,\n} from 'antd';\nimport { useState, useMemo } from 'react';\nimport type { UserPermissionsBreakdown, RoleAssignmentWithPermissions } from '../../../core/services/userService';\nimport { getScopeColor } from '../ScopeUtils';\n\nconst { Title, Text, Link: AntLink } = Typography;\n\nexport interface UserDetailCardProps {\n user?: UserPermissionsBreakdown['user'];\n roleAssignments: RoleAssignmentWithPermissions[];\n teamMemberships: UserPermissionsBreakdown['team_memberships'];\n aggregatedPermissions: string[];\n currentOrg?: { id: string | number; name: string } | null;\n currentBranch?: { id: string | number; name: string } | null;\n onRefresh?: () => void;\n onAssignRole?: () => void;\n onRemoveRole?: (roleId: string, consoleOrgId?: string | null, consoleBranchId?: string | null) => void;\n onRoleClick?: (roleId: string) => void;\n removeLoading?: boolean;\n translations?: {\n email?: string;\n primaryOrganization?: string;\n currentContext?: string;\n global?: string;\n created?: string;\n lastSignIn?: string;\n roleAssignments?: string;\n roles?: string;\n permissions?: string;\n teams?: string;\n aggregatedPermissions?: string;\n permissionPolicies?: string;\n permissionsDescription?: string;\n searchPermissions?: string;\n allTypes?: string;\n viaRole?: string;\n viaTeam?: string;\n attachedVia?: string;\n filterByType?: string;\n remove?: string;\n addPermissions?: string;\n assignRole?: string;\n noRolesAssigned?: string;\n level?: string;\n actions?: string;\n confirmRemoveRole?: string;\n teamMemberships?: string;\n noTeamMemberships?: string;\n teamLeader?: string;\n noPermissions?: string;\n group?: string;\n };\n}\n\nconst defaultTranslations = {\n email: 'メール',\n primaryOrganization: '所属組織',\n currentContext: '現在のコンテキスト',\n global: 'グローバル',\n created: '作成日',\n lastSignIn: '最終サインイン',\n roleAssignments: 'ロール割り当て',\n roles: 'ロール',\n permissions: '権限',\n teams: 'チーム',\n aggregatedPermissions: '集約された権限',\n permissionPolicies: '権限ポリシー',\n permissionsDescription: '権限の説明',\n searchPermissions: '権限を検索',\n allTypes: 'すべてのタイプ',\n viaRole: 'ロール経由',\n viaTeam: 'チーム経由',\n attachedVia: '付与元',\n filterByType: 'タイプでフィルタ',\n remove: '削除',\n addPermissions: '権限を追加',\n assignRole: 'ロール割り当て',\n noRolesAssigned: 'ロールが割り当てられていません',\n level: 'レベル',\n actions: '操作',\n confirmRemoveRole: 'このロールを削除してもよろしいですか?',\n teamMemberships: 'チームメンバーシップ',\n noTeamMemberships: 'チームに所属していません',\n teamLeader: 'リーダー',\n noPermissions: '権限がありません',\n group: 'グループ',\n};\n\nexport function UserDetailCard({\n user,\n roleAssignments,\n teamMemberships,\n aggregatedPermissions,\n currentOrg,\n currentBranch,\n onRefresh,\n onAssignRole,\n onRemoveRole,\n onRoleClick,\n removeLoading = false,\n translations: t = {},\n}: UserDetailCardProps) {\n const labels = { ...defaultTranslations, ...t };\n const [permissionSearch, setPermissionSearch] = useState('');\n const [permissionTypeFilter, setPermissionTypeFilter] = useState<string>('all');\n\n const getScopeLabel = (assignment: RoleAssignmentWithPermissions) => {\n if (assignment.scope === 'global') return labels.global;\n if (assignment.scope === 'org-wide') return assignment.org_name || labels.global;\n return assignment.branch_name || labels.global;\n };\n\n // Prepare permissions data for table\n const permissionsTableData = roleAssignments.flatMap((assignment) =>\n assignment.permissions.map((perm) => ({\n key: `${assignment.role.id}-${perm.slug}`,\n permission: perm.slug,\n permissionName: perm.name,\n permissionGroup: perm.group,\n type: 'role',\n attachedVia: assignment.role.name,\n scope: assignment.scope,\n roleId: assignment.role.id,\n consoleOrgId: assignment.console_org_id,\n consoleBranchId: assignment.console_branch_id,\n }))\n );\n\n // Add team permissions\n const teamPermissionsData = teamMemberships.flatMap((membership) =>\n membership.permissions.map((perm) => ({\n key: `team-${membership.team.id}-${perm.slug}`,\n permission: perm.slug,\n permissionName: perm.name,\n permissionGroup: perm.group,\n type: 'team',\n attachedVia: membership.team.name,\n scope: 'team',\n }))\n );\n\n const allPermissionsData = [...permissionsTableData, ...teamPermissionsData];\n\n // Filter permissions\n const filteredPermissions = allPermissionsData.filter((p) => {\n const matchesSearch =\n !permissionSearch || p.permission.toLowerCase().includes(permissionSearch.toLowerCase());\n const matchesType = permissionTypeFilter === 'all' || p.type === permissionTypeFilter;\n return matchesSearch && matchesType;\n });\n\n // Group permissions by group name\n const groupedAggregatedPermissions = useMemo(\n () =>\n aggregatedPermissions.reduce<Record<string, string[]>>((acc, perm) => {\n const group = perm.split('.').slice(0, -1).join('.') || 'other';\n if (!acc[group]) acc[group] = [];\n acc[group].push(perm);\n return acc;\n }, {}),\n [aggregatedPermissions]\n );\n\n const tabItems = [\n {\n key: 'permissions',\n label: (\n <span>\n <KeyOutlined /> {labels.permissions}\n </span>\n ),\n children: (\n <div>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 16,\n }}\n >\n <div>\n <Title level={5} style={{ margin: 0 }}>\n {labels.permissionPolicies} ({allPermissionsData.length})\n </Title>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {labels.permissionsDescription}\n </Text>\n </div>\n <Space>\n {onRefresh && <Button icon={<ReloadOutlined />} onClick={onRefresh} />}\n <Button type=\"default\">{labels.remove}</Button>\n <Button type=\"primary\" icon={<PlusOutlined />}>\n {labels.addPermissions}\n </Button>\n </Space>\n </div>\n\n <div style={{ display: 'flex', gap: 16, marginBottom: 16 }}>\n <Input\n placeholder={labels.searchPermissions}\n prefix={<KeyOutlined />}\n value={permissionSearch}\n onChange={(e) => setPermissionSearch(e.target.value)}\n style={{ width: 300 }}\n />\n <Select\n value={permissionTypeFilter}\n onChange={setPermissionTypeFilter}\n style={{ width: 200 }}\n options={[\n { value: 'all', label: labels.allTypes },\n { value: 'role', label: labels.viaRole },\n { value: 'team', label: labels.viaTeam },\n ]}\n />\n </div>\n\n <Table\n dataSource={filteredPermissions}\n pagination={{ pageSize: 10 }}\n columns={[\n {\n title: labels.permissions,\n dataIndex: 'permission',\n key: 'permission',\n render: (perm: string) => (\n <Space>\n <KeyOutlined style={{ color: '#faad14' }} />\n <AntLink>{perm}</AntLink>\n </Space>\n ),\n },\n {\n title: labels.filterByType,\n dataIndex: 'type',\n key: 'type',\n width: 150,\n render: (type: string) => (\n <Tag color={type === 'role' ? 'blue' : 'green'}>\n {type === 'role' ? labels.viaRole : labels.viaTeam}\n </Tag>\n ),\n },\n {\n title: labels.attachedVia,\n dataIndex: 'attachedVia',\n key: 'attachedVia',\n width: 200,\n render: (via: string, record: { type: string; scope?: string }) => (\n <Space>\n {record.type === 'role' ? <SafetyOutlined /> : <TeamOutlined />}\n <Text>{via}</Text>\n {record.scope && record.scope !== 'team' && (\n <Tag color={getScopeColor(record.scope)} style={{ fontSize: 12 }}>\n {record.scope}\n </Tag>\n )}\n </Space>\n ),\n },\n ]}\n />\n </div>\n ),\n },\n {\n key: 'roles',\n label: (\n <span>\n <SafetyOutlined /> {labels.roles} ({roleAssignments.length})\n </span>\n ),\n children: (\n <div>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 16,\n }}\n >\n <Title level={5} style={{ margin: 0 }}>\n {labels.roleAssignments}\n </Title>\n {onAssignRole && (\n <Button type=\"primary\" icon={<PlusOutlined />} onClick={onAssignRole}>\n {labels.assignRole}\n </Button>\n )}\n </div>\n\n {roleAssignments.length === 0 ? (\n <Empty description={labels.noRolesAssigned} />\n ) : (\n <Table\n dataSource={roleAssignments}\n rowKey={(r) => `${r.role.id}-${r.console_org_id}-${r.console_branch_id}`}\n columns={[\n {\n title: labels.roles,\n key: 'role',\n render: (_, record) => (\n <Space>\n <SafetyOutlined style={{ color: '#1890ff' }} />\n <Text\n strong\n style={{ color: '#1890ff', cursor: onRoleClick ? 'pointer' : 'default' }}\n onClick={() => onRoleClick?.(record.role.id)}\n >\n {record.role.name}\n </Text>\n <Tag color=\"default\">{record.role.slug}</Tag>\n </Space>\n ),\n },\n {\n title: labels.global,\n key: 'scope',\n width: 200,\n render: (_, record) => (\n <Tag color={getScopeColor(record.scope)}>{getScopeLabel(record)}</Tag>\n ),\n },\n {\n title: labels.level,\n dataIndex: ['role', 'level'],\n key: 'level',\n width: 100,\n },\n {\n title: labels.permissions,\n key: 'permissions',\n width: 150,\n render: (_, record) => (\n <Text>\n {record.permissions.length} {labels.permissions.toLowerCase()}\n </Text>\n ),\n },\n {\n title: labels.actions,\n key: 'actions',\n width: 100,\n render: (_, record) =>\n onRemoveRole && (\n <Popconfirm\n title={labels.confirmRemoveRole}\n onConfirm={() =>\n onRemoveRole(\n record.role.id,\n record.console_org_id,\n record.console_branch_id\n )\n }\n >\n <Button\n type=\"text\"\n danger\n icon={<DeleteOutlined />}\n loading={removeLoading}\n />\n </Popconfirm>\n ),\n },\n ]}\n />\n )}\n </div>\n ),\n },\n {\n key: 'teams',\n label: (\n <span>\n <TeamOutlined /> {labels.teams} ({teamMemberships.length})\n </span>\n ),\n children: (\n <div>\n <Title level={5} style={{ marginBottom: 16 }}>\n {labels.teamMemberships}\n </Title>\n\n {teamMemberships.length === 0 ? (\n <Empty description={labels.noTeamMemberships} />\n ) : (\n <Table\n dataSource={teamMemberships}\n rowKey={(m) => m.team.id}\n columns={[\n {\n title: labels.teams,\n key: 'team',\n render: (_, record) => (\n <Space>\n <TeamOutlined style={{ color: '#52c41a' }} />\n <Text strong>{record.team.name}</Text>\n {record.team.path && <Text type=\"secondary\">({record.team.path})</Text>}\n </Space>\n ),\n },\n {\n title: labels.teamLeader,\n key: 'leader',\n width: 150,\n render: (_, record) =>\n record.is_leader ? (\n <Tag color=\"gold\">{labels.teamLeader}</Tag>\n ) : (\n <Text type=\"secondary\">-</Text>\n ),\n },\n {\n title: labels.permissions,\n key: 'permissions',\n width: 150,\n render: (_, record) => (\n <Text>\n {record.permissions.length} {labels.permissions.toLowerCase()}\n </Text>\n ),\n },\n ]}\n />\n )}\n </div>\n ),\n },\n {\n key: 'aggregated',\n label: (\n <span>\n <SafetyOutlined /> {labels.aggregatedPermissions} ({aggregatedPermissions.length})\n </span>\n ),\n children: (\n <div>\n <Title level={5} style={{ marginBottom: 16 }}>\n {labels.aggregatedPermissions}\n </Title>\n <Text type=\"secondary\" style={{ display: 'block', marginBottom: 16 }}>\n すべてのロールとチームから集約された権限の一覧です。\n </Text>\n\n {aggregatedPermissions.length === 0 ? (\n <Empty description={labels.noPermissions} />\n ) : (\n <Table\n dataSource={aggregatedPermissions.map((perm) => ({\n key: perm,\n permission: perm,\n group: perm.split('.').slice(0, -1).join('.') || 'other',\n action: perm.split('.').pop() || perm,\n }))}\n pagination={{ pageSize: 20 }}\n size=\"small\"\n columns={[\n {\n title: labels.group,\n dataIndex: 'group',\n key: 'group',\n width: 200,\n filters: Object.keys(groupedAggregatedPermissions).map((g) => ({\n text: g,\n value: g,\n })),\n onFilter: (value, record) => record.group === value,\n render: (group: string) => (\n <Tag icon={<SafetyOutlined />} color=\"blue\">\n {group}\n </Tag>\n ),\n },\n {\n title: labels.permissions,\n dataIndex: 'permission',\n key: 'permission',\n render: (perm: string) => (\n <Space>\n <KeyOutlined style={{ color: '#faad14' }} />\n <Text>{perm}</Text>\n </Space>\n ),\n },\n {\n title: 'Action',\n dataIndex: 'action',\n key: 'action',\n width: 150,\n render: (action: string) => <Tag color=\"green\">{action}</Tag>,\n },\n ]}\n />\n )}\n </div>\n ),\n },\n ];\n\n return (\n <div>\n {/* Summary Section */}\n <Card size=\"small\" style={{ marginBottom: 24 }} styles={{ body: { padding: '16px 24px' } }}>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(3, 1fr)',\n gap: '20px 48px',\n }}\n >\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginBottom: 4 }}>\n {labels.email}\n </Text>\n <Text copyable style={{ fontSize: 14 }}>\n {user?.email || '-'}\n </Text>\n </div>\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginBottom: 4 }}>\n {labels.primaryOrganization}\n </Text>\n {user?.organization ? (\n <Space size={4}>\n <BankOutlined style={{ color: '#1890ff' }} />\n <Text style={{ fontSize: 14 }}>{user.organization.name}</Text>\n </Space>\n ) : (\n <Space size={4}>\n <GlobalOutlined style={{ color: '#722ed1' }} />\n <Text style={{ fontSize: 14 }}>{labels.global}</Text>\n </Space>\n )}\n </div>\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginBottom: 4 }}>\n {labels.currentContext}\n </Text>\n <Space size={16} wrap>\n {currentOrg && (\n <Space size={4}>\n <BankOutlined style={{ color: '#1890ff' }} />\n <Text style={{ fontSize: 14 }}>{currentOrg.name}</Text>\n </Space>\n )}\n {currentBranch && (\n <Space size={4}>\n <BranchesOutlined style={{ color: '#52c41a' }} />\n <Text style={{ fontSize: 14 }}>{currentBranch.name}</Text>\n </Space>\n )}\n </Space>\n </div>\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginBottom: 4 }}>\n {labels.created}\n </Text>\n <Text style={{ fontSize: 14 }}>\n {user?.created_at ? new Date(user.created_at).toLocaleDateString() : '-'}\n </Text>\n </div>\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginBottom: 4 }}>\n {labels.lastSignIn}\n </Text>\n <Text style={{ fontSize: 14 }}>-</Text>\n </div>\n <div>\n <Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginBottom: 4 }}>\n {labels.roleAssignments}\n </Text>\n <Text style={{ fontSize: 14 }}>\n <Text strong>{roleAssignments.length}</Text> {labels.roles.toLowerCase()}\n </Text>\n </div>\n </div>\n </Card>\n\n {/* Tabs */}\n <Card>\n <Tabs defaultActiveKey=\"permissions\" items={tabItems} />\n </Card>\n </div>\n );\n}\n","'use client';\n\nimport { PlusOutlined, GlobalOutlined, BankOutlined } from '@ant-design/icons';\nimport { Modal, Form, Input, InputNumber, Select, Radio, Button, Space } from 'antd';\nimport type { OrganizationLike } from '../UserRoleAssignModal/UserRoleAssignModal';\n\nexport interface RoleCreateModalProps {\n open: boolean;\n organizations: OrganizationLike[];\n currentOrgId?: string;\n loading?: boolean;\n onSubmit: (values: {\n name: string;\n slug: string;\n description?: string;\n level: number;\n scope: 'global' | 'org';\n org_id?: string;\n }) => void | Promise<void>;\n onCancel: () => void;\n translations?: {\n title?: string;\n name?: string;\n slug?: string;\n description?: string;\n level?: string;\n scope?: string;\n global?: string;\n orgRole?: string;\n organization?: string;\n create?: string;\n cancel?: string;\n required?: string;\n };\n}\n\nconst defaultTranslations = {\n title: 'ロール作成',\n name: '名前',\n slug: 'スラッグ',\n description: '説明',\n level: 'レベル',\n scope: 'スコープ',\n global: 'グローバル',\n orgRole: '組織ロール',\n organization: '組織',\n create: '作成',\n cancel: 'キャンセル',\n required: '必須項目です',\n};\n\nexport function RoleCreateModal({\n open,\n organizations,\n currentOrgId,\n loading = false,\n onSubmit,\n onCancel,\n translations: t = {},\n}: RoleCreateModalProps) {\n const [form] = Form.useForm();\n const labels = { ...defaultTranslations, ...t };\n\n const handleFinish = async (values: {\n name: string;\n slug: string;\n description?: string;\n level: number;\n scope: 'global' | 'org';\n org_id?: string;\n }) => {\n await onSubmit(values);\n form.resetFields();\n };\n\n const handleCancel = () => {\n form.resetFields();\n onCancel();\n };\n\n return (\n <Modal\n title={\n <Space>\n <PlusOutlined />\n {labels.title}\n </Space>\n }\n open={open}\n onCancel={handleCancel}\n footer={null}\n destroyOnHidden\n >\n <Form\n form={form}\n layout=\"vertical\"\n onFinish={handleFinish}\n initialValues={{ level: 50, scope: 'org', org_id: currentOrgId }}\n >\n <Form.Item\n name=\"scope\"\n label={labels.scope}\n rules={[{ required: true, message: labels.required }]}\n >\n <Radio.Group>\n <Radio value=\"global\">\n <Space>\n <GlobalOutlined />\n {labels.global}\n </Space>\n </Radio>\n <Radio value=\"org\">\n <Space>\n <BankOutlined />\n {labels.orgRole}\n </Space>\n </Radio>\n </Radio.Group>\n </Form.Item>\n\n <Form.Item noStyle shouldUpdate={(prev, curr) => prev.scope !== curr.scope}>\n {({ getFieldValue }) =>\n getFieldValue('scope') === 'org' && (\n <Form.Item\n name=\"org_id\"\n label={labels.organization}\n rules={[{ required: true, message: labels.required }]}\n >\n <Select placeholder={labels.organization}>\n {organizations.map((org) => (\n <Select.Option key={org.id} value={String(org.id)}>\n <Space>\n <BankOutlined />\n {org.name}\n </Space>\n </Select.Option>\n ))}\n </Select>\n </Form.Item>\n )\n }\n </Form.Item>\n\n <Form.Item\n name=\"name\"\n label={labels.name}\n rules={[{ required: true, message: labels.required }]}\n >\n <Input />\n </Form.Item>\n\n <Form.Item\n name=\"slug\"\n label={labels.slug}\n rules={[{ required: true, message: labels.required }]}\n >\n <Input />\n </Form.Item>\n\n <Form.Item name=\"description\" label={labels.description}>\n <Input.TextArea rows={3} />\n </Form.Item>\n\n <Form.Item\n name=\"level\"\n label={labels.level}\n rules={[{ required: true, message: labels.required }]}\n >\n <InputNumber min={1} max={100} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item>\n <Space>\n <Button type=\"primary\" htmlType=\"submit\" loading={loading}>\n {labels.create}\n </Button>\n <Button onClick={handleCancel}>{labels.cancel}</Button>\n </Space>\n </Form.Item>\n </Form>\n </Modal>\n );\n}\n","'use client';\n\nimport {\n SafetyOutlined,\n PlusOutlined,\n EyeOutlined,\n DeleteOutlined,\n GlobalOutlined,\n BankOutlined,\n} from '@ant-design/icons';\nimport { Card, Typography, Button, Space, Tag, Select, Table, Popconfirm } from 'antd';\nimport type { Role } from '../../../core/services/roleService';\n\nconst { Text } = Typography;\n\nexport interface RolesListCardProps {\n roles: Role[];\n loading?: boolean;\n scopeFilter: 'all' | 'global' | 'org';\n onScopeFilterChange: (value: 'all' | 'global' | 'org') => void;\n onCreateClick: () => void;\n onViewClick: (role: Role) => void;\n onDeleteClick: (role: Role) => void;\n translations?: {\n name?: string;\n scope?: string;\n level?: string;\n description?: string;\n actions?: string;\n detail?: string;\n global?: string;\n orgRole?: string;\n all?: string;\n confirmDeleteRole?: string;\n };\n}\n\nconst defaultTranslations = {\n name: '名前',\n scope: 'スコープ',\n level: 'レベル',\n description: '説明',\n actions: '操作',\n detail: '詳細',\n global: 'グローバル',\n orgRole: '組織ロール',\n all: 'すべて',\n confirmDeleteRole: 'このロールを削除してもよろしいですか?',\n};\n\nexport function RolesListCard({\n roles,\n loading = false,\n scopeFilter,\n onScopeFilterChange,\n onCreateClick,\n onViewClick,\n onDeleteClick,\n translations: t = {},\n}: RolesListCardProps) {\n const labels = { ...defaultTranslations, ...t };\n\n const columns = [\n {\n title: labels.name,\n dataIndex: 'name',\n key: 'name',\n render: (name: string, record: Role) => (\n <Space>\n <SafetyOutlined style={{ color: '#1890ff' }} />\n <Text strong>{name}</Text>\n <Tag>{record.slug}</Tag>\n </Space>\n ),\n },\n {\n title: labels.scope,\n dataIndex: 'console_org_id',\n key: 'scope',\n width: 180,\n render: (_: unknown, record: Role) =>\n record.console_org_id ? (\n <Tag icon={<BankOutlined />} color=\"blue\">\n {record.organization?.name || record.console_org_id}\n </Tag>\n ) : (\n <Tag icon={<GlobalOutlined />} color=\"purple\">\n {labels.global}\n </Tag>\n ),\n },\n {\n title: labels.level,\n dataIndex: 'level',\n key: 'level',\n width: 100,\n render: (level: number) => <Tag color=\"blue\">{level}</Tag>,\n },\n {\n title: labels.description,\n dataIndex: 'description',\n key: 'description',\n ellipsis: true,\n },\n {\n title: labels.actions,\n key: 'actions',\n width: 180,\n render: (_: unknown, record: Role) => (\n <Space>\n <Button size=\"small\" icon={<EyeOutlined />} onClick={() => onViewClick(record)}>\n {labels.detail}\n </Button>\n <Popconfirm title={labels.confirmDeleteRole} onConfirm={() => onDeleteClick(record)}>\n <Button size=\"small\" danger icon={<DeleteOutlined />} />\n </Popconfirm>\n </Space>\n ),\n },\n ];\n\n return (\n <Card\n title={\n <Space>\n <SafetyOutlined />\n Roles\n </Space>\n }\n extra={\n <Button type=\"primary\" icon={<PlusOutlined />} onClick={onCreateClick}>\n Create\n </Button>\n }\n >\n <div style={{ marginBottom: 16, display: 'flex', gap: 16 }}>\n <Select\n value={scopeFilter}\n onChange={onScopeFilterChange}\n style={{ minWidth: 200 }}\n >\n <Select.Option value=\"all\">\n <Space>\n <SafetyOutlined />\n {labels.all}\n </Space>\n </Select.Option>\n <Select.Option value=\"global\">\n <Space>\n <GlobalOutlined />\n {labels.global}\n </Space>\n </Select.Option>\n <Select.Option value=\"org\">\n <Space>\n <BankOutlined />\n {labels.orgRole}\n </Space>\n </Select.Option>\n </Select>\n </div>\n\n <Table\n columns={columns}\n dataSource={roles}\n rowKey=\"id\"\n loading={loading}\n pagination={{ pageSize: 10 }}\n />\n </Card>\n );\n}\n","'use client';\n\nimport { KeyOutlined, AppstoreOutlined } from '@ant-design/icons';\nimport { Card, Typography, Tag, Table, Input, Space, Collapse } from 'antd';\nimport { useState, useMemo } from 'react';\nimport type { Permission } from '../../../core/services/permissionService';\n\nconst { Text } = Typography;\n\nexport interface PermissionsListCardProps {\n permissions: Permission[];\n groups: string[];\n loading?: boolean;\n translations?: {\n searchPermissions?: string;\n name?: string;\n slug?: string;\n group?: string;\n noData?: string;\n };\n onGroupLabelRender?: (group: string) => string;\n}\n\nconst defaultTranslations = {\n searchPermissions: '権限を検索',\n name: '名前',\n slug: 'スラッグ',\n group: 'グループ',\n noData: 'データがありません',\n};\n\nexport function PermissionsListCard({\n permissions,\n groups,\n loading = false,\n translations: t = {},\n onGroupLabelRender,\n}: PermissionsListCardProps) {\n const [search, setSearch] = useState('');\n const labels = { ...defaultTranslations, ...t };\n\n // Filter and group permissions\n const filteredPermissions = useMemo(() => {\n if (!search) return permissions;\n const lowerSearch = search.toLowerCase();\n return permissions.filter(\n (p) =>\n p.name.toLowerCase().includes(lowerSearch) ||\n p.slug.toLowerCase().includes(lowerSearch) ||\n (p.group || '').toLowerCase().includes(lowerSearch)\n );\n }, [permissions, search]);\n\n const groupedPermissions = useMemo(() => {\n const grouped: Record<string, Permission[]> = {};\n filteredPermissions.forEach((perm) => {\n const group = perm.group || 'other';\n if (!grouped[group]) grouped[group] = [];\n grouped[group].push(perm);\n });\n return grouped;\n }, [filteredPermissions]);\n\n const getGroupLabel = (group: string) => {\n if (onGroupLabelRender) return onGroupLabelRender(group);\n return group;\n };\n\n const columns = [\n {\n title: labels.name,\n dataIndex: 'name',\n key: 'name',\n render: (name: string) => (\n <Space>\n <KeyOutlined style={{ color: '#52c41a' }} />\n <Text strong>{name}</Text>\n </Space>\n ),\n },\n {\n title: labels.slug,\n dataIndex: 'slug',\n key: 'slug',\n render: (slug: string) => <Tag color=\"blue\">{slug}</Tag>,\n },\n {\n title: labels.group,\n dataIndex: 'group',\n key: 'group',\n render: (group: string) => (\n <Tag icon={<AppstoreOutlined />} color=\"purple\">\n {getGroupLabel(group || 'other')}\n </Tag>\n ),\n },\n ];\n\n return (\n <Card>\n <div style={{ marginBottom: 16 }}>\n <Input.Search\n placeholder={labels.searchPermissions}\n allowClear\n onSearch={setSearch}\n onChange={(e) => !e.target.value && setSearch('')}\n style={{ maxWidth: 300 }}\n />\n </div>\n\n <Collapse defaultActiveKey={groups} ghost>\n {Object.entries(groupedPermissions).map(([group, perms]) => (\n <Collapse.Panel\n key={group}\n header={\n <Space>\n <AppstoreOutlined style={{ color: '#722ed1' }} />\n <Text strong>{getGroupLabel(group)}</Text>\n <Tag>{perms.length}</Tag>\n </Space>\n }\n >\n <Table\n columns={columns}\n dataSource={perms}\n rowKey=\"id\"\n loading={loading}\n pagination={false}\n size=\"small\"\n />\n </Collapse.Panel>\n ))}\n </Collapse>\n\n {filteredPermissions.length === 0 && !loading && (\n <div style={{ textAlign: 'center', padding: 40 }}>\n <Text type=\"secondary\">{labels.noData}</Text>\n </div>\n )}\n </Card>\n );\n}\n","'use client';\n\nimport { TeamOutlined, KeyOutlined, UserOutlined } from '@ant-design/icons';\nimport { Card, Typography, Tag, Table, Empty } from 'antd';\n\nconst { Text } = Typography;\n\nexport interface TeamData {\n id: string;\n name: string;\n member_count: number;\n permissions: string[];\n}\n\nexport interface TeamsListCardProps {\n teams: TeamData[];\n loading?: boolean;\n translations?: {\n name?: string;\n memberCount?: string;\n permissions?: string;\n noTeams?: string;\n teamsFromConsole?: string;\n teamPermissions?: string;\n noData?: string;\n };\n}\n\nconst defaultTranslations = {\n name: '名前',\n memberCount: 'メンバー数',\n permissions: '権限',\n noTeams: 'チームがありません',\n teamsFromConsole: 'チームはコンソールから管理されます',\n teamPermissions: 'チーム権限',\n noData: 'データがありません',\n};\n\nexport function TeamsListCard({\n teams,\n loading = false,\n translations: t = {},\n}: TeamsListCardProps) {\n const labels = { ...defaultTranslations, ...t };\n\n const columns = [\n {\n title: labels.name,\n dataIndex: 'name',\n key: 'name',\n render: (name: string) => (\n <span>\n <TeamOutlined style={{ marginRight: 8, color: '#1890ff' }} />\n <Text strong>{name}</Text>\n </span>\n ),\n },\n {\n title: labels.memberCount,\n dataIndex: 'member_count',\n key: 'member_count',\n width: 120,\n render: (count: number) => <Tag icon={<UserOutlined />}>{count}</Tag>,\n },\n {\n title: labels.permissions,\n dataIndex: 'permissions',\n key: 'permissions',\n render: (permissions: string[]) => (\n <span>\n {permissions.length > 0 ? (\n <Tag color=\"blue\">\n {permissions.length} {labels.permissions}\n </Tag>\n ) : (\n <Tag>0 {labels.permissions}</Tag>\n )}\n </span>\n ),\n },\n ];\n\n return (\n <Card>\n {teams.length === 0 ? (\n <Empty\n description={\n <span>\n {labels.noTeams}\n <br />\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {labels.teamsFromConsole}\n </Text>\n </span>\n }\n />\n ) : (\n <Table\n columns={columns}\n dataSource={teams}\n rowKey=\"id\"\n loading={loading}\n pagination={{ pageSize: 10 }}\n expandable={{\n expandedRowRender: (record) => (\n <div style={{ padding: '8px 0' }}>\n <Text strong style={{ marginBottom: 8, display: 'block' }}>\n <KeyOutlined style={{ marginRight: 4 }} />\n {labels.teamPermissions}:\n </Text>\n {record.permissions.length === 0 ? (\n <Text type=\"secondary\">{labels.noData}</Text>\n ) : (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {record.permissions.map((perm) => (\n <Tag key={perm} color=\"cyan\">\n {perm}\n </Tag>\n ))}\n </div>\n )}\n </div>\n ),\n }}\n />\n )}\n </Card>\n );\n}\n","'use client';\n\nimport { App, ConfigProvider, theme } from 'antd';\nimport enUS from 'antd/locale/en_US';\nimport jaJP from 'antd/locale/ja_JP';\nimport viVN from 'antd/locale/vi_VN';\nimport { useEffect } from 'react';\nimport { useLocale } from '../../core/i18n';\n\n// Optional dayjs locale setter (can be passed as prop)\ntype SetDayjsLocale = (locale: string) => void;\n\nconst antdLocales = {\n ja: jaJP,\n en: enUS,\n vi: viVN,\n};\n\n// Font families optimized for each language\nconst fontFamilies: Record<string, string> = {\n // Japanese - CJK optimized fonts\n ja: \"'Noto Sans JP', 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', Meiryo, sans-serif\",\n // English - Modern western fonts\n en: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n // Vietnamese - Light, clean font with good diacritics\n vi: \"'Inter', 'Nunito Sans', -apple-system, BlinkMacSystemFont, sans-serif\",\n};\n\ntype ThemeVariant = 'dashboard' | 'admin';\n\nexport interface AntdThemeProviderProps {\n children: React.ReactNode;\n variant?: ThemeVariant;\n /** Optional function to set dayjs locale */\n setDayjsLocale?: SetDayjsLocale;\n}\n\nconst themeColors = {\n dashboard: {\n primary: '#7C3AED', // Violet\n siderBg: '#7C3AED',\n menuDarkItemBg: '#7C3AED',\n menuDarkSubMenuItemBg: '#6D28D9',\n menuDarkItemSelectedBg: '#9061F9',\n menuDarkItemHoverBg: 'rgba(144, 97, 249, 0.6)',\n },\n admin: {\n primary: '#64748B', // Slate gray - professional admin look\n siderBg: '#475569',\n menuDarkItemBg: '#475569',\n menuDarkSubMenuItemBg: '#334155',\n menuDarkItemSelectedBg: '#64748B',\n menuDarkItemHoverBg: 'rgba(100, 116, 139, 0.6)',\n },\n};\n\nexport default function AntdThemeProvider({ children, variant = 'dashboard', setDayjsLocale }: AntdThemeProviderProps) {\n const locale = useLocale();\n const antdLocale = antdLocales[locale as keyof typeof antdLocales] ?? jaJP;\n const fontFamily = fontFamilies[locale] ?? fontFamilies.ja;\n const colors = themeColors[variant];\n\n useEffect(() => {\n setDayjsLocale?.(locale);\n }, [locale, setDayjsLocale]);\n\n return (\n <ConfigProvider\n locale={antdLocale}\n theme={{\n algorithm: theme.defaultAlgorithm,\n token: {\n // ===========================================\n // Tempofast Design System (HSL-based harmony)\n // ===========================================\n\n // Primary - Dynamic based on variant\n colorPrimary: colors.primary,\n colorInfo: colors.primary,\n\n // Semantic Colors (Complementary harmony)\n colorSuccess: '#10B981', // HSL(160, 84%, 39%) - Teal-green, cool tone\n colorWarning: '#F59E0B', // HSL(38, 92%, 50%) - Amber, warm accent\n colorError: '#EF4444', // HSL(0, 84%, 60%) - Red, same saturation\n\n // Text - Neutral with slight violet undertone\n colorText: '#1E1B2E', // Near black with violet tint\n colorTextSecondary: '#4B5563', // Cool gray\n colorTextTertiary: '#9CA3AF', // Light cool gray\n\n // Background - Cool neutrals\n colorBgLayout: '#F8F7FA', // Very light violet-gray\n colorBgContainer: '#FFFFFF',\n colorBgElevated: '#FFFFFF',\n\n // Border - Subtle\n colorBorder: '#E5E7EB',\n colorBorderSecondary: '#F3F4F6',\n\n // Border Radius - Compact\n borderRadius: 4,\n borderRadiusSM: 2,\n borderRadiusLG: 6,\n\n // Control Heights - Compact\n controlHeight: 32,\n controlHeightLG: 36,\n controlHeightSM: 28,\n\n // Font - Dynamic based on locale\n fontFamily,\n fontSize: 13,\n fontSizeLG: 14,\n fontSizeHeading1: 24,\n fontSizeHeading2: 20,\n fontSizeHeading3: 16,\n fontSizeHeading4: 14,\n fontSizeHeading5: 13,\n\n // Spacing - Tight\n padding: 12,\n paddingLG: 16,\n paddingSM: 8,\n paddingXS: 4,\n margin: 12,\n marginLG: 16,\n marginSM: 8,\n marginXS: 4,\n\n // Shadows - Almost flat (Japanese style)\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.03)',\n boxShadowSecondary: '0 1px 3px rgba(0, 0, 0, 0.04)',\n\n // Line Height\n lineHeight: 1.5,\n },\n components: {\n // Global icon margin in Space component\n Space: {\n marginXS: 6,\n },\n Button: {\n controlHeight: 32,\n paddingInline: 12,\n fontWeight: 500,\n },\n Statistic: {\n contentFontSize: 24,\n titleFontSize: 13,\n },\n Input: {\n controlHeight: 32,\n paddingInline: 8,\n },\n Select: {\n controlHeight: 32,\n },\n Table: {\n cellPaddingBlock: 8,\n cellPaddingInline: 8,\n headerBg: '#F8F7FA',\n },\n Card: {\n paddingLG: 16,\n },\n Form: {\n itemMarginBottom: 16,\n verticalLabelPadding: '0 0 4px',\n },\n Menu: {\n itemHeight: 36,\n itemMarginBlock: 2,\n itemMarginInline: 4,\n darkItemBg: colors.menuDarkItemBg,\n darkSubMenuItemBg: colors.menuDarkSubMenuItemBg,\n darkItemSelectedBg: colors.menuDarkItemSelectedBg,\n darkItemSelectedColor: '#FFFFFF',\n darkItemColor: 'rgba(255, 255, 255, 0.9)',\n darkItemHoverBg: colors.menuDarkItemHoverBg,\n darkItemHoverColor: '#FFFFFF',\n },\n Layout: {\n siderBg: colors.siderBg,\n headerPadding: '0 16px',\n headerHeight: 48,\n },\n Typography: {\n titleMarginBottom: 8,\n titleMarginTop: 0,\n },\n Modal: {\n paddingContentHorizontalLG: 16,\n },\n Descriptions: {\n itemPaddingBottom: 8,\n },\n },\n }}\n >\n <App>{children}</App>\n </ConfigProvider>\n );\n}\n"],"mappings":"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","names":["import_react","error","import_react","import_react","import_jsx_runtime","React","import_react","import_react","import_jsx_runtime","DefaultLoading","import_react","import_antd","import_icons","import_jsx_runtime","Text","import_react","import_antd","import_icons","import_react_query","import_jsx_runtime","Text","Title","React","import_icons","import_react_query","import_antd","import_react","import_jsx_runtime","import_antd","import_jsx_runtime","import_icons","import_antd","import_react_i18next","import_react","import_jsx_runtime","import_jsx_runtime","i18n","import_icons","import_antd","import_react","import_icons","import_antd","import_jsx_runtime","import_jsx_runtime","Text","import_icons","import_antd","import_jsx_runtime","Text","defaultTranslations","import_icons","import_antd","import_react","import_jsx_runtime","Title","Text","defaultTranslations","import_icons","import_antd","import_jsx_runtime","defaultTranslations","import_icons","import_antd","import_jsx_runtime","Text","defaultTranslations","import_icons","import_antd","import_react","import_jsx_runtime","Text","defaultTranslations","import_icons","import_antd","import_jsx_runtime","Text","defaultTranslations","import_antd","import_react","import_jsx_runtime","jaJP","enUS","viVN"]}