@@ -38,7 +38,9 @@ export default function SaveAsDialog({
3838 const cloudError = useStore ( ( s ) => s . cloudError ) ;
3939 const cloudLoadProjects = useStore ( ( s ) => s . cloudLoadProjects ) ;
4040 const cloudUpload = useStore ( ( s ) => s . cloudUpload ) ;
41+ const cloudSaveManifest = useStore ( ( s ) => s . cloudSaveManifest ) ;
4142 const validationResult = useStore ( ( s ) => s . validationResult ) ;
43+ const bcfIssues = useStore ( ( s ) => s . bcfIssues ) ;
4244 const setSaveInfo = useStore ( ( s ) => s . setSaveInfo ) ;
4345 const markClean = useStore ( ( s ) => s . markClean ) ;
4446
@@ -148,6 +150,9 @@ export default function SaveAsDialog({
148150 setError ( null ) ;
149151
150152 try {
153+ const now = new Date ( ) . toISOString ( ) ;
154+ const manifestData : Record < string , unknown > [ ] = [ ] ;
155+
151156 // Upload IFC files to models/ directory
152157 const { getModelBytes } = await import ( "../../engine/modelCache" ) ;
153158 for ( const model of project . models ) {
@@ -157,6 +162,17 @@ export default function SaveAsDialog({
157162 type : "application/octet-stream" ,
158163 } ) ;
159164 await cloudUpload ( selectedCloudProject , model . fileName , blob , "bim" ) ;
165+ manifestData . push ( {
166+ type : "WefcModel" ,
167+ guid : model . id ,
168+ name : model . fileName ,
169+ path : `models/${ model . fileName } ` ,
170+ format : model . format ?? "ifc" ,
171+ fileSize : model . fileSize ,
172+ status : "active" ,
173+ created : now ,
174+ modified : now ,
175+ } ) ;
160176 }
161177 }
162178
@@ -172,8 +188,51 @@ export default function SaveAsDialog({
172188 resultBlob ,
173189 "output" ,
174190 ) ;
191+ manifestData . push ( {
192+ type : "WefcValidation" ,
193+ guid : crypto . randomUUID ( ) ,
194+ name : `BIM Validatie - ${ now . slice ( 0 , 10 ) } ` ,
195+ path : "validation/validation-result.json" ,
196+ status : "active" ,
197+ created : now ,
198+ modified : now ,
199+ } ) ;
200+ }
201+
202+ // Upload BCF issues as .bcf zip to validation/ directory
203+ if ( bcfIssues . length > 0 ) {
204+ const { generateBcfZip } = await import ( "../../lib/bcfZipGenerator" ) ;
205+ const bcfBlob = await generateBcfZip ( bcfIssues ) ;
206+ const bcfFilename = `${ project . name ?? "issues" } .bcf` ;
207+ await cloudUpload (
208+ selectedCloudProject ,
209+ bcfFilename ,
210+ bcfBlob ,
211+ "output" ,
212+ ) ;
213+ manifestData . push ( {
214+ type : "WefcBcf" ,
215+ guid : crypto . randomUUID ( ) ,
216+ name : `BCF Issues - ${ now . slice ( 0 , 10 ) } ` ,
217+ path : `validation/${ bcfFilename } ` ,
218+ issueCount : bcfIssues . length ,
219+ status : "active" ,
220+ created : now ,
221+ modified : now ,
222+ } ) ;
175223 }
176224
225+ // Save project.wefc manifest
226+ await cloudSaveManifest ( selectedCloudProject , {
227+ header : {
228+ schema : "WeFC" ,
229+ schema_version : "1.0.0" ,
230+ timestamp : now ,
231+ application : "bim-validator" ,
232+ } ,
233+ data : manifestData ,
234+ } ) ;
235+
177236 setSaveInfo ( {
178237 source : "cloud" ,
179238 cloudProject : selectedCloudProject ,
@@ -191,7 +250,9 @@ export default function SaveAsDialog({
191250 project ,
192251 selectedCloudProject ,
193252 validationResult ,
253+ bcfIssues ,
194254 cloudUpload ,
255+ cloudSaveManifest ,
195256 setSaveInfo ,
196257 markClean ,
197258 onSaveComplete ,
0 commit comments