{"version":3,"file":"app-c812c1f4.994e2ee2e779fd92.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\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 techVersionPath = \"Tech/Version\";\r\n\t\ttry {\r\n\t\t\tlet techInfo:TechInfo = await this.global.get(techVersionPath, true).jsonResult();\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\talert(`cannot reach ${techVersionPath}`);\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 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\t\tlet token:string | null = sessionStorage.getItem('access_token');\r\n\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);\r\n\t\t}\r\n return config;\r\n }\r\n\r\n\twarnNoToken(arg0: string) {\r\n\t\tconsole.warn('no token in', arg0); // will happen when main.configure.initialize is called.\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(projectId: string, custom_baseUrl:string=''): AoxRequestBuilder { //Used for getting and setting prj_access_token.\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 token:string | null = sessionStorage.getItem('prj_access_token');\r\n if (token) {\r\n\t\t\tthis.projectTokenService.doesTokenMatchLog(projectId,token);\r\n\t\t\t(config.headers)[\"Authorization\"] = (\"Bearer \" + token);//buildProjectConfig \r\n\t\t} else {\r\n\t\t\tthis.warnNoToken('buildProjectConfig');\r\n\t\t}\r\n return config;\r\n }\r\n\r\n\tpublic projectWToken(id: string):RequestMethod {\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.buildProjectConfig(id);//projectWToken \r\n (config.headers)[\"ajour_ao_scope\"] = \"ScopeAccessProject\";\r\n (config.headers)[\"ajour_ao_project\"] = id;\r\n\t\t//console.log('projectWToken set ajour_ao_project to be:', id);\r\n config.addRouteSection(\"/api/project/\");\r\n return new RequestMethod(config, this.events, this.modal, this.errorService, this.i18n);\r\n }\r\n\r\n public project(id: string):RequestMethod {\r\n\t\treturn this.projectWToken(id);\r\n\t\t// As of April 2024: All project endpoints require a project token for authorization\r\n\t}\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 { //Used for getting and setting prj_access_token.\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\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('access_token');\r\n\t\t\tif (!oldToken) {\r\n\t\t\t\tthis.warnNoToken('buildOrgConfig');\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 \r\n\t\t// if input is specified, the request-method builder \r\n\t\t// becomes an active mechanism, 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; //Boolean(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\nimport { ProjectDto } from \"../models/project-dto\";\r\n\r\nimport {computedFrom} from 'aurelia-framework'; \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(projects: ProjectDto[]) { \r\n\t\tconsole.log('setProjects to:', projects);\r\n\t\tthis.projects = projects; \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\n\r\n\r\ndeclare let $: any;\r\n\r\n@autoinject\r\nexport class BimViewerThreeDService implements ViewerThreeDServiceIF {\r\n public spacesEnabled: boolean = false;\r\n private subscriptions: Subscription[];\r\n constructor(public events: EventAggregator, private openBimHandles: OpenBimHandles) {\r\n this.subscriptions = [\r\n ]\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\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","techVersionPath","techInfo","global","jsonResult","e","alert","configureClientVersion_notUsed","techInfo2","catch","async","reason","error","json","getApiUrl","gottenApiUrl","hasApiUrl","buildConfig","custom_baseUrl","who","config","token","sessionStorage","getItem","headers","warnNoToken","arg0","warn","buildProjectConfig","projectId","doesTokenMatchLog","projectWToken","id","addRouteSection","project","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","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","window","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","reload","forEach","subscription","dispose","changeSelectedTool","tool","Error","handleSpaces","shouldShowSpaces","hideAllObjects","showAllObjects","transluteAllObjects","hideObjects","objectIds","hideOthers","lookAtObjects","selectObjects","showObjects","transluteObjects","transluteOthers","selectedObjectIds","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":""}