@hestia-earth/ui-components 0.1.5 → 0.2.1

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 (30) hide show
  1. package/bundles/hestia-earth-ui-components.umd.js +189 -87
  2. package/bundles/hestia-earth-ui-components.umd.js.map +1 -1
  3. package/common/common.module.d.ts +8 -7
  4. package/common/index.d.ts +1 -0
  5. package/common/issue-confirm/issue-confirm.component.d.ts +6 -3
  6. package/common/sort-by.pipe.d.ts +7 -0
  7. package/common/utils.d.ts +1 -0
  8. package/cycles/cycles-practices/cycles-practices.component.d.ts +1 -0
  9. package/cycles/cycles-practices-timeline/cycles-practices-timeline.component.d.ts +14 -0
  10. package/cycles/cycles.module.d.ts +7 -6
  11. package/cycles/index.d.ts +1 -0
  12. package/esm2015/common/blank-node-state-notice/blank-node-state-notice.component.js +2 -2
  13. package/esm2015/common/common.module.js +8 -4
  14. package/esm2015/common/index.js +2 -1
  15. package/esm2015/common/issue-confirm/issue-confirm.component.js +9 -2
  16. package/esm2015/common/sort-by.pipe.js +17 -0
  17. package/esm2015/common/utils.js +2 -1
  18. package/esm2015/cycles/cycles-practices/cycles-practices.component.js +12 -10
  19. package/esm2015/cycles/cycles-practices-timeline/cycles-practices-timeline.component.js +36 -0
  20. package/esm2015/cycles/cycles.module.js +5 -1
  21. package/esm2015/cycles/index.js +2 -1
  22. package/esm2015/files/files-error.model.js +33 -3
  23. package/esm2015/fontawesome/fontawesome.module.js +3 -3
  24. package/esm2015/node/node-logs-models/node-logs-models.component.js +2 -2
  25. package/esm2015/node/node-value-details/node-value-details.component.js +2 -2
  26. package/esm2015/terms/terms.model.js +4 -3
  27. package/fesm2015/hestia-earth-ui-components.js +107 -15
  28. package/fesm2015/hestia-earth-ui-components.js.map +1 -1
  29. package/files/files-error.model.d.ts +1 -1
  30. package/package.json +7 -7
@@ -392,7 +392,7 @@
392
392
  // free-regular
393
393
  freeRegularSvgIcons.faClone, freeRegularSvgIcons.faCircle, freeRegularSvgIcons.faIdBadge,
394
394
  // free-solid
395
- freeSolidSvgIcons.faAngleDoubleLeft, freeSolidSvgIcons.faAngleDoubleRight, freeSolidSvgIcons.faAngleDown, freeSolidSvgIcons.faAngleLeft, freeSolidSvgIcons.faAngleRight, freeSolidSvgIcons.faBookOpen, freeSolidSvgIcons.faBuilding, freeSolidSvgIcons.faCalculator, freeSolidSvgIcons.faChartBar, freeSolidSvgIcons.faCheck, freeSolidSvgIcons.faCircle, freeSolidSvgIcons.faClipboard, freeSolidSvgIcons.faClipboardList, freeSolidSvgIcons.faClone, freeSolidSvgIcons.faComments, freeSolidSvgIcons.faDownload, freeSolidSvgIcons.faDotCircle, freeSolidSvgIcons.faDrawPolygon, freeSolidSvgIcons.faEdit, freeSolidSvgIcons.faEllipsisV, freeSolidSvgIcons.faExclamationTriangle, freeSolidSvgIcons.faExternalLinkAlt, freeSolidSvgIcons.faFilter, freeSolidSvgIcons.faList, freeSolidSvgIcons.faLongArrowAltDown, freeSolidSvgIcons.faLongArrowAltUp, freeSolidSvgIcons.faLongArrowAltLeft, freeSolidSvgIcons.faLongArrowAltRight, freeSolidSvgIcons.faMap, freeSolidSvgIcons.faMapMarked, freeSolidSvgIcons.faMapMarkedAlt, freeSolidSvgIcons.faPlus, freeSolidSvgIcons.faPlusCircle, freeSolidSvgIcons.faSearch, freeSolidSvgIcons.faSeedling, freeSolidSvgIcons.faSpellCheck, freeSolidSvgIcons.faSpinner, freeSolidSvgIcons.faTimes, freeSolidSvgIcons.faUser);
395
+ freeSolidSvgIcons.faAngleDoubleLeft, freeSolidSvgIcons.faAngleDoubleRight, freeSolidSvgIcons.faAngleDown, freeSolidSvgIcons.faAngleLeft, freeSolidSvgIcons.faAngleRight, freeSolidSvgIcons.faBookOpen, freeSolidSvgIcons.faBuilding, freeSolidSvgIcons.faCalculator, freeSolidSvgIcons.faChartBar, freeSolidSvgIcons.faCheck, freeSolidSvgIcons.faCircle, freeSolidSvgIcons.faClipboard, freeSolidSvgIcons.faClipboardList, freeSolidSvgIcons.faClone, freeSolidSvgIcons.faComments, freeSolidSvgIcons.faDownload, freeSolidSvgIcons.faDotCircle, freeSolidSvgIcons.faDrawPolygon, freeSolidSvgIcons.faEdit, freeSolidSvgIcons.faEllipsisV, freeSolidSvgIcons.faExclamationTriangle, freeSolidSvgIcons.faExternalLinkAlt, freeSolidSvgIcons.faFilter, freeSolidSvgIcons.faList, freeSolidSvgIcons.faListAlt, freeSolidSvgIcons.faLongArrowAltDown, freeSolidSvgIcons.faLongArrowAltUp, freeSolidSvgIcons.faLongArrowAltLeft, freeSolidSvgIcons.faLongArrowAltRight, freeSolidSvgIcons.faMap, freeSolidSvgIcons.faMapMarked, freeSolidSvgIcons.faMapMarkedAlt, freeSolidSvgIcons.faPlus, freeSolidSvgIcons.faPlusCircle, freeSolidSvgIcons.faSearch, freeSolidSvgIcons.faSeedling, freeSolidSvgIcons.faSpellCheck, freeSolidSvgIcons.faSpinner, freeSolidSvgIcons.faTimes, freeSolidSvgIcons.faUser);
396
396
  }
397
397
  return HeFontawesomeModule;
398
398
  }());
@@ -525,6 +525,7 @@
525
525
  var isEqual = function (a, b) { return JSON.stringify(a) === JSON.stringify(b); };
526
526
  exports.Repository = void 0;
