@hestia-earth/ui-components 0.2.6 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/bundles/hestia-earth-ui-components.umd.js +134 -121
  2. package/bundles/hestia-earth-ui-components.umd.js.map +1 -1
  3. package/common/maps-utils.d.ts +1 -1
  4. package/common/node-utils.d.ts +3 -2
  5. package/engine/engine.service.d.ts +1 -0
  6. package/esm2015/common/link-key-value/link-key-value.component.js +15 -6
  7. package/esm2015/common/maps-utils.js +12 -9
  8. package/esm2015/common/node-utils.js +3 -1
  9. package/esm2015/engine/engine.service.js +2 -2
  10. package/esm2015/files/files-form.model.js +2 -1
  11. package/esm2015/impact-assessments/impact-assessments-indicator-breakdown-chart/impact-assessments-indicator-breakdown-chart.component.js +26 -18
  12. package/esm2015/impact-assessments/impact-assessments-products/impact-assessments-products.component.js +3 -11
  13. package/esm2015/impact-assessments/impact-assessments-products-logs/impact-assessments-products-logs.component.js +6 -5
  14. package/esm2015/node/node-logs-models/node-logs-models.component.js +46 -47
  15. package/esm2015/node/node-value-details/node-value-details.component.js +2 -2
  16. package/esm2015/sites/sites-maps/sites-maps.component.js +2 -7
  17. package/esm2015/terms/terms.model.js +2 -2
  18. package/fesm2015/hestia-earth-ui-components.js +106 -96
  19. package/fesm2015/hestia-earth-ui-components.js.map +1 -1
  20. package/impact-assessments/impact-assessments-indicator-breakdown-chart/impact-assessments-indicator-breakdown-chart.component.d.ts +2 -0
  21. package/impact-assessments/impact-assessments-products/impact-assessments-products.component.d.ts +1 -1
  22. package/impact-assessments/impact-assessments-products-logs/impact-assessments-products-logs.component.d.ts +1 -1
  23. package/node/node-logs-models/node-logs-models.component.d.ts +8 -5
  24. package/package.json +3 -3
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/forms'), require('@angular/router'), require('@ng-bootstrap/ng-bootstrap'), require('@angular/google-maps'), require('@fortawesome/angular-fontawesome'), require('@fortawesome/free-regular-svg-icons'), require('@fortawesome/free-solid-svg-icons'), require('random-material-color'), require('@hestia-earth/schema'), require('@hestia-earth/api'), require('@angular/platform-browser'), require('rxjs'), require('@hestia-earth/utils'), require('pluralize'), require('rxjs/operators'), require('@hestia-earth/utils/dist/term'), require('csvtojson'), require('@angular/common/http'), require('@hestia-earth/utils/dist/delta'), require('json-2-csv'), require('@angular/cdk/drag-drop'), require('@hestia-earth/schema-convert'), require('@hestia-earth/json-schema/schema-utils'), require('jsondiffpatch'), require('chart.js'), require('moment'), require('moment/locale/en-gb'), require('uuid'), require('@google/markerclustererplus'), require('@hestia-earth/glossary'), require('chartjs-plugin-datalabels')) :
3
- typeof define === 'function' && define.amd ? define('@hestia-earth/ui-components', ['exports', '@angular/core', '@angular/common', '@angular/forms', '@angular/router', '@ng-bootstrap/ng-bootstrap', '@angular/google-maps', '@fortawesome/angular-fontawesome', '@fortawesome/free-regular-svg-icons', '@fortawesome/free-solid-svg-icons', 'random-material-color', '@hestia-earth/schema', '@hestia-earth/api', '@angular/platform-browser', 'rxjs', '@hestia-earth/utils', 'pluralize', 'rxjs/operators', '@hestia-earth/utils/dist/term', 'csvtojson', '@angular/common/http', '@hestia-earth/utils/dist/delta', 'json-2-csv', '@angular/cdk/drag-drop', '@hestia-earth/schema-convert', '@hestia-earth/json-schema/schema-utils', 'jsondiffpatch', 'chart.js', 'moment', 'moment/locale/en-gb', 'uuid', '@google/markerclustererplus', '@hestia-earth/glossary', 'chartjs-plugin-datalabels'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global["hestia-earth"] = global["hestia-earth"] || {}, global["hestia-earth"]["ui-components"] = {}), global.ng.core, global.ng.common, global.ng.forms, global.ng.router, global.i11, global.ng.googleMaps, global.i1, global.freeRegularSvgIcons, global.freeSolidSvgIcons, global.randomMaterialColor, global.schema, global.api, global.ng.platformBrowser, global.rxjs, global.utils, global.pluralize, global.rxjs.operators, global.term, global.csvtojson, global.ng.common.http, global.delta, global.json2Csv, global.ng.cdk.dragDrop, global.schemaConvert, global.schemaUtils, global.jsondiffpatch, global.chart_js, global.moment, null, global.uuid$1, global.MarkerClusterer, global.glossary, global.ChartDataLabels));
5
- })(this, (function (exports, i0, i2, i1$1, i5, i11, i1$4, i1, freeRegularSvgIcons, freeSolidSvgIcons, randomMaterialColor, schema, api, i1$2, rxjs, utils, pluralize, operators, term, csvtojson, i1$3, delta, json2Csv, i6, schemaConvert, schemaUtils, jsondiffpatch, chart_js, moment, enGb, uuid$1, MarkerClusterer, glossary, ChartDataLabels) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('@angular/forms'), require('@angular/router'), require('@ng-bootstrap/ng-bootstrap'), require('@angular/google-maps'), require('@fortawesome/angular-fontawesome'), require('@fortawesome/free-regular-svg-icons'), require('@fortawesome/free-solid-svg-icons'), require('random-material-color'), require('@hestia-earth/schema'), require('@hestia-earth/api'), require('@angular/platform-browser'), require('rxjs'), require('@hestia-earth/utils'), require('pluralize'), require('rxjs/operators'), require('@hestia-earth/utils/dist/term'), require('@hestia-earth/glossary'), require('csvtojson'), require('@angular/common/http'), require('@hestia-earth/utils/dist/delta'), require('json-2-csv'), require('@angular/cdk/drag-drop'), require('@hestia-earth/schema-convert'), require('@hestia-earth/json-schema/schema-utils'), require('jsondiffpatch'), require('chart.js'), require('moment'), require('moment/locale/en-gb'), require('uuid'), require('@google/markerclustererplus'), require('chartjs-plugin-datalabels')) :
3
+ typeof define === 'function' && define.amd ? define('@hestia-earth/ui-components', ['exports', '@angular/core', '@angular/common', '@angular/forms', '@angular/router', '@ng-bootstrap/ng-bootstrap', '@angular/google-maps', '@fortawesome/angular-fontawesome', '@fortawesome/free-regular-svg-icons', '@fortawesome/free-solid-svg-icons', 'random-material-color', '@hestia-earth/schema', '@hestia-earth/api', '@angular/platform-browser', 'rxjs', '@hestia-earth/utils', 'pluralize', 'rxjs/operators', '@hestia-earth/utils/dist/term', '@hestia-earth/glossary', 'csvtojson', '@angular/common/http', '@hestia-earth/utils/dist/delta', 'json-2-csv', '@angular/cdk/drag-drop', '@hestia-earth/schema-convert', '@hestia-earth/json-schema/schema-utils', 'jsondiffpatch', 'chart.js', 'moment', 'moment/locale/en-gb', 'uuid', '@google/markerclustererplus', 'chartjs-plugin-datalabels'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global["hestia-earth"] = global["hestia-earth"] || {}, global["hestia-earth"]["ui-components"] = {}), global.ng.core, global.ng.common, global.ng.forms, global.ng.router, global.i11, global.ng.googleMaps, global.i1, global.freeRegularSvgIcons, global.freeSolidSvgIcons, global.randomMaterialColor, global.schema, global.api, global.ng.platformBrowser, global.rxjs, global.utils, global.pluralize, global.rxjs.operators, global.term, global.glossary, global.csvtojson, global.ng.common.http, global.delta, global.json2Csv, global.ng.cdk.dragDrop, global.schemaConvert, global.schemaUtils, global.jsondiffpatch, global.chart_js, global.moment, null, global.uuid$1, global.MarkerClusterer, global.ChartDataLabels));
5
+ })(this, (function (exports, i0, i2, i1$1, i5, i11, i1$4, i1, freeRegularSvgIcons, freeSolidSvgIcons, randomMaterialColor, schema, api, i1$2, rxjs, utils, pluralize, operators, term, glossary, csvtojson, i1$3, delta, json2Csv, i6, schemaConvert, schemaUtils, jsondiffpatch, chart_js, moment, enGb, uuid$1, MarkerClusterer, ChartDataLabels) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
@@ -874,7 +874,7 @@
874
874
  },
875
875
  _b$1.practice = {
876
876
  label: 'Practices',
877
- termType: 'Production Practices',
877
+ termType: 'Practices',
878
878
  children: termTypesToChildren([
879
879
  schema.TermTermType.animalManagement,
880
880
  schema.TermTermType.aquacultureManagement,
@@ -1091,6 +1091,7 @@
1091
1091
  }] });
1092
1092
 
1093
1093
  var get$5 = require('lodash.get');
1094
+ var isMethodModelAllowed = function (filterMethod) { return function (node) { var _a, _b; return ((_a = node.methodModel) === null || _a === void 0 ? void 0 : _a['@id']) === (filterMethod ? filterMethod['@id'] : glossary.getDefaultModeId((_b = node.term) === null || _b === void 0 ? void 0 : _b['@id'])); }; };
1094
1095
  var NodeKeyState;
