{"version":3,"file":"app-c812c1f4.35f076bcfbc46667.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/services/api-client.ts","webpack://client-app/./src/app/services/app-context-service.ts","webpack://client-app/./src/app/services/bim-viewer-service.ts","webpack://client-app/./src/app/services/bim-viewer-three-d-service.ts","webpack://client-app/./src/app/services/bimsync-setup-handler.ts","webpack://client-app/./src/app/services/cell-edit-service.ts"],"sourcesContent":["import {EventAggregator} from 'aurelia-event-aggregator';\r\nimport {ErrorService} from './error-service';\r\nimport {autoinject} from 'aurelia-framework';\r\nimport {ModalService} from './modal-service';\r\nimport * as settings from 'app-settings.json';\r\nimport {I18N} from 'aurelia-i18n';\r\nimport { AppValues } from '../models/app-values';\r\n//import jwt_decode from \"jwt-decode\";\r\n\r\n// JG: ja jeg er dum..\r\nimport { ProjectTokenService } from './project-token-service';\r\nimport { OrgTokenService } from './org-token-service';\r\nimport { AppContextService } from './app-context-service';\r\nimport { AoxRequestBuilder } from './AoxRequestBuilder';\r\nimport { RequestMethod } from './RequestMethod';\r\nimport { TechInfo } from './TechInfo';\r\nimport { RequestErrorHandling } from './RequestErrorHandling';\r\n\r\n@autoinject\r\nexport class ApiClient {\r\n\r\n public _apiUrl: string = \"\"; //protected\r\n public version: string = \"\";\r\n\tpublic build: string = \"\";\r\n\tpublic clientBuild: string = \"\";\r\n\r\n\tpublic static IsCatendaEnabled_Global:boolean = false; //true; //false;\r\n\r\n constructor(\r\n\t\tprivate modal: ModalService, \r\n\t\tprivate errorService: ErrorService, \r\n\t\tprivate events: EventAggregator, \r\n\t\tprivate i18n: I18N, \r\n\t\tpublic projectTokenService: ProjectTokenService, \r\n\t\tpublic orgTokenService: OrgTokenService\r\n\t\t//public GONE_appContext: AppContextService\r\n\t) {}\r\n\r\n\tpublic set_apiUrl(url:string) {\r\n\t\t//console.log('set_apiUrl to', url, 'instead of', this._apiUrl);\t\t\r\n\t\tthis._apiUrl = url;//in-set_apiUrl\r\n\t\tif (!url) { throw 'trying to set empty apiUrl!'; }\r\n\t}\r\n\tprivate _get_apiUrl():string { // \"internal\" accessor.\r\n\t\tif (!this._apiUrl) { \r\n\t\t\tlet msg = '_get_apiUrl: trying to GET empty apiUrl!';\r\n\t\t\tconsole.trace(msg);\r\n\t\t\tthrow msg; \r\n\t\t}\r\n\t\treturn this._apiUrl;//in-get_apiUrl.\r\n\t}\r\n\r\n\tpublic isProd():boolean {\r\n\t\tlet prodBecauseHTTPS: boolean = Boolean(location.origin.startsWith(\"https\")) // Http(s) determins dev or prod;\r\n\t\treturn prodBecauseHTTPS;\r\n\t}\r\n\r\n public async initialize(): Promise{\r\n\t\t// ApiClient appears to be a DI singleton, just initialized ONCE in main.ts on startup.\r\n\r\n\t\t/* JG: I'm not too happy about this,\r\n\t\t I think they should use a symmetric mechanism,\r\n\t\t so you can control both cases the same way\r\n\t\t (i.e., I don't like that they are controlled by two different config mechanisms.) */\r\n\t\tlet prodBecauseHTTPS: boolean = this.isProd(); //Boolean(location.origin.startsWith(\"https\")) // Http(s) determins dev or prod;\r\n\r\n\t\t// prodBecauseHTTPS = true; // blot til test lokalt.\r\n\r\n\t\tif (prodBecauseHTTPS) { // For prod the api url is supplied via deployment environment vars\r\n // (Beware, this asks the tiny Controller in aspnet server that serves the aurelia UI.)\r\n\r\n\t\t\tconsole.log('location (for origin):', location);\r\n\t\t\tlet ui_baseUrl = location.origin;\r\n\r\n\t\t\tlet api_url:string = await this.custom(ui_baseUrl).get(\"/settings/client\").stringResult(); \r\n\t\t\tthis.set_apiUrl(api_url);//ApiClient.initialize-prod\r\n\t\t\tconsole.log('ApiClient.initialize-prod to:', api_url);\r\n\t\t\t// JG: Shouldn't this also set bimApi and AWJ_Api?\r\n\t\t} else { // For dev use builtin api url dev setting\r\n\t\t\tconsole.log('ApiClient.initialize-dev to:', settings.devApiUrl);\r\n\t\t\tthis.set_apiUrl(settings.devApiUrl);//ApiClient.initialize-dev\r\n\t\t}\r\n\r\n\t\tlet url_path = '?';\r\n\t\tlet techVersionPath = \"Tech/Version\";\r\n\t\ttry {\r\n\t\t\tlet REH:RequestErrorHandling = this.global.get(techVersionPath, true);\r\n\t\t\turl_path = REH.request.route;\r\n\t\t\tlet justAPromise = REH.jsonResult();\r\n\t\t\tlet techInfo:TechInfo = await justAPromise;\r\n\t\t\tthis.version = techInfo.version;\r\n\t\t\tthis.build = techInfo.build;\r\n\t\t} catch (e) {\r\n\t\t\tlet url = url_path; //this._apiUrl + techVersionPath;\r\n\t\t\talert(`cannot reach ${techVersionPath} \\n ${url}`);\r\n\t\t\t// AoxRequestBuilder AKA buildConfig.\r\n\t\t\t// AoxRequestBuilder is put into RequestMethod.\r\n\t\t\t// hvad mon ARB har i route?\r\n\t\t}\r\n\t}\r\n\r\n private async configureClientVersion_notUsed() {\r\n\t\tlet ui_baseUrl = location.origin;\r\n\t\tlet techInfo2: TechInfo =\r\n\t\t\tawait this.custom(ui_baseUrl).get(\"/settings/clientversion\")\r\n\t\t\t\t.jsonResult()\r\n\t\t\t\t.catch(async reason => console.error(await reason.json())); \r\n\r\n\t\tthis.clientBuild = '!' + techInfo2.build;\r\n }\r\n\r\n\tpublic getApiUrl(): string { // \"external\" accessor.\r\n\t\t/* THIS is not good, the image-support-hack, also becomes a reload-bug!\r\n\t\t BOGUSERROR\r\n\t\t*/\r\n\t\tlet gottenApiUrl = this._get_apiUrl();\r\n\t\tlet hasApiUrl = Boolean(gottenApiUrl);\r\n\t\tif (!hasApiUrl) {\r\n\t\t\tlet msg = 'who is using uninitialized apiUrl?';\r\n\t\t\tconsole.trace(msg);\r\n\t\t\tthrow msg;\r\n\t\t}\r\n\r\n\t\treturn hasApiUrl ? gottenApiUrl : 'broken!!';//location.origin is SELDOM the answer, it is the CLIENT, not the API address!\r\n\r\n\t\t//location.origin; // needed for urls for images. FIXME - where do we actually need/use that?\r\n\t\t// (JG: The idea is, that for images we just do requests back to the same server address we originated from.)\t\t\r\n\t\t// But who ever empty-initializes it, if there is only one singleton-instance??\r\n\t}\r\n\r\n\t// ApiClient.PRJ_ACCESS_TOKEN ApiClient.PRJ_ACCESS_TOKEN\r\n\tpublic static STORAGE_LABEL:string = 'storage_label'; //'access_token';\r\n\tpublic static PRJ_ACCESS_TOKEN:string = 'prj_access_token'; //'access_token'; // only ProjectTokenService.createNewProjectToken sets this!\r\n //ApiClient.STORAGE_LABEL\r\n\r\n private buildConfig(custom_baseUrl:string='',who:string): AoxRequestBuilder {\r\n\t\t//if (custom_baseUrl) { console.log('buildConfig gets custom_baseUrl:', custom_baseUrl); }\r\n\r\n let config = new AoxRequestBuilder( custom_baseUrl ? custom_baseUrl : this.getApiUrl() );//(in buildConfig) allows calling client host for api url in production\r\n\r\n\t\tlet token:string | null = sessionStorage.getItem(ApiClient.STORAGE_LABEL);//buildConfig // 'accxess_token');\r\n if (token) {\r\n (config.headers)[\"Authorization\"] = (\"Bearer \" + token);//buildConfig \r\n\t\t} else {\r\n\t\t\tthis.warnNoToken('buildConfig'+who+'_'+ApiClient.STORAGE_LABEL, false); //insist);\r\n\t\t}\r\n return config;\r\n }\r\n\r\n\twarnNoToken(arg0: string, insist:boolean) { // UB: buildConfig\r\n\t\tconsole.warn('no token in', arg0); // will happen when main.configure.initialize is called.\r\n\r\n\t\tif (!insist){return;}\r\n\t\tconst msg = \"no token stored in sessionStorage under label ApiClient.PRJ_ACCESS_TOKEN \";\r\n\t\tconsole.error(msg);\r\n\t\twindow.alert(msg);\r\n\t\t// \r\n\t}\r\n\r\n public custom(custom_baseUrl:string=''):RequestMethod {\r\n\t\tif (!custom_baseUrl) { // JG: Jeg kobler dette til igen, da commit-beskeden fra det blev fjernet, ikke forklarer en grund til at fjerne det.\r\n\t\t\tcustom_baseUrl = this._get_apiUrl();\r\n\t\t\t// console.trace('apiClient.custom: using default ApiUrl as no custom specified.', custom_baseUrl);\r\n\t\t}\r\n let config = this.buildConfig(custom_baseUrl,'custom');//custom\r\n return new RequestMethod(config, this.events, this.modal, this.errorService, this.i18n);\r\n }\r\n\r\n\tprivate buildProjectConfig(who:string, insist:boolean, projectId: string, custom_baseUrl:string=''): AoxRequestBuilder { //buildProjectConfig used for getting and setting ApiClient.PRJ_ACCESS_TOKEN., by impl_projectWToken\r\n\t\tif (custom_baseUrl) { \r\n\t\t\tconsole.log('buildProjectConfig gets custom_baseUrl:', custom_baseUrl); \r\n\t\t}\r\n\t\t\r\n let config = new AoxRequestBuilder( custom_baseUrl ? custom_baseUrl : this.getApiUrl() );//(in buildConfig) allows calling client host for api url in production\r\n\t\tlet prj_token:string | null = sessionStorage.getItem(ApiClient.PRJ_ACCESS_TOKEN);//buildProjectConfig,READ.\r\n if (prj_token) {\r\n\t\t\tthis.projectTokenService.doesTokenMatchLog(projectId,prj_token,who);\r\n\t\t\t(config.headers)[\"Authorization\"] = (\"Bearer \" + prj_token);//buildProjectConfig \r\n\t\t} else {\r\n\t\t\tthis.warnNoToken('buildProjectConfig'+'_'+ApiClient.PRJ_ACCESS_TOKEN, insist);//buildProjectConfig_MSG\r\n\t\t}\r\n return config;\r\n }\r\n\r\n\tpublic projectWToken(prjId: string, who:string):RequestMethod {\r\n\t\treturn this.impl_projectWToken(prjId, false,who);\r\n\t}\r\n\r\n\tpublic projectWToken_Insist(prjId: string):RequestMethod {\r\n\t\treturn this.impl_projectWToken(prjId, true,'projectWToken_Insist');\r\n\t}\r\n\r\n\tpublic impl_projectWToken(prjId: string, insist:boolean, who:string):RequestMethod {\r\n\t\tif (!prjId) { console.trace('warning - ApiClient.project called with empty/missing projectId:', prjId); }\r\n\t\tif (prjId == 'undefined') { console.trace('passing STRING undefined in api.'); }\r\n\r\n let configForProject = this.buildProjectConfig(who, insist, prjId );//projectWToken \r\n (configForProject.headers)[\"ajour_ao_scope\"] = \"ScopeAccessProject\";\r\n (configForProject.headers)[\"ajour_ao_project\"] = prjId;\r\n\t\t//console.log('projectWToken set ajour_ao_project to be:', id);\r\n configForProject.addRouteSection(\"/api/project/\");\r\n return new RequestMethod(configForProject, this.events, this.modal, this.errorService, this.i18n);\r\n }\r\n\r\n public project( id: string):RequestMethod { return this.projectWToken(id,'Aproject'); } // As of April 2024: All project endpoints require a project token for authorization\r\n public project_insist(id: string):RequestMethod { return this.projectWToken_Insist(id); } // As of April 2024: All project endpoints require a project token for authorization\r\n\r\n\tpublic project_OldToken(id: string):RequestMethod {\r\n\t\t//return this.projectWToken(id);\r\n\t\t// As of April 2024: All project endpoints require a project token for authorization\r\n\t\t\r\n\t\tif (!id) { console.trace('warning - ApiClient.project called with empty/missing projectId:', id); }\r\n\t\tif (id == 'undefined') { console.trace('passing STRING undefined in api.'); }\r\n\r\n let config = this.buildConfig('','project_OldToken');//project_OldToken \r\n (config.headers)[\"ajour_ao_scope\"] = \"ScopeAccessProject\";\r\n (config.headers)[\"ajour_ao_project\"] = id;\r\n config.addRouteSection(\"/api/project/\");\r\n return new RequestMethod(config, this.events, this.modal, this.errorService, this.i18n);\t\t\r\n }\r\n\r\n\tprivate buildOrgConfig(token: string | null, custom_baseUrl:string=''): AoxRequestBuilder { //buildOrgConfig Used for getting and setting ApiClient.STORAGE_LABEL.\r\n\t\tif (custom_baseUrl) { \r\n\t\t\tconsole.log('buildOrgConfig gets custom_baseUrl:', custom_baseUrl); \r\n\t\t}\r\n\t\t\r\n let config = new AoxRequestBuilder( custom_baseUrl ? custom_baseUrl : this.getApiUrl() );//(in buildConfig) allows calling client host for api url in production\r\n\t\tif(token) {\r\n\t\t\t(config.headers)[\"Authorization\"] = (\"Bearer \" + token);//buildOrgConfig \r\n\t\t} else { //If org-token is not set we use the old token. Should be removed when OrgRoles and PrjRoles are finished being implemented.\r\n\t\t\tconst oldToken = sessionStorage.getItem(ApiClient.STORAGE_LABEL);//buildOrgConfig 'axccess_token');\r\n\t\t\tif (!oldToken) {\r\n\t\t\t\tthis.warnNoToken('buildOrgConfig' + '_' + ApiClient.STORAGE_LABEL, false);\r\n\t\t\t}\r\n\t\t\t(config.headers)[\"Authorization\"] = (\"Bearer \" + oldToken);//buildOrgConfig \r\n\t\t}\r\n return config;\r\n }\r\n\r\n\tpublic orgById(orgId: string): RequestMethod {\r\n let config = this.buildConfig('','orgById');//orgById\r\n (config.headers)[\"ajour_ao_scope\"] = \"ScopeAccessOrg\";\r\n\t\t(config.headers)[\"ajour_ao_organisation\"] = orgId;\r\n config.addRouteSection(\"/api/org/\");\r\n\t\tlet rm = new RequestMethod(config, this.events, this.modal, this.errorService, this.i18n);\r\n\t\treturn rm;\r\n }\r\n\r\n\t// was:\r\n\t//get orgByToken_(): RequestMethod { return null; }\r\n\r\n\torgByToken(currentUser_OrgId:string|undefined): RequestMethod {\r\n\t\tlet token:string | null = sessionStorage.getItem('org_access_token');\r\n\t\tlet config = this.buildOrgConfig(token);//system\r\n\t\t(config.headers)[\"ajour_ao_scope\"] = \"ScopeAccessOrg\";\r\n\r\n\t\t(config.headers)[\"ajour_ao_organisation\"] = (\r\n\t\t\ttoken != null \r\n\t\t\t? this.orgTokenService.getOrgIdFromToken(token) \r\n\t\t\t: currentUser_OrgId //this.appContext.currentUser?.organization.id\r\n\t\t); //Defaulting to ownerCompanyId should be removed once OrgRoles are implemented properly.\r\n\r\n\t\tconfig.addRouteSection(\"/api/org/\");\r\n\t\tlet rm = new RequestMethod(config, this.events, this.modal, this.errorService, this.i18n);\r\n\t\treturn rm;\r\n }\r\n\t\r\n get system(): RequestMethod {\r\n let config = this.buildConfig('','system');//system\r\n (config.headers)[\"ajour_ao_scope\"] = \"ScopeAccessSystem\";\r\n config.addRouteSection(\"/api/system/\");\r\n\t\tlet rm = new RequestMethod(config, this.events, this.modal, this.errorService, this.i18n);\r\n\t\treturn rm;\r\n }\r\n get manufacturer(): RequestMethod {\r\n let config = this.buildConfig('','manufacturer');//manufacturer \r\n (config.headers)[\"ajour_ao_scope\"] = \"ScopeAccessManufacturer\";\r\n config.addRouteSection(\"/api/system/\");\r\n return new RequestMethod(config, this.events, this.modal, this.errorService, this.i18n);\r\n }\r\n get global(): RequestMethod {\r\n let config = this.buildConfig('','global');//global\r\n (config.headers)[\"ajour_ao_scope\"] = \"ScopeAccessGlobal\";\r\n config.addRouteSection(\"/api/global/\");\r\n return new RequestMethod(config, this.events, this.modal, this.errorService, this.i18n);\r\n }\r\n\r\n\tpublic target(apiTarget: string, input: any = null): RequestMethod {\r\n\t\t// The non-obvious thing here is that if input is specified, \r\n\t\t// the request-method builder becomes an active mechanism, \r\n\t\t// that injects the 'ajour_ao_project' header value.\r\n\t\t// I'm not in favour of this 'opaque data turns out to sometimes be a project_id'.\r\n\r\n\t\tlet hasInput = !!input; \r\n\t\tlet passInput = (hasInput && apiTarget != AppValues.apiTarget.system);\r\n\t\tif (!passInput) { \r\n\t\t\treturn (this)[apiTarget]; //RequestMethod\r\n\t\t} else {\r\n\t\t\treturn (this)[apiTarget](input); //RequestMethod\r\n\t\t}\r\n }\r\n}\r\n\r\n\r\n","import { FilterGroupDto } from './../models/filter-dto';\r\nimport { FilterDto, ICombinedFilter } from 'app/models/filter-dto';\r\nimport { ProjectInvitationDto } from 'app/models/project-invitation-dto';\r\nimport { UserDto } from 'app/models/user-administration-dtos';\r\n\r\nimport {computedFrom} from 'aurelia-framework'; \r\nimport { ProjectDto } from \"app/models/project-dto\";\r\n\r\n// Is responsible for keeping track of application-wide shared state\r\nexport class AppContextService {\r\n\t\r\n\tpublic projectInvitations: ProjectInvitationDto[] = [];\r\n\tpublic projects: ProjectDto[] = [];\r\n\r\n\r\n\t//public projectId: string = \"\";\r\n\tpublic _projectId_: string = \"\";\r\n\r\n\t// FOR DEBUGGING state-problems with AppContextService.projectId:\r\n\tpublic get projectId(): string { \r\n\t \t//console.log('get',this._projectId_, typeof(this._projectId_)); \r\n\t\treturn this._projectId_; \r\n\t}\r\n private set_projectId(p:string) { \r\n\t\tconsole.log('set p to:', p, typeof(p) ); \r\n\t\tthis._projectId_ = p; \r\n }\r\n\t\r\n\tpublic currentUser: UserDto | undefined; // getUser: search fodder\r\n\tpublic expectedRoute:string | null = null;\r\n\tpublic static NO_PROJECT: string = 'no-project';\r\n\t \r\n\t@computedFrom('_selectedFilter')\r\n\tpublic get selectedFilterNAME() { return this._selectedFilter?.name ?? 'View'; }\r\n\r\n\tcurrentUserOrgId():string|undefined { return this.currentUser?.organization.id; }\r\n\r\n\t//Sarah at work\r\n\tpublic _selectedFilter: FilterDto | null = null; // only referenced from accessors get/set!\r\n\tpublic defaultFilter: FilterDto | null = null;\r\n\tpublic selectedGrouping: FilterGroupDto | undefined = undefined;\r\n\tpublic defaultGrouping: FilterGroupDto | null= null;\r\n\tpublic combinedFilter: ICombinedFilter | null = null;\r\n\tpublic changesSaved: boolean = true;\r\n\t//Start: REMOVEME\r\n\tpublic enableLCAByg: boolean = false;\r\n\t//End: REMOVEME\r\n\r\n\tswitchProjectLogic(projectId: string, who:string):void {\r\n\t\tthis.setProject(projectId);\r\n\t\tthis.setSelectedFilter(null, who);//switchProjectLogic\r\n\t\tthis.setSelectedGrouping(undefined);\r\n\t\tthis.setCombinedFilter(null);\r\n\t}\r\n\r\n\tsetProject(projectId: string) {\r\n\t\tif (projectId == 'undefined') { console.trace('ctx.setProject received STRING undefined'); }\r\n\t\t//this.projectId = projectId;\r\n\t\tthis.set_projectId(projectId);\r\n\t}\r\n\r\n\tsetProjects(projectListToSet: ProjectDto[]) { \r\n\t\tconsole.log('setProjects to:', projectListToSet);\r\n\t\tthis.projects = projectListToSet; \r\n\t}\r\n\r\n\tgetSelectedProject(): ProjectDto | undefined {\r\n\t\t// TMI console.log('getSelectedProject believes this.projectId is:', this.projectId);\r\n\t\tlet project = this.projects?.find(x => x.id === this.projectId);\r\n\t\tif (project) {\r\n\t\t\treturn project;\r\n\t\t}\r\n\t}\r\n\r\n\tsetProjectInvitations(projectInvitations: ProjectInvitationDto[]) {\r\n\t\tthis.projectInvitations = projectInvitations;\r\n\t}\r\n\r\n\tsetCurrentUser(currentUser: UserDto|undefined) {\r\n\t\tthis.calcOrgFlags(currentUser);\r\n\t\tthis.currentUser = currentUser;\r\n\t}\r\n\t\r\n\tcalcOrgFlags(currentUser: UserDto|undefined) {\r\n\t\tif (!currentUser) {\r\n\t\t\tconsole.warn('AppContextService.calcOrgFlags will not do anything, because currentUser arg is \"undefined\".');\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlet flagsInput:string = currentUser.organization.orgFlags;\r\n\t\tlet sigmaPublish:boolean = (!!flagsInput && flagsInput.includes('sigma'));\r\n\t\tcurrentUser.organization.sigma = sigmaPublish;\r\n\t}\r\n\r\n\tgetSelectedFilter():FilterDto | null { return this._selectedFilter; }\r\n\tsetSelectedFilter(filter: FilterDto | null, who:string) { \r\n\t\tconsole.log('setSelectedFilter by:', who, 'to:', filter?.name);\r\n\t\tthis._selectedFilter = filter; \r\n\t}\r\n\r\n\tsetExpectedRoute(href:string){ this.expectedRoute = href; }\r\n\tsetDefaultFilter(filter: FilterDto | null){ this.defaultFilter = filter; }\r\n\tgetDefaultFilter():FilterDto | null { return this.defaultFilter; }\r\n\tsetSelectedGrouping(grouping: FilterGroupDto | undefined){ this.selectedGrouping = grouping; }\r\n\tgetSelectedGrouping():FilterGroupDto | undefined { return this.selectedGrouping;}\r\n\tsetDefaultGrouping(group: FilterGroupDto){ this.defaultGrouping = group; }\r\n\tgetDefaultGrouping():FilterGroupDto | null{ return this.defaultGrouping; }\r\n\tsetCombinedFilter(filter: ICombinedFilter | null){ this.combinedFilter = filter; }\r\n\tgetCombinedFilter():ICombinedFilter | null { return this.combinedFilter; }\r\n}\r\n","import { ViewerParametersDto } from \"app/models/viewer-parameters-dto\";\r\nimport { ApiClient } from \"./api-client\";\r\nimport { RequestMethod } from './RequestMethod';\r\nimport { AppContextService } from \"./app-context-service\";\r\nimport * as environment from '../../../config/environment.json';\r\nimport {BimViewerFileDto, BimViewerRevisionDto} from \"../models/viewer-dtos/Dtos/bimviewer-dtos\";\r\nimport { HttpResponseMessage } from \"aurelia-http-client\";\r\nimport { DateTimeFormatter } from \"./date-time-formatter\";\r\n\r\nexport class BimViewerService {\r\n constructor(public apiClient: ApiClient, public appContext: AppContextService){}\r\n\r\n\tprivate endpoint = '/api/global/BimViewerCallback/EnhanceProjectBimDetails';\r\n\r\n\tpublic async openBimViewer() { //This also works\r\n\t\tlet parameters : ViewerParametersDto = \r\n\t\t\tawait this.apiClient.project(this.appContext.projectId).get('BimViewer/GetViewerParameters')\r\n\t\t\t\t.handleError(\"Error\", \"Issue starting a BimViewer session. Initial stage before opening the viewer failed.\")\r\n\t\t\t\t.jsonResult();\r\n console.log(parameters);\r\n\t\t\r\n\t\tlet apiBaseUrl : string = this.apiClient.getApiUrl();//in-openBimViewer\r\n let bimViewerLink : string = `${environment.bimviewerUrl}/bimviewer/#/${parameters.projectId}/${parameters.userId}/${parameters.secretId}?callback=${apiBaseUrl}${this.endpoint}`\r\n\t\t\r\n\t\twindow.open(bimViewerLink, '_blank')\r\n\t}\r\n\r\n public async openBimViewerWithRevisionId(revisionId: string) { //It seems the same (and only) model is being shown no matter the model clicked.\r\n let parameters : ViewerParametersDto = \r\n\t\t\tawait this.apiClient.project(this.appContext.projectId).get('BimViewer/GetViewerParameters')\r\n\t\t\t\t.handleError(\"Error\", \"Issue starting a BimViewer session. Initial stage before opening the viewer failed.\")\r\n\t\t\t\t.jsonResult();\r\n console.log('RevisionId -', revisionId);\r\n\t\t\r\n\t\tlet apiBaseUrl : string = this.apiClient.getApiUrl();//in-openBimViewerWithRevisionId\r\n let bimViewerLink : string = `${environment.bimviewerUrl}/bimviewer/#/${parameters.projectId}\r\n\t\t\t/${parameters.userId}/${parameters.secretId}?callback=${apiBaseUrl}${this.endpoint}&revision=${revisionId}`\r\n\t\t\r\n\t\twindow.open(bimViewerLink, '_blank')\r\n }\r\n\r\n\tpublic async createModel(modelName: string, altUpload:boolean, chosenFileToUpload?: File): Promise {\r\n\t\tlet fileDto: BimViewerFileDto = await this.apiClient.project(this.appContext.projectId).postJson(`BimViewer/CreateModel`, modelName).jsonResult();\r\n\t\tif (fileDto == null) {\r\n return;\r\n }\r\n\t\tif (chosenFileToUpload) {\r\n\t\t\tlet revisionDto: BimViewerRevisionDto = await this.uploadRevision(chosenFileToUpload, \"\", fileDto.id, altUpload);\r\n\t\t\tconsole.log('revision:', revisionDto);\r\n if (revisionDto) {\t// Update revision count on the front-end\r\n revisionDto.isSynced = false; // DOES NOT WORK...\r\n fileDto.isSynced = false;\r\n fileDto.currentRevision += 1;\r\n\t\t\t\tfileDto.newestRevisionDate = DateTimeFormatter.formatDate(revisionDto.created);\r\n }\r\n\t\t}\r\n\t\treturn fileDto\r\n\t}\r\n\t\r\n\tpublic async uploadRevision(file: File, note: string, fileId: string, altUpload:boolean) : Promise {\r\n\t\tlet formData: FormData = new FormData();\r\n\t\tformData.append('note', note);\r\n\t\tformData.append('altUpload', `${altUpload}`);\r\n\t\tformData.append('file', file);\r\n\t\t\r\n\t\tlet result:BimViewerRevisionDto = \r\n\t\t await this.apiClient.project(this.appContext.projectId)\r\n\t\t .postForm(`BimViewer/UploadRevision/${fileId}`, formData)\r\n\t\t\t\t\t\t .objectResult();\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic async deleteModel(modelId: string): Promise {\r\n\t\tlet prj: string = this.appContext.projectId;\r\n let api:RequestMethod = this.apiClient.project(prj);\r\n return await api.get(`BimViewer/DeleteModel?fileId=${modelId}`).response();\r\n\t}\r\n}\r\n","import {autoinject} from \"aurelia-framework\";\r\nimport {EventAggregator, Subscription} from \"aurelia-event-aggregator\";\r\nimport {ViewerThreeDServiceIF, ToolEnum} from \"./ViewerThreeDServiceIF\";\r\nimport {ObjectIDsIF} from \"../project/ifc-fun/openbim-container\";\r\nimport {OpenBimHandles} from \"../project/ifc-fun/OpenBimHandles\";\r\nimport { InstanceColorDataCollection } from \"app/models/color-legend-dto\";\r\n\r\ndeclare let $: any;\r\n\r\n@autoinject\r\nexport class BimViewerThreeDService implements ViewerThreeDServiceIF {\r\n\tpublic spacesEnabled: boolean = false;\r\n\tprivate subscriptions: Subscription[];\r\n\r\n\tconstructor(public events: EventAggregator, private openBimHandles: OpenBimHandles) {\r\n\t\tthis.subscriptions = []\r\n\t}\r\n\r\n\tasync colorInstances(colorData: InstanceColorDataCollection): Promise {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n async resetColorInstances(): Promise {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n reload(): void {\r\n if (this.subscriptions != undefined) {\r\n this.subscriptions.forEach((subscription: Subscription) => subscription.dispose());\r\n }\r\n }\r\n\r\n\tasync changeSelectedTool(tool: ToolEnum): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync handleSpaces(shouldShowSpaces: boolean): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync hideAllObjects(): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync showAllObjects(): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync transluteAllObjects(): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync hideObjects(objectIds: ObjectIDsIF): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync hideOthers(objectIds: ObjectIDsIF): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync lookAtObjects(objectIds: ObjectIDsIF): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync selectObjects(objectIds: ObjectIDsIF): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync showObjects(objectIds: ObjectIDsIF): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync transluteObjects(objectIds: ObjectIDsIF): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync transluteOthers(selectedObjectIds: ObjectIDsIF): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync hideColorGroup(groupName: string): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync showColorGroup(groupName: string): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n\r\n\tasync transluteColorGroup(groupName: string): Promise {\r\n\t\tthrow new Error(\"Method not implemented.\");\r\n\t}\r\n}\r\n\r\n\r\n","import {autoinject} from \"aurelia-framework\";\r\nimport {EventAggregator} from \"aurelia-event-aggregator\";\r\n\r\ndeclare let bimsync: any;\r\ndeclare let $: any;\r\n\r\n\r\n@autoinject\r\nexport class BimsyncSetupHandler {\r\n\r\n\tpublic static LogInf:boolean = true; //false; //true;\r\n\tpublic static LogInf2:boolean = false; // (more detailed/verbose than LogInf)\r\n\r\n is3d_ENGINE_Loaded: boolean = false; // JG: This is about the entire bimsync 3d api subsystem, NOT about the loading of an individual 3d-model!\r\n is2d_ENGINE_Loaded: boolean = false;\r\n public isBimsync_ENGINES_Setup: boolean = false; // true when both 2d and 3d are reported 'READY' back from catenda.\r\n\r\n constructor(public events: EventAggregator) {}\r\n\r\n loadViewer3d(): void {\r\n if (bimsync != undefined) {\r\n bimsync.setOnLoadCallback(() => {\r\n if (BimsyncSetupHandler.LogInf) { console.log(\"3d-viewer-callback\"); }\r\n this.threeD_ENGINE_Ready();//in-CATENDA-onLoad-callback.\r\n });\r\n bimsync.load(['viewer-ui']);\r\n } else {\r\n console.warn(\"Bimsync was undefined\");//We should probably handle this better. Maybe with some kind of reinitialize.\r\n }\r\n }\r\n \r\n loadViewer2d(): void {\r\n if (bimsync != undefined) {\r\n bimsync.setOnViewer2dLoadCallback(() => {\r\n if (BimsyncSetupHandler.LogInf) { console.log(\"2d-viewer-callback\"); }\r\n this.twoD_ENGINE_Ready();\r\n });\r\n bimsync.loadViewer2d();\r\n } else {\r\n console.warn(\"Bimsync was undefined\");//We should probably handle this better. Maybe with some kind of reinitialize.\r\n }\r\n }\r\n\r\n private threeD_ENGINE_Ready(): void {//UB:CATENDA-onLoad-callback.\r\n this.is3d_ENGINE_Loaded = true;\r\n this.setViewerUIFunctionality();//in-threeDReady\r\n }\r\n \r\n private twoD_ENGINE_Ready(): void {\r\n this.is2d_ENGINE_Loaded = true;\r\n this.setViewerUIFunctionality();//in-twoDReady\r\n }\r\n\r\n setViewerUIFunctionality() {\r\n if (BimsyncSetupHandler.LogInf) { console.log(\"is-2d-ViewerLoaded\" , this.is2d_ENGINE_Loaded); }\r\n if (BimsyncSetupHandler.LogInf) { console.log(\"is-3d-ViewerLoaded\" , this.is3d_ENGINE_Loaded); }\r\n if (this.is2d_ENGINE_Loaded && this.is3d_ENGINE_Loaded) {\r\n if (BimsyncSetupHandler.LogInf) { console.log(\"viewer-ui-setup-call\"); }\r\n this.events.publish('viewer:enable-bindings-and-options');//in-BimsyncSetupHandler.setViewerUIFunctionality(), triggered by CATENDA-onLoad-callback.\r\n this.isBimsync_ENGINES_Setup = true;// in setViewerUIFunctionality.\r\n }\r\n }\r\n\r\n handleCATENDA_ViewerUISetupAndViewerOptions():void {\r\n //The options must be set before viewer-ui is setup otherwise options can be overriden.\r\n this.handleOptionsForViewer2d();\r\n this.handleOptionsForViewer3d();\r\n this.handleViewerUIFunctionality();\r\n this.events.publish('ViewerMenu:viewers-finished-loading'); \r\n this.events.publish('ModelRevision:ModelsPressed');\r\n }\r\n\r\n handleViewerUIFunctionality(): void {\r\n\t\tconst the_viewerContainer3d = $('#viewerContainer3d');\r\n\t\tif (!the_viewerContainer3d || the_viewerContainer3d.length == 0) {\r\n\t\t\tconsole.warn('ui the_viewerContainer3d is empty:', the_viewerContainer3d);\r\n\t\t\treturn;\r\n\t\t}\r\n the_viewerContainer3d.viewerUI({\r\n viewer2dId: 'viewerContainer2d',\r\n enableViewer2dIntegration: true,\r\n showViewer2dStoreySelect: true, //Catenda seems to have this fixed again\r\n enableJoystick: true,\r\n joystickHidden: true\r\n });\r\n the_viewerContainer3d.viewerUI('set2dLockStoreyMode', true);//Outcommented as storey is not currently functioning correct.\r\n }\r\n\r\n handleOptionsForViewer2d(): void {\r\n console.log(\"viewer options handleOptionsForViewer2d\")\r\n let options = {selectColor: '#49b6d6'};\r\n\t\tconst the_viewerContainer2d = $(\"#viewerContainer2d\");\r\n\t\tif (!the_viewerContainer2d || the_viewerContainer2d.length == 0) {\r\n\t\t\tconsole.warn('the_viewerContainer2d is empty:', the_viewerContainer2d);\r\n\t\t\treturn;\r\n\t\t}\r\n the_viewerContainer2d.viewer2d(options); //Options must be set before loading the url.\r\n //$(\"#viewerContainer2d\").viewer2d(options); //Options must be set before loading the url.\r\n }\r\n\r\n handleOptionsForViewer3d():void {\r\n let options: any = {\r\n selectedColor: '#49b6d6',\r\n fieldOfView: 60,\r\n enableClippingPlaneWidget: true\r\n };\r\n\r\n\t\tconst the_viewerContainer3d = $('#viewerContainer3d');\r\n\t\tif (!the_viewerContainer3d || the_viewerContainer3d.length == 0) {\r\n\t\t\tconsole.warn('the_viewerContainer3d is empty:', the_viewerContainer3d);\r\n\t\t\treturn;\r\n\t\t}\r\n the_viewerContainer3d.viewer(options); //Options must be set before loading the url.\r\n }\r\n}\r\n","import {EventAggregator} from 'aurelia-event-aggregator';\r\nimport {ModalService} from 'app/services/modal-service';\r\nimport {ObjectListManager} from 'app/services/object-list/object-list-manager';\r\nimport {autoinject, TaskQueue} from 'aurelia-framework';\r\nimport {ObjectCell, ObjectRow} from './object-list/object-list-row';\r\nimport {CellEditor} from 'app/components/object/object-grid/cell/cell-editor';\r\nimport {ParameterDefinitionDto, SyncDirectionEnum} from 'app/models/parameter-definition-dto';\r\nimport {ObjectValues} from 'app/models/object-values';\r\n\r\n@autoinject\r\nexport class CellEditService {\r\n\t\r\n\tconstructor(private taskQueue: TaskQueue, private modal: ModalService, private events: EventAggregator) {\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic enableCellEdit(objects: ObjectListManager, cell: ObjectCell, row: ObjectRow, event: any) {\r\n if (cell.isEditing) { \r\n\t\t\tconsole.log('cell is already editing:', cell);\r\n return;\r\n\t\t}\r\n if (!cell.tryEdit()) {\r\n\t\t\tconsole.log('cell.tryEdit not happy.', cell);\r\n return;\r\n\t\t}\r\n\r\n if (cell.isSimpleValue) {\r\n this.taskQueue.queueTask(() => {\r\n let element = event.srcElement.querySelector(\".edit-cell\");\r\n if (!Boolean(element)) {\r\n element = document.getElementById(cell.elementId);\r\n }\r\n if (Boolean(element)) {\r\n element.focus();\r\n }\r\n });\r\n } else {\r\n this.modal.OpenModal(CellEditor, { objects: objects, cell, row }).whenClosed(x => {\r\n if (!x.wasCancelled) {\r\n\t\t\t\t\tthis.events.publish('object-properties:update', row);\r\n\t\t\t\t\tthis.events.publish('object-properties-material:update', row.value?.typeId);\r\n } else \r\n cell.reset();\r\n });\r\n }\r\n\t}\r\n\r\n\tpublic canEdit(row: ObjectRow, columnTargetType: string, parameterDefinitionDto: ParameterDefinitionDto | undefined): boolean{\r\n\t\tif (!parameterDefinitionDto)\r\n\t\t\treturn false;\r\n\r\n\t\t// // was: 1 \r\n\t\tif (parameterDefinitionDto.readOnly || parameterDefinitionDto.syncDirection === SyncDirectionEnum.SyncToAc || parameterDefinitionDto.isAggregateParameter) // syncDirection === 1 (RevitToAoc)\r\n \treturn false;\r\n\t\t\r\n\t\tif (row.targetType == ObjectValues.targetTypes.type) {\r\n return columnTargetType == ObjectValues.targetTypes.typeParameter;\r\n } else if (row.targetType == ObjectValues.targetTypes.instance) { \r\n return columnTargetType == ObjectValues.targetTypes.instanceParameter\r\n || columnTargetType == ObjectValues.targetTypes.typeParameter;\r\n }\r\n return false;\r\n }\r\n}\r\n"],"names":["ApiClient","constructor","modal","errorService","events","i18n","projectTokenService","orgTokenService","_apiUrl","version","build","clientBuild","set_apiUrl","url","this","_get_apiUrl","msg","console","trace","isProd","Boolean","location","origin","startsWith","initialize","log","ui_baseUrl","api_url","custom","get","stringResult","url_path","techVersionPath","REH","global","request","route","justAPromise","jsonResult","techInfo","e","alert","configureClientVersion_notUsed","techInfo2","catch","async","reason","error","json","getApiUrl","gottenApiUrl","hasApiUrl","buildConfig","custom_baseUrl","who","config","token","sessionStorage","getItem","STORAGE_LABEL","headers","warnNoToken","arg0","insist","warn","window","buildProjectConfig","projectId","prj_token","PRJ_ACCESS_TOKEN","doesTokenMatchLog","projectWToken","prjId","impl_projectWToken","projectWToken_Insist","configForProject","addRouteSection","project","id","project_insist","project_OldToken","buildOrgConfig","oldToken","orgById","orgId","orgByToken","currentUser_OrgId","getOrgIdFromToken","system","manufacturer","target","apiTarget","input","IsCatendaEnabled_Global","autoinject","EventAggregator","I18N","AppContextService","projectInvitations","projects","_projectId_","expectedRoute","_selectedFilter","defaultFilter","selectedGrouping","undefined","defaultGrouping","combinedFilter","changesSaved","enableLCAByg","set_projectId","p","selectedFilterNAME","name","currentUserOrgId","currentUser","organization","switchProjectLogic","setProject","setSelectedFilter","setSelectedGrouping","setCombinedFilter","setProjects","projectListToSet","getSelectedProject","find","x","setProjectInvitations","setCurrentUser","calcOrgFlags","flagsInput","orgFlags","sigmaPublish","includes","sigma","getSelectedFilter","filter","setExpectedRoute","href","setDefaultFilter","getDefaultFilter","grouping","getSelectedGrouping","setDefaultGrouping","group","getDefaultGrouping","getCombinedFilter","NO_PROJECT","computedFrom","BimViewerService","apiClient","appContext","endpoint","openBimViewer","parameters","handleError","apiBaseUrl","bimViewerLink","userId","secretId","open","openBimViewerWithRevisionId","revisionId","createModel","modelName","altUpload","chosenFileToUpload","fileDto","postJson","revisionDto","uploadRevision","isSynced","currentRevision","newestRevisionDate","formatDate","created","file","note","fileId","formData","FormData","append","postForm","objectResult","deleteModel","modelId","prj","api","response","BimViewerThreeDService","openBimHandles","spacesEnabled","subscriptions","colorInstances","colorData","Error","resetColorInstances","reload","forEach","subscription","dispose","changeSelectedTool","tool","handleSpaces","shouldShowSpaces","hideAllObjects","showAllObjects","transluteAllObjects","hideObjects","objectIds","hideOthers","lookAtObjects","selectObjects","showObjects","transluteObjects","transluteOthers","selectedObjectIds","hideColorGroup","groupName","showColorGroup","transluteColorGroup","BimsyncSetupHandler","is3d_ENGINE_Loaded","is2d_ENGINE_Loaded","isBimsync_ENGINES_Setup","loadViewer3d","bimsync","setOnLoadCallback","LogInf","threeD_ENGINE_Ready","load","loadViewer2d","setOnViewer2dLoadCallback","twoD_ENGINE_Ready","setViewerUIFunctionality","publish","handleCATENDA_ViewerUISetupAndViewerOptions","handleOptionsForViewer2d","handleOptionsForViewer3d","handleViewerUIFunctionality","the_viewerContainer3d","$","length","viewerUI","viewer2dId","enableViewer2dIntegration","showViewer2dStoreySelect","enableJoystick","joystickHidden","the_viewerContainer2d","viewer2d","selectColor","viewer","selectedColor","fieldOfView","enableClippingPlaneWidget","LogInf2","CellEditService","taskQueue","enableCellEdit","objects","cell","row","event","isEditing","tryEdit","isSimpleValue","queueTask","element","srcElement","querySelector","document","getElementById","elementId","focus","OpenModal","whenClosed","wasCancelled","reset","value","typeId","canEdit","columnTargetType","parameterDefinitionDto","readOnly","syncDirection","SyncToAc","isAggregateParameter","targetType","targetTypes","type","typeParameter","instance","instanceParameter","TaskQueue"],"sourceRoot":""}