527
527
  (function (Repository) {
528
+ Repository["frontend"] = "hestia-front-end";
528
529
  Repository["glossary"] = "hestia-glossary";
529
530
  Repository["models"] = "hestia-engine-models";
530
531
  Repository["orchestrator"] = "hestia-engine-orchestrator";
@@ -565,10 +566,16 @@
565
566
  var IssueConfirmComponent = /** @class */ (function () {
566
567
  function IssueConfirmComponent() {
567
568
  this.title = 'Submit Feedback';
569
+ this.isCommunity = false;
568
570
  this.closed = new i0.EventEmitter();
569
571
  this.Repository = exports.Repository;
570
572
  this.Template = exports.Template;
573
+ this.repositories = Object.values(exports.Repository);
571
574
  }
575
+ IssueConfirmComponent.prototype.ngOnChanges = function () {
576
+ var _this = this;
577
+ this.repositories = Object.values(exports.Repository).filter(function (value) { return value !== exports.Repository.community || _this.isCommunity; });
578
+ };
572
579
  Object.defineProperty(IssueConfirmComponent.prototype, "issueUrl", {
573
580
  get: function () {
574
581
  return this.repository && this.template ?
@@ -581,7 +588,7 @@
581
588
  return IssueConfirmComponent;
582
589
  }());
583
590
  IssueConfirmComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: IssueConfirmComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
584
- IssueConfirmComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: IssueConfirmComponent, selector: "he-issue-confirm", inputs: { title: "title", repository: "repository", template: "template" }, outputs: { closed: "closed" }, ngImport: i0__namespace, template: "<div class=\"modal is-active\">\n <div class=\"modal-background\"></div>\n <div class=\"modal-card\">\n <header class=\"modal-card-head\">\n <p class=\"modal-card-title\">{{title}}</p>\n <button class=\"delete\" aria-label=\"close\" (click)=\"closed.next(false)\"></button>\n </header>\n <section class=\"modal-card-body\">\n <p class=\"mb-2\">Please select the type of issue from the list below to start:</p>\n\n <div class=\"field is-horizontal my-3\">\n <div class=\"field-label is-normal\">\n <label class=\"label\" for=\"repository\">Category</label>\n </div>\n <div class=\"field-body\">\n <div class=\"field\">\n <div class=\"control is-expanded\">\n <div class=\"select is-multiple is-fullwidth\">\n <select [(ngModel)]=\"repository\" name=\"repository\" required>\n <option [ngValue]=\"undefined\">Select from the list</option>\n <option *ngFor=\"let r of Repository | keys\" [value]=\"r.value\">\n <ng-container [ngSwitch]=\"r.value\">\n <ng-container *ngSwitchCase=\"Repository.glossary\">Glossary of terms / lookup issues</ng-container>\n <ng-container *ngSwitchCase=\"Repository.models\">Calculation issues</ng-container>\n <ng-container *ngSwitchCase=\"Repository.orchestrator\">Orchestration issues</ng-container>\n <ng-container *ngSwitchCase=\"Repository.community\">UI/UX or API issues</ng-container>\n <ng-container *ngSwitchCase=\"Repository.poorenemeck\">Conversion from P&N Spreadsheet</ng-container>\n </ng-container>\n </option>\n </select>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"repository\" class=\"field is-horizontal my-3\">\n <div class=\"field-label is-normal\">\n <label class=\"label\" for=\"template\">Issue</label>\n </div>\n <div class=\"field-body\">\n <div class=\"field\">\n <div class=\"control is-expanded\">\n <div class=\"select is-multiple is-fullwidth\">\n <select [(ngModel)]=\"template\" name=\"template\" required>\n <option [ngValue]=\"undefined\">Select from the list</option>\n <option *ngFor=\"let t of Template | keys\" [value]=\"t.value\">\n <ng-container [ngSwitch]=\"t.value\">\n <ng-container *ngSwitchCase=\"Template.bug\">I found a bug</ng-container>\n <ng-container *ngSwitchCase=\"Template.feature\">I would like a new feature</ng-container>\n </ng-container>\n </option>\n </select>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <p *ngIf=\"issueUrl\">\n <span>Please report the issue on Gitlab using</span>\n <a class=\"pl-1\" [href]=\"issueUrl\" target=\"_blank\">this link</a>.\n </p>\n </section>\n </div>\n</div>\n", styles: [""], 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { 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: i1__namespace$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1__namespace$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2__namespace.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i2__namespace.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "keys": KeysPipe } });
591
+ IssueConfirmComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: IssueConfirmComponent, selector: "he-issue-confirm", inputs: { title: "title", repository: "repository", template: "template", isCommunity: "isCommunity" }, outputs: { closed: "closed" }, usesOnChanges: true, ngImport: i0__namespace, template: "<div class=\"modal is-active\">\n <div class=\"modal-background\"></div>\n <div class=\"modal-card\">\n <header class=\"modal-card-head\">\n <p class=\"modal-card-title\">{{title}}</p>\n <button class=\"delete\" aria-label=\"close\" (click)=\"closed.next(false)\"></button>\n </header>\n <section class=\"modal-card-body\">\n <p class=\"mb-2\">Please select the type of issue from the list below to start:</p>\n\n <div class=\"field is-horizontal my-3\">\n <div class=\"field-label is-normal\">\n <label class=\"label\" for=\"repository\">Category</label>\n </div>\n <div class=\"field-body\">\n <div class=\"field\">\n <div class=\"control is-expanded\">\n <div class=\"select is-multiple is-fullwidth\">\n <select [(ngModel)]=\"repository\" name=\"repository\" required>\n <option [ngValue]=\"undefined\">Select from the list</option>\n <option *ngFor=\"let repo of repositories\" [value]=\"repo\">\n <ng-container [ngSwitch]=\"repo\">\n <ng-container *ngSwitchCase=\"Repository.glossary\">Glossary of terms / lookup issues</ng-container>\n <ng-container *ngSwitchCase=\"Repository.models\">Calculation issues</ng-container>\n <ng-container *ngSwitchCase=\"Repository.orchestrator\">Orchestration issues</ng-container>\n <ng-container *ngSwitchCase=\"Repository.community\">UI/UX or API issues</ng-container>\n <ng-container *ngSwitchCase=\"Repository.poorenemeck\">Conversion from P&N Spreadsheet</ng-container>\n <ng-container *ngSwitchCase=\"Repository.frontend\">General website isssues (Download, Upload, etc.)</ng-container>\n </ng-container>\n </option>\n </select>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"repository\" class=\"field is-horizontal my-3\">\n <div class=\"field-label is-normal\">\n <label class=\"label\" for=\"template\">Issue</label>\n </div>\n <div class=\"field-body\">\n <div class=\"field\">\n <div class=\"control is-expanded\">\n <div class=\"select is-multiple is-fullwidth\">\n <select [(ngModel)]=\"template\" name=\"template\" required>\n <option [ngValue]=\"undefined\">Select from the list</option>\n <option *ngFor=\"let t of Template | keys\" [value]=\"t.value\">\n <ng-container [ngSwitch]=\"t.value\">\n <ng-container *ngSwitchCase=\"Template.bug\">I found a bug</ng-container>\n <ng-container *ngSwitchCase=\"Template.feature\">I would like a new feature</ng-container>\n </ng-container>\n </option>\n </select>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <p *ngIf=\"issueUrl\">\n <span>Please report the issue on Gitlab using</span>\n <a class=\"pl-1\" [href]=\"issueUrl\" target=\"_blank\">this link</a>.\n </p>\n </section>\n </div>\n</div>\n", styles: [""], 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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { 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: i1__namespace$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1__namespace$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2__namespace.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i2__namespace.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "keys": KeysPipe } });
585
592
  i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: IssueConfirmComponent, decorators: [{
586
593
  type: i0.Component,
587
594
  args: [{
@@ -595,6 +602,8 @@
595
602
  type: i0.Input
596
603
  }], template: [{
597
604
  type: i0.Input
605
+ }], isCommunity: [{
606
+ type: i0.Input
598
607
  }], closed: [{
599
608
  type: i0.Output
600
609
  }] } });
@@ -874,7 +883,6 @@
874
883
  children: termTypesToChildren([
875
884
  schema.TermTermType.animalManagement,
876
885
  schema.TermTermType.aquacultureManagement,
877
- schema.TermTermType.biodiversity,
878
886
  schema.TermTermType.cropEstablishment,
879
887
  schema.TermTermType.cropResidueManagement,
880
888
  schema.TermTermType.excretaManagement,
@@ -893,6 +901,7 @@
893
901
  schema.TermTermType.crop,
894
902
  schema.TermTermType.cropResidue,
895
903
  schema.TermTermType.excreta,
904
+ schema.TermTermType.grass,
896
905
  schema.TermTermType.liveAnimal,
897
906
  schema.TermTermType.liveAquaticSpecies,
898
907
  schema.TermTermType.animalProduct,
@@ -931,6 +940,8 @@
931
940
  schema.TermTermType.animalProduct,
932
941
  schema.TermTermType.liveAnimal,
933
942
  schema.TermTermType.liveAquaticSpecies,
943
+ schema.TermTermType.excreta,
944
+ schema.TermTermType.grass,
934
945
  schema.TermTermType.processedFood,
935
946
  schema.TermTermType.emission,
936
947
  schema.TermTermType.resourceUse,
@@ -944,7 +955,6 @@
944
955
  schema.TermTermType.electricity,
945
956
  schema.TermTermType.fuel,
946
957
  schema.TermTermType.aquacultureManagement,
947
- schema.TermTermType.biodiversity,
948
958
  schema.TermTermType.cropResidueManagement,
949
959
  schema.TermTermType.animalManagement,
950
960
  schema.TermTermType.waterRegime,
@@ -1680,7 +1690,7 @@
1680
1690
  }
1681
1691
  Object.defineProperty(BlankNodeStateNoticeComponent.prototype, "show", {
1682
1692
  get: function () {
1683
- return !this.dataState || this.dataState === api.DataState.recalculated;
1693
+ return this.dataState !== api.DataState.original;
1684
1694
  },
1685
1695
  enumerable: false,
1686
1696
  configurable: true
@@ -4112,6 +4122,25 @@
4112
4122
  }]
4113
4123
  }] });
4114
4124
 