1095
1096
  (function (NodeKeyState) {
1096
1097
  NodeKeyState["added"] = "added";
@@ -1104,8 +1105,8 @@
1104
1105
  node[state].includes(key))); };
1105
1106
  ;
1106
1107
  ;
1107
- var grouppedKeys = function (values) { return Object.entries(values).map(function (_a) {
1108
- var _b = __read(_a, 2), key = _b[0], value = _b[1];
1108
+ var grouppedKeys = function (values) { return Object.entries(values).map(function (_c) {
1109
+ var _d = __read(_c, 2), key = _d[0], value = _d[1];
1109
1110
  return ({ key: key, value: value });
1110
1111
  }); };
1111
1112
  var concatBlankNodeValue = function (value, newValue) {
@@ -1928,9 +1929,20 @@
1928
1929
  args: ['window:resize', []]
1929
1930
  }] } });
1930
1931
 
1932
+ var valueLink = function (value) { return schema.isExpandable(value) && value['@id'] ? [baseUrl(), value['@type'].toLowerCase(), value['@id']].join('/') : null; };
1933
+ var valueLinkRef = function (value, href) { return href ? "<a href=\"" + href + "\">" + (value.name || value['@id']) + "</a>" : null; };
1931
1934
  var stringMapper = {
1932
1935
  undefined: function () { return ''; },
1933
- object: function (value) { return Array.isArray(value) ? value.map(toString).join(', ') : (value instanceof Date ? value.toJSON() : (schema.isExpandable(value) ? value.name || value['@id'] : JSON.stringify(value, null, 2))); }
1936
+ blankNode: function (value) { return 'term' in value
1937
+ ? "" + valueLinkRef(value.term, valueLink(value.term)) + ('value' in value ? ": " + value.value : '')
1938
+ : valueLinkRef(value, valueLink(value)) || value.name || value['@id']; },
1939
+ object: function (value) { return Array.isArray(value)
1940
+ ? value.map(toString).join(', ')
1941
+ : value instanceof Date
1942
+ ? value.toJSON()
1943
+ : schema.isExpandable(value)
1944
+ ? stringMapper.blankNode(value)
1945
+ : JSON.stringify(value, null, 2); }
1934
1946
  };
1935
1947
  var toString = function (value) { return typeof value in stringMapper ? stringMapper[typeof value](value) : value.toString(); };
1936
1948
  var LinkKeyValueComponent = /** @class */ (function () {
@@ -1961,9 +1973,7 @@
1961
1973
  });
1962
1974
  Object.defineProperty(LinkKeyValueComponent.prototype, "valueLink", {
1963
1975
  get: function () {
1964
- return schema.isExpandable(this.value) && this.value['@id'] ?
1965
- [baseUrl(), this.value['@type'].toLowerCase(), this.value['@id']].join('/') :
1966
- null;
1976
+ return valueLink(this.value);
1967
1977
  },
1968
1978
  enumerable: false,
1969
1979
  configurable: true
@@ -1985,7 +1995,7 @@
1985
1995
  return LinkKeyValueComponent;
1986
1996
  }());
1987
1997
  LinkKeyValueComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: LinkKeyValueComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
