@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.
Files changed (179) hide show
  1. package/lib/components/common/AppHeader.d.ts.map +1 -0
  2. package/lib/components/common/AppHeader.js.map +1 -0
  3. package/lib/components/common/AppLayout.d.ts.map +1 -0
  4. package/lib/components/common/AppLayout.js.map +1 -0
  5. package/lib/components/common/AppSidebar.d.ts.map +1 -0
  6. package/lib/components/common/AppSidebar.js.map +1 -0
  7. package/lib/components/common/NavigationWarningModal.d.ts.map +1 -0
  8. package/lib/components/common/NavigationWarningModal.js.map +1 -0
  9. package/lib/components/common/QualifierContextControl.d.ts.map +1 -0
  10. package/lib/components/common/QualifierContextControl.js.map +1 -0
  11. package/lib/components/common/ResolutionContextOptionsControl.d.ts.map +1 -0
  12. package/lib/components/common/ResolutionContextOptionsControl.js.map +1 -0
  13. package/lib/components/common/ResolutionResults/index.d.ts.map +1 -0
  14. package/lib/components/common/ResolutionResults/index.js.map +1 -0
  15. package/lib/components/common/ResourceListView.d.ts.map +1 -0
  16. package/lib/components/common/ResourceListView.js.map +1 -0
  17. package/lib/components/common/ResourcePickerOptionsControl.d.ts.map +1 -0
  18. package/lib/components/common/ResourcePickerOptionsControl.js.map +1 -0
  19. package/lib/components/common/ResourceTreeView.d.ts.map +1 -0
  20. package/lib/components/common/ResourceTreeView.js.map +1 -0
  21. package/lib/components/common/SourceResourceDetail/index.d.ts.map +1 -0
  22. package/lib/components/common/SourceResourceDetail/index.js.map +1 -0
  23. package/lib/components/forms/GenericQualifierTypeEditForm.d.ts.map +1 -0
  24. package/lib/components/forms/GenericQualifierTypeEditForm.js.map +1 -0
  25. package/lib/components/forms/HierarchyEditor.d.ts.map +1 -0
  26. package/lib/components/forms/HierarchyEditor.js.map +1 -0
  27. package/lib/components/forms/QualifierEditForm.d.ts.map +1 -0
  28. package/lib/components/forms/QualifierEditForm.js.map +1 -0
  29. package/lib/components/forms/QualifierTypeEditForm.d.ts.map +1 -0
  30. package/lib/components/forms/QualifierTypeEditForm.js.map +1 -0
  31. package/lib/components/forms/ResourceTypeEditForm.d.ts.map +1 -0
  32. package/lib/components/forms/ResourceTypeEditForm.js.map +1 -0
  33. package/lib/components/forms/index.d.ts.map +1 -0
  34. package/lib/components/forms/index.js.map +1 -0
  35. package/lib/components/orchestrator/ResourceOrchestrator.d.ts.map +1 -0
  36. package/lib/components/orchestrator/ResourceOrchestrator.js.map +1 -0
  37. package/lib/components/pickers/ResourcePicker/ResourceItem.d.ts.map +1 -0
  38. package/lib/components/pickers/ResourcePicker/ResourceItem.js.map +1 -0
  39. package/lib/components/pickers/ResourcePicker/ResourcePickerList.d.ts.map +1 -0
  40. package/lib/components/pickers/ResourcePicker/ResourcePickerList.js.map +1 -0
  41. package/lib/components/pickers/ResourcePicker/ResourcePickerTree.d.ts.map +1 -0
  42. package/lib/components/pickers/ResourcePicker/ResourcePickerTree.js.map +1 -0
  43. package/lib/components/pickers/ResourcePicker/index.d.ts.map +1 -0
  44. package/lib/components/pickers/ResourcePicker/index.js.map +1 -0
  45. package/lib/components/pickers/ResourcePicker/types.d.ts.map +1 -0
  46. package/lib/components/pickers/ResourcePicker/types.js.map +1 -0
  47. package/lib/components/pickers/ResourcePicker/utils/treeNavigation.d.ts.map +1 -0
  48. package/lib/components/pickers/ResourcePicker/utils/treeNavigation.js.map +1 -0
  49. package/lib/components/views/CompiledView/index.d.ts.map +1 -0
  50. package/lib/components/views/CompiledView/index.js.map +1 -0
  51. package/lib/components/views/ConfigurationView/index.d.ts.map +1 -0
  52. package/lib/components/views/ConfigurationView/index.js.map +1 -0
  53. package/lib/components/views/FilterView/index.d.ts.map +1 -0
  54. package/lib/components/views/FilterView/index.js.map +1 -0
  55. package/lib/components/views/GridView/EditableGridCell.d.ts.map +1 -0
  56. package/lib/components/views/GridView/EditableGridCell.js.map +1 -0
  57. package/lib/components/views/GridView/GridSelector.d.ts.map +1 -0
  58. package/lib/components/views/GridView/GridSelector.js.map +1 -0
  59. package/lib/components/views/GridView/MultiGridView.d.ts.map +1 -0
  60. package/lib/components/views/GridView/MultiGridView.js.map +1 -0
  61. package/lib/components/views/GridView/ResourceGrid.d.ts.map +1 -0
  62. package/lib/components/views/GridView/ResourceGrid.js.map +1 -0
  63. package/lib/components/views/GridView/SharedContextControls.d.ts.map +1 -0
  64. package/lib/components/views/GridView/SharedContextControls.js.map +1 -0
  65. package/lib/components/views/GridView/cells/BooleanCell.d.ts.map +1 -0
  66. package/lib/components/views/GridView/cells/BooleanCell.js.map +1 -0
  67. package/lib/components/views/GridView/cells/DropdownCell.d.ts.map +1 -0
  68. package/lib/components/views/GridView/cells/DropdownCell.js.map +1 -0
  69. package/lib/components/views/GridView/cells/StringCell.d.ts.map +1 -0
  70. package/lib/components/views/GridView/cells/StringCell.js.map +1 -0
  71. package/lib/components/views/GridView/cells/TriStateCell.d.ts.map +1 -0
  72. package/lib/components/views/GridView/cells/TriStateCell.js.map +1 -0
  73. package/lib/components/views/GridView/cells/index.d.ts.map +1 -0
  74. package/lib/components/views/GridView/cells/index.js.map +1 -0
  75. package/lib/components/views/GridView/index.d.ts.map +1 -0
  76. package/lib/components/views/GridView/index.js.map +1 -0
  77. package/lib/components/views/ImportView/index.d.ts.map +1 -0
  78. package/lib/components/views/ImportView/index.js.map +1 -0
  79. package/lib/components/views/MessagesWindow/index.d.ts.map +1 -0
  80. package/lib/components/views/MessagesWindow/index.js.map +1 -0
  81. package/lib/components/views/ResolutionView/EditableJsonView.d.ts.map +1 -0
  82. package/lib/components/views/ResolutionView/EditableJsonView.js.map +1 -0
  83. package/lib/components/views/ResolutionView/NewResourceModal.d.ts.map +1 -0
  84. package/lib/components/views/ResolutionView/NewResourceModal.js.map +1 -0
  85. package/lib/components/views/ResolutionView/UnifiedChangeControls.d.ts.map +1 -0
  86. package/lib/components/views/ResolutionView/UnifiedChangeControls.js.map +1 -0
  87. package/lib/components/views/ResolutionView/index.d.ts.map +1 -0
  88. package/lib/components/views/ResolutionView/index.js.map +1 -0
  89. package/lib/components/views/SourceView/index.d.ts.map +1 -0
  90. package/lib/components/views/SourceView/index.js.map +1 -0
  91. package/lib/contexts/ObservabilityContext.d.ts.map +1 -0
  92. package/lib/contexts/ObservabilityContext.js.map +1 -0
  93. package/lib/contexts/index.d.ts.map +1 -0
  94. package/lib/contexts/index.js.map +1 -0
  95. package/lib/hooks/index.d.ts.map +1 -0
  96. package/lib/hooks/index.js.map +1 -0
  97. package/lib/hooks/useConfigurationState.d.ts.map +1 -0
  98. package/lib/hooks/useConfigurationState.js.map +1 -0
  99. package/lib/hooks/useFilterState.d.ts.map +1 -0
  100. package/lib/hooks/useFilterState.js.map +1 -0
  101. package/lib/hooks/useNavigationWarning.d.ts.map +1 -0
  102. package/lib/hooks/useNavigationWarning.js.map +1 -0
  103. package/lib/hooks/useResolutionState.d.ts.map +1 -0
  104. package/lib/hooks/useResolutionState.js.map +1 -0
  105. package/lib/hooks/useResourceData.d.ts.map +1 -0
  106. package/lib/hooks/useResourceData.js.map +1 -0
  107. package/lib/hooks/useSmartObservability.d.ts.map +1 -0
  108. package/lib/hooks/useSmartObservability.js.map +1 -0
  109. package/lib/hooks/useUrlParams.d.ts.map +1 -0
  110. package/lib/hooks/useUrlParams.js.map +1 -0
  111. package/lib/hooks/useViewState.d.ts.map +1 -0
  112. package/lib/hooks/useViewState.js.map +1 -0
  113. package/lib/index.browser.d.ts.map +1 -0
  114. package/lib/index.browser.js.map +1 -0
  115. package/lib/index.d.ts.map +1 -0
  116. package/lib/index.js.map +1 -0
  117. package/lib/namespaces/ConfigurationTools.d.ts.map +1 -0
  118. package/lib/namespaces/ConfigurationTools.js.map +1 -0
  119. package/lib/namespaces/DownloadTools.d.ts.map +1 -0
  120. package/lib/namespaces/DownloadTools.js.map +1 -0
  121. package/lib/namespaces/FilterTools.d.ts.map +1 -0
  122. package/lib/namespaces/FilterTools.js.map +1 -0
  123. package/lib/namespaces/GridTools.d.ts.map +1 -0
  124. package/lib/namespaces/GridTools.js.map +1 -0
  125. package/lib/namespaces/ImportTools.d.ts.map +1 -0
  126. package/lib/namespaces/ImportTools.js.map +1 -0
  127. package/lib/namespaces/ObservabilityTools.d.ts.map +1 -0
  128. package/lib/namespaces/ObservabilityTools.js.map +1 -0
  129. package/lib/namespaces/PickerTools.d.ts.map +1 -0
  130. package/lib/namespaces/PickerTools.js.map +1 -0
  131. package/lib/namespaces/ResolutionTools.d.ts.map +1 -0
  132. package/lib/namespaces/ResolutionTools.js.map +1 -0
  133. package/lib/namespaces/ResourceTools.d.ts.map +1 -0
  134. package/lib/namespaces/ResourceTools.js.map +1 -0
  135. package/lib/namespaces/TsResTools.d.ts.map +1 -0
  136. package/lib/namespaces/TsResTools.js.map +1 -0
  137. package/lib/namespaces/ViewStateTools.d.ts.map +1 -0
  138. package/lib/namespaces/ViewStateTools.js.map +1 -0
  139. package/lib/namespaces/ZipTools.d.ts.map +1 -0
  140. package/lib/namespaces/ZipTools.js.map +1 -0
  141. package/lib/namespaces/index.d.ts.map +1 -0
  142. package/lib/namespaces/index.js.map +1 -0
  143. package/lib/tsdoc-metadata.json +1 -1
  144. package/lib/types/index.d.ts.map +1 -0
  145. package/lib/types/index.js.map +1 -0
  146. package/lib/utils/cellValidation.d.ts.map +1 -0
  147. package/lib/utils/cellValidation.js.map +1 -0
  148. package/lib/utils/configurationUtils.d.ts.map +1 -0
  149. package/lib/utils/configurationUtils.js.map +1 -0
  150. package/lib/utils/downloadHelper.d.ts.map +1 -0
  151. package/lib/utils/downloadHelper.js.map +1 -0
  152. package/lib/utils/filterResources.d.ts.map +1 -0
  153. package/lib/utils/filterResources.js.map +1 -0
  154. package/lib/utils/observability/factories.d.ts.map +1 -0
  155. package/lib/utils/observability/factories.js.map +1 -0
  156. package/lib/utils/observability/implementations.d.ts.map +1 -0
  157. package/lib/utils/observability/implementations.js.map +1 -0
  158. package/lib/utils/observability/index.d.ts.map +1 -0
  159. package/lib/utils/observability/index.js.map +1 -0
  160. package/lib/utils/observability/interfaces.d.ts.map +1 -0
  161. package/lib/utils/observability/interfaces.js.map +1 -0
  162. package/lib/utils/resolutionEditing.d.ts.map +1 -0
  163. package/lib/utils/resolutionEditing.js.map +1 -0
  164. package/lib/utils/resolutionUtils.d.ts.map +1 -0
  165. package/lib/utils/resolutionUtils.js.map +1 -0
  166. package/lib/utils/resourceSelector.d.ts.map +1 -0
  167. package/lib/utils/resourceSelector.js.map +1 -0
  168. package/lib/utils/resourceSelectors.d.ts.map +1 -0
  169. package/lib/utils/resourceSelectors.js.map +1 -0
  170. package/lib/utils/tsResIntegration.d.ts.map +1 -0
  171. package/lib/utils/tsResIntegration.js.map +1 -0
  172. package/lib/utils/zipLoader/index.d.ts.map +1 -0
  173. package/lib/utils/zipLoader/index.js.map +1 -0
  174. package/lib/utils/zipLoader/zipProcessingHelpers.d.ts.map +1 -0
  175. package/lib/utils/zipLoader/zipProcessingHelpers.js.map +1 -0
  176. package/lib/utils/zipLoader/zipUtils.d.ts.map +1 -0
  177. package/lib/utils/zipLoader/zipUtils.js.map +1 -0
  178. package/package.json +25 -23
  179. package/dist/ts-res-ui-components.d.ts +0 -6795
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/views/FilterView/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useMemo, useCallback } from 'react';\nimport { FunnelIcon, ExclamationTriangleIcon, CheckIcon, XMarkIcon } from '@heroicons/react/24/outline';\n// Resources import removed - unused\nimport { IFilterViewProps, IResolutionContextOptions } from '../../../types';\nimport { QualifierContextControl } from '../../common/QualifierContextControl';\nimport { ResourcePicker } from '../../pickers/ResourcePicker';\n// Unused II interfaces import removed\nimport { SourceResourceDetail } from '../../common/SourceResourceDetail';\nimport { ResourcePickerOptionsControl } from '../../common/ResourcePickerOptionsControl';\nimport {\n IResourcePickerOptions,\n IResourceSelection,\n IResourceAnnotations\n} from '../../pickers/ResourcePicker/types';\nimport { IFilteredResource } from '../../../types';\nimport { ResolutionContextOptionsControl } from '../../common/ResolutionContextOptionsControl';\nimport { useSmartObservability } from '../../../hooks/useSmartObservability';\n\n// IIFilteredResource interface removed - unused\n\n/**\n * FilterView component for context-based resource filtering and analysis.\n *\n * Provides a comprehensive interface for filtering resources based on qualifier values,\n * displaying filtered results with candidate count comparisons, and exporting filtered\n * resource collections. Supports partial context matching and qualifier reduction.\n *\n * **Key Features:**\n * - **Context-based filtering**: Filter resources using qualifier values (language, territory, etc.)\n * - **Candidate analysis**: Compare original vs filtered candidate counts for each resource\n * - **Visual indicators**: Highlight resources with reduced candidates or warnings\n * - **Export functionality**: Export filtered resource collections as JSON\n * - **Dual resource comparison**: View original and filtered resource details side-by-side\n * - **Qualifier reduction**: Option to remove perfectly matching qualifiers from results\n *\n * @example\n * ```tsx\n * import { FilterView } from '@fgv/ts-res-ui-components';\n *\n * function MyFilterTool() {\n * const [filterState, setFilterState] = useState({\n * enabled: false,\n * values: {},\n * appliedValues: {},\n * hasPendingChanges: false,\n * reduceQualifiers: false\n * });\n *\n * return (\n * <FilterView\n * resources={processedResources}\n * filterState={filterState}\n * filterActions={{\n * updateFilterEnabled: (enabled) => setFilterState(prev => ({...prev, enabled})),\n * updateFilterValues: (values) => setFilterState(prev => ({...prev, values})),\n * applyFilterValues: () => setFilterState(prev => ({...prev, appliedValues: prev.values})),\n * resetFilterValues: () => setFilterState(prev => ({...prev, values: {}})),\n * updateReduceQualifiers: (reduce) => setFilterState(prev => ({...prev, reduceQualifiers: reduce}))\n * }}\n * onFilterResult={(result) => console.log('Filter result:', result)}\n * />\n * );\n * }\n * ```\n *\n * @public\n */\nexport const FilterView: React.FC<IFilterViewProps> = ({\n resources,\n filterState,\n filterActions,\n filterResult,\n onFilterResult,\n pickerOptions,\n pickerOptionsPanelPresentation = 'hidden',\n contextOptions,\n className = ''\n}) => {\n // Get observability context\n const o11y = useSmartObservability();\n\n // Local UI state\n const [selectedResourceId, setSelectedResourceId] = useState<string | null>(null);\n\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 // Merge picker options with filter-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: '520px',\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 // Available qualifiers from system configuration or compiled collection\n const availableQualifiers = useMemo(() => {\n if (resources?.compiledCollection.qualifiers) {\n return resources.compiledCollection.qualifiers.map((q) => q.name);\n }\n\n // Fallback to default qualifiers if no compiled collection\n return ['language', 'territory', 'currentTerritory', 'role', 'env'];\n }, [resources?.compiledCollection.qualifiers]);\n\n // Merge context options with current options from control\n const effectiveContextOptions = useMemo(\n () => ({\n ...contextOptions,\n ...currentContextOptions\n }),\n [contextOptions, currentContextOptions]\n );\n\n // Handle filter value changes using the shared component's callback pattern\n const handleQualifierChange = useCallback(\n (qualifierName: string, value: string | undefined) => {\n // Don't update filter values if this qualifier is host-managed\n const qualifierOptions = effectiveContextOptions?.qualifierOptions?.[qualifierName];\n const isHostManaged = qualifierOptions?.hostValue !== undefined;\n\n if (!isHostManaged) {\n const newValues = { ...filterState.values, [qualifierName]: value };\n filterActions.updateFilterValues(newValues);\n }\n },\n [filterState.values, filterActions, effectiveContextOptions?.qualifierOptions]\n );\n\n // Check if we have any applied filter values set\n const hasAppliedFilterValues = useMemo(() => {\n if (!filterState.appliedValues) return false;\n return Object.values(filterState.appliedValues).some((value) => value !== undefined && value !== '');\n }, [filterState.appliedValues]);\n\n // Determine if filtering is active (enabled AND has applied values)\n const isFilteringActive = filterState.enabled && hasAppliedFilterValues;\n\n // Simplified filter summary\n const getFilterSummary = useCallback((values: Record<string, string | undefined>) => {\n const activeFilters = Object.entries(values)\n .filter(([, value]) => value !== undefined && value !== '')\n .map(([key, value]) => `${key}=${value}`);\n return activeFilters.length > 0 ? activeFilters.join(', ') : 'No filters';\n }, []);\n\n // Get resources to display (filtered or original) - now uses orchestrator's filterResult\n const displayResources = useMemo(() => {\n o11y.diag.info('FilterView displayResources calculation:', {\n hasResources: !!resources,\n isFilteringActive,\n filterResultExists: !!filterResult,\n filterResultSuccess: filterResult?.success,\n filterResultCount: filterResult?.filteredResources?.length,\n appliedValues: filterState.appliedValues,\n hasAppliedFilterValues\n });\n\n if (!resources) return [];\n\n let resourceList: IFilteredResource[] = [];\n\n if (isFilteringActive && filterResult?.success && filterResult.filteredResources) {\n o11y.diag.info('Using filtered resources:', filterResult.filteredResources.length);\n o11y.diag.info(\n 'Filtered resource details:',\n filterResult.filteredResources.map((r) => ({\n id: r.id,\n original: r.originalCandidateCount,\n filtered: r.filteredCandidateCount,\n hasWarning: r.hasWarning\n }))\n );\n resourceList = filterResult.filteredResources;\n } else {\n // Return original resources\n o11y.diag.info('Using original resources');\n const originalResources = resources.summary.resourceIds || [];\n resourceList = originalResources.map((id) => {\n const resourceResult = resources.system.resourceManager.getBuiltResource(id);\n const candidateCount = resourceResult.isSuccess() ? resourceResult.value.candidates.length : 0;\n\n return {\n id,\n originalCandidateCount: candidateCount,\n filteredCandidateCount: candidateCount,\n hasWarning: false\n };\n });\n }\n\n // Sort resources alphabetically by id\n return resourceList.sort((a, b) => a.id.localeCompare(b.id));\n }, [resources, isFilteringActive, filterResult]);\n\n // Create resource annotations for filtering information\n const resourceAnnotations = useMemo(() => {\n const annotations: IResourceAnnotations = {};\n\n displayResources.forEach((resource) => {\n if (isFilteringActive) {\n // Show filtering effects with candidate count changes\n const originalCount = resource.originalCandidateCount;\n const filteredCount = resource.filteredCandidateCount;\n\n // Determine badge color and text based on filtering result\n let badgeVariant: 'info' | 'warning' | 'error' = 'info';\n let badgeText = `${originalCount} → ${filteredCount}`;\n\n if (filteredCount === 0) {\n badgeVariant = 'error';\n badgeText = `${originalCount} → 0`;\n } else if (filteredCount < originalCount) {\n badgeVariant = 'warning';\n }\n\n annotations[resource.id] = {\n badge: {\n text: badgeText,\n variant: badgeVariant\n }\n };\n\n // Add warning indicator for resources with issues\n if (resource.hasWarning) {\n annotations[resource.id].indicator = {\n type: 'icon',\n value: '⚠️',\n tooltip: 'No matching candidates after filtering'\n };\n }\n } else {\n // Show candidate count only for non-filtered view\n const count = resource.originalCandidateCount;\n annotations[resource.id] = {\n suffix: `${count} candidate${count !== 1 ? 's' : ''}`\n };\n }\n });\n\n return annotations;\n }, [displayResources, isFilteringActive]);\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 filter values including host-managed values\n const effectiveFilterValues = useMemo(() => {\n const baseValues = filterState.values || {};\n const hostValues = effectiveContextOptions?.hostManagedValues || {};\n return { ...baseValues, ...hostValues };\n }, [filterState.values, effectiveContextOptions?.hostManagedValues]);\n\n // Handle resource selection with enhanced callback\n const handleResourceSelect = useCallback((selection: IResourceSelection) => {\n setSelectedResourceId(selection.resourceId);\n }, []);\n\n // Handle filter toggle\n const handleFilterToggle = useCallback(\n (enabled: boolean) => {\n filterActions.updateFilterEnabled(enabled);\n if (!enabled) {\n o11y.user.info('Filtering disabled - showing all resources');\n } else {\n o11y.user.info('Filtering enabled - set qualifier values and click Apply to filter resources');\n }\n },\n [filterActions, o11y]\n );\n\n // Handle apply filter values\n const handleApplyFilter = useCallback(() => {\n filterActions.applyFilterValues();\n o11y.user.info('Filter applied - processing resources...');\n }, [filterActions, o11y]);\n\n // Handle reset filter values\n const handleResetFilter = useCallback(() => {\n filterActions.resetFilterValues();\n o11y.user.info('Filter values reset');\n }, [filterActions, o11y]);\n\n if (!resources) {\n return (\n <div className={`p-6 ${className}`}>\n <div className=\"flex items-center space-x-3 mb-6\">\n <FunnelIcon className=\"h-8 w-8 text-purple-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Filter Tool</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 use the filter tool for context-based resource filtering.\n </p>\n <div className=\"bg-purple-50 rounded-lg p-4\">\n <p className=\"text-sm text-purple-800\">\n <strong>Filter Tool:</strong> Allows you to filter resources based on partial context\n matching, creating focused subsets for analysis and testing.\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 <FunnelIcon className=\"h-8 w-8 text-purple-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Filter Tool</h2>\n </div>\n\n {/* ResourcePicker Options Control */}\n <ResourcePickerOptionsControl\n options={currentPickerOptions}\n onOptionsChange={setCurrentPickerOptions}\n presentation={pickerOptionsPanelPresentation}\n title=\"Filter Tool Picker Options\"\n className=\"mb-6\"\n />\n\n {/* FilterContext Options Control */}\n <ResolutionContextOptionsControl\n options={currentContextOptions}\n onOptionsChange={setCurrentContextOptions}\n availableQualifiers={availableQualifiers}\n presentation={pickerOptionsPanelPresentation}\n title=\"Filter Context Options\"\n className=\"mb-6\"\n />\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n {/* Filter Controls */}\n <div className=\"mb-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-gray-900\">Filter Controls</h3>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-4\">\n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={filterState.enabled}\n onChange={(e) => handleFilterToggle(e.target.checked)}\n className=\"rounded border-gray-300 text-purple-600 focus:ring-purple-500\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">Enable Filtering</span>\n </label>\n <label\n className=\"flex items-center\"\n title=\"Remove perfectly matching qualifier conditions from filtered resources to create cleaner bundles for comparison\"\n >\n <input\n type=\"checkbox\"\n checked={filterState.reduceQualifiers}\n onChange={(e) => filterActions.updateReduceQualifiers(e.target.checked)}\n disabled={!filterState.enabled}\n className=\"rounded border-gray-300 text-purple-600 focus:ring-purple-500 disabled:text-gray-400\"\n />\n <span\n className={`ml-2 text-sm ${!filterState.enabled ? 'text-gray-400' : 'text-gray-700'}`}\n >\n Reduce Qualifiers\n </span>\n </label>\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 Active{filterState.reduceQualifiers ? ' + Reducing' : ''}\n </span>\n )}\n {filterState.hasPendingChanges && filterState.enabled && (\n <span className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-amber-100 text-amber-800\">\n Pending Changes\n </span>\n )}\n </div>\n\n {filterState.enabled && (\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={handleResetFilter}\n className=\"inline-flex items-center px-3 py-1.5 text-xs font-medium text-gray-700 bg-gray-100 border border-gray-300 rounded-md hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-purple-500\"\n >\n <XMarkIcon className=\"h-4 w-4 mr-1\" />\n Reset\n </button>\n <button\n onClick={handleApplyFilter}\n disabled={!filterState.hasPendingChanges}\n className={`inline-flex items-center px-3 py-1.5 text-xs font-medium rounded-md focus:outline-none focus:ring-2 focus:ring-purple-500 ${\n filterState.hasPendingChanges\n ? 'text-white bg-purple-600 hover:bg-purple-700'\n : 'text-gray-400 bg-gray-300 cursor-not-allowed'\n }`}\n >\n <CheckIcon className=\"h-4 w-4 mr-1\" />\n Apply\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Qualifier Selection 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 Filters'}\n </h3>\n <div\n className={`bg-gray-50 rounded-lg p-4 ${effectiveContextOptions?.contextPanelClassName || ''}`}\n >\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 // Apply filter-enabled state to editability\n editable: filterState.enabled && qualifierOptions?.editable !== false\n };\n\n return (\n <QualifierContextControl\n key={qualifierName}\n qualifierName={qualifierName}\n value={filterState.values[qualifierName]}\n onChange={handleQualifierChange}\n disabled={!filterState.enabled}\n placeholder={globalPlaceholder || `Filter by ${qualifierName}`}\n resources={resources}\n options={mergedOptions}\n />\n );\n })}\n </div>\n {filterState.enabled && effectiveContextOptions?.showCurrentContext !== false && (\n <div className=\"mt-3 text-sm text-gray-600\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-1\">\n <p>\n <strong>Pending:</strong> {getFilterSummary(effectiveFilterValues)}\n </p>\n {isFilteringActive && (\n <p>\n <strong>Applied:</strong> {getFilterSummary(filterState.appliedValues)}\n </p>\n )}\n </div>\n </div>\n {filterResult && !filterResult.success && filterResult.error && (\n <p className=\"text-red-600 text-xs mt-1\">\n <strong>Error:</strong> {filterResult.error}\n </p>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Main Browser/Details Layout */}\n <div className=\"flex flex-col md:flex-row gap-6 h-[600px]\">\n {/* Left side: Resource List */}\n <div className=\"md:w-1/2 flex flex-col\">\n <div className=\"flex items-center justify-between mb-4\">\n <div>\n <h3 className=\"text-lg font-semibold text-gray-900\">\n {isFilteringActive ? 'Filtered Resources' : 'All Resources'}\n </h3>\n {isFilteringActive && displayResources.some((r) => r.hasWarning) && (\n <div className=\"flex items-center space-x-2 text-sm text-gray-500 mt-1\">\n <span className=\"text-amber-600 flex items-center\">\n <ExclamationTriangleIcon className=\"h-4 w-4 mr-1\" />\n {displayResources.filter((r) => r.hasWarning).length} warnings\n </span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex-1\">\n <ResourcePicker\n resources={\n isFilteringActive && filterResult?.processedResources\n ? filterResult.processedResources\n : resources\n }\n selectedResourceId={selectedResourceId}\n onResourceSelect={handleResourceSelect}\n resourceAnnotations={resourceAnnotations}\n options={{\n ...effectivePickerOptions,\n searchPlaceholder: isFilteringActive\n ? 'Search filtered resources...'\n : effectivePickerOptions.searchPlaceholder,\n emptyMessage: isFilteringActive\n ? 'No resources match the filter criteria'\n : effectivePickerOptions.emptyMessage\n }}\n />\n </div>\n </div>\n\n {/* Right side: Resource Details */}\n <div className=\"md: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\">Resource Details</h3>\n </div>\n\n <div className=\"flex-1 overflow-y-auto border border-gray-200 rounded-lg p-4 bg-gray-50\">\n {!selectedResourceId ? (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-center\">\n <FunnelIcon 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 {isFilteringActive && (\n <p className=\"text-sm text-gray-400 mt-2\">\n Showing resources that match your filter criteria\n </p>\n )}\n </div>\n </div>\n ) : (\n <SourceResourceDetail\n resourceId={selectedResourceId}\n processedResources={\n isFilteringActive && filterResult?.processedResources\n ? filterResult.processedResources\n : resources\n }\n originalProcessedResources={isFilteringActive ? resources : undefined}\n filterContext={isFilteringActive ? filterState.appliedValues : undefined}\n showComparison={isFilteringActive}\n primaryLabel=\"Filtered\"\n secondaryLabel=\"Original\"\n />\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default FilterView;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditableGridCell.d.ts","sourceRoot":"","sources":["../../../../src/components/views/GridView/EditableGridCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAgB,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAY7F;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,wCAAwC;IACxC,KAAK,EAAE,SAAS,CAAC;IACjB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,2CAA2C;IAC3C,aAAa,EAAE,SAAS,CAAC;IACzB,wCAAwC;IACxC,QAAQ,EAAE,OAAO,CAAC;IAClB,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,yCAAyC;IACzC,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CA4S7D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAO,OAE1C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAO,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYlF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,QAAO,IAE/C,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditableGridCell.js","sourceRoot":"","sources":["../../../../src/components/views/GridView/EditableGridCell.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useMemo } from 'react';\nimport { isJsonObject, JsonValue } from '@fgv/ts-json-base';\nimport { IGridColumnDefinition, IResolutionActions, IResolutionState } from '../../../types';\nimport { GridValidationState } from '../../../utils/cellValidation';\nimport { StringCell, BooleanCell, TriStateCell, DropdownCell } from './cells';\nimport { useSmartObservability } from '../../../hooks/useSmartObservability';\n\n/**\n * Prevent prototype pollution by disallowing dangerous keys.\n */\nfunction isSafeKey(key: string): boolean {\n return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';\n}\n\n/**\n * Props for the EditableGridCell component.\n */\nexport interface IEditableGridCellProps {\n /** The extracted value for this cell */\n value: JsonValue;\n /** The resource ID for this row */\n resourceId: string;\n /** The column definition for this cell */\n column: IGridColumnDefinition;\n /** The complete resolved resource value */\n resolvedValue: JsonValue;\n /** Whether this cell has been edited */\n isEdited: boolean;\n /** Resolution actions for editing integration */\n resolutionActions?: IResolutionActions;\n /** Resolution state for edit tracking */\n resolutionState?: IResolutionState;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Global validation state for grid cells.\n * In a real implementation, this would be managed at the grid level.\n */\nconst globalValidationState: GridValidationState = new GridValidationState();\n\n/**\n * EditableGridCell component that provides editing capabilities for grid cells.\n * @public\n *\n * Automatically selects the appropriate cell editor based on the column configuration\n * and integrates with the existing IResolutionActions for batch editing support.\n * Supports validation with visual feedback and prevents invalid changes from being saved.\n *\n * @example\n * ```tsx\n * <EditableGridCell\n * value=\"user@example.com\"\n * resourceId=\"user-123\"\n * column={{\n * id: 'email',\n * cellType: 'string',\n * validation: { required: true, pattern: /email-pattern/ }\n * }}\n * resolvedValue={{ email: 'user@example.com', name: 'John' }}\n * isEdited={false}\n * resolutionActions={actions}\n * resolutionState={state}\n * />\n * ```\n */\nexport const EditableGridCell: React.FC<IEditableGridCellProps> = ({\n value,\n resourceId,\n column,\n resolvedValue,\n isEdited,\n resolutionActions,\n resolutionState,\n className = ''\n}) => {\n const o11y = useSmartObservability();\n const [isEditing, setIsEditing] = useState(false);\n const [currentValidationError, setCurrentValidationError] = useState<string | null>(null);\n\n // Check if editing is disabled\n const isDisabled = useMemo(() => {\n return resolutionState?.isApplyingEdits || !resolutionActions;\n }, [resolutionState?.isApplyingEdits, resolutionActions]);\n\n // Get current edited value if any\n const editedValue = useMemo(() => {\n return resolutionActions?.getEditedValue?.(resourceId);\n }, [resolutionActions, resourceId]);\n\n // Extract field-specific value from edited object using the same logic as ResourceGrid\n const extractedEditedValue = useMemo(() => {\n if (editedValue === undefined) return undefined;\n\n // Use the same extractValueByPath logic as ResourceGrid\n const dataPath = column.dataPath;\n if (typeof dataPath === 'string') {\n if (!isJsonObject(editedValue)) {\n if (!resolutionActions?.saveEdit) {\n o11y.user.error(`${dataPath}: cannot extract property from non-object`);\n }\n return undefined;\n }\n return editedValue[dataPath];\n }\n\n if (Array.isArray(dataPath)) {\n let current = editedValue;\n for (const segment of dataPath) {\n if (current === null || current === undefined) return undefined;\n if (!isJsonObject(current)) {\n if (!resolutionActions?.saveEdit) {\n o11y.user.error(`${segment}: cannot extract property from non-object`);\n }\n return undefined;\n }\n current = current[segment];\n }\n return current;\n }\n\n return undefined;\n }, [editedValue, column.dataPath]);\n\n // Determine the display value (edited field value takes precedence)\n const displayValue = useMemo(() => {\n return extractedEditedValue !== undefined ? extractedEditedValue : value;\n }, [extractedEditedValue, value]);\n\n // Start editing\n const handleStartEdit = useCallback(() => {\n if (isDisabled || !column.editable) return;\n setIsEditing(true);\n }, [isDisabled, column.editable]);\n\n // Cancel editing\n const handleCancel = useCallback(() => {\n setIsEditing(false);\n setCurrentValidationError(null);\n globalValidationState.clearCell(resourceId, column.id);\n }, [resourceId, column.id]);\n\n // Save changes\n const handleSave = useCallback(\n (newValue: JsonValue) => {\n if (!resolutionActions?.saveEdit) {\n o11y.user.error('Unable to save: no edit actions available');\n return;\n }\n\n // Check for validation errors before saving\n if (currentValidationError) {\n o11y.user.warn(`Cannot save: ${currentValidationError}`);\n return;\n }\n\n // Create updated object by setting only the specific field identified by dataPath\n // Ensure resolvedValue is an object before spreading it\n const baseObject =\n resolvedValue && typeof resolvedValue === 'object' && !Array.isArray(resolvedValue)\n ? resolvedValue\n : {};\n const updatedObject = { ...baseObject } as Record<string, JsonValue>;\n\n // Handle both string and array data paths\n const dataPath = column.dataPath;\n if (typeof dataPath === 'string') {\n if (isSafeKey(dataPath)) {\n updatedObject[dataPath] = newValue;\n } else {\n o11y.user.error(`Invalid field name: \"${dataPath}\"`);\n return;\n }\n } else if (Array.isArray(dataPath) && dataPath.length > 0) {\n // For nested paths, we need to deep update\n let current = updatedObject;\n for (let i = 0; i < dataPath.length - 1; i++) {\n const segment = dataPath[i];\n if (!isSafeKey(segment)) {\n o11y.user.error(`Invalid nested field name: \"${segment}\"`);\n return;\n }\n if (\n current[segment] === null ||\n current[segment] === undefined ||\n typeof current[segment] !== 'object'\n ) {\n current[segment] = {};\n }\n current = current[segment] as Record<string, JsonValue>;\n }\n const lastSegment = dataPath[dataPath.length - 1];\n if (isSafeKey(lastSegment)) {\n current[lastSegment] = newValue;\n } else {\n o11y.user.error(`Invalid nested field name: \"${lastSegment}\"`);\n return;\n }\n }\n\n // Save the edit using existing resolution actions with the complete updated object\n const saveResult = resolutionActions.saveEdit(resourceId, updatedObject, resolvedValue);\n\n if (saveResult.isSuccess()) {\n setIsEditing(false);\n setCurrentValidationError(null);\n globalValidationState.clearCell(resourceId, column.id);\n o11y.user.success(`Updated ${column.title} for ${resourceId}`);\n } else {\n o11y.user.error(`Failed to save: ${saveResult.message}`);\n }\n },\n [\n resolutionActions,\n resourceId,\n resolvedValue,\n column.dataPath,\n column.id,\n column.title,\n currentValidationError,\n o11y\n ]\n );\n\n // Handle value changes during editing\n const handleChange = useCallback((newValue: JsonValue) => {\n // Value changes are handled by the individual cell components\n // This is mainly for consistency with the cell component APIs\n }, []);\n\n // Handle validation changes\n const handleValidationChange = useCallback(\n (error: string | null) => {\n setCurrentValidationError(error);\n globalValidationState.setCellError(resourceId, column.id, error);\n },\n [resourceId, column.id]\n );\n\n // Select appropriate cell editor based on column configuration\n const renderCell = (): React.ReactElement => {\n // Use custom cell editor if provided\n if (column.cellEditor) {\n const CustomEditor = column.cellEditor;\n return (\n <CustomEditor\n value={displayValue}\n resourceId={resourceId}\n column={column}\n resolvedValue={resolvedValue}\n isEdited={isEdited}\n editedValue={editedValue}\n onSave={handleSave}\n onCancel={handleCancel}\n disabled={isDisabled}\n className={className}\n />\n );\n }\n\n // Select built-in cell editor based on cellType\n const cellType = column.cellType || 'string';\n\n switch (cellType) {\n case 'string':\n return (\n <StringCell\n value={displayValue}\n resourceId={resourceId}\n column={column}\n isEditing={isEditing}\n disabled={isDisabled}\n onChange={handleChange}\n onStartEdit={handleStartEdit}\n onCancel={handleCancel}\n onSave={handleSave}\n onValidationChange={handleValidationChange}\n />\n );\n\n case 'boolean':\n return (\n <BooleanCell\n value={displayValue}\n resourceId={resourceId}\n column={column}\n disabled={isDisabled}\n onChange={handleChange}\n onSave={handleSave}\n onValidationChange={handleValidationChange}\n />\n );\n\n case 'tristate':\n return (\n <TriStateCell\n value={displayValue}\n resourceId={resourceId}\n column={column}\n disabled={isDisabled}\n presentation={column.triStatePresentation}\n labels={column.triStateLabels}\n onChange={handleChange}\n onSave={handleSave}\n onValidationChange={handleValidationChange}\n />\n );\n\n case 'dropdown':\n return (\n <DropdownCell\n value={displayValue}\n resourceId={resourceId}\n column={column}\n isEditing={isEditing}\n disabled={isDisabled}\n onChange={handleChange}\n onStartEdit={handleStartEdit}\n onCancel={handleCancel}\n onSave={handleSave}\n onValidationChange={handleValidationChange}\n />\n );\n\n case 'custom':\n // Custom cell type but no custom editor provided - fall back to string\n return (\n <StringCell\n value={displayValue}\n resourceId={resourceId}\n column={column}\n isEditing={isEditing}\n disabled={isDisabled}\n onChange={handleChange}\n onStartEdit={handleStartEdit}\n onCancel={handleCancel}\n onSave={handleSave}\n onValidationChange={handleValidationChange}\n />\n );\n\n default:\n // Fallback to string cell\n return (\n <StringCell\n value={displayValue}\n resourceId={resourceId}\n column={column}\n isEditing={isEditing}\n disabled={isDisabled}\n onChange={handleChange}\n onStartEdit={handleStartEdit}\n onCancel={handleCancel}\n onSave={handleSave}\n onValidationChange={handleValidationChange}\n />\n );\n }\n };\n\n return (\n <div className={`relative ${className}`}>\n {renderCell()}\n {currentValidationError && <div className=\"absolute top-0 right-0 w-2 h-2 bg-red-500 rounded-full\" />}\n </div>\n );\n};\n\n/**\n * Utility function to check if the grid has validation errors.\n * This prevents batch operations when there are invalid values.\n * @public\n */\nexport const hasGridValidationErrors = (): boolean => {\n return globalValidationState.hasErrors;\n};\n\n/**\n * Utility function to get all current validation errors.\n * Useful for displaying validation summaries or debugging.\n * @public\n */\nexport const getAllGridValidationErrors = (): Record<string, Record<string, string>> => {\n const errors = globalValidationState.getAllErrors();\n const result: Record<string, Record<string, string>> = {};\n\n errors.forEach(({ resourceId, columnId, error }) => {\n if (!result[resourceId]) {\n result[resourceId] = {};\n }\n result[resourceId][columnId] = error;\n });\n\n return result;\n};\n\n/**\n * Utility function to clear all grid validation errors.\n * Should be called when the grid is reset or data is reloaded.\n * @public\n */\nexport const clearAllGridValidationErrors = (): void => {\n globalValidationState.clearAll();\n};\n\nexport default EditableGridCell;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/views/GridView/GridSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,kBAAkB,EAAE,mBAAmB,EAAE,CAAC;IAC1C,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;IAC3D,0CAA0C;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAwKrD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridSelector.js","sourceRoot":"","sources":["../../../../src/components/views/GridView/GridSelector.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback } from 'react';\nimport { ChevronDownIcon } from '@heroicons/react/24/outline';\nimport { IGridViewInitParams } from '../../../types';\n\n/**\n * Props for the GridSelector component.\n */\nexport interface IGridSelectorProps {\n /** Available grid configurations */\n gridConfigurations: IGridViewInitParams[];\n /** ID of the currently active grid */\n activeGridId: string;\n /** Callback when the active grid changes */\n onGridChange: (gridId: string) => void;\n /** How to present the grid selector */\n presentation?: 'tabs' | 'cards' | 'accordion' | 'dropdown';\n /** Whether users can reorder grid tabs */\n allowReordering?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * GridSelector component for switching between multiple grid configurations.\n *\n * Provides different presentation modes for selecting which grid to display,\n * supporting tabs, cards, accordion, and dropdown interfaces. Enables users\n * to quickly switch between different views of their resource data.\n *\n * @example\n * ```tsx\n * <GridSelector\n * gridConfigurations={[\n * { id: 'users', title: 'User Data', ... },\n * { id: 'products', title: 'Product Catalog', ... }\n * ]}\n * activeGridId=\"users\"\n * presentation=\"tabs\"\n * onGridChange={setActiveGridId}\n * />\n * ```\n * @public\n */\nexport const GridSelector: React.FC<IGridSelectorProps> = ({\n gridConfigurations,\n activeGridId,\n onGridChange,\n presentation = 'tabs',\n allowReordering = false,\n className = ''\n}) => {\n const handleGridSelect = useCallback(\n (gridId: string) => {\n if (gridId !== activeGridId) {\n onGridChange(gridId);\n }\n },\n [activeGridId, onGridChange]\n );\n\n const activeGrid = gridConfigurations.find((grid) => grid.id === activeGridId);\n\n if (gridConfigurations.length === 0) {\n return null;\n }\n\n if (gridConfigurations.length === 1) {\n // Single grid - show just the title\n const grid = gridConfigurations[0];\n return (\n <div className={`mb-6 ${className}`}>\n <h3 className=\"text-lg font-semibold text-gray-900\">{grid.title}</h3>\n {grid.description && <p className=\"text-sm text-gray-600 mt-1\">{grid.description}</p>}\n </div>\n );\n }\n\n switch (presentation) {\n case 'tabs':\n return (\n <div className={`mb-6 ${className}`}>\n <div className=\"border-b border-gray-200\">\n <nav className=\"-mb-px flex space-x-8\" aria-label=\"Grid selector\">\n {gridConfigurations.map((grid) => {\n const isActive = grid.id === activeGridId;\n return (\n <button\n key={grid.id}\n onClick={() => handleGridSelect(grid.id)}\n className={`py-2 px-1 border-b-2 font-medium text-sm ${\n isActive\n ? 'border-blue-500 text-blue-600'\n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'\n }`}\n >\n {grid.title}\n </button>\n );\n })}\n </nav>\n </div>\n {activeGrid?.description && (\n <div className=\"mt-3\">\n <p className=\"text-sm text-gray-600\">{activeGrid.description}</p>\n </div>\n )}\n </div>\n );\n\n case 'cards':\n return (\n <div className={`mb-6 ${className}`}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {gridConfigurations.map((grid) => {\n const isActive = grid.id === activeGridId;\n return (\n <button\n key={grid.id}\n onClick={() => handleGridSelect(grid.id)}\n className={`p-4 text-left rounded-lg border-2 transition-colors ${\n isActive\n ? 'border-blue-500 bg-blue-50'\n : 'border-gray-200 bg-white hover:border-gray-300 hover:bg-gray-50'\n }`}\n >\n <h4 className={`font-medium ${isActive ? 'text-blue-900' : 'text-gray-900'}`}>\n {grid.title}\n </h4>\n {grid.description && (\n <p className={`mt-1 text-sm ${isActive ? 'text-blue-700' : 'text-gray-600'}`}>\n {grid.description}\n </p>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n\n case 'dropdown':\n return (\n <div className={`mb-6 ${className}`}>\n <div className=\"flex items-center space-x-4\">\n <label htmlFor=\"grid-selector\" className=\"text-sm font-medium text-gray-700\">\n Grid View:\n </label>\n <div className=\"relative\">\n <select\n id=\"grid-selector\"\n value={activeGridId}\n onChange={(e) => handleGridSelect(e.target.value)}\n className=\"appearance-none bg-white border border-gray-300 rounded-md px-3 py-2 pr-10 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n >\n {gridConfigurations.map((grid) => (\n <option key={grid.id} value={grid.id}>\n {grid.title}\n </option>\n ))}\n </select>\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-2 pointer-events-none\">\n <ChevronDownIcon className=\"h-4 w-4 text-gray-400\" />\n </div>\n </div>\n </div>\n {activeGrid?.description && (\n <div className=\"mt-3\">\n <p className=\"text-sm text-gray-600\">{activeGrid.description}</p>\n </div>\n )}\n </div>\n );\n\n case 'accordion':\n return (\n <div className={`mb-6 space-y-2 ${className}`}>\n {gridConfigurations.map((grid) => {\n const isActive = grid.id === activeGridId;\n return (\n <div key={grid.id} className=\"border border-gray-200 rounded-lg\">\n <button\n onClick={() => handleGridSelect(grid.id)}\n className={`w-full px-4 py-3 text-left flex items-center justify-between ${\n isActive ? 'bg-blue-50' : 'bg-white hover:bg-gray-50'\n }`}\n >\n <div>\n <h4 className={`font-medium ${isActive ? 'text-blue-900' : 'text-gray-900'}`}>\n {grid.title}\n </h4>\n {grid.description && (\n <p className={`mt-1 text-sm ${isActive ? 'text-blue-700' : 'text-gray-600'}`}>\n {grid.description}\n </p>\n )}\n </div>\n {isActive && (\n <div className=\"flex items-center text-blue-600\">\n <span className=\"text-xs font-medium\">ACTIVE</span>\n </div>\n )}\n </button>\n </div>\n );\n })}\n </div>\n );\n\n default:\n return null;\n }\n};\n\nexport default GridSelector;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiGridView.d.ts","sourceRoot":"","sources":["../../../../src/components/views/GridView/MultiGridView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AASrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAkNvD,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiGridView.js","sourceRoot":"","sources":["../../../../src/components/views/GridView/MultiGridView.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useMemo, useCallback, useEffect } from 'react';\nimport { TableCellsIcon } from '@heroicons/react/24/outline';\nimport { IMultiGridViewProps } from '../../../types';\nimport { selectResources } from '../../../utils/resourceSelector';\nimport { SharedContextControls } from './SharedContextControls';\nimport { GridSelector } from './GridSelector';\nimport { GridView } from './index';\nimport { UnifiedChangeControls } from '../ResolutionView/UnifiedChangeControls';\nimport { hasGridValidationErrors, clearAllGridValidationErrors } from './EditableGridCell';\nimport { useSmartObservability } from '../../../hooks/useSmartObservability';\n\n/**\n * MultiGridView component for managing multiple grid instances with shared context.\n *\n * Provides a comprehensive interface for displaying multiple related grids that share\n * the same resolution context and batch operations. Perfect for administrative workflows\n * where users need to configure related data across multiple resource types.\n *\n * **Key Features:**\n * - **Multiple Grids**: Display multiple grid configurations with different resource selections\n * - **Shared Context**: Single context management that applies to all grids simultaneously\n * - **Unified Changes**: Batch operations work across all grids and resource types\n * - **Flexible Presentation**: Support for tabs, cards, accordion, and dropdown grid selection\n * - **Validation Integration**: Prevents batch operations when validation errors exist\n *\n * @example\n * ```tsx\n * import { MultiGridView } from '@fgv/ts-res-ui-components';\n *\n * // Configure multiple grids for admin workflow\n * const gridConfigurations = [\n * {\n * id: 'languages',\n * title: 'Languages',\n * description: 'Language configuration settings',\n * resourceSelection: { type: 'resourceTypes', types: ['language-config'] },\n * columnMapping: [{\n * resourceType: 'language-config',\n * columns: [\n * { id: 'code', title: 'Code', dataPath: 'code' },\n * { id: 'name', title: 'Name', dataPath: 'displayName', editable: true, cellType: 'string' },\n * { id: 'enabled', title: 'Enabled', dataPath: 'enabled', editable: true, cellType: 'boolean' }\n * ]\n * }]\n * },\n * {\n * id: 'payment-methods',\n * title: 'Payment Methods',\n * description: 'Payment method configuration',\n * resourceSelection: { type: 'prefix', prefix: 'payment.methods.' },\n * columnMapping: [{\n * resourceType: 'payment-config',\n * columns: [\n * { id: 'method', title: 'Method', dataPath: 'method' },\n * { id: 'enabled', title: 'Enabled', dataPath: 'enabled', editable: true, cellType: 'tristate' },\n * { id: 'priority', title: 'Priority', dataPath: 'priority', editable: true, cellType: 'dropdown',\n * dropdownOptions: [\n * { value: 'high', label: 'High Priority' },\n * { value: 'medium', label: 'Medium Priority' },\n * { value: 'low', label: 'Low Priority' }\n * ]\n * }\n * ]\n * }]\n * }\n * ];\n *\n * function AdminPanel() {\n * return (\n * <MultiGridView\n * gridConfigurations={gridConfigurations}\n * resources={processedResources}\n * resolutionState={resolutionState}\n * resolutionActions={resolutionActions}\n * availableQualifiers={['country', 'language', 'environment']}\n * contextOptions={{\n * qualifierOptions: {\n * country: { editable: true, placeholder: 'Select country...' },\n * environment: { editable: false, hostValue: 'production' }\n * },\n * hostManagedValues: { environment: 'production' }\n * }}\n * tabsPresentation=\"tabs\"\n * defaultActiveGrid=\"languages\"\n * />\n * );\n * }\n * ```\n *\n * @public\n */\nexport const MultiGridView: React.FC<IMultiGridViewProps> = ({\n gridConfigurations,\n resources,\n resolutionState,\n resolutionActions,\n availableQualifiers = [],\n contextOptions,\n filterState,\n filterResult,\n tabsPresentation = 'tabs',\n defaultActiveGrid,\n allowGridReordering = false,\n className = ''\n}) => {\n const o11y = useSmartObservability();\n // State for active grid\n const [activeGridId, setActiveGridId] = useState(() => {\n return defaultActiveGrid || gridConfigurations[0]?.id || '';\n });\n\n // Update active grid if default changes or configurations change\n useEffect(() => {\n if (defaultActiveGrid && defaultActiveGrid !== activeGridId) {\n setActiveGridId(defaultActiveGrid);\n } else if (!gridConfigurations.find((g) => g.id === activeGridId)) {\n // Active grid no longer exists, switch to first available\n setActiveGridId(gridConfigurations[0]?.id || '');\n }\n }, [defaultActiveGrid, activeGridId, gridConfigurations]);\n\n // Get current grid configuration\n const currentGridConfig = useMemo(() => {\n return gridConfigurations.find((grid) => grid.id === activeGridId);\n }, [gridConfigurations, activeGridId]);\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 // Calculate total selected resources across all grids for summary\n const totalResourceCounts = useMemo(() => {\n if (!baseProcessedResources) return { total: 0, byGrid: new Map<string, number>() };\n\n const byGrid = new Map<string, number>();\n let total = 0;\n\n gridConfigurations.forEach((gridConfig) => {\n const selectionResult = selectResources(gridConfig.resourceSelection, baseProcessedResources);\n const count = selectionResult.isSuccess() ? selectionResult.value.length : 0;\n byGrid.set(gridConfig.id, count);\n total += count;\n });\n\n return { total, byGrid };\n }, [baseProcessedResources, gridConfigurations]);\n\n // Handle grid changes\n const handleGridChange = useCallback((gridId: string) => {\n setActiveGridId(gridId);\n }, []);\n\n // Enhanced apply handler that checks for validation errors\n const handleApplyPendingResources = useCallback(async () => {\n // Check for validation errors before applying\n if (hasGridValidationErrors()) {\n o11y.user.warn('Cannot apply changes: There are validation errors in the grid. Please fix them first.');\n return;\n }\n\n await resolutionActions?.applyPendingResources();\n }, [resolutionActions, o11y]);\n\n // Enhanced discard handler\n const handleDiscardAll = useCallback(() => {\n resolutionActions?.discardEdits?.();\n resolutionActions?.discardPendingResources?.();\n // Clear validation errors when discarding\n clearAllGridValidationErrors();\n }, [resolutionActions]);\n\n if (!resources) {\n return (\n <div className={`p-6 ${className}`}>\n <div className=\"flex items-center space-x-3 mb-6\">\n <TableCellsIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Multi-Grid Resource Manager</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 manage them across multiple specialized grid views.\n </p>\n <div className=\"bg-blue-50 rounded-lg p-4\">\n <p className=\"text-sm text-blue-800\">\n <strong>Multi-Grid View:</strong> Manage related resources across multiple grids with shared\n context and batch operations. Perfect for administrative workflows.\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (gridConfigurations.length === 0) {\n return (\n <div className={`p-6 ${className}`}>\n <div className=\"flex items-center space-x-3 mb-6\">\n <TableCellsIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Multi-Grid Resource Manager</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 Grid Configurations</h3>\n <p className=\"text-gray-600\">\n Configure grid definitions to display and manage your resources in specialized views.\n </p>\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 <TableCellsIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">Multi-Grid Resource Manager</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 <div className=\"text-sm text-gray-600\">\n <span className=\"font-medium\">{totalResourceCounts.total}</span> resources across{' '}\n <span className=\"font-medium\">{gridConfigurations.length}</span> grid\n {gridConfigurations.length !== 1 ? 's' : ''}\n </div>\n </div>\n\n {/* Shared Context Controls */}\n <SharedContextControls\n availableQualifiers={availableQualifiers}\n resolutionState={resolutionState}\n resolutionActions={resolutionActions}\n contextOptions={contextOptions}\n resources={baseProcessedResources}\n className=\"mb-6\"\n />\n\n {/* Grid Selector */}\n <GridSelector\n gridConfigurations={gridConfigurations}\n activeGridId={activeGridId}\n onGridChange={handleGridChange}\n presentation={tabsPresentation}\n allowReordering={allowGridReordering}\n className=\"mb-6\"\n />\n\n {/* Active Grid Display */}\n {currentGridConfig && (\n <div className=\"mb-6\">\n <GridView\n gridConfig={currentGridConfig}\n resources={baseProcessedResources}\n resolutionState={resolutionState}\n resolutionActions={resolutionActions}\n availableQualifiers={availableQualifiers}\n contextOptions={contextOptions}\n filterState={filterState}\n filterResult={filterResult}\n showContextControls={false} // Context is managed at the multi-grid level\n showChangeControls={false} // Change controls are managed at the multi-grid level\n />\n </div>\n )}\n\n {/* Unified Change Controls for all grids */}\n {(resolutionState?.hasUnsavedEdits || resolutionState?.hasPendingResourceChanges) && (\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-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={handleApplyPendingResources}\n onDiscardAll={handleDiscardAll}\n />\n\n {/* Validation warning */}\n {hasGridValidationErrors() && (\n <div className=\"mt-4 p-3 bg-yellow-50 border border-yellow-200 rounded-md\">\n <div className=\"text-sm text-yellow-800\">\n <strong>Validation Errors:</strong> Some fields have validation errors. Please review and fix\n them before applying changes.\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default MultiGridView;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceGrid.d.ts","sourceRoot":"","sources":["../../../../src/components/views/GridView/ResourceGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAIjB,MAAM,gBAAgB,CAAC;AAIxB;;GAEG;AACH,UAAU,kBAAkB;IAC1B,8DAA8D;IAC9D,UAAU,EAAE,mBAAmB,CAAC;IAChC,mDAAmD;IACnD,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,mDAAmD;IACnD,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACpD,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,yCAAyC;IACzC,eAAe,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAmFD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAuQrD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceGrid.js","sourceRoot":"","sources":["../../../../src/components/views/GridView/ResourceGrid.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useMemo, useState, useCallback } from 'react';\nimport { ChevronUpIcon, ChevronDownIcon } from '@heroicons/react/24/outline';\nimport {\n IGridViewInitParams,\n IResolutionResult,\n IResolutionActions,\n IResolutionState,\n IGridColumnDefinition,\n IResourceTypeColumnMapping,\n IGridCellProps\n} from '../../../types';\nimport { isJsonObject, JsonValue } from '@fgv/ts-json-base';\nimport { EditableGridCell } from './EditableGridCell';\n\n/**\n * Props for the ResourceGrid component.\n */\ninterface IResourceGridProps {\n /** Grid configuration defining columns and display options */\n gridConfig: IGridViewInitParams;\n /** Array of resource IDs to display in the grid */\n selectedResourceIds: string[];\n /** Map of resource resolutions for grid display */\n resourceResolutions: Map<string, IResolutionResult>;\n /** Resolution actions for editing integration */\n resolutionActions?: IResolutionActions;\n /** Resolution state for edit tracking */\n resolutionState?: IResolutionState;\n}\n\n/**\n * Utility function to extract a value from an object using a path.\n * Supports both string paths (simple property) and array paths (nested properties).\n */\nfunction extractValueByPath(obj: JsonValue | undefined, path: string | string[]): JsonValue | undefined {\n if (typeof path === 'string') {\n if (!isJsonObject(obj)) {\n return undefined;\n }\n return obj[path];\n }\n\n if (Array.isArray(path)) {\n let current = obj;\n for (const segment of path) {\n if (current === null || current === undefined) return undefined;\n if (!isJsonObject(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n }\n\n return undefined;\n}\n\n/**\n * Component for rendering a basic grid cell.\n */\nconst GridCell: React.FC<IGridCellProps> = ({\n value,\n resourceId,\n column,\n resolvedValue,\n isEdited,\n className = ''\n}) => {\n // Use custom renderer if provided\n if (column.cellRenderer) {\n const CustomRenderer = column.cellRenderer;\n return (\n <CustomRenderer\n value={value}\n resourceId={resourceId}\n column={column}\n resolvedValue={resolvedValue}\n isEdited={isEdited}\n className={className}\n />\n );\n }\n\n // Default rendering based on value type\n const displayValue = useMemo(() => {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n\n // For objects/arrays, show a compact JSON representation\n try {\n const jsonStr = JSON.stringify(value);\n return jsonStr.length > 100 ? `${jsonStr.substring(0, 100)}...` : jsonStr;\n } catch {\n return String(value);\n }\n }, [value]);\n\n return (\n <div className={`px-3 py-2 text-sm ${isEdited ? 'bg-blue-50' : ''} ${className}`}>\n {displayValue}\n {isEdited && (\n <span className=\"ml-1 inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-100 text-blue-800\">\n edited\n </span>\n )}\n </div>\n );\n};\n\n/**\n * Main ResourceGrid component for displaying resources in a table format.\n *\n * @example\n * ```tsx\n * <ResourceGrid\n * gridConfig={gridConfig}\n * selectedResourceIds={['user.welcome', 'user.goodbye']}\n * resourceResolutions={resolutionMap}\n * resolutionActions={actions}\n * resolutionState={state}\n * />\n * ```\n *\n * @public\n */\nexport const ResourceGrid: React.FC<IResourceGridProps> = ({\n gridConfig,\n selectedResourceIds,\n resourceResolutions,\n resolutionActions,\n resolutionState\n}) => {\n const [sortColumn, setSortColumn] = useState<string | null>(null);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\n\n // Build column definitions for all resources\n const allColumns = useMemo(() => {\n const columnMap = new Map<string, IGridColumnDefinition>();\n const mappingMap = new Map<string, IResourceTypeColumnMapping>();\n\n // Index column mappings by resource type\n gridConfig.columnMapping.forEach((mapping) => {\n mappingMap.set(mapping.resourceType, mapping);\n });\n\n // For each resource, determine its type and get appropriate columns\n selectedResourceIds.forEach((resourceId) => {\n const resolution = resourceResolutions.get(resourceId);\n if (!resolution?.success || !resolution.resource) return;\n\n const resourceType = resolution.resource.resourceType.key;\n const mapping = mappingMap.get(resourceType);\n\n if (mapping) {\n mapping.columns.forEach((col) => {\n if (!columnMap.has(col.id)) {\n columnMap.set(col.id, col);\n }\n });\n } else if (gridConfig.columnMapping[0]?.defaultColumn) {\n // Use default column if no specific mapping found\n const defaultCol = gridConfig.columnMapping[0].defaultColumn;\n columnMap.set(defaultCol.id, defaultCol);\n }\n });\n\n return Array.from(columnMap.values());\n }, [gridConfig.columnMapping, selectedResourceIds, resourceResolutions]);\n\n // Extract and sort grid data\n const gridData = useMemo(() => {\n const rows = selectedResourceIds\n .map((resourceId) => {\n const resolution = resourceResolutions.get(resourceId);\n const isEdited = resolutionActions?.hasEdit?.(resourceId) || false;\n\n return {\n resourceId,\n resolution,\n isEdited,\n values: new Map<string, JsonValue>()\n };\n })\n .filter((row) => row.resolution?.success);\n\n // Extract values for each column\n rows.forEach((row) => {\n if (!row.resolution?.success) return;\n\n allColumns.forEach((column) => {\n const value = extractValueByPath(row.resolution!.composedValue, column.dataPath) ?? null;\n row.values.set(column.id, value);\n });\n });\n\n // Apply sorting if configured\n if (sortColumn && gridConfig.presentationOptions?.enableSorting !== false) {\n rows.sort((a, b) => {\n const aValue = a.values.get(sortColumn);\n const bValue = b.values.get(sortColumn);\n\n // Handle null/undefined values\n if ((aValue === null || aValue === undefined) && (bValue === null || bValue === undefined)) return 0;\n if (aValue === null || aValue === undefined) return 1;\n if (bValue === null || bValue === undefined) return -1;\n\n // Compare values\n let comparison = 0;\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n comparison = aValue.localeCompare(bValue);\n } else if (typeof aValue === 'number' && typeof bValue === 'number') {\n comparison = aValue - bValue;\n } else {\n // Fallback to string comparison\n comparison = String(aValue).localeCompare(String(bValue));\n }\n\n return sortDirection === 'desc' ? -comparison : comparison;\n });\n }\n\n return rows;\n }, [\n selectedResourceIds,\n resourceResolutions,\n allColumns,\n sortColumn,\n sortDirection,\n resolutionActions,\n gridConfig.presentationOptions\n ]);\n\n // Handle column sorting\n const handleSort = useCallback(\n (columnId: string) => {\n if (!gridConfig.presentationOptions?.enableSorting) return;\n\n const column = allColumns.find((col) => col.id === columnId);\n if (!column?.sortable) return;\n\n if (sortColumn === columnId) {\n setSortDirection((prev) => (prev === 'asc' ? 'desc' : 'asc'));\n } else {\n setSortColumn(columnId);\n setSortDirection('asc');\n }\n },\n [allColumns, sortColumn, gridConfig.presentationOptions]\n );\n\n if (selectedResourceIds.length === 0) {\n return (\n <div className=\"text-center py-12\">\n <div className=\"text-gray-500\">\n <p className=\"text-lg font-medium mb-2\">No Resources Selected</p>\n <p className=\"text-sm\">\n This grid configuration selected no resources. Check your resource selection criteria.\n </p>\n </div>\n </div>\n );\n }\n\n if (allColumns.length === 0) {\n return (\n <div className=\"text-center py-12\">\n <div className=\"text-gray-500\">\n <p className=\"text-lg font-medium mb-2\">No Columns Configured</p>\n <p className=\"text-sm\">\n No column mappings found for the selected resource types. Configure column mappings in the grid\n configuration.\n </p>\n </div>\n </div>\n );\n }\n\n const enableSorting = gridConfig.presentationOptions?.enableSorting !== false;\n const showRowNumbers = gridConfig.presentationOptions?.showRowNumbers || false;\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n {showRowNumbers && (\n <th className=\"px-3 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n #\n </th>\n )}\n <th className=\"px-3 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n Resource ID\n </th>\n {allColumns.map((column) => (\n <th\n key={column.id}\n className={`px-3 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider ${\n enableSorting && column.sortable ? 'cursor-pointer hover:bg-gray-100' : ''\n }`}\n style={column.width ? { width: column.width } : undefined}\n onClick={() => enableSorting && column.sortable && handleSort(column.id)}\n >\n <div className=\"flex items-center space-x-1\">\n <span>{column.title}</span>\n {enableSorting && column.sortable && (\n <div className=\"flex flex-col\">\n <ChevronUpIcon\n className={`h-3 w-3 ${\n sortColumn === column.id && sortDirection === 'asc'\n ? 'text-blue-600'\n : 'text-gray-400'\n }`}\n />\n <ChevronDownIcon\n className={`h-3 w-3 -mt-1 ${\n sortColumn === column.id && sortDirection === 'desc'\n ? 'text-blue-600'\n : 'text-gray-400'\n }`}\n />\n </div>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-gray-200\">\n {gridData.map((row, index) => (\n <tr key={row.resourceId} className={`${row.isEdited ? 'bg-blue-25' : 'hover:bg-gray-50'}`}>\n {showRowNumbers && (\n <td className=\"px-3 py-2 whitespace-nowrap text-sm text-gray-500\">{index + 1}</td>\n )}\n <td className=\"px-3 py-2 whitespace-nowrap text-sm font-medium text-gray-900\">\n {row.resourceId}\n {row.isEdited && (\n <span className=\"ml-2 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-blue-100 text-blue-800\">\n edited\n </span>\n )}\n </td>\n {allColumns.map((column) => {\n const value = row.values.get(column.id) ?? null;\n const isEdited = resolutionActions?.hasEdit?.(row.resourceId) || false;\n\n if (column.editable) {\n return (\n <td key={column.id} className=\"px-0 py-0\">\n <EditableGridCell\n value={value}\n resourceId={row.resourceId}\n column={column}\n resolvedValue={row.resolution?.composedValue || null}\n isEdited={isEdited}\n resolutionActions={resolutionActions}\n resolutionState={resolutionState}\n />\n </td>\n );\n } else {\n return (\n <td key={column.id} className=\"px-0 py-0\">\n <GridCell\n value={value}\n resourceId={row.resourceId}\n column={column}\n resolvedValue={row.resolution?.composedValue || null}\n isEdited={isEdited}\n />\n </td>\n );\n }\n })}\n </tr>\n ))}\n </tbody>\n </table>\n\n {gridData.length === 0 && (\n <div className=\"text-center py-12\">\n <div className=\"text-gray-500\">\n <p className=\"text-lg font-medium mb-2\">No Data Available</p>\n <p className=\"text-sm\">Selected resources could not be resolved with the current context.</p>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ResourceGrid;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedContextControls.d.ts","sourceRoot":"","sources":["../../../../src/components/views/GridView/SharedContextControls.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+B,MAAM,OAAO,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AAGxB;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,gDAAgD;IAChD,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,+BAA+B;IAC/B,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,oCAAoC;IACpC,cAAc,CAAC,EAAE,yBAAyB,CAAC;IAC3C,0DAA0D;IAC1D,SAAS,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACvC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CAwIvE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedContextControls.js","sourceRoot":"","sources":["../../../../src/components/views/GridView/SharedContextControls.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport {\n IProcessedResources,\n IResolutionActions,\n IResolutionState,\n IResolutionContextOptions\n} from '../../../types';\nimport { QualifierContextControl } from '../../common/QualifierContextControl';\n\n/**\n * Props for the SharedContextControls component.\n */\nexport interface ISharedContextControlsProps {\n /** Available qualifiers for context building */\n availableQualifiers: string[];\n /** Current resolution state */\n resolutionState?: IResolutionState;\n /** Resolution actions for context management */\n resolutionActions?: IResolutionActions;\n /** Context configuration options */\n contextOptions?: IResolutionContextOptions;\n /** The resource system for qualifier value suggestions */\n resources?: IProcessedResources | null;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * SharedContextControls component for managing resolution context across multiple grids.\n *\n * Provides a unified context management interface that is shared across all grid instances\n * in a MultiGridView. Changes to context values are immediately reflected in all grids,\n * enabling consistent administrative workflows.\n *\n * @example\n * ```tsx\n * <SharedContextControls\n * availableQualifiers={['language', 'territory', 'platform']}\n * resolutionState={sharedResolutionState}\n * resolutionActions={sharedResolutionActions}\n * contextOptions={{\n * qualifierOptions: {\n * language: { editable: true },\n * platform: { editable: false, hostValue: 'web' }\n * },\n * hostManagedValues: { environment: 'production' }\n * }}\n * resources={processedResources}\n * />\n * ```\n * @public\n */\nexport const SharedContextControls: React.FC<ISharedContextControlsProps> = ({\n availableQualifiers,\n resolutionState,\n resolutionActions,\n contextOptions,\n resources,\n className = ''\n}) => {\n // Handle context value changes\n const handleQualifierChange = useCallback(\n (qualifierName: string, value: string | undefined) => {\n // Don't update context if this qualifier is host-managed\n const qualifierOptions = contextOptions?.qualifierOptions?.[qualifierName];\n const isHostManaged = qualifierOptions?.hostValue !== undefined;\n\n if (!isHostManaged) {\n resolutionActions?.updateContextValue(qualifierName, value);\n }\n },\n [resolutionActions, contextOptions?.qualifierOptions]\n );\n\n // Determine which qualifiers to show\n const visibleQualifiers = useMemo(() => {\n if (!contextOptions?.qualifierOptions) {\n return availableQualifiers;\n }\n\n return availableQualifiers.filter((qualifierName) => {\n const options = contextOptions.qualifierOptions![qualifierName];\n return options?.visible !== false;\n });\n }, [availableQualifiers, contextOptions?.qualifierOptions]);\n\n // Get effective context values\n const effectiveContextValues = useMemo(() => {\n return resolutionState?.contextValues || {};\n }, [resolutionState?.contextValues]);\n\n // Don't render if context controls are disabled\n if (contextOptions?.showContextControls === false) {\n return null;\n }\n\n return (\n <div className={`bg-white rounded-lg shadow-sm border border-gray-200 p-6 ${className}`}>\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n {contextOptions?.contextPanelTitle || 'Shared Context Configuration'}\n </h3>\n <div className={`bg-gray-50 rounded-lg p-4 ${contextOptions?.contextPanelClassName || ''}`}>\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 = contextOptions?.qualifierOptions?.[qualifierName];\n const hostManagedValue = contextOptions?.hostManagedValues?.[qualifierName];\n const globalPlaceholder =\n typeof contextOptions?.globalPlaceholder === 'function'\n ? contextOptions.globalPlaceholder(qualifierName)\n : contextOptions?.globalPlaceholder;\n\n // Merge host-managed values with qualifier options\n const mergedOptions = {\n ...qualifierOptions,\n hostValue: 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={resources}\n options={mergedOptions}\n />\n );\n })}\n </div>\n </div>\n\n {contextOptions?.showCurrentContext !== false && (\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm text-gray-600\">\n <strong>Current Context:</strong>{' '}\n {Object.entries(effectiveContextValues).length > 0 ? (\n Object.entries(effectiveContextValues)\n .map(([key, value]) => `${key}=${value === undefined ? '(undefined)' : value}`)\n .join(', ')\n ) : (\n <span className=\"italic\">No context values set</span>\n )}\n </div>\n\n {contextOptions?.showContextActions !== false && (\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={resolutionActions?.resetCache}\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 for all grids\"\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 title=\"Apply context changes to all grids\"\n >\n {resolutionState?.hasPendingChanges\n ? 'Apply Context to All Grids'\n : resolutionState?.currentResolver\n ? 'Context Applied'\n : 'Apply Context'}\n </button>\n </div>\n )}\n </div>\n )}\n\n {/* Context change summary */}\n {resolutionState?.hasPendingChanges && (\n <div className=\"mt-3 p-3 bg-blue-50 border border-blue-200 rounded-md\">\n <div className=\"text-sm text-blue-800\">\n <strong>Pending Context Changes:</strong> Changes will be applied to all visible grids\n simultaneously. This ensures consistent data across all administrative views.\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default SharedContextControls;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BooleanCell.d.ts","sourceRoot":"","sources":["../../../../../src/components/views/GridView/cells/BooleanCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,KAAK,EAAE,SAAS,CAAC;IACjB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,8CAA8C;IAC9C,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,6CAA6C;IAC7C,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAiDnD,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BooleanCell.js","sourceRoot":"","sources":["../../../../../src/components/views/GridView/cells/BooleanCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAwB3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAgC,CAAC,EACvD,KAAK,EACL,UAAU,EACV,MAAM,EACN,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACR,MAAM,EACN,kBAAkB,EACnB,EAAE,EAAE;IACH,2BAA2B;IAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACtC,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC7C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;QACxC,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,yBAAyB;IACzB,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,KAA0C,EAAE,EAAE;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,wCAAwC;QAC1D,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,wDAAwD;IACpF,CAAC,EACD,CAAC,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CACvC,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAC,4CAA4C;QACzD,+BAAO,SAAS,EAAC,0BAA0B;YACzC,+BACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,qEACT,QAAQ,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,gBAC/C,EAAE,GACF;YACF,8BAAM,SAAS,EAAC,SAAS,IAAE,MAAM,CAAC,KAAK,CAAQ,CACzC,CACJ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import React, { useCallback } from 'react';\nimport { JsonValue } from '@fgv/ts-json-base';\nimport { IGridColumnDefinition } from '../../../../types';\n\n/**\n * Props for the BooleanCell component.\n */\nexport interface IBooleanCellProps {\n /** Current value of the cell */\n value: JsonValue;\n /** Resource ID for this row */\n resourceId: string;\n /** Column configuration */\n column: IGridColumnDefinition;\n /** Whether the cell is in read-only mode */\n disabled?: boolean;\n /** Callback when the value changes */\n onChange: (value: boolean) => void;\n /** Callback when the value should be saved */\n onSave: (value: boolean) => void;\n /** Callback when validation state changes */\n onValidationChange: (error: string | null) => void;\n}\n\n/**\n * BooleanCell component for editing boolean values with checkbox presentation.\n *\n * Provides a clean checkbox interface for true/false values with clear\n * visual state indication and immediate save on change.\n *\n * @example\n * ```tsx\n * <BooleanCell\n * value={true}\n * resourceId=\"user-123\"\n * column={{ id: 'enabled', title: 'Enabled' }}\n * onChange={handleChange}\n * onSave={handleSave}\n * onValidationChange={handleValidation}\n * />\n * ```\n * @public\n */\nexport const BooleanCell: React.FC<IBooleanCellProps> = ({\n value,\n resourceId,\n column,\n disabled = false,\n onChange,\n onSave,\n onValidationChange\n}) => {\n // Convert value to boolean\n const booleanValue = React.useMemo(() => {\n if (typeof value === 'boolean') return value;\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true';\n }\n if (typeof value === 'number') {\n return value !== 0;\n }\n return Boolean(value);\n }, [value]);\n\n // Handle checkbox change\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.checked;\n onChange(newValue);\n onSave(newValue); // Boolean changes are saved immediately\n onValidationChange(null); // Boolean values typically don't have validation errors\n },\n [onChange, onSave, onValidationChange]\n );\n\n return (\n <div className=\"px-3 py-2 flex items-center justify-center\">\n <label className=\"inline-flex items-center\">\n <input\n type=\"checkbox\"\n checked={booleanValue}\n onChange={handleChange}\n disabled={disabled}\n className={`h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded ${\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'\n }`}\n />\n <span className=\"sr-only\">{column.title}</span>\n </label>\n </div>\n );\n};\n\nexport default BooleanCell;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownCell.d.ts","sourceRoot":"","sources":["../../../../../src/components/views/GridView/cells/DropdownCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAuB,MAAM,mBAAmB,CAAC;AAI/E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,KAAK,EAAE,SAAS,CAAC;IACjB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,kDAAkD;IAClD,SAAS,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,mCAAmC;IACnC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,8CAA8C;IAC9C,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,6CAA6C;IAC7C,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAoPrD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownCell.js","sourceRoot":"","sources":["../../../../../src/components/views/GridView/cells/DropdownCell.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useEffect, useMemo } from 'react';\nimport { ChevronDownIcon, ExclamationCircleIcon } from '@heroicons/react/24/outline';\nimport { JsonValue } from '@fgv/ts-json-base';\nimport { IGridColumnDefinition, IGridDropdownOption } from '../../../../types';\nimport { validateCellValue } from '../../../../utils/cellValidation';\nimport { useObservability } from '../../../../contexts';\n\n/**\n * Props for the DropdownCell component.\n */\nexport interface IDropdownCellProps {\n /** Current value of the cell */\n value: JsonValue;\n /** Resource ID for this row */\n resourceId: string;\n /** Column configuration */\n column: IGridColumnDefinition;\n /** Whether this cell is currently being edited */\n isEditing: boolean;\n /** Whether the cell is in read-only mode */\n disabled?: boolean;\n /** Callback when the value changes */\n onChange: (value: string) => void;\n /** Callback when editing starts */\n onStartEdit: () => void;\n /** Callback when editing is cancelled */\n onCancel: () => void;\n /** Callback when the value should be saved */\n onSave: (value: string) => void;\n /** Callback when validation state changes */\n onValidationChange: (error: string | null) => void;\n}\n\n/**\n * DropdownCell component for editing string values with predefined options.\n *\n * Supports both dropdown (restricted to options) and combobox (allows custom values) modes.\n * Can load options dynamically and provides validation for selected values.\n *\n * @example\n * ```tsx\n * <DropdownCell\n * value=\"active\"\n * resourceId=\"user-123\"\n * column={{\n * id: 'status',\n * dropdownOptions: [\n * { value: 'active', label: 'Active' },\n * { value: 'inactive', label: 'Inactive' }\n * ],\n * allowCustomValue: false\n * }}\n * isEditing={false}\n * onChange={handleChange}\n * onSave={handleSave}\n * onValidationChange={handleValidation}\n * />\n * ```\n * @public\n */\nexport const DropdownCell: React.FC<IDropdownCellProps> = ({\n value,\n resourceId,\n column,\n isEditing,\n disabled = false,\n onChange,\n onStartEdit,\n onCancel,\n onSave,\n onValidationChange\n}) => {\n // Get observability context\n const o11y = useObservability();\n\n const [editValue, setEditValue] = useState('');\n const [options, setOptions] = useState<IGridDropdownOption[]>([]);\n const [loadingOptions, setLoadingOptions] = useState(false);\n const [validationError, setValidationError] = useState<string | null>(null);\n\n // Convert value to string\n const stringValue = useMemo(() => {\n if (value === null || value === undefined) return '';\n return String(value);\n }, [value]);\n\n // Load dropdown options\n useEffect(() => {\n if (!column.dropdownOptions) {\n setOptions([]);\n return;\n }\n\n if (Array.isArray(column.dropdownOptions)) {\n setOptions(column.dropdownOptions);\n return;\n }\n\n // Async options loading\n setLoadingOptions(true);\n column\n .dropdownOptions()\n .then((loadedOptions) => {\n setOptions(loadedOptions);\n setLoadingOptions(false);\n })\n .catch((error) => {\n o11y.diag.error('Failed to load dropdown options:', error);\n setOptions([]);\n setLoadingOptions(false);\n });\n }, [column.dropdownOptions]);\n\n // Initialize edit value when editing starts\n useEffect(() => {\n if (isEditing) {\n setEditValue(stringValue);\n }\n }, [isEditing, stringValue]);\n\n // Validate current value\n const validateCurrentValue = useCallback(() => {\n if (!isEditing) return;\n\n // First, run standard validation\n const validationResult = validateCellValue(editValue, column.validation);\n\n if (validationResult.isFailure()) {\n setValidationError(`Validation failed: ${validationResult.message}`);\n onValidationChange(`Validation failed: ${validationResult.message}`);\n return;\n }\n\n const result = validationResult.value;\n if (!result.isValid) {\n setValidationError(result.error || null);\n onValidationChange(result.error || null);\n return;\n }\n\n // Then check if value is in allowed options (if not allowing custom values)\n if (!column.allowCustomValue && editValue && options.length > 0) {\n const validOption = options.find((opt) => opt.value === editValue);\n if (!validOption) {\n const error = `Must be one of: ${options.map((opt) => opt.label).join(', ')}`;\n setValidationError(error);\n onValidationChange(error);\n return;\n }\n }\n\n setValidationError(null);\n onValidationChange(null);\n }, [editValue, column.validation, column.allowCustomValue, options, isEditing, onValidationChange]);\n\n // Validate whenever edit value or options change\n useEffect(() => {\n validateCurrentValue();\n }, [validateCurrentValue]);\n\n // Handle dropdown/combobox change\n const handleSelectChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement | HTMLInputElement>) => {\n const newValue = event.target.value;\n setEditValue(newValue);\n onChange(newValue);\n },\n [onChange]\n );\n\n // Handle key presses (for combobox mode)\n const handleKeyPress = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' && !validationError) {\n onSave(editValue);\n } else if (event.key === 'Escape') {\n onCancel();\n }\n },\n [editValue, validationError, onSave, onCancel]\n );\n\n // Handle save\n const handleSave = useCallback(() => {\n if (!validationError) {\n onSave(editValue);\n }\n }, [editValue, validationError, onSave]);\n\n // Find display label for current value\n const getDisplayLabel = useCallback(\n (val: string) => {\n if (!val) return '';\n const option = options.find((opt) => opt.value === val);\n return option ? option.label : val;\n },\n [options]\n );\n\n if (loadingOptions) {\n return <div className=\"px-3 py-2 text-sm text-gray-500 italic\">Loading options...</div>;\n }\n\n if (isEditing) {\n const isCombobox = column.allowCustomValue;\n\n if (isCombobox) {\n // Combobox mode: input with datalist\n return (\n <div className=\"relative\">\n <input\n type=\"text\"\n list={`${resourceId}-${column.id}-options`}\n value={editValue}\n onChange={handleSelectChange}\n onKeyDown={handleKeyPress}\n onBlur={handleSave}\n disabled={disabled}\n autoFocus\n className={`w-full px-2 py-1 text-sm border rounded focus:outline-none focus:ring-2 ${\n validationError\n ? 'border-red-500 focus:ring-red-500 bg-red-50'\n : 'border-gray-300 focus:ring-blue-500'\n }`}\n placeholder={column.title}\n />\n\n <datalist id={`${resourceId}-${column.id}-options`}>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </datalist>\n\n {validationError && (\n <div className=\"absolute z-10 mt-1 p-2 bg-red-100 border border-red-200 rounded shadow-sm text-xs text-red-800 max-w-xs\">\n <div className=\"flex items-center space-x-1\">\n <ExclamationCircleIcon className=\"h-3 w-3 flex-shrink-0\" />\n <span>{validationError}</span>\n </div>\n </div>\n )}\n </div>\n );\n } else {\n // Dropdown mode: select element\n return (\n <div className=\"relative\">\n <select\n value={editValue}\n onChange={handleSelectChange}\n onBlur={handleSave}\n disabled={disabled}\n autoFocus\n className={`w-full appearance-none bg-white border rounded px-2 py-1 pr-8 text-sm focus:outline-none focus:ring-2 ${\n validationError\n ? 'border-red-500 focus:ring-red-500 bg-red-50'\n : 'border-gray-300 focus:ring-blue-500'\n }`}\n >\n <option value=\"\">Select {column.title}...</option>\n {options.map((option) => (\n <option key={option.value} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </select>\n\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-2 pointer-events-none\">\n <ChevronDownIcon className=\"h-4 w-4 text-gray-400\" />\n </div>\n\n {validationError && (\n <div className=\"absolute z-10 mt-1 p-2 bg-red-100 border border-red-200 rounded shadow-sm text-xs text-red-800 max-w-xs\">\n <div className=\"flex items-center space-x-1\">\n <ExclamationCircleIcon className=\"h-3 w-3 flex-shrink-0\" />\n <span>{validationError}</span>\n </div>\n </div>\n )}\n </div>\n );\n }\n }\n\n // Display mode\n const displayValue =\n getDisplayLabel(stringValue) || (column.validation?.required ? '(required)' : '(not set)');\n const isEmpty = !stringValue;\n const isRequired = column.validation?.required;\n\n return (\n <div\n className={`px-3 py-2 text-sm cursor-pointer hover:bg-gray-50 ${\n isEmpty && isRequired ? 'text-red-600 bg-red-25' : 'text-gray-900'\n }`}\n onClick={disabled ? undefined : onStartEdit}\n title={disabled ? undefined : 'Click to edit'}\n >\n <span className={isEmpty ? 'italic' : ''}>{displayValue}</span>\n {isEmpty && isRequired && <ExclamationCircleIcon className=\"inline-block h-4 w-4 ml-1 text-red-500\" />}\n </div>\n );\n};\n\nexport default DropdownCell;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StringCell.d.ts","sourceRoot":"","sources":["../../../../../src/components/views/GridView/cells/StringCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,KAAK,EAAE,SAAS,CAAC;IACjB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,kDAAkD;IAClD,SAAS,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,mCAAmC;IACnC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,8CAA8C;IAC9C,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,6CAA6C;IAC7C,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAkIjD,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StringCell.js","sourceRoot":"","sources":["../../../../../src/components/views/GridView/cells/StringCell.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useEffect } from 'react';\nimport { ExclamationCircleIcon } from '@heroicons/react/24/outline';\nimport { JsonValue } from '@fgv/ts-json-base';\nimport { IGridColumnDefinition } from '../../../../types';\nimport { validateCellValue } from '../../../../utils/cellValidation';\n\n/**\n * Props for the StringCell component.\n */\nexport interface IStringCellProps {\n /** Current value of the cell */\n value: JsonValue;\n /** Resource ID for this row */\n resourceId: string;\n /** Column configuration */\n column: IGridColumnDefinition;\n /** Whether this cell is currently being edited */\n isEditing: boolean;\n /** Whether the cell is in read-only mode */\n disabled?: boolean;\n /** Callback when the value changes */\n onChange: (value: string) => void;\n /** Callback when editing starts */\n onStartEdit: () => void;\n /** Callback when editing is cancelled */\n onCancel: () => void;\n /** Callback when the value should be saved */\n onSave: (value: string) => void;\n /** Callback when validation state changes */\n onValidationChange: (error: string | null) => void;\n}\n\n/**\n * StringCell component for editing string values with validation.\n *\n * Provides text input with configurable validation, visual error highlighting,\n * and support for required fields, length limits, and pattern matching.\n *\n * @example\n * ```tsx\n * <StringCell\n * value=\"user@example.com\"\n * resourceId=\"user-123\"\n * column={{\n * id: 'email',\n * validation: {\n * required: true,\n * pattern: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n * }\n * }}\n * isEditing={false}\n * onChange={handleChange}\n * onSave={handleSave}\n * onValidationChange={handleValidation}\n * />\n * ```\n * @public\n */\nexport const StringCell: React.FC<IStringCellProps> = ({\n value,\n resourceId,\n column,\n isEditing,\n disabled = false,\n onChange,\n onStartEdit,\n onCancel,\n onSave,\n onValidationChange\n}) => {\n const [editValue, setEditValue] = useState('');\n const [validationError, setValidationError] = useState<string | null>(null);\n\n // Convert value to string for editing\n const stringValue = React.useMemo(() => {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n return String(value);\n }, [value]);\n\n // Initialize edit value when editing starts\n useEffect(() => {\n if (isEditing) {\n setEditValue(stringValue);\n }\n }, [isEditing, stringValue]);\n\n // Validate the current edit value\n const validateCurrentValue = useCallback(() => {\n if (!isEditing) return;\n\n const validationResult = validateCellValue(editValue, column.validation);\n\n if (validationResult.isFailure()) {\n setValidationError(`Validation failed: ${validationResult.message}`);\n onValidationChange(`Validation failed: ${validationResult.message}`);\n return;\n }\n\n const result = validationResult.value;\n const error = result.isValid ? null : result.error || null;\n\n setValidationError(error);\n onValidationChange(error);\n }, [editValue, column.validation, isEditing, onValidationChange]);\n\n // Validate whenever edit value changes\n useEffect(() => {\n validateCurrentValue();\n }, [validateCurrentValue]);\n\n // Handle input changes\n const handleInputChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = event.target.value;\n setEditValue(newValue);\n onChange(newValue);\n },\n [onChange]\n );\n\n // Handle key presses\n const handleKeyPress = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' && !validationError) {\n onSave(editValue);\n } else if (event.key === 'Escape') {\n onCancel();\n }\n },\n [editValue, validationError, onSave, onCancel]\n );\n\n // Handle save click\n const handleSave = useCallback(() => {\n if (!validationError) {\n onSave(editValue);\n }\n }, [editValue, validationError, onSave]);\n\n if (isEditing) {\n return (\n <div className=\"relative\">\n <input\n type=\"text\"\n value={editValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyPress}\n onBlur={handleSave}\n disabled={disabled}\n autoFocus\n className={`w-full px-2 py-1 text-sm border rounded focus:outline-none focus:ring-2 ${\n validationError\n ? 'border-red-500 focus:ring-red-500 bg-red-50'\n : 'border-gray-300 focus:ring-blue-500'\n }`}\n placeholder={column.validation?.required ? `${column.title} (required)` : column.title}\n />\n\n {validationError && (\n <div className=\"absolute z-10 mt-1 p-2 bg-red-100 border border-red-200 rounded shadow-sm text-xs text-red-800 max-w-xs\">\n <div className=\"flex items-center space-x-1\">\n <ExclamationCircleIcon className=\"h-3 w-3 flex-shrink-0\" />\n <span>{validationError}</span>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n // Display mode\n const displayValue = stringValue || (column.validation?.required ? '(required)' : '(empty)');\n const isEmpty = !stringValue;\n const isRequired = column.validation?.required;\n\n return (\n <div\n className={`px-3 py-2 text-sm cursor-pointer hover:bg-gray-50 ${\n isEmpty && isRequired ? 'text-red-600 bg-red-25' : 'text-gray-900'\n }`}\n onClick={disabled ? undefined : onStartEdit}\n title={disabled ? undefined : 'Click to edit'}\n >\n <span className={isEmpty ? 'italic' : ''}>{displayValue}</span>\n {isEmpty && isRequired && <ExclamationCircleIcon className=\"inline-block h-4 w-4 ml-1 text-red-500\" />}\n </div>\n );\n};\n\nexport default StringCell;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriStateCell.d.ts","sourceRoot":"","sources":["../../../../../src/components/views/GridView/cells/TriStateCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,KAAK,EAAE,SAAS,CAAC;IACjB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,wCAAwC;IACxC,MAAM,CAAC,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,sCAAsC;IACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,8CAA8C;IAC9C,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,6CAA6C;IAC7C,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAkIrD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriStateCell.js","sourceRoot":"","sources":["../../../../../src/components/views/GridView/cells/TriStateCell.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useMemo } from 'react';\nimport { ChevronDownIcon } from '@heroicons/react/24/outline';\nimport { JsonValue } from '@fgv/ts-json-base';\nimport { IGridColumnDefinition } from '../../../../types';\n\n/**\n * Props for the TriStateCell component.\n */\nexport interface ITriStateCellProps {\n /** Current value of the cell */\n value: JsonValue;\n /** Resource ID for this row */\n resourceId: string;\n /** Column configuration */\n column: IGridColumnDefinition;\n /** Whether the cell is in read-only mode */\n disabled?: boolean;\n /** Presentation mode: 'checkbox' for 3-state checkbox, 'dropdown' for select */\n presentation?: 'checkbox' | 'dropdown';\n /** Custom labels for tristate values */\n labels?: {\n trueLabel: string;\n falseLabel: string;\n undefinedLabel: string;\n };\n /** Callback when the value changes */\n onChange: (value: boolean | null) => void;\n /** Callback when the value should be saved */\n onSave: (value: boolean | null) => void;\n /** Callback when validation state changes */\n onValidationChange: (error: string | null) => void;\n}\n\n/**\n * TriStateCell component for editing three-state boolean values.\n *\n * Supports true, false, and null/undefined states with two presentation modes:\n * - Checkbox mode: 3-state checkbox (checked, unchecked, indeterminate)\n * - Dropdown mode: Select dropdown with three options\n *\n * @example\n * ```tsx\n * <TriStateCell\n * value={null}\n * resourceId=\"feature-123\"\n * column={{ id: 'enabled', title: 'Feature Enabled' }}\n * presentation=\"dropdown\"\n * onChange={handleChange}\n * onSave={handleSave}\n * onValidationChange={handleValidation}\n * />\n * ```\n * @public\n */\nexport const TriStateCell: React.FC<ITriStateCellProps> = ({\n value,\n resourceId,\n column,\n disabled = false,\n presentation = 'dropdown',\n labels,\n onChange,\n onSave,\n onValidationChange\n}) => {\n // Convert value to tri-state boolean\n const triStateValue = useMemo((): boolean | null => {\n if (value === null || value === undefined) return null;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') {\n if (value.toLowerCase() === 'true') return true;\n if (value.toLowerCase() === 'false') return false;\n return null;\n }\n if (typeof value === 'number') {\n if (value === 1) return true;\n if (value === 0) return false;\n return null;\n }\n return Boolean(value);\n }, [value]);\n\n // Handle checkbox change (cycles through states)\n const handleCheckboxChange = useCallback(() => {\n let newValue: boolean | null;\n\n if (triStateValue === null) {\n newValue = true;\n } else if (triStateValue === true) {\n newValue = false;\n } else {\n newValue = null;\n }\n\n onChange(newValue);\n onSave(newValue);\n onValidationChange(null);\n }, [triStateValue, onChange, onSave, onValidationChange]);\n\n // Handle dropdown change\n const handleDropdownChange = useCallback(\n (event: React.ChangeEvent<HTMLSelectElement>) => {\n let newValue: boolean | null;\n\n switch (event.target.value) {\n case 'true':\n newValue = true;\n break;\n case 'false':\n newValue = false;\n break;\n default:\n newValue = null;\n break;\n }\n\n onChange(newValue);\n onSave(newValue);\n onValidationChange(null);\n },\n [onChange, onSave, onValidationChange]\n );\n\n if (presentation === 'checkbox') {\n // 3-state checkbox presentation\n const checkboxRef = React.useRef<HTMLInputElement>(null);\n\n // Update checkbox indeterminate state\n React.useEffect(() => {\n if (checkboxRef.current) {\n checkboxRef.current.indeterminate = triStateValue === null;\n }\n }, [triStateValue]);\n\n return (\n <div className=\"px-3 py-2 flex items-center justify-center\">\n <label className=\"inline-flex items-center\">\n <input\n ref={checkboxRef}\n type=\"checkbox\"\n checked={triStateValue === true}\n onChange={handleCheckboxChange}\n disabled={disabled}\n className={`h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded ${\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'\n }`}\n />\n <span className=\"sr-only\">{column.title}</span>\n </label>\n </div>\n );\n }\n\n // Default labels (can be overridden)\n const defaultLabels = {\n trueLabel: 'Yes',\n falseLabel: 'No',\n undefinedLabel: 'Unset'\n };\n\n const effectiveLabels = labels || defaultLabels;\n\n return (\n <div className=\"px-3 py-2\">\n <div className=\"relative\">\n <select\n value={triStateValue === null ? 'null' : String(triStateValue)}\n onChange={handleDropdownChange}\n disabled={disabled}\n className={`w-full appearance-none bg-white border border-gray-300 rounded px-3 py-1 pr-8 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${\n disabled ? 'opacity-50 cursor-not-allowed bg-gray-100' : 'cursor-pointer'\n }`}\n >\n <option value=\"null\">{effectiveLabels.undefinedLabel}</option>\n <option value=\"true\">{effectiveLabels.trueLabel}</option>\n <option value=\"false\">{effectiveLabels.falseLabel}</option>\n </select>\n\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-2 pointer-events-none\">\n <ChevronDownIcon className=\"h-4 w-4 text-gray-400\" />\n </div>\n </div>\n </div>\n );\n};\n\nexport default TriStateCell;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/views/GridView/cells/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/views/GridView/cells/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["/**\n * Specialized cell components for GridView.\n *\n * This module exports all the specialized cell types that can be used\n * in grid columns for different data types and editing requirements.\n */\n\nexport { StringCell } from './StringCell';\nexport type { IStringCellProps } from './StringCell';\n\nexport { BooleanCell } from './BooleanCell';\nexport type { IBooleanCellProps } from './BooleanCell';\n\nexport { TriStateCell } from './TriStateCell';\nexport type { ITriStateCellProps } from './TriStateCell';\n\nexport { DropdownCell } from './DropdownCell';\nexport type { IDropdownCellProps } from './DropdownCell';\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/views/GridView/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAqB,MAAM,gBAAgB,CAAC;AAOnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAwR7C,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/views/GridView/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useMemo, useCallback, useEffect } from 'react';\nimport { TableCellsIcon } from '@heroicons/react/24/outline';\nimport { IGridViewProps, IResolutionResult } from '../../../types';\nimport { selectResources } from '../../../utils/resourceSelector';\nimport { QualifierContextControl } from '../../common/QualifierContextControl';\nimport { UnifiedChangeControls } from '../ResolutionView/UnifiedChangeControls';\nimport { ResourceGrid } from './ResourceGrid';\nimport { useSmartObservability } from '../../../hooks/useSmartObservability';\n\n/**\n * GridView component for displaying multiple resources in a tabular format.\n *\n * Provides a grid-based interface for viewing and editing multiple resources\n * simultaneously, with configurable column mappings and shared context management.\n * Leverages the same state management and batch processing as ResolutionView.\n *\n * **Key Features:**\n * - **Multi-resource display**: View multiple resources in rows with configurable columns\n * - **Column mapping**: Host-defined extraction of properties from resolved resources\n * - **Batch editing**: Edit multiple resource values with unified batch application\n * - **Context integration**: Same context management as ResolutionView\n * - **Resource filtering**: Flexible resource selection via built-in and custom selectors\n * - **Change management**: Leverages existing UnifiedChangeControls for batch operations\n *\n * @example\n * ```tsx\n * import { GridView } from '@fgv/ts-res-ui-components';\n *\n * // Define grid configuration\n * const gridConfig = {\n * id: 'user-messages',\n * title: 'User Messages',\n * resourceSelection: { type: 'prefix', prefix: 'user.' },\n * columnMapping: [{\n * resourceType: 'text-resource',\n * columns: [\n * { id: 'text', title: 'Message Text', dataPath: 'text', editable: true },\n * { id: 'locale', title: 'Locale', dataPath: 'locale' }\n * ]\n * }]\n * };\n *\n * function MyGridApp() {\n * return (\n * <GridView\n * gridConfig={gridConfig}\n * resources={processedResources}\n * resolutionState={resolutionState}\n * resolutionActions={resolutionActions}\n * availableQualifiers={['language', 'territory', 'platform']}\n * />\n * );\n * }\n * ```\n *\n * @public\n */\nexport const GridView: React.FC<IGridViewProps> = ({\n gridConfig,\n resources,\n resolutionState,\n resolutionActions,\n availableQualifiers = [],\n contextOptions,\n filterState,\n filterResult,\n showContextControls = true,\n showChangeControls = true,\n className = ''\n}) => {\n const o11y = useSmartObservability();\n\n // Store o11y in a ref to avoid re-render issues\n const o11yRef = React.useRef(o11y);\n React.useEffect(() => {\n o11yRef.current = o11y;\n }, [o11y]);\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 // Select resources for this grid based on the configuration\n const selectedResourceIds = useMemo(() => {\n if (!baseProcessedResources || !gridConfig.resourceSelection) {\n return [];\n }\n\n const selectionResult = selectResources(gridConfig.resourceSelection, baseProcessedResources);\n if (selectionResult.isFailure()) {\n // Use ref to avoid dependency on o11y\n o11yRef.current.user.error(`Resource selection failed: ${selectionResult.message}`);\n return [];\n }\n\n return selectionResult.value;\n }, [baseProcessedResources, gridConfig.resourceSelection]); // Removed o11y from dependencies\n\n // Resolve all selected resources with current context\n const resourceResolutions = useMemo(() => {\n if (!resolutionState?.currentResolver || !selectedResourceIds.length) {\n return new Map<string, IResolutionResult>();\n }\n\n const resolutions = new Map<string, IResolutionResult>();\n\n selectedResourceIds.forEach((resourceId) => {\n try {\n const resolver = resolutionState.currentResolver!;\n const resourceResult = resolver.resourceManager.getBuiltResource(resourceId);\n\n if (resourceResult.isSuccess()) {\n const resource = resourceResult.value;\n // Resolve the resource with current context\n const resolveResult = resolver.resolveComposedResourceValue(resourceId);\n\n if (resolveResult.isSuccess()) {\n resolutions.set(resourceId, {\n success: true,\n resourceId,\n resource,\n composedValue: resolveResult.value\n // Note: For grid view, we mainly need the composed value\n // Full candidate analysis is available but not needed for basic grid display\n });\n } else {\n resolutions.set(resourceId, {\n success: false,\n resourceId,\n error: resolveResult.message\n });\n }\n }\n } catch (error) {\n resolutions.set(resourceId, {\n success: false,\n resourceId,\n error: error instanceof Error ? error.message : 'Unknown resolution error'\n });\n }\n });\n\n return resolutions;\n }, [selectedResourceIds, resolutionState?.currentResolver, resolutionState?.contextValues]);\n\n // Handle context value changes using the shared pattern from ResolutionView\n const handleQualifierChange = useCallback(\n (qualifierName: string, value: string | undefined) => {\n // Don't update context if this qualifier is host-managed\n const qualifierOptions = contextOptions?.qualifierOptions?.[qualifierName];\n const isHostManaged = qualifierOptions?.hostValue !== undefined;\n\n if (!isHostManaged) {\n resolutionActions?.updateContextValue(qualifierName, value);\n }\n },\n [resolutionActions, contextOptions?.qualifierOptions]\n );\n\n // Apply host-managed values when they change (same pattern as ResolutionView)\n useEffect(() => {\n if (!contextOptions?.hostManagedValues || !resolutionActions?.applyContext) return;\n\n resolutionActions.applyContext(contextOptions.hostManagedValues);\n }, [contextOptions?.hostManagedValues, resolutionActions]);\n\n // Determine which qualifiers to show\n const visibleQualifiers = useMemo(() => {\n if (!contextOptions?.qualifierOptions) {\n return availableQualifiers;\n }\n\n return availableQualifiers.filter((qualifierName) => {\n const options = contextOptions.qualifierOptions![qualifierName];\n return options?.visible !== false;\n });\n }, [availableQualifiers, contextOptions?.qualifierOptions]);\n\n // Get effective context values\n const effectiveContextValues = useMemo(() => {\n return resolutionState?.contextValues || {};\n }, [resolutionState?.contextValues]);\n\n if (!resources) {\n return (\n <div className={`p-6 ${className}`}>\n <div className=\"flex items-center space-x-3 mb-6\">\n <TableCellsIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">{gridConfig.title || 'Resource Grid'}</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 view them in a grid format with customizable columns.\n </p>\n <div className=\"bg-blue-50 rounded-lg p-4\">\n <p className=\"text-sm text-blue-800\">\n <strong>Grid View:</strong> Display multiple resources in a table format. Configure columns to\n extract and edit specific properties from resolved 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 space-x-3 mb-6\">\n <TableCellsIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">{gridConfig.title || 'Resource Grid'}</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 <span className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-gray-100 text-gray-800\">\n {selectedResourceIds.length} resource{selectedResourceIds.length !== 1 ? 's' : ''}\n </span>\n </div>\n\n {gridConfig.description && <p className=\"text-gray-600 mb-6\">{gridConfig.description}</p>}\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n {/* Context Configuration Panel */}\n {showContextControls && contextOptions?.showContextControls !== false && (\n <div className=\"mb-6\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n {contextOptions?.contextPanelTitle || 'Context Configuration'}\n </h3>\n <div className={`bg-gray-50 rounded-lg p-4 ${contextOptions?.contextPanelClassName || ''}`}>\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 = contextOptions?.qualifierOptions?.[qualifierName];\n const hostManagedValue = contextOptions?.hostManagedValues?.[qualifierName];\n const globalPlaceholder =\n typeof contextOptions?.globalPlaceholder === 'function'\n ? contextOptions.globalPlaceholder(qualifierName)\n : contextOptions?.globalPlaceholder;\n\n const mergedOptions = {\n ...qualifierOptions,\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={baseProcessedResources}\n options={mergedOptions}\n />\n );\n })}\n </div>\n </div>\n\n {contextOptions?.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 {contextOptions?.showContextActions !== false && (\n <div className=\"flex items-center space-x-2\">\n <button\n onClick={resolutionActions?.resetCache}\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 {/* Main Grid Display */}\n <ResourceGrid\n gridConfig={gridConfig}\n selectedResourceIds={selectedResourceIds}\n resourceResolutions={resourceResolutions}\n resolutionActions={resolutionActions}\n resolutionState={resolutionState}\n />\n\n {/* Unified Change Controls */}\n {showChangeControls &&\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 resolutionActions?.applyPendingResources();\n }}\n onDiscardAll={() => {\n resolutionActions?.discardEdits?.();\n resolutionActions?.discardPendingResources?.();\n }}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default GridView;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/views/ImportView/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAS7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAiBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAooBjD,CAAC;AA0HF,eAAe,UAAU,CAAC"}