4125
+ var orderBy$6 = require('lodash.orderby');
4126
+ var SortByPipe = /** @class */ (function () {
4127
+ function SortByPipe() {
4128
+ }
4129
+ SortByPipe.prototype.transform = function (value, keys, orders) {
4130
+ if (orders === void 0) { orders = ['asc']; }
4131
+ return orderBy$6(value, keys, orders);
4132
+ };
4133
+ return SortByPipe;
4134
+ }());
4135
+ SortByPipe.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SortByPipe, deps: [], target: i0__namespace.ɵɵFactoryTarget.Pipe });
4136
+ SortByPipe.ɵpipe = i0__namespace.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SortByPipe, name: "sortBy" });
4137
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: SortByPipe, decorators: [{
4138
+ type: i0.Pipe,
4139
+ args: [{
4140
+ name: 'sortBy'
4141
+ }]
4142
+ }] });
4143
+
4115
4144
  var components$7 = [
4116
4145
  BlankNodeStateComponent,
4117
4146
  BlankNodeStateNoticeComponent,
@@ -4129,7 +4158,8 @@
4129
4158
  TimesPipe,
4130
4159
  ClickOutsideDirective,
4131
4160
  GetPipe,
4132
- IsArrayPipe
4161
+ IsArrayPipe,
4162
+ SortByPipe
4133
4163
  ];
4134
4164
  var HeCommonModule = /** @class */ (function () {
4135
4165
  function HeCommonModule() {
@@ -4153,7 +4183,8 @@
4153
4183
  TimesPipe,
4154
4184
  ClickOutsideDirective,
4155
4185
  GetPipe,
4156
- IsArrayPipe], imports: [i2.CommonModule, i1$1.FormsModule, i5.RouterModule,
4186
+ IsArrayPipe,
4187
+ SortByPipe], imports: [i2.CommonModule, i1$1.FormsModule, i5.RouterModule,
4157
4188
  i11.NgbTypeaheadModule, i11.NgbTooltipModule, i11.NgbPopoverModule,
4158
4189
  i1$4.GoogleMapsModule,
4159
4190
  HeCommonLightModule], exports: [i11.NgbTypeaheadModule, i11.NgbTooltipModule, i11.NgbPopoverModule,
@@ -4174,7 +4205,8 @@
4174
4205
  TimesPipe,
4175
4206
  ClickOutsideDirective,
4176
4207
  GetPipe,
4177
- IsArrayPipe] });
4208
+ IsArrayPipe,
4209
+ SortByPipe] });
4178
4210
  HeCommonModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: HeCommonModule, imports: [[
4179
4211
  i2.CommonModule, i1$1.FormsModule, i5.RouterModule,
4180
4212
  i11.NgbTypeaheadModule, i11.NgbTooltipModule, i11.NgbPopoverModule,
@@ -5836,7 +5868,7 @@
5836
5868
  return NodeLogsModelsComponent;
5837
5869
  }());
5838
5870
  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 });
