{"version":3,"file":"app-d1930da9.6ba95e7120eac667.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/project/building-parts-component/building-parts-component.ts"],"sourcesContent":["import { ContextMenuService } from 'app/services/context-menu-service';\r\nimport { Keynote } from '../../components/object/keynote/keynote';\r\nimport { GridDto, HeaderDto } from '../../models/grid-dto';\r\nimport { I18N } from 'aurelia-i18n';\r\nimport { ApiClient, RequestMethod } from 'app/services/api-client';\r\nimport { Subscription, EventAggregator } from 'aurelia-event-aggregator';\r\nimport { ObjectListBuilder } from 'app/services/object-list/object-list-builder';\r\nimport { autoinject, observable, bindable } from 'aurelia-framework';\r\nimport { ObjectListManager, ObjectListValues, ShownColumnHeaderIF } from 'app/services/object-list/object-list-manager';\r\nimport { ModalService } from 'app/services/modal-service';\r\nimport { FilterSelector, FilterSelectorDto } from 'app/components/filter/selector/filter-selector';\r\nimport { AppContextService } from \"app/services/app-context-service\";\r\nimport { ManualEntry } from \"app/components/object/manual-entries/manual-entry\";\r\nimport { FilterDto, ICombinedFilter, FilterGroupDto, FilterSettings } from 'app/models/filter-dto';\r\nimport { ObjectFilterDTO, UIValueFilter, ValueFilter } from 'app/models/object-filter';\r\nimport { ObjectValues } from 'app/models/object-values';\r\nimport { CategorySelector } from 'app/components/filter/prompts/category-selector/category-selector';\r\nimport { FileUpload } from 'app/components/file-upload/file-upload';\r\nimport { ExportGrid } from 'app/components/object/export-grid/export-grid';\r\nimport { BuildingPartsReceipt } from 'app/components/file-upload/building-parts-receipt/building-parts-receipt';\r\nimport { SettingDto, SettingNames } from 'app/models/setting-dto';\r\n\r\nimport * as environment from '../../../../config/environment.json';\r\nimport { LCAObjectsOverview } from 'app/components/lcaobjects-overview/lcaobjects-overview';\r\nimport {BimViewerService} from \"../../services/bim-viewer-service\";\r\nimport { ObjectListColumnManager } from 'app/services/object-list/object-list-column-manager';\r\nimport { DialogCloseResult } from 'aurelia-dialog';\r\nimport { SelectedItem } from '../work-area/split-viewer-interfaces';\r\nimport { ObjectRow } from 'app/services/object-list/object-list-row';\r\nimport { ScrollObjectGridService } from 'app/services/scroll-object-grid-service';\r\nimport { ObjectDetails } from 'app/models/object-details';\r\nimport { SerialNumberTool } from 'app/components/object/serial-number-tool/serial-number-tool';\r\nimport {CompoundValuesTool} from \"../../components/object/compound-values-tool/compound-values-tool\";\r\n\r\n@autoinject\r\nexport class BuildingPartsComponent {\r\n\t@bindable public bpVisible: boolean = false;\r\n\t@bindable public projectId: string = \"\";\r\n\tpublic objects: ObjectListManager | undefined;\r\n\tpublic multilineEnabled: boolean = false;\r\n\r\n\tpublic selectedNumberOfLines: number = 5;\r\n\tpublic appliedNumberOfLines: number = 5;\r\n\tprivate available: UIValueFilter[] = []; \r\n\tprivate isLoadingViewerElements: boolean = false;\r\n\r\n\t// public showProperties: boolean = false;\r\n\r\n\tpublic savedFilters: FilterDto[] = [];\r\n\tpublic savedFilterGroups: FilterGroupDto[] = [];\r\n\tpublic combinedFilters: ICombinedFilter[] = []; // Hmm, relationen mellem disse to var, at den ene er dem der er VALIDE, men DEN bruger vi aldrig..\r\n\tpublic availableCombinedFilters_unused:ICombinedFilter[] = [];\r\n\t\r\n\tpublic invalidParameters: string[] = [];\r\n\tpublic invalidFilters_unused: FilterSettings[] = [];\r\n\tprivate subscriptions: Subscription[] = [];\r\n\r\n\t//public isPrerelease: boolean = environment.debug || environment.testing;\r\n\tpublic isPrerelease_fix: boolean = true; // nemlig\r\n\tpublic isPrerelease_lca:boolean = environment.debug || environment.testing; //FIXME prerelease tag for LCAByg \"integration\"\r\n\tpublic navCollapsed: boolean = false;\r\n\tpublic showBimViewerButton: boolean = false;\r\n\tprivate bimViewerService: BimViewerService;\r\n\r\n\tpublic toggleLCAButton():boolean { return this.appContext.enableLCAByg; }\r\n\t\r\n\t//@observable public selectedFilterName: string = \"Filter\"; // JG: I wish this didn't exist. Presumably it exists to be watchable by UI-views, AND to deviate from 'name-of-selected-item'. BUT, couldn't that just be 'return alternate value on null'?\r\n\t@observable public selectedCombinedName:string = \"Combined View/Grouping\";\r\n\t@observable public activateCombined:boolean = false;\r\n\t@observable public categorySelected:boolean = false;\r\n\t\r\n\t//public selectedFilter: FilterDto = null;\r\n\r\n\tconstructor(private gridFactory: ObjectListBuilder,\r\n\t\tprivate modal: ModalService,\r\n\t\tprivate appContext: AppContextService,\r\n\t\tprivate events: EventAggregator,\r\n\t\tprivate apiClient: ApiClient,\r\n\t\tprivate i18n: I18N,\r\n\t\tprivate contextMenuService: ContextMenuService) {\r\n\t\tthis.bimViewerService = new BimViewerService(apiClient,appContext);\r\n\t}\r\n\r\n\t//RELOADING IF PROJECTID CHANGES\r\n\tasync projectIdChanged(): Promise {\r\n\t\tthis.setSelectedFilterName(\"View\"); // fixme: can we entirely get rid of these, and use calc-functions instead?\r\n\t\tthis.selectedCombinedName = \"Combined View\"; // fixme: can we entirely get rid of these, and use calc-functions instead?\r\n\r\n\t\t// SWITCH project-context, if we have been activated with a projectID:\r\n\t\tif (this.projectId) { this.appContext.setProject(this.projectId); } // in projectIdChanged.\r\n\t\t// INIT, based on whatever project-context is available: (both if changed, and if whatever-was-set-from-last-time.)\r\n\t\tif (this.appContext.projectId) { \r\n\t\t\tawait this.activateForProject(); \r\n\t\t} \r\n\t}\r\n\r\n\tasync activate(params: any): Promise {\r\n\t\ttry {\r\n\t\t\tawait this.implActivate(params); \r\n\t\t} catch (e) {\r\n\t\t\tconsole.error('error during bp activate', e);\r\n\t\t}\r\n\t\t/* If you don't try-catch in aurelia async handlers, you are going to have a bad time(TM).\r\n\t\tBad-Time means a useless context-less error msg from aurealia-logging-console,\r\n\t\tthat for silly reasons does not include the stack trace WHICH ACTUALLY IS CONTAINED IN THE STUPID RESULT?!\r\n\t\t*/\r\n\t}\r\n\tasync bind(params: any): Promise {\r\n\t\ttry {\r\n\t\t\tawait this.implActivate(params); \r\n\t\t} catch (e) {\r\n\t\t\tconsole.error('error during bp activate', e);\r\n\t\t}\r\n\t\t/* If you don't try-catch in aurelia async handlers, you are going to have a bad time(TM).\r\n\t\tBad-Time means a useless context-less error msg from aurealia-logging-console,\r\n\t\tthat for silly reasons does not include the stack trace WHICH ACTUALLY IS CONTAINED IN THE STUPID RESULT?!\r\n\t\t*/\r\n\t}\r\n\r\n\tasync implActivate(params: any): Promise {\r\n\t\tthis.setSelectedFilterName(\"View\"); // fixme: can we entirely get rid of these, and use calc-functions instead?\r\n\t\tthis.selectedCombinedName = \"Combined View\"; // fixme: can we entirely get rid of these, and use calc-functions instead?\r\n\r\n\t\t// SWITCH project-context, if we have been activated with a projectID:\r\n\t\tif (params.projectId) { this.appContext.setProject(params.projectId); }//in-implActivate\r\n\t\t// INIT, based on whatever project-context is available: (both if changed, and if whatever-was-set-from-last-time.)\r\n\t\tif (this.appContext.projectId) { \r\n\t\t\tawait this.activateForProject(); \r\n\t\t} \r\n\t\tthis.bpVisible = params.isBuildingPartsVisible;\r\n\t}\r\n\r\n\tasync activateForProject(): Promise {\r\n\t\t// NB: IF we arrive here, it means this.appContext.projectId is set!\r\n\r\n\t\tthis.objects = this.gridFactory.ForAjourCollab_OLB(this.appContext.projectId)?.BuildServerSide();\r\n\t\tthis.objects?.enableValueListColors();\r\n\t\tthis.objects?.initialize(); // initialize and BuildServerSide, just initializes us to EMPTY; ie no data loaded in any way..\r\n\r\n\t\tawait this.initCategoryContextForFilters();\r\n\t\tawait this.initBimViewerButton();\r\n\r\n\t\tawait this.loadAllFilterData();\r\n\t\tthis.activateCombined = (this.savedFilterGroups?.length > 0);\r\n\t\tawait this.activateFilter(); // needs filter-data loaded.\r\n\t} // activateForProject.\r\n\r\n\r\n\r\n\r\n\tasync activateFilter(): Promise {\r\n\t\t/** SMP: initializes Quantity and QuantityUnit with empty values for all rows, but e.g. Volume has a value. WTF? */\r\n\t\t// MOVED BELOW: await this.objects.showAsListGrid('BP.activate', false); // in bp.activate. Will trigger applyFilters. Men det giver da ringe mening, hvis filters ikke er indl�st endnu?\r\n\r\n\t\t// is there is no selected-filter set yet, try to initialize it first:\r\n\t\tif (!this.appContext.getSelectedFilter()) { //MIGHT CAUSE SOME BUGS ALONG THE LINE IN RELATION TO REMOVING FILTERS ETC.\t\t\t\r\n\t\t\tconsole.log('no selected-filter yet, trying to init with last-used.')\r\n\t\t\tawait this.initSelectedFilterWithLastUsed();\t\t\t\r\n\t\t} \r\n\r\n\t\t// now, hoping that we have a selected-filter initialized, try to APPLY it:\r\n\t\tlet selFilter:FilterDto | null = this.appContext.getSelectedFilter();\r\n\t\tlet applyIfNoFilter: boolean = !selFilter; // there is a conflict around the code, about who should trigger the apply :-/.\r\n\r\n\t\t/** SMP: initializes Quantity and QuantityUnit with empty values for all rows, but e.g. Volume has a value. WTF? */\r\n\t\tawait this.objects?.showAsListGrid('BP.activate', applyIfNoFilter); // in bp.activate. Will trigger applyFilters. Men det giver da ringe mening, hvis filters ikke er indl�st endnu?\r\n\r\n\t\tif (selFilter) {\r\n\t\t\tconsole.log('will try to APPLY selectedFilter:', selFilter.name); //, selFilter);\r\n\t\t\t// Leads to APPLYFILTERS:\r\n\t\t\tawait this.bp_applyFilter_impl(); // in bp.activate, WITH selected filter.\r\n\t\t\t/* There is some circular crap here. BP.applyFilter causes setSelectedFilter,\r\n\t\t\twhich is also an INPUT to it.. It does not make sense,\r\n\t\t\tthat it is both the source and the sink of that value.\r\n\t\t\t*/\t\t\r\n\t\t} else { // no good data, try a default-config.\r\n\t\t\tconsole.warn('still no selectedFilter, will try a default-empty init?');\r\n\t\t\tthis.objects?.shownItems.sort((a: ObjectRow, b: ObjectRow) => {\r\n\t\t\t\tif (a && b) {\r\n\t\t\t\t\tlet comparison: number | undefined = a.compare(b);\r\n\t\t\t\t\treturn comparison ? comparison : 0;\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tasync initSelectedFilterWithLastUsed(): Promise {\r\n\t\t/* Lesson.. We died horribly here, without useful stack trace/context info.\r\n\t\tThe lesson is, that outermost async handlers,\r\n\t\tshould have a try-catch, as long as aurealia-router.js has such lousy error handling.\r\n\r\n\t\tLesson#2 is, that for routing failures,\r\n\t\tfirst reaction should be to wrap the view.Activate in try-catch,\r\n\t\tsince it is probably code triggered by activate that causes the issue.\r\n\t\t*/\r\n\t\tlet lastUsedFilter: FilterDto | undefined = await this.getLastUsedFilter(); // hmm, does setDefaultFilter and getLastUsedFilter have a relation?\r\n\t\tconsole.log('getLastUsedFilter:', lastUsedFilter?.name, '(initSelectedFilterWithLastUsed)');\r\n\t\tif (lastUsedFilter) {\r\n\t\t\tthis.appContext.setDefaultFilter(lastUsedFilter);\r\n\t\t\tthis.appContext.setSelectedFilter(lastUsedFilter, 'in BP.activateFilter, lastUsedFilter');\r\n\t\t\tthis.setSelectedFilterName(lastUsedFilter.name);//initSelectedFilterWithLastUsed\r\n\t\t} else {\r\n\t\t\tconsole.log('(no last-used-filter found, so no default-filter set.)');\r\n\t\t}\r\n\t\treturn (!!lastUsedFilter);\r\n\t}\r\n\r\n\tasync getLastUsedFilter(): Promise {\r\n\t\tlet lastAppliedFilter_path: string =`Setting/GetSetting/${this.appContext.projectId}/${SettingNames.lastAppliedFilters}`;//getLastUsedFilter\r\n\t\tlet r_lastUsedFilter:SettingDto = await this.apiClient.system.get(lastAppliedFilter_path).jsonResult(); \r\n\t\tlet lastUsedFilter:FilterDto | undefined = undefined;\r\n\r\n\t\tif (r_lastUsedFilter) {\r\n\t\t\tlet lastUsedFilter_Id: string = r_lastUsedFilter.target;\r\n\t\t\tlastUsedFilter = this.savedFilters.find(x => x.id === lastUsedFilter_Id);\r\n\t\t}\r\n\t\treturn lastUsedFilter;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tasync loadAllFilterData(): Promise {\r\n\t\t/* JG: NB, dette indlæser ALLE TILGÆNGELIGE data for projektet,\r\n\t\t* det handler IKKE om de af dem, som brugeren har valgt!\r\n\t\t* IE der kommer et senere trin, hvor der så fra dette sæt,\r\n\t\t* bruges det af dem som er brugerens aktuelt valgte/default.\r\n\t\t*/\r\n\t\tawait this.bp_getSavedFilters(); // loadAllFilterData - hermed har vi BuildingParts.savedFilters: FilterDto[]\r\n\t\tawait this.getFilterGroups();//in-activate().\r\n\t\tawait this.getCombinedFilters();\r\n\t\tawait this.loadAvailableCombinedFilters();//in-activate.\r\n\t\t/* JG: Jeg undrer mig over rækkefølgen loadAllFilterData bruges i..\r\n\t\t * Hvorfor aktiveres showAsListGrid (eller rettere, dens kald til applyFilters), \r\n\t\t * INDEN kaldene til getXXXFiltersXXX?\r\n\t\t * Burde vi ikke indlæse alle de filtre, INDEN applyFilters?\r\n\t\t */\r\n\t}\r\n\r\n\tasync lineNumberChanged():Promise {\r\n\t\t//Storing user choice of number of lines, nothing is applied before clicking ok. (This is due to virtualization not being able to handle the dynamic height changes)\r\n\t\tthis.selectedNumberOfLines = this.selectedNumberOfLines > 10 ? 10 : this.selectedNumberOfLines;\r\n\t\tthis.selectedNumberOfLines = this.selectedNumberOfLines < 2 ? 2 : this.selectedNumberOfLines;\t\r\n\t}\r\n\r\n\tasync updateLineNumbers(): Promise {\r\n\t\t//Triggers on button press to update new number of lines showed.\r\n\t\tif (this.selectedNumberOfLines != this.appliedNumberOfLines) {\r\n\t\t\tthis.appliedNumberOfLines = this.selectedNumberOfLines;\r\n\t\t\tawait this.objects?.showAsListGrid('updateLineNumbers');\r\n\t\t}\r\n\t}\r\n\r\n\tasync initBimViewerButton(): Promise {\r\n\t\tthis.showBimViewerButton = await this.apiClient.project(this.appContext.projectId).get('BimViewer/DoesProjectHavePluginUploads')\r\n\t\t\t.handleError('Error', 'Error during Bimviewer integration check for the current project. No Bimviewer will be available as a result.')\r\n\t\t\t.objectResult();\r\n\t}\r\n\r\n\tasync initCategoryContextForFilters():Promise {\r\n\t\tlet path: string = `Setting/GetSetting/${this.appContext.projectId}/${SettingNames.defaultCategory}`;\r\n\t\tlet defCatSetting:SettingDto = await this.apiClient.system.get(path).jsonResult();\r\n\t\tif (defCatSetting) {\r\n\t\t\tthis.objects?.columns.setFilterCategoryContext( {id: defCatSetting.target, name: \"\"} );\r\n\t\t}\r\n\t}\r\n\r\n\tattached(): void {\r\n\t\tthis.subscriptions = [\r\n\t\t\tthis.events.subscribe('grid-items:setLeftPos', () => { this.setCSS_LeftOnStickyColumns() }),\r\n\t\t\tthis.events.subscribe('combined-filters:update', () => { this.getCombinedFilters() }),\r\n\t\t\tthis.events.subscribe(\"nav-collapsed\", (payload: any) => { this.navCollapsed = payload }),\r\n\t\t\tthis.events.subscribe('BP:highlight-selected-items', async (data: SelectedItem) => { await this.handleObjectClicked(data.objectIds)})\r\n\t\t];\r\n\t\tthis.events.publish('WorkAreaContainer:BPLoaded');\r\n\t}\r\n\t\r\n\tdetached(): void {\r\n\t\tthis.subscriptions.forEach(subscription => ( subscription.dispose() ));\r\n\t\tthis.objects?.colorLegendService.clearColorInfo();\r\n\t\tthis.appContext.setSelectedFilter(null, 'bp:detached');\r\n\t}\r\n\r\n\tprivate async handleObjectClicked(objectIds: number[]): Promise {\r\n\t\tconsole.log(\"IS BP VISIBLE? \", this.bpVisible);\r\n\t\tconsole.log(\"IS Loading viewer elements? \", this.isLoadingViewerElements);\r\n\t\ttry {\r\n\t\t\tif (!this.isLoadingViewerElements) { return; } //Avoiding duplicate elements from showing up. \r\n\t\t\tif (!this.bpVisible || this.objects?.mode != ObjectListValues.grid) { return; }\r\n\r\n\t\t\t\r\n\t\t\tif (objectIds.length == 0) { \r\n\t\t\t\tthis.objects.clearGridHighlighting();\r\n\t\t\t\tconsole.log(\"Returned because length of selected object ids was 0 (clearGridHighlighting)\", objectIds);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// (All this remaining work only makes sense when objectIds.length > 0):\r\n\r\n\t\t\tthis.isLoadingViewerElements = true;\r\n\t\t\tlet api: RequestMethod = this.apiClient.project(this.appContext.projectId);\r\n\t\t\tlet typeIds: string[] = await api.postJson(`ObjectDetail/GetIFC_InfoByEntityLabels`, objectIds)\r\n\t\t\t.handleError(\"Could not get types\", \"No types could be found\")\r\n\t\t\t.objectResult();\r\n\t\t\t\r\n\t\t\tlet rowsToExpand: ObjectRow[] = await this.findRowsToExpand(typeIds);\r\n\t\t\t\r\n\t\t\tawait this.objects.expandRows(rowsToExpand);\r\n\t\t\t\r\n\t\t\tlet listOfNewElements: ObjectRow[] = await this.handleItemsToSelect(objectIds);\r\n\t\t\tif (listOfNewElements.length > 0) {\r\n\t\t\t\tlet element: ObjectRow = listOfNewElements[listOfNewElements.length - 1];\r\n\t\t\t\tlet clickedElementId: number = this.objects.shownItems.indexOf(element);\r\n\t\t\t\tawait ScrollObjectGridService.handleFindAndScrollToElement(clickedElementId, this.multilineEnabled, this.appliedNumberOfLines);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t} finally {\r\n\t\t\tthis.isLoadingViewerElements = false; //Ensuring no matter the outcome that isLoadingViewerElements is set to false.\r\n\t\t}\r\n\t}\r\n\r\n\tasync findRowsToExpand(typeIds: string[]): Promise {\r\n\t\tlet rowsToExpand: ObjectRow[] | undefined = await this.objects?.getRowsToExpand(typeIds); \t\t\r\n\t\tif (rowsToExpand && rowsToExpand.length >= typeIds.length) {\r\n\t\t\treturn rowsToExpand;\r\n\t\t} // (We already have all we need.)\r\n\r\n\t\t//If the object is not in shown items, more items will be loaded until it is found.\r\n\t\tlet beforeLength: number | undefined = this.objects?.shownItems.length;\r\n\t\tawait this.objects?.tryShowMoreObjects();\r\n\t\tlet afterLength: number | undefined = this.objects?.shownItems.length;\r\n\t\tlet idsOfFoundTypes: string[] | undefined= rowsToExpand?.map( x => x.id);\r\n\t\tlet idsOfRowsNotFound: string[] = typeIds.filter(id => !idsOfFoundTypes?.includes(id));\r\n\r\n\t\tif (afterLength && beforeLength && afterLength > beforeLength && idsOfRowsNotFound.length > 0) {\r\n\t\t\trowsToExpand?.push(...(await this.findRowsToExpand(idsOfRowsNotFound)));\r\n\t\t} else {\r\n\t\t\tconsole.warn(\"gave up - did not find all objects:\", idsOfRowsNotFound);\r\n\t\t}\r\n\t\treturn rowsToExpand ? rowsToExpand : [];\r\n\t}\r\n\r\n\tprivate async handleItemsToSelect(objectIds: number[]): Promise {\r\n\t\tconsole.log('BPC.handleItemsToSelect');\r\n\t\tlet listOfNewElements: ObjectRow[] = [];\r\n\t\tlet listOfElementsToRemove: ObjectRow[] = [];\r\n\t\tthis.objects?.shownItems.forEach((element: ObjectRow) => {\r\n\t\t\tif (element?.value?.ifC_EntityId && element.isSelected) {\r\n\t\t\t\tif (!objectIds.includes(element.value.ifC_EntityId)) {\r\n\t\t\t\t\tlistOfElementsToRemove.push(element);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (element.value?.ifC_EntityId) {\r\n\t\t\t\t\tif (objectIds.includes(element.value.ifC_EntityId)) {\r\n\t\t\t\t\t\tlistOfNewElements.push(element);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tlet anyDeselectTypes = this.objects?.selectedItems.filter((element: ObjectRow) => element.isType() && element.isSelected);\r\n\r\n\t\tif (anyDeselectTypes) {\r\n\t\t\tawait this.objects?.toggleSelectedElementsOff(anyDeselectTypes); // in handleItemsToSelect.\r\n\t\t}\r\n\t\tawait this.objects?.toggleSelectedElementsOff(listOfElementsToRemove);// in handleItemsToSelect.\r\n\t\tawait this.objects?.toggleSelectedElementsOn(listOfNewElements); // in handleItemsToSelect.\r\n\t\treturn listOfNewElements;\r\n\t}\r\n\r\n\tpublic async openFilterSelector(): Promise {\r\n\t\t// (Det er tragten.)\r\n\t\tif (this.objects && this.objects.mode) {\r\n\t\t\tlet filterModel:FilterSelectorDto = { filters: this.objects.columns, gridMode: this.objects?.mode };\r\n\t\t\tlet x: DialogCloseResult = await this.modal.OpenModal(FilterSelector,filterModel).whenClosed();\t\r\n\t\t\tawait this.getFilterGroups(); //If any filtergroups has been made and used in a new combined filter, the groups must be reloaded when closing the dialog.\r\n\t\t\tif (x.wasCancelled) { return; }\r\n\t\t\t\r\n\t\t\tawait this.objects.apply_ActiveFilters('bp.openFilterSelector');\r\n\t\t\tawait this.bp_getSavedFilters(); // re-read the list of named filter-sets.\r\n\t\t\tthis.setCSS_LeftOnStickyColumns();\r\n\t\t}\r\n\t}\r\n\r\n\t//NB. Not used in new BP.\r\n\t\r\n\t// async openFixColumnsDialog(): Promise {\r\n\t// \tawait this.modal.OpenModal(FixedColumns, { objects: this.objects }).whenClosed(x => {\r\n\t// \t\tif (!x.wasCancelled) {\r\n\t// \t\t\tthis.objects.fixedColumns = x.output.fixedColumns;// set by openFixColumnsDialog-OK.\r\n\t// \t\t}\r\n\t// \t});\r\n\t// \tthis.setCSS_LeftOnStickyColumns();\r\n\t// }\r\n\r\n\tpublic async selectTableView(type: string, isMultiline: boolean = false): Promise {\r\n\t\tif (!this.objects || (type === this.objects.mode && this.multilineEnabled == isMultiline)) { return; }\r\n\t\tawait this.switchToGridType(type, isMultiline);\r\n\t\t//await this.objects.applyFilters('for selectTableView');\r\n\t\tthis.setCSS_LeftOnStickyColumns();\r\n\t}\r\n\r\n\tasync switchToGridType(type: string | undefined, isMulitline: boolean = false): Promise {\r\n\t\tthis.multilineEnabled = isMulitline;\r\n\t\tswitch (type) {\r\n\t\t\tcase ObjectListValues.treeGrid: await this.objects?.showAsTreeGrid(); break;\r\n\t\t\tcase ObjectListValues.treeList: await this.objects?.showAsTreeList(); break;\r\n\t\t\tcase ObjectListValues.grid: {\r\n\t\t\t\tthis.resetFixedColumns();\r\n\t\t\t\tawait this.objects?.showAsListGrid('selectTableView'); break;//in bp.selectTableView.\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tpublic async createManualEntry(): Promise {\r\n\t\tawait this.modal.OpenModal(ManualEntry, {}).whenClosed((x: DialogCloseResult) => {\r\n\t\t\tif (!x.wasCancelled) {\r\n\t\t\t\tthis.objects?.apply_ActiveFilters('bp.createManualEntry');\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic async exportKeynote(): Promise { await this.modal.OpenModal(Keynote); }\r\n\r\n\tpublic async serialNumbers(): Promise { \r\n\t\tawait this.modal.OpenModal(SerialNumberTool).whenClosed((x: DialogCloseResult) => {\r\n\t\t\tif (!x.wasCancelled) {\r\n\t\t\t\tthis.objects?.apply_ActiveFilters('serialNumbers');\r\n\t\t\t}\r\n\t\t}); \r\n\t}\r\n\r\n\tprivate async compoundValues(): Promise {\r\n\t\tawait this.modal.OpenModal(CompoundValuesTool).whenClosed((x: DialogCloseResult) => {\r\n\t\t\tif (!x.wasCancelled) {\r\n\t\t\t\tthis.objects?.apply_ActiveFilters('compoundValues');\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\t\r\n\tpublic async getCombinedFilters(): Promise {\r\n\t\t// dette giver os ICombinedFilter[]:\r\n\t\tthis.combinedFilters = await this.apiClient.project(this.appContext.projectId).get(\"Filter/GetCombinedFilters\")\r\n\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), this.i18n.tr('Error_Message_Generic'))\r\n\t\t\t.jsonResult();\r\n\t}\r\n\r\n\tprivate async loadAvailableCombinedFilters(): Promise {//UB:activate\r\n\t\tthis.availableCombinedFilters_unused = [];\r\n\t\tif (this.combinedFilters.length > 0) {\r\n\t\t\tthis.combinedFilters.forEach((element: ICombinedFilter) => {\r\n\t\t\t\tif (this.savedFilterGroups.some(x => x.id === element.groupingId)) {\r\n\t\t\t\t\tthis.availableCombinedFilters_unused.push(element);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t} else { // .. no combinedFilters.\r\n\r\n\t\t}\r\n\t}\r\n\r\n\tpublic async loadCombinedFilter(combinedFilter: ICombinedFilter): Promise { // event-handler when users click on a dropdown-item 'Combined Filter' to load.\r\n\t\tlet filterGroup:FilterGroupDto | undefined = this.savedFilterGroups.find((x: FilterGroupDto) => {\r\n\t\t\treturn x.id === combinedFilter.groupingId;\r\n\t\t});\r\n\t\tif (!filterGroup) { //this.savedFilterGroups.some(x => x.id === combinedFilter.groupingId)) {\r\n\t\t\tthis.modal.OpenMessage(\r\n\t\t\t\tthis.i18n.tr(\"An error occurred\"),\r\n\t\t\t\tthis.i18n.tr(\"You do not have the required filters to use this combined view.\")\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet dlg: DialogCloseResult = await this.modal.OpenModal(\r\n\t\t\tCategorySelector, { columns: this.objects?.columns, groupFilter: filterGroup }).whenClosed(); //.whenClosed(x => {\t\t\t\t\r\n\t\tif (dlg.wasCancelled) { return; }\r\n\r\n\t\tif (this.objects && this.objects.mode !== ObjectListValues.grid) {\r\n\t\t\tawait this.applyFilterGroupPart(combinedFilter); //.then(() => {// in loadCombinedFilter.\r\n\t\t\tawait this.determine_ActiveFilterColumns(combinedFilter); //.then(() => { // in loadCombinedFilter,NON-mode.\r\n\t\t} else { // mode IS grid:\r\n\t\t\tawait this.determine_ActiveFilterColumns(combinedFilter); //.then(() => { // also in loadCombinedFilter, GRID-mode.\r\n\t\t\t// Remove those grouped that are not the initial-search-filter.\r\n\t\t\t// In other words, remove ALL grouped fields, UNLESS they are the search-filter.\r\n\t\t\tif (this.objects?.columns.grouped) {\r\n\t\t\t\tthis.objects?.columns.selected.unshift(...this.objects.columns.grouped.filter((x: UIValueFilter) => x !== this.objects?.columns.mainSearch));//-in-loadCombinedFilter\r\n\t\t\t}\r\n\t\t\t// Det burde enten vaere OLCM selv, eller en dedikeret klasse, der lavede alt det manipulation af OLCM's dele.\r\n\t\t\tconsole.log('bp.loadCombinedFilter,unshift columns.selected');\r\n\t\t}\t\r\n\t\tawait this.objects?.apply_ActiveFilters('BP.loadCombinedFilter()'); \r\n\t}\r\n\r\n\tasync deleteCombinedFilter(item: ICombinedFilter): Promise {//ui-button-handler.\r\n\t\tthis.modal.OpenConfirm(\r\n\t\t\tthis.i18n.tr('Delete'),\r\n\t\t\tthis.i18n.tr('Are you sure you want to delete the combined view \"') + item.name + '\"?'\r\n\t\t).whenClosed((x: DialogCloseResult) => {\r\n\t\t\tif (!x.wasCancelled) {\r\n\t\t\t\tthis.apiClient.project(this.appContext.projectId).postJson('Filter/DeleteCombinedFilter', item.id)\r\n\t\t\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), this.i18n.tr('Error_Message_Generic'))\r\n\t\t\t\t\t.jsonResult()\r\n\t\t\t\t\t.finally(async () => {\r\n\t\t\t\t\t\tthis.getCombinedFilters();\r\n\t\t\t\t\t\tif (this.appContext.getCombinedFilter() === item) {\r\n\t\t\t\t\t\t\tthis.appContext.setCombinedFilter(null);\r\n\t\t\t\t\t\t\tthis.selectedCombinedName = \"Combined view\";\r\n\t\t\t\t\t\t\tlet mode: string | undefined | null = this.objects?.mode;\r\n\t\t\t\t\t\t\tthis.objects?.reset();\r\n\t\t\t\t\t\t\tthis.switchToGridType(mode ? mode : undefined);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\r\n\tprivate async applyFilterGroupPart(combinedFilter: ICombinedFilter): Promise { // UB loadCombinedFilter\r\n\t\tif (!this.objects) { return; }\r\n\t\tlet groupingFilter: string | undefined = this.objects?.columns?.getFilterCategoryContext()?.id;\r\n\t\tif (!groupingFilter) { return;}\r\n\t\tlet valueFilters: ValueFilter[] = await this.objects.columns.getAvailableGroupingFilters(groupingFilter);\r\n\t\tthis.available = ObjectListColumnManager.valueFilter2UIFilter(valueFilters);\r\n\r\n\t\tlet before: number = this.available.length;\r\n\t\tthis.available = Array.from(new Set(this.available)); // applyFilterGroupPart, Remove potential dublicates from available\r\n\t\tconsole.log('applyFilterGroupPart remove duplicates', before, this.available.length);\r\n\r\n\t\tthis.resetAVAILABLEFilterSettings();//in-applyFilterGroupPart.\r\n\t\tthis.objects.columns.grouped = [];\t\r\n\t\tthis.objects.columns.selected = [];//in-applyFilterGroupPart\r\n\r\n\t\tlet foundGroupFilter:FilterGroupDto | undefined = this.savedFilterGroups.find((filterGroup: FilterGroupDto) => filterGroup.id === combinedFilter.groupingId)\r\n\t\tconsole.log(foundGroupFilter);\r\n\r\n\t\tfoundGroupFilter?.parameters.forEach((groupParameter: string) => {\r\n\t\t\tthis.available.forEach((groupParameterFilter: UIValueFilter) => {//(in-applyFilterGroupPart)\r\n\t\t\t\tif (Boolean(groupParameterFilter.name === groupParameter)) {\r\n\t\t\t\t\tthis.addSelectedFilterColumn(groupParameterFilter);//applyFilterGroupPart.\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tif (!this.objects?.columns.selected.map(x => x.name).includes(groupParameter)) {\r\n\t\t\t\tthis.invalidParameters.push(groupParameter);\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis.appContext.setSelectedGrouping(foundGroupFilter);\r\n\t\tthis.appContext.setCombinedFilter(combinedFilter);\r\n\t\tconsole.log(\"CombinedFiltername is set here \" , combinedFilter)\r\n\t\tthis.selectedCombinedName = combinedFilter.name;\r\n\t\tthis.objects.columns.applyGrouping(this.objects.columns.selected);//in-applyFilterGroupPart\r\n\t}\r\n\r\n\taddSelectedFilterColumn(filter: UIValueFilter): void { //ObjectFilter) {//UB:applyFilterGroupPart/applyFilterPart\r\n\t\t// (remove it from the AVAILABLE and insert it into the SELECTED.)\r\n\t\tlet index: number = this.available.indexOf(filter);\r\n\t\tif (index >= 0) {\r\n\t\t\tthis.available.splice(index, 1);\t\t\t\r\n\t\t\tthis.objects?.columns.selected.push(filter);//in-addSelectedFilterColumn. \r\n\t\t}\r\n\t}\r\n\r\n\r\n\tprivate resetAVAILABLEFilterSettings(): void {//UB:applyFilterPart applyFilterGroupPart.\r\n\t\t// Most of this belongs to C#FilterSettingsDto:\r\n\t\tthis.available.forEach((availFilter: UIValueFilter) => {\r\n\t\t\tavailFilter.isLocked = undefined; // not known on C#-side.\r\n\t\t\tavailFilter.selectedSortingOption = undefined\r\n\t\t\tavailFilter.selectedComparisonOption = undefined;\r\n\t\t\tavailFilter.value = '';\r\n\t\t\tavailFilter.hide = false;\r\n\t\t});\r\n\r\n\t\tthis.objects?.columns?.grouped?.forEach((groupedFilter: UIValueFilter) => {\r\n\t\t\tgroupedFilter.isLocked = undefined;\r\n\t\t\tgroupedFilter.selectedSortingOption = undefined\r\n\t\t\tgroupedFilter.selectedComparisonOption = undefined;\r\n\t\t\tgroupedFilter.value = '';\r\n\t\t\tgroupedFilter.hide = false;\r\n\t\t});\r\n\t}\r\n\r\n\tprivate transferFilterSettings(filter: UIValueFilter, filterSETTING: FilterSettings): void {//UB:applyFilterPart. //ObjectFilter\r\n\t\t// Kunne vi dele denne?\r\n\r\n\r\n\t\t// Why is 'isLocked' not part of this?\r\n\r\n\t\t// Most of this belongs to C#FilterSettingsDto:\r\n\t\tif (filterSETTING.selectedSortingOption) {\r\n\t\t\t//TODO - Check what typing filterSETTING.selectedSortingOption is and do a typeof check to remove the strict mode warning.\r\n\t\t\tfilter.selectedSortingOption = (ObjectValues.sortingMethods)[filterSETTING?.selectedSortingOption];\r\n\t\t}\r\n\t\tif (filterSETTING.selectedComparisonOption) {\r\n\t\t\t//TODO - Check what typing filterSETTING.selectedComparisonOption is and do a typeof check to remove the strict mode warning.\r\n\t\t\tfilter.selectedComparisonOption = (ObjectValues.comparisonMethods)[filterSETTING.selectedComparisonOption];\r\n\t\t}\r\n\t\tfilter.value = filterSETTING.value;\r\n\t\tfilter.hide = filterSETTING.hide;\r\n\t}\r\n\r\n\t//IF THIS RETURNS NOTHING, I.E. THIS.SAVEDFILTERGROUPS = [], THEN COMBINED FILTERS WON'T WORK. INTENTIONAL?\r\n\tprivate async getFilterGroups(): Promise {//UB:activate.\r\n\t\t// Denne giver os FilterGroupDto[]:\r\n\r\n\t\tlet selCombined: ICombinedFilter | null = this.appContext.getCombinedFilter();\r\n\t\tif ( selCombined !== null && selCombined != undefined) {\r\n\t\t\tif (selCombined.name != undefined) {\r\n\t\t\t\tthis.selectedCombinedName = selCombined.name; //Was this before: this.appContext.getSelectedGrouping().name\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.savedFilterGroups = [];\r\n\t\tthis.savedFilterGroups = await this.apiClient.project(this.appContext.projectId).get(\"Filter/GetFilterGroups\")\r\n\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), this.i18n.tr('Error_Message_Generic'))\r\n\t\t\t.jsonResult();\r\n\t}\r\n\r\n\tprivate async bp_getSavedFilters(): Promise { // UB: deleteFilter, activate, and openFilterSelector. It's sort of a 're-init'.\r\n\t\t// bp_getFilters giver os FilterDto[]:\r\n\t\tlet selFilter:FilterDto | null = this.appContext.getSelectedFilter();\r\n\t\tif (selFilter !== null && selFilter != undefined) {\r\n\t\t\tlet filterName: string | undefined = this.appContext.getSelectedFilter()?.name;\r\n\t\t\tif (filterName) {\r\n\t\t\t\tthis.setSelectedFilterName(filterName);//in-getFilters.\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.savedFilters = []; // (Then it's cleared, even if next call fails.)\r\n\t\tthis.savedFilters = await this.apiClient.project(this.appContext.projectId).get(\"Filter/GetFilters\")\r\n\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), this.i18n.tr('Error_Message_Generic'))\r\n\t\t\t.jsonResult();\r\n\t}\r\n\r\n\r\n\tasync bp_selectNewFilter(filterToSelect: FilterDto): Promise { //// called by bp-activate and bp-deleteFilter.\r\n\t\tconsole.log(\"bp_selectNewFilter \", filterToSelect);\r\n\t\tthis.objects?.reset();//This call is likely not ideal but does solve the issue of columns missing data switching between filters.\r\n\t\tthis.appContext.setSelectedFilter(filterToSelect, ' in BP.applyFilter, passed filter to apply.');\r\n\t\tif (filterToSelect.id) {\r\n\t\t\tthis.storeLastUsedFilter(filterToSelect.id);\r\n\t\t\tawait this.activateFilter();\r\n\t\t}\r\n\t}\r\n\t\r\n\tasync storeLastUsedFilter(id: string) { await this.setProjectSetting(SettingNames.lastAppliedFilters, id); }\r\n\r\n async setProjectSetting(settingName: string, value:string) { \r\n let path = `Setting/AddUserSetting/${this.projectId}/${settingName}`;\r\n this.apiClient.system.postJson(path, value).noResponse(); \r\n } // fixme, we should check what happens if 'noResponse' fails!\r\n\r\n\r\n\tasync bp_applyFilter_impl(): Promise { // called by bp-activate and bp-deleteFilter.\r\n\t\tlet selectedFilter: FilterDto | null = this.appContext.getSelectedFilter();\r\n\t\tif (!selectedFilter) {\r\n\t\t\tconsole.warn('bp_applyFilter_impl saw no selectedFilter?');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.setSelectedFilterName(selectedFilter.name);//bp_applyFilter_impl\r\n\r\n\r\n\t\tconsole.log('bp_applyFilter_impl', selectedFilter?.name);\r\n\t\tif (selectedFilter.id) {\r\n\t\t\tlet combinedFilter: ICombinedFilter = { \r\n\t\t\t\tprojectId: selectedFilter.projectId,\r\n\t\t\t\tfilterId: selectedFilter.id, // THIS HAS EFFECT..\r\n\t\t\t\tid: selectedFilter.id, \r\n\t\t\t\tgroupingId: \"\",\r\n\t\t\t\tname: selectedFilter.name, //\"\", \r\n\t\t\t\tuserId: \"\"\r\n\t\t\t};\r\n\t\t\t// determine_ActiveFilters populates objects.columns.selected:\r\n\t\t\tawait this.determine_ActiveFilterColumns(combinedFilter); // NB, it is combinedFilter.filterId that actually has effect..??\r\n\t\t}\r\n\r\n\t\t// OLM.applyFilters activates the ACTIVE FILTERS (now present in e.g. objects.columns.selected)\r\n\t\t// into the active columns and shownItems on the object grid. \r\n\t\tawait this.objects?.apply_ActiveFilters('BP.bp_applyFilter'); // in bp.impl_applyFilter, which is called by bp.activate.;\r\n\t\tthis.doFixedColumns_work(); // must be done just after apply_ActiveFilters.\r\n\t}\r\n\r\n\tdoFixedColumns_work():void {\r\n\t\t/* It is unclear exactly what was intended here,\r\n\t\tapart from that it should happen at the point-in-time when the columns have been configured (ie after apply_ActiveFilters.)\r\n So we stow it away here: */\r\n\t\tthis.resetFixedColumns(); // Det er uklart hvorfor dette skulle være nødv.\r\n\t\tsetTimeout(() => {\r\n\t\t\tthis.setCSS_LeftOnStickyColumns(); // agerer på DOM elementerne, ud fra hvor 'data-sticky' er sat.\r\n\t\t}, 0);\r\n\t}\r\n\r\n\t/* Det er egentlig denne, der opsætter columns.selected og this.available. \r\n\tDet her er ogsaa noget maerkeligt noget..\r\n\t* Der sendes et combinedFilter med ind, men det eneste der bruges herinde,\r\n\t* er jo combinedFilter.filterId??\r\n\t* Saa der er ikke rigtig nogen mening-logik i, at sende hele det objekt ind?\r\n\t* Lige saa maerkeligt er, at dem der kalder, \r\n\t* allerede HAR fremfundet den filterDto det handler om..\r\n\t* Saa der er ringe grund til, at koden nedenfor igen slaar den op, i savedFilters, IGEN?\r\n\t*/\r\n\r\n\tprivate async determine_ActiveFilterColumns(SAVED_combinedFilter:ICombinedFilter): Promise { // UB loadCombinedFilter\r\n /* both of these\r\n\t\t - reset and select -\r\n\t\tare what promotes our ValueFilter's\r\n\t\tto bastard ObjectFilters.\r\n\t\t*/\r\n\r\n\t\t/* First, ensure all applicable filter-columns are back in AVAILABLE,\r\n\t\tand that selected filter-columns are cleared:\r\n\t\t*/\r\n\t\tawait this.resetAVAILABLE_Filters();\r\n\t\t// Then, transfer the SAVED filterColumns from available into SELECTED:\r\n\t\tthis.select_SAVEDFILTER_columns(SAVED_combinedFilter);\t\t\r\n\t}\r\n\r\n\tprivate async resetAVAILABLE_Filters(): Promise {\r\n\t\tif (this.objects) {\r\n\t\t\tlet leftAvailable: ValueFilter[] = await this.objects.columns.getAvailableFiltersByAppliedFilters('bp');\r\n\t\t\tthis.available = ObjectListColumnManager.valueFilter2UIFilter(leftAvailable);\r\n\t\t\tthis.available = Array.from(new Set(this.available));//applyFilterPart, Remove potential duplicates from available\r\n\t\t\t\r\n\t\t\tthis.invalidFilters_unused = [];\r\n\t\t\tthis.available = [...this.available, ...this.objects.columns.selected];//in-resetAVAILABLE_Filters.\r\n\t\t\tthis.objects.columns.selected = [];//in-resetAVAILABLE_Filters.\r\n\t\t\t\r\n\t\t\t// This is actually what promotes our ValueFilters to 'objectFilters':\r\n\t\t\tthis.resetAVAILABLEFilterSettings();//in-resetAVAILABLE_Filters.\t\t\r\n\t\t}\r\n\t}\r\n\r\n\tselect_SAVEDFILTER_columns(combinedFilter: ICombinedFilter):void { // UB:determine_ActiveFilters \r\n\t\tif (this.savedFilters !== null) { \r\n\t\t\tlet savedSETTINGS: FilterDto | undefined = this.savedFilters.find((f: FilterDto) => f.id === combinedFilter.filterId);\r\n\t\t\tif (savedSETTINGS) {\r\n\t\t\t\tfor (let setting of savedSETTINGS.filters) { this.applySavedFilterColumnSETTING(setting); }\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/* Der er noget assymmetri at forstaa her:\r\n\tsimple kolonner vandrer mellem available og selected.\r\n\tMen groupedfilters befinder sig stedse i grouped?\r\n\tMåske skal man bare tænke på grouped som 'selectedGroups' ?\r\n\t(ie at både selected og grouped er 'selected').\t\t\r\n\t\t- se evt applyFilterGroupPart.\r\n\tHvem fylder iøvrigt grouped op?\r\n\t*/\r\n\r\n\t/* Jeg ville hellere, at disse var skrevet som finds,\r\n\tder lavede transfer HVIS der var et match.\r\n\t*/\r\n\tapplySavedFilterColumnSETTING(savedSetting:FilterSettings): void {//UB:select_SAVEDFILTER_columns\r\n\t\tif (this.objects) {\r\n\r\n\t\t\tlet groupedFilter:UIValueFilter | undefined = this.objects?.columns?.grouped?.find((g: UIValueFilter) => g.name === savedSetting.name);\r\n\t\t\tif (groupedFilter) {\r\n\t\t\t\tthis.configureSelectedColumn(groupedFilter, savedSetting);//in-applySavedFilterColumnSETTING\r\n\t\t\t} // beware that grouped fields ALSO transfer to selected!\r\n\t\t}\r\n\r\n\t\t//this.objects.columns.grouped.forEach(groupedFilter => {\r\n\t\t//\tif (Boolean(groupedFilter.name === savedSetting.name)) {\r\n\t\t//\t\tthis.configureSelectedColumn(groupedFilter, savedSetting);\r\n\t\t//\t}\r\n\t\t//});\r\n\r\n\t\tlet columnFilter:UIValueFilter | undefined = this.available.find((a: UIValueFilter) => a.name === savedSetting.name);\r\n\t\tif (columnFilter) {\r\n\t\t\tthis.configureSelectedColumn(columnFilter, savedSetting);//in-applySavedFilterColumnSETTING\r\n\t\t}\r\n\r\n\t\t//this.available.forEach( (availFilterCOLUMN:UIValueFilter) => {\r\n\t\t//\t// (This is just a name-match, so we can very well include an instance-source and a type-source, that both match same Name in the ObjectFilter.)\r\n\t\t//\tif (Boolean(availFilterCOLUMN.name === savedSetting.name)) {\r\n\t\t//\t\tthis.configureSelectedColumn(availFilterCOLUMN, savedSetting);\r\n\t\t//\t}\r\n\t\t//});\r\n\r\n\t\t/* JG: I would have LOVED to use a 'local matched' boolean here for this check,\r\n\t\tbut unfortunately it seems to check something else:\r\n\t\t objects.columns.grouped seems to only be populated by 'loadCombinedFilter', or rather,\r\n\t\tin the special circumstances when loadCombinedFilter is called.\r\n\t\tIE, when loadCombinedFilter is NOT called, columns.grouped will not have any data for us.\r\n\t\tAs such, I don't really yet understand the sanity-check that triggers invalidFilters_unused.\r\n\t\t*/\r\n\r\n\t\tif ( !this.objects?.columns.selected.map((x: UIValueFilter) => x.name).includes(savedSetting.name)//-applySavedFilterColumnSETTING\r\n\t\t\t&& !this.objects?.columns.grouped?.map( (x: UIValueFilter) => x.name).includes(savedSetting.name)) {\r\n\t\t\tthis.invalidFilters_unused.push(savedSetting);\r\n\t\t}\r\n\t}\r\n\r\n\tconfigureSelectedColumn(column:UIValueFilter, columnSettings:FilterSettings): void {\r\n\t\tthis.transferFilterSettings(column, columnSettings);\r\n\t\tthis.addSelectedFilterColumn(column);//in-configureSelectedColumn\r\n\t} // NB, addSelectedFilterColumn is idempotent, or rather, it doesn't transfer if stuff has already been transferred.\r\n\r\n\r\n\r\n\r\n\tprivate resetFixedColumns(): void { // UB: applyFilter.\r\n\t\t/* Jeg forstår grundlæggende ikke meningen med denne metode..?\r\n\t\tDet ser ud til, at det er en slags \"førstegangs-tom-initialisering\" ?\r\n\t\tDerudover ser det ikke ud til at blive gemt nogetsteds?\r\n\r\n\t\t Det jeg ikke forstår, er hvad for noget state det skal forestille at cleare..\r\n\t\tHvor ville denne \"satte state\" (som vi formodes at skulle cleare..?) KOMME FRA?\r\n\t\t*/\r\n\t\t/*\r\n\t\t\tVed klik på hængelåsene bliver columns låst. Denne metode bliver nu brugt, til at\r\n\t\t\tlåse cellerne op i det vi skifter objects.mode tilbage ObjectListValues.grid efter brugeren har befundet sig\r\n\t\t\ti et andet grid mode.\r\n\t\t\tFixedColumns listen er nok en måde at sikre sig at name kolonnen bliver fixed hvis andre\r\n\t\t\tkolonner er låst, altså at listen er større end 0. - Dette er blevet ændret således der kun kigges på\r\n\t\t\tom isNameColumnFixed.\r\n\t\t*/\r\n\t\t// this.objects.fixedColumns = [];// in BP.resetFixedColumns. Weird, seems to only be set by dialog?\r\n\t\tif (this.objects) {\r\n\t\t\tthis.objects.isNameColumnFixed = false;\r\n\t\t\tthis.objects.shownColumnHeaders.forEach((element: ShownColumnHeaderIF) => element.isFixedColumn = false);\r\n\t\t\tthis.objects.shownColumns.forEach((element: UIValueFilter) => element.isFixedColumn = false);//in-resetFixedColumns.\r\n\t\t\tconsole.log(this.objects);\r\n\t\t}\r\n\t}\r\n\r\n\tsetCSS_LeftOnStickyColumns(): void {\r\n\t\t// Remove left-'pins' from all that don't have data-sticky:\r\n\t\tlet nonStickyElements = document.querySelectorAll('[data-sticky=false]');\r\n\t\tnonStickyElements.forEach((x: HTMLElement) => {\r\n\t\t\tx.style.left = \"\";\r\n\t\t});\r\n\t\t\r\n\t\t// Pin left-pos on all that HAVE data-sticky:\r\n\t\tlet stickyElements = document.querySelectorAll('[data-sticky=true]');\r\n\t\tstickyElements.forEach((x: HTMLElement) => {\r\n\t\t\tlet clientRect: DOMRect = x.getBoundingClientRect();\r\n\t\t\t//IF SCROLLING ON FIXED COLUMNS DOES NOT WORK, MAYBE IT IS DUE TO A CHANGE IN PADDING OR MARGIN OF THE GRID. This can be changed here.\r\n\t\t\tlet left: number = clientRect.left - (this.navCollapsed ? (50+2) : (275+2)); //275px, 50px = navwidth, 2px = padding\r\n\t\t\tx.style.left = left + \"px\";\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteFilter(filter: FilterDto): void { // (UI button handler, see building-parts.html)\r\n\t\tthis.modal.OpenConfirm(\r\n\t\t\tthis.i18n.tr('Delete'),\r\n\t\t\tthis.i18n.tr('Are you sure you want to delete the filter \"') + filter.name + '\"?'\r\n\t\t ).whenClosed((x: DialogCloseResult) => {\r\n\t\t\tif (!x.wasCancelled) {\r\n\t\t\t this.apiClient.project(this.appContext.projectId).postJson('Filter/DeleteFilter', filter.id)\r\n\t\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), this.i18n.tr('Error_Message_Generic'))\r\n\t\t\t\t.jsonResult()\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t this.bp_getSavedFilters();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t }).finally(() => {\r\n\t\t\t if (filter === this.appContext.getSelectedFilter()) { \r\n\t\t\t\t let theDefaultFilter:FilterDto | null = this.appContext.getDefaultFilter();//in-deleteFilter\r\n\t\t\t\t if (theDefaultFilter === null) {\r\n\t\t\t\t\t this.setSelectedFilterName(\"View\");//in-deleteFilter.\r\n\t\t\t\t } else {\r\n\t\t\t\t\t this.bp_selectNewFilter(theDefaultFilter); // in deleteFilter\r\n\t\t\t\t }\r\n\t\t\t }\r\n\t\t });\r\n\t}\r\n\r\n\tasync showMenuItems(event: Event): Promise {\r\n\t\tlet actions = [\r\n\t\t\t{ viewKey: \"button\", setup: { textKey: \"Import from Excel\", icon:\"fa-solid fa-file-import\", actionKey: \"importFromExcel\", service: {importFromExcel: () => { this.openImportModal() }}}},\r\n\t\t\t{ viewKey: \"button\", setup: { textKey: \"Export to Excel\", icon:\"fa-solid fa-file-export\", actionKey: \"exportToExcel\", service: {exportToExcel: () => { this.exportToExcel() }}}},\r\n\t\t\t{ viewKey: \"button\", setup: { textKey: \"Export to JSON\", icon:\"fa-solid fa-file-export\", actionKey: \"exportToJson\", service: {exportToJson: () => { this.exportToJson() }}}},\r\n\t\t\t{ viewKey: \"button\", setup: { textKey: \"Export keynote\", icon:\"fas fa-sticky-note\", actionKey: \"exportKeynote\", service: {exportKeynote: () => { this.exportKeynote() }}}},\r\n\r\n\t\t\t{ viewKey: \"button\", setup: { textKey: \"Auto Identification Tool\", icon:\"fa-solid fa-hashtag\", actionKey: \"autoIDs\", service: {autoIDs: () => { this.serialNumbers() }}}},\r\n\t\t\t{ viewKey: \"button\", setup: { textKey: \"Compound Values Tool\", icon:\"fa-solid fa-merge\", actionKey: \"compoundValues\", service: {compoundValues: () => { this.compoundValues() }}}},\r\n\r\n\t\t\t{ viewKey: \"line\", setup: {}},\r\n\t\t\t{ viewKey: \"button\", setup: { textKey: \"Indented tree grid view\", icon:\"fa fa-stream\", actionKey: \"showAsTreeGrid\", service: {showAsTreeGrid: async () => { await this.selectTableView(ObjectListValues.treeGrid) }}}},\r\n\t\t\t{ viewKey: \"button\", setup: { textKey: \"Tree list view\", icon:\"fa fa-align-left\", actionKey: \"showAsTreeList\", service: {showAsTreeList: async () => { await this.selectTableView(ObjectListValues.treeList) }}}},\r\n\t\t\t{ viewKey: \"button\", setup: { textKey: \"Flat grid view\", icon:\"fa fa-table\", actionKey: \"showAsListGrid\", service: {showAsListGrid: async () => { await this.selectTableView(ObjectListValues.grid) }}}},\r\n\t\t\t{ viewKey: \"button\", setup: { textKey: \"Flat multiline grid view\", icon:\"fa-regular fa-table-columns\", actionKey: \"showAsListGrid\", service: {showAsListGrid: async () => { await this.selectTableView(ObjectListValues.grid,true) }}}},\r\n\r\n\t\t];\r\n this.contextMenuService.open(event, actions,\"left-start\", true);\r\n\t}\r\n\t\r\n\tpublic async exportToJson(): Promise {\r\n\t\tif (this.objects?.mode !== ObjectListValues.grid) {\r\n\t\t\tthis.modal.OpenMessage(\"Choose grid view\", \"Please set up a grid view to export.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this.objects) {\r\n\t\t\tlet gridDto: GridDto = new GridDto();\r\n\t\t\tgridDto.includeTypes = true;\t\t// Not used\r\n\t\t\tgridDto.includeInstances = true;\t// Not used\r\n\r\n\t\t\tgridDto.filters = this.objects.columns.OFS_service.mapToQUERY_Filters(this.objects.columns.applied);\r\n\t\t\tgridDto.headerColumns = this.findHeaderColumns(gridDto);\r\n\t\t\tthis.logHeadersVersusFilters(gridDto);\r\n\r\n\t\t\tgridDto.parameterDefinitionIds = this.objects.columns.columnParameterDefinitionMetadata.map(x => x.id); //Instances are collected on the server if necessary\r\n\r\n\t\t\tlet project = await this.apiClient.project(this.appContext.projectId).get(\"Project/GetProject\").handleErrorUsingReason(\"Get Project failed\").jsonResult();\r\n\r\n\t\t\tawait this.apiClient.project(this.appContext.projectId)\r\n\t\t\t\t.postJson(\"SigmaIntegration/ExportGrid\", gridDto)\r\n\t\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), this.i18n.tr('Error_Message_Generic'))\r\n\t\t\t\t.downloadFile(`${project.name}.json`);\r\n\t\t}\r\n\t}\r\n\t\r\n\t///////////////////////EXCEL EXPORT-IMPORT ////////////////////////////////////////////////////////////\r\n\r\n\tpublic exportToExcel(): void { // (UI button handler.)\r\n\t\tif (this.objects?.mode !== ObjectListValues.grid) {\r\n\t\t\tthis.modal.OpenMessage(\"Choose grid view\", \"Please set up a grid view to export.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.modal.OpenModal(ExportGrid).whenClosed(async (x: DialogCloseResult) => {\r\n\t\t\tif (!x.wasCancelled && this.objects) {\r\n\t\t\t\tlet gridDto: GridDto = new GridDto();\r\n\t\t\t\tgridDto.includeTypes = x.output.includeTypes;\r\n\t\t\t\tgridDto.includeInstances = x.output.includeInstances;\r\n\r\n\t\t\t\tgridDto.filters = this.objects.columns.OFS_service.mapToQUERY_Filters(this.objects.columns.applied); \r\n\t\t\t\tgridDto.headerColumns = this.findHeaderColumns(gridDto);\r\n\t\t\t\tthis.logHeadersVersusFilters(gridDto);\r\n\t\t\t\t\r\n\t\t\t\tgridDto.parameterDefinitionIds = this.objects.columns.columnParameterDefinitionMetadata.map(x => x.id); //Instances are collected on the server if necessary\r\n\t\t\t\t\r\n\t\t\t\tlet project = await this.apiClient.project(this.appContext.projectId).get(\"Project/GetProject\").handleErrorUsingReason(\"Get Project failed\").jsonResult();\r\n\r\n\t\t\t\tawait this.apiClient.project(this.appContext.projectId)\r\n\t\t\t\t\t.postJson(\"Excel/ExportGrid\", gridDto)\r\n\t\t\t\t\t.handleError(this.i18n.tr('Error_Title_Generic'), this.i18n.tr('Error_Message_Generic'))\r\n\t\t\t\t\t.downloadFile(`${project.name}.xlsx`);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfindHeaderColumns(gridDto: GridDto): HeaderDto[] { // UB: exportToExcel\r\n\t\t/* Here we have a problem, if/when we store an unstored filter, \r\n\t\t * that refers to columns which exist both as instance and type variants:\r\n\t\t * The selected-list suddenly contains both an instance-variant and a type-variant,\r\n\t\t * whereas before, it only contained an instance-variant?\r\n\t\t */\r\n\t\t//let selectedObjFilters:ObjectFilter[] = this.objects.columns.selected;\r\n\t\tlet selectedObjFilters:UIValueFilter[]| undefined = this.objects?.columns.selected;//in-findHeaderColumns(for-excel)\r\n\t\tlet headerDtos: HeaderDto[] | undefined = selectedObjFilters?.map((x: UIValueFilter) => { return { name: x.name, hide: x.hide, targetId: x.targetId }});\r\n\t\treturn headerDtos ? headerDtos : [];\r\n\t}\r\n\r\n\tlogHeadersVersusFilters(gridDto: GridDto): void { // UB: exportToExcel\r\n\t\tconsole.log('#headers:', gridDto.headerColumns.length, '#filters:', gridDto.filters.length);\r\n\t\tlet max: number = Math.max(gridDto.filters.length, gridDto.headerColumns.length);\r\n\r\n\t\tfor (let i = 0; i < max; ++i) {\r\n\t\t\tlet header: HeaderDto = gridDto.headerColumns[i];\r\n\t\t\tlet filter: ObjectFilterDTO = gridDto.filters[i]; \r\n\t\t\tconsole.log('LHVF', i, header.name, \r\n\t\t\t!filter?'':filter.targetType, \r\n\t\t\tfilter, \r\n\t\t\t'hides:', header.hide\r\n\t\t\t);//LOGGING\r\n\t\t}\r\n }\r\n\r\n\topenImportModal(): void { // (UI button handler.) IE UploadExcel.\r\n\t\tthis.modal.OpenModal(FileUpload).whenClosed((x: DialogCloseResult) => {\r\n\t\t\tif (!x.wasCancelled) {\r\n\t\t\t\tthis.doUpload(x.output);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic doUpload(files: FileList): void { // UB: openImportModal, IE UploadExcel.\r\n\t\tlet formData = new FormData();\r\n\r\n\t\tformData.append(this.appContext.projectId, files[0]);\r\n\r\n\t\tconsole.log('doUpload/ImportGrid..');\r\n\t\tthis.apiClient.project(this.appContext.projectId)\r\n\t\t\t.postForm(\"Excel/ImportGrid\", formData)\r\n\t\t\t.handleErrorMsgUsingReason(this.i18n.tr('Error_Title_Generic'), this.i18n.tr('Error_Message_Generic'))\r\n\t\t\t.jsonResult()\r\n\t\t\t.then(receipt => {\r\n\t\t\t\tif (receipt) {\r\n\t\t\t\t\tthis.modal.OpenModal(BuildingPartsReceipt, receipt);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.log('ImportGrid aborted.');\r\n\t\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t///////////////////LCA STUFF ////////////////////////////////////////////////////\r\n\r\n\tpublic async exportToLCA(): Promise { // (UI button handler.)\r\n\t\tlet data: ObjectDetails[] = [];\r\n\t\t\r\n\t\tthis.objects?.shownItems.forEach((el: ObjectRow) => {\r\n\t\t\tif (el.value) {\r\n\t\t\t\tdata.push(el.value);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tlet res = await this.apiClient.project(this.appContext.projectId).get(\"lca/Old_CreateLCAObjects\").jsonResult();\r\n\t\tthis.modal.OpenModal(LCAObjectsOverview, res);\r\n\r\n\t}\r\n\r\n\ttestImportModal(): void {\r\n\t\tthis.apiClient.project(this.appContext.projectId)\r\n\t\t\t.postForm(\"Excel/TestImport\", new FormData())\r\n\t\t\t.handleErrorMsgUsingReason(this.i18n.tr('Error_Title_Generic'), this.i18n.tr('Error_Message_Generic'))\r\n\t\t\t.jsonResult()\r\n\t\t\t.then(response => {\r\n\t\t\t\tconsole.log('TestImport got:', response);\r\n\t\t\t});\r\n\t}\r\n\r\n\t/* \r\n\tJG: Det her kan vi vist løse med dette istedet:\r\n\t@computedFrom https://aurelia.io/docs/binding/computed-properties#introduction\r\n\teller endnu bedre, med noget message/event stuff. aurelia-event-aggregator\r\n\t*/\r\n\tpublic setSelectedFilterName(name:string): void {\r\n\t\t//this.selectedFilterName = 'no matter'; //name;\r\n\t}\r\n\r\n\t//public getSelectedFilterName() {return this.selectedFilterName;}\r\n\r\n}\r\n"],"names":["BuildingPartsComponent","toggleLCAButton","this","appContext","enableLCAByg","constructor","gridFactory","modal","events","apiClient","i18n","contextMenuService","bpVisible","projectId","multilineEnabled","selectedNumberOfLines","appliedNumberOfLines","available","isLoadingViewerElements","savedFilters","savedFilterGroups","combinedFilters","availableCombinedFilters_unused","invalidParameters","invalidFilters_unused","subscriptions","isPrerelease_fix","isPrerelease_lca","navCollapsed","showBimViewerButton","selectedCombinedName","activateCombined","categorySelected","bimViewerService","async","setSelectedFilterName","setProject","activateForProject","params","implActivate","e","console","error","isBuildingPartsVisible","objects","ForAjourCollab_OLB","BuildServerSide","enableValueListColors","initialize","initCategoryContextForFilters","initBimViewerButton","loadAllFilterData","length","activateFilter","getSelectedFilter","log","initSelectedFilterWithLastUsed","selFilter","applyIfNoFilter","showAsListGrid","name","bp_applyFilter_impl","warn","shownItems","sort","a","b","compare","lastUsedFilter","getLastUsedFilter","setDefaultFilter","setSelectedFilter","lastAppliedFilter_path","r_lastUsedFilter","system","get","jsonResult","lastUsedFilter_Id","target","find","x","id","bp_getSavedFilters","getFilterGroups","getCombinedFilters","loadAvailableCombinedFilters","project","handleError","objectResult","path","defCatSetting","columns","setFilterCategoryContext","attached","subscribe","setCSS_LeftOnStickyColumns","payload","data","handleObjectClicked","objectIds","publish","detached","forEach","subscription","dispose","colorLegendService","clearColorInfo","mode","clearGridHighlighting","api","typeIds","postJson","rowsToExpand","findRowsToExpand","expandRows","listOfNewElements","handleItemsToSelect","element","clickedElementId","indexOf","getRowsToExpand","beforeLength","tryShowMoreObjects","afterLength","idsOfFoundTypes","map","idsOfRowsNotFound","filter","includes","push","listOfElementsToRemove","value","ifC_EntityId","isSelected","anyDeselectTypes","selectedItems","isType","toggleSelectedElementsOff","toggleSelectedElementsOn","filterModel","filters","gridMode","OpenModal","FilterSelector","whenClosed","wasCancelled","apply_ActiveFilters","type","isMultiline","switchToGridType","isMulitline","showAsTreeGrid","showAsTreeList","resetFixedColumns","tr","some","groupingId","combinedFilter","filterGroup","groupFilter","applyFilterGroupPart","determine_ActiveFilterColumns","grouped","selected","unshift","mainSearch","OpenMessage","item","OpenConfirm","finally","getCombinedFilter","setCombinedFilter","reset","undefined","groupingFilter","getFilterCategoryContext","valueFilters","getAvailableGroupingFilters","before","Array","from","Set","resetAVAILABLEFilterSettings","foundGroupFilter","parameters","groupParameter","groupParameterFilter","Boolean","addSelectedFilterColumn","setSelectedGrouping","applyGrouping","index","splice","availFilter","isLocked","selectedSortingOption","selectedComparisonOption","hide","groupedFilter","transferFilterSettings","filterSETTING","selCombined","filterName","filterToSelect","storeLastUsedFilter","setProjectSetting","settingName","noResponse","selectedFilter","filterId","userId","doFixedColumns_work","setTimeout","SAVED_combinedFilter","resetAVAILABLE_Filters","select_SAVEDFILTER_columns","leftAvailable","getAvailableFiltersByAppliedFilters","savedSETTINGS","f","setting","applySavedFilterColumnSETTING","savedSetting","g","configureSelectedColumn","columnFilter","column","columnSettings","isNameColumnFixed","shownColumnHeaders","isFixedColumn","shownColumns","document","querySelectorAll","style","left","getBoundingClientRect","deleteFilter","theDefaultFilter","getDefaultFilter","bp_selectNewFilter","event","actions","viewKey","setup","textKey","icon","actionKey","service","importFromExcel","openImportModal","exportToExcel","exportToJson","exportKeynote","autoIDs","serialNumbers","compoundValues","selectTableView","open","gridDto","includeTypes","includeInstances","OFS_service","mapToQUERY_Filters","applied","headerColumns","findHeaderColumns","logHeadersVersusFilters","parameterDefinitionIds","columnParameterDefinitionMetadata","handleErrorUsingReason","downloadFile","output","selectedObjFilters","targetId","max","Math","i","header","targetType","doUpload","files","formData","FormData","append","postForm","handleErrorMsgUsingReason","then","receipt","el","res","testImportModal","response","bindable","observable","autoinject","I18N"],"sourceRoot":""}