{"version":3,"file":"app-fc2c80dc.1907ee5990a773c1.bundle.js","mappings":"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","sources":["webpack://client-app/./src/app/services/object-list/object-list-row.ts","webpack://client-app/./src/app/services/object-list/object-list-server-side.ts"],"sourcesContent":["import {ObjectParameter} from 'app/models/object-parameter';\r\nimport {ObjectDetails} from 'app/models/object-details';\r\nimport {ObjectFilter} from 'app/models/object-filter';\r\nimport Color from \"color\";\r\nimport {IColorLegendService} from \"../color-legend/i-color-legend-service\";\r\n\r\nexport class ObjectRow {\r\n\tpublic get targetType(): string | undefined { return Boolean(this.group.groupingFilter) ? this.group?.groupingFilter?.targetType : \"no targetType\"; }\r\n\r\n private constructor(\r\n\t\tpublic isSelected: boolean,\r\n public readonly id: string,\r\n public readonly name: string,\r\n public value: ObjectDetails | null,\r\n public readonly showCells: boolean,\r\n public readonly isGroup: boolean,\r\n public readonly group: ObjectRowGroup,\r\n\t\tpublic readonly colorLegendService: IColorLegendService){\r\n }\r\n\r\n toggleSelected() {\r\n\t\tconsole.log('toggleSelected', this.isSelected, '->', !this.isSelected);\r\n this.isSelected = !this.isSelected;\r\n }\r\n /*\r\n cellSaved(cell: ObjectRowCell) {\r\n let newValue = Object.assign({}, this.value);\r\n newValue.properties = this.value.properties.filter(x => x.valueId != cell.par.valueId);\r\n newValue.properties.push(cell.getSavedValue());\r\n this.value = newValue;\r\n }\r\n */\r\n\r\n public compare(b: ObjectRow): number | undefined{\r\n //Sort on category\r\n if (this.value && b.value)\r\n if(this.value.categoryName > b.value.categoryName){\r\n return 1;\r\n }else if(this.value.categoryName < b.value.categoryName){\r\n return -1;\r\n }else{\r\n //Then family\r\n if(this.value.familyName > b.value.familyName){\r\n return 1;\r\n }else if(this.value.familyName < b.value.familyName){\r\n return -1;\r\n }else{\r\n //Then type\r\n if(this.value.typeName > b.value.typeName){\r\n return 1;\r\n }else if(this.value.typeName < b.value.typeName){\r\n return -1;\r\n }else{\r\n //then instance\r\n if(this.value.instanceName > b.value.instanceName){\r\n return 1;\r\n }else if(this.value.instanceName < b.value.instanceName){\r\n return -1;\r\n }else{\r\n return 0;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n\t//@computedFrom('colorLegendService.currentColorData')\t// It stopped working... \r\n\tpublic get isColored() : boolean | undefined {\r\n\t\tif (!this.colorLegendService.isDataReady) return false;\r\n\r\n\t\tif (!this.value) return false;\r\n\t\t\t\r\n\t\tlet colorData = this.colorLegendService.currentColorData;\r\n\t\t\r\n\t\tif (colorData?.isCategory) {\r\n\t\t\tlet color: Color | undefined = colorData.colorMap.get(this.value.categoryName);\r\n\t\t\treturn color != undefined;\t// Do we have one color that matches?\r\n\t\t} else if (colorData?.isFamilyName) {\r\n\t\t\tlet color = colorData.colorMap.get(this.value.familyName);\r\n\t\t\treturn color != undefined;\t// Do we have one color that matches?\r\n\t\t} else if (colorData?.isTypeName) {\r\n\t\t\tlet color = colorData.colorMap.get(this.value.typeName);\r\n\t\t\treturn color != undefined;\t// Do we have one color that matches?\r\n\t\t}\r\n\r\n\t\tfor (const property of this.value.properties) {\r\n\t\t\tif (this.isCellCurrentActiveColor(property)) {\r\n\t\t\t\tlet color = colorData?.colorMap.get(property.value);\r\n\t\t\t\treturn color != undefined;\t// Do we have one color that matches?\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//@computedFrom('colorLegendService.currentColorData')\t// It stopped working... \r\n\tpublic get hexColor(): string | null {\r\n\t\tif (!this.isColored) return null;\r\n\r\n\t\tlet colorData = this.colorLegendService.currentColorData;\r\n\t\tlet color: Color | undefined;\r\n if (this.value) {\r\n if (colorData?.isCategory) {\r\n color = colorData.colorMap.get(this.value.categoryName);\r\n }\r\n else if (colorData?.isFamilyName) {\r\n color = colorData.colorMap.get(this.value.familyName);\r\n }\r\n else if (colorData?.isTypeName) {\r\n color = colorData.colorMap.get(this.value.typeName);\r\n }\r\n \r\n for (const property of this.value.properties) {\r\n if (this.isCellCurrentActiveColor(property)) {\r\n color = colorData?.colorMap.get(property.value);\r\n }\r\n }\r\n }\r\n\r\n\t\tif (color == undefined) return null;\r\n\t\treturn color.hex();\r\n\t}\r\n\r\n\tprivate isCellCurrentActiveColor(property: ObjectParameter) {\r\n\t\treturn property.definitionId === this.colorLegendService?.currentColorData?.definitionId;\r\n\t}\r\n\t\r\n\tpublic isType() : boolean {\r\n\t\tif (!this.value) return false;\r\n\t\treturn this.value.instanceId == null;\r\n\t}\r\n\t\r\n\tpublic isInstance() : boolean {\r\n\t\tif (!this.value) return false;\r\n\t\treturn this.value.instanceId != null\r\n\t}\r\n\r\n public static Build(id: string, name: string, value: ObjectDetails, groupingFilter: ObjectFilter, colorLegendService: IColorLegendService): ObjectRow {\r\n //console.log('OLR.Build:, detail:', value);\r\n return new ObjectRow(false, id, name, value, true, true, new ObjectRowGroup(null, 0, groupingFilter), colorLegendService);\r\n }\r\n\r\n public static BuildLeaf(id: string, name: string, value: ObjectDetails, parent: ObjectRow | null, indentation: number, groupingFilter: ObjectFilter, colorLegendService: IColorLegendService): ObjectRow {\r\n\r\n if (parent && parent.value && Boolean(parent) && Boolean(parent.value) && Boolean(parent.value?.properties) && parent.value.properties.length > 0) {\r\n value.properties.push(...parent.value.properties); // Leafs should have parent dynamic properties\r\n }\r\n\r\n return new ObjectRow(false, id, name, value, true, false, new ObjectRowGroup(parent, indentation, groupingFilter), colorLegendService);\r\n }\r\n\r\n public static BuildGroup(id: string, name: string, showCells: boolean, parent: ObjectRow | null, indentation: number, groupingFilter: ObjectFilter | null, colorLegendService: IColorLegendService): ObjectRow {\r\n return new ObjectRow(false, id, name, null, showCells, true, new ObjectRowGroup(parent, indentation, groupingFilter), colorLegendService);\r\n }\r\n}\r\n\r\nexport class ObjectRowCell { \r\n public objectCell: ObjectCell;\r\n\t\r\n\t// The color that that corresponds to a potential value item. Null if not a value list item value.\r\n\tpublic itemColor : Color | null = null;\r\n\t\r\n constructor(public readonly par: ObjectParameter, \r\n\t\t public readonly columnFilter:ObjectFilter, \r\n\t\t\t\tpublic readonly canEdit:boolean\r\n ) {\r\n\t\tthis.objectCell = new ObjectCell(par.elementId, par.definitionId, par.valueId, par.value, columnFilter.targetType, par.value, canEdit, par.dvalue); \r\n this.objectCell.reset();\r\n }\r\n public get columnTargetType(): string { return this.columnFilter.targetType; }\r\n\t\r\n public dispValue():string {\r\n let pv:ObjectParameter = this.par;\r\n return pv.dvalue ? pv.dvalue : pv.value;\r\n }\r\n \r\n public getSavedValue(): ObjectParameter {\r\n return { \r\n elementId: this.par.elementId, \r\n definitionId: this.par.definitionId,\r\n valueId: this.par.valueId, \r\n value: this.objectCell.newValue ? this.objectCell.newValue : \"\", \r\n dvalue: this.objectCell.newValue ? this.objectCell.newValue : \"\" // display-value-danger.\r\n };\r\n }\r\n}\r\n\r\nexport class ObjectCell {\r\n\tpublic elementId: string; // kan vaere PrjRevitTypeId og PrjInstanceId, afh. af raekkeTypen.\r\n\tpublic definitionId: string; // kan ogsaa vaere catId, famId, og prjRevitTypeId (ie ikke altid definitionId..)\r\n\tpublic valueId: string;\r\n\r\n\tpublic value: string;//hvem opdaterer denne - aurealia måske?\r\n public dvalue2: string;\r\n\r\n\tpublic columnTargetType: string;\r\n\tpublic newValue: string | undefined;\r\n\tpublic isEditing: boolean = false;\r\n\tpublic isSimpleValue: boolean = true;\r\n\tpublic isMultiline: boolean = false;\r\n\tpublic canEdit: boolean;\r\n\r\n\tconstructor(elementId: string, definitionId: string, valueId: string | undefined, value: string, columnTargetType: string, newValue: string, canEdit: boolean, dvalue2:string) {\r\n\t\tthis.elementId = elementId;\r\n\t\tthis.definitionId = definitionId;\r\n /* If no valueId exists, it here needs to become an empty string, instead of undefined.\r\n\t\t * Ideally we would change this value to allow for undefined, and further handle whichever\r\n * errors this might give. But for now the value will be an empty string.\r\n * This way of setting a string to empty is used various places in the code.\r\n */\r\n this.valueId = valueId != undefined ? valueId : \"\";\r\n\t\tthis.value = value;//in-ObjectCell.ctor\r\n this.dvalue2 = dvalue2;\r\n\t\tthis.columnTargetType = columnTargetType;\r\n\t\tthis.newValue = newValue;\r\n\t\tthis.canEdit = canEdit;\r\n\t}\r\n\r\n public dispValue2():string {\r\n return this.dvalue2?this.dvalue2:this.value;//in-ObjectCell.dispValue2 \r\n }\r\n\r\n\tpublic get isNewParameterValue(): boolean { return !Boolean(this.valueId); }\r\n\r\n\tpublic reset() {\r\n\t\tthis.newValue = this.value;//in-ObjectCell.reset.\r\n\t\t// console.log('reset, isEditing <- false.')\r\n this.isEditing = false;\r\n\t}\r\n\t\r\n\tpublic tryEdit(): boolean {\r\n \tif (this.canEdit) {\r\n\t\t\t// console.log('tryEdit, isEditing <- true.')\r\n this.isEditing = true;\r\n\t\t}\t\t\r\n return this.isEditing;\r\n }\r\n}\r\n\r\nclass ObjectRowGroup {\r\n // merge with row\r\n public isExpanded: boolean = false;\r\n public children: ObjectRow[] = [];\r\n constructor( \r\n public readonly parent: ObjectRow | null,\r\n public readonly indentation: number,\r\n public readonly groupingFilter: ObjectFilter | null){\r\n\r\n }\r\n public getContentFilters(): ObjectFilter[] | undefined{\r\n let filters: ObjectFilter[] | undefined = Boolean(this.parent) ? this.parent?.group.getContentFilters() : [];\r\n if(this.groupingFilter && filters && Boolean(this.groupingFilter)){\r\n filters.push(this.groupingFilter);\r\n }\r\n return filters;\r\n }\r\n collapse(): number{\r\n let nrOfChildren = this.children.length;\r\n this.children.forEach(x => {\r\n if(x.isGroup)\r\n nrOfChildren += x.group.collapse();\r\n }); \r\n this.children = [];\r\n this.isExpanded = false;\r\n return nrOfChildren;\r\n }\r\n}\r\n","import { AomObjectParameterService } from './../object-services/aom-object-parameter-service';\r\nimport { ObjectListColumnManager } from './object-list-column-manager';\r\nimport { ObjectParameterService } from '../object-services/object-parameter-service';\r\nimport { FilterUserSettings, ObjectFilter, UIValueFilter, ValueFilterUI2 } from 'app/models/object-filter';\r\nimport { ObjectDetails } from 'app/models/object-details';\r\nimport { ObjectDetailService } from 'app/services/object-services/object-detail-service';\r\nimport { ObjectListSource } from \"./object-list-source\";\r\nimport { ObjectValues } from 'app/models/object-values';\r\nimport { ObjectListValues } from './object-list-manager';\r\nimport { ObjectFilterService } from '../object-services/object-filter-service';\r\nimport { ObjectRow, ObjectCell } from './object-list-row';\r\nimport {ObjectDisplayUnits} from \"../../models/object-display-units\";\r\nimport { IdNamePair } from 'app/models/idNamePair';\r\nimport {ColorLegendService} from \"../color-legend/color-legend-service\";\r\nimport {EventAggregator} from \"aurelia-event-aggregator\";\r\nimport { ObjectParameter } from 'app/models/object-parameter';\r\n//import { threadId } from 'worker_threads';\r\n\r\nexport class ObjectListServerSide implements ObjectListSource {\r\n /* JG, intro to ObjectListSource:\r\n It handles 2-3 things:\r\n (1) it has/is an internal(private) source of OBJECT_DETAILS, \r\n which is our 'domain entities' (the data model entitities),\r\n which our grid wants to visualize.\r\n (2) it is a (public) source of ObjectRows, which it builds\r\n from the ObjectDetails.\r\n (3) it can provide ObjectRows in two ways\r\n - either as top/rootlevel ObjectRows,\r\n - OR as child-ObjectRows inside the root/parent ObjectRows.\r\n\r\n However, it only acts as a 'stream', it does not HOLD the ObjectRows .\r\n Instead, the consumer of OLS - the OLM (objectListManager) HOLDS the O-R's.\r\n Further, the children are held inside parent ObjectRows.\r\n\r\n Finally, note that ObjectRows know their ObjectDetail source,\r\n through the badly named field 'value'. \r\n\r\n Note \r\n */\r\n\r\n private nrOfInsertedDescendants: number = 0; // This is used to adjust index/rootIx in getMoreRows (JG: My guess).\r\n private noMoreItemsInList: boolean = false;\r\n private nrOfRowsToLoad: number = -1;\r\n private listMode: string = \"\";\r\n public cellUpdateTrigger: number = 0; // hvad bruges disse til?\r\n\r\n\tconstructor(\r\n\t\tprivate useInstanceLevel: boolean,\r\n\t\tprivate columns: ObjectListColumnManager,\r\n\t\tprivate objectService: ObjectDetailService,\r\n\t\tprivate filterService: ObjectFilterService,\r\n\t\tprivate parameterService: ObjectParameterService, \r\n\t\tprivate colorLegendService: ColorLegendService,\r\n\t\tprivate events: EventAggregator) {\r\n\t}\r\n\r\n\tpublic getObjectDetailService(): ObjectDetailService { return this.objectService; }\r\n\r\n public setup(listMode: string, nrOfRowsToLoad: number): void {\r\n this.listMode = listMode;\r\n this.nrOfRowsToLoad = nrOfRowsToLoad; // (at-a-time.)\r\n this.reset();\r\n }\r\n \r\n public incrementCellUpdateTrigger(){\r\n this.cellUpdateTrigger++;\r\n }\r\n\r\n public reset(): void {\r\n this.noMoreItemsInList = false;\r\n this.nrOfInsertedDescendants = 0;\r\n }\r\n\r\n private async getTypes(who:string, filters: ObjectFilter[], index: number, nr: number): Promise {\r\n let types:ObjectDetails[] = await this.objectService.queryObjectTypes('GT'+who, index, nr, filters);\r\n console.log('getTypes,', who, ',index:', index, ',got#:', types.length);\r\n if (types.length == 0) {\r\n console.log('getTypes skips out, as got 0 new items.');\r\n return types;\r\n }\r\n await this.parameterService.reloadTypeParamVALUES(types, filters, 'getTypes');\r\n return types;\r\n }\r\n \r\n\tprivate async getTypeDisplayUnits(typeIds: ObjectDetails[], logUnits:boolean): Promise {\r\n return await this.parameterService.getTypeDisplayUnits(typeIds, logUnits);\r\n\t\t/* NB, denne findes vist ikke under api/system/ObjectParameter/GetTypeDisplayUnits\r\n\t\t * ObjectParameter/GetTypeDisplayUnits\r\n\t\t * Saa hvad har vi af disse?\r\n\t\t * Hvis vi k'rer system-mode, skal vi istedet ha fat i nogen globale units.\r\n\t\t */\r\n }\r\n\r\n private async getInstances(filters: ObjectFilter[], index: number, nr: number): Promise {\r\n let instances = await this.objectService.queryObjectInstances(index, nr, filters);\r\n await this.parameterService.setInstanceParameters(instances, filters, 'gi');\r\n return instances;\r\n }\r\n\r\n private async getFamilies(filters: ObjectFilter[], index: number, nr: number): Promise {\r\n // (Beware: the objectDetails returned here, are FAMILY LEVEL, \r\n // so the typeInfo fields will be filled out with empty/null values.)\r\n console.log('calling getFamilies..'); \r\n let objDetails:ObjectDetails[] = await this.objectService.queryObjectFamilies(index, nr, filters);\r\n console.log('getFamilies array result, #', objDetails.length, objDetails);\r\n console.log('getFamilies, first item:', objDetails[0]);\r\n if (objDetails) {\r\n }\r\n return objDetails;\r\n }\r\n\r\n async getMoreRows(who:string, fromIndex_: number): Promise {\r\n // (JG: This would be more aptly named 'getMore_TOPLEVEL_rows()'.)\r\n\r\n if (this.noMoreItemsInList) { return undefined; } \r\n\r\n // so, we HAVE more-Items-in-list:\r\n let ADJ_ROOTLEVEL_INDEX = (fromIndex_ - this.nrOfInsertedDescendants);//adjusting index in getMoreRows. // JG: does this mean, it is the 'root-rows-index' ?\r\n // (JG: I wonder, if this wasn't better kept as two separate values which were added together when necessary? That way, one can't contaminate the other?)\r\n let detailsResult = new Array();\r\n let rowResult = new Array();\r\n console.log(`GMR-${who}, Lmode:`, this.listMode, ', index:', ADJ_ROOTLEVEL_INDEX);\r\n\r\n if (this.listMode === ObjectListValues.deck) {\r\n // Beware: The ObjectDetails retrieved here, are FAMILY LEVEL, and thus contain empty/null typeInfo!\r\n detailsResult = await this.getFamilies(this.columns.applied, ADJ_ROOTLEVEL_INDEX, this.nrOfRowsToLoad);\r\n let staticFilterTemplate: UIValueFilter | undefined = this.columns.staticFilters.find(x => x.targetType == ObjectValues.targetTypes.type);\r\n detailsResult.forEach( (x:ObjectDetails) => {\r\n if (staticFilterTemplate) {\r\n let groupingFilter:ObjectFilter = this.buildFilterTemplateInstance(staticFilterTemplate, x.familyId, x.familyName);\r\n rowResult.push(ObjectRow.Build(x.familyId, x.familyName, x, groupingFilter, this.colorLegendService));\r\n }\r\n });\r\n }\r\n\r\n if (this.listMode === ObjectListValues.grid) {\r\n //console.log('GMR (ObjectListColumnManager) this.columns(OLCM):', this.columns);\r\n console.log('GMR this.columns.applied:', this.columns.applied);\r\n detailsResult = await this.getTypes('GMR'+who,this.columns.applied, ADJ_ROOTLEVEL_INDEX, this.nrOfRowsToLoad);\r\n let staticFilterTemplate = this.columns.staticFilters.find(x => x.targetType == ObjectValues.targetTypes.type);\r\n // ToDo If AO add types as leaf else group\r\n detailsResult.forEach(x => {\r\n if (staticFilterTemplate) {\r\n let groupingFilter: ObjectFilter = this.buildFilterTemplateInstance(staticFilterTemplate, x.typeId, x.typeName);\r\n if (this.useInstanceLevel)\r\n rowResult.push(ObjectRow.Build(x.typeId, x.typeName, x, groupingFilter, this.colorLegendService));\r\n else\r\n rowResult.push(ObjectRow.BuildLeaf(x.typeId, x.typeName, x, null, 0, groupingFilter, this.colorLegendService));\r\n }\r\n });\r\n }\r\n\r\n this.noMoreItemsInList = this.columns.useGrouping && detailsResult.length < this.nrOfRowsToLoad;\r\n return rowResult;\r\n }\r\n\r\n // (JG: These ought to be named expandCHILDREN/collapseCHILDREN instead.)\r\n collapseContent(row: ObjectRow): number {\r\n if (!row.group.isExpanded && row.group.children.length == 0) { \r\n return 0; \r\n } // JG: Is this code/condition actually good?\r\n\r\n let nrOfDescendents = row.group.collapse();\r\n this.nrOfInsertedDescendants -= nrOfDescendents;\r\n return nrOfDescendents;\r\n }\r\n\r\n\tasync setExpandContent(parent: ObjectRow): Promise { // HAN skal bruge at grouped-columns ved om de isStatic!\r\n if (!this.columns.grouped) { return; }\r\n\r\n /* The purpose of this method, I believe, is to populate parent.group.children.\r\n Apart from that, this method should be split into explained helpers :-/.\r\n */\r\n\r\n let indentation = parent.group.indentation + 1;\r\n let resultORowArray: ObjectRow[] = [];\r\n\t\tlet filters = this.columns.getAppliedGroupingFilters(parent);\r\n console.log('setExpandContent, parent:', parent,', this.useInstanceLevel?', this.useInstanceLevel, indentation, this.columns.grouped.length);\r\n\r\n let indentInGroupRange: boolean = (indentation < this.columns.grouped.length); // (IE if indentation is a legal index into the grouped[] array.) \t\t\r\n if (indentInGroupRange) { // let contentFilterTemplate: ObjectFilter = this.columns.grouped[indentation];\r\n let contentFilterTemplate: ObjectFilter = this.columns.grouped[indentation];//MUST have isStatic! \r\n let showExpandedCells: boolean = (contentFilterTemplate.targetType == ObjectValues.targetTypes.type); // This is only for types atm. (JG: I think the idea is, that it's only types you can expand this way?) \r\n let idNamePairs:IdNamePair[] = await this.filterService.OFS_getRowFilters(contentFilterTemplate, filters); // in OLSS.setExpandContent.\r\n resultORowArray = idNamePairs.map( idNamePair => {\r\n let filterValue = contentFilterTemplate.isStatic ? idNamePair.id : idNamePair.name;//in-ObjectListServerSide.setExpandContent.\r\n let contentFilter: ObjectFilter = this.buildFilterTemplateInstance(contentFilterTemplate, filterValue, idNamePair.name);\r\n let name = ( (idNamePair.name !== \"\") ? idNamePair.name : \"Empty value\");\r\n return ObjectRow.BuildGroup(idNamePair.id, name, showExpandedCells, parent, indentation, contentFilter, this.colorLegendService);\r\n });\r\n \r\n if (showExpandedCells) {\r\n let childrenById: any = {}; // ObjectRows indexed by their ID.\r\n resultORowArray.forEach(x => childrenById[x.id] = x); // populating that map.\r\n let typeDetails:ObjectDetails[] = await this.getTypes('SXC',filters, 0, 2147483647); \r\n typeDetails.forEach(typeDetail => childrenById[typeDetail.typeId].value = typeDetail); // attach all the (type-)ObjectDetails to the ObjectRow.value's:\r\n await this.updateTypeDisplayUnits_forDetails(typeDetails); // in setExpandContent, expandedCells.\r\n }\r\n\r\n if (contentFilterTemplate?.value && !Boolean(contentFilterTemplate.selectedComparisonOption) // DANGER:\r\n && !Boolean(this.columns.staticFilters.includes(contentFilterTemplate))) // JG: Det her er da vist noget vroevl, ville et element fra static ryge direkte i grouped?\r\n { \r\n let noneFilter: ObjectFilter = this.buildFilterTemplateInstance(contentFilterTemplate, contentFilterTemplate.value, `No '${contentFilterTemplate.name}'`);\r\n noneFilter.selectedComparisonOption = { name: \"hasNoRelation\" };\r\n let noRow:ObjectRow = ObjectRow.BuildGroup(\r\n noneFilter.targetId ? noneFilter.targetId : \"\",\r\n noneFilter.name,\r\n showExpandedCells,\r\n parent,\r\n indentation,\r\n noneFilter, \r\n this.colorLegendService\r\n );\r\n if ((await this.filterService.hasRows(noneFilter, this.columns.getAppliedGroupingFilters(noRow)))) {\r\n resultORowArray.push(noRow);\r\n }\r\n } \r\n } else if (this.useInstanceLevel) {\r\n let staticFilterTemplate: ValueFilterUI2 | undefined = this.columns.staticFilters.find(x => x.targetType == ObjectValues.targetTypes.instance); //: ObjectFilter\r\n let instanceDetails: ObjectDetails[] = await this.getInstances(filters, 0, 2147483647); \r\n await this.updateTypeDisplayUnits_forDetails(instanceDetails); // in setExpandContent, instanceLevel.\r\n if (staticFilterTemplate) {\r\n resultORowArray = instanceDetails.map(x => {\r\n return ObjectRow.BuildLeaf(x.instanceId, x.instanceName, x, parent, indentation,\r\n this.buildFilterTemplateInstance(staticFilterTemplate!, x.instanceId, x.instanceName), this.colorLegendService)\r\n });\r\n }\r\n } else {\r\n return;\r\n }\r\n \r\n parent.group.isExpanded = true;\r\n parent.group.children = resultORowArray;\r\n this.nrOfInsertedDescendants += parent.group.children.length;\r\n }\r\n \r\n\tasync updateTypeDisplayUnits_forDetails(details:ObjectDetails[]) {\r\n\t\tlet logUnits:boolean = false;\r\n\r\n\t\tlet typeDisplayUnits:ObjectDisplayUnits[] = [];\r\n\t\tif (!Boolean(this.parameterService instanceof AomObjectParameterService)) {\r\n if (logUnits) { console.log('calls OLSS.getTypeDisplayUnits'); }\r\n\t\t\ttypeDisplayUnits = await this.getTypeDisplayUnits(details, logUnits);\r\n\t\t} // (AomObjectParameterService has no source of these, I think, so then we use empty..)\r\n\r\n // this just adds them to the set we have so far:\r\n if (logUnits) { console.log('calls columns.updateTypeDisplayUnits'); }\r\n this.columns.updateTypeDisplayUnits(typeDisplayUnits, logUnits); \r\n\t}\r\n\r\n\r\n private buildFilterTemplateInstance(staticFilterTemplate: ValueFilterUI2 , value: string, name: string): UIValueFilter { //} ObjectFilter { // template no longer ObjectFilter\r\n /* Egentlig ser vi kode (sammenligninger/if),\r\n der gaar ud fra, at static-filters er de samme objekter,\r\n dvs. at man med find() kan genkende et filter der tidligere er kommet fra static..\r\n Men buildFilterTemplateInstance() ser ud til altid at \r\n have overtraadt dette, ved at lave nye instanser med object.assign()..\r\n Så hvad der end kommer ud af buildFilterTemplateInstance, er det IKKE det som kommer ind.\r\n */\r\n\r\n //let instance:UIValueFilter = Object.assign({}, template);\r\n\r\n let filterUserSettings:FilterUserSettings = {\r\n value:value,\r\n selectedComparisonOption: ObjectValues.comparisonMethods.hasRelation\r\n //name:name\r\n };\r\n\r\n let instance:UIValueFilter = { \r\n ...staticFilterTemplate, \r\n ...filterUserSettings, \r\n name:name\r\n }; \r\n\r\n //instance.value = value;\r\n //instance.name = name;\r\n //instance.selectedComparisonOption = ObjectValues.comparisonMethods.hasRelation;\r\n return instance;\r\n }\r\n\r\n\tprivate getValueFromRow(cell: ObjectCell,rows: ObjectRow[]) : string | undefined { // (Used by saveClassificationCell.)\r\n\t\tif (rows[0]?.value?.properties) {\r\n for (const property of rows[0]?.value?.properties) {\r\n if (property.definitionId === cell.definitionId) {\r\n return property.value;\r\n }\r\n }\r\n console.log('(getValueFromRow did not find defId:', cell.definitionId, 'among', rows[0]?.value?.properties);\r\n // (JG: I think the reason this may fail,\r\n // is because it will find something if we had an earlier VALUE,\r\n // but not when we created the field value for the first time.)\r\n }\r\n\t\treturn undefined;\r\n\t}\r\n\r\n async saveClassificationCell(item: ObjectRow, items: ObjectRow[], cell: ObjectCell): Promise {\r\n\t\t// JG: Jeg forstaar ikke helt hvorfor saveClassificationCell skriver til newValue? \r\n\t\t// eller rettere, hvad er lifeCycle for value/newValue, det er som om de altid resolves ved at ObjectDetail properties genloades-genudfoldes?\r\n\r\n console.log('saveClassificationCell, newValue:', cell.newValue);\r\n let filters = this.columns.getAppliedGroupingFilters(item);\r\n\r\n let rowsToUpdateWithCl:ObjectRow[] = items.includes(item) ? items : [item];\r\n \r\n if (cell.columnTargetType == ObjectValues.targetTypes.typeParameter) {\r\n await this.saveClassificationOnTypes(rowsToUpdateWithCl, cell, filters);\r\n } else if (cell.columnTargetType == ObjectValues.targetTypes.instanceParameter) {\r\n await this.saveClassificationOnInstances(rowsToUpdateWithCl, cell, filters);\r\n }\r\n\t\t\r\n\t\t// JG: I think this will only work in cases where the column PREVIOUSLY had a value - not first time we enter a value.\r\n\t\t// And why do we want to do it based on row 0 ?? Investigate the history of this crap.\r\n\t\tcell.newValue = this.getValueFromRow(cell, rowsToUpdateWithCl);\r\n\t\tconsole.log(`updating cell value from ${cell.value} to ${cell.newValue}`);//in-ObjectListServerSide.saveClassificationCell\r\n\r\n\t\tthis.events.publish('color-legend:update-colors', {cell, row:item, rows:items});\r\n\t}\r\n\t \r\n async saveCell(item: ObjectRow,items: ObjectRow[], cell: ObjectCell): Promise {\r\n\t\t// (kaldes mange steder fra.)\r\n\r\n // type row editing of type parameter, new & old\r\n // No! type row editing of instance parameter => only new, Edit/set all instances\r\n // instance row editing of instance parameter, new & old\r\n // instance row editing of type parameter => type row editing of type parameter ! from viewmodel\r\n // new or existing parameter \r\n\r\n let filters = this.columns.getAppliedGroupingFilters(item);\r\n\t\t// (Bemaerk, at saveXXX udløser reload af parameter-values i ObjectDetails! ie, en refresh.)\r\n if (items.length > 1 && items.includes(item)) { // (IE update multiple rows.)\r\n if (cell.columnTargetType == ObjectValues.targetTypes.typeParameter) {\r\n await this.saveForTypes(items, cell, filters);\r\n } else if (cell.columnTargetType == ObjectValues.targetTypes.instanceParameter) {\r\n await this.saveForInstances(items, cell, filters);\r\n }\r\n } else { // (IE update single row.)\r\n if (!cell.isEditing || cell.newValue == cell.value) {//in-ObjectListServerSide.saveCell\r\n cell.reset();\r\n } else if (cell.columnTargetType == ObjectValues.targetTypes.typeParameter) {\r\n await this.saveForType(item, cell, filters);//in-saveCell.\r\n } else if (cell.columnTargetType == ObjectValues.targetTypes.instanceParameter) { \r\n await this.saveForInstance(item, cell, filters);\r\n } else {\r\n cell.reset();\r\n }\r\n }\r\n\r\n\t\tthis.events.publish('color-legend:update-colors', {cell, row:item, rows:items});\r\n }\r\n\r\n async saveForTypes(items: ObjectRow[], cell: ObjectCell, filters: ObjectFilter[]){\r\n let parameterDefinitionId = cell.definitionId;\r\n let newValue = cell.newValue;\r\n let newIds:string[] = [];\r\n let valueIds:string[] = [];\r\n let objectDetails:ObjectDetails[] = [];\r\n for (let i = 0; i < items.length; i++) {\r\n let item: ObjectRow | null = items[i];\r\n item = item.targetType == ObjectValues.targetTypes.instance ? item.group.parent : item; // Same for instance and type rows\r\n let found = false;\r\n if (item?.value) {\r\n for(let j = 0; j < item.value.properties.length; j++)\r\n {\r\n if(item.value.properties[j].definitionId == parameterDefinitionId){\r\n found = true;\r\n if (item.targetType != ObjectValues.targetTypes.type) {\r\n // Invalid target type (only type & instance parameters can be changed atm)\r\n } else if (item.value.properties[j].valueId == undefined) {\r\n newIds.push(item.id);\r\n } else { // Existing value\r\n let property: ObjectParameter = item.value.properties[j];\r\n if (property.valueId != undefined) {\r\n valueIds.push(property.valueId);\r\n }\r\n }\r\n }\r\n }\r\n objectDetails.push(item.value);\r\n if(!found)\r\n {\r\n newIds.push(item.id);\r\n }\r\n }\r\n }\r\n if(newValue != undefined && newIds.length > 0){\r\n await this.parameterService.createTypeParameters(newIds, parameterDefinitionId, newValue);\r\n await this.parameterService.reloadTypeParamVALUES(objectDetails, filters, 'saveTypesB');\r\n }\r\n if(newValue != undefined && valueIds.length > 0){\r\n await this.parameterService.updateTypeParameters(valueIds, newValue);\r\n await this.parameterService.reloadTypeParamVALUES(objectDetails, filters, 'saveTypesC');\r\n }\r\n this.cellUpdateTrigger++;\r\n }\r\n\r\n async saveForInstances(items: ObjectRow[], cell: ObjectCell, filters: ObjectFilter[]){\r\n let parameterDefinitionId = cell.definitionId;\r\n let newValue = cell.newValue;\r\n let newIds:string[] = [];\r\n let valueIds:string[] = [];\r\n let objectDetails:ObjectDetails[] = [];\r\n for (let i = 0; i < items.length; i++){\r\n let item: ObjectRow | null = items[i];\r\n let found = false;\r\n if (item?.value) {\r\n for(let j = 0; j < item.value.properties.length; j++)\r\n {\r\n if(item.value.properties[j].definitionId == parameterDefinitionId)\r\n {\r\n found = true;\r\n if (!Boolean(item.value.properties[j].valueId)) {\r\n if (item.targetType == ObjectValues.targetTypes.type) {\r\n // Not needed yet! set cell for all instances of type row, then reload type & instances row.value.parameters\r\n } else if (item.targetType == ObjectValues.targetTypes.instance) {\r\n newIds.push(item.id);\r\n } \r\n } else { // Existing value\r\n // change cell value for instance, then update cell value\r\n let property: ObjectParameter = item.value.properties[j];\r\n if (property.valueId) {\r\n valueIds.push(property.valueId);\r\n }\r\n }\r\n }\r\n }\r\n objectDetails.push(item.value);\r\n if(!found)\r\n {\r\n newIds.push(item.id);\r\n }\r\n }\r\n } \r\n if (newValue != undefined && newIds.length > 0) {\r\n await this.parameterService.createInstanceParameters(newIds, parameterDefinitionId, newValue);\r\n await this.parameterService.setInstanceParameters(objectDetails, filters, 'si1');\r\n }\r\n if (newValue != undefined && valueIds.length > 0) {\r\n await this.parameterService.updateInstanceParameters(valueIds, newValue);\r\n await this.parameterService.setInstanceParameters(objectDetails, filters, 'si2');\r\n }\r\n this.cellUpdateTrigger++;\r\n }\r\n \r\n async saveForType(item: ObjectRow | undefined | null, cell: ObjectCell, filters: ObjectFilter[]) {\r\n\t\t// (JG: Denne bliver udløst, når jeg redigerer en celle på en TYPE.)\r\n\t\t// (udløses..kun.. fra saveCell.)\r\n\r\n item = item?.targetType == ObjectValues.targetTypes.instance ? item?.group.parent : item; // Same for instance and type rows\r\n if (item && item.value && cell.newValue != undefined) {\r\n if (item.targetType != ObjectValues.targetTypes.type) {\r\n // Invalid target type (only type & instance parameters can be changed atm)\r\n cell.reset();\r\n } else if (cell.isNewParameterValue) {\r\n await this.parameterService.createTypeParameter(item.id, cell.definitionId, cell?.newValue);\r\n await this.parameterService.reloadTypeParamVALUES([item.value], filters, 'saveType D(new)');\r\n this.cellUpdateTrigger++;\r\n } else { // Existing value\r\n await this.parameterService.updateTypeParameter(cell.valueId, cell?.newValue);\r\n await this.parameterService.reloadTypeParamVALUES([item.value], filters, 'saveType E(upd)');\r\n this.cellUpdateTrigger++;\r\n }\r\n }\r\n }\r\n \r\n async saveForInstance(item: ObjectRow, cell: ObjectCell, filters: ObjectFilter[]):Promise {\r\n\t\tconsole.log('saveForInstance');\r\n if (!item) { console.log('no ObjectRow item:', item); return; }\t\t\r\n\t\tif (!item.value) { console.log('no ObjectRow item.value:', item.value); return; }\r\n\r\n\t\tif (cell.isNewParameterValue) {\r\n\t\t\tconsole.log('(isNewParameterValue)');\r\n\t\t\tif (item.targetType == ObjectValues.targetTypes.type) {\r\n\t\t\t\t// Not needed yet! set cell for all instances of type row, then reload type & instances row.value.parameters \r\n\t\t\t\tcell.reset();\r\n\t\t\t} else if (item.targetType == ObjectValues.targetTypes.instance && cell.newValue) {\r\n\t\t\t\tawait this.parameterService.createInstanceParameter(item.id, cell.definitionId, cell.newValue);\r\n\t\t\t\tawait this.parameterService.setInstanceParameters([item.value], filters, 'SI-B');\r\n\t\t\t\tthis.cellUpdateTrigger++;\r\n\t\t\t} else {\r\n\t\t\t\t// Invalid target type (only type & instance parameters can be changed atm)\r\n\t\t\t\tcell.reset();\r\n\t\t\t}\r\n\t\t} else { // Existing value\r\n\t\t\tconsole.log('(existing value - !isNewParameterValue)');\r\n\t\t\t// change cell value for instance, then update cell value\r\n\r\n\t\t\t//let newValue_toStore:string = '';\r\n\t\t\tif (!cell.newValue) {\r\n\t\t\t\tconsole.log('note that source cell value is undefined'); //, we store empty string instead.');\r\n\t\t\t} else {\r\n\t\t\t\t//newValue_toStore = cell.newValue;\t\t\t\t\r\n\t\t\t}\r\n\t\t\tconsole.log('cell.newValue:', cell.newValue);\r\n\t\t\tawait this.parameterService.updateInstanceParameter(cell.valueId, cell.newValue); //newValue_toStore); //cell.newValue);\r\n\t\t\tawait this.parameterService.setInstanceParameters([item.value], filters, 'SI2-B');\r\n\t\t\tthis.cellUpdateTrigger++;\r\n\t\t}\r\n }\r\n\r\n async saveClassificationOnTypes(items: ObjectRow[], cell: ObjectCell, filters: ObjectFilter[]) {\r\n\t\t/* JG: The intended behaviour of this method is as follows:\r\n\t\tThe user just edited a cell of 'classification' kind.\r\n\t\tBecause of this, the cell's newValue indicates a NODE_ID,\r\n\t\twhich refers to a project-associated NODE_VALUE from that classification.\r\n\r\n\t\tThe cell is also related to a prjParameter of 'classification' kind.\r\n\t\tWe will now provide the server with a mix of the following info:\r\n\t\t - that nodeValueID\r\n\t\t - the prjParameterId.\r\n\t\t - the IDs of (the typeIDs for new values) and the (type-ValueIDs of the existing values.)\r\n\r\n\t\tThe server will then do the following:\r\n\t\t - it will look up the NODE_VALUE for the nodeID.\r\n\t\tFrom this, it will know the associated (typically 6) template 'value parts' for that node-value.\r\n\t\tIt will then update all the typeValues for that prjParmeter.\r\n\t\tAnd it will CREATE typeValues, for those typeIDs that didn't already have an associated cl-value.\r\n\r\n\t\tThe reason we do it for whole sets, is that the user may select a bunch of items,\r\n\t\tand set their (identical) classification, in one fell swoop.\r\n\t\tThere is, however, things about this that puzzle me:\r\n\t\tWhy, on this side, does this only touch one parameter at a time?\r\n\t\tI can see, that on the server side, it updates ALL fields in lockstep.\r\n\t\t*/\r\n\r\n console.log('saveClassificationOnTypes, ObjectCell:', cell, 'nodeId in newValue:', cell.newValue);\t\t\r\n\r\n\t\tlet {definitionId: parameterDefinitionId, newValue: nodeId} = cell;\r\n\t\tconsole.log('newValue:', nodeId);\r\n\t\t\r\n\t\tlet newTYPEIds:string[] = [];\r\n let valueIds:string[] = [];\r\n let objectDetails:ObjectDetails[] = [];\r\n\t\t\r\n\t\tfor (let item of items) { // (Fills out newIds/valueIds)\r\n\t\t\tthis.collectClassificationValues(item, parameterDefinitionId, newTYPEIds, valueIds, objectDetails);\r\n\t\t}\r\n\r\n\t\tif (nodeId && newTYPEIds.length > 0) { // if there are any new/unseen values, CREATE them:\r\n\t\t\tawait this.parameterService.createClassificationTypeParameters(newTYPEIds, parameterDefinitionId, nodeId);\r\n\t\t\tawait this.parameterService.reloadTypeParamVALUES(objectDetails, filters, 'saveClassificationOnTypes G');\r\n }\r\n\t\t\r\n if (nodeId && valueIds.length > 0) { // if there are any existing values, UPDATE them:\r\n\t\t\tawait this.parameterService.updateClassificationTypeParameters(valueIds, parameterDefinitionId, nodeId);\r\n\t\t\tawait this.parameterService.reloadTypeParamVALUES(objectDetails, filters, 'saveClassificationOnTypes H');\r\n }\r\n this.cellUpdateTrigger++;\r\n }\r\n\r\n\tprivate collectClassificationValues(o_item: ObjectRow, parameterDefinitionId: string, newTYPEIds: string[], valueIds: string[], objectDetailArray: ObjectDetails[]) : void {\r\n\t\t// Independently of what we have selected, we are editing a TYPELEVEL parameter:\r\n\t\tlet c_item:ObjectRow | null = // Same for instance and type rows\r\n\t\t (o_item.targetType == ObjectValues.targetTypes.instance) ? o_item.group.parent : o_item; \r\n\t console.log('collectClassificationValues', c_item);\r\n\r\n\t\tif (!c_item) { console.log('no objectrow found'); return; }\r\n\t\tif (!c_item.value) { console.log('objectrow has no VALUE'); return; }\r\n\r\n\t\tobjectDetailArray.push(c_item.value);\r\n\r\n\t\tlet propValue: ObjectParameter | undefined = c_item.value.properties.find(p => p.definitionId == parameterDefinitionId);\r\n\t\tlet found = Boolean(propValue);\r\n\t\tif (found) {\r\n\t\t\tif (c_item.targetType != ObjectValues.targetTypes.type) {\r\n\t\t\t\tthrow Error('Invalid target type (only type & instance parameters can be changed atm)') // Wouldn't we want let the user (or us) know?\t\t\t\t\r\n\t\t\t} // Invalid target type (only type & instance parameters can be changed atm)\r\n\t\t\t\r\n\t\t\tif (!Boolean(propValue?.valueId)) { // (JG: ValueId is the dbID when we've stored a value on the DB, so it's an indicator of whether this is an already-existing value.)\r\n\t\t\t\tnewTYPEIds.push(c_item.id);\r\n\t\t\t} else { // Existing value\r\n if (propValue?.valueId) {\r\n valueIds.push(propValue.valueId);\r\n }\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!found) { newTYPEIds.push(c_item.id); }\r\n\t}\r\n\r\n\tasync saveClassificationOnInstances(items: ObjectRow[], cell: ObjectCell, filters: ObjectFilter[]){\r\n console.log('saveClassificationOnInstances');\r\n let parameterDefinitionId = cell.definitionId;\r\n let nodeId = cell.newValue;\r\n let newIds:string[] = [];\r\n let valueIds:string[] = [];\r\n let objectDetails:ObjectDetails[] = [];\r\n for (let i = 0; i < items.length; i++){\r\n let item: ObjectRow | undefined | null = items[i];\r\n let found = false;\r\n if (item && item.value) {\r\n for(let j = 0; j < item.value.properties.length; j++) {\r\n if(item.value.properties[j].definitionId == parameterDefinitionId)\r\n {\r\n found = true;\r\n if (!Boolean(item.value.properties[j].valueId)) {\r\n if (item.targetType == ObjectValues.targetTypes.type) {\r\n // Not needed yet! set cell for all instances of type row, then reload type & instances row.value.parameters\r\n } else if (item.targetType == ObjectValues.targetTypes.instance) {\r\n newIds.push(item.id);\r\n }\r\n } else { // Existing value\r\n // change cell value for instance, then update cell value\r\n let property: ObjectParameter | undefined = item.value.properties[j]; \r\n if (property?.valueId) {\r\n valueIds.push(property.valueId);\r\n }\r\n }\r\n }\r\n }\r\n objectDetails.push(item.value);\r\n if(!found)\r\n {\r\n newIds.push(item.id);\r\n }\r\n }\r\n }\r\n if(nodeId && newIds.length > 0){\r\n await this.parameterService.createClassificationInstanceParameters(newIds, parameterDefinitionId, nodeId);\r\n await this.parameterService.setInstanceParameters(objectDetails, filters, 'SCOI');\r\n }\r\n if(nodeId && valueIds.length > 0){\r\n await this.parameterService.updateClassificationInstanceParameters(valueIds, parameterDefinitionId, nodeId);\r\n await this.parameterService.setInstanceParameters(objectDetails, filters, 'SCOI2');\r\n }\r\n this.cellUpdateTrigger++;\r\n }\r\n}\r\n"],"names":["ObjectRow","targetType","Boolean","this","group","groupingFilter","isSelected","id","name","value","showCells","isGroup","colorLegendService","toggleSelected","console","log","compare","b","categoryName","familyName","typeName","instanceName","isColored","isDataReady","colorData","currentColorData","isCategory","undefined","colorMap","get","isFamilyName","isTypeName","property","properties","isCellCurrentActiveColor","hexColor","color","hex","definitionId","isType","instanceId","isInstance","Build","ObjectRowGroup","BuildLeaf","parent","indentation","length","push","BuildGroup","ObjectRowCell","constructor","par","columnFilter","canEdit","itemColor","objectCell","ObjectCell","elementId","valueId","dvalue","reset","columnTargetType","dispValue","pv","getSavedValue","newValue","dvalue2","isEditing","isSimpleValue","isMultiline","dispValue2","isNewParameterValue","tryEdit","isExpanded","children","getContentFilters","filters","collapse","nrOfChildren","forEach","x","ObjectListServerSide","useInstanceLevel","columns","objectService","filterService","parameterService","events","nrOfInsertedDescendants","noMoreItemsInList","nrOfRowsToLoad","listMode","cellUpdateTrigger","getObjectDetailService","setup","incrementCellUpdateTrigger","getTypes","who","index","nr","types","queryObjectTypes","reloadTypeParamVALUES","getTypeDisplayUnits","typeIds","logUnits","getInstances","instances","queryObjectInstances","setInstanceParameters","getFamilies","objDetails","queryObjectFamilies","getMoreRows","fromIndex_","ADJ_ROOTLEVEL_INDEX","detailsResult","Array","rowResult","deck","applied","staticFilterTemplate","staticFilters","find","targetTypes","type","buildFilterTemplateInstance","familyId","grid","typeId","useGrouping","collapseContent","row","nrOfDescendents","setExpandContent","grouped","resultORowArray","getAppliedGroupingFilters","contentFilterTemplate","showExpandedCells","OFS_getRowFilters","map","idNamePair","filterValue","isStatic","contentFilter","childrenById","typeDetails","typeDetail","updateTypeDisplayUnits_forDetails","selectedComparisonOption","includes","noneFilter","noRow","targetId","hasRows","instance","instanceDetails","details","typeDisplayUnits","updateTypeDisplayUnits","comparisonMethods","hasRelation","getValueFromRow","cell","rows","saveClassificationCell","item","items","rowsToUpdateWithCl","typeParameter","saveClassificationOnTypes","instanceParameter","saveClassificationOnInstances","publish","saveCell","saveForTypes","saveForInstances","saveForType","saveForInstance","parameterDefinitionId","newIds","valueIds","objectDetails","i","found","j","createTypeParameters","updateTypeParameters","createInstanceParameters","updateInstanceParameters","createTypeParameter","updateTypeParameter","createInstanceParameter","updateInstanceParameter","nodeId","newTYPEIds","collectClassificationValues","createClassificationTypeParameters","updateClassificationTypeParameters","o_item","objectDetailArray","c_item","propValue","p","Error","createClassificationInstanceParameters","updateClassificationInstanceParameters"],"sourceRoot":""}