@famgia/omnify-react-sso 2.2.5 → 2.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ant/index.cjs +644 -495
- package/dist/ant/index.cjs.map +1 -1
- package/dist/ant/index.d.cts +43 -1
- package/dist/ant/index.d.ts +43 -1
- package/dist/ant/index.js +502 -354
- package/dist/ant/index.js.map +1 -1
- package/dist/index.cjs +680 -505
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +40 -1
- package/dist/index.d.ts +40 -1
- package/dist/index.js +526 -356
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/schemas/base/i18n.ts","../src/core/schemas/base/BranchCache.ts","../src/core/schemas/BranchCache.ts","../src/core/schemas/base/OrganizationCache.ts","../src/core/schemas/OrganizationCache.ts","../src/core/schemas/base/Permission.ts","../src/core/schemas/Permission.ts","../src/core/schemas/base/Role.ts","../src/core/schemas/Role.ts","../src/core/schemas/base/RolePermission.ts","../src/core/schemas/RolePermission.ts","../src/core/schemas/base/TeamCache.ts","../src/core/schemas/TeamCache.ts","../src/core/schemas/base/TeamPermission.ts","../src/core/schemas/TeamPermission.ts","../src/core/schemas/base/UserCache.ts","../src/core/schemas/UserCache.ts","../src/core/context/SsoContext.tsx","../src/core/context/SsoProvider.tsx","../src/core/context/BranchContext.tsx","../src/core/context/BranchProvider.tsx","../src/core/services/utils.ts","../src/core/services/branchService.ts","../src/core/queryKeys.ts","../src/core/hooks/useAuth.ts","../src/core/hooks/useOrganization.ts","../src/core/hooks/useSso.ts","../src/core/hooks/useBranch.ts","../src/ant/components/SsoCallback/SsoCallback.tsx","../src/ant/components/OrganizationSwitcher/OrganizationSwitcher.tsx","../src/ant/components/ProtectedRoute/ProtectedRoute.tsx","../src/ant/components/OrgBranchSelectorModal/OrgBranchSelectorModal.tsx","../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","../src/core/utils/branchHeaders.ts","../src/core/services/authService.ts","../src/core/services/tokenService.ts","../src/core/services/roleService.ts","../src/core/services/permissionService.ts","../src/core/services/teamService.ts","../src/core/services/userRoleService.ts","../src/core/services/userService.ts","../src/core/services/ssoService.ts"],"sourcesContent":["/**\n * @famgia/omnify-react-sso\n *\n * SSO (Single Sign-On) schemas, types, components, and utilities for Omnify.\n */\n\n// =============================================================================\n// Schemas (auto-generated from Omnify)\n// =============================================================================\n\nexport * from './core/schemas';\n\n// =============================================================================\n// Context & Provider\n// =============================================================================\n\nexport { SsoContext } from './core/context/SsoContext';\nexport { SsoProvider } from './core/context/SsoProvider';\nexport { BranchContext } from './core/context/BranchContext';\nexport { BranchProvider } from './core/context/BranchProvider';\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nexport { useAuth } from './core/hooks/useAuth';\nexport { useOrganization } from './core/hooks/useOrganization';\nexport { useSso } from './core/hooks/useSso';\nexport { useBranch } from './core/hooks/useBranch';\n\n// Hook return types\nexport type { UseAuthReturn } from './core/hooks/useAuth';\nexport type { UseOrganizationReturn } from './core/hooks/useOrganization';\nexport type { UseSsoReturn } from './core/hooks/useSso';\nexport type { UseBranchReturn } from './core/hooks/useBranch';\n\n// =============================================================================\n// Components (re-exported from ant module for backward compatibility)\n// =============================================================================\n\nexport {\n SsoCallback,\n OrganizationSwitcher,\n ProtectedRoute,\n OrgBranchSelectorModal,\n BranchGate,\n useBranchGate,\n} from './ant';\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport {\n createBranchHeaderSetter,\n setBranchHeaders,\n BRANCH_HEADERS,\n} from './core/utils/branchHeaders';\n\n// =============================================================================\n// Services - Individual services (recommended)\n// =============================================================================\n\n// Auth Service\nexport { createAuthService } from './core/services';\nexport type {\n AuthService,\n SsoUser as AuthUser,\n Organization,\n AuthCallbackInput,\n AuthCallbackResponse,\n AuthUserResponse,\n} from './core/services';\n\n// Token Service\nexport { createTokenService } from './core/services';\nexport type { TokenService, ApiToken } from './core/services';\n\n// Role Service\nexport { createRoleService } from './core/services';\nexport type {\n RoleService,\n Role,\n RoleWithPermissions,\n CreateRoleInput,\n UpdateRoleInput,\n SyncPermissionsInput,\n SyncPermissionsResponse,\n} from './core/services';\n\n// Permission Service\nexport { createPermissionService } from './core/services';\nexport type {\n PermissionService,\n Permission,\n PermissionMatrix,\n PermissionListParams,\n CreatePermissionInput,\n UpdatePermissionInput,\n} from './core/services';\n\n// Team Service\nexport { createTeamService } from './core/services';\nexport type {\n TeamService,\n TeamWithPermissions,\n TeamPermissionDetail,\n OrphanedTeam,\n SyncTeamPermissionsInput,\n CleanupOrphanedInput,\n} from './core/services';\n\n// User Role Service (Scoped Role Assignments)\nexport { createUserRoleService, getScopeLabel, getEffectivePermissions } from './core/services';\nexport type {\n UserRoleService,\n RoleScope,\n RoleAssignment,\n AssignRoleInput,\n AssignRoleResponse,\n SyncRolesInput,\n SyncRolesResponse,\n RemoveRoleResponse,\n} from './core/services';\n\n// User Service (User Management)\nexport { createUserService } from './core/services';\nexport type {\n UserService,\n User,\n UserWithOrg,\n UserListParams,\n UserListResponse,\n UserPermissionsBreakdown,\n RoleAssignmentWithPermissions,\n TeamMembershipWithPermissions,\n PermissionDetail,\n} from './core/services';\n\n// Branch Service\nexport { createBranchService } from './core/services';\nexport type { BranchService, Branch, BranchesResponse } from './core/services';\n\n// Service Config\nexport type { ServiceConfig } from './core/services';\n\n// =============================================================================\n// Legacy: ssoService (deprecated - use individual services)\n// =============================================================================\n\n/**\n * @deprecated Use individual services instead:\n * - createAuthService() for auth\n * - createTokenService() for tokens\n * - createRoleService() for roles\n * - createPermissionService() for permissions\n * - createTeamService() for teams\n * - createUserRoleService() for user role assignments\n * - createBranchService() for branches\n */\nexport { createSsoService } from './core/services';\nexport type { SsoService, SsoServiceConfig } from './core/services';\n\n// Legacy type aliases for backward compatibility\nexport type { SsoUser as SsoServiceUser } from './core/services';\nexport type { Role as ServiceRole } from './core/services';\nexport type { Permission as ServicePermission } from './core/services';\n\n// =============================================================================\n// Types (camelCase - for React components)\n// =============================================================================\n\nexport type {\n SsoUser,\n SsoOrganization,\n SsoConfig,\n SsoContextValue,\n SsoCallbackResponse,\n SsoProviderProps,\n SsoCallbackProps,\n OrganizationSwitcherProps,\n ProtectedRouteProps,\n // Branch types\n SsoBranch,\n BranchContextValue,\n BranchProviderProps,\n OrgBranchSelectorModalProps,\n OrgBranchSelection,\n // BranchGate types\n BranchGateProps,\n BranchGateSelection,\n} from './core/types';\n\n// =============================================================================\n// Query Keys (for TanStack Query / React Query)\n// =============================================================================\n\nexport { ssoQueryKeys } from './core/queryKeys';\n\n// =============================================================================\n// i18n (Internationalization)\n// =============================================================================\n\nexport {\n I18nProvider,\n useLocale,\n useTranslations,\n useSsoTranslation,\n getCurrentLocale,\n changeLanguage,\n locales,\n localeNames,\n defaultLocale,\n ssoNamespace,\n defaultTranslations,\n type Locale,\n type I18nContextValue,\n type I18nProviderProps,\n} from './core/i18n';\n\n// =============================================================================\n// Ant Design Module (Components + Theme)\n// =============================================================================\n\nexport * from './ant';\n","/**\n * SSO i18n Configuration\n */\n\nimport type { LocaleMap } from './common';\n\n/**\n * Default locale for this project.\n */\nexport const defaultLocale = 'ja' as const;\n\n/**\n * Fallback locale when requested locale is not found.\n */\nexport const fallbackLocale = 'en' as const;\n\n/**\n * Supported locales in this project.\n */\nexport const supportedLocales = [\"ja\",\"en\"] as const;\n\n/**\n * Validation messages for all supported locales.\n * Use getMessage(key, locale, params) to get formatted message.\n */\nexport const validationMessages = {\n \"required\": {\n \"ja\": \"${displayName}は必須です\",\n \"en\": \"${displayName} is required\"\n },\n \"minLength\": {\n \"ja\": \"${displayName}は${min}文字以上で入力してください\",\n \"en\": \"${displayName} must be at least ${min} characters\"\n },\n \"maxLength\": {\n \"ja\": \"${displayName}は${max}文字以内で入力してください\",\n \"en\": \"${displayName} must be at most ${max} characters\"\n },\n \"min\": {\n \"ja\": \"${displayName}は${min}以上で入力してください\",\n \"en\": \"${displayName} must be at least ${min}\"\n },\n \"max\": {\n \"ja\": \"${displayName}は${max}以下で入力してください\",\n \"en\": \"${displayName} must be at most ${max}\"\n },\n \"email\": {\n \"ja\": \"有効なメールアドレスを入力してください\",\n \"en\": \"Please enter a valid email address\"\n },\n \"url\": {\n \"ja\": \"有効なURLを入力してください\",\n \"en\": \"Please enter a valid URL\"\n },\n \"pattern\": {\n \"ja\": \"${displayName}の形式が正しくありません\",\n \"en\": \"${displayName} format is invalid\"\n }\n} as const;\n\n/**\n * Get validation message for a specific key and locale.\n * Supports template placeholders: ${displayName}, ${min}, ${max}, etc.\n *\n * @param key - Message key (e.g., 'required', 'minLength')\n * @param locale - Locale code (e.g., 'ja', 'en')\n * @param params - Template parameters to replace\n * @returns Formatted message string\n *\n * @example\n * getMessage('required', 'ja', { displayName: '氏名' })\n * // => '氏名は必須です'\n */\nexport function getMessage(\n key: string,\n locale: string,\n params: Record<string, string | number> = {}\n): string {\n const messages = validationMessages[key as keyof typeof validationMessages];\n if (!messages) return key;\n\n let message = (messages as LocaleMap)[locale]\n ?? (messages as LocaleMap)[fallbackLocale]\n ?? (messages as LocaleMap)[defaultLocale]\n ?? key;\n\n // Replace template placeholders\n for (const [param, value] of Object.entries(params)) {\n message = message.replace(new RegExp(`\\\\$\\{${param}\\}`, 'g'), String(value));\n }\n\n return message;\n}\n\n/**\n * Get all validation messages for a specific locale.\n *\n * @param locale - Locale code\n * @returns Object with all messages for the locale\n */\nexport function getMessages(locale: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, messages] of Object.entries(validationMessages)) {\n result[key] = (messages as LocaleMap)[locale]\n ?? (messages as LocaleMap)[fallbackLocale]\n ?? (messages as LocaleMap)[defaultLocale]\n ?? key;\n }\n return result;\n}\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * 支店キャッシュ\n */\nexport interface BranchCache {\n /** Primary key */\n id: string;\n /** Console Branch ID */\n console_branch_id: unknown;\n /** Console Organization ID */\n console_org_id: unknown;\n /** 支店コード */\n code: string;\n /** 支店名 */\n name: string;\n /** 本社 */\n is_headquarters: boolean;\n /** 有効 */\n is_active: boolean;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for BranchCache\n * Contains model label and all field labels/placeholders\n */\nexport const branchCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"支店キャッシュ\",\"en\":\"Branch Cache\"},\n /** Field labels and placeholders */\n fields: {\n console_branch_id: {\n label: {\"ja\":\"Console Branch ID\",\"en\":\"Console Branch ID\"},\n },\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n code: {\n label: {\"ja\":\"支店コード\",\"en\":\"Branch Code\"},\n },\n name: {\n label: {\"ja\":\"支店名\",\"en\":\"Branch Name\"},\n },\n is_headquarters: {\n label: {\"ja\":\"本社\",\"en\":\"Is Headquarters\"},\n },\n is_active: {\n label: {\"ja\":\"有効\",\"en\":\"Active\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for BranchCache */\nexport const baseBranchCacheSchemas = {\n console_branch_id: z.string(),\n console_org_id: z.string(),\n code: z.string().min(1).max(20),\n name: z.string().min(1).max(100),\n is_headquarters: z.boolean(),\n is_active: z.boolean(),\n} as const;\n\n/** Create schema for BranchCache (POST requests) */\nexport const baseBranchCacheCreateSchema = z.object({\n console_branch_id: baseBranchCacheSchemas.console_branch_id,\n console_org_id: baseBranchCacheSchemas.console_org_id,\n code: baseBranchCacheSchemas.code,\n name: baseBranchCacheSchemas.name,\n is_headquarters: baseBranchCacheSchemas.is_headquarters,\n is_active: baseBranchCacheSchemas.is_active,\n});\n\n/** Update schema for BranchCache (PUT/PATCH requests) */\nexport const baseBranchCacheUpdateSchema = baseBranchCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseBranchCacheCreate = z.infer<typeof baseBranchCacheCreateSchema>;\nexport type BaseBranchCacheUpdate = z.infer<typeof baseBranchCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getBranchCacheLabel(locale: string): string {\n return branchCacheI18n.label[locale as keyof typeof branchCacheI18n.label] ?? branchCacheI18n.label['en'] ?? 'BranchCache';\n}\n\n/** Get field label for a specific locale */\nexport function getBranchCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = branchCacheI18n.fields[field as keyof typeof branchCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getBranchCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = branchCacheI18n.fields[field as keyof typeof branchCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * BranchCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { BranchCache as BranchCacheBase } from './base/BranchCache';\nimport {\n baseBranchCacheSchemas,\n baseBranchCacheCreateSchema,\n baseBranchCacheUpdateSchema,\n branchCacheI18n,\n getBranchCacheLabel,\n getBranchCacheFieldLabel,\n getBranchCacheFieldPlaceholder,\n} from './base/BranchCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface BranchCache extends BranchCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const branchCacheSchemas = { ...baseBranchCacheSchemas };\nexport const branchCacheCreateSchema = baseBranchCacheCreateSchema;\nexport const branchCacheUpdateSchema = baseBranchCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BranchCacheCreate = z.infer<typeof branchCacheCreateSchema>;\nexport type BranchCacheUpdate = z.infer<typeof branchCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n branchCacheI18n,\n getBranchCacheLabel,\n getBranchCacheFieldLabel,\n getBranchCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { BranchCacheBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * 組織キャッシュ\n */\nexport interface OrganizationCache {\n /** Primary key */\n id: string;\n /** Console Organization ID */\n console_org_id: unknown;\n /** 組織名 */\n name: string;\n /** 組織コード */\n code: string;\n /** 有効 */\n is_active: boolean;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for OrganizationCache\n * Contains model label and all field labels/placeholders\n */\nexport const organizationCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"組織キャッシュ\",\"en\":\"Organization Cache\"},\n /** Field labels and placeholders */\n fields: {\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n name: {\n label: {\"ja\":\"組織名\",\"en\":\"Organization Name\"},\n },\n code: {\n label: {\"ja\":\"組織コード\",\"en\":\"Organization Code\"},\n },\n is_active: {\n label: {\"ja\":\"有効\",\"en\":\"Active\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for OrganizationCache */\nexport const baseOrganizationCacheSchemas = {\n console_org_id: z.string(),\n name: z.string().min(1).max(100),\n code: z.string().min(1).max(20),\n is_active: z.boolean(),\n} as const;\n\n/** Create schema for OrganizationCache (POST requests) */\nexport const baseOrganizationCacheCreateSchema = z.object({\n console_org_id: baseOrganizationCacheSchemas.console_org_id,\n name: baseOrganizationCacheSchemas.name,\n code: baseOrganizationCacheSchemas.code,\n is_active: baseOrganizationCacheSchemas.is_active,\n});\n\n/** Update schema for OrganizationCache (PUT/PATCH requests) */\nexport const baseOrganizationCacheUpdateSchema = baseOrganizationCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseOrganizationCacheCreate = z.infer<typeof baseOrganizationCacheCreateSchema>;\nexport type BaseOrganizationCacheUpdate = z.infer<typeof baseOrganizationCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getOrganizationCacheLabel(locale: string): string {\n return organizationCacheI18n.label[locale as keyof typeof organizationCacheI18n.label] ?? organizationCacheI18n.label['en'] ?? 'OrganizationCache';\n}\n\n/** Get field label for a specific locale */\nexport function getOrganizationCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = organizationCacheI18n.fields[field as keyof typeof organizationCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getOrganizationCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = organizationCacheI18n.fields[field as keyof typeof organizationCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * OrganizationCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { OrganizationCache as OrganizationCacheBase } from './base/OrganizationCache';\nimport {\n baseOrganizationCacheSchemas,\n baseOrganizationCacheCreateSchema,\n baseOrganizationCacheUpdateSchema,\n organizationCacheI18n,\n getOrganizationCacheLabel,\n getOrganizationCacheFieldLabel,\n getOrganizationCacheFieldPlaceholder,\n} from './base/OrganizationCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface OrganizationCache extends OrganizationCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const organizationCacheSchemas = { ...baseOrganizationCacheSchemas };\nexport const organizationCacheCreateSchema = baseOrganizationCacheCreateSchema;\nexport const organizationCacheUpdateSchema = baseOrganizationCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type OrganizationCacheCreate = z.infer<typeof organizationCacheCreateSchema>;\nexport type OrganizationCacheUpdate = z.infer<typeof organizationCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n organizationCacheI18n,\n getOrganizationCacheLabel,\n getOrganizationCacheFieldLabel,\n getOrganizationCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { OrganizationCacheBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Role } from './Role';\n\n/**\n * 権限\n */\nexport interface Permission {\n /** Primary key */\n id: string;\n /** 権限名 */\n name: string;\n /** スラッグ */\n slug: string;\n /** グループ */\n group?: string;\n /** ロール */\n roles: Role[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for Permission\n * Contains model label and all field labels/placeholders\n */\nexport const permissionI18n = {\n /** Model display name */\n label: {\"ja\":\"権限\",\"en\":\"Permission\"},\n /** Field labels and placeholders */\n fields: {\n name: {\n label: {\"ja\":\"権限名\",\"en\":\"Permission Name\"},\n },\n slug: {\n label: {\"ja\":\"スラッグ\",\"en\":\"Slug\"},\n },\n group: {\n label: {\"ja\":\"グループ\",\"en\":\"Group\"},\n },\n roles: {\n label: {\"ja\":\"ロール\",\"en\":\"Roles\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for Permission */\nexport const basePermissionSchemas = {\n name: z.string().min(1).max(100),\n slug: z.string().min(1).max(100),\n group: z.string().max(50).optional().nullable(),\n} as const;\n\n/** Create schema for Permission (POST requests) */\nexport const basePermissionCreateSchema = z.object({\n name: basePermissionSchemas.name,\n slug: basePermissionSchemas.slug,\n group: basePermissionSchemas.group,\n});\n\n/** Update schema for Permission (PUT/PATCH requests) */\nexport const basePermissionUpdateSchema = basePermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BasePermissionCreate = z.infer<typeof basePermissionCreateSchema>;\nexport type BasePermissionUpdate = z.infer<typeof basePermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getPermissionLabel(locale: string): string {\n return permissionI18n.label[locale as keyof typeof permissionI18n.label] ?? permissionI18n.label['en'] ?? 'Permission';\n}\n\n/** Get field label for a specific locale */\nexport function getPermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = permissionI18n.fields[field as keyof typeof permissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getPermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = permissionI18n.fields[field as keyof typeof permissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * Permission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { Permission as PermissionBase } from './base/Permission';\nimport {\n basePermissionSchemas,\n basePermissionCreateSchema,\n basePermissionUpdateSchema,\n permissionI18n,\n getPermissionLabel,\n getPermissionFieldLabel,\n getPermissionFieldPlaceholder,\n} from './base/Permission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface Permission extends PermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const permissionSchemas = { ...basePermissionSchemas };\nexport const permissionCreateSchema = basePermissionCreateSchema;\nexport const permissionUpdateSchema = basePermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PermissionCreate = z.infer<typeof permissionCreateSchema>;\nexport type PermissionUpdate = z.infer<typeof permissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n permissionI18n,\n getPermissionLabel,\n getPermissionFieldLabel,\n getPermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { PermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\n\n/**\n * ロール\n */\nexport interface Role {\n /** Primary key */\n id: string;\n /** 組織ID */\n console_org_id?: string;\n /** ロール名 */\n name: string;\n /** スラッグ */\n slug: string;\n /** 説明 */\n description?: string;\n /** レベル */\n level: number;\n /** 権限 */\n permissions: Permission[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for Role\n * Contains model label and all field labels/placeholders\n */\nexport const roleI18n = {\n /** Model display name */\n label: {\"ja\":\"ロール\",\"en\":\"Role\"},\n /** Field labels and placeholders */\n fields: {\n console_org_id: {\n label: {\"ja\":\"組織ID\",\"en\":\"Organization ID\"},\n },\n name: {\n label: {\"ja\":\"ロール名\",\"en\":\"Role Name\"},\n },\n slug: {\n label: {\"ja\":\"スラッグ\",\"en\":\"Slug\"},\n },\n description: {\n label: {\"ja\":\"説明\",\"en\":\"Description\"},\n },\n level: {\n label: {\"ja\":\"レベル\",\"en\":\"Level\"},\n },\n permissions: {\n label: {\"ja\":\"権限\",\"en\":\"Permissions\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for Role */\nexport const baseRoleSchemas = {\n console_org_id: z.string().max(36).optional().nullable(),\n name: z.string().min(1).max(100),\n slug: z.string().min(1).max(100),\n description: z.string().optional().nullable(),\n level: z.number().int(),\n} as const;\n\n/** Create schema for Role (POST requests) */\nexport const baseRoleCreateSchema = z.object({\n console_org_id: baseRoleSchemas.console_org_id,\n name: baseRoleSchemas.name,\n slug: baseRoleSchemas.slug,\n description: baseRoleSchemas.description,\n level: baseRoleSchemas.level,\n});\n\n/** Update schema for Role (PUT/PATCH requests) */\nexport const baseRoleUpdateSchema = baseRoleCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseRoleCreate = z.infer<typeof baseRoleCreateSchema>;\nexport type BaseRoleUpdate = z.infer<typeof baseRoleUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getRoleLabel(locale: string): string {\n return roleI18n.label[locale as keyof typeof roleI18n.label] ?? roleI18n.label['en'] ?? 'Role';\n}\n\n/** Get field label for a specific locale */\nexport function getRoleFieldLabel(field: string, locale: string): string {\n const fieldI18n = roleI18n.fields[field as keyof typeof roleI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getRoleFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = roleI18n.fields[field as keyof typeof roleI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * Role Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { Role as RoleBase } from './base/Role';\nimport {\n baseRoleSchemas,\n baseRoleCreateSchema,\n baseRoleUpdateSchema,\n roleI18n,\n getRoleLabel,\n getRoleFieldLabel,\n getRoleFieldPlaceholder,\n} from './base/Role';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface Role extends RoleBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const roleSchemas = { ...baseRoleSchemas };\nexport const roleCreateSchema = baseRoleCreateSchema;\nexport const roleUpdateSchema = baseRoleUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RoleCreate = z.infer<typeof roleCreateSchema>;\nexport type RoleUpdate = z.infer<typeof roleUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n roleI18n,\n getRoleLabel,\n getRoleFieldLabel,\n getRoleFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { RoleBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\nimport type { Role } from './Role';\n\n/**\n * ロール権限\n */\nexport interface RolePermission {\n /** ロール */\n role: Role;\n /** 権限 */\n permission: Permission;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for RolePermission\n * Contains model label and all field labels/placeholders\n */\nexport const rolePermissionI18n = {\n /** Model display name */\n label: {\"ja\":\"ロール権限\",\"en\":\"Role Permission\"},\n /** Field labels and placeholders */\n fields: {\n role: {\n label: {\"ja\":\"ロール\",\"en\":\"Role\"},\n },\n permission: {\n label: {\"ja\":\"権限\",\"en\":\"Permission\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for RolePermission */\nexport const baseRolePermissionSchemas = {\n} as const;\n\n/** Create schema for RolePermission (POST requests) */\nexport const baseRolePermissionCreateSchema = z.object({\n});\n\n/** Update schema for RolePermission (PUT/PATCH requests) */\nexport const baseRolePermissionUpdateSchema = baseRolePermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseRolePermissionCreate = z.infer<typeof baseRolePermissionCreateSchema>;\nexport type BaseRolePermissionUpdate = z.infer<typeof baseRolePermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getRolePermissionLabel(locale: string): string {\n return rolePermissionI18n.label[locale as keyof typeof rolePermissionI18n.label] ?? rolePermissionI18n.label['en'] ?? 'RolePermission';\n}\n\n/** Get field label for a specific locale */\nexport function getRolePermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = rolePermissionI18n.fields[field as keyof typeof rolePermissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getRolePermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = rolePermissionI18n.fields[field as keyof typeof rolePermissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * RolePermission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { RolePermission as RolePermissionBase } from './base/RolePermission';\nimport {\n baseRolePermissionSchemas,\n baseRolePermissionCreateSchema,\n baseRolePermissionUpdateSchema,\n rolePermissionI18n,\n getRolePermissionLabel,\n getRolePermissionFieldLabel,\n getRolePermissionFieldPlaceholder,\n} from './base/RolePermission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface RolePermission extends RolePermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const rolePermissionSchemas = { ...baseRolePermissionSchemas };\nexport const rolePermissionCreateSchema = baseRolePermissionCreateSchema;\nexport const rolePermissionUpdateSchema = baseRolePermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RolePermissionCreate = z.infer<typeof rolePermissionCreateSchema>;\nexport type RolePermissionUpdate = z.infer<typeof rolePermissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n rolePermissionI18n,\n getRolePermissionLabel,\n getRolePermissionFieldLabel,\n getRolePermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { RolePermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * チームキャッシュ\n */\nexport interface TeamCache {\n /** Primary key */\n id: string;\n /** Console Team ID */\n console_team_id: unknown;\n /** Console Organization ID */\n console_org_id: unknown;\n /** チーム名 */\n name: string;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for TeamCache\n * Contains model label and all field labels/placeholders\n */\nexport const teamCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"チームキャッシュ\",\"en\":\"Team Cache\"},\n /** Field labels and placeholders */\n fields: {\n console_team_id: {\n label: {\"ja\":\"Console Team ID\",\"en\":\"Console Team ID\"},\n },\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n name: {\n label: {\"ja\":\"チーム名\",\"en\":\"Team Name\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for TeamCache */\nexport const baseTeamCacheSchemas = {\n console_team_id: z.string(),\n console_org_id: z.string(),\n name: z.string().min(1).max(100),\n} as const;\n\n/** Create schema for TeamCache (POST requests) */\nexport const baseTeamCacheCreateSchema = z.object({\n console_team_id: baseTeamCacheSchemas.console_team_id,\n console_org_id: baseTeamCacheSchemas.console_org_id,\n name: baseTeamCacheSchemas.name,\n});\n\n/** Update schema for TeamCache (PUT/PATCH requests) */\nexport const baseTeamCacheUpdateSchema = baseTeamCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseTeamCacheCreate = z.infer<typeof baseTeamCacheCreateSchema>;\nexport type BaseTeamCacheUpdate = z.infer<typeof baseTeamCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getTeamCacheLabel(locale: string): string {\n return teamCacheI18n.label[locale as keyof typeof teamCacheI18n.label] ?? teamCacheI18n.label['en'] ?? 'TeamCache';\n}\n\n/** Get field label for a specific locale */\nexport function getTeamCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = teamCacheI18n.fields[field as keyof typeof teamCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getTeamCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = teamCacheI18n.fields[field as keyof typeof teamCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * TeamCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { TeamCache as TeamCacheBase } from './base/TeamCache';\nimport {\n baseTeamCacheSchemas,\n baseTeamCacheCreateSchema,\n baseTeamCacheUpdateSchema,\n teamCacheI18n,\n getTeamCacheLabel,\n getTeamCacheFieldLabel,\n getTeamCacheFieldPlaceholder,\n} from './base/TeamCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface TeamCache extends TeamCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const teamCacheSchemas = { ...baseTeamCacheSchemas };\nexport const teamCacheCreateSchema = baseTeamCacheCreateSchema;\nexport const teamCacheUpdateSchema = baseTeamCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TeamCacheCreate = z.infer<typeof teamCacheCreateSchema>;\nexport type TeamCacheUpdate = z.infer<typeof teamCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n teamCacheI18n,\n getTeamCacheLabel,\n getTeamCacheFieldLabel,\n getTeamCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { TeamCacheBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\n\n/**\n * チーム権限\n */\nexport interface TeamPermission {\n /** Primary key */\n id: string;\n /** Console Organization ID */\n console_org_id: unknown;\n /** Console Team ID */\n console_team_id: unknown;\n /** 権限 */\n permission: Permission;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for TeamPermission\n * Contains model label and all field labels/placeholders\n */\nexport const teamPermissionI18n = {\n /** Model display name */\n label: {\"ja\":\"チーム権限\",\"en\":\"Team Permission\"},\n /** Field labels and placeholders */\n fields: {\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n console_team_id: {\n label: {\"ja\":\"Console Team ID\",\"en\":\"Console Team ID\"},\n },\n permission: {\n label: {\"ja\":\"権限\",\"en\":\"Permission\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for TeamPermission */\nexport const baseTeamPermissionSchemas = {\n console_org_id: z.string(),\n console_team_id: z.string(),\n} as const;\n\n/** Create schema for TeamPermission (POST requests) */\nexport const baseTeamPermissionCreateSchema = z.object({\n console_org_id: baseTeamPermissionSchemas.console_org_id,\n console_team_id: baseTeamPermissionSchemas.console_team_id,\n});\n\n/** Update schema for TeamPermission (PUT/PATCH requests) */\nexport const baseTeamPermissionUpdateSchema = baseTeamPermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseTeamPermissionCreate = z.infer<typeof baseTeamPermissionCreateSchema>;\nexport type BaseTeamPermissionUpdate = z.infer<typeof baseTeamPermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getTeamPermissionLabel(locale: string): string {\n return teamPermissionI18n.label[locale as keyof typeof teamPermissionI18n.label] ?? teamPermissionI18n.label['en'] ?? 'TeamPermission';\n}\n\n/** Get field label for a specific locale */\nexport function getTeamPermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = teamPermissionI18n.fields[field as keyof typeof teamPermissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getTeamPermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = teamPermissionI18n.fields[field as keyof typeof teamPermissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * TeamPermission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { TeamPermission as TeamPermissionBase } from './base/TeamPermission';\nimport {\n baseTeamPermissionSchemas,\n baseTeamPermissionCreateSchema,\n baseTeamPermissionUpdateSchema,\n teamPermissionI18n,\n getTeamPermissionLabel,\n getTeamPermissionFieldLabel,\n getTeamPermissionFieldPlaceholder,\n} from './base/TeamPermission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface TeamPermission extends TeamPermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const teamPermissionSchemas = { ...baseTeamPermissionSchemas };\nexport const teamPermissionCreateSchema = baseTeamPermissionCreateSchema;\nexport const teamPermissionUpdateSchema = baseTeamPermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TeamPermissionCreate = z.infer<typeof teamPermissionCreateSchema>;\nexport type TeamPermissionUpdate = z.infer<typeof teamPermissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n teamPermissionI18n,\n getTeamPermissionLabel,\n getTeamPermissionFieldLabel,\n getTeamPermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { TeamPermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Role } from './Role';\n\n/**\n * ユーザーキャッシュ\n */\nexport interface UserCache {\n /** Primary key */\n id: string;\n /** 名前 */\n name: string;\n /** メールアドレス */\n email: string;\n /** Console User ID */\n console_user_id?: unknown;\n /** 所属組織ID */\n console_org_id?: unknown;\n /** Console Access Token */\n console_access_token?: string;\n /** Console Refresh Token */\n console_refresh_token?: string;\n /** Console Token有効期限 */\n console_token_expires_at?: DateTimeString;\n /** ロール */\n roles: Role[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for UserCache\n * Contains model label and all field labels/placeholders\n */\nexport const userCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"ユーザーキャッシュ\",\"en\":\"User Cache\"},\n /** Field labels and placeholders */\n fields: {\n name: {\n label: {\"ja\":\"名前\",\"en\":\"Name\"},\n },\n email: {\n label: {\"ja\":\"メールアドレス\",\"en\":\"Email\"},\n },\n console_user_id: {\n label: {\"ja\":\"Console User ID\",\"en\":\"Console User ID\"},\n },\n console_org_id: {\n label: {\"ja\":\"所属組織ID\",\"en\":\"Organization ID\"},\n },\n console_access_token: {\n label: {\"ja\":\"Console Access Token\",\"en\":\"Console Access Token\"},\n },\n console_refresh_token: {\n label: {\"ja\":\"Console Refresh Token\",\"en\":\"Console Refresh Token\"},\n },\n console_token_expires_at: {\n label: {\"ja\":\"Console Token有効期限\",\"en\":\"Console Token Expiry\"},\n },\n roles: {\n label: {\"ja\":\"ロール\",\"en\":\"Roles\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for UserCache */\nexport const baseUserCacheSchemas = {\n name: z.string().min(1),\n email: z.string().min(1),\n console_user_id: z.string().optional().nullable(),\n console_org_id: z.string().optional().nullable(),\n console_access_token: z.string().optional().nullable(),\n console_refresh_token: z.string().optional().nullable(),\n console_token_expires_at: z.string().datetime({ offset: true }).optional().nullable(),\n} as const;\n\n/** Create schema for UserCache (POST requests) */\nexport const baseUserCacheCreateSchema = z.object({\n name: baseUserCacheSchemas.name,\n email: baseUserCacheSchemas.email,\n console_user_id: baseUserCacheSchemas.console_user_id,\n console_org_id: baseUserCacheSchemas.console_org_id,\n console_access_token: baseUserCacheSchemas.console_access_token,\n console_refresh_token: baseUserCacheSchemas.console_refresh_token,\n console_token_expires_at: baseUserCacheSchemas.console_token_expires_at,\n});\n\n/** Update schema for UserCache (PUT/PATCH requests) */\nexport const baseUserCacheUpdateSchema = baseUserCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseUserCacheCreate = z.infer<typeof baseUserCacheCreateSchema>;\nexport type BaseUserCacheUpdate = z.infer<typeof baseUserCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getUserCacheLabel(locale: string): string {\n return userCacheI18n.label[locale as keyof typeof userCacheI18n.label] ?? userCacheI18n.label['en'] ?? 'UserCache';\n}\n\n/** Get field label for a specific locale */\nexport function getUserCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = userCacheI18n.fields[field as keyof typeof userCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getUserCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = userCacheI18n.fields[field as keyof typeof userCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * UserCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { UserCache as UserCacheBase } from './base/UserCache';\nimport {\n baseUserCacheSchemas,\n baseUserCacheCreateSchema,\n baseUserCacheUpdateSchema,\n userCacheI18n,\n getUserCacheLabel,\n getUserCacheFieldLabel,\n getUserCacheFieldPlaceholder,\n} from './base/UserCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface UserCache extends UserCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const userCacheSchemas = { ...baseUserCacheSchemas };\nexport const userCacheCreateSchema = baseUserCacheCreateSchema;\nexport const userCacheUpdateSchema = baseUserCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type UserCacheCreate = z.infer<typeof userCacheCreateSchema>;\nexport type UserCacheUpdate = z.infer<typeof userCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n userCacheI18n,\n getUserCacheLabel,\n getUserCacheFieldLabel,\n getUserCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { UserCacheBase };\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, useEffect, useMemo, useState } from 'react';\nimport { SsoContext } from './SsoContext';\nimport type {\n SsoCallbackResponse,\n SsoConfig,\n SsoOrganization,\n SsoProviderProps,\n SsoUser,\n} from '../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 * Get storage instance based on type\n */\nfunction getStorage(type: 'localStorage' | 'sessionStorage'): Storage | null {\n if (typeof window === 'undefined') return null;\n return type === 'localStorage' ? window.localStorage : window.sessionStorage;\n}\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nfunction 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 * SSO Provider component\n */\nexport function SsoProvider({ children, config, onAuthChange }: SsoProviderProps) {\n const [user, setUser] = useState<SsoUser | null>(null);\n const [organizations, setOrganizations] = useState<SsoOrganization[]>([]);\n const [currentOrg, setCurrentOrg] = useState<SsoOrganization | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n const storageKey = config.storageKey ?? 'sso_selected_org';\n const storage = getStorage(config.storage ?? 'localStorage');\n\n /**\n * Load selected org from storage\n */\n const loadSelectedOrg = useCallback(\n (orgs: SsoOrganization[]) => {\n if (!storage || orgs.length === 0) return null;\n\n const savedSlug = storage.getItem(storageKey);\n if (savedSlug) {\n const found = orgs.find((o) => o.slug === savedSlug);\n if (found) return found;\n }\n\n // Default to first org\n return orgs[0];\n },\n [storage, storageKey]\n );\n\n /**\n * Save selected org to storage\n */\n const saveSelectedOrg = useCallback(\n (org: SsoOrganization | null) => {\n if (!storage) return;\n\n if (org) {\n storage.setItem(storageKey, org.slug);\n } else {\n storage.removeItem(storageKey);\n }\n },\n [storage, storageKey]\n );\n\n /**\n * Fetch current user from backend (Sanctum cookie-based auth)\n */\n const fetchUser = useCallback(async () => {\n try {\n const xsrfToken = getXsrfToken();\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n };\n if (xsrfToken) {\n headers['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken);\n }\n\n const response = await fetch(`${config.apiUrl}/api/sso/user`, {\n headers,\n credentials: 'include',\n });\n\n if (!response.ok) {\n return null;\n }\n\n const data: { user: SsoCallbackResponse['user']; organizations: SsoCallbackResponse['organizations'] } =\n await response.json();\n\n const transformedUser = transformUser(data.user);\n const transformedOrgs = transformOrganizations(data.organizations);\n\n return { user: transformedUser, organizations: transformedOrgs };\n } catch {\n return null;\n }\n }, [config.apiUrl]);\n\n /**\n * Initialize auth state\n */\n useEffect(() => {\n let mounted = true;\n\n const init = async () => {\n setIsLoading(true);\n\n const result = await fetchUser();\n\n if (!mounted) return;\n\n if (result) {\n setUser(result.user);\n setOrganizations(result.organizations);\n const selectedOrg = loadSelectedOrg(result.organizations);\n setCurrentOrg(selectedOrg);\n onAuthChange?.(true, result.user);\n } else {\n setUser(null);\n setOrganizations([]);\n setCurrentOrg(null);\n onAuthChange?.(false, null);\n }\n\n setIsLoading(false);\n };\n\n init();\n\n return () => {\n mounted = false;\n };\n }, [fetchUser, loadSelectedOrg, onAuthChange]);\n\n /**\n * Login - redirect to Console\n */\n const login = useCallback(\n (redirectTo?: string) => {\n const callbackUrl = new URL('/sso/callback', window.location.origin);\n if (redirectTo) {\n callbackUrl.searchParams.set('redirect', redirectTo);\n }\n\n const loginUrl = new URL('/sso/authorize', config.consoleUrl);\n loginUrl.searchParams.set('service', config.serviceSlug);\n loginUrl.searchParams.set('redirect_uri', callbackUrl.toString());\n\n window.location.href = loginUrl.toString();\n },\n [config.consoleUrl, config.serviceSlug]\n );\n\n /**\n * Logout from service (Sanctum cookie-based)\n */\n const logout = useCallback(async () => {\n try {\n const xsrfToken = getXsrfToken();\n const headers: Record<string, string> = {};\n if (xsrfToken) {\n headers['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken);\n }\n\n await fetch(`${config.apiUrl}/api/sso/logout`, {\n method: 'POST',\n headers,\n credentials: 'include',\n });\n } catch {\n // Ignore errors\n }\n\n setUser(null);\n setOrganizations([]);\n setCurrentOrg(null);\n saveSelectedOrg(null);\n onAuthChange?.(false, null);\n }, [config.apiUrl, saveSelectedOrg, onAuthChange]);\n\n /**\n * Global logout - logout from Console too\n */\n const globalLogout = useCallback(\n async (redirectTo?: string) => {\n // First logout from service\n await logout();\n\n // Then redirect to Console logout\n // Convert relative path to absolute URL (e.g., '/' → 'https://example.com/')\n const redirectUri = redirectTo\n ? new URL(redirectTo, window.location.origin).toString()\n : window.location.origin;\n const logoutUrl = new URL('/sso/logout', config.consoleUrl);\n logoutUrl.searchParams.set('redirect_uri', redirectUri);\n\n window.location.href = logoutUrl.toString();\n },\n [logout, config.consoleUrl]\n );\n\n /**\n * Switch organization\n */\n const switchOrg = useCallback(\n (orgId: string) => {\n const org = organizations.find((o) => o.slug === orgId);\n if (org) {\n setCurrentOrg(org);\n saveSelectedOrg(org);\n }\n },\n [organizations, saveSelectedOrg]\n );\n\n /**\n * Refresh user data\n */\n const refreshUser = useCallback(async () => {\n const result = await fetchUser();\n\n if (result) {\n setUser(result.user);\n setOrganizations(result.organizations);\n\n // Keep current org if still valid\n if (currentOrg) {\n const stillValid = result.organizations.find((o) => o.slug === currentOrg.slug);\n if (!stillValid) {\n const newOrg = loadSelectedOrg(result.organizations);\n setCurrentOrg(newOrg);\n }\n }\n }\n }, [fetchUser, currentOrg, loadSelectedOrg]);\n\n /**\n * Get headers for API requests\n */\n const getHeaders = useCallback((): Record<string, string> => {\n const headers: Record<string, string> = {};\n\n if (currentOrg) {\n headers['X-Organization-Id'] = currentOrg.slug;\n }\n\n return headers;\n }, [currentOrg]);\n\n const value = useMemo(\n () => ({\n user,\n organizations,\n currentOrg,\n isLoading,\n isAuthenticated: !!user,\n config,\n login,\n logout,\n globalLogout,\n switchOrg,\n refreshUser,\n getHeaders,\n }),\n [\n user,\n organizations,\n currentOrg,\n isLoading,\n config,\n login,\n logout,\n globalLogout,\n switchOrg,\n refreshUser,\n getHeaders,\n ]\n );\n\n return <SsoContext.Provider value={value}>{children}</SsoContext.Provider>;\n}\n","'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { BranchContextValue } from '../types';\n\n/**\n * Branch Context\n * \n * Provides branch state management across the application.\n * Must be used within a BranchProvider.\n */\nexport const BranchContext = createContext<BranchContextValue | null>(null);\n\n/**\n * Hook to access Branch context\n * @throws Error if used outside BranchProvider\n */\nexport function useBranchContext(): BranchContextValue {\n const context = useContext(BranchContext);\n\n if (!context) {\n throw new Error('useBranchContext must be used within a BranchProvider');\n }\n\n return context;\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { BranchContext } from './BranchContext';\nimport { useSsoContext } from './SsoContext';\nimport { createBranchService, type BranchesResponse } from '../services/branchService';\nimport { ssoQueryKeys } from '../queryKeys';\nimport type { BranchProviderProps, SsoBranch, BranchContextValue } from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'omnify_selected_branch';\n\n/**\n * BranchProvider component\n * \n * Provides branch state management for the application.\n * Automatically fetches branches when organization changes.\n * \n * @example\n * ```tsx\n * // In your app\n * <SsoProvider config={ssoConfig}>\n * <BranchProvider>\n * <App />\n * </BranchProvider>\n * </SsoProvider>\n * \n * // In a component\n * function MyComponent() {\n * const { branches, currentBranch, switchBranch } = useBranch();\n * // ...\n * }\n * ```\n */\nexport function BranchProvider({\n children,\n storage = 'localStorage',\n storageKey = DEFAULT_STORAGE_KEY,\n onBranchChange,\n}: BranchProviderProps) {\n const { config, currentOrg, isAuthenticated } = useSsoContext();\n const queryClient = useQueryClient();\n\n const branchService = useMemo(\n () => createBranchService({ apiUrl: config.apiUrl }),\n [config.apiUrl]\n );\n\n // Get saved branch ID from storage\n const getSavedBranchId = useCallback((): number | null => {\n if (typeof window === 'undefined') return null;\n const storageObj = storage === 'localStorage' ? localStorage : sessionStorage;\n const saved = storageObj.getItem(`${storageKey}_${currentOrg?.slug}`);\n return saved ? parseInt(saved, 10) : null;\n }, [storage, storageKey, currentOrg?.slug]);\n\n // Save branch ID to storage\n const saveBranchId = useCallback((branchId: number | null) => {\n if (typeof window === 'undefined' || !currentOrg?.slug) return;\n const storageObj = storage === 'localStorage' ? localStorage : sessionStorage;\n if (branchId) {\n storageObj.setItem(`${storageKey}_${currentOrg.slug}`, String(branchId));\n } else {\n storageObj.removeItem(`${storageKey}_${currentOrg.slug}`);\n }\n }, [storage, storageKey, currentOrg?.slug]);\n\n // Selected branch state\n const [selectedBranchId, setSelectedBranchId] = useState<number | null>(() => getSavedBranchId());\n\n // Fetch branches for current organization\n const {\n data: branchesData,\n isLoading,\n error,\n refetch,\n } = useQuery<BranchesResponse>({\n queryKey: ssoQueryKeys.branches.list(currentOrg?.slug),\n queryFn: () => branchService.list(currentOrg?.slug),\n enabled: isAuthenticated && !!currentOrg,\n staleTime: 5 * 60 * 1000, // 5 minutes\n });\n\n // Extract branches data\n const branches = branchesData?.branches ?? [];\n const allBranchesAccess = branchesData?.all_branches_access ?? false;\n const primaryBranchId = branchesData?.primary_branch_id ?? null;\n const hasMultipleBranches = branches.length > 1;\n\n // Find current branch from branches list\n const currentBranch = useMemo((): SsoBranch | null => {\n if (!branches.length) return null;\n\n // If only one branch, auto-select it\n if (branches.length === 1) {\n return branches[0];\n }\n\n // If we have a saved selection, use it\n if (selectedBranchId) {\n const found = branches.find(b => b.id === selectedBranchId);\n if (found) return found;\n }\n\n // Use primary branch if available\n if (primaryBranchId) {\n const primary = branches.find(b => b.id === primaryBranchId);\n if (primary) return primary;\n }\n\n // Use headquarters\n const hq = branches.find(b => b.is_headquarters);\n if (hq) return hq;\n\n // Fallback to first branch\n return branches[0];\n }, [branches, selectedBranchId, primaryBranchId]);\n\n // Update selected branch ID when current branch changes\n useEffect(() => {\n if (currentBranch && currentBranch.id !== selectedBranchId) {\n setSelectedBranchId(currentBranch.id);\n saveBranchId(currentBranch.id);\n onBranchChange?.(currentBranch);\n }\n }, [currentBranch, selectedBranchId, saveBranchId, onBranchChange]);\n\n // Reset selection when organization changes\n useEffect(() => {\n const savedId = getSavedBranchId();\n setSelectedBranchId(savedId);\n }, [currentOrg?.slug, getSavedBranchId]);\n\n // Switch branch function\n const switchBranch = useCallback((branchId: number) => {\n const branch = branches.find(b => b.id === branchId);\n if (branch) {\n setSelectedBranchId(branchId);\n saveBranchId(branchId);\n onBranchChange?.(branch);\n }\n }, [branches, saveBranchId, onBranchChange]);\n\n // Refresh branches\n const refreshBranches = useCallback(async () => {\n await queryClient.invalidateQueries({\n queryKey: ssoQueryKeys.branches.list(currentOrg?.slug),\n });\n await refetch();\n }, [queryClient, currentOrg?.slug, refetch]);\n\n const contextValue: BranchContextValue = useMemo(\n () => ({\n branches,\n currentBranch,\n allBranchesAccess,\n primaryBranchId,\n isLoading,\n error: error as Error | null,\n hasMultipleBranches,\n switchBranch,\n refreshBranches,\n }),\n [\n branches,\n currentBranch,\n allBranchesAccess,\n primaryBranchId,\n isLoading,\n error,\n hasMultipleBranches,\n switchBranch,\n refreshBranches,\n ]\n );\n\n return (\n <BranchContext.Provider value={contextValue}>\n {children}\n </BranchContext.Provider>\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 { 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 { 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 { useMemo } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoConfig, SsoOrganization, SsoUser } from '../types';\n\n/**\n * Combined SSO hook return type\n */\nexport interface UseSsoReturn {\n // Auth\n user: SsoUser | null;\n isLoading: boolean;\n isAuthenticated: boolean;\n login: (redirectTo?: string) => void;\n logout: () => Promise<void>;\n globalLogout: (redirectTo?: string) => void;\n refreshUser: () => Promise<void>;\n\n // Organization\n organizations: SsoOrganization[];\n currentOrg: SsoOrganization | null;\n hasMultipleOrgs: boolean;\n switchOrg: (orgId: string) => void;\n\n // Utilities\n getHeaders: () => Record<string, string>;\n config: SsoConfig;\n}\n\n/**\n * Combined hook for all SSO functionality\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {\n * user,\n * isAuthenticated,\n * currentOrg,\n * getHeaders,\n * login,\n * logout,\n * } = useSso();\n *\n * const fetchData = async () => {\n * const response = await fetch('/api/data', {\n * headers: getHeaders(),\n * });\n * // ...\n * };\n *\n * if (!isAuthenticated) {\n * return <button onClick={() => login()}>Login</button>;\n * }\n *\n * return (\n * <div>\n * <p>Welcome, {user?.name}</p>\n * <p>Organization: {currentOrg?.name}</p>\n * <button onClick={() => logout()}>Logout</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useSso(): UseSsoReturn {\n const context = useSsoContext();\n\n return useMemo(\n () => ({\n // Auth\n user: context.user,\n isLoading: context.isLoading,\n isAuthenticated: context.isAuthenticated,\n login: context.login,\n logout: context.logout,\n globalLogout: context.globalLogout,\n refreshUser: context.refreshUser,\n\n // Organization\n organizations: context.organizations,\n currentOrg: context.currentOrg,\n hasMultipleOrgs: context.organizations.length > 1,\n switchOrg: context.switchOrg,\n\n // Utilities\n getHeaders: context.getHeaders,\n config: context.config,\n }),\n [context]\n );\n}\n","'use client';\n\nimport { useBranchContext } from '../context/BranchContext';\nimport type { BranchContextValue } from '../types';\n\n/**\n * Hook return type for branch management\n */\nexport type UseBranchReturn = BranchContextValue;\n\n/**\n * Hook for branch management\n * \n * Provides access to branch state and operations.\n * Must be used within a BranchProvider.\n * \n * @example\n * ```tsx\n * function BranchInfo() {\n * const { \n * branches, \n * currentBranch, \n * hasMultipleBranches,\n * switchBranch \n * } = useBranch();\n * \n * // Auto-selection logic is handled by the provider\n * // - If only 1 branch: auto-selected\n * // - If multiple: use saved preference or primary branch\n * \n * return (\n * <div>\n * <p>Current: {currentBranch?.name}</p>\n * {hasMultipleBranches && (\n * <select onChange={(e) => switchBranch(Number(e.target.value))}>\n * {branches.map((branch) => (\n * <option key={branch.id} value={branch.id}>\n * {branch.name}\n * </option>\n * ))}\n * </select>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useBranch(): UseBranchReturn {\n return useBranchContext();\n}\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 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 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 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","'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","/**\n * Branch header utilities for API clients\n *\n * These utilities help set branch context headers on axios instances.\n * Works with BranchGate's onSelectionChange callback.\n *\n * @example\n * ```typescript\n * import { createBranchHeaderSetter } from '@famgia/omnify-react-sso';\n * import api from './api'; // your axios instance\n *\n * // Create setter for your axios instance\n * const setBranchHeaders = createBranchHeaderSetter(api);\n *\n * // Use in BranchGate\n * <BranchGate onSelectionChange={setBranchHeaders}>\n * <App />\n * </BranchGate>\n * ```\n */\n\nimport type { BranchGateSelection } from '../types';\n\n/**\n * Headers set by branch selection\n */\nexport const BRANCH_HEADERS = {\n BRANCH_ID: 'X-Branch-Id',\n ORG_ID: 'X-Organization-Id',\n} as const;\n\n/**\n * Minimal axios-like interface for header management\n */\ninterface AxiosLike {\n defaults: {\n headers: {\n common: Record<string, string | undefined>;\n };\n };\n}\n\n/**\n * Create a branch header setter function for an axios instance\n *\n * @param axiosInstance - Your axios instance\n * @returns A function to pass to BranchGate's onSelectionChange\n *\n * @example\n * ```typescript\n * const setBranchHeaders = createBranchHeaderSetter(api);\n *\n * <BranchGate onSelectionChange={setBranchHeaders}>\n * <App />\n * </BranchGate>\n * ```\n */\nexport function createBranchHeaderSetter(axiosInstance: AxiosLike) {\n return (selection: BranchGateSelection | null) => {\n if (selection) {\n axiosInstance.defaults.headers.common[BRANCH_HEADERS.BRANCH_ID] = selection.branchId;\n axiosInstance.defaults.headers.common[BRANCH_HEADERS.ORG_ID] = selection.orgId;\n } else {\n delete axiosInstance.defaults.headers.common[BRANCH_HEADERS.BRANCH_ID];\n delete axiosInstance.defaults.headers.common[BRANCH_HEADERS.ORG_ID];\n }\n };\n}\n\n/**\n * Set branch headers directly on an axios instance\n *\n * @example\n * ```typescript\n * import api from './api';\n * import { setBranchHeaders } from '@famgia/omnify-react-sso';\n *\n * // In BranchGate onSelectionChange\n * <BranchGate onSelectionChange={(s) => setBranchHeaders(api, s)}>\n * <App />\n * </BranchGate>\n * ```\n */\nexport function setBranchHeaders(\n axiosInstance: AxiosLike,\n selection: BranchGateSelection | null\n): void {\n createBranchHeaderSetter(axiosInstance)(selection);\n}\n","/**\n * Auth Service - SSO Authentication\n *\n * Handles SSO callback, logout, user info\n */\n\nimport { buildHeaders, csrf, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SsoUser {\n id: number;\n console_user_id: number;\n email: string;\n name: string;\n}\n\nexport interface Organization {\n id: number;\n slug: string;\n name: string;\n role: string;\n}\n\nexport interface AuthCallbackInput {\n code: string;\n device_name?: string;\n}\n\nexport interface AuthCallbackResponse {\n user: SsoUser;\n organizations: Organization[];\n token?: string;\n}\n\nexport interface AuthUserResponse {\n user: SsoUser;\n organizations: Organization[];\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createAuthService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Exchange SSO authorization code for tokens\n * POST /api/sso/callback\n */\n callback: async (input: AuthCallbackInput): Promise<AuthCallbackResponse> => {\n await csrf(apiUrl);\n return request(apiUrl, \"/api/sso/callback\", {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Logout current user and revoke tokens\n * POST /api/sso/logout\n */\n logout: async (): Promise<{ message: string }> => {\n return request(apiUrl, \"/api/sso/logout\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get current authenticated user with organizations\n * GET /api/sso/user\n */\n getUser: async (): Promise<AuthUserResponse> => {\n return request(apiUrl, \"/api/sso/user\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get Console SSO global logout URL\n * GET /api/sso/global-logout-url\n */\n getGlobalLogoutUrl: async (redirectUri?: string): Promise<{ logout_url: string }> => {\n const params = redirectUri\n ? `?redirect_uri=${encodeURIComponent(redirectUri)}`\n : \"\";\n return request(apiUrl, `/api/sso/global-logout-url${params}`, {\n headers: buildHeaders(),\n });\n },\n };\n}\n\nexport type AuthService = ReturnType<typeof createAuthService>;\n","/**\n * Token Service - API Token Management\n *\n * For mobile apps using bearer tokens\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ApiToken {\n id: number;\n name: string;\n last_used_at: string | null;\n created_at: string;\n is_current: boolean;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createTokenService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * List all API tokens for current user\n * GET /api/sso/tokens\n */\n list: async (): Promise<{ tokens: ApiToken[] }> => {\n return request(apiUrl, \"/api/sso/tokens\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke a specific token\n * DELETE /api/sso/tokens/{tokenId}\n */\n revoke: async (tokenId: number): Promise<{ message: string }> => {\n return request(apiUrl, `/api/sso/tokens/${tokenId}`, {\n method: \"DELETE\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke all tokens except current\n * POST /api/sso/tokens/revoke-others\n */\n revokeOthers: async (): Promise<{ message: string; revoked_count: number }> => {\n return request(apiUrl, \"/api/sso/tokens/revoke-others\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n };\n}\n\nexport type TokenService = ReturnType<typeof createTokenService>;\n","/**\n * Role Service - Role Management\n *\n * CRUD operations for roles and role-permission assignments\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface Role {\n id: number;\n name: string;\n slug: string;\n description: string | null;\n level: number;\n permissions_count?: number;\n console_org_id?: string | null;\n organization?: {\n id: string;\n console_org_id: string;\n name: string;\n code: string;\n } | null;\n created_at: string;\n updated_at: string;\n}\n\nexport interface Permission {\n id: number;\n name: string;\n slug: string;\n group: string | null;\n description?: string | null;\n roles_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface RoleWithPermissions extends Role {\n permissions: Permission[];\n}\n\nexport interface CreateRoleInput {\n slug: string;\n name: string;\n level: number;\n description?: string;\n scope?: \"global\" | \"org\" | \"org-wide\" | \"branch\";\n console_org_id?: string | null;\n}\n\nexport interface RoleListParams {\n \"filter[scope]\"?: \"all\" | \"global\" | \"org\";\n \"filter[search]\"?: string;\n page?: number;\n per_page?: number;\n}\n\nexport interface UpdateRoleInput {\n name?: string;\n level?: number;\n description?: string | null;\n}\n\nexport interface SyncPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface SyncPermissionsResponse {\n message: string;\n attached: number;\n detached: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createRoleService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // Read-only endpoints (authenticated users)\n // =========================================================================\n\n /**\n * Get all roles\n * GET /api/sso/roles\n */\n list: async (): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/sso/roles\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get single role with permissions\n * GET /api/sso/roles/{id}\n */\n get: async (id: number | string): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/sso/roles/${id}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin endpoints (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all roles (admin)\n * GET /api/admin/sso/roles\n */\n adminList: async (\n orgId: string,\n params?: RoleListParams\n ): Promise<{ data: Role[] }> => {\n const queryParams = new URLSearchParams();\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n }\n const query = queryParams.toString();\n const url = `/api/admin/sso/roles${query ? `?${query}` : \"\"}`;\n\n return request(apiUrl, url, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get single role (admin)\n * GET /api/admin/sso/roles/{id}\n */\n adminGet: async (\n id: number | string,\n orgId: string\n ): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Create role (admin only)\n * POST /api/admin/sso/roles\n */\n create: async (\n input: CreateRoleInput,\n orgId: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n method: \"POST\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update role (admin only)\n * PUT /api/admin/sso/roles/{id}\n */\n update: async (\n id: number | string,\n input: UpdateRoleInput,\n orgId: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete role (admin only)\n * DELETE /api/admin/sso/roles/{id}\n */\n delete: async (id: number | string, orgId: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get role's permissions (admin)\n * GET /api/admin/sso/roles/{id}/permissions\n */\n getPermissions: async (\n id: number | string,\n orgId: string\n ): Promise<{\n role: Pick<Role, \"id\" | \"slug\" | \"name\">;\n permissions: Permission[];\n }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Sync role's permissions (admin)\n * PUT /api/admin/sso/roles/{id}/permissions\n */\n syncPermissions: async (\n id: number | string,\n input: SyncPermissionsInput,\n orgId: string\n ): Promise<SyncPermissionsResponse> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n };\n}\n\nexport type RoleService = ReturnType<typeof createRoleService>;\n","/**\n * Permission Service - Permission Management\n *\n * CRUD operations for permissions and permission matrix\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\nimport type { Role, Permission } from \"./roleService\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface PermissionMatrix {\n roles: Pick<Role, \"id\" | \"slug\" | \"name\">[];\n permissions: Record<string, Pick<Permission, \"id\" | \"slug\" | \"name\">[]>;\n matrix: Record<string, string[]>; // role_slug: permission_slugs[]\n}\n\nexport interface CreatePermissionInput {\n slug: string;\n name: string;\n group?: string;\n description?: string;\n}\n\nexport interface UpdatePermissionInput {\n name?: string;\n group?: string | null;\n description?: string | null;\n}\n\nexport interface PermissionListParams {\n group?: string;\n search?: string;\n grouped?: boolean;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createPermissionService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // Read-only endpoints (authenticated users)\n // =========================================================================\n\n /**\n * Get all permissions\n * GET /api/sso/permissions\n */\n list: async (params?: PermissionListParams): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/sso/permissions${queryString}`, {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get permission matrix (roles x permissions)\n * GET /api/sso/permission-matrix\n */\n getMatrix: async (): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/sso/permission-matrix\", {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin endpoints (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all permissions (admin)\n * GET /api/admin/sso/permissions\n */\n adminList: async (\n orgId: string,\n params?: PermissionListParams\n ): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/admin/sso/permissions${queryString}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get single permission (admin)\n * GET /api/admin/sso/permissions/{id}\n */\n adminGet: async (\n id: number | string,\n orgId: string\n ): Promise<{ data: Permission }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Create permission (admin only)\n * POST /api/admin/sso/permissions\n */\n create: async (\n input: CreatePermissionInput,\n orgId: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/permissions\", {\n method: \"POST\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update permission (admin only)\n * PUT /api/admin/sso/permissions/{id}\n */\n update: async (\n id: number | string,\n input: UpdatePermissionInput,\n orgId: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete permission (admin only)\n * DELETE /api/admin/sso/permissions/{id}\n */\n delete: async (id: number | string, orgId: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get permission matrix (admin)\n * GET /api/admin/sso/permission-matrix\n */\n adminGetMatrix: async (orgId: string): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/admin/sso/permission-matrix\", {\n headers: buildHeaders(orgId),\n });\n },\n };\n}\n\nexport type PermissionService = ReturnType<typeof createPermissionService>;\n\n// Re-export Permission type for convenience\nexport type { Permission } from \"./roleService\";\n","/**\n * Team Service - Team Permission Management\n *\n * Manage team permissions and orphaned team cleanup\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\nimport type { Permission } from \"./roleService\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface TeamWithPermissions {\n console_team_id: number;\n name: string;\n path: string | null;\n permissions: Pick<Permission, \"id\" | \"slug\">[];\n}\n\nexport interface TeamPermissionDetail {\n console_team_id: number;\n permissions: Pick<Permission, \"id\" | \"slug\" | \"name\">[];\n}\n\nexport interface OrphanedTeam {\n console_team_id: number;\n permissions_count: number;\n permissions: string[];\n deleted_at: string | null;\n}\n\nexport interface SyncTeamPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface CleanupOrphanedInput {\n console_team_id?: number;\n older_than_days?: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createTeamService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Get all teams with their permissions (admin only)\n * GET /api/admin/sso/teams/permissions\n */\n list: async (orgId: string): Promise<{ teams: TeamWithPermissions[] }> => {\n return request(apiUrl, \"/api/admin/sso/teams/permissions\", {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get specific team permissions (admin only)\n * GET /api/admin/sso/teams/{teamId}/permissions\n */\n getPermissions: async (\n teamId: number,\n orgId: string\n ): Promise<TeamPermissionDetail> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Sync team permissions (admin only)\n * PUT /api/admin/sso/teams/{teamId}/permissions\n */\n syncPermissions: async (\n teamId: number,\n input: SyncTeamPermissionsInput,\n orgId: string\n ): Promise<{\n message: string;\n console_team_id: number;\n attached: number;\n detached: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Remove all permissions for a team (admin only)\n * DELETE /api/admin/sso/teams/{teamId}/permissions\n */\n removePermissions: async (teamId: number, orgId: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * List orphaned team permissions (admin only)\n * GET /api/admin/sso/teams/orphaned\n */\n listOrphaned: async (\n orgId: string\n ): Promise<{\n orphaned_teams: OrphanedTeam[];\n total_orphaned_permissions: number;\n }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Restore orphaned team permissions (admin only)\n * POST /api/admin/sso/teams/orphaned/{teamId}/restore\n */\n restoreOrphaned: async (\n teamId: number,\n orgId: string\n ): Promise<{\n message: string;\n console_team_id: number;\n restored_count: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/orphaned/${teamId}/restore`, {\n method: \"POST\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Cleanup orphaned team permissions (admin only)\n * DELETE /api/admin/sso/teams/orphaned\n */\n cleanupOrphaned: async (\n orgId: string,\n input?: CleanupOrphanedInput\n ): Promise<{ message: string; deleted_count: number }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n body: input ? JSON.stringify(input) : undefined,\n });\n },\n };\n}\n\nexport type TeamService = ReturnType<typeof createTeamService>;\n","/**\n * User Role Service - Scoped Role Assignments\n *\n * Implements Branch-Level Permissions management:\n * - Global: org_id=null, branch_id=null → Role applies everywhere\n * - Org-wide: org_id=X, branch_id=null → Role applies to all branches in org\n * - Branch: org_id=X, branch_id=Y → Role applies only to specific branch\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type RoleScope = \"global\" | \"org-wide\" | \"branch\";\n\nexport interface RoleAssignment {\n id: string | null;\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n console_org_id: string | null;\n console_branch_id: string | null;\n scope: RoleScope;\n created_at: string | null;\n}\n\nexport interface UserRoleListResponse {\n data: RoleAssignment[];\n}\n\nexport interface AssignRoleInput {\n role_id: string;\n console_org_id?: string | null;\n console_branch_id?: string | null;\n}\n\nexport interface AssignRoleResponse {\n message: string;\n data: {\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n console_org_id: string | null;\n console_branch_id: string | null;\n scope: RoleScope;\n };\n}\n\nexport interface SyncRolesInput {\n roles: string[]; // Role IDs or slugs\n console_org_id?: string | null;\n console_branch_id?: string | null;\n}\n\nexport interface SyncRolesResponse {\n message: string;\n attached: string[];\n detached: string[];\n scope: RoleScope;\n}\n\nexport interface RemoveRoleResponse {\n message: string;\n removed: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createUserRoleService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * List user's role assignments with scope information\n * GET /api/admin/sso/users/{userId}/roles\n */\n list: async (userId: string, orgId?: string): Promise<RoleAssignment[]> => {\n const response = await request<UserRoleListResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n { headers: buildHeaders(orgId) }\n );\n return response.data;\n },\n\n /**\n * List user's role assignments filtered by branch context\n * Returns roles applicable to the given org/branch\n */\n listByBranch: async (\n userId: string,\n consoleOrgId: string,\n branchId: string | null,\n orgId?: string\n ): Promise<RoleAssignment[]> => {\n const all = await request<UserRoleListResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n { headers: buildHeaders(orgId) }\n );\n\n // Filter assignments that apply to this branch:\n // 1. Global assignments (org=null)\n // 2. Org-wide assignments (org=X, branch=null)\n // 3. Branch-specific assignments (org=X, branch=Y)\n return all.data.filter((a) => {\n // Global applies everywhere\n if (a.console_org_id === null) return true;\n\n // Must be same org\n if (a.console_org_id !== consoleOrgId) return false;\n\n // Org-wide applies to all branches\n if (a.console_branch_id === null) return true;\n\n // Branch-specific must match\n return a.console_branch_id === branchId;\n });\n },\n\n /**\n * Assign a role to user with scope\n * POST /api/admin/sso/users/{userId}/roles\n */\n assign: async (\n userId: string,\n input: AssignRoleInput,\n orgId?: string\n ): Promise<AssignRoleResponse> => {\n return request<AssignRoleResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n {\n method: \"POST\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n }\n );\n },\n\n /**\n * Remove a role assignment from user\n * DELETE /api/admin/sso/users/{userId}/roles/{roleId}\n */\n remove: async (\n userId: string,\n roleId: string,\n consoleOrgId?: string | null,\n branchId?: string | null,\n orgId?: string\n ): Promise<RemoveRoleResponse> => {\n return request<RemoveRoleResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles/${roleId}`,\n {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n body: JSON.stringify({\n console_org_id: consoleOrgId ?? null,\n console_branch_id: branchId ?? null,\n }),\n }\n );\n },\n\n /**\n * Sync roles for user in a specific scope\n * PUT /api/admin/sso/users/{userId}/roles/sync\n */\n sync: async (\n userId: string,\n input: SyncRolesInput,\n orgId?: string\n ): Promise<SyncRolesResponse> => {\n return request<SyncRolesResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles/sync`,\n {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n }\n );\n },\n };\n}\n\n// Export type for the service\nexport type UserRoleService = ReturnType<typeof createUserRoleService>;\n\n// =============================================================================\n// Helper functions for permission resolution\n// =============================================================================\n\n/**\n * Get scope label for display\n */\nexport const getScopeLabel = (\n scope: RoleScope,\n locale: \"en\" | \"ja\" | \"vi\" = \"en\"\n): string => {\n const labels: Record<RoleScope, Record<string, string>> = {\n global: { en: \"Global\", ja: \"グローバル\", vi: \"Toàn hệ thống\" },\n \"org-wide\": { en: \"Organization\", ja: \"組織全体\", vi: \"Toàn tổ chức\" },\n branch: { en: \"Branch\", ja: \"支店限定\", vi: \"Chi nhánh\" },\n };\n return labels[scope][locale] || labels[scope][\"en\"];\n};\n\n/**\n * Get effective permissions for a user at a specific branch\n * based on their role assignments\n */\nexport const getEffectivePermissions = <\n TRole extends { id: string; permissions?: Array<string | { slug: string }> }\n>(\n roleAssignments: RoleAssignment[],\n allRoles: TRole[],\n orgId: string,\n branchId: string | null\n): string[] => {\n const permissions = new Set<string>();\n\n // Filter applicable assignments\n const applicableAssignments = roleAssignments.filter((a) => {\n if (a.console_org_id === null) return true;\n if (a.console_org_id !== orgId) return false;\n if (a.console_branch_id === null) return true;\n return a.console_branch_id === branchId;\n });\n\n // Collect permissions from all applicable roles\n for (const assignment of applicableAssignments) {\n const role = allRoles.find((r) => r.id === assignment.role.id);\n if (role?.permissions) {\n for (const perm of role.permissions) {\n if (typeof perm === \"string\") {\n permissions.add(perm);\n } else if (perm.slug) {\n permissions.add(perm.slug);\n }\n }\n }\n }\n\n return Array.from(permissions);\n};\n","/**\n * User Service - User Management for Admin Panel\n *\n * Provides user listing and permission retrieval for admin interface\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface User {\n id: string;\n email: string;\n name: string;\n email_verified_at?: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport interface UserWithOrg extends User {\n console_org_id?: string;\n organization?: {\n id: string;\n console_org_id: string;\n name: string;\n code: string;\n } | null;\n}\n\nexport interface UserListParams {\n \"filter[search]\"?: string;\n \"filter[org_id]\"?: string;\n page?: number;\n per_page?: number;\n}\n\nexport interface UserListResponse {\n data: User[];\n meta?: {\n current_page: number;\n last_page: number;\n per_page: number;\n total: number;\n };\n}\n\nexport interface RoleAssignmentWithPermissions {\n id: string | null;\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n console_org_id: string | null;\n console_branch_id: string | null;\n org_name?: string | null;\n branch_name?: string | null;\n scope: \"global\" | \"org-wide\" | \"branch\";\n permissions: Array<{\n id: string;\n name: string;\n slug: string;\n group: string;\n }>;\n}\n\nexport interface TeamMembershipWithPermissions {\n id: string;\n team: {\n id: string;\n name: string;\n path?: string;\n };\n is_leader?: boolean;\n permissions: Array<{\n id: string;\n name: string;\n slug: string;\n group: string;\n }>;\n}\n\nexport interface PermissionDetail {\n id: string;\n name: string;\n slug: string;\n group: string;\n sources: Array<{\n type: \"role\" | \"team\" | \"direct\";\n name: string;\n scope?: string;\n }>;\n}\n\nexport interface UserPermissionsBreakdown {\n user: {\n id: string;\n email: string;\n name: string;\n created_at?: string;\n organization?: {\n id: string;\n console_org_id: string;\n name: string;\n code: string;\n } | null;\n };\n context: {\n org_id: string | null;\n branch_id: string | null;\n };\n role_assignments: RoleAssignmentWithPermissions[];\n team_memberships: TeamMembershipWithPermissions[];\n direct_permissions: Array<{\n id: string;\n name: string;\n slug: string;\n group: string;\n }>;\n effective_permissions: PermissionDetail[];\n aggregated_permissions: string[];\n total_permissions: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createUserService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * List users with optional filters\n * GET /api/admin/sso/users\n */\n list: async (\n params?: UserListParams,\n orgId?: string\n ): Promise<UserListResponse> => {\n const queryParams = new URLSearchParams();\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n }\n const query = queryParams.toString();\n const url = `/api/admin/sso/users${query ? `?${query}` : \"\"}`;\n\n return request<UserListResponse>(apiUrl, url, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get single user by ID\n * GET /api/admin/sso/users/{userId}\n */\n get: async (userId: string, orgId?: string): Promise<User> => {\n const response = await request<{ data: User }>(\n apiUrl,\n `/api/admin/sso/users/${userId}`,\n { headers: buildHeaders(orgId) }\n );\n return response.data;\n },\n\n /**\n * Get user permissions breakdown for specific org/branch context\n * GET /api/admin/sso/users/{userId}/permissions\n */\n getPermissions: async (\n userId: string,\n consoleOrgId?: string,\n branchId?: string,\n orgId?: string\n ): Promise<UserPermissionsBreakdown> => {\n const queryParams = new URLSearchParams();\n if (consoleOrgId) queryParams.append(\"org_id\", consoleOrgId);\n if (branchId) queryParams.append(\"branch_id\", branchId);\n const query = queryParams.toString();\n const url = `/api/admin/sso/users/${userId}/permissions${query ? `?${query}` : \"\"}`;\n\n return request<UserPermissionsBreakdown>(apiUrl, url, {\n headers: buildHeaders(orgId),\n });\n },\n };\n}\n\n// Export type for the service\nexport type UserService = ReturnType<typeof createUserService>;\n","/**\n * SSO Service - API client for SSO endpoints\n *\n * Provides methods for SSO authentication, tokens, roles, permissions, teams\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SsoUser {\n id: number;\n console_user_id: number;\n email: string;\n name: string;\n}\n\nexport interface Organization {\n id: number;\n slug: string;\n name: string;\n role: string;\n}\n\nexport interface Role {\n id: number;\n name: string;\n slug: string;\n description: string | null;\n level: number;\n permissions_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface Permission {\n id: number;\n name: string;\n slug: string;\n group: string | null;\n description?: string | null;\n roles_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface RoleWithPermissions extends Role {\n permissions: Permission[];\n}\n\nexport interface PermissionMatrix {\n roles: Pick<Role, \"id\" | \"slug\" | \"name\">[];\n permissions: Record<string, Pick<Permission, \"id\" | \"slug\" | \"name\">[]>;\n matrix: Record<string, string[]>; // role_slug: permission_slugs[]\n}\n\nexport interface ApiToken {\n id: number;\n name: string;\n last_used_at: string | null;\n created_at: string;\n is_current: boolean;\n}\n\nexport interface TeamWithPermissions {\n console_team_id: number;\n name: string;\n path: string | null;\n permissions: Pick<Permission, \"id\" | \"slug\">[];\n}\n\nexport interface TeamPermissionDetail {\n console_team_id: number;\n permissions: Pick<Permission, \"id\" | \"slug\" | \"name\">[];\n}\n\nexport interface OrphanedTeam {\n console_team_id: number;\n permissions_count: number;\n permissions: string[];\n deleted_at: string | null;\n}\n\n// Input types\nexport interface SsoCallbackInput {\n code: string;\n device_name?: string;\n}\n\nexport interface CreateRoleInput {\n slug: string;\n name: string;\n level: number;\n description?: string;\n}\n\nexport interface UpdateRoleInput {\n name?: string;\n level?: number;\n description?: string | null;\n}\n\nexport interface CreatePermissionInput {\n slug: string;\n name: string;\n group?: string;\n description?: string;\n}\n\nexport interface UpdatePermissionInput {\n name?: string;\n group?: string | null;\n description?: string | null;\n}\n\nexport interface SyncPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface CleanupOrphanedInput {\n console_team_id?: number;\n older_than_days?: number;\n}\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nfunction 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 org slug\n */\nfunction 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 */\nasync 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 */\nasync 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// Service Factory\n// =============================================================================\n\nexport interface SsoServiceConfig {\n apiUrl: string;\n}\n\nexport function createSsoService(config: SsoServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // SSO Auth\n // =========================================================================\n\n /**\n * Exchange SSO authorization code for tokens\n * POST /api/sso/callback\n */\n callback: async (\n input: SsoCallbackInput\n ): Promise<{\n user: SsoUser;\n organizations: Organization[];\n token?: string;\n }> => {\n await csrf(apiUrl);\n return request(apiUrl, \"/api/sso/callback\", {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Logout current user and revoke tokens\n * POST /api/sso/logout\n */\n logout: async (): Promise<{ message: string }> => {\n return request(apiUrl, \"/api/sso/logout\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get current authenticated user with organizations\n * GET /api/sso/user\n */\n getUser: async (): Promise<{\n user: SsoUser;\n organizations: Organization[];\n }> => {\n return request(apiUrl, \"/api/sso/user\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get Console SSO global logout URL\n * GET /api/sso/global-logout-url\n */\n getGlobalLogoutUrl: async (\n redirectUri?: string\n ): Promise<{ logout_url: string }> => {\n const params = redirectUri\n ? `?redirect_uri=${encodeURIComponent(redirectUri)}`\n : \"\";\n return request(apiUrl, `/api/sso/global-logout-url${params}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // SSO Tokens (for mobile apps)\n // =========================================================================\n\n /**\n * List all API tokens for current user\n * GET /api/sso/tokens\n */\n getTokens: async (): Promise<{ tokens: ApiToken[] }> => {\n return request(apiUrl, \"/api/sso/tokens\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke a specific token\n * DELETE /api/sso/tokens/{tokenId}\n */\n revokeToken: async (tokenId: number): Promise<{ message: string }> => {\n return request(apiUrl, `/api/sso/tokens/${tokenId}`, {\n method: \"DELETE\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke all tokens except current\n * POST /api/sso/tokens/revoke-others\n */\n revokeOtherTokens: async (): Promise<{\n message: string;\n revoked_count: number;\n }> => {\n return request(apiUrl, \"/api/sso/tokens/revoke-others\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Roles (Read-only for authenticated users)\n // =========================================================================\n\n /**\n * Get all roles\n * GET /api/sso/roles\n */\n getRoles: async (): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/sso/roles\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get single role with permissions\n * GET /api/sso/roles/{id}\n */\n getRole: async (id: number): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/sso/roles/${id}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Permissions (Read-only for authenticated users)\n // =========================================================================\n\n /**\n * Get all permissions\n * GET /api/sso/permissions\n */\n getPermissions: async (params?: {\n group?: string;\n search?: string;\n grouped?: boolean;\n }): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/sso/permissions${queryString}`, {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get permission matrix (roles x permissions)\n * GET /api/sso/permission-matrix\n */\n getPermissionMatrix: async (): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/sso/permission-matrix\", {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin - Roles (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all roles (admin)\n * GET /api/admin/sso/roles\n */\n adminGetRoles: async (orgId: string): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get single role (admin)\n * GET /api/admin/sso/roles/{id}\n */\n adminGetRole: async (\n id: number,\n orgId: string\n ): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Create role (admin only)\n * POST /api/admin/sso/roles\n */\n createRole: async (\n input: CreateRoleInput,\n orgId: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n method: \"POST\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update role (admin only)\n * PUT /api/admin/sso/roles/{id}\n */\n updateRole: async (\n id: number,\n input: UpdateRoleInput,\n orgId: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete role (admin only)\n * DELETE /api/admin/sso/roles/{id}\n */\n deleteRole: async (id: number, orgId: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get role's permissions (admin)\n * GET /api/admin/sso/roles/{id}/permissions\n */\n getRolePermissions: async (\n id: number,\n orgId: string\n ): Promise<{\n role: Pick<Role, \"id\" | \"slug\" | \"name\">;\n permissions: Permission[];\n }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Sync role's permissions (admin)\n * PUT /api/admin/sso/roles/{id}/permissions\n */\n syncRolePermissions: async (\n id: number,\n input: SyncPermissionsInput,\n orgId: string\n ): Promise<{ message: string; attached: number; detached: number }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n // =========================================================================\n // Admin - Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all permissions (admin)\n * GET /api/admin/sso/permissions\n */\n adminGetPermissions: async (\n orgId: string,\n params?: { group?: string; search?: string; grouped?: boolean }\n ): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/admin/sso/permissions${queryString}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get single permission (admin)\n * GET /api/admin/sso/permissions/{id}\n */\n adminGetPermission: async (\n id: number,\n orgId: string\n ): Promise<{ data: Permission }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Create permission (admin only)\n * POST /api/admin/sso/permissions\n */\n createPermission: async (\n input: CreatePermissionInput,\n orgId: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/permissions\", {\n method: \"POST\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update permission (admin only)\n * PUT /api/admin/sso/permissions/{id}\n */\n updatePermission: async (\n id: number,\n input: UpdatePermissionInput,\n orgId: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete permission (admin only)\n * DELETE /api/admin/sso/permissions/{id}\n */\n deletePermission: async (id: number, orgId: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get permission matrix (admin)\n * GET /api/admin/sso/permission-matrix\n */\n adminGetPermissionMatrix: async (\n orgId: string\n ): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/admin/sso/permission-matrix\", {\n headers: buildHeaders(orgId),\n });\n },\n\n // =========================================================================\n // Admin - Team Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * Get all teams with their permissions (admin only)\n * GET /api/admin/sso/teams/permissions\n */\n getTeamPermissions: async (\n orgId: string\n ): Promise<{ teams: TeamWithPermissions[] }> => {\n return request(apiUrl, \"/api/admin/sso/teams/permissions\", {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get specific team permissions (admin only)\n * GET /api/admin/sso/teams/{teamId}/permissions\n */\n getTeamPermission: async (\n teamId: number,\n orgId: string\n ): Promise<TeamPermissionDetail> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Sync team permissions (admin only)\n * PUT /api/admin/sso/teams/{teamId}/permissions\n */\n syncTeamPermissions: async (\n teamId: number,\n input: SyncPermissionsInput,\n orgId: string\n ): Promise<{\n message: string;\n console_team_id: number;\n attached: number;\n detached: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Remove all permissions for a team (admin only)\n * DELETE /api/admin/sso/teams/{teamId}/permissions\n */\n removeTeamPermissions: async (\n teamId: number,\n orgId: string\n ): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n // =========================================================================\n // Admin - Orphaned Team Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * List orphaned team permissions (admin only)\n * GET /api/admin/sso/teams/orphaned\n */\n getOrphanedTeamPermissions: async (\n orgId: string\n ): Promise<{\n orphaned_teams: OrphanedTeam[];\n total_orphaned_permissions: number;\n }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Restore orphaned team permissions (admin only)\n * POST /api/admin/sso/teams/orphaned/{teamId}/restore\n */\n restoreOrphanedTeamPermissions: async (\n teamId: number,\n orgId: string\n ): Promise<{\n message: string;\n console_team_id: number;\n restored_count: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/orphaned/${teamId}/restore`, {\n method: \"POST\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Cleanup orphaned team permissions (admin only)\n * DELETE /api/admin/sso/teams/orphaned\n */\n cleanupOrphanedTeamPermissions: async (\n orgId: string,\n input?: CleanupOrphanedInput\n ): Promise<{ message: string; deleted_count: number }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n body: input ? JSON.stringify(input) : undefined,\n });\n },\n };\n}\n\n// Export types\nexport type SsoService = ReturnType<typeof createSsoService>;\n"],"mappings":"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","names":["defaultLocale","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","import_react","import_react","import_react","getXsrfToken","import_jsx_runtime","import_react","import_react","import_react","import_react","import_jsx_runtime","transformUser","transformOrganizations","error","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","DefaultLoading","import_react","import_antd","import_icons","import_react_query","import_jsx_runtime","Text","import_react","import_antd","import_icons","import_react_query","import_jsx_runtime","Text","Title","DEFAULT_STORAGE_KEY","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","defaultLocale","fallbackLocale","i18n","import_jsx_runtime","i18n","import_icons","import_antd","import_react","import_icons","import_antd","import_jsx_runtime","import_jsx_runtime","Text","defaultTranslations","import_icons","import_antd","import_jsx_runtime","Text","defaultTranslations","import_icons","import_antd","import_react","import_jsx_runtime","Title","Text","defaultTranslations","getScopeLabel","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","getXsrfToken","buildHeaders","csrf","request"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/schemas/base/i18n.ts","../src/core/schemas/base/BranchCache.ts","../src/core/schemas/BranchCache.ts","../src/core/schemas/base/OrganizationCache.ts","../src/core/schemas/OrganizationCache.ts","../src/core/schemas/base/Permission.ts","../src/core/schemas/Permission.ts","../src/core/schemas/base/Role.ts","../src/core/schemas/Role.ts","../src/core/schemas/base/RolePermission.ts","../src/core/schemas/RolePermission.ts","../src/core/schemas/base/TeamCache.ts","../src/core/schemas/TeamCache.ts","../src/core/schemas/base/TeamPermission.ts","../src/core/schemas/TeamPermission.ts","../src/core/schemas/base/UserCache.ts","../src/core/schemas/UserCache.ts","../src/core/context/SsoContext.tsx","../src/core/context/SsoProvider.tsx","../src/core/context/BranchContext.tsx","../src/core/context/BranchProvider.tsx","../src/core/services/utils.ts","../src/core/services/branchService.ts","../src/core/queryKeys.ts","../src/core/hooks/useAuth.ts","../src/core/hooks/useOrganization.ts","../src/core/hooks/useSso.ts","../src/core/hooks/useBranch.ts","../src/ant/components/SsoCallback/SsoCallback.tsx","../src/ant/components/OrganizationSwitcher/OrganizationSwitcher.tsx","../src/ant/components/ProtectedRoute/ProtectedRoute.tsx","../src/ant/components/OrgBranchSelectorModal/OrgBranchSelectorModal.tsx","../src/ant/components/OrgGate/OrgGate.tsx","../src/core/utils/orgSync.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","../src/core/utils/branchHeaders.ts","../src/core/services/authService.ts","../src/core/services/tokenService.ts","../src/core/services/roleService.ts","../src/core/services/permissionService.ts","../src/core/services/teamService.ts","../src/core/services/userRoleService.ts","../src/core/services/userService.ts","../src/core/services/ssoService.ts"],"sourcesContent":["/**\n * @famgia/omnify-react-sso\n *\n * SSO (Single Sign-On) schemas, types, components, and utilities for Omnify.\n */\n\n// =============================================================================\n// Schemas (auto-generated from Omnify)\n// =============================================================================\n\nexport * from './core/schemas';\n\n// =============================================================================\n// Context & Provider\n// =============================================================================\n\nexport { SsoContext } from './core/context/SsoContext';\nexport { SsoProvider } from './core/context/SsoProvider';\nexport { BranchContext } from './core/context/BranchContext';\nexport { BranchProvider } from './core/context/BranchProvider';\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nexport { useAuth } from './core/hooks/useAuth';\nexport { useOrganization } from './core/hooks/useOrganization';\nexport { useSso } from './core/hooks/useSso';\nexport { useBranch } from './core/hooks/useBranch';\n\n// Hook return types\nexport type { UseAuthReturn } from './core/hooks/useAuth';\nexport type { UseOrganizationReturn } from './core/hooks/useOrganization';\nexport type { UseSsoReturn } from './core/hooks/useSso';\nexport type { UseBranchReturn } from './core/hooks/useBranch';\n\n// =============================================================================\n// Components (re-exported from ant module for backward compatibility)\n// =============================================================================\n\nexport {\n SsoCallback,\n OrganizationSwitcher,\n ProtectedRoute,\n OrgBranchSelectorModal,\n BranchGate,\n useBranchGate,\n} from './ant';\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport {\n createBranchHeaderSetter,\n setBranchHeaders,\n BRANCH_HEADERS,\n} from './core/utils/branchHeaders';\n\nexport {\n setOrgIdForApi,\n getOrgIdForApi,\n clearOrgIdForApi,\n hasOrgIdForApi,\n} from './core/utils/orgSync';\n\n// =============================================================================\n// Services - Individual services (recommended)\n// =============================================================================\n\n// Auth Service\nexport { createAuthService } from './core/services';\nexport type {\n AuthService,\n SsoUser as AuthUser,\n Organization,\n AuthCallbackInput,\n AuthCallbackResponse,\n AuthUserResponse,\n} from './core/services';\n\n// Token Service\nexport { createTokenService } from './core/services';\nexport type { TokenService, ApiToken } from './core/services';\n\n// Role Service\nexport { createRoleService } from './core/services';\nexport type {\n RoleService,\n Role,\n RoleWithPermissions,\n CreateRoleInput,\n UpdateRoleInput,\n SyncPermissionsInput,\n SyncPermissionsResponse,\n} from './core/services';\n\n// Permission Service\nexport { createPermissionService } from './core/services';\nexport type {\n PermissionService,\n Permission,\n PermissionMatrix,\n PermissionListParams,\n CreatePermissionInput,\n UpdatePermissionInput,\n} from './core/services';\n\n// Team Service\nexport { createTeamService } from './core/services';\nexport type {\n TeamService,\n TeamWithPermissions,\n TeamPermissionDetail,\n OrphanedTeam,\n SyncTeamPermissionsInput,\n CleanupOrphanedInput,\n} from './core/services';\n\n// User Role Service (Scoped Role Assignments)\nexport { createUserRoleService, getScopeLabel, getEffectivePermissions } from './core/services';\nexport type {\n UserRoleService,\n RoleScope,\n RoleAssignment,\n AssignRoleInput,\n AssignRoleResponse,\n SyncRolesInput,\n SyncRolesResponse,\n RemoveRoleResponse,\n} from './core/services';\n\n// User Service (User Management)\nexport { createUserService } from './core/services';\nexport type {\n UserService,\n User,\n UserWithOrg,\n UserListParams,\n UserListResponse,\n UserPermissionsBreakdown,\n RoleAssignmentWithPermissions,\n TeamMembershipWithPermissions,\n PermissionDetail,\n} from './core/services';\n\n// Branch Service\nexport { createBranchService } from './core/services';\nexport type { BranchService, Branch, BranchesResponse } from './core/services';\n\n// Service Config\nexport type { ServiceConfig } from './core/services';\n\n// =============================================================================\n// Legacy: ssoService (deprecated - use individual services)\n// =============================================================================\n\n/**\n * @deprecated Use individual services instead:\n * - createAuthService() for auth\n * - createTokenService() for tokens\n * - createRoleService() for roles\n * - createPermissionService() for permissions\n * - createTeamService() for teams\n * - createUserRoleService() for user role assignments\n * - createBranchService() for branches\n */\nexport { createSsoService } from './core/services';\nexport type { SsoService, SsoServiceConfig } from './core/services';\n\n// Legacy type aliases for backward compatibility\nexport type { SsoUser as SsoServiceUser } from './core/services';\nexport type { Role as ServiceRole } from './core/services';\nexport type { Permission as ServicePermission } from './core/services';\n\n// =============================================================================\n// Types (camelCase - for React components)\n// =============================================================================\n\nexport type {\n SsoUser,\n SsoOrganization,\n SsoConfig,\n SsoContextValue,\n SsoCallbackResponse,\n SsoProviderProps,\n SsoCallbackProps,\n OrganizationSwitcherProps,\n ProtectedRouteProps,\n // Branch types\n SsoBranch,\n BranchContextValue,\n BranchProviderProps,\n OrgBranchSelectorModalProps,\n OrgBranchSelection,\n // BranchGate types\n BranchGateProps,\n BranchGateSelection,\n} from './core/types';\n\n// =============================================================================\n// Query Keys (for TanStack Query / React Query)\n// =============================================================================\n\nexport { ssoQueryKeys } from './core/queryKeys';\n\n// =============================================================================\n// i18n (Internationalization)\n// =============================================================================\n\nexport {\n I18nProvider,\n useLocale,\n useTranslations,\n useSsoTranslation,\n getCurrentLocale,\n changeLanguage,\n locales,\n localeNames,\n defaultLocale,\n ssoNamespace,\n defaultTranslations,\n type Locale,\n type I18nContextValue,\n type I18nProviderProps,\n} from './core/i18n';\n\n// =============================================================================\n// Ant Design Module (Components + Theme)\n// =============================================================================\n\nexport * from './ant';\n","/**\n * SSO i18n Configuration\n */\n\nimport type { LocaleMap } from './common';\n\n/**\n * Default locale for this project.\n */\nexport const defaultLocale = 'ja' as const;\n\n/**\n * Fallback locale when requested locale is not found.\n */\nexport const fallbackLocale = 'en' as const;\n\n/**\n * Supported locales in this project.\n */\nexport const supportedLocales = [\"ja\",\"en\"] as const;\n\n/**\n * Validation messages for all supported locales.\n * Use getMessage(key, locale, params) to get formatted message.\n */\nexport const validationMessages = {\n \"required\": {\n \"ja\": \"${displayName}は必須です\",\n \"en\": \"${displayName} is required\"\n },\n \"minLength\": {\n \"ja\": \"${displayName}は${min}文字以上で入力してください\",\n \"en\": \"${displayName} must be at least ${min} characters\"\n },\n \"maxLength\": {\n \"ja\": \"${displayName}は${max}文字以内で入力してください\",\n \"en\": \"${displayName} must be at most ${max} characters\"\n },\n \"min\": {\n \"ja\": \"${displayName}は${min}以上で入力してください\",\n \"en\": \"${displayName} must be at least ${min}\"\n },\n \"max\": {\n \"ja\": \"${displayName}は${max}以下で入力してください\",\n \"en\": \"${displayName} must be at most ${max}\"\n },\n \"email\": {\n \"ja\": \"有効なメールアドレスを入力してください\",\n \"en\": \"Please enter a valid email address\"\n },\n \"url\": {\n \"ja\": \"有効なURLを入力してください\",\n \"en\": \"Please enter a valid URL\"\n },\n \"pattern\": {\n \"ja\": \"${displayName}の形式が正しくありません\",\n \"en\": \"${displayName} format is invalid\"\n }\n} as const;\n\n/**\n * Get validation message for a specific key and locale.\n * Supports template placeholders: ${displayName}, ${min}, ${max}, etc.\n *\n * @param key - Message key (e.g., 'required', 'minLength')\n * @param locale - Locale code (e.g., 'ja', 'en')\n * @param params - Template parameters to replace\n * @returns Formatted message string\n *\n * @example\n * getMessage('required', 'ja', { displayName: '氏名' })\n * // => '氏名は必須です'\n */\nexport function getMessage(\n key: string,\n locale: string,\n params: Record<string, string | number> = {}\n): string {\n const messages = validationMessages[key as keyof typeof validationMessages];\n if (!messages) return key;\n\n let message = (messages as LocaleMap)[locale]\n ?? (messages as LocaleMap)[fallbackLocale]\n ?? (messages as LocaleMap)[defaultLocale]\n ?? key;\n\n // Replace template placeholders\n for (const [param, value] of Object.entries(params)) {\n message = message.replace(new RegExp(`\\\\$\\{${param}\\}`, 'g'), String(value));\n }\n\n return message;\n}\n\n/**\n * Get all validation messages for a specific locale.\n *\n * @param locale - Locale code\n * @returns Object with all messages for the locale\n */\nexport function getMessages(locale: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, messages] of Object.entries(validationMessages)) {\n result[key] = (messages as LocaleMap)[locale]\n ?? (messages as LocaleMap)[fallbackLocale]\n ?? (messages as LocaleMap)[defaultLocale]\n ?? key;\n }\n return result;\n}\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * 支店キャッシュ\n */\nexport interface BranchCache {\n /** Primary key */\n id: string;\n /** Console Branch ID */\n console_branch_id: unknown;\n /** Console Organization ID */\n console_org_id: unknown;\n /** 支店コード */\n code: string;\n /** 支店名 */\n name: string;\n /** 本社 */\n is_headquarters: boolean;\n /** 有効 */\n is_active: boolean;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for BranchCache\n * Contains model label and all field labels/placeholders\n */\nexport const branchCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"支店キャッシュ\",\"en\":\"Branch Cache\"},\n /** Field labels and placeholders */\n fields: {\n console_branch_id: {\n label: {\"ja\":\"Console Branch ID\",\"en\":\"Console Branch ID\"},\n },\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n code: {\n label: {\"ja\":\"支店コード\",\"en\":\"Branch Code\"},\n },\n name: {\n label: {\"ja\":\"支店名\",\"en\":\"Branch Name\"},\n },\n is_headquarters: {\n label: {\"ja\":\"本社\",\"en\":\"Is Headquarters\"},\n },\n is_active: {\n label: {\"ja\":\"有効\",\"en\":\"Active\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for BranchCache */\nexport const baseBranchCacheSchemas = {\n console_branch_id: z.string(),\n console_org_id: z.string(),\n code: z.string().min(1).max(20),\n name: z.string().min(1).max(100),\n is_headquarters: z.boolean(),\n is_active: z.boolean(),\n} as const;\n\n/** Create schema for BranchCache (POST requests) */\nexport const baseBranchCacheCreateSchema = z.object({\n console_branch_id: baseBranchCacheSchemas.console_branch_id,\n console_org_id: baseBranchCacheSchemas.console_org_id,\n code: baseBranchCacheSchemas.code,\n name: baseBranchCacheSchemas.name,\n is_headquarters: baseBranchCacheSchemas.is_headquarters,\n is_active: baseBranchCacheSchemas.is_active,\n});\n\n/** Update schema for BranchCache (PUT/PATCH requests) */\nexport const baseBranchCacheUpdateSchema = baseBranchCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseBranchCacheCreate = z.infer<typeof baseBranchCacheCreateSchema>;\nexport type BaseBranchCacheUpdate = z.infer<typeof baseBranchCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getBranchCacheLabel(locale: string): string {\n return branchCacheI18n.label[locale as keyof typeof branchCacheI18n.label] ?? branchCacheI18n.label['en'] ?? 'BranchCache';\n}\n\n/** Get field label for a specific locale */\nexport function getBranchCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = branchCacheI18n.fields[field as keyof typeof branchCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getBranchCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = branchCacheI18n.fields[field as keyof typeof branchCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * BranchCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { BranchCache as BranchCacheBase } from './base/BranchCache';\nimport {\n baseBranchCacheSchemas,\n baseBranchCacheCreateSchema,\n baseBranchCacheUpdateSchema,\n branchCacheI18n,\n getBranchCacheLabel,\n getBranchCacheFieldLabel,\n getBranchCacheFieldPlaceholder,\n} from './base/BranchCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface BranchCache extends BranchCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const branchCacheSchemas = { ...baseBranchCacheSchemas };\nexport const branchCacheCreateSchema = baseBranchCacheCreateSchema;\nexport const branchCacheUpdateSchema = baseBranchCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type BranchCacheCreate = z.infer<typeof branchCacheCreateSchema>;\nexport type BranchCacheUpdate = z.infer<typeof branchCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n branchCacheI18n,\n getBranchCacheLabel,\n getBranchCacheFieldLabel,\n getBranchCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { BranchCacheBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * 組織キャッシュ\n */\nexport interface OrganizationCache {\n /** Primary key */\n id: string;\n /** Console Organization ID */\n console_org_id: unknown;\n /** 組織名 */\n name: string;\n /** 組織コード */\n code: string;\n /** 有効 */\n is_active: boolean;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for OrganizationCache\n * Contains model label and all field labels/placeholders\n */\nexport const organizationCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"組織キャッシュ\",\"en\":\"Organization Cache\"},\n /** Field labels and placeholders */\n fields: {\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n name: {\n label: {\"ja\":\"組織名\",\"en\":\"Organization Name\"},\n },\n code: {\n label: {\"ja\":\"組織コード\",\"en\":\"Organization Code\"},\n },\n is_active: {\n label: {\"ja\":\"有効\",\"en\":\"Active\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for OrganizationCache */\nexport const baseOrganizationCacheSchemas = {\n console_org_id: z.string(),\n name: z.string().min(1).max(100),\n code: z.string().min(1).max(20),\n is_active: z.boolean(),\n} as const;\n\n/** Create schema for OrganizationCache (POST requests) */\nexport const baseOrganizationCacheCreateSchema = z.object({\n console_org_id: baseOrganizationCacheSchemas.console_org_id,\n name: baseOrganizationCacheSchemas.name,\n code: baseOrganizationCacheSchemas.code,\n is_active: baseOrganizationCacheSchemas.is_active,\n});\n\n/** Update schema for OrganizationCache (PUT/PATCH requests) */\nexport const baseOrganizationCacheUpdateSchema = baseOrganizationCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseOrganizationCacheCreate = z.infer<typeof baseOrganizationCacheCreateSchema>;\nexport type BaseOrganizationCacheUpdate = z.infer<typeof baseOrganizationCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getOrganizationCacheLabel(locale: string): string {\n return organizationCacheI18n.label[locale as keyof typeof organizationCacheI18n.label] ?? organizationCacheI18n.label['en'] ?? 'OrganizationCache';\n}\n\n/** Get field label for a specific locale */\nexport function getOrganizationCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = organizationCacheI18n.fields[field as keyof typeof organizationCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getOrganizationCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = organizationCacheI18n.fields[field as keyof typeof organizationCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * OrganizationCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { OrganizationCache as OrganizationCacheBase } from './base/OrganizationCache';\nimport {\n baseOrganizationCacheSchemas,\n baseOrganizationCacheCreateSchema,\n baseOrganizationCacheUpdateSchema,\n organizationCacheI18n,\n getOrganizationCacheLabel,\n getOrganizationCacheFieldLabel,\n getOrganizationCacheFieldPlaceholder,\n} from './base/OrganizationCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface OrganizationCache extends OrganizationCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const organizationCacheSchemas = { ...baseOrganizationCacheSchemas };\nexport const organizationCacheCreateSchema = baseOrganizationCacheCreateSchema;\nexport const organizationCacheUpdateSchema = baseOrganizationCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type OrganizationCacheCreate = z.infer<typeof organizationCacheCreateSchema>;\nexport type OrganizationCacheUpdate = z.infer<typeof organizationCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n organizationCacheI18n,\n getOrganizationCacheLabel,\n getOrganizationCacheFieldLabel,\n getOrganizationCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { OrganizationCacheBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Role } from './Role';\n\n/**\n * 権限\n */\nexport interface Permission {\n /** Primary key */\n id: string;\n /** 権限名 */\n name: string;\n /** スラッグ */\n slug: string;\n /** グループ */\n group?: string;\n /** ロール */\n roles: Role[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for Permission\n * Contains model label and all field labels/placeholders\n */\nexport const permissionI18n = {\n /** Model display name */\n label: {\"ja\":\"権限\",\"en\":\"Permission\"},\n /** Field labels and placeholders */\n fields: {\n name: {\n label: {\"ja\":\"権限名\",\"en\":\"Permission Name\"},\n },\n slug: {\n label: {\"ja\":\"スラッグ\",\"en\":\"Slug\"},\n },\n group: {\n label: {\"ja\":\"グループ\",\"en\":\"Group\"},\n },\n roles: {\n label: {\"ja\":\"ロール\",\"en\":\"Roles\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for Permission */\nexport const basePermissionSchemas = {\n name: z.string().min(1).max(100),\n slug: z.string().min(1).max(100),\n group: z.string().max(50).optional().nullable(),\n} as const;\n\n/** Create schema for Permission (POST requests) */\nexport const basePermissionCreateSchema = z.object({\n name: basePermissionSchemas.name,\n slug: basePermissionSchemas.slug,\n group: basePermissionSchemas.group,\n});\n\n/** Update schema for Permission (PUT/PATCH requests) */\nexport const basePermissionUpdateSchema = basePermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BasePermissionCreate = z.infer<typeof basePermissionCreateSchema>;\nexport type BasePermissionUpdate = z.infer<typeof basePermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getPermissionLabel(locale: string): string {\n return permissionI18n.label[locale as keyof typeof permissionI18n.label] ?? permissionI18n.label['en'] ?? 'Permission';\n}\n\n/** Get field label for a specific locale */\nexport function getPermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = permissionI18n.fields[field as keyof typeof permissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getPermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = permissionI18n.fields[field as keyof typeof permissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * Permission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { Permission as PermissionBase } from './base/Permission';\nimport {\n basePermissionSchemas,\n basePermissionCreateSchema,\n basePermissionUpdateSchema,\n permissionI18n,\n getPermissionLabel,\n getPermissionFieldLabel,\n getPermissionFieldPlaceholder,\n} from './base/Permission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface Permission extends PermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const permissionSchemas = { ...basePermissionSchemas };\nexport const permissionCreateSchema = basePermissionCreateSchema;\nexport const permissionUpdateSchema = basePermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PermissionCreate = z.infer<typeof permissionCreateSchema>;\nexport type PermissionUpdate = z.infer<typeof permissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n permissionI18n,\n getPermissionLabel,\n getPermissionFieldLabel,\n getPermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { PermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\n\n/**\n * ロール\n */\nexport interface Role {\n /** Primary key */\n id: string;\n /** 組織ID */\n console_org_id?: string;\n /** ロール名 */\n name: string;\n /** スラッグ */\n slug: string;\n /** 説明 */\n description?: string;\n /** レベル */\n level: number;\n /** 権限 */\n permissions: Permission[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for Role\n * Contains model label and all field labels/placeholders\n */\nexport const roleI18n = {\n /** Model display name */\n label: {\"ja\":\"ロール\",\"en\":\"Role\"},\n /** Field labels and placeholders */\n fields: {\n console_org_id: {\n label: {\"ja\":\"組織ID\",\"en\":\"Organization ID\"},\n },\n name: {\n label: {\"ja\":\"ロール名\",\"en\":\"Role Name\"},\n },\n slug: {\n label: {\"ja\":\"スラッグ\",\"en\":\"Slug\"},\n },\n description: {\n label: {\"ja\":\"説明\",\"en\":\"Description\"},\n },\n level: {\n label: {\"ja\":\"レベル\",\"en\":\"Level\"},\n },\n permissions: {\n label: {\"ja\":\"権限\",\"en\":\"Permissions\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for Role */\nexport const baseRoleSchemas = {\n console_org_id: z.string().max(36).optional().nullable(),\n name: z.string().min(1).max(100),\n slug: z.string().min(1).max(100),\n description: z.string().optional().nullable(),\n level: z.number().int(),\n} as const;\n\n/** Create schema for Role (POST requests) */\nexport const baseRoleCreateSchema = z.object({\n console_org_id: baseRoleSchemas.console_org_id,\n name: baseRoleSchemas.name,\n slug: baseRoleSchemas.slug,\n description: baseRoleSchemas.description,\n level: baseRoleSchemas.level,\n});\n\n/** Update schema for Role (PUT/PATCH requests) */\nexport const baseRoleUpdateSchema = baseRoleCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseRoleCreate = z.infer<typeof baseRoleCreateSchema>;\nexport type BaseRoleUpdate = z.infer<typeof baseRoleUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getRoleLabel(locale: string): string {\n return roleI18n.label[locale as keyof typeof roleI18n.label] ?? roleI18n.label['en'] ?? 'Role';\n}\n\n/** Get field label for a specific locale */\nexport function getRoleFieldLabel(field: string, locale: string): string {\n const fieldI18n = roleI18n.fields[field as keyof typeof roleI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getRoleFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = roleI18n.fields[field as keyof typeof roleI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * Role Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { Role as RoleBase } from './base/Role';\nimport {\n baseRoleSchemas,\n baseRoleCreateSchema,\n baseRoleUpdateSchema,\n roleI18n,\n getRoleLabel,\n getRoleFieldLabel,\n getRoleFieldPlaceholder,\n} from './base/Role';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface Role extends RoleBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const roleSchemas = { ...baseRoleSchemas };\nexport const roleCreateSchema = baseRoleCreateSchema;\nexport const roleUpdateSchema = baseRoleUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RoleCreate = z.infer<typeof roleCreateSchema>;\nexport type RoleUpdate = z.infer<typeof roleUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n roleI18n,\n getRoleLabel,\n getRoleFieldLabel,\n getRoleFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { RoleBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\nimport type { Role } from './Role';\n\n/**\n * ロール権限\n */\nexport interface RolePermission {\n /** ロール */\n role: Role;\n /** 権限 */\n permission: Permission;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for RolePermission\n * Contains model label and all field labels/placeholders\n */\nexport const rolePermissionI18n = {\n /** Model display name */\n label: {\"ja\":\"ロール権限\",\"en\":\"Role Permission\"},\n /** Field labels and placeholders */\n fields: {\n role: {\n label: {\"ja\":\"ロール\",\"en\":\"Role\"},\n },\n permission: {\n label: {\"ja\":\"権限\",\"en\":\"Permission\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for RolePermission */\nexport const baseRolePermissionSchemas = {\n} as const;\n\n/** Create schema for RolePermission (POST requests) */\nexport const baseRolePermissionCreateSchema = z.object({\n});\n\n/** Update schema for RolePermission (PUT/PATCH requests) */\nexport const baseRolePermissionUpdateSchema = baseRolePermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseRolePermissionCreate = z.infer<typeof baseRolePermissionCreateSchema>;\nexport type BaseRolePermissionUpdate = z.infer<typeof baseRolePermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getRolePermissionLabel(locale: string): string {\n return rolePermissionI18n.label[locale as keyof typeof rolePermissionI18n.label] ?? rolePermissionI18n.label['en'] ?? 'RolePermission';\n}\n\n/** Get field label for a specific locale */\nexport function getRolePermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = rolePermissionI18n.fields[field as keyof typeof rolePermissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getRolePermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = rolePermissionI18n.fields[field as keyof typeof rolePermissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * RolePermission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { RolePermission as RolePermissionBase } from './base/RolePermission';\nimport {\n baseRolePermissionSchemas,\n baseRolePermissionCreateSchema,\n baseRolePermissionUpdateSchema,\n rolePermissionI18n,\n getRolePermissionLabel,\n getRolePermissionFieldLabel,\n getRolePermissionFieldPlaceholder,\n} from './base/RolePermission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface RolePermission extends RolePermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const rolePermissionSchemas = { ...baseRolePermissionSchemas };\nexport const rolePermissionCreateSchema = baseRolePermissionCreateSchema;\nexport const rolePermissionUpdateSchema = baseRolePermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type RolePermissionCreate = z.infer<typeof rolePermissionCreateSchema>;\nexport type RolePermissionUpdate = z.infer<typeof rolePermissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n rolePermissionI18n,\n getRolePermissionLabel,\n getRolePermissionFieldLabel,\n getRolePermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { RolePermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\n\n/**\n * チームキャッシュ\n */\nexport interface TeamCache {\n /** Primary key */\n id: string;\n /** Console Team ID */\n console_team_id: unknown;\n /** Console Organization ID */\n console_org_id: unknown;\n /** チーム名 */\n name: string;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for TeamCache\n * Contains model label and all field labels/placeholders\n */\nexport const teamCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"チームキャッシュ\",\"en\":\"Team Cache\"},\n /** Field labels and placeholders */\n fields: {\n console_team_id: {\n label: {\"ja\":\"Console Team ID\",\"en\":\"Console Team ID\"},\n },\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n name: {\n label: {\"ja\":\"チーム名\",\"en\":\"Team Name\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for TeamCache */\nexport const baseTeamCacheSchemas = {\n console_team_id: z.string(),\n console_org_id: z.string(),\n name: z.string().min(1).max(100),\n} as const;\n\n/** Create schema for TeamCache (POST requests) */\nexport const baseTeamCacheCreateSchema = z.object({\n console_team_id: baseTeamCacheSchemas.console_team_id,\n console_org_id: baseTeamCacheSchemas.console_org_id,\n name: baseTeamCacheSchemas.name,\n});\n\n/** Update schema for TeamCache (PUT/PATCH requests) */\nexport const baseTeamCacheUpdateSchema = baseTeamCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseTeamCacheCreate = z.infer<typeof baseTeamCacheCreateSchema>;\nexport type BaseTeamCacheUpdate = z.infer<typeof baseTeamCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getTeamCacheLabel(locale: string): string {\n return teamCacheI18n.label[locale as keyof typeof teamCacheI18n.label] ?? teamCacheI18n.label['en'] ?? 'TeamCache';\n}\n\n/** Get field label for a specific locale */\nexport function getTeamCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = teamCacheI18n.fields[field as keyof typeof teamCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getTeamCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = teamCacheI18n.fields[field as keyof typeof teamCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * TeamCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { TeamCache as TeamCacheBase } from './base/TeamCache';\nimport {\n baseTeamCacheSchemas,\n baseTeamCacheCreateSchema,\n baseTeamCacheUpdateSchema,\n teamCacheI18n,\n getTeamCacheLabel,\n getTeamCacheFieldLabel,\n getTeamCacheFieldPlaceholder,\n} from './base/TeamCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface TeamCache extends TeamCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const teamCacheSchemas = { ...baseTeamCacheSchemas };\nexport const teamCacheCreateSchema = baseTeamCacheCreateSchema;\nexport const teamCacheUpdateSchema = baseTeamCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TeamCacheCreate = z.infer<typeof teamCacheCreateSchema>;\nexport type TeamCacheUpdate = z.infer<typeof teamCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n teamCacheI18n,\n getTeamCacheLabel,\n getTeamCacheFieldLabel,\n getTeamCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { TeamCacheBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Permission } from './Permission';\n\n/**\n * チーム権限\n */\nexport interface TeamPermission {\n /** Primary key */\n id: string;\n /** Console Organization ID */\n console_org_id: unknown;\n /** Console Team ID */\n console_team_id: unknown;\n /** 権限 */\n permission: Permission;\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n /** Soft delete timestamp */\n deleted_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for TeamPermission\n * Contains model label and all field labels/placeholders\n */\nexport const teamPermissionI18n = {\n /** Model display name */\n label: {\"ja\":\"チーム権限\",\"en\":\"Team Permission\"},\n /** Field labels and placeholders */\n fields: {\n console_org_id: {\n label: {\"ja\":\"Console Organization ID\",\"en\":\"Console Organization ID\"},\n },\n console_team_id: {\n label: {\"ja\":\"Console Team ID\",\"en\":\"Console Team ID\"},\n },\n permission: {\n label: {\"ja\":\"権限\",\"en\":\"Permission\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for TeamPermission */\nexport const baseTeamPermissionSchemas = {\n console_org_id: z.string(),\n console_team_id: z.string(),\n} as const;\n\n/** Create schema for TeamPermission (POST requests) */\nexport const baseTeamPermissionCreateSchema = z.object({\n console_org_id: baseTeamPermissionSchemas.console_org_id,\n console_team_id: baseTeamPermissionSchemas.console_team_id,\n});\n\n/** Update schema for TeamPermission (PUT/PATCH requests) */\nexport const baseTeamPermissionUpdateSchema = baseTeamPermissionCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseTeamPermissionCreate = z.infer<typeof baseTeamPermissionCreateSchema>;\nexport type BaseTeamPermissionUpdate = z.infer<typeof baseTeamPermissionUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getTeamPermissionLabel(locale: string): string {\n return teamPermissionI18n.label[locale as keyof typeof teamPermissionI18n.label] ?? teamPermissionI18n.label['en'] ?? 'TeamPermission';\n}\n\n/** Get field label for a specific locale */\nexport function getTeamPermissionFieldLabel(field: string, locale: string): string {\n const fieldI18n = teamPermissionI18n.fields[field as keyof typeof teamPermissionI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getTeamPermissionFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = teamPermissionI18n.fields[field as keyof typeof teamPermissionI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * TeamPermission Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { TeamPermission as TeamPermissionBase } from './base/TeamPermission';\nimport {\n baseTeamPermissionSchemas,\n baseTeamPermissionCreateSchema,\n baseTeamPermissionUpdateSchema,\n teamPermissionI18n,\n getTeamPermissionLabel,\n getTeamPermissionFieldLabel,\n getTeamPermissionFieldPlaceholder,\n} from './base/TeamPermission';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface TeamPermission extends TeamPermissionBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const teamPermissionSchemas = { ...baseTeamPermissionSchemas };\nexport const teamPermissionCreateSchema = baseTeamPermissionCreateSchema;\nexport const teamPermissionUpdateSchema = baseTeamPermissionUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TeamPermissionCreate = z.infer<typeof teamPermissionCreateSchema>;\nexport type TeamPermissionUpdate = z.infer<typeof teamPermissionUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n teamPermissionI18n,\n getTeamPermissionLabel,\n getTeamPermissionFieldLabel,\n getTeamPermissionFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { TeamPermissionBase };\n","/**\n * ⚠️ DO NOT EDIT THIS FILE! ⚠️\n * このファイルを編集しないでください!\n * KHÔNG ĐƯỢC SỬA FILE NÀY!\n *\n * Auto-generated TypeScript types from Omnify schemas.\n * Any manual changes will be OVERWRITTEN on next generation.\n *\n * To modify: Edit the schema YAML file and run: npx omnify generate\n */\n\nimport { z } from 'zod';\nimport type { DateTimeString } from './common';\nimport type { Role } from './Role';\n\n/**\n * ユーザーキャッシュ\n */\nexport interface UserCache {\n /** Primary key */\n id: string;\n /** 名前 */\n name: string;\n /** メールアドレス */\n email: string;\n /** Console User ID */\n console_user_id?: unknown;\n /** 所属組織ID */\n console_org_id?: unknown;\n /** Console Access Token */\n console_access_token?: string;\n /** Console Refresh Token */\n console_refresh_token?: string;\n /** Console Token有効期限 */\n console_token_expires_at?: DateTimeString;\n /** ロール */\n roles: Role[];\n /** Creation timestamp */\n created_at?: DateTimeString;\n /** Last update timestamp */\n updated_at?: DateTimeString;\n}\n\n// ============================================================================\n// I18n (Internationalization)\n// ============================================================================\n\n/**\n * Unified i18n object for UserCache\n * Contains model label and all field labels/placeholders\n */\nexport const userCacheI18n = {\n /** Model display name */\n label: {\"ja\":\"ユーザーキャッシュ\",\"en\":\"User Cache\"},\n /** Field labels and placeholders */\n fields: {\n name: {\n label: {\"ja\":\"名前\",\"en\":\"Name\"},\n },\n email: {\n label: {\"ja\":\"メールアドレス\",\"en\":\"Email\"},\n },\n console_user_id: {\n label: {\"ja\":\"Console User ID\",\"en\":\"Console User ID\"},\n },\n console_org_id: {\n label: {\"ja\":\"所属組織ID\",\"en\":\"Organization ID\"},\n },\n console_access_token: {\n label: {\"ja\":\"Console Access Token\",\"en\":\"Console Access Token\"},\n },\n console_refresh_token: {\n label: {\"ja\":\"Console Refresh Token\",\"en\":\"Console Refresh Token\"},\n },\n console_token_expires_at: {\n label: {\"ja\":\"Console Token有効期限\",\"en\":\"Console Token Expiry\"},\n },\n roles: {\n label: {\"ja\":\"ロール\",\"en\":\"Roles\"},\n },\n },\n} as const;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/** Field schemas for UserCache */\nexport const baseUserCacheSchemas = {\n name: z.string().min(1),\n email: z.string().min(1),\n console_user_id: z.string().optional().nullable(),\n console_org_id: z.string().optional().nullable(),\n console_access_token: z.string().optional().nullable(),\n console_refresh_token: z.string().optional().nullable(),\n console_token_expires_at: z.string().datetime({ offset: true }).optional().nullable(),\n} as const;\n\n/** Create schema for UserCache (POST requests) */\nexport const baseUserCacheCreateSchema = z.object({\n name: baseUserCacheSchemas.name,\n email: baseUserCacheSchemas.email,\n console_user_id: baseUserCacheSchemas.console_user_id,\n console_org_id: baseUserCacheSchemas.console_org_id,\n console_access_token: baseUserCacheSchemas.console_access_token,\n console_refresh_token: baseUserCacheSchemas.console_refresh_token,\n console_token_expires_at: baseUserCacheSchemas.console_token_expires_at,\n});\n\n/** Update schema for UserCache (PUT/PATCH requests) */\nexport const baseUserCacheUpdateSchema = baseUserCacheCreateSchema.partial();\n\n// ============================================================================\n// Inferred Types\n// ============================================================================\n\nexport type BaseUserCacheCreate = z.infer<typeof baseUserCacheCreateSchema>;\nexport type BaseUserCacheUpdate = z.infer<typeof baseUserCacheUpdateSchema>;\n\n// ============================================================================\n// I18n Helper Functions\n// ============================================================================\n\n/** Get model label for a specific locale */\nexport function getUserCacheLabel(locale: string): string {\n return userCacheI18n.label[locale as keyof typeof userCacheI18n.label] ?? userCacheI18n.label['en'] ?? 'UserCache';\n}\n\n/** Get field label for a specific locale */\nexport function getUserCacheFieldLabel(field: string, locale: string): string {\n const fieldI18n = userCacheI18n.fields[field as keyof typeof userCacheI18n.fields];\n if (!fieldI18n) return field;\n return fieldI18n.label[locale as keyof typeof fieldI18n.label] ?? fieldI18n.label['en'] ?? field;\n}\n\n/** Get field placeholder for a specific locale */\nexport function getUserCacheFieldPlaceholder(field: string, locale: string): string {\n const fieldI18n = userCacheI18n.fields[field as keyof typeof userCacheI18n.fields];\n if (!fieldI18n || !('placeholder' in fieldI18n)) return '';\n const placeholder = fieldI18n.placeholder as Record<string, string>;\n return placeholder[locale] ?? placeholder['en'] ?? '';\n}\n","/**\n * UserCache Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types/schemas here.\n * This file will NOT be overwritten by the generator.\n */\n\nimport { z } from 'zod';\nimport type { UserCache as UserCacheBase } from './base/UserCache';\nimport {\n baseUserCacheSchemas,\n baseUserCacheCreateSchema,\n baseUserCacheUpdateSchema,\n userCacheI18n,\n getUserCacheLabel,\n getUserCacheFieldLabel,\n getUserCacheFieldPlaceholder,\n} from './base/UserCache';\n\n// ============================================================================\n// Types (extend or re-export)\n// ============================================================================\n\nexport interface UserCache extends UserCacheBase {\n // Add custom properties here\n}\n\n// ============================================================================\n// Schemas (extend or re-export)\n// ============================================================================\n\nexport const userCacheSchemas = { ...baseUserCacheSchemas };\nexport const userCacheCreateSchema = baseUserCacheCreateSchema;\nexport const userCacheUpdateSchema = baseUserCacheUpdateSchema;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type UserCacheCreate = z.infer<typeof userCacheCreateSchema>;\nexport type UserCacheUpdate = z.infer<typeof userCacheUpdateSchema>;\n\n// Re-export i18n and helpers\nexport {\n userCacheI18n,\n getUserCacheLabel,\n getUserCacheFieldLabel,\n getUserCacheFieldPlaceholder,\n};\n\n// Re-export base type for internal use\nexport type { UserCacheBase };\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, useEffect, useMemo, useState } from 'react';\nimport { SsoContext } from './SsoContext';\nimport type {\n SsoCallbackResponse,\n SsoConfig,\n SsoOrganization,\n SsoProviderProps,\n SsoUser,\n} from '../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 * Get storage instance based on type\n */\nfunction getStorage(type: 'localStorage' | 'sessionStorage'): Storage | null {\n if (typeof window === 'undefined') return null;\n return type === 'localStorage' ? window.localStorage : window.sessionStorage;\n}\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nfunction 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 * SSO Provider component\n */\nexport function SsoProvider({ children, config, onAuthChange }: SsoProviderProps) {\n const [user, setUser] = useState<SsoUser | null>(null);\n const [organizations, setOrganizations] = useState<SsoOrganization[]>([]);\n const [currentOrg, setCurrentOrg] = useState<SsoOrganization | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n const storageKey = config.storageKey ?? 'sso_selected_org';\n const storage = getStorage(config.storage ?? 'localStorage');\n\n /**\n * Load selected org from storage\n */\n const loadSelectedOrg = useCallback(\n (orgs: SsoOrganization[]) => {\n if (!storage || orgs.length === 0) return null;\n\n const savedSlug = storage.getItem(storageKey);\n if (savedSlug) {\n const found = orgs.find((o) => o.slug === savedSlug);\n if (found) return found;\n }\n\n // Default to first org\n return orgs[0];\n },\n [storage, storageKey]\n );\n\n /**\n * Save selected org to storage\n */\n const saveSelectedOrg = useCallback(\n (org: SsoOrganization | null) => {\n if (!storage) return;\n\n if (org) {\n storage.setItem(storageKey, org.slug);\n } else {\n storage.removeItem(storageKey);\n }\n },\n [storage, storageKey]\n );\n\n /**\n * Fetch current user from backend (Sanctum cookie-based auth)\n */\n const fetchUser = useCallback(async () => {\n try {\n const xsrfToken = getXsrfToken();\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n };\n if (xsrfToken) {\n headers['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken);\n }\n\n const response = await fetch(`${config.apiUrl}/api/sso/user`, {\n headers,\n credentials: 'include',\n });\n\n if (!response.ok) {\n return null;\n }\n\n const data: { user: SsoCallbackResponse['user']; organizations: SsoCallbackResponse['organizations'] } =\n await response.json();\n\n const transformedUser = transformUser(data.user);\n const transformedOrgs = transformOrganizations(data.organizations);\n\n return { user: transformedUser, organizations: transformedOrgs };\n } catch {\n return null;\n }\n }, [config.apiUrl]);\n\n /**\n * Initialize auth state\n */\n useEffect(() => {\n let mounted = true;\n\n const init = async () => {\n setIsLoading(true);\n\n const result = await fetchUser();\n\n if (!mounted) return;\n\n if (result) {\n setUser(result.user);\n setOrganizations(result.organizations);\n const selectedOrg = loadSelectedOrg(result.organizations);\n setCurrentOrg(selectedOrg);\n onAuthChange?.(true, result.user);\n } else {\n setUser(null);\n setOrganizations([]);\n setCurrentOrg(null);\n onAuthChange?.(false, null);\n }\n\n setIsLoading(false);\n };\n\n init();\n\n return () => {\n mounted = false;\n };\n }, [fetchUser, loadSelectedOrg, onAuthChange]);\n\n /**\n * Login - redirect to Console\n */\n const login = useCallback(\n (redirectTo?: string) => {\n const callbackUrl = new URL('/sso/callback', window.location.origin);\n if (redirectTo) {\n callbackUrl.searchParams.set('redirect', redirectTo);\n }\n\n const loginUrl = new URL('/sso/authorize', config.consoleUrl);\n loginUrl.searchParams.set('service', config.serviceSlug);\n loginUrl.searchParams.set('redirect_uri', callbackUrl.toString());\n\n window.location.href = loginUrl.toString();\n },\n [config.consoleUrl, config.serviceSlug]\n );\n\n /**\n * Logout from service (Sanctum cookie-based)\n */\n const logout = useCallback(async () => {\n try {\n const xsrfToken = getXsrfToken();\n const headers: Record<string, string> = {};\n if (xsrfToken) {\n headers['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken);\n }\n\n await fetch(`${config.apiUrl}/api/sso/logout`, {\n method: 'POST',\n headers,\n credentials: 'include',\n });\n } catch {\n // Ignore errors\n }\n\n setUser(null);\n setOrganizations([]);\n setCurrentOrg(null);\n saveSelectedOrg(null);\n onAuthChange?.(false, null);\n }, [config.apiUrl, saveSelectedOrg, onAuthChange]);\n\n /**\n * Global logout - logout from Console too\n */\n const globalLogout = useCallback(\n async (redirectTo?: string) => {\n // First logout from service\n await logout();\n\n // Then redirect to Console logout\n // Convert relative path to absolute URL (e.g., '/' → 'https://example.com/')\n const redirectUri = redirectTo\n ? new URL(redirectTo, window.location.origin).toString()\n : window.location.origin;\n const logoutUrl = new URL('/sso/logout', config.consoleUrl);\n logoutUrl.searchParams.set('redirect_uri', redirectUri);\n\n window.location.href = logoutUrl.toString();\n },\n [logout, config.consoleUrl]\n );\n\n /**\n * Switch organization\n */\n const switchOrg = useCallback(\n (orgId: string) => {\n const org = organizations.find((o) => o.slug === orgId);\n if (org) {\n setCurrentOrg(org);\n saveSelectedOrg(org);\n }\n },\n [organizations, saveSelectedOrg]\n );\n\n /**\n * Refresh user data\n */\n const refreshUser = useCallback(async () => {\n const result = await fetchUser();\n\n if (result) {\n setUser(result.user);\n setOrganizations(result.organizations);\n\n // Keep current org if still valid\n if (currentOrg) {\n const stillValid = result.organizations.find((o) => o.slug === currentOrg.slug);\n if (!stillValid) {\n const newOrg = loadSelectedOrg(result.organizations);\n setCurrentOrg(newOrg);\n }\n }\n }\n }, [fetchUser, currentOrg, loadSelectedOrg]);\n\n /**\n * Get headers for API requests\n */\n const getHeaders = useCallback((): Record<string, string> => {\n const headers: Record<string, string> = {};\n\n if (currentOrg) {\n headers['X-Organization-Id'] = currentOrg.slug;\n }\n\n return headers;\n }, [currentOrg]);\n\n const value = useMemo(\n () => ({\n user,\n organizations,\n currentOrg,\n isLoading,\n isAuthenticated: !!user,\n config,\n login,\n logout,\n globalLogout,\n switchOrg,\n refreshUser,\n getHeaders,\n }),\n [\n user,\n organizations,\n currentOrg,\n isLoading,\n config,\n login,\n logout,\n globalLogout,\n switchOrg,\n refreshUser,\n getHeaders,\n ]\n );\n\n return <SsoContext.Provider value={value}>{children}</SsoContext.Provider>;\n}\n","'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { BranchContextValue } from '../types';\n\n/**\n * Branch Context\n * \n * Provides branch state management across the application.\n * Must be used within a BranchProvider.\n */\nexport const BranchContext = createContext<BranchContextValue | null>(null);\n\n/**\n * Hook to access Branch context\n * @throws Error if used outside BranchProvider\n */\nexport function useBranchContext(): BranchContextValue {\n const context = useContext(BranchContext);\n\n if (!context) {\n throw new Error('useBranchContext must be used within a BranchProvider');\n }\n\n return context;\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { BranchContext } from './BranchContext';\nimport { useSsoContext } from './SsoContext';\nimport { createBranchService, type BranchesResponse } from '../services/branchService';\nimport { ssoQueryKeys } from '../queryKeys';\nimport type { BranchProviderProps, SsoBranch, BranchContextValue } from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'omnify_selected_branch';\n\n/**\n * BranchProvider component\n * \n * Provides branch state management for the application.\n * Automatically fetches branches when organization changes.\n * \n * @example\n * ```tsx\n * // In your app\n * <SsoProvider config={ssoConfig}>\n * <BranchProvider>\n * <App />\n * </BranchProvider>\n * </SsoProvider>\n * \n * // In a component\n * function MyComponent() {\n * const { branches, currentBranch, switchBranch } = useBranch();\n * // ...\n * }\n * ```\n */\nexport function BranchProvider({\n children,\n storage = 'localStorage',\n storageKey = DEFAULT_STORAGE_KEY,\n onBranchChange,\n}: BranchProviderProps) {\n const { config, currentOrg, isAuthenticated } = useSsoContext();\n const queryClient = useQueryClient();\n\n const branchService = useMemo(\n () => createBranchService({ apiUrl: config.apiUrl }),\n [config.apiUrl]\n );\n\n // Get saved branch ID from storage\n const getSavedBranchId = useCallback((): number | null => {\n if (typeof window === 'undefined') return null;\n const storageObj = storage === 'localStorage' ? localStorage : sessionStorage;\n const saved = storageObj.getItem(`${storageKey}_${currentOrg?.slug}`);\n return saved ? parseInt(saved, 10) : null;\n }, [storage, storageKey, currentOrg?.slug]);\n\n // Save branch ID to storage\n const saveBranchId = useCallback((branchId: number | null) => {\n if (typeof window === 'undefined' || !currentOrg?.slug) return;\n const storageObj = storage === 'localStorage' ? localStorage : sessionStorage;\n if (branchId) {\n storageObj.setItem(`${storageKey}_${currentOrg.slug}`, String(branchId));\n } else {\n storageObj.removeItem(`${storageKey}_${currentOrg.slug}`);\n }\n }, [storage, storageKey, currentOrg?.slug]);\n\n // Selected branch state\n const [selectedBranchId, setSelectedBranchId] = useState<number | null>(() => getSavedBranchId());\n\n // Fetch branches for current organization\n const {\n data: branchesData,\n isLoading,\n error,\n refetch,\n } = useQuery<BranchesResponse>({\n queryKey: ssoQueryKeys.branches.list(currentOrg?.slug),\n queryFn: () => branchService.list(currentOrg?.slug),\n enabled: isAuthenticated && !!currentOrg,\n staleTime: 5 * 60 * 1000, // 5 minutes\n });\n\n // Extract branches data\n const branches = branchesData?.branches ?? [];\n const allBranchesAccess = branchesData?.all_branches_access ?? false;\n const primaryBranchId = branchesData?.primary_branch_id ?? null;\n const hasMultipleBranches = branches.length > 1;\n\n // Find current branch from branches list\n const currentBranch = useMemo((): SsoBranch | null => {\n if (!branches.length) return null;\n\n // If only one branch, auto-select it\n if (branches.length === 1) {\n return branches[0];\n }\n\n // If we have a saved selection, use it\n if (selectedBranchId) {\n const found = branches.find(b => b.id === selectedBranchId);\n if (found) return found;\n }\n\n // Use primary branch if available\n if (primaryBranchId) {\n const primary = branches.find(b => b.id === primaryBranchId);\n if (primary) return primary;\n }\n\n // Use headquarters\n const hq = branches.find(b => b.is_headquarters);\n if (hq) return hq;\n\n // Fallback to first branch\n return branches[0];\n }, [branches, selectedBranchId, primaryBranchId]);\n\n // Update selected branch ID when current branch changes\n useEffect(() => {\n if (currentBranch && currentBranch.id !== selectedBranchId) {\n setSelectedBranchId(currentBranch.id);\n saveBranchId(currentBranch.id);\n onBranchChange?.(currentBranch);\n }\n }, [currentBranch, selectedBranchId, saveBranchId, onBranchChange]);\n\n // Reset selection when organization changes\n useEffect(() => {\n const savedId = getSavedBranchId();\n setSelectedBranchId(savedId);\n }, [currentOrg?.slug, getSavedBranchId]);\n\n // Switch branch function\n const switchBranch = useCallback((branchId: number) => {\n const branch = branches.find(b => b.id === branchId);\n if (branch) {\n setSelectedBranchId(branchId);\n saveBranchId(branchId);\n onBranchChange?.(branch);\n }\n }, [branches, saveBranchId, onBranchChange]);\n\n // Refresh branches\n const refreshBranches = useCallback(async () => {\n await queryClient.invalidateQueries({\n queryKey: ssoQueryKeys.branches.list(currentOrg?.slug),\n });\n await refetch();\n }, [queryClient, currentOrg?.slug, refetch]);\n\n const contextValue: BranchContextValue = useMemo(\n () => ({\n branches,\n currentBranch,\n allBranchesAccess,\n primaryBranchId,\n isLoading,\n error: error as Error | null,\n hasMultipleBranches,\n switchBranch,\n refreshBranches,\n }),\n [\n branches,\n currentBranch,\n allBranchesAccess,\n primaryBranchId,\n isLoading,\n error,\n hasMultipleBranches,\n switchBranch,\n refreshBranches,\n ]\n );\n\n return (\n <BranchContext.Provider value={contextValue}>\n {children}\n </BranchContext.Provider>\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 { 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 { 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 { useMemo } from 'react';\nimport { useSsoContext } from '../context/SsoContext';\nimport type { SsoConfig, SsoOrganization, SsoUser } from '../types';\n\n/**\n * Combined SSO hook return type\n */\nexport interface UseSsoReturn {\n // Auth\n user: SsoUser | null;\n isLoading: boolean;\n isAuthenticated: boolean;\n login: (redirectTo?: string) => void;\n logout: () => Promise<void>;\n globalLogout: (redirectTo?: string) => void;\n refreshUser: () => Promise<void>;\n\n // Organization\n organizations: SsoOrganization[];\n currentOrg: SsoOrganization | null;\n hasMultipleOrgs: boolean;\n switchOrg: (orgId: string) => void;\n\n // Utilities\n getHeaders: () => Record<string, string>;\n config: SsoConfig;\n}\n\n/**\n * Combined hook for all SSO functionality\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {\n * user,\n * isAuthenticated,\n * currentOrg,\n * getHeaders,\n * login,\n * logout,\n * } = useSso();\n *\n * const fetchData = async () => {\n * const response = await fetch('/api/data', {\n * headers: getHeaders(),\n * });\n * // ...\n * };\n *\n * if (!isAuthenticated) {\n * return <button onClick={() => login()}>Login</button>;\n * }\n *\n * return (\n * <div>\n * <p>Welcome, {user?.name}</p>\n * <p>Organization: {currentOrg?.name}</p>\n * <button onClick={() => logout()}>Logout</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useSso(): UseSsoReturn {\n const context = useSsoContext();\n\n return useMemo(\n () => ({\n // Auth\n user: context.user,\n isLoading: context.isLoading,\n isAuthenticated: context.isAuthenticated,\n login: context.login,\n logout: context.logout,\n globalLogout: context.globalLogout,\n refreshUser: context.refreshUser,\n\n // Organization\n organizations: context.organizations,\n currentOrg: context.currentOrg,\n hasMultipleOrgs: context.organizations.length > 1,\n switchOrg: context.switchOrg,\n\n // Utilities\n getHeaders: context.getHeaders,\n config: context.config,\n }),\n [context]\n );\n}\n","'use client';\n\nimport { useBranchContext } from '../context/BranchContext';\nimport type { BranchContextValue } from '../types';\n\n/**\n * Hook return type for branch management\n */\nexport type UseBranchReturn = BranchContextValue;\n\n/**\n * Hook for branch management\n * \n * Provides access to branch state and operations.\n * Must be used within a BranchProvider.\n * \n * @example\n * ```tsx\n * function BranchInfo() {\n * const { \n * branches, \n * currentBranch, \n * hasMultipleBranches,\n * switchBranch \n * } = useBranch();\n * \n * // Auto-selection logic is handled by the provider\n * // - If only 1 branch: auto-selected\n * // - If multiple: use saved preference or primary branch\n * \n * return (\n * <div>\n * <p>Current: {currentBranch?.name}</p>\n * {hasMultipleBranches && (\n * <select onChange={(e) => switchBranch(Number(e.target.value))}>\n * {branches.map((branch) => (\n * <option key={branch.id} value={branch.id}>\n * {branch.name}\n * </option>\n * ))}\n * </select>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useBranch(): UseBranchReturn {\n return useBranchContext();\n}\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 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 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 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","'use client';\n\nimport { Modal, Select, Spin, Typography } from 'antd';\nimport { useEffect, useState } from 'react';\nimport { setOrgIdForApi } from '../../../core/utils/orgSync';\nimport { useOrganization } from '../../../core/hooks/useOrganization';\nimport { useSso } from '../../../core/hooks/useSso';\n\nconst { Text } = Typography;\n\nexport interface OrgGateProps {\n children: React.ReactNode;\n /**\n * Custom translations for the UI\n */\n translations?: {\n /** Modal title when selecting org */\n selectOrgTitle?: string;\n /** Confirm button text */\n confirmText?: string;\n /** Placeholder for org select */\n selectPlaceholder?: string;\n /** Message when no orgs available */\n noOrgsMessage?: string;\n };\n /**\n * Custom loading component\n */\n loadingComponent?: React.ReactNode;\n /**\n * Called when organization changes\n */\n onOrgChange?: (orgSlug: string) => void;\n}\n\nconst defaultTranslations = {\n selectOrgTitle: '組織を選択してください',\n confirmText: '選択',\n selectPlaceholder: '組織を選択',\n noOrgsMessage: 'アクセス可能な組織がありません',\n};\n\n/**\n * OrgGate ensures an organization is always selected.\n * - If user has only 1 org, auto-select it\n * - If user has multiple orgs and none selected, show selection modal\n * - Only render children when an org is selected\n * - Syncs org ID to global state for API calls\n *\n * @example\n * ```tsx\n * <SsoProvider config={config}>\n * <OrgGate>\n * <App />\n * </OrgGate>\n * </SsoProvider>\n * ```\n */\nexport function OrgGate({\n children,\n translations: customTranslations,\n loadingComponent,\n onOrgChange,\n}: OrgGateProps) {\n const t = { ...defaultTranslations, ...customTranslations };\n const { isLoading: ssoLoading, isAuthenticated } = useSso();\n const { organizations, currentOrg, switchOrg } = useOrganization();\n const [selectedOrgSlug, setSelectedOrgSlug] = useState<string | undefined>(undefined);\n\n // Auto-select if only 1 organization\n useEffect(() => {\n if (!ssoLoading && isAuthenticated && organizations.length === 1 && !currentOrg) {\n switchOrg(organizations[0].slug);\n }\n }, [ssoLoading, isAuthenticated, organizations, currentOrg, switchOrg]);\n\n // Sync org ID to global state IMMEDIATELY when it changes (not in useEffect)\n // This ensures the org ID is set before any child components render and make API calls\n // Backend accepts organization ID (UUID), code (slug), or name in X-Organization-Id header\n // Frontend uses slug since SsoOrganization.id is numeric, not UUID\n if (currentOrg?.slug) {\n setOrgIdForApi(currentOrg.slug);\n // Notify parent if callback provided\n if (onOrgChange) {\n onOrgChange(currentOrg.slug);\n }\n }\n\n // Show loading while SSO is loading\n if (ssoLoading) {\n if (loadingComponent) {\n return <>{loadingComponent}</>;\n }\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '100vh',\n }}\n >\n <Spin size=\"large\" />\n </div>\n );\n }\n\n // Not authenticated - let the page handle redirect\n if (!isAuthenticated) {\n return <>{children}</>;\n }\n\n // No organizations available\n if (organizations.length === 0) {\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '100vh',\n flexDirection: 'column',\n gap: 16,\n }}\n >\n <Text type=\"secondary\">{t.noOrgsMessage}</Text>\n </div>\n );\n }\n\n // Organization selected - render children\n if (currentOrg) {\n return <>{children}</>;\n }\n\n // Multiple orgs but none selected - show selection modal\n const handleConfirm = () => {\n if (selectedOrgSlug) {\n switchOrg(selectedOrgSlug);\n }\n };\n\n return (\n <Modal\n open={true}\n closable={false}\n maskClosable={false}\n title={t.selectOrgTitle}\n okText={t.confirmText}\n okButtonProps={{ disabled: !selectedOrgSlug }}\n onOk={handleConfirm}\n cancelButtonProps={{ style: { display: 'none' } }}\n >\n <div style={{ marginTop: 16 }}>\n <Select\n placeholder={t.selectPlaceholder}\n style={{ width: '100%' }}\n value={selectedOrgSlug}\n onChange={setSelectedOrgSlug}\n options={organizations.map((org) => ({\n value: org.slug,\n label: org.name,\n }))}\n size=\"large\"\n />\n </div>\n </Modal>\n );\n}\n","/**\n * Organization API Sync Module\n *\n * This module ensures the organization ID is always available for API calls.\n * It syncs the org ID from React state to a global location that apiClient can access.\n *\n * NOTE: Backend accepts organization ID (UUID), code (slug), or name in X-Organization-Id header.\n *\n * The problem it solves:\n * 1. useOrganization() hook provides currentOrg in React state\n * 2. apiClient needs the org ID to add X-Organization-Id header\n * 3. Without sync, API calls can be made before org ID is available\n *\n * Solution:\n * - Sync org ID IMMEDIATELY when it changes (not in useEffect)\n * - Store in both memory and localStorage for persistence\n * - Provide functions for easy integration\n */\n\n// In-memory storage for immediate access\nlet _currentOrgId: string | null = null;\n\n// LocalStorage key\nconst ORG_ID_STORAGE_KEY = 'api_current_org_id';\n\n// SSO package storage keys (for fallback)\nconst SSO_SELECTED_ORG_KEY = 'sso_selected_org';\nconst BRANCH_GATE_SELECTION_KEY = 'omnify_branch_gate_selection';\n\n/**\n * Set the current organization ID globally\n * Called by OrganizationGate when organization changes\n */\nexport function setOrgIdForApi(orgId: string | null): void {\n _currentOrgId = orgId;\n\n if (typeof window === 'undefined') return;\n\n if (orgId) {\n localStorage.setItem(ORG_ID_STORAGE_KEY, orgId);\n } else {\n localStorage.removeItem(ORG_ID_STORAGE_KEY);\n }\n}\n\n/**\n * Get the current organization ID for API calls\n * Used by apiClient to add X-Organization-Id header\n */\nexport function getOrgIdForApi(): string | null {\n // First check in-memory (fastest)\n if (_currentOrgId) {\n return _currentOrgId;\n }\n\n if (typeof window === 'undefined') {\n return null;\n }\n\n // Check our storage key\n const stored = localStorage.getItem(ORG_ID_STORAGE_KEY);\n if (stored) {\n _currentOrgId = stored;\n return stored;\n }\n\n // Fallback: Try SSO package's storage keys\n try {\n const ssoOrg = localStorage.getItem(SSO_SELECTED_ORG_KEY);\n if (ssoOrg) {\n const org = JSON.parse(ssoOrg);\n if (org?.slug) {\n return org.slug;\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n try {\n const branchGate = localStorage.getItem(BRANCH_GATE_SELECTION_KEY);\n if (branchGate) {\n const selection = JSON.parse(branchGate);\n if (selection?.orgId) {\n return selection.orgId;\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n return null;\n}\n\n/**\n * Clear the organization ID (call on logout)\n */\nexport function clearOrgIdForApi(): void {\n _currentOrgId = null;\n if (typeof window !== 'undefined') {\n localStorage.removeItem(ORG_ID_STORAGE_KEY);\n }\n}\n\n/**\n * Check if organization ID is available for API calls\n */\nexport function hasOrgIdForApi(): boolean {\n return getOrgIdForApi() !== null;\n}\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","/**\n * Branch header utilities for API clients\n *\n * These utilities help set branch context headers on axios instances.\n * Works with BranchGate's onSelectionChange callback.\n *\n * @example\n * ```typescript\n * import { createBranchHeaderSetter } from '@famgia/omnify-react-sso';\n * import api from './api'; // your axios instance\n *\n * // Create setter for your axios instance\n * const setBranchHeaders = createBranchHeaderSetter(api);\n *\n * // Use in BranchGate\n * <BranchGate onSelectionChange={setBranchHeaders}>\n * <App />\n * </BranchGate>\n * ```\n */\n\nimport type { BranchGateSelection } from '../types';\n\n/**\n * Headers set by branch selection\n */\nexport const BRANCH_HEADERS = {\n BRANCH_ID: 'X-Branch-Id',\n ORG_ID: 'X-Organization-Id',\n} as const;\n\n/**\n * Minimal axios-like interface for header management\n */\ninterface AxiosLike {\n defaults: {\n headers: {\n common: Record<string, string | undefined>;\n };\n };\n}\n\n/**\n * Create a branch header setter function for an axios instance\n *\n * @param axiosInstance - Your axios instance\n * @returns A function to pass to BranchGate's onSelectionChange\n *\n * @example\n * ```typescript\n * const setBranchHeaders = createBranchHeaderSetter(api);\n *\n * <BranchGate onSelectionChange={setBranchHeaders}>\n * <App />\n * </BranchGate>\n * ```\n */\nexport function createBranchHeaderSetter(axiosInstance: AxiosLike) {\n return (selection: BranchGateSelection | null) => {\n if (selection) {\n axiosInstance.defaults.headers.common[BRANCH_HEADERS.BRANCH_ID] = selection.branchId;\n axiosInstance.defaults.headers.common[BRANCH_HEADERS.ORG_ID] = selection.orgId;\n } else {\n delete axiosInstance.defaults.headers.common[BRANCH_HEADERS.BRANCH_ID];\n delete axiosInstance.defaults.headers.common[BRANCH_HEADERS.ORG_ID];\n }\n };\n}\n\n/**\n * Set branch headers directly on an axios instance\n *\n * @example\n * ```typescript\n * import api from './api';\n * import { setBranchHeaders } from '@famgia/omnify-react-sso';\n *\n * // In BranchGate onSelectionChange\n * <BranchGate onSelectionChange={(s) => setBranchHeaders(api, s)}>\n * <App />\n * </BranchGate>\n * ```\n */\nexport function setBranchHeaders(\n axiosInstance: AxiosLike,\n selection: BranchGateSelection | null\n): void {\n createBranchHeaderSetter(axiosInstance)(selection);\n}\n","/**\n * Auth Service - SSO Authentication\n *\n * Handles SSO callback, logout, user info\n */\n\nimport { buildHeaders, csrf, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SsoUser {\n id: number;\n console_user_id: number;\n email: string;\n name: string;\n}\n\nexport interface Organization {\n id: number;\n slug: string;\n name: string;\n role: string;\n}\n\nexport interface AuthCallbackInput {\n code: string;\n device_name?: string;\n}\n\nexport interface AuthCallbackResponse {\n user: SsoUser;\n organizations: Organization[];\n token?: string;\n}\n\nexport interface AuthUserResponse {\n user: SsoUser;\n organizations: Organization[];\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createAuthService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Exchange SSO authorization code for tokens\n * POST /api/sso/callback\n */\n callback: async (input: AuthCallbackInput): Promise<AuthCallbackResponse> => {\n await csrf(apiUrl);\n return request(apiUrl, \"/api/sso/callback\", {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Logout current user and revoke tokens\n * POST /api/sso/logout\n */\n logout: async (): Promise<{ message: string }> => {\n return request(apiUrl, \"/api/sso/logout\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get current authenticated user with organizations\n * GET /api/sso/user\n */\n getUser: async (): Promise<AuthUserResponse> => {\n return request(apiUrl, \"/api/sso/user\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get Console SSO global logout URL\n * GET /api/sso/global-logout-url\n */\n getGlobalLogoutUrl: async (redirectUri?: string): Promise<{ logout_url: string }> => {\n const params = redirectUri\n ? `?redirect_uri=${encodeURIComponent(redirectUri)}`\n : \"\";\n return request(apiUrl, `/api/sso/global-logout-url${params}`, {\n headers: buildHeaders(),\n });\n },\n };\n}\n\nexport type AuthService = ReturnType<typeof createAuthService>;\n","/**\n * Token Service - API Token Management\n *\n * For mobile apps using bearer tokens\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ApiToken {\n id: number;\n name: string;\n last_used_at: string | null;\n created_at: string;\n is_current: boolean;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createTokenService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * List all API tokens for current user\n * GET /api/sso/tokens\n */\n list: async (): Promise<{ tokens: ApiToken[] }> => {\n return request(apiUrl, \"/api/sso/tokens\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke a specific token\n * DELETE /api/sso/tokens/{tokenId}\n */\n revoke: async (tokenId: number): Promise<{ message: string }> => {\n return request(apiUrl, `/api/sso/tokens/${tokenId}`, {\n method: \"DELETE\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke all tokens except current\n * POST /api/sso/tokens/revoke-others\n */\n revokeOthers: async (): Promise<{ message: string; revoked_count: number }> => {\n return request(apiUrl, \"/api/sso/tokens/revoke-others\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n };\n}\n\nexport type TokenService = ReturnType<typeof createTokenService>;\n","/**\n * Role Service - Role Management\n *\n * CRUD operations for roles and role-permission assignments\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface Role {\n id: number;\n name: string;\n slug: string;\n description: string | null;\n level: number;\n permissions_count?: number;\n console_org_id?: string | null;\n organization?: {\n id: string;\n console_org_id: string;\n name: string;\n code: string;\n } | null;\n created_at: string;\n updated_at: string;\n}\n\nexport interface Permission {\n id: number;\n name: string;\n slug: string;\n group: string | null;\n description?: string | null;\n roles_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface RoleWithPermissions extends Role {\n permissions: Permission[];\n}\n\nexport interface CreateRoleInput {\n slug: string;\n name: string;\n level: number;\n description?: string;\n scope?: \"global\" | \"org\" | \"org-wide\" | \"branch\";\n console_org_id?: string | null;\n}\n\nexport interface RoleListParams {\n \"filter[scope]\"?: \"all\" | \"global\" | \"org\";\n \"filter[search]\"?: string;\n page?: number;\n per_page?: number;\n}\n\nexport interface UpdateRoleInput {\n name?: string;\n level?: number;\n description?: string | null;\n}\n\nexport interface SyncPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface SyncPermissionsResponse {\n message: string;\n attached: number;\n detached: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createRoleService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // Read-only endpoints (authenticated users)\n // =========================================================================\n\n /**\n * Get all roles\n * GET /api/sso/roles\n */\n list: async (): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/sso/roles\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get single role with permissions\n * GET /api/sso/roles/{id}\n */\n get: async (id: number | string): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/sso/roles/${id}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin endpoints (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all roles (admin)\n * GET /api/admin/sso/roles\n */\n adminList: async (\n orgId: string,\n params?: RoleListParams\n ): Promise<{ data: Role[] }> => {\n const queryParams = new URLSearchParams();\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n }\n const query = queryParams.toString();\n const url = `/api/admin/sso/roles${query ? `?${query}` : \"\"}`;\n\n return request(apiUrl, url, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get single role (admin)\n * GET /api/admin/sso/roles/{id}\n */\n adminGet: async (\n id: number | string,\n orgId: string\n ): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Create role (admin only)\n * POST /api/admin/sso/roles\n */\n create: async (\n input: CreateRoleInput,\n orgId: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n method: \"POST\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update role (admin only)\n * PUT /api/admin/sso/roles/{id}\n */\n update: async (\n id: number | string,\n input: UpdateRoleInput,\n orgId: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete role (admin only)\n * DELETE /api/admin/sso/roles/{id}\n */\n delete: async (id: number | string, orgId: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get role's permissions (admin)\n * GET /api/admin/sso/roles/{id}/permissions\n */\n getPermissions: async (\n id: number | string,\n orgId: string\n ): Promise<{\n role: Pick<Role, \"id\" | \"slug\" | \"name\">;\n permissions: Permission[];\n }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Sync role's permissions (admin)\n * PUT /api/admin/sso/roles/{id}/permissions\n */\n syncPermissions: async (\n id: number | string,\n input: SyncPermissionsInput,\n orgId: string\n ): Promise<SyncPermissionsResponse> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n };\n}\n\nexport type RoleService = ReturnType<typeof createRoleService>;\n","/**\n * Permission Service - Permission Management\n *\n * CRUD operations for permissions and permission matrix\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\nimport type { Role, Permission } from \"./roleService\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface PermissionMatrix {\n roles: Pick<Role, \"id\" | \"slug\" | \"name\">[];\n permissions: Record<string, Pick<Permission, \"id\" | \"slug\" | \"name\">[]>;\n matrix: Record<string, string[]>; // role_slug: permission_slugs[]\n}\n\nexport interface CreatePermissionInput {\n slug: string;\n name: string;\n group?: string;\n description?: string;\n}\n\nexport interface UpdatePermissionInput {\n name?: string;\n group?: string | null;\n description?: string | null;\n}\n\nexport interface PermissionListParams {\n group?: string;\n search?: string;\n grouped?: boolean;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createPermissionService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // Read-only endpoints (authenticated users)\n // =========================================================================\n\n /**\n * Get all permissions\n * GET /api/sso/permissions\n */\n list: async (params?: PermissionListParams): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/sso/permissions${queryString}`, {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get permission matrix (roles x permissions)\n * GET /api/sso/permission-matrix\n */\n getMatrix: async (): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/sso/permission-matrix\", {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin endpoints (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all permissions (admin)\n * GET /api/admin/sso/permissions\n */\n adminList: async (\n orgId: string,\n params?: PermissionListParams\n ): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/admin/sso/permissions${queryString}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get single permission (admin)\n * GET /api/admin/sso/permissions/{id}\n */\n adminGet: async (\n id: number | string,\n orgId: string\n ): Promise<{ data: Permission }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Create permission (admin only)\n * POST /api/admin/sso/permissions\n */\n create: async (\n input: CreatePermissionInput,\n orgId: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/permissions\", {\n method: \"POST\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update permission (admin only)\n * PUT /api/admin/sso/permissions/{id}\n */\n update: async (\n id: number | string,\n input: UpdatePermissionInput,\n orgId: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete permission (admin only)\n * DELETE /api/admin/sso/permissions/{id}\n */\n delete: async (id: number | string, orgId: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get permission matrix (admin)\n * GET /api/admin/sso/permission-matrix\n */\n adminGetMatrix: async (orgId: string): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/admin/sso/permission-matrix\", {\n headers: buildHeaders(orgId),\n });\n },\n };\n}\n\nexport type PermissionService = ReturnType<typeof createPermissionService>;\n\n// Re-export Permission type for convenience\nexport type { Permission } from \"./roleService\";\n","/**\n * Team Service - Team Permission Management\n *\n * Manage team permissions and orphaned team cleanup\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\nimport type { Permission } from \"./roleService\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface TeamWithPermissions {\n console_team_id: number;\n name: string;\n path: string | null;\n permissions: Pick<Permission, \"id\" | \"slug\">[];\n}\n\nexport interface TeamPermissionDetail {\n console_team_id: number;\n permissions: Pick<Permission, \"id\" | \"slug\" | \"name\">[];\n}\n\nexport interface OrphanedTeam {\n console_team_id: number;\n permissions_count: number;\n permissions: string[];\n deleted_at: string | null;\n}\n\nexport interface SyncTeamPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface CleanupOrphanedInput {\n console_team_id?: number;\n older_than_days?: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createTeamService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * Get all teams with their permissions (admin only)\n * GET /api/admin/sso/teams/permissions\n */\n list: async (orgId: string): Promise<{ teams: TeamWithPermissions[] }> => {\n return request(apiUrl, \"/api/admin/sso/teams/permissions\", {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get specific team permissions (admin only)\n * GET /api/admin/sso/teams/{teamId}/permissions\n */\n getPermissions: async (\n teamId: number,\n orgId: string\n ): Promise<TeamPermissionDetail> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Sync team permissions (admin only)\n * PUT /api/admin/sso/teams/{teamId}/permissions\n */\n syncPermissions: async (\n teamId: number,\n input: SyncTeamPermissionsInput,\n orgId: string\n ): Promise<{\n message: string;\n console_team_id: number;\n attached: number;\n detached: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Remove all permissions for a team (admin only)\n * DELETE /api/admin/sso/teams/{teamId}/permissions\n */\n removePermissions: async (teamId: number, orgId: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * List orphaned team permissions (admin only)\n * GET /api/admin/sso/teams/orphaned\n */\n listOrphaned: async (\n orgId: string\n ): Promise<{\n orphaned_teams: OrphanedTeam[];\n total_orphaned_permissions: number;\n }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Restore orphaned team permissions (admin only)\n * POST /api/admin/sso/teams/orphaned/{teamId}/restore\n */\n restoreOrphaned: async (\n teamId: number,\n orgId: string\n ): Promise<{\n message: string;\n console_team_id: number;\n restored_count: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/orphaned/${teamId}/restore`, {\n method: \"POST\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Cleanup orphaned team permissions (admin only)\n * DELETE /api/admin/sso/teams/orphaned\n */\n cleanupOrphaned: async (\n orgId: string,\n input?: CleanupOrphanedInput\n ): Promise<{ message: string; deleted_count: number }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n body: input ? JSON.stringify(input) : undefined,\n });\n },\n };\n}\n\nexport type TeamService = ReturnType<typeof createTeamService>;\n","/**\n * User Role Service - Scoped Role Assignments\n *\n * Implements Branch-Level Permissions management:\n * - Global: org_id=null, branch_id=null → Role applies everywhere\n * - Org-wide: org_id=X, branch_id=null → Role applies to all branches in org\n * - Branch: org_id=X, branch_id=Y → Role applies only to specific branch\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type RoleScope = \"global\" | \"org-wide\" | \"branch\";\n\nexport interface RoleAssignment {\n id: string | null;\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n console_org_id: string | null;\n console_branch_id: string | null;\n scope: RoleScope;\n created_at: string | null;\n}\n\nexport interface UserRoleListResponse {\n data: RoleAssignment[];\n}\n\nexport interface AssignRoleInput {\n role_id: string;\n console_org_id?: string | null;\n console_branch_id?: string | null;\n}\n\nexport interface AssignRoleResponse {\n message: string;\n data: {\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n console_org_id: string | null;\n console_branch_id: string | null;\n scope: RoleScope;\n };\n}\n\nexport interface SyncRolesInput {\n roles: string[]; // Role IDs or slugs\n console_org_id?: string | null;\n console_branch_id?: string | null;\n}\n\nexport interface SyncRolesResponse {\n message: string;\n attached: string[];\n detached: string[];\n scope: RoleScope;\n}\n\nexport interface RemoveRoleResponse {\n message: string;\n removed: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createUserRoleService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * List user's role assignments with scope information\n * GET /api/admin/sso/users/{userId}/roles\n */\n list: async (userId: string, orgId?: string): Promise<RoleAssignment[]> => {\n const response = await request<UserRoleListResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n { headers: buildHeaders(orgId) }\n );\n return response.data;\n },\n\n /**\n * List user's role assignments filtered by branch context\n * Returns roles applicable to the given org/branch\n */\n listByBranch: async (\n userId: string,\n consoleOrgId: string,\n branchId: string | null,\n orgId?: string\n ): Promise<RoleAssignment[]> => {\n const all = await request<UserRoleListResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n { headers: buildHeaders(orgId) }\n );\n\n // Filter assignments that apply to this branch:\n // 1. Global assignments (org=null)\n // 2. Org-wide assignments (org=X, branch=null)\n // 3. Branch-specific assignments (org=X, branch=Y)\n return all.data.filter((a) => {\n // Global applies everywhere\n if (a.console_org_id === null) return true;\n\n // Must be same org\n if (a.console_org_id !== consoleOrgId) return false;\n\n // Org-wide applies to all branches\n if (a.console_branch_id === null) return true;\n\n // Branch-specific must match\n return a.console_branch_id === branchId;\n });\n },\n\n /**\n * Assign a role to user with scope\n * POST /api/admin/sso/users/{userId}/roles\n */\n assign: async (\n userId: string,\n input: AssignRoleInput,\n orgId?: string\n ): Promise<AssignRoleResponse> => {\n return request<AssignRoleResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles`,\n {\n method: \"POST\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n }\n );\n },\n\n /**\n * Remove a role assignment from user\n * DELETE /api/admin/sso/users/{userId}/roles/{roleId}\n */\n remove: async (\n userId: string,\n roleId: string,\n consoleOrgId?: string | null,\n branchId?: string | null,\n orgId?: string\n ): Promise<RemoveRoleResponse> => {\n return request<RemoveRoleResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles/${roleId}`,\n {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n body: JSON.stringify({\n console_org_id: consoleOrgId ?? null,\n console_branch_id: branchId ?? null,\n }),\n }\n );\n },\n\n /**\n * Sync roles for user in a specific scope\n * PUT /api/admin/sso/users/{userId}/roles/sync\n */\n sync: async (\n userId: string,\n input: SyncRolesInput,\n orgId?: string\n ): Promise<SyncRolesResponse> => {\n return request<SyncRolesResponse>(\n apiUrl,\n `/api/admin/sso/users/${userId}/roles/sync`,\n {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n }\n );\n },\n };\n}\n\n// Export type for the service\nexport type UserRoleService = ReturnType<typeof createUserRoleService>;\n\n// =============================================================================\n// Helper functions for permission resolution\n// =============================================================================\n\n/**\n * Get scope label for display\n */\nexport const getScopeLabel = (\n scope: RoleScope,\n locale: \"en\" | \"ja\" | \"vi\" = \"en\"\n): string => {\n const labels: Record<RoleScope, Record<string, string>> = {\n global: { en: \"Global\", ja: \"グローバル\", vi: \"Toàn hệ thống\" },\n \"org-wide\": { en: \"Organization\", ja: \"組織全体\", vi: \"Toàn tổ chức\" },\n branch: { en: \"Branch\", ja: \"支店限定\", vi: \"Chi nhánh\" },\n };\n return labels[scope][locale] || labels[scope][\"en\"];\n};\n\n/**\n * Get effective permissions for a user at a specific branch\n * based on their role assignments\n */\nexport const getEffectivePermissions = <\n TRole extends { id: string; permissions?: Array<string | { slug: string }> }\n>(\n roleAssignments: RoleAssignment[],\n allRoles: TRole[],\n orgId: string,\n branchId: string | null\n): string[] => {\n const permissions = new Set<string>();\n\n // Filter applicable assignments\n const applicableAssignments = roleAssignments.filter((a) => {\n if (a.console_org_id === null) return true;\n if (a.console_org_id !== orgId) return false;\n if (a.console_branch_id === null) return true;\n return a.console_branch_id === branchId;\n });\n\n // Collect permissions from all applicable roles\n for (const assignment of applicableAssignments) {\n const role = allRoles.find((r) => r.id === assignment.role.id);\n if (role?.permissions) {\n for (const perm of role.permissions) {\n if (typeof perm === \"string\") {\n permissions.add(perm);\n } else if (perm.slug) {\n permissions.add(perm.slug);\n }\n }\n }\n }\n\n return Array.from(permissions);\n};\n","/**\n * User Service - User Management for Admin Panel\n *\n * Provides user listing and permission retrieval for admin interface\n */\n\nimport { buildHeaders, request, type ServiceConfig } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface User {\n id: string;\n email: string;\n name: string;\n email_verified_at?: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport interface UserWithOrg extends User {\n console_org_id?: string;\n organization?: {\n id: string;\n console_org_id: string;\n name: string;\n code: string;\n } | null;\n}\n\nexport interface UserListParams {\n \"filter[search]\"?: string;\n \"filter[org_id]\"?: string;\n page?: number;\n per_page?: number;\n}\n\nexport interface UserListResponse {\n data: User[];\n meta?: {\n current_page: number;\n last_page: number;\n per_page: number;\n total: number;\n };\n}\n\nexport interface RoleAssignmentWithPermissions {\n id: string | null;\n role: {\n id: string;\n name: string;\n slug: string;\n level: number;\n };\n console_org_id: string | null;\n console_branch_id: string | null;\n org_name?: string | null;\n branch_name?: string | null;\n scope: \"global\" | \"org-wide\" | \"branch\";\n permissions: Array<{\n id: string;\n name: string;\n slug: string;\n group: string;\n }>;\n}\n\nexport interface TeamMembershipWithPermissions {\n id: string;\n team: {\n id: string;\n name: string;\n path?: string;\n };\n is_leader?: boolean;\n permissions: Array<{\n id: string;\n name: string;\n slug: string;\n group: string;\n }>;\n}\n\nexport interface PermissionDetail {\n id: string;\n name: string;\n slug: string;\n group: string;\n sources: Array<{\n type: \"role\" | \"team\" | \"direct\";\n name: string;\n scope?: string;\n }>;\n}\n\nexport interface UserPermissionsBreakdown {\n user: {\n id: string;\n email: string;\n name: string;\n created_at?: string;\n organization?: {\n id: string;\n console_org_id: string;\n name: string;\n code: string;\n } | null;\n };\n context: {\n org_id: string | null;\n branch_id: string | null;\n };\n role_assignments: RoleAssignmentWithPermissions[];\n team_memberships: TeamMembershipWithPermissions[];\n direct_permissions: Array<{\n id: string;\n name: string;\n slug: string;\n group: string;\n }>;\n effective_permissions: PermissionDetail[];\n aggregated_permissions: string[];\n total_permissions: number;\n}\n\n// =============================================================================\n// Service Factory\n// =============================================================================\n\nexport function createUserService(config: ServiceConfig) {\n const { apiUrl } = config;\n\n return {\n /**\n * List users with optional filters\n * GET /api/admin/sso/users\n */\n list: async (\n params?: UserListParams,\n orgId?: string\n ): Promise<UserListResponse> => {\n const queryParams = new URLSearchParams();\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n }\n const query = queryParams.toString();\n const url = `/api/admin/sso/users${query ? `?${query}` : \"\"}`;\n\n return request<UserListResponse>(apiUrl, url, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get single user by ID\n * GET /api/admin/sso/users/{userId}\n */\n get: async (userId: string, orgId?: string): Promise<User> => {\n const response = await request<{ data: User }>(\n apiUrl,\n `/api/admin/sso/users/${userId}`,\n { headers: buildHeaders(orgId) }\n );\n return response.data;\n },\n\n /**\n * Get user permissions breakdown for specific org/branch context\n * GET /api/admin/sso/users/{userId}/permissions\n */\n getPermissions: async (\n userId: string,\n consoleOrgId?: string,\n branchId?: string,\n orgId?: string\n ): Promise<UserPermissionsBreakdown> => {\n const queryParams = new URLSearchParams();\n if (consoleOrgId) queryParams.append(\"org_id\", consoleOrgId);\n if (branchId) queryParams.append(\"branch_id\", branchId);\n const query = queryParams.toString();\n const url = `/api/admin/sso/users/${userId}/permissions${query ? `?${query}` : \"\"}`;\n\n return request<UserPermissionsBreakdown>(apiUrl, url, {\n headers: buildHeaders(orgId),\n });\n },\n };\n}\n\n// Export type for the service\nexport type UserService = ReturnType<typeof createUserService>;\n","/**\n * SSO Service - API client for SSO endpoints\n *\n * Provides methods for SSO authentication, tokens, roles, permissions, teams\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SsoUser {\n id: number;\n console_user_id: number;\n email: string;\n name: string;\n}\n\nexport interface Organization {\n id: number;\n slug: string;\n name: string;\n role: string;\n}\n\nexport interface Role {\n id: number;\n name: string;\n slug: string;\n description: string | null;\n level: number;\n permissions_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface Permission {\n id: number;\n name: string;\n slug: string;\n group: string | null;\n description?: string | null;\n roles_count?: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface RoleWithPermissions extends Role {\n permissions: Permission[];\n}\n\nexport interface PermissionMatrix {\n roles: Pick<Role, \"id\" | \"slug\" | \"name\">[];\n permissions: Record<string, Pick<Permission, \"id\" | \"slug\" | \"name\">[]>;\n matrix: Record<string, string[]>; // role_slug: permission_slugs[]\n}\n\nexport interface ApiToken {\n id: number;\n name: string;\n last_used_at: string | null;\n created_at: string;\n is_current: boolean;\n}\n\nexport interface TeamWithPermissions {\n console_team_id: number;\n name: string;\n path: string | null;\n permissions: Pick<Permission, \"id\" | \"slug\">[];\n}\n\nexport interface TeamPermissionDetail {\n console_team_id: number;\n permissions: Pick<Permission, \"id\" | \"slug\" | \"name\">[];\n}\n\nexport interface OrphanedTeam {\n console_team_id: number;\n permissions_count: number;\n permissions: string[];\n deleted_at: string | null;\n}\n\n// Input types\nexport interface SsoCallbackInput {\n code: string;\n device_name?: string;\n}\n\nexport interface CreateRoleInput {\n slug: string;\n name: string;\n level: number;\n description?: string;\n}\n\nexport interface UpdateRoleInput {\n name?: string;\n level?: number;\n description?: string | null;\n}\n\nexport interface CreatePermissionInput {\n slug: string;\n name: string;\n group?: string;\n description?: string;\n}\n\nexport interface UpdatePermissionInput {\n name?: string;\n group?: string | null;\n description?: string | null;\n}\n\nexport interface SyncPermissionsInput {\n permissions: (number | string)[];\n}\n\nexport interface CleanupOrphanedInput {\n console_team_id?: number;\n older_than_days?: number;\n}\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n\n/**\n * Get XSRF token from cookie (for Sanctum CSRF protection)\n */\nfunction 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 org slug\n */\nfunction 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 */\nasync 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 */\nasync 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// Service Factory\n// =============================================================================\n\nexport interface SsoServiceConfig {\n apiUrl: string;\n}\n\nexport function createSsoService(config: SsoServiceConfig) {\n const { apiUrl } = config;\n\n return {\n // =========================================================================\n // SSO Auth\n // =========================================================================\n\n /**\n * Exchange SSO authorization code for tokens\n * POST /api/sso/callback\n */\n callback: async (\n input: SsoCallbackInput\n ): Promise<{\n user: SsoUser;\n organizations: Organization[];\n token?: string;\n }> => {\n await csrf(apiUrl);\n return request(apiUrl, \"/api/sso/callback\", {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Logout current user and revoke tokens\n * POST /api/sso/logout\n */\n logout: async (): Promise<{ message: string }> => {\n return request(apiUrl, \"/api/sso/logout\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get current authenticated user with organizations\n * GET /api/sso/user\n */\n getUser: async (): Promise<{\n user: SsoUser;\n organizations: Organization[];\n }> => {\n return request(apiUrl, \"/api/sso/user\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get Console SSO global logout URL\n * GET /api/sso/global-logout-url\n */\n getGlobalLogoutUrl: async (\n redirectUri?: string\n ): Promise<{ logout_url: string }> => {\n const params = redirectUri\n ? `?redirect_uri=${encodeURIComponent(redirectUri)}`\n : \"\";\n return request(apiUrl, `/api/sso/global-logout-url${params}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // SSO Tokens (for mobile apps)\n // =========================================================================\n\n /**\n * List all API tokens for current user\n * GET /api/sso/tokens\n */\n getTokens: async (): Promise<{ tokens: ApiToken[] }> => {\n return request(apiUrl, \"/api/sso/tokens\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke a specific token\n * DELETE /api/sso/tokens/{tokenId}\n */\n revokeToken: async (tokenId: number): Promise<{ message: string }> => {\n return request(apiUrl, `/api/sso/tokens/${tokenId}`, {\n method: \"DELETE\",\n headers: buildHeaders(),\n });\n },\n\n /**\n * Revoke all tokens except current\n * POST /api/sso/tokens/revoke-others\n */\n revokeOtherTokens: async (): Promise<{\n message: string;\n revoked_count: number;\n }> => {\n return request(apiUrl, \"/api/sso/tokens/revoke-others\", {\n method: \"POST\",\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Roles (Read-only for authenticated users)\n // =========================================================================\n\n /**\n * Get all roles\n * GET /api/sso/roles\n */\n getRoles: async (): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/sso/roles\", {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get single role with permissions\n * GET /api/sso/roles/{id}\n */\n getRole: async (id: number): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/sso/roles/${id}`, {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Permissions (Read-only for authenticated users)\n // =========================================================================\n\n /**\n * Get all permissions\n * GET /api/sso/permissions\n */\n getPermissions: async (params?: {\n group?: string;\n search?: string;\n grouped?: boolean;\n }): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/sso/permissions${queryString}`, {\n headers: buildHeaders(),\n });\n },\n\n /**\n * Get permission matrix (roles x permissions)\n * GET /api/sso/permission-matrix\n */\n getPermissionMatrix: async (): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/sso/permission-matrix\", {\n headers: buildHeaders(),\n });\n },\n\n // =========================================================================\n // Admin - Roles (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all roles (admin)\n * GET /api/admin/sso/roles\n */\n adminGetRoles: async (orgId: string): Promise<{ data: Role[] }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get single role (admin)\n * GET /api/admin/sso/roles/{id}\n */\n adminGetRole: async (\n id: number,\n orgId: string\n ): Promise<{ data: RoleWithPermissions }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Create role (admin only)\n * POST /api/admin/sso/roles\n */\n createRole: async (\n input: CreateRoleInput,\n orgId: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/roles\", {\n method: \"POST\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update role (admin only)\n * PUT /api/admin/sso/roles/{id}\n */\n updateRole: async (\n id: number,\n input: UpdateRoleInput,\n orgId: string\n ): Promise<{ data: Role; message: string }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete role (admin only)\n * DELETE /api/admin/sso/roles/{id}\n */\n deleteRole: async (id: number, orgId: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get role's permissions (admin)\n * GET /api/admin/sso/roles/{id}/permissions\n */\n getRolePermissions: async (\n id: number,\n orgId: string\n ): Promise<{\n role: Pick<Role, \"id\" | \"slug\" | \"name\">;\n permissions: Permission[];\n }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Sync role's permissions (admin)\n * PUT /api/admin/sso/roles/{id}/permissions\n */\n syncRolePermissions: async (\n id: number,\n input: SyncPermissionsInput,\n orgId: string\n ): Promise<{ message: string; attached: number; detached: number }> => {\n return request(apiUrl, `/api/admin/sso/roles/${id}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n // =========================================================================\n // Admin - Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * List all permissions (admin)\n * GET /api/admin/sso/permissions\n */\n adminGetPermissions: async (\n orgId: string,\n params?: { group?: string; search?: string; grouped?: boolean }\n ): Promise<{ data: Permission[]; groups: string[] }> => {\n const queryString = params\n ? `?${new URLSearchParams(\n Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, String(v)])\n )}`\n : \"\";\n return request(apiUrl, `/api/admin/sso/permissions${queryString}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get single permission (admin)\n * GET /api/admin/sso/permissions/{id}\n */\n adminGetPermission: async (\n id: number,\n orgId: string\n ): Promise<{ data: Permission }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Create permission (admin only)\n * POST /api/admin/sso/permissions\n */\n createPermission: async (\n input: CreatePermissionInput,\n orgId: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, \"/api/admin/sso/permissions\", {\n method: \"POST\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Update permission (admin only)\n * PUT /api/admin/sso/permissions/{id}\n */\n updatePermission: async (\n id: number,\n input: UpdatePermissionInput,\n orgId: string\n ): Promise<{ data: Permission; message: string }> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Delete permission (admin only)\n * DELETE /api/admin/sso/permissions/{id}\n */\n deletePermission: async (id: number, orgId: string): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/permissions/${id}`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get permission matrix (admin)\n * GET /api/admin/sso/permission-matrix\n */\n adminGetPermissionMatrix: async (\n orgId: string\n ): Promise<PermissionMatrix> => {\n return request(apiUrl, \"/api/admin/sso/permission-matrix\", {\n headers: buildHeaders(orgId),\n });\n },\n\n // =========================================================================\n // Admin - Team Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * Get all teams with their permissions (admin only)\n * GET /api/admin/sso/teams/permissions\n */\n getTeamPermissions: async (\n orgId: string\n ): Promise<{ teams: TeamWithPermissions[] }> => {\n return request(apiUrl, \"/api/admin/sso/teams/permissions\", {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Get specific team permissions (admin only)\n * GET /api/admin/sso/teams/{teamId}/permissions\n */\n getTeamPermission: async (\n teamId: number,\n orgId: string\n ): Promise<TeamPermissionDetail> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Sync team permissions (admin only)\n * PUT /api/admin/sso/teams/{teamId}/permissions\n */\n syncTeamPermissions: async (\n teamId: number,\n input: SyncPermissionsInput,\n orgId: string\n ): Promise<{\n message: string;\n console_team_id: number;\n attached: number;\n detached: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"PUT\",\n headers: buildHeaders(orgId),\n body: JSON.stringify(input),\n });\n },\n\n /**\n * Remove all permissions for a team (admin only)\n * DELETE /api/admin/sso/teams/{teamId}/permissions\n */\n removeTeamPermissions: async (\n teamId: number,\n orgId: string\n ): Promise<void> => {\n return request(apiUrl, `/api/admin/sso/teams/${teamId}/permissions`, {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n });\n },\n\n // =========================================================================\n // Admin - Orphaned Team Permissions (requires admin role + org context)\n // =========================================================================\n\n /**\n * List orphaned team permissions (admin only)\n * GET /api/admin/sso/teams/orphaned\n */\n getOrphanedTeamPermissions: async (\n orgId: string\n ): Promise<{\n orphaned_teams: OrphanedTeam[];\n total_orphaned_permissions: number;\n }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Restore orphaned team permissions (admin only)\n * POST /api/admin/sso/teams/orphaned/{teamId}/restore\n */\n restoreOrphanedTeamPermissions: async (\n teamId: number,\n orgId: string\n ): Promise<{\n message: string;\n console_team_id: number;\n restored_count: number;\n }> => {\n return request(apiUrl, `/api/admin/sso/teams/orphaned/${teamId}/restore`, {\n method: \"POST\",\n headers: buildHeaders(orgId),\n });\n },\n\n /**\n * Cleanup orphaned team permissions (admin only)\n * DELETE /api/admin/sso/teams/orphaned\n */\n cleanupOrphanedTeamPermissions: async (\n orgId: string,\n input?: CleanupOrphanedInput\n ): Promise<{ message: string; deleted_count: number }> => {\n return request(apiUrl, \"/api/admin/sso/teams/orphaned\", {\n method: \"DELETE\",\n headers: buildHeaders(orgId),\n body: input ? JSON.stringify(input) : undefined,\n });\n },\n };\n}\n\n// Export types\nexport type SsoService = ReturnType<typeof createSsoService>;\n"],"mappings":"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","names":["defaultLocale","defaultTranslations","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","import_zod","import_react","import_react","import_react","getXsrfToken","import_jsx_runtime","import_react","import_react","import_react","import_react","import_jsx_runtime","transformUser","transformOrganizations","error","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","DefaultLoading","import_react","import_antd","import_icons","import_react_query","import_jsx_runtime","Text","import_antd","import_react","import_jsx_runtime","Text","import_react","import_antd","import_icons","import_react_query","import_jsx_runtime","Text","Title","DEFAULT_STORAGE_KEY","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","defaultLocale","fallbackLocale","i18n","defaultTranslations","import_jsx_runtime","i18n","import_icons","import_antd","import_react","import_icons","import_antd","import_jsx_runtime","import_jsx_runtime","Text","defaultTranslations","import_icons","import_antd","import_jsx_runtime","Text","defaultTranslations","import_icons","import_antd","import_react","import_jsx_runtime","Title","Text","defaultTranslations","getScopeLabel","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","getXsrfToken","buildHeaders","csrf","request"]}
|