{"version":3,"file":"app-9669b7f3.dc6c615a18a9f627.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}.whynogeneralcontainerclass2{maax-height:calc(100vh - 6em);max-heightt:20em;height:fit-content;overflow:hidden}.import-ifc{display:flex;flex-direction:column}.import-ifc .inputbar{margin:15px}.import-ifc button{margin-left:15px}.import-ifc .stage{not-border:solid red 2px}.import-ifc .progress{margin:15px 0 15px 0;height:1.6em;flex-shrink:0;background:#bbb}.import-ifc pre.note{display:inline-block}.import-ifc pre.log{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,6BACC,6BAAA,CACA,gBAAA,CACA,kBAAA,CACG,eAAA,CAGJ,YACC,YAAA,CACA,qBAAA,CACA,sBAAA,WAAA,CACA,mBAAA,gBCDQ,CDGR,mBACC,wBAAA,CAGD,sBACC,oBAAA,CACA,YAAA,CACA,aAAA,CACA,eAAA,CAGD,qBACC,oBAAA,CAGD,oBAAA,eAAA,CAAA,UAAA,CACC,cAAA,CACA,YCpBO,CDqBP,eAAA,CACA,kBAAA,CACA,aAAA,CACA,WAAA\",\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Module\nvar code = ` `;\n// Exports\nexport default code;","import { ApiClient } from \"../../services/api-client\";\r\nimport { RequestErrorHandling } from 'app/services/RequestErrorHandling';\r\nimport { RequestMethod } from 'app/services/RequestMethod';\r\nimport { AWJClient } from 'app/services/AWJClient';\r\nimport { RequestExecution } from 'app/services/RequestExecution';\r\nimport { IFCQueueStatus, IFCPollStatus, LogDto } from './ifc-import';\r\n\r\nexport interface IfIFCImporter {\r\n\tqueue(form: FormData, prjId: string, withProcessingUI:boolean): Promise<[string | undefined, string | undefined, boolean | undefined]>;\r\n\tpoll(sessionId: string, properWebJob:boolean): Promise;\r\n\tendJob(sessionId:string):Promise;\r\n}\r\n\r\nexport class IFCImporter1_Collab implements IfIFCImporter {\r\n\t// connects to Collab's ImportIfc/ImportIfcFileV2 controller action.\r\n\tconstructor(public apiClient: ApiClient, public prjId: string) { }\r\n\t\r\n\tasync queue(form: FormData, prjId: string, withProcessingUI:boolean): Promise<[string | undefined, string | undefined, boolean | undefined]> {\r\n\t\tlet reh: RequestErrorHandling = this.apiClient.project(prjId).postForm('ImportIfc/ImportIfcFileV2_BackgroundWorker', 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, 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, hrm.properWebJob]; // fixme, we would also like to return hrm.err.\t\t\t\r\n\t}\r\n\tpublic async poll(sessionId: string): Promise { //1\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_AWJ 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\t\r\n\tasync queue(form: FormData, prjId: string, withProcessingUI:boolean): Promise<[string | undefined, string | undefined, boolean | 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\t//https://bg-worker-wa.azurewebsites.net/perf/index\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 (config.headers)[\"WithUI\"] = withProcessingUI;\r\n\t\tlet base = rm.request.route; // request._apiUrl;\r\n\t\tconsole.log('queue - just before file upload');\r\n\t\tlet reh: RequestErrorHandling = rm.postForm('/jobs/run', form); // fixme, upload-progress here?\r\n\t\tlet rx: RequestExecution = reh.handleError('Ifc import failed', `Problems starting job at ${base}.`);\r\n\r\n\r\n\t\tfunction callback1(e:ProgressEvent) { \r\n\t\t\tconst pct = Math.floor((e.loaded/e.total)*100);\r\n\t\t\t// loaded, total.\r\n\t\t\t//console.log('Im being called back', pct); \r\n\t\t\t//$('#the_progress').prop('value', pct); // this won't work on that HTML element.\r\n\t\t\t$('#the_progress').css('width', `${pct}%`);\r\n\t\t\t$('#the_progress').text(`Upload pct:${pct}`);\r\n\t\t}\r\n\r\n\t\tconst dontLookBusy = false;\r\n\t\tlet hrm: IFCQueueStatus = await rx.jsonResult(dontLookBusy, callback1 ); // (try-catch won't help us, because of handleErr.)\r\n\t\tconsole.log('queue - just AFTER file upload');\r\n\t\tconsole.log('azure, /jobs/run said:',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, 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('/jobs/run queueSession, sessionId:', hrm.sessionId);\r\n\t\treturn [hrm.sessionId, hrm.err, hrm.properWebJob]; // fixme, we would also like to return hrm.err.\t\t\t\r\n\t}\r\n\r\n\tpublic async poll(sessionId: string, properWebJob:boolean): Promise {//2\r\n\t\t// this is where we poll /jobs/history/jobId=??\r\n\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}&properWebJob=${properWebJob}`);\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\r\n\t\t// ( hrm)['_']= '/jobs/history/jobId=??'; // just a marker where this log comes from..\r\n\t\t// console.table(hrm);\r\n\r\n\t\tconsole.log('poll:', hrm.danielStage, hrm.danielMsg, hrm.log);\r\n\t\treturn hrm;\r\n\t}\r\n\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 `(endJob) 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\t// JG: We should NOT do this, for our non-proper webJobs!\r\n\t\tlet reh: RequestErrorHandling = this.awj_Client2.custom().get(`/jobs/logs?jobId=${sessionId}&properWebJob=false`);\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\"; // bindable\r\nimport {ApiClient} from \"../../services/api-client\";\r\nimport { RequestErrorHandling } from 'app/services/RequestErrorHandling';\r\nimport { AWJClient } from 'app/services/AWJClient';\r\nimport {AppContextService} from \"../../services/app-context-service\";\r\nimport { RequestExecution } from 'app/services/RequestExecution';\r\nimport { ModalService } from \"app/services/modal-service\";\r\nimport { IFCImporter1_Collab, IFCImporter2_AWJ, IfIFCImporter } from './IFCImporter';\r\nimport { DialogController } from 'aurelia-dialog';\r\n\r\n\r\n@autoinject()\r\nexport class IfcImport {\r\n\tpublic stage:number = UI_ImportStage.SelectFileFirst0;\r\n\tpublic showall:boolean = false; //true;\r\n\tpublic showTheLog:boolean = false; //true; //false;\r\n\r\n\t//public diagTools:boolean = true; is the negative/inverted of asDialog (show diag tools when NOT dialog-mode).\r\n\tpublic asDialog:boolean = false; //@bindable \r\n\r\n\tpublic qinfo:string = \"??\";\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\r\n\tconstructor(\r\n\t\tprotected dialog: DialogController,\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\r\n\tattached() { \r\n\t\tconsole.log('ifc-import attached'); \r\n\t\tthis.focusInputField(); \r\n\t}\r\n\r\n\tasync activate(params: any) { \r\n\t\tconsole.log('ifc-import activate', params); \r\n\t\tif (params.projectId) { this.appContext.setProject(params.projectId); } \r\n\t\tif (params.asDialog) { this.asDialog = true; }\r\n\r\n\t\tawait this.prepoll(); // test.\r\n\t}\r\n\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 = '-'; }//clearProgress\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\r\n\tpublic async directUploadFile() {\r\n\t\tlet form = this.prepareFileForm();\r\n\t\tif (form) { await this.directUpload(form); }\r\n\t}\r\n\r\n\t// \"Take #0: \"\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_Direct', form); // our very first approach.\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 const NO_AUTOCLOSE = false;\r\n\t\t\tthis.setOKResult(!hrm.err, NO_AUTOCLOSE);//directUpload - if we don't have error, we have OK.. - in .\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\r\n\tpublic static oneOrTwo:boolean=false;\r\n\tpublic async queueFile1Or2(event:PointerEvent) { // Queue-button, not currently visible.\r\n\t\tawait (IfcImport.oneOrTwo ? this.queueFile1() : this.queueFile2(event)); \r\n\t}\r\n\r\n\t// \"Take #1: \" (ImportIfc/ImportIfcFileV2_BackgroundWorker)\r\n\tpublic async queueFile1() { \r\n\t\tconst YES_withProcessingUI = true;\r\n\t\tthis.impl_queueFile('BW',new IFCImporter1_Collab(this.apiClient, this.appContext.projectId), YES_withProcessingUI); \r\n\t}\r\n\r\n\t// \"Take #2: \" (this is the variant that MAY use AzureStorageQueue!)\r\n\tpublic async queueFile2(event:PointerEvent) { // from UPLOAD button.\r\n\t\tconst withShift = event.shiftKey;\r\n\t\tconsole.log('A saveNewRevision, event:', event.shiftKey, event);\r\n\t\tconst withProcessingUI:boolean = (withShift);\r\n\t\t\r\n\t\tthis.stage = UI_ImportStage.UploadStarted1_;//queueFile2\r\n\t\tawait this.impl_queueFile('WJ',this.makeQueueClient() , withProcessingUI); \r\n\t}\r\n\r\n\tpublic makeQueueClient():IFCImporter2_AWJ{\r\n\t\treturn new IFCImporter2_AWJ(this.awj_Client,this.appContext.projectId, this.appContext.currentUser?.id!);\r\n\t} \r\n\r\n\t/* Hmm, where do we control if we use the storage queue approach?\r\n\tI found the answer - it is controlled by \r\n\tC:\\dev\\aoc\\OddJob\\Controllers\\JobsController.cs, method 'run()'!\r\n\tIt will, itself, decide whether to use azure storage queue or old AzureWebJob approach.\r\n\t*/\r\n\r\n\tpublic async impl_queueFile(who:string, importer:IfIFCImporter, withProcessingUI:boolean) {\r\n\t\tlet form = this.prepareFileForm();\r\n\t\tif (!form) { return; }\r\n\t\tthis.ii = importer;\r\n\t\tawait this.queueIt(form,who, withProcessingUI); \r\n\t}\r\n\r\n\tii:IfIFCImporter|undefined = undefined;\r\n\r\n\tpublic async queueIt(form:FormData,who:string,withProcessingUI:boolean) { \r\n\t\tlet prjId = this.appContext.projectId;\r\n\t\t\r\n\t\tconsole.log('queueIt, calling IFCImporter2_AWJ.queue..');\r\n\t\tlet [hrm_sessionId, hrm_err, hrm_properWebJob] = await this.ii!.queue(form,prjId, withProcessingUI);\r\n\r\n\t\tif (!withProcessingUI) {\r\n\t\t\tconsole.log('as processing UI not requested, skipping directly to goodbye-3-2-1 stage.');\r\n const YES_AUTOCLOSE = true;\r\n\t\t\tthis.setOKResult(true,YES_AUTOCLOSE); // queueIt, direct to close-countdown. this.stage = UI_ImportStage.Completed3;\r\n\t\t\treturn;\r\n\t\t} // todo: with goodbye-approach, we should instead send ready/failed mails.\r\n\r\n\t\t// true: withProcessingUI, so we poll for and display updates.\r\n\t\tthis.stage = UI_ImportStage.ProcessingStarted2;\r\n\r\n\t\tconsole.log('/jobs/run 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);//queueIt\r\n\t\tthis.importCount=0;\r\n\t\tthis.sessionId=hrm_sessionId;\r\n\t\tthis.properWebJob = (hrm_properWebJob == true); // the error is in being lax at all, sorry.\r\n\t\tthis.scheduleNextPoll(); \r\n\t}\r\n\tsessionId:string='?';\r\n\tproperWebJob:boolean = true; // expect for the best..\r\n\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\t//poll_Interval:number = 15*1000; //5*1000; // vi boer polle sjaeldnere.\r\n\tpoll_Interval:number = 5*1000; //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 { // DONE..\r\n\t\t\tconsole.log('(tick concluded done)');\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); // This ALSO pulls a log, but this time from \r\n\t\t\t\tthis.ii = undefined; // (We should clear it.)\r\n\t\t\t}\r\n\r\n\t\t\t// Because this 'secondary' progress only happens in manually triggered debug-cases (shift-key),\r\n\t\t\t// and because we want to show a LOG, we turn OFF auto-close when this tick-mechanism is used.\r\n const NO_AUTOCLOSE = false;\r\n\t\t\tthis.setOKResult(true,NO_AUTOCLOSE);// in tick.\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, this.properWebJob);\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} ${st.danielStage}`; // ${st.danielMsg}`;\r\n\t\treturn (st.status == ImportStatusEnum.Waiting && this.importCount < this.pollMax);\r\n\t}\r\n\r\n\r\n\tupdatePct(st:IFCPollStatus) {\r\n\t\tconst TOTAL_STEPS:number = 17.0; //16.0;\r\n\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 = 100*(st.danielStage/TOTAL_STEPS); break;\r\n\t\t\t//default: 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\r\n\tpollCounter:number=0;\r\n\tprogressTestHack:boolean = false;\r\n\tasync pollForImportStatus(sessionId:string, properWebJob:boolean):Promise {//UB:poll_stillWaiting\r\n\t\tif (!this.ii) { return { status:ImportStatusEnum.Failed, log:'', err:'err', current:'current', lineNr:-1, danielStage:-5, danielMsg:'-' }}\r\n\t\t++this.pollCounter;\r\n\t\tif (this.pollCounter == 2 && this.progressTestHack) { return this.theProgressTestHack(); } \r\n\r\n\t\tlet status:IFCPollStatus = await this.ii!.poll(sessionId,properWebJob); // 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, danielStage:-6, danielMsg:'-'}; \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;//pollForImportStatus\r\n\t\t\tcase ImportStatusEnum.Succeeded: this.impLog += '\\n (Succeeded:)'+status.log; break;//pollForImportStatus\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;//pollForImportStatus \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 += '.';//pollForImportStatus \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 += `\\n(pollForImportStatus) Unknown status: ${status.status}`;\r\n\t\t}\r\n\t\treturn status; \t\t\r\n\t} // So, pollForImportStatus will blast the log from IFCPollStatus.log.\r\n\r\n\ttheProgressTestHack(): IFCPollStatus | PromiseLike {\r\n\t\t//this.setOKResult(true); // (IE FAKE-completed-test.) \r\n\t\treturn { //IFCPollStatus\r\n\t\t\tstatus:ImportStatusEnum.Succeeded, //; // (IE FAKE-completed-test\r\n\t\t\tlog: 'our own fake success log', //string;\r\n\t\t\terr: 'fake - no errors', //string;\t\r\n\t\t\tcurrent: 'no-current', //string;\r\n\t\t\tlineNr: -42, //number;\r\n\t\t\tdanielStage: 10, //number;\t\t\t\r\n\t\t\tdanielMsg:'-'\r\n\t\t} //IFCPollStatus\r\n\t\t//this.stage = UI_ImportStage.Completed2; // (IE FAKE-completed-test.) \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(the_log:string) { //UB:tick\r\n\t\tconsole.log(\"(showLog REPLACES the log shown so far, because they SHOULD contain identical info, and in cases where they don't, we want the variant showLog tells.)\");\r\n\t\t// (this would repeat the log twice.)\r\n\t\t//this.impLog += '\\n\\n(showLog:) ' + L; //-showLog\r\n\t\tthis.impLog = '(showLog:)\\n' + the_log; //-showLog\r\n\t\t// THIS is the last thing we do, on .. success?xxx\r\n\t}\r\n\r\n\t///////\r\n\tasync prepoll() {\r\n\t\t// hvad hulen er prepoll, og hvorfor hedder den testMe?\r\n\t\t// Det er noget jeg kalder i selve activate() for ifc-import.\r\n\t\t// Måske handler det om at vise, hvor stor køen er? - den returnerer en QueueInfo..?\r\n // hvorfor får jeg en CORS fejl på en GET? er det altid sådan?\r\n\r\n\t\tlet client = this.makeQueueClient();\r\n\t\tlet reh:RequestErrorHandling = client.awj_Client2.custom().get('/jobs/getQueueInfo'); // testMe - todo, this should be renamed to getQueueInfo.\r\n\t\tlet rx:RequestExecution = reh.handleError(\"Could not get queue info\", 'Could not get queue info.');\r\n\r\n\t\tlet lookBusy:boolean = false; // don't do hour-glass during poll.\r\n\t\tlet q:QueueInfo = await rx.jsonResult(lookBusy); \r\n\t\tconsole.log('testMe:', q);\r\n\t\t// ${q.maxNum} - maxNum is an upper bound, which is quick to retrieve but inaccurate.\r\n\t\tif (q.msgCount > 0) {\r\n\t\t\tthis.qinfo = `(In queue: ${q.msgCount}) . Last submit: ${q.lastSubmit}\\n Check Time: ${q.lastCheck}`;\r\n\t\t} else {\r\n\t\t\tthis.qinfo = '(No jobs in queue.)';\r\n\t\t}\r\n\t}\r\n\r\n\tpublic okResult:boolean = false; // we COULD set some kind of id, but the data we are importing should be obvious to locate by yourself.\r\n\r\n\tsetOKResult(okResult: boolean, autoClose:boolean) { \r\n\t\tconsole.log('setOKResult', okResult);\r\n\t\tthis.okResult = okResult; \r\n\t\tif (!autoClose) { this.showTheLog = true; }\r\n\r\n\t\tif (okResult) {\r\n\t\t\tconsole.log('setting started to 2..');\r\n\t\t\tthis.stage = UI_ImportStage.Completed3; // done.\r\n if (autoClose) { this.launchCountdown(); } // in setOKResult.\r\n\t\t} else {\r\n\t\t\tconsole.log('setting started to 3..');\r\n\t\t\tthis.stage = UI_ImportStage.Failed4; // error/log.\r\n\t\t}\r\n\t}\r\n\r\n\tcountdown:number = 11;\r\n\tintervalId:number = 0;\r\n\tlaunchCountdown() { // UB: setOKResult\r\n\t\tconsole.log('launchCountdown');\r\n\t\tif (this.intervalId) {\r\n\t\t\tconsole.warn('launchCountdown, already set:', this.intervalId);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t//const countDown_Seconds = 10;\r\n\t\tconst countDown_Seconds = 60;\r\n\t\tthis.countdown = countDown_Seconds; //10;\r\n\t\tthis.intervalId = setInterval( async () => this.countdownToClose(), 1000); \r\n\t\t//setTimeout( async () => this.countdownToClose(), 1000); \r\n\t} \r\n\r\n\tasync countdownToClose() {\r\n\t\tconsole.log('countdown:', this.countdown);\r\n\r\n\t\tif (this.countdown <= 0) { \r\n\t\t\tclearInterval(this.intervalId); this.intervalId = 0;\r\n\t\t\tthis.closeImport(); \r\n\t\t} else {\r\n\t\t\t--this.countdown;\r\n\t\t}\r\n\t}\r\n\r\n\tcloseImport() { // button clicked.\r\n\t\t// Report back if we had a good import, with either OK or Cancel.\r\n\t\tconsole.log('closeImport clicked, okResult is:', this.okResult);\r\n\t\tif (this.okResult) {\r\n\t\t\t// note that this would fail, if we were not called as a dialog!\r\n\t\t\tif (!this.dialog.controller) {\r\n\t\t\t\tconsole.warn('(aborting dialog-ok as we are not in a dialog-controller context.)');\r\n\t\t\t\tthis.stage = UI_ImportStage.SelectFileFirst0;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis.dialog.ok(this.okResult); //'good data result'); // todo, SET result.\r\n\t\t} else {\r\n\t\t\tthis.dialog.cancel();\r\n\t\t}\r\n\t}\r\n}\r\n\r\nenum ImportStatusEnum { // Must match C# \r\n\t// (NB, ImportStatusEnum must work as a System.Environment.ExitCode.)\r\n\r\n ProcessQueueMessageAsync_Init = -3,\r\n OddJob_Service_StartAsync_Init = -4,\r\n OnlyControllerLooking=-5, // todo, add to front-end.\r\n NotSetYet = -1, \r\n Waiting = -2, \r\n Succeeded = 0, //-10, //0, // must be ZERO to indicate success.\r\n Failed = 2,\r\n Failed_Ext = 3\r\n\r\n\t//NotYetSet=-1, \r\n\t//Waiting=-2, \r\n\t//Succeeded=0, // must be ZERO to indicate success. \r\n\t//Failed=2,\r\n //Failed_Ext=3\r\n} \r\n// De maa endelig ikke staa forrest..\r\nexport interface IFCPollStatus { // for..poll. // C:\\dev\\aoc\\AO.Command.App\\Services\\IFCImport\\IFCPollStatus.cs\r\n\t/* Source of data is IfcJobStatus, and /home/site/ifc/jobId status-files on bg-worker, azureStorageQueue worker.\r\n\t */\r\n\tstatus:ImportStatusEnum;\r\n\tlog:string;\r\n\terr:string;\t\r\n\tcurrent:string;\r\n\tlineNr:number;\r\n\tdanielStage:number;\r\n\tdanielMsg:string; // (this won't work, because we are not persisting it in the /home/ifc/xxx file.)\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\tproperWebJob:boolean;\r\n}\r\n\r\nexport interface LogDto { \r\n\terr:string;\r\n\tlog:string; \r\n}\r\n\r\nexport interface QueueInfo { \r\n\tmaxNum:number;\r\n\tmsgCount:number;\r\n\tlastSubmit:string;\r\n\tlastCheck:string;\r\n}\r\n\r\nexport enum UI_ImportStage {\r\n\tSelectFileFirst0 = 0,\r\n\tUploadStarted1_ = 1,\r\n\tProcessingStarted2 = 2,\r\n\tCompleted3 = 3,\r\n\tFailed4 = 4\r\n}\r\n\r\n\r\n/* Jeg har endelig (?) fattet lifecycle for appContext's projectId:\r\nhan er nemlig helt 'lokal', og har ikke noget større stillads bag sig.\r\nHan kommer direkte som en parameter fra vores REST route,\r\nog har ikke nogen langlivet state.\r\n\tDvs. han kommer kun ind i appContext, hvis nogen fører ham derind.\r\n\t\r\nSå det resterende spørgsmål er, hvem der fisker ham ud af vores route.\r\nDet er selve route-erklæringerne i aox.ts, a la\r\n-- route: ['project/:projectId/manual-entry']\r\ndvs. i vores case her, kommer projectId fra \r\n-- route: ['project/:projectId/ifc-import'],\t\t \r\n*/\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","IFCImporter1_Collab","constructor","apiClient","prjId","queue","form","withProcessingUI","rx","this","project","postForm","handleError","hrm","jsonResult","undefined","console","log","sessionId","err","properWebJob","poll","postJson","endJob","reh","IFCImporter2_AWJ","awj_Client2","userId","rm","custom","config","request","headers","base","route","e","pct","Math","floor","loaded","total","$","css","text","get","danielStage","danielMsg","s","logs","IfcImport","dialog","awj_Client","appContext","modal","router","stage","UI_ImportStage","SelectFileFirst0","showall","showTheLog","asDialog","qinfo","files","impLog","progress","prevLineNr","ii","importCount","pollMax","poll_Interval","pollCounter","progressTestHack","okResult","countdown","intervalId","attached","focusInputField","activate","params","projectId","setProject","prepoll","document","getElementById","focus","goToRoute","navigateToRoute","clearProgress","prepareFileForm","length","OpenMessage","name","formData","FormData","append","directUploadFile","directUpload","NO_AUTOCLOSE","setOKResult","queueFile1Or2","event","oneOrTwo","queueFile1","queueFile2","impl_queueFile","withShift","shiftKey","UploadStarted1_","makeQueueClient","currentUser","who","importer","queueIt","hrm_sessionId","hrm_err","hrm_properWebJob","YES_AUTOCLOSE","ProcessingStarted2","inf","scheduleNextPoll","setTimeout","async","tick","poll_stillWaiting","showLog","st","pollForImportStatus","updatePct","txt","statusText","status","current","ImportStatusEnum","Waiting","Succeeded","Failed","lineNr","theProgressTestHack","killNice","killAll","the_log","q","msgCount","lastSubmit","lastCheck","autoClose","Completed3","launchCountdown","Failed4","warn","setInterval","countdownToClose","clearInterval","closeImport","controller","ok","cancel","autoinject","DialogController","AWJClient"],"sourceRoot":""}