@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.
- package/.rush/temp/03c8b056281d9db0a97d8a6e25eea798a160d393.tar.log +271 -0
- package/.rush/temp/chunked-rush-logs/ts-res-ui-components.build.chunks.jsonl +9 -0
- package/.rush/temp/operation/build/all.log +9 -0
- package/.rush/temp/operation/build/log-chunks.jsonl +9 -0
- package/.rush/temp/operation/build/state.json +3 -0
- package/.rush/temp/shrinkwrap-deps.json +1111 -0
- package/README.md +18 -0
- package/REFACTORING_PLAN.md +171 -0
- package/config/jest.config.json +16 -0
- package/config/jest.setup.js +64 -0
- package/config/rig.json +16 -0
- package/lib/components/common/QualifierContextControl.d.ts +14 -0
- package/lib/components/common/QualifierContextControl.d.ts.map +1 -0
- package/lib/components/common/QualifierContextControl.js +78 -0
- package/lib/components/common/QualifierContextControl.js.map +1 -0
- package/lib/components/common/ResourceListView.d.ts +11 -0
- package/lib/components/common/ResourceListView.d.ts.map +1 -0
- package/lib/components/common/ResourceListView.js +20 -0
- package/lib/components/common/ResourceListView.js.map +1 -0
- package/lib/components/common/ResourceTreeView.d.ts +12 -0
- package/lib/components/common/ResourceTreeView.d.ts.map +1 -0
- package/lib/components/common/ResourceTreeView.js +162 -0
- package/lib/components/common/ResourceTreeView.js.map +1 -0
- package/lib/components/forms/HierarchyEditor.d.ts +10 -0
- package/lib/components/forms/HierarchyEditor.d.ts.map +1 -0
- package/lib/components/forms/HierarchyEditor.js +106 -0
- package/lib/components/forms/HierarchyEditor.js.map +1 -0
- package/lib/components/forms/QualifierEditForm.d.ts +11 -0
- package/lib/components/forms/QualifierEditForm.d.ts.map +1 -0
- package/lib/components/forms/QualifierEditForm.js +181 -0
- package/lib/components/forms/QualifierEditForm.js.map +1 -0
- package/lib/components/forms/QualifierTypeEditForm.d.ts +10 -0
- package/lib/components/forms/QualifierTypeEditForm.d.ts.map +1 -0
- package/lib/components/forms/QualifierTypeEditForm.js +172 -0
- package/lib/components/forms/QualifierTypeEditForm.js.map +1 -0
- package/lib/components/forms/ResourceTypeEditForm.d.ts +10 -0
- package/lib/components/forms/ResourceTypeEditForm.d.ts.map +1 -0
- package/lib/components/forms/ResourceTypeEditForm.js +188 -0
- package/lib/components/forms/ResourceTypeEditForm.js.map +1 -0
- package/lib/components/forms/index.d.ts +9 -0
- package/lib/components/forms/index.d.ts.map +1 -0
- package/lib/components/forms/index.js +5 -0
- package/lib/components/forms/index.js.map +1 -0
- package/lib/components/orchestrator/ResourceOrchestrator.d.ts +14 -0
- package/lib/components/orchestrator/ResourceOrchestrator.d.ts.map +1 -0
- package/lib/components/orchestrator/ResourceOrchestrator.js +278 -0
- package/lib/components/orchestrator/ResourceOrchestrator.js.map +1 -0
- package/lib/components/views/CompiledView/index.d.ts +5 -0
- package/lib/components/views/CompiledView/index.d.ts.map +1 -0
- package/lib/components/views/CompiledView/index.js +595 -0
- package/lib/components/views/CompiledView/index.js.map +1 -0
- package/lib/components/views/ConfigurationView/index.d.ts +5 -0
- package/lib/components/views/ConfigurationView/index.d.ts.map +1 -0
- package/lib/components/views/ConfigurationView/index.js +363 -0
- package/lib/components/views/ConfigurationView/index.js.map +1 -0
- package/lib/components/views/FilterView/index.d.ts +5 -0
- package/lib/components/views/FilterView/index.d.ts.map +1 -0
- package/lib/components/views/FilterView/index.js +463 -0
- package/lib/components/views/FilterView/index.js.map +1 -0
- package/lib/components/views/ImportView/index.d.ts +5 -0
- package/lib/components/views/ImportView/index.d.ts.map +1 -0
- package/lib/components/views/ImportView/index.js +514 -0
- package/lib/components/views/ImportView/index.js.map +1 -0
- package/lib/components/views/ResolutionView/EditableJsonView.d.ts +21 -0
- package/lib/components/views/ResolutionView/EditableJsonView.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/EditableJsonView.js +109 -0
- package/lib/components/views/ResolutionView/EditableJsonView.js.map +1 -0
- package/lib/components/views/ResolutionView/ResolutionEditControls.d.ts +19 -0
- package/lib/components/views/ResolutionView/ResolutionEditControls.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/ResolutionEditControls.js +82 -0
- package/lib/components/views/ResolutionView/ResolutionEditControls.js.map +1 -0
- package/lib/components/views/ResolutionView/index.d.ts +5 -0
- package/lib/components/views/ResolutionView/index.d.ts.map +1 -0
- package/lib/components/views/ResolutionView/index.js +255 -0
- package/lib/components/views/ResolutionView/index.js.map +1 -0
- package/lib/components/views/SourceView/index.d.ts +5 -0
- package/lib/components/views/SourceView/index.d.ts.map +1 -0
- package/lib/components/views/SourceView/index.js +316 -0
- package/lib/components/views/SourceView/index.js.map +1 -0
- package/lib/components/views/ZipLoaderView/index.d.ts +5 -0
- package/lib/components/views/ZipLoaderView/index.d.ts.map +1 -0
- package/lib/components/views/ZipLoaderView/index.js +313 -0
- package/lib/components/views/ZipLoaderView/index.js.map +1 -0
- package/lib/hooks/useConfigurationState.d.ts +46 -0
- package/lib/hooks/useConfigurationState.d.ts.map +1 -0
- package/lib/hooks/useConfigurationState.js +239 -0
- package/lib/hooks/useConfigurationState.js.map +1 -0
- package/lib/hooks/useFilterState.d.ts +7 -0
- package/lib/hooks/useFilterState.d.ts.map +1 -0
- package/lib/hooks/useFilterState.js +80 -0
- package/lib/hooks/useFilterState.js.map +1 -0
- package/lib/hooks/useResolutionState.d.ts +8 -0
- package/lib/hooks/useResolutionState.d.ts.map +1 -0
- package/lib/hooks/useResolutionState.js +253 -0
- package/lib/hooks/useResolutionState.js.map +1 -0
- package/lib/hooks/useResourceData.d.ts +19 -0
- package/lib/hooks/useResourceData.d.ts.map +1 -0
- package/lib/hooks/useResourceData.js +368 -0
- package/lib/hooks/useResourceData.js.map +1 -0
- package/lib/hooks/useViewState.d.ts +10 -0
- package/lib/hooks/useViewState.d.ts.map +1 -0
- package/lib/hooks/useViewState.js +29 -0
- package/lib/hooks/useViewState.js.map +1 -0
- package/lib/index.d.ts +27 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +34 -0
- package/lib/index.js.map +1 -0
- package/lib/test/helpers/testDataLoader.d.ts +37 -0
- package/lib/test/helpers/testDataLoader.d.ts.map +1 -0
- package/lib/test/helpers/testDataLoader.js +171 -0
- package/lib/test/helpers/testDataLoader.js.map +1 -0
- package/lib/test/unit/utils/configurationUtils.test.d.ts +2 -0
- package/lib/test/unit/utils/configurationUtils.test.d.ts.map +1 -0
- package/lib/test/unit/utils/configurationUtils.test.js +497 -0
- package/lib/test/unit/utils/configurationUtils.test.js.map +1 -0
- package/lib/test/unit/utils/fileProcessing.test.d.ts +2 -0
- package/lib/test/unit/utils/fileProcessing.test.d.ts.map +1 -0
- package/lib/test/unit/utils/fileProcessing.test.js +321 -0
- package/lib/test/unit/utils/fileProcessing.test.js.map +1 -0
- package/lib/test/unit/utils/filterResources.test.d.ts +2 -0
- package/lib/test/unit/utils/filterResources.test.d.ts.map +1 -0
- package/lib/test/unit/utils/filterResources.test.js +403 -0
- package/lib/test/unit/utils/filterResources.test.js.map +1 -0
- package/lib/test/unit/utils/resolutionEditing.test.d.ts +2 -0
- package/lib/test/unit/utils/resolutionEditing.test.d.ts.map +1 -0
- package/lib/test/unit/utils/resolutionEditing.test.js +439 -0
- package/lib/test/unit/utils/resolutionEditing.test.js.map +1 -0
- package/lib/test/unit/utils/resolutionUtils.test.d.ts +2 -0
- package/lib/test/unit/utils/resolutionUtils.test.d.ts.map +1 -0
- package/lib/test/unit/utils/resolutionUtils.test.js +397 -0
- package/lib/test/unit/utils/resolutionUtils.test.js.map +1 -0
- package/lib/test/unit/utils/tsResIntegration.test.d.ts +2 -0
- package/lib/test/unit/utils/tsResIntegration.test.d.ts.map +1 -0
- package/lib/test/unit/utils/tsResIntegration.test.js +376 -0
- package/lib/test/unit/utils/tsResIntegration.test.js.map +1 -0
- package/lib/types/index.d.ts +251 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +2 -0
- package/lib/types/index.js.map +1 -0
- package/lib/utils/configurationUtils.d.ts +74 -0
- package/lib/utils/configurationUtils.d.ts.map +1 -0
- package/lib/utils/configurationUtils.js +359 -0
- package/lib/utils/configurationUtils.js.map +1 -0
- package/lib/utils/fileProcessing.d.ts +18 -0
- package/lib/utils/fileProcessing.d.ts.map +1 -0
- package/lib/utils/fileProcessing.js +142 -0
- package/lib/utils/fileProcessing.js.map +1 -0
- package/lib/utils/filterResources.d.ts +38 -0
- package/lib/utils/filterResources.d.ts.map +1 -0
- package/lib/utils/filterResources.js +153 -0
- package/lib/utils/filterResources.js.map +1 -0
- package/lib/utils/resolutionEditing.d.ts +58 -0
- package/lib/utils/resolutionEditing.d.ts.map +1 -0
- package/lib/utils/resolutionEditing.js +246 -0
- package/lib/utils/resolutionEditing.js.map +1 -0
- package/lib/utils/resolutionUtils.d.ts +28 -0
- package/lib/utils/resolutionUtils.d.ts.map +1 -0
- package/lib/utils/resolutionUtils.js +216 -0
- package/lib/utils/resolutionUtils.js.map +1 -0
- package/lib/utils/tsResIntegration.d.ts +71 -0
- package/lib/utils/tsResIntegration.d.ts.map +1 -0
- package/lib/utils/tsResIntegration.js +294 -0
- package/lib/utils/tsResIntegration.js.map +1 -0
- package/lib/utils/zipLoader/browserZipLoader.d.ts +48 -0
- package/lib/utils/zipLoader/browserZipLoader.d.ts.map +1 -0
- package/lib/utils/zipLoader/browserZipLoader.js +247 -0
- package/lib/utils/zipLoader/browserZipLoader.js.map +1 -0
- package/lib/utils/zipLoader/index.d.ts +8 -0
- package/lib/utils/zipLoader/index.d.ts.map +1 -0
- package/lib/utils/zipLoader/index.js +13 -0
- package/lib/utils/zipLoader/index.js.map +1 -0
- package/lib/utils/zipLoader/nodeZipBuilder.d.ts +55 -0
- package/lib/utils/zipLoader/nodeZipBuilder.d.ts.map +1 -0
- package/lib/utils/zipLoader/nodeZipBuilder.js +98 -0
- package/lib/utils/zipLoader/nodeZipBuilder.js.map +1 -0
- package/lib/utils/zipLoader/types.d.ts +139 -0
- package/lib/utils/zipLoader/types.d.ts.map +1 -0
- package/lib/utils/zipLoader/types.js +2 -0
- package/lib/utils/zipLoader/types.js.map +1 -0
- package/lib/utils/zipLoader/zipUtils.d.ts +53 -0
- package/lib/utils/zipLoader/zipUtils.d.ts.map +1 -0
- package/lib/utils/zipLoader/zipUtils.js +229 -0
- package/lib/utils/zipLoader/zipUtils.js.map +1 -0
- package/package.json +69 -0
- package/rush-logs/ts-res-ui-components.build.cache.log +3 -0
- package/rush-logs/ts-res-ui-components.build.log +9 -0
- package/src/components/common/QualifierContextControl.tsx +151 -0
- package/src/components/common/ResourceListView.tsx +63 -0
- package/src/components/common/ResourceTreeView.tsx +271 -0
- package/src/components/forms/HierarchyEditor.tsx +204 -0
- package/src/components/forms/QualifierEditForm.tsx +355 -0
- package/src/components/forms/QualifierTypeEditForm.tsx +347 -0
- package/src/components/forms/ResourceTypeEditForm.tsx +331 -0
- package/src/components/forms/index.ts +11 -0
- package/src/components/orchestrator/ResourceOrchestrator.tsx +372 -0
- package/src/components/views/CompiledView/index.tsx +922 -0
- package/src/components/views/ConfigurationView/index.tsx +800 -0
- package/src/components/views/FilterView/index.tsx +825 -0
- package/src/components/views/ImportView/index.tsx +717 -0
- package/src/components/views/ResolutionView/EditableJsonView.tsx +214 -0
- package/src/components/views/ResolutionView/ResolutionEditControls.tsx +170 -0
- package/src/components/views/ResolutionView/index.tsx +591 -0
- package/src/components/views/SourceView/index.tsx +536 -0
- package/src/components/views/ZipLoaderView/index.tsx +485 -0
- package/src/hooks/useConfigurationState.ts +374 -0
- package/src/hooks/useFilterState.ts +97 -0
- package/src/hooks/useResolutionState.ts +355 -0
- package/src/hooks/useResourceData.ts +467 -0
- package/src/hooks/useViewState.ts +44 -0
- package/src/index.ts +45 -0
- package/src/test/helpers/testDataLoader.ts +195 -0
- package/src/test/unit/utils/configurationUtils.test.ts +630 -0
- package/src/test/unit/utils/fileProcessing.test.ts +391 -0
- package/src/test/unit/utils/filterResources.test.ts +574 -0
- package/src/test/unit/utils/resolutionEditing.test.ts +556 -0
- package/src/test/unit/utils/resolutionUtils.test.ts +521 -0
- package/src/test/unit/utils/tsResIntegration.test.ts +433 -0
- package/src/types/index.ts +322 -0
- package/src/utils/configurationUtils.ts +424 -0
- package/src/utils/fileProcessing.ts +160 -0
- package/src/utils/filterResources.ts +206 -0
- package/src/utils/resolutionEditing.ts +319 -0
- package/src/utils/resolutionUtils.ts +289 -0
- package/src/utils/tsResIntegration.ts +440 -0
- package/src/utils/zipLoader/browserZipLoader.ts +319 -0
- package/src/utils/zipLoader/index.ts +26 -0
- package/src/utils/zipLoader/nodeZipBuilder.ts +153 -0
- package/src/utils/zipLoader/types.ts +175 -0
- package/src/utils/zipLoader/zipUtils.ts +266 -0
- package/temp/build/typescript/ts_gZid87Hu.json +1 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import React, { useState, useCallback, useRef } from 'react';
|
|
2
|
+
import { DocumentArrowDownIcon, FolderOpenIcon, CheckCircleIcon, ExclamationTriangleIcon, InformationCircleIcon, ArrowPathIcon } from '@heroicons/react/24/outline';
|
|
3
|
+
import { createBrowserZipLoader, formatFileSize, isZipFile } from '../../../utils/zipLoader';
|
|
4
|
+
export const ZipLoaderView = ({ zipFileUrl, zipPath, onImport, onConfigurationLoad, onLoadComplete, onMessage, className = '' }) => {
|
|
5
|
+
const [loadingState, setLoadingState] = useState({
|
|
6
|
+
isLoading: false,
|
|
7
|
+
stage: null,
|
|
8
|
+
progress: 0,
|
|
9
|
+
message: ''
|
|
10
|
+
});
|
|
11
|
+
const [loadedState, setLoadedState] = useState({
|
|
12
|
+
result: null,
|
|
13
|
+
error: null,
|
|
14
|
+
fileName: null,
|
|
15
|
+
fileSize: null
|
|
16
|
+
});
|
|
17
|
+
const fileInputRef = useRef(null);
|
|
18
|
+
const handleDragOver = useCallback((e) => {
|
|
19
|
+
e.preventDefault();
|
|
20
|
+
e.stopPropagation();
|
|
21
|
+
}, []);
|
|
22
|
+
// Load ZIP file with progress tracking
|
|
23
|
+
const loadZipFileInternal = useCallback(async (file) => {
|
|
24
|
+
setLoadingState({
|
|
25
|
+
isLoading: true,
|
|
26
|
+
stage: 'reading-file',
|
|
27
|
+
progress: 0,
|
|
28
|
+
message: 'Starting to load ZIP file...'
|
|
29
|
+
});
|
|
30
|
+
setLoadedState({
|
|
31
|
+
result: null,
|
|
32
|
+
error: null,
|
|
33
|
+
fileName: file.name,
|
|
34
|
+
fileSize: file.size
|
|
35
|
+
});
|
|
36
|
+
const options = {
|
|
37
|
+
autoApplyConfig: false,
|
|
38
|
+
autoProcessResources: false
|
|
39
|
+
};
|
|
40
|
+
const progressCallback = (stage, progress, message) => {
|
|
41
|
+
setLoadingState({
|
|
42
|
+
isLoading: stage !== 'complete',
|
|
43
|
+
stage,
|
|
44
|
+
progress,
|
|
45
|
+
message: message || getStageMessage(stage)
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
const loader = createBrowserZipLoader();
|
|
49
|
+
const result = await loader.loadFromFile(file, options, progressCallback);
|
|
50
|
+
if (result.isSuccess()) {
|
|
51
|
+
const zipResult = result.value;
|
|
52
|
+
setLoadedState((prev) => ({
|
|
53
|
+
...prev,
|
|
54
|
+
result: zipResult,
|
|
55
|
+
error: null
|
|
56
|
+
}));
|
|
57
|
+
setLoadingState({
|
|
58
|
+
isLoading: false,
|
|
59
|
+
stage: 'complete',
|
|
60
|
+
progress: 100,
|
|
61
|
+
message: 'ZIP file loaded successfully'
|
|
62
|
+
});
|
|
63
|
+
onMessage?.('success', `Loaded ZIP file: ${file.name}`);
|
|
64
|
+
// Load configuration if found
|
|
65
|
+
if (zipResult.config) {
|
|
66
|
+
onConfigurationLoad?.(zipResult.config);
|
|
67
|
+
onMessage?.('info', `Configuration loaded from ZIP`);
|
|
68
|
+
}
|
|
69
|
+
// Import the raw data for processing by the orchestrator
|
|
70
|
+
if (zipResult.directory) {
|
|
71
|
+
onImport?.(zipResult.directory);
|
|
72
|
+
}
|
|
73
|
+
else if (zipResult.files.length > 0) {
|
|
74
|
+
onImport?.(zipResult.files);
|
|
75
|
+
}
|
|
76
|
+
onLoadComplete?.();
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const errorMessage = result.message;
|
|
80
|
+
setLoadedState((prev) => ({
|
|
81
|
+
...prev,
|
|
82
|
+
error: errorMessage,
|
|
83
|
+
result: null
|
|
84
|
+
}));
|
|
85
|
+
setLoadingState({
|
|
86
|
+
isLoading: false,
|
|
87
|
+
stage: null,
|
|
88
|
+
progress: 0,
|
|
89
|
+
message: ''
|
|
90
|
+
});
|
|
91
|
+
onMessage?.('error', `Failed to load ZIP: ${errorMessage}`);
|
|
92
|
+
}
|
|
93
|
+
}, [onMessage, onLoadComplete]);
|
|
94
|
+
// Load ZIP from URL
|
|
95
|
+
const loadFromUrl = useCallback(async (url) => {
|
|
96
|
+
setLoadingState({
|
|
97
|
+
isLoading: true,
|
|
98
|
+
stage: 'reading-file',
|
|
99
|
+
progress: 0,
|
|
100
|
+
message: 'Fetching ZIP from URL...'
|
|
101
|
+
});
|
|
102
|
+
setLoadedState({
|
|
103
|
+
result: null,
|
|
104
|
+
error: null,
|
|
105
|
+
fileName: url.split('/').pop() || 'remote.zip',
|
|
106
|
+
fileSize: null
|
|
107
|
+
});
|
|
108
|
+
const options = {
|
|
109
|
+
autoApplyConfig: false,
|
|
110
|
+
autoProcessResources: false
|
|
111
|
+
};
|
|
112
|
+
const progressCallback = (stage, progress, message) => {
|
|
113
|
+
setLoadingState({
|
|
114
|
+
isLoading: stage !== 'complete',
|
|
115
|
+
stage,
|
|
116
|
+
progress,
|
|
117
|
+
message: message || getStageMessage(stage)
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
const loader = createBrowserZipLoader();
|
|
121
|
+
const result = await loader.loadFromUrl(url, options, progressCallback);
|
|
122
|
+
if (result.isSuccess()) {
|
|
123
|
+
const zipResult = result.value;
|
|
124
|
+
setLoadedState((prev) => ({
|
|
125
|
+
...prev,
|
|
126
|
+
result: zipResult,
|
|
127
|
+
error: null
|
|
128
|
+
}));
|
|
129
|
+
setLoadingState({
|
|
130
|
+
isLoading: false,
|
|
131
|
+
stage: 'complete',
|
|
132
|
+
progress: 100,
|
|
133
|
+
message: 'ZIP file loaded successfully'
|
|
134
|
+
});
|
|
135
|
+
onMessage?.('success', `Loaded ZIP from URL: ${url}`);
|
|
136
|
+
// Load configuration if found
|
|
137
|
+
if (zipResult.config) {
|
|
138
|
+
onConfigurationLoad?.(zipResult.config);
|
|
139
|
+
onMessage?.('info', `Configuration loaded from ZIP`);
|
|
140
|
+
}
|
|
141
|
+
// Import the raw data for processing by the orchestrator
|
|
142
|
+
if (zipResult.directory) {
|
|
143
|
+
onImport?.(zipResult.directory);
|
|
144
|
+
}
|
|
145
|
+
else if (zipResult.files.length > 0) {
|
|
146
|
+
onImport?.(zipResult.files);
|
|
147
|
+
}
|
|
148
|
+
onLoadComplete?.();
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const errorMessage = result.message;
|
|
152
|
+
setLoadedState((prev) => ({
|
|
153
|
+
...prev,
|
|
154
|
+
error: errorMessage,
|
|
155
|
+
result: null
|
|
156
|
+
}));
|
|
157
|
+
setLoadingState({
|
|
158
|
+
isLoading: false,
|
|
159
|
+
stage: null,
|
|
160
|
+
progress: 0,
|
|
161
|
+
message: ''
|
|
162
|
+
});
|
|
163
|
+
onMessage?.('error', `Failed to load ZIP from URL: ${errorMessage}`);
|
|
164
|
+
}
|
|
165
|
+
}, [onMessage, onLoadComplete]);
|
|
166
|
+
// Handle file selection - now defined after loadZipFileInternal
|
|
167
|
+
const handleFileSelect = useCallback(async (files) => {
|
|
168
|
+
if (!files || files.length === 0)
|
|
169
|
+
return;
|
|
170
|
+
const file = files[0];
|
|
171
|
+
if (!isZipFile(file.name)) {
|
|
172
|
+
setLoadedState((prev) => ({
|
|
173
|
+
...prev,
|
|
174
|
+
error: `Selected file "${file.name}" is not a ZIP file`,
|
|
175
|
+
result: null
|
|
176
|
+
}));
|
|
177
|
+
onMessage?.('error', `File "${file.name}" is not a ZIP file`);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
await loadZipFileInternal(file);
|
|
181
|
+
}, [loadZipFileInternal, onMessage]);
|
|
182
|
+
// Handle drag and drop - now defined after handleFileSelect
|
|
183
|
+
const handleDrop = useCallback(async (e) => {
|
|
184
|
+
e.preventDefault();
|
|
185
|
+
e.stopPropagation();
|
|
186
|
+
const files = e.dataTransfer.files;
|
|
187
|
+
await handleFileSelect(files);
|
|
188
|
+
}, [handleFileSelect]);
|
|
189
|
+
// Auto-load from URL parameter
|
|
190
|
+
React.useEffect(() => {
|
|
191
|
+
if (zipFileUrl && !loadingState.isLoading && !loadedState.result && !loadedState.error) {
|
|
192
|
+
loadFromUrl(zipFileUrl);
|
|
193
|
+
}
|
|
194
|
+
}, [zipFileUrl, loadFromUrl, loadingState.isLoading, loadedState.result, loadedState.error]);
|
|
195
|
+
const getStageMessage = (stage) => {
|
|
196
|
+
switch (stage) {
|
|
197
|
+
case 'reading-file':
|
|
198
|
+
return 'Reading ZIP file...';
|
|
199
|
+
case 'parsing-zip':
|
|
200
|
+
return 'Parsing ZIP archive...';
|
|
201
|
+
case 'loading-manifest':
|
|
202
|
+
return 'Loading manifest...';
|
|
203
|
+
case 'loading-config':
|
|
204
|
+
return 'Loading configuration...';
|
|
205
|
+
case 'extracting-files':
|
|
206
|
+
return 'Extracting files...';
|
|
207
|
+
case 'processing-resources':
|
|
208
|
+
return 'Processing resources...';
|
|
209
|
+
case 'complete':
|
|
210
|
+
return 'Complete!';
|
|
211
|
+
default:
|
|
212
|
+
return 'Processing...';
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
const getStageIcon = (stage) => {
|
|
216
|
+
switch (stage) {
|
|
217
|
+
case 'complete':
|
|
218
|
+
return CheckCircleIcon;
|
|
219
|
+
case null:
|
|
220
|
+
return DocumentArrowDownIcon;
|
|
221
|
+
default:
|
|
222
|
+
return ArrowPathIcon;
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
return (React.createElement("div", { className: `p-6 ${className}` },
|
|
226
|
+
React.createElement("div", { className: "flex items-center space-x-3 mb-6" },
|
|
227
|
+
React.createElement(DocumentArrowDownIcon, { className: "h-8 w-8 text-blue-600" }),
|
|
228
|
+
React.createElement("h2", { className: "text-2xl font-bold text-gray-900" }, "ZIP Loader")),
|
|
229
|
+
React.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-6" },
|
|
230
|
+
zipFileUrl && !loadedState.result && !loadedState.error && (React.createElement("div", { className: "mb-6 p-4 bg-blue-50 rounded-lg" },
|
|
231
|
+
React.createElement("h3", { className: "text-lg font-medium text-blue-900 mb-2" }, "Loading from URL"),
|
|
232
|
+
React.createElement("p", { className: "text-sm text-blue-700 break-all" }, zipFileUrl))),
|
|
233
|
+
!loadingState.isLoading && !loadedState.result && (React.createElement("div", { className: "border-2 border-dashed border-gray-300 rounded-lg p-8 text-center hover:border-gray-400 transition-colors cursor-pointer", onDrop: handleDrop, onDragOver: handleDragOver, onClick: () => fileInputRef.current?.click() },
|
|
234
|
+
React.createElement(FolderOpenIcon, { className: "h-12 w-12 text-gray-400 mx-auto mb-4" }),
|
|
235
|
+
React.createElement("h3", { className: "text-lg font-medium text-gray-900 mb-2" }, "Select or Drop ZIP File"),
|
|
236
|
+
React.createElement("p", { className: "text-gray-600 mb-4" }, "Choose a ZIP file containing resources to load and process"),
|
|
237
|
+
React.createElement("button", { type: "button", className: "inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500" },
|
|
238
|
+
React.createElement(DocumentArrowDownIcon, { className: "w-4 h-4 mr-2" }),
|
|
239
|
+
"Browse Files"),
|
|
240
|
+
React.createElement("input", { ref: fileInputRef, type: "file", accept: ".zip", onChange: (e) => handleFileSelect(e.target.files), className: "hidden" }))),
|
|
241
|
+
loadingState.isLoading && (React.createElement("div", { className: "mb-6" },
|
|
242
|
+
React.createElement("div", { className: "flex items-center justify-between mb-2" },
|
|
243
|
+
React.createElement("div", { className: "flex items-center space-x-2" },
|
|
244
|
+
React.createElement(getStageIcon(loadingState.stage), {
|
|
245
|
+
className: `w-5 h-5 ${loadingState.stage === 'complete' ? 'text-green-500' : 'text-blue-500 animate-spin'}`
|
|
246
|
+
}),
|
|
247
|
+
React.createElement("span", { className: "text-sm font-medium text-gray-900" }, loadingState.message)),
|
|
248
|
+
React.createElement("span", { className: "text-sm text-gray-500" },
|
|
249
|
+
loadingState.progress,
|
|
250
|
+
"%")),
|
|
251
|
+
React.createElement("div", { className: "w-full bg-gray-200 rounded-full h-2" },
|
|
252
|
+
React.createElement("div", { className: "bg-blue-600 h-2 rounded-full transition-all duration-300", style: { width: `${loadingState.progress}%` } })))),
|
|
253
|
+
loadedState.result && (React.createElement("div", { className: "space-y-4" },
|
|
254
|
+
React.createElement("div", { className: "flex items-center space-x-2 text-green-600" },
|
|
255
|
+
React.createElement(CheckCircleIcon, { className: "w-5 h-5" }),
|
|
256
|
+
React.createElement("span", { className: "font-medium" }, "ZIP file loaded successfully")),
|
|
257
|
+
React.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" },
|
|
258
|
+
React.createElement("div", { className: "bg-gray-50 rounded-lg p-4" },
|
|
259
|
+
React.createElement("h4", { className: "font-medium text-gray-900 mb-2" }, "File Information"),
|
|
260
|
+
React.createElement("div", { className: "space-y-1 text-sm" },
|
|
261
|
+
React.createElement("div", null,
|
|
262
|
+
React.createElement("strong", null, "Name:"),
|
|
263
|
+
" ",
|
|
264
|
+
loadedState.fileName),
|
|
265
|
+
loadedState.fileSize && (React.createElement("div", null,
|
|
266
|
+
React.createElement("strong", null, "Size:"),
|
|
267
|
+
" ",
|
|
268
|
+
formatFileSize(loadedState.fileSize))),
|
|
269
|
+
React.createElement("div", null,
|
|
270
|
+
React.createElement("strong", null, "Files:"),
|
|
271
|
+
" ",
|
|
272
|
+
loadedState.result.files.length))),
|
|
273
|
+
React.createElement("div", { className: "bg-gray-50 rounded-lg p-4" },
|
|
274
|
+
React.createElement("h4", { className: "font-medium text-gray-900 mb-2" }, "Content"),
|
|
275
|
+
React.createElement("div", { className: "space-y-1 text-sm" },
|
|
276
|
+
loadedState.result.manifest && (React.createElement("div", { className: "flex items-center space-x-1" },
|
|
277
|
+
React.createElement(CheckCircleIcon, { className: "w-4 h-4 text-green-500" }),
|
|
278
|
+
React.createElement("span", null, "Manifest found"))),
|
|
279
|
+
loadedState.result.config && (React.createElement("div", { className: "flex items-center space-x-1" },
|
|
280
|
+
React.createElement(CheckCircleIcon, { className: "w-4 h-4 text-green-500" }),
|
|
281
|
+
React.createElement("span", null, "Configuration found"))),
|
|
282
|
+
loadedState.result.processedResources && (React.createElement("div", { className: "flex items-center space-x-1" },
|
|
283
|
+
React.createElement(CheckCircleIcon, { className: "w-4 h-4 text-green-500" }),
|
|
284
|
+
React.createElement("span", null, "Resources processed")))))),
|
|
285
|
+
loadedState.result.manifest && (React.createElement("div", { className: "bg-blue-50 rounded-lg p-4" },
|
|
286
|
+
React.createElement("h4", { className: "font-medium text-blue-900 mb-2" }, "Archive Information"),
|
|
287
|
+
React.createElement("div", { className: "text-sm text-blue-800" },
|
|
288
|
+
React.createElement("div", null,
|
|
289
|
+
React.createElement("strong", null, "Created:"),
|
|
290
|
+
' ',
|
|
291
|
+
new Date(loadedState.result.manifest.timestamp).toLocaleString()),
|
|
292
|
+
loadedState.result.manifest.input && (React.createElement("div", null,
|
|
293
|
+
React.createElement("strong", null, "Source:"),
|
|
294
|
+
" ",
|
|
295
|
+
loadedState.result.manifest.input.type,
|
|
296
|
+
" -",
|
|
297
|
+
' ',
|
|
298
|
+
loadedState.result.manifest.input.originalPath))))))),
|
|
299
|
+
loadedState.error && (React.createElement("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4" },
|
|
300
|
+
React.createElement("div", { className: "flex items-center space-x-2 text-red-600 mb-2" },
|
|
301
|
+
React.createElement(ExclamationTriangleIcon, { className: "w-5 h-5" }),
|
|
302
|
+
React.createElement("span", { className: "font-medium" }, "Error Loading ZIP")),
|
|
303
|
+
React.createElement("p", { className: "text-sm text-red-700" }, loadedState.error),
|
|
304
|
+
React.createElement("button", { onClick: () => setLoadedState((prev) => ({ ...prev, error: null })), className: "mt-3 inline-flex items-center px-3 py-1.5 border border-transparent text-xs font-medium rounded text-red-700 bg-red-100 hover:bg-red-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500" }, "Try Again"))),
|
|
305
|
+
!loadingState.isLoading && !loadedState.result && !loadedState.error && (React.createElement("div", { className: "mt-6 bg-blue-50 rounded-lg p-4" },
|
|
306
|
+
React.createElement("div", { className: "flex items-start space-x-2" },
|
|
307
|
+
React.createElement(InformationCircleIcon, { className: "w-5 h-5 text-blue-500 mt-0.5 flex-shrink-0" }),
|
|
308
|
+
React.createElement("div", { className: "text-sm text-blue-800" },
|
|
309
|
+
React.createElement("p", { className: "font-medium mb-1" }, "ZIP Loader"),
|
|
310
|
+
React.createElement("p", null, "Load ZIP archives containing resource files and configurations. The loader supports automatic configuration application and resource processing."))))))));
|
|
311
|
+
};
|
|
312
|
+
export default ZipLoaderView;
|
|
313
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/views/ZipLoaderView/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useCallback, useRef } from 'react';\nimport {\n DocumentArrowDownIcon,\n FolderOpenIcon,\n CheckCircleIcon,\n ExclamationTriangleIcon,\n InformationCircleIcon,\n ArrowPathIcon\n} from '@heroicons/react/24/outline';\nimport { ZipLoaderViewProps } from '../../../types';\nimport {\n createBrowserZipLoader,\n ZipLoadOptions,\n ZipLoadResult,\n ZipLoadingStage,\n formatFileSize,\n isZipFile\n} from '../../../utils/zipLoader';\n\ninterface LoadingState {\n isLoading: boolean;\n stage: ZipLoadingStage | null;\n progress: number;\n message: string;\n}\n\ninterface LoadedState {\n result: ZipLoadResult | null;\n error: string | null;\n fileName: string | null;\n fileSize: number | null;\n}\n\nexport const ZipLoaderView: React.FC<ZipLoaderViewProps> = ({\n zipFileUrl,\n zipPath,\n onImport,\n onConfigurationLoad,\n onLoadComplete,\n onMessage,\n className = ''\n}) => {\n const [loadingState, setLoadingState] = useState<LoadingState>({\n isLoading: false,\n stage: null,\n progress: 0,\n message: ''\n });\n\n const [loadedState, setLoadedState] = useState<LoadedState>({\n result: null,\n error: null,\n fileName: null,\n fileSize: null\n });\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n // Load ZIP file with progress tracking\n const loadZipFileInternal = useCallback(\n async (file: File) => {\n setLoadingState({\n isLoading: true,\n stage: 'reading-file',\n progress: 0,\n message: 'Starting to load ZIP file...'\n });\n\n setLoadedState({\n result: null,\n error: null,\n fileName: file.name,\n fileSize: file.size\n });\n\n const options: ZipLoadOptions = {\n autoApplyConfig: false,\n autoProcessResources: false\n };\n\n const progressCallback = (stage: ZipLoadingStage, progress: number, message?: string) => {\n setLoadingState({\n isLoading: stage !== 'complete',\n stage,\n progress,\n message: message || getStageMessage(stage)\n });\n };\n\n const loader = createBrowserZipLoader();\n const result = await loader.loadFromFile(file, options, progressCallback);\n\n if (result.isSuccess()) {\n const zipResult = result.value;\n\n setLoadedState((prev) => ({\n ...prev,\n result: zipResult,\n error: null\n }));\n\n setLoadingState({\n isLoading: false,\n stage: 'complete',\n progress: 100,\n message: 'ZIP file loaded successfully'\n });\n\n onMessage?.('success', `Loaded ZIP file: ${file.name}`);\n\n // Load configuration if found\n if (zipResult.config) {\n onConfigurationLoad?.(zipResult.config);\n onMessage?.('info', `Configuration loaded from ZIP`);\n }\n\n // Import the raw data for processing by the orchestrator\n if (zipResult.directory) {\n onImport?.(zipResult.directory);\n } else if (zipResult.files.length > 0) {\n onImport?.(zipResult.files);\n }\n\n onLoadComplete?.();\n } else {\n const errorMessage = result.message;\n setLoadedState((prev) => ({\n ...prev,\n error: errorMessage,\n result: null\n }));\n\n setLoadingState({\n isLoading: false,\n stage: null,\n progress: 0,\n message: ''\n });\n\n onMessage?.('error', `Failed to load ZIP: ${errorMessage}`);\n }\n },\n [onMessage, onLoadComplete]\n );\n\n // Load ZIP from URL\n const loadFromUrl = useCallback(\n async (url: string) => {\n setLoadingState({\n isLoading: true,\n stage: 'reading-file',\n progress: 0,\n message: 'Fetching ZIP from URL...'\n });\n\n setLoadedState({\n result: null,\n error: null,\n fileName: url.split('/').pop() || 'remote.zip',\n fileSize: null\n });\n\n const options: ZipLoadOptions = {\n autoApplyConfig: false,\n autoProcessResources: false\n };\n\n const progressCallback = (stage: ZipLoadingStage, progress: number, message?: string) => {\n setLoadingState({\n isLoading: stage !== 'complete',\n stage,\n progress,\n message: message || getStageMessage(stage)\n });\n };\n\n const loader = createBrowserZipLoader();\n const result = await loader.loadFromUrl(url, options, progressCallback);\n\n if (result.isSuccess()) {\n const zipResult = result.value;\n\n setLoadedState((prev) => ({\n ...prev,\n result: zipResult,\n error: null\n }));\n\n setLoadingState({\n isLoading: false,\n stage: 'complete',\n progress: 100,\n message: 'ZIP file loaded successfully'\n });\n\n onMessage?.('success', `Loaded ZIP from URL: ${url}`);\n\n // Load configuration if found\n if (zipResult.config) {\n onConfigurationLoad?.(zipResult.config);\n onMessage?.('info', `Configuration loaded from ZIP`);\n }\n\n // Import the raw data for processing by the orchestrator\n if (zipResult.directory) {\n onImport?.(zipResult.directory);\n } else if (zipResult.files.length > 0) {\n onImport?.(zipResult.files);\n }\n\n onLoadComplete?.();\n } else {\n const errorMessage = result.message;\n setLoadedState((prev) => ({\n ...prev,\n error: errorMessage,\n result: null\n }));\n\n setLoadingState({\n isLoading: false,\n stage: null,\n progress: 0,\n message: ''\n });\n\n onMessage?.('error', `Failed to load ZIP from URL: ${errorMessage}`);\n }\n },\n [onMessage, onLoadComplete]\n );\n\n // Handle file selection - now defined after loadZipFileInternal\n const handleFileSelect = useCallback(\n async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n\n const file = files[0];\n if (!isZipFile(file.name)) {\n setLoadedState((prev) => ({\n ...prev,\n error: `Selected file \"${file.name}\" is not a ZIP file`,\n result: null\n }));\n onMessage?.('error', `File \"${file.name}\" is not a ZIP file`);\n return;\n }\n\n await loadZipFileInternal(file);\n },\n [loadZipFileInternal, onMessage]\n );\n\n // Handle drag and drop - now defined after handleFileSelect\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const files = e.dataTransfer.files;\n await handleFileSelect(files);\n },\n [handleFileSelect]\n );\n\n // Auto-load from URL parameter\n React.useEffect(() => {\n if (zipFileUrl && !loadingState.isLoading && !loadedState.result && !loadedState.error) {\n loadFromUrl(zipFileUrl);\n }\n }, [zipFileUrl, loadFromUrl, loadingState.isLoading, loadedState.result, loadedState.error]);\n\n const getStageMessage = (stage: ZipLoadingStage): string => {\n switch (stage) {\n case 'reading-file':\n return 'Reading ZIP file...';\n case 'parsing-zip':\n return 'Parsing ZIP archive...';\n case 'loading-manifest':\n return 'Loading manifest...';\n case 'loading-config':\n return 'Loading configuration...';\n case 'extracting-files':\n return 'Extracting files...';\n case 'processing-resources':\n return 'Processing resources...';\n case 'complete':\n return 'Complete!';\n default:\n return 'Processing...';\n }\n };\n\n const getStageIcon = (stage: ZipLoadingStage | null) => {\n switch (stage) {\n case 'complete':\n return CheckCircleIcon;\n case null:\n return DocumentArrowDownIcon;\n default:\n return ArrowPathIcon;\n }\n };\n\n return (\n <div className={`p-6 ${className}`}>\n <div className=\"flex items-center space-x-3 mb-6\">\n <DocumentArrowDownIcon className=\"h-8 w-8 text-blue-600\" />\n <h2 className=\"text-2xl font-bold text-gray-900\">ZIP Loader</h2>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n {/* URL Loading Section */}\n {zipFileUrl && !loadedState.result && !loadedState.error && (\n <div className=\"mb-6 p-4 bg-blue-50 rounded-lg\">\n <h3 className=\"text-lg font-medium text-blue-900 mb-2\">Loading from URL</h3>\n <p className=\"text-sm text-blue-700 break-all\">{zipFileUrl}</p>\n </div>\n )}\n\n {/* File Upload Area */}\n {!loadingState.isLoading && !loadedState.result && (\n <div\n className=\"border-2 border-dashed border-gray-300 rounded-lg p-8 text-center hover:border-gray-400 transition-colors cursor-pointer\"\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onClick={() => fileInputRef.current?.click()}\n >\n <FolderOpenIcon className=\"h-12 w-12 text-gray-400 mx-auto mb-4\" />\n <h3 className=\"text-lg font-medium text-gray-900 mb-2\">Select or Drop ZIP File</h3>\n <p className=\"text-gray-600 mb-4\">Choose a ZIP file containing resources to load and process</p>\n <button\n type=\"button\"\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n <DocumentArrowDownIcon className=\"w-4 h-4 mr-2\" />\n Browse Files\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".zip\"\n onChange={(e) => handleFileSelect(e.target.files)}\n className=\"hidden\"\n />\n </div>\n )}\n\n {/* Loading Progress */}\n {loadingState.isLoading && (\n <div className=\"mb-6\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center space-x-2\">\n {React.createElement(getStageIcon(loadingState.stage), {\n className: `w-5 h-5 ${\n loadingState.stage === 'complete' ? 'text-green-500' : 'text-blue-500 animate-spin'\n }`\n })}\n <span className=\"text-sm font-medium text-gray-900\">{loadingState.message}</span>\n </div>\n <span className=\"text-sm text-gray-500\">{loadingState.progress}%</span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: `${loadingState.progress}%` }}\n />\n </div>\n </div>\n )}\n\n {/* Loaded Content Summary */}\n {loadedState.result && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-2 text-green-600\">\n <CheckCircleIcon className=\"w-5 h-5\" />\n <span className=\"font-medium\">ZIP file loaded successfully</span>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"bg-gray-50 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-900 mb-2\">File Information</h4>\n <div className=\"space-y-1 text-sm\">\n <div>\n <strong>Name:</strong> {loadedState.fileName}\n </div>\n {loadedState.fileSize && (\n <div>\n <strong>Size:</strong> {formatFileSize(loadedState.fileSize)}\n </div>\n )}\n <div>\n <strong>Files:</strong> {loadedState.result.files.length}\n </div>\n </div>\n </div>\n\n <div className=\"bg-gray-50 rounded-lg p-4\">\n <h4 className=\"font-medium text-gray-900 mb-2\">Content</h4>\n <div className=\"space-y-1 text-sm\">\n {loadedState.result.manifest && (\n <div className=\"flex items-center space-x-1\">\n <CheckCircleIcon className=\"w-4 h-4 text-green-500\" />\n <span>Manifest found</span>\n </div>\n )}\n {loadedState.result.config && (\n <div className=\"flex items-center space-x-1\">\n <CheckCircleIcon className=\"w-4 h-4 text-green-500\" />\n <span>Configuration found</span>\n </div>\n )}\n {loadedState.result.processedResources && (\n <div className=\"flex items-center space-x-1\">\n <CheckCircleIcon className=\"w-4 h-4 text-green-500\" />\n <span>Resources processed</span>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {loadedState.result.manifest && (\n <div className=\"bg-blue-50 rounded-lg p-4\">\n <h4 className=\"font-medium text-blue-900 mb-2\">Archive Information</h4>\n <div className=\"text-sm text-blue-800\">\n <div>\n <strong>Created:</strong>{' '}\n {new Date(loadedState.result.manifest.timestamp).toLocaleString()}\n </div>\n {loadedState.result.manifest.input && (\n <div>\n <strong>Source:</strong> {loadedState.result.manifest.input.type} -{' '}\n {loadedState.result.manifest.input.originalPath}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Error Display */}\n {loadedState.error && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <div className=\"flex items-center space-x-2 text-red-600 mb-2\">\n <ExclamationTriangleIcon className=\"w-5 h-5\" />\n <span className=\"font-medium\">Error Loading ZIP</span>\n </div>\n <p className=\"text-sm text-red-700\">{loadedState.error}</p>\n <button\n onClick={() => setLoadedState((prev) => ({ ...prev, error: null }))}\n className=\"mt-3 inline-flex items-center px-3 py-1.5 border border-transparent text-xs font-medium rounded text-red-700 bg-red-100 hover:bg-red-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500\"\n >\n Try Again\n </button>\n </div>\n )}\n\n {/* Help Information */}\n {!loadingState.isLoading && !loadedState.result && !loadedState.error && (\n <div className=\"mt-6 bg-blue-50 rounded-lg p-4\">\n <div className=\"flex items-start space-x-2\">\n <InformationCircleIcon className=\"w-5 h-5 text-blue-500 mt-0.5 flex-shrink-0\" />\n <div className=\"text-sm text-blue-800\">\n <p className=\"font-medium mb-1\">ZIP Loader</p>\n <p>\n Load ZIP archives containing resource files and configurations. The loader supports\n automatic configuration application and resource processing.\n </p>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default ZipLoaderView;\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Config, QualifierTypes, Qualifiers, ResourceTypes } from '@fgv/ts-res';
|
|
2
|
+
import { Result } from '@fgv/ts-utils';
|
|
3
|
+
import { ConfigurationChanges, ConfigurationValidationResult, ConfigurationExportOptions, ConfigurationTemplate } from '../utils/configurationUtils';
|
|
4
|
+
export interface ConfigurationState {
|
|
5
|
+
currentConfiguration: Config.Model.ISystemConfiguration;
|
|
6
|
+
originalConfiguration: Config.Model.ISystemConfiguration;
|
|
7
|
+
hasUnsavedChanges: boolean;
|
|
8
|
+
changes: ConfigurationChanges;
|
|
9
|
+
validation: ConfigurationValidationResult;
|
|
10
|
+
activeTab: 'qualifierTypes' | 'qualifiers' | 'resourceTypes' | 'json';
|
|
11
|
+
isJsonView: boolean;
|
|
12
|
+
jsonString: string;
|
|
13
|
+
jsonError: string | null;
|
|
14
|
+
}
|
|
15
|
+
export interface ConfigurationActions {
|
|
16
|
+
loadConfiguration: (config: Config.Model.ISystemConfiguration) => void;
|
|
17
|
+
resetConfiguration: () => void;
|
|
18
|
+
applyConfiguration: () => void;
|
|
19
|
+
updateQualifierTypes: (qualifierTypes: QualifierTypes.Config.ISystemQualifierTypeConfig[]) => void;
|
|
20
|
+
updateQualifiers: (qualifiers: Qualifiers.IQualifierDecl[]) => void;
|
|
21
|
+
updateResourceTypes: (resourceTypes: ResourceTypes.Config.IResourceTypeConfig[]) => void;
|
|
22
|
+
addQualifierType: (qualifierType: QualifierTypes.Config.ISystemQualifierTypeConfig) => void;
|
|
23
|
+
updateQualifierType: (index: number, qualifierType: QualifierTypes.Config.ISystemQualifierTypeConfig) => void;
|
|
24
|
+
removeQualifierType: (index: number) => void;
|
|
25
|
+
addQualifier: (qualifier: Qualifiers.IQualifierDecl) => void;
|
|
26
|
+
updateQualifier: (index: number, qualifier: Qualifiers.IQualifierDecl) => void;
|
|
27
|
+
removeQualifier: (index: number) => void;
|
|
28
|
+
addResourceType: (resourceType: ResourceTypes.Config.IResourceTypeConfig) => void;
|
|
29
|
+
updateResourceType: (index: number, resourceType: ResourceTypes.Config.IResourceTypeConfig) => void;
|
|
30
|
+
removeResourceType: (index: number) => void;
|
|
31
|
+
setActiveTab: (tab: ConfigurationState['activeTab']) => void;
|
|
32
|
+
toggleJsonView: () => void;
|
|
33
|
+
updateJsonString: (json: string) => void;
|
|
34
|
+
applyJsonChanges: () => Result<void>;
|
|
35
|
+
exportToJson: (options?: ConfigurationExportOptions) => Result<string>;
|
|
36
|
+
importFromJson: (jsonData: string) => Result<void>;
|
|
37
|
+
loadTemplate: (templateId: string) => Result<void>;
|
|
38
|
+
validateCurrent: () => ConfigurationValidationResult;
|
|
39
|
+
}
|
|
40
|
+
export interface UseConfigurationStateReturn {
|
|
41
|
+
state: ConfigurationState;
|
|
42
|
+
actions: ConfigurationActions;
|
|
43
|
+
templates: ConfigurationTemplate[];
|
|
44
|
+
}
|
|
45
|
+
export declare function useConfigurationState(initialConfiguration?: Config.Model.ISystemConfiguration, onConfigurationChange?: (config: Config.Model.ISystemConfiguration) => void, onUnsavedChanges?: (hasChanges: boolean) => void): UseConfigurationStateReturn;
|
|
46
|
+
//# sourceMappingURL=useConfigurationState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConfigurationState.d.ts","sourceRoot":"","sources":["../../src/hooks/useConfigurationState.ts"],"names":[],"mappings":"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"}
|