{"version":3,"file":"app-a32aaa92.de29cdb307365c50.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 was 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 if (document.getElementById('panel-left') != null && document.getElementById('panel-middle') != 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 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, RequestExecution} from \"../api-client\";\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:\r\n\t\t\tlet user: UserDto|undefined = await this.apiClient.global.get(`UserAdministration/GetUserById?userId=${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 {\r\n let user: UserDto = await this.apiClient.global.get(`UserAdministration/GetUserById?userId=${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, RequestErrorHandling, RequestExecution } from './api-client';\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\", {\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');\r\n sessionStorage.removeItem('org_access_token');\r\n }\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","async","input","pageIndex","this","project","projectId","get","handleError","jsonResult","list","typeIds","forEach","element","push","id","postJson","response","qfId","parameters","columns","listOfColumnsToEdit","autoinject","QuantitySourcesService","typeId","builtInCategory","familyId","console","log","map","undefined","typesToAdd","typesToRemove","statusCode","inputDto","QuantityTakeoffService","qf","objectIds","length","ScrollObjectGridService","static","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","shouldShowGutter","mainSplit","minSize","gutterSize","direction","onDrag","sizes","window","dispatchEvent","Event","styleOnlyFirstGutter","hideMainSplitter","destroySplitters","destroy","horizontalSplit","nextElementSibling","classList","add","remove","setupMainSplitter","hide2dViewOnModelUnLoaded","docked2dView","viewer","contains","style","visibility","hide2dView","setSizes","bvElement","setViewerSplitSize","bottom","show2dViewOnModelLoaded","show2dView","SummingService","i18n","tr","parameterDefinitionId","a","isSuccess","statusText","syncQuantities","familyIds","famIds","r","handleErrorUsingReason","content","I18N","TenderService","UrlFormatter","url","test","UserService","apiClient","loadedUsers","usersLoaded","warn","global","jsonResultNoLoadingIcon","x","doesUserExist","userId","loadUsersFromOrganisation","Object","keys","loadGlobalUser","user","getLoadedUser","listOfModels","who","model","username","getUsername","createdByUser_Id","makeDummyUser","email","firstName","lastName","phone","companyName","roles","organization","name","orgFlags","sigma","projects","dummy","getUser","UserSessionService","router","modal","subscribe","logOut","userName","password","requestExecution","custom","Name","Password","token","stringResult","err","errResponse","dlgPromise","OpenMessage","dlgResult","whenClosed","Boolean","sessionStorage","setItem","ensureAnonymousUser","navigateToRoute","removeItem"],"sourceRoot":""}