@fgv/ts-res-ui-components 5.1.0-2 → 5.1.0-21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/common/AppHeader.d.ts.map +1 -0
- package/lib/components/common/AppHeader.js.map +1 -0
- package/lib/components/common/AppLayout.d.ts.map +1 -0
- package/lib/components/common/AppLayout.js.map +1 -0
- package/lib/components/common/AppSidebar.d.ts.map +1 -0
- package/lib/components/common/AppSidebar.js.map +1 -0
- package/lib/components/common/NavigationWarningModal.d.ts.map +1 -0
- package/lib/components/common/NavigationWarningModal.js.map +1 -0
- package/lib/components/common/QualifierContextControl.d.ts.map +1 -0
- package/lib/components/common/QualifierContextControl.js.map +1 -0
- package/lib/components/common/ResolutionContextOptionsControl.d.ts.map +1 -0
- package/lib/components/common/ResolutionContextOptionsControl.js.map +1 -0
- package/lib/components/common/ResolutionResults/index.d.ts.map +1 -0
- package/lib/components/common/ResolutionResults/index.js.map +1 -0
- package/lib/components/common/ResourceListView.d.ts.map +1 -0
- package/lib/components/common/ResourceListView.js.map +1 -0
- package/lib/components/common/ResourcePickerOptionsControl.d.ts.map +1 -0
- package/lib/components/common/ResourcePickerOptionsControl.js.map +1 -0
- package/lib/components/common/ResourceTreeView.d.ts.map +1 -0
- package/lib/components/common/ResourceTreeView.js.map +1 -0
- package/lib/components/common/SourceResourceDetail/index.d.ts.map +1 -0
- package/lib/components/common/SourceResourceDetail/index.js.map +1 -0
- package/lib/components/forms/GenericQualifierTypeEditForm.d.ts.map +1 -0
- package/lib/components/forms/GenericQualifierTypeEditForm.js.map +1 -0
- package/lib/components/forms/HierarchyEditor.d.ts.map +1 -0
- package/lib/components/forms/HierarchyEditor.js.map +1 -0
- package/lib/components/forms/QualifierEditForm.d.ts.map +1 -0
- package/lib/components/forms/QualifierEditForm.js.map +1 -0
- package/lib/components/forms/QualifierTypeEditForm.d.ts.map +1 -0
- package/lib/components/forms/QualifierTypeEditForm.js.map +1 -0
- package/lib/components/forms/ResourceTypeEditForm.d.ts.map +1 -0
- package/lib/components/forms/ResourceTypeEditForm.js.map +1 -0
- package/lib/components/forms/index.d.ts.map +1 -0
- package/lib/components/forms/index.js.map +1 -0
- package/lib/components/orchestrator/ResourceOrchestrator.d.ts.map +1 -0
- package/lib/components/orchestrator/ResourceOrchestrator.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourceItem.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourceItem.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourcePickerList.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourcePickerList.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourcePickerTree.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/ResourcePickerTree.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/index.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/index.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/types.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/types.js.map +1 -0
- package/lib/components/pickers/ResourcePicker/utils/treeNavigation.d.ts.map +1 -0
- package/lib/components/pickers/ResourcePicker/utils/treeNavigation.js.map +1 -0
- package/lib/components/views/CompiledView/index.d.ts.map +1 -0
- package/lib/components/views/CompiledView/index.js.map +1 -0
- package/lib/components/views/ConfigurationView/index.d.ts.map +1 -0
- package/lib/components/views/ConfigurationView/index.js.map +1 -0
- package/lib/components/views/FilterView/index.d.ts.map +1 -0
- package/lib/components/views/FilterView/index.js.map +1 -0
- package/lib/components/views/GridView/EditableGridCell.d.ts.map +1 -0
- package/lib/components/views/GridView/EditableGridCell.js.map +1 -0
- package/lib/components/views/GridView/GridSelector.d.ts.map +1 -0
- package/lib/components/views/GridView/GridSelector.js.map +1 -0
- package/lib/components/views/GridView/MultiGridView.d.ts.map +1 -0
- package/lib/components/views/GridView/MultiGridView.js.map +1 -0
- package/lib/components/views/GridView/ResourceGrid.d.ts.map +1 -0
- package/lib/components/views/GridView/ResourceGrid.js.map +1 -0
- package/lib/components/views/GridView/SharedContextControls.d.ts.map +1 -0
- package/lib/components/views/GridView/SharedContextControls.js.map +1 -0
- package/lib/components/views/GridView/cells/BooleanCell.d.ts.map +1 -0
- package/lib/components/views/GridView/cells/BooleanCell.js.map +1 -0
- package/lib/components/views/GridView/cells/DropdownCell.d.ts.map +1 -0
- package/lib/components/views/GridView/cells/DropdownCell.js.map +1 -0
- package/lib/components/views/GridView/cells/StringCell.d.ts.map +1 -0
- package/lib/components/views/GridView/cells/StringCell.js.map +1 -0
- package/lib/components/views/GridView/cells/TriStateCell.d.ts.map +1 -0
- package/lib/components/views/GridView/cells/TriStateCell.js.map +1 -0
- package/lib/components/views/GridView/cells/index.d.ts.map +1 -0
- package/lib/components/views/GridView/cells/index.js.map +1 -0
- package/lib/components/views/GridView/index.d.ts.map +1 -0
- package/lib/components/views/GridView/index.js.map +1 -0
- package/lib/components/views/ImportView/index.d.ts.map +1 -0
- package/lib/components/views/ImportView/index.js.map +1 -0
- package/lib/components/views/MessagesWindow/index.d.ts.map +1 -0
- package/lib/components/views/MessagesWindow/index.js.map +1 -0
- package/lib/components/views/ResolutionView/EditableJsonView.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/EditableJsonView.js.map +1 -0
- package/lib/components/views/ResolutionView/NewResourceModal.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/NewResourceModal.js.map +1 -0
- package/lib/components/views/ResolutionView/UnifiedChangeControls.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/UnifiedChangeControls.js.map +1 -0
- package/lib/components/views/ResolutionView/index.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/index.js.map +1 -0
- package/lib/components/views/SourceView/index.d.ts.map +1 -0
- package/lib/components/views/SourceView/index.js.map +1 -0
- package/lib/contexts/ObservabilityContext.d.ts.map +1 -0
- package/lib/contexts/ObservabilityContext.js.map +1 -0
- package/lib/contexts/index.d.ts.map +1 -0
- package/lib/contexts/index.js.map +1 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/index.js.map +1 -0
- package/lib/hooks/useConfigurationState.d.ts.map +1 -0
- package/lib/hooks/useConfigurationState.js.map +1 -0
- package/lib/hooks/useFilterState.d.ts.map +1 -0
- package/lib/hooks/useFilterState.js.map +1 -0
- package/lib/hooks/useNavigationWarning.d.ts.map +1 -0
- package/lib/hooks/useNavigationWarning.js.map +1 -0
- package/lib/hooks/useResolutionState.d.ts.map +1 -0
- package/lib/hooks/useResolutionState.js.map +1 -0
- package/lib/hooks/useResourceData.d.ts.map +1 -0
- package/lib/hooks/useResourceData.js.map +1 -0
- package/lib/hooks/useSmartObservability.d.ts.map +1 -0
- package/lib/hooks/useSmartObservability.js.map +1 -0
- package/lib/hooks/useUrlParams.d.ts.map +1 -0
- package/lib/hooks/useUrlParams.js.map +1 -0
- package/lib/hooks/useViewState.d.ts.map +1 -0
- package/lib/hooks/useViewState.js.map +1 -0
- package/lib/index.browser.d.ts.map +1 -0
- package/lib/index.browser.js.map +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js.map +1 -0
- package/lib/namespaces/ConfigurationTools.d.ts.map +1 -0
- package/lib/namespaces/ConfigurationTools.js.map +1 -0
- package/lib/namespaces/DownloadTools.d.ts.map +1 -0
- package/lib/namespaces/DownloadTools.js.map +1 -0
- package/lib/namespaces/FilterTools.d.ts.map +1 -0
- package/lib/namespaces/FilterTools.js.map +1 -0
- package/lib/namespaces/GridTools.d.ts.map +1 -0
- package/lib/namespaces/GridTools.js.map +1 -0
- package/lib/namespaces/ImportTools.d.ts.map +1 -0
- package/lib/namespaces/ImportTools.js.map +1 -0
- package/lib/namespaces/ObservabilityTools.d.ts.map +1 -0
- package/lib/namespaces/ObservabilityTools.js.map +1 -0
- package/lib/namespaces/PickerTools.d.ts.map +1 -0
- package/lib/namespaces/PickerTools.js.map +1 -0
- package/lib/namespaces/ResolutionTools.d.ts.map +1 -0
- package/lib/namespaces/ResolutionTools.js.map +1 -0
- package/lib/namespaces/ResourceTools.d.ts.map +1 -0
- package/lib/namespaces/ResourceTools.js.map +1 -0
- package/lib/namespaces/TsResTools.d.ts.map +1 -0
- package/lib/namespaces/TsResTools.js.map +1 -0
- package/lib/namespaces/ViewStateTools.d.ts.map +1 -0
- package/lib/namespaces/ViewStateTools.js.map +1 -0
- package/lib/namespaces/ZipTools.d.ts.map +1 -0
- package/lib/namespaces/ZipTools.js.map +1 -0
- package/lib/namespaces/index.d.ts.map +1 -0
- package/lib/namespaces/index.js.map +1 -0
- package/lib/tsdoc-metadata.json +1 -1
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js.map +1 -0
- package/lib/utils/cellValidation.d.ts.map +1 -0
- package/lib/utils/cellValidation.js.map +1 -0
- package/lib/utils/configurationUtils.d.ts.map +1 -0
- package/lib/utils/configurationUtils.js.map +1 -0
- package/lib/utils/downloadHelper.d.ts.map +1 -0
- package/lib/utils/downloadHelper.js.map +1 -0
- package/lib/utils/filterResources.d.ts.map +1 -0
- package/lib/utils/filterResources.js.map +1 -0
- package/lib/utils/observability/factories.d.ts.map +1 -0
- package/lib/utils/observability/factories.js.map +1 -0
- package/lib/utils/observability/implementations.d.ts.map +1 -0
- package/lib/utils/observability/implementations.js.map +1 -0
- package/lib/utils/observability/index.d.ts.map +1 -0
- package/lib/utils/observability/index.js.map +1 -0
- package/lib/utils/observability/interfaces.d.ts.map +1 -0
- package/lib/utils/observability/interfaces.js.map +1 -0
- package/lib/utils/resolutionEditing.d.ts.map +1 -0
- package/lib/utils/resolutionEditing.js.map +1 -0
- package/lib/utils/resolutionUtils.d.ts.map +1 -0
- package/lib/utils/resolutionUtils.js.map +1 -0
- package/lib/utils/resourceSelector.d.ts.map +1 -0
- package/lib/utils/resourceSelector.js.map +1 -0
- package/lib/utils/resourceSelectors.d.ts.map +1 -0
- package/lib/utils/resourceSelectors.js.map +1 -0
- package/lib/utils/tsResIntegration.d.ts.map +1 -0
- package/lib/utils/tsResIntegration.js.map +1 -0
- package/lib/utils/zipLoader/index.d.ts.map +1 -0
- package/lib/utils/zipLoader/index.js.map +1 -0
- package/lib/utils/zipLoader/zipProcessingHelpers.d.ts.map +1 -0
- package/lib/utils/zipLoader/zipProcessingHelpers.js.map +1 -0
- package/lib/utils/zipLoader/zipUtils.d.ts.map +1 -0
- package/lib/utils/zipLoader/zipUtils.js.map +1 -0
- package/package.json +25 -23
- package/dist/ts-res-ui-components.d.ts +0 -6795
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HierarchyEditor.js","sourceRoot":"","sources":["../../../src/components/forms/HierarchyEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState } from 'react';\n\n/**\n * Props for the HierarchyEditor component.\n *\n * @public\n */\nexport interface IHierarchyEditorProps {\n /** Current hierarchy mapping of child to parent relationships */\n hierarchy: Record<string, string>;\n /** Callback fired when the hierarchy is modified */\n onChange: (hierarchy: Record<string, string>) => void;\n /** Available values for child selection (when working with enumerated qualifier types) */\n availableValues: string[];\n /** Optional CSS class name for styling */\n className?: string;\n}\n\ninterface IHierarchyTreeNode {\n value: string;\n level: number;\n children: IHierarchyTreeNode[];\n}\n/**\n * Interactive editor for defining hierarchical relationships between qualifier values.\n *\n * The HierarchyEditor allows users to define parent-child relationships between qualifier values,\n * enabling hierarchical resolution in the ts-res system. It provides an intuitive interface for\n * creating, viewing, and managing value hierarchies with visual tree representation.\n *\n * @example\n * ```tsx\n * import { ConfigurationTools } from '@fgv/ts-res-ui-components';\n *\n * // Basic hierarchy editing for region qualifiers\n * const [regionHierarchy, setRegionHierarchy] = useState({\n * 'quebec': 'canada',\n * 'ontario': 'canada',\n * 'california': 'usa',\n * 'texas': 'usa'\n * });\n *\n * <ConfigurationTools.HierarchyEditor\n * hierarchy={regionHierarchy}\n * onChange={setRegionHierarchy}\n * availableValues={['quebec', 'ontario', 'california', 'texas']}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Hierarchy editing for language qualifiers with dynamic values\n * const [languageHierarchy, setLanguageHierarchy] = useState({\n * 'en-CA': 'en',\n * 'en-US': 'en',\n * 'fr-CA': 'fr',\n * 'fr-FR': 'fr'\n * });\n *\n * <ConfigurationTools.HierarchyEditor\n * hierarchy={languageHierarchy}\n * onChange={setLanguageHierarchy}\n * availableValues={[]} // Allow free-form input\n * className=\"my-hierarchy-editor\"\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Integration with qualifier type configuration\n * const QualifierTypeEditor = ({ qualifierType, onSave }) => {\n * const [hierarchy, setHierarchy] = useState(qualifierType.hierarchy || {});\n *\n * const handleSave = () => {\n * onSave({\n * ...qualifierType,\n * hierarchy: Object.keys(hierarchy).length > 0 ? hierarchy : undefined\n * });\n * };\n *\n * return (\n * <div>\n * <ConfigurationTools.HierarchyEditor\n * hierarchy={hierarchy}\n * onChange={setHierarchy}\n * availableValues={qualifierType.enumeratedValues || []}\n * />\n * <button onClick={handleSave}>Save Qualifier Type</button>\n * </div>\n * );\n * };\n * ```\n *\n * @public\n */\nexport const HierarchyEditor: React.FC<IHierarchyEditorProps> = ({\n hierarchy,\n onChange,\n availableValues,\n className = ''\n}) => {\n const [newChild, setNewChild] = useState('');\n const [newParent, setNewParent] = useState('');\n\n // Ensure hierarchy is a valid object with string values\n const safeHierarchy = React.useMemo(() => {\n if (!hierarchy || typeof hierarchy !== 'object') {\n return {};\n }\n // Filter out any non-string values\n const safe: Record<string, string> = {};\n for (const [key, value] of Object.entries(hierarchy)) {\n if (typeof value === 'string') {\n safe[key] = value;\n }\n }\n return safe;\n }, [hierarchy]);\n\n const handleAddRelationship = (): void => {\n if (newChild && newParent && newChild !== newParent) {\n const updatedHierarchy = { ...safeHierarchy, [newChild]: newParent };\n onChange(updatedHierarchy);\n setNewChild('');\n setNewParent('');\n }\n };\n\n const handleRemoveRelationship = (child: string): void => {\n const updatedHierarchy = { ...safeHierarchy };\n delete updatedHierarchy[child];\n onChange(updatedHierarchy);\n };\n\n const getHierarchyTree = (): Array<IHierarchyTreeNode> => {\n const roots = new Set(availableValues);\n const children = new Set(Object.keys(safeHierarchy));\n const parents = new Set(Object.values(safeHierarchy));\n\n // Remove children from roots (they have parents)\n children.forEach((child) => roots.delete(child));\n\n // Add parents that aren't in available values (for display purposes)\n parents.forEach((parent) => {\n if (!availableValues.includes(parent)) {\n roots.add(parent);\n }\n });\n\n const buildTree = (value: string, level = 0): IHierarchyTreeNode => {\n const childrenOfValue = Object.entries(safeHierarchy).filter(([, parent]) => parent === value);\n return {\n value,\n level,\n children: childrenOfValue.map(([child]) => buildTree(child, level + 1))\n };\n };\n\n return Array.from(roots).map((root) => buildTree(root));\n };\n\n const renderTree = (nodes: IHierarchyTreeNode[]): React.ReactNode => {\n return nodes.map((node) => {\n const parentValue = safeHierarchy[node.value];\n\n return (\n <div key={node.value} className=\"ml-4\">\n <div className=\"flex items-center space-x-2 py-1\">\n <span className=\"text-sm text-gray-700\" style={{ marginLeft: `${node.level * 20}px` }}>\n {node.level > 0 && '└─ '}\n {node.value}\n </span>\n {parentValue && <span className=\"text-xs text-gray-500\">→ {parentValue}</span>}\n </div>\n {node.children.length > 0 && renderTree(node.children)}\n </div>\n );\n });\n };\n\n return (\n <div className={className}>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">Value Hierarchy</label>\n <div className=\"border border-gray-300 rounded-md p-3 bg-white\">\n {/* Add new relationship form */}\n <div className=\"mb-4 p-3 bg-gray-50 rounded border\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">Add Parent-Child Relationship</div>\n <div className=\"grid grid-cols-3 gap-2 items-end\">\n <div>\n <label className=\"block text-xs text-gray-600\">Child Value</label>\n {availableValues.length > 0 ? (\n <select\n value={newChild}\n onChange={(e) => setNewChild(e.target.value)}\n className=\"w-full text-sm rounded border-gray-300 focus:border-blue-500 focus:ring-blue-500\"\n >\n <option value=\"\">Select child...</option>\n {availableValues.map((value) => (\n <option key={value} value={value}>\n {value}\n </option>\n ))}\n </select>\n ) : (\n <input\n type=\"text\"\n value={newChild}\n onChange={(e) => setNewChild(e.target.value)}\n placeholder=\"Enter child value\"\n className=\"w-full text-sm rounded border-gray-300 focus:border-blue-500 focus:ring-blue-500\"\n />\n )}\n </div>\n <div>\n <label className=\"block text-xs text-gray-600\">Parent Value</label>\n <input\n type=\"text\"\n value={newParent}\n onChange={(e) => setNewParent(e.target.value)}\n placeholder=\"Enter parent value\"\n className=\"w-full text-sm rounded border-gray-300 focus:border-blue-500 focus:ring-blue-500\"\n />\n </div>\n <div>\n <button\n onClick={handleAddRelationship}\n disabled={!newChild || !newParent || newChild === newParent}\n className=\"w-full px-3 py-1 text-sm bg-blue-600 text-white rounded hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed\"\n >\n Add\n </button>\n </div>\n </div>\n <div className=\"text-xs text-gray-500 mt-1\">\n {availableValues.length > 0\n ? \"Define which values are children of other values. The parent doesn't need to be in the enumerated values list.\"\n : 'Define which values are children of other values. Enter any valid values for this qualifier type.'}\n </div>\n </div>\n\n {/* Current relationships */}\n {Object.keys(safeHierarchy).length > 0 && (\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Current Relationships ({Object.keys(safeHierarchy).length})\n </div>\n <div className=\"max-h-24 overflow-y-auto border border-gray-200 rounded bg-white p-2\">\n <div className=\"space-y-1\">\n {Object.entries(safeHierarchy).map(([child, parent]) => (\n <div key={child} className=\"flex items-center justify-between bg-gray-50 px-2 py-1 rounded\">\n <span className=\"text-sm\">\n <span className=\"font-medium\">{child}</span> →{' '}\n <span className=\"text-gray-600\">{parent}</span>\n </span>\n <button\n onClick={() => handleRemoveRelationship(child)}\n className=\"text-red-600 hover:text-red-800 text-xs ml-2 flex-shrink-0\"\n >\n Remove\n </button>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Hierarchy visualization */}\n {(availableValues.length > 0 || Object.keys(safeHierarchy).length > 0) && (\n <div>\n <div className=\"text-sm font-medium text-gray-700 mb-2\">Hierarchy Tree</div>\n <div className=\"bg-gray-50 border rounded max-h-32 overflow-y-auto\">\n <div className=\"p-2 text-sm font-mono\">\n {getHierarchyTree().length > 0 ? (\n renderTree(getHierarchyTree())\n ) : (\n <div className=\"text-gray-500 text-center py-2\">\n No hierarchy defined. Add relationships above to see the tree structure.\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default HierarchyEditor;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QualifierEditForm.d.ts","sourceRoot":"","sources":["../../../src/components/forms/QualifierEditForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAGL,UAAU,EACV,cAAc,EAEf,MAAM,aAAa,CAAC;AAIrB;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,SAAS,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC;IACtC,8CAA8C;IAC9C,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;IAChE,2DAA2D;IAC3D,sBAAsB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;IACnE,6CAA6C;IAC7C,MAAM,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,cAAc,KAAK,IAAI,CAAC;IACvD,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA2c/D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QualifierEditForm.js","sourceRoot":"","sources":["../../../src/components/forms/QualifierEditForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useEffect } from 'react';\nimport { XMarkIcon, InformationCircleIcon } from '@heroicons/react/24/outline';\nimport {\n MaxConditionPriority,\n MinConditionPriority,\n Qualifiers,\n QualifierTypes,\n Validate\n} from '@fgv/ts-res';\nimport { Converters } from '@fgv/ts-utils';\nimport { useObservability } from '../../contexts';\n\n/**\n * Props for the QualifierEditForm component.\n *\n * @public\n */\nexport interface IQualifierEditFormProps {\n /** Existing qualifier to edit (undefined for creating new qualifier) */\n qualifier?: Qualifiers.IQualifierDecl;\n /** Available qualifier types for selection */\n qualifierTypes: QualifierTypes.Config.IAnyQualifierTypeConfig[];\n /** Optional instantiated qualifier types for validation */\n qualifierTypeInstances?: Map<string, QualifierTypes.QualifierType>;\n /** Callback fired when qualifier is saved */\n onSave: (qualifier: Qualifiers.IQualifierDecl) => void;\n /** Callback fired when editing is cancelled */\n onCancel: () => void;\n /** Names of existing qualifiers to prevent duplicates */\n existingNames?: string[];\n}\n\ninterface IFormData {\n name: string;\n typeName: string;\n defaultPriority: number | '';\n token: string;\n tokenIsOptional: boolean;\n defaultValue: string;\n}\n\n/**\n * Modal form component for creating and editing qualifiers in a ts-res system configuration.\n *\n * The QualifierEditForm provides a comprehensive interface for defining qualifiers that control\n * resource resolution behavior. It includes validation, type-specific configuration options,\n * and automatic token generation for streamlined qualifier creation.\n *\n * @example\n * ```tsx\n * import { ConfigurationTools } from '@fgv/ts-res-ui-components';\n *\n * // Creating a new language qualifier\n * const qualifierTypes = [\n * { name: 'language', systemType: 'language' },\n * { name: 'region', systemType: 'territory' }\n * ];\n *\n * const [showForm, setShowForm] = useState(false);\n * const [qualifiers, setQualifiers] = useState([]);\n *\n * const handleSave = (qualifier) => {\n * setQualifiers(prev => [...prev, qualifier]);\n * setShowForm(false);\n * };\n *\n * {showForm && (\n * <ConfigurationTools.QualifierEditForm\n * qualifierTypes={qualifierTypes}\n * onSave={handleSave}\n * onCancel={() => setShowForm(false)}\n * existingNames={qualifiers.map(q => q.name)}\n * />\n * )}\n * ```\n *\n * @example\n * ```tsx\n * // Editing an existing qualifier with validation\n * const existingQualifier = {\n * name: 'language',\n * typeName: 'language',\n * defaultPriority: 100,\n * token: 'lang',\n * tokenIsOptional: false,\n * defaultValue: 'en-US'\n * };\n *\n * <ConfigurationTools.QualifierEditForm\n * qualifier={existingQualifier}\n * qualifierTypes={availableTypes}\n * onSave={updateQualifier}\n * onCancel={closeEditor}\n * existingNames={otherQualifierNames}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Advanced qualifier configuration with enum values\n * const platformType = {\n * name: 'platform',\n * systemType: 'literal',\n * configuration: {\n * caseSensitive: false,\n * enumeratedValues: ['web', 'mobile', 'desktop'],\n * allowContextList: true\n * }\n * };\n *\n * const platformQualifier = {\n * name: 'platform',\n * typeName: 'platform',\n * defaultPriority: 80,\n * token: 'plat',\n * defaultValue: 'web,mobile' // Multiple values supported\n * };\n *\n * <ConfigurationTools.QualifierEditForm\n * qualifier={platformQualifier}\n * qualifierTypes={[platformType]}\n * onSave={handlePlatformSave}\n * onCancel={cancelEdit}\n * />\n * ```\n *\n * @public\n */\nexport const QualifierEditForm: React.FC<IQualifierEditFormProps> = ({\n qualifier,\n qualifierTypes,\n qualifierTypeInstances,\n onSave,\n onCancel,\n existingNames = []\n}) => {\n const o11y = useObservability();\n const [formData, setFormData] = useState<IFormData>(() => {\n if (qualifier) {\n return {\n name: qualifier.name,\n typeName: qualifier.typeName,\n defaultPriority: qualifier.defaultPriority,\n token: qualifier.token ?? '',\n tokenIsOptional: qualifier.tokenIsOptional ?? false,\n defaultValue: qualifier.defaultValue ?? ''\n };\n }\n return {\n name: '',\n typeName: qualifierTypes[0]?.name ?? '',\n defaultPriority: 50,\n token: '',\n tokenIsOptional: false,\n defaultValue: ''\n };\n });\n\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [isFormValid, setIsFormValid] = useState<boolean>(false);\n\n // Get the selected qualifier type for context\n const selectedQualifierType = qualifierTypes.find((qt) => qt.name === formData.typeName);\n\n // Type-safe extraction of allowContextList property\n const allowsContextList = (() => {\n if (!selectedQualifierType?.configuration) return false;\n const result = Converters.boolean.convert(\n (selectedQualifierType.configuration as Record<string, unknown>).allowContextList\n );\n return result.isSuccess() ? result.value : false;\n })();\n\n // Validation\n const validateForm = useCallback((): boolean => {\n const newErrors: Record<string, string> = {};\n\n if (!formData.name.trim()) {\n newErrors.name = 'Name is required';\n } else if (existingNames.includes(formData.name) && formData.name !== qualifier?.name) {\n newErrors.name = 'Name must be unique';\n } else if (!Validate.isValidQualifierName(formData.name)) {\n newErrors.name = `${formData.name}: Invalid qualifier name`;\n }\n\n if (!formData.typeName) {\n newErrors.typeName = 'Qualifier type is required';\n }\n\n const priority = formData.defaultPriority === '' ? 0 : formData.defaultPriority;\n if (priority < MinConditionPriority || priority > MaxConditionPriority) {\n newErrors.defaultPriority = `${priority}: Priority must be between ${MinConditionPriority} and ${MaxConditionPriority}`;\n }\n\n if (formData.token && !Validate.isValidQualifierName(formData.token)) {\n newErrors.token = `${formData.token}: invalid qualifier token`;\n }\n\n // Validate default value using instantiated qualifier type if available\n if (formData.defaultValue && formData.typeName && qualifierTypeInstances) {\n const qualifierTypeInstance = qualifierTypeInstances.get(formData.typeName);\n if (qualifierTypeInstance) {\n const validationResult = qualifierTypeInstance.validateCondition(formData.defaultValue);\n if (validationResult.isFailure()) {\n newErrors.defaultValue = `${formData.defaultValue}: ${validationResult.message}`;\n }\n }\n }\n\n setErrors(newErrors);\n\n const hasErrors = Object.keys(newErrors).length > 0;\n const isValid = !hasErrors;\n\n setIsFormValid(isValid);\n\n if (hasErrors) {\n const qualifierName = formData.name.trim() ?? 'unknown-qualifier';\n const errorList = Object.entries(newErrors)\n .map(([field, error]) => `${field}: ${error}`)\n .join(', ');\n o11y.diag.info(`${qualifierName}: Qualifier validation failed - ${errorList}`);\n }\n\n return isValid;\n }, [formData, existingNames, qualifier?.name, qualifierTypeInstances, o11y]);\n\n const handleSave = useCallback(() => {\n const qualifierName = formData.name.trim() ?? 'unknown-qualifier';\n\n if (!validateForm()) {\n o11y.user.warn(`${qualifierName}: Cannot save - validation errors present`);\n return;\n }\n\n const result: Qualifiers.IQualifierDecl = {\n name: formData.name,\n typeName: formData.typeName,\n defaultPriority: formData.defaultPriority === '' ? 0 : formData.defaultPriority,\n ...(formData.token && { token: formData.token }),\n ...(formData.token && formData.tokenIsOptional && { tokenIsOptional: true }),\n ...(formData.defaultValue && { defaultValue: formData.defaultValue })\n };\n\n o11y.diag.info(`${qualifierName}: Saving qualifier - ${JSON.stringify(result)}`);\n onSave(result);\n o11y.user.success(`${qualifierName}: Qualifier ${qualifier ? 'updated' : 'created'} successfully`);\n }, [formData, validateForm, onSave, qualifier, o11y]);\n\n const updateField = useCallback(\n (field: keyof IFormData, value: IFormData[keyof IFormData]) => {\n setFormData((prev) => {\n const updated = { ...prev, [field]: value };\n\n // Auto-generate token from name if no custom token is set\n if (field === 'name' && !prev.token) {\n const generatedToken = String(value)\n .toLowerCase()\n .replace(/[^a-zA-Z0-9]/g, '');\n updated.token = generatedToken;\n\n if (generatedToken) {\n o11y.user.info(`${String(value)}: Token auto-generated as '${generatedToken}'`);\n }\n }\n\n // Clear tokenIsOptional if token is cleared\n if (field === 'token' && !value) {\n updated.tokenIsOptional = false;\n o11y.diag.info(\n `${prev.name ?? 'unknown-qualifier'}: Token cleared, tokenIsOptional reset to false`\n );\n }\n\n return updated;\n });\n\n // Log type selection changes\n if (field === 'typeName' && value !== formData.typeName) {\n const qualifierName = formData.name.trim() ?? 'unknown-qualifier';\n const newType = qualifierTypes.find((qt) => qt.name === value);\n if (newType) {\n o11y.user.info(`${qualifierName}: Qualifier type changed to '${value}' (${newType.systemType})`);\n\n // Log type capabilities\n const allowsContextList = (() => {\n if (!newType.configuration) return false;\n const result = Converters.boolean.convert(\n (newType.configuration as Record<string, unknown>).allowContextList\n );\n return result.isSuccess() ? result.value : false;\n })();\n\n if (allowsContextList) {\n o11y.diag.info(`${qualifierName}: New type '${value}' supports context lists`);\n }\n }\n }\n\n if (errors[field]) {\n setErrors((prev) => {\n const updated = { ...prev };\n delete updated[field];\n return updated;\n });\n }\n },\n [errors, formData.name, formData.typeName, qualifierTypes, o11y]\n );\n\n // Trigger validation when form data changes\n useEffect(() => {\n validateForm();\n }, [formData, validateForm]); // Run whenever formData changes\n\n const getDefaultValuePlaceholder = (): string => {\n if (!selectedQualifierType) return 'Enter default value';\n\n switch (selectedQualifierType.systemType) {\n case 'language':\n return allowsContextList ? 'e.g., en-US or en-US,en' : 'e.g., en-US';\n case 'territory':\n return allowsContextList ? 'e.g., US or US,CA' : 'e.g., US';\n case 'literal':\n // Type-safe extraction of enumeratedValues\n const enumValues = (() => {\n if (!selectedQualifierType.configuration) return undefined;\n const result = Converters.arrayOf(Converters.string).convert(\n (selectedQualifierType.configuration as Record<string, unknown>).enumeratedValues\n );\n return result.isSuccess() ? result.value : undefined;\n })();\n if (enumValues && enumValues.length > 0) {\n return allowsContextList\n ? `e.g., ${enumValues[0]} or ${enumValues.slice(0, 2).join(',')}`\n : `e.g., ${enumValues[0]}`;\n }\n return allowsContextList ? 'e.g., value or value1,value2' : 'e.g., value';\n default:\n return 'Enter default value';\n }\n };\n\n return (\n <div className=\"fixed inset-0 bg-gray-600 bg-opacity-50 flex items-center justify-center z-50 p-4\">\n <div className=\"bg-white rounded-lg shadow-xl max-w-2xl w-full h-full max-h-[calc(100vh-2rem)] flex flex-col\">\n {/* Fixed Header */}\n <div className=\"flex items-center justify-between p-6 border-b flex-shrink-0\">\n <h3 className=\"text-lg font-medium text-gray-900\">\n {qualifier ? 'Edit Qualifier' : 'Add Qualifier'}\n </h3>\n <button onClick={onCancel} className=\"text-gray-400 hover:text-gray-600\">\n <XMarkIcon className=\"w-6 h-6\" />\n </button>\n </div>\n\n {/* Scrollable Content */}\n <div className=\"p-6 space-y-6 overflow-y-auto flex-1 min-h-0\">\n {/* Basic Properties */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Name *</label>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => updateField('name', e.target.value)}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.name ? 'border-red-300' : 'border-gray-300'\n }`}\n placeholder=\"Enter qualifier name\"\n />\n {errors.name && <p className=\"mt-1 text-sm text-red-600\">{errors.name}</p>}\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Qualifier Type *</label>\n <select\n value={formData.typeName}\n onChange={(e) => updateField('typeName', e.target.value)}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.typeName ? 'border-red-300' : 'border-gray-300'\n }`}\n >\n {qualifierTypes.length === 0 ? (\n <option value=\"\">No qualifier types available</option>\n ) : (\n qualifierTypes.map((type) => (\n <option key={type.name} value={type.name}>\n {type.name} ({type.systemType})\n </option>\n ))\n )}\n </select>\n {errors.typeName && <p className=\"mt-1 text-sm text-red-600\">{errors.typeName}</p>}\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Default Priority *</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"1000\"\n value={formData.defaultPriority}\n onChange={(e) => {\n const value = e.target.value;\n // Allow empty string for better UX when clearing field\n if (value === '') {\n updateField('defaultPriority', '');\n } else {\n const parsed = parseInt(value, 10);\n if (!isNaN(parsed)) {\n updateField('defaultPriority', parsed);\n }\n }\n }}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.defaultPriority ? 'border-red-300' : 'border-gray-300'\n }`}\n placeholder=\"50\"\n />\n {errors.defaultPriority && (\n <p className=\"mt-1 text-sm text-red-600\">{errors.defaultPriority}</p>\n )}\n <p className=\"mt-1 text-xs text-gray-500\">Higher numbers have higher priority (0-1000)</p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Token\n <span className=\"ml-1 text-gray-500\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={formData.token}\n onChange={(e) => updateField('token', e.target.value)}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.token ? 'border-red-300' : 'border-gray-300'\n }`}\n placeholder=\"e.g., lang, locale\"\n />\n {errors.token && <p className=\"mt-1 text-sm text-red-600\">{errors.token}</p>}\n <p className=\"mt-1 text-xs text-gray-500\">Used to identify this qualifier in resource names</p>\n </div>\n </div>\n\n {/* Token Options */}\n {formData.token && (\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"tokenIsOptional\"\n checked={formData.tokenIsOptional}\n onChange={(e) => updateField('tokenIsOptional', e.target.checked)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"tokenIsOptional\" className=\"ml-2 text-sm text-gray-700\">\n Token is optional in resource names\n </label>\n <div className=\"ml-2 group relative\">\n <InformationCircleIcon className=\"w-4 h-4 text-gray-400\" />\n <div className=\"absolute left-0 bottom-6 hidden group-hover:block bg-gray-800 text-white text-xs rounded py-1 px-2 whitespace-nowrap z-10\">\n Allow resources without this qualifier token\n </div>\n </div>\n </div>\n )}\n\n {/* Default Value */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n Default Value\n <span className=\"ml-1 text-gray-500\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={formData.defaultValue}\n onChange={(e) => updateField('defaultValue', e.target.value)}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.defaultValue ? 'border-red-300' : 'border-gray-300'\n }`}\n placeholder={getDefaultValuePlaceholder()}\n />\n {errors.defaultValue && <p className=\"mt-1 text-sm text-red-600\">{errors.defaultValue}</p>}\n <div className=\"mt-1 text-xs text-gray-500\">\n {selectedQualifierType && (\n <div>\n <p>\n Qualifier type: <span className=\"font-medium\">{selectedQualifierType.systemType}</span>\n </p>\n {allowsContextList && (\n <p className=\"text-blue-600\">\n This qualifier type supports multiple values (comma-separated)\n </p>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Qualifier Type Information */}\n {selectedQualifierType && (\n <div className=\"p-4 bg-gray-50 rounded-lg\">\n <h4 className=\"font-medium text-gray-900 mb-2\">Qualifier Type Information</h4>\n <div className=\"text-sm text-gray-600 space-y-1\">\n <p>\n <span className=\"font-medium\">System Type:</span> {selectedQualifierType.systemType}\n </p>\n <p>\n <span className=\"font-medium\">Supports Context List:</span>{' '}\n {allowsContextList ? 'Yes' : 'No'}\n </p>\n {selectedQualifierType.systemType === 'literal' && selectedQualifierType.configuration && (\n <React.Fragment>\n {(selectedQualifierType.configuration as Record<string, unknown>).caseSensitive !==\n undefined && (\n <p>\n <span className=\"font-medium\">Case Sensitive:</span>{' '}\n {((selectedQualifierType.configuration as Record<string, unknown>)\n .caseSensitive as boolean)\n ? 'Yes'\n : 'No'}\n </p>\n )}\n {((selectedQualifierType.configuration as Record<string, unknown>).enumeratedValues as\n | string[]\n | undefined) && (\n <p>\n <span className=\"font-medium\">Allowed Values:</span>{' '}\n {(\n (selectedQualifierType.configuration as Record<string, unknown>)\n .enumeratedValues as string[]\n ).join(', ')}\n </p>\n )}\n </React.Fragment>\n )}\n {selectedQualifierType.systemType === 'territory' && selectedQualifierType.configuration && (\n <React.Fragment>\n {(selectedQualifierType.configuration as Record<string, unknown>).acceptLowercase !==\n undefined && (\n <p>\n <span className=\"font-medium\">Accept Lowercase:</span>{' '}\n {((selectedQualifierType.configuration as Record<string, unknown>)\n .acceptLowercase as boolean)\n ? 'Yes'\n : 'No'}\n </p>\n )}\n {((selectedQualifierType.configuration as Record<string, unknown>).allowedTerritories as\n | string[]\n | undefined) && (\n <p>\n <span className=\"font-medium\">Allowed Territories:</span>{' '}\n {(\n (selectedQualifierType.configuration as Record<string, unknown>)\n .allowedTerritories as string[]\n ).join(', ')}\n </p>\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Fixed Footer */}\n <div className=\"flex justify-end space-x-3 px-6 py-4 border-t bg-gray-50 flex-shrink-0\">\n <button\n onClick={onCancel}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={!isFormValid}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {qualifier ? 'Save Changes' : 'Add Qualifier'}\n </button>\n </div>\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QualifierTypeEditForm.d.ts","sourceRoot":"","sources":["../../../src/components/forms/QualifierTypeEditForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAY,MAAM,aAAa,CAAC;AAIvD;;;;GAIG;AACH,MAAM,WAAW,2BAA2B;IAC1C,wEAAwE;IACxE,aAAa,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,0BAA0B,CAAC;IACjE,kDAAkD;IAClD,MAAM,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC,MAAM,CAAC,0BAA0B,KAAK,IAAI,CAAC;IAClF,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqGG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CAicvE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QualifierTypeEditForm.js","sourceRoot":"","sources":["../../../src/components/forms/QualifierTypeEditForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useEffect } from 'react';\nimport { XMarkIcon, InformationCircleIcon } from '@heroicons/react/24/outline';\nimport { QualifierTypes, Validate } from '@fgv/ts-res';\nimport { HierarchyEditor } from './HierarchyEditor';\nimport { useObservability } from '../../contexts';\n\n/**\n * Props for the QualifierTypeEditForm component.\n *\n * @public\n */\nexport interface IQualifierTypeEditFormProps {\n /** Existing qualifier type to edit (undefined for creating new type) */\n qualifierType?: QualifierTypes.Config.ISystemQualifierTypeConfig;\n /** Callback fired when qualifier type is saved */\n onSave: (qualifierType: QualifierTypes.Config.ISystemQualifierTypeConfig) => void;\n /** Callback fired when editing is cancelled */\n onCancel: () => void;\n /** Names of existing qualifier types to prevent duplicates */\n existingNames?: string[];\n}\n\ninterface IFormData {\n name: string;\n systemType: 'language' | 'territory' | 'literal';\n allowContextList: boolean;\n // Literal type specific\n caseSensitive: boolean;\n enumeratedValues: string[];\n // Territory type specific\n acceptLowercase: boolean;\n allowedTerritories: string[];\n // Hierarchy support (for literal and territory types)\n hierarchy: Record<string, string>;\n}\n\n/**\n * Modal form component for creating and editing qualifier types in a ts-res system configuration.\n *\n * The QualifierTypeEditForm provides a comprehensive interface for defining qualifier types that\n * control the behavior and validation of qualifiers. It supports all three system types (language,\n * territory, literal) with type-specific configuration options, enumerated values, and hierarchical\n * relationships between values.\n *\n * @example\n * ```tsx\n * import { ConfigurationTools } from '@fgv/ts-res-ui-components';\n *\n * // Creating a new literal qualifier type with enumerated values\n * const [showForm, setShowForm] = useState(false);\n * const [qualifierTypes, setQualifierTypes] = useState([]);\n *\n * const handleSave = (qualifierType) => {\n * setQualifierTypes(prev => [...prev, qualifierType]);\n * setShowForm(false);\n * };\n *\n * {showForm && (\n * <ConfigurationTools.QualifierTypeEditForm\n * onSave={handleSave}\n * onCancel={() => setShowForm(false)}\n * existingNames={qualifierTypes.map(qt => qt.name)}\n * />\n * )}\n * ```\n *\n * @example\n * ```tsx\n * // Editing a platform qualifier type with hierarchy\n * const platformType = {\n * name: 'platform',\n * systemType: 'literal',\n * configuration: {\n * allowContextList: true,\n * caseSensitive: false,\n * enumeratedValues: ['web', 'mobile', 'desktop', 'smart-tv'],\n * hierarchy: {\n * 'smart-tv': 'web', // smart-tv inherits from web\n * 'tablet': 'mobile' // tablet inherits from mobile\n * }\n * }\n * };\n *\n * <ConfigurationTools.QualifierTypeEditForm\n * qualifierType={platformType}\n * onSave={updatePlatformType}\n * onCancel={closeEditor}\n * existingNames={otherTypeNames}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Territory qualifier type with restricted territories\n * const regionType = {\n * name: 'region',\n * systemType: 'territory',\n * configuration: {\n * allowContextList: false,\n * acceptLowercase: true,\n * allowedTerritories: ['US', 'CA', 'GB', 'AU'],\n * hierarchy: {\n * 'US': 'AMERICAS',\n * 'CA': 'AMERICAS',\n * 'GB': 'EUROPE',\n * 'AU': 'APAC'\n * }\n * }\n * };\n *\n * <ConfigurationTools.QualifierTypeEditForm\n * qualifierType={regionType}\n * onSave={saveRegionType}\n * onCancel={cancelEdit}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Simple language qualifier type\n * const languageType = {\n * name: 'locale',\n * systemType: 'language',\n * configuration: {\n * allowContextList: true // Allow multiple languages like 'en-US,en'\n * }\n * };\n *\n * <ConfigurationTools.QualifierTypeEditForm\n * qualifierType={languageType}\n * onSave={handleLanguageTypeSave}\n * onCancel={handleCancel}\n * existingNames={existingTypeNames}\n * />\n * ```\n *\n * @public\n */\nexport const QualifierTypeEditForm: React.FC<IQualifierTypeEditFormProps> = ({\n qualifierType,\n onSave,\n onCancel,\n existingNames = []\n}) => {\n const o11y = useObservability();\n const [formData, setFormData] = useState<IFormData>(() => {\n if (qualifierType) {\n // Instantiate the qualifier type to get strongly-typed configuration\n const qualifierTypeInstance = QualifierTypes.createQualifierTypeFromSystemConfig(qualifierType);\n let allowContextList = false;\n let caseSensitive = true;\n let enumeratedValues: string[] = [];\n let acceptLowercase = false;\n let allowedTerritories: string[] = [];\n let hierarchy: Record<string, string> = {};\n\n if (qualifierTypeInstance.isSuccess()) {\n const configResult = qualifierTypeInstance.value.getConfiguration();\n if (configResult.isSuccess()) {\n const config = configResult.value;\n allowContextList = config.configuration?.allowContextList === true;\n\n // Type-specific property access based on systemType\n if (config.systemType === 'literal') {\n const literalConfig = config.configuration;\n caseSensitive = literalConfig?.caseSensitive !== false; // Default to true\n enumeratedValues = literalConfig?.enumeratedValues ?? [];\n hierarchy = literalConfig?.hierarchy ?? {};\n } else if (config.systemType === 'territory') {\n const territoryConfig = config.configuration;\n acceptLowercase = territoryConfig?.acceptLowercase === true;\n allowedTerritories = territoryConfig?.allowedTerritories ?? [];\n hierarchy = territoryConfig?.hierarchy ?? {};\n }\n }\n }\n\n return {\n name: qualifierType.name,\n systemType: qualifierType.systemType as 'language' | 'territory' | 'literal',\n allowContextList,\n caseSensitive,\n enumeratedValues,\n acceptLowercase,\n allowedTerritories,\n hierarchy\n };\n }\n return {\n name: '',\n systemType: 'literal',\n allowContextList: false,\n caseSensitive: true,\n enumeratedValues: [],\n acceptLowercase: false,\n allowedTerritories: [],\n hierarchy: {}\n };\n });\n\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [isFormValid, setIsFormValid] = useState<boolean>(false);\n const [enumeratedValuesText, setEnumeratedValuesText] = useState(formData.enumeratedValues.join(', '));\n const [allowedTerritoriesText, setAllowedTerritoriesText] = useState(\n formData.allowedTerritories.join(', ')\n );\n\n // Validation\n const validateForm = useCallback((): boolean => {\n const newErrors: Record<string, string> = {};\n const qualifierTypeName = formData.name.trim() || 'unnamed-qualifier-type';\n\n if (!formData.name.trim()) {\n newErrors.name = 'Name is required';\n } else if (existingNames.includes(formData.name) && formData.name !== qualifierType?.name) {\n newErrors.name = 'Name must be unique';\n } else if (!Validate.isValidQualifierTypeName(formData.name)) {\n newErrors.name = `${formData.name}: Invalid qualifier type name`;\n }\n\n if (formData.systemType === 'territory' && formData.allowedTerritories.length > 0) {\n const territoryErrors = formData.allowedTerritories\n .filter(\n (territory) => !QualifierTypes.TerritoryQualifierType.isValidTerritoryConditionValue(territory)\n )\n .map((territory) => `${territory}: Invalid territory`);\n if (territoryErrors.length > 0) {\n newErrors.allowedTerritories = territoryErrors.join('; ');\n }\n }\n\n const isValid = Object.keys(newErrors).length === 0;\n\n setErrors(newErrors);\n setIsFormValid(isValid);\n\n if (isValid) {\n o11y.diag.info(`${qualifierTypeName}: Qualifier type validation successful`);\n } else {\n const errorList = Object.entries(newErrors)\n .map(([field, error]) => `${field}: ${error}`)\n .join(', ');\n o11y.diag.info(`${qualifierTypeName}: Qualifier type validation failed - ${errorList}`);\n }\n\n return isValid;\n }, [formData, existingNames, qualifierType?.name, o11y]);\n\n // Trigger validation when form data changes\n useEffect(() => {\n validateForm();\n }, [formData, validateForm]);\n\n // Update enumerated values when text changes\n useEffect(() => {\n const qualifierTypeName = formData.name.trim() || 'unnamed-qualifier-type';\n const values = enumeratedValuesText\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n\n const previousLength = formData.enumeratedValues.length;\n setFormData((prev) => ({ ...prev, enumeratedValues: values }));\n\n if (values.length !== previousLength) {\n o11y.diag.info(\n `${qualifierTypeName}: Enumerated values updated - ${values.length} values: [${values.join(', ')}]`\n );\n }\n }, [enumeratedValuesText, formData.name, o11y]);\n\n // Update allowed territories when text changes\n useEffect(() => {\n const qualifierTypeName = formData.name.trim() || 'unnamed-qualifier-type';\n const territories = allowedTerritoriesText\n .split(',')\n .map((v) => v.trim().toUpperCase())\n .filter((v) => v.length > 0);\n\n const previousLength = formData.allowedTerritories.length;\n setFormData((prev) => ({ ...prev, allowedTerritories: territories }));\n\n if (territories.length !== previousLength) {\n o11y.diag.info(\n `${qualifierTypeName}: Allowed territories updated - ${\n territories.length\n } territories: [${territories.join(', ')}]`\n );\n }\n }, [allowedTerritoriesText, formData.name, o11y]);\n\n const handleSave = useCallback(() => {\n const qualifierTypeName = formData.name.trim() || 'unnamed-qualifier-type';\n\n if (!validateForm()) {\n o11y.user.warn(`${qualifierTypeName}: Cannot save - validation errors present`);\n return;\n }\n\n let configuration: Record<string, unknown> = {\n allowContextList: formData.allowContextList\n };\n\n switch (formData.systemType) {\n case 'literal':\n configuration = {\n ...configuration,\n caseSensitive: formData.caseSensitive,\n enumeratedValues: formData.enumeratedValues.length > 0 ? formData.enumeratedValues : undefined\n };\n // Add hierarchy if it has entries\n if (Object.keys(formData.hierarchy).length > 0) {\n configuration.hierarchy = formData.hierarchy;\n o11y.diag.info(\n `${qualifierTypeName}: Including hierarchy with ${Object.keys(formData.hierarchy).length} entries`\n );\n }\n break;\n case 'territory':\n configuration = {\n ...configuration,\n acceptLowercase: formData.acceptLowercase,\n allowedTerritories: formData.allowedTerritories.length > 0 ? formData.allowedTerritories : undefined\n };\n // Add hierarchy if it has entries\n if (Object.keys(formData.hierarchy).length > 0) {\n configuration.hierarchy = formData.hierarchy;\n o11y.diag.info(\n `${qualifierTypeName}: Including hierarchy with ${Object.keys(formData.hierarchy).length} entries`\n );\n }\n break;\n case 'language':\n // Language types only have allowContextList\n o11y.diag.info(`${qualifierTypeName}: Language type - minimal configuration`);\n break;\n }\n\n const result: QualifierTypes.Config.ISystemQualifierTypeConfig = {\n name: formData.name,\n systemType: formData.systemType,\n configuration: Object.keys(configuration).length > 1 ? configuration : undefined\n };\n\n o11y.diag.info(`${qualifierTypeName}: Saving qualifier type - ${JSON.stringify(result)}`);\n onSave(result);\n o11y.user.success(\n `${qualifierTypeName}: Qualifier type ${qualifierType ? 'updated' : 'created'} successfully`\n );\n }, [formData, validateForm, onSave, qualifierType, o11y]);\n\n const updateField = useCallback(\n (field: keyof IFormData, value: IFormData[keyof IFormData]) => {\n const qualifierTypeName = formData.name.trim() || 'unnamed-qualifier-type';\n\n setFormData((prev) => ({ ...prev, [field]: value }));\n\n // Clear validation error for the field\n if (errors[field]) {\n setErrors((prev) => ({ ...prev, [field]: '' }));\n o11y.diag.info(`${qualifierTypeName}: Validation error cleared for field '${field}'`);\n }\n\n // Log significant field changes\n if (field === 'systemType') {\n o11y.user.info(`${qualifierTypeName}: System type changed to '${value}'`);\n o11y.diag.info(\n `${qualifierTypeName}: System type changed to '${value}' - form configuration will adjust`\n );\n } else if (field === 'name' && value !== formData.name) {\n o11y.diag.info(`${qualifierTypeName}: Name changing from '${formData.name}' to '${value}'`);\n } else if (field === 'hierarchy') {\n const hierarchyObj = value as Record<string, string>;\n const entryCount = Object.keys(hierarchyObj).length;\n const prevEntryCount = Object.keys(formData.hierarchy).length;\n\n if (entryCount !== prevEntryCount) {\n o11y.diag.info(\n `${qualifierTypeName}: Hierarchy updated - ${entryCount} entries (was ${prevEntryCount})`\n );\n if (entryCount > 0) {\n const entries = Object.entries(hierarchyObj).map(([child, parent]) => `${child} -> ${parent}`);\n o11y.diag.info(`${qualifierTypeName}: Hierarchy relationships: [${entries.join(', ')}]`);\n }\n }\n }\n },\n [errors, formData.name, formData.hierarchy, o11y]\n );\n\n const handleCancel = useCallback(() => {\n const qualifierTypeName = formData.name.trim() || 'unnamed-qualifier-type';\n o11y.diag.info(`${qualifierTypeName}: Qualifier type edit cancelled`);\n o11y.user.info(`${qualifierTypeName}: Edit cancelled`);\n onCancel();\n }, [formData.name, o11y, onCancel]);\n\n return (\n <div className=\"fixed inset-0 bg-gray-600 bg-opacity-50 flex items-center justify-center z-50 p-4\">\n <div className=\"bg-white rounded-lg shadow-xl max-w-2xl w-full h-full max-h-[calc(100vh-2rem)] flex flex-col\">\n {/* Fixed Header */}\n <div className=\"flex items-center justify-between p-6 border-b flex-shrink-0\">\n <h3 className=\"text-lg font-medium text-gray-900\">\n {qualifierType ? 'Edit Qualifier Type' : 'Add Qualifier Type'}\n </h3>\n <button onClick={handleCancel} className=\"text-gray-400 hover:text-gray-600\">\n <XMarkIcon className=\"w-6 h-6\" />\n </button>\n </div>\n\n {/* Scrollable Content */}\n <div className=\"p-6 space-y-6 overflow-y-auto flex-1 min-h-0\">\n {/* Basic Properties */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Name *</label>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => updateField('name', e.target.value)}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.name ? 'border-red-300' : 'border-gray-300'\n }`}\n placeholder=\"Enter qualifier type name\"\n />\n {errors.name && <p className=\"mt-1 text-sm text-red-600\">{errors.name}</p>}\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">System Type *</label>\n <select\n value={formData.systemType}\n onChange={(e) =>\n updateField('systemType', e.target.value as 'language' | 'territory' | 'literal')\n }\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.systemType ? 'border-red-300' : 'border-gray-300'\n }`}\n >\n <option value=\"literal\">Literal</option>\n <option value=\"language\">Language</option>\n <option value=\"territory\">Territory</option>\n </select>\n {errors.systemType && <p className=\"mt-1 text-sm text-red-600\">{errors.systemType}</p>}\n </div>\n </div>\n\n {/* Allow Context List */}\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"allowContextList\"\n checked={formData.allowContextList}\n onChange={(e) => updateField('allowContextList', e.target.checked)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"allowContextList\" className=\"ml-2 text-sm text-gray-700\">\n Allow Context List\n </label>\n <div className=\"ml-2 group relative\">\n <InformationCircleIcon className=\"w-4 h-4 text-gray-400\" />\n <div className=\"absolute left-0 bottom-6 hidden group-hover:block bg-gray-800 text-white text-xs rounded py-1 px-2 whitespace-nowrap\">\n Allow multiple values separated by commas\n </div>\n </div>\n </div>\n\n {/* Literal Type Specific */}\n {formData.systemType === 'literal' && (\n <div className=\"space-y-4 p-4 bg-blue-50 rounded-lg\">\n <h4 className=\"font-medium text-gray-900\">Literal Type Configuration</h4>\n\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"caseSensitive\"\n checked={formData.caseSensitive}\n onChange={(e) => updateField('caseSensitive', e.target.checked)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"caseSensitive\" className=\"ml-2 text-sm text-gray-700\">\n Case Sensitive\n </label>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Enumerated Values</label>\n <textarea\n value={enumeratedValuesText}\n onChange={(e) => setEnumeratedValuesText(e.target.value)}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.enumeratedValues ? 'border-red-300' : 'border-gray-300'\n }`}\n rows={3}\n placeholder=\"Enter values separated by commas (e.g., dev, test, prod)\"\n />\n {errors.enumeratedValues && (\n <p className=\"mt-1 text-sm text-red-600\">{errors.enumeratedValues}</p>\n )}\n <p className=\"mt-1 text-xs text-gray-500\">Separate multiple values with commas</p>\n </div>\n </div>\n )}\n\n {/* Territory Type Specific */}\n {formData.systemType === 'territory' && (\n <div className=\"space-y-4 p-4 bg-green-50 rounded-lg\">\n <h4 className=\"font-medium text-gray-900\">Territory Type Configuration</h4>\n\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"acceptLowercase\"\n checked={formData.acceptLowercase}\n onChange={(e) => updateField('acceptLowercase', e.target.checked)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"acceptLowercase\" className=\"ml-2 text-sm text-gray-700\">\n Accept Lowercase Territory Codes\n </label>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Allowed Territories</label>\n <textarea\n value={allowedTerritoriesText}\n onChange={(e) => setAllowedTerritoriesText(e.target.value)}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.allowedTerritories ? 'border-red-300' : 'border-gray-300'\n }`}\n rows={3}\n placeholder=\"Enter territory codes separated by commas (e.g., US, CA, GB)\"\n />\n {errors.allowedTerritories && (\n <p className=\"mt-1 text-sm text-red-600\">{errors.allowedTerritories}</p>\n )}\n <p className=\"mt-1 text-xs text-gray-500\">\n Separate multiple territory codes with commas. Will be automatically converted to uppercase.\n </p>\n </div>\n </div>\n )}\n\n {/* Hierarchy Editor for Literal and Territory Types */}\n {(formData.systemType === 'literal' || formData.systemType === 'territory') && (\n <div className=\"space-y-4\">\n <HierarchyEditor\n hierarchy={formData.hierarchy}\n onChange={(hierarchy) => updateField('hierarchy', hierarchy)}\n availableValues={\n formData.systemType === 'literal' ? formData.enumeratedValues : formData.allowedTerritories\n }\n />\n </div>\n )}\n\n {/* Language Type Specific */}\n {formData.systemType === 'language' && (\n <div className=\"p-4 bg-yellow-50 rounded-lg\">\n <h4 className=\"font-medium text-gray-900\">Language Type Configuration</h4>\n <p className=\"text-sm text-gray-600 mt-2\">\n Language qualifier types use BCP47 language tags and only support the \"Allow Context List\"\n option above.\n </p>\n </div>\n )}\n </div>\n\n {/* Fixed Footer */}\n <div className=\"flex justify-end space-x-3 px-6 py-4 border-t bg-gray-50 flex-shrink-0\">\n <button\n onClick={handleCancel}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={!isFormValid}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {qualifierType ? 'Save Changes' : 'Add Qualifier Type'}\n </button>\n </div>\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceTypeEditForm.d.ts","sourceRoot":"","sources":["../../../src/components/forms/ResourceTypeEditForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAY,MAAM,aAAa,CAAC;AAGtD;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,uEAAuE;IACvE,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACxD,iDAAiD;IACjD,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,mBAAmB,KAAK,IAAI,CAAC;IACzE,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AASD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgGG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAqWrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceTypeEditForm.js","sourceRoot":"","sources":["../../../src/components/forms/ResourceTypeEditForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useEffect } from 'react';\nimport { XMarkIcon, InformationCircleIcon } from '@heroicons/react/24/outline';\nimport { ResourceTypes, Validate } from '@fgv/ts-res';\nimport { useObservability } from '../../contexts';\n\n/**\n * Props for the ResourceTypeEditForm component.\n *\n * @public\n */\nexport interface IResourceTypeEditFormProps {\n /** Existing resource type to edit (undefined for creating new type) */\n resourceType?: ResourceTypes.Config.IResourceTypeConfig;\n /** Callback fired when resource type is saved */\n onSave: (resourceType: ResourceTypes.Config.IResourceTypeConfig) => void;\n /** Callback fired when editing is cancelled */\n onCancel: () => void;\n /** Names of existing resource types to prevent duplicates */\n existingNames?: string[];\n}\n\ninterface IFormData {\n name: string;\n typeName: string;\n}\n\nconst COMMON_TYPE_NAMES: string[] = ['json'];\n\n/**\n * Modal form component for creating and editing resource types in a ts-res system configuration.\n *\n * The ResourceTypeEditForm provides an interface for defining resource types that categorize\n * resources and determine their data handling behavior. It supports both common predefined\n * types and custom types for specialized use cases, with automatic type suggestion based\n * on resource type names.\n *\n * @example\n * ```tsx\n * import { ConfigurationTools } from '@fgv/ts-res-ui-components';\n *\n * // Creating a new resource type with common type\n * const [showForm, setShowForm] = useState(false);\n * const [resourceTypes, setResourceTypes] = useState([]);\n *\n * const handleSave = (resourceType) => {\n * setResourceTypes(prev => [...prev, resourceType]);\n * setShowForm(false);\n * };\n *\n * {showForm && (\n * <ConfigurationTools.ResourceTypeEditForm\n * onSave={handleSave}\n * onCancel={() => setShowForm(false)}\n * existingNames={resourceTypes.map(rt => rt.name)}\n * />\n * )}\n * ```\n *\n * @example\n * ```tsx\n * // Editing an existing resource type\n * const userSettingsType = {\n * name: 'userSettings',\n * typeName: 'object' // Built-in object type for structured data\n * };\n *\n * <ConfigurationTools.ResourceTypeEditForm\n * resourceType={userSettingsType}\n * onSave={updateResourceType}\n * onCancel={closeEditor}\n * existingNames={otherTypeNames}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Creating resource types for different content categories\n * const contentTypes = [\n * { name: 'errorMessages', typeName: 'string' },\n * { name: 'uiLabels', typeName: 'localizedString' },\n * { name: 'navigationMenus', typeName: 'object' },\n * { name: 'permissionLists', typeName: 'array' },\n * { name: 'appConfig', typeName: 'config' },\n * { name: 'customValidator', typeName: 'customValidation' } // Custom type\n * ];\n *\n * const CreateResourceTypesForm = () => {\n * const [currentType, setCurrentType] = useState(null);\n *\n * return (\n * <div>\n * {currentType && (\n * <ConfigurationTools.ResourceTypeEditForm\n * resourceType={currentType}\n * onSave={handleSaveType}\n * onCancel={() => setCurrentType(null)}\n * existingNames={existingNames}\n * />\n * )}\n * </div>\n * );\n * };\n * ```\n *\n * @example\n * ```tsx\n * // Custom resource type for specialized processing\n * const templateType = {\n * name: 'emailTemplates',\n * typeName: 'htmlTemplate' // Custom type name for specialized handling\n * };\n *\n * <ConfigurationTools.ResourceTypeEditForm\n * resourceType={templateType}\n * onSave={(updatedType) => {\n * // Handle custom type processing\n * o11y.user.success(`${updatedType.name}: Custom type '${updatedType.typeName}' saved successfully`);\n * saveToConfiguration(updatedType);\n * }}\n * onCancel={cancelEdit}\n * />\n * ```\n *\n * @public\n */\nexport const ResourceTypeEditForm: React.FC<IResourceTypeEditFormProps> = ({\n resourceType,\n onSave,\n onCancel,\n existingNames = []\n}) => {\n const o11y = useObservability();\n const [formData, setFormData] = useState<IFormData>(() => {\n if (resourceType) {\n return {\n name: resourceType.name,\n typeName: resourceType.typeName\n };\n }\n return {\n name: '',\n typeName: 'string'\n };\n });\n\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [isFormValid, setIsFormValid] = useState<boolean>(false);\n const [useCustomTypeName, setUseCustomTypeName] = useState(() => {\n if (resourceType) {\n return !COMMON_TYPE_NAMES.includes(resourceType.typeName);\n }\n return false;\n });\n\n // Validation\n const validateForm = useCallback((): boolean => {\n const newErrors: Record<string, string> = {};\n\n // Validate name using standard validators\n if (!formData.name.trim()) {\n newErrors.name = 'Name is required';\n } else if (existingNames.includes(formData.name) && formData.name !== resourceType?.name) {\n newErrors.name = 'Name must be unique';\n } else if (!Validate.isValidResourceTypeName(formData.name)) {\n newErrors.name = `${formData.name}: Invalid resource type name`;\n }\n\n // Validate type name using standard validators\n if (!formData.typeName.trim()) {\n newErrors.typeName = 'Type name is required';\n } else if (!Validate.isValidResourceTypeName(formData.typeName)) {\n newErrors.typeName = `${formData.typeName}: Invalid type name`;\n }\n\n setErrors(newErrors);\n\n const hasErrors = Object.keys(newErrors).length > 0;\n const isValid = !hasErrors;\n\n setIsFormValid(isValid);\n\n if (hasErrors) {\n const resourceTypeName = formData.name.trim() || 'unknown-resource-type';\n const errorList = Object.entries(newErrors)\n .map(([field, error]) => `${field}: ${error}`)\n .join(', ');\n o11y.diag.info(`${resourceTypeName}: Resource type validation failed - ${errorList}`);\n } else {\n const resourceTypeName = formData.name.trim() || 'unknown-resource-type';\n o11y.diag.info(`${resourceTypeName}: Resource type validation passed`);\n }\n\n return isValid;\n }, [formData, existingNames, resourceType?.name, o11y]);\n\n // Log form initialization (run once on mount)\n useEffect(() => {\n const resourceTypeName = formData.name.trim() || 'new-resource-type';\n if (resourceType) {\n o11y.diag.info(\n `${resourceTypeName}: Editing existing resource type - name: '${resourceType.name}', typeName: '${resourceType.typeName}'`\n );\n } else {\n o11y.diag.info(`${resourceTypeName}: Creating new resource type`);\n }\n\n // Log type name mode\n if (useCustomTypeName) {\n o11y.diag.info(`${resourceTypeName}: Using custom type name mode`);\n } else {\n o11y.diag.info(`${resourceTypeName}: Using common type name mode`);\n }\n }, []); // Run only on component mount\n\n // Trigger validation when form data changes\n useEffect(() => {\n validateForm();\n }, [formData, validateForm]);\n\n const handleSave = useCallback(() => {\n const resourceTypeName = formData.name.trim() || 'unknown-resource-type';\n\n if (!validateForm()) {\n o11y.user.warn(`${resourceTypeName}: Cannot save - validation errors present`);\n return;\n }\n\n const result: ResourceTypes.Config.IResourceTypeConfig = {\n name: formData.name,\n typeName: formData.typeName\n };\n\n o11y.diag.info(`${resourceTypeName}: Saving resource type - ${JSON.stringify(result)}`);\n onSave(result);\n o11y.user.success(\n `${resourceTypeName}: Resource type ${resourceType ? 'updated' : 'created'} successfully`\n );\n }, [formData, validateForm, onSave, resourceType, o11y]);\n\n const updateField = useCallback(\n (field: keyof IFormData, value: string) => {\n setFormData((prev) => {\n const updated = { ...prev, [field]: value };\n\n // Auto-generate typeName from name for new resource types if using common types\n if (field === 'name' && !resourceType && !useCustomTypeName) {\n const cleanName = value.toLowerCase().replace(/[^a-zA-Z0-9]/g, '');\n const commonType = COMMON_TYPE_NAMES.find(\n (type) => cleanName.includes(type) || type.includes(cleanName)\n );\n if (commonType) {\n updated.typeName = commonType;\n o11y.user.info(`${value}: Type name auto-generated as '${commonType}'`);\n } else {\n const fallbackType = cleanName || 'string';\n updated.typeName = fallbackType;\n if (cleanName && cleanName !== 'string') {\n o11y.user.info(`${value}: Type name auto-generated as custom type '${cleanName}'`);\n }\n }\n }\n\n // Log significant field changes\n if (field === 'typeName' && value !== prev.typeName) {\n const resourceTypeName = prev.name.trim() || 'unknown-resource-type';\n if (COMMON_TYPE_NAMES.includes(value)) {\n o11y.user.info(`${resourceTypeName}: Type name changed to common type '${value}'`);\n } else {\n o11y.user.info(`${resourceTypeName}: Type name changed to custom type '${value}'`);\n }\n }\n\n return updated;\n });\n\n if (errors[field]) {\n setErrors((prev) => ({ ...prev, [field]: '' }));\n }\n },\n [errors, resourceType, useCustomTypeName, o11y]\n );\n\n const handleTypeNameModeChange = useCallback(\n (useCustom: boolean) => {\n const resourceTypeName = formData.name.trim() || 'unknown-resource-type';\n\n setUseCustomTypeName(useCustom);\n if (!useCustom && !resourceType) {\n // Reset to a common type\n o11y.user.info(`${resourceTypeName}: Switching to common type names, reset to 'json'`);\n updateField('typeName', 'json');\n } else if (useCustom) {\n o11y.user.info(`${resourceTypeName}: Switching to custom type name mode`);\n }\n },\n [resourceType, updateField, formData.name, o11y]\n );\n\n const handleCancel = useCallback(() => {\n const resourceTypeName = formData.name.trim() || 'unknown-resource-type';\n o11y.user.info(`${resourceTypeName}: Resource type editing cancelled`);\n onCancel();\n }, [formData.name, onCancel, o11y]);\n\n const getTypeNameDescription = (typeName: string): string => {\n switch (typeName) {\n case 'json':\n return 'Complex structured data (JSON objects)';\n default:\n return 'Custom resource type';\n }\n };\n\n return (\n <div className=\"fixed inset-0 bg-gray-600 bg-opacity-50 flex items-center justify-center z-50 p-4\">\n <div className=\"bg-white rounded-lg shadow-xl max-w-2xl w-full h-full max-h-[calc(100vh-2rem)] flex flex-col\">\n {/* Fixed Header */}\n <div className=\"flex items-center justify-between p-6 border-b flex-shrink-0\">\n <h3 className=\"text-lg font-medium text-gray-900\">\n {resourceType ? 'Edit Resource Type' : 'Add Resource Type'}\n </h3>\n <button onClick={handleCancel} className=\"text-gray-400 hover:text-gray-600\">\n <XMarkIcon className=\"w-6 h-6\" />\n </button>\n </div>\n\n {/* Scrollable Content */}\n <div className=\"p-6 space-y-6 overflow-y-auto flex-1 min-h-0\">\n {/* Basic Properties */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">Name *</label>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => updateField('name', e.target.value)}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.name ? 'border-red-300' : 'border-gray-300'\n }`}\n placeholder=\"Enter resource type name (e.g., 'userSettings', 'errorMessages')\"\n />\n {errors.name && <p className=\"mt-1 text-sm text-red-600\">{errors.name}</p>}\n <p className=\"mt-1 text-xs text-gray-500\">\n A descriptive name for this type of resource. This will be used to categorize and identify\n resources.\n </p>\n </div>\n\n {/* Type Name Configuration */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-3\">Type Name Configuration *</label>\n\n <div className=\"space-y-3\">\n <div className=\"flex items-center\">\n <input\n type=\"radio\"\n id=\"useCommonType\"\n name=\"typeNameMode\"\n checked={!useCustomTypeName}\n onChange={() => handleTypeNameModeChange(false)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <label htmlFor=\"useCommonType\" className=\"ml-2 text-sm text-gray-700\">\n Use common type name\n </label>\n </div>\n\n {!useCustomTypeName && (\n <div className=\"ml-6\">\n <select\n value={formData.typeName}\n onChange={(e) => updateField('typeName', e.target.value)}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.typeName ? 'border-red-300' : 'border-gray-300'\n }`}\n >\n {COMMON_TYPE_NAMES.map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n <p className=\"mt-1 text-xs text-gray-600\">{getTypeNameDescription(formData.typeName)}</p>\n </div>\n )}\n\n <div className=\"flex items-center\">\n <input\n type=\"radio\"\n id=\"useCustomType\"\n name=\"typeNameMode\"\n checked={useCustomTypeName}\n onChange={() => handleTypeNameModeChange(true)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <label htmlFor=\"useCustomType\" className=\"ml-2 text-sm text-gray-700\">\n Define custom type name\n </label>\n </div>\n\n {useCustomTypeName && (\n <div className=\"ml-6\">\n <input\n type=\"text\"\n value={formData.typeName}\n onChange={(e) => updateField('typeName', e.target.value)}\n className={`w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${\n errors.typeName ? 'border-red-300' : 'border-gray-300'\n }`}\n placeholder=\"Enter custom type name\"\n />\n <p className=\"mt-1 text-xs text-gray-500\">\n Define a custom type name for specialized resource handling\n </p>\n </div>\n )}\n </div>\n\n {errors.typeName && <p className=\"mt-1 text-sm text-red-600\">{errors.typeName}</p>}\n </div>\n\n {/* Information Panel */}\n <div className=\"p-4 bg-blue-50 rounded-lg\">\n <div className=\"flex items-start\">\n <InformationCircleIcon className=\"w-5 h-5 text-blue-400 mt-0.5 mr-3 flex-shrink-0\" />\n <div className=\"text-sm text-blue-800\">\n <h4 className=\"font-medium mb-2\">About Resource Types</h4>\n <div className=\"space-y-2\">\n <p>\n Resource types define how resources are categorized and processed in your application.\n </p>\n <ul className=\"list-disc list-inside space-y-1 ml-2\">\n <li>\n <strong>Name:</strong> A human-readable identifier for grouping resources\n </li>\n <li>\n <strong>Type Name:</strong> Determines how the resource data is interpreted and\n validated\n </li>\n <li>Common types (string, object, array) provide built-in processing</li>\n <li>Custom types allow specialized handling for domain-specific data</li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"p-4 bg-gray-50 rounded-lg\">\n <h4 className=\"font-medium text-gray-900 mb-2\">Preview</h4>\n <div className=\"text-sm text-gray-600\">\n <p>\n <span className=\"font-medium\">Resource Type:</span> {formData.name || '(name not set)'}\n </p>\n <p>\n <span className=\"font-medium\">Type Name:</span> {formData.typeName}\n </p>\n <p>\n <span className=\"font-medium\">Description:</span> {getTypeNameDescription(formData.typeName)}\n </p>\n </div>\n </div>\n </div>\n\n {/* Fixed Footer */}\n <div className=\"flex justify-end space-x-3 px-6 py-4 border-t bg-gray-50 flex-shrink-0\">\n <button\n onClick={handleCancel}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={!isFormValid}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {resourceType ? 'Save Changes' : 'Add Resource Type'}\n </button>\n </div>\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/forms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAE3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,YAAY,EAAE,kCAAkC,EAAE,MAAM,gCAAgC,CAAC;AAEzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/forms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAG9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["export { QualifierTypeEditForm } from './QualifierTypeEditForm';\nexport type { IQualifierTypeEditFormProps } from './QualifierTypeEditForm';\n\nexport { GenericQualifierTypeEditForm } from './GenericQualifierTypeEditForm';\nexport type { IGenericQualifierTypeEditFormProps } from './GenericQualifierTypeEditForm';\n\nexport { QualifierEditForm } from './QualifierEditForm';\nexport type { IQualifierEditFormProps } from './QualifierEditForm';\n\nexport { ResourceTypeEditForm } from './ResourceTypeEditForm';\nexport type { IResourceTypeEditFormProps } from './ResourceTypeEditForm';\n\nexport { HierarchyEditor } from './HierarchyEditor';\nexport type { IHierarchyEditorProps } from './HierarchyEditor';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/components/orchestrator/ResourceOrchestrator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAkC,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAU,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EAIpB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAQhE;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,mEAAmE;IACnE,QAAQ,EAAE,CAAC,YAAY,EAAE;QAAE,KAAK,EAAE,kBAAkB,CAAC;QAAC,OAAO,EAAE,oBAAoB,CAAA;KAAE,KAAK,SAAS,CAAC;IACpG,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACzD,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,MAAM,CAAC,kBAAkB,CAC9C,cAAc,CAAC,MAAM,CAAC,uBAAuB,EAC7C,cAAc,CAAC,aAAa,CAC7B,CAAC;IACF,wEAAwE;IACxE,mBAAmB,CAAC,EAAE,MAAM,CAAC,kBAAkB,CAC7C,aAAa,CAAC,MAAM,CAAC,mBAAmB,EACxC,aAAa,CAAC,YAAY,CAC3B,CAAC;IACF;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,sBAAsB,CAAC;IAC/C,qDAAqD;IACrD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC;IAC7D,mEAAmE;IACnE,oBAAoB,CAAC,EAAE,kBAAkB,CAAC,qBAAqB,CAAC;CACjE;AAyaD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAqBrE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceOrchestrator.js","sourceRoot":"","sources":["../../../src/components/orchestrator/ResourceOrchestrator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAa,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAiC,MAAM,aAAa,CAAC;AAU5E,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,mCAAmC,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5G,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAC;AAmC5D;;GAEG;AACH,MAAM,4BAA4B,GAI9B,CAAC,EACH,QAAQ,EACR,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,SAAS,EACV,EAAE,EAAE;IACH,0CAA0C;IAC1C,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAEhC,aAAa;IACb,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,oBAAoB;QACpB,mBAAmB;QACnB,IAAI;KACL,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,wFAAwF;IACxF,+CAA+C;IAC/C,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,gBAAqC,EAAE,EAAE;QACxC,YAAY,CAAC,OAAO,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAC1D,CAAC,EACD,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAClC,CAAC;IAEF,iCAAiC;IACjC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAC;IAE7E,gFAAgF;IAChF,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,EAAE;QAChD,MAAM,iBAAiB,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;QACtF,OAAO,iBAAiB;YACtB,CAAC,CAAC,YAAY,EAAE,kBAAkB,IAAI,IAAI;YAC1C,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAC5C,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAErF,MAAM,cAAc,GAAG,kBAAkB,CAAC,4BAA4B,EAAE,kBAAkB,CAAC,CAAC;IAE5F,qEAAqE;IACrE,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAElD,4CAA4C;IAC5C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,oBAAoB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;YACpE,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC,KAAK,CAAC,mBAAmB,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzF,iCAAiC;IACjC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC;gBACZ,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,kBAAkB;gBAChD,aAAa,EAAE,YAAY,CAAC,KAAK,CAAC,mBAAmB;gBACrD,WAAW,EAAE,WAAW,CAAC,KAAK;gBAC9B,YAAY;gBACZ,kBAAkB,EAAE,SAAS,CAAC,kBAAkB;gBAChD,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,YAAY;gBAC7C,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK;gBAC/B,QAAQ,EAAE,SAAS,CAAC,QAAQ;aAC7B,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE;QACD,YAAY,CAAC,KAAK;QAClB,WAAW,CAAC,KAAK;QACjB,YAAY;QACZ,SAAS,CAAC,kBAAkB;QAC5B,SAAS,CAAC,QAAQ;QAClB,aAAa;KACd,CAAC,CAAC;IAEH,2EAA2E;IAC3E,MAAM,gBAAgB,GAAG,WAAW,CAClC,KAAK,EAAE,YAAgD,EAAiC,EAAE;QACxF,0CAA0C;QAC1C,IAAI,qBAAqB,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACzE,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kDAAkD;QAClD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CACtD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAC/C,CAAC;QACF,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAEzD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,YAAY,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;YAEnD,8DAA8D;YAC9D,MAAM,cAAc,GAAG,MAAM,mCAAmC,CAAC,MAAM,EAAE,YAAY,EAAE;gBACrF,mBAAmB,EAAE,IAAI;gBACzB,kBAAkB,EAAE,KAAK,EAAE,iDAAiD;gBAC5E,gBAAgB,EAAE,WAAW,CAAC,KAAK,CAAC,gBAAgB;aACrD,CAAC,CAAC;YAEH,IAAI,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAkB;oBAC5B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,qBAAqB,cAAc,CAAC,OAAO,EAAE;oBACpD,iBAAiB,EAAE,EAAE;oBACrB,QAAQ,EAAE,EAAE;iBACb,CAAC;gBACF,eAAe,CAAC,MAAM,CAAC,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/D,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,kDAAkD;YAClD,MAAM,iBAAiB,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,wBAAwB,CACvC,iBAAiB,EACjB,cAAc,CAAC,KAAK,EACpB,YAAY,CAAC,KAAK,CAAC,kBAAkB,CACtC,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACjC,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,sBAAsB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,MAAM;gBACzD,aAAa,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;gBACvC,qBAAqB,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB;aACrD,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,+BAA+B,EAC/B,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,kBAAkB,EAAE,CAAC,CAAC,sBAAsB;gBAC5C,kBAAkB,EAAE,CAAC,CAAC,sBAAsB;gBAC5C,SAAS,EAAE,CAAC,CAAC,sBAAsB,GAAG,CAAC,CAAC,sBAAsB;gBAC9D,UAAU,EAAE,CAAC,CAAC,UAAU;aACzB,CAAC,CAAC,CACJ,CAAC;YAEF,MAAM,MAAM,GAAkB;gBAC5B,OAAO,EAAE,IAAI;gBACb,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;gBAC/C,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;gBAC7C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;YACjD,eAAe,CAAC,MAAM,CAAC,CAAC;YAExB,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,QAAQ,CAAC,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;YACpF,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,QAAQ,CAAC,iBAAiB,CAAC,MAAM,YAAY,CAAC,CAAC;YAC3F,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,MAAM,GAAkB;gBAC5B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY;gBACnB,iBAAiB,EAAE,EAAE;gBACrB,QAAQ,EAAE,EAAE;aACb,CAAC;YACF,eAAe,CAAC,MAAM,CAAC,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAC;YACpD,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,4HAA4H;YAC5H,qBAAqB,CAAC,OAAO,GAAG,KAAK,CAAC;QACxC,CAAC;IACH,CAAC,EACD,CAAC,YAAY,CAAC,KAAK,CAAC,kBAAkB,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CACtE,CAAC;IAEF,oDAAoD;IACpD,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAmC,EAAE;QACxE,kDAAkD;QAClD,MAAM,aAAa,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAEtD,iEAAiE;QACjE,WAAW,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAExC,kDAAkD;QAClD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAErD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5C,sBAAsB;IACtB,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,WAAW,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAErC,iBAAiB;IACjB,MAAM,KAAK,GAAuB,OAAO,CACvC,GAAG,EAAE,CAAC,CAAC;QACL,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,kBAAkB;QAChD,aAAa,EAAE,YAAY,CAAC,KAAK,CAAC,mBAAmB;QACrD,WAAW,EAAE,WAAW,CAAC,KAAK;QAC9B,YAAY;QACZ,eAAe,EAAE,cAAc,CAAC,KAAK;QACrC,kBAAkB,EAAE,SAAS,CAAC,kBAAkB;QAChD,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,YAAY;QAC7C,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK;QAC/B,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,qBAAqB;KACtB,CAAC,EACF;QACE,YAAY,CAAC,KAAK;QAClB,WAAW,CAAC,KAAK;QACjB,YAAY;QACZ,cAAc,CAAC,KAAK;QACpB,SAAS,CAAC,kBAAkB;QAC5B,SAAS,CAAC,QAAQ;QAClB,qBAAqB;KACtB,CACF,CAAC;IAEF,mBAAmB;IACnB,MAAM,OAAO,GAAyB,OAAO,CAC3C,GAAG,EAAE,CAAC,CAAC;QACL,sBAAsB;QACtB,cAAc,EAAE,KAAK,EAAE,QAA2B,EAAE,EAAE;YACpD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACpE,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,wBAAwB,EAAE,KAAK,EAC7B,QAA2B,EAC3B,MAAyC,EACzC,EAAE;YACF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAC3D,MAAM,YAAY,CAAC,OAAO,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACvE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,YAAY,EAAE,KAAK,EAAE,MAAsB,EAAE,EAAE;YAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACtC,MAAM,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,cAAc,EAAE,GAAG,EAAE;YACnB,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACtC,CAAC;QAED,2BAA2B;QAC3B,mBAAmB,EAAE,CAAC,MAAyC,EAAE,EAAE;YACjE,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC1C,CAAC;QACD,kBAAkB,EAAE,CAAC,MAAyC,EAAE,EAAE;YAChE,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAC7C,CAAC;QAED,oBAAoB;QACpB,iBAAiB,EAAE,CAAC,OAA8B,EAAE,EAAE;YACpD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAClC,WAAW,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACjC,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBAC3C,WAAW,CAAC,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,WAAW;QACX,WAAW;QAEX,wBAAwB;QACxB,uBAAuB,EAAE,cAAc,CAAC,OAAO,CAAC,kBAAkB;QAClE,sBAAsB,EAAE,cAAc,CAAC,OAAO,CAAC,YAAY;QAC3D,2BAA2B,EAAE,cAAc,CAAC,OAAO,CAAC,cAAc;QAClE,qBAAqB,EAAE,cAAc,CAAC,OAAO,CAAC,WAAW;QACzD,oBAAoB,EAAE,cAAc,CAAC,OAAO,CAAC,UAAU;QAEvD,6BAA6B;QAC7B,gBAAgB,EAAE,cAAc,CAAC,OAAO,CAAC,QAAQ;QACjD,cAAc,EAAE,cAAc,CAAC,OAAO,CAAC,cAAc;QACrD,eAAe,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO;QAC/C,kBAAkB,EAAE,cAAc,CAAC,OAAO,CAAC,UAAU;QACrD,sDAAsD;QACtD,oBAAoB,EAAE,cAAc,CAAC,OAAO,CAAC,YAAY;QAEzD,uDAAuD;QACvD,qBAAqB,EAAE,cAAc,CAAC,OAAO,CAAC,qBAAqB;QACnE,gBAAgB,EAAE,cAAc,CAAC,OAAO,CAAC,gBAAgB;QACzD,mBAAmB,EAAE,cAAc,CAAC,OAAO,CAAC,mBAAmB;QAC/D,kBAAkB,EAAE,cAAc,CAAC,OAAO,CAAC,kBAAkB;QAC7D,qBAAqB,EAAE,cAAc,CAAC,OAAO,CAAC,qBAAqB;QACnE,wBAAwB,EAAE,cAAc,CAAC,OAAO,CAAC,wBAAwB;QACzE,iBAAiB,EAAE,cAAc,CAAC,OAAO,CAAC,iBAAiB;QAC3D,qBAAqB,EAAE,cAAc,CAAC,OAAO,CAAC,qBAAqB;QACnE,uBAAuB,EAAE,cAAc,CAAC,OAAO,CAAC,uBAAuB;QACvE,qBAAqB,EAAE,cAAc,CAAC,OAAO,CAAC,qBAAqB;QACnE,uBAAuB,EAAE,cAAc,CAAC,OAAO,CAAC,uBAAuB;QAEvE,8EAA8E;QAE9E,uBAAuB;QACvB,YAAY,EAAE,GAAG,EAAE;YACjB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC;YACxD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;gBACxF,OAAO;YACT,CAAC;YAED,+CAA+C;YAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC;iBAC5E,SAAS,CAAC,CAAC,YAAY,EAAE,EAAE,CAC1B,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,CAC5E;iBACA,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;YAExF,wCAAwC;YACxC,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,YAAY,EAAE,GAAG,EAAE;YACjB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC;YACxD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;YAED,+CAA+C;YAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,uBAAuB,CAAC,SAAS,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;YAEzF,kCAAkC;YAClC,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,cAAc,EAAE,GAAG,EAAE;YACnB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAAC;YACxD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;gBAChD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;gBAC3E,OAAO;YACT,CAAC;YAED,+CAA+C;YAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,yBAAyB,CACpD,SAAS,CAAC,kBAAkB,EAC5B,SAAS,CAAC,aAAa,CACxB,CAAC;YAEF,kCAAkC;YAClC,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,2BAA2B,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,cAAc,EAAE,SAAS,CAAC,cAAc;QACxC,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,aAAa,EAAE,SAAS,CAAC,aAAa;QAEtC,wBAAwB;QACxB,IAAI;QAEJ,sBAAsB;QACtB,eAAe,EAAE,YAAY,CAAC,OAAO,CAAC,eAAe;KACtD,CAAC,EACF;QACE,YAAY,CAAC,OAAO;QACpB,WAAW,CAAC,OAAO;QACnB,cAAc,CAAC,OAAO;QACtB,SAAS;QACT,WAAW;QACX,WAAW;QACX,IAAI;KACL,CACF,CAAC;IAEF,OAAO,0CAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAI,CAAC;AAC7C,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAyC,CAAC,EACzE,oBAAoB,EACpB,GAAG,KAAK,EACT,EAAE,EAAE;IACH,iFAAiF;IACjF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,wEAAwE;IACxE,uFAAuF;IACvF,MAAM,6BAA6B,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACvD,IAAI,oBAAoB,EAAE,CAAC;YACzB,OAAO,oBAAoB,CAAC;QAC9B,CAAC;QACD,OAAO,kBAAkB,CAAC,mCAAmC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACtF,CAAC,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjD,OAAO,CACL,oBAAC,qBAAqB,IAAC,oBAAoB,EAAE,6BAA6B;QACxE,oBAAC,4BAA4B,OAAK,KAAK,EAAE,SAAS,EAAE,SAAS,GAAI,CAC3C,CACzB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,oBAAoB,CAAC","sourcesContent":["import React, { ReactNode, useCallback, useMemo, useState } from 'react';\nimport { ObservabilityProvider, useObservability } from '../../contexts';\nimport { Config, Bundle, QualifierTypes, ResourceTypes } from '@fgv/ts-res';\nimport { FileTree } from '@fgv/ts-json-base';\nimport {\n IOrchestratorState,\n IOrchestratorActions,\n IProcessedResources,\n IFilterState,\n IFilterResult,\n IResourceEditorFactory\n} from '../../types';\nimport * as ObservabilityTools from '../../utils/observability';\nimport { useResourceData } from '../../hooks/useResourceData';\nimport { useFilterState } from '../../hooks/useFilterState';\nimport { useViewState } from '../../hooks/useViewState';\nimport { useResolutionState } from '../../hooks/useResolutionState';\nimport { createFilteredResourceManagerSimple, analyzeFilteredResources } from '../../utils/filterResources';\nimport * as DownloadUtils from '../../utils/downloadHelper';\n\n/**\n * Props for the ResourceOrchestrator component.\n * Provides render props pattern for resource management UI.\n *\n * @public\n */\nexport interface IResourceOrchestratorProps {\n /** Render function that receives orchestrator state and actions */\n children: (orchestrator: { state: IOrchestratorState; actions: IOrchestratorActions }) => ReactNode;\n /** Optional initial configuration to apply on mount */\n initialConfiguration?: Config.Model.ISystemConfiguration;\n /** Optional qualifier type factory for creating custom qualifier types */\n qualifierTypeFactory?: Config.IConfigInitFactory<\n QualifierTypes.Config.IAnyQualifierTypeConfig,\n QualifierTypes.QualifierType\n >;\n /** Optional resource type factory for creating custom resource types */\n resourceTypeFactory?: Config.IConfigInitFactory<\n ResourceTypes.Config.IResourceTypeConfig,\n ResourceTypes.ResourceType\n >;\n /**\n * Optional factory for creating type-specific resource editors.\n * When provided, ResolutionView will use custom editors for supported resource types\n * instead of the default JSON editor.\n */\n resourceEditorFactory?: IResourceEditorFactory;\n /** Callback fired when orchestrator state changes */\n onStateChange?: (state: Partial<IOrchestratorState>) => void;\n /** Optional observability context for logging and user feedback */\n observabilityContext?: ObservabilityTools.IObservabilityContext;\n}\n\n/**\n * Internal orchestrator component that has access to observability context via hook.\n */\nconst ResourceOrchestratorInternal: React.FC<\n Omit<IResourceOrchestratorProps, 'observabilityContext'> & {\n viewState: ReturnType<typeof useViewState>;\n }\n> = ({\n children,\n initialConfiguration,\n qualifierTypeFactory,\n resourceTypeFactory,\n resourceEditorFactory,\n onStateChange,\n viewState\n}) => {\n // Get observability context from provider\n const o11y = useObservability();\n\n // Core hooks\n const resourceData = useResourceData({\n qualifierTypeFactory,\n resourceTypeFactory,\n o11y\n });\n const filterState = useFilterState();\n // Use the ViewState passed down from ResourceOrchestrator instead of creating a new one\n // System update handler for resolution editing\n const handleSystemUpdate = useCallback(\n (updatedResources: IProcessedResources) => {\n resourceData.actions.updateProcessedResources(updatedResources);\n o11y.user.success('Resource system updated with edits');\n },\n [resourceData.actions, o11y.user]\n );\n\n // Local state for filter results\n const [filterResult, setFilterResult] = useState<IFilterResult | null>(null);\n\n // Use filtered resources for resolution when filtering is active and successful\n const resolutionProcessedResources = useMemo(() => {\n const isFilteringActive = filterState.state.enabled && filterResult?.success === true;\n return isFilteringActive\n ? filterResult?.processedResources ?? null\n : resourceData.state.processedResources;\n }, [filterState.state.enabled, filterResult, resourceData.state.processedResources]);\n\n const resolutionData = useResolutionState(resolutionProcessedResources, handleSystemUpdate);\n\n // Track if filtering is in progress to prevent concurrent operations\n const isFilteringInProgress = React.useRef(false);\n\n // Initialize with configuration if provided\n React.useEffect(() => {\n if (initialConfiguration && !resourceData.state.activeConfiguration) {\n resourceData.actions.applyConfiguration(initialConfiguration);\n }\n }, [initialConfiguration, resourceData.state.activeConfiguration, resourceData.actions]);\n\n // Notify parent of state changes\n React.useEffect(() => {\n if (onStateChange) {\n onStateChange({\n resources: resourceData.state.processedResources,\n configuration: resourceData.state.activeConfiguration,\n filterState: filterState.state,\n filterResult,\n selectedResourceId: viewState.selectedResourceId,\n isProcessing: resourceData.state.isProcessing,\n error: resourceData.state.error,\n messages: viewState.messages\n });\n }\n }, [\n resourceData.state,\n filterState.state,\n filterResult,\n viewState.selectedResourceId,\n viewState.messages,\n onStateChange\n ]);\n\n // Internal filtering logic (used by both manual and automatic application)\n const performFiltering = useCallback(\n async (filterValues: Record<string, string | undefined>): Promise<IFilterResult | null> => {\n // Prevent concurrent filtering operations\n if (isFilteringInProgress.current) {\n o11y.diag.info('Filtering already in progress, skipping...');\n return null;\n }\n\n if (!resourceData.state.processedResources || !filterState.state.enabled) {\n setFilterResult(null);\n return null;\n }\n\n // Check if we have any filter values to work with\n const hasFilterValues = Object.values(filterValues).some(\n (value) => value !== undefined && value !== ''\n );\n if (!hasFilterValues) {\n setFilterResult(null);\n return null;\n }\n\n isFilteringInProgress.current = true;\n\n try {\n const { system } = resourceData.state.processedResources;\n\n o11y.user.info('Starting filtering process...');\n o11y.diag.info('Filtering with values:', filterValues);\n o11y.diag.info('Filter state:', filterState.state);\n\n // Try the simplified filtering approach using provided values\n const filteredResult = await createFilteredResourceManagerSimple(system, filterValues, {\n partialContextMatch: true,\n enableDebugLogging: false, // Disable debug logging to reduce console output\n reduceQualifiers: filterState.state.reduceQualifiers\n });\n\n if (filteredResult.isFailure()) {\n const result: IFilterResult = {\n success: false,\n error: `Filtering failed: ${filteredResult.message}`,\n filteredResources: [],\n warnings: []\n };\n setFilterResult(result);\n o11y.user.error(`Filtering failed: ${filteredResult.message}`);\n return result;\n }\n\n // Analyze filtered resources compared to original\n const originalResources = resourceData.state.processedResources.summary.resourceIds || [];\n o11y.diag.info('Original resources count:', originalResources.length);\n\n const analysis = analyzeFilteredResources(\n originalResources,\n filteredResult.value,\n resourceData.state.processedResources\n );\n\n o11y.diag.info('Analysis result:', {\n success: analysis.success,\n filteredResourcesCount: analysis.filteredResources.length,\n warningsCount: analysis.warnings.length,\n hasProcessedResources: !!analysis.processedResources\n });\n\n o11y.diag.info(\n 'Filtered resources breakdown:',\n analysis.filteredResources.map((r) => ({\n id: r.id,\n originalCandidates: r.originalCandidateCount,\n filteredCandidates: r.filteredCandidateCount,\n reduction: r.originalCandidateCount - r.filteredCandidateCount,\n hasWarning: r.hasWarning\n }))\n );\n\n const result: IFilterResult = {\n success: true,\n processedResources: analysis.processedResources,\n filteredResources: analysis.filteredResources,\n warnings: analysis.warnings\n };\n\n o11y.diag.info('Setting filter result:', result);\n setFilterResult(result);\n\n if (analysis.warnings.length > 0) {\n o11y.user.warn(`Filtering completed with ${analysis.warnings.length} warning(s)`);\n } else {\n o11y.user.success(`Filtering completed: ${analysis.filteredResources.length} resources`);\n }\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const result: IFilterResult = {\n success: false,\n error: errorMessage,\n filteredResources: [],\n warnings: []\n };\n setFilterResult(result);\n o11y.user.error(`Filtering error: ${errorMessage}`);\n return result;\n } finally {\n // eslint-disable-next-line require-atomic-updates -- intentionally reset filtering flag regardless of concurrent operations\n isFilteringInProgress.current = false;\n }\n },\n [resourceData.state.processedResources, filterState.state, o11y.user]\n );\n\n // Manual apply filter action (for the Apply button)\n const applyFilter = useCallback(async (): Promise<IFilterResult | null> => {\n // Capture the current values before applying them\n const currentValues = { ...filterState.state.values };\n\n // First apply the pending values to make them the applied values\n filterState.actions.applyFilterValues();\n\n // Then perform filtering with the captured values\n const result = await performFiltering(currentValues);\n\n return result;\n }, [performFiltering, filterState.actions]);\n\n // Reset filter action\n const resetFilter = useCallback(() => {\n setFilterResult(null);\n filterState.actions.resetFilterValues();\n o11y.user.info('Filter reset');\n }, [filterState.actions, o11y.user]);\n\n // Combined state\n const state: IOrchestratorState = useMemo(\n () => ({\n resources: resourceData.state.processedResources,\n configuration: resourceData.state.activeConfiguration,\n filterState: filterState.state,\n filterResult,\n resolutionState: resolutionData.state,\n selectedResourceId: viewState.selectedResourceId,\n isProcessing: resourceData.state.isProcessing,\n error: resourceData.state.error,\n messages: viewState.messages,\n resourceEditorFactory\n }),\n [\n resourceData.state,\n filterState.state,\n filterResult,\n resolutionData.state,\n viewState.selectedResourceId,\n viewState.messages,\n resourceEditorFactory\n ]\n );\n\n // Combined actions\n const actions: IOrchestratorActions = useMemo(\n () => ({\n // Resource management\n importFileTree: async (fileTree: FileTree.FileTree) => {\n o11y.user.info('Importing FileTree...');\n const result = await resourceData.actions.processFileTree(fileTree);\n if (result.isSuccess()) {\n o11y.user.success('FileTree imported successfully');\n } else {\n o11y.user.error(result.message);\n }\n },\n importFileTreeWithConfig: async (\n fileTree: FileTree.FileTree,\n config: Config.Model.ISystemConfiguration\n ) => {\n o11y.user.info('Importing FileTree with configuration...');\n await resourceData.actions.processFileTreeWithConfig(fileTree, config);\n if (!resourceData.state.error) {\n o11y.user.success('FileTree imported successfully');\n } else {\n o11y.user.error(resourceData.state.error);\n }\n },\n importBundle: async (bundle: Bundle.IBundle) => {\n o11y.user.info('Importing bundle...');\n await resourceData.actions.processBundleFile(bundle);\n if (!resourceData.state.error) {\n o11y.user.success('Bundle imported successfully');\n }\n },\n clearResources: () => {\n resourceData.actions.reset();\n setFilterResult(null);\n o11y.user.info('Resources cleared');\n },\n\n // Configuration management\n updateConfiguration: (config: Config.Model.ISystemConfiguration) => {\n resourceData.actions.applyConfiguration(config);\n o11y.user.info('Configuration updated');\n },\n applyConfiguration: (config: Config.Model.ISystemConfiguration) => {\n resourceData.actions.applyConfiguration(config);\n o11y.user.success('Configuration applied');\n },\n\n // Filter management\n updateFilterState: (updates: Partial<IFilterState>) => {\n if (updates.enabled !== undefined) {\n filterState.actions.updateFilterEnabled(updates.enabled);\n }\n if (updates.values !== undefined) {\n filterState.actions.updateFilterValues(updates.values);\n }\n if (updates.reduceQualifiers !== undefined) {\n filterState.actions.updateReduceQualifiers(updates.reduceQualifiers);\n }\n },\n applyFilter,\n resetFilter,\n\n // Resolution management\n updateResolutionContext: resolutionData.actions.updateContextValue,\n applyResolutionContext: resolutionData.actions.applyContext,\n selectResourceForResolution: resolutionData.actions.selectResource,\n setResolutionViewMode: resolutionData.actions.setViewMode,\n resetResolutionCache: resolutionData.actions.resetCache,\n\n // Resolution editing actions\n saveResourceEdit: resolutionData.actions.saveEdit,\n getEditedValue: resolutionData.actions.getEditedValue,\n hasResourceEdit: resolutionData.actions.hasEdit,\n clearResourceEdits: resolutionData.actions.clearEdits,\n // Edits applied through unified applyPendingResources\n discardResourceEdits: resolutionData.actions.discardEdits,\n\n // Resource creation actions (enhanced with atomic API)\n createPendingResource: resolutionData.actions.createPendingResource,\n startNewResource: resolutionData.actions.startNewResource,\n updateNewResourceId: resolutionData.actions.updateNewResourceId,\n selectResourceType: resolutionData.actions.selectResourceType,\n updateNewResourceJson: resolutionData.actions.updateNewResourceJson,\n saveNewResourceAsPending: resolutionData.actions.saveNewResourceAsPending,\n cancelNewResource: resolutionData.actions.cancelNewResource,\n removePendingResource: resolutionData.actions.removePendingResource,\n markResourceForDeletion: resolutionData.actions.markResourceForDeletion,\n applyPendingResources: resolutionData.actions.applyPendingResources,\n discardPendingResources: resolutionData.actions.discardPendingResources,\n\n // Combined apply/discard removed; use applyPendingResources/discard* directly\n\n // Export functionality\n exportBundle: () => {\n const resources = resourceData.state.processedResources;\n if (!resources || !resources.activeConfiguration) {\n o11y.user.error('Export bundle failed: No resource manager or configuration available');\n return;\n }\n\n // Use proper Result chaining with side effects\n const result = Config.SystemConfiguration.create(resources.activeConfiguration)\n .onSuccess((systemConfig) =>\n Bundle.BundleBuilder.create(resources.system.resourceManager, systemConfig)\n )\n .onSuccess((bundle) => DownloadUtils.downloadBundle(bundle, resources.resourceCount));\n\n // Handle final result with side effects\n if (result.isSuccess()) {\n o11y.user.success('Bundle exported successfully');\n } else {\n o11y.user.error(`Export bundle failed: ${result.message}`);\n }\n },\n\n exportSource: () => {\n const resources = resourceData.state.processedResources;\n if (!resources) {\n o11y.user.error('Export source failed: No processed resources available');\n return;\n }\n\n // Use proper Result chaining with side effects\n const result = DownloadUtils.downloadSourceResources(resources, resources.resourceCount);\n\n // Handle result with side effects\n if (result.isSuccess()) {\n o11y.user.success('Source resources exported successfully');\n } else {\n o11y.user.error(`Export source failed: ${result.message}`);\n }\n },\n\n exportCompiled: () => {\n const resources = resourceData.state.processedResources;\n if (!resources || !resources.compiledCollection) {\n o11y.user.error('Export compiled failed: No compiled resources available');\n return;\n }\n\n // Use proper Result chaining with side effects\n const result = DownloadUtils.downloadCompiledResources(\n resources.compiledCollection,\n resources.resourceCount\n );\n\n // Handle result with side effects\n if (result.isSuccess()) {\n o11y.user.success('Compiled resources exported successfully');\n } else {\n o11y.user.error(`Export compiled failed: ${result.message}`);\n }\n },\n\n // UI state management\n selectResource: viewState.selectResource,\n addMessage: viewState.addMessage,\n clearMessages: viewState.clearMessages,\n\n // Observability context\n o11y,\n\n // Resource resolution\n resolveResource: resourceData.actions.resolveResource\n }),\n [\n resourceData.actions,\n filterState.actions,\n resolutionData.actions,\n viewState,\n applyFilter,\n resetFilter,\n o11y\n ]\n );\n\n return <>{children({ state, actions })}</>;\n};\n\n/**\n * Main orchestrator component for ts-res resource management UI.\n *\n * This component provides a centralized state management and action coordination\n * for all ts-res UI functionality. It uses the render props pattern to provide\n * state and actions to child components.\n *\n * Features:\n * - Resource processing (files, directories, bundles)\n * - Filtering and context management\n * - Resource resolution testing\n * - Configuration management\n * - View state coordination\n *\n * @param props - ResourceOrchestrator configuration\n * @returns JSX element using render props pattern\n *\n * @example\n * ```typescript\n * <ResourceOrchestrator>\n * {({ state, actions }) => (\n * <div>\n * <ImportView\n * onImport={actions.importDirectory}\n * onBundleImport={actions.importBundle}\n * />\n * {state.processedResources && (\n * <SourceView\n * resources={state.processedResources}\n * onExport={actions.exportData}\n * />\n * )}\n * </div>\n * )}\n * </ResourceOrchestrator>\n * ```\n *\n * @public\n */\nexport const ResourceOrchestrator: React.FC<IResourceOrchestratorProps> = ({\n observabilityContext,\n ...props\n}) => {\n // Create viewState hook to get addMessage function for observability integration\n const viewState = useViewState();\n\n // Create observability context that connects user messages to viewState\n // If a custom context is provided, use it; otherwise create one connected to viewState\n const effectiveObservabilityContext = React.useMemo(() => {\n if (observabilityContext) {\n return observabilityContext;\n }\n return ObservabilityTools.createViewStateObservabilityContext(viewState.addMessage);\n }, [observabilityContext, viewState.addMessage]);\n\n return (\n <ObservabilityProvider observabilityContext={effectiveObservabilityContext}>\n <ResourceOrchestratorInternal {...props} viewState={viewState} />\n </ObservabilityProvider>\n );\n};\n\nexport default ResourceOrchestrator;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceItem.d.ts","sourceRoot":"","sources":["../../../../src/components/pickers/ResourcePicker/ResourceItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,GAAG,OAAO,EAAG,2HAWxC,kBAAkB,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,YA2GhC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceItem.js","sourceRoot":"","sources":["../../../../src/components/pickers/ResourcePicker/ResourceItem.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { DocumentTextIcon, PlusCircleIcon } from '@heroicons/react/24/outline';\nimport { IResourceItemProps } from './types';\n\n/**\n * Individual resource item with annotation support\n */\nexport const ResourceItem = <T = unknown,>({\n resourceId,\n displayName,\n isSelected,\n isPending = false,\n annotation,\n onClick,\n searchTerm = '',\n className = '',\n resourceData,\n pendingType\n}: IResourceItemProps<T>): React.ReactElement => {\n const name = displayName || resourceId;\n\n // Highlight search term in the name\n const highlightedName = React.useMemo(() => {\n if (!searchTerm) {\n return <span>{name}</span>;\n }\n\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n const regex = new RegExp(`(${searchTerm})`, 'gi');\n const parts = name.split(regex);\n\n return (\n <span>\n {parts.map((part, index) =>\n regex.test(part) ? (\n <mark key={index} className=\"bg-yellow-200\">\n {part}\n </mark>\n ) : (\n <span key={index}>{part}</span>\n )\n )}\n </span>\n );\n }, [name, searchTerm]);\n\n // Get badge styling based on variant\n const getBadgeClasses = (variant: string): string => {\n const baseClasses = 'px-1.5 py-0.5 text-xs font-medium rounded';\n const variantClasses = {\n info: 'bg-blue-100 text-blue-800',\n warning: 'bg-yellow-100 text-yellow-800',\n success: 'bg-green-100 text-green-800',\n error: 'bg-red-100 text-red-800',\n edited: 'bg-purple-100 text-purple-800',\n new: 'bg-emerald-100 text-emerald-800'\n };\n return `${baseClasses} ${variantClasses[variant as keyof typeof variantClasses] || variantClasses.info}`;\n };\n\n return (\n <div\n className={`\n flex items-center px-3 py-2 cursor-pointer hover:bg-gray-100 \n border-b border-gray-100 last:border-b-0\n ${isSelected ? 'bg-purple-50 border-l-2 border-purple-500' : ''}\n ${isPending ? 'opacity-70 italic' : ''}\n ${searchTerm && name.toLowerCase().includes(searchTerm.toLowerCase()) ? 'bg-yellow-50' : ''}\n ${annotation?.className || ''}\n ${className}\n `}\n onClick={() =>\n onClick({\n resourceId,\n resourceData,\n isPending,\n pendingType\n })\n }\n title={resourceId}\n >\n {/* Icon */}\n <div className=\"flex-shrink-0 mr-2\">\n {isPending ? (\n <PlusCircleIcon className=\"w-4 h-4 text-emerald-500\" />\n ) : (\n <DocumentTextIcon className=\"w-4 h-4 text-green-500\" />\n )}\n </div>\n\n {/* Resource name */}\n <span\n className={`\n text-sm truncate flex-1\n ${isSelected ? 'font-medium text-purple-900' : 'text-gray-700'}\n `}\n >\n {highlightedName}\n </span>\n\n {/* Annotations */}\n {annotation && (\n <div className=\"flex items-center gap-2 ml-2\">\n {/* Indicator */}\n {annotation.indicator && (\n <span className=\"text-xs\" title={annotation.indicator.tooltip}>\n {annotation.indicator.type === 'dot' ? (\n <span className=\"text-orange-500\">●</span>\n ) : (\n annotation.indicator.value\n )}\n </span>\n )}\n\n {/* Badge */}\n {annotation.badge && (\n <span className={getBadgeClasses(annotation.badge.variant)}>{annotation.badge.text}</span>\n )}\n\n {/* Suffix */}\n {annotation.suffix && <span className=\"text-xs text-gray-500\">{annotation.suffix}</span>}\n </div>\n )}\n </div>\n );\n};\n\nexport default ResourceItem;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourcePickerList.d.ts","sourceRoot":"","sources":["../../../../src/components/pickers/ResourcePicker/ResourcePickerList.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAW,YAAY,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAInD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,GAAG,OAAO,EAAG,2JAW9C,wBAAwB,CAAC,CAAC,CAAC,KAAG,YA2FhC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourcePickerList.js","sourceRoot":"","sources":["../../../../src/components/pickers/ResourcePicker/ResourcePickerList.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useMemo, ReactElement } from 'react';\nimport { IResourcePickerListProps } from './types';\nimport { ResourceItem } from './ResourceItem';\nimport { mergeWithPendingResources, filterTreeBranch } from './utils/treeNavigation';\n\n/**\n * List view for the ResourcePicker component\n * Enhanced version of ResourceListView with annotation and pending resource support\n */\nexport const ResourcePickerList = <T = unknown,>({\n resourceIds,\n pendingResources,\n selectedResourceId,\n onResourceSelect,\n resourceAnnotations,\n searchTerm = '',\n rootPath,\n hideRootNode,\n className = '',\n emptyMessage = 'No resources available'\n}: IResourcePickerListProps<T>): ReactElement => {\n // Merge existing and pending resources\n const allResourceIds = useMemo(() => {\n return mergeWithPendingResources(resourceIds, pendingResources);\n }, [resourceIds, pendingResources]);\n\n // Apply branch isolation filtering\n const branchFilteredIds = useMemo(() => {\n return filterTreeBranch(allResourceIds, rootPath, hideRootNode);\n }, [allResourceIds, rootPath, hideRootNode]);\n\n // Filter by search term and sort\n const filteredResourceIds = useMemo(() => {\n const filtered = searchTerm\n ? branchFilteredIds.filter((id) => id.toLowerCase().includes(searchTerm.toLowerCase()))\n : branchFilteredIds;\n\n return filtered.sort();\n }, [branchFilteredIds, searchTerm]);\n\n // Helper function to get display name with prefix truncation\n const getDisplayName = useMemo(() => {\n return (resourceId: string, pendingDisplayName?: string): string => {\n // For all resources (existing and pending), apply prefix truncation to show full relative ID\n if (rootPath) {\n if (hideRootNode && resourceId.startsWith(rootPath + '.')) {\n // Remove the root path prefix completely - show the full relative path\n return resourceId.substring(rootPath.length + 1);\n } else if (resourceId === rootPath) {\n // For the root node itself, show the full path\n return rootPath;\n } else if (resourceId.startsWith(rootPath + '.')) {\n // Show relative to root path - the full relative path\n return resourceId.substring(rootPath.length + 1);\n }\n }\n\n // Default: show the full resource ID\n return resourceId;\n };\n }, [rootPath, hideRootNode]);\n\n // Create a map of pending resources for quick lookup\n const pendingResourceMap = useMemo(() => {\n const map = new Map<\n string,\n { isPending: boolean; type?: 'new' | 'modified' | 'deleted'; resourceData?: T }\n >();\n pendingResources?.forEach((pr) => {\n map.set(pr.id, {\n isPending: true,\n type: pr.type,\n resourceData: pr.resourceData\n });\n });\n return map;\n }, [pendingResources]);\n\n if (filteredResourceIds.length === 0) {\n return (\n <div className={`${className} p-4 text-center text-gray-500`}>\n <p>{searchTerm ? 'No resources match your search' : emptyMessage}</p>\n </div>\n );\n }\n\n return (\n <div className={`${className} overflow-y-auto`}>\n {filteredResourceIds.map((resourceId) => {\n const pendingInfo = pendingResourceMap.get(resourceId);\n const isPending = Boolean(pendingInfo?.isPending);\n const pendingResource = pendingResources?.find((pr) => pr.id === resourceId);\n const truncatedDisplayName = getDisplayName(resourceId, pendingResource?.displayName);\n\n return (\n <ResourceItem<T>\n key={resourceId}\n resourceId={resourceId}\n displayName={truncatedDisplayName}\n isSelected={selectedResourceId === resourceId}\n isPending={isPending}\n annotation={resourceAnnotations?.[resourceId]}\n onClick={onResourceSelect}\n searchTerm={searchTerm}\n resourceData={pendingInfo?.resourceData}\n pendingType={pendingInfo?.type}\n />\n );\n })}\n </div>\n );\n};\n\nexport default ResourcePickerList;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourcePickerTree.d.ts","sourceRoot":"","sources":["../../../../src/components/pickers/ResourcePicker/ResourcePickerTree.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAkC,YAAY,EAAE,MAAM,OAAO,CAAC;AAQ5E,OAAO,EAAE,wBAAwB,EAAyC,MAAM,SAAS,CAAC;AA+G1F;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,GAAG,OAAO,EAAG,yJAW9C,wBAAwB,CAAC,CAAC,CAAC,KAAG,YAkVhC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourcePickerTree.js","sourceRoot":"","sources":["../../../../src/components/pickers/ResourcePicker/ResourcePickerTree.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useMemo, useCallback, ReactElement } from 'react';\nimport {\n ChevronRightIcon,\n ChevronDownIcon,\n FolderIcon,\n FolderOpenIcon,\n DocumentTextIcon\n} from '@heroicons/react/24/outline';\nimport { IResourcePickerTreeProps, IPendingResource, IResourceAnnotation } from './types';\nimport { Runtime } from '@fgv/ts-res';\nimport { useObservability } from '../../../contexts';\n\n/**\n * Virtual tree node that can represent both real and pending resources\n */\ninterface IVirtualTreeNode<T = unknown> {\n id: string;\n name: string;\n isLeaf: boolean;\n isPending: boolean;\n pendingResource?: IPendingResource<T>;\n realNode?: Runtime.ResourceTree.IReadOnlyResourceTreeNode<Runtime.IResource>;\n children: Map<string, IVirtualTreeNode<T>>;\n}\n\n/**\n * Creates a virtual tree by merging real resource tree with pending resources\n */\nfunction createVirtualTree<T = unknown>(\n realTree: Runtime.ResourceTree.IReadOnlyResourceTreeRoot<Runtime.IResource> | null,\n pendingResources: IPendingResource<T>[] = []\n): IVirtualTreeNode<T> | null {\n if (!realTree) {\n return null;\n }\n\n // Helper to convert real node to virtual node\n const convertRealNode = (\n realNode: Runtime.ResourceTree.IReadOnlyResourceTreeNode<Runtime.IResource>\n ): IVirtualTreeNode<T> => {\n const virtualNode: IVirtualTreeNode<T> = {\n id: realNode.id,\n name: realNode.name,\n isLeaf: realNode.isLeaf,\n isPending: false,\n realNode,\n children: new Map()\n };\n\n // Convert children\n if (!realNode.isLeaf && realNode.children) {\n for (const child of realNode.children.values()) {\n const virtualChild = convertRealNode(child);\n virtualNode.children.set(child.id, virtualChild);\n }\n }\n\n return virtualNode;\n };\n\n // Start with the real tree structure\n const rootNode: IVirtualTreeNode<T> = {\n id: '',\n name: 'root',\n isLeaf: false,\n isPending: false,\n children: new Map()\n };\n\n // Convert all real children\n for (const realChild of realTree.children.values()) {\n const virtualChild = convertRealNode(realChild);\n rootNode.children.set(realChild.id, virtualChild);\n }\n\n // Add pending resources\n for (const pendingResource of pendingResources) {\n if (pendingResource.type === 'deleted') continue; // Skip deleted resources\n\n const pathParts = pendingResource.id.split('.');\n const displayName = pendingResource.displayName || pathParts[pathParts.length - 1];\n\n // Find or create parent nodes\n let currentNode = rootNode;\n for (let i = 0; i < pathParts.length - 1; i++) {\n const partialPath = pathParts.slice(0, i + 1).join('.');\n\n if (!currentNode.children.has(partialPath)) {\n // Create virtual parent node\n const parentNode: IVirtualTreeNode<T> = {\n id: partialPath,\n name: pathParts[i],\n isLeaf: false,\n isPending: false,\n children: new Map()\n };\n currentNode.children.set(partialPath, parentNode);\n }\n\n currentNode = currentNode.children.get(partialPath)!;\n currentNode.isLeaf = false; // Ensure parent is not a leaf\n }\n\n // Create the pending resource node\n const pendingNode: IVirtualTreeNode<T> = {\n id: pendingResource.id,\n name: displayName,\n isLeaf: true,\n isPending: true,\n pendingResource,\n children: new Map()\n };\n\n currentNode.children.set(pendingResource.id, pendingNode);\n }\n\n return rootNode;\n}\n\n/**\n * Tree view for the ResourcePicker component\n * Enhanced version of ResourceTreeView with branch isolation and annotation support\n */\nexport const ResourcePickerTree = <T = unknown,>({\n resources,\n pendingResources,\n selectedResourceId,\n onResourceSelect,\n resourceAnnotations,\n searchTerm = '',\n rootPath,\n hideRootNode,\n className = '',\n emptyMessage = 'No resources available'\n}: IResourcePickerTreeProps<T>): ReactElement => {\n // Get observability context\n const o11y = useObservability();\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set());\n\n // Build the virtual tree structure from resources and pending resources\n const virtualTree = useMemo(() => {\n if (!resources) {\n return null;\n }\n\n // Get the tree from the resource manager\n const resourceManager = resources.system.resourceManager;\n const treeResult = resourceManager.getBuiltResourceTree();\n if (treeResult.isFailure()) {\n o11y.diag.error('ResourcePickerTree: Failed to build resource tree:', treeResult.message);\n return null;\n }\n\n // Create virtual tree that includes pending resources\n try {\n const virtualTree = createVirtualTree(treeResult.value, pendingResources);\n return virtualTree;\n } catch (error) {\n o11y.diag.error('ResourcePickerTree: Error in createVirtualTree:', error);\n return null;\n }\n }, [resources, pendingResources]);\n\n // Find the effective root node(s) to display\n const effectiveRootNodes = useMemo(() => {\n try {\n if (!virtualTree) {\n return [];\n }\n\n // If no rootPath, show all top-level nodes\n if (!rootPath) {\n const nodes = Array.from(virtualTree.children.values());\n return nodes;\n }\n } catch (error) {\n o11y.diag.error('ResourcePickerTree: Error in effectiveRootNodes calculation:', error);\n return [];\n }\n\n // Find the target node in the virtual tree\n const findVirtualNodeById = (node: IVirtualTreeNode<T>, targetId: string): IVirtualTreeNode<T> | null => {\n if (node.id === targetId) {\n return node;\n }\n\n if (!node.isLeaf && node.children) {\n for (const child of node.children.values()) {\n const found = findVirtualNodeById(child, targetId);\n if (found) return found;\n }\n }\n\n return null;\n };\n\n // Search through all top-level children to find the target\n let targetNode: IVirtualTreeNode<T> | null = null;\n for (const child of virtualTree.children.values()) {\n targetNode = findVirtualNodeById(child, rootPath);\n if (targetNode) break;\n }\n\n if (!targetNode) {\n return []; // Target node not found\n }\n\n // If hideRootNode is true, show the target's children instead of the target itself\n if (hideRootNode && !targetNode.isLeaf && targetNode.children) {\n return Array.from(targetNode.children.values());\n } else {\n // Show the target node as the new root\n return [targetNode];\n }\n }, [virtualTree, rootPath, hideRootNode]);\n\n const toggleNode = useCallback((nodeId: string) => {\n setExpandedNodes((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(nodeId)) {\n newSet.delete(nodeId);\n } else {\n newSet.add(nodeId);\n }\n return newSet;\n });\n }, []);\n\n // Helper function to render annotations\n const renderAnnotation = (annotation: IResourceAnnotation): React.ReactNode => {\n const elements: React.ReactNode[] = [];\n\n if (annotation.indicator) {\n elements.push(\n <span key=\"indicator\" className=\"text-xs\" title={annotation.indicator.tooltip}>\n {annotation.indicator.type === 'dot' ? (\n <span className=\"text-orange-500\">●</span>\n ) : (\n annotation.indicator.value\n )}\n </span>\n );\n }\n\n if (annotation.badge) {\n const getBadgeClasses = (variant: string): string => {\n const baseClasses = 'px-1.5 py-0.5 text-xs font-medium rounded';\n const variantClasses: Record<string, string> = {\n info: 'bg-blue-100 text-blue-800',\n warning: 'bg-yellow-100 text-yellow-800',\n success: 'bg-green-100 text-green-800',\n error: 'bg-red-100 text-red-800',\n edited: 'bg-purple-100 text-purple-800',\n new: 'bg-emerald-100 text-emerald-800'\n };\n return `${baseClasses} ${variantClasses[variant] || variantClasses.info}`;\n };\n\n elements.push(\n <span key=\"badge\" className={getBadgeClasses(annotation.badge.variant)}>\n {annotation.badge.text}\n </span>\n );\n }\n\n if (annotation.suffix) {\n elements.push(\n <span key=\"suffix\" className=\"text-xs text-gray-500\">\n {annotation.suffix}\n </span>\n );\n }\n\n return elements;\n };\n\n // Component to highlight search terms in text\n const HighlightedText: React.FC<{ text: string; searchTerm: string }> = ({ text, searchTerm }) => {\n if (!searchTerm) {\n return <span>{text}</span>;\n }\n\n // eslint-disable-next-line @rushstack/security/no-unsafe-regexp\n const regex = new RegExp(`(${searchTerm})`, 'gi');\n const parts = text.split(regex);\n\n return (\n <span>\n {parts.map((part, index) =>\n regex.test(part) ? (\n <mark key={index} className=\"bg-yellow-200\">\n {part}\n </mark>\n ) : (\n <span key={index}>{part}</span>\n )\n )}\n </span>\n );\n };\n\n const renderTreeNode = (node: IVirtualTreeNode<T>, level: number = 0): React.ReactElement | null => {\n const isExpanded = expandedNodes.has(node.id);\n const isSelected = selectedResourceId === node.id;\n const nodeIdLower = node.id.toLowerCase();\n const searchLower = searchTerm.toLowerCase();\n const matchesSearch = !searchTerm || nodeIdLower.includes(searchLower);\n const isPending = node.isPending;\n const pendingResource = node.pendingResource;\n const displayName = node.name; // Virtual node already has the correct display name\n\n // Determine if this resource should be shown (not deleted)\n const isDeleted = pendingResource?.type === 'deleted';\n if (isDeleted) {\n return null; // Don't render deleted resources\n }\n\n // Check if any children match\n let hasMatchingChildren = false;\n if (!node.isLeaf && node.children && searchTerm) {\n const checkChildren = (n: IVirtualTreeNode): boolean => {\n if (n.id.toLowerCase().includes(searchLower)) return true;\n if (!n.isLeaf && n.children) {\n for (const child of n.children.values()) {\n if (checkChildren(child)) return true;\n }\n }\n return false;\n };\n\n for (const child of node.children.values()) {\n if (checkChildren(child)) {\n hasMatchingChildren = true;\n break;\n }\n }\n }\n\n // Hide nodes that don't match search and don't have matching children\n if (searchTerm && !matchesSearch && !hasMatchingChildren) {\n return null;\n }\n\n return (\n <div key={node.id} className=\"select-none\">\n <div\n className={`\n flex items-center px-2 py-1 cursor-pointer hover:bg-gray-100\n ${isSelected ? 'bg-purple-50 border-l-2 border-purple-500' : ''}\n ${matchesSearch && searchTerm ? 'bg-yellow-50' : ''}\n ${\n isPending && pendingResource?.type === 'new'\n ? 'bg-emerald-25 border-l-2 border-emerald-300'\n : ''\n }\n ${\n isPending && pendingResource?.type === 'modified'\n ? 'bg-amber-25 border-l-2 border-amber-300'\n : ''\n }\n `}\n style={{ paddingLeft: `${level * 20 + 8}px` }}\n onClick={() => {\n if (node.isLeaf) {\n onResourceSelect({\n resourceId: node.id,\n resourceData: node.pendingResource?.resourceData,\n isPending: node.isPending,\n pendingType: node.pendingResource?.type\n });\n } else {\n toggleNode(node.id);\n }\n }}\n >\n {/* Expand/Collapse chevron */}\n {!node.isLeaf && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggleNode(node.id);\n }}\n className=\"mr-1 hover:bg-gray-200 rounded p-0.5\"\n >\n {isExpanded ? (\n <ChevronDownIcon className=\"w-3 h-3 text-gray-600\" />\n ) : (\n <ChevronRightIcon className=\"w-3 h-3 text-gray-600\" />\n )}\n </button>\n )}\n\n {/* Spacer for alignment when no children */}\n {node.isLeaf && <div className=\"w-4 mr-1\" />}\n\n {/* Folder/Document icon */}\n {node.isLeaf ? (\n <DocumentTextIcon className=\"w-4 h-4 text-green-500 mr-2 flex-shrink-0\" />\n ) : isExpanded ? (\n <FolderOpenIcon className=\"w-4 h-4 text-blue-500 mr-2 flex-shrink-0\" />\n ) : (\n <FolderIcon className=\"w-4 h-4 text-blue-500 mr-2 flex-shrink-0\" />\n )}\n\n {/* Node name with search highlighting */}\n <span\n className={`\n text-sm truncate flex-1\n ${isSelected ? 'font-medium text-purple-900' : 'text-gray-700'}\n ${isPending && pendingResource?.type === 'new' ? 'font-medium text-emerald-800' : ''}\n ${isPending && pendingResource?.type === 'modified' ? 'font-medium text-amber-800' : ''}\n ${matchesSearch && searchTerm ? 'font-medium' : ''}\n `}\n title={node.id}\n >\n {searchTerm ? <HighlightedText text={displayName} searchTerm={searchTerm} /> : displayName}\n </span>\n\n {/* Annotations for any nodes */}\n {resourceAnnotations?.[node.id] && (\n <div className=\"flex items-center gap-1 ml-2\">\n {renderAnnotation(resourceAnnotations[node.id])}\n </div>\n )}\n\n {/* Show child count for branches */}\n {!node.isLeaf && node.children && (\n <span className=\"ml-2 text-xs text-gray-500\">({node.children.size})</span>\n )}\n </div>\n\n {/* Render children if expanded */}\n {!node.isLeaf && node.children && isExpanded && (\n <div>\n {Array.from(node.children.values())\n .sort((a: IVirtualTreeNode<T>, b: IVirtualTreeNode<T>) => {\n // Sort folders first, then by name\n if (a.isLeaf !== b.isLeaf) {\n return a.isLeaf ? 1 : -1;\n }\n return a.name.localeCompare(b.name);\n })\n .map((child) => renderTreeNode(child, level + 1))}\n </div>\n )}\n </div>\n );\n };\n\n if (!virtualTree || effectiveRootNodes.length === 0) {\n return (\n <div className={`${className} p-4 text-center text-gray-500`}>\n <p>{emptyMessage}</p>\n </div>\n );\n }\n\n return (\n <div className={`${className} overflow-y-auto !relative !z-auto !min-h-[200px]`}>\n {effectiveRootNodes\n .sort((a: IVirtualTreeNode, b: IVirtualTreeNode) => {\n // Sort folders first, then by name\n if (a.isLeaf !== b.isLeaf) {\n return a.isLeaf ? 1 : -1;\n }\n return a.name.localeCompare(b.name);\n })\n .map((child) => {\n return renderTreeNode(child);\n })}\n </div>\n );\n};\n\nexport default ResourcePickerTree;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/pickers/ResourcePicker/index.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAkC,YAAY,EAAE,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAE,oBAAoB,EAAsB,MAAM,SAAS,CAAC;AAMnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,GAAG,OAAO,EAAG,gHAQ1C,oBAAoB,CAAC,CAAC,CAAC,KAAG,YAqK5B,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/pickers/ResourcePicker/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useMemo, useCallback, ReactElement } from 'react';\nimport { MagnifyingGlassIcon, ListBulletIcon, FolderIcon } from '@heroicons/react/24/outline';\nimport { IResourcePickerProps, IResourceSelection } from './types';\nimport { ResourcePickerList } from './ResourcePickerList';\nimport { ResourcePickerTree } from './ResourcePickerTree';\nimport { searchResources, filterTreeBranch } from './utils/treeNavigation';\nimport { useSmartObservability } from '../../../hooks/useSmartObservability';\n\n/**\n * Comprehensive resource picker component with search, view modes, and annotation support.\n *\n * The ResourcePicker provides a flexible interface for browsing and selecting resources\n * from processed resource collections. It supports both list and tree view modes,\n * search functionality, visual annotations, and pending resource management.\n *\n * Key features:\n * - **Multiple view modes**: List view for simple browsing, tree view for hierarchical navigation\n * - **Search functionality**: Search across all resources or within a specific branch\n * - **Visual annotations**: Display badges, indicators, and suffixes for enhanced UX\n * - **Pending resources**: Show unsaved changes alongside persisted resources\n * - **Branch isolation**: Focus on a specific branch node of the resource tree\n * - **Type safety**: Full TypeScript support with generic resource data types\n *\n * @example\n * ```tsx\n * function MyResourceEditor() {\n * const [selectedId, setSelectedId] = useState<string | null>(null);\n * const [selectedData, setSelectedData] = useState<MyResourceType | null>(null);\n *\n * return (\n * <ResourcePicker<MyResourceType>\n * resources={processedResources}\n * selectedResourceId={selectedId}\n * onResourceSelect={(selection) => {\n * setSelectedId(selection.resourceId);\n * setSelectedData(selection.resourceData || null);\n *\n * if (selection.isPending) {\n * console.log(`Pending ${selection.pendingType} operation`);\n * }\n * }}\n * defaultView=\"tree\"\n * enableSearch={true}\n * searchPlaceholder=\"Search resources...\"\n * resourceAnnotations={{\n * 'user.welcome': {\n * badge: { text: '3', variant: 'info' },\n * suffix: '(3 candidates)'\n * }\n * }}\n * pendingResources={[{\n * id: 'user.new-item',\n * type: 'new',\n * displayName: 'New Welcome Message',\n * resourceData: { text: 'Hello World!' }\n * }]}\n * height=\"500px\"\n * />\n * );\n * }\n * ```\n *\n * @public\n */\nexport const ResourcePicker = <T = unknown,>({\n resources,\n selectedResourceId,\n onResourceSelect,\n resourceAnnotations,\n pendingResources,\n options,\n className = ''\n}: IResourcePickerProps<T>): ReactElement => {\n const o11y = useSmartObservability();\n // Extract options with defaults\n const {\n defaultView = 'list',\n showViewToggle = true,\n rootPath,\n hideRootNode = false,\n enableSearch = true,\n searchPlaceholder,\n searchScope = 'current-branch',\n emptyMessage,\n height = '600px'\n } = options || {};\n const [viewMode, setViewMode] = useState<'list' | 'tree'>(defaultView);\n const [searchTerm, setSearchTerm] = useState('');\n\n // Get resource IDs based on current filters\n const resourceIds = useMemo(() => {\n if (!resources?.summary.resourceIds) {\n return [];\n }\n\n let ids = resources.summary.resourceIds;\n\n // Apply branch filtering if specified\n if (rootPath) {\n ids = filterTreeBranch(ids, rootPath, hideRootNode);\n }\n\n // Apply search filtering\n if (searchTerm) {\n ids = searchResources(ids, searchTerm, searchScope, rootPath);\n }\n\n return ids;\n }, [resources?.summary.resourceIds, rootPath, hideRootNode, searchTerm, searchScope]);\n\n // Handle resource selection\n const handleResourceSelect = useCallback(\n (selection: IResourceSelection<T>) => {\n onResourceSelect(selection);\n if (selection.resourceId) {\n o11y.user.info(`Selected resource: ${selection.resourceId}`);\n }\n },\n [onResourceSelect, o11y]\n );\n\n // Calculate dynamic search placeholder\n const getSearchPlaceholder = (): string => {\n if (searchPlaceholder) {\n return searchPlaceholder;\n }\n if (rootPath && hideRootNode) {\n const segments = rootPath.split('/');\n const branchName = segments[segments.length - 1];\n return `Search ${branchName}...`;\n }\n return 'Search resources...';\n };\n\n // Handle empty state\n if (!resources) {\n return (\n <div className={`${className} p-4 text-center text-gray-500`}>\n <p>{emptyMessage || 'No resources loaded'}</p>\n </div>\n );\n }\n\n const containerHeight = typeof height === 'number' ? `${height}px` : height;\n\n return (\n <div\n className={`flex flex-col !relative !z-auto !min-h-[400px] ${className}`}\n style={{\n height: containerHeight\n }}\n >\n {/* Header with search and view toggle */}\n {(enableSearch || showViewToggle) && (\n <div className=\"flex flex-col gap-3 mb-4\">\n {/* Search Box */}\n {enableSearch && (\n <div className=\"relative\">\n <MagnifyingGlassIcon className=\"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400\" />\n <input\n type=\"text\"\n placeholder={getSearchPlaceholder()}\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-sm\"\n />\n </div>\n )}\n\n {/* View Mode Toggle */}\n {showViewToggle && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-gray-600\">\n {resourceIds.length} resource{resourceIds.length !== 1 ? 's' : ''}\n {searchTerm && ` matching \"${searchTerm}\"`}\n </span>\n <div className=\"flex items-center space-x-1 bg-gray-100 rounded-lg p-1\">\n <button\n onClick={() => setViewMode('list')}\n className={`flex items-center px-2 py-1 text-xs font-medium rounded transition-colors ${\n viewMode === 'list'\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900'\n }`}\n title=\"List View\"\n >\n <ListBulletIcon className=\"h-4 w-4\" />\n <span className=\"ml-1\">List</span>\n </button>\n <button\n onClick={() => setViewMode('tree')}\n className={`flex items-center px-2 py-1 text-xs font-medium rounded transition-colors ${\n viewMode === 'tree'\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900'\n }`}\n title=\"Tree View\"\n >\n <FolderIcon className=\"h-4 w-4\" />\n <span className=\"ml-1\">Tree</span>\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Resource List or Tree */}\n <div className=\"flex-1 overflow-y-auto border border-gray-200 rounded-lg bg-gray-50 !relative !z-auto !min-h-[300px]\">\n {viewMode === 'tree' ? (\n <ResourcePickerTree<T>\n resources={resources}\n pendingResources={pendingResources}\n selectedResourceId={selectedResourceId}\n onResourceSelect={handleResourceSelect}\n resourceAnnotations={resourceAnnotations}\n searchTerm={searchTerm}\n rootPath={rootPath}\n hideRootNode={hideRootNode}\n emptyMessage={emptyMessage}\n />\n ) : (\n <ResourcePickerList<T>\n resourceIds={resourceIds}\n pendingResources={pendingResources}\n selectedResourceId={selectedResourceId}\n onResourceSelect={handleResourceSelect}\n resourceAnnotations={resourceAnnotations}\n searchTerm={searchTerm}\n rootPath={rootPath}\n hideRootNode={hideRootNode}\n emptyMessage={emptyMessage}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default ResourcePicker;\n"]}
|