{"version":3,"file":"app-a32aaa92.f4b4a5bf3facb5da.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/services/quantity-column-service.ts","webpack://client-app/./src/app/services/quantity-sources-service.ts","webpack://client-app/./src/app/services/quantity-takeoff-service.ts","webpack://client-app/./src/app/services/scroll-object-grid-service.ts","webpack://client-app/./src/app/services/split-viewer-resize-service.ts","webpack://client-app/./src/app/services/summing/summing-service.ts","webpack://client-app/./src/app/services/tender/tender-service.ts","webpack://client-app/./src/app/services/url-formatter.ts","webpack://client-app/./src/app/services/user-service.ts","webpack://client-app/./src/app/services/user-session-service.ts"],"sourcesContent":["import { ApiClient } from \"./api-client\";\r\nimport { AppContextService } from \"./app-context-service\";\r\nimport { autoinject } from \"aurelia-framework\";\r\nimport { TypeDto } from \"app/components/quantity-filter-sources/quantity-filter-sources\";\r\nimport { QuantityColumnDto } from \"app/components/quantity-filter-columns/quantity-filter-columns\";\r\n\r\n\r\n@autoinject\r\nexport class QuantityColumnService {\r\n private quantityFilterId: string = \"\";\r\n constructor(private api: ApiClient, private appContext: AppContextService) {\r\n }\r\n\r\n public async getTypes(input: string, pageIndex: number): Promise {\r\n return await this.api.project(this.appContext.projectId).get(`QuantitySources/GetTypes/${input}/${pageIndex}`).handleError(\"Error fetching Types\",\"The types could not be fetched.\").jsonResult();\r\n }\r\n \r\n public async getSelectedTypes(quantityFilterId: string): Promise {\r\n this.quantityFilterId = quantityFilterId;\r\n return await this.api.project(this.appContext.projectId).get(`QuantitySources/GetSelectedTypes/${this.quantityFilterId}`).handleError(\"Error fetching Types\",\"The types could not be fetched.\").jsonResult();\r\n }\r\n \r\n public async changeSavedSources(list: TypeDto[]): Promise {\r\n let typeIds: string[] = [];\r\n list.forEach(element => {typeIds.push(element.id)});\r\n await this.api.project(this.appContext.projectId).postJson(`QuantitySources/ChangeQuantitySources/${this.quantityFilterId}`, typeIds)\r\n .handleError(\"Error\" , \"Could not save changes.\")\r\n .response();\r\n }\r\n\r\n public async deleteSources(list: TypeDto[]): Promise {\r\n let typeIds: string[] = [];\r\n list.forEach(element => {typeIds.push(element.id)});\r\n await this.api.project(this.appContext.projectId).postJson(`QuantitySources/RemoveQuantitySources/${this.quantityFilterId}`, typeIds)\r\n .handleError(\"Error\" , \"Could not Delete types\")\r\n .response();\r\n }\r\n\r\n public async GetPartialProjectSimpleParametersByQF(pageIndex: number, qfId: string): Promise {\r\n return await this.api.project(this.appContext.projectId).get(`QuantityColumn/GetPartialProjectSimpleParametersByQF/${pageIndex}/${qfId}`).handleError(\"Error fetching Project parameters\",\"The Project parameters could not be fetched.\").jsonResult();\r\n }\r\n\r\n public async GetProjectSimpleParametersByInputByQF(input: string, qfId: string): Promise {\r\n return await this.api.project(this.appContext.projectId).get(`QuantityColumn/GetProjectSimpleParametersByInputByQF/${input}/${qfId}`).handleError(\"Error fetching Project parameters\",\"The Project parameters could not be fetched.\").jsonResult();\r\n \r\n }\r\n\r\n public async GetTypeProjectParameters(typeIds: string[]): Promise {\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantityColumn/GetProjectSimpleParametersTypeByRevitTypes`, typeIds).handleError(\"Error fetching Project parameters\",\"The type project parameters could not be fetched.\").jsonResult();\r\n }\r\n\r\n public async GetInstProjectParameters(typeIds: string[]): Promise {\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantityColumn/GetProjectSimpleParametersInstByRevitTypes`, typeIds).handleError(\"Error fetching Project parameters\",\"The instance Project parameters could not be fetched.\").jsonResult();\r\n }\r\n\r\n public async GetunitsByParameters(parameters: string[]): Promise {\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantityColumn/GetUnitTypesFromParameterIds`, parameters).handleError(\"Error fetching Units\",\"The Units could not be fetched.\").jsonResult();\r\n }\r\n\r\n public async AddQuantityColumns(columns: QuantityColumnDto[]): Promise {\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantityColumn/AddQuantityColumnsToQuantityFilter/${this.quantityFilterId}`, columns).handleError(\"Error saving Quantity columns\",\"The quantity columns was not be saved.\").jsonResult();\r\n }\r\n\r\n public async RemoveQuantityColumns(columns: string[]): Promise {\r\n await this.api.project(this.appContext.projectId).postJson(`QuantityColumn/RemoveQuantityColumnsFromQuantityFilter`, columns).handleError(\"Error deleting Quantity columns\",\"The quantity columns could not be deleted.\").jsonResult();\r\n }\r\n\r\n public async GetQuantityColumns(): Promise {\r\n return await this.api.project(this.appContext.projectId).get(`QuantityColumn/GetQuantityColumns/${this.quantityFilterId}`).handleError(\"Error fetching Quantity columns\",\"The quantity columns could not be fetched.\").jsonResult();\r\n }\r\n \r\n public async EditQuantityColumns(listOfColumnsToEdit: QuantityColumnDto[]): Promise {\r\n await this.api.project(this.appContext.projectId).postJson(`QuantityColumn/EditQuantityColumns/${this.quantityFilterId}`, listOfColumnsToEdit).handleError(\"Error saving edited Quantity columns\",\"The changes could not be saved.\").jsonResult();\r\n }\r\n public async getCatMap(): Promise<{[key: string]: number[]}> {\r\n return await this.api.project(this.appContext.projectId).get(`QuantityColumn/GetCatMap`).handleError(\"Could not get Category map\", \"The category map could not be fetched.\").jsonResult();\r\n }\r\n}\r\n\r\nexport interface SimpleParameterDto {\r\n id: string;\r\n name: string;\r\n parameterScope: boolean; // what does true false mean here?\r\n}\r\n\r\nexport interface DisplayUnit {\r\n enumInt: number;\r\n convertionRate: number;\r\n unitString: string;\r\n unitShort: string;\r\n}\r\n","import { ApiClient } from \"./api-client\";\r\nimport { AppContextService } from \"./app-context-service\";\r\nimport {autoinject} from \"aurelia-framework\";\r\nimport { CategoryWithTypesDto } from \"app/models/category-dto\";\r\nimport { FamilyWithTypesDto, TypeDto, TypeDtoWCategory } from \"app/components/quantity-filter-sources/quantity-filter-sources\";\r\nimport { HttpResponseMessage } from \"aurelia-http-client\";\r\n\r\n\r\n@autoinject\r\nexport class QuantitySourcesService {\r\n private quantityFilterId: string = \"\";\r\n constructor(private api: ApiClient, private appContext: AppContextService) {\r\n }\r\n\r\n async GetInstancesByTypeId(typeId: string): Promise {\r\n return await this.api.project(this.appContext.projectId).get(`QuantitySources/GetInstanceIdsByType/${typeId}`).handleError(\"Error fetching instances\",\"The instances could not be fetched.\").jsonResult();\r\n }\r\n public async getTypes(input: string, pageIndex: number): Promise {\r\n return await this.api.project(this.appContext.projectId).get(`QuantitySources/GetTypes/${input}/${pageIndex}`).handleError(\"Error fetching Types\",\"The types could not be fetched.\").jsonResult();\r\n }\r\n \r\n public async getProjectCategories(input: string, pageIndex: number): Promise {\r\n return await this.api.project(this.appContext.projectId).get(`QuantitySources/GetCategories/${input}/${pageIndex}`).handleError(\"Error fetching Categories\",\"The categories could not be fetched.\").jsonResult();\r\n }\r\n\r\n public async getProjectFamilies(input: string, pageIndex: number): Promise {\r\n return await this.api.project(this.appContext.projectId).get(`QuantitySources/GetProjectFamilies/${input}/${pageIndex}`).handleError(\"Error fetching Families\",\"The families could not be fetched.\").jsonResult();\r\n }\r\n\r\n public async getTypeByBuiltInCategory(builtInCategory: number): Promise {\r\n return await this.api.project(this.appContext.projectId).get(`QuantitySources/GetTypeByBuiltInCategory/${builtInCategory}`).handleError(\"Error fetching Types\",\"The types could not be fetched by builtInCategory.\").jsonResult();\r\n }\r\n\r\n public async getTypeIdByFamilyId(familyId: string): Promise {\r\n return await this.api.project(this.appContext.projectId).get(`QuantitySources/GetTypesByFamilyId/${familyId}`).handleError(\"Error fetching Types\",\"The types could not be fetched by familyId.\").jsonResult();\r\n }\r\n\r\n public async getSelectedTypes(quantityFilterId: string): Promise {\r\n this.quantityFilterId = quantityFilterId;\r\n\t\tconsole.log('getSelectedTypes, for quantityFilterId:', quantityFilterId);\r\n return await this.api.project(this.appContext.projectId).get(`QuantitySources/GetSelectedTypes/${this.quantityFilterId}`)\r\n\t\t.handleError(\"Error fetching Types\",\"The types could not be fetched.\").jsonResult();\r\n }\r\n \r\n public async changeSavedSources(list: TypeDto[], qfId?: string): Promise {\r\n let typeIds: string[] = list.map(element => element.id);\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantitySources/ChangeQuantitySources/${qfId == undefined ? this.quantityFilterId : qfId}`, typeIds)\r\n .handleError(\"Error\" , \"Could not save changes.\")\r\n .response();\r\n }\r\n\r\n public async changeSavedSourcesWithIds(list: string[], qfId?: string): Promise {\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantitySources/ChangeQuantitySources/${qfId == undefined ? this.quantityFilterId : qfId}`, list)\r\n .handleError(\"Error\" , \"Could not save changes.\")\r\n .response();\r\n }\r\n\r\n public async updateSources(qfId: string, typesToAdd: string[], typesToRemove:string[]): Promise {\r\n let addResponse = await this.api.project(this.appContext.projectId).postJson(`QuantitySources/AddQuantitySources/${qfId}`, typesToAdd).handleError(\"Error\" , \"Could not add types to filter.\").response();\r\n if (addResponse.statusCode == 200) {\r\n let removeResponse = await this.api.project(this.appContext.projectId).postJson(`QuantitySources/RemoveQuantitySources/${qfId}`, typesToRemove).handleError(\"Error\" , \"Could not Delete types\").response();\r\n if (removeResponse.statusCode == 200) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n public async addSources(qfId: string, list: string[]): Promise {\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantitySources/AddQuantitySources/${qfId}`, list).handleError(\"Error\" , \"Could not add types to filter.\").response();\r\n }\r\n\r\n public async deleteSources(qfId: string, list: string[]): Promise {\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantitySources/RemoveQuantitySources/${qfId}`, list)\r\n .handleError(\"Error\" , \"Could not Delete types\")\r\n .response();\r\n }\r\n\r\n public async searchForTypes(inputDto: SearchInputDto, pageIndex: number) : Promise {\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantitySources/GetAllTypes/${pageIndex}`,inputDto).handleError(\"Error\" , \"Could not fetch types.\").jsonResult();\r\n }\r\n}\r\n\r\nexport interface SearchInputDto {\r\n catInput: string,\r\n typeInput: string,\r\n famInput: string\r\n}\r\n","import { TypeDto, TypeDtoWCategory, TypeDtoWithSelect } from \"app/components/quantity-filter-sources/quantity-filter-sources\";\r\nimport { QuantityFilterDto } from \"app/project/quantity-views/quantity-filters\";\r\nimport { autoinject } from \"aurelia-framework\"\r\nimport { ApiClient } from \"./api-client\";\r\nimport { AppContextService } from \"./app-context-service\";\r\n\r\n@autoinject\r\nexport class QuantityTakeoffService {\r\n constructor(private api: ApiClient, private appContext: AppContextService) {}\r\n\r\n async GetQuantityFilters(): Promise {\r\n let path = `QuantityFilter/GetQuantityFiltersForProject`;\r\n return await this.api.project(this.appContext.projectId).get(path).jsonResult(); \r\n }\r\n \r\n async DeleteQF(qf: QuantityFilterDto): Promise {\r\n let path = `QuantityFilter/DeleteQuantityFilter`;\r\n\t\tawait this.api.project(this.appContext.projectId).postJson(path,qf.id).jsonResult(); \r\n }\r\n\r\n async GetTypesByEntityLabels(objectIds: number[]): Promise {\r\n\t\tconsole.log('QuantityTakeoffService.GetTypesByEntityLabels,D, with: (#) objectIds:', objectIds.length, objectIds);\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantitySources/GetTypesByEntityLabels/`, objectIds)\r\n .handleError(\"Error\" , \"Could not fetch types.\")\r\n .jsonResult();\r\n }\r\n\r\n async GetTypesWCategoriesByEntityLabels(objectIds: number[]): Promise {\r\n console.log('QuantityTakeoffService.GetTypesWCategoriesByEntityLabels,D, with: (#) objectIds:', objectIds.length, objectIds);\r\n return await this.api.project(this.appContext.projectId).postJson(`QuantitySources/GetTypesWCategoriesByEntityLabels/`, objectIds)\r\n .handleError(\"Error\" , \"Could not fetch types.\")\r\n .jsonResult(); }\r\n}\r\n","import { autoinject } from \"aurelia-framework\"\r\n\r\n@autoinject\r\nexport class ScrollObjectGridService {\r\n \r\n static async handleFindAndScrollToElement(clickedElementId: number, multilineEnabled: boolean, appliedNumberOfLines: number): Promise {\r\n\t\tif (await this.scrollToElement(clickedElementId.toString())) {\r\n\t\t\tlet isFound: boolean = false;\r\n\t\t\tlet resetCounter: number = 0;\r\n\t\t\t//Scrolling table to center.\r\n\t\t\tlet tableContainer: HTMLElement | null = document.getElementById('table-container');\r\n\t\t\tif (tableContainer) {\r\n\t\t\t\ttableContainer.scrollTop = tableContainer.offsetHeight / 2;\r\n\t\t\t}\r\n\t\t\twhile (!isFound && resetCounter <= 10) {\t\t\t\r\n\t\t\t\tresetCounter++;\r\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 100)); //This break is for Aurelia to load the DOM-elements.\r\n\t\t\t\tawait this.scrollNearElement(clickedElementId, multilineEnabled, appliedNumberOfLines);\r\n\t\t\t\tisFound = !(await this.scrollToElement(clickedElementId.toString()));\r\n\t\t\t}\r\n\t\t\tconsole.log(\"Number of tries \" , resetCounter);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic async scrollNearElement(clickedElementId: number, multilineEnabled: boolean, appliedNumberOfLines: number): Promise {\r\n\t\t//Getting the middle element of loaded HTML row elements.\r\n\t\tlet middleHTMLElementId = (Number.parseInt(document.getElementsByClassName('item-row')[Math.floor(document.getElementsByClassName('item-row').length / 2)].id));\r\n\t\tlet diff: number = (clickedElementId - middleHTMLElementId);\r\n\t\tlet cellWithOneLineHeight = 34.59;\r\n\t\tlet cellWithTwoLinesHeight = 44.78\r\n\t\tlet lineHeightExtra = 22.39 //To calculate the next cell height: add 22.39 to the prior cell height.\r\n\t\tlet scrollLength: number = cellWithOneLineHeight * diff;\r\n\t\tif (multilineEnabled) {\r\n\t\t\tlet extraLinesToApply = appliedNumberOfLines - 2;\r\n\t\t\tlet cellWithXLines = (cellWithTwoLinesHeight + (lineHeightExtra * extraLinesToApply));\r\n\t\t\tscrollLength = appliedNumberOfLines == 2 ? diff * cellWithTwoLinesHeight : diff * cellWithXLines;\r\n\t\t\t// console.log(\"Multiple line row: \", cellWithXLines); //Can be used to see if acutal dom cell matches the calculated height.\r\n\t\t}\r\n\t\t\r\n\t\tlet tableContainer: HTMLElement | null = document.getElementById('table-container');\r\n\t\tif (tableContainer) {\r\n\t\t\ttableContainer.scrollBy(0,(scrollLength));\r\n\t\t}\r\n\t}\r\n\r\n\tstatic async scrollToElement(clickedElementId: string): Promise {\r\n\t\tlet elem = document.getElementById(clickedElementId);\r\n\t\tif (elem != null) {\r\n\t\t\telem.scrollIntoView({block: 'end', inline: 'start'});\r\n\t\t\tlet tableContainer: HTMLElement | null = document.getElementById('table-container');\r\n\t\t\tif (tableContainer) {\r\n\t\t\t\t// Centering element manually, this is due to block: 'center' sligthly moving whole window up.\r\n\r\n\t\t\t\t//Ensures top elements are not being scrolled away from.\r\n\t\t\t\tlet elemRect = elem.getBoundingClientRect();\r\n\t\t\t\tlet bottomPos = elemRect.y + elemRect.height; //Bottom part of element to scroll to.\r\n\t\t\t\tif (bottomPos >= tableContainer.getBoundingClientRect().height) {\r\n\t\t\t\t\tlet scrollPos = (tableContainer.getBoundingClientRect().height / 2) - elemRect.height / 2;\r\n\t\t\t\t\ttableContainer.scrollBy({ behavior: 'smooth', top: scrollPos });\r\n\t\t\t\t}\r\n }\r\n }\r\n\t\treturn elem == null;\r\n\t}\r\n}","import Split from 'split.js'; // ES6 module.\r\n//import Split from \"split.js/dist/split.js\";\t\t\r\n//var Split = require('split.js'); // CommonJS, som vi ikke bruger.\r\n\r\nimport {EventAggregator} from 'aurelia-event-aggregator';\r\nimport {autoinject} from 'aurelia-framework';\r\n\r\ndeclare let $: any;\r\n\r\n@autoinject\r\nexport class SplitViewerResizeService {\r\n private mainSplit: Split.Instance | undefined;\r\n\tprivate horizontalSplit: Split.Instance | undefined; \r\n\r\n\tpublic isColorPickerVisible: boolean = false;\r\n\tpublic isSettingsVisible: boolean = false;\r\n public verticalGutter: HTMLElement | null = null; \r\n\r\n constructor(public events: EventAggregator){\r\n } \r\n\r\n async setupMainSplitter(shouldShowGutter: boolean): Promise {\r\n\t\tconst leftPanel = document.getElementById('panel-left');\r\n\t\tconst middlePanel = document.getElementById('panel-middle');\r\n\t\tif (leftPanel != null && middlePanel != null) {\r\n this.mainSplit = Split(['#panel-left','#panel-middle'],\r\n {\r\n minSize: 0,\r\n gutterSize: 13,\r\n direction: 'horizontal',\r\n onDrag: function (sizes: any) {\r\n window.dispatchEvent(new Event('resize'));\r\n },\r\n sizes:[50,50]\r\n });\r\n this.styleOnlyFirstGutter();\r\n if (!shouldShowGutter) {\r\n await this.hideMainSplitter();\r\n }\r\n\r\n }\r\n }\r\n\r\n destroySplitters():void {\r\n if (this.mainSplit) {\r\n this.mainSplit.destroy();\r\n this.mainSplit = undefined;\r\n }\r\n if (this.horizontalSplit) {\r\n this.horizontalSplit.destroy();\r\n this.horizontalSplit = undefined;\r\n }\r\n }\r\n\r\n async hideMainSplitter(): Promise {\r\n if (this.mainSplit != undefined) {\r\n let gutterToStyle: HTMLElement = document.getElementById('panel-left')?.nextElementSibling;\r\n gutterToStyle.classList.add('hide-box');\r\n }\r\n }\r\n\r\n async showMainSplitter(): Promise {\r\n if (this.mainSplit != undefined) {\r\n let gutterToStyle: HTMLElement = document.getElementById('panel-left')?.nextElementSibling;\r\n gutterToStyle.classList.remove('hide-box');\r\n } else {\r\n await this.setupMainSplitter(true);\r\n }\r\n }\r\n\r\n async setupViewerSplitter(): Promise {\r\n this.horizontalSplit = Split(['#bim-viewer-3d','#bim-viewer-2d-holder'],\r\n {\r\n minSize: 0,\r\n gutterSize: 10,\r\n direction: 'vertical',\r\n onDrag: function (sizes: any) {\r\n window.dispatchEvent(new Event('resize'));\r\n },\r\n sizes: [50, 50],\r\n });\r\n this.verticalGutter = document.getElementsByClassName('gutter-vertical')[0];\r\n this.hide2dViewOnModelUnLoaded();\r\n }\r\n\r\n styleOnlyFirstGutter(): void {\r\n let gutterToStyle: HTMLElement = document.getElementById('panel-left')?.nextElementSibling;\r\n gutterToStyle.classList.add('gutter-content');\r\n }\r\n\r\n hide2dViewOnModelUnLoaded(): void {\r\n\t\tconsole.log('hide2dViewOnModelUnLoaded twoD_enabled?')\r\n let docked2dView: HTMLElement | null = document.getElementById('small-2d-view');\r\n let viewer: HTMLElement | null = document.getElementById('viewer2d');\r\n if (docked2dView && viewer) {\r\n if (!docked2dView.contains(viewer)) {\r\n this.hide2dView();\r\n } else {\r\n docked2dView.style.visibility = \"hidden\";\r\n }\r\n }\r\n }\r\n\r\n \r\n hide2dView(): void { //Perhaps change as in base-viewer-combined.\r\n\t\tconsole.log('split-viewer-resize-service.hide2dView, twoD_enabled?'); \r\n if (this.horizontalSplit != undefined) {\r\n this.horizontalSplit.setSizes([100,0]); \r\n this.verticalGutter?.classList.add('hide-box'); \r\n let bvElement = document.getElementById('bim-viewer-3d'); \r\n if (bvElement) {\r\n bvElement.style.height = '100%';\r\n }\r\n window.dispatchEvent(new Event('resize'));\r\n }\r\n }\r\n\r\n setViewerSplitSize(top: number, bottom: number): void {\r\n let docked2dView: HTMLElement | null = document.getElementById('small-2d-view');\r\n let viewer: HTMLElement | null = document.getElementById('viewer2d');\r\n if (!docked2dView?.contains(viewer)) { //This resizing only applies if the 2d view is not docked in the 3d view.\r\n this.horizontalSplit?.setSizes([top,bottom]); \r\n window.dispatchEvent(new Event('resize'));\r\n }\r\n }\r\n \r\n show2dViewOnModelLoaded(): void {\r\n let docked2dView: HTMLElement | null = document.getElementById('small-2d-view');\r\n let viewer: HTMLElement | null = document.getElementById('viewer2d');\r\n if (docked2dView && viewer) {\r\n if (!docked2dView.contains(viewer)) {\r\n this.horizontalSplit?.setSizes([50,50]); \r\n this.verticalGutter?.classList.remove('hide-box');\r\n window.dispatchEvent(new Event('resize'));\r\n } else {\r\n docked2dView.style.visibility = \"visible\";\r\n }\r\n }\r\n }\r\n \r\n show2dView(): void {\r\n this.horizontalSplit?.setSizes([50,50]); \r\n this.verticalGutter?.classList.remove('hide-box');\r\n window.dispatchEvent(new Event('resize'));\r\n }\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport {ApiClient} from \"../api-client\";\r\nimport { RequestExecution } from '../RequestExecution';\r\nimport {AppContextService} from \"../app-context-service\";\r\nimport {I18N} from \"aurelia-i18n\";\r\nimport {ValueListDto} from \"../../models/value-list-dtos\";\r\nimport {Category} from \"../../models/parameter-definition-dto\";\r\nimport { HttpResponseMessage } from \"aurelia-http-client\";\r\nimport { QuantityParameter } from \"app/models/quantity-parameter\";\r\n\r\n@autoinject\r\nexport class SummingService {\r\n\r\n\tconstructor(private api:ApiClient, private appContext:AppContextService, private i18n: I18N) {\r\n\t}\r\n\r\n\tpublic async getCategoriesOnProject() : Promise {\r\n\t\treturn await this.api.project(this.appContext.projectId).get(\"Summing/GetProjectCategories\")\r\n\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), \"Could not retrieve project categories.\")\r\n\t\t\t.jsonResult();\r\n\t}\r\n\r\n\tpublic async getFamiliesByCategory(id: string) : Promise {\r\n\t\treturn await this.api.project(this.appContext.projectId).get(\"Summing/GetFamiliesByBuiltInCategory?builtInCategory=\"+id)\r\n\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), \"Could not retrieve families by category.\")\r\n\t\t\t.jsonResult();\r\n\t}\r\n\t\r\n\tpublic async getTypeQuantityParameters(typeId:string):Promise{\r\n\t\treturn await this.api.project(this.appContext.projectId).get(`Summing/GetTypeQuantityParameters/${typeId}`)\r\n\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), \"Could not retrieve quantity parameters.\")\r\n\t\t\t.jsonResult();\r\n\t}\r\n\r\n\tpublic async getFamilyQuantityParameters(familyId:string):Promise{\r\n\t\treturn await this.api.project(this.appContext.projectId).get(`Summing/GetFamilyQuantityParameters/${familyId}`)\r\n\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), \"Could not retrieve quantity parameters.\")\r\n\t\t\t.jsonResult();\r\n\t}\r\n\t\r\n\tpublic async setQuantityParameterOnType(typeIds:string[], parameterDefinitionId:string):Promise {\r\n\t\tconsole.log('setQuantityParameterOnType');\r\n\r\n\t\tconsole.log('calling Summing/SetQuantityParameterOnType..');\r\n\t\tlet a = await this.api.project(this.appContext.projectId).postJson(`Summing/SetQuantityParameterOnType`, { typeIds, parameterDefinitionId })\r\n\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), \"Could not save quantity parameter.\")\r\n\t\t\t.response(); //noResponse();\r\n\t\tif (!a.isSuccess) { throw `could not SetQuantityParameterOnType: ${a.statusCode} ${a.statusText}`; }\r\n\r\n\t\tawait this.syncQuantities(typeIds, []);\r\n\t}\r\n\r\n\tpublic async setQuantityParameterOnFamily(familyIds:string[], parameterDefinitionId:string):Promise {\r\n\t\tconsole.log('setQuantityParameterOnFamily');\r\n\r\n\t\tconsole.log('calling Summing/SetQuantityParameterOnFamily..');\r\n\t\tlet a = await this.api.project(this.appContext.projectId).postJson(`Summing/SetQuantityParameterOnFamily`, { familyIds, parameterDefinitionId })\r\n\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), \"Could not save quantity parameter.\")\r\n\t\t\t.response(); \r\n\t\tif (!a.isSuccess) { throw `could not SetQuantityParameterOnFamily: ${a.statusCode} ${a.statusText}`; }\r\n\r\n\t\tawait this.syncQuantities([], familyIds);\r\n\t}\r\n\r\n\tasync syncQuantities(typeIds:string[], famIds:string[]):Promise {\r\n\t\tconsole.log('calling Summing/SyncQuantities..');\r\n\t\tlet r:HttpResponseMessage = \r\n\t\t await this.api.project(this.appContext.projectId).postJson(`Summing/SyncQuantities`, {typeIds:typeIds, famIds:famIds})\r\n\t\t .handleErrorUsingReason(this.i18n.tr('Error_Title_Generic'))\r\n\t\t .response(); ///noResponse();\r\n\r\n\t\tconsole.log('syncQuant:', r.isSuccess ? r.content : r);\r\n\t\tif (!r.isSuccess) { throw `could not SyncQuantities: ${r.statusCode} ${r.statusText}`; }\r\n\t}\r\n\r\n}\r\n","import { autoinject } from \"aurelia-framework\";\r\nimport {ApiClient} from \"../api-client\";\r\nimport {AppContextService} from \"../app-context-service\";\r\nimport {I18N} from \"aurelia-i18n\";\r\nimport {TenderSettingsDto} from \"../../models/tender/tender-settings-dto\";\r\n\r\n@autoinject\r\nexport class TenderService {\r\n\tconstructor(private api:ApiClient, private appContext:AppContextService, private i18n: I18N) {\r\n\t}\r\n\r\n\tpublic async getTenderSettings(id: string) : Promise {\r\n\t\treturn await this.api.project(this.appContext.projectId).get(`TenderList/GetTenderListSettings/${id}`)\r\n\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), \"Could not retrieve tender settings.\")\r\n\t\t\t.jsonResult();\r\n\t}\r\n}\r\n","export class UrlFormatter {\r\n static formatUrl(url: string): string {\r\n\t\tlet pattern: RegExp = /^((http|https):\\/\\/)/;\r\n\r\n\t\tif(!pattern.test(url)) {\r\n \t\turl = \"https://\" + url;\r\n\t\t}\r\n\t\treturn url;\r\n\t}\r\n}","\r\nimport { UserDto } from \"app/models/user-administration-dtos\";\r\nimport { BimViewerParent } from \"app/models/viewer-dtos/Dtos/bimviewer-dtos\";\r\nimport { autoinject } from \"aurelia-framework\";\r\nimport { ApiClient } from \"./api-client\";\r\n\r\n@autoinject\r\nexport class UserService {\r\n \r\n private loadedUsers: {[key:string]:UserDto} = {};\r\n\tprivate usersLoaded:boolean = false;\r\n\r\n constructor(private apiClient: ApiClient) { }\r\n\r\n async loadUsersFromOrganisation(): Promise {\r\n\t\tthis.usersLoaded = true; // reentrancy protection.\r\n\t\tconsole.warn('someone calling user-service.loadUsersFromOrganisation');\r\n\t\tconst LOADED_USERS:UserDto[] = \r\n\t\t await this.apiClient.global.get('UserAdministration/GetUsers').jsonResultNoLoadingIcon();\r\n\t\tLOADED_USERS.forEach(x => this.loadedUsers[x.id] = x );\r\n\t\t//LOADED_USERS.map( x => this.loadedUsers2[x.id] = x );\r\n\t\t//LOADED_USERS.filter(x => this.loadedUsers2[x.id] = x );\r\n\t\t//LOADED_USERS.reduce(x => this.loadedUsers2[x.id] = x );\r\n\t}\r\n\r\n private doesUserExist(userId: string): boolean { return userId != '00000000-0000-0000-0000-000000000000'; }\r\n\r\n async getUser(userId: string): Promise {\r\n if (!this.doesUserExist(userId)) { return undefined; } // dont retrieve what doesnt exist..\r\n\r\n if (!this.usersLoaded) { await this.loadUsersFromOrganisation(); }\r\n\r\n\t\t// JG: This is not robust.\r\n\t\t// The problem is, that multiple async calls will arrive here,\r\n\t\t// at the same time as the (or multiple) loadGlobalUser call is underway.\r\n\t\t// So the problem is, how can we avoid triggering more than one loadGlobalUser at a time?\r\n\t\t// One possible idea might be to introduce a place-holder on the first call,\r\n\t\t// (we know it is the first call, if no placeholder was there before.)\r\n\t\t// The remaining issue would then be, how to REFRESH once the REAL item arrives.\r\n\t\tif (Object.keys(this.loadedUsers).length == 0) {\r\n\t\t\tconsole.warn('zero loadedUsers found for current org, while trying to retrieve user with ID', userId);\r\n\t\t\tlet user = await this.loadGlobalUser(userId);\r\n\t\t\treturn user;\r\n\t\t} else { // this is not sound, there is still a race condition/'N+1' issue.\r\n\t\t\tlet user = this.getLoadedUser(userId);\r\n\t\t\tif (user == undefined) {\r\n\t\t\t\tuser = await this.loadGlobalUser(userId);\r\n\t\t\t}\r\n\t\t\treturn user;\t\r\n\t\t}\r\n }\r\n\r\n async fillUsernames(listOfModels: BimViewerParent[], who:string): Promise {\r\n listOfModels.forEach(async (model: BimViewerParent) => {\r\n let username: string | undefined = await this.getUsername(model.createdByUser_Id,'fillUsernames/'+who);\r\n if (username) {\r\n model.username = username;\r\n }\r\n });\r\n\r\n return listOfModels;\r\n }\r\n\r\n private getLoadedUser(userId: string): UserDto | undefined { return this.loadedUsers[userId]; }\r\n\r\n\tprivate makeDummyUser(userId: string):UserDto {\r\n\t\tconst user:UserDto = {\r\n\t\t\tid: userId,\r\n\t\t\temail: userId,\r\n\t\t\tfirstName: `FirstName unknown ${userId}`,\r\n\t\t\tlastName: 'unknown', //`lastName unknown ${userId}`,\r\n\t\t\tphone: '?', //string,\r\n\t\t\tcompanyName: `Company unknown ${userId}`,\r\n\t\t\troles: [],\r\n\t\t\torganization: {id: '', name: 'unknownOrg', orgFlags:'', sigma:false},\r\n\t\t\tprojects: [],\t\t\t\r\n\t\t};\r\n\t\treturn user;\r\n\t}\r\n\r\n private async loadGlobalUser(userId: string): Promise {\r\n\t\tconsole.warn('loadGlobalUser',userId);\r\n\t\tlet dummy:UserDto|undefined;\r\n\t\tif (!(userId in this.loadedUsers)) {\r\n\t\t\tdummy = this.makeDummyUser(userId);\r\n\t\t\tthis.loadedUsers[userId] = dummy;\r\n\t\t}\r\n\r\n\t\ttry { // 404 gives undefined here, I think: // this erroneously had ?userId=\r\n\t\t\tlet user: UserDto|undefined = await this.apiClient.global.get(`UserAdministration/GetUserById/${userId}`).jsonResultNoLoadingIcon();\r\n\t\t\tdummy = undefined; // (if we made it this far, don't attempt to remove the dummy.)\r\n\t\t\tif (user) { this.loadedUsers[userId] = user; } // insert the correct variant.\r\n\t\t\treturn this.loadedUsers[userId]; // 'return whatever we got'.\r\n\t\t} finally { // if we made use of a dummy, get rid of it again, on failure:\r\n\t\t\tif (dummy) { \r\n\t\t\t\tconsole.log('cleaning out dummy on failure, for userId', userId);\r\n\t\t\t\tdelete this.loadedUsers[userId]; \r\n\t\t\t}\r\n\t\t}\r\n }\r\n\r\n private async OLD_loadGlobalUser(userId: string): Promise { // erroneously had ?userId=\r\n let user: UserDto = await this.apiClient.global.get(`UserAdministration/GetUserById/${userId}`).jsonResultNoLoadingIcon();\r\n if (user == undefined) {\r\n return undefined;\r\n } else {\r\n this.loadedUsers[user.id] = user; //.push(user);\r\n return user;\r\n }\r\n }\r\n\r\n async getUsername(userId: string, who:string): Promise {\r\n\t\t//console.log('getUsername', userId, who);\r\n let user: UserDto | undefined = await this.getUser(userId);\r\n if (user != undefined) {\r\n return user.firstName + \" \" + user.lastName;\r\n }\r\n }\r\n}\r\n","import { I18N } from 'aurelia-i18n';\r\nimport { ApiClient } from './api-client';\r\nimport { RequestErrorHandling } from './RequestErrorHandling';\r\nimport { RequestExecution } from './RequestExecution';\r\nimport { autoinject } from \"aurelia-framework\";\r\nimport { Router } from 'aurelia-router';\r\nimport {EventAggregator} from 'aurelia-event-aggregator';\r\nimport { HttpResponseMessage } from 'aurelia-http-client';\r\nimport { ModalService } from './modal-service';\r\n\r\n@autoinject\r\nexport class UserSessionService {\r\n\r\n constructor(\r\n private api: ApiClient,\r\n\t\tprivate router: Router,\r\n\t\tprivate i18n: I18N,\r\n\t\tprivate events: EventAggregator,\r\n\t\tprivate modal: ModalService\r\n\t\t) {\r\n \t\r\n \tevents.subscribe(\"user unauthorized\", () => this.logOut());\r\n }\r\n\r\n public async logIn(userName: string, password: string): Promise {\r\n let justUseDefaultApiUrl:string='';\r\n\r\n\t\tconst requestErrorHandling:RequestErrorHandling = this.api.custom(justUseDefaultApiUrl).postJson(\"/Authentication/CreateToken\", {//UserSessionService.logIn\r\n Name: userName,\r\n Password: password\r\n\t\t});\r\n\r\n\t\t\r\n\t\tconst requestExecution:RequestExecution = requestErrorHandling.handleError(this.i18n.tr(\"LoginFailed\"), this.i18n.tr(\"LoginFailed\"));\r\n\r\n\t\tconst token:string|HttpResponseMessage = await requestExecution.stringResult();\r\n\t\tconsole.log('token?', token);\r\n\t\tconsole.log('typ token?', typeof token);\r\n\t\tconst isStringToken = (typeof token == 'string');\r\n\r\n\t\tif (!isStringToken) {\r\n\t\t\tconst err:HttpResponseMessage = token;\r\n\t\t\tconsole.warn('statusCode:', err.statusCode, err.statusText);\r\n\t\t\tconst errResponse:string = err.content; // hvorfor bliver den til en STRING, hvis den starter i netCore som ProblemDetails?\r\n\t\t\tconsole.log('content:', errResponse);\r\n\t\t\tconst dlgPromise = this.modal.OpenMessage(this.i18n.tr('Login Error'), this.i18n.tr(errResponse), true);\r\n\t\t\tconst dlgResult = await dlgPromise.whenClosed();\r\n\t\t\tconsole.log('dlgResult:', dlgResult);\r\n\t\t\treturn false;\r\n\t\t} {\r\n\t\t\tif (Boolean(token)) {\r\n\t\t\t\tsessionStorage.setItem('access_token', token);\r\n\t\t\t\tconsole.log('token set');\r\n\t\t\t\treturn true;\r\n\t\t\t} else {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n }\r\n\r\n public logOut(){ \r\n this.ensureAnonymousUser();\r\n this.router.navigateToRoute(\"login\");\r\n }\r\n \r\n public ensureAnonymousUser(){\r\n sessionStorage.removeItem('access_token');\r\n sessionStorage.removeItem('prj_access_token'); this.noteRemoveToken();\r\n sessionStorage.removeItem('org_access_token');\r\n }\r\n\tnoteRemoveToken() {\r\n\t\tconsole.trace('remove prj_access_token i user-session-service');\r\n\t}\r\n}\r\n\r\n/*\r\nexport interface ProblemDto {\r\n\ttype:string; //\":\"the_type\",\r\n\ttitle:string; //\":\"the_title\",\r\n\tstatus:number; //\":402,\r\n\tdetail:string; //\":\"the_detail\",\r\n\tinstance:string; //\":\"the_instance\",\r\n\ttraceId:string; //\":\"00-05d8ac9d849f17c7cc27fbdd5331f33a-760da12c14408bc0-00\"}\r\n}\r\n*/\r\n"],"names":["QuantityColumnService","constructor","api","appContext","quantityFilterId","getTypes","input","pageIndex","this","project","projectId","get","handleError","jsonResult","getSelectedTypes","changeSavedSources","list","typeIds","forEach","element","push","id","postJson","response","deleteSources","GetPartialProjectSimpleParametersByQF","qfId","GetProjectSimpleParametersByInputByQF","GetTypeProjectParameters","GetInstProjectParameters","GetunitsByParameters","parameters","AddQuantityColumns","columns","RemoveQuantityColumns","GetQuantityColumns","EditQuantityColumns","listOfColumnsToEdit","getCatMap","autoinject","QuantitySourcesService","GetInstancesByTypeId","typeId","getProjectCategories","getProjectFamilies","getTypeByBuiltInCategory","builtInCategory","getTypeIdByFamilyId","familyId","console","log","map","undefined","changeSavedSourcesWithIds","updateSources","typesToAdd","typesToRemove","statusCode","addSources","searchForTypes","inputDto","QuantityTakeoffService","GetQuantityFilters","DeleteQF","qf","GetTypesByEntityLabels","objectIds","length","GetTypesWCategoriesByEntityLabels","ScrollObjectGridService","handleFindAndScrollToElement","clickedElementId","multilineEnabled","appliedNumberOfLines","scrollToElement","toString","isFound","resetCounter","tableContainer","document","getElementById","scrollTop","offsetHeight","Promise","resolve","setTimeout","scrollNearElement","diff","Number","parseInt","getElementsByClassName","Math","floor","scrollLength","scrollBy","elem","scrollIntoView","block","inline","elemRect","getBoundingClientRect","y","height","scrollPos","behavior","top","SplitViewerResizeService","events","isColorPickerVisible","isSettingsVisible","verticalGutter","setupMainSplitter","shouldShowGutter","leftPanel","middlePanel","mainSplit","minSize","gutterSize","direction","onDrag","sizes","window","dispatchEvent","Event","styleOnlyFirstGutter","hideMainSplitter","destroySplitters","destroy","horizontalSplit","nextElementSibling","classList","add","showMainSplitter","remove","setupViewerSplitter","hide2dViewOnModelUnLoaded","docked2dView","viewer","contains","style","visibility","hide2dView","setSizes","bvElement","setViewerSplitSize","bottom","show2dViewOnModelLoaded","show2dView","EventAggregator","SummingService","i18n","getCategoriesOnProject","tr","getFamiliesByCategory","getTypeQuantityParameters","getFamilyQuantityParameters","setQuantityParameterOnType","parameterDefinitionId","a","isSuccess","statusText","syncQuantities","setQuantityParameterOnFamily","familyIds","famIds","r","handleErrorUsingReason","content","I18N","TenderService","getTenderSettings","UrlFormatter","formatUrl","url","test","UserService","apiClient","loadedUsers","usersLoaded","loadUsersFromOrganisation","warn","global","jsonResultNoLoadingIcon","x","doesUserExist","userId","getUser","Object","keys","loadGlobalUser","user","getLoadedUser","fillUsernames","listOfModels","who","async","model","username","getUsername","createdByUser_Id","makeDummyUser","email","firstName","lastName","phone","companyName","roles","organization","name","orgFlags","sigma","projects","dummy","OLD_loadGlobalUser","UserSessionService","router","modal","subscribe","logOut","logIn","userName","password","requestExecution","custom","Name","Password","token","stringResult","err","errResponse","dlgPromise","OpenMessage","dlgResult","whenClosed","Boolean","sessionStorage","setItem","ensureAnonymousUser","navigateToRoute","removeItem","noteRemoveToken","trace"],"sourceRoot":""}