{"version":3,"file":"app-b0bd0c0b.7f65a9fea0c95909.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 { 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\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\tpublic project: ProjectDto | undefined;\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, private appContext: AppContextService, private orgTokenService: OrgTokenService\r\n\t) {\r\n\t\tthis.haveIBeenConstructedYet = true;\r\n\t\tconsole.log('mp.ctor');\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) {\r\n\t\t\tlet myAdmin:UserDto = this.admin;\r\n\t\t\tconsole.log(`ensureAdminIsFirstMember, admin userId: ${myAdmin.id}, userCompany:${myAdmin.organization.id}`, myAdmin);\r\n\t\t\tif (!myAdmin.organization.id) { throw 'no org id on admin user.'; }\r\n\r\n\t\t\tthis.project = {\r\n\t\t\t\tid: this.projectId != undefined ? this.projectId : '00000000-0000-0000-0000-000000000000',\r\n\t\t\t\tname: '',\r\n\t\t\t\tregion: '',\r\n\t\t\t\tclassificationId: '',\r\n\t\t\t\twhitelistId: '',\r\n\t\t\t\townerCompanyId: '',\r\n\t\t\t\townerCompanyName: '',\r\n\t\t\t\tmembers: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tuserId: this.admin.id,\r\n\t\t\t\t\t\tname: this.admin.firstName + \" \" + this.admin.lastName,\r\n\t\t\t\t\t\temail: this.admin.email,\r\n\t\t\t\t\t\tcompanyName: this.admin.companyName,\r\n\t\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\t}\r\n\t\t\t\t],\r\n\t\t\t\tprojectInvitations: [],\r\n\t\t\t\tselected: false,\r\n\t\t\t\tcreated_UTC: new Date()\r\n\t\t\t}\r\n\t\t}\r\n\t}\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.project = this.originalProject;\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.project = undefined;\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\t\tconst api = this.apiClient; \r\n\t\tconst apiSys = () => api.system; \r\n\t\tconst apiPrj = () => api.project(prj);\r\n\r\n\t\tlet promises0:RequestErrorHandling[] = [];\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\tasync updateWhitelist() {\r\n\t\tconsole.log('mp.updateWhitelist');\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\t\tif (this.projectId == undefined) { return; }\r\n\r\n try {\r\n\t\t\tconst currentUser_OrgId = this.appContext.currentUserOrgId(); \r\n let api = this.apiClient.orgByToken(currentUser_OrgId);\r\n //let api = this.apiClient.project(this.projectId);\r\n let path = `Project/SetWhitelist_Org/${this.projectId}`;\r\n // Det her gik galt, fordi det antager et projectToken vi ikke har.\r\n\r\n console.log('arg for WL:', this.chosenWhitelistId);\r\n let REH:RequestErrorHandling = api.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 // stop that crap: //promises.push(whitelistPromise);\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\ttry { await this.updateWhitelist(); } 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 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.project = 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 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.project = 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 {\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\");\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.project = 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\tinvitation.projectId = this.project!.id;\r\n\t\t\treturn;\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.project = 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","constructor","element","apiClient","router","modal","events","i18n","appContext","orgTokenService","isEditing","isSaving","projectId","haveIBeenConstructedYet","searchMemberText","searchMemberEnabled","classifications","showSettings","searchTerm","subscriptions","chosenWhitelistId","whitelists","asOrgUser","projectRoles","Object","keys","filter","v","isNaN","Number","isScrolled","event","console","log","this","fieldsetBody","scrollTop","document","querySelector","classList","add","remove","searchMemberResult","viewContext","isFormInvalid","isInvalid","undefined","project","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","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","api","apiSys","promises0","push","length","unitSettings","saveByOrg","rememberOriginalProject","promises2","map","response","content","values","Promise","all","publish","navigate","replace","trigger","err","error","err_","details","json","createByOrgFromToken","currentUser_OrgId","currentUserOrgId","orgByToken","then","promises","catch","reason","finally","putHostOnInvitations","invitations","L","window","host","protocol","i","updateWhitelist","path","REH","jsonResponse","xx","warn","apiOrg","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","newValue","oldValue","trace","result","currentMemberIds","m","indexOf","userDto","UserCompanyId","addMember","member","index","find","tr","statusCode","getSelectedProject","splice","removeMember","OpenConfirm","wasCancelled","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","msg","observable","computedFrom","autoinject","Element","EventAggregator","I18N"],"sourceRoot":""}