@semiont/frontend 0.4.9 → 0.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/assets/{AuthContext-CYne_gJM.js → AuthContext-CUx-cP7W.js} +2 -2
  2. package/dist/assets/{AuthContext-CYne_gJM.js.map → AuthContext-CUx-cP7W.js.map} +1 -1
  3. package/dist/assets/{CookiePreferences-DxD0u90z.js → CookiePreferences-BuRvkBwM.js} +2 -2
  4. package/dist/assets/{CookiePreferences-DxD0u90z.js.map → CookiePreferences-BuRvkBwM.js.map} +1 -1
  5. package/dist/assets/{PdfAnnotationCanvas.client-CW6SKH2U-CVmEpRfP.js → PdfAnnotationCanvas.client-CW6SKH2U-CjRY6TID.js} +2 -2
  6. package/dist/assets/{PdfAnnotationCanvas.client-CW6SKH2U-CVmEpRfP.js.map → PdfAnnotationCanvas.client-CW6SKH2U-CjRY6TID.js.map} +1 -1
  7. package/dist/assets/{ToolbarPanels-tcvPzqNN.js → ToolbarPanels-Drd8QG61.js} +2 -2
  8. package/dist/assets/{ToolbarPanels-tcvPzqNN.js.map → ToolbarPanels-Drd8QG61.js.map} +1 -1
  9. package/dist/assets/{client-CKEJUXXb.js → client-BbPyO59A.js} +2 -2
  10. package/dist/assets/{client-CKEJUXXb.js.map → client-BbPyO59A.js.map} +1 -1
  11. package/dist/assets/{client-DWcJNpII.js → client-BsHptwGn.js} +2 -2
  12. package/dist/assets/{client-DWcJNpII.js.map → client-BsHptwGn.js.map} +1 -1
  13. package/dist/assets/{client-87q-RlKa.js → client-COY1ucYF.js} +2 -2
  14. package/dist/assets/{client-87q-RlKa.js.map → client-COY1ucYF.js.map} +1 -1
  15. package/dist/assets/{client-BZBaSaZ0.js → client-DZ-DNAU-.js} +2 -2
  16. package/dist/assets/{client-BZBaSaZ0.js.map → client-DZ-DNAU-.js.map} +1 -1
  17. package/dist/assets/{en-IUV4ZXKH-BjYNERUx.js → en-IUV4ZXKH-eHunUM2g.js} +5 -5
  18. package/dist/assets/{en-IUV4ZXKH-BjYNERUx.js.map → en-IUV4ZXKH-eHunUM2g.js.map} +1 -1
  19. package/dist/assets/index-CwQxZp6g.css +1 -0
  20. package/dist/assets/{index-D4SjcYxX.js → index-DKq_l4UW.js} +3 -3
  21. package/dist/assets/{index-D4SjcYxX.js.map → index-DKq_l4UW.js.map} +1 -1
  22. package/dist/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  23. package/dist/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  24. package/dist/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  25. package/dist/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  26. package/dist/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  27. package/dist/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  28. package/dist/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  29. package/dist/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  30. package/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  31. package/dist/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  32. package/dist/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  33. package/dist/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  34. package/dist/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  35. package/dist/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  36. package/dist/assets/{layout-B-TMNLm1.js → layout-6uvM-QPR.js} +2 -2
  37. package/dist/assets/{layout-B-TMNLm1.js.map → layout-6uvM-QPR.js.map} +1 -1
  38. package/dist/assets/{layout-C4uWiY4F.js → layout-CvaTeY53.js} +2 -2
  39. package/dist/assets/{layout-C4uWiY4F.js.map → layout-CvaTeY53.js.map} +1 -1
  40. package/dist/assets/{layout-DYXeBZ7E.js → layout-D5Pjl6Q-.js} +2 -2
  41. package/dist/assets/{layout-DYXeBZ7E.js.map → layout-D5Pjl6Q-.js.map} +1 -1
  42. package/dist/assets/{layout-D9y4fNSa.js → layout-QZ56PNLk.js} +2 -2
  43. package/dist/assets/{layout-D9y4fNSa.js.map → layout-QZ56PNLk.js.map} +1 -1
  44. package/dist/assets/{not-found-D39eX95i.js → not-found-CudKZDad.js} +2 -2
  45. package/dist/assets/{not-found-D39eX95i.js.map → not-found-CudKZDad.js.map} +1 -1
  46. package/dist/assets/orbitron-latin-400-normal-DBk4Dmer.woff +0 -0
  47. package/dist/assets/orbitron-latin-400-normal-U6xZUhur.woff2 +0 -0
  48. package/dist/assets/{page-B8rInMTj.js → page-4gaXuuoi.js} +2 -2
  49. package/dist/assets/{page-B8rInMTj.js.map → page-4gaXuuoi.js.map} +1 -1
  50. package/dist/assets/{page-m23deNER.js → page-B9hPrBrN.js} +2 -2
  51. package/dist/assets/{page-m23deNER.js.map → page-B9hPrBrN.js.map} +1 -1
  52. package/dist/assets/{page-DX3FJ71G.js → page-BH5HMa4o.js} +2 -2
  53. package/dist/assets/{page-DX3FJ71G.js.map → page-BH5HMa4o.js.map} +1 -1
  54. package/dist/assets/{page-BjjPEFxE.js → page-Bz2r7ufy.js} +2 -2
  55. package/dist/assets/{page-BjjPEFxE.js.map → page-Bz2r7ufy.js.map} +1 -1
  56. package/dist/assets/{page-CnBwmYIE.js → page-C44nBk5U.js} +2 -2
  57. package/dist/assets/{page-CnBwmYIE.js.map → page-C44nBk5U.js.map} +1 -1
  58. package/dist/assets/{page-CEDbSdpB.js → page-CE8hOJlL.js} +2 -2
  59. package/dist/assets/{page-CEDbSdpB.js.map → page-CE8hOJlL.js.map} +1 -1
  60. package/dist/assets/{page-DU4gR5Xo.js → page-CGEmB0mm.js} +2 -2
  61. package/dist/assets/{page-DU4gR5Xo.js.map → page-CGEmB0mm.js.map} +1 -1
  62. package/dist/assets/page-CJFp0ZpS.js +2 -0
  63. package/dist/assets/{page-kM0Ep9uD.js.map → page-CJFp0ZpS.js.map} +1 -1
  64. package/dist/assets/{page-KDTjODvy.js → page-D1Di1cx-.js} +2 -2
  65. package/dist/assets/{page-KDTjODvy.js.map → page-D1Di1cx-.js.map} +1 -1
  66. package/dist/assets/{page-C2ievByA.js → page-DIv5j5nE.js} +2 -2
  67. package/dist/assets/{page-C2ievByA.js.map → page-DIv5j5nE.js.map} +1 -1
  68. package/dist/assets/{page-DVuwkaR0.js → page-DK5bpgp9.js} +2 -2
  69. package/dist/assets/{page-DVuwkaR0.js.map → page-DK5bpgp9.js.map} +1 -1
  70. package/dist/assets/{page-DfClTFD9.js → page-DVRMfAkS.js} +2 -2
  71. package/dist/assets/{page-DfClTFD9.js.map → page-DVRMfAkS.js.map} +1 -1
  72. package/dist/assets/{page-Bs0m7wcI.js → page-DjkPUxlb.js} +2 -2
  73. package/dist/assets/{page-Bs0m7wcI.js.map → page-DjkPUxlb.js.map} +1 -1
  74. package/dist/assets/{page-fN3EjI48.js → page-ESjXBvXd.js} +2 -2
  75. package/dist/assets/{page-fN3EjI48.js.map → page-ESjXBvXd.js.map} +1 -1
  76. package/dist/assets/{page-B68iiwby.js → page-lbZaKDJf.js} +2 -2
  77. package/dist/assets/{page-B68iiwby.js.map → page-lbZaKDJf.js.map} +1 -1
  78. package/dist/assets/{page-eebHZHg3.js → page-tb55k9Ji.js} +2 -2
  79. package/dist/assets/{page-eebHZHg3.js.map → page-tb55k9Ji.js.map} +1 -1
  80. package/dist/assets/{page-D9kiPafj.js → page-uukho-t7.js} +2 -2
  81. package/dist/assets/{page-D9kiPafj.js.map → page-uukho-t7.js.map} +1 -1
  82. package/dist/assets/{page-BBEm8LmA.js → page-vzoIwpsS.js} +2 -2
  83. package/dist/assets/{page-BBEm8LmA.js.map → page-vzoIwpsS.js.map} +1 -1
  84. package/dist/assets/{privacy-QEJYcmMw.js → privacy-W9SxWfL5.js} +2 -2
  85. package/dist/assets/{privacy-QEJYcmMw.js.map → privacy-W9SxWfL5.js.map} +1 -1
  86. package/dist/assets/{routing-BgsGBuSe.js → routing-6lnx-g5H.js} +2 -2
  87. package/dist/assets/{routing-BgsGBuSe.js.map → routing-6lnx-g5H.js.map} +1 -1
  88. package/dist/assets/{routing-nZgBtxly.js → routing-BLuuVVPN.js} +2 -2
  89. package/dist/assets/routing-BLuuVVPN.js.map +1 -0
  90. package/dist/assets/{useAuth-CqtZE9nt.js → useAuth-CAJolYxw.js} +2 -2
  91. package/dist/assets/{useAuth-CqtZE9nt.js.map → useAuth-CAJolYxw.js.map} +1 -1
  92. package/dist/index.html +3 -3
  93. package/package.json +1 -1
  94. package/dist/assets/index-x79a-Q1-.css +0 -1
  95. package/dist/assets/page-kM0Ep9uD.js +0 -2
  96. package/dist/assets/routing-nZgBtxly.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarPanels-tcvPzqNN.js","sources":["../../../../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../../src/components/UserPanel.tsx","../../src/components/KnowledgeBasePanel.tsx","../../src/components/toolbar/ToolbarPanels.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction CheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckIcon);\nexport default ForwardRef;","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { sanitizeImageURL, useSessionExpiry, formatTime, useApiClient } from '@semiont/react-ui';\nimport { useAuth } from '@/hooks/useAuth';\nimport { useAuthContext } from '@/contexts/AuthContext';\nimport { useRouter } from '@/i18n/routing';\n\n// Fallback avatar when image fails to load or is invalid\nconst FALLBACK_AVATAR = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==';\n\nexport function UserPanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`UserPanel.${k}`, p as any) as string;\n const { displayName, avatarUrl, userDomain, isAdmin, isModerator } = useAuth();\n const { clearSession } = useAuthContext();\n const apiClient = useApiClient();\n const router = useRouter();\n const [imageError, setImageError] = useState(false);\n const { timeRemaining } = useSessionExpiry();\n const sessionTimeFormatted = formatTime(timeRemaining) ?? 'Unknown';\n\n // Sanitize and validate the profile image URL\n const profileImageUrl = (() => {\n if (!avatarUrl || imageError) {\n return FALLBACK_AVATAR;\n }\n\n const sanitized = sanitizeImageURL(avatarUrl);\n if (!sanitized) {\n console.warn('Invalid profile image URL detected, using fallback');\n return FALLBACK_AVATAR;\n }\n\n return sanitized;\n })();\n\n const handleSignOut = async () => {\n try {\n await apiClient.logout();\n } catch {\n // best-effort — cookie already cleared server-side\n }\n clearSession();\n router.push('/');\n };\n\n return (\n <div className=\"semiont-user-panel\">\n <h3 className=\"semiont-user-panel__title\">\n {t('account')}\n </h3>\n\n <div className=\"space-y-4\">\n {/* User Profile */}\n <div className=\"flex items-center gap-3\">\n <img\n src={profileImageUrl}\n alt={t('profileAlt', { name: displayName || t('user') })}\n width={48}\n height={48}\n className=\"w-12 h-12 rounded-full object-cover\"\n onError={() => setImageError(true)}\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"semiont-panel-text\">\n {displayName || t('user')}\n </div>\n {userDomain && (\n <div className=\"semiont-panel-text-secondary\">\n @{userDomain}\n </div>\n )}\n </div>\n </div>\n\n {/* Session Info */}\n <div>\n <label className=\"semiont-panel-label\">\n {t('session')}\n </label>\n <div className=\"semiont-session-box\">\n <div className=\"semiont-panel-hint\">\n {t('expiresIn', { time: sessionTimeFormatted })}\n </div>\n </div>\n </div>\n\n {/* Privileges */}\n {(isAdmin || isModerator) && (\n <div>\n <label className=\"semiont-panel-label\">\n {t('privileges')}\n </label>\n <div className=\"space-y-1\">\n {isAdmin && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--admin\">\n <span className=\"semiont-privilege-text\">\n {t('administrator')}\n </span>\n </div>\n )}\n {isModerator && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--moderator\">\n <span className=\"semiont-privilege-text\">\n {t('moderator')}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Sign Out Button */}\n <div className=\"semiont-panel-divider\">\n <button\n onClick={handleSignOut}\n className=\"semiont-signout-button\"\n >\n {t('signOut')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { CheckIcon, PlusIcon } from '@heroicons/react/24/outline';\nimport { useKnowledgeBaseContext, type KnowledgeBase } from '@/contexts/KnowledgeBaseContext';\nimport { useRouter } from '@/i18n/routing';\n\nexport function KnowledgeBasePanel() {\n const { knowledgeBases, activeKnowledgeBase, setActiveKnowledgeBase } = useKnowledgeBaseContext();\n const router = useRouter();\n\n return (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">Knowledge Bases</span>\n <span className=\"semiont-panel-header__count\">({knowledgeBases.length})</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\">\n <div className=\"semiont-panel__list\">\n {knowledgeBases.map((kb: KnowledgeBase) => (\n <button\n key={kb.id}\n onClick={() => setActiveKnowledgeBase(kb.id)}\n className={`semiont-panel-item semiont-panel-item--clickable${kb.id === activeKnowledgeBase?.id ? ' semiont-panel-item--selected' : ''}`}\n style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}\n >\n <span className=\"semiont-panel-text\" style={{ flex: 1 }}>{kb.label}</span>\n <span className=\"semiont-panel-text-secondary\">\n {kb.backendUrl.replace(/^https?:\\/\\//, '')}\n </span>\n {kb.id === activeKnowledgeBase?.id && (\n <CheckIcon style={{ width: '1rem', height: '1rem', color: 'var(--semiont-color-primary-500)', flexShrink: 0 }} />\n )}\n </button>\n ))}\n </div>\n </div>\n <div className=\"semiont-panel-footer\">\n <button\n onClick={() => router.push('/auth/connect')}\n className=\"semiont-panel-item semiont-panel-item--clickable\"\n style={{ width: '100%', display: 'flex', alignItems: 'center', gap: '0.5rem', color: 'var(--semiont-color-primary-600)' }}\n >\n <PlusIcon style={{ width: '1rem', height: '1rem', flexShrink: 0 }} />\n <span className=\"semiont-panel-text\" style={{ color: 'inherit' }}>Add knowledge base</span>\n </button>\n </div>\n </div>\n );\n}\n","import React, { useTransition, useEffect, useCallback } from 'react';\nimport { SettingsPanel, ResizeHandle, usePanelWidth, EventBusProvider, useEventSubscriptions } from '@semiont/react-ui';\nimport { UserPanel } from '../UserPanel';\nimport { KnowledgeBasePanel } from '../KnowledgeBasePanel';\nimport { useLocale } from '@/i18n/routing';\nimport { usePathname, useRouter } from '@/i18n/routing';\nimport { COMMON_PANELS } from '@semiont/react-ui';\nimport type { ToolbarPanelType } from '@semiont/react-ui';\n\ninterface ToolbarPanelsProps {\n activePanel: ToolbarPanelType | null;\n /** Theme setting */\n theme: 'light' | 'dark' | 'system';\n /** Line numbers setting */\n showLineNumbers: boolean;\n /** Hover delay setting */\n hoverDelayMs: number;\n /** Custom panel content for context-specific panels */\n children?: React.ReactNode;\n}\n\n/**\n * Renders the toolbar panel container with common panels (user, settings)\n * and any context-specific panels passed as children.\n *\n * Settings changes are handled via GlobalSettingsEventBus - no callbacks needed.\n *\n * @example\n * // Simple context (compose, discover, moderate, admin pages)\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * />\n *\n * @example\n * // Document context with custom panels\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * >\n * {activePanel === 'annotations' && <UnifiedAnnotationsPanel ... />}\n * {activePanel === 'history' && <AnnotationHistory ... />}\n * {activePanel === 'info' && <ResourceInfoPanel ... />}\n * {activePanel === 'collaboration' && <CollaborationPanel ... />}\n * {activePanel === 'jsonld' && <JsonLdPanel ... />}\n * </ToolbarPanels>\n */\nexport function ToolbarPanels({\n activePanel,\n theme,\n showLineNumbers,\n hoverDelayMs,\n children\n}: ToolbarPanelsProps) {\n const locale = useLocale();\n const router = useRouter();\n const pathname = usePathname();\n const [isPending, startTransition] = useTransition();\n\n // Panel width management with localStorage persistence\n const { width, setWidth, minWidth, maxWidth } = usePanelWidth();\n\n // Handle locale change events\n const handleLocaleChanged = useCallback(({ locale: newLocale }: { locale: string }) => {\n if (!pathname) return;\n\n startTransition(() => {\n // The router from @/i18n/routing is locale-aware and will handle the locale prefix\n router.replace(pathname, { locale: newLocale });\n });\n }, [pathname, router, startTransition]);\n\n // Subscribe to locale change events\n useEventSubscriptions({\n 'settings:locale-changed': handleLocaleChanged,\n });\n\n // Don't render container if no panel is active\n if (!activePanel) {\n return null;\n }\n\n // In simple context (no children), only user and settings panels are valid.\n // If a resource-specific panel is still active from a previous route, hide the container.\n if (!children && !COMMON_PANELS.includes(activePanel)) {\n return null;\n }\n\n return (\n <div className=\"semiont-toolbar-panels\" style={{ width: `${width}px`, position: 'relative' }}>\n {/* Resize handle on left edge */}\n <ResizeHandle\n onResize={setWidth}\n minWidth={minWidth}\n maxWidth={maxWidth}\n position=\"left\"\n ariaLabel=\"Resize right panel\"\n />\n\n {/* Custom context-specific panels */}\n <div className=\"semiont-toolbar-panels__content\">\n {children}\n\n {/* Knowledge Base Panel - common to all contexts */}\n {activePanel === 'knowledge-base' && (\n <KnowledgeBasePanel />\n )}\n\n {/* User Panel - common to all contexts */}\n {activePanel === 'user' && (\n <UserPanel />\n )}\n\n {/* Settings Panel - common to all contexts */}\n {activePanel === 'settings' && (\n <SettingsPanel\n showLineNumbers={showLineNumbers}\n theme={theme}\n hoverDelayMs={hoverDelayMs}\n locale={locale}\n isPendingLocaleChange={isPending}\n />\n )}\n </div>\n </div>\n );\n}\n"],"names":["CheckIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","FALLBACK_AVATAR","UserPanel","_t","useTranslation","t","k","p","displayName","avatarUrl","userDomain","isAdmin","isModerator","useAuth","clearSession","useAuthContext","apiClient","useApiClient","router","useRouter","imageError","setImageError","useState","timeRemaining","useSessionExpiry","sessionTimeFormatted","formatTime","profileImageUrl","sanitized","sanitizeImageURL","handleSignOut","jsxs","jsx","KnowledgeBasePanel","knowledgeBases","activeKnowledgeBase","setActiveKnowledgeBase","useKnowledgeBaseContext","kb","PlusIcon","ToolbarPanels","activePanel","theme","showLineNumbers","hoverDelayMs","children","locale","useLocale","pathname","usePathname","isPending","startTransition","useTransition","width","setWidth","minWidth","maxWidth","usePanelWidth","handleLocaleChanged","useCallback","newLocale","useEventSubscriptions","COMMON_PANELS","ResizeHandle","SettingsPanel"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"ToolbarPanels-Drd8QG61.js","sources":["../../../../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../../src/components/UserPanel.tsx","../../src/components/KnowledgeBasePanel.tsx","../../src/components/toolbar/ToolbarPanels.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction CheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckIcon);\nexport default ForwardRef;","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { sanitizeImageURL, useSessionExpiry, formatTime, useApiClient } from '@semiont/react-ui';\nimport { useAuth } from '@/hooks/useAuth';\nimport { useAuthContext } from '@/contexts/AuthContext';\nimport { useRouter } from '@/i18n/routing';\n\n// Fallback avatar when image fails to load or is invalid\nconst FALLBACK_AVATAR = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==';\n\nexport function UserPanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`UserPanel.${k}`, p as any) as string;\n const { displayName, avatarUrl, userDomain, isAdmin, isModerator } = useAuth();\n const { clearSession } = useAuthContext();\n const apiClient = useApiClient();\n const router = useRouter();\n const [imageError, setImageError] = useState(false);\n const { timeRemaining } = useSessionExpiry();\n const sessionTimeFormatted = formatTime(timeRemaining) ?? 'Unknown';\n\n // Sanitize and validate the profile image URL\n const profileImageUrl = (() => {\n if (!avatarUrl || imageError) {\n return FALLBACK_AVATAR;\n }\n\n const sanitized = sanitizeImageURL(avatarUrl);\n if (!sanitized) {\n console.warn('Invalid profile image URL detected, using fallback');\n return FALLBACK_AVATAR;\n }\n\n return sanitized;\n })();\n\n const handleSignOut = async () => {\n try {\n await apiClient.logout();\n } catch {\n // best-effort — cookie already cleared server-side\n }\n clearSession();\n router.push('/');\n };\n\n return (\n <div className=\"semiont-user-panel\">\n <h3 className=\"semiont-user-panel__title\">\n {t('account')}\n </h3>\n\n <div className=\"space-y-4\">\n {/* User Profile */}\n <div className=\"flex items-center gap-3\">\n <img\n src={profileImageUrl}\n alt={t('profileAlt', { name: displayName || t('user') })}\n width={48}\n height={48}\n className=\"w-12 h-12 rounded-full object-cover\"\n onError={() => setImageError(true)}\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"semiont-panel-text\">\n {displayName || t('user')}\n </div>\n {userDomain && (\n <div className=\"semiont-panel-text-secondary\">\n @{userDomain}\n </div>\n )}\n </div>\n </div>\n\n {/* Session Info */}\n <div>\n <label className=\"semiont-panel-label\">\n {t('session')}\n </label>\n <div className=\"semiont-session-box\">\n <div className=\"semiont-panel-hint\">\n {t('expiresIn', { time: sessionTimeFormatted })}\n </div>\n </div>\n </div>\n\n {/* Privileges */}\n {(isAdmin || isModerator) && (\n <div>\n <label className=\"semiont-panel-label\">\n {t('privileges')}\n </label>\n <div className=\"space-y-1\">\n {isAdmin && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--admin\">\n <span className=\"semiont-privilege-text\">\n {t('administrator')}\n </span>\n </div>\n )}\n {isModerator && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--moderator\">\n <span className=\"semiont-privilege-text\">\n {t('moderator')}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Sign Out Button */}\n <div className=\"semiont-panel-divider\">\n <button\n onClick={handleSignOut}\n className=\"semiont-signout-button\"\n >\n {t('signOut')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { CheckIcon, PlusIcon } from '@heroicons/react/24/outline';\nimport { useKnowledgeBaseContext, type KnowledgeBase } from '@/contexts/KnowledgeBaseContext';\nimport { useRouter } from '@/i18n/routing';\n\nexport function KnowledgeBasePanel() {\n const { knowledgeBases, activeKnowledgeBase, setActiveKnowledgeBase } = useKnowledgeBaseContext();\n const router = useRouter();\n\n return (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">Knowledge Bases</span>\n <span className=\"semiont-panel-header__count\">({knowledgeBases.length})</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\">\n <div className=\"semiont-panel__list\">\n {knowledgeBases.map((kb: KnowledgeBase) => (\n <button\n key={kb.id}\n onClick={() => setActiveKnowledgeBase(kb.id)}\n className={`semiont-panel-item semiont-panel-item--clickable${kb.id === activeKnowledgeBase?.id ? ' semiont-panel-item--selected' : ''}`}\n style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}\n >\n <span className=\"semiont-panel-text\" style={{ flex: 1 }}>{kb.label}</span>\n <span className=\"semiont-panel-text-secondary\">\n {kb.backendUrl.replace(/^https?:\\/\\//, '')}\n </span>\n {kb.id === activeKnowledgeBase?.id && (\n <CheckIcon style={{ width: '1rem', height: '1rem', color: 'var(--semiont-color-primary-500)', flexShrink: 0 }} />\n )}\n </button>\n ))}\n </div>\n </div>\n <div className=\"semiont-panel-footer\">\n <button\n onClick={() => router.push('/auth/connect')}\n className=\"semiont-panel-item semiont-panel-item--clickable\"\n style={{ width: '100%', display: 'flex', alignItems: 'center', gap: '0.5rem', color: 'var(--semiont-color-primary-600)' }}\n >\n <PlusIcon style={{ width: '1rem', height: '1rem', flexShrink: 0 }} />\n <span className=\"semiont-panel-text\" style={{ color: 'inherit' }}>Add knowledge base</span>\n </button>\n </div>\n </div>\n );\n}\n","import React, { useTransition, useEffect, useCallback } from 'react';\nimport { SettingsPanel, ResizeHandle, usePanelWidth, EventBusProvider, useEventSubscriptions } from '@semiont/react-ui';\nimport { UserPanel } from '../UserPanel';\nimport { KnowledgeBasePanel } from '../KnowledgeBasePanel';\nimport { useLocale } from '@/i18n/routing';\nimport { usePathname, useRouter } from '@/i18n/routing';\nimport { COMMON_PANELS } from '@semiont/react-ui';\nimport type { ToolbarPanelType } from '@semiont/react-ui';\n\ninterface ToolbarPanelsProps {\n activePanel: ToolbarPanelType | null;\n /** Theme setting */\n theme: 'light' | 'dark' | 'system';\n /** Line numbers setting */\n showLineNumbers: boolean;\n /** Hover delay setting */\n hoverDelayMs: number;\n /** Custom panel content for context-specific panels */\n children?: React.ReactNode;\n}\n\n/**\n * Renders the toolbar panel container with common panels (user, settings)\n * and any context-specific panels passed as children.\n *\n * Settings changes are handled via GlobalSettingsEventBus - no callbacks needed.\n *\n * @example\n * // Simple context (compose, discover, moderate, admin pages)\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * />\n *\n * @example\n * // Document context with custom panels\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * >\n * {activePanel === 'annotations' && <UnifiedAnnotationsPanel ... />}\n * {activePanel === 'history' && <AnnotationHistory ... />}\n * {activePanel === 'info' && <ResourceInfoPanel ... />}\n * {activePanel === 'collaboration' && <CollaborationPanel ... />}\n * {activePanel === 'jsonld' && <JsonLdPanel ... />}\n * </ToolbarPanels>\n */\nexport function ToolbarPanels({\n activePanel,\n theme,\n showLineNumbers,\n hoverDelayMs,\n children\n}: ToolbarPanelsProps) {\n const locale = useLocale();\n const router = useRouter();\n const pathname = usePathname();\n const [isPending, startTransition] = useTransition();\n\n // Panel width management with localStorage persistence\n const { width, setWidth, minWidth, maxWidth } = usePanelWidth();\n\n // Handle locale change events\n const handleLocaleChanged = useCallback(({ locale: newLocale }: { locale: string }) => {\n if (!pathname) return;\n\n startTransition(() => {\n // The router from @/i18n/routing is locale-aware and will handle the locale prefix\n router.replace(pathname, { locale: newLocale });\n });\n }, [pathname, router, startTransition]);\n\n // Subscribe to locale change events\n useEventSubscriptions({\n 'settings:locale-changed': handleLocaleChanged,\n });\n\n // Don't render container if no panel is active\n if (!activePanel) {\n return null;\n }\n\n // In simple context (no children), only user and settings panels are valid.\n // If a resource-specific panel is still active from a previous route, hide the container.\n if (!children && !COMMON_PANELS.includes(activePanel)) {\n return null;\n }\n\n return (\n <div className=\"semiont-toolbar-panels\" style={{ width: `${width}px`, position: 'relative' }}>\n {/* Resize handle on left edge */}\n <ResizeHandle\n onResize={setWidth}\n minWidth={minWidth}\n maxWidth={maxWidth}\n position=\"left\"\n ariaLabel=\"Resize right panel\"\n />\n\n {/* Custom context-specific panels */}\n <div className=\"semiont-toolbar-panels__content\">\n {children}\n\n {/* Knowledge Base Panel - common to all contexts */}\n {activePanel === 'knowledge-base' && (\n <KnowledgeBasePanel />\n )}\n\n {/* User Panel - common to all contexts */}\n {activePanel === 'user' && (\n <UserPanel />\n )}\n\n {/* Settings Panel - common to all contexts */}\n {activePanel === 'settings' && (\n <SettingsPanel\n showLineNumbers={showLineNumbers}\n theme={theme}\n hoverDelayMs={hoverDelayMs}\n locale={locale}\n isPendingLocaleChange={isPending}\n />\n )}\n </div>\n </div>\n );\n}\n"],"names":["CheckIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","FALLBACK_AVATAR","UserPanel","_t","useTranslation","t","k","p","displayName","avatarUrl","userDomain","isAdmin","isModerator","useAuth","clearSession","useAuthContext","apiClient","useApiClient","router","useRouter","imageError","setImageError","useState","timeRemaining","useSessionExpiry","sessionTimeFormatted","formatTime","profileImageUrl","sanitized","sanitizeImageURL","handleSignOut","jsxs","jsx","KnowledgeBasePanel","knowledgeBases","activeKnowledgeBase","setActiveKnowledgeBase","useKnowledgeBaseContext","kb","PlusIcon","ToolbarPanels","activePanel","theme","showLineNumbers","hoverDelayMs","children","locale","useLocale","pathname","usePathname","isPending","startTransition","useTransition","width","setWidth","minWidth","maxWidth","usePanelWidth","handleLocaleChanged","useCallback","newLocale","useEventSubscriptions","COMMON_PANELS","ResizeHandle","SettingsPanel"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,2 +1,2 @@