1988
- LinkKeyValueComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: LinkKeyValueComponent, selector: "he-link-key-value", inputs: { node: "node", nodeType: "nodeType", dataKey: "dataKey", key: "key" }, ngImport: i0__namespace, template: "<ng-container *ngIf=\"!isUndefined\">\n <ng-container *bindOnce=\"node\">\n <a [href]=\"baseUrl + '/schema/' + type + '#' + key\" target=\"_blank\"><b>{{key}}</b></a>\n <span class=\"pr-2\">:</span>\n <a class=\"pr-1\" [href]=\"valueLink\" *ngIf=\"valueLink; else showString\">{{valueString}}</a>\n <he-blank-node-state\n [node]=\"node\" [nodeType]=\"nodeType\" [dataKey]=\"dataKey\" [key]=\"key\"\n ></he-blank-node-state>\n </ng-container>\n</ng-container>\n\n<ng-template #showString>\n <ng-container *ngIf=\"isArray\">\n <div class=\"array-container\">\n <p *ngFor=\"let v of value\">{{toString(v) | precision:3}}</p>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!isArray\">\n <span class=\"pr-1\">{{valueString | precision:3}}</span>\n </ng-container>\n</ng-template>\n", styles: [":host{display:block}.array-container{max-height:100px;overflow-y:auto}\n"], components: [{ type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["nodeType", "dataKey", "key", "node", "state"] }], directives: [{ type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "precision": PrecisionPipe }, changeDetection: i0__namespace.ChangeDetectionStrategy.OnPush });
1998
+ LinkKeyValueComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: LinkKeyValueComponent, selector: "he-link-key-value", inputs: { node: "node", nodeType: "nodeType", dataKey: "dataKey", key: "key" }, ngImport: i0__namespace, template: "<ng-container *ngIf=\"!isUndefined\">\n <ng-container *bindOnce=\"node\">\n <a [href]=\"baseUrl + '/schema/' + type + '#' + key\" target=\"_blank\"><b>{{key}}</b></a>\n <span class=\"pr-2\">:</span>\n\n <ng-container *ngIf=\"isArray; else singleValue\">\n <div class=\"array-container pl-2\">\n <p *ngFor=\"let v of value\" [innerHtml]=\"toString(v) | precision:3\"></p>\n </div>\n </ng-container>\n </ng-container>\n</ng-container>\n\n<ng-template #singleValue>\n <div class=\"is-inline-block pr-1\" [innerHtml]=\"valueString | precision:3\"></div>\n\n <he-blank-node-state\n [node]=\"node\" [nodeType]=\"nodeType\" [dataKey]=\"dataKey\" [key]=\"key\"\n ></he-blank-node-state>\n</ng-template>\n", styles: [":host{display:block}.array-container{max-height:100px;overflow-y:auto}\n"], components: [{ type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["nodeType", "dataKey", "key", "node", "state"] }], directives: [{ type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "precision": PrecisionPipe }, changeDetection: i0__namespace.ChangeDetectionStrategy.OnPush });
1989
1999
  i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: LinkKeyValueComponent, decorators: [{
1990
2000
  type: i0.Component,
1991
2001
  args: [{
@@ -2082,9 +2092,11 @@
2082
2092
  });
2083
2093
  var defaultFeature = function () { return (Object.assign({}, feature)); };
2084
2094
  var pointToCoordinates = function (point) { return [point.lng(), point.lat()]; };
2085
- var coordinatesToPoint = function (values) { return Array.isArray(values[0]) ?
2086
- values.map(function (v) { return coordinatesToPoint(v); }) :
2087
- new google.maps.LatLng(values[1], values[0]); };
2095
+ var coordinatesToPoint = function (values) { return Array.isArray(values[0])
2096
+ ? values.map(function (v) { return coordinatesToPoint(v); })
2097
+ : values.some(isNaN)
2098
+ ? null
2099
+ : new google.maps.LatLng(values[1], values[0]); };
2088
2100
  var polygonToCoordinates = function (polygon) { return polygon.getPaths().getArray().map(function (path) {
2089
2101
  var points = path.getArray();
2090
2102
  return __spreadArray(__spreadArray([], __read(points.map(pointToCoordinates))), [
@@ -2112,11 +2124,12 @@
2112
2124
  : (getCoordinates(feat) || []).map(coordinatesToPolygon); };
2113
2125
  var polygonBounds = function (polygon) {
2114
2126
  var _a;
2115
- return polygon ?
2116
- Array.isArray(polygon) ?
2117
- polygon.reduce(function (prev, curr) { return prev.extend(polygonBounds(curr)); }, new google.maps.LatLngBounds()) :
2118
- (((_a = polygon.getPath()) === null || _a === void 0 ? void 0 : _a.getArray()) || []).reduce(function (prev, curr) { return prev.extend(curr); }, new google.maps.LatLngBounds()) :
2119
- undefined;
2127
+ var paths = polygon
2128
+ ? Array.isArray(polygon)
2129
+ ? polygon.flatMap(function (p) { var _a; return ((_a = p.getPath()) === null || _a === void 0 ? void 0 : _a.getArray()) || []; })
2130
+ : ((_a = polygon.getPath()) === null || _a === void 0 ? void 0 : _a.getArray()) || []
2131
+ : [];
2132
+ return paths.reduce(function (prev, curr) { return prev.extend(curr); }, new google.maps.LatLngBounds());
2120
2133
  };
2121
2134
 
2122
2135
  var MapsDrawingConfirmComponent = /** @class */ (function () {
@@ -5494,6 +5507,13 @@
5494
5507
  .filter(function (v) { return v !== null; });
5495
5508
  return propertyValues.length ? propertyValues.reduce(function (p, v) { return p + v; }, 0) : undefined;
5496
5509
  };
5510
+ var isRunOrchestrator = function (log) { return !('shouldRunOrchestrator' in log) || log.shouldRunOrchestrator; };
5511
+ var hasLog = function (log, withOrchestrator) {
5512
+ if (withOrchestrator === void 0) { withOrchestrator = true; }
5513
+ return !!log && ('shouldRun' in log ||
5514
+ 'runRequired' in log ||
5515
+ (withOrchestrator && 'shouldRunOrchestrator' in log));
5516
+ };
5497
5517
  var isRecalculated = function (values, key) {
5498
5518
  if (key === void 0) { key = 'value'; }
5499
5519
  return values.some(function (v) { return (__spreadArray(__spreadArray([], __read((v.added || []))), __read((v.updated || [])))).includes(key); });
@@ -5527,18 +5547,26 @@
5527
5547
  var logSubValue = function (logs, key, prop) { return logs[key][prop] ? (Array.isArray(logs[key][prop]) ?
5528
5548
  logs[key][prop].map(function (id) { return ({ key: prop, id: id }); }) :
5529
5549
  { key: prop, id: logs[key][prop] }) : undefined; };
5530
- var logSubValues = function (logs, original, recalculated) { return Object.keys(logs)
5531
- .flatMap(function (key) { return [
5550
+ var logProperties = function (nodes, models) { return nodes.flatMap(function (node) { return (node.properties || []).map(function (_c) {
5551
+ var term = _c.term;
5552
+ return term['@id'];
5553
+ }); }).map(function (id) { return ({ key: 'property', id: id, configModels: findModels(models, id).map(function (_c) {
5554
+ var model = _c.model;
5555
+ return model;
5556
+ }) }); }); };
5557
+ var logSubValues = function (logs, original, recalculated, models) { return utils.unique(__spreadArray(__spreadArray(__spreadArray([], __read(Object.keys(logs).flatMap(function (key) { return [
5532
5558
  logSubValue(logs, key, 'input'),
5533
5559
  logSubValue(logs, key, 'property')
5534
5560
  ]
5535
5561
  .flat()
5536
5562
  .filter(Boolean)
5563
+ .map(function (v) { return (Object.assign(Object.assign({}, v), { configModels: [key] })); }); }))), __read(logProperties(original, models))), __read(logProperties(recalculated, models))))
5537
5564
  .map(function (v) {
5538
5565
  var originalValue = blankNodeValue(original, v.key, v.id);
5539
5566
  var recalculatedValue = blankNodeValue(recalculated, v.key, v.id);
5540
- return Object.assign(Object.assign({}, v), { configModels: [key], originalValue: originalValue, recalculatedValue: recalculatedValue, isRecalculated: !utils.isUndefined(recalculatedValue) && recalculatedValue !== originalValue });
5541
- }); }); };
5567
+ return Object.assign(Object.assign({}, v), { configModels: v.configModels, originalValue: originalValue, recalculatedValue: recalculatedValue, isRecalculated: !utils.isUndefined(recalculatedValue) && recalculatedValue !== originalValue });
5568
+ })
5569
+ .filter(function (v) { return v.configModels.length > 0; }); };
5542
5570
  var logKeys = function (logs, original, recalculated) { return Object.keys(logs)
5543
5571
  .filter(function (key) { return logs[key].isKey; })
5544
5572
  .map(function (key) { return ({
@@ -5633,11 +5661,12 @@
5633
5661
  this.terms = [];
5634
5662
  this.baseUrl = baseUrl();
5635
5663
  this.isExternal = isExternal();
5664
+ this.hasLog = hasLog;
5636
5665
  this.loading = true;
5637
5666
  this.blankNodes = [];
5638
5667
  this.methodModelsCount = 0;
5639
5668
  this.rowsCount = 0;
5640
- this.onlyWithData = true;
5669
+ this.onlyRequired = true;
5641
5670
  this.showLegend = true;
5642
5671
  this.LogStatus = LogStatus;
5643
5672
  this.logIcon = logIcon;
@@ -5709,8 +5738,11 @@
5709
5738
  return model;
5710
5739
  }))));
5711
5740
  var keys = logKeys(termLogs, original, recalculated);
5712
- var subValues = logSubValues(termLogs, original, recalculated);
5713
- var isRequired = !Object.values(termLogs).every(function (logs) { return logs.runRequired === false; });
5741
+ var subValues = logSubValues(termLogs, original, recalculated, allModels);
5742
+ var isRequired = !Object.values(termLogs)
5743
+ // ignore models that were never going to run
5744
+ .filter(isRunOrchestrator)
5745
+ .every(function (logs) { return logs.runRequired === false; });
5714
5746
  return {
5715
5747
  isOpen: true,
5716
5748
  canOpen: keys.length > 0 || subValues.length > 0,
@@ -5771,25 +5803,27 @@
5771
5803
  var value = (blankNodes === null || blankNodes === void 0 ? void 0 : blankNodes.length) ? blankNodes[0][key] : null;
5772
5804
  return ['string', 'number', 'boolean'].includes(typeof value) ? (value || '') : null;
5773
5805
  };
5774
- NodeLogsModelsComponent.prototype.togglePopover = function (popover, context) {
5775
- return popover.isOpen() ? popover.close() : popover.open(context);
5806
+ NodeLogsModelsComponent.prototype.openPopover = function (popover, _c) {
5807
+ var blankNode = _c.blankNode, methodId = _c.methodId, subValue = _c.subValue, logs = _c.logs;
5808
+ return this.hasLogDetails(blankNode, methodId, subValue) ? popover.open({ logs: logs }) : null;
5776
5809
  };
5777
5810
  NodeLogsModelsComponent.prototype.filterResults = function () {
5778
5811
  var _this = this;
5779
5812
  setTimeout(function () {
5780
5813
  _this.blankNodes = _this.allBlankNodes.filter(function (_c) {
5781
- var hasData = _c.hasData, isRequired = _c.isRequired, name = _c.term.name;
5814
+ var isRequired = _c.isRequired, name = _c.term.name;
5782
5815
  return _this.term
5783
5816
  ? name.toLowerCase().includes(_this.term.toLowerCase())
5784
- : !_this.onlyWithData || !_this.filteredType || (hasData && isRequired);
5817
+ : !_this.onlyRequired || !_this.filteredType || isRequired;
5785
5818
  });
5786
5819
  });
5787
5820
  };
5788
5821
  /** Logs **/
5789
5822
  NodeLogsModelsComponent.prototype.getSubvalueLogs = function (node, _c) {
5790
- var id = _c.id;
5823
+ var id = _c.id, key = _c.key;
5791
5824
  // try to get a more precise logs, defaults to id otherwise
5792
- return get$3(this.logs, [id, node.termId].join('.'), get$3(this.logs, id, {}));
5825
+ return get$3(this.logs, [id, node.termId].join('.'), key === 'property' ? {} : get$3(this.logs, id, {}) // property needs to be mapped to the exact node to work
5826
+ );
5793
5827
  };
5794
5828
  NodeLogsModelsComponent.prototype.getLogs = function (node, methodId, subValue) {
5795
5829
  var logs = (subValue === null || subValue === void 0 ? void 0 : subValue.key) ? this.getSubvalueLogs(node, subValue) : node.logs || {};
@@ -5798,9 +5832,6 @@
5798
5832
  NodeLogsModelsComponent.prototype.isBackground = function (log) {
5799
5833
  return (log === null || log === void 0 ? void 0 : log.methodTier) === schema.EmissionMethodTier.background;
5800
5834
  };
5801
- NodeLogsModelsComponent.prototype.isRunOrchestrator = function (log) {
5802
- return !('shouldRunOrchestrator' in log) || log.shouldRunOrchestrator;
5803
- };
5804
5835
  NodeLogsModelsComponent.prototype.isUserProvided = function (node, methodId, subValue) {
5805
5836
  var log = this.getLogs(node, methodId, subValue);
5806
5837
  return [
@@ -5811,13 +5842,6 @@
5811
5842
  this.hasLog(log, false) // skip if contains logs other than orchestrator
5812
5843
  ].every(function (v) { return !v; });
5813
5844
  };
5814
- NodeLogsModelsComponent.prototype.validSubValue = function (node, index, subValue) {
5815
- var methodId = this.getMethodIdAt(node, index, subValue);
5816
- var log = get$3(node.logs[methodId], subValue === null || subValue === void 0 ? void 0 : subValue.key, null);
5817
- return !(subValue === null || subValue === void 0 ? void 0 : subValue.id) || (
5818
- // subValue can be an array
5819
- Array.isArray(log) ? log.includes(subValue === null || subValue === void 0 ? void 0 : subValue.id) : log === (subValue === null || subValue === void 0 ? void 0 : subValue.id));
5820
- };
5821
5845
  NodeLogsModelsComponent.prototype.getMethodIdAt = function (node, index, subValue) {
5822
5846
  var configModels = (subValue || node).configModels;
5823
5847
  return configModels[index];
@@ -5830,12 +5854,6 @@
5830
5854
  (log === null || log === void 0 ? void 0 : log.model) ||
5831
5855
  (methodId ? methodIdLabel(methodId) : '');
5832
5856
  };
5833
- NodeLogsModelsComponent.prototype.hasLog = function (log, withOrchestrator) {
5834
- if (withOrchestrator === void 0) { withOrchestrator = true; }
5835
- return !!log && ('shouldRun' in log ||
5836
- 'runRequired' in log ||
5837
- (withOrchestrator && 'shouldRunOrchestrator' in log));
5838
- };
5839
5857
  NodeLogsModelsComponent.prototype.hasLogDetails = function (node, methodId, subValue) {
5840
5858
  var _a;
5841
5859
  var log = this.getLogs(node, methodId, subValue);
@@ -5848,17 +5866,16 @@
5848
5866
  var log = this.getLogs(node, methodId, subValue);
5849
5867
  return this.isUserProvided(node, methodId, subValue)
5850
5868
  ? LogStatus.dataProvided
5851
- : (this.hasLog(log)
5852
- ? (this.isRunOrchestrator(log)
5853
- ? (!node.isRequired
5854
- ? LogStatus.notRequired
5855
- : 'shouldRun' in log
5856
- ? log.shouldRun
5857
- ? LogStatus.success
5858
- : LogStatus.error
5859
- : LogStatus.dataProvided) : (node.isRecalculated
5860
- ? LogStatus.skipHierarchy
5861
- : LogStatus.dataProvided))
5869
+ : (hasLog(log)
5870
+ ? (!node.isRequired
5871
+ ? LogStatus.notRequired
5872
+ : isRunOrchestrator(log)
5873
+ ? ('shouldRun' in log
5874
+ ? log.shouldRun ? LogStatus.success : LogStatus.error
5875
+ : LogStatus.dataProvided)
5876
+ : node.isRecalculated
5877
+ ? LogStatus.skipHierarchy
5878
+ : LogStatus.dataProvided)
5862
5879
  : LogStatus.skipHierarchy);
5863
5880
  };
5864
5881
  NodeLogsModelsComponent.prototype.requirementKeys = function (requirements) {
@@ -5870,7 +5887,7 @@
5870
5887
  return NodeLogsModelsComponent;
5871
5888
  }());
5872
5889
  NodeLogsModelsComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: NodeLogsModelsComponent, deps: [{ token: HeSearchService }, { token: HeEngineService }], target: i0__namespace.ɵɵFactoryTarget.Component });
5873
- NodeLogsModelsComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: { nodeType: "nodeType", nodeKey: "nodeKey", includeAllModels: "includeAllModels", logsUrl: "logsUrl", originalValues: "originalValues", recalculatedValues: "recalculatedValues", terms: "terms", logs: "logs", filteredType: "filteredType" }, ngImport: i0__namespace, template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right mb-2\" *ngIf=\"!isExternal\">\n <a class=\"is-size-7\" *ngIf=\"logsUrl\" [href]=\"logsUrl\" target=\"_blank\">\n <fa-icon icon=\"external-link-alt\"></fa-icon>\n <span class=\"pl-2\">Open Full Logs</span>\n </a>\n </div>\n\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" [nbRows]=\"rowsCount\" maxHeight=\"320\">\n <table class=\"table is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto\">\n <div class=\"field\">\n <div class=\"control is-expanded has-icons-right\">\n <input class=\"input search-input is-small\"\n [(ngModel)]=\"term\" name=\"term\"\n placeholder=\"Filter by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"false\"\n (change)=\"filterResults()\"\n >\n <a class=\"icon is-small is-right\"\n [class.is-hidden]=\"!term\"\n (click)=\"term = ''; filterResults();\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th class=\"has-border-right\">Units</th>\n <th>Original</th>\n <th>Recalculated</th>\n <th>Difference</th>\n <th *ngFor=\"let c of methodModelsCount | times; let i = index\">({{i + 1}})</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngIf=\"loading\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n </td>\n </tr>\n <tr *ngIf=\"!loading && blankNodes.length === 0\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>No data</span>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes; trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\">\n <td class=\"width-auto\" [attr.title]=\"blankNode.term.name\">\n <a class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!blankNode.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"blankNode.isOpen\"></fa-icon>\n </a>\n <he-node-link class=\"is-inline-block\" [node]=\"blankNode.term\">\n <span class=\"is-nowrap has-text-ellipsis\">{{blankNode.term.name}}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\">\n <span>{{blankNode.term?.units}}</span>\n </td>\n <td>\n <span>{{blankNode.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notRecalculated\">\n {{blankNode.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td class=\"is-nowrap\">\n <he-blank-node-value-delta *ngIf=\"blankNode.original.length && blankNode.isRecalculated; else noValue\"\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"blankNode.originalValue\"\n ></he-blank-node-value-delta>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {blankNode: blankNode}\"></ng-container>\n </tr>\n\n <ng-container *ngIf=\"blankNode.keys?.length\">\n <tr\n *ngFor=\"let subValue of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n >\n <td class=\"width-auto has-text-left\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n\n <a class=\"is-inline-block\" *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\" target=\"_blank\" [title]=\"subValue.key\"\n >\n <span class=\"is-nowrap has-text-ellipsis\">{{subValue.key}}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{subValue.key}}</span>\n </td>\n <td class=\"has-border-right\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td>-</td>\n <td class=\"blank-node-index-key\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {blankNode:blankNode, methodId:subValue.key, logs:getLogs(blankNode, subValue.key)}\"></ng-container>\n </td>\n <td *ngIf=\"methodModelsCount > 1\" [attr.colspan]=\"methodModelsCount - 1\"></td>\n </tr>\n </ng-container>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n >\n <td class=\"width-auto has-text-left\">\n <span class=\"is-inline-block is-align-top pl-3\">{{subValue.key | keyToLabel}}</span>\n\n <ng-container *ngIf=\"subValue.id\">\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n\n <ng-container [ngSwitch]=\"subValue.key\">\n <span class=\"is-inline-block\" *ngSwitchCase=\"'backgroundData'\">{{subValue.id | keyToLabel}}</span>\n <he-node-link *ngSwitchDefault class=\"is-block pl-4\" [node]=\"{'@type':'Term','@id':subValue.id}\" [attr.title]=\"subValue.id | keyToLabel\">\n <span class=\"is-nowrap has-text-ellipsis\">{{subValue.id | keyToLabel}}</span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </td>\n <td class=\"has-border-right\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td>-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {blankNode: blankNode, subValue: subValue}\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <div class=\"is-size-7 is-italic\">\n <div class=\"columns is-variable is-1 my-0\">\n <div class=\"column is-narrow\">\n <p>\n <a class=\"is-inline-block pr-2\"\n (click)=\"showLegend = !showLegend\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!showLegend\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"showLegend\"></fa-icon>\n </a>\n <span class=\"is-inline-block\">Legend:</span>\n </p>\n <ul class=\"content pl-2\" [class.is-hidden]=\"!showLegend\">\n <li\n class=\"has-text-{{logColor[status.value]}}\"\n *ngFor=\"let status of LogStatus | keys\"\n >\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{status.value}}</span>\n </li>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType\">\n <label class=\"is-inline-block checkbox\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"onlyWithData\"\n (change)=\"filterResults()\"\n [disabled]=\"!!term\"\n >\n <span class=\"ml-2\">Show only relevant {{filteredType | pluralize}}</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-blankNode=\"blankNode\" let-subValue=\"subValue\">\n <td class=\"blank-node-index-{{i}}\" *ngFor=\"let c of methodModelsCount | times; let i = index\">\n <ng-container *ngIf=\"validSubValue(blankNode, i, subValue); else noValue\">\n <ng-container *ngIf=\"getMethodIdAt(blankNode, i, subValue); let methodId; else noValue\">\n <ng-template #modelSerie>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {blankNode:blankNode, methodId:methodId, subValue:subValue, logs:getLogs(blankNode, methodId, subValue)}\"></ng-container>\n </ng-template>\n <div *ngIf=\"methodId | isArray; else modelSerie\">\n <p *ngFor=\"let value of methodId\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {blankNode:blankNode, methodId:value, subValue:subValue, logs:getLogs(blankNode, methodId, subValue)}\"></ng-container>\n </p>\n </div>\n </ng-container>\n </ng-container>\n </td>\n</ng-template>\n\n<ng-template #blankNodeModel let-blankNode=\"blankNode\" let-methodId=\"methodId\" let-subValue=\"subValue\" let-logs=\"logs\">\n <span\n [class.trigger-popover]=\"hasLogDetails(blankNode, methodId, subValue)\"\n [ngbPopover]=\"logDetails\" [autoClose]=\"'outside'\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"hasLogDetails(blankNode, methodId, subValue) ? togglePopover(p, { logs }) : null\"\n >\n <span class=\"is-capitalized\">{{methodName(blankNode, methodId, subValue)}}</span>\n <span class=\"pl-1\" *ngIf=\"hasLog(logs) && logs?.methodTier\">[{{logs.methodTier}}]</span>\n <span class=\"pl-1 has-text-{{logColor[logStatus(blankNode, methodId, subValue)]}}\">\n <fa-icon [icon]=\"logIcon[logStatus(blankNode, methodId, subValue)]\"></fa-icon>\n </span>\n </span>\n</ng-template>\n\n<ng-template #noValue>-</ng-template>\n\n<ng-template #notRecalculated>not recalculated</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <ng-container *ngIf=\"logs.requirements\">\n <p class=\"is-requirement\" *ngFor=\"let key of requirementKeys(logs.requirements)\">\n {{key}}: {{logs.requirements[key]}}\n </p>\n </ng-container>\n <ng-container *ngIf=\"logs.logs\">\n <p class=\"is-log\" *ngFor=\"let key of logs.logs | keys\">\n {{key.key}}: {{key.value}}\n </p>\n </ng-container>\n <ng-container *ngIf=\"logs.missingLookups?.length\">\n <p class=\"mt-2\">Missing lookups:</p>\n\n <div class=\"table-container data-table-container\">\n <table class=\"table is-fullwidth mb-0\">\n <thead class=\"has-background-black\">\n <tr>\n <th>\n <span class=\"has-text-white\">Filename</span>\n </th>\n <th>\n <span class=\"has-text-white\">Column Title</span>\n </th>\n <th>\n <span class=\"has-text-white\">Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-background-black has-text-white\">\n <tr *ngFor=\"let data of logs.missingLookups\">\n <td>{{data.filename}}</td>\n <td>{{data.column}}</td>\n <td>{{data.termId}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </ng-container>\n</ng-template>\n", styles: [":host{display:block}::ng-deep tr.has-sub-rows td{border-bottom-style:dotted}::ng-deep td he-node-link{width:190px}::ng-deep td .open-node+he-node-link{width:170px}\n"], components: [{ type: i1__namespace.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "nbRows", "small", "height", "width"] }, { type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink"] }, { type: BlankNodeValueDeltaComponent, selector: "he-blank-node-value-delta", inputs: ["value", "originalValue", "displayType"] }], directives: [{ type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1__namespace$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i11__namespace.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "placement", "container", "editable", "focusFirst", "showHint", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { type: i1__namespace$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1__namespace$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2__namespace.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i2__namespace.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i2__namespace.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i1__namespace$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i11__namespace.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }], pipes: { "times": TimesPipe, "default": DefaultPipe, "precision": PrecisionPipe, "keyToLabel": KeyToLabelPipe, "keys": KeysPipe, "pluralize": PluralizePipe, "isArray": IsArrayPipe } });
5890
+ NodeLogsModelsComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: { nodeType: "nodeType", nodeKey: "nodeKey", includeAllModels: "includeAllModels", logsUrl: "logsUrl", originalValues: "originalValues", recalculatedValues: "recalculatedValues", terms: "terms", logs: "logs", filteredType: "filteredType" }, ngImport: i0__namespace, template: "<div class=\"px-3 pb-3\">\n <div class=\"has-text-right mb-2\" *ngIf=\"!isExternal\">\n <a class=\"is-size-7\" *ngIf=\"logsUrl\" [href]=\"logsUrl\" target=\"_blank\">\n <fa-icon icon=\"external-link-alt\"></fa-icon>\n <span class=\"pl-2\">Open Full Logs</span>\n </a>\n </div>\n\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" [nbRows]=\"rowsCount\" maxHeight=\"320\">\n <table class=\"table is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto\">\n <div class=\"field\">\n <div class=\"control is-expanded has-icons-right\">\n <input class=\"input search-input is-small\"\n [(ngModel)]=\"term\" name=\"term\"\n placeholder=\"Filter by name\"\n [ngbTypeahead]=\"suggestTerm\"\n [focusFirst]=\"false\"\n (change)=\"filterResults()\"\n >\n <a class=\"icon is-small is-right\"\n [class.is-hidden]=\"!term\"\n (click)=\"term = ''; filterResults();\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n </div>\n </th>\n <th class=\"has-border-right\">Units</th>\n <th>Original</th>\n <th>Recalculated</th>\n <th>Difference</th>\n <th *ngFor=\"let c of methodModelsCount | times; let i = index\">({{i + 1}})</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngIf=\"loading\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n </td>\n </tr>\n <tr *ngIf=\"!loading && blankNodes.length === 0\">\n <td class=\"has-text-centered\" colspan=\"6\">\n <span>No data</span>\n </td>\n </tr>\n <ng-container *ngFor=\"let blankNode of blankNodes; trackBy: trackByBlankNode\">\n <tr [class.has-sub-rows]=\"blankNode.canOpen\">\n <td class=\"width-auto\" [attr.title]=\"blankNode.term.name\">\n <a class=\"is-inline-block is-align-top pr-2 open-node\"\n (click)=\"blankNode.isOpen = !blankNode.isOpen\"\n *ngIf=\"blankNode.canOpen\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!blankNode.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"blankNode.isOpen\"></fa-icon>\n </a>\n <he-node-link class=\"is-inline-block\" [node]=\"blankNode.term\">\n <span class=\"is-nowrap has-text-ellipsis\">{{blankNode.term.name}}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\">\n <span>{{blankNode.term?.units}}</span>\n </td>\n <td>\n <span>{{blankNode.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"!blankNode.isOriginal || blankNode.isRecalculated; else notRecalculated\">\n {{blankNode.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td class=\"is-nowrap\">\n <he-blank-node-value-delta *ngIf=\"blankNode.original.length && blankNode.isRecalculated; else noValue\"\n [value]=\"blankNode.recalculatedValue\"\n [originalValue]=\"blankNode.originalValue\"\n ></he-blank-node-value-delta>\n </td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {blankNode: blankNode}\"></ng-container>\n </tr>\n\n <ng-container *ngIf=\"blankNode.keys?.length\">\n <tr\n *ngFor=\"let subValue of blankNode.keys\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n [class.has-sub-rows]=\"blankNode.subValues?.length\"\n >\n <td class=\"width-auto has-text-left\">\n <span class=\"is-inline-block is-align-top pl-3 pr-1 field-node\">Field:</span>\n\n <a class=\"is-inline-block\" *ngIf=\"blankNode.type\"\n [href]=\"baseUrl + '/schema/' + blankNode.type + '#' + subValue.key\" target=\"_blank\" [title]=\"subValue.key\"\n >\n <span class=\"is-nowrap has-text-ellipsis\">{{subValue.key}}</span>\n </a>\n <span class=\"is-inline-block is-align-top\" *ngIf=\"!blankNode.type\">{{subValue.key}}</span>\n </td>\n <td class=\"has-border-right\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td>-</td>\n <td class=\"blank-node-index-key\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {blankNode:blankNode, methodId:subValue.key, logs:getLogs(blankNode, subValue.key)}\"></ng-container>\n </td>\n <td *ngIf=\"methodModelsCount > 1\" [attr.colspan]=\"methodModelsCount - 1\"></td>\n </tr>\n </ng-container>\n\n <tr\n *ngFor=\"let subValue of blankNode.subValues\"\n [class.is-hidden]=\"!blankNode.isOpen\"\n >\n <td class=\"width-auto has-text-left\">\n <span class=\"is-inline-block is-align-top pl-3\">{{subValue.key | keyToLabel}}</span>\n\n <ng-container *ngIf=\"subValue.id\">\n <span class=\"is-inline-block\" class=\"is-inline-block is-align-top pr-1\">:</span>\n\n <ng-container [ngSwitch]=\"subValue.key\">\n <span class=\"is-inline-block\" *ngSwitchCase=\"'backgroundData'\">{{subValue.id | keyToLabel}}</span>\n <he-node-link *ngSwitchDefault class=\"is-block pl-4\" [node]=\"{'@type':'Term','@id':subValue.id}\" [attr.title]=\"subValue.id | keyToLabel\">\n <span class=\"is-nowrap has-text-ellipsis\">{{subValue.id | keyToLabel}}</span>\n </he-node-link>\n </ng-container>\n </ng-container>\n </td>\n <td class=\"has-border-right\"></td>\n <td>\n <span *ngIf=\"subValue.originalValue !== null; else noValue\">{{subValue.originalValue | precision:3 | default:'-'}}</span>\n </td>\n <td>\n <span *ngIf=\"subValue.isRecalculated; else notRecalculated\">\n {{subValue.recalculatedValue | precision:3 | default:'-'}}\n </span>\n </td>\n <td>-</td>\n <ng-container *ngTemplateOutlet=\"blankNodeModels; context: {blankNode: blankNode, subValue: subValue}\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <div class=\"is-size-7 is-italic\">\n <div class=\"columns is-variable is-1 my-0\">\n <div class=\"column is-narrow\">\n <p>\n <a class=\"is-inline-block pr-2\"\n (click)=\"showLegend = !showLegend\"\n >\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!showLegend\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"showLegend\"></fa-icon>\n </a>\n <span class=\"is-inline-block\">Legend:</span>\n </p>\n <ul class=\"content pl-2\" [class.is-hidden]=\"!showLegend\">\n <li\n class=\"has-text-{{logColor[status.value]}}\"\n *ngFor=\"let status of LogStatus | keys\"\n >\n <fa-icon [icon]=\"logIcon[status.value]\"></fa-icon>\n <span class=\"pl-1\">{{status.value}}</span>\n </li>\n </ul>\n </div>\n <div class=\"column has-text-right\" *ngIf=\"filteredType\">\n <label class=\"is-inline-block checkbox\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"onlyRequired\"\n (change)=\"filterResults()\"\n [disabled]=\"!!term\"\n >\n <span class=\"ml-2\">Show only relevant {{filteredType | pluralize}}</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #blankNodeModels let-blankNode=\"blankNode\" let-subValue=\"subValue\">\n <td class=\"blank-node-index-{{i}}\" *ngFor=\"let c of methodModelsCount | times; let i = index\">\n <ng-container *ngIf=\"getMethodIdAt(blankNode, i, subValue); let methodId; else noValue\">\n <ng-template #modelSerie>\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {blankNode:blankNode, methodId:methodId, subValue:subValue, logs:getLogs(blankNode, methodId, subValue)}\"></ng-container>\n </ng-template>\n <div *ngIf=\"methodId | isArray; else modelSerie\">\n <p *ngFor=\"let value of methodId\">\n <ng-container *ngTemplateOutlet=\"blankNodeModel; context: {blankNode:blankNode, methodId:value, subValue:subValue, logs:getLogs(blankNode, value, subValue)}\"></ng-container>\n </p>\n </div>\n </ng-container>\n </td>\n</ng-template>\n\n<ng-template #blankNodeModel let-blankNode=\"blankNode\" let-methodId=\"methodId\" let-subValue=\"subValue\" let-logs=\"logs\">\n <span\n [class.trigger-popover]=\"hasLogDetails(blankNode, methodId, subValue)\"\n [ngbPopover]=\"logDetails\" [autoClose]=\"'outside'\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"p.isOpen() ? p.close() : openPopover(p, { blankNode, methodId, subValue, logs })\"\n >\n <span class=\"is-capitalized\">{{methodName(blankNode, methodId, subValue)}}</span>\n <span class=\"pl-1\" *ngIf=\"hasLog(logs) && logs?.methodTier\">[{{logs.methodTier}}]</span>\n <span class=\"pl-1 has-text-{{logColor[logStatus(blankNode, methodId, subValue)]}}\">\n <fa-icon [icon]=\"logIcon[logStatus(blankNode, methodId, subValue)]\"></fa-icon>\n </span>\n </span>\n</ng-template>\n\n<ng-template #noValue>-</ng-template>\n\n<ng-template #notRecalculated>not recalculated</ng-template>\n\n<ng-template #logDetails let-logs=\"logs\">\n <ng-container *ngIf=\"logs?.requirements\">\n <p class=\"is-requirement\" *ngFor=\"let key of requirementKeys(logs.requirements)\">\n {{key}}: {{logs.requirements[key]}}\n </p>\n </ng-container>\n <ng-container *ngIf=\"logs?.logs\">\n <p class=\"is-log\" *ngFor=\"let key of logs.logs | keys\">\n {{key.key}}: {{key.value}}\n </p>\n </ng-container>\n <ng-container *ngIf=\"logs?.missingLookups?.length\">\n <p class=\"mt-2\">Missing lookups:</p>\n\n <div class=\"table-container data-table-container\">\n <table class=\"table is-fullwidth mb-0\">\n <thead class=\"has-background-black\">\n <tr>\n <th>\n <span class=\"has-text-white\">Filename</span>\n </th>\n <th>\n <span class=\"has-text-white\">Column Title</span>\n </th>\n <th>\n <span class=\"has-text-white\">Row (term.id)</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"has-background-black has-text-white\">\n <tr *ngFor=\"let data of logs.missingLookups\">\n <td>{{data.filename}}</td>\n <td>{{data.column}}</td>\n <td>{{data.termId}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </ng-container>\n</ng-template>\n", styles: [":host{display:block}::ng-deep tr.has-sub-rows td{border-bottom-style:dotted}::ng-deep td he-node-link{width:190px}::ng-deep td .open-node+he-node-link{width:170px}\n"], components: [{ type: i1__namespace.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "nbRows", "small", "height", "width"] }, { type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink"] }, { type: BlankNodeValueDeltaComponent, selector: "he-blank-node-value-delta", inputs: ["value", "originalValue", "displayType"] }], directives: [{ type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1__namespace$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i11__namespace.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "placement", "container", "editable", "focusFirst", "showHint", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { type: i1__namespace$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1__namespace$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2__namespace.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i2__namespace.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i2__namespace.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i1__namespace$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i11__namespace.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }], pipes: { "times": TimesPipe, "default": DefaultPipe, "precision": PrecisionPipe, "keyToLabel": KeyToLabelPipe, "keys": KeysPipe, "pluralize": PluralizePipe, "isArray": IsArrayPipe } });
5874
5891
  i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: NodeLogsModelsComponent, decorators: [{
5875
5892
  type: i0.Component,
5876
5893
  args: [{
@@ -5941,7 +5958,7 @@
5941
5958
  'methodModelDescription', 'description',
5942
5959
  'primary', 'emissionDuration', 'observations', 'statsDefinition',
5943
5960
  'term', 'source', 'variety', 'reliability', 'price', 'currency', 'cost', 'revenue', 'economicValueShare',
5944
- 'impactAssessment'
5961
+ 'impactAssessment', 'properties'
5945
5962
  ];
5946
5963
  var tableKeys = [
5947
5964
  'inputs', 'transformation', 'value', 'dates', 'methodModel', 'methodTier', 'statsDefinition'
@@ -7617,6 +7634,7 @@
7617
7634
  propertyValueType(Object.assign(Object.assign({}, schema), { type: [schema.items.type] })) :
7618
7635
  schema.type) : typeof value); };
7619
7636
  var propertyTypeParseValue = {
7637
+ undefined: function () { return undefined; },
7620
7638
  object: function (val) { return safeJSONParse(val); },
7621
7639
  array: function (val, schema) {
7622
7640
  var items = schema.items;
@@ -8149,12 +8167,7 @@
8149
8167
  });
8150
8168
  };
8151
8169
  SitesMapsComponent.prototype.centerPolygons = function (polygons) {
8152
- try {
8153
- return (polygons === null || polygons === void 0 ? void 0 : polygons.length) ? this.map.googleMap.fitBounds(polygonBounds(polygons)) : null;
8154
- }
8155
- catch (err) {
8156
- return (polygons === null || polygons === void 0 ? void 0 : polygons.length) ? this.map.googleMap.fitBounds(polygonBounds(polygons[0])) : null;
8157
- }
8170
+ return (polygons === null || polygons === void 0 ? void 0 : polygons.length) ? this.map.googleMap.fitBounds(polygonBounds(polygons)) : null;
8158
8171
  };
8159
8172
  SitesMapsComponent.prototype.addSiteMarkers = function (sites) {
8160
8173
  var siteMarkers = sites.map(siteMarker).filter(Boolean);
@@ -9054,7 +9067,7 @@
9054
9067
  var parseLog = function (data) { return ({
9055
9068
  modelId: data.model,
9056
9069
  impactTermId: data['key/term'] || data.term || data.indicator,
9057
- emissionsResourceUseTermId: data.node,
9070
+ blankNodeTermId: data.node,
9058
9071
  coefficient: +data.coefficient,
9059
9072
  value: +data.value * +data.coefficient
9060
9073
  }); };
@@ -9076,10 +9089,10 @@
9076
9089
  ], __read(logs
9077
9090
  .sort(function (a, b) { return a.impactTermId.localeCompare(b.impactTermId); })
9078
9091
  .flatMap(function (_d) {
9079
- var impactTermId = _d.impactTermId, impactTermUnits = _d.impactTermUnits, modelId = _d.modelId, emissionsResourceUseTermId = _d.emissionsResourceUseTermId, value = _d.value, inputs = _d.inputs;
9092
+ var impactTermId = _d.impactTermId, impactTermUnits = _d.impactTermUnits, modelId = _d.modelId, blankNodeTermId = _d.blankNodeTermId, value = _d.value, inputs = _d.inputs;
9080
9093
  return __spreadArray([
9081
- [impactTermId, impactTermUnits, modelId, emissionsResourceUseTermId, value, '', '']
9082
- ], __read((inputs.map(function (v) { return [impactTermId, impactTermUnits, modelId, emissionsResourceUseTermId, '', v.name, v.value]; }))));
9094
+ [impactTermId, impactTermUnits, modelId, blankNodeTermId, value, '', '']
9095
+ ], __read((inputs.map(function (v) { return [impactTermId, impactTermUnits, modelId, blankNodeTermId, '', v.name, v.value]; }))));
9083
9096
  })
9084
9097
  .map(function (v) {
9085
9098
  var _a;
@@ -9098,19 +9111,25 @@
9098
9111
  this.indicators = [];
9099
9112
  this.loading = true;
9100
9113
  this.terms = [];
9114
+ this.methods = [];
9101
9115
  this.noData = false;
9102
9116
  }
9103
9117
  ImpactAssessmentsIndicatorBreakdownChartComponent.prototype.ngOnInit = function () {
9104
9118
  return __awaiter(this, void 0, void 0, function () {
9105
- var _d, results;
9119
+ var impacts, _d, results;
9106
9120
  var _this = this;
9107
9121
  return __generator(this, function (_e) {
9108
9122
  switch (_e.label) {
9109
9123
  case 0:
9110
- this.terms = this.indicators.map(function (_d) {
9124
+ this.terms = utils.unique(this.indicators.map(function (_d) {
9111
9125
  var term = _d.term;
9112
9126
  return term;
9113
- });
9127
+ }).filter(Boolean));
9128
+ this.methods = utils.unique(this.indicators.map(function (_d) {
9129
+ var methodModel = _d.methodModel;
9130
+ return methodModel;
9131
+ }).filter(Boolean));
9132
+ impacts = __spreadArray(__spreadArray([], __read(this.impactAssessment.impacts || [])), __read(this.impactAssessment.endpoints || []));
9114
9133
  _d = this;
9115
9134
  return [4 /*yield*/, rxjs.of(Object.assign(Object.assign({}, this.impactAssessment), { dataState: api.DataState.recalculated })).pipe(operators.mergeMap(function (node) { return _this.nodeService.getLog(node); }), operators.map(function (value) { return value ? parseLines(value) : []; }), operators.mergeAll(), operators.filter(function (_d) {
9116
9135
  var data = _d.data;
@@ -9118,20 +9137,19 @@
9118
9137
  }), operators.map(function (_d) {
9119
9138
  var data = _d.data;
9120
9139
  return parseMessage(data.message);
9121
- }), operators.filter(function (message) { return 'node' in message; }), operators.map(parseLog), operators.filter(function (log) { return !!log.impactTermId && !!log.emissionsResourceUseTermId && !isNaN(log.value) && log.value > 0; }), operators.groupBy(function (log) { return [log.impactTermId, log.emissionsResourceUseTermId].join('/'); }), operators.mergeMap(function (group) { return group.pipe(operators.toArray()); }), operators.map(function (values) {
9122
- var _a, _b;
9140
+ }), operators.filter(function (message) { return 'node' in message; }), operators.map(parseLog), operators.filter(function (log) { return !!log.impactTermId && !!log.blankNodeTermId && !isNaN(log.value) && log.value > 0; }), operators.groupBy(function (log) { return [log.impactTermId, log.blankNodeTermId, log.modelId].join('/'); }), operators.mergeMap(function (group) { return group.pipe(operators.toArray()); }), operators.map(function (values) {
9141
+ var _a;
9123
9142
  var log = values[0];
9124
9143
  var total = values.reduce(function (prev, curr) { return prev + curr.value; }, 0);
9125
- var emissions = (_this.impactAssessment.emissionsResourceUse || [])
9126
- .filter(function (v) { return v.term['@id'] === log.emissionsResourceUseTermId; });
9127
- var inputs = emissions
9144
+ var blankNodes = (__spreadArray(__spreadArray([], __read(_this.impactAssessment.emissionsResourceUse || [])), __read(_this.impactAssessment.impacts || [])))
9145
+ .filter(function (v) { return v.term['@id'] === log.blankNodeTermId; });
9146
+ var inputs = blankNodes
9128
9147
  .filter(function (v) { var _a; return (_a = v.inputs) === null || _a === void 0 ? void 0 : _a.length; })
9129
9148
  .map(function (v) { return ({ name: v.inputs.map(function (i) { return i['@id']; }).join(';'), value: v.value * log.coefficient }); });
9130
9149
  var inputsValue = inputs.reduce(function (prev, curr) { return prev + curr.value; }, 0);
9131
- var impacts = (_this.impactAssessment.impacts || [])
9132
- .filter(function (v) { return v.term['@id'] === log.impactTermId; });
9150
+ var impact = impacts.find(function (v) { return v.term['@id'] === log.impactTermId; });
9133
9151
  // logs might exist but impact was not added => skip logs
9134
- return impacts.length ? Object.assign(Object.assign({}, log), { impactTermUnits: (_b = (_a = impacts === null || impacts === void 0 ? void 0 : impacts[0]) === null || _a === void 0 ? void 0 : _a.term) === null || _b === void 0 ? void 0 : _b.units, value: total, inputs: inputs, inputsValue: inputsValue }) : null;
9152
+ return impact ? Object.assign(Object.assign({}, log), { impactTermUnits: (_a = impact.term) === null || _a === void 0 ? void 0 : _a.units, value: total, inputs: inputs, inputsValue: inputsValue }) : null;
9135
9153
  }), operators.filter(function (log) { return !!log; }), operators.toArray()).toPromise()];
9136
9154
  case 1:
9137
9155
  _d.logs = (_e.sent());
@@ -9172,16 +9190,16 @@
9172
9190
  var _a, _b, _c;
9173
9191
  var logs = this.logs
9174
9192
  .filter(function (_d) {
9175
- var impactTermId = _d.impactTermId;
9176
- return impactTermId === _this.selectedTerm['@id'];
9193
+ var impactTermId = _d.impactTermId, modelId = _d.modelId;
9194
+ return impactTermId === _this.selectedTerm['@id'] && (!_this.selectedMethod || modelId === _this.selectedMethod['@id']);
9177
9195
  })
9178
9196
  .sort(function (a, b) { return b.value - a.value; });
9179
9197
  this.noData = logs.length === 0;
9180
9198
  var total = logs.reduce(function (prev, curr) { return prev + curr.value; }, 0);
9181
9199
  var labels = logs.map(function (_d) {
9182
- var emissionsResourceUseTermId = _d.emissionsResourceUseTermId;
9200
+ var blankNodeTermId = _d.blankNodeTermId;
9183
9201
  var _a;
9184
- return ((_a = _this.emissions.find(function (v) { return v['@id'] === emissionsResourceUseTermId; })) === null || _a === void 0 ? void 0 : _a.name) || emissionsResourceUseTermId;
9202
+ return ((_a = _this.emissions.find(function (v) { return v['@id'] === blankNodeTermId; })) === null || _a === void 0 ? void 0 : _a.name) || blankNodeTermId;
9185
9203
  });
9186
9204
  // display the breakdown by input
9187
9205
  // const inputs = logs.flatMap(v => v.inputs.map(i => i.name));
@@ -9264,7 +9282,7 @@
9264
9282
  return ImpactAssessmentsIndicatorBreakdownChartComponent;
9265
9283
  }());
9266
9284
  ImpactAssessmentsIndicatorBreakdownChartComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: ImpactAssessmentsIndicatorBreakdownChartComponent, deps: [{ token: i0__namespace.NgZone }, { token: i1__namespace$2.DomSanitizer }, { token: HeSearchService }, { token: HeNodeService }], target: i0__namespace.ɵɵFactoryTarget.Component });
9267
- ImpactAssessmentsIndicatorBreakdownChartComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: ImpactAssessmentsIndicatorBreakdownChartComponent, selector: "he-impact-assessments-indicator-breakdown-chart", inputs: { impactAssessment: "impactAssessment", indicators: "indicators" }, viewQueries: [{ propertyName: "chartRef", first: true, predicate: ["chart"], descendants: true }], ngImport: i0__namespace, template: "<div class=\"p-3\" [class.is-hidden]=\"loading || !terms?.length\">\n <div class=\"columns\">\n <div class=\"column\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <span class=\"button is-small is-static\">Select an Indicator</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-fullwidth is-small\">\n <select (change)=\"updateChart()\" [(ngModel)]=\"selectedTerm\" id=\"selectedTerm\">\n <option *ngFor=\"let term of terms\" [ngValue]=\"term\">{{term.name}} ({{term.units}})</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n <div class=\"column is-narrow\">\n <a class=\"button is-dark is-outlined is-small\" [href]=\"csvContent\" [download]=\"id + '-logs.csv'\">\n <fa-icon icon=\"download\"></fa-icon>\n <span class=\"pl-2\">Download All (CSV)</span>\n </a>\n </div>\n </div>\n\n <div class=\"mt-1\">\n <p *ngIf=\"noData\" class=\"has-text-centered\">No breakdown available for {{selectedTerm?.name}}.</p>\n <div class=\"chart-container h-100\">\n <canvas #chart></canvas>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"loading\">\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n</ng-container>\n", styles: [":host{display:block;overflow:visible}.chart-container{height:400px;position:relative}\n"], components: [{ type: i1__namespace.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }], directives: [{ type: i1__namespace$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1__namespace$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1__namespace$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1__namespace$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1__namespace$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
9285
+ ImpactAssessmentsIndicatorBreakdownChartComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: ImpactAssessmentsIndicatorBreakdownChartComponent, selector: "he-impact-assessments-indicator-breakdown-chart", inputs: { impactAssessment: "impactAssessment", indicators: "indicators" }, viewQueries: [{ propertyName: "chartRef", first: true, predicate: ["chart"], descendants: true }], ngImport: i0__namespace, template: "<div class=\"p-3\" [class.is-hidden]=\"loading || !terms?.length\">\n <div class=\"columns\">\n <div class=\"column\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <span class=\"button is-small is-static\">Select an Indicator</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-fullwidth is-small\">\n <select (change)=\"updateChart()\" [(ngModel)]=\"selectedTerm\" id=\"selectedTerm\">\n <option *ngFor=\"let term of terms\" [ngValue]=\"term\">{{term.name}} ({{term.units}})</option>\n </select>\n </div>\n </div>\n <div class=\"control is-expanded\" *ngIf=\"methods?.length\">\n <div class=\"select is-fullwidth is-small\">\n <select (change)=\"updateChart()\" [(ngModel)]=\"selectedMethod\" id=\"selectedMethod\">\n <option [ngValue]=\"undefined\">Filter Model</option>\n <option *ngFor=\"let term of methods\" [ngValue]=\"term\">{{term.name}}</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n <div class=\"column is-narrow\">\n <a class=\"button is-dark is-outlined is-small\" [href]=\"csvContent\" [download]=\"id + '-logs.csv'\">\n <fa-icon icon=\"download\"></fa-icon>\n <span class=\"pl-2\">Download All (CSV)</span>\n </a>\n </div>\n </div>\n\n <p class=\"is-size-7\" *ngIf=\"!selectedMethod\">\n <i>Selecting a Model is recommended to avoid duplicated entries.</i>\n </p>\n\n <div class=\"mt-1\">\n <p *ngIf=\"noData\" class=\"has-text-centered\">\n <span>No breakdown available for {{selectedTerm?.name}}</span>\n <span class=\"pl-1\" *ngIf=\"selectedMethod\">({{selectedMethod.name}})</span>\n <span>.</span>\n </p>\n <div class=\"chart-container h-100\">\n <canvas #chart></canvas>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"loading\">\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n</ng-container>\n", styles: [":host{display:block;overflow:visible}.chart-container{height:400px;position:relative}\n"], components: [{ type: i1__namespace.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }], directives: [{ type: i1__namespace$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1__namespace$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1__namespace$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1__namespace$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1__namespace$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
9268
9286
  i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: ImpactAssessmentsIndicatorBreakdownChartComponent, decorators: [{
9269
9287
  type: i0.Component,
9270
9288
  args: [{
@@ -9413,11 +9431,11 @@
9413
9431
  this.loading = true;
9414
9432
  this.NodeType = schema.NodeType;
9415
9433
  this.models = [];
9416
- this.emissions = [];
9434
+ this.terms = [];
9417
9435
  }
9418
9436
  ImpactAssessmentsProductsLogsComponent.prototype.ngOnInit = function () {
9419
9437
  return __awaiter(this, void 0, void 0, function () {
9420
- var _a, emissions;
9438
+ var _a, terms, showAllEmissions;
9421
9439
  return __generator(this, function (_b) {
9422
9440
  switch (_b.label) {
9423
9441
  case 0:
@@ -9440,8 +9458,9 @@
9440
9458
  }
9441
9459
  })];
9442
9460
  case 2:
9443
- emissions = (_b.sent()).results;
9444
- this.emissions = emissions;
9461
+ terms = (_b.sent()).results;
9462
+ showAllEmissions = this.key !== 'emissionsResourceUse' || (this.filterTermTypes || []).length === 1;
9463
+ this.terms = showAllEmissions ? terms : [];
9445
9464
  this.loading = false;
9446
9465
  return [2 /*return*/];
9447
9466
  }
@@ -9472,7 +9491,7 @@
9472
9491
  return ImpactAssessmentsProductsLogsComponent;
9473
9492
  }());
9474
9493
  ImpactAssessmentsProductsLogsComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: ImpactAssessmentsProductsLogsComponent, deps: [{ token: HeSearchService }, { token: HeNodeService }], target: i0__namespace.ɵɵFactoryTarget.Component });
9475
- ImpactAssessmentsProductsLogsComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: ImpactAssessmentsProductsLogsComponent, selector: "he-impact-assessments-products-logs", inputs: { impactAssessment: "impactAssessment", key: "key", filterTermTypes: "filterTermTypes", originalValues: "originalValues", recalculatedValues: "recalculatedValues" }, ngImport: i0__namespace, template: "<he-node-logs-models *ngIf=\"!loading; else loader\"\n [logsUrl]=\"logsUrl\"\n [nodeType]=\"NodeType.ImpactAssessment\"\n [nodeKey]=\"key\"\n [originalValues]=\"originalValues\"\n [recalculatedValues]=\"recalculatedValues\"\n [terms]=\"emissions\"\n [logs]=\"logs\"\n [filteredType]=\"filteredType\"\n [includeAllModels]=\"includeAllModels\"\n></he-node-logs-models>\n\n<ng-template #loader>\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n</ng-template>\n", styles: [""], components: [{ type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["nodeType", "nodeKey", "includeAllModels", "logsUrl", "originalValues", "recalculatedValues", "terms", "logs", "filteredType"] }, { type: i1__namespace.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }], directives: [{ type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
9494
+ ImpactAssessmentsProductsLogsComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: ImpactAssessmentsProductsLogsComponent, selector: "he-impact-assessments-products-logs", inputs: { impactAssessment: "impactAssessment", key: "key", filterTermTypes: "filterTermTypes", originalValues: "originalValues", recalculatedValues: "recalculatedValues" }, ngImport: i0__namespace, template: "<he-node-logs-models *ngIf=\"!loading; else loader\"\n [logsUrl]=\"logsUrl\"\n [nodeType]=\"NodeType.ImpactAssessment\"\n [nodeKey]=\"key\"\n [originalValues]=\"originalValues\"\n [recalculatedValues]=\"recalculatedValues\"\n [terms]=\"terms\"\n [logs]=\"logs\"\n [filteredType]=\"filteredType\"\n [includeAllModels]=\"includeAllModels\"\n></he-node-logs-models>\n\n<ng-template #loader>\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n</ng-template>\n", styles: [""], components: [{ type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["nodeType", "nodeKey", "includeAllModels", "logsUrl", "originalValues", "recalculatedValues", "terms", "logs", "filteredType"] }, { type: i1__namespace.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }], directives: [{ type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
9476
9495
  i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: ImpactAssessmentsProductsLogsComponent, decorators: [{
9477
9496
  type: i0.Component,
9478
9497
  args: [{
@@ -9500,13 +9519,6 @@
9500
9519
  View["breakdown"] = "breakdown";
9501
9520
  View["logs"] = "logs";
9502
9521
  })(View || (View = {}));
9503
- var isMethodModelAllowed = function (filterMethod) { return function (node) {
9504
- var _a, _b, _c, _d;
9505
- return filterMethod
9506
- ? ((_a = node.methodModel) === null || _a === void 0 ? void 0 : _a['@id']) === filterMethod['@id']
9507
- : (typeof glossary.getDefaultModeId((_b = node.term) === null || _b === void 0 ? void 0 : _b['@id']) === 'undefined' ||
9508
- ((_c = node.methodModel) === null || _c === void 0 ? void 0 : _c['@id']) === glossary.getDefaultModeId((_d = node.term) === null || _d === void 0 ? void 0 : _d['@id']));
9509
- }; };
9510
9522
  var ImpactAssessmentsProductsComponent = /** @class */ (function () {
9511
9523
  function ImpactAssessmentsProductsComponent(nodeService) {
9512
9524
  this.nodeService = nodeService;
@@ -9570,28 +9582,28 @@
9570
9582
  var _this = this;
9571
9583
  var indicatorPerImpactAssessment = groupNodesByTerm(this.impactAssessments, this.key, this.originalValues, isMethodModelAllowed(this.selectedMethodModel));
9572
9584
  this.indicators = orderBy(grouppedKeys(indicatorPerImpactAssessment), ['value.methodTierOrder', 'key'], ['asc', 'asc'])
9573
- .filter(function (_e) {
9574
- var value = _e.value;
9585
+ .filter(function (_b) {
9586
+ var value = _b.value;
9575
9587
  return _this.termAllowed(value === null || value === void 0 ? void 0 : value.term);
9576
9588
  });
9577
9589
  };
9578
9590
  ImpactAssessmentsProductsComponent.prototype.loadDataState = function (dataState) {
9579
9591
  return __awaiter(this, void 0, void 0, function () {
9580
- var _e, _f, _g;
9592
+ var _b, _c, _d;
9581
9593
  var _this = this;
9582
- return __generator(this, function (_h) {
9583
- switch (_h.label) {
9594
+ return __generator(this, function (_e) {
9595
+ switch (_e.label) {
9584
9596
  case 0:
9585
- _e = this.dataStateValues;
9586
- _f = dataState;
9587
- _g = this.dataStateValues[dataState];
9588
- if (_g) return [3 /*break*/, 2];
9597
+ _b = this.dataStateValues;
9598
+ _c = dataState;
9599
+ _d = this.dataStateValues[dataState];
9600
+ if (_d) return [3 /*break*/, 2];
9589
9601
  return [4 /*yield*/, Promise.all(this.impactAssessments.map(function (node) { return _this.nodeService.get(Object.assign(Object.assign({}, node), { dataState: dataState })); }))];
9590
9602
  case 1:
9591
- _g = (_h.sent());
9592
- _h.label = 2;
9603
+ _d = (_e.sent());
9604
+ _e.label = 2;
9593
9605
  case 2:
9594
- _e[_f] = _g;
9606
+ _b[_c] = _d;
9595
9607
  return [2 /*return*/];
9596
9608
  }
9597
9609
  });
@@ -9599,11 +9611,11 @@
9599
9611
  };
9600
9612
  ImpactAssessmentsProductsComponent.prototype.updateDataState = function () {
9601
9613
  return __awaiter(this, void 0, void 0, function () {
9602
- return __generator(this, function (_e) {
9603
- switch (_e.label) {
9614
+ return __generator(this, function (_b) {
9615
+ switch (_b.label) {
9604
9616
  case 0: return [4 /*yield*/, this.loadDataState(this.dataState)];
9605
9617
  case 1:
9606
- _e.sent();
9618
+ _b.sent();
9607
9619
  this.impactAssessments = this.dataStateValues[this.dataState].slice();
9608
9620
  return [2 /*return*/, this.update()];
9609
9621
  }
@@ -9616,14 +9628,14 @@
9616
9628
  ImpactAssessmentsProductsComponent.prototype.impactName = function (impact) {
9617
9629
  return impact.name || (impact.cycle ? this.cycleLabel(impact.cycle) : impact['@id']) || impact.id;
9618
9630
  };
9619
- ImpactAssessmentsProductsComponent.prototype.cycleLabel = function (_e) {
9620
- var id = _e["@id"], name = _e.name;
9631
+ ImpactAssessmentsProductsComponent.prototype.cycleLabel = function (_b) {
9632
+ var id = _b["@id"], name = _b.name;
9621
9633
  var _a;
9622
9634
  return name || ((_a = (this.cycles || []).find(function (v) { return v['@id'] === id; })) === null || _a === void 0 ? void 0 : _a.name);
9623
9635
  };
9624
9636
  Object.defineProperty(ImpactAssessmentsProductsComponent.prototype, "enableBreakdown", {
9625
9637
  get: function () {
9626
- return !this.isOriginal && this.impactAssessments.length === 1 && this.key === 'impacts';
9638
+ return !this.isOriginal && this.impactAssessments.length === 1 && this.key !== 'emissionsResourceUse';
9627
9639
  },
9628
9640
  enumerable: false,
9629
9641
  configurable: true
@@ -9634,15 +9646,15 @@
9634
9646
  // Recalculation logs
9635
9647
  ImpactAssessmentsProductsComponent.prototype.showRecalculationLogs = function () {
9636
9648
  return __awaiter(this, void 0, void 0, function () {
9637
- return __generator(this, function (_e) {
9638
- switch (_e.label) {
9649
+ return __generator(this, function (_b) {
9650
+ switch (_b.label) {
9639
9651
  case 0:
9640
9652
  this.loading = true;
9641
9653
  // make sure original data is also loaded
9642
9654
  return [4 /*yield*/, this.loadDataState(api.DataState.original)];
9643
9655
  case 1:
9644
9656
  // make sure original data is also loaded
9645
- _e.sent();
9657
+ _b.sent();
9646
9658
  this.loading = false;
9647
9659
  this.selectedView = View.logs;
9648
9660
  return [2 /*return*/];
@@ -9885,6 +9897,7 @@
9885
9897
  exports.filterError = filterError;
9886
9898
  exports.filterParams = filterParams;
9887
9899
  exports.findConfigModels = findConfigModels;
9900
+ exports.findModels = findModels;
9888
9901
  exports.findProperty = findProperty;
9889
9902
  exports.findPropertyById = findPropertyById;
9890
9903
  exports.formatCustomErrorMessage = formatCustomErrorMessage;