5839
- 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 [editable]=\"false\"\n [ngbTypeahead]=\"suggestTerm\"\n (selectItem)=\"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>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 colspan=\"5\">\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=\"5\">\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>\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>\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>\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 >\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)\" class=\"has-text-{{requirementColor(logs.requirements[key])}}\">\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 } });
5871
+ 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 [editable]=\"false\"\n [ngbTypeahead]=\"suggestTerm\"\n (selectItem)=\"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>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 colspan=\"5\">\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=\"5\">\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>\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>\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>\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 >\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 } });
5840
5872
  i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: NodeLogsModelsComponent, decorators: [{
5841
5873
  type: i0.Component,
5842
5874
  args: [{
@@ -5910,7 +5942,7 @@
5910
5942
  'impactAssessment'
5911
5943
  ];
5912
5944
  var tableKeys = [
5913
- 'inputs', 'value', 'dates', 'methodModel', 'methodTier', 'statsDefinition'
5945
+ 'inputs', 'transformation', 'value', 'dates', 'methodModel', 'methodTier', 'statsDefinition'
5914
5946
  ];
5915
5947
  var NodeValueDetailsComponent = /** @class */ (function () {
5916
5948
  function NodeValueDetailsComponent() {
@@ -6567,6 +6599,47 @@
6567
6599
  type: i0.Input
6568
6600
  }] } });
6569
6601
 
6602
+ var CyclesPracticesTimelineComponent = /** @class */ (function () {
6603
+ function CyclesPracticesTimelineComponent(el) {
6604
+ this.el = el;
6605
+ this.now = new Date();
6606
+ }
6607
+ Object.defineProperty(CyclesPracticesTimelineComponent.prototype, "practices", {
6608
+ get: function () {
6609
+ return (this.cycle.practices || []).map(function (p) {
6610
+ var _a;
6611
+ return !p.startDate && ((_a = p.dates) === null || _a === void 0 ? void 0 : _a.length) ? Object.assign(Object.assign({}, p), { startDate: p.dates[0] }) : p;
6612
+ });
6613
+ },
6614
+ enumerable: false,
6615
+ configurable: true
6616
+ });
6617
+ CyclesPracticesTimelineComponent.prototype.trackByPractice = function (_index, _b) {
6618
+ var term = _b.term;
6619
+ return term['@id'];
6620
+ };
6621
+ Object.defineProperty(CyclesPracticesTimelineComponent.prototype, "lineWidth", {
6622
+ get: function () {
6623
+ return this.el.nativeElement.offsetWidth - 60;
6624
+ },
6625
+ enumerable: false,
6626
+ configurable: true
6627
+ });
6628
+ return CyclesPracticesTimelineComponent;
6629
+ }());
6630
+ CyclesPracticesTimelineComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: CyclesPracticesTimelineComponent, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
6631
+ CyclesPracticesTimelineComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: CyclesPracticesTimelineComponent, selector: "he-cycles-practices-timeline", inputs: { cycle: "cycle" }, ngImport: i0__namespace, template: "<ul class=\"content pl-4 ml-4 pb-4\">\n <li class=\"is-relative m-0\"\n *ngFor=\"let practice of practices | sortBy:['startDate','endDate']:['asc','asc']; trackBy: trackByPractice\"\n >\n <div class=\"is-relative\"\n [style.width]=\"lineWidth + 'px'\"\n >\n <span *ngIf=\"practice.startDate; else noDate\">{{practice.startDate | date:'YYYY-MM-dd'}}</span>\n <span class=\"px-1\"\n [class.is-invisible]=\"!practice.startDate || !practice.endDate\"\n >-</span>\n <span\n [class.is-invisible]=\"!practice.endDate\"\n >{{(practice.endDate || now) | date:'YYYY-MM-dd'}}</span>\n <span class=\"pl-4\">{{practice.term.name}}</span>\n <he-blank-node-state class=\"ml-1\"\n [node]=\"practice\"\n key=\"value\"\n ></he-blank-node-state>\n </div>\n </li>\n</ul>\n\n<ng-template #noDate>\n <span>No date</span>\n</ng-template>\n", styles: ["ul{max-height:400px;overflow-y:auto}ul li{width:4px;padding-top:20px;background:#485fc7}ul li:after{content:\"\";position:absolute;left:50%;bottom:2px;transform:translate(-50%);width:20px;height:20px;border-radius:50%;background:inherit}ul li>div{width:600px;margin-left:24px}ul li>div>span{display:inline-block}ul li>div>span:nth-child(1),ul li>div>span:nth-child(3){width:94px}\n"], components: [{ type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["nodeType", "dataKey", "key", "node", "state"] }], directives: [{ type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "sortBy": SortByPipe, "date": i2__namespace.DatePipe } });
6632
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: CyclesPracticesTimelineComponent, decorators: [{
6633
+ type: i0.Component,
6634
+ args: [{
6635
+ selector: 'he-cycles-practices-timeline',
6636
+ templateUrl: './cycles-practices-timeline.component.html',
6637
+ styleUrls: ['./cycles-practices-timeline.component.scss']
6638
+ }]
6639
+ }], ctorParameters: function () { return [{ type: i0__namespace.ElementRef }]; }, propDecorators: { cycle: [{
6640
+ type: i0.Input
6641
+ }] } });
6642
+
6570
6643
  var CyclesPracticesLogsComponent = /** @class */ (function () {
6571
6644
  function CyclesPracticesLogsComponent(nodeService) {
6572
6645
  this.nodeService = nodeService;
@@ -6623,6 +6696,7 @@
6623
6696
  var View$2;
6624
6697
  (function (View) {
6625
6698
  View["table"] = "table";
6699
+ View["timeline"] = "timeline";
6626
6700
  View["logs"] = "logs";
6627
6701
  })(View$2 || (View$2 = {}));
6628
6702
  var CyclesPracticesComponent = /** @class */ (function () {
@@ -6669,7 +6743,7 @@
6669
6743
  return CyclesPracticesComponent;
6670
6744
  }());
6671
6745
  CyclesPracticesComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: CyclesPracticesComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6672
- CyclesPracticesComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: CyclesPracticesComponent, selector: "he-cycles-practices", inputs: { originalValues: "originalValues", cycles: "cycles", selected: "selected", dataState: "dataState" }, usesOnChanges: true, ngImport: i0__namespace, template: "<div class=\"columns is-variable is-align-items-center is-2 m-0\">\n <div class=\"column is-hidden-mobile\"></div>\n <ng-container *ngIf=\"selectedView === View.table && practices.length\">\n <div class=\"column is-narrow\">\n <button class=\"button is-dark is-outlined is-small\" (click)=\"showDownload = true\">\n <fa-icon icon=\"download\"></fa-icon>\n <span class=\"pl-2\">Download (CSV)</span>\n </button>\n </div>\n <div class=\"column is-narrow col-sep\"></div>\n </ng-container>\n <div class=\"column is-narrow\" *ngIf=\"!isOriginal && cycles.length === 1\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.table\" (click)=\"selectedView = View.table\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"list\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Table view</span>\n </button>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.logs\" (click)=\"selectedView = View.logs\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"calculator\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Recalculations logs</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"px-3 pb-3\" [class.is-hidden]=\"selectedView !== View.table\">\n <ng-container *ngIf=\"practices.length; else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" [nbRows]=\"cycles.length\" maxHeight=\"320\">\n <table class=\"table is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto\"></th>\n <th class=\"has-border-right\"></th>\n <th *ngFor=\"let practice of practices\"\n [attr.title]=\"practice.value.term.name\"\n >\n <he-node-link [node]=\"practice.value.term\">\n <span>{{practice.value.term.name | ellipsis:30}}</span>\n </he-node-link>\n </th>\n </tr>\n <tr>\n <th class=\"width-auto\"></th>\n <th class=\"has-border-right\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n <th *ngFor=\"let practice of practices\"\n [attr.title]=\"practice.value.term.units\"\n >{{practice.value.term.units}}</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let cycle of cycles; trackBy: trackById; let i = index\">\n <tr *ngIf=\"isSelected(cycle)\">\n <td class=\"width-auto\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle.term || cycle\">\n <span class=\"is-nowrap has-text-ellipsis\">{{i + 1}}. {{defaultLabel(cycle)}}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\">\n <he-cycles-functional-unit-measure [cycle]=\"cycles[0]\"></he-cycles-functional-unit-measure>\n </td>\n <td class=\"is-nowrap\" *ngFor=\"let practice of practices\">\n <span *ngIf=\"practice.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\" [autoClose]=\"'outside'\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"togglePopover(p, { data: practice.value.values[cycle['@id']], cycle: cycle, key: 'practices' })\"\n >\n <span pointer>{{propertyValue(practice.value.values[cycle['@id']].value, practice.value.term['@id']) | precision:3 | default:'-'}}</span>\n <he-blank-node-state class=\"ml-1\"\n [node]=\"practice.value.values[cycle['@id']].node\"\n key=\"value\"\n ></he-blank-node-state>\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"dataState\" [showDeleted]=\"true\"></he-blank-node-state-notice>\n </ng-container>\n</div>\n\n<he-cycles-practices-logs *ngIf=\"selectedView === View.logs && !isOriginal\"\n [cycle]=\"cycles[0]\"\n [originalValues]=\"originalValues[0]?.practices\"\n [recalculatedValues]=\"cycles[0]?.practices\"\n></he-cycles-practices-logs>\n\n<he-node-csv-export-confirm *ngIf=\"showDownload\"\n [nodes]=\"cycles\" filename=\"cycle-practices.csv\" [isUpload]=\"false\"\n [headerKeys]=\"['cycle.id', 'cycle.@id', 'cycle.practices.']\"\n (closed)=\"showDownload = false\"\n></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"has-text-centered\">\n <span>No data</span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p><b>{{defaultLabel(node)}}</b></p>\n <he-node-value-details\n [data]=\"data\" [nodeType]=\"node['@type']\" [dataKey]=\"key\"\n ></he-node-value-details>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\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: CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["nodeType", "dataKey", "key", "node", "state"] }, { type: BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showAggregated", "showDeleted", "showUnchanged"] }, { type: CyclesPracticesLogsComponent, selector: "he-cycles-practices-logs", inputs: ["cycle", "originalValues", "recalculatedValues"] }, { type: NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { type: NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey"] }], directives: [{ type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11__namespace.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }], pipes: { "ellipsis": EllipsisPipe, "default": DefaultPipe, "precision": PrecisionPipe } });
6746
+ CyclesPracticesComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: CyclesPracticesComponent, selector: "he-cycles-practices", inputs: { originalValues: "originalValues", cycles: "cycles", selected: "selected", dataState: "dataState" }, usesOnChanges: true, ngImport: i0__namespace, template: "<div class=\"columns is-variable is-align-items-center is-2 m-0\">\n <div class=\"column is-hidden-mobile\"></div>\n <ng-container *ngIf=\"selectedView === View.table && practices.length\">\n <div class=\"column is-narrow\">\n <button class=\"button is-dark is-outlined is-small\" (click)=\"showDownload = true\">\n <fa-icon icon=\"download\"></fa-icon>\n <span class=\"pl-2\">Download (CSV)</span>\n </button>\n </div>\n <div class=\"column is-narrow col-sep\"></div>\n </ng-container>\n <div class=\"column is-narrow\" *ngIf=\"cycles.length === 1\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.table\" (click)=\"selectedView = View.table\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"list\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Table view</span>\n </button>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.timeline\" (click)=\"selectedView = View.timeline\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"list-alt\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Timeline view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"!isOriginal\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.logs\" (click)=\"selectedView = View.logs\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"calculator\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Recalculations logs</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"px-3 pb-3\" [class.is-hidden]=\"selectedView !== View.table\">\n <ng-container *ngIf=\"practices.length; else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" [nbRows]=\"cycles.length\" maxHeight=\"320\">\n <table class=\"table is-narrow is-striped\">\n <thead>\n <tr>\n <th class=\"width-auto\"></th>\n <th class=\"has-border-right\"></th>\n <th *ngFor=\"let practice of practices\"\n [attr.title]=\"practice.value.term.name\"\n >\n <he-node-link [node]=\"practice.value.term\">\n <span>{{practice.value.term.name | ellipsis:30}}</span>\n </he-node-link>\n </th>\n </tr>\n <tr>\n <th class=\"width-auto\"></th>\n <th class=\"has-border-right\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n <th *ngFor=\"let practice of practices\"\n [attr.title]=\"practice.value.term.units\"\n >{{practice.value.term.units}}</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let cycle of cycles; trackBy: trackById; let i = index\">\n <tr *ngIf=\"isSelected(cycle)\">\n <td class=\"width-auto\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle.term || cycle\">\n <span class=\"is-nowrap has-text-ellipsis\">{{i + 1}}. {{defaultLabel(cycle)}}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\">\n <he-cycles-functional-unit-measure [cycle]=\"cycles[0]\"></he-cycles-functional-unit-measure>\n </td>\n <td class=\"is-nowrap\" *ngFor=\"let practice of practices\">\n <span *ngIf=\"practice.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\" [autoClose]=\"'outside'\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"togglePopover(p, { data: practice.value.values[cycle['@id']], cycle: cycle, key: 'practices' })\"\n >\n <span pointer>{{propertyValue(practice.value.values[cycle['@id']].value, practice.value.term['@id']) | precision:3 | default:'-'}}</span>\n <he-blank-node-state class=\"ml-1\"\n [node]=\"practice.value.values[cycle['@id']].node\"\n key=\"value\"\n ></he-blank-node-state>\n </span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"dataState\" [showDeleted]=\"true\"></he-blank-node-state-notice>\n </ng-container>\n</div>\n\n<div class=\"px-3 pb-3\" *ngIf=\"selectedView === View.timeline\">\n <he-cycles-practices-timeline\n [cycle]=\"cycles[0]\"\n ></he-cycles-practices-timeline>\n\n <he-blank-node-state-notice [dataState]=\"dataState\" [showDeleted]=\"true\"></he-blank-node-state-notice>\n</div>\n\n<he-cycles-practices-logs *ngIf=\"selectedView === View.logs && !isOriginal\"\n [cycle]=\"cycles[0]\"\n [originalValues]=\"originalValues[0]?.practices\"\n [recalculatedValues]=\"cycles[0]?.practices\"\n></he-cycles-practices-logs>\n\n<he-node-csv-export-confirm *ngIf=\"showDownload\"\n [nodes]=\"cycles\" filename=\"cycle-practices.csv\" [isUpload]=\"false\"\n [headerKeys]=\"['cycle.id', 'cycle.@id', 'cycle.practices.']\"\n (closed)=\"showDownload = false\"\n></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"has-text-centered\">\n <span>No data</span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p><b>{{defaultLabel(node)}}</b></p>\n <he-node-value-details\n [data]=\"data\" [nodeType]=\"node['@type']\" [dataKey]=\"key\"\n ></he-node-value-details>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\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: CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["nodeType", "dataKey", "key", "node", "state"] }, { type: BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showAggregated", "showDeleted", "showUnchanged"] }, { type: CyclesPracticesTimelineComponent, selector: "he-cycles-practices-timeline", inputs: ["cycle"] }, { type: CyclesPracticesLogsComponent, selector: "he-cycles-practices-logs", inputs: ["cycle", "originalValues", "recalculatedValues"] }, { type: NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { type: NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey"] }], directives: [{ type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11__namespace.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }], pipes: { "ellipsis": EllipsisPipe, "default": DefaultPipe, "precision": PrecisionPipe } });
6673
6747
  i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: CyclesPracticesComponent, decorators: [{
6674
6748
  type: i0.Component,
6675
6749
  args: [{
@@ -6814,6 +6888,7 @@
6814
6888
  CyclesFunctionalUnitMeasureComponent,
6815
6889
  CyclesPracticesComponent,
6816
6890
  CyclesPracticesLogsComponent,
6891
+ CyclesPracticesTimelineComponent,
6817
6892
  CyclesResultComponent
6818
6893
  ];
6819
6894
  var HeCyclesModule = /** @class */ (function () {
@@ -6831,6 +6906,7 @@
6831
6906
  CyclesFunctionalUnitMeasureComponent,
6832
6907
  CyclesPracticesComponent,
6833
6908
  CyclesPracticesLogsComponent,
6909
+ CyclesPracticesTimelineComponent,
6834
6910
  CyclesResultComponent], imports: [i2.CommonModule, i1$1.FormsModule,
6835
6911
  HeCommonModule,
6836
6912
  HeNodeModule], exports: [CyclesActivityComponent,
@@ -6842,6 +6918,7 @@
6842
6918
  CyclesFunctionalUnitMeasureComponent,
6843
6919
  CyclesPracticesComponent,
6844
6920
  CyclesPracticesLogsComponent,
6921
+ CyclesPracticesTimelineComponent,
6845
6922
  CyclesResultComponent] });
6846
6923
  HeCyclesModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0__namespace, type: HeCyclesModule, imports: [[
6847
6924
  i2.CommonModule, i1$1.FormsModule,
@@ -7031,23 +7108,23 @@
7031
7108
  }]
7032
7109
  }] });
7033
7110
 
7034
- var _f;
7111
+ var _g;
7035
7112
  var mapErrorMessage = 'does not contain latitude and longitude';
7036
7113
  var parseDataPath = function (dataPath) {
7037
7114
  if (dataPath === void 0) { dataPath = ''; }
7038
- var _f = __read(dataPath.split('.')), _ = _f[0], paths = _f.slice(1);
7115
+ var _g = __read(dataPath.split('.')), _ = _g[0], paths = _g.slice(1);
7039
7116
  return paths.map(function (path) { return ({ path: path, label: utils.keyToLabel(path.replace(/\[\d+\]/g, '')) }); });
7040
7117
  };
7041
7118
  var contactUsEmail = 'community@hestia.earth';
7042
7119
  var externalLink = function (href, text) { return "<a href=\"" + href + "\" target=\"_blank\">" + text + "</a>"; };
7043
7120
  var glossaryLink = function (text) { return externalLink(baseUrl() + "/glossary", text); };
7044
7121
  var glossaryTypeLink = function (type) { return externalLink(baseUrl() + "/glossary?termType=" + type, termTypeLabel(type)); };
7045
- var termLink = function (_f) {
7046
- var id = _f.id, name = _f.name;
7122
+ var termLink = function (_g) {
7123
+ var id = _g.id, name = _g.name;
7047
7124
  return externalLink(baseUrl() + "/term/" + id, name);
7048
7125
  };
7049
- var nodeLink = function (_f) {
7050
- var type = _f["@type"], id = _f["@id"], name = _f.name;
7126
+ var nodeLink = function (_g) {
7127
+ var type = _g["@type"], id = _g["@id"], name = _g.name;
7051
7128
  return type && id ? "<a href=\"/" + type.toLowerCase() + "/" + id + "\" target=\"_blank\">" + (name || id) + "</a>" : null;
7052
7129
  };
7053
7130
  var schemaLink = function (type, title) {
@@ -7063,39 +7140,44 @@
7063
7140
  var modelLink = function (term, model) { return "\n <a href=\"" + pathToApiDocsPath(model['@id'], term['@id']) + "\" target=\"_blank\">\n <span class=\"pr-1\">" + model.name + "</span>\n <span>(View Docs)</span>\n </a>\n"; };
7064
7141
  var threshold = function (value) { return code(value * 100 + "%"); };
7065
7142
  var noTillage = { id: 'noTillage', name: 'No tillage' };
7066
- var missingNodeErrorMessage = function (_f) {
7067
- var _t = _f["@type"], type = _f.type, name = _f.name;
7143
+ var missingNodeErrorMessage = function (_g) {
7144
+ var _t = _g["@type"], type = _g.type, name = _g.name;
7068
7145
  return (_t || type) === 'Term' ?
7069
7146
  (name ? "The term \"" + name + "\"" : 'This term') + " doesn't match a term in the " + glossaryLink('Glossary of Terms') + ".\n Please check the " + glossaryLink('Glossary') + " for the correct " + code('@id') + " or " + code('name') + " and spelling."
7070
7147
  : "This " + schemaLink(_t || type) + " does not exist in Hestia. If you are trying to link to an existing\n " + schemaLink(_t || type) + " in Hestia, please check the " + code('name') + " or " + code('@id') + " is correct.\n If you are trying to create a new " + schemaLink(_t || type) + ", please identify it with an " + code('id') + " field.";
7071
7148
  };
7072
7149
  // set message as empty to not display it
7073
- var customErrorMessage = (_f = {
7150
+ var customErrorMessage = (_g = {
7074
7151
  'should have required property \'@id\'': function () { return 'does not exist in Hestia.'; },
7075
7152
  'should have required property \'@type\'': function () { return ''; },
7076
7153
  'should have required property \'id\'': function () { return 'does not exist in Hestia.'; },
7077
7154
  'should match exactly one schema in oneOf': function () { return ''; },
7078
7155
  'should match some schema in anyOf': function () { return ''; },
7079
- 'should NOT have additional properties': function (_f, errorCount) {
7080
- var params = _f.params;
7156
+ 'should NOT have additional properties': function (_g, errorCount) {
7157
+ var params = _g.params;
7081
7158
  return errorCount === 1 ?
7082
- "The following field does not exist: " + (params === null || params === void 0 ? void 0 : params.additionalProperty) :
7159
+ "The following field does not exist: " + (params === null || params === void 0 ? void 0 : params.additionalProperty) + " or is not allowed in this case." :
7083
7160
  "should not have additional properties";
7084
7161
  },
7085
7162
  'should match pattern "^\\d{13}$"': function () { return "should be composed of 13 numbers"; },
7086
7163
  'should match pattern "^[0-9]{4}(-[0-9]{2})?(-[0-9]{2})?$"': function () { return dateFormatMessage; },
7087
7164
  'should match pattern "^([0-9]{4}|-)(-[0-9]{2})?(-[0-9]{2})?$"': function () { return dateFormatMessage; },
7088
7165
  'should match pattern "^([0-9]{4}|-)(-[0-9]{2})?(-[0-9]{2})?([T][0-2][0-9]\:[0-5][0-9]\:[0-5][0-9]((\+|\-)[0-1][0-9]:[0-5][0-9])?)?$"': function () { return dateFormatMessage; },
7166
+ 'should be linked to an existing node': function (_g) {
7167
+ var params = _g.params;
7168
+ var _a, _b, _c, _d, _e, _f;
7169
+ return "Your submission does not contain the " + ((_a = params === null || params === void 0 ? void 0 : params.node) === null || _a === void 0 ? void 0 : _a.type) + " with " + code("id=" + ((_b = params === null || params === void 0 ? void 0 : params.node) === null || _b === void 0 ? void 0 : _b.id)) + ".\n If you are trying to link to an existing " + ((_c = params === null || params === void 0 ? void 0 : params.node) === null || _c === void 0 ? void 0 : _c.type) + " on the Hestia platform, you must use " + code("@id=" + ((_d = params === null || params === void 0 ? void 0 : params.node) === null || _d === void 0 ? void 0 : _d.id)) + " instead.\n Otherwise you must include a full " + ((_e = params === null || params === void 0 ? void 0 : params.node) === null || _e === void 0 ? void 0 : _e.type) + " with id " + code((_f = params === null || params === void 0 ? void 0 : params.node) === null || _f === void 0 ? void 0 : _f.id) + ".";
7170
+ },
7089
7171
  'must be within the country': function () { return "The country provided does not contain the region provided. Please check\n the country for errors or the region for errors, and reference the " + glossaryLink('Glossary of Terms') + "."; }
7090
7172
  },
7091
- _f[mapErrorMessage] = function (_f) {
7092
- var dataPath = _f.dataPath;
7173
+ _g[mapErrorMessage] = function (_g) {
7174
+ var dataPath = _g.dataPath;
7093
7175
  return dataPath === '.region' ? "The region provided does not contain the longitude and latitude provided. Please check the\n longitude and latitude for errors or the region for error, and reference the " + glossaryLink('Glossary of Terms') + "." :
7094
7176
  "The country provided does not contain the longitude and latitude provided. Please check the longitude and latitude\n for errors or the country for errors, and reference the " + glossaryLink('Glossary of Terms') + ".";
7095
7177
  },
7096
- _f['sum not equal to 100% for sandContent, siltContent, clayContent'] = function () { return "The sum of Sand, Silt, and Clay content should equal 100% for each soil depth interval."; },
7097
- _f['is outside the allowed range'] = function (_f, errorCount) {
7098
- var params = _f.params;
7178
+ _g['sum not equal to 100% for sandContent, siltContent, clayContent'] = function () { return "The sum of Sand, Silt, and Clay content should equal 100% for each soil depth interval."; },
7179
+ _g['is outside the allowed range'] = function (_g, errorCount) {
7180
+ var params = _g.params;
7099
7181
  var _a, _b;
7100
7182
  return errorCount === 1 ?
7101
7183
  ((params === null || params === void 0 ? void 0 : params.term) ?
@@ -7103,111 +7185,129 @@
7103
7185
  "does not match the possible ranges of sand, silt and clay content.\n Please check the measurement, its depth intervals, and the dates of the measurement.") :
7104
7186
  "Each soil texture has a maximum and minimum value for sand, silt, and clay content.\n At least one measurement of sand, silt, or clay content does not match the possible range for the specified soil texture.\n Please check your measurements, their depth intervals, and the dates of the measurements.";
7105
7187
  },
7106
- _f['should be equal to one of the allowed values'] = function (_f) {
7107
- var params = _f.params;
7188
+ _g['should be equal to one of the allowed values'] = function (_g) {
7189
+ var params = _g.params;
7108
7190
  return "must have one of these values: " + (params === null || params === void 0 ? void 0 : params.allowedValues.join(', '));
7109
7191
  },
7110
- _f['is not allowed for this characterisedIndicator'] = function (_f, errorCount) {
7111
- var params = _f.params;
7192
+ _g['is not allowed for this characterisedIndicator'] = function (_g, errorCount) {
7193
+ var params = _g.params;
7112
7194
  return (errorCount === 1 ?
7113
7195
  ((params === null || params === void 0 ? void 0 : params.allowedValues.length) ?
7114
7196
  "can only be used with one of these methods: " + (params === null || params === void 0 ? void 0 : params.allowedValues.join(', ')) :
7115
7197
  "does not currently have any method allowed. Please " + contactUs() + " to change this.") + "." :
7116
7198
  "Some Terms are not allowed with the method you selected.") + "\n You can find the list of allowed methods for each Term by clicking on them.";
7117
7199
  },
7118
- _f['should contain a valid item'] = function (_f) {
7119
- var dataPath = _f.dataPath;
7200
+ _g['should contain a valid item'] = function (_g) {
7201
+ var dataPath = _g.dataPath;
7120
7202
  var paths = parseDataPath(dataPath);
7121
7203
  return paths.length >= 2 ?
7122
7204
  "The " + paths[paths.length - 1].path + " related to this " + pluralize__namespace(paths[paths.length - 2].label, 1) + " are invalid" :
7123
7205
  "The " + paths[0].path + " are invalid";
7124
7206
  },
7125
- _f['may be between 0 and 100'] = function () { return 'percentages should be between 0 and 100, not 0 and 1. This may be an error.'; },
7126
- _f['may not all be set to false'] = function () { return "Every value in the data completeness assessment is " + code('false') + ". You may have forgotten to fill it in.\n For information on how to fill it in, please see the " + schemaLink('Cycle#dataCompleteness', 'schema') + "."; },
7127
- _f['may not be empty'] = function () { return 'if this value signifies no data, Hestia only accepts "-" or empty for no data'; },
7128
- _f['may not be 0'] = function (_f, errorCount) {
7129
- var dataPath = _f.dataPath;
7207
+ _g['may be between 0 and 100'] = function () { return 'percentages should be between 0 and 100, not 0 and 1. This may be an error.'; },
7208
+ _g['may not all be set to false'] = function () { return "Every value in the data completeness assessment is " + code('false') + ". You may have forgotten to fill it in.\n For information on how to fill it in, please see the " + schemaLink('Cycle#dataCompleteness', 'schema') + "."; },
7209
+ _g['may not be empty'] = function () { return 'if this value signifies no data, Hestia only accepts "-" or empty for no data'; },
7210
+ _g['may not be 0'] = function (_g, errorCount) {
7211
+ var dataPath = _g.dataPath;
7130
7212
  var paths = parseDataPath(dataPath);
7131
7213
  return "adding a value " + (errorCount === 1 ? " to every " + paths[0].label + " " : ' ') + " is highly recommended\n as without this it is not possible to calculate the Impact Assessment.\n If the amount produced is zero, we recommend setting value to 0.";
7132
7214
  },
7133
- _f['the sum of above ground crop residue and below ground crop residue must be greater than zero'] = function () { return "For sites of type " + code(schema.SiteSiteType.cropland) + " or " + code(schema.SiteSiteType['permanent pasture']) + ",\n if data completeness is marked true for crop residue,\n the sum of the Above ground crop residue terms should be greater than zero,\n and Below ground crop residue should be greater than zero."; },
7134
- _f['longFallowPeriod must be lower than 5 years'] = function () { return "Your longFallowPeriod is greater than five years.\n Fallow is defined by FAOSTAT as land left uncultivated for between 1 and 5 years,\n and this definition is used for Hestia also."; },
7135
- _f['should be within percentage of default value'] = function (_f, errorCount) {
7136
- var params = _f.params;
7215
+ _g['the sum of above ground crop residue and below ground crop residue must be greater than zero'] = function () { return "For sites of type " + code(schema.SiteSiteType.cropland) + " or " + code(schema.SiteSiteType['permanent pasture']) + ",\n if data completeness is marked true for crop residue,\n the sum of the Above ground crop residue terms should be greater than zero,\n and Below ground crop residue should be greater than zero."; },
7216
+ _g['longFallowPeriod must be lower than 5 years'] = function () { return "Your longFallowPeriod is greater than five years.\n Fallow is defined by FAOSTAT as land left uncultivated for between 1 and 5 years,\n and this definition is used for Hestia also."; },
7217
+ _g['should be within percentage of default value'] = function (_g, errorCount) {
7218
+ var params = _g.params;
7137
7219
  return errorCount === 1 ?
7138
7220
  "is \u00B1" + threshold(params === null || params === void 0 ? void 0 : params.threshold) + " different to our default value which is " + (params === null || params === void 0 ? void 0 : params.default) + ".\n Please check your uploaded data as this may be an error." :
7139
7221
  "is substantially different than our default value. Please check your uploaded data as this may be an error.";
7140
7222
  },
7141
- _f['the value provided is not consistent with the model result'] = function (_f, errorCount) {
7142
- var params = _f.params;
7223
+ _g['the value provided is not consistent with the model result'] = function (_g, errorCount) {
7224
+ var params = _g.params;
7143
7225
  var _a;
7144
7226
  return "The expected result for " + code(params === null || params === void 0 ? void 0 : params.term.name) + "\n " + (((_a = params === null || params === void 0 ? void 0 : params.model) === null || _a === void 0 ? void 0 : _a.name) ? "using " + modelLink(params === null || params === void 0 ? void 0 : params.term, params === null || params === void 0 ? void 0 : params.model) + " " : '') + "\n from the data provided in the upload is " + (errorCount === 1 ?
7145
7227
  code(utils.toPrecision(params === null || params === void 0 ? void 0 : params.expected, 3)) + ", but the value in the upload is " + code(utils.toPrecision(params === null || params === void 0 ? void 0 : params.current, 3)) + ".\n " + ((params === null || params === void 0 ? void 0 : params.threshold) ? "Our threshold is \u00B1" + threshold(params === null || params === void 0 ? void 0 : params.threshold) + "." : '') + "\n Please either:\n 1) check the " + (params === null || params === void 0 ? void 0 : params.term.termType) + " value you provided;\n 2) check the data you provided which is the input into this model;\n 3) carefully read the documentation to understand if we used a default property as part of the calculations." :
7146
7228
  "not consistent with the model result.");
7147
7229
  },
7148
- _f['the measurement provided might be in error'] = function (_f, errorCount) {
7149
- var params = _f.params;
7230
+ _g['the measurement provided might be in error'] = function (_g, errorCount) {
7231
+ var params = _g.params;
7150
7232
  return "The expected value for " + code(params === null || params === void 0 ? void 0 : params.term.name) + " from the data provided in the upload is " + (errorCount === 1 ?
7151
7233
  code(utils.toPrecision(params === null || params === void 0 ? void 0 : params.expected, 3)) + ", but the value in the upload is " + code(utils.toPrecision(params === null || params === void 0 ? void 0 : params.current, 3)) + ".\n " + ((params === null || params === void 0 ? void 0 : params.threshold) ? "Our threshold is \u00B1" + threshold(params === null || params === void 0 ? void 0 : params.threshold) + "." : '') :
7152
7234
  "not consistent with the model result.");
7153
7235
  },
7154
- _f['must be equal to previous product multiplied by the share'] = function () { return "Products from a transformation which are an Input in to the next transformation must follow the following rule:\n " + code('previous.product.value * current.previousTransformationShare / 100 == current.input.value'); },
7155
- _f['must have only one entry with the same term.termType = excretaManagement'] = function () { return "There can only be one Practice of type excretaManagement in a Cycle.\n To represent multiple excreta management systems either use multiple Cycles and link them together,\n or use Transformations within a Cycle and link those together."; },
7156
- _f['every item in the list should be unique'] = function (_f) {
7157
- var params = _f.params;
7236
+ _g['must be equal to previous product multiplied by the share'] = function () { return "Products from a transformation which are an Input in to the next transformation must follow the following rule:\n " + code('previous.product.value * current.previousTransformationShare / 100 == current.input.value'); },
7237
+ _g['at least one Input must be a Product of the Cycle'] = function () { return "A Transformation converts a Product from a Cycle into another Product.\n Therefore, at least one Input into the Transformation must be a Product of the Cycle."; },
7238
+ _g['must have only one entry with the same term.termType = excretaManagement'] = function () { return "There can only be one Practice of type excretaManagement in a Cycle.\n To represent multiple excreta management systems either use multiple Cycles and link them together,\n or use Transformations within a Cycle and link those together."; },
7239
+ _g['must add the linked inputs to the cycle'] = function (_g, errorCount) {
7240
+ var params = _g.params;
7241
+ var _a, _b;
7242
+ return (errorCount === 1 ?
7243
+ 'You have stated some Emissions were created by some Inputs.' :
7244
+ "You have stated that " + code((_a = params === null || params === void 0 ? void 0 : params.term) === null || _a === void 0 ? void 0 : _a.name) + " was created by the following Inputs " + ((_b = params === null || params === void 0 ? void 0 : params.expected) === null || _b === void 0 ? void 0 : _b.map(function (e) { return code(e.name); }).join(' , '))) + ".\n However, these Inputs do not exist in the Cycle.\n Please add these Inputs, even if you do not have a value for them.";
7245
+ },
7246
+ _g['must add the linked transformations to the cycle'] = function (_g, errorCount) {
7247
+ var level = _g.level, params = _g.params;
7248
+ var _a, _b;
7249
+ return (errorCount === 1 ?
7250
+ 'You have stated some Emissions were created by some Transformations.' :
7251
+ "You have specified that" + code((_a = params === null || params === void 0 ? void 0 : params.term) === null || _a === void 0 ? void 0 : _a.name) + " was created during a Transformation with the Term name " + code((_b = params === null || params === void 0 ? void 0 : params.expected) === null || _b === void 0 ? void 0 : _b.name) + ".") + ".\n However, we cannot find a Transformation within the Cycle with this Term name.\n " + (level === 'error' ?
7252
+ 'Please check the Terms used in the Emissions and/or the Transformations.' :
7253
+ 'You may want to add this Transformation.');
7254
+ },
7255
+ _g['every item in the list should be unique'] = function (_g) {
7256
+ var params = _g.params;
7158
7257
  return "This Blank Node is duplicated. Every Blank Node should be unique.\n Uniqueness is determined by the following fields: " + ((params === null || params === void 0 ? void 0 : params.keys) || []).map(code).join(', ');
7159
7258
  },
7160
- _f['must contain as many items as values'] = function (_f) {
7161
- var params = _f.params, dataPath = _f.dataPath;
7259
+ _g['must contain as many items as values'] = function (_g) {
7260
+ var params = _g.params, dataPath = _g.dataPath;
7162
7261
  return "The number of " + code(dataPath.split('.').pop()) + " must match the number of " + code('value') + ".\n Currently there are " + (params === null || params === void 0 ? void 0 : params.current) + " " + code(dataPath.split('.').pop()) + " but " + (params === null || params === void 0 ? void 0 : params.expected) + " " + code('value') + ".";
7163
7262
  },
7164
- _f['is too generic'] = function (_f) {
7165
- var params = _f.params;
7263
+ _g['is too generic'] = function (_g) {
7264
+ var params = _g.params;
7166
7265
  var _a, _b, _c, _d, _e;
7167
7266
  return "You have the following Product " + code((_a = params === null || params === void 0 ? void 0 : params.product) === null || _a === void 0 ? void 0 : _a.name) + " however,\n you have used a generic " + glossaryTypeLink((_b = params === null || params === void 0 ? void 0 : params.term) === null || _b === void 0 ? void 0 : _b.termType) + " term " + code((_c = params === null || params === void 0 ? void 0 : params.term) === null || _c === void 0 ? void 0 : _c.name) + ".\n Use a more specific term for the " + glossaryTypeLink((_d = params === null || params === void 0 ? void 0 : params.term) === null || _d === void 0 ? void 0 : _d.termType) + " which reflects the specific " + glossaryTypeLink((_e = params === null || params === void 0 ? void 0 : params.product) === null || _e === void 0 ? void 0 : _e.termType) + ".";
7168
7267
  },
7169
- _f['is missing required bibliographic information'] = function () { return "The automatic bibliography search failed for this Bibliography. Either:\n 1) manually fill-in the <b>required</b> bibliographic information as per\n " + schemaLink(schema.SchemaType.Bibliography, 'our schema') + ".\n 2) provide the " + code('documentDOI') + " as well as the " + code('title') + "\n 3) check the " + code('documentDOI') + " and " + code('title') + " for typos against the\n " + externalLink('https://www.mendeley.com', 'Mendeley catalogue'); },
7170
- _f['should be lower than max size'] = function (_f) {
7171
- var params = _f.params;
7268
+ _g['is missing required bibliographic information'] = function () { return "The automatic bibliography search failed for this Bibliography. Either:\n 1) manually fill-in the <b>required</b> bibliographic information as per\n " + schemaLink(schema.SchemaType.Bibliography, 'our schema') + ".\n 2) provide the " + code('documentDOI') + " as well as the " + code('title') + "\n 3) check the " + code('documentDOI') + " and " + code('title') + " for typos against the\n " + externalLink('https://www.mendeley.com', 'Mendeley catalogue'); },
7269
+ _g['should be lower than max size'] = function (_g) {
7270
+ var params = _g.params;
7172
7271
  return "The boundary or region is >" + (params === null || params === void 0 ? void 0 : params.expected) + "km2 and is too large to reliably gap fill Measurements.";
7173
7272
  },
7174
- _f['an excreta input is required when using an excretaManagement practice'] = function (_f) {
7175
- var dataPath = _f.dataPath;
7273
+ _g['an excreta input is required when using an excretaManagement practice'] = function (_g) {
7274
+ var dataPath = _g.dataPath;
7176
7275
  var paths = parseDataPath(dataPath);
7177
7276
  return "Excreta management is the conversion of excreta to another type of excreta.\n You have added an excretaManagement Practice to this " + paths[0].label + " but there is no excreta Input.\n To represent excreta management, use a " + paths[0].label + " with excreta as an Input and excretaManagement as a Practice.";
7178
7277
  },
7179
- _f['only 1 primary product allowed'] = function () { return 'There can only be one primary product in each Cycle.'; },
7180
- _f['is not allowed in combination with noTillage'] = function () { return "This operation involves tillage, yet you have specified the Practice " + termLink(noTillage) + ".\n Either change this operation or the Practice."; },
7181
- _f['should contain a tillage practice'] = function () { return "We recommend specifying the type of tillage used for this Cycle.\n Please see the " + glossaryTypeLink(schema.TermTermType.tillage) + " glossary."; },
7182
- _f['must set value for every tillage practice'] = function () { return "Either specify a single " + glossaryTypeLink(schema.TermTermType.tillage) + " practice or add a value to all practices."; },
7183
- _f['sum not equal to 100% for tillage practices'] = function () { return "The sum of " + glossaryTypeLink(schema.TermTermType.tillage) + " practices must equal 100%."; },
7184
- _f['can only have 1 tillage practice without a value'] = function (_f) {
7185
- var params = _f.params;
7278
+ _g['only 1 primary product allowed'] = function () { return 'There can only be one primary product in each Cycle.'; },
7279
+ _g['is not allowed in combination with noTillage'] = function () { return "This operation involves tillage, yet you have specified the Practice " + termLink(noTillage) + ".\n Either change this operation or the Practice."; },
7280
+ _g['should contain a tillage practice'] = function () { return "We recommend specifying the type of tillage used for this Cycle.\n Please see the " + glossaryTypeLink(schema.TermTermType.tillage) + " glossary."; },
7281
+ _g['must set value for every tillage practice'] = function () { return "Either specify a single " + glossaryTypeLink(schema.TermTermType.tillage) + " practice or add a value to all practices."; },
7282
+ _g['sum not equal to 100% for tillage practices'] = function () { return "The sum of " + glossaryTypeLink(schema.TermTermType.tillage) + " practices must equal 100%."; },
7283
+ _g['can only have 1 tillage practice without a value'] = function (_g) {
7284
+ var params = _g.params;
7186
7285
  var _a;
7187
- return "It is not possible for a Cycle to have the following tillage Practices:\n " + ((_a = params === null || params === void 0 ? void 0 : params.current) !== null && _a !== void 0 ? _a : []).map(function (_f) {
7188
- var name = _f.name;
7286
+ return "It is not possible for a Cycle to have the following tillage Practices:\n " + ((_a = params === null || params === void 0 ? void 0 : params.current) !== null && _a !== void 0 ? _a : []).map(function (_g) {
7287
+ var name = _g.name;
7189
7288
  return name;
7190
7289
  }).join(' and ') + " at the same time.\n If multiple tillage practices did occur, please specify the percentage of area they occurred on.";
7191
7290
  },
7192
- _f['can not be linked to the same Cycle'] = function () { return 'You can not link an Input to the Impact Assessment of the same Cycle.'; },
7291
+ _g['can not be linked to the same Cycle'] = function () { return 'You can not link an Input to the Impact Assessment of the same Cycle.'; },
7193
7292
  // deprecated, remove when message is not being used anymore
7194
- _f['must be 0 for product value 0'] = function (_f, errorCount) {
7195
- var dataPath = _f.dataPath, params = _f.params;
7293
+ _g['must be 0 for product value 0'] = function (_g, errorCount) {
7294
+ var dataPath = _g.dataPath, params = _g.params;
7196
7295
  return "If the amount produced is zero, the " + code(dataPath === null || dataPath === void 0 ? void 0 : dataPath.split('.').pop()) + " of " + (errorCount === 1 ? code(params === null || params === void 0 ? void 0 : params.term.name) : 'that product') + " must also be zero.";
7197
7296
  },
7198
- _f['economicValueShare must be 0 for product value 0'] = function (_f, errorCount) {
7199
- var params = _f.params;
7297
+ _g['economicValueShare must be 0 for product value 0'] = function (_g, errorCount) {
7298
+ var params = _g.params;
7200
7299
  return "If the amount produced is zero, the economicValueShare of " + (errorCount === 1 ? code(params === null || params === void 0 ? void 0 : params.term.name) : 'that product') + " must also be zero.";
7201
7300
  },
7202
- _f['revenue must be 0 for product value 0'] = function (_f, errorCount) {
7203
- var params = _f.params;
7301
+ _g['revenue must be 0 for product value 0'] = function (_g, errorCount) {
7302
+ var params = _g.params;
7204
7303
  return "If the amount produced is zero, the revenue of " + (errorCount === 1 ? code(params === null || params === void 0 ? void 0 : params.term.name) : 'that product') + " must also be zero.";
7205
7304
  },
7206
- _f['should add a source'] = function (_f) {
7207
- var params = _f.params;
7305
+ _g['should add a source'] = function (_g) {
7306
+ var params = _g.params;
7208
7307
  return "We recommend adding a Source to all data items.\n This can be done by adding the " + code(params === null || params === void 0 ? void 0 : params.current) + " field.\n Sources can also be specified for each data item (i.e., each Input, Emission, Product, Practice, Measurement, or Infrastructure).";
7209
7308
  },
7210
- _f);
7309
+ _g['cover crop cycle contains non cover crop product'] = function () { return "You have specified that this crop is a cover crop using a Practice.\n A cover crop is defined as \"a crop which is left in the field without any fraction harvested by the end of the Cycle\".\n The Products of this Cycle are incompatible with this crop being a cover crop.\n Please check the Products or the Practices."; },
7310
+ _g);
7211
7311
  var formatCustomErrorMessage = function (message, error, errorCount) {
7212
7312
  if (errorCount === void 0) { errorCount = 1; }
7213
7313
  var formattedMessage = message && message in customErrorMessage ?
@@ -7221,23 +7321,23 @@
7221
7321
  };
7222
7322
  var errorHasError = function (error) { return error && (error.level === 'error' || !error.level); };
7223
7323
  var errorHasWarning = function (error) { return error && error.level === 'warning'; };
7224
- var isMissingPropertyError = function (_f) {
7225
- var params = _f.params;
7324
+ var isMissingPropertyError = function (_g) {
7325
+ var params = _g.params;
7226
7326
  return !!params && 'missingProperty' in params;
7227
7327
  };
7228
- var isMissingOneOfError = function (_f) {
7229
- var keyword = _f.keyword, schemaPath = _f.schemaPath;
7328
+ var isMissingOneOfError = function (_g) {
7329
+ var keyword = _g.keyword, schemaPath = _g.schemaPath;
7230
7330
  return keyword === 'required' && (schemaPath || '').includes('oneOf');
7231
7331
  };
7232
- var isFailingKeywordError = function (_f) {
7233
- var params = _f.params;
7332
+ var isFailingKeywordError = function (_g) {
7333
+ var params = _g.params;
7234
7334
  return !!params && 'failingKeyword' in params;
7235
7335
  };
7236
7336
  var filterError = function (error) { return [
7237
7337
  isFailingKeywordError
7238
7338
  ].every(function (func) { return !func(error); }); };
7239
- var missingNodeErrors = function (errors) { return errors.filter(function (_f) {
7240
- var keyword = _f.keyword, params = _f.params;
7339
+ var missingNodeErrors = function (errors) { return errors.filter(function (_g) {
7340
+ var keyword = _g.keyword, params = _g.params;
7241
7341
  return keyword === 'required' && ((params === null || params === void 0 ? void 0 : params.missingProperty) === '@type' || (params === null || params === void 0 ? void 0 : params.missingProperty) === '@id');
7242
7342
  }); };
7243
7343
 
@@ -9646,6 +9746,7 @@
9646
9746
  exports.CyclesFunctionalUnitMeasureComponent = CyclesFunctionalUnitMeasureComponent;
9647
9747
  exports.CyclesPracticesComponent = CyclesPracticesComponent;
9648
9748
  exports.CyclesPracticesLogsComponent = CyclesPracticesLogsComponent;
9749
+ exports.CyclesPracticesTimelineComponent = CyclesPracticesTimelineComponent;
9649
9750
  exports.CyclesResultComponent = CyclesResultComponent;
9650
9751
  exports.DataTableComponent = DataTableComponent;
9651
9752
  exports.DefaultPipe = DefaultPipe;
@@ -9711,6 +9812,7 @@
9711
9812
  exports.SitesMeasurementsLogsComponent = SitesMeasurementsLogsComponent;
9712
9813
  exports.SkeletonTextComponent = SkeletonTextComponent;
9713
9814
  exports.SocialTagsComponent = SocialTagsComponent;
9815
+ exports.SortByPipe = SortByPipe;
9714
9816
  exports.TagsInputDirective = TagsInputDirective;
9715
9817
  exports.TimesPipe = TimesPipe;
9716
9818
  exports.ToastComponent = ToastComponent;