1
- import{j as h}from"./query-ATBhtd3K.js";import{r as t}from"./vendor-EnoIVk-c.js";import{d as b,e as v,f as C,g as y,w as P,y as T,T as w}from"./en-IUV4ZXKH-BjYNERUx.js";import{T as L}from"./ToolbarPanels-tcvPzqNN.js";import{u as A}from"./i18n-BYxb14hm.js";import"./index-D4SjcYxX.js";import"./useAuth-CqtZE9nt.js";import"./AuthContext-CYne_gJM.js";import"./routing-nZgBtxly.js";import"./KnowledgeBaseContext-CgnF8K-_.js";import"./PlusIcon-qGFPUzg0.js";function R(){const{t:a}=A(),o=(n,D)=>a(`AdminSecurity.${n}`,D),{activePanel:r}=b(),{theme:l,setTheme:i}=v(),{showLineNumbers:d,toggleLineNumbers:s}=C(),m=t.useCallback(({theme:n})=>{i(n)},[i]),c=t.useCallback(()=>{s()},[s]);y({"settings:theme-changed":m,"settings:line-numbers-toggled":c});const u=P(),{data:e,isLoading:g}=u.oauth.config.useQuery(),p=(e==null?void 0:e.allowedDomains)??[],f=(e==null?void 0:e.providers)??[];return h.jsx(T,{providers:f,allowedDomains:p,isLoading:g,theme:l,showLineNumbers:d,activePanel:r,translations:{title:o("title"),subtitle:o("subtitle"),oauthProviders:o("oauthProviders"),oauthProvidersDescription:o("oauthProvidersDescription"),clientId:o("clientId"),configured:o("configured"),noProvidersConfigured:o("noProvidersConfigured"),allowedDomains:o("allowedDomains"),allowedDomainsDescription:o("allowedDomainsDescription"),noDomainsConfigured:o("noDomainsConfigured"),configManagementTitle:o("configManagementTitle"),configManagementDescription:o("configManagementDescription"),configLocalDev:o("configLocalDev"),configCloudDeploy:o("configCloudDeploy"),configCloudDeployCommand:o("configCloudDeployCommand"),configCloudDeployEnd:o("configCloudDeployEnd"),configAWS:o("configAWS")},ToolbarPanels:L,Toolbar:w})}export{R as default};
2
- //# sourceMappingURL=client-CKEJUXXb.js.map
1
+ import{j as h}from"./query-ATBhtd3K.js";import{r as t}from"./vendor-EnoIVk-c.js";import{d as b,e as v,f as C,g as y,w as P,y as T,T as w}from"./en-IUV4ZXKH-eHunUM2g.js";import{T as L}from"./ToolbarPanels-Drd8QG61.js";import{u as A}from"./i18n-BYxb14hm.js";import"./index-DKq_l4UW.js";import"./useAuth-CAJolYxw.js";import"./AuthContext-CUx-cP7W.js";import"./routing-BLuuVVPN.js";import"./KnowledgeBaseContext-CgnF8K-_.js";import"./PlusIcon-qGFPUzg0.js";function R(){const{t:a}=A(),o=(n,D)=>a(`AdminSecurity.${n}`,D),{activePanel:r}=b(),{theme:l,setTheme:i}=v(),{showLineNumbers:d,toggleLineNumbers:s}=C(),m=t.useCallback(({theme:n})=>{i(n)},[i]),c=t.useCallback(()=>{s()},[s]);y({"settings:theme-changed":m,"settings:line-numbers-toggled":c});const u=P(),{data:e,isLoading:g}=u.oauth.config.useQuery(),p=(e==null?void 0:e.allowedDomains)??[],f=(e==null?void 0:e.providers)??[];return h.jsx(T,{providers:f,allowedDomains:p,isLoading:g,theme:l,showLineNumbers:d,activePanel:r,translations:{title:o("title"),subtitle:o("subtitle"),oauthProviders:o("oauthProviders"),oauthProvidersDescription:o("oauthProvidersDescription"),clientId:o("clientId"),configured:o("configured"),noProvidersConfigured:o("noProvidersConfigured"),allowedDomains:o("allowedDomains"),allowedDomainsDescription:o("allowedDomainsDescription"),noDomainsConfigured:o("noDomainsConfigured"),configManagementTitle:o("configManagementTitle"),configManagementDescription:o("configManagementDescription"),configLocalDev:o("configLocalDev"),configCloudDeploy:o("configCloudDeploy"),configCloudDeployCommand:o("configCloudDeployCommand"),configCloudDeployEnd:o("configCloudDeployEnd"),configAWS:o("configAWS")},ToolbarPanels:L,Toolbar:w})}export{R as default};
2
+ //# sourceMappingURL=client-BbPyO59A.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-CKEJUXXb.js","sources":["../../src/app/[locale]/admin/security/client.tsx"],"sourcesContent":["/**\n * Admin Security Client - Thin Next.js wrapper\n *\n * This component handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React AdminSecurityPage component.\n */\n\nimport React, { useEffect, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useAdmin, Toolbar } from '@semiont/react-ui';\nimport type { paths } from '@semiont/core';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, usePanelBrowse, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminSecurityPage } from '@semiont/react-ui';\nimport type { OAuthProvider } from '@semiont/react-ui';\n\ntype ResponseContent<T> = T extends { responses: { 200: { content: { 'application/json': infer R } } } } ? R : never;\ntype OAuthConfigResponse = ResponseContent<paths['/api/admin/oauth/config']['get']>;\n\nexport default function AdminSecurity() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminSecurity.${k}`, p as any) as string;\n\n // Toolbar and settings state\n const { activePanel } = usePanelBrowse();\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n // Handle theme change events\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n // Handle line numbers toggle events\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n // Get OAuth configuration from API\n const adminAPI = useAdmin();\n const { data: oauthConfig, isLoading: oauthLoading } = adminAPI.oauth.config.useQuery();\n\n const allowedDomains = (oauthConfig as OAuthConfigResponse | undefined)?.allowedDomains ?? [];\n const providers = (oauthConfig as OAuthConfigResponse | undefined)?.providers ?? [];\n\n return (\n <AdminSecurityPage\n providers={providers as OAuthProvider[]}\n allowedDomains={allowedDomains}\n isLoading={oauthLoading}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n oauthProviders: t('oauthProviders'),\n oauthProvidersDescription: t('oauthProvidersDescription'),\n clientId: t('clientId'),\n configured: t('configured'),\n noProvidersConfigured: t('noProvidersConfigured'),\n allowedDomains: t('allowedDomains'),\n allowedDomainsDescription: t('allowedDomainsDescription'),\n noDomainsConfigured: t('noDomainsConfigured'),\n configManagementTitle: t('configManagementTitle'),\n configManagementDescription: t('configManagementDescription'),\n configLocalDev: t('configLocalDev'),\n configCloudDeploy: t('configCloudDeploy'),\n configCloudDeployCommand: t('configCloudDeployCommand'),\n configCloudDeployEnd: t('configCloudDeployEnd'),\n configAWS: t('configAWS'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"names":["AdminSecurity","_t","useTranslation","t","k","p","activePanel","usePanelBrowse","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","adminAPI","useAdmin","oauthConfig","oauthLoading","allowedDomains","providers","jsx","AdminSecurityPage","ToolbarPanels","Toolbar"],"mappings":"ocAmBA,SAAwBA,GAAgB,CACtC,KAAM,CAAE,EAAGC,CAAA,EAAOC,EAAA,EACZC,EAAI,CAACC,EAAWC,IAAgCJ,EAAG,iBAAiBG,CAAC,GAAIC,CAAQ,EAGjF,CAAE,YAAAC,CAAA,EAAgBC,EAAA,EAClB,CAAE,MAAAC,EAAO,SAAAC,CAAA,EAAaC,EAAA,EACtB,CAAE,gBAAAC,EAAiB,kBAAAC,CAAA,EAAsBC,EAAA,EAGzCC,EAAqBC,EAAAA,YAAY,CAAC,CAAE,MAAAP,KAAoD,CAC5FC,EAASD,CAAK,CAChB,EAAG,CAACC,CAAQ,CAAC,EAGPO,EAA2BD,EAAAA,YAAY,IAAM,CACjDH,EAAA,CACF,EAAG,CAACA,CAAiB,CAAC,EAEtBK,EAAsB,CACpB,yBAA0BH,EAC1B,gCAAiCE,CAAA,CAClC,EAGD,MAAME,EAAWC,EAAA,EACX,CAAE,KAAMC,EAAa,UAAWC,GAAiBH,EAAS,MAAM,OAAO,SAAA,EAEvEI,GAAkBF,GAAA,YAAAA,EAAiD,iBAAkB,CAAA,EACrFG,GAAaH,GAAA,YAAAA,EAAiD,YAAa,CAAA,EAEjF,OACEI,EAAAA,IAACC,EAAA,CACC,UAAAF,EACA,eAAAD,EACA,UAAWD,EACX,MAAAb,EACA,gBAAAG,EACA,YAAAL,EACA,aAAc,CACZ,MAAOH,EAAE,OAAO,EAChB,SAAUA,EAAE,UAAU,EACtB,eAAgBA,EAAE,gBAAgB,EAClC,0BAA2BA,EAAE,2BAA2B,EACxD,SAAUA,EAAE,UAAU,EACtB,WAAYA,EAAE,YAAY,EAC1B,sBAAuBA,EAAE,uBAAuB,EAChD,eAAgBA,EAAE,gBAAgB,EAClC,0BAA2BA,EAAE,2BAA2B,EACxD,oBAAqBA,EAAE,qBAAqB,EAC5C,sBAAuBA,EAAE,uBAAuB,EAChD,4BAA6BA,EAAE,6BAA6B,EAC5D,eAAgBA,EAAE,gBAAgB,EAClC,kBAAmBA,EAAE,mBAAmB,EACxC,yBAA0BA,EAAE,0BAA0B,EACtD,qBAAsBA,EAAE,sBAAsB,EAC9C,UAAWA,EAAE,WAAW,CAAA,EAE1B,cAAAuB,EACA,QAAAC,CAAA,CAAA,CAGN"}
1
+ {"version":3,"file":"client-BbPyO59A.js","sources":["../../src/app/[locale]/admin/security/client.tsx"],"sourcesContent":["/**\n * Admin Security Client - Thin Next.js wrapper\n *\n * This component handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React AdminSecurityPage component.\n */\n\nimport React, { useEffect, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useAdmin, Toolbar } from '@semiont/react-ui';\nimport type { paths } from '@semiont/core';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, usePanelBrowse, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminSecurityPage } from '@semiont/react-ui';\nimport type { OAuthProvider } from '@semiont/react-ui';\n\ntype ResponseContent<T> = T extends { responses: { 200: { content: { 'application/json': infer R } } } } ? R : never;\ntype OAuthConfigResponse = ResponseContent<paths['/api/admin/oauth/config']['get']>;\n\nexport default function AdminSecurity() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminSecurity.${k}`, p as any) as string;\n\n // Toolbar and settings state\n const { activePanel } = usePanelBrowse();\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n // Handle theme change events\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n // Handle line numbers toggle events\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n // Get OAuth configuration from API\n const adminAPI = useAdmin();\n const { data: oauthConfig, isLoading: oauthLoading } = adminAPI.oauth.config.useQuery();\n\n const allowedDomains = (oauthConfig as OAuthConfigResponse | undefined)?.allowedDomains ?? [];\n const providers = (oauthConfig as OAuthConfigResponse | undefined)?.providers ?? [];\n\n return (\n <AdminSecurityPage\n providers={providers as OAuthProvider[]}\n allowedDomains={allowedDomains}\n isLoading={oauthLoading}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n oauthProviders: t('oauthProviders'),\n oauthProvidersDescription: t('oauthProvidersDescription'),\n clientId: t('clientId'),\n configured: t('configured'),\n noProvidersConfigured: t('noProvidersConfigured'),\n allowedDomains: t('allowedDomains'),\n allowedDomainsDescription: t('allowedDomainsDescription'),\n noDomainsConfigured: t('noDomainsConfigured'),\n configManagementTitle: t('configManagementTitle'),\n configManagementDescription: t('configManagementDescription'),\n configLocalDev: t('configLocalDev'),\n configCloudDeploy: t('configCloudDeploy'),\n configCloudDeployCommand: t('configCloudDeployCommand'),\n configCloudDeployEnd: t('configCloudDeployEnd'),\n configAWS: t('configAWS'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"names":["AdminSecurity","_t","useTranslation","t","k","p","activePanel","usePanelBrowse","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","adminAPI","useAdmin","oauthConfig","oauthLoading","allowedDomains","providers","jsx","AdminSecurityPage","ToolbarPanels","Toolbar"],"mappings":"ocAmBA,SAAwBA,GAAgB,CACtC,KAAM,CAAE,EAAGC,CAAA,EAAOC,EAAA,EACZC,EAAI,CAACC,EAAWC,IAAgCJ,EAAG,iBAAiBG,CAAC,GAAIC,CAAQ,EAGjF,CAAE,YAAAC,CAAA,EAAgBC,EAAA,EAClB,CAAE,MAAAC,EAAO,SAAAC,CAAA,EAAaC,EAAA,EACtB,CAAE,gBAAAC,EAAiB,kBAAAC,CAAA,EAAsBC,EAAA,EAGzCC,EAAqBC,EAAAA,YAAY,CAAC,CAAE,MAAAP,KAAoD,CAC5FC,EAASD,CAAK,CAChB,EAAG,CAACC,CAAQ,CAAC,EAGPO,EAA2BD,EAAAA,YAAY,IAAM,CACjDH,EAAA,CACF,EAAG,CAACA,CAAiB,CAAC,EAEtBK,EAAsB,CACpB,yBAA0BH,EAC1B,gCAAiCE,CAAA,CAClC,EAGD,MAAME,EAAWC,EAAA,EACX,CAAE,KAAMC,EAAa,UAAWC,GAAiBH,EAAS,MAAM,OAAO,SAAA,EAEvEI,GAAkBF,GAAA,YAAAA,EAAiD,iBAAkB,CAAA,EACrFG,GAAaH,GAAA,YAAAA,EAAiD,YAAa,CAAA,EAEjF,OACEI,EAAAA,IAACC,EAAA,CACC,UAAAF,EACA,eAAAD,EACA,UAAWD,EACX,MAAAb,EACA,gBAAAG,EACA,YAAAL,EACA,aAAc,CACZ,MAAOH,EAAE,OAAO,EAChB,SAAUA,EAAE,UAAU,EACtB,eAAgBA,EAAE,gBAAgB,EAClC,0BAA2BA,EAAE,2BAA2B,EACxD,SAAUA,EAAE,UAAU,EACtB,WAAYA,EAAE,YAAY,EAC1B,sBAAuBA,EAAE,uBAAuB,EAChD,eAAgBA,EAAE,gBAAgB,EAClC,0BAA2BA,EAAE,2BAA2B,EACxD,oBAAqBA,EAAE,qBAAqB,EAC5C,sBAAuBA,EAAE,uBAAuB,EAChD,4BAA6BA,EAAE,6BAA6B,EAC5D,eAAgBA,EAAE,gBAAgB,EAClC,kBAAmBA,EAAE,mBAAmB,EACxC,yBAA0BA,EAAE,0BAA0B,EACtD,qBAAsBA,EAAE,sBAAsB,EAC9C,UAAWA,EAAE,WAAW,CAAA,EAE1B,cAAAuB,EACA,QAAAC,CAAA,CAAA,CAGN"}
@@ -1,2 +1,2 @@
1
- import{j as M}from"./query-ATBhtd3K.js";import{r as s}from"./vendor-EnoIVk-c.js";import{d as z,e as R,f as B,g as F,w as L,z as y,T as N}from"./en-IUV4ZXKH-BjYNERUx.js";import{T as j}from"./ToolbarPanels-tcvPzqNN.js";import{u as D}from"./i18n-BYxb14hm.js";import"./index-D4SjcYxX.js";import"./useAuth-CqtZE9nt.js";import"./AuthContext-CYne_gJM.js";import"./routing-nZgBtxly.js";import"./KnowledgeBaseContext-CgnF8K-_.js";import"./PlusIcon-qGFPUzg0.js";function Q(){const{t:d}=D(),e=(t,w)=>d(`AdminExchange.${t}`,w),{activePanel:g}=z(),{theme:b,setTheme:p}=R(),{showLineNumbers:C,toggleLineNumbers:m}=B(),x=s.useCallback(({theme:t})=>{p(t)},[p]),f=s.useCallback(()=>{m()},[m]);F({"settings:theme-changed":x,"settings:line-numbers-toggled":f});const c=L(),i=c.exchange.backup.useMutation(),l=c.exchange.restore.useMutation(),[o,u]=s.useState(null),[v,h]=s.useState(null),[T,n]=s.useState(null),[I,a]=s.useState(),[P,r]=s.useState(),E=s.useCallback(()=>{i.mutate()},[i]),k=s.useCallback(async t=>{u(t),n(null),a(void 0),r(void 0),h({format:t.name.endsWith(".tar.gz")||t.name.endsWith(".gz")?"semiont-backup":"unknown",version:1,sourceUrl:"",stats:{}})},[]),S=s.useCallback(()=>{o&&(n("started"),a(void 0),r(void 0),l.mutate({file:o,onProgress:t=>{n(t.phase),a(t.message),t.result&&r(t.result)}}))},[o,l]),A=s.useCallback(()=>{u(null),h(null),n(null),a(void 0),r(void 0)},[]);return M.jsx(y,{onExport:E,isExporting:i.isPending,onFileSelected:k,onImport:S,onCancelImport:A,selectedFile:o,preview:v,isImporting:l.isPending,importPhase:T,importMessage:I,importResult:P,theme:b,showLineNumbers:C,activePanel:g,translations:{title:e("title"),subtitle:e("subtitle"),export:{title:e("exportTitle"),description:e("exportDescription"),exportButton:e("exportButton"),exporting:e("exporting")},import:{title:e("importTitle"),description:e("importDescription"),dropzoneLabel:e("dropzoneLabel"),dropzoneActive:e("dropzoneActive"),detectedFormat:e("detectedFormat"),statsPreview:e("statsPreview"),importButton:e("importButton"),importing:e("importing"),importConfirmTitle:e("importConfirmTitle"),importConfirmMessage:e("importConfirmMessage"),confirmImport:e("confirmImport"),cancelImport:e("cancelImport")},progress:{phaseStarted:e("phaseStarted"),phaseEntityTypes:e("phaseEntityTypes"),phaseResources:e("phaseResources"),phaseAnnotations:e("phaseAnnotations"),phaseComplete:e("phaseComplete"),phaseError:e("phaseError"),hashChainValid:e("hashChainValid"),hashChainInvalid:e("hashChainInvalid"),streams:e("streams"),events:e("events"),blobs:e("blobs")}},ToolbarPanels:j,Toolbar:N})}export{Q as default};
2
- //# sourceMappingURL=client-DWcJNpII.js.map
1
+ import{j as M}from"./query-ATBhtd3K.js";import{r as s}from"./vendor-EnoIVk-c.js";import{d as z,e as R,f as B,g as F,w as L,z as y,T as N}from"./en-IUV4ZXKH-eHunUM2g.js";import{T as j}from"./ToolbarPanels-Drd8QG61.js";import{u as D}from"./i18n-BYxb14hm.js";import"./index-DKq_l4UW.js";import"./useAuth-CAJolYxw.js";import"./AuthContext-CUx-cP7W.js";import"./routing-BLuuVVPN.js";import"./KnowledgeBaseContext-CgnF8K-_.js";import"./PlusIcon-qGFPUzg0.js";function Q(){const{t:d}=D(),e=(t,w)=>d(`AdminExchange.${t}`,w),{activePanel:g}=z(),{theme:b,setTheme:p}=R(),{showLineNumbers:C,toggleLineNumbers:m}=B(),x=s.useCallback(({theme:t})=>{p(t)},[p]),f=s.useCallback(()=>{m()},[m]);F({"settings:theme-changed":x,"settings:line-numbers-toggled":f});const c=L(),i=c.exchange.backup.useMutation(),l=c.exchange.restore.useMutation(),[o,u]=s.useState(null),[v,h]=s.useState(null),[T,n]=s.useState(null),[I,a]=s.useState(),[P,r]=s.useState(),E=s.useCallback(()=>{i.mutate()},[i]),k=s.useCallback(async t=>{u(t),n(null),a(void 0),r(void 0),h({format:t.name.endsWith(".tar.gz")||t.name.endsWith(".gz")?"semiont-backup":"unknown",version:1,sourceUrl:"",stats:{}})},[]),S=s.useCallback(()=>{o&&(n("started"),a(void 0),r(void 0),l.mutate({file:o,onProgress:t=>{n(t.phase),a(t.message),t.result&&r(t.result)}}))},[o,l]),A=s.useCallback(()=>{u(null),h(null),n(null),a(void 0),r(void 0)},[]);return M.jsx(y,{onExport:E,isExporting:i.isPending,onFileSelected:k,onImport:S,onCancelImport:A,selectedFile:o,preview:v,isImporting:l.isPending,importPhase:T,importMessage:I,importResult:P,theme:b,showLineNumbers:C,activePanel:g,translations:{title:e("title"),subtitle:e("subtitle"),export:{title:e("exportTitle"),description:e("exportDescription"),exportButton:e("exportButton"),exporting:e("exporting")},import:{title:e("importTitle"),description:e("importDescription"),dropzoneLabel:e("dropzoneLabel"),dropzoneActive:e("dropzoneActive"),detectedFormat:e("detectedFormat"),statsPreview:e("statsPreview"),importButton:e("importButton"),importing:e("importing"),importConfirmTitle:e("importConfirmTitle"),importConfirmMessage:e("importConfirmMessage"),confirmImport:e("confirmImport"),cancelImport:e("cancelImport")},progress:{phaseStarted:e("phaseStarted"),phaseEntityTypes:e("phaseEntityTypes"),phaseResources:e("phaseResources"),phaseAnnotations:e("phaseAnnotations"),phaseComplete:e("phaseComplete"),phaseError:e("phaseError"),hashChainValid:e("hashChainValid"),hashChainInvalid:e("hashChainInvalid"),streams:e("streams"),events:e("events"),blobs:e("blobs")}},ToolbarPanels:j,Toolbar:N})}export{Q as default};
2
+ //# sourceMappingURL=client-BsHptwGn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-DWcJNpII.js","sources":["../../src/app/[locale]/admin/exchange/client.tsx"],"sourcesContent":["/**\n * Admin Exchange Client - Thin Next.js wrapper\n *\n * Handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React AdminExchangePage component.\n */\n\nimport React, { useState, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useAdmin, Toolbar } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, usePanelBrowse, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminExchangePage } from '@semiont/react-ui';\nimport type { ImportPreview } from '@semiont/react-ui';\n\nexport default function AdminExchangeClient() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminExchange.${k}`, p as any) as string;\n\n // Toolbar and settings state\n const { activePanel } = usePanelBrowse();\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n // API hooks\n const adminAPI = useAdmin();\n const backupMutation = adminAPI.exchange.backup.useMutation();\n const restoreMutation = adminAPI.exchange.restore.useMutation();\n\n // Local state\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [preview, setPreview] = useState<ImportPreview | null>(null);\n const [importPhase, setImportPhase] = useState<string | null>(null);\n const [importMessage, setImportMessage] = useState<string | undefined>();\n const [importResult, setImportResult] = useState<Record<string, unknown> | undefined>();\n\n const handleBackup = useCallback(() => {\n backupMutation.mutate();\n }, [backupMutation]);\n\n const handleFileSelected = useCallback(async (file: File) => {\n setSelectedFile(file);\n setImportPhase(null);\n setImportMessage(undefined);\n setImportResult(undefined);\n\n // For tar.gz backups, show basic info\n setPreview({\n format: file.name.endsWith('.tar.gz') || file.name.endsWith('.gz') ? 'semiont-backup' : 'unknown',\n version: 1,\n sourceUrl: '',\n stats: {},\n });\n }, []);\n\n const handleRestore = useCallback(() => {\n if (!selectedFile) return;\n\n setImportPhase('started');\n setImportMessage(undefined);\n setImportResult(undefined);\n\n restoreMutation.mutate({\n file: selectedFile,\n onProgress: (event) => {\n setImportPhase(event.phase);\n setImportMessage(event.message);\n if (event.result) {\n setImportResult(event.result);\n }\n },\n });\n }, [selectedFile, restoreMutation]);\n\n const handleCancelRestore = useCallback(() => {\n setSelectedFile(null);\n setPreview(null);\n setImportPhase(null);\n setImportMessage(undefined);\n setImportResult(undefined);\n }, []);\n\n return (\n <AdminExchangePage\n onExport={handleBackup}\n isExporting={backupMutation.isPending}\n onFileSelected={handleFileSelected}\n onImport={handleRestore}\n onCancelImport={handleCancelRestore}\n selectedFile={selectedFile}\n preview={preview}\n isImporting={restoreMutation.isPending}\n importPhase={importPhase}\n importMessage={importMessage}\n importResult={importResult}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n export: {\n title: t('exportTitle'),\n description: t('exportDescription'),\n exportButton: t('exportButton'),\n exporting: t('exporting'),\n },\n import: {\n title: t('importTitle'),\n description: t('importDescription'),\n dropzoneLabel: t('dropzoneLabel'),\n dropzoneActive: t('dropzoneActive'),\n detectedFormat: t('detectedFormat'),\n statsPreview: t('statsPreview'),\n importButton: t('importButton'),\n importing: t('importing'),\n importConfirmTitle: t('importConfirmTitle'),\n importConfirmMessage: t('importConfirmMessage'),\n confirmImport: t('confirmImport'),\n cancelImport: t('cancelImport'),\n },\n progress: {\n phaseStarted: t('phaseStarted'),\n phaseEntityTypes: t('phaseEntityTypes'),\n phaseResources: t('phaseResources'),\n phaseAnnotations: t('phaseAnnotations'),\n phaseComplete: t('phaseComplete'),\n phaseError: t('phaseError'),\n hashChainValid: t('hashChainValid'),\n hashChainInvalid: t('hashChainInvalid'),\n streams: t('streams'),\n events: t('events'),\n blobs: t('blobs'),\n },\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"names":["AdminExchangeClient","_t","useTranslation","t","k","p","activePanel","usePanelBrowse","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","adminAPI","useAdmin","backupMutation","restoreMutation","selectedFile","setSelectedFile","useState","preview","setPreview","importPhase","setImportPhase","importMessage","setImportMessage","importResult","setImportResult","handleBackup","handleFileSelected","file","handleRestore","event","handleCancelRestore","jsx","AdminExchangePage","ToolbarPanels","Toolbar"],"mappings":"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"}
1
+ {"version":3,"file":"client-BsHptwGn.js","sources":["../../src/app/[locale]/admin/exchange/client.tsx"],"sourcesContent":["/**\n * Admin Exchange Client - Thin Next.js wrapper\n *\n * Handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React AdminExchangePage component.\n */\n\nimport React, { useState, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useAdmin, Toolbar } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, usePanelBrowse, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminExchangePage } from '@semiont/react-ui';\nimport type { ImportPreview } from '@semiont/react-ui';\n\nexport default function AdminExchangeClient() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminExchange.${k}`, p as any) as string;\n\n // Toolbar and settings state\n const { activePanel } = usePanelBrowse();\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n // API hooks\n const adminAPI = useAdmin();\n const backupMutation = adminAPI.exchange.backup.useMutation();\n const restoreMutation = adminAPI.exchange.restore.useMutation();\n\n // Local state\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [preview, setPreview] = useState<ImportPreview | null>(null);\n const [importPhase, setImportPhase] = useState<string | null>(null);\n const [importMessage, setImportMessage] = useState<string | undefined>();\n const [importResult, setImportResult] = useState<Record<string, unknown> | undefined>();\n\n const handleBackup = useCallback(() => {\n backupMutation.mutate();\n }, [backupMutation]);\n\n const handleFileSelected = useCallback(async (file: File) => {\n setSelectedFile(file);\n setImportPhase(null);\n setImportMessage(undefined);\n setImportResult(undefined);\n\n // For tar.gz backups, show basic info\n setPreview({\n format: file.name.endsWith('.tar.gz') || file.name.endsWith('.gz') ? 'semiont-backup' : 'unknown',\n version: 1,\n sourceUrl: '',\n stats: {},\n });\n }, []);\n\n const handleRestore = useCallback(() => {\n if (!selectedFile) return;\n\n setImportPhase('started');\n setImportMessage(undefined);\n setImportResult(undefined);\n\n restoreMutation.mutate({\n file: selectedFile,\n onProgress: (event) => {\n setImportPhase(event.phase);\n setImportMessage(event.message);\n if (event.result) {\n setImportResult(event.result);\n }\n },\n });\n }, [selectedFile, restoreMutation]);\n\n const handleCancelRestore = useCallback(() => {\n setSelectedFile(null);\n setPreview(null);\n setImportPhase(null);\n setImportMessage(undefined);\n setImportResult(undefined);\n }, []);\n\n return (\n <AdminExchangePage\n onExport={handleBackup}\n isExporting={backupMutation.isPending}\n onFileSelected={handleFileSelected}\n onImport={handleRestore}\n onCancelImport={handleCancelRestore}\n selectedFile={selectedFile}\n preview={preview}\n isImporting={restoreMutation.isPending}\n importPhase={importPhase}\n importMessage={importMessage}\n importResult={importResult}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n export: {\n title: t('exportTitle'),\n description: t('exportDescription'),\n exportButton: t('exportButton'),\n exporting: t('exporting'),\n },\n import: {\n title: t('importTitle'),\n description: t('importDescription'),\n dropzoneLabel: t('dropzoneLabel'),\n dropzoneActive: t('dropzoneActive'),\n detectedFormat: t('detectedFormat'),\n statsPreview: t('statsPreview'),\n importButton: t('importButton'),\n importing: t('importing'),\n importConfirmTitle: t('importConfirmTitle'),\n importConfirmMessage: t('importConfirmMessage'),\n confirmImport: t('confirmImport'),\n cancelImport: t('cancelImport'),\n },\n progress: {\n phaseStarted: t('phaseStarted'),\n phaseEntityTypes: t('phaseEntityTypes'),\n phaseResources: t('phaseResources'),\n phaseAnnotations: t('phaseAnnotations'),\n phaseComplete: t('phaseComplete'),\n phaseError: t('phaseError'),\n hashChainValid: t('hashChainValid'),\n hashChainInvalid: t('hashChainInvalid'),\n streams: t('streams'),\n events: t('events'),\n blobs: t('blobs'),\n },\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"names":["AdminExchangeClient","_t","useTranslation","t","k","p","activePanel","usePanelBrowse","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","adminAPI","useAdmin","backupMutation","restoreMutation","selectedFile","setSelectedFile","useState","preview","setPreview","importPhase","setImportPhase","importMessage","setImportMessage","importResult","setImportResult","handleBackup","handleFileSelected","file","handleRestore","event","handleCancelRestore","jsx","AdminExchangePage","ToolbarPanels","Toolbar"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{u as P,j as k}from"./query-ATBhtd3K.js";import{r as u}from"./vendor-EnoIVk-c.js";import{d as D,e as E,f as N,g as S,w as j,x as w,b as F,T as Q}from"./en-IUV4ZXKH-BjYNERUx.js";import{T as q}from"./ToolbarPanels-tcvPzqNN.js";import{u as K}from"./i18n-BYxb14hm.js";import"./index-D4SjcYxX.js";import"./useAuth-CqtZE9nt.js";import"./AuthContext-CYne_gJM.js";import"./routing-nZgBtxly.js";import"./KnowledgeBaseContext-CgnF8K-_.js";import"./PlusIcon-qGFPUzg0.js";function V(){const{t:d}=K(),e=(s,a)=>d(`AdminUsers.${s}`,a),o=P(),{activePanel:m}=D(),{theme:c,setTheme:i}=E(),{showLineNumbers:U,toggleLineNumbers:l}=N(),p=u.useCallback(({theme:s})=>{i(s)},[i]),g=u.useCallback(()=>{l()},[l]);S({"settings:theme-changed":p,"settings:line-numbers-toggled":g});const t=j(),{data:n,isLoading:h}=t.users.list.useQuery(),{data:r,isLoading:v}=t.users.stats.useQuery(),C=t.users.update.useMutation(),b=(n==null?void 0:n.users)??[],y=(r==null?void 0:r.stats)??null,A=async(s,a)=>{try{await C.mutateAsync({id:s,data:a}),o.invalidateQueries({queryKey:["admin.users.list"]}),o.invalidateQueries({queryKey:["admin.users.stats"]})}catch(T){console.error("Failed to update user:",T)}},L=async s=>{console.warn("Delete user not implemented:",s),alert("Delete user functionality is not currently available")},x=()=>{console.log("Add user clicked")},f=()=>{console.log("Export users clicked")};return k.jsx(w,{users:b,userStats:y,isLoadingUsers:h,isLoadingStats:v,onUpdateUser:A,onDeleteUser:L,onAddUser:x,onExportUsers:f,theme:c,showLineNumbers:U,activePanel:m,translations:{title:e("title"),subtitle:e("subtitle"),addUser:e("addUser"),totalUsers:e("totalUsers"),activeUsers:e("activeUsers"),administrators:e("administrators"),recentUsers:e("recentUsers"),searchUsers:e("searchUsers"),searchPlaceholder:e("searchPlaceholder"),role:e("role"),allRoles:e("allRoles"),admin:e("admin"),user:e("user"),status:e("status"),allStatus:e("allStatus"),active:e("active"),inactive:e("inactive"),exportUsers:e("exportUsers"),loadingUsers:e("loadingUsers"),userColumn:e("userColumn"),domainColumn:e("domainColumn"),roleColumn:e("roleColumn"),statusColumn:e("statusColumn"),lastLoginColumn:e("lastLoginColumn"),joinedColumn:e("joinedColumn"),actionsColumn:e("actionsColumn"),noUsersFound:e("noUsersFound"),noUsersFoundDescription:e("noUsersFoundDescription"),noName:e("noName"),never:e("never"),removeAdmin:e("removeAdmin"),makeAdmin:e("makeAdmin"),deactivateUser:e("deactivateUser"),activateUser:e("activateUser"),deleteUser:e("deleteUser")},ToolbarPanels:q,Toolbar:Q,buttonStyles:F})}export{V as default};
2
- //# sourceMappingURL=client-87q-RlKa.js.map
1
+ import{u as P,j as k}from"./query-ATBhtd3K.js";import{r as u}from"./vendor-EnoIVk-c.js";import{d as D,e as E,f as N,g as S,w as j,x as w,b as F,T as Q}from"./en-IUV4ZXKH-eHunUM2g.js";import{T as q}from"./ToolbarPanels-Drd8QG61.js";import{u as K}from"./i18n-BYxb14hm.js";import"./index-DKq_l4UW.js";import"./useAuth-CAJolYxw.js";import"./AuthContext-CUx-cP7W.js";import"./routing-BLuuVVPN.js";import"./KnowledgeBaseContext-CgnF8K-_.js";import"./PlusIcon-qGFPUzg0.js";function V(){const{t:d}=K(),e=(s,a)=>d(`AdminUsers.${s}`,a),o=P(),{activePanel:m}=D(),{theme:c,setTheme:i}=E(),{showLineNumbers:U,toggleLineNumbers:l}=N(),p=u.useCallback(({theme:s})=>{i(s)},[i]),g=u.useCallback(()=>{l()},[l]);S({"settings:theme-changed":p,"settings:line-numbers-toggled":g});const t=j(),{data:n,isLoading:h}=t.users.list.useQuery(),{data:r,isLoading:v}=t.users.stats.useQuery(),C=t.users.update.useMutation(),b=(n==null?void 0:n.users)??[],y=(r==null?void 0:r.stats)??null,A=async(s,a)=>{try{await C.mutateAsync({id:s,data:a}),o.invalidateQueries({queryKey:["admin.users.list"]}),o.invalidateQueries({queryKey:["admin.users.stats"]})}catch(T){console.error("Failed to update user:",T)}},L=async s=>{console.warn("Delete user not implemented:",s),alert("Delete user functionality is not currently available")},x=()=>{console.log("Add user clicked")},f=()=>{console.log("Export users clicked")};return k.jsx(w,{users:b,userStats:y,isLoadingUsers:h,isLoadingStats:v,onUpdateUser:A,onDeleteUser:L,onAddUser:x,onExportUsers:f,theme:c,showLineNumbers:U,activePanel:m,translations:{title:e("title"),subtitle:e("subtitle"),addUser:e("addUser"),totalUsers:e("totalUsers"),activeUsers:e("activeUsers"),administrators:e("administrators"),recentUsers:e("recentUsers"),searchUsers:e("searchUsers"),searchPlaceholder:e("searchPlaceholder"),role:e("role"),allRoles:e("allRoles"),admin:e("admin"),user:e("user"),status:e("status"),allStatus:e("allStatus"),active:e("active"),inactive:e("inactive"),exportUsers:e("exportUsers"),loadingUsers:e("loadingUsers"),userColumn:e("userColumn"),domainColumn:e("domainColumn"),roleColumn:e("roleColumn"),statusColumn:e("statusColumn"),lastLoginColumn:e("lastLoginColumn"),joinedColumn:e("joinedColumn"),actionsColumn:e("actionsColumn"),noUsersFound:e("noUsersFound"),noUsersFoundDescription:e("noUsersFoundDescription"),noName:e("noName"),never:e("never"),removeAdmin:e("removeAdmin"),makeAdmin:e("makeAdmin"),deactivateUser:e("deactivateUser"),activateUser:e("activateUser"),deleteUser:e("deleteUser")},ToolbarPanels:q,Toolbar:Q,buttonStyles:F})}export{V as default};
2
+ //# sourceMappingURL=client-COY1ucYF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-87q-RlKa.js","sources":["../../src/app/[locale]/admin/users/client.tsx"],"sourcesContent":["/**\n * Admin Users Client - Thin Next.js wrapper\n *\n * This component handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React AdminUsersPage component.\n */\n\nimport React, { useEffect, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useAdmin, buttonStyles, Toolbar } from '@semiont/react-ui';\nimport type { paths } from '@semiont/core';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, usePanelBrowse, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminUsersPage } from '@semiont/react-ui';\nimport type { AdminUser, AdminUserStats } from '@semiont/react-ui';\n\ntype ResponseContent<T> = T extends { responses: { 200: { content: { 'application/json': infer R } } } } ? R : never;\ntype AdminUsersResponse = ResponseContent<paths['/api/admin/users']['get']>;\ntype AdminUserStatsResponse = ResponseContent<paths['/api/admin/users/stats']['get']>;\n\nexport default function AdminUsers() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminUsers.${k}`, p as any) as string;\n const queryClient = useQueryClient();\n\n // Toolbar and settings state\n const { activePanel } = usePanelBrowse();\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n // Handle theme change events\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n // Handle line numbers toggle events\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n // API hooks\n const adminAPI = useAdmin();\n const { data: usersResponse, isLoading: usersLoading } = adminAPI.users.list.useQuery();\n const { data: statsResponse, isLoading: statsLoading } = adminAPI.users.stats.useQuery();\n const updateUserMutation = adminAPI.users.update.useMutation();\n\n const users = (usersResponse as AdminUsersResponse | undefined)?.users ?? [];\n const userStats = (statsResponse as AdminUserStatsResponse | undefined)?.stats ?? null;\n\n const handleUpdateUser = async (id: string, data: { isAdmin?: boolean; isActive?: boolean }) => {\n try {\n await updateUserMutation.mutateAsync({ id, data });\n queryClient.invalidateQueries({ queryKey: ['admin.users.list'] });\n queryClient.invalidateQueries({ queryKey: ['admin.users.stats'] });\n } catch (error) {\n console.error('Failed to update user:', error);\n }\n };\n\n const handleDeleteUser = async (id: string) => {\n console.warn('Delete user not implemented:', id);\n alert('Delete user functionality is not currently available');\n };\n\n const handleAddUser = () => {\n console.log('Add user clicked');\n };\n\n const handleExportUsers = () => {\n console.log('Export users clicked');\n };\n\n return (\n <AdminUsersPage\n users={users as AdminUser[]}\n userStats={userStats as AdminUserStats | null}\n isLoadingUsers={usersLoading}\n isLoadingStats={statsLoading}\n onUpdateUser={handleUpdateUser}\n onDeleteUser={handleDeleteUser}\n onAddUser={handleAddUser}\n onExportUsers={handleExportUsers}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n addUser: t('addUser'),\n totalUsers: t('totalUsers'),\n activeUsers: t('activeUsers'),\n administrators: t('administrators'),\n recentUsers: t('recentUsers'),\n searchUsers: t('searchUsers'),\n searchPlaceholder: t('searchPlaceholder'),\n role: t('role'),\n allRoles: t('allRoles'),\n admin: t('admin'),\n user: t('user'),\n status: t('status'),\n allStatus: t('allStatus'),\n active: t('active'),\n inactive: t('inactive'),\n exportUsers: t('exportUsers'),\n loadingUsers: t('loadingUsers'),\n userColumn: t('userColumn'),\n domainColumn: t('domainColumn'),\n roleColumn: t('roleColumn'),\n statusColumn: t('statusColumn'),\n lastLoginColumn: t('lastLoginColumn'),\n joinedColumn: t('joinedColumn'),\n actionsColumn: t('actionsColumn'),\n noUsersFound: t('noUsersFound'),\n noUsersFoundDescription: t('noUsersFoundDescription'),\n noName: t('noName'),\n never: t('never'),\n removeAdmin: t('removeAdmin'),\n makeAdmin: t('makeAdmin'),\n deactivateUser: t('deactivateUser'),\n activateUser: t('activateUser'),\n deleteUser: t('deleteUser'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n buttonStyles={buttonStyles}\n />\n );\n}\n"],"names":["AdminUsers","_t","useTranslation","t","k","p","queryClient","useQueryClient","activePanel","usePanelBrowse","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","adminAPI","useAdmin","usersResponse","usersLoading","statsResponse","statsLoading","updateUserMutation","users","userStats","handleUpdateUser","id","data","error","handleDeleteUser","handleAddUser","handleExportUsers","jsx","AdminUsersPage","ToolbarPanels","Toolbar","buttonStyles"],"mappings":"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"}
1
+ {"version":3,"file":"client-COY1ucYF.js","sources":["../../src/app/[locale]/admin/users/client.tsx"],"sourcesContent":["/**\n * Admin Users Client - Thin Next.js wrapper\n *\n * This component handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React AdminUsersPage component.\n */\n\nimport React, { useEffect, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useAdmin, buttonStyles, Toolbar } from '@semiont/react-ui';\nimport type { paths } from '@semiont/core';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, usePanelBrowse, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { AdminUsersPage } from '@semiont/react-ui';\nimport type { AdminUser, AdminUserStats } from '@semiont/react-ui';\n\ntype ResponseContent<T> = T extends { responses: { 200: { content: { 'application/json': infer R } } } } ? R : never;\ntype AdminUsersResponse = ResponseContent<paths['/api/admin/users']['get']>;\ntype AdminUserStatsResponse = ResponseContent<paths['/api/admin/users/stats']['get']>;\n\nexport default function AdminUsers() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminUsers.${k}`, p as any) as string;\n const queryClient = useQueryClient();\n\n // Toolbar and settings state\n const { activePanel } = usePanelBrowse();\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n // Handle theme change events\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n // Handle line numbers toggle events\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n // API hooks\n const adminAPI = useAdmin();\n const { data: usersResponse, isLoading: usersLoading } = adminAPI.users.list.useQuery();\n const { data: statsResponse, isLoading: statsLoading } = adminAPI.users.stats.useQuery();\n const updateUserMutation = adminAPI.users.update.useMutation();\n\n const users = (usersResponse as AdminUsersResponse | undefined)?.users ?? [];\n const userStats = (statsResponse as AdminUserStatsResponse | undefined)?.stats ?? null;\n\n const handleUpdateUser = async (id: string, data: { isAdmin?: boolean; isActive?: boolean }) => {\n try {\n await updateUserMutation.mutateAsync({ id, data });\n queryClient.invalidateQueries({ queryKey: ['admin.users.list'] });\n queryClient.invalidateQueries({ queryKey: ['admin.users.stats'] });\n } catch (error) {\n console.error('Failed to update user:', error);\n }\n };\n\n const handleDeleteUser = async (id: string) => {\n console.warn('Delete user not implemented:', id);\n alert('Delete user functionality is not currently available');\n };\n\n const handleAddUser = () => {\n console.log('Add user clicked');\n };\n\n const handleExportUsers = () => {\n console.log('Export users clicked');\n };\n\n return (\n <AdminUsersPage\n users={users as AdminUser[]}\n userStats={userStats as AdminUserStats | null}\n isLoadingUsers={usersLoading}\n isLoadingStats={statsLoading}\n onUpdateUser={handleUpdateUser}\n onDeleteUser={handleDeleteUser}\n onAddUser={handleAddUser}\n onExportUsers={handleExportUsers}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n addUser: t('addUser'),\n totalUsers: t('totalUsers'),\n activeUsers: t('activeUsers'),\n administrators: t('administrators'),\n recentUsers: t('recentUsers'),\n searchUsers: t('searchUsers'),\n searchPlaceholder: t('searchPlaceholder'),\n role: t('role'),\n allRoles: t('allRoles'),\n admin: t('admin'),\n user: t('user'),\n status: t('status'),\n allStatus: t('allStatus'),\n active: t('active'),\n inactive: t('inactive'),\n exportUsers: t('exportUsers'),\n loadingUsers: t('loadingUsers'),\n userColumn: t('userColumn'),\n domainColumn: t('domainColumn'),\n roleColumn: t('roleColumn'),\n statusColumn: t('statusColumn'),\n lastLoginColumn: t('lastLoginColumn'),\n joinedColumn: t('joinedColumn'),\n actionsColumn: t('actionsColumn'),\n noUsersFound: t('noUsersFound'),\n noUsersFoundDescription: t('noUsersFoundDescription'),\n noName: t('noName'),\n never: t('never'),\n removeAdmin: t('removeAdmin'),\n makeAdmin: t('makeAdmin'),\n deactivateUser: t('deactivateUser'),\n activateUser: t('activateUser'),\n deleteUser: t('deleteUser'),\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n buttonStyles={buttonStyles}\n />\n );\n}\n"],"names":["AdminUsers","_t","useTranslation","t","k","p","queryClient","useQueryClient","activePanel","usePanelBrowse","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","adminAPI","useAdmin","usersResponse","usersLoading","statsResponse","statsLoading","updateUserMutation","users","userStats","handleUpdateUser","id","data","error","handleDeleteUser","handleAddUser","handleExportUsers","jsx","AdminUsersPage","ToolbarPanels","Toolbar","buttonStyles"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as w}from"./query-ATBhtd3K.js";import{r as o}from"./vendor-EnoIVk-c.js";import{d as z,e as D,f as F,g as y,D as A,L as B,T as R}from"./en-IUV4ZXKH-BjYNERUx.js";import{T as N}from"./ToolbarPanels-tcvPzqNN.js";import{u as j}from"./i18n-BYxb14hm.js";import"./index-D4SjcYxX.js";import"./useAuth-CqtZE9nt.js";import"./AuthContext-CYne_gJM.js";import"./routing-nZgBtxly.js";import"./KnowledgeBaseContext-CgnF8K-_.js";import"./PlusIcon-qGFPUzg0.js";function Q(){const{t:h}=j(),e=(t,M)=>h(`ModerationLinkedData.${t}`,M),{activePanel:g}=z(),{theme:b,setTheme:p}=D(),{showLineNumbers:C,toggleLineNumbers:m}=F(),x=o.useCallback(({theme:t})=>{p(t)},[p]),f=o.useCallback(()=>{m()},[m]);y({"settings:theme-changed":x,"settings:line-numbers-toggled":f});const u=A(),i=u.exchange.export.useMutation(),l=u.exchange.import.useMutation(),[s,c]=o.useState(null),[v,d]=o.useState(null),[I,n]=o.useState(null),[T,a]=o.useState(),[P,r]=o.useState(),k=o.useCallback(()=>{i.mutate({})},[i]),S=o.useCallback(async t=>{c(t),n(null),a(void 0),r(void 0),d({format:t.name.endsWith(".tar.gz")||t.name.endsWith(".gz")?"semiont-linked-data":"unknown",version:1,sourceUrl:"",stats:{}})},[]),E=o.useCallback(()=>{s&&(n("started"),a(void 0),r(void 0),l.mutate({file:s,onProgress:t=>{n(t.phase),a(t.message),t.result&&r(t.result)}}))},[s,l]),L=o.useCallback(()=>{c(null),d(null),n(null),a(void 0),r(void 0)},[]);return w.jsx(B,{onExport:k,isExporting:i.isPending,onFileSelected:S,onImport:E,onCancelImport:L,selectedFile:s,preview:v,isImporting:l.isPending,importPhase:I,importMessage:T,importResult:P,theme:b,showLineNumbers:C,activePanel:g,translations:{title:e("title"),subtitle:e("subtitle"),export:{title:e("exportTitle"),description:e("exportDescription"),exportButton:e("exportButton"),exporting:e("exporting")},import:{title:e("importTitle"),description:e("importDescription"),dropzoneLabel:e("dropzoneLabel"),dropzoneActive:e("dropzoneActive"),detectedFormat:e("detectedFormat"),statsPreview:e("statsPreview"),importButton:e("importButton"),importing:e("importing"),importConfirmTitle:e("importConfirmTitle"),importConfirmMessage:e("importConfirmMessage"),confirmImport:e("confirmImport"),cancelImport:e("cancelImport")},progress:{phaseStarted:e("phaseStarted"),phaseEntityTypes:e("phaseEntityTypes"),phaseResources:e("phaseResources"),phaseAnnotations:e("phaseAnnotations"),phaseComplete:e("phaseComplete"),phaseError:e("phaseError"),hashChainValid:e("hashChainValid"),hashChainInvalid:e("hashChainInvalid"),streams:e("streams"),events:e("events"),blobs:e("blobs")}},ToolbarPanels:N,Toolbar:R})}export{Q as default};
2
- //# sourceMappingURL=client-BZBaSaZ0.js.map
1
+ import{j as w}from"./query-ATBhtd3K.js";import{r as o}from"./vendor-EnoIVk-c.js";import{d as z,e as D,f as F,g as y,D as A,L as B,T as R}from"./en-IUV4ZXKH-eHunUM2g.js";import{T as N}from"./ToolbarPanels-Drd8QG61.js";import{u as j}from"./i18n-BYxb14hm.js";import"./index-DKq_l4UW.js";import"./useAuth-CAJolYxw.js";import"./AuthContext-CUx-cP7W.js";import"./routing-BLuuVVPN.js";import"./KnowledgeBaseContext-CgnF8K-_.js";import"./PlusIcon-qGFPUzg0.js";function Q(){const{t:h}=j(),e=(t,M)=>h(`ModerationLinkedData.${t}`,M),{activePanel:g}=z(),{theme:b,setTheme:p}=D(),{showLineNumbers:C,toggleLineNumbers:m}=F(),x=o.useCallback(({theme:t})=>{p(t)},[p]),f=o.useCallback(()=>{m()},[m]);y({"settings:theme-changed":x,"settings:line-numbers-toggled":f});const u=A(),i=u.exchange.export.useMutation(),l=u.exchange.import.useMutation(),[s,c]=o.useState(null),[v,d]=o.useState(null),[I,n]=o.useState(null),[T,a]=o.useState(),[P,r]=o.useState(),k=o.useCallback(()=>{i.mutate({})},[i]),S=o.useCallback(async t=>{c(t),n(null),a(void 0),r(void 0),d({format:t.name.endsWith(".tar.gz")||t.name.endsWith(".gz")?"semiont-linked-data":"unknown",version:1,sourceUrl:"",stats:{}})},[]),E=o.useCallback(()=>{s&&(n("started"),a(void 0),r(void 0),l.mutate({file:s,onProgress:t=>{n(t.phase),a(t.message),t.result&&r(t.result)}}))},[s,l]),L=o.useCallback(()=>{c(null),d(null),n(null),a(void 0),r(void 0)},[]);return w.jsx(B,{onExport:k,isExporting:i.isPending,onFileSelected:S,onImport:E,onCancelImport:L,selectedFile:s,preview:v,isImporting:l.isPending,importPhase:I,importMessage:T,importResult:P,theme:b,showLineNumbers:C,activePanel:g,translations:{title:e("title"),subtitle:e("subtitle"),export:{title:e("exportTitle"),description:e("exportDescription"),exportButton:e("exportButton"),exporting:e("exporting")},import:{title:e("importTitle"),description:e("importDescription"),dropzoneLabel:e("dropzoneLabel"),dropzoneActive:e("dropzoneActive"),detectedFormat:e("detectedFormat"),statsPreview:e("statsPreview"),importButton:e("importButton"),importing:e("importing"),importConfirmTitle:e("importConfirmTitle"),importConfirmMessage:e("importConfirmMessage"),confirmImport:e("confirmImport"),cancelImport:e("cancelImport")},progress:{phaseStarted:e("phaseStarted"),phaseEntityTypes:e("phaseEntityTypes"),phaseResources:e("phaseResources"),phaseAnnotations:e("phaseAnnotations"),phaseComplete:e("phaseComplete"),phaseError:e("phaseError"),hashChainValid:e("hashChainValid"),hashChainInvalid:e("hashChainInvalid"),streams:e("streams"),events:e("events"),blobs:e("blobs")}},ToolbarPanels:N,Toolbar:R})}export{Q as default};
2
+ //# sourceMappingURL=client-DZ-DNAU-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-BZBaSaZ0.js","sources":["../../src/app/[locale]/moderate/linked-data/client.tsx"],"sourcesContent":["/**\n * Linked Data Client - Thin Next.js wrapper\n *\n * Handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React LinkedDataPage component.\n */\n\nimport React, { useState, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useModeration, Toolbar } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, usePanelBrowse, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { LinkedDataPage } from '@semiont/react-ui';\nimport type { ImportPreview } from '@semiont/react-ui';\n\nexport default function LinkedDataClient() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`ModerationLinkedData.${k}`, p as any) as string;\n\n // Toolbar and settings state\n const { activePanel } = usePanelBrowse();\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n // API hooks\n const moderationAPI = useModeration();\n const exportMutation = moderationAPI.exchange.export.useMutation();\n const importMutation = moderationAPI.exchange.import.useMutation();\n\n // Local state\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [preview, setPreview] = useState<ImportPreview | null>(null);\n const [importPhase, setImportPhase] = useState<string | null>(null);\n const [importMessage, setImportMessage] = useState<string | undefined>();\n const [importResult, setImportResult] = useState<Record<string, unknown> | undefined>();\n\n const handleExport = useCallback(() => {\n exportMutation.mutate({});\n }, [exportMutation]);\n\n const handleFileSelected = useCallback(async (file: File) => {\n setSelectedFile(file);\n setImportPhase(null);\n setImportMessage(undefined);\n setImportResult(undefined);\n\n setPreview({\n format: file.name.endsWith('.tar.gz') || file.name.endsWith('.gz') ? 'semiont-linked-data' : 'unknown',\n version: 1,\n sourceUrl: '',\n stats: {},\n });\n }, []);\n\n const handleImport = useCallback(() => {\n if (!selectedFile) return;\n\n setImportPhase('started');\n setImportMessage(undefined);\n setImportResult(undefined);\n\n importMutation.mutate({\n file: selectedFile,\n onProgress: (event) => {\n setImportPhase(event.phase);\n setImportMessage(event.message);\n if (event.result) {\n setImportResult(event.result);\n }\n },\n });\n }, [selectedFile, importMutation]);\n\n const handleCancelImport = useCallback(() => {\n setSelectedFile(null);\n setPreview(null);\n setImportPhase(null);\n setImportMessage(undefined);\n setImportResult(undefined);\n }, []);\n\n return (\n <LinkedDataPage\n onExport={handleExport}\n isExporting={exportMutation.isPending}\n onFileSelected={handleFileSelected}\n onImport={handleImport}\n onCancelImport={handleCancelImport}\n selectedFile={selectedFile}\n preview={preview}\n isImporting={importMutation.isPending}\n importPhase={importPhase}\n importMessage={importMessage}\n importResult={importResult}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n export: {\n title: t('exportTitle'),\n description: t('exportDescription'),\n exportButton: t('exportButton'),\n exporting: t('exporting'),\n },\n import: {\n title: t('importTitle'),\n description: t('importDescription'),\n dropzoneLabel: t('dropzoneLabel'),\n dropzoneActive: t('dropzoneActive'),\n detectedFormat: t('detectedFormat'),\n statsPreview: t('statsPreview'),\n importButton: t('importButton'),\n importing: t('importing'),\n importConfirmTitle: t('importConfirmTitle'),\n importConfirmMessage: t('importConfirmMessage'),\n confirmImport: t('confirmImport'),\n cancelImport: t('cancelImport'),\n },\n progress: {\n phaseStarted: t('phaseStarted'),\n phaseEntityTypes: t('phaseEntityTypes'),\n phaseResources: t('phaseResources'),\n phaseAnnotations: t('phaseAnnotations'),\n phaseComplete: t('phaseComplete'),\n phaseError: t('phaseError'),\n hashChainValid: t('hashChainValid'),\n hashChainInvalid: t('hashChainInvalid'),\n streams: t('streams'),\n events: t('events'),\n blobs: t('blobs'),\n },\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"names":["LinkedDataClient","_t","useTranslation","t","k","p","activePanel","usePanelBrowse","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","moderationAPI","useModeration","exportMutation","importMutation","selectedFile","setSelectedFile","useState","preview","setPreview","importPhase","setImportPhase","importMessage","setImportMessage","importResult","setImportResult","handleExport","handleFileSelected","file","handleImport","event","handleCancelImport","jsx","LinkedDataPage","ToolbarPanels","Toolbar"],"mappings":"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"}
1
+ {"version":3,"file":"client-DZ-DNAU-.js","sources":["../../src/app/[locale]/moderate/linked-data/client.tsx"],"sourcesContent":["/**\n * Linked Data Client - Thin Next.js wrapper\n *\n * Handles Next.js-specific concerns (translations, API calls, hooks)\n * and delegates rendering to the pure React LinkedDataPage component.\n */\n\nimport React, { useState, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useModeration, Toolbar } from '@semiont/react-ui';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\nimport { useTheme, usePanelBrowse, useLineNumbers, useEventSubscriptions } from '@semiont/react-ui';\nimport { LinkedDataPage } from '@semiont/react-ui';\nimport type { ImportPreview } from '@semiont/react-ui';\n\nexport default function LinkedDataClient() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`ModerationLinkedData.${k}`, p as any) as string;\n\n // Toolbar and settings state\n const { activePanel } = usePanelBrowse();\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n const handleThemeChanged = useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => {\n setTheme(theme);\n }, [setTheme]);\n\n const handleLineNumbersToggled = useCallback(() => {\n toggleLineNumbers();\n }, [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n // API hooks\n const moderationAPI = useModeration();\n const exportMutation = moderationAPI.exchange.export.useMutation();\n const importMutation = moderationAPI.exchange.import.useMutation();\n\n // Local state\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [preview, setPreview] = useState<ImportPreview | null>(null);\n const [importPhase, setImportPhase] = useState<string | null>(null);\n const [importMessage, setImportMessage] = useState<string | undefined>();\n const [importResult, setImportResult] = useState<Record<string, unknown> | undefined>();\n\n const handleExport = useCallback(() => {\n exportMutation.mutate({});\n }, [exportMutation]);\n\n const handleFileSelected = useCallback(async (file: File) => {\n setSelectedFile(file);\n setImportPhase(null);\n setImportMessage(undefined);\n setImportResult(undefined);\n\n setPreview({\n format: file.name.endsWith('.tar.gz') || file.name.endsWith('.gz') ? 'semiont-linked-data' : 'unknown',\n version: 1,\n sourceUrl: '',\n stats: {},\n });\n }, []);\n\n const handleImport = useCallback(() => {\n if (!selectedFile) return;\n\n setImportPhase('started');\n setImportMessage(undefined);\n setImportResult(undefined);\n\n importMutation.mutate({\n file: selectedFile,\n onProgress: (event) => {\n setImportPhase(event.phase);\n setImportMessage(event.message);\n if (event.result) {\n setImportResult(event.result);\n }\n },\n });\n }, [selectedFile, importMutation]);\n\n const handleCancelImport = useCallback(() => {\n setSelectedFile(null);\n setPreview(null);\n setImportPhase(null);\n setImportMessage(undefined);\n setImportResult(undefined);\n }, []);\n\n return (\n <LinkedDataPage\n onExport={handleExport}\n isExporting={exportMutation.isPending}\n onFileSelected={handleFileSelected}\n onImport={handleImport}\n onCancelImport={handleCancelImport}\n selectedFile={selectedFile}\n preview={preview}\n isImporting={importMutation.isPending}\n importPhase={importPhase}\n importMessage={importMessage}\n importResult={importResult}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n export: {\n title: t('exportTitle'),\n description: t('exportDescription'),\n exportButton: t('exportButton'),\n exporting: t('exporting'),\n },\n import: {\n title: t('importTitle'),\n description: t('importDescription'),\n dropzoneLabel: t('dropzoneLabel'),\n dropzoneActive: t('dropzoneActive'),\n detectedFormat: t('detectedFormat'),\n statsPreview: t('statsPreview'),\n importButton: t('importButton'),\n importing: t('importing'),\n importConfirmTitle: t('importConfirmTitle'),\n importConfirmMessage: t('importConfirmMessage'),\n confirmImport: t('confirmImport'),\n cancelImport: t('cancelImport'),\n },\n progress: {\n phaseStarted: t('phaseStarted'),\n phaseEntityTypes: t('phaseEntityTypes'),\n phaseResources: t('phaseResources'),\n phaseAnnotations: t('phaseAnnotations'),\n phaseComplete: t('phaseComplete'),\n phaseError: t('phaseError'),\n hashChainValid: t('hashChainValid'),\n hashChainInvalid: t('hashChainInvalid'),\n streams: t('streams'),\n events: t('events'),\n blobs: t('blobs'),\n },\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"names":["LinkedDataClient","_t","useTranslation","t","k","p","activePanel","usePanelBrowse","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","handleThemeChanged","useCallback","handleLineNumbersToggled","useEventSubscriptions","moderationAPI","useModeration","exportMutation","importMutation","selectedFile","setSelectedFile","useState","preview","setPreview","importPhase","setImportPhase","importMessage","setImportMessage","importResult","setImportResult","handleExport","handleFileSelected","file","handleImport","event","handleCancelImport","jsx","LinkedDataPage","ToolbarPanels","Toolbar"],"mappings":"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"}