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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/.rush/temp/03c8b056281d9db0a97d8a6e25eea798a160d393.tar.log +271 -0
  2. package/.rush/temp/chunked-rush-logs/ts-res-ui-components.build.chunks.jsonl +9 -0
  3. package/.rush/temp/operation/build/all.log +9 -0
  4. package/.rush/temp/operation/build/log-chunks.jsonl +9 -0
  5. package/.rush/temp/operation/build/state.json +3 -0
  6. package/.rush/temp/shrinkwrap-deps.json +1111 -0
  7. package/README.md +18 -0
  8. package/REFACTORING_PLAN.md +171 -0
  9. package/config/jest.config.json +16 -0
  10. package/config/jest.setup.js +64 -0
  11. package/config/rig.json +16 -0
  12. package/lib/components/common/QualifierContextControl.d.ts +14 -0
  13. package/lib/components/common/QualifierContextControl.d.ts.map +1 -0
  14. package/lib/components/common/QualifierContextControl.js +78 -0
  15. package/lib/components/common/QualifierContextControl.js.map +1 -0
  16. package/lib/components/common/ResourceListView.d.ts +11 -0
  17. package/lib/components/common/ResourceListView.d.ts.map +1 -0
  18. package/lib/components/common/ResourceListView.js +20 -0
  19. package/lib/components/common/ResourceListView.js.map +1 -0
  20. package/lib/components/common/ResourceTreeView.d.ts +12 -0
  21. package/lib/components/common/ResourceTreeView.d.ts.map +1 -0
  22. package/lib/components/common/ResourceTreeView.js +162 -0
  23. package/lib/components/common/ResourceTreeView.js.map +1 -0
  24. package/lib/components/forms/HierarchyEditor.d.ts +10 -0
  25. package/lib/components/forms/HierarchyEditor.d.ts.map +1 -0
  26. package/lib/components/forms/HierarchyEditor.js +106 -0
  27. package/lib/components/forms/HierarchyEditor.js.map +1 -0
  28. package/lib/components/forms/QualifierEditForm.d.ts +11 -0
  29. package/lib/components/forms/QualifierEditForm.d.ts.map +1 -0
  30. package/lib/components/forms/QualifierEditForm.js +181 -0
  31. package/lib/components/forms/QualifierEditForm.js.map +1 -0
  32. package/lib/components/forms/QualifierTypeEditForm.d.ts +10 -0
  33. package/lib/components/forms/QualifierTypeEditForm.d.ts.map +1 -0
  34. package/lib/components/forms/QualifierTypeEditForm.js +172 -0
  35. package/lib/components/forms/QualifierTypeEditForm.js.map +1 -0
  36. package/lib/components/forms/ResourceTypeEditForm.d.ts +10 -0
  37. package/lib/components/forms/ResourceTypeEditForm.d.ts.map +1 -0
  38. package/lib/components/forms/ResourceTypeEditForm.js +188 -0
  39. package/lib/components/forms/ResourceTypeEditForm.js.map +1 -0
  40. package/lib/components/forms/index.d.ts +9 -0
  41. package/lib/components/forms/index.d.ts.map +1 -0
  42. package/lib/components/forms/index.js +5 -0
  43. package/lib/components/forms/index.js.map +1 -0
  44. package/lib/components/orchestrator/ResourceOrchestrator.d.ts +14 -0
  45. package/lib/components/orchestrator/ResourceOrchestrator.d.ts.map +1 -0
  46. package/lib/components/orchestrator/ResourceOrchestrator.js +278 -0
  47. package/lib/components/orchestrator/ResourceOrchestrator.js.map +1 -0
  48. package/lib/components/views/CompiledView/index.d.ts +5 -0
  49. package/lib/components/views/CompiledView/index.d.ts.map +1 -0
  50. package/lib/components/views/CompiledView/index.js +595 -0
  51. package/lib/components/views/CompiledView/index.js.map +1 -0
  52. package/lib/components/views/ConfigurationView/index.d.ts +5 -0
  53. package/lib/components/views/ConfigurationView/index.d.ts.map +1 -0
  54. package/lib/components/views/ConfigurationView/index.js +363 -0
  55. package/lib/components/views/ConfigurationView/index.js.map +1 -0
  56. package/lib/components/views/FilterView/index.d.ts +5 -0
  57. package/lib/components/views/FilterView/index.d.ts.map +1 -0
  58. package/lib/components/views/FilterView/index.js +463 -0
  59. package/lib/components/views/FilterView/index.js.map +1 -0
  60. package/lib/components/views/ImportView/index.d.ts +5 -0
  61. package/lib/components/views/ImportView/index.d.ts.map +1 -0
  62. package/lib/components/views/ImportView/index.js +514 -0
  63. package/lib/components/views/ImportView/index.js.map +1 -0
  64. package/lib/components/views/ResolutionView/EditableJsonView.d.ts +21 -0
  65. package/lib/components/views/ResolutionView/EditableJsonView.d.ts.map +1 -0
  66. package/lib/components/views/ResolutionView/EditableJsonView.js +109 -0
  67. package/lib/components/views/ResolutionView/EditableJsonView.js.map +1 -0
  68. package/lib/components/views/ResolutionView/ResolutionEditControls.d.ts +19 -0
  69. package/lib/components/views/ResolutionView/ResolutionEditControls.d.ts.map +1 -0
  70. package/lib/components/views/ResolutionView/ResolutionEditControls.js +82 -0
  71. package/lib/components/views/ResolutionView/ResolutionEditControls.js.map +1 -0
  72. package/lib/components/views/ResolutionView/index.d.ts +5 -0
  73. package/lib/components/views/ResolutionView/index.d.ts.map +1 -0
  74. package/lib/components/views/ResolutionView/index.js +255 -0
  75. package/lib/components/views/ResolutionView/index.js.map +1 -0
  76. package/lib/components/views/SourceView/index.d.ts +5 -0
  77. package/lib/components/views/SourceView/index.d.ts.map +1 -0
  78. package/lib/components/views/SourceView/index.js +316 -0
  79. package/lib/components/views/SourceView/index.js.map +1 -0
  80. package/lib/components/views/ZipLoaderView/index.d.ts +5 -0
  81. package/lib/components/views/ZipLoaderView/index.d.ts.map +1 -0
  82. package/lib/components/views/ZipLoaderView/index.js +313 -0
  83. package/lib/components/views/ZipLoaderView/index.js.map +1 -0
  84. package/lib/hooks/useConfigurationState.d.ts +46 -0
  85. package/lib/hooks/useConfigurationState.d.ts.map +1 -0
  86. package/lib/hooks/useConfigurationState.js +239 -0
  87. package/lib/hooks/useConfigurationState.js.map +1 -0
  88. package/lib/hooks/useFilterState.d.ts +7 -0
  89. package/lib/hooks/useFilterState.d.ts.map +1 -0
  90. package/lib/hooks/useFilterState.js +80 -0
  91. package/lib/hooks/useFilterState.js.map +1 -0
  92. package/lib/hooks/useResolutionState.d.ts +8 -0
  93. package/lib/hooks/useResolutionState.d.ts.map +1 -0
  94. package/lib/hooks/useResolutionState.js +253 -0
  95. package/lib/hooks/useResolutionState.js.map +1 -0
  96. package/lib/hooks/useResourceData.d.ts +19 -0
  97. package/lib/hooks/useResourceData.d.ts.map +1 -0
  98. package/lib/hooks/useResourceData.js +368 -0
  99. package/lib/hooks/useResourceData.js.map +1 -0
  100. package/lib/hooks/useViewState.d.ts +10 -0
  101. package/lib/hooks/useViewState.d.ts.map +1 -0
  102. package/lib/hooks/useViewState.js +29 -0
  103. package/lib/hooks/useViewState.js.map +1 -0
  104. package/lib/index.d.ts +27 -0
  105. package/lib/index.d.ts.map +1 -0
  106. package/lib/index.js +34 -0
  107. package/lib/index.js.map +1 -0
  108. package/lib/test/helpers/testDataLoader.d.ts +37 -0
  109. package/lib/test/helpers/testDataLoader.d.ts.map +1 -0
  110. package/lib/test/helpers/testDataLoader.js +171 -0
  111. package/lib/test/helpers/testDataLoader.js.map +1 -0
  112. package/lib/test/unit/utils/configurationUtils.test.d.ts +2 -0
  113. package/lib/test/unit/utils/configurationUtils.test.d.ts.map +1 -0
  114. package/lib/test/unit/utils/configurationUtils.test.js +497 -0
  115. package/lib/test/unit/utils/configurationUtils.test.js.map +1 -0
  116. package/lib/test/unit/utils/fileProcessing.test.d.ts +2 -0
  117. package/lib/test/unit/utils/fileProcessing.test.d.ts.map +1 -0
  118. package/lib/test/unit/utils/fileProcessing.test.js +321 -0
  119. package/lib/test/unit/utils/fileProcessing.test.js.map +1 -0
  120. package/lib/test/unit/utils/filterResources.test.d.ts +2 -0
  121. package/lib/test/unit/utils/filterResources.test.d.ts.map +1 -0
  122. package/lib/test/unit/utils/filterResources.test.js +403 -0
  123. package/lib/test/unit/utils/filterResources.test.js.map +1 -0
  124. package/lib/test/unit/utils/resolutionEditing.test.d.ts +2 -0
  125. package/lib/test/unit/utils/resolutionEditing.test.d.ts.map +1 -0
  126. package/lib/test/unit/utils/resolutionEditing.test.js +439 -0
  127. package/lib/test/unit/utils/resolutionEditing.test.js.map +1 -0
  128. package/lib/test/unit/utils/resolutionUtils.test.d.ts +2 -0
  129. package/lib/test/unit/utils/resolutionUtils.test.d.ts.map +1 -0
  130. package/lib/test/unit/utils/resolutionUtils.test.js +397 -0
  131. package/lib/test/unit/utils/resolutionUtils.test.js.map +1 -0
  132. package/lib/test/unit/utils/tsResIntegration.test.d.ts +2 -0
  133. package/lib/test/unit/utils/tsResIntegration.test.d.ts.map +1 -0
  134. package/lib/test/unit/utils/tsResIntegration.test.js +376 -0
  135. package/lib/test/unit/utils/tsResIntegration.test.js.map +1 -0
  136. package/lib/types/index.d.ts +251 -0
  137. package/lib/types/index.d.ts.map +1 -0
  138. package/lib/types/index.js +2 -0
  139. package/lib/types/index.js.map +1 -0
  140. package/lib/utils/configurationUtils.d.ts +74 -0
  141. package/lib/utils/configurationUtils.d.ts.map +1 -0
  142. package/lib/utils/configurationUtils.js +359 -0
  143. package/lib/utils/configurationUtils.js.map +1 -0
  144. package/lib/utils/fileProcessing.d.ts +18 -0
  145. package/lib/utils/fileProcessing.d.ts.map +1 -0
  146. package/lib/utils/fileProcessing.js +142 -0
  147. package/lib/utils/fileProcessing.js.map +1 -0
  148. package/lib/utils/filterResources.d.ts +38 -0
  149. package/lib/utils/filterResources.d.ts.map +1 -0
  150. package/lib/utils/filterResources.js +153 -0
  151. package/lib/utils/filterResources.js.map +1 -0
  152. package/lib/utils/resolutionEditing.d.ts +58 -0
  153. package/lib/utils/resolutionEditing.d.ts.map +1 -0
  154. package/lib/utils/resolutionEditing.js +246 -0
  155. package/lib/utils/resolutionEditing.js.map +1 -0
  156. package/lib/utils/resolutionUtils.d.ts +28 -0
  157. package/lib/utils/resolutionUtils.d.ts.map +1 -0
  158. package/lib/utils/resolutionUtils.js +216 -0
  159. package/lib/utils/resolutionUtils.js.map +1 -0
  160. package/lib/utils/tsResIntegration.d.ts +71 -0
  161. package/lib/utils/tsResIntegration.d.ts.map +1 -0
  162. package/lib/utils/tsResIntegration.js +294 -0
  163. package/lib/utils/tsResIntegration.js.map +1 -0
  164. package/lib/utils/zipLoader/browserZipLoader.d.ts +48 -0
  165. package/lib/utils/zipLoader/browserZipLoader.d.ts.map +1 -0
  166. package/lib/utils/zipLoader/browserZipLoader.js +247 -0
  167. package/lib/utils/zipLoader/browserZipLoader.js.map +1 -0
  168. package/lib/utils/zipLoader/index.d.ts +8 -0
  169. package/lib/utils/zipLoader/index.d.ts.map +1 -0
  170. package/lib/utils/zipLoader/index.js +13 -0
  171. package/lib/utils/zipLoader/index.js.map +1 -0
  172. package/lib/utils/zipLoader/nodeZipBuilder.d.ts +55 -0
  173. package/lib/utils/zipLoader/nodeZipBuilder.d.ts.map +1 -0
  174. package/lib/utils/zipLoader/nodeZipBuilder.js +98 -0
  175. package/lib/utils/zipLoader/nodeZipBuilder.js.map +1 -0
  176. package/lib/utils/zipLoader/types.d.ts +139 -0
  177. package/lib/utils/zipLoader/types.d.ts.map +1 -0
  178. package/lib/utils/zipLoader/types.js +2 -0
  179. package/lib/utils/zipLoader/types.js.map +1 -0
  180. package/lib/utils/zipLoader/zipUtils.d.ts +53 -0
  181. package/lib/utils/zipLoader/zipUtils.d.ts.map +1 -0
  182. package/lib/utils/zipLoader/zipUtils.js +229 -0
  183. package/lib/utils/zipLoader/zipUtils.js.map +1 -0
  184. package/package.json +69 -0
  185. package/rush-logs/ts-res-ui-components.build.cache.log +3 -0
  186. package/rush-logs/ts-res-ui-components.build.log +9 -0
  187. package/src/components/common/QualifierContextControl.tsx +151 -0
  188. package/src/components/common/ResourceListView.tsx +63 -0
  189. package/src/components/common/ResourceTreeView.tsx +271 -0
  190. package/src/components/forms/HierarchyEditor.tsx +204 -0
  191. package/src/components/forms/QualifierEditForm.tsx +355 -0
  192. package/src/components/forms/QualifierTypeEditForm.tsx +347 -0
  193. package/src/components/forms/ResourceTypeEditForm.tsx +331 -0
  194. package/src/components/forms/index.ts +11 -0
  195. package/src/components/orchestrator/ResourceOrchestrator.tsx +372 -0
  196. package/src/components/views/CompiledView/index.tsx +922 -0
  197. package/src/components/views/ConfigurationView/index.tsx +800 -0
  198. package/src/components/views/FilterView/index.tsx +825 -0
  199. package/src/components/views/ImportView/index.tsx +717 -0
  200. package/src/components/views/ResolutionView/EditableJsonView.tsx +214 -0
  201. package/src/components/views/ResolutionView/ResolutionEditControls.tsx +170 -0
  202. package/src/components/views/ResolutionView/index.tsx +591 -0
  203. package/src/components/views/SourceView/index.tsx +536 -0
  204. package/src/components/views/ZipLoaderView/index.tsx +485 -0
  205. package/src/hooks/useConfigurationState.ts +374 -0
  206. package/src/hooks/useFilterState.ts +97 -0
  207. package/src/hooks/useResolutionState.ts +355 -0
  208. package/src/hooks/useResourceData.ts +467 -0
  209. package/src/hooks/useViewState.ts +44 -0
  210. package/src/index.ts +45 -0
  211. package/src/test/helpers/testDataLoader.ts +195 -0
  212. package/src/test/unit/utils/configurationUtils.test.ts +630 -0
  213. package/src/test/unit/utils/fileProcessing.test.ts +391 -0
  214. package/src/test/unit/utils/filterResources.test.ts +574 -0
  215. package/src/test/unit/utils/resolutionEditing.test.ts +556 -0
  216. package/src/test/unit/utils/resolutionUtils.test.ts +521 -0
  217. package/src/test/unit/utils/tsResIntegration.test.ts +433 -0
  218. package/src/types/index.ts +322 -0
  219. package/src/utils/configurationUtils.ts +424 -0
  220. package/src/utils/fileProcessing.ts +160 -0
  221. package/src/utils/filterResources.ts +206 -0
  222. package/src/utils/resolutionEditing.ts +319 -0
  223. package/src/utils/resolutionUtils.ts +289 -0
  224. package/src/utils/tsResIntegration.ts +440 -0
  225. package/src/utils/zipLoader/browserZipLoader.ts +319 -0
  226. package/src/utils/zipLoader/index.ts +26 -0
  227. package/src/utils/zipLoader/nodeZipBuilder.ts +153 -0
  228. package/src/utils/zipLoader/types.ts +175 -0
  229. package/src/utils/zipLoader/zipUtils.ts +266 -0
  230. package/temp/build/typescript/ts_gZid87Hu.json +1 -0
  231. package/tsconfig.json +15 -0
