{"version":3,"file":"app-9669b7f3.bccf71d0753d159d.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/project/ifc-import/ifc-import.scss","webpack://client-app/./src/app/project/ifc-import/ifc-import.html","webpack://client-app/./src/app/project/ifc-import/IFCImporter.ts","webpack://client-app/./src/app/project/ifc-import/ifc-import.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, \".whynogeneralcontainerclass{height:calc(100vh - 4em);overflow:hidden}.import-ifc{display:flex;flex-direction:column}.import-ifc .inputbar{margin:15px}.import-ifc button{margin-left:15px}.import-ifc .progress{margin:15px;height:1.6em;flex-shrink:0}.import-ifc pre{background:#005;color:#0e8;margin:0 0 0 0;padding:15px;font-size:1.3em;font-weight:bolder;overflow:auto;flex-grow:1}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/app/project/ifc-import/ifc-import.scss\",\"webpack://./src/resources/customized-styles/variables.scss\"],\"names\":[],\"mappings\":\"AAEA,4BACC,wBAAA,CACG,eAAA,CAGJ,YACC,YAAA,CACA,qBAAA,CACA,sBAAA,WAAA,CACA,mBAAA,gBCDQ,CDGR,sBACC,WCJO,CDKP,YAAA,CACA,aAAA,CAGD,gBAAA,eAAA,CAAA,UAAA,CACC,cAAA,CACA,YCXO,CDYP,eAAA,CACA,kBAAA,CACA,aAAA,CACA,WAAA\",\"sourcesContent\":[\"@import \\\"src/resources/customized-styles/variables\\\";\\r\\n\\r\\n.whynogeneralcontainerclass { \\t\\r\\n\\theight: calc(100vh - $top-bar-height);\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.import-ifc {\\r\\n\\tdisplay:flex; // to allow second/bottom element to take up remaining space, without overflowing.\\r\\n\\tflex-direction: column;\\r\\n\\t.inputbar { margin: $gutter; }\\r\\n\\tbutton { margin-left: $gutter; }\\r\\n\\r\\n\\t.progress {\\r\\n\\t\\tmargin: $gutter;\\r\\n\\t\\theight: 1.6em;\\r\\n\\t\\tflex-shrink: 0;\\r\\n\\t} \\r\\n\\r\\n\\tpre { background: #005; color: #0e8; \\t\\r\\n\\t\\tmargin: 0 0 0 0; // top right bottom left.\\r\\n\\t\\tpadding: $gutter;\\r\\n\\t\\tfont-size: 1.3em; //2em;\\r\\n\\t\\tfont-weight: bolder;\\r\\n\\t\\toverflow:auto;\\r\\n\\t\\tflex-grow:1; //(flex grow shrink basis)\\r\\n\\t}\\r\\n}\\r\\n\\r\\n/* Another thought: The default layout just cuts off excess content,\\r\\nthere is no scrollbar. How do we get a scroll-bar..\\r\\n\\r\\nHorizontally, it DOES limit and shape contained items.\\r\\n*/\\r\\n\",\"$text-color: #333;\\r\\n$accent: #00B3C9;\\r\\n$accent-15pct: #D9F4F7;\\r\\n$bs-default: #f1f3f4;\\r\\n$grey: #dddddd;\\r\\n$grey-light: #efefef;\\r\\n$grey-lighter: #F0F3F4;\\r\\n$grey-darker: #A5A3A3;\\r\\n$white-hsl-97: hsla(0deg, 0%, 97%, 1);\\r\\n\\r\\n$gutter: 15px;\\r\\n\\r\\n$box-shadow: 0 0 0.25rem rgba(0, 0, 0, 0.175);\\r\\n$box-shadow-right: 0.05rem 0 0.25rem rgba(0, 0, 0, 0.175);\\r\\n$box-shadow-left: -0.05rem 0 0.25rem rgba(0, 0, 0, 0.175);\\r\\n$box-shadow-color: rgba(0, 0, 0, 0.175);\\r\\n\\r\\n$border-color: rgba(0, 0, 0, 0.175);\\r\\n\\r\\n\\r\\n// Showroom header\\r\\n$showroom-header-height: 350px;\\r\\n$showroom-header-height-small: 150px;\\r\\n$showroom-header-height-mobile: 200px;\\r\\n\\r\\n// Navigation\\r\\n$nav-width: 275px;\\r\\n$nav-width-collapsed: 50px;\\r\\n$nav-height-mobile: 50px;\\r\\n\\r\\n// Top bar\\r\\n$top-bar-height: 4em;\\r\\n\\r\\n// CSS grid table\\r\\n$css-grid-header-height: calc(4em + 1px);\\r\\n\\r\\n// Object Presentation\\r\\n$object-presentation-left-content-width: 250px;\\r\\n$object-presentation-left-content-width-lg: 350px;\\r\\n$object-presentation-img-height: 250px;\\r\\n\\r\\n\\r\\n// Card deck\\r\\n$card-height: 250px;\\r\\n\\r\\n\\r\\n// Select\\r\\n$select-min-width: 200px;\\r\\n\\r\\n\\r\\n// Modal\\r\\n$modal-header-height: 50px;\\r\\n$modal-footer-height: 50px;\\r\\n\\r\\n// Object Properties\\r\\n$object-properties-width: 480px;\\r\\n$object-properties-width--detailed: 560px;\\r\\n$object-properties-width-mobile: 100vw;\\r\\n$object-properties-width-mobile--detailed: 100vw;\\r\\n$object-properties-width-tablet: 480px;\\r\\n$object-properties-width-tablet--detailed: 560px;\\r\\n\\r\\n// Notification Center\\r\\n$notification-center-width: 500px;\\r\\n\\r\\n// 7.0 z-index Setting\\r\\n\\r\\n$btn-scroll-to-top-zindex: 1020 !default;\\r\\n$content-zindex: 1020 !default;\\r\\n$float-submenu-zindex: 1020 !default;\\r\\n$footer-zindex: 1020 !default;\\r\\n$header-zindex: 1020 !default;\\r\\n$header-fixed-zindex: 1040 !default;\\r\\n$sidebar-zindex: 1010 !default;\\r\\n$top-menu-zindex: 1015 !default;\\r\\n$theme-panel-zindex: 1020 !default;\\r\\n$page-loader-zindex : 9999 !default;\\r\\n$page-title-zindex: 1020 !default;\\r\\n$pace-loader-zindex: 1030 !default;\\r\\n$panel-expand-zindex: 1080 !default;\\r\\n\\r\\n// 2.0 RTL Setting\\r\\n\\r\\n$enable-rtl: false !default;\\r\\n\\r\\n// 6.0 App Component Setting\\r\\n\\r\\n$boxed-layout-width: rem(1280px) !default;\\r\\n$content-padding-x: rem(30px) !default;\\r\\n$content-padding-y: rem(20px) !default;\\r\\n$content-padding-x-sm: rem(20px) !default;\\r\\n$content-padding-y-sm: rem(20px) !default;\\r\\n$header-height: rem(50px) !default;\\r\\n$header-height-sm: rem(50px) !default;\\r\\n$sidebar-width: rem(220px) !default;\\r\\n$sidebar-minified-width: rem(60px) !default;\\r\\n$sidebar-wide-width: rem(250px) !default;\\r\\n$top-menu-height: rem(40px) !default;\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","module.exports = \"\\r\\n\";","import { AWJClient, ApiClient, RequestErrorHandling, RequestMethod } from \"../../services/api-client\";\r\nimport { RequestExecution } from \"../../services/api-client\";\r\nimport { IFCQueueStatus, IFCPollStatus, LogDto } from './ifc-import';\r\n\r\nexport interface IfIFCImporter {\r\n\tqueue(form: FormData, prjId: string): Promise<[string | undefined, string | undefined]>;\r\n\tpoll(sessionId: string): Promise;\r\n\tendJob(sessionId:string):Promise;\r\n}\r\n\r\nexport class IFCImporter implements IfIFCImporter {\r\n\tconstructor(public apiClient: ApiClient, public prjId: string) { }\r\n\tasync queue(form: FormData, prjId: string): Promise<[string | undefined, string | undefined]> {\r\n\t\tlet reh: RequestErrorHandling = this.apiClient.project(prjId).postForm('ImportIfc/ImportIfcFileV2', form);\r\n\t\tlet rx: RequestExecution = reh.handleError(\"Ifc import failed\", 'The import failed.');\r\n\t\tlet hrm: IFCQueueStatus = await rx.jsonResult(); // (try-catch won't help us, because of handleErr.)\r\n\t\tif (hrm == undefined) {\r\n\t\t\tconsole.log('(hrm was undefined.)');\r\n\t\t\treturn [undefined, undefined];\r\n\t\t} // an empty response here, means we fully failed (in the call itself, not in BL.)\r\n\t\tconsole.log('queue, sessionId:', hrm.sessionId);\r\n\t\treturn [hrm.sessionId, hrm.err]; // fixme, we would also like to return hrm.err.\t\t\t\r\n\t}\r\n\tpublic async poll(sessionId: string): Promise {\r\n\t\tlet reh: RequestErrorHandling = this.apiClient.project(this.prjId).postJson('ImportIfc/Poll', sessionId);\r\n\t\tlet rx: RequestExecution = reh.handleError(\"Ifc poll failed\", 'The poll failed.');\r\n\r\n\t\tlet lookBusy: boolean = false;\r\n\t\tlet hrm: IFCPollStatus = await rx.jsonResult(lookBusy); // don't do hour-glass during poll.\r\n\t\treturn hrm;\r\n\t}\r\n\tpublic async endJob(sessionId:string):Promise { // (We use this to let server clean up book-keeping info on session.)\r\n\t\tlet reh:RequestErrorHandling = this.apiClient.project(this.prjId).postJson('ImportIfc/EndJob', sessionId);\t\t\r\n\t\tlet hrm:string = await reh.jsonResult(false); // don't do hour-glass. //let rx:RequestExecution = reh.handleError(\"endJob failed\", 'endJob failed.'); // ka vi slippe for den?\r\n\t\tconsole.log('endJob:',hrm);\r\n\t\treturn hrm;\r\n\t}\r\n}\r\n\r\nexport class IFCImporter2 implements IfIFCImporter {\r\n\t// make azureWebJob comply to this structure.\r\n\tconstructor(public awj_Client2: AWJClient, public prjId: string, public userId:string) {}\r\n\tasync queue(form: FormData, prjId: string): Promise<[string | undefined, string | undefined]> {\r\n\t\t// https://bg-worker-wa.azurewebsites.net/jobs/run\r\n\t\t//$jobId = curl.exe \"$srv/run\" -F \"x=@file.ifc\" -H \"PrjId: e0f41b07-d5a9-40f2-b213-3354c6aac4d9\" -H \"UserId: 75f3e108-2e97-43a0-bd6d-2ef6c8cd6249\" --no-progress-meter\r\n\r\n\t\tlet rm:RequestMethod = this.awj_Client2.custom(); // for /jobs/run\r\n let config = rm.request; // RM.request is config..\r\n (config.headers)[\"PrjId\"] = prjId;\r\n (config.headers)[\"UserId\"] = this.userId; \r\n\t\tlet base = rm.request.route; // request._apiUrl;\r\n\t\tlet reh: RequestErrorHandling = rm.postForm('/jobs/run', form); \r\n\t\tlet rx: RequestExecution = reh.handleError('Ifc import failed', `Problems starting job at ${base}.`);\r\n\t\tlet hrm: IFCQueueStatus = await rx.jsonResult(); // (try-catch won't help us, because of handleErr.)\r\n\t\tconsole.log('azure:',hrm); // here, we just get 'undefined' if we have a CORS error.\r\n\r\n\t\tif (hrm == undefined) {\r\n\t\t\tconsole.log('(hrm was undefined.)');\r\n\t\t\treturn [undefined, undefined];\r\n\t\t} // an empty response here, means we fully failed (in the call itself, not in BL.)\r\n\t\tconsole.log('queueSession, sessionId:', hrm.sessionId);\r\n\t\treturn [hrm.sessionId, hrm.err]; // fixme, we would also like to return hrm.err.\t\t\t\r\n\t}\r\n\tpublic async poll(sessionId: string): Promise {\r\n\t\t// https://bg-worker-wa.azurewebsites.net/jobs/run/history?jobId=$jobId\r\n\t\t//let reh: RequestErrorHandling = this.awjClient.custom().postJson(`/jobs/run/history?jobId=${sessionId}`,{});\r\n\t\tlet reh: RequestErrorHandling = this.awj_Client2.custom().get(`/jobs/history?jobId=${sessionId}`);\r\n\t\tlet rx: RequestExecution = reh.handleError(\"Ifc poll failed\", 'The poll failed.');\r\n\r\n\t\tlet lookBusy: boolean = false;\r\n\t\tlet hrm: IFCPollStatus = await rx.jsonResult(lookBusy); // don't do hour-glass during poll.\r\n\t\t//console.log('history:', hrm);\r\n\t\tconsole.table(hrm);\r\n\t\treturn hrm;\r\n\t}\r\n\tpublic async endJob(sessionId:string):Promise { // (We use this to let server clean up book-keeping info on session.)\r\n\t\tconsole.log('endJob for azure:');\r\n\t\tlet s:LogDto = await this.logs(sessionId);\r\n\t\treturn ` ERR?:${s.err} LOG?:${s.log}`;\r\n\t}\r\n\r\n\t// We should use the Azure WebJobs API to retrieve the import log! Especially in case of failure!\r\n\tpublic async logs(sessionId: string): Promise {\r\n\t\tlet reh: RequestErrorHandling = this.awj_Client2.custom().get(`/jobs/logs?jobId=${sessionId}`);\r\n\t\tlet rx: RequestExecution = reh.handleError(\"Ifc poll failed\", 'The poll failed.');\r\n\r\n\t\tlet lookBusy: boolean = false;\r\n\t\tlet hrm: LogDto = await rx.jsonResult(lookBusy); // don't do hour-glass during poll.\r\n\t\tconsole.log(hrm);\r\n\t\treturn hrm;\r\n\t}\r\n\r\n\r\n}\r\n","import { Router } from 'aurelia-router';\r\nimport {autoinject} from \"aurelia-framework\";\r\nimport {AWJClient, ApiClient, RequestErrorHandling} from \"../../services/api-client\";\r\nimport {AppContextService} from \"../../services/app-context-service\";\r\nimport { RequestExecution } from \"../../services/api-client\";\r\nimport { ModalService } from \"app/services/modal-service\";\r\nimport { IFCImporter as IFCImporter1, IFCImporter2, IfIFCImporter as IfIFCImporterJob } from './IFCImporter';\r\n\r\n@autoinject()\r\nexport class IfcImport {\r\n\tpublic files: File[] = [];\t\r\n\tpublic impLog:string = '';\r\n\tpublic progress:string = '';\r\n\tpublic pct:number = 0;\r\n\tpublic prevLineNr:number=-1;\r\n\tconstructor(\r\n\t\tpublic apiClient: ApiClient, // lets us call backend.\r\n\t\tpublic awj_Client: AWJClient,\r\n\t\tpublic appContext: AppContextService, // gives us projectId, in a backwards sort of way (we actually have to provide it..)\r\n\t\tpublic modal: ModalService, // lets us show error msg.\r\n\t\tprivate router: Router, // lets us navigate to work-area to see resulting grid.\r\n\t) {}\r\n\tattached() { this.focusInputField(); }\r\n\tasync activate(params: any) { if (params.projectId) { this.appContext.setProject(params.projectId); } }\r\n\tfocusInputField() { document.getElementById('id_fileinput')!.focus(); } //setTimeout(() => { } , 200); // not needed here..\r\n goToRoute(route:string): void { this.router.navigateToRoute(route,{projectId: this.appContext.projectId}); }\r\n\tclearProgress() { this.impLog = '..'; this.pct = 0; this.progress = '-'; }\r\n\tprepareFileForm():FormData|undefined {\r\n\t\tconsole.log('uploadFile..');\r\n\t\tthis.clearProgress(); // maybe we should clear, already when we click file-select.\r\n\t\tif (this.files.length == 0) {\r\n\t\t\tthis.modal.OpenMessage('Warning','You must pick an IFC file to upload first.');\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tthis.impLog = '..'; // prepareFileForm\r\n\t\tconsole.log('name:', this.files[0].name); // vi beholder denne, fordi det gør vi kan orientere os i loggen - hvilke fejl hører til hvilke filer..\r\n\t\tlet formData = new FormData();\r\n\t\tformData.append(\"file\", this.files[0]);\r\n\t\treturn formData;\r\n\t}\r\n\tpublic async uploadFile() {\r\n\t\tlet form = this.prepareFileForm();\r\n\t\tif (form) { await this.directUpload(form); }\r\n\t}\r\n\tpublic async directUpload(form:FormData) {\r\n\t\tlet prjId = this.appContext.projectId;\r\n\t\tlet reh:RequestErrorHandling = this.apiClient.project(prjId).postForm('ImportIfc/ImportIfcFile', form);\r\n\t\tlet rx:RequestExecution = reh.handleError(\"Ifc import failed\", 'The import failed.');\r\n\t\tlet hrm:IFCImportStatus;\r\n\t\ttry {\r\n\t\t\thrm = await rx.jsonResult();\r\n\t\t\tconsole.log('err?',hrm.err);\t\t\r\n\t\t\tthis.impLog = (hrm.err ? hrm.err : hrm.log);//directUpload\r\n\t\t} catch (e) {\r\n\t\t\tconsole.log('catched:',e);\r\n\t\t\treturn;\r\n\t\t} \r\n\t}\r\n\tpublic async queueFile1() { this.impl_queueFile('BW',new IFCImporter1(this.apiClient, this.appContext.projectId)); }\r\n\tpublic async queueFile2() { this.impl_queueFile('WJ',new IFCImporter2(this.awj_Client,this.appContext.projectId, this.appContext.currentUser?.id!)); }\r\n\tpublic async impl_queueFile(who:string, importer:IfIFCImporterJob) {\r\n\t\tlet form = this.prepareFileForm();\r\n\t\tif (form) { \r\n\t\t\tthis.ii = importer;\r\n\t\t\tawait this.queueIt(form,who); \r\n\t\t}\r\n\t}\r\n\tii:IfIFCImporterJob|undefined = undefined;\r\n\r\n\tpublic async queueIt(form:FormData,who:string) { \r\n\t\tlet prjId = this.appContext.projectId;\r\n\t\t\r\n\t\tlet [hrm_sessionId,hrm_err] = await this.ii!.queue(form,prjId);\r\n\t\tconsole.log('hrm_sessionId',hrm_sessionId,'hrm_err',hrm_err);\r\n\t\tif (!hrm_sessionId) {\r\n\t\t\tconsole.log('(got no session)');\r\n\t\t\tthis.ii = undefined; // clear it again..\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.log('still here');\r\n\r\n\t\tlet filename:string = this.files[0].name;\r\n\t\tlet inf = `(${who}) Queued as session ${hrm_sessionId}.. (${filename})`;\r\n\t\tthis.impLog = (hrm_err ? hrm_err : inf);\r\n\t\tthis.importCount=0;\r\n\t\tthis.sessionId=hrm_sessionId;\r\n\t\tthis.scheduleNextPoll(); \r\n\t}\r\n\tsessionId:string='?';\r\n\timportCount:number = 0;\r\n\tpollMax:number = 9999; //10*60; //300;//6;// ten minutes, for now.\r\n\t// Lusket ide - overvej at poll sjældnere og sjældnere, som tiden går!\r\n\tpoll_Interval:number = 5*1000; // vi boer polle sjaeldnere.\r\n\tscheduleNextPoll() { setTimeout( async () => this.tick(), this.poll_Interval); } \r\n\tasync tick() { \r\n\t\tif (await this.poll_stillWaiting()) { \r\n\t\t\tthis.scheduleNextPoll(); \r\n\t\t} else {\r\n\t\t\tif (this.ii) { // only clean up, if there IS a job to clean up.\r\n\t\t\t\tlet inf:string = await this.ii!.endJob(this.sessionId);\r\n\t\t\t\tthis.showLog(inf);\r\n\t\t\t\tthis.ii = undefined; // (We should clear it.)\r\n\t\t\t}\r\n\t\t} \r\n\t}\r\n\tasync poll_stillWaiting():Promise { // returns false if we should stop.\r\n\t\t++this.importCount;\r\n\t\tlet st:IFCPollStatus = await this.pollForImportStatus(this.sessionId);\r\n\t\tthis.updatePct(st);\r\n\t\tlet txt = this.statusText(st.status);\r\n\t\tthis.progress = `${this.importCount}: ${txt} ${st.current}`;\r\n\t\treturn (st.status == ImportStatusEnum.Waiting && this.importCount < this.pollMax);\r\n\t}\r\n\tupdatePct(st:IFCPollStatus) {\r\n\t\tswitch (st.status) {\r\n\t\t\tcase ImportStatusEnum.Succeeded: this.pct = 100; break;\r\n\t\t\tcase ImportStatusEnum.Failed: this.pct = 50; break; // IE let user read label.\r\n\t\t\tdefault: this.pct = this.importCount; break;\r\n\t\t}\t\t\r\n\t}\r\n\tstatusText(status:ImportStatusEnum):string {\r\n\t\tswitch (status) {\r\n\t\t\tcase ImportStatusEnum.Failed: return \"Failed!\";\r\n\t\t\tcase ImportStatusEnum.Waiting: return \"Waiting..\";\r\n\t\t\tcase ImportStatusEnum.Succeeded: return \"Completed!\";\r\n\t\t}\r\n\t\treturn `unknown(${status})`;\r\n\t}\r\n\tasync pollForImportStatus(sessionId:string):Promise {//UB:poll_stillWaiting\r\n\t\tif (!this.ii) { return { status:ImportStatusEnum.Failed, log:'', err:'err', current:'current', lineNr:-1 }}\r\n\t\tlet status:IFCPollStatus = await this.ii!.poll(sessionId); // this.poll(sessionId,ii); \r\n\t\tif (!status) { \r\n\t\t\tconsole.log('empty IFCPollStatus:',status); \r\n\t\t return { log:'?', err:'?',current:'?', lineNr:-1, status:ImportStatusEnum.Failed}; \r\n\t }\r\n\t\tswitch (status.status) {\r\n\t\t\tcase ImportStatusEnum.Failed: this.impLog += '\\nERROR: '+ status.err + '\\n Log:\\n'+status.log; break;\r\n\t\t\tcase ImportStatusEnum.Succeeded: this.impLog += '\\n'+status.log; break;\r\n\t\t\tcase ImportStatusEnum.Waiting:\r\n\t\t\t\tif (status.lineNr != this.prevLineNr) {\r\n\t\t\t\t\tthis.impLog += '\\n'+status.current; \r\n\t\t\t\t} else { // if we _don't_ have a new line, just add a dot..\r\n\t\t\t\t\tthis.impLog += '.'; \r\n\t\t\t\t}\r\n\t\t\t\tthis.prevLineNr = status.lineNr;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault: this.impLog += `\\nUnknown status: ${status.status}`;\r\n\t\t}\r\n\t\treturn status; \r\n\t}\r\n\r\n\t/*\r\n\tpublic async poll(sessionId:string,ii:IFCImporter):Promise {\r\n\t\t//return ii.poll(sessionId);\r\n\t\tlet prjId = this.appContext.projectId;\r\n\t\tlet reh:RequestErrorHandling = this.apiClient.project(prjId).postJson('ImportIfc/Poll', sessionId);\r\n\t\tlet rx:RequestExecution = reh.handleError(\"Ifc poll failed\", 'The poll failed.');\r\n\r\n\t\tlet lookBusy:boolean = false; \r\n\t\tlet hrm:IFCPollStatus = await rx.jsonResult(lookBusy); // don't do hour-glass during poll.\r\n\t\treturn hrm;\r\n\t}\r\n\t*/\r\n\r\n\tpublic async killNice():Promise { \r\n\t\tif (!this.sessionId) { this.sessionId = '00000000-0000-0000-0000-000000000000'; } \r\n\t\tlet reh:RequestErrorHandling = this.apiClient.project(this.appContext.projectId).postJson('ImportIfc/KillNice', this.sessionId);\t\t\r\n\t\tlet hrm:string = await reh.jsonResult(false); \r\n\t\tconsole.log('killNice:',hrm);\r\n\t}\r\n\tpublic async killAll():Promise { \r\n\t\tlet reh:RequestErrorHandling = this.apiClient.project(this.appContext.projectId).postJson('ImportIfc/KillAll',{});\t\t\r\n\t\tlet hrm:string = await reh.jsonResult(false); \r\n\t\tconsole.log('killAll:',hrm);\r\n\t}\r\n\tpublic showLog(L:string) { this.impLog += '\\n\\n' + L; }\r\n}\r\n\r\nenum ImportStatusEnum { NotYet=-1, Waiting=0, Succeeded=1, Failed=2 } \r\n// De maa endelig ikke staa forrest..\r\nexport interface IFCPollStatus { // for..poll. \r\n\tstatus:ImportStatusEnum;\r\n\tlog:string;\r\n\terr:string;\t\r\n\tcurrent:string;\r\n\tlineNr:number;\r\n}\r\nexport interface IFCImportStatus { // for original import (non-queued).\r\n\tlog:string;\r\n\terr:string;\r\n}\r\nexport interface IFCQueueStatus { // for V2.\r\n\tsessionId:string;\r\n\terr:string;\r\n}\r\n\r\nexport interface LogDto { \r\n\terr:string;\r\n\tlog:string; \r\n}\r\n\r\n\r\n\r\n\r\n\t\t/* Jeg har endelig (?) fattet lifecycle for appContext's projectId:\r\n\t\than er nemlig helt 'lokal', og har ikke noget større stillads bag sig.\r\n\t\tHan kommer direkte som en parameter fra vores REST route,\r\n\t\tog har ikke nogen langlivet state.\r\n\t\t Dvs. han kommer kun ind i appContext, hvis nogen fører ham derind.\r\n\t\t \r\n\t\tSå det resterende spørgsmål er, hvem der fisker ham ud af vores route.\r\n\t\tDet er selve route-erklæringerne i aox.ts, a la\r\n\t\t-- route: ['project/:projectId/manual-entry']\r\n\t\tdvs. i vores case her, kommer projectId fra \r\n\t\t-- route: ['project/:projectId/ifc-import'],\t\t \r\n\t\t*/\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","exports","IFCImporter","constructor","apiClient","prjId","async","form","rx","this","project","postForm","handleError","hrm","jsonResult","undefined","console","log","sessionId","err","postJson","reh","IFCImporter2","awj_Client2","userId","rm","custom","config","request","headers","base","route","get","table","s","logs","IfcImport","awj_Client","appContext","modal","router","files","impLog","progress","pct","prevLineNr","ii","importCount","pollMax","poll_Interval","attached","focusInputField","params","projectId","setProject","document","getElementById","focus","goToRoute","navigateToRoute","clearProgress","prepareFileForm","length","OpenMessage","name","formData","FormData","append","directUpload","e","impl_queueFile","currentUser","who","importer","queueIt","hrm_sessionId","hrm_err","queue","inf","scheduleNextPoll","setTimeout","tick","poll_stillWaiting","endJob","showLog","st","pollForImportStatus","updatePct","txt","statusText","status","current","ImportStatusEnum","Waiting","Succeeded","Failed","lineNr","poll","L","autoinject"],"sourceRoot":""}