{"version":3,"file":"app-b0bd0c0b.67d6b139b984c4a2.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/administration/projects/manage/manage-project.ts"],"sourcesContent":["import { HttpResponseMessage } from 'aurelia-http-client';\r\nimport { RequestErrorHandling } from 'app/services/RequestErrorHandling';\r\nimport { RequestMethod } from 'app/services/RequestMethod';\r\nimport { AppContextService } from 'app/services/app-context-service';\r\nimport { EventAggregator, Subscription } from 'aurelia-event-aggregator';\r\nimport { ModalService } from 'app/services/modal-service';\r\nimport { Router } from 'aurelia-router';\r\nimport { autoinject, observable, computedFrom } from 'aurelia-framework';\r\nimport { ClassificationDto, Member, ProjectDto, ProjectInvitation, ResponseStatus } from 'app/models/project-dto';\r\nimport { ApiClient } from 'app/services/api-client';\r\nimport { UnitSettings } from \"./unit-settings\";\r\nimport { WhitelistDto } from 'app/models/whitelist-dto';\r\nimport { I18N } from 'aurelia-i18n';\r\nimport { UserDto } from 'app/models/user-administration-dtos';\r\nimport { DialogCancellableOpenResult, DialogCloseResult } from 'aurelia-dialog';\r\nimport { ProjectRole, UIPrjRoleNames } from 'app/models/project-role';\r\nimport { ErrorService } from 'app/services/error-service';\r\nimport { OrgTokenService } from 'app/services/org-token-service';\r\nimport { OrgTokenInfo } from 'app/models/org-token-info';\r\nimport { OrgRole } from 'app/models/org-role';\r\nimport { ProjectTokenService } from 'app/services/project-token-service';\r\n\r\nexport interface BasicInfoDto { // hopefully same as C:\\dev\\aoc\\AO.Queries\\Global\\ProjectInformationDto.cs.\r\n\t// lacks number field?\r\n\tTypeId?: string;\r\n\tClassificationId?: string;\r\n\tGrossArea?: string;\r\n}\r\n\r\n@autoinject\r\nexport class ManageProject {\r\n\tpublic isEditing: boolean = false;\r\n\tpublic isSaving: boolean = false;\r\n\r\n\t// Note that observable triggers that 'modelSourceChanged' call-back further down will activate on change!\r\n\t@observable public modelSource: string|undefined; // local field intended for projectDto.modelSource\r\n\tprivate settingModelSource:boolean = false;\r\n\tsetModelSource(val: string) {\r\n\t\tif (this.settingModelSource) { throw `cant set modelSource doubly ${val}, ${this.modelSource}`; }\r\n\t\ttry {\r\n\t\t\tthis.settingModelSource = true;\r\n\t\t\tthis.modelSource = val;//setModelSource\r\n\t\t} finally {\r\n\t\t\tthis.settingModelSource = false;\r\n\t\t}\r\n\t}\r\n\tpublic project: ProjectDto | undefined;\r\n\tsetProject(p: ProjectDto|undefined){\r\n\t\tthis.project = p; //in-setProject\r\n\t\tthis.setModelSource(p ? p.modelSource : '');\r\n\t}\r\n\r\n\tpublic originalProject: ProjectDto | undefined;\r\n\tprivate projectId: string | undefined = \"\";\r\n\tprivate fieldsetBody: any;\r\n\tprivate haveIBeenConstructedYet:boolean = false;\r\n\t@observable searchMemberText:string = \"\";\r\n\tpublic admin:UserDto | undefined;\r\n\tprivate searchMemberEnabled: boolean = false;\r\n\tprivate searchMemberResult: Member[];\r\n\tprivate classifications: ClassificationDto[] = [];\r\n\tpublic showSettings: boolean = false;\r\n\tpublic viewContext: string;\r\n\tpublic searchTerm: string = \"\";\r\n\tprivate subscriptions: Subscription[] = [];\r\n\tpublic unitSettings:UnitSettings | undefined;\r\n\tchosenWhitelistId: string = '00000000-0000-0000-0000-000000000000';\r\n\twhitelists: WhitelistDto[] = [];\r\n\tprivate asOrgUser: boolean = true;\r\n\tprivate projectRoles: string[] = Object.keys(ProjectRole).filter((v) => isNaN(Number(v)));\r\n\tprivate orgTokenInfo: OrgTokenInfo | undefined;\r\n\t\r\n\tconstructor(private element: Element, private apiClient: ApiClient, private router: Router, private modal: ModalService,\r\n\t\t private events: EventAggregator, private i18n: I18N, \r\n\t\t private appContext: AppContextService, \r\n\t\t private orgTokenService: OrgTokenService,\r\n\t\t private projectTokenService: ProjectTokenService\r\n\t) {\r\n\t\tthis.haveIBeenConstructedYet = true;\r\n\t\tconsole.log('mp.ctor');\r\n\t\tthis.setModelSource('');\r\n\r\n\r\n\t\tthis.searchMemberResult = [];\r\n\t\tthis.viewContext = \"ProjectMemberSearch\";\r\n\t}\r\n\r\n\t@computedFrom('project.name', 'project.location.address', 'project.location.zipcode', 'project.location.city')\r\n\tget isFormInvalid(): boolean {\r\n\t\t//Unless these conditions are fullfilled a project can neither be updated or created.\r\n\t\t//This is based on the database setup.\r\n\t\tconst isInvalid = !(\r\n\t\t\t\t(this.project?.name != undefined \t\t\t\t&& this.project.name != '')\r\n\t\t\t&& \t(this.project?.location?.address != undefined \t&& this.project?.location?.address != '')\r\n\t\t\t&&\t(this.project?.location?.zipCode != undefined \t&& this.project?.location?.zipCode != '')\r\n\t\t\t&&\t(this.project?.location?.city != undefined \t\t&& this.project?.location?.city != '')\r\n\t\t);\r\n\t\tconsole.log('mp.isformInvalid?', isInvalid);\r\n\t\treturn isInvalid;\r\n\t}\r\n\t@computedFrom('orgTokenInfo.OrgRole')\r\n\tget isOrgAdmin(): boolean {\r\n\t\tconsole.log('mp.isOrgAdmin');\r\n\t\treturn this.orgTokenInfo?.orgRole == OrgRole.Org_Admin;\r\n\t}\r\n\r\n\r\n\tasync activate(input: any) {\r\n\t\tconsole.log('mp.activate');\r\n\t\tthis.projectId = input.projectId;\r\n\t\tconsole.log('manage-project.activate', input);\r\n\r\n\t\tif (this.projectId != undefined) { \r\n\t\t\tthis.isEditing = true;\r\n\t\t\t// let us make sure these are in place, before we fetch the project.\r\n\t\t\tawait this.getAllWhitelists(); // De her gaar gennem org, og laeser saa project-data fra den org.\r\n\t\t\tawait this.fetchClassifications(); // De her gaar gennem org, og laeser saa project-data fra den org.\r\n\t\t\t// This may be broken; in how many situations do we arrive here ? Only create-new-project? also edit-existing?\r\n\t\t\tawait this.fetchProject(this.projectId);//in mp.activate.\r\n\r\n\t\t\t// Apparently ensure WL is either NULL or valid:\r\n\t\t\t//this.getWhitelist();\r\n\t\t\tlet prjWhitelist: string | undefined = this.project?.whitelistId;\r\n\t\t\tthis.chosenWhitelistId = (prjWhitelist ? prjWhitelist : \"\");\r\n\t\t} else { // Creating a fresh new project.\r\n\t\t\tthis.resetInputs();\r\n\t\t\tthis.ensureAdminIsFirstMember();\r\n\t\t}\r\n\t\tthis.updateOrgTokenInfo();\r\n\t\t// this.ensureAdminIsFirstMember();\r\n\t}\r\n\r\n\tensureAdminIsFirstMember() {\r\n\t\tconsole.log('mp.ensureAdminIsFirstMember');\r\n\t\t//ensures that the creator of the project gets added as the first member, enabling safety checks on the procedure so that admin\r\n\t\t//cannot re-add themselves to the project, causing the project to corrupt.\r\n\t\tthis.admin = this.appContext.currentUser;\r\n\t\tconsole.log('act, init this.project to empty, companyName:', this.admin?.companyName);\r\n\t\tif (!this.admin) { return; }\r\n\r\n\t\tlet myAdmin:UserDto = this.admin;\r\n\t\tconsole.log(`ensureAdminIsFirstMember, admin userId: ${myAdmin.id}, userCompany:${myAdmin.organization.id}`, myAdmin);\r\n\t\tif (!myAdmin.organization.id) { throw 'no org id on admin user.'; }\r\n\r\n\t\t// if-admin.\r\n\t\tthis.setProject( {\r\n\t\t\tid: this.projectId != undefined ? this.projectId : '00000000-0000-0000-0000-000000000000',\r\n\t\t\tname: '',\r\n\t\t\tregion: '',\r\n\t\t\tclassificationId: '',\r\n\t\t\tmodelSource: '', //in_ensureAdminIsFirstMember', // Important this is empty, otherwise user can't edit it..\r\n\t\t\twhitelistId: '',\r\n\t\t\townerCompanyId: '',\r\n\t\t\townerCompanyName: '',\r\n\t\t\tmembers: [ {\r\n\t\t\t\t\tuserId: this.admin.id,\r\n\t\t\t\t\tname: this.admin.firstName + \" \" + this.admin.lastName,\r\n\t\t\t\t\temail: this.admin.email,\r\n\t\t\t\t\tcompanyName: this.admin.companyName,\r\n\t\t\t\t\tuserCompanyId: myAdmin.organization.id, //'00000000-0000-0000-0000-000000000000' //https://jira.eg.dk/browse/AJC-3664\r\n\t\t\t\t\tnotifySync: true //false // a default, for default-admin.\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\tprojectInvitations: [],\r\n\t\t\tselected: false,\r\n\t\t\tcreated_UTC: new Date()\r\n\t\t} );\r\n\t} //ensureAdminIsFirstMember\r\n\t\r\n\tattached() {\r\n\t\tconsole.log('mp.attached');\r\n\t\tthis.fieldsetBody = this.element.querySelector(\".manage-project__body\");\r\n\t\tthis.fieldsetBody.addEventListener('scroll', this.isScrolled);\r\n\t\t\r\n\t\tconst searchHandler = (data: any) => this.handleMemberListSearchEvent(data);\r\n\t\tthis.subscriptions = [\r\n\t\t\tthis.events.subscribe(this.viewContext + \":SearchTermChanged\", searchHandler),\r\n\t\t\tthis.events.subscribe(\"global:org-changed\", async () => this.updateOrgTokenInfo())\r\n\t\t];\r\n\r\n\t\tthis.focusField_ASAP('name'); // JG: This should put keyboard focus in the name field!\r\n\t}\r\n\r\n\tupdateOrgTokenInfo() {\r\n\t\tconsole.log('mp.updateOrgTokenInfo');\r\n\t\tthis.orgTokenInfo = this.orgTokenService.getOrgTokenInfo();\r\n\t}\r\n\r\n\tdeactivate() {\t\t\r\n\t\tconsole.log('mp.deactivate');\r\n\t\tthis.fieldsetBody.removeEventListener('scroll', this.isScrolled);\r\n\t}\r\n\r\n\tdetached() {\r\n\t\tconsole.log('mp.detached');\r\n\t\tthis.subscriptions.forEach(subscription => (\r\n\t\t\tsubscription.dispose()\r\n\t\t));\r\n\t}\r\n\r\n\tprivate isScrolled = (event: any) => {\r\n\t\tconsole.log('mp.isScrolled');\r\n\t\tif (this.fieldsetBody.scrollTop > 0) {\r\n\t\t\tdocument.querySelector('top-bar')?.classList.add('scrolled');\r\n\t\t} else {\r\n\t\t\tdocument.querySelector('top-bar')?.classList.remove('scrolled');\r\n\t\t}\r\n\t}\r\n\r\n\tpublic toggleUnitSettings(){\r\n\t\tconsole.log('mp.toggleUnitSettings');\r\n\t\tthis.showSettings = !this.showSettings;\r\n\t}\r\n\t\r\n\tpublic reset() {\r\n\t\tconsole.log('mp.reset');\r\n if (this.isEditing) {\r\n this.router.navigateToRoute('projects');\r\n } else {\r\n this.setProject(this.originalProject);//reset\r\n this.projectId = \"\";\r\n this.resetInputs();\r\n }\r\n\t}\r\n\t\r\n\tprivate resetInputs() {\r\n\t\tconsole.log('mp.resetInputs');\r\n\t\tthis.isEditing = false;\r\n\t\tthis.setProject(undefined);//resetInputs\r\n\t}\r\n\r\n\tpublic submit() {\r\n\t\tconsole.log('mp.submit');\r\n\t\tthis.isSaving = true;\r\n\t\tif (this.isEditing) {\r\n\t\t\tthis.update();\r\n\t\t} else {\r\n\r\n\t\t\tthis.create();//in-submit.\r\n\t\t}\r\n\t}\r\n\t\r\n\r\n\tpublic closeUnitSettings() {\r\n\t\tconsole.log('mp.closeUnitSettings');\r\n\t\tthis.showSettings = false;\r\n\t}\r\n\r\n\tasync createProjectHead():Promise {\r\n\t\tconsole.log('mp.createProjectHead');\r\n\t\t/* todo, this should match rules with\r\n\t\twhat set-basic-info does\r\n\t\t - either both should fail, or both should pass.\r\n\t\t Right now, we are allowed to create the project,\r\n\t\tbut not to write. \r\n\t\t*/\r\n\t\tlet trimmedProjectName = Boolean(this.project) && Boolean(this.project?.name) ? this.project?.name.trim() : '';\r\n\r\n\t\tif (!Boolean(trimmedProjectName)) {\r\n\t\t\tthis.modal.OpenMessage(\"Error\", \"The project was not created because the name contained only whitespaces! Please try again.\").whenClosed(() => {\r\n\t\t\t\tthis.isSaving = false;\r\n\t\t\t});\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst createdProjectId: string = await this.apiClient.system.postJson('Project/Create', trimmedProjectName).jsonResult();\r\n\t\treturn createdProjectId;\r\n\t}\r\n\t\r\n\tprivate async create() { //UB:submit, Should at some point be changed to do it the same way as createByOrgFromToken\r\n\t\tconsole.log('mp.create');\r\n\t\tconst orgAdmin = this.isOrgAdmin;\r\n\t\tconsole.log('L210 - manage-project.create; isOrgAdmin?', orgAdmin, '(if you are not orgAdmin, you probably cant add project members.)');\r\n\t\tif (!this.project) { return; }\r\n\r\n\t\tconst createdProjectId: string = await this.createProjectHead();\r\n\t\tif (!createdProjectId) { return; }\t\t\r\n\r\n\t\tthis.projectId = createdProjectId; this.project.id = createdProjectId; const prj = createdProjectId;\r\n\t\t// build objects to update project tables\r\n\t\tlet number = this.project.number;\r\n\t\tlet basicInfoDto:BasicInfoDto = this.getUpdatedBasicInfo();\r\n\t\tlet location:any = this.getUpdatedLocation();\r\n\t\tconst hasLocation:boolean = (location.Address && location.City && location.ZipCode && location.Address !== \"\" && location.City !== \"\" && location.ZipCode !== \"\"); // JG: why do we do this?\r\n\t\tlet region = location.region;\r\n\t\tlet facilityManager = this.getUpdatedFacilityManager();\r\n\t\tlet membersAdded:Member[] = this.getAddedMembers();\r\n\t\tfor (let x of membersAdded) { console.log(`membersAdded: userId: ${x.userId} userCompanyId: ${x.userCompanyId}`); }\r\n\r\n const currentUser_OrgId = this.appContext.currentUserOrgId(); \r\n\t\tconst api = this.apiClient; \r\n\t\tconst apiSys = () => api.system; \r\n\t\tconst apiPrj = () => api.project(prj);\r\n\t\tconst apiOrg = () => api.orgByToken(currentUser_OrgId);\r\n\r\n\t\tlet promises0:RequestErrorHandling[] = [];\r\n\r\n\t\tawait this.handleUpdateModelSourceOK( apiOrg() ); // hmm, does revit project exist?\r\n\r\n\t\t//promises0.push(apiPrj().postJson('Project/SetBasicInfo_Prj', basicInfoDto));//in-create.\r\n\t\tpromises0.push(apiSys().postJson(`Project/SetBasicInfo_Sys/${prj}`, basicInfoDto));//in-create.\r\n\t\tif (Boolean(number)) { promises0.push(apiSys().postJson(`Project/SetNumber/${prj}`, number)); }\t\t\r\n\t\tif (Boolean(region)) { promises0.push(apiSys().postJson(`Project/SetRegion/${prj}`, region)); }\t\t\r\n\t\tif ( hasLocation) { promises0.push(apiSys().postJson(`Project/SetAddress/${prj}`, location)); }\r\n\t\tpromises0.push(apiSys().postJson(`Project/SetFacilityManager/${prj}`, facilityManager)); \t\t\r\n\t\t//if (membersAdded.length > 0) { promises0.push(apiPrj().postJson('Project/AddPrjAdminMember_Prj', membersAdded)); }\r\n\t\tif (membersAdded.length > 0) { promises0.push(apiSys().postJson(`Project/AddPrjAdminMember_Sys/${prj}`, membersAdded)); }\r\n\t\t\r\n\t\t// JG: This would break if it has actual data to save!\r\n\t\t//await this.unitSettings?.save(); //promises.push(); // the odd one out. // in create.\r\n\t\tawait this.unitSettings?.saveByOrg(prj); //promises.push(); // the odd one out. // in create.\r\n\t\t\r\n\t\tthis.rememberOriginalProject(); // clone this.project into this.originalProject, for some reason. I wonder why this.project should be changed by now?\r\n\t\ttry {\r\n\t\t\tlet promises1:Promise[] = promises0.map(async x => x.response());\r\n\t\t\tlet promises2:Promise[] = promises1.map(async x => (await x).content);\r\n\t\t\tconst values = await Promise.all(promises2);\r\n\t\t\tconsole.log('all after-create promises OK, values:', values);\r\n\t\t\tthis.events.publish(\"project-created\", this.project);\r\n\r\n\t\t\tconsole.log('after create-post OK');\r\n\t\t\tthis.router.navigate('administration/projects/edit/'+ this.projectId,{replace:true, trigger:true});\t\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error('err??', err);\r\n\t\t\tconst err_:any = err;\r\n\r\n\t\t\tlet details:any;\r\n\t\t\tif ('json' in err_) {\r\n\t\t\t\tdetails = await err_.json();\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log('no json()');\r\n\t\t\t\tdetails = err_;\r\n\t\t\t}\r\n\t\t\tconsole.log('details:', details);\r\n\t\t} finally {\r\n\t\t\tthis.isSaving = false;\r\n\t\t}\t\t\r\n\t} // .catch(async reason => console.error(await reason.json()))\r\n\r\n\tprivate createByOrgFromToken() { // L267, triggered from button [Create on selected organization]\r\n\t\tconsole.log('mp.createByOrgFromToken');\r\n\t\t// C:\\dev\\aoc\\AO.Client\\ClientApp\\src\\app\\administration\\projects\\manage\\manage-project.ts\r\n\t\tconsole.log('createByOrgFromToken-L269');\r\n\t\t//TODO - Check if any org is selected\r\n\t\tif (this.orgTokenInfo?.orgRole != OrgRole.Org_Admin) { return; } //Should never happen.\r\n\t\tlet trimmedProjectName = Boolean(this.project) && Boolean(this.project?.name) ? this.project?.name.trim() : '';\r\n\r\n\t\tif (!Boolean(trimmedProjectName)) {\r\n\t\t\tthis.modal.OpenMessage(\"Error\", \"The project was not created because the name contained only whitespaces! Please try again.\").whenClosed(() => {\r\n\t\t\t\tthis.isSaving = false;\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); // this.apiClient.appContext.currentUser?.organization.id;\r\n\t\tthis.apiClient.orgByToken(currentUser_OrgId).postJson('Project/CreatePrjInOrg', trimmedProjectName)\r\n\t\t.jsonResult()\r\n\t\t.then((createdProjectId: string) => {\r\n\t\t\tif (this.project) {\r\n\r\n\t\t\t\tthis.projectId = createdProjectId;\r\n\t\t\t\tthis.project.id = createdProjectId;\r\n\t\t\t\tlet number = this.project.number;\r\n\t\t\t\tlet basicInfoDto:BasicInfoDto = this.getUpdatedBasicInfo();\r\n\t\t\t\tlet location:any = this.getUpdatedLocation();\r\n\t\t\t\tlet region = location.region;\r\n\t\t\t\tlet facilityManager = this.getUpdatedFacilityManager();\r\n\t\t\t\t// // build objects to update project tables\r\n\r\n\t\t\t\tlet promises = [];\r\n\r\n\t\t\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); // this.apiClient.appContext.currentUser?.organization.id;\r\n\r\n\t\t\t\tpromises.push(this.apiClient.orgByToken(currentUser_OrgId).postJson(`Project/SetBasicInfo_Org?projectId=${createdProjectId}`, basicInfoDto).response().catch(async reason => console.error(await reason.json())));\r\n\t\t\t\t\r\n\t\t\t\tif (Boolean(number)) {\r\n\t\t\t\t\tpromises.push(this.apiClient.orgByToken(currentUser_OrgId).postJson('Project/SetNumber/' + this.projectId, number).response().catch(async reason => console.error(await reason.json())));\r\n\t\t\t\t}\r\n\t\t\t\tif (Boolean(region)) {\r\n\t\t\t\t\tpromises.push(this.apiClient.orgByToken(currentUser_OrgId).postJson('Project/SetRegion/' + this.projectId, region).response().catch(async reason => console.error(await reason.json())));\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (location.Address && location.City && location.ZipCode && location.Address !== \"\" && location.City !== \"\" && location.ZipCode !== \"\") {\r\n\t\t\t\t\tpromises.push(this.apiClient.orgByToken(currentUser_OrgId).postJson('Project/SetAddress/' + this.projectId, location).response().catch(async reason => console.error(await reason.json())));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tpromises.push(this.apiClient.orgByToken(currentUser_OrgId).postJson('Project/SetFacilityManager/' + this.projectId, facilityManager).response().catch(async reason => console.error(await reason.json())));\r\n\t\t\t\t\r\n\t\t\t\tlet membersAdded = this.getAddedMembers();\r\n\t\t\t\tif (membersAdded.length > 0) {\r\n\t\t\t\t\t//This is ALWAYS ONLY the current user being set as admin on the project.\r\n\t\t\t\t\t//Before the project is created no user can be added to the project. I Guess it should be refactored, so the client does not send a list.\r\n\t\t\t\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); // this.apiClient.appContext.currentUser?.organization.id;\r\n\t\t\t\t\tpromises.push(this.apiClient.orgByToken(currentUser_OrgId).postJson(`Project/AddPrjAdminMember?projectId=${createdProjectId}`, membersAdded).response().catch(async reason => console.error(await reason.json())));\r\n\t\t\t\t}\r\n\r\n\t\t\tpromises.push(this.unitSettings?.saveByOrg(createdProjectId));//in-createByOrgFromToken\r\n\t\t\t\r\n\t\t\tthis.rememberOriginalProject(); // clone this.project into this.originalProject, for some reason. I wonder why this.project should be changed by now?\r\n\t\t\t\r\n\t\t\tPromise.all(promises).then(values => {\r\n\t\t\t\tconsole.log('all after-create promises OK');\r\n\t\t\t\tthis.events.publish(\"project-created\", this.project);\r\n\t\t\t}).finally(() => {\r\n\t\t\t\tthis.isSaving = false;\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\t}).then( () => {\r\n\t\t\tconsole.log('after create-post OK');\r\n\t\t\tthis.router.navigate('administration/projects/edit/'+ this.projectId,{replace:true, trigger:true});\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tputHostOnInvitations(invitations:ProjectInvitation[]) { // needed so API server knows where to link to.\r\n\t\tconsole.log('mp.putHostOnInvitations');\r\n\t\tlet L = window.location;\r\n\t\tlet host = `${L.protocol}//${L.host}`; \r\n\t\tconsole.log('passing host:',host);\r\n\t\tfor (let i of invitations) { i.host = host;\t}\r\n\t}\r\n\r\n\r\n\t/////////////////////////////////////////////////\r\n\r\n\t//mutatingModelSource:boolean = false; // maybe should be a counter?\r\n\tmutatingModelSource:number = 0; // maybe should be a bool?\r\n\r\n\tasync modelSourceChanged(newValue:string,oldValue:string) {\r\n\t\tif (this.settingModelSource) { console.warn('ignoring modelSource init'); return; }\r\n\t\tif (this.mutatingModelSource>0) {\r\n\t\t\tconst err = `mutatingModelSource is not zero: ${this.mutatingModelSource}`;\r\n\t\t\tconsole.error(err);\r\n\t\t\tthrow err;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\t++this.mutatingModelSource; // this.mutatingModelSource = true;\r\n\t\t\tconsole.log('modelSourceChanged', oldValue, '->', newValue);\r\n\t\t\t//let msg = `Hmm ${oldValue} '->' ${newValue}`;\r\n\t\t\t//const xx = await this.modal.OpenMessage(\"Warning\", msg).whenClosed();\r\n\r\n\t\t\t// this.originalProject?.modelSource\r\n\t\t\tconst origValue:string|undefined = this.originalProject?.modelSource;\r\n\t\t\tconst isOK:boolean = await this.isModelSource_changeOK(origValue,newValue); //oldValue\r\n\t\t\tif (!isOK) { \r\n\t\t\t\tthis.setModelSource(oldValue); //(in modelSourceChanged)\r\n\t\t\t\treturn; // do we need a 'isMutating' mechanism?\r\n\t\t\t} \r\n\r\n\t\t\tif (this.project) { this.project.modelSource = this.modelSource!; }\r\n\t\t} finally {\r\n\t\t\t--this.mutatingModelSource; // this.mutatingModelSource = false;\r\n\t\t}\r\n\t}\r\n\r\n\tasync handleUpdateModelSourceOK(api: RequestMethod):Promise {\r\n\t\tconst source_toBe = this.project?.modelSource;\r\n\t\tconsole.log('handleUpdateModelSourceOK', this.project?.modelSource);\r\n\t\tif (this.originalProject?.modelSource == source_toBe) {\r\n\t\t\tconsole.log('modelsource UNchanged:', this.originalProject?.modelSource, '<-', source_toBe);\r\n\t\t\treturn true; // no-change == ok.\r\n\t\t}\r\n\t\tconst changeOK = await this.isModelSource_changeOK(this.originalProject?.modelSource!, source_toBe!);\r\n\t\tif (!changeOK) { return false;}\t\t\r\n\r\n\t\t// or an object/dict - we should return SOMETHING. TODO - SetModelSource_Org is not impl!\r\n\t\tlet jsonResponse:boolean = await api.postJson(`Project/SetModelSource_Org/${this.projectId}`, source_toBe).jsonResult();\t\t\r\n\t\tconsole.log('SetModelSource_Org response:', jsonResponse);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tasync isModelSource_changeOK(source_was: string|undefined, source_now: string):Promise { // UB both edit-handler and create/update.\r\n\t\t/* \r\n\t\tCheck whether it is a dangerous switch.\r\n\t\tIf it is, ask the user.\r\n\t\tIf user says no, abort.\r\n\t\tFurther, if it is 'too dangerous', don't even allow user to confirm..\r\n\t\t */\r\n\t\tlet confirmed = true;\r\n\r\n\t\tlet danger:string = this.isDanger(source_was, source_now); // consider some combinations should be purely blocked.\r\n\t\tif (danger) {\r\n\t\t\tconst answer:DialogCloseResult = await this.modal.OpenConfirm(\"Danger - Confirm\", danger).whenClosed(); // was: OpenMessage\r\n\t\t\tconfirmed = !answer.wasCancelled; // (\"you answered OK, if that dlg wasn't cancelled.\")\r\n\t\t\t//confirmed = false; // We decide to block it!\r\n\t\t} \r\n\r\n\t\tif (!confirmed) {\r\n\t\t\tlet msg = 'not OK';\r\n\t\t\tawait this.modal.OpenMessage(\"Setting Model Source Failed, as user cancelled.\", msg);\r\n\t\t}\r\n\t\treturn confirmed; \r\n\t}\r\n\r\n\tisDanger(source_was: string|undefined, source_now: string): string {\r\n\t\tif (source_was && source_was.length > 0) {\r\n\t\t\tconst msg:string = \r\n\t\t\t`Model Source was already set to [${source_was}]. \\n`+ \r\n\t\t\t`Are you sure you want to change it to ${source_now}? \\n`+ \r\n\t\t\t`You will lose all data and history in your project, if you do.\\n`\r\n\t\t\t// +`I suggest you don't, and have decided for you.`\r\n\t\t\t;\r\n\t\t\treturn msg;\r\n\t\t}\r\n\t\treturn ''; // no problem.\r\n\t}\r\n\r\n\tasync updateWhitelist(apiOrg: RequestMethod) {\r\n\t\tconsole.log('mp.updateWhitelist');\r\n\t\tif (this.projectId == undefined) { return; }\r\n\r\n\t\tif (this.originalProject?.whitelistId == this.chosenWhitelistId) {\r\n\t\t\tconsole.log('whitelist UNchanged:', this.originalProject.whitelistId, '<-', this.chosenWhitelistId);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this.chosenWhitelistId) {\r\n\t\t\tconsole.log(`chosenWhitelist not a proper value:[${this.chosenWhitelistId}], so we don't try to store it.`);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconsole.log('whitelist change:', this.originalProject?.whitelistId, '<-', this.chosenWhitelistId);\r\n\r\n try {\r\n let path = `Project/SetWhitelist_Org/${this.projectId}`;\r\n\r\n console.log('arg for WL:', this.chosenWhitelistId);\r\n let REH:RequestErrorHandling = apiOrg.postJson(path, this.chosenWhitelistId);\r\n\t\t\t\r\n let jsonResponse = await REH.jsonResult();\r\n console.log('setWhitelist response:', jsonResponse);\r\n\r\n // also, fix-up the project itself: (preferably, this should be done in the happy-path of the SetWhitelist call.)\r\n // It is important this happens, otherwise rememberOriginalProject() won't remember that change correctly.\r\n if (this.project) { this.project.whitelistId = this.chosenWhitelistId; }\r\n } catch (reason: any) {\r\n console.error('SetWhiteList failed with:', reason);\r\n let xx = await reason.json();\r\n console.error('err resp:', xx);\r\n }\t\r\n\t}\r\n\r\n\tprivate async update() {\t\t\r\n\t\tconst TMI:boolean = true;\r\n\r\n\t\tconsole.log('mp.update (called from submit.)');\r\n\t\tif (!this.projectId) { console.warn('mp.update, bailing out as no defined projectId'); return; }\r\n\r\n\t\tlet number = this.project?.number;\r\n\t\tlet region = this.project?.location?.region;\r\n\t\tlet basicInfoDto:BasicInfoDto = this.getUpdatedBasicInfo(); // JG: this includes classification!\r\n\t\tlet location:any = this.getUpdatedLocation();\r\n\t\tlet facilityManager = this.getUpdatedFacilityManager();\t\t\r\n\r\n const currentUser_OrgId = this.appContext.currentUserOrgId(); \r\n\t\tconst api = this.apiClient; \r\n\t\tconst apiOrg = () => api.orgByToken(currentUser_OrgId);\r\n\r\n\t\tlet promises0:RequestErrorHandling[] = [];\r\n\r\n\t\tif (!await this.handleUpdateModelSourceOK( apiOrg() )) { return; } // update\r\n\r\n\t\ttry { await this.updateWhitelist( apiOrg() ); } catch (e) { console.warn('updateWhitelist failed, saving rest of project anyway', e); }\t\t\r\n\r\n\t\tif (this.originalProject?.name.trim() !== this.project?.name.trim()) { \r\n\t\t\tif (TMI) { console.log('we rename, as name has changed.'); }\r\n const renamer = apiOrg().postJson('Project/Rename_Org/' + this.projectId, this.project?.name.trim())\r\n promises0.push(renamer); \r\n } \r\n\r\n\t\tif (TMI) { console.log('we ALWAYS store/update basicInfo.'); }\r\n\t\tconst basics = apiOrg().postJson(`Project/SetBasicInfo2_Org/${this.projectId}`, basicInfoDto);\r\n\t\tpromises0.push(basics);\r\n\r\n\t\tif (number != undefined) { \r\n\t\t\tpromises0.push(this.apiClient.system.postJson('Project/SetNumber/' + this.projectId, number)); \r\n\t\t\tif (TMI) { console.log('we always update NUMBER, if it is defined at all.'); }\r\n\t\t} \r\n\r\n\t\tif (region != undefined) { \r\n\t\t\tif (TMI) { console.log('we always update REGION, if it is defined at all.', region); }\r\n\t\t\tpromises0.push(this.apiClient.system.postJson('Project/SetRegion/' + this.projectId, region)); \r\n\t\t} \r\n\t\t\t\t\r\n\t\tif (location.Address != undefined && location.City != undefined && location.ZipCode != undefined && location.Address !== \"\" && location.City !== \"\" && location.ZipCode !== \"\") {\r\n\t\t\tif (TMI) { console.log('we always update location, if it is specified at all.'); }\r\n\t\t\tpromises0.push(this.apiClient.system.postJson('Project/SetAddress/' + this.projectId, location)); \r\n\t\t} else { this.missingLocationData(); }\r\n\r\n\t\tif (TMI) { console.log('we ALWAYS update facility manager.'); }\r\n\t\tpromises0.push(this.apiClient.system.postJson('Project/SetFacilityManager/' + this.projectId, facilityManager)); \r\n\r\n\t\tif (TMI) { console.log('we ALWAYS try to store units.'); }\r\n\t\t//await this.unitSettings?.save();//in-update.\r\n\t\tawait this.unitSettings?.saveByOrg(this.projectId);//in-update. //currentUser_OrgId\r\n\r\n\t\tthis.rememberOriginalProject();\r\n\r\n\t\ttry {\r\n\t\t\tlet promises1:Promise[] = promises0.map(async x => x.response());\r\n\t\t\tlet promises2:Promise[] = promises1.map(async x => (await x).content);\r\n\t\t\tconst values = await Promise.all(promises2);\r\n\t\t\tconsole.log('all project-updated promises OK, values:', values);\r\n\t\t\tthis.events.publish(\"project-updated\", this.project);\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error('err??', err);\r\n\t\t\tconst err_:any = err;\r\n\t\t\tlet details:any;\r\n\t\t\tif ('json' in err_) {\r\n\t\t\t\tdetails = await err_.json();\r\n\t\t\t} else {\r\n\t\t\t\tconsole.warn('no json()');\r\n\t\t\t\tdetails = err_;\r\n\t\t\t}\r\n\t\t\tconsole.log('details:', details);\r\n\t\t} finally {\r\n\t\t\tthis.isSaving = false;\r\n\t\t}\r\n\t} // update-end.\r\n\r\n\r\n missingLocationData() {\r\n this.modal.OpenMessage(\"Location information not updated\", \"Address, zip code and city could not be updated because one or more fields were empty.\")\r\n if (this.project?.location) {\r\n this.project.location = this.originalProject?.location;\r\n }\r\n }\r\n\t\r\n\tprivate async fetchClassifications() {\r\n\t\tconsole.log('before GetClassifications');\r\n\t\tif (this.projectId != undefined) {\r\n\t\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); // this.apiClient.appContext.currentUser?.organization.id;\r\n\t\t\tthis.classifications = await this.apiClient.orgByToken(currentUser_OrgId)\r\n\t\t\t.postJson('Classification/GetClassifications_NoRole', this.projectId)\r\n\t\t\t.jsonResult();\r\n\t\t\tconsole.log('after GetClassifications:', this.classifications);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate async fetchProject(projectId:string) { // this will break, unless we have a token!\r\n\t\tconsole.log('before fetchProject', projectId);\r\n\t\ttry {\r\n\t\t\t// Hvorfor hulen putter den ikke token paa? \r\n\t\t\t// Authorization: Bearer \r\n\r\n\t\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); // this.apiClient.appContext.currentUser?.organization.id;\r\n\t\t\t//let RM:RequestMethod = this.apiClient.project(projectId);\r\n //this.project = await this.apiClient.projectWToken(params.projectId).get('Project/GetProject').jsonResult();//activate\r\n\t\t\t//let RM:RequestMethod = this.apiClient.projectWToken(projectId);\r\n\t\t\tlet RM:RequestMethod = this.apiClient.orgByToken(currentUser_OrgId);\r\n\t\t\tlet R2:RequestErrorHandling = RM.get(`Project/GetProject_Org/${projectId}`); // fetchProject\r\n\r\n\t\t\tlet resultPrj:ProjectDto = await R2.jsonResult();\r\n\t\t\tconsole.log('fetchProject THEN:', resultPrj);\r\n\t\t\tthis.setProject(resultPrj);//fetchProject\r\n\t\t\tconsole.log('fetchProject saw modelSource as:', resultPrj.modelSource); //, resultPrj);\r\n\t\t\tthis.rememberOriginalProject();\r\n\t\t} catch (e) {\r\n\t\t\tconsole.error('something failed in fetchProject', projectId, e);\r\n\t\t} finally {\r\n\t\t\tconsole.log('after fetchProject call,', projectId);\r\n\t\t}\r\n\t}\r\n\t\r\n\tprivate rememberOriginalProject() {\r\n\t\tconsole.log('rememberOriginalProject');\r\n\t\t/* Makes a copy of the initial UNEDITED project,\r\n\t\tused at SAVE time to compare against for changes,\r\n\t\tto decide what changes have happened\r\n\t\tand need to be stored. \r\n\t\t*/\r\n\t\tthis.originalProject = Object.assign({}, this.project);\r\n\t\tif (this.project) {\r\n\t\t\tthis.originalProject.members = Boolean(this.project.members)\r\n\t\t\t? Object.assign([], this.project.members)\r\n\t\t\t: [];\r\n\t\t\tthis.originalProject.projectInvitations = Boolean(this.project.projectInvitations)\r\n\t\t\t? Object.assign([], this.project.projectInvitations)\r\n\t\t\t: [];\r\n\t\t\tthis.originalProject.location = Boolean(this.project.location) \r\n\t\t\t? Object.assign({}, this.project.location)\r\n\t\t\t: {};\r\n\t\t\tthis.originalProject.location.coordinates = Boolean(this.project.location) && Boolean(this.project?.location?.coordinates)\r\n\t\t\t? Object.assign({}, this.project.location?.coordinates)\r\n\t\t\t: { latitude : null, longitude: null };\r\n\t\t\t\r\n\t\tthis.originalProject.facilityManager = Boolean(this.project.facilityManager) \r\n\t\t\t? Object.assign({}, this.project.facilityManager)\r\n\t\t\t: {};\r\n\r\n\t\t\tthis.originalProject.facilityManager.location = Boolean(this.project.facilityManager) && Boolean(this.project?.facilityManager?.location)\r\n\t\t\t? Object.assign({}, this.project?.facilityManager?.location)\r\n\t\t\t: {};\r\n\t\t\t\r\n\t\t\tthis.originalProject.facilityManager.location.coordinates = Boolean(this.project.facilityManager) && Boolean(this.project?.facilityManager?.location) && Boolean(this.project?.facilityManager?.location?.coordinates) \r\n\t\t\t? Object.assign({}, this.project.facilityManager?.location?.coordinates)\r\n\t\t\t: { latitude : null, longitude: null };\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tprivate getUpdatedBasicInfo(): BasicInfoDto { \r\n\t\tconsole.log('getUpdatedBasicInfo, isEditing? ', this.isEditing);\r\n\t\tif (this.isEditing) {\r\n\t\t\tlet basicInfoDto:BasicInfoDto = {\r\n\t\t\t\tTypeId: this.isEditing ? this.originalProject?.typeId : \"00000000-0000-0000-0000-000000000000\",\r\n\t\t\t\tClassificationId: this.isEditing ? this.originalProject?.classificationId : \"00000000-0000-0000-0000-000000000000\",\r\n\t\t\t\tGrossArea: this.isEditing ? this.originalProject?.grossArea : \"\"\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tif (this.project?.typeId !== this.originalProject?.typeId) {\r\n\t\t\t\tbasicInfoDto.TypeId = this.project?.typeId;\r\n\t\t\t}\r\n\t\t\tif (this.project?.classificationId !== this.originalProject?.classificationId) {\r\n\t\t\t\tbasicInfoDto.ClassificationId = this.project?.classificationId.toString() === \"0\" ? \"00000000-0000-0000-0000-000000000000\" : this.project?.classificationId;\r\n\t\t\t}\r\n\t\t\tif (this.project?.grossArea !== this.originalProject?.grossArea) {\r\n\t\t\t\tbasicInfoDto.GrossArea = this.project?.grossArea;\r\n\t\t\t}\r\n\t\t\treturn basicInfoDto;\r\n\t\t} else {\r\n\t\t\tlet basicInfoDto:BasicInfoDto = {\r\n\t\t\t\tTypeId: \"00000000-0000-0000-0000-000000000000\",\r\n\t\t\t\tClassificationId: \"00000000-0000-0000-0000-000000000000\",\r\n\t\t\t\tGrossArea: \"\"\r\n\t\t\t};\r\n\t\t\tif (Boolean(this.project?.typeId)) {\r\n\t\t\t\tbasicInfoDto.TypeId = this.project?.typeId;\r\n\t\t\t}\r\n\t\t\tif (this.project?.classificationId != undefined) {\r\n\t\t\t\tbasicInfoDto.ClassificationId = this.project?.classificationId;\r\n\t\t\t}\r\n\t\t\tif (Boolean(this.project?.grossArea)) {\r\n\t\t\t\tbasicInfoDto.GrossArea = this.project?.grossArea;\r\n\t\t\t}\r\n\t\t\treturn basicInfoDto;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getUpdatedLocation(): {} {\r\n\t\tconsole.log('mp.getUpdatedLocation');\r\n\t\tif (this.isEditing) {\r\n\t\t\tlet location = {\r\n\t\t\t\tAddress: this.isEditing ? this.originalProject?.location?.address : \"\",\r\n\t\t\t\tZipCode: this.isEditing ? this.originalProject?.location?.zipCode : \"\",\r\n\t\t\t\tRegion: this.isEditing ? this.originalProject?.location?.region : \"\",\r\n\t\t\t\tCity: this.isEditing ? this.originalProject?.location?.city : \"\"\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tif (this.project?.location?.address !== this.originalProject?.location?.address) {\r\n\t\t\t\tlocation.Address = this.project?.location?.address;\r\n\t\t\t}\r\n\t\t\tif (this.project?.location?.zipCode !== this.originalProject?.location?.zipCode) {\r\n\t\t\t\tlocation.ZipCode = this.project?.location?.zipCode;\r\n\t\t\t}\r\n\t\t\tif (this.project?.location?.city !== this.originalProject?.location?.city) {\r\n\t\t\t\tlocation.City = this.project?.location?.city;\r\n\t\t\t}\r\n\t\t\t//console.log(\"region, orig:\" , this.originalProject?.location?.region)\r\n\t\t\t//console.log(\"region, edit:\" , this.project?.location?.region) \r\n\t\t\tif (this.project?.location?.region !== this.originalProject?.location?.region) {\r\n\t\t\t\tlocation.Region = this.project?.location?.region;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn location;\r\n\t\t} else {\r\n\t\t\tlet location: {Address?: string, City?: string, ZipCode?: string, region: string} = {\r\n\t\t\t\tAddress: \"\",\r\n\t\t\t\tCity: \"\",\r\n\t\t\t\tZipCode: \"\",\r\n\t\t\t\tregion: \"\"\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tif (this.project?.location != undefined && this.project?.location?.address != undefined) {\r\n\t\t\t\tlocation.Address = this.project?.location?.address;\r\n\t\t\t}\r\n\t\t\tif (this.project?.location != undefined && this.project?.location?.zipCode != undefined) {\r\n\t\t\t\tlocation.ZipCode = this.project?.location?.zipCode;\r\n\t\t\t}\r\n\t\t\tif (this.project?.location != undefined && this.project?.location?.city != undefined) {\r\n\t\t\t\tlocation.City = this.project?.location?.city;\r\n\t\t\t}\r\n\t\t\tif (this.project?.location?.region !== this.originalProject?.location?.region) {\r\n\t\t\t\tlocation.region = this.project?.location?.region ? this.project?.location?.region : \"\";\r\n\t\t\t}\r\n\t\t\treturn location;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getUpdatedFacilityManager(): {} {\r\n\t\tconsole.log('mp.getUpdatedFacilityManager');\r\n\t\tif(this.isEditing) {\r\n\t\t\tlet facilityManager = {\r\n\t\t\t\tName: this.isEditing ? this.originalProject?.facilityManager?.name : \"\",\r\n\t\t\t\tLocation: {\r\n\t\t\t\t\tAddress: this.isEditing ? this.originalProject?.facilityManager?.location?.address : \"\",\r\n\t\t\t\t\tCity: this.isEditing ? this.originalProject?.facilityManager?.location?.city : \"\",\r\n\t\t\t\t\tZipCode: this.isEditing ? this.originalProject?.facilityManager?.location?.zipCode : \"\",\r\n\t\t\t\t},\r\n\t\t\t\tVat: this.isEditing ? this.originalProject?.facilityManager?.vat : \"\"\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tif (this.project?.facilityManager?.name !== this.originalProject?.facilityManager?.name) {\r\n\t\t\t\tfacilityManager.Name = this.project?.facilityManager?.name;\r\n\t\t\t}\r\n\t\t\tif (this.project?.facilityManager?.location?.address !== this.originalProject?.facilityManager?.location?.address) {\r\n\t\t\t\tfacilityManager.Location.Address = this.project?.facilityManager?.location?.address;\r\n\t\t\t}\r\n\t\t\tif (this.project?.facilityManager?.location?.zipCode !== this.originalProject?.facilityManager?.location?.zipCode) {\r\n\t\t\t\tfacilityManager.Location.ZipCode = this.project?.facilityManager?.location?.zipCode;\r\n\t\t\t}\r\n\t\t\tif (this.project?.facilityManager?.location?.city !== this.originalProject?.facilityManager?.location?.city) {\r\n\t\t\t\tfacilityManager.Location.City = this.project?.facilityManager?.location?.city;\r\n\t\t\t}\t\t\t\r\n\t\t\tif (this.project?.facilityManager?.vat !== this.originalProject?.facilityManager?.vat) {\r\n\t\t\t\tfacilityManager.Vat = this.project?.facilityManager?.vat;\r\n\t\t\t}\r\n\t\t\treturn facilityManager;\r\n\t\t} else {\r\n\t\t\tlet facilityManager: {Name: string | undefined, Location: any, Vat: string | undefined} = {\r\n\t\t\t\tName: \"\",\r\n\t\t\t\tLocation: {\r\n\t\t\t\t\tAddress: \"\",\r\n\t\t\t\t\tCity: \"\",\r\n\t\t\t\t\tZipCode: \"\",\r\n\t\t\t\t},\r\n\t\t\t\tVat: \"\"\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tif (Boolean(this.project?.facilityManager) && this.project?.facilityManager?.name != undefined) {\r\n\t\t\t\tfacilityManager.Name = this.project?.facilityManager?.name;\r\n\t\t\t}\r\n\t\t\tif (Boolean(this.project?.facilityManager) && Boolean(this.project?.facilityManager?.location) && this.project?.facilityManager?.location?.address != undefined) {\r\n\t\t\t\tfacilityManager.Location.Address = this.project?.facilityManager?.location?.address;\r\n\t\t\t}\r\n\t\t\tif (Boolean(this.project?.facilityManager) && Boolean(this.project?.facilityManager?.location) && this.project?.facilityManager?.location?.zipCode != undefined) {\r\n\t\t\t\tfacilityManager.Location.ZipCode = this.project?.facilityManager?.location?.zipCode;\r\n\t\t\t}\r\n\t\t\tif (Boolean(this.project?.facilityManager) && Boolean(this.project?.facilityManager?.location) && this.project?.facilityManager?.location?.city != undefined) {\r\n\t\t\t\tfacilityManager.Location.City = this.project?.facilityManager?.location?.city;\r\n\t\t\t}\t\t\t\r\n\t\t\tif (Boolean(this.project?.facilityManager) && this.project?.facilityManager?.vat != undefined) {\r\n\t\t\t\tfacilityManager.Vat = this.project?.facilityManager?.vat;\r\n\t\t\t}\r\n\t\t\treturn facilityManager;\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n\t\r\n\t/* MEMBER HANDLING */\r\n\r\n\tprivate handleMemberListSearchEvent(data: string) { \r\n\t\tconsole.log('handleMemberListSearchEvent, data:', data);\r\n\t\tthis.searchTerm = data; \r\n\t}\t\r\n\r\n\tpublic newMember() { \r\n\t\tconsole.log('mp.newMember');\r\n\t\tconsole.log('newMember');\r\n\t\tthis.searchMemberEnabled = true; \t\t\r\n\t\tthis.focusField_ASAP('memberSearchInput_id'); // JG: This should put keyboard focus in the search field!\r\n\t}\r\n\r\n\tpublic focusField_ASAP(fieldId:string) { //console.log('setting focus to ', inputField);\r\n\t\tconsole.log('mp.focusField_ASAP, fieldId:', fieldId);\r\n\r\n\t\t//let inputField = document.getElementById(fieldId); \r\n\t\t//setTimeout(() => { inputField!.focus(); } , 200);\r\n\r\n\t\tsetTimeout(() => { \r\n\t\t\tlet inputField = document.getElementById(fieldId); \r\n\t\t\tif (!inputField) {\r\n\t\t\t\tconsole.warn('hmm, cant find field', fieldId);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tinputField!.focus(); \r\n\t\t\tconsole.log('now gave focus to ', fieldId, inputField);\r\n\t\t}, 200);\r\n\r\n\t\t// so, set keyboard focus to input field 'memberSearchInput_id'\r\n\t\t// why did this not work..? must we async it?\r\n\t\t// Maybe it is because it is not enabled yet?\r\n\t}\r\n\r\n\tpublic cancelNewMember() {\r\n\t\tconsole.log('cancelNewMember');\r\n\t\tthis.searchMemberEnabled = false;\r\n\t\tthis.searchMemberResult = [];\r\n\t\tthis.searchMemberText = \"\";\r\n\t}\r\n\t\r\n\tpublic async searchMemberTextChanged(newValue: string, oldValue: string) {\r\n\t\tif (!this.haveIBeenConstructedYet) {\r\n\t\t\tconsole.warn('searchMemberTextChanged being ignored because it was triggered against an instance that has yet to be constructed..');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconsole.trace('mp.searchMemberTextChanged'); // hvordan hulen bliver den aktiveret under startup?\r\n\t\t//console.log('searchMemberTextChanged, newValue:',newValue);\r\n\t\tif (!newValue) {\r\n\t\t\tthis.searchMemberResult = [];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet result:any = undefined; // this is an array of some DTO type, and we should specify that.\r\n\t\ttry {\r\n\t\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); // this.apiClient.appContext.currentUser?.organization.id;\r\n\t\t\tresult = await this.apiClient.orgByToken(currentUser_OrgId).postJson(`UserInfo/SearchForUsers?projectId=${this.projectId}`, newValue).jsonResult();\r\n\t\t\tconsole.log(\"result \" , result);\r\n\t\t} catch (reason) {\r\n\t\t\tconsole.error(reason);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\t\r\n\t\tlet currentMemberIds = this.project?.members.map(x => x.userId);\r\n\t\tthis.searchMemberResult = result\r\n\t\t.filter((m: any) => {\t\t\t\t\t\r\n\t\t\treturn currentMemberIds?.indexOf(m.id) === -1\r\n\t\t})\r\n\t\t.map((userDto: any) => {\r\n\t\t\treturn { userId : userDto.id, \r\n\t\t\t\tname : userDto.name, \r\n\t\t\t\temail: userDto.email, \r\n\t\t\t\tcompanyName: userDto.companyName, \r\n\t\t\t\tuserCompanyId: userDto.UserCompanyId };\r\n\t\t});\r\n\t}\r\n\t\r\n\tpublic async addMember(member: Member, index: number) {\r\n\t\tconsole.log('addMember, member:',member);\r\n\t\tif (Boolean(this.project?.members.find(x => x.email === member.email))){\r\n\t\t\tthis.modal.OpenMessage(\r\n\t\t\t\tthis.i18n.tr(\"Error\"),\r\n\t\t\t\tthis.i18n.tr(\"User with email: \") + member.email + this.i18n.tr(\" is already attached to this project.\") \r\n\t\t\t)\r\n\t\t} else {\r\n\r\n\t\t\tif (this.projectId == undefined) { return; }\r\n\r\n\t\t\tlet result: HttpResponseMessage = await this.apiClient.project(this.projectId).postJson('Project/AddMembers', [member]).response();\r\n\t\t\tif (result.statusCode != 200) {\r\n\t\t\t\tthis.modal.OpenMessage(\"User not added\", \"The user could not be added to the project.\")\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.appContext.getSelectedProject();\r\n\t\t\tthis.project?.members.push(member);// in manage-project.addMemember.\r\n\t\t\tconsole.log('addMember will add', member, 'we now have', this.project?.members);\r\n\t\t\tconsole.log(`userId: ${member.userId}, companyId: ${member.userCompanyId}`);\r\n\t\t\tthis.searchMemberResult.splice(index, 1);\r\n\t\t}\r\n\t\t\r\n\t}\r\n\r\n\tpublic async toggleNotifySync(member:Member) {\r\n\t\tconsole.log('mp.toggleNotifySync', member.notifySync, member);\r\n\r\n\t\tconsole.log('mp.toggleNotifySync, project_insist passing ', this.projectId);\r\n\t\t// we will expect to find ApiClient.PRJ_ACCESS_TOKEN set, in project_insist.\r\n\t\t// only ProjectTokenService.createNewProjectToken sets this!\r\n\t\t// mainly called by updatePrjTokenIfNeeded.\r\n\t\tawait this.projectTokenService.updatePrjTokenIfNeeded(this.projectId, this.apiClient);\r\n\r\n\t\t// this is where we fail with 403/401, because of \r\n\t\t// ... C: 0 pol:PrjUser (no project token claim, to check if we are role [Prj_User])\r\n\t\tlet api:RequestMethod = this.apiClient.project_insist(this.projectId!); \r\n\r\n\t\tlet REH:RequestErrorHandling = \r\n\t\t api.postJson('Project/ToggleMember_NotifySync', member.userId);// projectWToken is really apiClient.project.\r\n\t\tlet result: HttpResponseMessage = await REH.response(); // todo: pass member.notifySync .\r\n\r\n\t\t// https://jira.eg.dk/browse/AJC-3918\r\n\t\tconsole.log(result); \r\n\t} // if (this.projectId == undefined) { return; }\r\n\r\n\r\n\tpublic async removeMember(member:Member) {\r\n\t\tconsole.log('mp.removeMember');\r\n\t\tif (this.projectId != undefined) {\r\n\t\t\tlet areYouSure: DialogCloseResult = await this.modal.OpenConfirm(\"Remove member\", \"Are you sure you want to remove this member?\").whenClosed();\r\n\t\t\tif (areYouSure.wasCancelled == true) { return; }\r\n\t\t\tlet result: HttpResponseMessage = await this.apiClient.project(this.projectId).postJson('Project/RemoveMembers', [member.userId]).response();\r\n\t\t\tif (result.statusCode == 200) {\r\n\t\t\t\tlet index = this.project?.members.indexOf(member);\r\n\t\t\t\tif (index != undefined) {\r\n\t\t\t\t\tthis.project?.members.splice(index, 1);//ManageProject.removeMember\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tthis.modal.OpenMessage(\"User not removed\", \"The user could not be removed from the project.\")\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tprivate getAddedMembers():Member[] {\r\n\t\tconsole.log('mp.getAddedMembers');\r\n\t\tif (!this.project) { return [];} // (No project - none added.)\r\n\t\tif (!Boolean(this.project.members)) { return []; } // (No members - none added.)\r\n\t\t\r\n\t\tlet originals:string[] = []; // Compare current members with originals.\r\n\t\tif (this.originalProject) { originals = this.originalProject.members.map( m => m.userId ); }\t\r\n\t\tif (!originals) { return []; } // (without originals, 'added' makes no sense.. I guess?)\r\n\t\treturn this.project.members.filter( m => !originals.includes(m.userId) ); \t\t\r\n\t} \r\n\r\n\t// return true if not found, return false if array is empty..?\t\t \r\n\t// return those (..current) project-members that are NOT in the original-memberIDs: (which thus must have been added.)\r\n\t//: false // (JG: For some reason, the original code was expressed like this: That is, it would filter 'false' if originalMembersIds evaluated to false..? I don't know the logic behind that.)\r\n\r\n\tprivate getRemovedMembersIds():string[] {\r\n\t\tconsole.log('mp.getRemovedMembersIds');\r\n\t\tif (!Boolean(this.originalProject) || !Boolean(this.originalProject?.members) || !Boolean(this.project?.members) ) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tlet currentMembersIds = this.project?.members.map(x => x.userId);\r\n\t\tlet originalMembersIds = this.originalProject?.members.map(x => x.userId);\r\n\t\tif (originalMembersIds) {\r\n\t\t\treturn originalMembersIds.filter(memberId => {\r\n\t\t\t\tif (currentMembersIds) {\r\n\t\t\t\t\treturn currentMembersIds.indexOf(memberId) < 0\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn [];\r\n\t}\r\n\r\n\r\n\r\n\r\n\t/* INVITE HANDLING */\r\n\r\n\tkeydown_in_Searchfield(event:KeyboardEvent):boolean { \r\n\t\tconst ENTER_key_pressed = (event.key == 'Enter');\r\n\t\tif (ENTER_key_pressed) {\r\n\t\t\tthis.inviteMember(this.searchMemberText); \r\n\t\t}\r\n\t\tconst allowEventToPropagate = true;\r\n\t\treturn allowEventToPropagate; // apparently, returning true allows event to propagate.\r\n\t}\r\n\r\n\tpublic async inviteMember(email: string) { // triggers when +Plus-INVITE is clicked.\r\n\t\tconsole.log('inviteMember, email:',email);\r\n\t\tconst alreadyInvited = Boolean(this.project?.projectInvitations.find(x => x.email.toLowerCase() === email.toLowerCase())) || Boolean(this.project?.members.find(x => x.email.toLowerCase() === email.toLowerCase()));\r\n\t\tif (alreadyInvited) { return this.modal.OpenMessage( this.i18n.tr(\"Error\"), this.i18n.tr(\"A user with email: \") + email + this.i18n.tr(\" has already been added to this project.\") ); }\r\n\t\tif (!this.projectId) { return console.warn('no project id.'); }\r\n\t\tif (!this.validateEmail(email)) { return this.modal.OpenMessage( this.i18n.tr(\"Error\"), this.i18n.tr(\"The entered email is invalid\") ); }\r\n\r\n\t\tlet L = window.location;\r\n\t\tlet host = `${L.protocol}//${L.host}`; \r\n\t\tconsole.log('passing host:',host);\r\n\t\t//let host:string = 'https://aoc-linux-client-test.azurewebsites.net';\r\n\t\tlet invite: ProjectInvitation = { \r\n\t\t\temail: email, \r\n\t\t\tid: \"00000000-0000-0000-0000-000000000000\",\r\n\t\t\tprojectId: \"00000000-0000-0000-0000-000000000000\" ,\r\n\t\t\thost: host,\r\n\t\t\tresponseStatus: ResponseStatus.Pending,\r\n\t\t\tasOrgUser: this.asOrgUser,\r\n\t\t\tinviteeName: \"\",\r\n\t\t\tinviteeOrgName: \"\",\r\n\t\t\tprojectRole: ProjectRole.Prj_User\r\n\t\t};\r\n\r\n\t\t// let userExistResult: HttpResponseMessage = await this.apiClient.project(this.projectId).postJson('Project/IsUserKnown', invite.email).response();\r\n\t\t// console.log(\"userExistResult \" , userExistResult);\r\n\r\n\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); \r\n\t\tlet addInviResult: HttpResponseMessage = \r\n\t\t\tawait this.apiClient.orgByToken(currentUser_OrgId).postJson(`Project/AddInvitations_Org/${this.projectId}`, [invite]).response();\r\n\t\t\t//await this.apiClient.project(this.projectId).postJson('Project/AddInvitations', [invite]).response();\r\n\r\n\t\tif (addInviResult.statusCode == 200) {\r\n\t\t\tlet updatedInvitations: ProjectInvitation[] = addInviResult.content;\r\n\t\t\tfor (let i = 0; i < updatedInvitations.length; i++) {\r\n\t\t\t\tlet ix = this.project?.projectInvitations.findIndex(x => x.email == updatedInvitations[i].email);\r\n\t\t\t\tif (ix && ix > -1) {\r\n\t\t\t\t\tthis.project?.projectInvitations.splice(ix, 1, updatedInvitations[i]);\r\n\t\t\t\t}\r\n\t\t\t}\t\r\n\t\t\tconsole.log(\"updatedInvitaiton\" , updatedInvitations[0]);\r\n\t\t\tthis.project?.projectInvitations.push(updatedInvitations[0]);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic async removeInvitee(invitee: ProjectInvitation): Promise {\r\n\t\tconsole.log('mp.removeInvitee');\r\n\t\tif (this.projectId == undefined) { return; }\r\n\r\n\t\tlet areYouSure: DialogCloseResult = await this.modal.OpenConfirm(\"Remove invitation\", \"Are you sure you want to remove this invitation?\").whenClosed();\r\n\t\tif (areYouSure.wasCancelled == true) { return; }\r\n\r\n\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); \r\n\r\n\t\tlet REH:RequestErrorHandling;\r\n\r\n\t\t//REH = this.apiClient.project(this.projectId).postJson('Project/RemoveInvitations', [invitee.id]);\r\n\t\tREH = this.apiClient.orgByToken(currentUser_OrgId).postJson(`Project/RemoveInvitations_Org/${this.projectId}`, [invitee.id]);\r\n\r\n\t\tlet result: HttpResponseMessage = await REH\r\n\t\t.handleErrorWithErrorService( async (t: ErrorService, reason: HttpResponseMessage):Promise => {\r\n\t\t\tif (reason.statusCode == 410) {\r\n\t\t\t\tthis.modal.OpenConfirm(\"Invitation not found\",\"The invitation could not be found. Do you wish to reload the project?\")\r\n\t\t\t\t.whenClosed(async (result: DialogCloseResult) => {\r\n\t\t\t\t\tif (result.wasCancelled == false) {\r\n\t\t\t\t\t\tthis.setProject( await this.apiClient.project(this.project!.id).get('Project/GetProject').jsonResult());//removeInvitee\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tthis.modal.OpenMessage(\"Role change failed\",\"Changing the role did not succeed.\");\r\n\t\t\t}\r\n\t\t}).response();\r\n\r\n\t\tif (result.statusCode == 200) {\r\n\t\t\tlet index = this.project?.projectInvitations.indexOf(invitee);\r\n\t\t\tif (index != undefined && index != -1) {\r\n\t\t\t\tthis.project?.projectInvitations.splice(index, 1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getAddedInvitations():ProjectInvitation[]{\r\n\t\tconsole.log('mp.getAddedInvitations');\r\n\t\tif (!Boolean(this.project?.projectInvitations)) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tif (this.project?.projectInvitations) {\r\n\t\t\treturn this.project.projectInvitations.filter(invitation => { return invitation.id === \"00000000-0000-0000-0000-000000000000\"});\r\n\t\t}\r\n\t\treturn [];\r\n\t}\r\n\r\n\tprivate getRemovedInvitationIds():string[]{\r\n\t\tconsole.log('mp.getRemovedInvitationIds');\r\n\t\tif (!Boolean(this.originalProject) || !Boolean(this.originalProject?.projectInvitations) || !Boolean(this.project?.projectInvitations) )\r\n\t\t\treturn [];\r\n\r\n\t\tlet currentInvitationIds = this.project?.projectInvitations.filter(invitation => { return invitation.id !== \"00000000-0000-0000-0000-000000000000\"}).map(x => x.id);\r\n\t\tlet originalMembersIds = this.originalProject?.projectInvitations.filter(invitation => { return invitation.id !== \"00000000-0000-0000-0000-000000000000\"}).map(x => x.id);\r\n\t\tif (originalMembersIds) {\t\r\n\t\t\treturn originalMembersIds.filter(invitationId => {\r\n\t\t\t\tif (currentInvitationIds) {\r\n\t\t\t\t\treturn currentInvitationIds.indexOf(invitationId) < 0\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn [];\r\n\t}\r\n\r\n\tprivate validateEmail(mail: string) { // UB: inviteMember.\r\n\t\tconsole.log('mp.validateEmail');\r\n\t\treturn /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/.test(mail);\r\n\t}\r\n\r\n\tprivate GetResponseStatus(status: number): string { \r\n\t\tconst msg:string = ResponseStatus[status]; \r\n\t\t//console.log('mp.GetResponseStatus - ', status,'->', msg);\r\n\t\treturn msg;\r\n\t}\r\n\r\n\tprivate async getAllWhitelists() {\r\n\t\tconsole.log('mp.getAllWhitelists');\r\n\t\tthis.whitelists = [];\r\n\t\tconsole.log('before getAllWhitelists', this.projectId);\r\n\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); // this.apiClient.appContext.currentUser?.organization.id;\r\n\t\tthis.whitelists = await this.apiClient.orgByToken(currentUser_OrgId).postJson('Whitelist/GetWhitelists_NoRole', this.projectId).jsonResult();\r\n\t\tconsole.log('after getAllWhitelists:', this.whitelists);\r\n\t}\r\n\t\r\n\t/* TRANSFER PROJECT STANDARDS */\r\n\tprivate openTransferStandards(project : string) {\r\n\t\tconsole.log('mp.openTransferStandards');\r\n\t\tthis.router.navigate('administration/projects/edit/'+project+'/transfer');\r\n\t}\r\n\r\n\tgetRoleName(role: number | string): string {\r\n\t\t//console.log('mp.getRoleName', role);\r\n\t\tif (typeof role === \"number\") {\r\n\t\t\treturn UIPrjRoleNames[ProjectRole[role]];\r\n\t\t} else {\r\n\t\t\treturn UIPrjRoleNames[role];\r\n\t\t}\r\n\t}\r\n\r\n\tasync setNewRole(member: Member, role:string): Promise {// UI button handler.\r\n\t\tconsole.log('mp.setNewRole');\r\n if (!this.project) { return; }\r\n\r\n\t\tlet memberRole = ProjectRole[role];\r\n\t\tconsole.log(\"role\",memberRole);\r\n\r\n\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); // this.apiClient.appContext.currentUser?.organization.id;\r\n\t\t// let response = await this.apiClient.project(this.project.id).postJson(`PrjManager/ChangeMemberRole_NOROLE?userId=${member.userId}`, memberRole).response();\r\n\t\tlet response = await this.apiClient.orgByToken(currentUser_OrgId).postJson(`Project/ChangeMemberRole_NOROLE_Org/${this.project.id}/?userId=${member.userId}`, memberRole).response();\r\n\t\t\r\n\t\tif (response.statusCode == 200) {\r\n\t\t\tmember.role = ProjectRole[role];\r\n\t\t\tif (member.userId == this.appContext.currentUser?.id) {\r\n\t\t\t\tthis.events.publish(\"navigation:update-prj-token\");//in-setNewRole.\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n }\r\n\r\n\tasync setNewRoleForInvitee(invitee: ProjectInvitation, role: string): Promise {\r\n\t\tconsole.log('mp.setNewRoleForInvitee');\r\n if (!this.project) { return; }\r\n\r\n let memberRole = ProjectRole[role];\r\n console.log(\"role\",memberRole);\r\n\r\n let REH:RequestErrorHandling;\r\n\r\n\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); // this.apiClient.appContext.currentUser?.organization.id;\r\n //REH = this.apiClient.project(this.project.id).postJson(`Project/UpdateInvitationRole?invitationId=${invitee.id}`, role);\r\n REH = this.apiClient.orgByToken(currentUser_OrgId).postJson(`Project/UpdateInvitationRole_Org/${this.project.id}?invitationId=${invitee.id}`, role);\r\n\r\n let response = await REH\r\n .handleErrorWithErrorService(async (t: ErrorService, reason: HttpResponseMessage) => {\r\n if (reason.statusCode == 410) {\r\n this.modal.OpenConfirm(\"Invitation not found\",\"The invitation could not be found. Do you wish to reload the project?\")\r\n .whenClosed(async (result: DialogCloseResult) => {\r\n if (result.wasCancelled == false) {\r\n this.setProject( await this.apiClient.project(this.project!.id).get('Project/GetProject').jsonResult());//setNewRoleForInvitee\r\n }\r\n });\r\n } else {\r\n this.modal.OpenMessage(\"Role change failed\",\"Changing the role did not succeed.\");\r\n }\r\n }).response();\r\n\r\n if (response.statusCode == 200) {\r\n invitee.projectRole = ProjectRole[role];\r\n return;\r\n }\r\n }\r\n\r\n\tprivate async resendInvitation(invitation: ProjectInvitation) {\r\n\t\tconsole.log('mp.resendInvitation');\r\n\t\tlet L = window.location;\r\n\t\tlet host = `${L.protocol}//${L.host}`; \r\n\t\tinvitation.host = host;\r\n\t\tif (!this.project) { return; }\r\n\r\n\t\tconst Guid_Empty = '00000000-0000-0000-0000-000000000000';\r\n\t\tif (invitation.projectId == Guid_Empty) {\r\n\t\t\tconst msg = 'why is project guid empty?'\r\n\t\t\tconsole.warn(msg);\r\n\t\t\tthrow msg;\r\n\t\t\t//invitation.projectId = this.project!.id;\r\n\t\t\t//return;\r\n\t\t}\r\n\r\n //Not using prjToken, could in the future perhaps?\r\n\r\n\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); // this.apiClient.appContext.currentUser?.organization.id;\r\n let REH:RequestErrorHandling;\r\n //REH = this.apiClient.project(this.project.id).postJson(`Project/ResendInvitation`, invitation);\r\n REH = this.apiClient.orgByToken(currentUser_OrgId).postJson('Project/ResendInvitation_Org', invitation); // (ProjectId is INSIDE invitation, so we don't have to pass it.) // this.project.id\r\n \r\n let response = await REH\r\n .handleErrorWithErrorService(async (t: ErrorService, reason: HttpResponseMessage) => {\r\n if (reason.statusCode == 410) {\r\n this.modal.OpenConfirm(\"Invitation not found\",\"The invitation could not be found. Do you wish to reload the project?\")\r\n .whenClosed(async (result: DialogCloseResult) => {\r\n if (result.wasCancelled == false) {\r\n this.setProject( await this.apiClient.project(this.project!.id).get('Project/GetProject').jsonResult());//resendInvitation\r\n }\r\n });\r\n } else {\r\n\t\t\t\tconst msg:string = reason.content;\r\n this.modal.OpenMessage(\"Resend Failed\",\"Resending the invitation did not succeed:\\n\\n\"+msg);\r\n }\r\n }).response();\r\n\r\n if (response.statusCode == 200) {\r\n invitation.responseStatus = ResponseStatus.Pending;\r\n } \r\n\t\tconsole.log('resend, response code:', response.statusCode);\r\n\t}\r\n\t\r\n}\r\n"],"names":["ManageProject","setModelSource","val","this","settingModelSource","modelSource","setProject","p","project","constructor","element","apiClient","router","modal","events","i18n","appContext","orgTokenService","projectTokenService","isEditing","isSaving","projectId","haveIBeenConstructedYet","searchMemberText","searchMemberEnabled","classifications","showSettings","searchTerm","subscriptions","chosenWhitelistId","whitelists","asOrgUser","projectRoles","Object","keys","filter","v","isNaN","Number","isScrolled","event","console","log","fieldsetBody","scrollTop","document","querySelector","classList","add","remove","mutatingModelSource","searchMemberResult","viewContext","isFormInvalid","isInvalid","undefined","name","location","address","zipCode","city","isOrgAdmin","orgTokenInfo","orgRole","Org_Admin","activate","input","getAllWhitelists","fetchClassifications","fetchProject","prjWhitelist","whitelistId","resetInputs","ensureAdminIsFirstMember","updateOrgTokenInfo","admin","currentUser","companyName","myAdmin","id","organization","region","classificationId","ownerCompanyId","ownerCompanyName","members","userId","firstName","lastName","email","userCompanyId","notifySync","projectInvitations","selected","created_UTC","Date","attached","addEventListener","subscribe","data","handleMemberListSearchEvent","async","focusField_ASAP","getOrgTokenInfo","deactivate","removeEventListener","detached","forEach","subscription","dispose","toggleUnitSettings","reset","navigateToRoute","originalProject","submit","update","create","closeUnitSettings","createProjectHead","trimmedProjectName","Boolean","trim","system","postJson","jsonResult","OpenMessage","whenClosed","orgAdmin","createdProjectId","prj","number","basicInfoDto","getUpdatedBasicInfo","getUpdatedLocation","hasLocation","Address","City","ZipCode","facilityManager","getUpdatedFacilityManager","membersAdded","getAddedMembers","x","currentUser_OrgId","currentUserOrgId","api","apiSys","promises0","handleUpdateModelSourceOK","orgByToken","push","length","unitSettings","saveByOrg","rememberOriginalProject","promises2","map","response","content","values","Promise","all","publish","navigate","replace","trigger","err","error","err_","details","json","createByOrgFromToken","then","promises","catch","reason","finally","putHostOnInvitations","invitations","L","window","host","protocol","i","modelSourceChanged","newValue","oldValue","warn","origValue","isModelSource_changeOK","source_toBe","jsonResponse","source_was","source_now","confirmed","danger","isDanger","OpenConfirm","wasCancelled","msg","updateWhitelist","apiOrg","path","REH","xx","e","renamer","basics","missingLocationData","R2","get","resultPrj","assign","coordinates","latitude","longitude","TypeId","typeId","ClassificationId","GrossArea","grossArea","toString","Region","Name","Location","Vat","vat","newMember","fieldId","setTimeout","inputField","getElementById","focus","cancelNewMember","searchMemberTextChanged","trace","result","currentMemberIds","m","indexOf","userDto","UserCompanyId","addMember","member","index","find","tr","statusCode","getSelectedProject","splice","toggleNotifySync","updatePrjTokenIfNeeded","project_insist","removeMember","originals","includes","getRemovedMembersIds","currentMembersIds","originalMembersIds","memberId","keydown_in_Searchfield","key","inviteMember","toLowerCase","validateEmail","invite","responseStatus","Pending","inviteeName","inviteeOrgName","projectRole","Prj_User","addInviResult","updatedInvitations","ix","findIndex","removeInvitee","invitee","handleErrorWithErrorService","t","getAddedInvitations","invitation","getRemovedInvitationIds","currentInvitationIds","invitationId","mail","test","GetResponseStatus","status","openTransferStandards","getRoleName","role","setNewRole","memberRole","setNewRoleForInvitee","resendInvitation","observable","computedFrom","autoinject","Element","EventAggregator","I18N"],"sourceRoot":""}