{"version":3,"file":"app-f19daf30.86e4f271d629e4b4.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/project/test-model-revision/download-progress.scss","webpack://client-app/./src/app/project/test-model-revision/test-model-revision.scss","webpack://client-app/./src/app/project/test-model-revision/download-progress.html","webpack://client-app/./src/app/project/test-model-revision/test-model-revision.html","webpack://client-app/./src/app/project/test-model-revision/download-progress.ts","webpack://client-app/./src/app/project/test-model-revision/test-model-revision.ts"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"#relative_parent{position:relative;margin-bottom:25px}#absolute_label{position:absolute;z-index:99;top:30px;color:#fff;font-family:sans-serif;font-size:2em;font-weight:bolder;text-align:center;width:100%}#the_progress[value]{background:gray;width:100%;height:3em;border:3px solid #000;border-radius:2px;box-shadow:0 2px 5px rgba(0,0,0,.25) inset}#the_progress[value]::-moz-progress-bar{background:#32cd32}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/app/project/test-model-revision/download-progress.scss\"],\"names\":[],\"mappings\":\"AACA,iBACC,iBAAA,CACA,kBAAA,CAED,gBACC,iBAAA,CAAA,UAAA,CACA,QAAA,CACA,UAAA,CACA,sBAAA,CAAA,aAAA,CAAA,kBAAA,CACA,iBAAA,CAAA,UAAA,CAGD,qBACC,eAAA,CACA,UAAA,CAAA,UAAA,CACA,qBAAA,CACA,iBAAA,CAAA,0CAAA,CAED,wCAAA,kBAAA\",\"sourcesContent\":[\"\\r\\n#relative_parent { \\r\\n\\tposition:relative; \\r\\n\\tmargin-bottom: 25px;\\r\\n}\\r\\n#absolute_label { \\r\\n\\tposition: absolute; z-index: 99;\\r\\n\\ttop: 30px; // Not the correct way to do it.\\r\\n\\tcolor: white; \\r\\n\\tfont-family: sans-serif; font-size: 2em; font-weight:bolder;\\r\\n\\ttext-align:center; width: 100%;\\r\\n}\\r\\n\\r\\n#the_progress[value] {\\r\\n\\tbackground: gray;\\r\\n\\twidth: 100%; height:3em; \\r\\n\\tborder: 3px solid black;\\r\\n\\tborder-radius: 2px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25) inset; \\r\\n}\\r\\n#the_progress[value]::-moz-progress-bar { background: limegreen; }\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".test-model-revision{width:100%;padding:10px}.test-model-revision .headers{display:grid;grid-template-columns:50% 50%;line-height:2.5;font-weight:800}.test-model-revision .items{display:grid;grid-template-columns:50% 50%;line-height:2.5}.test-model-revision .revision-header{display:grid;grid-template-columns:auto 50px 200px 200px;line-height:2.5;font-weight:800}.test-model-revision .revision-item{display:grid;grid-template-columns:auto 50px 200px 200px;line-height:2.5;margin-top:5px}.test-model-revision .active{background-color:aqua}.test-model-revision .items:hover{background-color:#d3d3d3;cursor:pointer}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/app/project/test-model-revision/test-model-revision.scss\"],\"names\":[],\"mappings\":\"AAAA,qBACI,UAAA,CACA,YAAA,CACI,8BACI,YAAA,CACA,6BAAA,CACA,eAAA,CACA,eAAA,CAEJ,4BACI,YAAA,CACA,6BAAA,CACA,eAAA,CAEJ,sCACI,YAAA,CACA,2CAAA,CACA,eAAA,CACA,eAAA,CAEJ,oCACI,YAAA,CACA,2CAAA,CACA,eAAA,CACA,cAAA,CAEJ,6BACI,qBAAA,CAEJ,kCACI,wBAAA,CACA,cAAA\",\"sourcesContent\":[\".test-model-revision {\\r\\n width: 100%;\\r\\n padding: 10px;\\r\\n .headers {\\r\\n display: grid;\\r\\n grid-template-columns: 50% 50%;\\r\\n line-height: 2.5;\\r\\n font-weight: 800;\\r\\n }\\r\\n .items {\\r\\n display: grid;\\r\\n grid-template-columns: 50% 50%;\\r\\n line-height: 2.5;\\r\\n }\\r\\n .revision-header {\\r\\n display: grid;\\r\\n grid-template-columns: auto 50px 200px 200px;\\r\\n line-height: 2.5;\\r\\n font-weight: 800;\\r\\n }\\r\\n .revision-item {\\r\\n display: grid;\\r\\n grid-template-columns: auto 50px 200px 200px;\\r\\n line-height: 2.5;\\r\\n margin-top: 5px;\\r\\n }\\r\\n .active {\\r\\n background-color: aqua;\\r\\n }\\r\\n .items:hover {\\r\\n background-color: lightgray;\\r\\n cursor: pointer;\\r\\n }\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","module.exports = \"\\r\\n\";","module.exports = \"\\r\\n\";","import { DialogController } from \"aurelia-dialog\";\r\nimport { autoinject } from 'aurelia-framework';\r\n\r\n@autoinject\r\nexport class DownloadProgress implements GoodOrBadIF {\r\n\tmodel:DownloadModel = {}; \r\n constructor(protected dialog: DialogController) {}\t\r\n\tactivate(model:DownloadModel) { this.model = model; } \r\n\tattached() { this.beginDownload(this.model.url); }\r\n\tasync beginDownload(url:string){ await fetchWithCatch(url,this); }\r\n\r\n\tasync downloadDone(msg:any, arrayBuffer:ArrayBuffer):Promise { \r\n\t\tconsole.log('DownloadProgress.downloadDone()!',msg,arrayBuffer); \r\n\t\ttry {\r\n\t\t\tconst output2 = await this.model.act(this.model,arrayBuffer);\r\n\t\t\tthis.dialog.ok(output2); \r\n\t\t} catch (e) {\r\n\t\t\tconsole.error(e);\r\n\t\t\tawait this.bad(e);\r\n\t\t}\r\n\t}\r\n\tnumBads:number=0; // we should not do this more than once..\r\n\tasync bad(msg:any):Promise { \r\n\t\t++this.numBads;\r\n\t\tconsole.log(this.numBads, 'bad!', msg); \r\n await this.dialog.cancel();\r\n\t\treturn null;\r\n }\r\n}\r\n\r\nexport interface DownloadModel {\r\n\turl:string; \r\n\tact(inputModel: DownloadModel, arrayBuffer:ArrayBuffer): Promise; \r\n}\r\n\r\n\r\nexport interface GoodOrBadIF {\r\n\tdownloadDone(msg:any, output:ArrayBuffer):Promise;\r\n\tbad(msg:any):Promise;\r\n}\r\n\r\nexport function update_IFC_Progress(pct:number, msg:string) { \r\n\tconsole.log('update pct', pct, msg); \r\n\t$('#the_progress').prop('value', pct);\r\n\t$('#absolute_label').text(msg); \r\n}\r\n\r\nasync function myRead(controller:ReadableStreamDefaultController, response:Response, total:number, rep:GoodOrBadIF) { \r\n try {\r\n const R:ReadableStreamDefaultReader = response.body!.getReader();\r\n let loaded:number = 0;\r\n let B:ReadableStreamReadResult = await R.read();\r\n for ( ; !B.done; B = await R.read()) {\r\n loaded += B.value.byteLength;\r\n\t\t\tconst pct:number = Math.round(loaded/total*100);\r\n update_IFC_Progress(pct, `${pct}%`);\r\n controller.enqueue(B.value); //myRead(controller);\r\n }\r\n controller.close();\r\n } catch (error) {\r\n console.error(error);\r\n controller.error(error);\r\n\t\trep.bad(error); // we should be careful we don't do it twice.\r\n }\r\n}\r\n\r\nfunction MyUnderlyingSource(response:Response, total:number, rep:GoodOrBadIF):UnderlyingSource { // or UnderlyingDefaultSource?\r\n const underlyingSource = { start(controller:ReadableStreamDefaultController) { myRead(controller,response,total,rep); } };\r\n return underlyingSource;\r\n}\r\n\r\nfunction progressResponse(response:Response, total:number, rep:GoodOrBadIF):Response {\r\n const stream = new ReadableStream( MyUnderlyingSource(response,total,rep));\r\n return new Response(stream);\r\n}\r\n\r\nasync function fetchProgress(url:string, rep:GoodOrBadIF):Promise {\r\n const initialResponse:Response = await fetch(url);\r\n if (!initialResponse.ok) { return rep.bad(initialResponse.status+' '+initialResponse.statusText); } \r\n if (!initialResponse.body) { return rep.bad('ReadableStream not yet supported in this browser.'); } \r\n // to access headers, server must send CORS header \"Access-Control-Expose-Headers: content-encoding, content-length x-file-size\"\r\n // server must send custom x-file-size header if gzip or other content-encoding is used\r\n const contentEncoding = initialResponse.headers.get('content-encoding');\r\n const contentLength = initialResponse.headers.get(contentEncoding ? 'x-file-size' : 'content-length');\r\n if (contentLength === null) { return rep.bad('Response size header unavailable'); } \r\n\t// (read more at https://stackoverflow.com/questions/35711724/upload-progress-indicators-for-fetch)\r\n\r\n const total:number = parseInt(contentLength, 10);\r\n const response:Response = progressResponse(initialResponse,total,rep); \r\n\r\n //const data:Blob = await response.blob();\r\n\tconst data:ArrayBuffer = await response.arrayBuffer();\r\n\r\n\tconst success = `download completed, size: ${data.byteLength}`; // size.\r\n console.log(success); // document.getElementById('img').src = URL.createObjectURL(data); \r\n\trep.downloadDone(success,data);\r\n\treturn data;\r\n}\r\n\r\nexport async function fetchWithCatch(url:string, rep:GoodOrBadIF):Promise { \r\n\ttry { \r\n\t\treturn await fetchProgress(url,rep); \r\n\t} catch (e) { \r\n\t\tconsole.error(e); \r\n\t\trep.bad(e);\r\n\t\treturn null;\r\n\t} \r\n}\r\n\r\n\r\nconst url0 = 'https://fetch-progress.anthum.com/30kbps/images/sunrise-baseline.jpg';\r\n// fetchWithCatch(url);\r\n\r\n/*\r\nhttps://javascript.info/fetch-progress\r\nhttps://www.bram.us/2021/12/25/show-a-progress-indicator-for-a-fetch-request-with-the-streams-api/\r\nhttps://dev.to/tqbit/how-to-monitor-the-progress-of-a-javascript-fetch-request-and-cancel-it-on-demand-107f\r\nhttps://stackoverflow.com/questions/35711724/upload-progress-indicators-for-fetch\r\n*/\r\n","import { BimViewerFileDtoSplitView, BimViewerRevisionDto, CheckRevisionSyncStatusResponseDto } from \"app/models/viewer-dtos/Dtos/bimviewer-dtos\";\r\nimport { ApiClient} from \"app/services/api-client\"; // , BimClient \r\nimport { AppContextService } from \"app/services/app-context-service\";\r\nimport { BimsyncClient } from \"app/services/bimsync-client\";\r\nimport { DialogService, DialogSettings } from \"aurelia-dialog\";\r\nimport { autoinject } from \"aurelia-framework\";\r\nimport { DownloadProgress } from \"./download-progress\";\r\n\r\n@autoinject\r\nexport class TestModelRevision {\r\n private projectId: string = \"\";\r\n private models: BimViewerFileDtoSplitView[] = [];\r\n private revisions: BimViewerRevisionDto[] = []\r\n private selectedModelId: string = \"\";\r\n\r\n constructor(\r\n\t\tprivate api: ApiClient, \r\n\t\tpublic appContext: AppContextService, \r\n\t\tpublic bimSyncClient: BimsyncClient,\r\n\t\tprivate dlg: DialogService\r\n\t) {}\r\n\r\n async activate(params: any): Promise {\r\n if (params.projectId) {\r\n this.appContext.setProject(params.projectId);//in activate.\r\n this.projectId = params.projectId; \r\n }\r\n await this.getModels();\r\n }\r\n async getModels(): Promise {\r\n this.models = await this.api.project(this.appContext.projectId).get('BimViewer/GetFilesForProject').jsonResult();\r\n\t\tconsole.log('test-model-revision,getModels, this.models:', this.models);\r\n }\r\n\r\n\tasync openDialogClicked(){ \r\n\t\tconsole.log('openDialogClicked'); \r\n\t\tconst url0 = 'https://fetch-progress.anthum.com/30kbps/images/sunrise-baseline.jpg';\r\n\t\tconst dlgSettings:DialogSettings = {\r\n\t\t\tmodel:url0,\r\n\t\t\tviewModel: DownloadProgress, //'download-progress', // Den vinder: 'Unable to find module with ID: myViewModel'\r\n\t\t\trejectOnCancel:true,\r\n\t\t\t// context.viewModel\r\n\t\t\t//view:'myView',\r\n\t\t\t//model:'myModel'\r\n\t\t};\r\n\t\tconst dlgResult = await this.dlg.open(dlgSettings);\r\n\t}\r\n\r\n async selectModel(model: BimViewerFileDtoSplitView): Promise {\r\n this.selectedModelId = model.id;\r\n\r\n\t\tconsole.log('TMR-selectModel, this.appContext.projectId?', this.appContext.projectId);\r\n this.revisions = await this.api.project(this.appContext.projectId).get(`BimViewer/GetRevisionsForFile?fileId=${model.id}`).jsonResult();\r\n\t\tconsole.log('test-model-revision.selectModel, BimViewer/GetRevisionsForFile, this.revisions:', this.revisions);\r\n\r\n this.revisions.sort((a: BimViewerRevisionDto, b: BimViewerRevisionDto) => {\r\n return b.revision - a.revision;\r\n })\r\n }\r\n\r\n async downloadFile(revision: BimViewerRevisionDto, original: boolean): Promise {\r\n await this.bimSyncClient.setTokenAndProject(this.projectId);\r\n let result: CheckRevisionSyncStatusResponseDto = await this.api.project(this.appContext.projectId).get(`BimViewer/GetCatendaRevision?revisionId=${revision.id}`).jsonResult();\r\n console.log(result);\r\n if (result != undefined && result.isSynced == true) {\r\n this.bimSyncClient.downloadRevisionFile(result, original);\r\n }\r\n }\r\n}\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","exports","DownloadProgress","constructor","dialog","model","numBads","activate","this","attached","beginDownload","url","async","rep","initialResponse","fetch","ok","bad","status","statusText","body","contentEncoding","headers","get","contentLength","response","total","stream","ReadableStream","underlyingSource","start","controller","R","getReader","loaded","B","read","done","value","byteLength","pct","Math","round","update_IFC_Progress","enqueue","close","error","console","myRead","MyUnderlyingSource","Response","progressResponse","parseInt","data","arrayBuffer","success","log","downloadDone","fetchProgress","e","fetchWithCatch","msg","output2","act","cancel","$","prop","text","autoinject","DialogController","TestModelRevision","api","appContext","bimSyncClient","dlg","projectId","models","revisions","selectedModelId","params","setProject","getModels","project","jsonResult","dlgSettings","viewModel","rejectOnCancel","open","sort","a","b","revision","original","setTokenAndProject","result","undefined","isSynced","downloadRevisionFile","DialogService"],"sourceRoot":""}