@@ -0,0 +1,172 @@
1
+ import React, { useState, useCallback, useEffect } from 'react';
2
+ import { XMarkIcon, InformationCircleIcon } from '@heroicons/react/24/outline';
3
+ import { HierarchyEditor } from './HierarchyEditor';
4
+ export const QualifierTypeEditForm = ({ qualifierType, onSave, onCancel, existingNames = [] }) => {
5
+ const [formData, setFormData] = useState(() => {
6
+ if (qualifierType) {
7
+ const config = qualifierType.configuration || {};
8
+ // Ensure hierarchy is a plain object with string values
9
+ let hierarchy = {};
10
+ const rawHierarchy = config?.hierarchy;
11
+ if (rawHierarchy && typeof rawHierarchy === 'object' && !Array.isArray(rawHierarchy)) {
12
+ for (const [key, value] of Object.entries(rawHierarchy)) {
13
+ if (typeof value === 'string') {
14
+ hierarchy[key] = value;
15
+ }
16
+ }
17
+ }
18
+ return {
19
+ name: qualifierType.name,
20
+ systemType: qualifierType.systemType,
21
+ allowContextList: config?.allowContextList ?? false,
22
+ caseSensitive: config?.caseSensitive ?? true,
23
+ enumeratedValues: config?.enumeratedValues || [],
24
+ acceptLowercase: config?.acceptLowercase ?? false,
25
+ allowedTerritories: config?.allowedTerritories || [],
26
+ hierarchy: hierarchy
27
+ };
28
+ }
29
+ return {
30
+ name: '',
31
+ systemType: 'literal',
32
+ allowContextList: false,
33
+ caseSensitive: true,
34
+ enumeratedValues: [],
35
+ acceptLowercase: false,
36
+ allowedTerritories: [],
37
+ hierarchy: {}
38
+ };
39
+ });
40
+ const [errors, setErrors] = useState({});
41
+ const [enumeratedValuesText, setEnumeratedValuesText] = useState(formData.enumeratedValues.join(', '));
42
+ const [allowedTerritoriesText, setAllowedTerritoriesText] = useState(formData.allowedTerritories.join(', '));
43
+ // Validation
44
+ const validateForm = useCallback(() => {
45
+ const newErrors = {};
46
+ if (!formData.name.trim()) {
47
+ newErrors.name = 'Name is required';
48
+ }
49
+ else if (existingNames.includes(formData.name) && formData.name !== qualifierType?.name) {
50
+ newErrors.name = 'Name must be unique';
51
+ }
52
+ if (formData.systemType === 'literal' && formData.enumeratedValues.length === 0) {
53
+ newErrors.enumeratedValues = 'Literal types should have enumerated values';
54
+ }
55
+ setErrors(newErrors);
56
+ return Object.keys(newErrors).length === 0;
57
+ }, [formData, existingNames, qualifierType?.name]);
58
+ // Update enumerated values when text changes
59
+ useEffect(() => {
60
+ const values = enumeratedValuesText
61
+ .split(',')
62
+ .map((v) => v.trim())
63
+ .filter((v) => v.length > 0);
64
+ setFormData((prev) => ({ ...prev, enumeratedValues: values }));
65
+ }, [enumeratedValuesText]);
66
+ // Update allowed territories when text changes
67
+ useEffect(() => {
68
+ const territories = allowedTerritoriesText
69
+ .split(',')
70
+ .map((v) => v.trim().toUpperCase())
71
+ .filter((v) => v.length > 0);
72
+ setFormData((prev) => ({ ...prev, allowedTerritories: territories }));
73
+ }, [allowedTerritoriesText]);
74
+ const handleSave = useCallback(() => {
75
+ if (!validateForm())
76
+ return;
77
+ let configuration = {
78
+ allowContextList: formData.allowContextList
79
+ };
80
+ switch (formData.systemType) {
81
+ case 'literal':
82
+ configuration = {
83
+ ...configuration,
84
+ caseSensitive: formData.caseSensitive,
85
+ enumeratedValues: formData.enumeratedValues.length > 0 ? formData.enumeratedValues : undefined
86
+ };
87
+ // Add hierarchy if it has entries
88
+ if (Object.keys(formData.hierarchy).length > 0) {
89
+ configuration.hierarchy = formData.hierarchy;
90
+ }
91
+ break;
92
+ case 'territory':
93
+ configuration = {
94
+ ...configuration,
95
+ acceptLowercase: formData.acceptLowercase,
96
+ allowedTerritories: formData.allowedTerritories.length > 0 ? formData.allowedTerritories : undefined
97
+ };
98
+ // Add hierarchy if it has entries
99
+ if (Object.keys(formData.hierarchy).length > 0) {
100
+ configuration.hierarchy = formData.hierarchy;
101
+ }
102
+ break;
103
+ case 'language':
104
+ // Language types only have allowContextList
105
+ break;
106
+ }
107
+ const result = {
108
+ name: formData.name,
109
+ systemType: formData.systemType,
110
+ configuration: Object.keys(configuration).length > 1 ? configuration : undefined
111
+ };
112
+ onSave(result);
113
+ }, [formData, validateForm, onSave]);
114
+ const updateField = useCallback((field, value) => {
115
+ setFormData((prev) => ({ ...prev, [field]: value }));
116
+ if (errors[field]) {
117
+ setErrors((prev) => ({ ...prev, [field]: '' }));
118
+ }
119
+ }, [errors]);
120
+ return (React.createElement("div", { className: "fixed inset-0 bg-gray-600 bg-opacity-50 flex items-center justify-center z-50 p-4" },
121
+ React.createElement("div", { className: "bg-white rounded-lg shadow-xl max-w-2xl w-full h-full max-h-[calc(100vh-2rem)] flex flex-col" },
122
+ React.createElement("div", { className: "flex items-center justify-between p-6 border-b flex-shrink-0" },
123
+ React.createElement("h3", { className: "text-lg font-medium text-gray-900" }, qualifierType ? 'Edit Qualifier Type' : 'Add Qualifier Type'),
124
+ React.createElement("button", { onClick: onCancel, className: "text-gray-400 hover:text-gray-600" },
125
+ React.createElement(XMarkIcon, { className: "w-6 h-6" }))),
126
+ React.createElement("div", { className: "p-6 space-y-6 overflow-y-auto flex-1 min-h-0" },
127
+ React.createElement("div", { className: "grid grid-cols-2 gap-4" },
128
+ React.createElement("div", null,
129
+ React.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Name *"),
130
+ React.createElement("input", { type: "text", value: formData.name, onChange: (e) => updateField('name', e.target.value), className: `w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${errors.name ? 'border-red-300' : 'border-gray-300'}`, placeholder: "Enter qualifier type name" }),
131
+ errors.name && React.createElement("p", { className: "mt-1 text-sm text-red-600" }, errors.name)),
132
+ React.createElement("div", null,
133
+ React.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "System Type *"),
134
+ React.createElement("select", { value: formData.systemType, onChange: (e) => updateField('systemType', e.target.value), className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500" },
135
+ React.createElement("option", { value: "literal" }, "Literal"),
136
+ React.createElement("option", { value: "language" }, "Language"),
137
+ React.createElement("option", { value: "territory" }, "Territory")))),
138
+ React.createElement("div", { className: "flex items-center" },
139
+ React.createElement("input", { type: "checkbox", id: "allowContextList", checked: formData.allowContextList, onChange: (e) => updateField('allowContextList', e.target.checked), className: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" }),
140
+ React.createElement("label", { htmlFor: "allowContextList", className: "ml-2 text-sm text-gray-700" }, "Allow Context List"),
141
+ React.createElement("div", { className: "ml-2 group relative" },
142
+ React.createElement(InformationCircleIcon, { className: "w-4 h-4 text-gray-400" }),
143
+ React.createElement("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" }, "Allow multiple values separated by commas"))),
144
+ formData.systemType === 'literal' && (React.createElement("div", { className: "space-y-4 p-4 bg-blue-50 rounded-lg" },
145
+ React.createElement("h4", { className: "font-medium text-gray-900" }, "Literal Type Configuration"),
146
+ React.createElement("div", { className: "flex items-center" },
147
+ React.createElement("input", { type: "checkbox", id: "caseSensitive", checked: formData.caseSensitive, onChange: (e) => updateField('caseSensitive', e.target.checked), className: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" }),
148
+ React.createElement("label", { htmlFor: "caseSensitive", className: "ml-2 text-sm text-gray-700" }, "Case Sensitive")),
149
+ React.createElement("div", null,
150
+ React.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Enumerated Values"),
151
+ React.createElement("textarea", { value: enumeratedValuesText, onChange: (e) => setEnumeratedValuesText(e.target.value), className: `w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${errors.enumeratedValues ? 'border-red-300' : 'border-gray-300'}`, rows: 3, placeholder: "Enter values separated by commas (e.g., dev, test, prod)" }),
152
+ errors.enumeratedValues && (React.createElement("p", { className: "mt-1 text-sm text-red-600" }, errors.enumeratedValues)),
153
+ React.createElement("p", { className: "mt-1 text-xs text-gray-500" }, "Separate multiple values with commas")))),
154
+ formData.systemType === 'territory' && (React.createElement("div", { className: "space-y-4 p-4 bg-green-50 rounded-lg" },
155
+ React.createElement("h4", { className: "font-medium text-gray-900" }, "Territory Type Configuration"),
156
+ React.createElement("div", { className: "flex items-center" },
157
+ React.createElement("input", { type: "checkbox", id: "acceptLowercase", checked: formData.acceptLowercase, onChange: (e) => updateField('acceptLowercase', e.target.checked), className: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" }),
158
+ React.createElement("label", { htmlFor: "acceptLowercase", className: "ml-2 text-sm text-gray-700" }, "Accept Lowercase Territory Codes")),
159
+ React.createElement("div", null,
160
+ React.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Allowed Territories"),
161
+ React.createElement("textarea", { value: allowedTerritoriesText, onChange: (e) => setAllowedTerritoriesText(e.target.value), className: "w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500", rows: 3, placeholder: "Enter territory codes separated by commas (e.g., US, CA, GB)" }),
162
+ React.createElement("p", { className: "mt-1 text-xs text-gray-500" }, "Separate multiple territory codes with commas. Will be automatically converted to uppercase.")))),
163
+ (formData.systemType === 'literal' || formData.systemType === 'territory') && (React.createElement("div", { className: "space-y-4" },
164
+ React.createElement(HierarchyEditor, { hierarchy: formData.hierarchy, onChange: (hierarchy) => updateField('hierarchy', hierarchy), availableValues: formData.systemType === 'literal' ? formData.enumeratedValues : formData.allowedTerritories }))),
165
+ formData.systemType === 'language' && (React.createElement("div", { className: "p-4 bg-yellow-50 rounded-lg" },
166
+ React.createElement("h4", { className: "font-medium text-gray-900" }, "Language Type Configuration"),
167
+ React.createElement("p", { className: "text-sm text-gray-600 mt-2" }, "Language qualifier types use BCP47 language tags and only support the \"Allow Context List\" option above.")))),
168
+ React.createElement("div", { className: "flex justify-end space-x-3 px-6 py-4 border-t bg-gray-50 flex-shrink-0" },
169
+ React.createElement("button", { onClick: onCancel, 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" }, "Cancel"),
170
+ React.createElement("button", { onClick: handleSave, 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" }, qualifierType ? 'Save Changes' : 'Add Qualifier Type')))));
171
+ };
172
+ //# sourceMappingURL=QualifierTypeEditForm.js.map
@@ -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 } from '@fgv/ts-res';\nimport { HierarchyEditor } from './HierarchyEditor';\n\nexport interface QualifierTypeEditFormProps {\n qualifierType?: QualifierTypes.Config.ISystemQualifierTypeConfig;\n onSave: (qualifierType: QualifierTypes.Config.ISystemQualifierTypeConfig) => void;\n onCancel: () => void;\n existingNames?: string[];\n}\n\ninterface FormData {\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\nexport const QualifierTypeEditForm: React.FC<QualifierTypeEditFormProps> = ({\n qualifierType,\n onSave,\n onCancel,\n existingNames = []\n}) => {\n const [formData, setFormData] = useState<FormData>(() => {\n if (qualifierType) {\n const config = qualifierType.configuration || {};\n // Ensure hierarchy is a plain object with string values\n let hierarchy: Record<string, string> = {};\n const rawHierarchy = (config as any)?.hierarchy;\n if (rawHierarchy && typeof rawHierarchy === 'object' && !Array.isArray(rawHierarchy)) {\n for (const [key, value] of Object.entries(rawHierarchy)) {\n if (typeof value === 'string') {\n hierarchy[key] = value;\n }\n }\n }\n\n return {\n name: qualifierType.name,\n systemType: qualifierType.systemType as 'language' | 'territory' | 'literal',\n allowContextList: (config as any)?.allowContextList ?? false,\n caseSensitive: (config as any)?.caseSensitive ?? true,\n enumeratedValues: (config as any)?.enumeratedValues || [],\n acceptLowercase: (config as any)?.acceptLowercase ?? false,\n allowedTerritories: (config as any)?.allowedTerritories || [],\n hierarchy: 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 [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\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 }\n\n if (formData.systemType === 'literal' && formData.enumeratedValues.length === 0) {\n newErrors.enumeratedValues = 'Literal types should have enumerated values';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n }, [formData, existingNames, qualifierType?.name]);\n\n // Update enumerated values when text changes\n useEffect(() => {\n const values = enumeratedValuesText\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n setFormData((prev) => ({ ...prev, enumeratedValues: values }));\n }, [enumeratedValuesText]);\n\n // Update allowed territories when text changes\n useEffect(() => {\n const territories = allowedTerritoriesText\n .split(',')\n .map((v) => v.trim().toUpperCase())\n .filter((v) => v.length > 0);\n setFormData((prev) => ({ ...prev, allowedTerritories: territories }));\n }, [allowedTerritoriesText]);\n\n const handleSave = useCallback(() => {\n if (!validateForm()) return;\n\n let configuration: any = {\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 }\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 }\n break;\n case 'language':\n // Language types only have allowContextList\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 } as any;\n\n onSave(result);\n }, [formData, validateForm, onSave]);\n\n const updateField = useCallback(\n (field: keyof FormData, value: any) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n if (errors[field]) {\n setErrors((prev) => ({ ...prev, [field]: '' }));\n }\n },\n [errors]\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 {qualifierType ? 'Edit Qualifier Type' : 'Add Qualifier Type'}\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 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 border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"literal\">Literal</option>\n <option value=\"language\">Language</option>\n <option value=\"territory\">Territory</option>\n </select>\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 border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500\"\n rows={3}\n placeholder=\"Enter territory codes separated by commas (e.g., US, CA, GB)\"\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={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 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\"\n >\n {qualifierType ? 'Save Changes' : 'Add Qualifier Type'}\n </button>\n </div>\n </div>\n </div>\n );\n};\n"]}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { ResourceTypes } from '@fgv/ts-res';
3
+ export interface ResourceTypeEditFormProps {
4
+ resourceType?: ResourceTypes.Config.IResourceTypeConfig;
5
+ onSave: (resourceType: ResourceTypes.Config.IResourceTypeConfig) => void;
6
+ onCancel: () => void;
7
+ existingNames?: string[];
8
+ }
9
+ export declare const ResourceTypeEditForm: React.FC<ResourceTypeEditFormProps>;
10
+ //# sourceMappingURL=ResourceTypeEditForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceTypeEditForm.d.ts","sourceRoot":"","sources":["../../../src/components/forms/ResourceTypeEditForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACxD,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,mBAAmB,KAAK,IAAI,CAAC;IACzE,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAsBD,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CA2SpE,CAAC"}
@@ -0,0 +1,188 @@
1
+ import React, { useState, useCallback } from 'react';
2
+ import { XMarkIcon, InformationCircleIcon } from '@heroicons/react/24/outline';
3
+ const COMMON_TYPE_NAMES = [
4
+ 'string',
5
+ 'object',
6
+ 'array',
7
+ 'number',
8
+ 'boolean',
9
+ 'localizedString',
10
+ 'config',
11
+ 'settings',
12
+ 'permissions',
13
+ 'template',
14
+ 'content',
15
+ 'metadata'
16
+ ];
17
+ export const ResourceTypeEditForm = ({ resourceType, onSave, onCancel, existingNames = [] }) => {
18
+ const [formData, setFormData] = useState(() => {
19
+ if (resourceType) {
20
+ return {
21
+ name: resourceType.name,
22
+ typeName: resourceType.typeName
23
+ };
24
+ }
25
+ return {
26
+ name: '',
27
+ typeName: 'string'
28
+ };
29
+ });
30
+ const [errors, setErrors] = useState({});
31
+ const [useCustomTypeName, setUseCustomTypeName] = useState(() => {
32
+ if (resourceType) {
33
+ return !COMMON_TYPE_NAMES.includes(resourceType.typeName);
34
+ }
35
+ return false;
36
+ });
37
+ // Validation
38
+ const validateForm = useCallback(() => {
39
+ const newErrors = {};
40
+ if (!formData.name.trim()) {
41
+ newErrors.name = 'Name is required';
42
+ }
43
+ else if (existingNames.includes(formData.name) && formData.name !== resourceType?.name) {
44
+ newErrors.name = 'Name must be unique';
45
+ }
46
+ else if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(formData.name)) {
47
+ newErrors.name = 'Name must start with a letter and contain only letters, numbers, and underscores';
48
+ }
49
+ if (!formData.typeName.trim()) {
50
+ newErrors.typeName = 'Type name is required';
51
+ }
52
+ else if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(formData.typeName)) {
53
+ newErrors.typeName =
54
+ 'Type name must start with a letter and contain only letters, numbers, and underscores';
55
+ }
56
+ setErrors(newErrors);
57
+ return Object.keys(newErrors).length === 0;
58
+ }, [formData, existingNames, resourceType?.name]);
59
+ const handleSave = useCallback(() => {
60
+ if (!validateForm())
61
+ return;
62
+ const result = {
63
+ name: formData.name,
64
+ typeName: formData.typeName
65
+ };
66
+ onSave(result);
67
+ }, [formData, validateForm, onSave]);
68
+ const updateField = useCallback((field, value) => {
69
+ setFormData((prev) => {
70
+ const updated = { ...prev, [field]: value };
71
+ // Auto-generate typeName from name for new resource types if using common types
72
+ if (field === 'name' && !resourceType && !useCustomTypeName) {
73
+ const cleanName = value.toLowerCase().replace(/[^a-zA-Z0-9]/g, '');
74
+ const commonType = COMMON_TYPE_NAMES.find((type) => cleanName.includes(type) || type.includes(cleanName));
75
+ if (commonType) {
76
+ updated.typeName = commonType;
77
+ }
78
+ else {
79
+ updated.typeName = cleanName || 'string';
80
+ }
81
+ }
82
+ return updated;
83
+ });
84
+ if (errors[field]) {
85
+ setErrors((prev) => ({ ...prev, [field]: '' }));
86
+ }
87
+ }, [errors, resourceType, useCustomTypeName]);
88
+ const handleTypeNameModeChange = useCallback((useCustom) => {
89
+ setUseCustomTypeName(useCustom);
90
+ if (!useCustom && !resourceType) {
91
+ // Reset to a common type
92
+ updateField('typeName', 'string');
93
+ }
94
+ }, [resourceType, updateField]);
95
+ const getTypeNameDescription = (typeName) => {
96
+ switch (typeName) {
97
+ case 'string':
98
+ return 'Simple text content (default)';
99
+ case 'object':
100
+ return 'Complex structured data (JSON objects)';
101
+ case 'array':
102
+ return 'List of values or objects';
103
+ case 'number':
104
+ return 'Numeric values';
105
+ case 'boolean':
106
+ return 'True/false values';
107
+ case 'localizedString':
108
+ return 'Text content with localization support';
109
+ case 'config':
110
+ return 'Configuration settings and parameters';
111
+ case 'settings':
112
+ return 'User or application settings';
113
+ case 'permissions':
114
+ return 'Access control and permission data';
115
+ case 'template':
116
+ return 'Template content for rendering';
117
+ case 'content':
118
+ return 'Rich content (HTML, Markdown, etc.)';
119
+ case 'metadata':
120
+ return 'Descriptive information about resources';
121
+ default:
122
+ return 'Custom resource type';
123
+ }
124
+ };
125
+ return (React.createElement("div", { className: "fixed inset-0 bg-gray-600 bg-opacity-50 flex items-center justify-center z-50 p-4" },
126
+ React.createElement("div", { className: "bg-white rounded-lg shadow-xl max-w-2xl w-full h-full max-h-[calc(100vh-2rem)] flex flex-col" },
127
+ React.createElement("div", { className: "flex items-center justify-between p-6 border-b flex-shrink-0" },
128
+ React.createElement("h3", { className: "text-lg font-medium text-gray-900" }, resourceType ? 'Edit Resource Type' : 'Add Resource Type'),
129
+ React.createElement("button", { onClick: onCancel, className: "text-gray-400 hover:text-gray-600" },
130
+ React.createElement(XMarkIcon, { className: "w-6 h-6" }))),
131
+ React.createElement("div", { className: "p-6 space-y-6 overflow-y-auto flex-1 min-h-0" },
132
+ React.createElement("div", null,
133
+ React.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "Name *"),
134
+ React.createElement("input", { type: "text", value: formData.name, onChange: (e) => updateField('name', e.target.value), className: `w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${errors.name ? 'border-red-300' : 'border-gray-300'}`, placeholder: "Enter resource type name (e.g., 'userSettings', 'errorMessages')" }),
135
+ errors.name && React.createElement("p", { className: "mt-1 text-sm text-red-600" }, errors.name),
136
+ React.createElement("p", { className: "mt-1 text-xs text-gray-500" }, "A descriptive name for this type of resource. This will be used to categorize and identify resources.")),
137
+ React.createElement("div", null,
138
+ React.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-3" }, "Type Name Configuration *"),
139
+ React.createElement("div", { className: "space-y-3" },
140
+ React.createElement("div", { className: "flex items-center" },
141
+ React.createElement("input", { type: "radio", id: "useCommonType", name: "typeNameMode", checked: !useCustomTypeName, onChange: () => handleTypeNameModeChange(false), className: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300" }),
142
+ React.createElement("label", { htmlFor: "useCommonType", className: "ml-2 text-sm text-gray-700" }, "Use common type name")),
143
+ !useCustomTypeName && (React.createElement("div", { className: "ml-6" },
144
+ React.createElement("select", { value: formData.typeName, onChange: (e) => updateField('typeName', e.target.value), className: `w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${errors.typeName ? 'border-red-300' : 'border-gray-300'}` }, COMMON_TYPE_NAMES.map((type) => (React.createElement("option", { key: type, value: type }, type)))),
145
+ React.createElement("p", { className: "mt-1 text-xs text-gray-600" }, getTypeNameDescription(formData.typeName)))),
146
+ React.createElement("div", { className: "flex items-center" },
147
+ React.createElement("input", { type: "radio", id: "useCustomType", name: "typeNameMode", checked: useCustomTypeName, onChange: () => handleTypeNameModeChange(true), className: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300" }),
148
+ React.createElement("label", { htmlFor: "useCustomType", className: "ml-2 text-sm text-gray-700" }, "Define custom type name")),
149
+ useCustomTypeName && (React.createElement("div", { className: "ml-6" },
150
+ React.createElement("input", { type: "text", value: formData.typeName, onChange: (e) => updateField('typeName', e.target.value), className: `w-full px-3 py-2 border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-blue-500 ${errors.typeName ? 'border-red-300' : 'border-gray-300'}`, placeholder: "Enter custom type name" }),
151
+ React.createElement("p", { className: "mt-1 text-xs text-gray-500" }, "Define a custom type name for specialized resource handling")))),
152
+ errors.typeName && React.createElement("p", { className: "mt-1 text-sm text-red-600" }, errors.typeName)),
153
+ React.createElement("div", { className: "p-4 bg-blue-50 rounded-lg" },
154
+ React.createElement("div", { className: "flex items-start" },
155
+ React.createElement(InformationCircleIcon, { className: "w-5 h-5 text-blue-400 mt-0.5 mr-3 flex-shrink-0" }),
156
+ React.createElement("div", { className: "text-sm text-blue-800" },
157
+ React.createElement("h4", { className: "font-medium mb-2" }, "About Resource Types"),
158
+ React.createElement("div", { className: "space-y-2" },
159
+ React.createElement("p", null, "Resource types define how resources are categorized and processed in your application."),
160
+ React.createElement("ul", { className: "list-disc list-inside space-y-1 ml-2" },
161
+ React.createElement("li", null,
162
+ React.createElement("strong", null, "Name:"),
163
+ " A human-readable identifier for grouping resources"),
164
+ React.createElement("li", null,
165
+ React.createElement("strong", null, "Type Name:"),
166
+ " Determines how the resource data is interpreted and validated"),
167
+ React.createElement("li", null, "Common types (string, object, array) provide built-in processing"),
168
+ React.createElement("li", null, "Custom types allow specialized handling for domain-specific data")))))),
169
+ React.createElement("div", { className: "p-4 bg-gray-50 rounded-lg" },
170
+ React.createElement("h4", { className: "font-medium text-gray-900 mb-2" }, "Preview"),
171
+ React.createElement("div", { className: "text-sm text-gray-600" },
172
+ React.createElement("p", null,
173
+ React.createElement("span", { className: "font-medium" }, "Resource Type:"),
174
+ " ",
175
+ formData.name || '(name not set)'),
176
+ React.createElement("p", null,
177
+ React.createElement("span", { className: "font-medium" }, "Type Name:"),
178
+ " ",
179
+ formData.typeName),
180
+ React.createElement("p", null,
181
+ React.createElement("span", { className: "font-medium" }, "Description:"),
182
+ " ",
183
+ getTypeNameDescription(formData.typeName))))),
184
+ React.createElement("div", { className: "flex justify-end space-x-3 px-6 py-4 border-t bg-gray-50 flex-shrink-0" },
185
+ React.createElement("button", { onClick: onCancel, 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" }, "Cancel"),
186
+ React.createElement("button", { onClick: handleSave, 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" }, resourceType ? 'Save Changes' : 'Add Resource Type')))));
187
+ };
188
+ //# sourceMappingURL=ResourceTypeEditForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceTypeEditForm.js","sourceRoot":"","sources":["../../../src/components/forms/ResourceTypeEditForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAe/E,MAAM,iBAAiB,GAAG;IACxB,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,SAAS;IACT,iBAAiB;IACjB,QAAQ;IACR,UAAU;IACV,aAAa;IACb,UAAU;IACV,SAAS;IACT,UAAU;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAwC,CAAC,EACxE,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,aAAa,GAAG,EAAE,EACnB,EAAE,EAAE;IACH,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE;QACtD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO;gBACL,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,QAAQ,EAAE,YAAY,CAAC,QAAQ;aAChC,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,QAAQ;SACnB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC9D,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,aAAa;IACb,MAAM,YAAY,GAAG,WAAW,CAAC,GAAY,EAAE;QAC7C,MAAM,SAAS,GAA2B,EAAE,CAAC;QAE7C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1B,SAAS,CAAC,IAAI,GAAG,kBAAkB,CAAC;QACtC,CAAC;aAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,IAAI,EAAE,CAAC;YACzF,SAAS,CAAC,IAAI,GAAG,qBAAqB,CAAC;QACzC,CAAC;aAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,SAAS,CAAC,IAAI,GAAG,kFAAkF,CAAC;QACtG,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9B,SAAS,CAAC,QAAQ,GAAG,uBAAuB,CAAC;QAC/C,CAAC;aAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9D,SAAS,CAAC,QAAQ;gBAChB,uFAAuF,CAAC;QAC5F,CAAC;QAED,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAC7C,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;IAElD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,CAAC,YAAY,EAAE;YAAE,OAAO;QAE5B,MAAM,MAAM,GAA6C;YACvD,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC;IACjB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAErC,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,KAAqB,EAAE,KAAU,EAAE,EAAE;QACpC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YACnB,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;YAE5C,gFAAgF;YAChF,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,YAAY,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;gBACnE,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CACvC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC/D,CAAC;gBACF,IAAI,UAAU,EAAE,CAAC;oBACf,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,QAAQ,GAAG,SAAS,IAAI,QAAQ,CAAC;gBAC3C,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAC1C,CAAC;IAEF,MAAM,wBAAwB,GAAG,WAAW,CAC1C,CAAC,SAAkB,EAAE,EAAE;QACrB,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;YAChC,yBAAyB;YACzB,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,EACD,CAAC,YAAY,EAAE,WAAW,CAAC,CAC5B,CAAC;IAEF,MAAM,sBAAsB,GAAG,CAAC,QAAgB,EAAU,EAAE;QAC1D,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,OAAO,+BAA+B,CAAC;YACzC,KAAK,QAAQ;gBACX,OAAO,wCAAwC,CAAC;YAClD,KAAK,OAAO;gBACV,OAAO,2BAA2B,CAAC;YACrC,KAAK,QAAQ;gBACX,OAAO,gBAAgB,CAAC;YAC1B,KAAK,SAAS;gBACZ,OAAO,mBAAmB,CAAC;YAC7B,KAAK,iBAAiB;gBACpB,OAAO,wCAAwC,CAAC;YAClD,KAAK,QAAQ;gBACX,OAAO,uCAAuC,CAAC;YACjD,KAAK,UAAU;gBACb,OAAO,8BAA8B,CAAC;YACxC,KAAK,aAAa;gBAChB,OAAO,oCAAoC,CAAC;YAC9C,KAAK,UAAU;gBACb,OAAO,gCAAgC,CAAC;YAC1C,KAAK,SAAS;gBACZ,OAAO,qCAAqC,CAAC;YAC/C,KAAK,UAAU;gBACb,OAAO,yCAAyC,CAAC;YACnD;gBACE,OAAO,sBAAsB,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAC,mFAAmF;QAChG,6BAAK,SAAS,EAAC,8FAA8F;YAE3G,6BAAK,SAAS,EAAC,8DAA8D;gBAC3E,4BAAI,SAAS,EAAC,mCAAmC,IAC9C,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CACvD;gBACL,gCAAQ,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAC,mCAAmC;oBACtE,oBAAC,SAAS,IAAC,SAAS,EAAC,SAAS,GAAG,CAC1B,CACL;YAGN,6BAAK,SAAS,EAAC,8CAA8C;gBAE3D;oBACE,+BAAO,SAAS,EAAC,8CAA8C,aAAe;oBAC9E,+BACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,QAAQ,CAAC,IAAI,EACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACpD,SAAS,EAAE,oGACT,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBACnC,EAAE,EACF,WAAW,EAAC,kEAAkE,GAC9E;oBACD,MAAM,CAAC,IAAI,IAAI,2BAAG,SAAS,EAAC,2BAA2B,IAAE,MAAM,CAAC,IAAI,CAAK;oBAC1E,2BAAG,SAAS,EAAC,4BAA4B,4GAGrC,CACA;gBAGN;oBACE,+BAAO,SAAS,EAAC,8CAA8C,gCAAkC;oBAEjG,6BAAK,SAAS,EAAC,WAAW;wBACxB,6BAAK,SAAS,EAAC,mBAAmB;4BAChC,+BACE,IAAI,EAAC,OAAO,EACZ,EAAE,EAAC,eAAe,EAClB,IAAI,EAAC,cAAc,EACnB,OAAO,EAAE,CAAC,iBAAiB,EAC3B,QAAQ,EAAE,GAAG,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAC/C,SAAS,EAAC,2DAA2D,GACrE;4BACF,+BAAO,OAAO,EAAC,eAAe,EAAC,SAAS,EAAC,4BAA4B,2BAE7D,CACJ;wBAEL,CAAC,iBAAiB,IAAI,CACrB,6BAAK,SAAS,EAAC,MAAM;4BACnB,gCACE,KAAK,EAAE,QAAQ,CAAC,QAAQ,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxD,SAAS,EAAE,oGACT,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBACvC,EAAE,IAED,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC/B,gCAAQ,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,IAC3B,IAAI,CACE,CACV,CAAC,CACK;4BACT,2BAAG,SAAS,EAAC,4BAA4B,IAAE,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAK,CACrF,CACP;wBAED,6BAAK,SAAS,EAAC,mBAAmB;4BAChC,+BACE,IAAI,EAAC,OAAO,EACZ,EAAE,EAAC,eAAe,EAClB,IAAI,EAAC,cAAc,EACnB,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,GAAG,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAC9C,SAAS,EAAC,2DAA2D,GACrE;4BACF,+BAAO,OAAO,EAAC,eAAe,EAAC,SAAS,EAAC,4BAA4B,8BAE7D,CACJ;wBAEL,iBAAiB,IAAI,CACpB,6BAAK,SAAS,EAAC,MAAM;4BACnB,+BACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,QAAQ,CAAC,QAAQ,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxD,SAAS,EAAE,oGACT,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBACvC,EAAE,EACF,WAAW,EAAC,wBAAwB,GACpC;4BACF,2BAAG,SAAS,EAAC,4BAA4B,kEAErC,CACA,CACP,CACG;oBAEL,MAAM,CAAC,QAAQ,IAAI,2BAAG,SAAS,EAAC,2BAA2B,IAAE,MAAM,CAAC,QAAQ,CAAK,CAC9E;gBAGN,6BAAK,SAAS,EAAC,2BAA2B;oBACxC,6BAAK,SAAS,EAAC,kBAAkB;wBAC/B,oBAAC,qBAAqB,IAAC,SAAS,EAAC,iDAAiD,GAAG;wBACrF,6BAAK,SAAS,EAAC,uBAAuB;4BACpC,4BAAI,SAAS,EAAC,kBAAkB,2BAA0B;4BAC1D,6BAAK,SAAS,EAAC,WAAW;gCACxB,wHAEI;gCACJ,4BAAI,SAAS,EAAC,sCAAsC;oCAClD;wCACE,4CAAsB;8FACnB;oCACL;wCACE,iDAA2B;yGAExB;oCACL,mGAAyE;oCACzE,mGAAyE,CACtE,CACD,CACF,CACF,CACF;gBAGN,6BAAK,SAAS,EAAC,2BAA2B;oBACxC,4BAAI,SAAS,EAAC,gCAAgC,cAAa;oBAC3D,6BAAK,SAAS,EAAC,uBAAuB;wBACpC;4BACE,8BAAM,SAAS,EAAC,aAAa,qBAAsB;;4BAAE,QAAQ,CAAC,IAAI,IAAI,gBAAgB,CACpF;wBACJ;4BACE,8BAAM,SAAS,EAAC,aAAa,iBAAkB;;4BAAE,QAAQ,CAAC,QAAQ,CAChE;wBACJ;4BACE,8BAAM,SAAS,EAAC,aAAa,mBAAoB;;4BAAE,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC1F,CACA,CACF,CACF;YAGN,6BAAK,SAAS,EAAC,wEAAwE;gBACrF,gCACE,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,iLAAiL,aAGpL;gBACT,gCACE,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,qLAAqL,IAE9L,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,mBAAmB,CAC7C,CACL,CACF,CACF,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React, { useState, useCallback } from 'react';\nimport { XMarkIcon, InformationCircleIcon } from '@heroicons/react/24/outline';\nimport { ResourceTypes } from '@fgv/ts-res';\n\nexport interface ResourceTypeEditFormProps {\n resourceType?: ResourceTypes.Config.IResourceTypeConfig;\n onSave: (resourceType: ResourceTypes.Config.IResourceTypeConfig) => void;\n onCancel: () => void;\n existingNames?: string[];\n}\n\ninterface FormData {\n name: string;\n typeName: string;\n}\n\nconst COMMON_TYPE_NAMES = [\n 'string',\n 'object',\n 'array',\n 'number',\n 'boolean',\n 'localizedString',\n 'config',\n 'settings',\n 'permissions',\n 'template',\n 'content',\n 'metadata'\n];\n\nexport const ResourceTypeEditForm: React.FC<ResourceTypeEditFormProps> = ({\n resourceType,\n onSave,\n onCancel,\n existingNames = []\n}) => {\n const [formData, setFormData] = useState<FormData>(() => {\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 [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 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 (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(formData.name)) {\n newErrors.name = 'Name must start with a letter and contain only letters, numbers, and underscores';\n }\n\n if (!formData.typeName.trim()) {\n newErrors.typeName = 'Type name is required';\n } else if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(formData.typeName)) {\n newErrors.typeName =\n 'Type name must start with a letter and contain only letters, numbers, and underscores';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n }, [formData, existingNames, resourceType?.name]);\n\n const handleSave = useCallback(() => {\n if (!validateForm()) return;\n\n const result: ResourceTypes.Config.IResourceTypeConfig = {\n name: formData.name,\n typeName: formData.typeName\n };\n\n onSave(result);\n }, [formData, validateForm, onSave]);\n\n const updateField = useCallback(\n (field: keyof FormData, value: any) => {\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 } else {\n updated.typeName = cleanName || 'string';\n }\n }\n\n return updated;\n });\n\n if (errors[field]) {\n setErrors((prev) => ({ ...prev, [field]: '' }));\n }\n },\n [errors, resourceType, useCustomTypeName]\n );\n\n const handleTypeNameModeChange = useCallback(\n (useCustom: boolean) => {\n setUseCustomTypeName(useCustom);\n if (!useCustom && !resourceType) {\n // Reset to a common type\n updateField('typeName', 'string');\n }\n },\n [resourceType, updateField]\n );\n\n const getTypeNameDescription = (typeName: string): string => {\n switch (typeName) {\n case 'string':\n return 'Simple text content (default)';\n case 'object':\n return 'Complex structured data (JSON objects)';\n case 'array':\n return 'List of values or objects';\n case 'number':\n return 'Numeric values';\n case 'boolean':\n return 'True/false values';\n case 'localizedString':\n return 'Text content with localization support';\n case 'config':\n return 'Configuration settings and parameters';\n case 'settings':\n return 'User or application settings';\n case 'permissions':\n return 'Access control and permission data';\n case 'template':\n return 'Template content for rendering';\n case 'content':\n return 'Rich content (HTML, Markdown, etc.)';\n case 'metadata':\n return 'Descriptive information about resources';\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={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>\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={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 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\"\n >\n {resourceType ? 'Save Changes' : 'Add Resource Type'}\n </button>\n </div>\n </div>\n </div>\n );\n};\n"]}
@@ -0,0 +1,9 @@
1
+ export { QualifierTypeEditForm } from './QualifierTypeEditForm';
2
+ export type { QualifierTypeEditFormProps } from './QualifierTypeEditForm';
3
+ export { QualifierEditForm } from './QualifierEditForm';
4
+ export type { QualifierEditFormProps } from './QualifierEditForm';
5
+ export { ResourceTypeEditForm } from './ResourceTypeEditForm';
6
+ export type { ResourceTypeEditFormProps } from './ResourceTypeEditForm';
7
+ export { HierarchyEditor } from './HierarchyEditor';
8
+ export type { HierarchyEditorProps } from './HierarchyEditor';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -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,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAE1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { QualifierTypeEditForm } from './QualifierTypeEditForm';
2
+ export { QualifierEditForm } from './QualifierEditForm';
3
+ export { ResourceTypeEditForm } from './ResourceTypeEditForm';
4
+ export { HierarchyEditor } from './HierarchyEditor';
5
+ //# sourceMappingURL=index.js.map
@@ -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,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 { QualifierTypeEditFormProps } from './QualifierTypeEditForm';\n\nexport { QualifierEditForm } from './QualifierEditForm';\nexport type { QualifierEditFormProps } from './QualifierEditForm';\n\nexport { ResourceTypeEditForm } from './ResourceTypeEditForm';\nexport type { ResourceTypeEditFormProps } from './ResourceTypeEditForm';\n\nexport { HierarchyEditor } from './HierarchyEditor';\nexport type { HierarchyEditorProps } from './HierarchyEditor';\n"]}
@@ -0,0 +1,14 @@
1
+ import React, { ReactNode } from 'react';
2
+ import { Config } from '@fgv/ts-res';
3
+ import { OrchestratorState, OrchestratorActions } from '../../types';
4
+ export interface ResourceOrchestratorProps {
5
+ children: (orchestrator: {
6
+ state: OrchestratorState;
7
+ actions: OrchestratorActions;
8
+ }) => ReactNode;
9
+ initialConfiguration?: Config.Model.ISystemConfiguration;
10
+ onStateChange?: (state: Partial<OrchestratorState>) => void;
11
+ }
12
+ export declare const ResourceOrchestrator: React.FC<ResourceOrchestratorProps>;
13
+ export default ResourceOrchestrator;
14
+ //# sourceMappingURL=ResourceOrchestrator.d.ts.map
@@ -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,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EAOpB,MAAM,aAAa,CAAC;AAcrB,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,CAAC,YAAY,EAAE;QAAE,KAAK,EAAE,iBAAiB,CAAC;QAAC,OAAO,EAAE,mBAAmB,CAAA;KAAE,KAAK,SAAS,CAAC;IAClG,oBAAoB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACzD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CAC7D;AAED,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAiVpE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}