@fgv/ts-res-ui-components 5.0.0-10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/.rush/temp/03c8b056281d9db0a97d8a6e25eea798a160d393.tar.log +271 -0
  2. package/.rush/temp/chunked-rush-logs/ts-res-ui-components.build.chunks.jsonl +9 -0
  3. package/.rush/temp/operation/build/all.log +9 -0
  4. package/.rush/temp/operation/build/log-chunks.jsonl +9 -0
  5. package/.rush/temp/operation/build/state.json +3 -0
  6. package/.rush/temp/shrinkwrap-deps.json +1111 -0
  7. package/README.md +18 -0
  8. package/REFACTORING_PLAN.md +171 -0
  9. package/config/jest.config.json +16 -0
  10. package/config/jest.setup.js +64 -0
  11. package/config/rig.json +16 -0
  12. package/lib/components/common/QualifierContextControl.d.ts +14 -0
  13. package/lib/components/common/QualifierContextControl.d.ts.map +1 -0
  14. package/lib/components/common/QualifierContextControl.js +78 -0
  15. package/lib/components/common/QualifierContextControl.js.map +1 -0
  16. package/lib/components/common/ResourceListView.d.ts +11 -0
  17. package/lib/components/common/ResourceListView.d.ts.map +1 -0
  18. package/lib/components/common/ResourceListView.js +20 -0
  19. package/lib/components/common/ResourceListView.js.map +1 -0
  20. package/lib/components/common/ResourceTreeView.d.ts +12 -0
  21. package/lib/components/common/ResourceTreeView.d.ts.map +1 -0
  22. package/lib/components/common/ResourceTreeView.js +162 -0
  23. package/lib/components/common/ResourceTreeView.js.map +1 -0
  24. package/lib/components/forms/HierarchyEditor.d.ts +10 -0
  25. package/lib/components/forms/HierarchyEditor.d.ts.map +1 -0
  26. package/lib/components/forms/HierarchyEditor.js +106 -0
  27. package/lib/components/forms/HierarchyEditor.js.map +1 -0
  28. package/lib/components/forms/QualifierEditForm.d.ts +11 -0
  29. package/lib/components/forms/QualifierEditForm.d.ts.map +1 -0
  30. package/lib/components/forms/QualifierEditForm.js +181 -0
  31. package/lib/components/forms/QualifierEditForm.js.map +1 -0
  32. package/lib/components/forms/QualifierTypeEditForm.d.ts +10 -0
  33. package/lib/components/forms/QualifierTypeEditForm.d.ts.map +1 -0
  34. package/lib/components/forms/QualifierTypeEditForm.js +172 -0
  35. package/lib/components/forms/QualifierTypeEditForm.js.map +1 -0
  36. package/lib/components/forms/ResourceTypeEditForm.d.ts +10 -0
  37. package/lib/components/forms/ResourceTypeEditForm.d.ts.map +1 -0
  38. package/lib/components/forms/ResourceTypeEditForm.js +188 -0
  39. package/lib/components/forms/ResourceTypeEditForm.js.map +1 -0
  40. package/lib/components/forms/index.d.ts +9 -0
  41. package/lib/components/forms/index.d.ts.map +1 -0
  42. package/lib/components/forms/index.js +5 -0
  43. package/lib/components/forms/index.js.map +1 -0
  44. package/lib/components/orchestrator/ResourceOrchestrator.d.ts +14 -0
  45. package/lib/components/orchestrator/ResourceOrchestrator.d.ts.map +1 -0
  46. package/lib/components/orchestrator/ResourceOrchestrator.js +278 -0
  47. package/lib/components/orchestrator/ResourceOrchestrator.js.map +1 -0
  48. package/lib/components/views/CompiledView/index.d.ts +5 -0
  49. package/lib/components/views/CompiledView/index.d.ts.map +1 -0
  50. package/lib/components/views/CompiledView/index.js +595 -0
  51. package/lib/components/views/CompiledView/index.js.map +1 -0
  52. package/lib/components/views/ConfigurationView/index.d.ts +5 -0
  53. package/lib/components/views/ConfigurationView/index.d.ts.map +1 -0
  54. package/lib/components/views/ConfigurationView/index.js +363 -0
  55. package/lib/components/views/ConfigurationView/index.js.map +1 -0
  56. package/lib/components/views/FilterView/index.d.ts +5 -0
  57. package/lib/components/views/FilterView/index.d.ts.map +1 -0
  58. package/lib/components/views/FilterView/index.js +463 -0
  59. package/lib/components/views/FilterView/index.js.map +1 -0
  60. package/lib/components/views/ImportView/index.d.ts +5 -0
  61. package/lib/components/views/ImportView/index.d.ts.map +1 -0
  62. package/lib/components/views/ImportView/index.js +514 -0
  63. package/lib/components/views/ImportView/index.js.map +1 -0
  64. package/lib/components/views/ResolutionView/EditableJsonView.d.ts +21 -0
  65. package/lib/components/views/ResolutionView/EditableJsonView.d.ts.map +1 -0
  66. package/lib/components/views/ResolutionView/EditableJsonView.js +109 -0
  67. package/lib/components/views/ResolutionView/EditableJsonView.js.map +1 -0
  68. package/lib/components/views/ResolutionView/ResolutionEditControls.d.ts +19 -0
  69. package/lib/components/views/ResolutionView/ResolutionEditControls.d.ts.map +1 -0
  70. package/lib/components/views/ResolutionView/ResolutionEditControls.js +82 -0
  71. package/lib/components/views/ResolutionView/ResolutionEditControls.js.map +1 -0
  72. package/lib/components/views/ResolutionView/index.d.ts +5 -0
  73. package/lib/components/views/ResolutionView/index.d.ts.map +1 -0
  74. package/lib/components/views/ResolutionView/index.js +255 -0
  75. package/lib/components/views/ResolutionView/index.js.map +1 -0
  76. package/lib/components/views/SourceView/index.d.ts +5 -0
  77. package/lib/components/views/SourceView/index.d.ts.map +1 -0
  78. package/lib/components/views/SourceView/index.js +316 -0
  79. package/lib/components/views/SourceView/index.js.map +1 -0
  80. package/lib/components/views/ZipLoaderView/index.d.ts +5 -0
  81. package/lib/components/views/ZipLoaderView/index.d.ts.map +1 -0
  82. package/lib/components/views/ZipLoaderView/index.js +313 -0
  83. package/lib/components/views/ZipLoaderView/index.js.map +1 -0
  84. package/lib/hooks/useConfigurationState.d.ts +46 -0
  85. package/lib/hooks/useConfigurationState.d.ts.map +1 -0
  86. package/lib/hooks/useConfigurationState.js +239 -0
  87. package/lib/hooks/useConfigurationState.js.map +1 -0
  88. package/lib/hooks/useFilterState.d.ts +7 -0
  89. package/lib/hooks/useFilterState.d.ts.map +1 -0
  90. package/lib/hooks/useFilterState.js +80 -0
  91. package/lib/hooks/useFilterState.js.map +1 -0
  92. package/lib/hooks/useResolutionState.d.ts +8 -0
  93. package/lib/hooks/useResolutionState.d.ts.map +1 -0
  94. package/lib/hooks/useResolutionState.js +253 -0
  95. package/lib/hooks/useResolutionState.js.map +1 -0
  96. package/lib/hooks/useResourceData.d.ts +19 -0
  97. package/lib/hooks/useResourceData.d.ts.map +1 -0
  98. package/lib/hooks/useResourceData.js +368 -0
  99. package/lib/hooks/useResourceData.js.map +1 -0
  100. package/lib/hooks/useViewState.d.ts +10 -0
  101. package/lib/hooks/useViewState.d.ts.map +1 -0
  102. package/lib/hooks/useViewState.js +29 -0
  103. package/lib/hooks/useViewState.js.map +1 -0
  104. package/lib/index.d.ts +27 -0
  105. package/lib/index.d.ts.map +1 -0
  106. package/lib/index.js +34 -0
  107. package/lib/index.js.map +1 -0
  108. package/lib/test/helpers/testDataLoader.d.ts +37 -0
  109. package/lib/test/helpers/testDataLoader.d.ts.map +1 -0
  110. package/lib/test/helpers/testDataLoader.js +171 -0
  111. package/lib/test/helpers/testDataLoader.js.map +1 -0
  112. package/lib/test/unit/utils/configurationUtils.test.d.ts +2 -0
  113. package/lib/test/unit/utils/configurationUtils.test.d.ts.map +1 -0
  114. package/lib/test/unit/utils/configurationUtils.test.js +497 -0
  115. package/lib/test/unit/utils/configurationUtils.test.js.map +1 -0
  116. package/lib/test/unit/utils/fileProcessing.test.d.ts +2 -0
  117. package/lib/test/unit/utils/fileProcessing.test.d.ts.map +1 -0
  118. package/lib/test/unit/utils/fileProcessing.test.js +321 -0
  119. package/lib/test/unit/utils/fileProcessing.test.js.map +1 -0
  120. package/lib/test/unit/utils/filterResources.test.d.ts +2 -0
  121. package/lib/test/unit/utils/filterResources.test.d.ts.map +1 -0
  122. package/lib/test/unit/utils/filterResources.test.js +403 -0
  123. package/lib/test/unit/utils/filterResources.test.js.map +1 -0
  124. package/lib/test/unit/utils/resolutionEditing.test.d.ts +2 -0
  125. package/lib/test/unit/utils/resolutionEditing.test.d.ts.map +1 -0
  126. package/lib/test/unit/utils/resolutionEditing.test.js +439 -0
  127. package/lib/test/unit/utils/resolutionEditing.test.js.map +1 -0
  128. package/lib/test/unit/utils/resolutionUtils.test.d.ts +2 -0
  129. package/lib/test/unit/utils/resolutionUtils.test.d.ts.map +1 -0
  130. package/lib/test/unit/utils/resolutionUtils.test.js +397 -0
  131. package/lib/test/unit/utils/resolutionUtils.test.js.map +1 -0
  132. package/lib/test/unit/utils/tsResIntegration.test.d.ts +2 -0
  133. package/lib/test/unit/utils/tsResIntegration.test.d.ts.map +1 -0
  134. package/lib/test/unit/utils/tsResIntegration.test.js +376 -0
  135. package/lib/test/unit/utils/tsResIntegration.test.js.map +1 -0
  136. package/lib/types/index.d.ts +251 -0
  137. package/lib/types/index.d.ts.map +1 -0
  138. package/lib/types/index.js +2 -0
  139. package/lib/types/index.js.map +1 -0
  140. package/lib/utils/configurationUtils.d.ts +74 -0
  141. package/lib/utils/configurationUtils.d.ts.map +1 -0
  142. package/lib/utils/configurationUtils.js +359 -0
  143. package/lib/utils/configurationUtils.js.map +1 -0
  144. package/lib/utils/fileProcessing.d.ts +18 -0
  145. package/lib/utils/fileProcessing.d.ts.map +1 -0
  146. package/lib/utils/fileProcessing.js +142 -0
  147. package/lib/utils/fileProcessing.js.map +1 -0
  148. package/lib/utils/filterResources.d.ts +38 -0
  149. package/lib/utils/filterResources.d.ts.map +1 -0
  150. package/lib/utils/filterResources.js +153 -0
  151. package/lib/utils/filterResources.js.map +1 -0
  152. package/lib/utils/resolutionEditing.d.ts +58 -0
  153. package/lib/utils/resolutionEditing.d.ts.map +1 -0
  154. package/lib/utils/resolutionEditing.js +246 -0
  155. package/lib/utils/resolutionEditing.js.map +1 -0
  156. package/lib/utils/resolutionUtils.d.ts +28 -0
  157. package/lib/utils/resolutionUtils.d.ts.map +1 -0
  158. package/lib/utils/resolutionUtils.js +216 -0
  159. package/lib/utils/resolutionUtils.js.map +1 -0
  160. package/lib/utils/tsResIntegration.d.ts +71 -0
  161. package/lib/utils/tsResIntegration.d.ts.map +1 -0
  162. package/lib/utils/tsResIntegration.js +294 -0
  163. package/lib/utils/tsResIntegration.js.map +1 -0
  164. package/lib/utils/zipLoader/browserZipLoader.d.ts +48 -0
  165. package/lib/utils/zipLoader/browserZipLoader.d.ts.map +1 -0
  166. package/lib/utils/zipLoader/browserZipLoader.js +247 -0
  167. package/lib/utils/zipLoader/browserZipLoader.js.map +1 -0
  168. package/lib/utils/zipLoader/index.d.ts +8 -0
  169. package/lib/utils/zipLoader/index.d.ts.map +1 -0
  170. package/lib/utils/zipLoader/index.js +13 -0
  171. package/lib/utils/zipLoader/index.js.map +1 -0
  172. package/lib/utils/zipLoader/nodeZipBuilder.d.ts +55 -0
  173. package/lib/utils/zipLoader/nodeZipBuilder.d.ts.map +1 -0
  174. package/lib/utils/zipLoader/nodeZipBuilder.js +98 -0
  175. package/lib/utils/zipLoader/nodeZipBuilder.js.map +1 -0
  176. package/lib/utils/zipLoader/types.d.ts +139 -0
  177. package/lib/utils/zipLoader/types.d.ts.map +1 -0
  178. package/lib/utils/zipLoader/types.js +2 -0
  179. package/lib/utils/zipLoader/types.js.map +1 -0
  180. package/lib/utils/zipLoader/zipUtils.d.ts +53 -0
  181. package/lib/utils/zipLoader/zipUtils.d.ts.map +1 -0
  182. package/lib/utils/zipLoader/zipUtils.js +229 -0
  183. package/lib/utils/zipLoader/zipUtils.js.map +1 -0
  184. package/package.json +69 -0
  185. package/rush-logs/ts-res-ui-components.build.cache.log +3 -0
  186. package/rush-logs/ts-res-ui-components.build.log +9 -0
  187. package/src/components/common/QualifierContextControl.tsx +151 -0
  188. package/src/components/common/ResourceListView.tsx +63 -0
  189. package/src/components/common/ResourceTreeView.tsx +271 -0
  190. package/src/components/forms/HierarchyEditor.tsx +204 -0
  191. package/src/components/forms/QualifierEditForm.tsx +355 -0
  192. package/src/components/forms/QualifierTypeEditForm.tsx +347 -0
  193. package/src/components/forms/ResourceTypeEditForm.tsx +331 -0
  194. package/src/components/forms/index.ts +11 -0
  195. package/src/components/orchestrator/ResourceOrchestrator.tsx +372 -0
  196. package/src/components/views/CompiledView/index.tsx +922 -0
  197. package/src/components/views/ConfigurationView/index.tsx +800 -0
  198. package/src/components/views/FilterView/index.tsx +825 -0
  199. package/src/components/views/ImportView/index.tsx +717 -0
  200. package/src/components/views/ResolutionView/EditableJsonView.tsx +214 -0
  201. package/src/components/views/ResolutionView/ResolutionEditControls.tsx +170 -0
  202. package/src/components/views/ResolutionView/index.tsx +591 -0
  203. package/src/components/views/SourceView/index.tsx +536 -0
  204. package/src/components/views/ZipLoaderView/index.tsx +485 -0
  205. package/src/hooks/useConfigurationState.ts +374 -0
  206. package/src/hooks/useFilterState.ts +97 -0
  207. package/src/hooks/useResolutionState.ts +355 -0
  208. package/src/hooks/useResourceData.ts +467 -0
  209. package/src/hooks/useViewState.ts +44 -0
  210. package/src/index.ts +45 -0
  211. package/src/test/helpers/testDataLoader.ts +195 -0
  212. package/src/test/unit/utils/configurationUtils.test.ts +630 -0
  213. package/src/test/unit/utils/fileProcessing.test.ts +391 -0
  214. package/src/test/unit/utils/filterResources.test.ts +574 -0
  215. package/src/test/unit/utils/resolutionEditing.test.ts +556 -0
  216. package/src/test/unit/utils/resolutionUtils.test.ts +521 -0
  217. package/src/test/unit/utils/tsResIntegration.test.ts +433 -0
  218. package/src/types/index.ts +322 -0
  219. package/src/utils/configurationUtils.ts +424 -0
  220. package/src/utils/fileProcessing.ts +160 -0
  221. package/src/utils/filterResources.ts +206 -0
  222. package/src/utils/resolutionEditing.ts +319 -0
  223. package/src/utils/resolutionUtils.ts +289 -0
  224. package/src/utils/tsResIntegration.ts +440 -0
  225. package/src/utils/zipLoader/browserZipLoader.ts +319 -0
  226. package/src/utils/zipLoader/index.ts +26 -0
  227. package/src/utils/zipLoader/nodeZipBuilder.ts +153 -0
  228. package/src/utils/zipLoader/types.ts +175 -0
  229. package/src/utils/zipLoader/zipUtils.ts +266 -0
  230. package/temp/build/typescript/ts_gZid87Hu.json +1 -0
  231. package/tsconfig.json +15 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/views/CompiledView/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport {\n CubeIcon,\n FolderIcon,\n FolderOpenIcon,\n DocumentTextIcon,\n ChevronRightIcon,\n ChevronDownIcon,\n DocumentArrowDownIcon,\n CodeBracketIcon,\n ChevronUpIcon,\n ArchiveBoxIcon\n} from '@heroicons/react/24/outline';\nimport { CompiledViewProps, ProcessedResources, FilterState, FilterResult } from '../../../types';\nimport { ResourceJson, Config, Bundle, Resources } from '@fgv/ts-res';\n\ninterface TreeNode {\n id: string;\n name: string;\n type: 'folder' | 'resource' | 'section';\n children?: TreeNode[];\n data?: any;\n}\n\nexport const CompiledView: React.FC<CompiledViewProps> = ({\n resources,\n filterState,\n filterResult,\n useNormalization: useNormalizationProp = false,\n onExport,\n onMessage,\n className = ''\n}) => {\n const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null);\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set(['root', 'resources']));\n const [showJsonView, setShowJsonView] = useState(false);\n const [useNormalization, setUseNormalization] = useState(useNormalizationProp);\n\n // Update normalization default when bundle state changes\n useEffect(() => {\n if (resources?.isLoadedFromBundle && !useNormalization) {\n setUseNormalization(true);\n }\n }, [resources?.isLoadedFromBundle, useNormalization]);\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 // Get the active compiled collection\n const activeCompiledCollection = useMemo(() => {\n return isFilteringActive\n ? filterResult?.processedResources?.compiledCollection\n : resources?.compiledCollection;\n }, [\n isFilteringActive,\n filterResult?.processedResources?.compiledCollection,\n resources?.compiledCollection\n ]);\n\n // Build tree structure using the compiled collection\n const treeData = useMemo(() => {\n if (!activeCompiledCollection) {\n return null;\n }\n\n const tree: TreeNode = {\n id: 'root',\n name: 'Compiled Resources',\n type: 'folder',\n children: []\n };\n\n try {\n // Resources section using the compiled collection\n const resourcesCount = activeCompiledCollection.resources?.length || 0;\n const resourcesSection: TreeNode = {\n id: 'resources',\n name: `Resources (${resourcesCount})`,\n type: 'section',\n children: []\n };\n\n // Get all resource IDs from the compiled collection\n if (activeCompiledCollection.resources && activeCompiledCollection.resources.length > 0) {\n resourcesSection.children = activeCompiledCollection.resources.map((resource) => ({\n id: `resource-${resource.id}`,\n name: String(resource.id || 'unnamed'),\n type: 'resource' as const,\n data: { type: 'compiled-resource', resource }\n }));\n }\n\n tree.children!.push(resourcesSection);\n\n // Collectors section - showing from compiled collection\n tree.children!.push({\n id: 'qualifiers',\n name: `Qualifiers (${activeCompiledCollection.qualifiers?.length || 0})`,\n type: 'section',\n data: { type: 'qualifiers', items: activeCompiledCollection.qualifiers }\n });\n\n tree.children!.push({\n id: 'qualifier-types',\n name: `Qualifier Types (${activeCompiledCollection.qualifierTypes?.length || 0})`,\n type: 'section',\n data: { type: 'qualifier-types', items: activeCompiledCollection.qualifierTypes }\n });\n\n tree.children!.push({\n id: 'resource-types',\n name: `Resource Types (${activeCompiledCollection.resourceTypes?.length || 0})`,\n type: 'section',\n data: { type: 'resource-types', items: activeCompiledCollection.resourceTypes }\n });\n\n tree.children!.push({\n id: 'conditions',\n name: `Conditions (${activeCompiledCollection.conditions?.length || 0})`,\n type: 'section',\n data: { type: 'conditions', items: activeCompiledCollection.conditions }\n });\n\n tree.children!.push({\n id: 'condition-sets',\n name: `Condition Sets (${activeCompiledCollection.conditionSets?.length || 0})`,\n type: 'section',\n data: { type: 'condition-sets', items: activeCompiledCollection.conditionSets }\n });\n\n tree.children!.push({\n id: 'decisions',\n name: `Decisions (${activeCompiledCollection.decisions?.length || 0})`,\n type: 'section',\n data: { type: 'decisions', items: activeCompiledCollection.decisions }\n });\n } catch (error) {\n onMessage?.('error', `Error building tree: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return tree;\n }, [activeCompiledCollection, onMessage]);\n\n const handleExportCompiledData = useCallback(async () => {\n if (!activeProcessedResources?.compiledCollection) {\n onMessage?.('error', 'No compiled data available to export');\n return;\n }\n\n let compiledCollection = activeProcessedResources.compiledCollection;\n\n if (useNormalization && resources?.activeConfiguration) {\n const systemConfigResult = Config.SystemConfiguration.create(resources.activeConfiguration);\n if (systemConfigResult.isSuccess()) {\n // Check if we have a ResourceManagerBuilder (which supports normalization)\n if ('getCompiledResourceCollection' in activeProcessedResources.system.resourceManager) {\n const resourceManagerResult = Bundle.BundleNormalizer.normalize(\n activeProcessedResources.system.resourceManager as Resources.ResourceManagerBuilder,\n systemConfigResult.value\n );\n\n if (resourceManagerResult.isSuccess()) {\n const normalizedCompiledResult = resourceManagerResult.value.getCompiledResourceCollection({\n includeMetadata: true\n });\n if (normalizedCompiledResult.isSuccess()) {\n compiledCollection = normalizedCompiledResult.value;\n } else {\n console.warn('Failed to get normalized compiled collection:', normalizedCompiledResult.message);\n }\n } else {\n console.warn('Failed to normalize bundle:', resourceManagerResult.message);\n }\n }\n // For IResourceManager from bundles, the compiled collection is already normalized\n } else {\n console.warn('Failed to create system configuration for normalization:', systemConfigResult.message);\n }\n }\n\n const compiledData = {\n ...compiledCollection,\n metadata: {\n exportedAt: new Date().toISOString(),\n type: isFilteringActive ? 'ts-res-filtered-compiled-collection' : 'ts-res-compiled-collection',\n normalized: useNormalization,\n ...(resources?.isLoadedFromBundle && { loadedFromBundle: true }),\n ...(isFilteringActive && { filterContext: filterState?.appliedValues })\n }\n };\n\n onExport?.(compiledData, 'json');\n }, [\n activeProcessedResources,\n onMessage,\n isFilteringActive,\n filterState?.appliedValues,\n useNormalization,\n resources,\n onExport\n ]);\n\n const handleExportBundle = useCallback(async () => {\n if (!activeProcessedResources?.system?.resourceManager || !resources?.activeConfiguration) {\n onMessage?.('error', 'No resource manager or configuration available to create bundle');\n return;\n }\n\n const systemConfigResult = Config.SystemConfiguration.create(resources.activeConfiguration);\n if (systemConfigResult.isFailure()) {\n onMessage?.('error', `Failed to create system configuration: ${systemConfigResult.message}`);\n return;\n }\n\n const systemConfig = systemConfigResult.value;\n\n const bundleParams: Bundle.IBundleCreateParams = {\n version: '1.0.0',\n description: isFilteringActive\n ? 'Bundle exported from ts-res-ui-components (filtered)'\n : 'Bundle exported from ts-res-ui-components',\n normalize: true\n };\n\n // Check if we have a ResourceManagerBuilder (which supports bundle creation)\n if (!('getCompiledResourceCollection' in activeProcessedResources.system.resourceManager)) {\n onMessage?.('error', 'Bundle export is not supported for resources loaded from bundles');\n return;\n }\n\n const bundleResult = Bundle.BundleBuilder.create(\n activeProcessedResources.system.resourceManager as Resources.ResourceManagerBuilder,\n systemConfig,\n bundleParams\n );\n\n if (bundleResult.isFailure()) {\n onMessage?.('error', `Failed to create bundle: ${bundleResult.message}`);\n return;\n }\n\n const bundle = bundleResult.value;\n\n const exportBundle = {\n ...bundle,\n exportMetadata: {\n exportedAt: new Date().toISOString(),\n exportedFrom: 'ts-res-ui-components',\n type: isFilteringActive ? 'ts-res-bundle-filtered' : 'ts-res-bundle',\n ...(isFilteringActive && { filterContext: filterState?.appliedValues })\n }\n };\n\n onExport?.(exportBundle, 'bundle');\n }, [\n activeProcessedResources?.system?.resourceManager,\n resources?.activeConfiguration,\n onMessage,\n isFilteringActive,\n filterState?.appliedValues,\n onExport\n ]);\n\n const handleNodeClick = (node: TreeNode) => {\n setSelectedNodeId(node.id);\n onMessage?.('info', `Selected: ${node.name}`);\n\n if (node.type === 'folder' || (node.type === 'section' && node.children)) {\n setExpandedNodes((prev) => {\n const newExpanded = new Set(prev);\n if (newExpanded.has(node.id)) {\n newExpanded.delete(node.id);\n } else {\n newExpanded.add(node.id);\n }\n return newExpanded;\n });\n }\n };\n\n const renderTreeNode = (node: TreeNode, level = 0): React.ReactNode => {\n const isExpanded = expandedNodes.has(node.id);\n const isSelected = selectedNodeId === node.id;\n const hasChildren = node.children && node.children.length > 0;\n\n return (\n <div key={node.id}>\n <div\n className={`flex items-center px-2 py-1 cursor-pointer hover:bg-gray-100 ${\n isSelected ? 'bg-blue-50 border-r-2 border-blue-500' : ''\n }`}\n style={{ paddingLeft: `${8 + level * 16}px` }}\n onClick={() => handleNodeClick(node)}\n >\n {hasChildren && (\n <div className=\"w-4 h-4 mr-1 flex items-center justify-center\">\n {isExpanded ? (\n <ChevronDownIcon className=\"w-3 h-3 text-gray-500\" />\n ) : (\n <ChevronRightIcon className=\"w-3 h-3 text-gray-500\" />\n )}\n </div>\n )}\n {!hasChildren && <div className=\"w-5 mr-1\" />}\n\n <div className=\"w-4 h-4 mr-2 flex items-center justify-center\">\n {node.type === 'folder' ? (\n isExpanded ? (\n <FolderOpenIcon className=\"w-4 h-4 text-blue-500\" />\n ) : (\n <FolderIcon className=\"w-4 h-4 text-blue-500\" />\n )\n ) : node.type === 'resource' ? (\n <DocumentTextIcon className=\"w-4 h-4 text-green-500\" />\n ) : (\n <CubeIcon className=\"w-4 h-4 text-purple-500\" />\n )}\n </div>\n\n <span className={`text-sm ${isSelected ? 'font-medium text-blue-900' : 'text-gray-700'}`}>\n {node.name}\n </span>\n </div>\n\n {hasChildren && isExpanded && (\n <div>{node.children!.map((child) => renderTreeNode(child, level + 1))}</div>\n )}\n </div>\n );\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 <CubeIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Compiled Resources</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 Compiled Resources</h3>\n <p className=\"text-gray-600 mb-6\">\n Import resources to explore the compiled resource collection.\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n const selectedNode = selectedNodeId ? findNodeById(treeData!, selectedNodeId) : null;\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 <CubeIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Compiled Resources</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={handleExportCompiledData}\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 <button\n onClick={handleExportBundle}\n className=\"inline-flex items-center px-3 py-1.5 border border-blue-300 text-xs font-medium rounded text-blue-700 bg-blue-50 hover:bg-blue-100 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n <ArchiveBoxIcon className=\"h-4 w-4 mr-1\" />\n Export Bundle\n </button>\n </div>\n )}\n </div>\n\n {/* Controls Panel */}\n {activeProcessedResources && (\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-4 mb-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-6\">\n {/* Normalization Toggle */}\n <div className=\"flex items-center space-x-2\">\n {resources?.isLoadedFromBundle ? (\n <ArchiveBoxIcon className=\"h-4 w-4 text-blue-600\" />\n ) : (\n <CubeIcon className=\"h-4 w-4 text-gray-600\" />\n )}\n <label className=\"text-sm font-medium text-gray-700\">Normalize Output:</label>\n <button\n onClick={() => setUseNormalization(!useNormalization)}\n className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 ${\n useNormalization ? 'bg-blue-600' : 'bg-gray-300'\n }`}\n >\n <span\n className={`inline-block h-3 w-3 transform rounded-full bg-white transition-transform ${\n useNormalization ? 'translate-x-5' : 'translate-x-1'\n }`}\n />\n </button>\n <span className=\"text-xs text-gray-500\">{useNormalization ? 'ON' : 'OFF'}</span>\n </div>\n\n {/* JSON View Toggle */}\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\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 </div>\n </div>\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 <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(activeProcessedResources.compiledCollection, 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 {/* Tree Navigation */}\n <div className=\"lg:w-1/2 flex flex-col\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">Compiled Collection</h3>\n <div className=\"flex-1 overflow-y-auto border border-gray-200 rounded-lg bg-gray-50\">\n {treeData && renderTreeNode(treeData)}\n </div>\n </div>\n\n {/* Details Panel */}\n <div className=\"lg:w-1/2 flex flex-col\">\n {selectedNode ? (\n <NodeDetail node={selectedNode} />\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 <CubeIcon className=\"h-12 w-12 text-gray-400 mx-auto mb-4\" />\n <p className=\"text-gray-500\">Select an item to view details</p>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// Helper function to find node by ID\nconst findNodeById = (tree: TreeNode, id: string): TreeNode | null => {\n if (tree.id === id) return tree;\n if (tree.children) {\n for (const child of tree.children) {\n const found = findNodeById(child, id);\n if (found) return found;\n }\n }\n return null;\n};\n\n// Runtime-powered NodeDetail component\ninterface NodeDetailProps {\n node: TreeNode;\n}\n\nconst NodeDetail: React.FC<NodeDetailProps> = ({ node }) => {\n const [showRawJson, setShowRawJson] = useState(false);\n\n const renderDetails = () => {\n if (!node.data) {\n return (\n <div className=\"space-y-4\">\n <div className=\"bg-white rounded-lg border p-4\">\n <h4 className=\"font-medium text-gray-700 mb-2\">📁 {node.name}</h4>\n <p className=\"text-sm text-gray-600\">\n {node.children ? `Contains ${node.children.length} items` : 'Empty folder'}\n </p>\n </div>\n </div>\n );\n }\n\n const { type, resourceId, manager } = node.data;\n\n switch (type) {\n case 'runtime-resource':\n return renderRuntimeResource(resourceId, manager);\n\n case 'qualifiers':\n case 'qualifier-types':\n case 'resource-types':\n case 'conditions':\n case 'condition-sets':\n case 'decisions':\n return renderRuntimeCollection(type, manager);\n\n default:\n return renderRawData();\n }\n };\n\n // New function that uses runtime objects instead of manual JSON manipulation\n const renderRuntimeResource = (resourceId: string, manager: any) => {\n // Get the full runtime resource object with all its rich data\n const resourceResult = manager.getBuiltResource(resourceId);\n\n if (resourceResult.isFailure()) {\n return (\n <div className=\"bg-white rounded-lg border p-4\">\n <h4 className=\"font-medium text-red-700 mb-2\">Error Loading Resource</h4>\n <p className=\"text-sm text-red-600\">{resourceResult.message}</p>\n </div>\n );\n }\n\n const resource = resourceResult.value;\n\n return (\n <div className=\"space-y-6\">\n {/* Resource Details Header */}\n <div className=\"bg-gray-50 rounded-lg p-4\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">Compiled Resource Details</h3>\n\n <div className=\"bg-white rounded-lg border p-4 space-y-3\">\n <div className=\"flex items-start\">\n <span className=\"font-semibold text-gray-700 w-32\">ID:</span>\n <span className=\"font-mono text-gray-900\">{resource.id}</span>\n </div>\n\n <div className=\"flex items-start\">\n <span className=\"font-semibold text-gray-700 w-32\">Resource Type:</span>\n <span className=\"text-gray-900\">\n {resource.resourceType.name || resource.resourceType.key}\n <span className=\"ml-2 text-xs font-mono bg-gray-100 px-2 py-1 rounded\">\n ({resource.resourceType.index})\n </span>\n </span>\n </div>\n\n <div className=\"flex items-start\">\n <span className=\"font-semibold text-gray-700 w-32\">Decision:</span>\n <span className=\"text-gray-900\">\n <span className=\"font-mono\">\n Decision {resource.decision.baseDecision?.index ?? resource.decision.index ?? 'unknown'}{' '}\n with {resource.decision.candidates.length} candidates\n </span>\n </span>\n </div>\n </div>\n </div>\n\n {/* Candidates Section - Now with full candidate data including bodies! */}\n <div className=\"bg-gray-50 rounded-lg p-4\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">Candidates</h3>\n\n <div className=\"space-y-4\">\n {resource.candidates.map((candidate: any, candidateIdx: number) => {\n // Get the corresponding decision candidate to access condition sets\n const decisionCandidate = resource.decision.candidates[candidateIdx];\n\n return (\n <div key={candidateIdx} className=\"bg-white rounded-lg border p-4\">\n <div className=\"mb-3\">\n <h4 className=\"font-semibold text-gray-900\">\n Candidate {candidateIdx + 1}\n {candidate.isPartial && (\n <span className=\"ml-2 bg-yellow-100 text-yellow-800 px-2 py-1 rounded text-xs\">\n Partial\n </span>\n )}\n </h4>\n </div>\n\n {/* Candidate JSON Data - This is the actual resource content! */}\n <div className=\"bg-gray-50 rounded p-3 mb-3\">\n <h6 className=\"text-sm font-semibold text-gray-700 mb-2\">Resource Content:</h6>\n <pre className=\"text-sm font-mono text-gray-800 whitespace-pre-wrap\">\n {JSON.stringify(candidate.json, null, 2)}\n </pre>\n </div>\n\n {/* Conditions from the condition set */}\n {decisionCandidate?.conditionSet &&\n decisionCandidate.conditionSet.conditions.length > 0 && (\n <div className=\"border-t pt-3\">\n <h5 className=\"text-sm font-semibold text-gray-700 mb-2\">\n Condition Set {decisionCandidate.conditionSet.index}:\n </h5>\n <div className=\"space-y-2\">\n {decisionCandidate.conditionSet.conditions.map((condition: any, idx: number) => (\n <div key={idx} className=\"flex items-center text-sm bg-blue-50 rounded px-3 py-2\">\n <span className=\"font-mono text-blue-700 mr-2 text-xs\">\n {condition.index.toString().padStart(2, '0')}:\n </span>\n <span className=\"font-medium text-blue-900 mr-2\">\n {condition.qualifier.name}\n </span>\n <span className=\"text-blue-700 mr-2\">{condition.operator}</span>\n <span className=\"font-mono text-blue-800\">{condition.value}</span>\n <span className=\"ml-auto text-xs text-blue-600\">\n Priority: {condition.priority}\n {condition.scoreAsDefault !== undefined && (\n <span className=\"ml-2\">Default: {condition.scoreAsDefault}</span>\n )}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {(!decisionCandidate?.conditionSet ||\n decisionCandidate.conditionSet.conditions.length === 0) && (\n <div className=\"border-t pt-3\">\n <span className=\"text-xs text-gray-500 bg-gray-100 px-2 py-1 rounded\">\n No conditions (default candidate)\n </span>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n };\n\n // New function that uses runtime collections instead of raw JSON\n const renderRuntimeCollection = (collectionType: string, manager: any) => {\n let collector: any;\n let title: string;\n\n switch (collectionType) {\n case 'qualifiers':\n collector = manager.qualifiers;\n title = 'Qualifiers';\n break;\n case 'qualifier-types':\n collector = manager.qualifierTypes;\n title = 'Qualifier Types';\n break;\n case 'resource-types':\n collector = manager.resourceTypes;\n title = 'Resource Types';\n break;\n case 'conditions':\n collector = manager.conditions;\n title = 'Conditions';\n break;\n case 'condition-sets':\n collector = manager.conditionSets;\n title = 'Condition Sets';\n break;\n case 'decisions':\n collector = manager.decisions;\n title = 'Decisions';\n break;\n default:\n return (\n <div className=\"bg-white rounded-lg border p-4\">\n <p className=\"text-sm text-gray-500\">Unknown collection type: {collectionType}</p>\n </div>\n );\n }\n\n const items = Array.from(collector.values());\n\n return (\n <div className=\"bg-gray-50 rounded-lg p-4\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n {title} <span className=\"text-sm font-normal text-gray-600\">({items.length})</span>\n </h3>\n\n {items.length === 0 ? (\n <div className=\"bg-white rounded-lg border p-4\">\n <p className=\"text-sm text-gray-500\">No {title.toLowerCase()} available</p>\n </div>\n ) : (\n <div className=\"space-y-3 max-h-96 overflow-y-auto\">\n {items.map((item: any, index: number) => (\n <div key={index} className=\"bg-white rounded-lg border p-4\">\n <div className=\"flex items-start justify-between mb-3\">\n <div>\n <h4 className=\"font-semibold text-gray-900\">\n {getItemDisplayName(item, collectionType, index)}\n </h4>\n <p className=\"text-sm text-gray-600 font-mono mt-1\">\n {getItemDisplayKey(item, collectionType)}\n </p>\n </div>\n {item.index !== undefined && (\n <span className=\"bg-gray-100 text-gray-700 px-2 py-1 rounded text-xs font-mono\">\n Index: {item.index}\n </span>\n )}\n </div>\n\n <div className=\"border-t pt-3\">{renderRuntimeItemDetail(item, collectionType)}</div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n };\n\n // Helper functions for runtime object display\n const getItemDisplayName = (item: any, collectionType: string, index: number): string => {\n switch (collectionType) {\n case 'qualifiers':\n return `${item.index}: ${item.name} (${item.type.name})`;\n case 'qualifier-types':\n return `${item.index}: ${item.name} (${item.systemType})`;\n case 'resource-types':\n return `${item.index}: ${item.name || item.key}`;\n case 'conditions':\n return `${item.index.toString().padStart(2, '0')}: ${item.qualifier.name} ${item.operator} ${\n item.value\n }`;\n case 'condition-sets':\n return `${item.index}: ${\n item.conditions.length === 0 ? 'Unconditional' : `${item.conditions.length} conditions`\n }`;\n case 'decisions':\n return `${item.baseDecision?.index ?? item.index}: Decision with ${\n item.candidates.length\n } candidates`;\n default:\n return `${index}: Item ${index}`;\n }\n };\n\n const getItemDisplayKey = (item: any, collectionType: string): string => {\n try {\n switch (collectionType) {\n case 'qualifiers':\n return `defaultPriority: ${item?.defaultPriority ?? 'N/A'}`;\n case 'qualifier-types':\n return `allowContextList: ${item?.allowContextList ?? 'N/A'}`;\n case 'resource-types':\n return `key: ${item?.key ?? 'N/A'}`;\n case 'conditions':\n return `priority: ${item?.priority ?? 'N/A'}`;\n case 'condition-sets':\n return (\n item?.conditions\n ?.map((c: any) => `${c?.qualifier?.name ?? 'unknown'}=${c?.value ?? 'unknown'}`)\n .join(', ') || 'default'\n );\n case 'decisions':\n return `${item?.conditionSets?.length ?? 0} condition sets`;\n default:\n return '';\n }\n } catch (error) {\n console.warn('Error in getItemDisplayKey:', error, { item, collectionType });\n return 'Display error';\n }\n };\n\n const renderRuntimeItemDetail = (item: any, collectionType: string) => {\n switch (collectionType) {\n case 'qualifiers':\n return (\n <div className=\"space-y-2\">\n <div>\n <span className=\"font-medium\">Type:</span> {item.type.name}\n </div>\n <div>\n <span className=\"font-medium\">Default Priority:</span> {item.defaultPriority}\n </div>\n </div>\n );\n case 'qualifier-types':\n return (\n <div className=\"space-y-2\">\n <div>\n <span className=\"font-medium\">System Type:</span> {item.systemType}\n </div>\n <div>\n <span className=\"font-medium\">Allow Context List:</span> {item.allowContextList ? 'Yes' : 'No'}\n </div>\n {item.enumeratedValues && (\n <div>\n <span className=\"font-medium\">Enumerated Values:</span> {item.enumeratedValues.join(', ')}\n </div>\n )}\n </div>\n );\n case 'resource-types':\n return (\n <div className=\"space-y-2\">\n <div>\n <span className=\"font-medium\">Key:</span> {item.key}\n </div>\n <div>\n <span className=\"font-medium\">Name:</span> {item.name}\n </div>\n </div>\n );\n case 'conditions':\n return (\n <div className=\"space-y-2\">\n <div>\n <span className=\"font-medium\">Qualifier:</span> {item.qualifier.name}\n </div>\n <div>\n <span className=\"font-medium\">Operator:</span> {item.operator}\n </div>\n <div>\n <span className=\"font-medium\">Value:</span> {item.value}\n </div>\n <div>\n <span className=\"font-medium\">Priority:</span> {item.priority}\n </div>\n {item.scoreAsDefault !== undefined && (\n <div>\n <span className=\"font-medium\">Score As Default:</span> {item.scoreAsDefault}\n </div>\n )}\n </div>\n );\n case 'condition-sets':\n return (\n <div className=\"space-y-2\">\n <div>\n <span className=\"font-medium\">Conditions:</span> {item.conditions?.length ?? 0}\n </div>\n {(item.conditions?.length ?? 0) > 0 && (\n <div className=\"space-y-1\">\n {item.conditions?.map((condition: any, idx: number) => (\n <div key={idx} className=\"text-xs bg-blue-50 rounded px-2 py-1\">\n {condition.qualifier.name} {condition.operator} {condition.value} (p:{condition.priority})\n </div>\n ))}\n </div>\n )}\n </div>\n );\n case 'decisions':\n return (\n <div className=\"space-y-2\">\n <div>\n <span className=\"font-medium\">Condition Sets:</span> {item.conditionSets?.length ?? 0}\n </div>\n <div>\n <span className=\"font-medium\">Candidates:</span> {item.candidates?.length ?? 0}\n </div>\n </div>\n );\n default:\n return (\n <pre className=\"text-xs bg-gray-50 p-2 rounded overflow-x-auto\">\n {JSON.stringify(item, null, 2)}\n </pre>\n );\n }\n };\n\n const renderRawData = () => {\n return (\n <div className=\"bg-white rounded-lg border p-4\">\n <h4 className=\"font-medium text-gray-700 mb-2\">{node.name}</h4>\n <pre className=\"text-xs bg-gray-50 p-2 rounded overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(node.data, null, 2)}\n </pre>\n </div>\n );\n };\n\n return (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-gray-900\">Details</h3>\n <button\n onClick={() => setShowRawJson(!showRawJson)}\n className=\"text-xs text-gray-500 hover:text-gray-700 px-2 py-1 rounded hover:bg-gray-100\"\n >\n {showRawJson ? 'Rich View' : 'Raw JSON'}\n </button>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {showRawJson ? (\n <div className=\"bg-white rounded-lg border p-4\">\n <pre className=\"text-xs bg-gray-50 p-3 rounded overflow-x-auto\">\n {JSON.stringify(node.data, null, 2)}\n </pre>\n </div>\n ) : (\n renderDetails()\n )}\n </div>\n </div>\n );\n};\n\nexport default CompiledView;\n"]}
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { ConfigurationViewProps } from '../../../types';
3
+ export declare const ConfigurationView: React.FC<ConfigurationViewProps>;
4
+ export default ConfigurationView;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/views/ConfigurationView/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAc7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAOxD,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CA0c9D,CAAC;AAgUF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,363 @@
1
+ import React, { useState, useCallback, useRef } from 'react';
2
+ import { CogIcon, PlusIcon, TrashIcon, ArrowDownTrayIcon, ArrowUpTrayIcon, ExclamationTriangleIcon, InformationCircleIcon, EyeIcon, PencilIcon } from '@heroicons/react/24/outline';
3
+ import { useConfigurationState } from '../../../hooks/useConfigurationState';
4
+ import { QualifierTypeEditForm } from '../../forms/QualifierTypeEditForm';
5
+ import { QualifierEditForm } from '../../forms/QualifierEditForm';
6
+ import { ResourceTypeEditForm } from '../../forms/ResourceTypeEditForm';
7
+ export const ConfigurationView = ({ configuration, onConfigurationChange, onSave, hasUnsavedChanges, onMessage, className = '' }) => {
8
+ const fileInputRef = useRef(null);
9
+ const [editingQualifierType, setEditingQualifierType] = useState(null);
10
+ const [editingQualifier, setEditingQualifier] = useState(null);
11
+ const [editingResourceType, setEditingResourceType] = useState(null);
12
+ const [showAddQualifierType, setShowAddQualifierType] = useState(false);
13
+ const [showAddQualifier, setShowAddQualifier] = useState(false);
14
+ const [showAddResourceType, setShowAddResourceType] = useState(false);
15
+ const { state, actions, templates } = useConfigurationState(configuration || undefined, onConfigurationChange, hasUnsavedChanges
16
+ ? undefined
17
+ : (changes) => {
18
+ // Only notify if we weren't already told there are unsaved changes
19
+ });
20
+ // Handle file import
21
+ const handleFileImport = useCallback((files) => {
22
+ if (!files || files.length === 0)
23
+ return;
24
+ const file = files[0];
25
+ const reader = new FileReader();
26
+ reader.onload = (e) => {
27
+ const content = e.target?.result;
28
+ if (content) {
29
+ const result = actions.importFromJson(content);
30
+ if (result.isSuccess()) {
31
+ onMessage?.('success', `Configuration imported from ${file.name}`);
32
+ }
33
+ else {
34
+ onMessage?.('error', `Import failed: ${result.message}`);
35
+ }
36
+ }
37
+ };
38
+ reader.onerror = () => {
39
+ onMessage?.('error', `Failed to read file: ${file.name}`);
40
+ };
41
+ reader.readAsText(file);
42
+ }, [actions, onMessage]);
43
+ // Handle export
44
+ const handleExport = useCallback(() => {
45
+ const result = actions.exportToJson({ format: 'json', pretty: true });
46
+ if (result.isSuccess()) {
47
+ const blob = new Blob([result.value], { type: 'application/json' });
48
+ const url = URL.createObjectURL(blob);
49
+ const a = document.createElement('a');
50
+ a.href = url;
51
+ a.download = 'ts-res-configuration.json';
52
+ document.body.appendChild(a);
53
+ a.click();
54
+ document.body.removeChild(a);
55
+ URL.revokeObjectURL(url);
56
+ onMessage?.('success', 'Configuration exported successfully');
57
+ }
58
+ else {
59
+ onMessage?.('error', `Export failed: ${result.message}`);
60
+ }
61
+ }, [actions, onMessage]);
62
+ // Handle template loading
63
+ const handleLoadTemplate = useCallback((templateId) => {
64
+ const result = actions.loadTemplate(templateId);
65
+ if (result.isSuccess()) {
66
+ const template = templates.find((t) => t.id === templateId);
67
+ onMessage?.('success', `Loaded template: ${template?.name}`);
68
+ }
69
+ else {
70
+ onMessage?.('error', `Failed to load template: ${result.message}`);
71
+ }
72
+ }, [actions, templates, onMessage]);
73
+ // Handle save
74
+ const handleSave = useCallback(() => {
75
+ if (onSave) {
76
+ onSave(state.currentConfiguration);
77
+ actions.applyConfiguration();
78
+ onMessage?.('success', 'Configuration saved successfully');
79
+ }
80
+ }, [onSave, state.currentConfiguration, actions, onMessage]);
81
+ if (!configuration && !state.currentConfiguration) {
82
+ return (React.createElement("div", { className: `p-6 ${className}` },
83
+ React.createElement("div", { className: "flex items-center space-x-3 mb-6" },
84
+ React.createElement(CogIcon, { className: "h-8 w-8 text-blue-600" }),
85
+ React.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, "Configuration")),
86
+ React.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-8 text-center" },
87
+ React.createElement("div", { className: "max-w-2xl mx-auto" },
88
+ React.createElement("h3", { className: "text-xl font-semibold text-gray-900 mb-4" }, "No Configuration Available"),
89
+ React.createElement("p", { className: "text-gray-600 mb-6" }, "Load a configuration to manage qualifiers, qualifier types, and resource types."),
90
+ React.createElement("div", { className: "bg-blue-50 rounded-lg p-4" },
91
+ React.createElement("p", { className: "text-sm text-blue-800" },
92
+ React.createElement("strong", null, "Configuration Manager:"),
93
+ " Define and manage system configurations for resource management, including qualifiers, qualifier types, and resource types."))))));
94
+ }
95
+ return (React.createElement("div", { className: `p-6 ${className}` },
96
+ React.createElement("div", { className: "flex items-center justify-between mb-6" },
97
+ React.createElement("div", { className: "flex items-center space-x-3" },
98
+ React.createElement(CogIcon, { className: "h-8 w-8 text-blue-600" }),
99
+ React.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, "Configuration"),
100
+ state.hasUnsavedChanges && (React.createElement("span", { className: "inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800" }, "Unsaved Changes"))),
101
+ React.createElement("div", { className: "flex items-center space-x-2" },
102
+ React.createElement("select", { onChange: (e) => e.target.value && handleLoadTemplate(e.target.value), value: "", className: "px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" },
103
+ React.createElement("option", { value: "" }, "Load Template..."),
104
+ templates.map((template) => (React.createElement("option", { key: template.id, value: template.id }, template.name)))),
105
+ React.createElement("button", { onClick: () => fileInputRef.current?.click(), className: "inline-flex items-center px-3 py-2 border border-gray-300 rounded-md text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500" },
106
+ React.createElement(ArrowUpTrayIcon, { className: "w-4 h-4 mr-2" }),
107
+ "Import"),
108
+ React.createElement("button", { onClick: handleExport, className: "inline-flex items-center px-3 py-2 border border-gray-300 rounded-md text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500" },
109
+ React.createElement(ArrowDownTrayIcon, { className: "w-4 h-4 mr-2" }),
110
+ "Export"),
111
+ React.createElement("button", { onClick: actions.toggleJsonView, className: `inline-flex items-center px-3 py-2 border rounded-md text-sm font-medium focus:outline-none focus:ring-2 focus:ring-blue-500 ${state.isJsonView
112
+ ? 'border-blue-600 text-blue-600 bg-blue-50'
113
+ : 'border-gray-300 text-gray-700 bg-white hover:bg-gray-50'}` }, state.isJsonView ? (React.createElement(React.Fragment, null,
114
+ React.createElement(PencilIcon, { className: "w-4 h-4 mr-2" }),
115
+ "Form View")) : (React.createElement(React.Fragment, null,
116
+ React.createElement(EyeIcon, { className: "w-4 h-4 mr-2" }),
117
+ "JSON View"))),
118
+ onSave && (React.createElement("button", { onClick: handleSave, disabled: !state.hasUnsavedChanges, className: `inline-flex items-center px-4 py-2 border border-transparent rounded-md text-sm font-medium ${state.hasUnsavedChanges
119
+ ? 'text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500'
120
+ : 'text-gray-400 bg-gray-200 cursor-not-allowed'}` }, "Save")))),
121
+ !state.validation.isValid && (React.createElement("div", { className: "mb-6 bg-red-50 border border-red-200 rounded-lg p-4" },
122
+ React.createElement("div", { className: "flex items-center space-x-2 text-red-600 mb-2" },
123
+ React.createElement(ExclamationTriangleIcon, { className: "w-5 h-5" }),
124
+ React.createElement("span", { className: "font-medium" }, "Configuration Issues")),
125
+ React.createElement("ul", { className: "text-sm text-red-700 space-y-1" }, state.validation.errors.map((error, index) => (React.createElement("li", { key: index },
126
+ "\u2022 ",
127
+ error)))))),
128
+ state.validation.warnings.length > 0 && (React.createElement("div", { className: "mb-6 bg-yellow-50 border border-yellow-200 rounded-lg p-4" },
129
+ React.createElement("div", { className: "flex items-center space-x-2 text-yellow-600 mb-2" },
130
+ React.createElement(InformationCircleIcon, { className: "w-5 h-5" }),
131
+ React.createElement("span", { className: "font-medium" }, "Configuration Warnings")),
132
+ React.createElement("ul", { className: "text-sm text-yellow-700 space-y-1" }, state.validation.warnings.map((warning, index) => (React.createElement("li", { key: index },
133
+ "\u2022 ",
134
+ warning)))))),
135
+ React.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200" }, state.isJsonView ? (
136
+ // JSON Editor View
137
+ React.createElement("div", { className: "p-6" },
138
+ React.createElement("div", { className: "flex items-center justify-between mb-4" },
139
+ React.createElement("h3", { className: "text-lg font-semibold text-gray-900" }, "JSON Configuration"),
140
+ React.createElement("button", { onClick: () => {
141
+ const result = actions.applyJsonChanges();
142
+ if (result.isSuccess()) {
143
+ onMessage?.('success', 'JSON changes applied');
144
+ }
145
+ else {
146
+ onMessage?.('error', `JSON error: ${result.message}`);
147
+ }
148
+ }, disabled: !!state.jsonError, className: `px-4 py-2 rounded-md text-sm font-medium ${state.jsonError
149
+ ? 'bg-gray-200 text-gray-400 cursor-not-allowed'
150
+ : 'bg-blue-600 text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500'}` }, "Apply Changes")),
151
+ state.jsonError && (React.createElement("div", { className: "mb-4 bg-red-50 border border-red-200 rounded-lg p-3" },
152
+ React.createElement("p", { className: "text-sm text-red-700" }, state.jsonError))),
153
+ React.createElement("textarea", { value: state.jsonString, onChange: (e) => actions.updateJsonString(e.target.value), className: "w-full h-96 px-3 py-2 border border-gray-300 rounded-md font-mono text-sm focus:outline-none focus:ring-2 focus:ring-blue-500", placeholder: "Enter JSON configuration..." }))) : (
154
+ // Form View
155
+ React.createElement("div", null,
156
+ React.createElement("div", { className: "border-b border-gray-200" },
157
+ React.createElement("nav", { className: "-mb-px flex space-x-8 px-6" }, [
158
+ {
159
+ key: 'qualifiers',
160
+ label: 'Qualifiers',
161
+ count: state.currentConfiguration.qualifiers?.length || 0
162
+ },
163
+ {
164
+ key: 'qualifierTypes',
165
+ label: 'Qualifier Types',
166
+ count: state.currentConfiguration.qualifierTypes?.length || 0
167
+ },
168
+ {
169
+ key: 'resourceTypes',
170
+ label: 'Resource Types',
171
+ count: state.currentConfiguration.resourceTypes?.length || 0
172
+ }
173
+ ].map((tab) => (React.createElement("button", { key: tab.key, onClick: () => actions.setActiveTab(tab.key), className: `py-4 px-1 border-b-2 font-medium text-sm whitespace-nowrap ${state.activeTab === tab.key
174
+ ? 'border-blue-600 text-blue-600'
175
+ : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'}` },
176
+ tab.label,
177
+ React.createElement("span", { className: "ml-2 bg-gray-100 text-gray-900 rounded-full px-2.5 py-0.5 text-xs font-medium" }, tab.count)))))),
178
+ React.createElement("div", { className: "p-6" },
179
+ state.activeTab === 'qualifiers' && (React.createElement(QualifiersPanel, { qualifiers: state.currentConfiguration.qualifiers || [], qualifierTypes: state.currentConfiguration.qualifierTypes || [], onUpdateItem: actions.updateQualifier, onRemove: actions.removeQualifier, onShowAdd: () => setShowAddQualifier(true), onEdit: (item, index) => setEditingQualifier({ item, index }) })),
180
+ state.activeTab === 'qualifierTypes' && (React.createElement(QualifierTypesPanel, { qualifierTypes: state.currentConfiguration.qualifierTypes || [], onUpdateItem: actions.updateQualifierType, onRemove: actions.removeQualifierType, onShowAdd: () => setShowAddQualifierType(true), onEdit: (item, index) => setEditingQualifierType({ item, index }) })),
181
+ state.activeTab === 'resourceTypes' && (React.createElement(ResourceTypesPanel, { resourceTypes: state.currentConfiguration.resourceTypes || [], onUpdateItem: actions.updateResourceType, onRemove: actions.removeResourceType, onShowAdd: () => setShowAddResourceType(true), onEdit: (item, index) => setEditingResourceType({ item, index }) })))))),
182
+ React.createElement("input", { ref: fileInputRef, type: "file", accept: ".json", onChange: (e) => handleFileImport(e.target.files), className: "hidden" }),
183
+ showAddQualifierType && (React.createElement(QualifierTypeEditForm, { onSave: (qualifierType) => {
184
+ actions.addQualifierType(qualifierType);
185
+ setShowAddQualifierType(false);
186
+ onMessage?.('success', `Added qualifier type: ${qualifierType.name}`);
187
+ }, onCancel: () => setShowAddQualifierType(false), existingNames: (state.currentConfiguration.qualifierTypes || []).map((qt) => qt.name) })),
188
+ editingQualifierType && (React.createElement(QualifierTypeEditForm, { qualifierType: editingQualifierType.item, onSave: (qualifierType) => {
189
+ actions.updateQualifierType(editingQualifierType.index, qualifierType);
190
+ setEditingQualifierType(null);
191
+ onMessage?.('success', `Updated qualifier type: ${qualifierType.name}`);
192
+ }, onCancel: () => setEditingQualifierType(null), existingNames: (state.currentConfiguration.qualifierTypes || [])
193
+ .filter((_, i) => i !== editingQualifierType.index)
194
+ .map((qt) => qt.name) })),
195
+ showAddQualifier && (React.createElement(QualifierEditForm, { qualifierTypes: state.currentConfiguration.qualifierTypes || [], onSave: (qualifier) => {
196
+ actions.addQualifier(qualifier);
197
+ setShowAddQualifier(false);
198
+ onMessage?.('success', `Added qualifier: ${qualifier.name}`);
199
+ }, onCancel: () => setShowAddQualifier(false), existingNames: (state.currentConfiguration.qualifiers || []).map((q) => q.name) })),
200
+ editingQualifier && (React.createElement(QualifierEditForm, { qualifier: editingQualifier.item, qualifierTypes: state.currentConfiguration.qualifierTypes || [], onSave: (qualifier) => {
201
+ actions.updateQualifier(editingQualifier.index, qualifier);
202
+ setEditingQualifier(null);
203
+ onMessage?.('success', `Updated qualifier: ${qualifier.name}`);
204
+ }, onCancel: () => setEditingQualifier(null), existingNames: (state.currentConfiguration.qualifiers || [])
205
+ .filter((_, i) => i !== editingQualifier.index)
206
+ .map((q) => q.name) })),
207
+ showAddResourceType && (React.createElement(ResourceTypeEditForm, { onSave: (resourceType) => {
208
+ actions.addResourceType(resourceType);
209
+ setShowAddResourceType(false);
210
+ onMessage?.('success', `Added resource type: ${resourceType.name}`);
211
+ }, onCancel: () => setShowAddResourceType(false), existingNames: (state.currentConfiguration.resourceTypes || []).map((rt) => rt.name) })),
212
+ editingResourceType && (React.createElement(ResourceTypeEditForm, { resourceType: editingResourceType.item, onSave: (resourceType) => {
213
+ actions.updateResourceType(editingResourceType.index, resourceType);
214
+ setEditingResourceType(null);
215
+ onMessage?.('success', `Updated resource type: ${resourceType.name}`);
216
+ }, onCancel: () => setEditingResourceType(null), existingNames: (state.currentConfiguration.resourceTypes || [])
217
+ .filter((_, i) => i !== editingResourceType.index)
218
+ .map((rt) => rt.name) }))));
219
+ };
220
+ const QualifierTypesPanel = ({ qualifierTypes, onRemove, onShowAdd, onEdit }) => {
221
+ const getConfigurationSummary = (type) => {
222
+ if (!type.configuration)
223
+ return 'No configuration';
224
+ const config = type.configuration;
225
+ const details = [];
226
+ if (config.allowContextList)
227
+ details.push('Context List');
228
+ if (type.systemType === 'literal') {
229
+ if (config.caseSensitive === false)
230
+ details.push('Case Insensitive');
231
+ if (config.enumeratedValues?.length)
232
+ details.push(`${config.enumeratedValues.length} values`);
233
+ }
234
+ if (type.systemType === 'territory') {
235
+ if (config.acceptLowercase)
236
+ details.push('Accept Lowercase');
237
+ if (config.allowedTerritories?.length)
238
+ details.push(`${config.allowedTerritories.length} territories`);
239
+ }
240
+ return details.length > 0 ? details.join(', ') : 'Default settings';
241
+ };
242
+ return (React.createElement("div", null,
243
+ React.createElement("div", { className: "flex items-center justify-between mb-4" },
244
+ React.createElement("h3", { className: "text-lg font-semibold text-gray-900" }, "Qualifier Types"),
245
+ React.createElement("button", { onClick: onShowAdd, className: "inline-flex items-center px-3 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700" },
246
+ React.createElement(PlusIcon, { className: "w-4 h-4 mr-2" }),
247
+ "Add Type")),
248
+ qualifierTypes.length === 0 ? (React.createElement("div", { className: "text-center py-8 text-gray-500" },
249
+ React.createElement(CogIcon, { className: "w-12 h-12 mx-auto mb-4 text-gray-400" }),
250
+ React.createElement("p", null, "No qualifier types defined"),
251
+ React.createElement("p", { className: "text-sm" }, "Add a qualifier type to get started"))) : (React.createElement("div", { className: "space-y-3" }, qualifierTypes.map((type, index) => (React.createElement("div", { key: index, className: "bg-gray-50 p-4 rounded-lg border border-gray-200 hover:border-gray-300 transition-colors" },
252
+ React.createElement("div", { className: "flex items-start justify-between" },
253
+ React.createElement("div", { className: "flex-1" },
254
+ React.createElement("div", { className: "flex items-center space-x-2 mb-2" },
255
+ React.createElement("h4", { className: "font-medium text-gray-900" }, type.name),
256
+ React.createElement("span", { className: `px-2 py-1 text-xs font-medium rounded-full ${type.systemType === 'language'
257
+ ? 'bg-blue-100 text-blue-800'
258
+ : type.systemType === 'territory'
259
+ ? 'bg-green-100 text-green-800'
260
+ : 'bg-purple-100 text-purple-800'}` }, type.systemType)),
261
+ React.createElement("p", { className: "text-sm text-gray-600 mb-2" }, getConfigurationSummary(type))),
262
+ React.createElement("div", { className: "flex items-center space-x-2 ml-4" },
263
+ React.createElement("button", { onClick: () => onEdit(type, index), className: "p-1.5 text-gray-400 hover:text-blue-600 hover:bg-blue-50 rounded", title: "Edit qualifier type" },
264
+ React.createElement(PencilIcon, { className: "w-4 h-4" })),
265
+ React.createElement("button", { onClick: () => onRemove(index), className: "p-1.5 text-gray-400 hover:text-red-600 hover:bg-red-50 rounded", title: "Delete qualifier type" },
266
+ React.createElement(TrashIcon, { className: "w-4 h-4" })))))))))));
267
+ };
268
+ const QualifiersPanel = ({ qualifiers, qualifierTypes, onRemove, onShowAdd, onEdit }) => {
269
+ // Sort qualifiers by priority (highest first)
270
+ const sortedQualifiers = [...qualifiers].sort((a, b) => b.defaultPriority - a.defaultPriority);
271
+ const getQualifierSummary = (qualifier) => {
272
+ const qualifierType = qualifierTypes.find((qt) => qt.name === qualifier.typeName);
273
+ const details = [];
274
+ if (qualifier.token)
275
+ details.push(`Token: ${qualifier.token}`);
276
+ if (qualifier.defaultValue)
277
+ details.push(`Default: ${qualifier.defaultValue}`);
278
+ if (qualifier.tokenIsOptional)
279
+ details.push('Optional Token');
280
+ if (qualifierType)
281
+ details.push(`System: ${qualifierType.systemType}`);
282
+ return details.join(' • ');
283
+ };
284
+ return (React.createElement("div", null,
285
+ React.createElement("div", { className: "flex items-center justify-between mb-4" },
286
+ React.createElement("h3", { className: "text-lg font-semibold text-gray-900" }, "Qualifiers"),
287
+ React.createElement("button", { onClick: onShowAdd, disabled: qualifierTypes.length === 0, className: "inline-flex items-center px-3 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed", title: qualifierTypes.length === 0 ? 'Add qualifier types first' : 'Add qualifier' },
288
+ React.createElement(PlusIcon, { className: "w-4 h-4 mr-2" }),
289
+ "Add Qualifier")),
290
+ qualifierTypes.length === 0 ? (React.createElement("div", { className: "text-center py-8 text-gray-500" },
291
+ React.createElement(ExclamationTriangleIcon, { className: "w-12 h-12 mx-auto mb-4 text-amber-400" }),
292
+ React.createElement("p", null, "No qualifier types available"),
293
+ React.createElement("p", { className: "text-sm" }, "Create qualifier types first before adding qualifiers"))) : qualifiers.length === 0 ? (React.createElement("div", { className: "text-center py-8 text-gray-500" },
294
+ React.createElement(CogIcon, { className: "w-12 h-12 mx-auto mb-4 text-gray-400" }),
295
+ React.createElement("p", null, "No qualifiers defined"),
296
+ React.createElement("p", { className: "text-sm" }, "Add a qualifier to get started"))) : (React.createElement("div", { className: "space-y-3" }, sortedQualifiers.map((qualifier, index) => {
297
+ const originalIndex = qualifiers.findIndex((q) => q === qualifier);
298
+ const qualifierType = qualifierTypes.find((qt) => qt.name === qualifier.typeName);
299
+ return (React.createElement("div", { key: originalIndex, className: "bg-gray-50 p-4 rounded-lg border border-gray-200 hover:border-gray-300 transition-colors" },
300
+ React.createElement("div", { className: "flex items-center justify-between" },
301
+ React.createElement("div", { className: "flex-1" },
302
+ React.createElement("div", { className: "flex items-center space-x-3 mb-2" },
303
+ React.createElement("h4", { className: "font-medium text-gray-900" }, qualifier.name),
304
+ React.createElement("span", { className: "text-gray-600 text-sm" }, qualifier.typeName),
305
+ qualifier.token && (React.createElement("span", { className: "px-2 py-1 text-xs font-medium bg-purple-100 text-purple-700 rounded" },
306
+ "token: ",
307
+ qualifier.token)),
308
+ !qualifierType && (React.createElement("span", { className: "px-2 py-1 text-xs font-medium bg-red-100 text-red-800 rounded-full" }, "Missing Type"))),
309
+ React.createElement("div", { className: "flex items-center justify-between text-sm text-gray-600" },
310
+ React.createElement("span", null,
311
+ "Type: ",
312
+ qualifier.typeName),
313
+ React.createElement("span", null,
314
+ "Priority: ",
315
+ qualifier.defaultPriority))),
316
+ React.createElement("div", { className: "flex items-center space-x-2 ml-4" },
317
+ React.createElement("button", { onClick: () => onEdit(qualifier, originalIndex), className: "p-1.5 text-gray-400 hover:text-blue-600 hover:bg-blue-50 rounded", title: "Edit qualifier" },
318
+ React.createElement(PencilIcon, { className: "w-4 h-4" })),
319
+ React.createElement("button", { onClick: () => onRemove(originalIndex), className: "p-1.5 text-gray-400 hover:text-red-600 hover:bg-red-50 rounded", title: "Delete qualifier" },
320
+ React.createElement(TrashIcon, { className: "w-4 h-4" }))))));
321
+ })))));
322
+ };
323
+ const ResourceTypesPanel = ({ resourceTypes, onRemove, onShowAdd, onEdit }) => {
324
+ const getTypeNameBadgeColor = (typeName) => {
325
+ switch (typeName) {
326
+ case 'string':
327
+ return 'bg-blue-100 text-blue-800';
328
+ case 'object':
329
+ return 'bg-green-100 text-green-800';
330
+ case 'array':
331
+ return 'bg-purple-100 text-purple-800';
332
+ case 'number':
333
+ return 'bg-yellow-100 text-yellow-800';
334
+ case 'boolean':
335
+ return 'bg-red-100 text-red-800';
336
+ default:
337
+ return 'bg-gray-100 text-gray-800';
338
+ }
339
+ };
340
+ return (React.createElement("div", null,
341
+ React.createElement("div", { className: "flex items-center justify-between mb-4" },
342
+ React.createElement("h3", { className: "text-lg font-semibold text-gray-900" }, "Resource Types"),
343
+ React.createElement("button", { onClick: onShowAdd, className: "inline-flex items-center px-3 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700" },
344
+ React.createElement(PlusIcon, { className: "w-4 h-4 mr-2" }),
345
+ "Add Type")),
346
+ resourceTypes.length === 0 ? (React.createElement("div", { className: "text-center py-8 text-gray-500" },
347
+ React.createElement(CogIcon, { className: "w-12 h-12 mx-auto mb-4 text-gray-400" }),
348
+ React.createElement("p", null, "No resource types defined"),
349
+ React.createElement("p", { className: "text-sm" }, "Add a resource type to get started"))) : (React.createElement("div", { className: "space-y-3" }, resourceTypes.map((type, index) => (React.createElement("div", { key: index, className: "bg-gray-50 p-4 rounded-lg border border-gray-200 hover:border-gray-300 transition-colors" },
350
+ React.createElement("div", { className: "flex items-start justify-between" },
351
+ React.createElement("div", { className: "flex-1" },
352
+ React.createElement("div", { className: "flex items-center space-x-2 mb-2" },
353
+ React.createElement("h4", { className: "font-medium text-gray-900" }, type.name),
354
+ React.createElement("span", { className: `px-2 py-1 text-xs font-medium rounded-full ${getTypeNameBadgeColor(type.typeName)}` }, type.typeName)),
355
+ React.createElement("p", { className: "text-sm text-gray-600" }, "Defines how resources of this type are processed and validated")),
356
+ React.createElement("div", { className: "flex items-center space-x-2 ml-4" },
357
+ React.createElement("button", { onClick: () => onEdit(type, index), className: "p-1.5 text-gray-400 hover:text-blue-600 hover:bg-blue-50 rounded", title: "Edit resource type" },
358
+ React.createElement(PencilIcon, { className: "w-4 h-4" })),
359
+ React.createElement("button", { onClick: () => onRemove(index), className: "p-1.5 text-gray-400 hover:text-red-600 hover:bg-red-50 rounded", title: "Delete resource type" },
360
+ React.createElement(TrashIcon, { className: "w-4 h-4" })))))))))));
361
+ };
362
+ export default ConfigurationView;
363
+ //# sourceMappingURL=index.js.map