@fgv/ts-res-ui-components 5.1.0-2 → 5.1.0-21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/common/AppHeader.d.ts.map +1 -0
- package/lib/components/common/AppHeader.js.map +1 -0
- package/lib/components/common/AppLayout.d.ts.map +1 -0
- package/lib/components/common/AppLayout.js.map +1 -0
- package/lib/components/common/AppSidebar.d.ts.map +1 -0
- package/lib/components/common/AppSidebar.js.map +1 -0
- package/lib/components/common/NavigationWarningModal.d.ts.map +1 -0
- package/lib/components/common/NavigationWarningModal.js.map +1 -0
- package/lib/components/common/QualifierContextControl.d.ts.map +1 -0
- package/lib/components/common/QualifierContextControl.js.map +1 -0
- package/lib/components/common/ResolutionContextOptionsControl.d.ts.map +1 -0
- package/lib/components/common/ResolutionContextOptionsControl.js.map +1 -0
- package/lib/components/common/ResolutionResults/index.d.ts.map +1 -0
- package/lib/components/common/ResolutionResults/index.js.map +1 -0
- package/lib/components/common/ResourceListView.d.ts.map +1 -0
- package/lib/components/common/ResourceListView.js.map +1 -0
- package/lib/components/common/ResourcePickerOptionsControl.d.ts.map +1 -0
- package/lib/components/common/ResourcePickerOptionsControl.js.map +1 -0
- package/lib/components/common/ResourceTreeView.d.ts.map +1 -0
- package/lib/components/common/ResourceTreeView.js.map +1 -0
- package/lib/components/common/SourceResourceDetail/index.d.ts.map +1 -0
- package/lib/components/common/SourceResourceDetail/index.js.map +1 -0
- package/lib/components/forms/GenericQualifierTypeEditForm.d.ts.map +1 -0
- package/lib/components/forms/GenericQualifierTypeEditForm.js.map +1 -0
- package/lib/components/forms/HierarchyEditor.d.ts.map +1 -0
- package/lib/components/forms/HierarchyEditor.js.map +1 -0
- package/lib/components/forms/QualifierEditForm.d.ts.map +1 -0
- package/lib/components/forms/QualifierEditForm.js.map +1 -0
- package/lib/components/forms/QualifierTypeEditForm.d.ts.map +1 -0
- package/lib/components/forms/QualifierTypeEditForm.js.map +1 -0
- package/lib/components/forms/ResourceTypeEditForm.d.ts.map +1 -0
- package/lib/components/forms/ResourceTypeEditForm.js.map +1 -0
- package/lib/components/forms/index.d.ts.map +1 -0
- package/lib/components/forms/index.js.map +1 -0
- package/lib/components/orchestrator/ResourceOrchestrator.d.ts.map +1 -0
- package/lib/components/orchestrator/ResourceOrchestrator.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourceItem.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourceItem.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourcePickerList.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourcePickerList.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourcePickerTree.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourcePickerTree.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/index.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/index.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/types.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/types.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/utils/treeNavigation.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/utils/treeNavigation.js.map +1 -0
- package/lib/components/views/CompiledView/index.d.ts.map +1 -0
- package/lib/components/views/CompiledView/index.js.map +1 -0
- package/lib/components/views/ConfigurationView/index.d.ts.map +1 -0
- package/lib/components/views/ConfigurationView/index.js.map +1 -0
- package/lib/components/views/FilterView/index.d.ts.map +1 -0
- package/lib/components/views/FilterView/index.js.map +1 -0
- package/lib/components/views/GridView/EditableGridCell.d.ts.map +1 -0
- package/lib/components/views/GridView/EditableGridCell.js.map +1 -0
- package/lib/components/views/GridView/GridSelector.d.ts.map +1 -0
- package/lib/components/views/GridView/GridSelector.js.map +1 -0
- package/lib/components/views/GridView/MultiGridView.d.ts.map +1 -0
- package/lib/components/views/GridView/MultiGridView.js.map +1 -0
- package/lib/components/views/GridView/ResourceGrid.d.ts.map +1 -0
- package/lib/components/views/GridView/ResourceGrid.js.map +1 -0
- package/lib/components/views/GridView/SharedContextControls.d.ts.map +1 -0
- package/lib/components/views/GridView/SharedContextControls.js.map +1 -0
- package/lib/components/views/GridView/cells/BooleanCell.d.ts.map +1 -0
- package/lib/components/views/GridView/cells/BooleanCell.js.map +1 -0
- package/lib/components/views/GridView/cells/DropdownCell.d.ts.map +1 -0
- package/lib/components/views/GridView/cells/DropdownCell.js.map +1 -0
- package/lib/components/views/GridView/cells/StringCell.d.ts.map +1 -0
- package/lib/components/views/GridView/cells/StringCell.js.map +1 -0
- package/lib/components/views/GridView/cells/TriStateCell.d.ts.map +1 -0
- package/lib/components/views/GridView/cells/TriStateCell.js.map +1 -0
- package/lib/components/views/GridView/cells/index.d.ts.map +1 -0
- package/lib/components/views/GridView/cells/index.js.map +1 -0
- package/lib/components/views/GridView/index.d.ts.map +1 -0
- package/lib/components/views/GridView/index.js.map +1 -0
- package/lib/components/views/ImportView/index.d.ts.map +1 -0
- package/lib/components/views/ImportView/index.js.map +1 -0
- package/lib/components/views/MessagesWindow/index.d.ts.map +1 -0
- package/lib/components/views/MessagesWindow/index.js.map +1 -0
- package/lib/components/views/ResolutionView/EditableJsonView.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/EditableJsonView.js.map +1 -0
- package/lib/components/views/ResolutionView/NewResourceModal.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/NewResourceModal.js.map +1 -0
- package/lib/components/views/ResolutionView/UnifiedChangeControls.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/UnifiedChangeControls.js.map +1 -0
- package/lib/components/views/ResolutionView/index.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/index.js.map +1 -0
- package/lib/components/views/SourceView/index.d.ts.map +1 -0
- package/lib/components/views/SourceView/index.js.map +1 -0
- package/lib/contexts/ObservabilityContext.d.ts.map +1 -0
- package/lib/contexts/ObservabilityContext.js.map +1 -0
- package/lib/contexts/index.d.ts.map +1 -0
- package/lib/contexts/index.js.map +1 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/index.js.map +1 -0
- package/lib/hooks/useConfigurationState.d.ts.map +1 -0
- package/lib/hooks/useConfigurationState.js.map +1 -0
- package/lib/hooks/useFilterState.d.ts.map +1 -0
- package/lib/hooks/useFilterState.js.map +1 -0
- package/lib/hooks/useNavigationWarning.d.ts.map +1 -0
- package/lib/hooks/useNavigationWarning.js.map +1 -0
- package/lib/hooks/useResolutionState.d.ts.map +1 -0
- package/lib/hooks/useResolutionState.js.map +1 -0
- package/lib/hooks/useResourceData.d.ts.map +1 -0
- package/lib/hooks/useResourceData.js.map +1 -0
- package/lib/hooks/useSmartObservability.d.ts.map +1 -0
- package/lib/hooks/useSmartObservability.js.map +1 -0
- package/lib/hooks/useUrlParams.d.ts.map +1 -0
- package/lib/hooks/useUrlParams.js.map +1 -0
- package/lib/hooks/useViewState.d.ts.map +1 -0
- package/lib/hooks/useViewState.js.map +1 -0
- package/lib/index.browser.d.ts.map +1 -0
- package/lib/index.browser.js.map +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js.map +1 -0
- package/lib/namespaces/ConfigurationTools.d.ts.map +1 -0
- package/lib/namespaces/ConfigurationTools.js.map +1 -0
- package/lib/namespaces/DownloadTools.d.ts.map +1 -0
- package/lib/namespaces/DownloadTools.js.map +1 -0
- package/lib/namespaces/FilterTools.d.ts.map +1 -0
- package/lib/namespaces/FilterTools.js.map +1 -0
- package/lib/namespaces/GridTools.d.ts.map +1 -0
- package/lib/namespaces/GridTools.js.map +1 -0
- package/lib/namespaces/ImportTools.d.ts.map +1 -0
- package/lib/namespaces/ImportTools.js.map +1 -0
- package/lib/namespaces/ObservabilityTools.d.ts.map +1 -0
- package/lib/namespaces/ObservabilityTools.js.map +1 -0
- package/lib/namespaces/PickerTools.d.ts.map +1 -0
- package/lib/namespaces/PickerTools.js.map +1 -0
- package/lib/namespaces/ResolutionTools.d.ts.map +1 -0
- package/lib/namespaces/ResolutionTools.js.map +1 -0
- package/lib/namespaces/ResourceTools.d.ts.map +1 -0
- package/lib/namespaces/ResourceTools.js.map +1 -0
- package/lib/namespaces/TsResTools.d.ts.map +1 -0
- package/lib/namespaces/TsResTools.js.map +1 -0
- package/lib/namespaces/ViewStateTools.d.ts.map +1 -0
- package/lib/namespaces/ViewStateTools.js.map +1 -0
- package/lib/namespaces/ZipTools.d.ts.map +1 -0
- package/lib/namespaces/ZipTools.js.map +1 -0
- package/lib/namespaces/index.d.ts.map +1 -0
- package/lib/namespaces/index.js.map +1 -0
- package/lib/tsdoc-metadata.json +1 -1
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js.map +1 -0
- package/lib/utils/cellValidation.d.ts.map +1 -0
- package/lib/utils/cellValidation.js.map +1 -0
- package/lib/utils/configurationUtils.d.ts.map +1 -0
- package/lib/utils/configurationUtils.js.map +1 -0
- package/lib/utils/downloadHelper.d.ts.map +1 -0
- package/lib/utils/downloadHelper.js.map +1 -0
- package/lib/utils/filterResources.d.ts.map +1 -0
- package/lib/utils/filterResources.js.map +1 -0
- package/lib/utils/observability/factories.d.ts.map +1 -0
- package/lib/utils/observability/factories.js.map +1 -0
- package/lib/utils/observability/implementations.d.ts.map +1 -0
- package/lib/utils/observability/implementations.js.map +1 -0
- package/lib/utils/observability/index.d.ts.map +1 -0
- package/lib/utils/observability/index.js.map +1 -0
- package/lib/utils/observability/interfaces.d.ts.map +1 -0
- package/lib/utils/observability/interfaces.js.map +1 -0
- package/lib/utils/resolutionEditing.d.ts.map +1 -0
- package/lib/utils/resolutionEditing.js.map +1 -0
- package/lib/utils/resolutionUtils.d.ts.map +1 -0
- package/lib/utils/resolutionUtils.js.map +1 -0
- package/lib/utils/resourceSelector.d.ts.map +1 -0
- package/lib/utils/resourceSelector.js.map +1 -0
- package/lib/utils/resourceSelectors.d.ts.map +1 -0
- package/lib/utils/resourceSelectors.js.map +1 -0
- package/lib/utils/tsResIntegration.d.ts.map +1 -0
- package/lib/utils/tsResIntegration.js.map +1 -0
- package/lib/utils/zipLoader/index.d.ts.map +1 -0
- package/lib/utils/zipLoader/index.js.map +1 -0
- package/lib/utils/zipLoader/zipProcessingHelpers.d.ts.map +1 -0
- package/lib/utils/zipLoader/zipProcessingHelpers.js.map +1 -0
- package/lib/utils/zipLoader/zipUtils.d.ts.map +1 -0
- package/lib/utils/zipLoader/zipUtils.js.map +1 -0
- package/package.json +25 -23
- package/dist/ts-res-ui-components.d.ts +0 -6795
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/views/ImportView/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useRef } from 'react';\nimport type { IObservabilityContext } from '../../../utils/observability';\nimport {\n DocumentArrowUpIcon,\n CheckCircleIcon,\n ExclamationTriangleIcon,\n ArchiveBoxIcon,\n FolderOpenIcon\n} from '@heroicons/react/24/outline';\nimport { IImportViewProps } from '../../../types';\nimport { FileTree } from '@fgv/ts-json-base';\nimport { Bundle, Config } from '@fgv/ts-res';\nimport { isZipFile } from '../../../utils/zipLoader';\nimport { useSmartObservability } from '../../../hooks/useSmartObservability';\nimport {\n supportsFileSystemAccess,\n safeShowDirectoryPicker,\n safeShowOpenFilePicker,\n FileSystemDirectoryHandle,\n isFileHandle,\n isDirectoryHandle,\n FileTreeHelpers\n} from '@fgv/ts-web-extras';\nimport { ZipFileTree } from '@fgv/ts-extras';\nimport { succeed } from '@fgv/ts-utils';\n\n/**\n * ImportView component for importing resource files, directories, and bundles.\n *\n * Provides a drag-and-drop interface for importing various resource formats including\n * individual JSON files, directory structures, ZIP archives, and pre-compiled bundles.\n * Automatically detects file types and processes them appropriately.\n *\n * **Key Features:**\n * - **Drag-and-drop import**: Simple drag-and-drop interface for file import\n * - **Multiple format support**: JSON files, directories, ZIP archives, and bundles\n * - **Auto-detection**: Automatically detects and processes different file types\n * - **Bundle processing**: Handles pre-compiled ts-res bundles\n * - **ZIP archive support**: Extracts and processes ZIP-based resource collections\n * - **Progress tracking**: Visual feedback during import operations\n * - **Error handling**: Clear error messages for unsupported or corrupted files\n *\n * @example\n * ```tsx\n * import { ImportView } from '@fgv/ts-res-ui-components';\n *\n * function MyImportTool() {\n * const handleFileImport = (fileTree) => {\n * console.log('Importing files:', fileTree);\n * };\n *\n * const handleBundleImport = (bundle) => {\n * console.log('Importing bundle:', bundle);\n * };\n *\n * const handleZipImport = (zipData, config) => {\n * console.log('Importing ZIP:', zipData, config);\n * };\n *\n * return (\n * <ImportView\n * onImport={handleFileImport}\n * onBundleImport={handleBundleImport}\n * onZipImport={handleZipImport}\n * acceptedFileTypes={['.json', '.zip']}\n * />\n * );\n * }\n * ```\n *\n * @public\n */\nexport const ImportView: React.FC<IImportViewProps> = ({\n onImport,\n onBundleImport,\n onZipImport,\n acceptedFileTypes = ['.json', '.zip'],\n className = '',\n importError\n}) => {\n // Get observability context\n const o11y = useSmartObservability();\n\n const [isLoading, setIsLoading] = useState(false);\n const [importStatus, setImportStatus] = useState<{\n hasImported: boolean;\n fileCount: number;\n isDirectory: boolean;\n isBundle: boolean;\n isZip: boolean;\n }>({\n hasImported: false,\n fileCount: 0,\n isDirectory: false,\n isBundle: false,\n isZip: false\n });\n const [error, setError] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const dirInputRef = useRef<HTMLInputElement>(null);\n\n // Helper function to process ZIP files using ZipFileTree directly\n const processZipFile = useCallback(\n async (file: File) => {\n o11y.diag.info(`[ImportView] Processing ZIP file: ${file.name}`);\n o11y.user.info(`Processing ZIP file: ${file.name}`);\n\n try {\n // Read file as ArrayBuffer\n const buffer = await file.arrayBuffer();\n\n // Create FileTree directly from ZIP buffer\n const zipAccessorsResult = ZipFileTree.ZipFileTreeAccessors.fromBuffer(buffer);\n if (zipAccessorsResult.isFailure()) {\n throw new Error(`Failed to parse ZIP: ${zipAccessorsResult.message}`);\n }\n\n const zipAccessors = zipAccessorsResult.value;\n\n // Create FileTree from ZIP accessors\n const fileTreeResult = FileTree.FileTree.create(zipAccessors);\n if (fileTreeResult.isFailure()) {\n throw new Error(`Failed to create FileTree from ZIP: ${fileTreeResult.message}`);\n }\n\n const fileTree = fileTreeResult.value;\n o11y.diag.info(`[ImportView] ZIP FileTree created successfully`);\n\n // For configuration, try to find a config file in the ZIP\n // This is optional - if no config is found, we pass undefined\n const config = fileTree\n .getFile('/config.json')\n .onFailure((message) => {\n o11y.diag.info(`[ImportView] No config.json found in ZIP:`);\n return fail(message);\n })\n .onSuccess((file) => {\n return file\n .getContents()\n .onSuccess((contents) => Config.Convert.systemConfiguration.convert(contents))\n .onSuccess((config) => {\n o11y.diag.info(`[ImportView] Found config.json in ZIP`);\n return succeed(config);\n })\n .onFailure((error) => {\n throw new Error(`Failed to convert config.json from ZIP: ${error}`);\n });\n })\n .orDefault();\n\n // Pass the FileTree and any configuration found\n if (onZipImport) {\n onZipImport(fileTree, config);\n } else {\n throw new Error('No ZIP import handler configured');\n }\n\n return { fileTree, config };\n } catch (error) {\n throw new Error(\n `Failed to process ZIP file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n [onZipImport, o11y]\n );\n\n // Handle file selection\n const handleFileSelect = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (!files || files.length === 0) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Handle single file selection - check file type first\n if (files.length === 1) {\n const file = files[0];\n\n // Check if it's a ZIP file first\n if (isZipFile(file.name)) {\n o11y.diag.info(`[ImportView] ✅ ${file.name} detected as ZIP file`);\n\n const zipData = await processZipFile(file);\n\n // Count files in the FileTree\n const fileCount = countFilesInTree(zipData.fileTree);\n\n setImportStatus({\n hasImported: true,\n fileCount,\n isDirectory: false,\n isBundle: false,\n isZip: true\n });\n\n o11y.user.success(`ZIP file processed: ${file.name} (${fileCount} files)`);\n setIsLoading(false);\n return;\n } else {\n o11y.user.info(`${file.name}: Not a ZIP file.`);\n }\n }\n\n // Use FileTreeHelpers to create FileTree from files\n const fileTreeResult = await FileTreeHelpers.fromFileList(files);\n if (fileTreeResult.isFailure()) {\n throw new Error(fileTreeResult.message);\n }\n\n const fileTree = fileTreeResult.value;\n\n // Check for bundles in the FileTree\n const bundleResult = await checkForBundleInTree(fileTree, o11y);\n\n if (bundleResult.isBundle && bundleResult.bundle) {\n o11y.diag.info(\n `[ImportView] Processing bundle file: ${bundleResult.fileName}`,\n bundleResult.bundle\n );\n\n setImportStatus({\n hasImported: true,\n fileCount: 1,\n isDirectory: false,\n isBundle: true,\n isZip: false\n });\n o11y.user.info(`Bundle file detected: ${bundleResult.fileName}`);\n if (onBundleImport) {\n o11y.diag.info(`[ImportView] Calling onBundleImport with bundle data`);\n onBundleImport(bundleResult.bundle);\n } else {\n o11y.diag.warn(`[ImportView] No bundle import handler configured`);\n }\n } else {\n const fileCount = countFilesInTree(fileTree);\n setImportStatus({\n hasImported: true,\n fileCount,\n isDirectory: false,\n isBundle: false,\n isZip: false\n });\n o11y.user.success(`Imported ${fileCount} file(s)`);\n onImport?.(fileTree);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n setError(errorMsg);\n o11y.user.error(`Import failed: ${errorMsg}`);\n } finally {\n setIsLoading(false);\n // Reset input\n if (event.target) {\n event.target.value = '';\n }\n }\n },\n [onImport, onBundleImport, o11y]\n );\n\n // Handle directory selection\n const handleDirectorySelect = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (!files || files.length === 0) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Use FileTreeHelpers for directory upload\n const fileTreeResult = await FileTreeHelpers.fromDirectoryUpload(files);\n if (fileTreeResult.isFailure()) {\n throw new Error(fileTreeResult.message);\n }\n\n const fileTree = fileTreeResult.value;\n const fileCount = countFilesInTree(fileTree);\n\n setImportStatus({\n hasImported: true,\n fileCount,\n isDirectory: true,\n isBundle: false,\n isZip: false\n });\n\n o11y.user.success(`Imported directory with ${fileCount} file(s)`);\n onImport?.(fileTree);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n setError(errorMsg);\n o11y.user.error(`Directory import failed: ${errorMsg}`);\n } finally {\n setIsLoading(false);\n // Reset input\n if (event.target) {\n event.target.value = '';\n }\n }\n },\n [onImport, o11y]\n );\n\n // Modern File System Access API handlers\n const handleModernDirectoryPick = useCallback(async () => {\n if (!supportsFileSystemAccess(window)) {\n o11y.user.error('Directory picker not supported in this browser');\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const dirHandle = await safeShowDirectoryPicker(window);\n\n if (!dirHandle) {\n setIsLoading(false);\n return;\n }\n\n // Create FileTree from directory handle using readDirectoryFromInput\n // For now, we'll need to convert the directory handle to files\n // This is a limitation of the current FileTree integration\n const files: File[] = [];\n\n async function collectFiles(dirHandle: FileSystemDirectoryHandle, path: string = ''): Promise<void> {\n for await (const [name, handle] of dirHandle.entries()) {\n if (isFileHandle(handle)) {\n const file = await handle.getFile();\n // Add path information\n Object.defineProperty(file, 'webkitRelativePath', {\n value: path ? `${path}/${name}` : name,\n writable: false\n });\n files.push(file);\n } else if (isDirectoryHandle(handle)) {\n await collectFiles(handle, path ? `${path}/${name}` : name);\n }\n }\n }\n\n await collectFiles(dirHandle);\n\n // Convert File array to FileList-like object and create FileTree\n const fileList = createFileListFromArray(files);\n const fileTreeResult = await FileTreeHelpers.fromDirectoryUpload(fileList);\n if (fileTreeResult.isFailure()) {\n throw new Error(fileTreeResult.message);\n }\n\n const fileTree = fileTreeResult.value;\n const fileCount = countFilesInTree(fileTree);\n\n setImportStatus({\n hasImported: true,\n fileCount,\n isDirectory: true,\n isBundle: false,\n isZip: false\n });\n\n o11y.user.success(`Imported directory \"${dirHandle.name}\" with ${fileCount} file(s)`);\n onImport?.(fileTree);\n } catch (err: unknown) {\n if (!(err instanceof Error && err.name === 'AbortError')) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n setError(errorMsg);\n o11y.user.error(`Directory import failed: ${errorMsg}`);\n }\n } finally {\n setIsLoading(false);\n }\n }, [onImport, o11y]);\n\n const handleModernFilePick = useCallback(async () => {\n if (!supportsFileSystemAccess(window)) {\n o11y.user.error('File picker not supported in this browser');\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const fileHandles = await safeShowOpenFilePicker(window, {\n multiple: true,\n types: [\n {\n description: 'Resource files',\n accept: {\n 'application/json': ['.json'],\n 'application/zip': ['.zip']\n }\n }\n ]\n });\n\n if (!fileHandles) {\n setIsLoading(false);\n return;\n }\n\n // Check if we have a single ZIP file first\n if (fileHandles.length === 1) {\n const file = await fileHandles[0].getFile();\n\n if (isZipFile(file.name)) {\n o11y.diag.info(`[ImportView] Modern API - ✅ ${file.name} detected as ZIP file`);\n\n const zipData = await processZipFile(file);\n\n const fileCount = countFilesInTree(zipData.fileTree);\n\n setImportStatus({\n hasImported: true,\n fileCount,\n isDirectory: false,\n isBundle: false,\n isZip: true\n });\n\n o11y.user.success(`ZIP file processed: ${file.name} (${fileCount} files)`);\n setIsLoading(false);\n return;\n }\n }\n\n // Filter out ZIP files from multi-file selection\n const nonZipHandles = [];\n for (const fileHandle of fileHandles) {\n const file = await fileHandle.getFile();\n if (isZipFile(file.name)) {\n o11y.user.warn(`Skipping ZIP file ${file.name} - select it individually to import`);\n continue;\n }\n nonZipHandles.push(fileHandle);\n }\n\n if (nonZipHandles.length === 0) {\n setIsLoading(false);\n return;\n }\n\n // Convert file handles to FileList for processing\n const files: File[] = [];\n for (const fileHandle of nonZipHandles) {\n const file = await fileHandle.getFile();\n files.push(file);\n }\n\n // Convert File array to FileList-like object and create FileTree\n const fileList = createFileListFromArray(files);\n const fileTreeResult = await FileTreeHelpers.fromFileList(fileList);\n if (fileTreeResult.isFailure()) {\n throw new Error(fileTreeResult.message);\n }\n\n const fileTree = fileTreeResult.value;\n\n // Check for bundles in the FileTree\n const bundleResult = await checkForBundleInTree(fileTree, o11y);\n\n if (bundleResult.isBundle && bundleResult.bundle) {\n setImportStatus({\n hasImported: true,\n fileCount: 1,\n isDirectory: false,\n isBundle: true,\n isZip: false\n });\n o11y.user.info(`Bundle file detected: ${bundleResult.fileName}`);\n if (onBundleImport) {\n onBundleImport(bundleResult.bundle);\n }\n } else {\n const fileCount = countFilesInTree(fileTree);\n setImportStatus({\n hasImported: true,\n fileCount,\n isDirectory: false,\n isBundle: false,\n isZip: false\n });\n o11y.user.success(`Imported ${fileCount} file(s)`);\n onImport?.(fileTree);\n }\n } catch (err: unknown) {\n if (!(err instanceof Error && err.name === 'AbortError')) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n setError(errorMsg);\n o11y.user.error(`File import failed: ${errorMsg}`);\n }\n } finally {\n setIsLoading(false);\n }\n }, [onImport, onBundleImport, o11y]);\n\n const handleReset = useCallback(() => {\n setImportStatus({\n hasImported: false,\n fileCount: 0,\n isDirectory: false,\n isBundle: false,\n isZip: false\n });\n setError(null);\n o11y.user.info('Import cleared');\n }, [o11y]);\n\n return (\n <div className={`p-6 ${className}`}>\n <div className=\"flex items-center space-x-3 mb-6\">\n <DocumentArrowUpIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Import Resources</h2>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Left column: Import Controls */}\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">Import Files</h3>\n\n <div className=\"space-y-4\">\n {/* API Support Status */}\n <div className=\"flex items-center space-x-2 text-sm text-gray-600\">\n {supportsFileSystemAccess(window) ? (\n <>\n <div className=\"w-2 h-2 bg-green-500 rounded-full\"></div>\n <span>Modern File System API available</span>\n </>\n ) : (\n <>\n <div className=\"w-2 h-2 bg-yellow-500 rounded-full\"></div>\n <span>Using fallback file input</span>\n </>\n )}\n </div>\n\n {/* Import Buttons */}\n <div className=\"flex flex-col space-y-3\">\n {supportsFileSystemAccess(window) ? (\n <>\n <button\n onClick={handleModernDirectoryPick}\n disabled={isLoading}\n className=\"flex items-center justify-center space-x-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <FolderOpenIcon className=\"w-5 h-5\" />\n <span>{isLoading ? 'Importing...' : 'Import Resource Directory'}</span>\n </button>\n\n <button\n onClick={handleModernFilePick}\n disabled={isLoading}\n className=\"flex items-center justify-center space-x-2 px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <DocumentArrowUpIcon className=\"w-5 h-5\" />\n <span>{isLoading ? 'Importing...' : 'Import Resource Files'}</span>\n </button>\n </>\n ) : (\n <>\n {/* Fallback inputs */}\n <input\n ref={dirInputRef}\n type=\"file\"\n {...({ webkitdirectory: '', directory: '' } as Record<string, string>)}\n multiple\n onChange={handleDirectorySelect}\n className=\"hidden\"\n />\n <button\n onClick={() => dirInputRef.current?.click()}\n disabled={isLoading}\n className=\"flex items-center justify-center space-x-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <FolderOpenIcon className=\"w-5 h-5\" />\n <span>{isLoading ? 'Importing...' : 'Import Resource Directory'}</span>\n </button>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptedFileTypes.join(',')}\n multiple\n onChange={handleFileSelect}\n className=\"hidden\"\n />\n <button\n onClick={() => fileInputRef.current?.click()}\n disabled={isLoading}\n className=\"flex items-center justify-center space-x-2 px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <DocumentArrowUpIcon className=\"w-5 h-5\" />\n <span>{isLoading ? 'Importing...' : 'Import Resource Files'}</span>\n </button>\n </>\n )}\n </div>\n\n {/* Usage Instructions */}\n <div className=\"text-sm text-gray-600 space-y-2\">\n <p className=\"font-medium\">Import Options:</p>\n <ul className=\"list-disc list-inside space-y-1 ml-2\">\n <li>\n <strong>Directory:</strong> Select a folder with ts-res resources\n </li>\n <li>\n <strong>Files:</strong> Select individual JSON resource files\n </li>\n <li>\n <strong>Bundles:</strong> Automatically detected and loaded\n </li>\n </ul>\n </div>\n </div>\n </div>\n\n {/* Right column: Status */}\n <div className=\"space-y-6\">\n {/* Import Status */}\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">Import Status</h3>\n\n <div className=\"space-y-3\">\n {/* Import Status */}\n <div className=\"flex items-center space-x-3\">\n {importStatus.hasImported ? (\n <>\n <CheckCircleIcon className=\"w-5 h-5 text-green-500\" />\n <span className=\"text-sm text-gray-900\">\n {importStatus.isBundle\n ? 'Bundle imported'\n : importStatus.isZip\n ? 'ZIP archive imported'\n : importStatus.isDirectory\n ? 'Directory imported'\n : `${importStatus.fileCount} file(s) imported`}\n </span>\n </>\n ) : (\n <>\n <div className=\"w-5 h-5 rounded-full border-2 border-gray-300\"></div>\n <span className=\"text-sm text-gray-500\">No files imported yet</span>\n </>\n )}\n </div>\n\n {/* Bundle Detection */}\n {importStatus.isBundle && (\n <div className=\"flex items-center space-x-3\">\n <ArchiveBoxIcon className=\"w-5 h-5 text-blue-500\" />\n <span className=\"text-sm text-blue-900\">Bundle file detected</span>\n </div>\n )}\n\n {/* ZIP Detection */}\n {importStatus.isZip && (\n <div className=\"flex items-center space-x-3\">\n <ArchiveBoxIcon className=\"w-5 h-5 text-purple-500\" />\n <span className=\"text-sm text-purple-900\">ZIP archive processed</span>\n </div>\n )}\n </div>\n\n {/* Reset Button */}\n {importStatus.hasImported && (\n <button\n onClick={handleReset}\n className=\"mt-4 px-4 py-2 text-sm bg-gray-100 text-gray-700 rounded-lg hover:bg-gray-200 transition-colors\"\n >\n Clear Import\n </button>\n )}\n </div>\n\n {/* Error Display */}\n {(error || importError) && (\n <div className=\"bg-white rounded-lg shadow-sm border border-red-200 p-6\">\n <div className=\"flex items-start space-x-2\">\n <ExclamationTriangleIcon className=\"w-5 h-5 text-red-600 mt-0.5\" />\n <div className=\"text-sm text-red-800\">\n <p className=\"font-medium\">Error</p>\n <p>{importError || error}</p>\n </div>\n </div>\n </div>\n )}\n\n {/* Success Message */}\n {importStatus.hasImported && !error && !importError && (\n <div className=\"bg-white rounded-lg shadow-sm border border-green-200 p-6\">\n <div className=\"flex items-start space-x-2\">\n <CheckCircleIcon className=\"w-5 h-5 text-green-600 mt-0.5\" />\n <div className=\"text-sm text-green-800\">\n <p className=\"font-medium\">Import Successful!</p>\n <p>\n {importStatus.isBundle\n ? 'Bundle resources are ready to browse.'\n : importStatus.isZip\n ? 'ZIP archive contents have been imported and are ready for processing.'\n : 'Resources are ready for processing.'}\n </p>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n// Helper functions\n\n/**\n * Creates a FileList-like object from a File array\n * FileList is a readonly object, so we create a compatible object\n */\nfunction createFileListFromArray(files: File[]): FileList {\n const fileList = Object.create(FileList.prototype);\n Object.defineProperty(fileList, 'length', {\n value: files.length,\n writable: false\n });\n\n files.forEach((file, index) => {\n Object.defineProperty(fileList, index, {\n value: file,\n writable: false\n });\n });\n\n // Add item method\n Object.defineProperty(fileList, 'item', {\n value: (index: number) => (index >= 0 && index < files.length ? files[index] : null),\n writable: false\n });\n\n // Add iterator support\n Object.defineProperty(fileList, Symbol.iterator, {\n value: function* () {\n for (const file of files) {\n yield file;\n }\n },\n writable: false\n });\n\n return fileList;\n}\n\nfunction countFilesInTree(fileTree: FileTree.FileTree): number {\n let count = 0;\n\n function walkTree(path: string): void {\n const itemResult = fileTree.getItem(path);\n if (itemResult.isFailure()) return;\n\n const item = itemResult.value;\n\n if (item.type === 'file') {\n count++;\n } else if (item.type === 'directory') {\n const childrenResult = item.getChildren();\n if (childrenResult.isSuccess()) {\n for (const child of childrenResult.value) {\n walkTree(child.absolutePath);\n }\n }\n }\n }\n\n // Start from root\n walkTree('/');\n return count;\n}\n\nasync function checkForBundleInTree(\n fileTree: FileTree.FileTree,\n o11y: IObservabilityContext\n): Promise<{ isBundle: boolean; bundle?: Bundle.IBundle; fileName?: string }> {\n function walkTree(path: string): { isBundle: boolean; bundle?: Bundle.IBundle; fileName?: string } {\n const itemResult = fileTree.getItem(path);\n if (itemResult.isFailure()) return { isBundle: false };\n\n const item = itemResult.value;\n\n if (item.type === 'file') {\n const contentResult = item.getRawContents();\n if (contentResult.isSuccess()) {\n const fileName = item.name;\n const content = contentResult.value;\n\n try {\n const parsedData = JSON.parse(content);\n\n o11y.diag.info(`[ImportView] Checking if ${fileName} is a bundle...`);\n\n if (Bundle.BundleUtils.isBundleFile(parsedData)) {\n o11y.diag.info(`[ImportView] ✅ ${fileName} detected as bundle file`);\n return { isBundle: true, bundle: parsedData, fileName };\n } else if (Bundle.BundleUtils.isBundleFileName(fileName)) {\n o11y.diag.warn(\n `[ImportView] ⚠️ File ${fileName} appears to be a bundle by name but content doesn't match bundle structure`\n );\n o11y.user.warn(`${fileName}: Malformed bundle file.`);\n } else {\n o11y.diag.info(`[ImportView] ❌ ${fileName} is not a bundle file`);\n }\n } catch (parseError) {\n o11y.diag.info(`[ImportView] ❌ ${fileName} failed JSON parsing:`, parseError);\n }\n }\n } else if (item.type === 'directory') {\n const childrenResult = item.getChildren();\n if (childrenResult.isSuccess()) {\n for (const child of childrenResult.value) {\n const result = walkTree(child.absolutePath);\n if (result.isBundle) {\n return result;\n }\n }\n }\n }\n\n return { isBundle: false };\n }\n\n // Start from root and return first bundle found\n return walkTree('/');\n}\n\nexport default ImportView;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/views/MessagesWindow/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAejD;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ;IACvB,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAC/C,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,kEAAkE;IAClE,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA2LzD,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/views/MessagesWindow/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,WAAW,EACX,eAAe,EACf,aAAa,EACb,eAAe,EACf,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAmC7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFG;AACH,MAAM,CAAC,MAAM,cAAc,GAAmC,CAAC,EAC7D,QAAQ,EACR,eAAe,EACf,SAAS,GAAG,EAAE,EACf,EAAE,EAAE;IACH,4BAA4B;IAC5B,MAAM,IAAI,GAAG,qBAAqB,EAAE,CAAC;IAErC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA2B,KAAK,CAAC,CAAC;IACtE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,6BAA6B;IAC7B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QACpC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YACjC,MAAM,aAAa,GAAG,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;YAClE,MAAM,aAAa,GACjB,UAAU,KAAK,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;YACxF,OAAO,aAAa,IAAI,aAAa,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAEnC,MAAM,UAAU,GAAG,CAAC,IAAU,EAAU,EAAE;QACxC,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,GAAS,EAAE;QACjC,MAAM,WAAW,GAAG,gBAAgB;aACjC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;aACzF,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,SAAS,CAAC,SAAS;aAChB,SAAS,CAAC,WAAW,CAAC;aACtB,IAAI,CAAC,GAAG,EAAE;YACT,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,UAAU,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,mDAAmD;IACnD,mDAAmD;IACnD,+BAA+B;IAC/B,iBAAiB;IACjB,IAAI;IAEJ,MAAM,cAAc,GAAG,CAAC,IAAsB,EAAsB,EAAE;QACpE,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM;gBACT,OAAO,oBAAC,qBAAqB,IAAC,SAAS,EAAC,uBAAuB,GAAG,CAAC;YACrE,KAAK,SAAS;gBACZ,OAAO,oBAAC,uBAAuB,IAAC,SAAS,EAAC,yBAAyB,GAAG,CAAC;YACzE,KAAK,OAAO;gBACV,OAAO,oBAAC,WAAW,IAAC,SAAS,EAAC,sBAAsB,GAAG,CAAC;YAC1D,KAAK,SAAS;gBACZ,OAAO,oBAAC,eAAe,IAAC,SAAS,EAAC,wBAAwB,GAAG,CAAC;YAChE;gBACE,OAAO,oBAAC,qBAAqB,IAAC,SAAS,EAAC,uBAAuB,GAAG,CAAC;QACvE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,IAAsB,EAAU,EAAE;QAC3D,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM;gBACT,OAAO,4BAA4B,CAAC;YACtC,KAAK,SAAS;gBACZ,OAAO,gCAAgC,CAAC;YAC1C,KAAK,OAAO;gBACV,OAAO,0BAA0B,CAAC;YACpC,KAAK,SAAS;gBACZ,OAAO,8BAA8B,CAAC;YACxC;gBACE,OAAO,4BAA4B,CAAC;QACxC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAE,qCAAqC,SAAS,EAAE;QAE9D,6BAAK,SAAS,EAAC,iFAAiF;YAC9F,6BAAK,SAAS,EAAC,6BAA6B;gBAC1C,gCAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,EAAE,SAAS,EAAC,+BAA+B,IAC3F,WAAW,CAAC,CAAC,CAAC,CACb,oBAAC,aAAa,IAAC,SAAS,EAAC,uBAAuB,GAAG,CACpD,CAAC,CAAC,CAAC,CACF,oBAAC,eAAe,IAAC,SAAS,EAAC,uBAAuB,GAAG,CACtD,CACM;gBACT,4BAAI,SAAS,EAAC,mCAAmC;;oBACpC,gBAAgB,CAAC,MAAM;oBACjC,QAAQ,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;wBACzE,CACD;YACN,6BAAK,SAAS,EAAC,6BAA6B;gBAC1C,gCACE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,EAC3C,SAAS,EAAC,+BAA+B,EACzC,KAAK,EAAC,iBAAiB;oBAEvB,oBAAC,UAAU,IAAC,SAAS,EAAC,uBAAuB,GAAG,CACzC;gBACT,gCACE,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,iCACT,WAAW,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,mBACpD,EAAE,EACF,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB,IAExD,WAAW,CAAC,CAAC,CAAC,CACb,oBAAC,SAAS,IAAC,SAAS,EAAC,wBAAwB,GAAG,CACjD,CAAC,CAAC,CAAC,CACF,oBAAC,qBAAqB,IAAC,SAAS,EAAC,uBAAuB,GAAG,CAC5D,CACM;gBACT,gCACE,OAAO,EAAE,eAAe,EACxB,SAAS,EAAC,+EAA+E,gBAGlF,CACL,CACF;QAGL,CAAC,WAAW,IAAI,WAAW,IAAI,CAC9B,6BAAK,SAAS,EAAC,0DAA0D;YAEvE,6BAAK,SAAS,EAAC,UAAU;gBACvB,oBAAC,mBAAmB,IAAC,SAAS,EAAC,0EAA0E,GAAG;gBAC5G,+BACE,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,oBAAoB,EAChC,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC9C,SAAS,EAAC,4IAA4I,GACtJ,CACE;YAGN,6BAAK,SAAS,EAAC,sBAAsB,IACjC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACvE,gCACE,GAAG,EAAE,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAC9B,SAAS,EAAE,uCACT,MAAM,KAAK,IAAI;oBACb,CAAC,CAAC,2CAA2C;oBAC7C,CAAC,CAAC,yDACN,EAAE;gBAED,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrE,IAAI,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,MAAM,GAAG,CAClE,CACV,CAAC,CACE,CACF,CACP;QAGA,CAAC,WAAW,IAAI,CACf,6BAAK,SAAS,EAAC,0BAA0B,IACtC,gBAAgB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/B,6BAAK,SAAS,EAAC,uCAAuC,IACnD,UAAU,IAAI,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,aAAa,CACpF,CACP,CAAC,CAAC,CAAC,CACF,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAChC,6BACE,GAAG,EAAE,OAAO,CAAC,EAAE,EACf,SAAS,EAAE,6CAA6C,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAExF,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;YAC7B,6BAAK,SAAS,EAAC,gBAAgB;gBAC7B,2BAAG,SAAS,EAAC,uBAAuB,IAAE,OAAO,CAAC,OAAO,CAAK;gBAC1D,2BAAG,SAAS,EAAC,4BAA4B,IAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAK,CACzE,CACF,CACP,CAAC,CACH,CACG,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC","sourcesContent":["import React, { useState, useMemo } from 'react';\nimport {\n InformationCircleIcon,\n ExclamationTriangleIcon,\n XCircleIcon,\n CheckCircleIcon,\n ChevronUpIcon,\n ChevronDownIcon,\n FunnelIcon,\n DocumentDuplicateIcon,\n MagnifyingGlassIcon\n} from '@heroicons/react/24/outline';\nimport { CheckIcon } from '@heroicons/react/24/solid';\nimport { useSmartObservability } from '../../../hooks/useSmartObservability';\n\n/**\n * Message type definition for the MessagesWindow component.\n *\n * Extends the basic message structure with additional properties for enhanced\n * message management and display.\n *\n * @public\n */\nexport interface IMessage {\n /** Unique identifier for the message */\n id: string;\n /** Message type determining visual styling and filtering */\n type: 'info' | 'warning' | 'error' | 'success';\n /** The message content to display */\n message: string;\n /** Timestamp when the message was created */\n timestamp: Date;\n}\n\n/**\n * Props for the MessagesWindow component.\n *\n * @public\n */\nexport interface IMessagesWindowProps {\n /** Array of messages to display */\n messages: IMessage[];\n /** Callback fired when the user requests to clear all messages */\n onClearMessages: () => void;\n /** Optional CSS class name for the container */\n className?: string;\n}\n\n/**\n * MessagesWindow component for displaying and managing application messages.\n *\n * Provides a comprehensive interface for displaying, filtering, and managing\n * application messages with advanced features like search, filtering by type,\n * and copy functionality. Designed for use in development tools and debugging\n * interfaces where message visibility and management are critical.\n *\n * **Key Features:**\n * - **Message filtering**: Filter messages by type (info, warning, error, success)\n * - **Search functionality**: Full-text search across message content\n * - **Copy functionality**: Copy all filtered messages to clipboard\n * - **Collapsible interface**: Minimize/maximize the message window\n * - **Message count display**: Shows filtered vs total message counts\n * - **Timestamp formatting**: Human-readable timestamp display\n * - **Visual indicators**: Color-coded message types with appropriate icons\n * - **Auto-hide when empty**: Component hides automatically when no messages exist\n *\n * @example\n * ```typescript\n * import { MessagesWindow, IMessage } from '@fgv/ts-res-ui-components';\n *\n * function MyApplication() {\n * const [messages, setMessages] = useState<IMessage[]>([]);\n *\n * const addMessage = (type: IMessage['type'], text: string) => {\n * const newMessage: IMessage = {\n * id: `msg-${Date.now()}-${Math.random()}`,\n * type,\n * message: text,\n * timestamp: new Date()\n * };\n * setMessages(prev => [...prev, newMessage]);\n * };\n *\n * const clearMessages = () => {\n * setMessages([]);\n * };\n *\n * // Create component with button controls and messages window\n * return React.createElement('div', {},\n * React.createElement('div', { className: 'space-x-2 mb-4' },\n * React.createElement('button',\n * { onClick: () => addMessage('info', 'Processing started') },\n * 'Add Info'\n * ),\n * React.createElement('button',\n * { onClick: () => addMessage('success', 'Operation completed') },\n * 'Add Success'\n * )\n * ),\n * React.createElement(MessagesWindow, {\n * messages,\n * onClearMessages: clearMessages\n * })\n * );\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Basic usage with observability context\n * import { ViewStateTools, ObservabilityProvider } from '@fgv/ts-res-ui-components';\n *\n * function MyTool() {\n * const { viewState } = ViewStateTools.useViewState();\n *\n * return (\n * <div>\n * <MyComponents />\n * <MessagesWindow\n * messages={viewState.messages}\n * onClearMessages={viewState.clearMessages}\n * />\n * </div>\n * );\n * }\n * ```\n *\n * @public\n */\nexport const MessagesWindow: React.FC<IMessagesWindowProps> = ({\n messages,\n onClearMessages,\n className = ''\n}) => {\n // Get observability context\n const o11y = useSmartObservability();\n\n const [isCollapsed, setIsCollapsed] = useState(false);\n const [filter, setFilter] = useState<IMessage['type'] | 'all'>('all');\n const [searchTerm, setSearchTerm] = useState('');\n const [showFilters, setShowFilters] = useState(false);\n const [copySuccess, setCopySuccess] = useState(false);\n\n // Filter and search messages\n const filteredMessages = useMemo(() => {\n return messages.filter((message) => {\n const matchesFilter = filter === 'all' || message.type === filter;\n const matchesSearch =\n searchTerm === '' || message.message.toLowerCase().includes(searchTerm.toLowerCase());\n return matchesFilter && matchesSearch;\n });\n }, [messages, filter, searchTerm]);\n\n const formatTime = (date: Date): string => {\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });\n };\n\n const copyAllMessages = (): void => {\n const messageText = filteredMessages\n .map((msg) => `[${msg.type.toUpperCase()}] ${formatTime(msg.timestamp)} - ${msg.message}`)\n .join('\\n');\n\n navigator.clipboard\n .writeText(messageText)\n .then(() => {\n setCopySuccess(true);\n setTimeout(() => setCopySuccess(false), 2000);\n })\n .catch((err) => {\n o11y.diag.error('Failed to copy messages:', err);\n });\n };\n\n // Always show the messages window, even when empty\n // This ensures consistent UI layout and visibility\n // if (messages.length === 0) {\n // return null;\n // }\n\n const getMessageIcon = (type: IMessage['type']): React.ReactElement => {\n switch (type) {\n case 'info':\n return <InformationCircleIcon className=\"h-5 w-5 text-blue-500\" />;\n case 'warning':\n return <ExclamationTriangleIcon className=\"h-5 w-5 text-yellow-500\" />;\n case 'error':\n return <XCircleIcon className=\"h-5 w-5 text-red-500\" />;\n case 'success':\n return <CheckCircleIcon className=\"h-5 w-5 text-green-500\" />;\n default:\n return <InformationCircleIcon className=\"h-5 w-5 text-gray-500\" />;\n }\n };\n\n const getMessageBgColor = (type: IMessage['type']): string => {\n switch (type) {\n case 'info':\n return 'bg-blue-50 border-blue-200';\n case 'warning':\n return 'bg-yellow-50 border-yellow-200';\n case 'error':\n return 'bg-red-50 border-red-200';\n case 'success':\n return 'bg-green-50 border-green-200';\n default:\n return 'bg-gray-50 border-gray-200';\n }\n };\n\n return (\n <div className={`border-t border-gray-200 bg-white ${className}`}>\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-2 bg-gray-50 border-b border-gray-200\">\n <div className=\"flex items-center space-x-2\">\n <button onClick={() => setIsCollapsed(!isCollapsed)} className=\"p-1 hover:bg-gray-200 rounded\">\n {isCollapsed ? (\n <ChevronUpIcon className=\"h-4 w-4 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"h-4 w-4 text-gray-500\" />\n )}\n </button>\n <h3 className=\"text-sm font-medium text-gray-900\">\n Messages ({filteredMessages.length}\n {messages.length !== filteredMessages.length ? ` of ${messages.length}` : ''})\n </h3>\n </div>\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => setShowFilters(!showFilters)}\n className=\"p-1 hover:bg-gray-200 rounded\"\n title=\"Filter messages\"\n >\n <FunnelIcon className=\"h-4 w-4 text-gray-500\" />\n </button>\n <button\n onClick={copyAllMessages}\n className={`p-1 rounded transition-colors ${\n copySuccess ? 'bg-green-100 hover:bg-green-200' : 'hover:bg-gray-200'\n }`}\n title={copySuccess ? 'Copied!' : 'Copy filtered messages'}\n >\n {copySuccess ? (\n <CheckIcon className=\"h-4 w-4 text-green-600\" />\n ) : (\n <DocumentDuplicateIcon className=\"h-4 w-4 text-gray-500\" />\n )}\n </button>\n <button\n onClick={onClearMessages}\n className=\"text-xs text-gray-500 hover:text-gray-700 px-2 py-1 rounded hover:bg-gray-200\"\n >\n Clear All\n </button>\n </div>\n </div>\n\n {/* Filters */}\n {!isCollapsed && showFilters && (\n <div className=\"px-4 py-2 bg-gray-100 border-b border-gray-200 space-y-2\">\n {/* Search */}\n <div className=\"relative\">\n <MagnifyingGlassIcon className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400\" />\n <input\n type=\"text\"\n placeholder=\"Search messages...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"w-full pl-10 pr-3 py-1 text-xs border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n {/* Filter buttons */}\n <div className=\"flex flex-wrap gap-1\">\n {(['all', 'info', 'success', 'warning', 'error'] as const).map((type) => (\n <button\n key={type}\n onClick={() => setFilter(type)}\n className={`text-xs px-2 py-1 rounded-md border ${\n filter === type\n ? 'bg-blue-100 border-blue-300 text-blue-700'\n : 'bg-white border-gray-300 text-gray-700 hover:bg-gray-50'\n }`}\n >\n {type === 'all' ? 'All' : type.charAt(0).toUpperCase() + type.slice(1)}\n {type !== 'all' && ` (${messages.filter((m) => m.type === type).length})`}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Messages */}\n {!isCollapsed && (\n <div className=\"max-h-48 overflow-y-auto\">\n {filteredMessages.length === 0 ? (\n <div className=\"p-4 text-center text-gray-500 text-sm\">\n {searchTerm || filter !== 'all' ? 'No messages match the current filter' : 'No messages'}\n </div>\n ) : (\n filteredMessages.map((message) => (\n <div\n key={message.id}\n className={`flex items-start space-x-3 p-3 border-l-4 ${getMessageBgColor(message.type)}`}\n >\n {getMessageIcon(message.type)}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-gray-900\">{message.message}</p>\n <p className=\"text-xs text-gray-500 mt-1\">{formatTime(message.timestamp)}</p>\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default MessagesWindow;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditableJsonView.d.ts","sourceRoot":"","sources":["../../../../src/components/views/ResolutionView/EditableJsonView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAI9D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,8BAA8B;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,KAAK,IAAI,CAAC;IACxF,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsKG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CA6L7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditableJsonView.js","sourceRoot":"","sources":["../../../../src/components/views/ResolutionView/EditableJsonView.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useMemo } from 'react';\nimport { JsonEditor } from 'json-edit-react';\nimport { PencilIcon, CheckIcon, XMarkIcon } from '@heroicons/react/24/outline';\nimport { validateEditedResource } from '../../../utils/resolutionEditing';\nimport { JsonValue } from '@fgv/ts-json-base';\n\n/**\n * Props for the EditableJsonView component.\n *\n * @public\n */\nexport interface IEditableJsonViewProps {\n /** The original JSON value */\n value: JsonValue;\n /** The resource ID for tracking edits */\n resourceId: string;\n /** Whether this resource has been edited */\n isEdited?: boolean;\n /** The current edited value if any */\n editedValue?: JsonValue;\n /** Callback when the user saves an edit */\n onSave?: (resourceId: string, editedValue: JsonValue, originalValue: JsonValue) => void;\n /** Callback when the user cancels an edit */\n onCancel?: (resourceId: string) => void;\n /** Whether editing is currently disabled */\n disabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Interactive JSON editor for modifying resource values during resolution testing.\n *\n * The EditableJsonView component provides a rich JSON editing interface for modifying\n * resource values during resolution testing and analysis. It supports syntax highlighting,\n * validation, and seamless switching between view and edit modes. Changes are tracked\n * and can be applied as new resource candidates with the current resolution context.\n *\n * @example\n * ```tsx\n * import { ResolutionTools } from '@fgv/ts-res-ui-components';\n *\n * // Basic usage with resource data\n * const ResourceEditor = ({ resource }) => {\n * const [edits, setEdits] = useState({});\n *\n * const handleSave = (resourceId, editedValue, originalValue) => {\n * setEdits(prev => ({\n * ...prev,\n * [resourceId]: { editedValue, originalValue, timestamp: new Date() }\n * }));\n * };\n *\n * const handleCancel = (resourceId) => {\n * setEdits(prev => {\n * const newEdits = { ...prev };\n * delete newEdits[resourceId];\n * return newEdits;\n * });\n * };\n *\n * return (\n * <ResolutionTools.EditableJsonView\n * resourceId={resource.id}\n * value={resource.resolvedValue}\n * isEdited={edits[resource.id] !== undefined}\n * editedValue={edits[resource.id]?.editedValue}\n * onSave={handleSave}\n * onCancel={handleCancel}\n * />\n * );\n * };\n * ```\n *\n * @example\n * ```tsx\n * // Advanced usage with validation and error handling\n * const AdvancedResourceEditor = () => {\n * const [selectedResource, setSelectedResource] = useState('welcome-message');\n * const [pendingEdits, setPendingEdits] = useState({});\n * const [errors, setErrors] = useState({});\n *\n * const handleSaveEdit = async (resourceId, editedValue, originalValue) => {\n * try {\n * // Validate the edited content\n * const validation = await validateResourceValue(editedValue, resourceId);\n * if (!validation.isValid) {\n * setErrors(prev => ({ ...prev, [resourceId]: validation.errors }));\n * return;\n * }\n *\n * // Save the edit\n * setPendingEdits(prev => ({\n * ...prev,\n * [resourceId]: {\n * editedValue,\n * originalValue,\n * timestamp: new Date(),\n * metadata: { editedBy: getCurrentUser() }\n * }\n * }));\n *\n * // Clear any previous errors\n * setErrors(prev => {\n * const newErrors = { ...prev };\n * delete newErrors[resourceId];\n * return newErrors;\n * });\n *\n * showSuccess(`Changes saved for ${resourceId}`);\n * } catch (error) {\n * showError(`Failed to save changes: ${error.message}`);\n * }\n * };\n *\n * return (\n * <div className=\"resource-editor\">\n * <ResolutionTools.EditableJsonView\n * resourceId={selectedResource}\n * value={getResourceValue(selectedResource)}\n * isEdited={pendingEdits[selectedResource] !== undefined}\n * editedValue={pendingEdits[selectedResource]?.editedValue}\n * onSave={handleSaveEdit}\n * onCancel={(resourceId) => {\n * setPendingEdits(prev => {\n * const newEdits = { ...prev };\n * delete newEdits[resourceId];\n * return newEdits;\n * });\n * }}\n * disabled={isSystemLocked}\n * className=\"border-2 border-blue-200\"\n * />\n *\n * {errors[selectedResource] && (\n * <div className=\"mt-2 p-3 bg-red-50 border border-red-200 rounded\">\n * <h4 className=\"text-red-800 font-medium\">Validation Errors:</h4>\n * <ul className=\"list-disc list-inside text-red-700\">\n * {errors[selectedResource].map((error, i) => (\n * <li key={i}>{error}</li>\n * ))}\n * </ul>\n * </div>\n * )}\n * </div>\n * );\n * };\n * ```\n *\n * @example\n * ```tsx\n * // Integration with resolution workflow\n * const ResolutionWorkflow = () => {\n * const { state, actions } = useResolutionState(processedResources);\n *\n * return (\n * <div className=\"resolution-workflow\">\n * <div className=\"resource-selection\">\n * <PickerTools.ResourcePicker\n * resources={processedResources}\n * selectedResourceId={state.selectedResourceId}\n * onResourceSelect={(selection) => actions.selectResource(selection.resourceId)}\n * />\n * </div>\n *\n * {state.selectedResourceId && (\n * <div className=\"resource-editing\">\n * <ResolutionTools.EditableJsonView\n * resourceId={state.selectedResourceId}\n * value={state.resolutionResult?.composedValue}\n * isEdited={actions.hasEdit(state.selectedResourceId)}\n * editedValue={actions.getEditedValue(state.selectedResourceId)}\n * onSave={actions.saveEdit}\n * onCancel={(resourceId) => {\n * const newEdits = new Map(state.editedResources);\n * newEdits.delete(resourceId);\n * // Update state...\n * }}\n * />\n *\n * <ResolutionTools.UnifiedChangeControls\n * editCount={state.editedResources.size}\n * isApplying={state.isApplyingEdits}\n * addCount={state.pendingResources.size}\n * deleteCount={state.pendingResourceDeletions.size}\n * onApplyAll={actions.applyPendingResources}\n * onDiscardAll={() => { actions.clearEdits(); actions.discardPendingResources(); }}\n * />\n * </div>\n * )}\n * </div>\n * );\n * };\n * ```\n *\n * @public\n */\nexport const EditableJsonView: React.FC<IEditableJsonViewProps> = ({\n value,\n resourceId,\n isEdited = false,\n editedValue,\n onSave,\n onCancel,\n disabled = false,\n className = ''\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [currentEditValue, setCurrentEditValue] = useState<unknown>(null);\n const [validationErrors, setValidationErrors] = useState<string[]>([]);\n\n // The display value is either the edited value or the original value\n const displayValue = useMemo(() => {\n if (isEdited && editedValue !== undefined) {\n return editedValue;\n }\n return value;\n }, [value, editedValue, isEdited]);\n\n // Handle starting an edit\n const handleStartEdit = useCallback(() => {\n if (disabled) return;\n setCurrentEditValue(displayValue);\n setIsEditing(true);\n setValidationErrors([]);\n }, [displayValue, disabled]);\n\n // Handle canceling an edit\n const handleCancelEdit = useCallback(() => {\n setIsEditing(false);\n setCurrentEditValue(null);\n setValidationErrors([]);\n onCancel?.(resourceId);\n }, [resourceId, onCancel]);\n\n // Handle saving an edit\n const handleSaveEdit = useCallback(() => {\n if (!onSave || currentEditValue === null) return;\n\n // Validate the edited value\n const validation = validateEditedResource(currentEditValue as JsonValue);\n if (!validation.isValid) {\n setValidationErrors(validation.errors);\n return;\n }\n\n // Save the edit\n onSave(resourceId, currentEditValue as JsonValue, value);\n setIsEditing(false);\n setCurrentEditValue(null);\n setValidationErrors([]);\n }, [resourceId, currentEditValue, value, onSave]);\n\n // Handle changes in the JSON editor\n const handleJsonChange = useCallback(\n (newValue: unknown) => {\n setCurrentEditValue(newValue);\n\n // Clear validation errors when user starts typing\n if (validationErrors.length > 0) {\n setValidationErrors([]);\n }\n },\n [validationErrors]\n );\n\n // JSON editor configuration\n const jsonEditConfig = useMemo(\n () => ({\n minHeight: '200px',\n maxHeight: '400px',\n style: {\n container: {\n backgroundColor: '#f9fafb',\n border: '1px solid #d1d5db',\n borderRadius: '0.375rem',\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace'\n },\n key: {\n color: '#1f2937',\n fontWeight: '500'\n },\n string: {\n color: '#059669'\n },\n number: {\n color: '#dc2626'\n },\n boolean: {\n color: '#7c3aed'\n },\n null: {\n color: '#6b7280'\n }\n },\n enableHighlight: true,\n enableClipboard: true\n }),\n []\n );\n\n return (\n <div className={`bg-white rounded-lg border ${className}`}>\n {/* Header with edit controls */}\n <div className=\"flex items-center justify-between p-3 border-b bg-gray-50\">\n <div className=\"flex items-center space-x-2\">\n <h4 className=\"text-sm font-semibold text-gray-900\">Resource Content</h4>\n {isEdited && (\n <span className=\"inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-blue-100 text-blue-800\">\n Edited\n </span>\n )}\n </div>\n\n {!isEditing && (\n <button\n onClick={handleStartEdit}\n disabled={disabled}\n className=\"inline-flex items-center px-3 py-1.5 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Edit resource content\"\n >\n <PencilIcon className=\"h-4 w-4 mr-1\" />\n Edit\n </button>\n )}\n\n {isEditing && (\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={handleSaveEdit}\n disabled={validationErrors.length > 0}\n className=\"inline-flex items-center px-3 py-1.5 text-sm font-medium text-white bg-green-600 border border-transparent rounded-md hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Save changes\"\n >\n <CheckIcon className=\"h-4 w-4 mr-1\" />\n Save\n </button>\n <button\n onClick={handleCancelEdit}\n className=\"inline-flex items-center px-3 py-1.5 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n title=\"Cancel changes\"\n >\n <XMarkIcon className=\"h-4 w-4 mr-1\" />\n Cancel\n </button>\n </div>\n )}\n </div>\n\n {/* Validation errors */}\n {validationErrors.length > 0 && (\n <div className=\"p-3 border-b bg-red-50\">\n <div className=\"text-sm text-red-800\">\n <p className=\"font-medium mb-1\">Validation Errors:</p>\n <ul className=\"list-disc list-inside space-y-1\">\n {validationErrors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n </div>\n )}\n\n {/* JSON content */}\n <div className=\"p-3\">\n {isEditing ? (\n <JsonEditor data={currentEditValue} setData={handleJsonChange} {...jsonEditConfig} />\n ) : (\n <pre className=\"text-sm font-mono text-gray-800 bg-gray-50 p-3 rounded border overflow-x-auto whitespace-pre-wrap\">\n {JSON.stringify(displayValue, null, 2)}\n </pre>\n )}\n </div>\n\n {/* Help text */}\n {isEditing && (\n <div className=\"px-3 pb-3\">\n <p className=\"text-xs text-gray-500\">\n Edit the JSON content above. Changes will be saved as a new candidate with the current resolution\n context.\n </p>\n </div>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewResourceModal.d.ts","sourceRoot":"","sources":["../../../../src/components/views/ResolutionView/NewResourceModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,aAAa,CAAC,aAAa,EAAE,CAAC;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,oBAAoB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAsI7D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewResourceModal.js","sourceRoot":"","sources":["../../../../src/components/views/ResolutionView/NewResourceModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { XMarkIcon } from '@heroicons/react/24/outline';\nimport { ResourceTypes } from '@fgv/ts-res';\n\ninterface INewResourceModalProps {\n isOpen: boolean;\n onClose: () => void;\n resourceId: string;\n resourceType: string;\n availableResourceTypes: ResourceTypes.IResourceType[];\n isValid: boolean;\n defaultResourceType?: string;\n onUpdateResourceId: (id: string) => void;\n onSelectResourceType: (type: string) => void;\n onSave: () => void;\n}\n\n/**\n * Modal dialog for creating new resources with type selection and ID input.\n * Supports host-controlled resource types that hide the type selector.\n */\nexport const NewResourceModal: React.FC<INewResourceModalProps> = ({\n isOpen,\n onClose,\n resourceId,\n resourceType,\n availableResourceTypes,\n isValid,\n defaultResourceType,\n onUpdateResourceId,\n onSelectResourceType,\n onSave\n}) => {\n const [localResourceId, setLocalResourceId] = useState(resourceId);\n\n useEffect(() => {\n setLocalResourceId(resourceId);\n }, [resourceId]);\n\n if (!isOpen) return null;\n\n const handleIdChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n const newId = e.target.value;\n setLocalResourceId(newId);\n onUpdateResourceId(newId);\n };\n\n const handleSave = (): void => {\n if (isValid) {\n onSave();\n onClose();\n }\n };\n\n const showTypeSelector = !defaultResourceType;\n\n return (\n <div className=\"fixed inset-0 z-50 overflow-y-auto\">\n <div className=\"flex min-h-screen items-center justify-center p-4\">\n <div className=\"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity\" onClick={onClose} />\n\n <div className=\"relative transform overflow-hidden rounded-lg bg-white shadow-xl transition-all sm:w-full sm:max-w-lg\">\n <div className=\"bg-white px-6 pb-4 pt-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-gray-900\">Create New Resource</h3>\n <button onClick={onClose} className=\"text-gray-400 hover:text-gray-500 focus:outline-none\">\n <XMarkIcon className=\"h-6 w-6\" />\n </button>\n </div>\n\n <div className=\"space-y-4\">\n {/* Resource ID Input */}\n <div>\n <label htmlFor=\"resource-id\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n Resource ID <span className=\"text-red-500\">*</span>\n </label>\n <input\n id=\"resource-id\"\n type=\"text\"\n value={localResourceId}\n onChange={handleIdChange}\n placeholder=\"Enter unique resource ID\"\n className={`w-full px-3 py-2 border rounded-md focus:outline-none focus:ring-2 ${\n isValid ? 'border-gray-300 focus:ring-blue-500' : 'border-red-300 focus:ring-red-500'\n }`}\n />\n {!isValid && localResourceId && (\n <p className=\"mt-1 text-sm text-red-600\">Resource ID must be unique and non-empty</p>\n )}\n </div>\n\n {/* Resource Type Selector */}\n {showTypeSelector ? (\n <div>\n <label htmlFor=\"resource-type\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n Resource Type\n </label>\n <select\n id=\"resource-type\"\n value={resourceType}\n onChange={(e) => onSelectResourceType(e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {availableResourceTypes.map((type) => (\n <option key={type.key} value={type.key}>\n {type.key}\n </option>\n ))}\n </select>\n </div>\n ) : (\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Resource Type</label>\n <div className=\"px-3 py-2 bg-gray-100 border border-gray-300 rounded-md text-gray-700\">\n {defaultResourceType}\n <span className=\"text-xs text-gray-500 ml-2\">(Host-controlled)</span>\n </div>\n </div>\n )}\n\n {/* Template Preview */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Template Preview</label>\n <div className=\"p-3 bg-gray-50 border border-gray-200 rounded-md\">\n <pre className=\"text-xs text-gray-600 overflow-x-auto\">\n {JSON.stringify({ id: localResourceId, type: resourceType }, null, 2)}\n </pre>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"bg-gray-50 px-6 py-3 flex justify-end space-x-3\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-500\"\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={!isValid}\n className={`px-4 py-2 text-sm font-medium text-white rounded-md focus:outline-none focus:ring-2 ${\n isValid\n ? 'bg-blue-600 hover:bg-blue-700 focus:ring-blue-500'\n : 'bg-gray-400 cursor-not-allowed'\n }`}\n >\n Add as Pending\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default NewResourceModal;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnifiedChangeControls.d.ts","sourceRoot":"","sources":["../../../../src/components/views/ResolutionView/UnifiedChangeControls.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC;;;;;;;;;GASG;AACH,UAAU,2BAA2B;IACnC,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACvC,gEAAgE;IAChE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CA2GvE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnifiedChangeControls.js","sourceRoot":"","sources":["../../../../src/components/views/ResolutionView/UnifiedChangeControls.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\nimport { CheckIcon, XMarkIcon, ArrowPathIcon } from '@heroicons/react/24/outline';\n\n/**\n * Unified control bar that summarizes all pending changes (edits, additions, deletions)\n * and provides a single Apply/Discard action.\n *\n * Renders chips for the counts of pending edits, additions, and deletions. The Apply button\n * should commit all pending changes atomically (via a system rebuild), and Discard clears all\n * pending change buffers. This replaces older separate controls for edits and resource creation.\n *\n * @public\n */\ninterface IUnifiedChangeControlsProps {\n /** Number of pending edits to existing resources */\n editCount: number;\n /** Number of pending new resources to be added */\n addCount: number;\n /** Number of resources marked for deletion */\n deleteCount: number;\n /** Whether an apply operation is in progress (shows spinner and disables buttons) */\n isApplying?: boolean;\n /** Disable all actions (e.g., when no resolver/context is active) */\n disabled?: boolean;\n /** Optional CSS class names to attach to the container */\n className?: string;\n /** Apply all pending changes in one step (typically triggers rebuild) */\n onApplyAll: () => Promise<void> | void;\n /** Discard all pending changes (edits, additions, deletions) */\n onDiscardAll: () => void;\n}\n\n/**\n * Unified change controls for ResolutionView.\n *\n * @example\n * ```tsx\n * <UnifiedChangeControls\n * editCount={state.editedResources.size}\n * addCount={state.pendingResources.size}\n * deleteCount={state.pendingResourceDeletions.size}\n * isApplying={state.isApplyingEdits}\n * disabled={!state.currentResolver}\n * onApplyAll={actions.applyPendingResources}\n * onDiscardAll={() => {\n * actions.discardEdits();\n * actions.discardPendingResources();\n * }}\n * />\n * ```\n *\n * @public\n */\nexport const UnifiedChangeControls: React.FC<IUnifiedChangeControlsProps> = ({\n editCount,\n addCount,\n deleteCount,\n isApplying = false,\n disabled = false,\n className = '',\n onApplyAll,\n onDiscardAll\n}) => {\n const totalChanges = editCount + addCount + deleteCount;\n const hasChanges = totalChanges > 0;\n const [confirmDiscard, setConfirmDiscard] = useState(false);\n\n if (!hasChanges && !isApplying) {\n return null;\n }\n\n return (\n <div className={`bg-white rounded-lg border border-gray-200 shadow-sm ${className}`}>\n <div className=\"p-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center space-x-2\">\n <h3 className=\"text-lg font-semibold text-gray-900\">Pending Changes</h3>\n {editCount > 0 && (\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-blue-100 text-blue-800\">\n {editCount} edit{editCount !== 1 ? 's' : ''}\n </span>\n )}\n {addCount > 0 && (\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-green-100 text-green-800\">\n {addCount} addition{addCount !== 1 ? 's' : ''}\n </span>\n )}\n {deleteCount > 0 && (\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-red-100 text-red-800\">\n {deleteCount} deletion{deleteCount !== 1 ? 's' : ''}\n </span>\n )}\n </div>\n\n {isApplying && (\n <div className=\"flex items-center text-blue-600\">\n <ArrowPathIcon className=\"h-4 w-4 mr-1 animate-spin\" />\n <span className=\"text-sm font-medium\">Applying...</span>\n </div>\n )}\n </div>\n\n {!confirmDiscard ? (\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => onApplyAll()}\n disabled={disabled || isApplying || !hasChanges}\n className=\"inline-flex items-center px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Apply all pending changes\"\n >\n {isApplying ? (\n <>\n <ArrowPathIcon className=\"h-4 w-4 mr-2 animate-spin\" />\n Applying...\n </>\n ) : (\n <>\n <CheckIcon className=\"h-4 w-4 mr-2\" />\n Apply Changes\n </>\n )}\n </button>\n\n <button\n onClick={() => setConfirmDiscard(true)}\n disabled={disabled || isApplying || !hasChanges}\n className=\"inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Discard all pending changes\"\n >\n <XMarkIcon className=\"h-4 w-4 mr-2\" />\n Discard Changes\n </button>\n </div>\n ) : (\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-3\">\n <div className=\"text-sm text-yellow-800 mb-2\">\n Discard all pending changes? This cannot be undone.\n </div>\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => {\n onDiscardAll();\n setConfirmDiscard(false);\n }}\n className=\"inline-flex items-center px-3 py-1.5 text-sm font-medium text-white bg-red-600 border border-transparent rounded hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500\"\n >\n <XMarkIcon className=\"h-4 w-4 mr-1\" /> Yes, Discard\n </button>\n <button\n onClick={() => setConfirmDiscard(false)}\n className=\"inline-flex items-center px-3 py-1.5 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default UnifiedChangeControls;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/views/ResolutionView/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAE,oBAAoB,EAA6C,MAAM,gBAAgB,CAAC;AAgBjG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAwpBzD,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/views/ResolutionView/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useMemo, useCallback, useEffect, useRef } from 'react';\nimport { MagnifyingGlassIcon, CubeIcon, PlusIcon } from '@heroicons/react/24/outline';\nimport { IResolutionViewProps, ICandidateInfo, IResolutionContextOptions } from '../../../types';\nimport { QualifierContextControl } from '../../common/QualifierContextControl';\nimport { UnifiedChangeControls } from './UnifiedChangeControls';\nimport { ResourcePicker } from '../../pickers/ResourcePicker';\nimport {\n IResourceSelection,\n IResourceAnnotations,\n IResourcePickerOptions,\n IPendingResource\n} from '../../pickers/ResourcePicker/types';\nimport { ResourcePickerOptionsControl } from '../../common/ResourcePickerOptionsControl';\nimport { ResolutionContextOptionsControl } from '../../common/ResolutionContextOptionsControl';\nimport { ResolutionResults } from '../../common/ResolutionResults';\nimport { NewResourceModal } from './NewResourceModal';\nimport { useSmartObservability } from '../../../hooks/useSmartObservability';\n\n/**\n * ResolutionView component for resource resolution testing and editing.\n *\n * Provides a comprehensive interface for testing resource resolution with different\n * qualifier contexts, viewing resolution results, and editing resource values with\n * custom editors. Supports real-time resolution testing and conflict detection.\n *\n * **Key Features:**\n * - **Context management**: Set and update resolution context (qualifier values)\n * - **Real-time resolution**: See how resources resolve with current context\n * - **Resource editing**: Edit resource values with custom type-specific editors\n * - **Conflict detection**: Detect when edits would conflict with existing resources\n * - **Preview mode**: See how edits affect resolution without committing changes\n * - **Custom editors**: Support for type-specific resource editors via factory pattern\n * - **Fallback editing**: JSON editor fallback when custom editors aren't available\n *\n * @example\n * ```tsx\n * import { ResolutionView } from '@fgv/ts-res-ui-components';\n *\n * // Custom editor factory for specific resource types\n * const editorFactory = {\n * createEditor: (resourceId, resourceType, value) => {\n * if (resourceType === 'market-info') {\n * return {\n * success: true,\n * editor: MarketInfoEditor\n * };\n * }\n * return { success: false };\n * }\n * };\n *\n * function MyResolutionTool() {\n * return (\n * <ResolutionView\n * resources={processedResources}\n * resolutionState={resolutionState}\n * resolutionActions={resolutionActions}\n * availableQualifiers={['language', 'territory', 'platform']}\n * resourceEditorFactory={editorFactory}\n * />\n * );\n * }\n * ```\n *\n * @public\n */\nexport const ResolutionView: React.FC<IResolutionViewProps> = ({\n resources,\n filterState,\n filterResult,\n resolutionState,\n resolutionActions,\n availableQualifiers = [],\n resourceEditorFactory,\n pickerOptions,\n pickerOptionsPanelPresentation = 'hidden',\n contextOptions,\n lockedViewMode,\n sectionTitles,\n allowResourceCreation = false,\n defaultResourceType,\n resourceTypeFactory,\n onPendingResourcesApplied,\n showPendingResourcesInList = true,\n className = ''\n}) => {\n // Get smart observability context (auto-detects and upgrades as needed)\n const o11y = useSmartObservability();\n // State for picker options control\n const [currentPickerOptions, setCurrentPickerOptions] = useState<IResourcePickerOptions>(\n (pickerOptions ?? {}) as IResourcePickerOptions\n );\n\n // State for context options control\n const [currentContextOptions, setCurrentContextOptions] = useState<IResolutionContextOptions>(\n contextOptions || {}\n );\n\n // State for new resource modal\n const [showNewResourceModal, setShowNewResourceModal] = useState(false);\n\n // Local toggles for editing/creation features (controllable via options dialog)\n const [allowResourceCreationInternal, setAllowResourceCreationInternal] = useState<boolean>(\n !!allowResourceCreation\n );\n const [showPendingResourcesInListInternal, setShowPendingResourcesInListInternal] = useState<boolean>(\n !!showPendingResourcesInList\n );\n\n // Sync internal toggles when props change\n useEffect(() => {\n setAllowResourceCreationInternal(!!allowResourceCreation);\n }, [allowResourceCreation]);\n useEffect(() => {\n setShowPendingResourcesInListInternal(!!showPendingResourcesInList);\n }, [showPendingResourcesInList]);\n\n // Update currentContextOptions when contextOptions prop changes\n // This is important for host-managed values\n React.useEffect(() => {\n if (contextOptions?.hostManagedValues) {\n setCurrentContextOptions((prev) => ({\n ...prev,\n hostManagedValues: contextOptions.hostManagedValues\n }));\n }\n }, [contextOptions?.hostManagedValues]);\n\n // Use filtered resources when filtering is active and successful\n const isFilteringActive = filterState?.enabled && filterResult?.success === true;\n const baseProcessedResources = isFilteringActive ? filterResult?.processedResources : resources;\n\n // For now, just use the base processed resources directly\n // TODO: Implement merging of pending resources for display\n const activeProcessedResources = baseProcessedResources;\n\n // Merge picker options with resolution-specific defaults\n const effectivePickerOptions = useMemo(\n () => ({\n defaultView: 'list' as const,\n showViewToggle: true,\n enableSearch: true,\n searchPlaceholder: 'Search resources for resolution testing...',\n searchScope: 'all' as const,\n height: '520px',\n emptyMessage: 'No resources available for resolution testing',\n // Override with user-provided options\n ...pickerOptions,\n // Override with current picker options from control\n ...currentPickerOptions\n }),\n [pickerOptions, currentPickerOptions]\n );\n\n // Create resource annotations for resolution results and edit states\n const resourceAnnotations = useMemo(() => {\n const annotations: IResourceAnnotations = {};\n\n // Get all resource IDs (existing + pending)\n const allResourceIds = new Set<string>();\n\n if (activeProcessedResources?.summary?.resourceIds) {\n activeProcessedResources.summary.resourceIds.forEach((id) => allResourceIds.add(id));\n }\n\n // Add pending resource IDs\n if (resolutionState?.pendingResources) {\n resolutionState.pendingResources.forEach((__, id) => allResourceIds.add(id));\n }\n\n allResourceIds.forEach((resourceId) => {\n const hasEdit = resolutionActions?.hasEdit?.(resourceId);\n const isPending = resolutionState?.pendingResources?.has(resourceId);\n const isMarkedForDeletion = resolutionState?.pendingResourceDeletions?.has(resourceId);\n const isSelected = resolutionState?.selectedResourceId === resourceId;\n const hasResolutionResult = isSelected && resolutionState?.resolutionResult;\n\n // Base annotation with appropriate indicator\n let indicator = undefined;\n if (isPending) {\n indicator = {\n type: 'icon' as const,\n value: '➕',\n tooltip: 'New resource (pending)'\n };\n } else if (isMarkedForDeletion) {\n indicator = {\n type: 'icon' as const,\n value: '🗑️',\n tooltip: 'Marked for deletion'\n };\n } else if (hasEdit) {\n indicator = {\n type: 'icon' as const,\n value: '✏️',\n tooltip: 'Resource has unsaved edits'\n };\n }\n\n annotations[resourceId] = {\n indicator\n };\n\n // Add resolution result annotations for selected resource\n if (hasResolutionResult && resolutionState?.resolutionResult?.success) {\n const result = resolutionState.resolutionResult;\n\n // Show match status as badge\n if (result.bestCandidate) {\n annotations[resourceId].badge = {\n text: 'Resolved',\n variant: 'info'\n };\n } else if (result.candidateDetails) {\n const matchingCount = result.candidateDetails.filter((c: ICandidateInfo) => c.matched).length;\n const totalCount = result.candidateDetails.length;\n\n if (matchingCount === 0) {\n annotations[resourceId].badge = {\n text: 'No Match',\n variant: 'error'\n };\n } else {\n annotations[resourceId].badge = {\n text: `${matchingCount}/${totalCount}`,\n variant: 'warning'\n };\n }\n }\n\n // Add suffix with candidate count\n if (result.resource) {\n const totalCandidates = result.resource.candidates.length;\n annotations[resourceId].suffix = `${totalCandidates} candidate${totalCandidates !== 1 ? 's' : ''}`;\n }\n } else if (\n isSelected &&\n resolutionState?.resolutionResult &&\n !resolutionState.resolutionResult.success\n ) {\n // Show error state\n annotations[resourceId].badge = {\n text: 'Error',\n variant: 'error'\n };\n }\n });\n\n return annotations;\n }, [\n activeProcessedResources?.summary?.resourceIds,\n resolutionActions,\n resolutionState?.selectedResourceId,\n resolutionState?.resolutionResult,\n resolutionState?.pendingResources,\n resolutionState?.pendingResourceDeletions\n ]);\n\n // Merge context options with current options from control\n const effectiveContextOptions = useMemo(() => {\n // Deep merge to preserve hostManagedValues from contextOptions\n const merged = {\n ...contextOptions,\n ...currentContextOptions,\n // Preserve hostManagedValues from contextOptions if currentContextOptions doesn't explicitly set it\n hostManagedValues:\n currentContextOptions?.hostManagedValues !== undefined\n ? currentContextOptions.hostManagedValues\n : contextOptions?.hostManagedValues\n };\n o11y.diag.info('ResolutionView - effectiveContextOptions:', merged);\n o11y.diag.info('ResolutionView - contextOptions hostManagedValues:', contextOptions?.hostManagedValues);\n o11y.diag.info(\n 'ResolutionView - currentContextOptions hostManagedValues:',\n currentContextOptions?.hostManagedValues\n );\n o11y.diag.info('ResolutionView - final hostManagedValues:', merged.hostManagedValues);\n return merged;\n }, [contextOptions, currentContextOptions]);\n\n // Handle context value changes using the shared component's callback pattern\n const handleQualifierChange = useCallback(\n (qualifierName: string, value: string | undefined) => {\n // Don't update context if this qualifier is host-managed\n const qualifierOptions = effectiveContextOptions?.qualifierOptions?.[qualifierName];\n const isHostManaged = qualifierOptions?.hostValue !== undefined;\n\n if (!isHostManaged) {\n resolutionActions?.updateContextValue(qualifierName, value);\n }\n },\n [resolutionActions, effectiveContextOptions?.qualifierOptions]\n );\n\n // Apply host-managed values when they change\n const prevHostValuesRef = useRef<string | undefined>(undefined);\n React.useEffect(() => {\n if (!effectiveContextOptions?.hostManagedValues || !resolutionActions?.applyContext) return;\n\n const hostValuesStr = JSON.stringify(effectiveContextOptions.hostManagedValues);\n if (prevHostValuesRef.current !== hostValuesStr) {\n console.log(\n 'ResolutionView: Host values changed, applying:',\n effectiveContextOptions.hostManagedValues\n );\n prevHostValuesRef.current = hostValuesStr;\n // Pass host values to the resolution state\n resolutionActions.applyContext(effectiveContextOptions.hostManagedValues);\n }\n }, [effectiveContextOptions?.hostManagedValues, resolutionActions]);\n\n // Determine which qualifiers to show and their options\n const visibleQualifiers = useMemo(() => {\n if (!effectiveContextOptions?.qualifierOptions) {\n return availableQualifiers;\n }\n\n return availableQualifiers.filter((qualifierName) => {\n const options = effectiveContextOptions.qualifierOptions![qualifierName];\n return options?.visible !== false;\n });\n }, [availableQualifiers, effectiveContextOptions?.qualifierOptions]);\n\n // Get effective context values - contextValues already includes host values from the hook\n const effectiveContextValues = useMemo(() => {\n // contextValues from state already includes host values (it's effectiveContext from the hook)\n // Don't double-apply host values here\n return resolutionState?.contextValues || {};\n }, [resolutionState?.contextValues]);\n\n // Convert pending resources to PendingResource format for ResourcePicker\n const pendingResourcesList = useMemo<IPendingResource[]>(() => {\n const pending: IPendingResource[] = [];\n\n // Add new pending resources\n if (resolutionState?.pendingResources) {\n resolutionState.pendingResources.forEach((resource, id) => {\n pending.push({\n id,\n type: 'new',\n resourceType: resource.resourceTypeName,\n displayName: id // Use the resource ID as display name\n });\n });\n }\n\n // Add deleted resources\n if (resolutionState?.pendingResourceDeletions) {\n resolutionState.pendingResourceDeletions.forEach((id) => {\n pending.push({\n id,\n type: 'deleted',\n displayName: id\n });\n });\n }\n\n // Add edited resources\n if (resolutionState?.editedResources) {\n resolutionState.editedResources.forEach((__, id) => {\n // Only add if not already in pending as new\n if (!resolutionState.pendingResources?.has(id)) {\n pending.push({\n id,\n type: 'modified',\n displayName: id\n });\n }\n });\n }\n\n return pending;\n }, [\n resolutionState?.pendingResources,\n resolutionState?.pendingResourceDeletions,\n resolutionState?.editedResources\n ]);\n\n // Handle resource selection from ResourcePicker\n const handleResourceSelect = useCallback(\n (selection: IResourceSelection) => {\n if (selection.resourceId) {\n resolutionActions?.selectResource(selection.resourceId);\n }\n },\n [resolutionActions]\n );\n\n // Handle new resource creation\n const handleStartNewResource = useCallback(() => {\n resolutionActions?.startNewResource({ defaultTypeName: defaultResourceType });\n setShowNewResourceModal(true);\n }, [resolutionActions]);\n\n const handleCloseNewResourceModal = useCallback(() => {\n setShowNewResourceModal(false);\n resolutionActions?.cancelNewResource();\n }, [resolutionActions]);\n\n const handleApplyPendingResources = useCallback(async () => {\n await resolutionActions?.applyPendingResources();\n if (onPendingResourcesApplied && resolutionState) {\n const added = Array.from(resolutionState.pendingResources.values());\n const deleted = Array.from(resolutionState.pendingResourceDeletions);\n onPendingResourcesApplied(added, deleted);\n }\n }, [resolutionActions, resolutionState, onPendingResourcesApplied]);\n\n // Automatically set locked view mode when provided\n useEffect(() => {\n if (lockedViewMode && resolutionActions?.setViewMode) {\n resolutionActions.setViewMode(lockedViewMode);\n }\n }, [lockedViewMode, resolutionActions]);\n\n // Handle view mode change\n const handleViewModeChange = useCallback(\n (mode: 'composed' | 'best' | 'all' | 'raw') => {\n // Don't allow view mode changes when locked\n if (!lockedViewMode) {\n resolutionActions?.setViewMode(mode);\n }\n },\n [resolutionActions, lockedViewMode]\n );\n\n if (!resources) {\n return (\n <div className={`p-6 ${className}`}>\n <div className=\"flex items-center space-x-3 mb-6\">\n <MagnifyingGlassIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Resolution Viewer</h2>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-8 text-center\">\n <div className=\"max-w-2xl mx-auto\">\n <h3 className=\"text-xl font-semibold text-gray-900 mb-4\">No Resources Loaded</h3>\n <p className=\"text-gray-600 mb-6\">\n Import resources first to test resource resolution with different contexts.\n </p>\n <div className=\"bg-blue-50 rounded-lg p-4\">\n <p className=\"text-sm text-blue-800\">\n <strong>Resolution Viewer:</strong> Test how resources resolve with different qualifier\n contexts. Set context values and see which candidates match.\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`p-6 ${className}`}>\n <div className=\"flex items-center space-x-3 mb-6\">\n <MagnifyingGlassIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Resolution Viewer</h2>\n {isFilteringActive && (\n <span className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-purple-100 text-purple-800\">\n Filtered\n </span>\n )}\n </div>\n\n {/* ResourcePicker Options Control */}\n <ResourcePickerOptionsControl\n options={currentPickerOptions}\n onOptionsChange={setCurrentPickerOptions}\n presentation={pickerOptionsPanelPresentation}\n title=\"Resolution Viewer Picker Options\"\n className=\"mb-6\"\n />\n\n {/* ResolutionContext Options Control */}\n <ResolutionContextOptionsControl\n options={currentContextOptions}\n onOptionsChange={setCurrentContextOptions}\n availableQualifiers={availableQualifiers}\n presentation={pickerOptionsPanelPresentation}\n title=\"Resolution Context Options\"\n className=\"mb-6\"\n allowResourceCreation={allowResourceCreationInternal}\n onAllowResourceCreationChange={setAllowResourceCreationInternal}\n showPendingResourcesInList={showPendingResourcesInListInternal}\n onShowPendingResourcesInListChange={setShowPendingResourcesInListInternal}\n />\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n {/* Context Configuration Panel */}\n {effectiveContextOptions?.showContextControls !== false && (\n <div className=\"mb-6\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n {effectiveContextOptions?.contextPanelTitle || 'Context Configuration'}\n </h3>\n <div\n className={`bg-gray-50 rounded-lg p-4 ${effectiveContextOptions?.contextPanelClassName || ''}`}\n >\n <div className=\"mb-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3\">\n {visibleQualifiers.map((qualifierName) => {\n const qualifierOptions = effectiveContextOptions?.qualifierOptions?.[qualifierName];\n const hostManagedValue = effectiveContextOptions?.hostManagedValues?.[qualifierName];\n const globalPlaceholder =\n typeof effectiveContextOptions?.globalPlaceholder === 'function'\n ? effectiveContextOptions.globalPlaceholder(qualifierName)\n : effectiveContextOptions?.globalPlaceholder;\n\n // Merge host-managed values with qualifier options\n const mergedOptions = {\n ...qualifierOptions,\n // Host-managed values override qualifier-specific host values\n hostValue:\n hostManagedValue !== undefined ? hostManagedValue : qualifierOptions?.hostValue\n };\n\n return (\n <QualifierContextControl\n key={qualifierName}\n qualifierName={qualifierName}\n value={resolutionState?.pendingContextValues[qualifierName]}\n onChange={handleQualifierChange}\n placeholder={globalPlaceholder || `Enter ${qualifierName} value`}\n resources={activeProcessedResources}\n options={mergedOptions}\n />\n );\n })}\n </div>\n </div>\n\n {effectiveContextOptions?.showCurrentContext !== false && (\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm text-gray-600\">\n Current:{' '}\n {Object.entries(effectiveContextValues)\n .map(([key, value]) => `${key}=${value === undefined ? '(undefined)' : value}`)\n .join(', ')}\n </div>\n {effectiveContextOptions?.showContextActions !== false && (\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={() => {\n resolutionActions?.resetCache();\n o11y.user.success('Resolution cache cleared');\n }}\n className=\"px-3 py-1 text-xs font-medium text-gray-600 bg-gray-100 rounded hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-gray-500\"\n title=\"Clear resolution cache\"\n >\n Clear Cache\n </button>\n <button\n onClick={() => resolutionActions?.applyContext()}\n disabled={!resolutionState?.hasPendingChanges}\n className={`px-4 py-2 rounded-md text-sm font-medium ${\n resolutionState?.hasPendingChanges\n ? 'bg-blue-600 text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500'\n : 'bg-gray-300 text-gray-500 cursor-not-allowed'\n }`}\n >\n {resolutionState?.hasPendingChanges\n ? 'Apply Changes'\n : resolutionState?.currentResolver\n ? 'Context Applied'\n : 'Apply Context'}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Unified Change Controls - replaces separate edit/pending controls */}\n {(resolutionState?.hasUnsavedEdits || resolutionState?.hasPendingResourceChanges) && (\n <div className=\"mt-6\">\n <UnifiedChangeControls\n editCount={resolutionState?.editedResources?.size || 0}\n addCount={resolutionState?.pendingResources?.size || 0}\n deleteCount={resolutionState?.pendingResourceDeletions?.size || 0}\n isApplying={resolutionState?.isApplyingEdits}\n disabled={!resolutionState?.currentResolver}\n onApplyAll={async () => {\n await handleApplyPendingResources();\n }}\n onDiscardAll={() => {\n resolutionActions?.discardEdits?.();\n resolutionActions?.discardPendingResources?.();\n }}\n />\n </div>\n )}\n\n {/* Main Browser/Details Layout */}\n <div className=\"flex flex-col lg:flex-row gap-6 h-[600px]\">\n {/* Left side: Resource Selection */}\n <div className=\"lg:w-1/2 flex flex-col\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-gray-900\">\n {sectionTitles?.resources || 'Resources'}\n </h3>\n {allowResourceCreationInternal && (\n <button\n onClick={handleStartNewResource}\n className=\"flex items-center space-x-1 px-3 py-1.5 text-sm font-medium text-blue-600 bg-blue-50 rounded-md hover:bg-blue-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n title=\"Create a new resource\"\n >\n <PlusIcon className=\"h-4 w-4\" />\n <span>Add Resource</span>\n </button>\n )}\n </div>\n\n <div className=\"flex-1\">\n <ResourcePicker\n resources={activeProcessedResources || null}\n selectedResourceId={resolutionState?.selectedResourceId || null}\n onResourceSelect={handleResourceSelect}\n resourceAnnotations={resourceAnnotations}\n pendingResources={showPendingResourcesInListInternal ? pendingResourcesList : undefined}\n options={effectivePickerOptions}\n />\n </div>\n </div>\n\n {/* Right side: Resolution Results */}\n <div className=\"lg:w-1/2 flex flex-col\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-gray-900\">\n {sectionTitles?.results || 'Results'}\n {lockedViewMode && (\n <span className=\"ml-2 inline-flex items-center px-2 py-1 text-xs font-medium bg-blue-100 text-blue-800 rounded-full\">\n {lockedViewMode.charAt(0).toUpperCase() + lockedViewMode.slice(1)} View\n </span>\n )}\n </h3>\n {resolutionState?.selectedResourceId && !lockedViewMode && (\n <div className=\"flex space-x-2\">\n <button\n onClick={() => handleViewModeChange('composed')}\n className={`px-3 py-1 text-xs rounded ${\n resolutionState?.viewMode === 'composed'\n ? 'bg-blue-600 text-white'\n : 'bg-gray-200 text-gray-700'\n }`}\n >\n Composed\n </button>\n <button\n onClick={() => handleViewModeChange('best')}\n className={`px-3 py-1 text-xs rounded ${\n resolutionState?.viewMode === 'best'\n ? 'bg-blue-600 text-white'\n : 'bg-gray-200 text-gray-700'\n }`}\n >\n Best\n </button>\n <button\n onClick={() => handleViewModeChange('all')}\n className={`px-3 py-1 text-xs rounded ${\n resolutionState?.viewMode === 'all'\n ? 'bg-blue-600 text-white'\n : 'bg-gray-200 text-gray-700'\n }`}\n >\n All\n </button>\n <button\n onClick={() => handleViewModeChange('raw')}\n className={`px-3 py-1 text-xs rounded ${\n resolutionState?.viewMode === 'raw'\n ? 'bg-blue-600 text-white'\n : 'bg-gray-200 text-gray-700'\n }`}\n >\n Raw\n </button>\n </div>\n )}\n </div>\n\n <div className=\"flex-1 overflow-y-auto border border-gray-200 rounded-lg p-4 bg-gray-50\">\n {!resolutionState?.selectedResourceId ? (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <CubeIcon className=\"h-12 w-12 text-gray-400 mx-auto mb-4\" />\n <p className=\"text-gray-500\">Select a resource to view resolution results</p>\n </div>\n </div>\n ) : !resolutionState?.currentResolver ? (\n <div className=\"text-center text-gray-500\">\n <p>Apply a context to resolve resources</p>\n </div>\n ) : !resolutionState?.resolutionResult ? (\n <div className=\"text-center text-gray-500\">\n <p>Resolving...</p>\n </div>\n ) : (\n <ResolutionResults\n result={resolutionState.resolutionResult}\n viewMode={resolutionState.viewMode}\n contextValues={resolutionState.contextValues}\n resolutionActions={resolutionActions}\n resolutionState={resolutionState}\n resourceEditorFactory={resourceEditorFactory}\n />\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* New Resource Modal */}\n {resolutionState?.newResourceDraft && (\n <NewResourceModal\n isOpen={showNewResourceModal}\n onClose={handleCloseNewResourceModal}\n resourceId={resolutionState.newResourceDraft.resourceId}\n resourceType={resolutionState.newResourceDraft.resourceType}\n availableResourceTypes={resolutionState.availableResourceTypes}\n isValid={resolutionState.newResourceDraft.isValid}\n defaultResourceType={defaultResourceType}\n onUpdateResourceId={resolutionActions?.updateNewResourceId || (() => {})}\n onSelectResourceType={resolutionActions?.selectResourceType || (() => {})}\n onSave={resolutionActions?.saveNewResourceAsPending || (() => {})}\n />\n )}\n </div>\n );\n};\n\nexport default ResolutionView;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/views/SourceView/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAQ9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAOlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAqPjD,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/views/SourceView/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useMemo, useCallback } from 'react';\nimport {\n DocumentTextIcon,\n DocumentArrowDownIcon,\n CodeBracketIcon,\n ChevronDownIcon,\n ChevronUpIcon\n} from '@heroicons/react/24/outline';\nimport { ISourceViewProps } from '../../../types';\nimport { ResourcePicker } from '../../pickers/ResourcePicker';\nimport { IResourceSelection, IResourcePickerOptions } from '../../pickers/ResourcePicker/types';\nimport { SourceResourceDetail } from '../../common/SourceResourceDetail';\nimport { ResourcePickerOptionsControl } from '../../common/ResourcePickerOptionsControl';\nimport { useSmartObservability } from '../../../hooks/useSmartObservability';\n\n/**\n * SourceView component for browsing and managing source resource collections.\n *\n * Provides an interface for browsing source resources in their original form,\n * viewing resource details including candidates and conditions, and exporting\n * the complete source resource collection.\n *\n * **Key Features:**\n * - **Resource browsing**: Navigate through all resources with search and filtering\n * - **Detailed resource view**: See resource structure, candidates, conditions, and values\n * - **Export functionality**: Export the complete source resource collection as JSON\n * - **Source-specific details**: View resources in their original source form\n * - **Candidate analysis**: Examine resource candidates and their conditions\n *\n * @example\n * ```tsx\n * import { SourceView } from '@fgv/ts-res-ui-components';\n *\n * function MySourceBrowser() {\n * const handleExport = () => {\n * // Export source resources\n * console.log('Exporting source resources...');\n * };\n *\n * return (\n * <SourceView\n * resources={processedResources}\n * onExport={handleExport}\n * />\n * );\n * }\n * ```\n *\n * @public\n */\nexport const SourceView: React.FC<ISourceViewProps> = ({\n resources,\n filterState,\n filterResult,\n onExport,\n pickerOptions,\n pickerOptionsPanelPresentation = 'hidden',\n className = ''\n}) => {\n const o11y = useSmartObservability();\n const [selectedResourceId, setSelectedResourceId] = useState<string | null>(null);\n const [showJsonView, setShowJsonView] = useState(false);\n\n // Use filtered resources when filtering is active and successful\n const isFilteringActive = filterState?.enabled && filterResult?.success === true;\n const activeProcessedResources = isFilteringActive ? filterResult?.processedResources : resources;\n\n // State for picker options control\n const [currentPickerOptions, setCurrentPickerOptions] = useState<IResourcePickerOptions>(\n (pickerOptions ?? {}) as IResourcePickerOptions\n );\n\n // Merge picker options with view-specific defaults\n const effectivePickerOptions = useMemo(\n () => ({\n defaultView: 'list' as const,\n showViewToggle: true,\n enableSearch: true,\n searchPlaceholder: 'Search resources...',\n searchScope: 'all' as const,\n height: '560px',\n emptyMessage: 'No resources available',\n // Override with user-provided options\n ...pickerOptions,\n // Override with current picker options from control\n ...currentPickerOptions\n }),\n [pickerOptions, currentPickerOptions]\n );\n\n // Handle resource selection with new enhanced callback\n const handleResourceSelect = useCallback(\n (selection: IResourceSelection) => {\n setSelectedResourceId(selection.resourceId);\n if (selection.resourceId) {\n o11y.user.info(`Selected resource: ${selection.resourceId}`);\n }\n },\n [o11y]\n );\n\n // Get full resource collection data using the new method\n const getResourceCollectionData = useCallback(() => {\n if (!activeProcessedResources?.system.resourceManager) {\n return null;\n }\n\n // Check if this is a ResourceManagerBuilder (has getResourceCollectionDecl method)\n if ('getResourceCollectionDecl' in activeProcessedResources.system.resourceManager) {\n const collectionResult = activeProcessedResources.system.resourceManager.getResourceCollectionDecl();\n if (collectionResult.isSuccess()) {\n return {\n ...collectionResult.value,\n metadata: {\n exportedAt: new Date().toISOString(),\n totalResources: activeProcessedResources.summary.totalResources,\n type: isFilteringActive ? 'ts-res-filtered-resource-collection' : 'ts-res-resource-collection',\n ...(isFilteringActive && { filterContext: filterState?.appliedValues })\n }\n };\n } else {\n o11y.user.error(`Failed to get resource collection: ${collectionResult.message}`);\n return null;\n }\n } else if (activeProcessedResources.compiledCollection) {\n // For IResourceManager from bundles, use the compiled collection directly\n return {\n resources: activeProcessedResources.compiledCollection.resources ?? [],\n metadata: {\n exportedAt: new Date().toISOString(),\n totalResources: activeProcessedResources.summary.totalResources,\n type: isFilteringActive ? 'ts-res-filtered-resource-collection' : 'ts-res-resource-collection',\n ...(isFilteringActive && { filterContext: filterState?.appliedValues })\n }\n };\n } else {\n o11y.user.error('Resource collection data not available');\n return null;\n }\n }, [activeProcessedResources, isFilteringActive, filterState?.appliedValues, o11y]);\n\n // Export source data to JSON file\n const handleExportSourceData = useCallback(() => {\n try {\n const collectionData = getResourceCollectionData();\n if (!collectionData) {\n o11y.user.error('No source collection data available to export');\n return;\n }\n\n onExport?.(collectionData, 'json');\n o11y.user.success('Resource collection exported successfully');\n } catch (error) {\n o11y.user.error(\n `Failed to export resource collection: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }, [getResourceCollectionData, onExport, o11y]);\n\n if (!activeProcessedResources) {\n return (\n <div className={`p-6 ${className}`}>\n <div className=\"flex items-center space-x-3 mb-6\">\n <DocumentTextIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Source Browser</h2>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-8 text-center\">\n <div className=\"max-w-2xl mx-auto\">\n <h3 className=\"text-xl font-semibold text-gray-900 mb-4\">No Resources Loaded</h3>\n <p className=\"text-gray-600 mb-6\">Import resources to explore them here.</p>\n <div className=\"bg-blue-50 rounded-lg p-4\">\n <p className=\"text-sm text-blue-800\">\n <strong>Tip:</strong> Use the Import View to load ts-res resource files or directories, then\n return here to browse and explore the loaded resources.\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`p-6 ${className}`}>\n <div className=\"flex items-center justify-between mb-6\">\n <div className=\"flex items-center space-x-3\">\n <DocumentTextIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Source Browser</h2>\n {isFilteringActive && (\n <span className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-purple-100 text-purple-800\">\n Filtered\n </span>\n )}\n </div>\n {activeProcessedResources && (\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={handleExportSourceData}\n className=\"inline-flex items-center px-3 py-1.5 border border-gray-300 text-xs font-medium rounded text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n <DocumentArrowDownIcon className=\"h-4 w-4 mr-1\" />\n Export JSON\n </button>\n </div>\n )}\n </div>\n\n {/* ResourcePicker Options Control */}\n <ResourcePickerOptionsControl\n options={currentPickerOptions}\n onOptionsChange={setCurrentPickerOptions}\n presentation={pickerOptionsPanelPresentation}\n title=\"Source Browser Picker Options\"\n className=\"mb-6\"\n />\n\n {/* JSON View Toggle */}\n {activeProcessedResources && (\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-4 mb-6\">\n <button\n onClick={() => setShowJsonView(!showJsonView)}\n className=\"inline-flex items-center px-3 py-1.5 text-sm font-medium text-gray-700 hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n <CodeBracketIcon className=\"h-4 w-4 mr-2\" />\n {showJsonView ? 'Hide' : 'Show'} JSON Resource Collection\n {showJsonView ? (\n <ChevronUpIcon className=\"h-4 w-4 ml-2\" />\n ) : (\n <ChevronDownIcon className=\"h-4 w-4 ml-2\" />\n )}\n </button>\n\n {/* JSON View */}\n {showJsonView && (\n <div className=\"mt-4\">\n <div className=\"bg-gray-50 rounded-lg border border-gray-200 p-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <h3 className=\"text-sm font-medium text-gray-900\">Resource Collection (JSON)</h3>\n <button\n onClick={handleExportSourceData}\n className=\"inline-flex items-center px-2 py-1 text-xs font-medium text-gray-700 bg-gray-100 rounded hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n <DocumentArrowDownIcon className=\"h-3 w-3 mr-1\" />\n Export\n </button>\n </div>\n <pre className=\"text-xs text-gray-800 bg-white p-3 rounded border overflow-x-auto max-h-64 overflow-y-auto\">\n {JSON.stringify(getResourceCollectionData(), null, 2)}\n </pre>\n </div>\n </div>\n )}\n </div>\n )}\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <div className=\"flex flex-col lg:flex-row gap-6 h-[600px]\">\n {/* Left side: Resource Picker */}\n <div className=\"lg:w-1/2 flex flex-col\">\n <div className=\"flex items-center mb-4\">\n <h3 className=\"text-lg font-semibold text-gray-900\">Resources</h3>\n </div>\n\n {/* Enhanced Resource Picker */}\n <div className=\"flex-1 min-h-0\">\n <ResourcePicker\n resources={activeProcessedResources}\n selectedResourceId={selectedResourceId}\n onResourceSelect={handleResourceSelect}\n options={effectivePickerOptions}\n />\n </div>\n </div>\n\n {/* Right side: Resource Details */}\n <div className=\"lg:w-1/2 flex flex-col\">\n {selectedResourceId ? (\n <SourceResourceDetail\n resourceId={selectedResourceId}\n processedResources={activeProcessedResources}\n />\n ) : (\n <div className=\"flex-1 flex items-center justify-center border border-gray-200 rounded-lg bg-gray-50\">\n <div className=\"text-center\">\n <DocumentTextIcon className=\"h-12 w-12 text-gray-400 mx-auto mb-4\" />\n <p className=\"text-gray-500\">Select a resource to view details</p>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default SourceView;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObservabilityContext.d.ts","sourceRoot":"","sources":["../../src/contexts/ObservabilityContext.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,EAA6B,SAAS,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,kBAAkB,MAAM,wBAAwB,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,qBAAqB,CACgB,CAAC;AAE1G;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IACpB,oFAAoF;IACpF,oBAAoB,CAAC,EAAE,kBAAkB,CAAC,qBAAqB,CAAC;CACjE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CAGoC,CAAC;AAE7G;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,gBAAgB,QAAO,kBAAkB,CAAC,qBAEtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObservabilityContext.js","sourceRoot":"","sources":["../../src/contexts/ObservabilityContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAa,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,kBAAkB,MAAM,wBAAwB,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,aAAa,CAA2C,kBAAkB,CAAC,2BAA2B,CAAC,CAAC;AAa1G;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA0C,CAAC,EAC3E,QAAQ,EACR,oBAAoB,GAAG,kBAAkB,CAAC,2BAA2B,EACtE,EAAE,EAAE,CAAC,oBAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,oBAAoB,IAAG,QAAQ,CAAiC,CAAC;AAE7G;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAA6C,EAAE;IAC7E,OAAO,UAAU,CAAC,oBAAoB,CAAC,CAAC;AAC1C,CAAC,CAAC","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport React, { createContext, useContext, ReactNode } from 'react';\nimport * as ObservabilityTools from '../utils/observability';\n\n/**\n * React context for observability infrastructure.\n * Provides access to diagnostic and user loggers throughout the component tree.\n * @public\n */\nexport const ObservabilityContext: React.Context<ObservabilityTools.IObservabilityContext> =\n createContext<ObservabilityTools.IObservabilityContext>(ObservabilityTools.DefaultObservabilityContext);\n\n/**\n * Props for the ObservabilityProvider component.\n * @public\n */\nexport interface IObservabilityProviderProps {\n /** Child components that will have access to the observability context */\n children: ReactNode;\n /** Optional observability context to provide (defaults to console-based context) */\n observabilityContext?: ObservabilityTools.IObservabilityContext;\n}\n\n/**\n * Provider component that makes observability context available to all child components.\n *\n * @example\n * ```tsx\n * // Basic usage with default console logging\n * <ObservabilityProvider>\n * <MyApp />\n * </ObservabilityProvider>\n *\n * // Custom observability context\n * const customContext = ObservabilityTools.createConsoleObservabilityContext('debug', 'info');\n * <ObservabilityProvider observabilityContext={customContext}>\n * <MyApp />\n * </ObservabilityProvider>\n *\n * // With custom user logger that forwards to app's message system\n * const contextWithMessages = new ObservabilityTools.ObservabilityContext(\n * new ObservabilityTools.ConsoleUserLogger('info'),\n * createCallbackUserLogger((type, message) => showToast(type, message))\n * );\n * <ObservabilityProvider observabilityContext={contextWithMessages}>\n * <MyApp />\n * </ObservabilityProvider>\n * ```\n *\n * @param props - Provider configuration\n * @returns JSX provider element\n * @public\n */\nexport const ObservabilityProvider: React.FC<IObservabilityProviderProps> = ({\n children,\n observabilityContext = ObservabilityTools.DefaultObservabilityContext\n}) => <ObservabilityContext.Provider value={observabilityContext}>{children}</ObservabilityContext.Provider>;\n\n/**\n * Hook to access the current observability context.\n *\n * Provides access to both diagnostic logging (for developers/debugging) and\n * user logging (for user-facing messages and feedback).\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const observability = useObservability();\n *\n * const handleAction = () => {\n * // Log diagnostic info for developers\n * observability.diag.info('User clicked action button');\n *\n * try {\n * performAction();\n * // Show success message to user\n * observability.user.success('Action completed successfully!');\n * } catch (error) {\n * // Log error for debugging\n * observability.diag.error('Action failed:', error);\n * // Show error to user\n * observability.user.error('Action failed. Please try again.');\n * }\n * };\n *\n * return <button onClick={handleAction}>Perform Action</button>;\n * }\n * ```\n *\n * @returns The current observability context with diag and user loggers\n * @public\n */\nexport const useObservability = (): ObservabilityTools.IObservabilityContext => {\n return useContext(ObservabilityContext);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contexts/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,2BAA2B,EACjC,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contexts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,oDAAoD;AACpD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAEjB,MAAM,wBAAwB,CAAC","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// Export observability context components and hooks\nexport {\n ObservabilityContext,\n ObservabilityProvider,\n useObservability,\n type IObservabilityProviderProps\n} from './ObservabilityContext';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAsBA;;;GAGG;AAEH,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;GAGG;AAEH,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * React hooks for UI components.\n * @packageDocumentation\n */\n\nexport * from './useNavigationWarning';\nexport * from './useUrlParams';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConfigurationState.d.ts","sourceRoot":"","sources":["../../src/hooks/useConfigurationState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConfigurationState.js","sourceRoot":"","sources":["../../src/hooks/useConfigurationState.ts"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useMemo, useRef } from 'react';\nimport { Config, QualifierTypes, Qualifiers, ResourceTypes } from '@fgv/ts-res';\nimport { Result, succeed, fail } from '@fgv/ts-utils';\nimport {\n getDefaultConfiguration,\n validateConfiguration,\n cloneConfiguration,\n compareConfigurations,\n trackIConfigurationChanges,\n exportConfiguration,\n importConfiguration,\n getIConfigurationTemplates,\n IConfigurationChanges,\n IConfigurationValidationResult,\n IConfigurationExportOptions,\n IConfigurationTemplate\n} from '../utils/configurationUtils';\n\nexport interface IConfigurationState {\n currentConfiguration: Config.Model.ISystemConfiguration;\n originalConfiguration: Config.Model.ISystemConfiguration;\n hasUnsavedChanges: boolean;\n changes: IConfigurationChanges;\n validation: IConfigurationValidationResult;\n activeTab: 'qualifierTypes' | 'qualifiers' | 'resourceTypes' | 'json';\n isJsonView: boolean;\n jsonString: string;\n jsonError: string | null;\n}\n\nexport interface IConfigurationActions {\n // Configuration management\n loadConfiguration: (config: Config.Model.ISystemConfiguration) => void;\n resetConfiguration: () => void;\n applyConfiguration: () => void;\n\n // Editing operations\n updateQualifierTypes: (qualifierTypes: QualifierTypes.Config.IAnyQualifierTypeConfig[]) => void;\n updateQualifiers: (qualifiers: Qualifiers.IQualifierDecl[]) => void;\n updateResourceTypes: (resourceTypes: ResourceTypes.Config.IResourceTypeConfig[]) => void;\n\n // Individual item operations\n addQualifierType: (qualifierType: QualifierTypes.Config.IAnyQualifierTypeConfig) => void;\n updateQualifierType: (index: number, qualifierType: QualifierTypes.Config.IAnyQualifierTypeConfig) => void;\n removeQualifierType: (index: number) => void;\n\n addQualifier: (qualifier: Qualifiers.IQualifierDecl) => void;\n updateQualifier: (index: number, qualifier: Qualifiers.IQualifierDecl) => void;\n removeQualifier: (index: number) => void;\n\n addResourceType: (resourceType: ResourceTypes.Config.IResourceTypeConfig) => void;\n updateResourceType: (index: number, resourceType: ResourceTypes.Config.IResourceTypeConfig) => void;\n removeResourceType: (index: number) => void;\n\n // View management\n setActiveTab: (tab: IConfigurationState['activeTab']) => void;\n toggleJsonView: () => void;\n updateJsonString: (json: string) => void;\n applyJsonChanges: () => Result<void>;\n\n // Import/Export\n exportToJson: (options?: IConfigurationExportOptions) => Result<string>;\n importFromJson: (jsonData: string) => Result<void>;\n loadTemplate: (templateId: string) => Result<void>;\n\n // Validation\n validateCurrent: () => IConfigurationValidationResult;\n}\n\nexport interface IUseIConfigurationStateReturn {\n state: IConfigurationState;\n actions: IConfigurationActions;\n templates: IConfigurationTemplate[];\n}\n\n/**\n * Hook for managing system configuration state including qualifiers, qualifier types, and resource types.\n *\n * Provides comprehensive configuration management with validation, change tracking, and import/export capabilities.\n * Supports both visual editing and JSON editing modes with real-time validation.\n *\n * @example\n * Basic usage:\n * ```typescript\n * const { state, actions } = useIConfigurationState();\n *\n * // Check for unsaved changes\n * if (state.hasUnsavedChanges) {\n * console.log('Configuration has been modified');\n * }\n *\n * // Add a new qualifier\n * actions.addQualifier({\n * name: 'language',\n * typeName: 'language',\n * defaultPriority: 100\n * });\n * ```\n *\n * @example\n * With change notifications:\n * ```typescript\n * const { state, actions } = useIConfigurationState(\n * undefined,\n * (config) => console.log('Configuration changed:', config),\n * (hasChanges) => console.log('Has unsaved changes:', hasChanges)\n * );\n * ```\n *\n * @example\n * JSON import/export:\n * ```typescript\n * const { actions } = useIConfigurationState();\n *\n * // Export to JSON\n * const exportResult = actions.exportToJson({ pretty: true });\n * if (exportResult.isSuccess()) {\n * console.log(exportResult.value); // JSON string\n * }\n *\n * // Import from JSON\n * const importResult = actions.importFromJson(jsonString);\n * if (importResult.isFailure()) {\n * console.error('Import failed:', importResult.message);\n * }\n * ```\n *\n * @param initialConfiguration - Optional initial configuration. Defaults to system default configuration\n * @param onConfigurationChange - Optional callback invoked when configuration changes (not on first mount)\n * @param onUnsavedChanges - Optional callback invoked when unsaved changes state changes\n *\n * @returns Object containing:\n * - `state` - Current configuration state with change tracking and validation\n * - `actions` - Methods for modifying and managing the configuration\n * - `templates` - Available configuration templates for quick loading\n *\n * @public\n */\nexport function useIConfigurationState(\n initialConfiguration?: Config.Model.ISystemConfiguration,\n onConfigurationChange?: (config: Config.Model.ISystemConfiguration) => void,\n onUnsavedChanges?: (hasChanges: boolean) => void\n): IUseIConfigurationStateReturn {\n const defaultConfig = useMemo(\n () => initialConfiguration || getDefaultConfiguration(),\n [initialConfiguration]\n );\n const originalConfigRef = useRef(defaultConfig);\n\n // State\n const [currentConfiguration, setCurrentConfiguration] = useState<Config.Model.ISystemConfiguration>(\n cloneConfiguration(defaultConfig)\n );\n const [activeTab, setActiveTab] = useState<IConfigurationState['activeTab']>('qualifiers');\n const [isJsonView, setIsJsonView] = useState(false);\n const [jsonString, setJsonString] = useState('');\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n // Computed state\n const hasUnsavedChanges = useMemo(() => {\n return !compareConfigurations(originalConfigRef.current, currentConfiguration);\n }, [currentConfiguration]);\n\n const changes = useMemo(() => {\n return trackIConfigurationChanges(originalConfigRef.current, currentConfiguration);\n }, [currentConfiguration]);\n\n const validation = useMemo(() => {\n return validateConfiguration(currentConfiguration);\n }, [currentConfiguration]);\n\n // Update JSON string when configuration changes and in JSON view\n React.useEffect(() => {\n if (isJsonView) {\n const result = exportConfiguration(currentConfiguration, { format: 'json', pretty: true });\n if (result.isSuccess()) {\n setJsonString(result.value);\n setJsonError(null);\n } else {\n setJsonError(result.message);\n }\n }\n }, [currentConfiguration, isJsonView]);\n\n // Notify parent of configuration changes\n const isFirstMount = useRef(true);\n const lastNotifiedConfig = useRef(currentConfiguration);\n\n React.useEffect(() => {\n // Skip notification on first mount to avoid loops\n if (isFirstMount.current) {\n isFirstMount.current = false;\n return;\n }\n\n // Only notify if configuration actually changed\n if (!compareConfigurations(lastNotifiedConfig.current, currentConfiguration)) {\n lastNotifiedConfig.current = currentConfiguration;\n onConfigurationChange?.(currentConfiguration);\n }\n }, [currentConfiguration, onConfigurationChange]);\n\n // Notify parent of unsaved changes\n React.useEffect(() => {\n onUnsavedChanges?.(hasUnsavedChanges);\n }, [hasUnsavedChanges, onUnsavedChanges]);\n\n // Actions\n const loadConfiguration = useCallback((config: Config.Model.ISystemConfiguration) => {\n const cloned = cloneConfiguration(config);\n setCurrentConfiguration(cloned);\n originalConfigRef.current = cloneConfiguration(config);\n }, []);\n\n const resetConfiguration = useCallback(() => {\n setCurrentConfiguration(cloneConfiguration(originalConfigRef.current));\n }, []);\n\n const applyConfiguration = useCallback(() => {\n originalConfigRef.current = cloneConfiguration(currentConfiguration);\n }, [currentConfiguration]);\n\n // Qualifier Types operations\n const updateQualifierTypes = useCallback(\n (qualifierTypes: QualifierTypes.Config.IAnyQualifierTypeConfig[]) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n qualifierTypes\n }));\n },\n []\n );\n\n const addQualifierType = useCallback((qualifierType: QualifierTypes.Config.IAnyQualifierTypeConfig) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n qualifierTypes: [...(prev.qualifierTypes || []), qualifierType]\n }));\n }, []);\n\n const updateQualifierType = useCallback(\n (index: number, qualifierType: QualifierTypes.Config.IAnyQualifierTypeConfig) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n qualifierTypes: prev.qualifierTypes?.map((qt, i) => (i === index ? qualifierType : qt)) || []\n }));\n },\n []\n );\n\n const removeQualifierType = useCallback((index: number) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n qualifierTypes: prev.qualifierTypes?.filter((__, i) => i !== index) || []\n }));\n }, []);\n\n // Qualifiers operations\n const updateQualifiers = useCallback((qualifiers: Qualifiers.IQualifierDecl[]) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n qualifiers\n }));\n }, []);\n\n const addQualifier = useCallback((qualifier: Qualifiers.IQualifierDecl) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n qualifiers: [...(prev.qualifiers || []), qualifier]\n }));\n }, []);\n\n const updateQualifier = useCallback((index: number, qualifier: Qualifiers.IQualifierDecl) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n qualifiers: prev.qualifiers?.map((q, i) => (i === index ? qualifier : q)) || []\n }));\n }, []);\n\n const removeQualifier = useCallback((index: number) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n qualifiers: prev.qualifiers?.filter((__, i) => i !== index) || []\n }));\n }, []);\n\n // Resource Types operations\n const updateResourceTypes = useCallback((resourceTypes: ResourceTypes.Config.IResourceTypeConfig[]) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n resourceTypes\n }));\n }, []);\n\n const addResourceType = useCallback((resourceType: ResourceTypes.Config.IResourceTypeConfig) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n resourceTypes: [...(prev.resourceTypes || []), resourceType]\n }));\n }, []);\n\n const updateResourceType = useCallback(\n (index: number, resourceType: ResourceTypes.Config.IResourceTypeConfig) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n resourceTypes: prev.resourceTypes?.map((rt, i) => (i === index ? resourceType : rt)) || []\n }));\n },\n []\n );\n\n const removeResourceType = useCallback((index: number) => {\n setCurrentConfiguration((prev) => ({\n ...prev,\n resourceTypes: prev.resourceTypes?.filter((__, i) => i !== index) || []\n }));\n }, []);\n\n // View management\n const toggleJsonView = useCallback(() => {\n if (!isJsonView) {\n // Switching to JSON view - export current config\n const result = exportConfiguration(currentConfiguration, { format: 'json', pretty: true });\n if (result.isSuccess()) {\n setJsonString(result.value);\n setJsonError(null);\n } else {\n setJsonError(result.message);\n }\n }\n setIsJsonView(!isJsonView);\n }, [isJsonView, currentConfiguration]);\n\n const updateJsonString = useCallback((json: string) => {\n setJsonString(json);\n setJsonError(null);\n }, []);\n\n const applyJsonChanges = useCallback((): Result<void> => {\n const result = importConfiguration(jsonString);\n if (result.isSuccess()) {\n setCurrentConfiguration(result.value);\n setJsonError(null);\n return succeed(undefined);\n } else {\n setJsonError(result.message);\n return fail(result.message);\n }\n }, [jsonString]);\n\n // Import/Export\n const exportToJson = useCallback(\n (options?: IConfigurationExportOptions): Result<string> => {\n return exportConfiguration(currentConfiguration, options);\n },\n [currentConfiguration]\n );\n\n const importFromJson = useCallback(\n (jsonData: string): Result<void> => {\n const result = importConfiguration(jsonData);\n if (result.isSuccess()) {\n loadConfiguration(result.value);\n return succeed(undefined);\n }\n return fail(result.message);\n },\n [loadConfiguration]\n );\n\n const loadTemplate = useCallback(\n (templateId: string): Result<void> => {\n const templates = getIConfigurationTemplates();\n const template = templates.find((t) => t.id === templateId);\n\n if (!template) {\n return fail(`Template '${templateId}' not found`);\n }\n\n loadConfiguration(template.configuration);\n return succeed(undefined);\n },\n [loadConfiguration]\n );\n\n const validateCurrent = useCallback((): IConfigurationValidationResult => {\n return validateConfiguration(currentConfiguration);\n }, [currentConfiguration]);\n\n const state: IConfigurationState = {\n currentConfiguration,\n originalConfiguration: originalConfigRef.current,\n hasUnsavedChanges,\n changes,\n validation,\n activeTab,\n isJsonView,\n jsonString,\n jsonError\n };\n\n const actions: IConfigurationActions = {\n loadConfiguration,\n resetConfiguration,\n applyConfiguration,\n updateQualifierTypes,\n updateQualifiers,\n updateResourceTypes,\n addQualifierType,\n updateQualifierType,\n removeQualifierType,\n addQualifier,\n updateQualifier,\n removeQualifier,\n addResourceType,\n updateResourceType,\n removeResourceType,\n setActiveTab,\n toggleJsonView,\n updateJsonString,\n applyJsonChanges,\n exportToJson,\n importFromJson,\n loadTemplate,\n validateCurrent\n };\n\n return {\n state,\n actions,\n templates: getIConfigurationTemplates()\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFilterState.d.ts","sourceRoot":"","sources":["../../src/hooks/useFilterState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAExD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,KAAK,EAAE,YAAY,CAAC;IACpB,kDAAkD;IAClD,OAAO,EAAE,cAAc,CAAC;CACzB;AAqBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,qBAAqB,CAqE1F"}
|