@hestia-earth/ui-components 0.41.4 → 0.41.6

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.
@@ -141,7 +141,6 @@ const safeJSONParse = (value, defaultValue) => {
141
141
  }
142
142
  };
143
143
  const safeJSONStringify = (value) => (typeof value === 'string' ? value : JSON.stringify(value));
144
- const arrayValue = (values, isAverage) => (values || []).reduce((prev, curr) => prev + parseFloat(`${curr}`), 0) / (isAverage ? values.length : 1);
145
144
  const ellipsis = (text = '', maxlength = 20) => text.length > maxlength ? `${text.substring(0, maxlength)}...` : text;
146
145
  const nodeDefaultLabel = {
147
146
  [SchemaType.ImpactAssessment]: ({ name, country, endDate, product }) => name
@@ -672,7 +671,7 @@ const csvKey = (key) => (({
672
671
  unit: ''
673
672
  })[key] || key).trim();
674
673
  const csvValue$1 = (value) => (value || '').replace('[', '').replace(']', '').trim();
675
- const parseMessage$1 = (message = '') => message.split(',').reduce((prev, parts) => {
674
+ const parseMessage = (message = '') => message.split(',').reduce((prev, parts) => {
676
675
  const [key, value] = parts.split('=');
677
676
  const val = csvValue$1(value);
678
677
  return {
@@ -682,7 +681,7 @@ const parseMessage$1 = (message = '') => message.split(',').reduce((prev, parts)
682
681
  }, {});
683
682
  const formatLine = ({ data: { timestamp, message } }) => ({
684
683
  timestamp,
685
- ...parseMessage$1(message)
684
+ ...parseMessage(message)
686
685
  });
687
686
  const logToCsv$1 = (lines) => json2csv((lines || []).map(formatLine).filter(data => !isEmpty(data)), {
688
687
  emptyFieldValue: ''
@@ -4927,9 +4926,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
4927
4926
  }]
4928
4927
  }] });
4929
4928
 
4929
+ const noValues = ['None'];
4930
4930
  class SortByPipe {
4931
- transform(value, keys, orders = ['asc']) {
4932
- return orderBy(value, keys, orders);
4931
+ transform(value, key, orders = ['asc']) {
4932
+ const keys = Array.isArray(key) ? key : [key];
4933
+ const iteratees = keys.map(key => (item) => (noValues.includes(item[key]) ? -Infinity : item[key]));
4934
+ return orderBy(value, iteratees, orders);
4933
4935
  }
4934
4936
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: SortByPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4935
4937
  static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.6", ngImport: i0, type: SortByPipe, isStandalone: true, name: "sortBy" }); }
@@ -7012,15 +7014,23 @@ const parseLookup = ({ column, termid, 'term.id': _termid, [missingLookupPrefix]
7012
7014
  column
7013
7015
  });
7014
7016
  const csvValue = (value) => (value || '').replace('[', '').replace(']', '');
7015
- const parseMessage = (message) => {
7017
+ const parseLogMessage = (message) => {
7016
7018
  try {
7017
7019
  const data = JSON.parse(message);
7018
- return data.message.split(',').reduce((prev, parts) => {
7019
- const [key, value] = parts.split('=');
7020
+ // Split on a comma (and optional space) ONLY if it's followed by "key="
7021
+ // \w+ matches alphanumeric characters and underscores (standard log keys)
7022
+ const pairs = data.message.split(/,\s*(?=\w+=)/);
7023
+ return pairs.reduce((prev, parts) => {
7024
+ // Use indexOf instead of split('=') just in case your values ever contain an '='
7025
+ const firstEqualsIndex = parts.indexOf('=');
7026
+ if (firstEqualsIndex === -1)
7027
+ return prev;
7028
+ const key = parts.substring(0, firstEqualsIndex).trim();
7029
+ const value = parts.substring(firstEqualsIndex + 1).trim();
7020
7030
  const val = csvValue(value);
7021
7031
  return {
7022
7032
  ...prev,
7023
- ...(key && val ? { [key.trim()]: val } : {})
7033
+ ...(key && val ? { [key]: val } : {})
7024
7034
  };
7025
7035
  }, { logger: data.logger });
7026
7036
  }
@@ -7136,7 +7146,7 @@ const groupLogSubValue = (group, log, key) => {
7136
7146
  const groupLogsByModel = (data = '', groupBySubValue = false, groupByAnimal = false) => data
7137
7147
  .trim()
7138
7148
  .split('\n')
7139
- .map(parseMessage)
7149
+ .map(parseLogMessage)
7140
7150
  .filter(v => [hasValue(v?.model), ['term', 'key', 'animalId'].some(k => hasValue(v?.[k]))].every(Boolean))
7141
7151
  .reduce((group, log) => {
7142
7152
  const subValue = subValueKeys.find(v => !!log[v] && log[v] != noValue);
@@ -9466,7 +9476,7 @@ class NodeAggregatedQualityScoreComponent {
9466
9476
  '@type': node['@type'],
9467
9477
  '@id': node['@id']
9468
9478
  })
9469
- .pipe(map(value => (value ? parseLines(value) : [])), mergeAll(), filter(({ data: { message } }) => !!message), map(({ data: { message } }) => parseMessage$1(message)), filter(({ id }) => id === this.node()['@id']), reduce((a, b) => ({ ...a, ...b }), {}))
9479
+ .pipe(map(value => (value ? parseLines(value) : [])), mergeAll(), filter(({ data: { message } }) => !!message), map(({ data: { message } }) => parseMessage(message)), filter(({ id }) => id === this.node()['@id']), reduce((a, b) => ({ ...a, ...b }), {}))
9470
9480
  : of({})
9471
9481
  });
9472
9482
  this.logs = computed(() => this.logsResource.value() ?? {}, ...(ngDevMode ? [{ debugName: "logs" }] : []));
@@ -9712,7 +9722,7 @@ class NodeLogsTimeComponent {
9712
9722
  ? []
9713
9723
  : parseLines(this.nodeLogsResource.value())
9714
9724
  .filter(({ data }) => data?.message?.includes('memory_used'))
9715
- .map(({ data }) => parseMessage$1(data.message))
9725
+ .map(({ data }) => parseMessage(data.message))
9716
9726
  .map(data => ({
9717
9727
  ...data,
9718
9728
  time: +data.time
@@ -12154,6 +12164,7 @@ var FileUploadErrorKeys;
12154
12164
  FileUploadErrorKeys["MultipleTermHeaders"] = "multiple-term-headers";
12155
12165
  FileUploadErrorKeys["MaxSize"] = "max-size";
12156
12166
  FileUploadErrorKeys["InvalidBlankNodeHeaders"] = "invalid-blank-node-headers";
12167
+ FileUploadErrorKeys["MultipleNodeTypeCase"] = "multiple-nodeType-case";
12157
12168
  FileUploadErrorKeys["MaxRows"] = "max-rows";
12158
12169
  FileUploadErrorKeys["Mendeley"] = "'content-type'";
12159
12170
  FileUploadErrorKeys["Timeout"] = "TimeoutError: Timeout has occurred";
@@ -12255,11 +12266,11 @@ class FilesUploadErrorsComponent {
12255
12266
  return value !== firstVal;
12256
12267
  }
12257
12268
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilesUploadErrorsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12258
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: FilesUploadErrorsComponent, isStandalone: true, selector: "he-files-upload-errors", inputs: { error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: true, transformFunction: null }, file: { classPropertyName: "file", publicName: "file", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (error()) {\n <div class=\"is-flex is-flex-direction-column is-gap-8 has-text-danger\">\n @switch (message()) {\n @case (ErrorKeys.PrivacyNotAllowed) {\n <div>\n <span>\n Uploading data with\n <code class=\"is-px-1\">dataPrivate={{ error().value }}</code>\n is not allowed.\n </span>\n <span class=\"is-pl-1\">\n Please try uploading with\n <code class=\"is-px-1\">dataPrivate={{ !error().value }}</code>\n instead.\n </span>\n </div>\n }\n @case (ErrorKeys.InvalidJSON) {\n <div>\n <p>The uploaded content does not appear to contain valid JSON data:</p>\n <div class=\"is-my-2\">\n <pre><code>{{error().error}}</code></pre>\n </div>\n <p>\n Please validate your JSON content before uploading it using an\n <a href=\"https://jsoneditoronline.org\" target=\"_blank\">online tool</a>\n for example.\n </p>\n </div>\n }\n @case (ErrorKeys.NoData) {\n <div>\n <p>No Nodes could be found in your Upload. Please verify the column headers match the HESTIA schema.</p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n }\n @case (ErrorKeys.SetValueError) {\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span>\n We could not convert the data in your Upload. This can be due to setting 2 different formats in the same\n field.\n </span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"schemaUrl()\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n <div>\n <pre><code>{{error().key}}</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.PropertyNotFound) {\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span class=\"is-pl-2\">You have column headers that do not match the HESTIA schema.</span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"schemaUrl()\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n <div>\n <pre><code>{{error().key}}</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.PropertyInvalidFormat) {\n <div>\n <div>\n <span>\n The following value in the column\n <i>{{ error().key }}</i>\n is not in the correct format:\n </span>\n <br />\n <pre class=\"is-mt-2\"><code>{{stringify(error().value)}}</code></pre>\n </div>\n @switch (hasNumberWithCommasError()) {\n @case (true) {\n <p class=\"is-mt-2\">\n Please format your numbers to remove commas and use a decimal point to separate the whole part of the\n number from the fractional part of the number.\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>3,510.1</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>3510.1</code></pre>\n }\n @case (false) {\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n <p>The error could either be a value in the column, or an error with the column header.</p>\n <p>\n If you are trying to set no data, we accept either\n <code>-</code>\n or an empty cell.\n </p>\n }\n }\n </div>\n }\n @case (ErrorKeys.PropertyRequired) {\n <div>\n <div>\n <span class=\"pr-1\">The following field is required in the</span>\n @if (error().schema) {\n <a class=\"pr-1\" [href]=\"schemaUrl()\" target=\"_blank\">{{ error().schema }}</a>\n }\n <span>schema:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().property}}</code></pre>\n </div>\n <p>\n @switch (error().property) {\n @case ('id') {\n <span>\n You must assign a unique\n <code>id</code>\n for every record in your data.\n </span>\n }\n @case ('type') {\n <span>\n Every record in your data must contain a\n <code>type</code>\n .\n </span>\n }\n }\n </p>\n </div>\n }\n @case (ErrorKeys.PropertyInternal) {\n <div>\n <div>\n <span class=\"pr-1\">\n The following field is\n <code>internal</code>\n in the\n </span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schema }} schema</a>\n <span>:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().schemaKey || error().key}}</code></pre>\n </div>\n <p>\n You cannot upload\n <code>internal</code>\n fields to HESTIA.\n </p>\n </div>\n }\n @case (SchemaErrorKeys.SchemaNotFound) {\n <div>\n @if (error().key) {\n <div>\n <span>The following Node does not exist in the schema:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().key}}</code></pre>\n </div>\n } @else if (error().schema) {\n <div>\n <span>The following Node Type does not exist in the schema or can not be uploaded directly:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().schema}}</code></pre>\n </div>\n }\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul>\n @for (type of nodeTypes; track type) {\n <li>\n <i>{{ type }}</i>\n </li>\n }\n </ul>\n </div>\n </div>\n }\n @case (ErrorKeys.InvalidFirstColumn) {\n <div>\n <span>\n No data in the HESTIA format was detected on the first sheet. Either try selecting a different sheet in the\n upload screen, or check the sheet to ensure the headers follow the schema - see examples\n </span>\n <a class=\"pl-1\" href=\"/guide/guide-file-upload-examples\" target=\"_blank\">here</a>\n </div>\n }\n @case (ErrorKeys.InvalidExcelFile) {\n <div>\n This file has been uploaded with a\n <code>{{ fileExt() }}</code>\n extension, but does not appear to be a valid Excel file.\n </div>\n }\n @case (ErrorKeys.NoHeaders) {\n <div>\n <p>\n No headers matching the HESTIA schema were found on the first row. Please remove all empty rows at the\n begining of the file and try uploading again.\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n }\n @case (ErrorKeys.InvalidSheetName) {\n <div>\n <div>\n <span class=\"pr-1\">The Excel sheet</span>\n <code>{{ error().value }}</code>\n <span class=\"pl-1\">does not exist.</span>\n <span class=\"pl-1\">Your Excel file contains the following sheets:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (e of error().error.split(';'); track e) {\n <li>\n <code>{{ e }}</code>\n </li>\n }\n </ul>\n </div>\n <p>\n <span>Please re-upload selecting one of the sheets above.</span>\n </p>\n </div>\n }\n @case (ErrorKeys.DuplicatedHeaders) {\n <div>\n <span>Your upload contains duplicated column headers.</span>\n </div>\n }\n @case (ErrorKeys.DuplicatedIds) {\n <div>\n <div>\n <span class=\"is-pr-1\">You have multiple</span>\n <code>{{ error().schema | pluralize }}</code>\n <span class=\"is-px-1\">with the same</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-px-1\">but different data. The</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-pl-1\">is:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().value}}</code></pre>\n </div>\n <p class=\"is-mt-2 is-italic\">\n <span class=\"is-pr-1\">Please note that ussing different case does not make the</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-pl-1\">unique.</span>\n </p>\n </div>\n }\n @case (SchemaErrorKeys.DuplicatedIdFields) {\n <div>\n <span class=\"is-pr-1\">You have used both the</span>\n <code>&#64;id</code>\n <span class=\"is-px-1\">and</span>\n <code>id</code>\n <span class=\"is-px-1\">fields in the same data. Please use</span>\n <code>&#64;id</code>\n <span class=\"is-px-1\">when linking to existing nodes on the Platform, and</span>\n <code>id</code>\n <span class=\"is-px-1\">when linking to nodes you are uploading in this file using the same</span>\n <code>id</code>\n <span class=\"is-px-1\">field.</span>\n </div>\n }\n @case (ErrorKeys.NestedHeaders) {\n <div>\n <p>\n To link nodes together, you first need to define the node (e.g.,\n <code>source.id</code>\n ,\n <code>source.bibliography.title</code>\n ) and then create the link (e.g.,\n <code>cycle.defaultSource.id</code>\n ). We do not allow nesting (e.g.,\n <code>cycle.defaultSource.bibliography.title</code>\n ).\n </p>\n </div>\n }\n @case (ErrorKeys.NestedNodes) {\n <div>\n <p>To link nodes together, you need to upload each node separately, as we do not allow nesting:</p>\n <pre class=\"is-mt-2\"><code>{{ sampleLinkedNodes | json }}</code></pre>\n </div>\n }\n @case (ErrorKeys.ReferenceExistingHeaders) {\n <div>\n <p>\n You have used the internal\n <code>&#64;id</code>\n field to upload a new Node.\n </p>\n <p>\n The\n <code>&#64;id</code>\n field should only be used to reference existing Node or Terms. Example:\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.&#64;id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n </div>\n }\n @case (ErrorKeys.InvalidBlankNodeHeaders) {\n <div>\n <p>Evry blank node must be followed by a number, e.g.:</p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.name</code></pre>\n </div>\n }\n @case (ErrorKeys.MultipleTermHeaders) {\n <div>\n <p>\n You are using both\n <code>&#64;id</code>\n (or\n <code>id</code>\n ) and\n <code>name</code>\n fields to upload an existing Node (e.g., a Term).\n </p>\n <p>\n Using both fields can lead to inconsistencies, if you are not uploading the correct value in either one.\n Instead, you should only use one of them:\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.&#64;id,cycle.inputs.0.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.&#64;id</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.ObjectArrayInvalid) {\n <div>\n <p>The column header {{ error().key }} must use the array format. Examples:</p>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.0.term.name' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.0.value' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.1.term.name' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.1.value' }}</code></pre>\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n </div>\n }\n @case (ErrorKeys.MaxSize) {\n <div>\n <span>The maximum file size limit is {{ maxFileSizeMb }}Mb (current file size: {{ error().value }}Mb).</span>\n <span class=\"pl-1\">Please re-upload these data in multiple files.</span>\n </div>\n }\n @case (ErrorKeys.MaxRows) {\n <div>\n <span>\n Your file has {{ error().value | number }} rows. This might be an error caused by adding some data at the\n bottom of a spreadsheet by accident: delete any unused rows and resubmit the file.\n </span>\n </div>\n }\n @case (ErrorKeys.Mendeley) {\n <div>\n <p>An error occured while fetching the bibliographic information. Please try re-uploading the file.</p>\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n @case (ErrorKeys.Timeout) {\n <div>\n <p>Time exceeded for current step.</p>\n\n @if (debug()) {\n <span>You can try to \"Re-index\" or \"Re-upload\" if it still does not work.</span>\n }\n\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n @default {\n <div>\n <p>{{ message() }}</p>\n\n @if (debug()) {\n <pre><code>{{ error() | json }}</code></pre>\n }\n\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n }\n\n @if (hasGeoJSONError()) {\n <div>\n <p>If the GeoJSON is too large, please try to simplify it following these steps:</p>\n <ul class=\"is-my-1 content is-list-style-decimal pl-5\">\n <li>\n <span class=\"is-pr-1\">Go to</span>\n <a href=\"https://mapshaper.org/\" target=\"_blank\">https://mapshaper.org/</a>\n </li>\n <li>\n <span>\n Save the boundary in a valid\n <code>.geojson</code>\n file.\n </span>\n </li>\n <li>\n <span>Import it on mapshaper.</span>\n </li>\n <li>\n <span>Click \"Simplify\" in the top right corner in the menu bar.</span>\n </li>\n <li>\n <span>Adjust the percentage to a lower value, like 50% to start with.</span>\n </li>\n <li>\n <span>\n Export to\n <code>GeoJson</code>\n or\n <code>CSV</code>\n .\n </span>\n </li>\n <li>\n <span>Copy the resulting content into your upload file.</span>\n </li>\n </ul>\n <p>If you encounter the error again, try again using a lower percentage at step 5.</p>\n </div>\n }\n\n @if (columns().length || (error().index && !isSchemaError())) {\n <div>\n <b>Hint:</b>\n <span class=\"pl-1\">the error might be located</span>\n @if (error().index && !isSchemaError()) {\n <span class=\"pl-1\">on row {{ error().index }}</span>\n }\n @if (columns().length) {\n <span class=\"pl-1\">in {{ 'column' | pluralize: columns().length }}:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (column of columns(); track column) {\n <li>\n <b class=\"pr-2\">{{ column.column }}</b>\n <code>{{ column.name }}</code>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n @if (error().suggestions?.length) {\n <div>\n <b>Suggestions:</b>\n <span class=\"pl-1\">did you mean instead:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (suggestion of error().suggestions; track suggestion) {\n <li>\n <code>{{ suggestion }}</code>\n </li>\n }\n </ul>\n </div>\n }\n\n @if (showCsvPreview()) {\n <div>\n <b>\n Preview\n <sup>1</sup>\n :\n </b>\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-bordered is-fullwidth is-hoverable is-narrow mb-0\">\n <thead>\n @if (error().index) {\n <th></th>\n }\n @for (header of headers(); track header) {\n <th>{{ header }}</th>\n }\n </thead>\n <tbody>\n @for (row of rows(); track row) {\n <tr>\n @if (error().index) {\n <td class=\"has-text-danger\">\n <span class=\"is-nowrap\">Row {{ error().index }}</span>\n </td>\n }\n @for (col of row; track col; let colIndex = $index) {\n <td>\n <span\n [class.has-text-danger]=\"\n message() === ErrorKeys.DuplicatedIds && hasDuplicatedError(col, colIndex)\n \">\n {{ col | ellipsis: 50 }}\n </span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n <p class=\"is-size-7\">\n <i>1. The preview does not necessarily reflect the original Upload's order or content.</i>\n </p>\n </div>\n }\n\n @if (showJsonPreview()) {\n <div>\n <b>Preview:</b>\n <pre class=\"is-mt-2\"><code>{{stringify(error().node)}}</code></pre>\n </div>\n }\n </div>\n}\n\n<ng-template #defaultError>\n <p class=\"is-mt-2 has-text-black\">\n <span class=\"is-pr-1\">If you are still stuck, please see</span>\n <a [href]=\"baseUrl + '/guide/guide-file-upload-prepare-file'\" target=\"_blank\">the example uploads and videos</a>\n <span class=\"is-px-1\">\n or try using the Wizard to get the first few rows of data formatted correctly, or use the chat to ask for help.\n </span>\n </p>\n</ng-template>\n\n<ng-template #reportError>\n <p class=\"is-mt-2\">\n To report this error, please\n <a class=\"is-pl-1\" [href]=\"reportErrorUrl()\" target=\"_blank\">click here</a>\n .\n </p>\n</ng-template>\n\n<ng-template #schemaError>\n <p>\n <span class=\"pr-1\">You can see the accepted field type and some examples</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">here</a>\n <span>.</span>\n </p>\n</ng-template>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: PluralizePipe, name: "pluralize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12269
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: FilesUploadErrorsComponent, isStandalone: true, selector: "he-files-upload-errors", inputs: { error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: true, transformFunction: null }, file: { classPropertyName: "file", publicName: "file", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (error()) {\n <div class=\"is-flex is-flex-direction-column is-gap-8 has-text-danger\">\n @switch (message()) {\n @case (ErrorKeys.PrivacyNotAllowed) {\n <div>\n <span>\n Uploading data with\n <code class=\"is-px-1\">dataPrivate={{ error().value }}</code>\n is not allowed.\n </span>\n <span class=\"is-pl-1\">\n Please try uploading with\n <code class=\"is-px-1\">dataPrivate={{ !error().value }}</code>\n instead.\n </span>\n </div>\n }\n @case (ErrorKeys.InvalidJSON) {\n <div>\n <p>The uploaded content does not appear to contain valid JSON data:</p>\n <div class=\"is-my-2\">\n <pre><code>{{error().error}}</code></pre>\n </div>\n <p>\n Please validate your JSON content before uploading it using an\n <a href=\"https://jsoneditoronline.org\" target=\"_blank\">online tool</a>\n for example.\n </p>\n </div>\n }\n @case (ErrorKeys.NoData) {\n <div>\n <p>No Nodes could be found in your Upload. Please verify the column headers match the HESTIA schema.</p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n }\n @case (ErrorKeys.SetValueError) {\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span>\n We could not convert the data in your Upload. This can be due to setting 2 different formats in the same\n field.\n </span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"schemaUrl()\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n <div>\n <pre><code>{{error().key}}</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.PropertyNotFound) {\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span class=\"is-pl-2\">You have column headers that do not match the HESTIA schema.</span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"schemaUrl()\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n <div>\n <pre><code>{{error().key}}</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.PropertyInvalidFormat) {\n <div>\n <div>\n <span>\n The following value in the column\n <i>{{ error().key }}</i>\n is not in the correct format:\n </span>\n <br />\n <pre class=\"is-mt-2\"><code>{{stringify(error().value)}}</code></pre>\n </div>\n @switch (hasNumberWithCommasError()) {\n @case (true) {\n <p class=\"is-mt-2\">\n Please format your numbers to remove commas and use a decimal point to separate the whole part of the\n number from the fractional part of the number.\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>3,510.1</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>3510.1</code></pre>\n }\n @case (false) {\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n <p>The error could either be a value in the column, or an error with the column header.</p>\n <p>\n If you are trying to set no data, we accept either\n <code>-</code>\n or an empty cell.\n </p>\n }\n }\n </div>\n }\n @case (ErrorKeys.PropertyRequired) {\n <div>\n <div>\n <span class=\"pr-1\">The following field is required in the</span>\n @if (error().schema) {\n <a class=\"pr-1\" [href]=\"schemaUrl()\" target=\"_blank\">{{ error().schema }}</a>\n }\n <span>schema:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().property}}</code></pre>\n </div>\n <p>\n @switch (error().property) {\n @case ('id') {\n <span>\n You must assign a unique\n <code>id</code>\n for every record in your data.\n </span>\n }\n @case ('type') {\n <span>\n Every record in your data must contain a\n <code>type</code>\n .\n </span>\n }\n }\n </p>\n </div>\n }\n @case (ErrorKeys.PropertyInternal) {\n <div>\n <div>\n <span class=\"pr-1\">\n The following field is\n <code>internal</code>\n in the\n </span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schema }} schema</a>\n <span>:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().schemaKey || error().key}}</code></pre>\n </div>\n <p>\n You cannot upload\n <code>internal</code>\n fields to HESTIA.\n </p>\n </div>\n }\n @case (SchemaErrorKeys.SchemaNotFound) {\n <div>\n @if (error().key) {\n <div>\n <span>The following Node does not exist in the schema:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().key}}</code></pre>\n </div>\n } @else if (error().schema) {\n <div>\n <span>The following Node Type does not exist in the schema or can not be uploaded directly:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().schema}}</code></pre>\n </div>\n }\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul>\n @for (type of nodeTypes; track type) {\n <li>\n <i>{{ type }}</i>\n </li>\n }\n </ul>\n </div>\n </div>\n }\n @case (ErrorKeys.InvalidFirstColumn) {\n <div>\n <span>\n No data in the HESTIA format was detected on the first sheet. Either try selecting a different sheet in the\n upload screen, or check the sheet to ensure the headers follow the schema - see examples\n </span>\n <a class=\"pl-1\" href=\"/guide/guide-file-upload-examples\" target=\"_blank\">here</a>\n </div>\n }\n @case (ErrorKeys.InvalidExcelFile) {\n <div>\n This file has been uploaded with a\n <code>{{ fileExt() }}</code>\n extension, but does not appear to be a valid Excel file.\n </div>\n }\n @case (ErrorKeys.NoHeaders) {\n <div>\n <p>\n No headers matching the HESTIA schema were found on the first row. Please remove all empty rows at the\n begining of the file and try uploading again.\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n }\n @case (ErrorKeys.InvalidSheetName) {\n <div>\n <div>\n <span class=\"pr-1\">The Excel sheet</span>\n <code>{{ error().value }}</code>\n <span class=\"pl-1\">does not exist.</span>\n <span class=\"pl-1\">Your Excel file contains the following sheets:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (e of error().error.split(';'); track e) {\n <li>\n <code>{{ e }}</code>\n </li>\n }\n </ul>\n </div>\n <p>\n <span>Please re-upload selecting one of the sheets above.</span>\n </p>\n </div>\n }\n @case (ErrorKeys.DuplicatedHeaders) {\n <div>\n <span>Your upload contains duplicated column headers.</span>\n </div>\n }\n @case (ErrorKeys.DuplicatedIds) {\n <div>\n <div>\n <span class=\"is-pr-1\">You have multiple</span>\n <code>{{ error().schema | pluralize }}</code>\n <span class=\"is-px-1\">with the same</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-px-1\">but different data. The</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-pl-1\">is:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().value}}</code></pre>\n </div>\n <p class=\"is-mt-2 is-italic\">\n <span class=\"is-pr-1\">Please note that ussing different case does not make the</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-pl-1\">unique.</span>\n </p>\n </div>\n }\n @case (SchemaErrorKeys.DuplicatedIdFields) {\n <div>\n <span class=\"is-pr-1\">You have used both the</span>\n <code>&#64;id</code>\n <span class=\"is-px-1\">and</span>\n <code>id</code>\n <span class=\"is-px-1\">fields in the same data. Please use</span>\n <code>&#64;id</code>\n <span class=\"is-px-1\">when linking to existing nodes on the Platform, and</span>\n <code>id</code>\n <span class=\"is-px-1\">when linking to nodes you are uploading in this file using the same</span>\n <code>id</code>\n <span class=\"is-px-1\">field.</span>\n </div>\n }\n @case (ErrorKeys.NestedHeaders) {\n <div>\n <p>\n To link nodes together, you first need to define the node (e.g.,\n <code>source.id</code>\n ,\n <code>source.bibliography.title</code>\n ) and then create the link (e.g.,\n <code>cycle.defaultSource.id</code>\n ). We do not allow nesting (e.g.,\n <code>cycle.defaultSource.bibliography.title</code>\n ).\n </p>\n </div>\n }\n @case (ErrorKeys.NestedNodes) {\n <div>\n <p>To link nodes together, you need to upload each node separately, as we do not allow nesting:</p>\n <pre class=\"is-mt-2\"><code>{{ sampleLinkedNodes | json }}</code></pre>\n </div>\n }\n @case (ErrorKeys.ReferenceExistingHeaders) {\n <div>\n <p>\n You have used the internal\n <code>&#64;id</code>\n field to upload a new Node.\n </p>\n <p>\n The\n <code>&#64;id</code>\n field should only be used to reference existing Node or Terms. Example:\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.&#64;id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n </div>\n }\n @case (ErrorKeys.InvalidBlankNodeHeaders) {\n <div>\n <p>Evry blank node must be followed by a number, e.g.:</p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.name</code></pre>\n </div>\n }\n @case (ErrorKeys.MultipleNodeTypeCase) {\n <div>\n <p>You are using a combination of mixed cases in your headers:</p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>impactAssessment.id,impactAssessment.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>impactAssessment.id,impactassessment.name</code></pre>\n\n <p>\n Please make sure to always use either\n <code>impactAssessment</code>\n or\n <code>impactassessment</code>\n , but not both.\n </p>\n </div>\n }\n @case (ErrorKeys.MultipleTermHeaders) {\n <div>\n <p>\n You are using both\n <code>&#64;id</code>\n (or\n <code>id</code>\n ) and\n <code>name</code>\n fields to upload an existing Node (e.g., a Term).\n </p>\n <p>\n Using both fields can lead to inconsistencies, if you are not uploading the correct value in either one.\n Instead, you should only use one of them:\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.&#64;id,cycle.inputs.0.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.&#64;id</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.ObjectArrayInvalid) {\n <div>\n <p>The column header {{ error().key }} must use the array format. Examples:</p>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.0.term.name' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.0.value' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.1.term.name' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.1.value' }}</code></pre>\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n </div>\n }\n @case (ErrorKeys.MaxSize) {\n <div>\n <span>The maximum file size limit is {{ maxFileSizeMb }}Mb (current file size: {{ error().value }}Mb).</span>\n <span class=\"pl-1\">Please re-upload these data in multiple files.</span>\n </div>\n }\n @case (ErrorKeys.MaxRows) {\n <div>\n <span>\n Your file has {{ error().value | number }} rows. This might be an error caused by adding some data at the\n bottom of a spreadsheet by accident: delete any unused rows and resubmit the file.\n </span>\n </div>\n }\n @case (ErrorKeys.Mendeley) {\n <div>\n <p>An error occured while fetching the bibliographic information. Please try re-uploading the file.</p>\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n @case (ErrorKeys.Timeout) {\n <div>\n <p>Time exceeded for current step.</p>\n\n @if (debug()) {\n <span>You can try to \"Re-index\" or \"Re-upload\" if it still does not work.</span>\n }\n\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n @default {\n <div>\n <p>{{ message() }}</p>\n\n @if (debug()) {\n <pre><code>{{ error() | json }}</code></pre>\n }\n\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n }\n\n @if (hasGeoJSONError()) {\n <div>\n <p>If the GeoJSON is too large, please try to simplify it following these steps:</p>\n <ul class=\"is-my-1 content is-list-style-decimal pl-5\">\n <li>\n <span class=\"is-pr-1\">Go to</span>\n <a href=\"https://mapshaper.org/\" target=\"_blank\">https://mapshaper.org/</a>\n </li>\n <li>\n <span>\n Save the boundary in a valid\n <code>.geojson</code>\n file.\n </span>\n </li>\n <li>\n <span>Import it on mapshaper.</span>\n </li>\n <li>\n <span>Click \"Simplify\" in the top right corner in the menu bar.</span>\n </li>\n <li>\n <span>Adjust the percentage to a lower value, like 50% to start with.</span>\n </li>\n <li>\n <span>\n Export to\n <code>GeoJson</code>\n or\n <code>CSV</code>\n .\n </span>\n </li>\n <li>\n <span>Copy the resulting content into your upload file.</span>\n </li>\n </ul>\n <p>If you encounter the error again, try again using a lower percentage at step 5.</p>\n </div>\n }\n\n @if (columns().length || (error().index && !isSchemaError())) {\n <div>\n <b>Hint:</b>\n <span class=\"pl-1\">the error might be located</span>\n @if (error().index && !isSchemaError()) {\n <span class=\"pl-1\">on row {{ error().index }}</span>\n }\n @if (columns().length) {\n <span class=\"pl-1\">in {{ 'column' | pluralize: columns().length }}:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (column of columns(); track column) {\n <li>\n <b class=\"pr-2\">{{ column.column }}</b>\n <code>{{ column.name }}</code>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n @if (error().suggestions?.length) {\n <div>\n <b>Suggestions:</b>\n <span class=\"pl-1\">did you mean instead:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (suggestion of error().suggestions; track suggestion) {\n <li>\n <code>{{ suggestion }}</code>\n </li>\n }\n </ul>\n </div>\n }\n\n @if (showCsvPreview()) {\n <div>\n <b>\n Preview\n <sup>1</sup>\n :\n </b>\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-bordered is-fullwidth is-hoverable is-narrow mb-0\">\n <thead>\n @if (error().index) {\n <th></th>\n }\n @for (header of headers(); track header) {\n <th>{{ header }}</th>\n }\n </thead>\n <tbody>\n @for (row of rows(); track row) {\n <tr>\n @if (error().index) {\n <td class=\"has-text-danger\">\n <span class=\"is-nowrap\">Row {{ error().index }}</span>\n </td>\n }\n @for (col of row; track col; let colIndex = $index) {\n <td>\n <span\n [class.has-text-danger]=\"\n message() === ErrorKeys.DuplicatedIds && hasDuplicatedError(col, colIndex)\n \">\n {{ col | ellipsis: 50 }}\n </span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n <p class=\"is-size-7\">\n <i>1. The preview does not necessarily reflect the original Upload's order or content.</i>\n </p>\n </div>\n }\n\n @if (showJsonPreview()) {\n <div>\n <b>Preview:</b>\n <pre class=\"is-mt-2\"><code>{{stringify(error().node)}}</code></pre>\n </div>\n }\n </div>\n}\n\n<ng-template #defaultError>\n <p class=\"is-mt-2 has-text-black\">\n <span class=\"is-pr-1\">If you are still stuck, please see</span>\n <a [href]=\"baseUrl + '/guide/guide-file-upload-prepare-file'\" target=\"_blank\">the example uploads and videos</a>\n <span class=\"is-px-1\">\n or try using the Wizard to get the first few rows of data formatted correctly, or use the chat to ask for help.\n </span>\n </p>\n</ng-template>\n\n<ng-template #reportError>\n <p class=\"is-mt-2\">\n To report this error, please\n <a class=\"is-pl-1\" [href]=\"reportErrorUrl()\" target=\"_blank\">click here</a>\n .\n </p>\n</ng-template>\n\n<ng-template #schemaError>\n <p>\n <span class=\"pr-1\">You can see the accepted field type and some examples</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">here</a>\n <span>.</span>\n </p>\n</ng-template>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: HESvgIconComponent, selector: "he-svg-icon", inputs: ["name", "size", "animation"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: PluralizePipe, name: "pluralize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12259
12270
  }
12260
12271
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilesUploadErrorsComponent, decorators: [{
12261
12272
  type: Component$1,
12262
- args: [{ selector: 'he-files-upload-errors', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, HESvgIconComponent, DecimalPipe, JsonPipe, EllipsisPipe, PluralizePipe], template: "@if (error()) {\n <div class=\"is-flex is-flex-direction-column is-gap-8 has-text-danger\">\n @switch (message()) {\n @case (ErrorKeys.PrivacyNotAllowed) {\n <div>\n <span>\n Uploading data with\n <code class=\"is-px-1\">dataPrivate={{ error().value }}</code>\n is not allowed.\n </span>\n <span class=\"is-pl-1\">\n Please try uploading with\n <code class=\"is-px-1\">dataPrivate={{ !error().value }}</code>\n instead.\n </span>\n </div>\n }\n @case (ErrorKeys.InvalidJSON) {\n <div>\n <p>The uploaded content does not appear to contain valid JSON data:</p>\n <div class=\"is-my-2\">\n <pre><code>{{error().error}}</code></pre>\n </div>\n <p>\n Please validate your JSON content before uploading it using an\n <a href=\"https://jsoneditoronline.org\" target=\"_blank\">online tool</a>\n for example.\n </p>\n </div>\n }\n @case (ErrorKeys.NoData) {\n <div>\n <p>No Nodes could be found in your Upload. Please verify the column headers match the HESTIA schema.</p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n }\n @case (ErrorKeys.SetValueError) {\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span>\n We could not convert the data in your Upload. This can be due to setting 2 different formats in the same\n field.\n </span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"schemaUrl()\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n <div>\n <pre><code>{{error().key}}</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.PropertyNotFound) {\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span class=\"is-pl-2\">You have column headers that do not match the HESTIA schema.</span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"schemaUrl()\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n <div>\n <pre><code>{{error().key}}</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.PropertyInvalidFormat) {\n <div>\n <div>\n <span>\n The following value in the column\n <i>{{ error().key }}</i>\n is not in the correct format:\n </span>\n <br />\n <pre class=\"is-mt-2\"><code>{{stringify(error().value)}}</code></pre>\n </div>\n @switch (hasNumberWithCommasError()) {\n @case (true) {\n <p class=\"is-mt-2\">\n Please format your numbers to remove commas and use a decimal point to separate the whole part of the\n number from the fractional part of the number.\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>3,510.1</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>3510.1</code></pre>\n }\n @case (false) {\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n <p>The error could either be a value in the column, or an error with the column header.</p>\n <p>\n If you are trying to set no data, we accept either\n <code>-</code>\n or an empty cell.\n </p>\n }\n }\n </div>\n }\n @case (ErrorKeys.PropertyRequired) {\n <div>\n <div>\n <span class=\"pr-1\">The following field is required in the</span>\n @if (error().schema) {\n <a class=\"pr-1\" [href]=\"schemaUrl()\" target=\"_blank\">{{ error().schema }}</a>\n }\n <span>schema:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().property}}</code></pre>\n </div>\n <p>\n @switch (error().property) {\n @case ('id') {\n <span>\n You must assign a unique\n <code>id</code>\n for every record in your data.\n </span>\n }\n @case ('type') {\n <span>\n Every record in your data must contain a\n <code>type</code>\n .\n </span>\n }\n }\n </p>\n </div>\n }\n @case (ErrorKeys.PropertyInternal) {\n <div>\n <div>\n <span class=\"pr-1\">\n The following field is\n <code>internal</code>\n in the\n </span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schema }} schema</a>\n <span>:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().schemaKey || error().key}}</code></pre>\n </div>\n <p>\n You cannot upload\n <code>internal</code>\n fields to HESTIA.\n </p>\n </div>\n }\n @case (SchemaErrorKeys.SchemaNotFound) {\n <div>\n @if (error().key) {\n <div>\n <span>The following Node does not exist in the schema:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().key}}</code></pre>\n </div>\n } @else if (error().schema) {\n <div>\n <span>The following Node Type does not exist in the schema or can not be uploaded directly:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().schema}}</code></pre>\n </div>\n }\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul>\n @for (type of nodeTypes; track type) {\n <li>\n <i>{{ type }}</i>\n </li>\n }\n </ul>\n </div>\n </div>\n }\n @case (ErrorKeys.InvalidFirstColumn) {\n <div>\n <span>\n No data in the HESTIA format was detected on the first sheet. Either try selecting a different sheet in the\n upload screen, or check the sheet to ensure the headers follow the schema - see examples\n </span>\n <a class=\"pl-1\" href=\"/guide/guide-file-upload-examples\" target=\"_blank\">here</a>\n </div>\n }\n @case (ErrorKeys.InvalidExcelFile) {\n <div>\n This file has been uploaded with a\n <code>{{ fileExt() }}</code>\n extension, but does not appear to be a valid Excel file.\n </div>\n }\n @case (ErrorKeys.NoHeaders) {\n <div>\n <p>\n No headers matching the HESTIA schema were found on the first row. Please remove all empty rows at the\n begining of the file and try uploading again.\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n }\n @case (ErrorKeys.InvalidSheetName) {\n <div>\n <div>\n <span class=\"pr-1\">The Excel sheet</span>\n <code>{{ error().value }}</code>\n <span class=\"pl-1\">does not exist.</span>\n <span class=\"pl-1\">Your Excel file contains the following sheets:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (e of error().error.split(';'); track e) {\n <li>\n <code>{{ e }}</code>\n </li>\n }\n </ul>\n </div>\n <p>\n <span>Please re-upload selecting one of the sheets above.</span>\n </p>\n </div>\n }\n @case (ErrorKeys.DuplicatedHeaders) {\n <div>\n <span>Your upload contains duplicated column headers.</span>\n </div>\n }\n @case (ErrorKeys.DuplicatedIds) {\n <div>\n <div>\n <span class=\"is-pr-1\">You have multiple</span>\n <code>{{ error().schema | pluralize }}</code>\n <span class=\"is-px-1\">with the same</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-px-1\">but different data. The</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-pl-1\">is:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().value}}</code></pre>\n </div>\n <p class=\"is-mt-2 is-italic\">\n <span class=\"is-pr-1\">Please note that ussing different case does not make the</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-pl-1\">unique.</span>\n </p>\n </div>\n }\n @case (SchemaErrorKeys.DuplicatedIdFields) {\n <div>\n <span class=\"is-pr-1\">You have used both the</span>\n <code>&#64;id</code>\n <span class=\"is-px-1\">and</span>\n <code>id</code>\n <span class=\"is-px-1\">fields in the same data. Please use</span>\n <code>&#64;id</code>\n <span class=\"is-px-1\">when linking to existing nodes on the Platform, and</span>\n <code>id</code>\n <span class=\"is-px-1\">when linking to nodes you are uploading in this file using the same</span>\n <code>id</code>\n <span class=\"is-px-1\">field.</span>\n </div>\n }\n @case (ErrorKeys.NestedHeaders) {\n <div>\n <p>\n To link nodes together, you first need to define the node (e.g.,\n <code>source.id</code>\n ,\n <code>source.bibliography.title</code>\n ) and then create the link (e.g.,\n <code>cycle.defaultSource.id</code>\n ). We do not allow nesting (e.g.,\n <code>cycle.defaultSource.bibliography.title</code>\n ).\n </p>\n </div>\n }\n @case (ErrorKeys.NestedNodes) {\n <div>\n <p>To link nodes together, you need to upload each node separately, as we do not allow nesting:</p>\n <pre class=\"is-mt-2\"><code>{{ sampleLinkedNodes | json }}</code></pre>\n </div>\n }\n @case (ErrorKeys.ReferenceExistingHeaders) {\n <div>\n <p>\n You have used the internal\n <code>&#64;id</code>\n field to upload a new Node.\n </p>\n <p>\n The\n <code>&#64;id</code>\n field should only be used to reference existing Node or Terms. Example:\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.&#64;id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n </div>\n }\n @case (ErrorKeys.InvalidBlankNodeHeaders) {\n <div>\n <p>Evry blank node must be followed by a number, e.g.:</p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.name</code></pre>\n </div>\n }\n @case (ErrorKeys.MultipleTermHeaders) {\n <div>\n <p>\n You are using both\n <code>&#64;id</code>\n (or\n <code>id</code>\n ) and\n <code>name</code>\n fields to upload an existing Node (e.g., a Term).\n </p>\n <p>\n Using both fields can lead to inconsistencies, if you are not uploading the correct value in either one.\n Instead, you should only use one of them:\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.&#64;id,cycle.inputs.0.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.&#64;id</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.ObjectArrayInvalid) {\n <div>\n <p>The column header {{ error().key }} must use the array format. Examples:</p>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.0.term.name' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.0.value' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.1.term.name' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.1.value' }}</code></pre>\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n </div>\n }\n @case (ErrorKeys.MaxSize) {\n <div>\n <span>The maximum file size limit is {{ maxFileSizeMb }}Mb (current file size: {{ error().value }}Mb).</span>\n <span class=\"pl-1\">Please re-upload these data in multiple files.</span>\n </div>\n }\n @case (ErrorKeys.MaxRows) {\n <div>\n <span>\n Your file has {{ error().value | number }} rows. This might be an error caused by adding some data at the\n bottom of a spreadsheet by accident: delete any unused rows and resubmit the file.\n </span>\n </div>\n }\n @case (ErrorKeys.Mendeley) {\n <div>\n <p>An error occured while fetching the bibliographic information. Please try re-uploading the file.</p>\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n @case (ErrorKeys.Timeout) {\n <div>\n <p>Time exceeded for current step.</p>\n\n @if (debug()) {\n <span>You can try to \"Re-index\" or \"Re-upload\" if it still does not work.</span>\n }\n\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n @default {\n <div>\n <p>{{ message() }}</p>\n\n @if (debug()) {\n <pre><code>{{ error() | json }}</code></pre>\n }\n\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n }\n\n @if (hasGeoJSONError()) {\n <div>\n <p>If the GeoJSON is too large, please try to simplify it following these steps:</p>\n <ul class=\"is-my-1 content is-list-style-decimal pl-5\">\n <li>\n <span class=\"is-pr-1\">Go to</span>\n <a href=\"https://mapshaper.org/\" target=\"_blank\">https://mapshaper.org/</a>\n </li>\n <li>\n <span>\n Save the boundary in a valid\n <code>.geojson</code>\n file.\n </span>\n </li>\n <li>\n <span>Import it on mapshaper.</span>\n </li>\n <li>\n <span>Click \"Simplify\" in the top right corner in the menu bar.</span>\n </li>\n <li>\n <span>Adjust the percentage to a lower value, like 50% to start with.</span>\n </li>\n <li>\n <span>\n Export to\n <code>GeoJson</code>\n or\n <code>CSV</code>\n .\n </span>\n </li>\n <li>\n <span>Copy the resulting content into your upload file.</span>\n </li>\n </ul>\n <p>If you encounter the error again, try again using a lower percentage at step 5.</p>\n </div>\n }\n\n @if (columns().length || (error().index && !isSchemaError())) {\n <div>\n <b>Hint:</b>\n <span class=\"pl-1\">the error might be located</span>\n @if (error().index && !isSchemaError()) {\n <span class=\"pl-1\">on row {{ error().index }}</span>\n }\n @if (columns().length) {\n <span class=\"pl-1\">in {{ 'column' | pluralize: columns().length }}:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (column of columns(); track column) {\n <li>\n <b class=\"pr-2\">{{ column.column }}</b>\n <code>{{ column.name }}</code>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n @if (error().suggestions?.length) {\n <div>\n <b>Suggestions:</b>\n <span class=\"pl-1\">did you mean instead:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (suggestion of error().suggestions; track suggestion) {\n <li>\n <code>{{ suggestion }}</code>\n </li>\n }\n </ul>\n </div>\n }\n\n @if (showCsvPreview()) {\n <div>\n <b>\n Preview\n <sup>1</sup>\n :\n </b>\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-bordered is-fullwidth is-hoverable is-narrow mb-0\">\n <thead>\n @if (error().index) {\n <th></th>\n }\n @for (header of headers(); track header) {\n <th>{{ header }}</th>\n }\n </thead>\n <tbody>\n @for (row of rows(); track row) {\n <tr>\n @if (error().index) {\n <td class=\"has-text-danger\">\n <span class=\"is-nowrap\">Row {{ error().index }}</span>\n </td>\n }\n @for (col of row; track col; let colIndex = $index) {\n <td>\n <span\n [class.has-text-danger]=\"\n message() === ErrorKeys.DuplicatedIds && hasDuplicatedError(col, colIndex)\n \">\n {{ col | ellipsis: 50 }}\n </span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n <p class=\"is-size-7\">\n <i>1. The preview does not necessarily reflect the original Upload's order or content.</i>\n </p>\n </div>\n }\n\n @if (showJsonPreview()) {\n <div>\n <b>Preview:</b>\n <pre class=\"is-mt-2\"><code>{{stringify(error().node)}}</code></pre>\n </div>\n }\n </div>\n}\n\n<ng-template #defaultError>\n <p class=\"is-mt-2 has-text-black\">\n <span class=\"is-pr-1\">If you are still stuck, please see</span>\n <a [href]=\"baseUrl + '/guide/guide-file-upload-prepare-file'\" target=\"_blank\">the example uploads and videos</a>\n <span class=\"is-px-1\">\n or try using the Wizard to get the first few rows of data formatted correctly, or use the chat to ask for help.\n </span>\n </p>\n</ng-template>\n\n<ng-template #reportError>\n <p class=\"is-mt-2\">\n To report this error, please\n <a class=\"is-pl-1\" [href]=\"reportErrorUrl()\" target=\"_blank\">click here</a>\n .\n </p>\n</ng-template>\n\n<ng-template #schemaError>\n <p>\n <span class=\"pr-1\">You can see the accepted field type and some examples</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">here</a>\n <span>.</span>\n </p>\n</ng-template>\n", styles: [":host{display:block}\n"] }]
12273
+ args: [{ selector: 'he-files-upload-errors', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, HESvgIconComponent, DecimalPipe, JsonPipe, EllipsisPipe, PluralizePipe], template: "@if (error()) {\n <div class=\"is-flex is-flex-direction-column is-gap-8 has-text-danger\">\n @switch (message()) {\n @case (ErrorKeys.PrivacyNotAllowed) {\n <div>\n <span>\n Uploading data with\n <code class=\"is-px-1\">dataPrivate={{ error().value }}</code>\n is not allowed.\n </span>\n <span class=\"is-pl-1\">\n Please try uploading with\n <code class=\"is-px-1\">dataPrivate={{ !error().value }}</code>\n instead.\n </span>\n </div>\n }\n @case (ErrorKeys.InvalidJSON) {\n <div>\n <p>The uploaded content does not appear to contain valid JSON data:</p>\n <div class=\"is-my-2\">\n <pre><code>{{error().error}}</code></pre>\n </div>\n <p>\n Please validate your JSON content before uploading it using an\n <a href=\"https://jsoneditoronline.org\" target=\"_blank\">online tool</a>\n for example.\n </p>\n </div>\n }\n @case (ErrorKeys.NoData) {\n <div>\n <p>No Nodes could be found in your Upload. Please verify the column headers match the HESTIA schema.</p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n }\n @case (ErrorKeys.SetValueError) {\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span>\n We could not convert the data in your Upload. This can be due to setting 2 different formats in the same\n field.\n </span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"schemaUrl()\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n <div>\n <pre><code>{{error().key}}</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.PropertyNotFound) {\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span class=\"is-pl-2\">You have column headers that do not match the HESTIA schema.</span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"schemaUrl()\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n <div>\n <pre><code>{{error().key}}</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.PropertyInvalidFormat) {\n <div>\n <div>\n <span>\n The following value in the column\n <i>{{ error().key }}</i>\n is not in the correct format:\n </span>\n <br />\n <pre class=\"is-mt-2\"><code>{{stringify(error().value)}}</code></pre>\n </div>\n @switch (hasNumberWithCommasError()) {\n @case (true) {\n <p class=\"is-mt-2\">\n Please format your numbers to remove commas and use a decimal point to separate the whole part of the\n number from the fractional part of the number.\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>3,510.1</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>3510.1</code></pre>\n }\n @case (false) {\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n <p>The error could either be a value in the column, or an error with the column header.</p>\n <p>\n If you are trying to set no data, we accept either\n <code>-</code>\n or an empty cell.\n </p>\n }\n }\n </div>\n }\n @case (ErrorKeys.PropertyRequired) {\n <div>\n <div>\n <span class=\"pr-1\">The following field is required in the</span>\n @if (error().schema) {\n <a class=\"pr-1\" [href]=\"schemaUrl()\" target=\"_blank\">{{ error().schema }}</a>\n }\n <span>schema:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().property}}</code></pre>\n </div>\n <p>\n @switch (error().property) {\n @case ('id') {\n <span>\n You must assign a unique\n <code>id</code>\n for every record in your data.\n </span>\n }\n @case ('type') {\n <span>\n Every record in your data must contain a\n <code>type</code>\n .\n </span>\n }\n }\n </p>\n </div>\n }\n @case (ErrorKeys.PropertyInternal) {\n <div>\n <div>\n <span class=\"pr-1\">\n The following field is\n <code>internal</code>\n in the\n </span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schema }} schema</a>\n <span>:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().schemaKey || error().key}}</code></pre>\n </div>\n <p>\n You cannot upload\n <code>internal</code>\n fields to HESTIA.\n </p>\n </div>\n }\n @case (SchemaErrorKeys.SchemaNotFound) {\n <div>\n @if (error().key) {\n <div>\n <span>The following Node does not exist in the schema:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().key}}</code></pre>\n </div>\n } @else if (error().schema) {\n <div>\n <span>The following Node Type does not exist in the schema or can not be uploaded directly:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().schema}}</code></pre>\n </div>\n }\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul>\n @for (type of nodeTypes; track type) {\n <li>\n <i>{{ type }}</i>\n </li>\n }\n </ul>\n </div>\n </div>\n }\n @case (ErrorKeys.InvalidFirstColumn) {\n <div>\n <span>\n No data in the HESTIA format was detected on the first sheet. Either try selecting a different sheet in the\n upload screen, or check the sheet to ensure the headers follow the schema - see examples\n </span>\n <a class=\"pl-1\" href=\"/guide/guide-file-upload-examples\" target=\"_blank\">here</a>\n </div>\n }\n @case (ErrorKeys.InvalidExcelFile) {\n <div>\n This file has been uploaded with a\n <code>{{ fileExt() }}</code>\n extension, but does not appear to be a valid Excel file.\n </div>\n }\n @case (ErrorKeys.NoHeaders) {\n <div>\n <p>\n No headers matching the HESTIA schema were found on the first row. Please remove all empty rows at the\n begining of the file and try uploading again.\n </p>\n <ng-container *ngTemplateOutlet=\"defaultError\" />\n </div>\n }\n @case (ErrorKeys.InvalidSheetName) {\n <div>\n <div>\n <span class=\"pr-1\">The Excel sheet</span>\n <code>{{ error().value }}</code>\n <span class=\"pl-1\">does not exist.</span>\n <span class=\"pl-1\">Your Excel file contains the following sheets:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (e of error().error.split(';'); track e) {\n <li>\n <code>{{ e }}</code>\n </li>\n }\n </ul>\n </div>\n <p>\n <span>Please re-upload selecting one of the sheets above.</span>\n </p>\n </div>\n }\n @case (ErrorKeys.DuplicatedHeaders) {\n <div>\n <span>Your upload contains duplicated column headers.</span>\n </div>\n }\n @case (ErrorKeys.DuplicatedIds) {\n <div>\n <div>\n <span class=\"is-pr-1\">You have multiple</span>\n <code>{{ error().schema | pluralize }}</code>\n <span class=\"is-px-1\">with the same</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-px-1\">but different data. The</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-pl-1\">is:</span>\n <br />\n <pre class=\"is-mt-2\"><code>{{error().value}}</code></pre>\n </div>\n <p class=\"is-mt-2 is-italic\">\n <span class=\"is-pr-1\">Please note that ussing different case does not make the</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">{{ error().schemaKey }}</a>\n <span class=\"is-pl-1\">unique.</span>\n </p>\n </div>\n }\n @case (SchemaErrorKeys.DuplicatedIdFields) {\n <div>\n <span class=\"is-pr-1\">You have used both the</span>\n <code>&#64;id</code>\n <span class=\"is-px-1\">and</span>\n <code>id</code>\n <span class=\"is-px-1\">fields in the same data. Please use</span>\n <code>&#64;id</code>\n <span class=\"is-px-1\">when linking to existing nodes on the Platform, and</span>\n <code>id</code>\n <span class=\"is-px-1\">when linking to nodes you are uploading in this file using the same</span>\n <code>id</code>\n <span class=\"is-px-1\">field.</span>\n </div>\n }\n @case (ErrorKeys.NestedHeaders) {\n <div>\n <p>\n To link nodes together, you first need to define the node (e.g.,\n <code>source.id</code>\n ,\n <code>source.bibliography.title</code>\n ) and then create the link (e.g.,\n <code>cycle.defaultSource.id</code>\n ). We do not allow nesting (e.g.,\n <code>cycle.defaultSource.bibliography.title</code>\n ).\n </p>\n </div>\n }\n @case (ErrorKeys.NestedNodes) {\n <div>\n <p>To link nodes together, you need to upload each node separately, as we do not allow nesting:</p>\n <pre class=\"is-mt-2\"><code>{{ sampleLinkedNodes | json }}</code></pre>\n </div>\n }\n @case (ErrorKeys.ReferenceExistingHeaders) {\n <div>\n <p>\n You have used the internal\n <code>&#64;id</code>\n field to upload a new Node.\n </p>\n <p>\n The\n <code>&#64;id</code>\n field should only be used to reference existing Node or Terms. Example:\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.&#64;id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n </div>\n }\n @case (ErrorKeys.InvalidBlankNodeHeaders) {\n <div>\n <p>Evry blank node must be followed by a number, e.g.:</p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.name</code></pre>\n </div>\n }\n @case (ErrorKeys.MultipleNodeTypeCase) {\n <div>\n <p>You are using a combination of mixed cases in your headers:</p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>impactAssessment.id,impactAssessment.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>impactAssessment.id,impactassessment.name</code></pre>\n\n <p>\n Please make sure to always use either\n <code>impactAssessment</code>\n or\n <code>impactassessment</code>\n , but not both.\n </p>\n </div>\n }\n @case (ErrorKeys.MultipleTermHeaders) {\n <div>\n <p>\n You are using both\n <code>&#64;id</code>\n (or\n <code>id</code>\n ) and\n <code>name</code>\n fields to upload an existing Node (e.g., a Term).\n </p>\n <p>\n Using both fields can lead to inconsistencies, if you are not uploading the correct value in either one.\n Instead, you should only use one of them:\n </p>\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.&#64;id,cycle.inputs.0.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.inputs.0.term.&#64;id</code></pre>\n </div>\n }\n @case (SchemaErrorKeys.ObjectArrayInvalid) {\n <div>\n <p>The column header {{ error().key }} must use the array format. Examples:</p>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.0.term.name' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.0.value' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.1.term.name' }}</code></pre>\n <pre class=\"is-mt-2\"><code>{{ error().key + '.1.value' }}</code></pre>\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n </div>\n }\n @case (ErrorKeys.MaxSize) {\n <div>\n <span>The maximum file size limit is {{ maxFileSizeMb }}Mb (current file size: {{ error().value }}Mb).</span>\n <span class=\"pl-1\">Please re-upload these data in multiple files.</span>\n </div>\n }\n @case (ErrorKeys.MaxRows) {\n <div>\n <span>\n Your file has {{ error().value | number }} rows. This might be an error caused by adding some data at the\n bottom of a spreadsheet by accident: delete any unused rows and resubmit the file.\n </span>\n </div>\n }\n @case (ErrorKeys.Mendeley) {\n <div>\n <p>An error occured while fetching the bibliographic information. Please try re-uploading the file.</p>\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n @case (ErrorKeys.Timeout) {\n <div>\n <p>Time exceeded for current step.</p>\n\n @if (debug()) {\n <span>You can try to \"Re-index\" or \"Re-upload\" if it still does not work.</span>\n }\n\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n @default {\n <div>\n <p>{{ message() }}</p>\n\n @if (debug()) {\n <pre><code>{{ error() | json }}</code></pre>\n }\n\n <ng-container *ngTemplateOutlet=\"reportError\" />\n </div>\n }\n }\n\n @if (hasGeoJSONError()) {\n <div>\n <p>If the GeoJSON is too large, please try to simplify it following these steps:</p>\n <ul class=\"is-my-1 content is-list-style-decimal pl-5\">\n <li>\n <span class=\"is-pr-1\">Go to</span>\n <a href=\"https://mapshaper.org/\" target=\"_blank\">https://mapshaper.org/</a>\n </li>\n <li>\n <span>\n Save the boundary in a valid\n <code>.geojson</code>\n file.\n </span>\n </li>\n <li>\n <span>Import it on mapshaper.</span>\n </li>\n <li>\n <span>Click \"Simplify\" in the top right corner in the menu bar.</span>\n </li>\n <li>\n <span>Adjust the percentage to a lower value, like 50% to start with.</span>\n </li>\n <li>\n <span>\n Export to\n <code>GeoJson</code>\n or\n <code>CSV</code>\n .\n </span>\n </li>\n <li>\n <span>Copy the resulting content into your upload file.</span>\n </li>\n </ul>\n <p>If you encounter the error again, try again using a lower percentage at step 5.</p>\n </div>\n }\n\n @if (columns().length || (error().index && !isSchemaError())) {\n <div>\n <b>Hint:</b>\n <span class=\"pl-1\">the error might be located</span>\n @if (error().index && !isSchemaError()) {\n <span class=\"pl-1\">on row {{ error().index }}</span>\n }\n @if (columns().length) {\n <span class=\"pl-1\">in {{ 'column' | pluralize: columns().length }}:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (column of columns(); track column) {\n <li>\n <b class=\"pr-2\">{{ column.column }}</b>\n <code>{{ column.name }}</code>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n @if (error().suggestions?.length) {\n <div>\n <b>Suggestions:</b>\n <span class=\"pl-1\">did you mean instead:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n @for (suggestion of error().suggestions; track suggestion) {\n <li>\n <code>{{ suggestion }}</code>\n </li>\n }\n </ul>\n </div>\n }\n\n @if (showCsvPreview()) {\n <div>\n <b>\n Preview\n <sup>1</sup>\n :\n </b>\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-bordered is-fullwidth is-hoverable is-narrow mb-0\">\n <thead>\n @if (error().index) {\n <th></th>\n }\n @for (header of headers(); track header) {\n <th>{{ header }}</th>\n }\n </thead>\n <tbody>\n @for (row of rows(); track row) {\n <tr>\n @if (error().index) {\n <td class=\"has-text-danger\">\n <span class=\"is-nowrap\">Row {{ error().index }}</span>\n </td>\n }\n @for (col of row; track col; let colIndex = $index) {\n <td>\n <span\n [class.has-text-danger]=\"\n message() === ErrorKeys.DuplicatedIds && hasDuplicatedError(col, colIndex)\n \">\n {{ col | ellipsis: 50 }}\n </span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n <p class=\"is-size-7\">\n <i>1. The preview does not necessarily reflect the original Upload's order or content.</i>\n </p>\n </div>\n }\n\n @if (showJsonPreview()) {\n <div>\n <b>Preview:</b>\n <pre class=\"is-mt-2\"><code>{{stringify(error().node)}}</code></pre>\n </div>\n }\n </div>\n}\n\n<ng-template #defaultError>\n <p class=\"is-mt-2 has-text-black\">\n <span class=\"is-pr-1\">If you are still stuck, please see</span>\n <a [href]=\"baseUrl + '/guide/guide-file-upload-prepare-file'\" target=\"_blank\">the example uploads and videos</a>\n <span class=\"is-px-1\">\n or try using the Wizard to get the first few rows of data formatted correctly, or use the chat to ask for help.\n </span>\n </p>\n</ng-template>\n\n<ng-template #reportError>\n <p class=\"is-mt-2\">\n To report this error, please\n <a class=\"is-pl-1\" [href]=\"reportErrorUrl()\" target=\"_blank\">click here</a>\n .\n </p>\n</ng-template>\n\n<ng-template #schemaError>\n <p>\n <span class=\"pr-1\">You can see the accepted field type and some examples</span>\n <a [href]=\"schemaKeyUrl()\" target=\"_blank\">here</a>\n <span>.</span>\n </p>\n</ng-template>\n", styles: [":host{display:block}\n"] }]
12263
12274
  }], ctorParameters: () => [], propDecorators: { error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: true }] }], file: [{ type: i0.Input, args: [{ isSignal: true, alias: "file", required: false }] }], debug: [{ type: i0.Input, args: [{ isSignal: true, alias: "debug", required: false }] }] } });
12264
12275
 
12265
12276
  const nodeTerm = (node, key) => {
@@ -13235,7 +13246,7 @@ const parseLogValues = (impactAssessment, values) => {
13235
13246
  const inputs = Object.values(inputsObj);
13236
13247
  return { ...log, weightedValue: weightedTotal, value: total, inputs };
13237
13248
  };
13238
- const parseNodeLogs$ = (impactAssessment, indicators, lines) => from(lines).pipe(filter(({ data }) => data.logger === 'hestia_earth.models' && data.level === Level.debug), filter(({ data: { message } }) => !!message), map(({ data: { message } }) => parseMessage$1(message)), filter(message => 'node' in message), map(data => parseLog$1(data)), filter(log => filterLog(indicators, log)), groupBy(log => [log.indicator, log.contributor, log.modelId].join('/')), mergeMap(group => group.pipe(toArray())), map(data => parseLogValues(impactAssessment, data)), toArray());
13249
+ const parseNodeLogs$ = (impactAssessment, indicators, lines) => from(lines).pipe(filter(({ data }) => data.logger === 'hestia_earth.models' && data.level === Level.debug), filter(({ data: { message } }) => !!message), map(({ data: { message } }) => parseMessage(message)), filter(message => 'node' in message), map(data => parseLog$1(data)), filter(log => filterLog(indicators, log)), groupBy(log => [log.indicator, log.contributor, log.modelId].join('/')), mergeMap(group => group.pipe(toArray())), map(data => parseLogValues(impactAssessment, data)), toArray());
13239
13250
  class ImpactAssessmentsGraphComponent {
13240
13251
  constructor() {
13241
13252
  this.searchService = inject(HeSearchService);
@@ -13394,7 +13405,7 @@ class ImpactAssessmentsIndicatorBreakdownChartComponent {
13394
13405
  impacts: this.impacts()
13395
13406
  }),
13396
13407
  stream: ({ params: { impactAssessment, impacts } }) => impactAssessment
13397
- ? this.nodeService.getLog$({ ...impactAssessment, dataState: DataState.recalculated }).pipe(map(value => (value ? parseLines(value) : [])), mergeAll(), filter(({ data }) => data.logger === 'hestia_earth.models' && data.level === Level.debug), filter(({ data: { message } }) => !!message), map(({ data: { message } }) => parseMessage$1(message)), filter(message => 'node' in message), map(parseLog), filter(log => !!log.impactTermId && !!log.blankNodeTermId && !isNaN(log.value)), groupBy(log => [log.impactTermId, log.blankNodeTermId, log.modelId].join('/')), mergeMap(group => group.pipe(toArray())), map((values) => {
13408
+ ? this.nodeService.getLog$({ ...impactAssessment, dataState: DataState.recalculated }).pipe(map(value => (value ? parseLines(value) : [])), mergeAll(), filter(({ data }) => data.logger === 'hestia_earth.models' && data.level === Level.debug), filter(({ data: { message } }) => !!message), map(({ data: { message } }) => parseMessage(message)), filter(message => 'node' in message), map(parseLog), filter(log => !!log.impactTermId && !!log.blankNodeTermId && !isNaN(log.value)), groupBy(log => [log.impactTermId, log.blankNodeTermId, log.modelId].join('/')), mergeMap(group => group.pipe(toArray())), map((values) => {
13398
13409
  const log = values[0];
13399
13410
  const total = logsTotalValue(values, true);
13400
13411
  const blankNodes = [
@@ -14392,5 +14403,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
14392
14403
  * Generated bundle index. Do not edit.
14393
14404
  */
14394
14405
 
14395
- export { ARRAY_DELIMITER, ApplyPurePipe, BarChartComponent, BibliographiesSearchConfirmComponent, BlankNodeStateComponent, BlankNodeStateNoticeComponent, BlankNodeValueDeltaComponent, CapitalizePipe, ChartComponent, ChartConfigurationDirective, ChartExportButtonComponent, ChartTooltipComponent, ClickOutsideDirective, ClipboardComponent, CollapsibleBoxComponent, CollapsibleBoxStyle, ColorPalette, CompoundDirective, CompoundPipe, ControlValueAccessor, CycleNodesKeyGroup, CyclesCompletenessComponent, CyclesEmissionsChartComponent, CyclesFunctionalUnitMeasureComponent, CyclesMetadataComponent, CyclesNodesComponent, CyclesNodesTimelineComponent, CyclesResultComponent, DataTableComponent, DefaultPipe, DeltaColour, DistributionChartComponent, DrawerContainerComponent, DurationPipe, EllipsisPipe, EngineModelsLinkComponent, EngineModelsLookupInfoComponent, EngineModelsStageComponent, EngineModelsStageDeepComponent, EngineModelsStageDeepService, EngineModelsVersionLinkComponent, EngineOrchestratorEditComponent, EngineRequirementsFormComponent, FileSizePipe, FileUploadErrorKeys, FilesErrorSummaryComponent, FilesFormComponent, FilesFormEditableComponent, FilesUploadErrorsComponent, FilterAccordionComponent, GUIDE_ENABLED, GetPipe, GlossaryMigrationFormat, GuideOverlayComponent, HESvgIconComponent, HE_API_BASE_URL, HE_CALCULATIONS_BASE_URL, HE_MAP_LOADED, HeAuthService, HeCommonService, HeEngineService, HeGlossaryService, HeMendeleyService, HeNodeCsvService, HeNodeService, HeNodeStoreService, HeSchemaService, HeSearchService, HeToastService, HorizontalBarChartComponent, HorizontalButtonsGroupComponent, ImpactAssessmentsGraphComponent, ImpactAssessmentsIndicatorBreakdownChartComponent, ImpactAssessmentsIndicatorsChartComponent, ImpactAssessmentsProductsComponent, IsArrayPipe, IsObjectPipe, IssueConfirmComponent, KeyToLabelPipe, Level, LineChartComponent, LinkKeyValueComponent, LogStatus, LongPressDirective, MAX_RESULTS, MapsDrawingComponent, MapsDrawingConfirmComponent, MendeleySearchResult, MobileShellComponent, NavigationMenuComponent, NoExtPipe, NodeAggregatedComponent, NodeAggregatedInfoComponent, NodeAggregatedQualityScoreComponent, NodeCsvExportConfirmComponent, NodeCsvPreviewComponent, NodeCsvSelectHeadersComponent, NodeIconComponent, NodeJsonldComponent, NodeJsonldSchemaComponent, NodeKeyState, NodeLinkComponent, NodeLogsFileComponent, NodeLogsModelsComponent, NodeLogsTimeComponent, NodeMissingLookupFactorsComponent, NodeQualityScore, NodeRecommendationsComponent, NodeSelectComponent, NodeValueDetailsComponent, PluralizePipe, PopoverComponent, PopoverConfirmComponent, PrecisionPipe, RelatedNodeResult, RemoveMarkdownPipe, RepeatPipe, Repository, ResizedDirective, ResizedEvent, ResponsiveService, SchemaInfoComponent, SchemaVersionLinkComponent, SearchExtendComponent, ShelfDialogComponent, ShellComponent, SitesManagementChartComponent, SitesMapsComponent, SitesNodesComponent, SkeletonTextComponent, SocialTagsComponent, SortByPipe, SortSelectComponent, TagsInputDirective, Template, TermsPropertyContentComponent, TermsSubClassOfContentComponent, TermsUnitsDescriptionComponent, ThousandSuffixesPipe, ThousandsPipe, TimesPipe, ToastComponent, UncapitalizePipe, addPolygonToFeature, afterBarDrawPlugin, allCountriesQuery, allGroups, allOptions, arrayValue, availableProperties, backgroundHoverPlugin, baseApiUrl, baseUrl, bottom, buildSummary, bytesSize, calculateCycleDuration, calculateCycleDurationEnabled, calculateCycleStartDate, calculateCycleStartDateEnabled, capitalize, changelogUrl, clustererImage, code, colorToRgba, compoundToHtml, computeKeys, computeTerms, contactUsEmail, contactUsLink, convertToSvg, coordinatesToPoint, copyObject, countGroupVisibleNodes, countriesQuery, createMarker, cropsQuery, d3ellipse, d3wrap, dataPathLabel, dataPathToKey, defaultFeature, defaultLabel, defaultSuggestionType, defaultSvgIconSize, defaultTicksFont, definitionToSchemaType, distinctUntilChangedDeep, downloadFile, downloadPng, downloadSvg, ellipsis, engineGitBaseUrl, engineGitUrl, errorHasError, errorHasWarning, errorText, evaluateSuccess, exportAsSVG, exportFormats, externalLink, externalNodeLink, fillColor, fillStyle, filterBlankNode$1 as filterBlankNode, filterError, filterParams, findConfigModels, findMatchingModel, findModels, findNodeModel, findOrchestratorModel, findProperty, findPropertyById, flatFilterData, flatFilterNode, formatCustomErrorMessage, formatDate, formatError, formatPropertyError, formatter, getColor, getDatesBetween, gitBranch, gitHome, gitlabRawUrl, glossaryBaseUrl, glossaryLink, groupChanged, groupLogsByModel, groupLogsByTerm, groupNodesByTerm, groupdLogsByKey, grouppedKeys, grouppedValueKeys, groupsLogsByFields, guideModelUrl, guideNamespace, guidePageId, handleAPIError, handleGuideEvent, hasError, hasValidationError, hasWarning, hexToRgba, iconSizes, icons, ignoreKeys$2 as ignoreKeys, initialFilterState, injectResizeEvent$, inputGroupsTermTypes, isAddPropertyEnabled, isChrome, isDateBetween, isEqual, isExternal, isKeyClosedVisible, isKeyHidden, isMaxStage, isMethodModelAllowed, isMigrationError, isMissingOneOfError, isMissingPropertyError, isNonNodeModelKey, isSchemaIri, isScrolledBelow, isState, isTermTypeAllowed, isValidKey, keyToDataPath, levels, listColor, listColorContinuous, listColorWithAlpha, loadMapApi, loadSvgSprite, locationQuery, logToCsv$1 as logToCsv, logValueArray, logsKey, lollipopChartPlugin, lookupUrl, mapFilterData, mapsUrl, markerIcon, markerPie, matchAggregatedQuery, matchAggregatedValidatedQuery, matchBoolPrefixQuery, matchCountry, matchExactQuery, matchGlobalRegion, matchId, matchNameNormalized, matchNestedKey, matchPhrasePrefixQuery, matchPhraseQuery, matchPrimaryProductQuery, matchQuery, matchRegex, matchRegion, matchTermType, matchType, maxAreaSize, measurementValue, mergeDataWithHeaders, methodTierOrder, migrationErrorMessage, migrationsUrl, missingNodeErrors, modelCount, modelKeyParams, modelParams, models, multiMatchQuery, nestedProperty, nestingEnabled, nestingTypeEnabled, nodeAvailableProperties, nodeById, nodeColours$1 as nodeColours, nodeDataState, nodeId, nodeIds, nodeLink, nodeLinkEnabled, nodeLinkTypeEnabled, nodeLogsUrl, nodeQualityScoreColor, nodeQualityScoreLevel, nodeQualityScoreMaxDefault, nodeQualityScoreOrder, nodeSecondaryColours, nodeToAggregationFilename, nodeType, nodeTypeDataState, nodeTypeIcon, nodeUrl, nodeUrlParams, nodeVersion, nodesByState, nodesByType, numberGte, optionsFromGroup, parentKey, parentProperty, parseColor, parseData, parseDataPath, parseLines, parseMessage$1 as parseMessage, parseNewValue, pluralize, pointToCoordinates, polygonBounds, polygonToCoordinates, polygonToMap, polygonsFromFeature, populateWithTrackIdsFilterData, postGuideEvent, primaryProduct, productsQuery, propertyError, propertyId, recursiveProperties, refToSchemaType, refreshPropertyKeys, regionsQuery, registerChart, repeat, reportIssueLink, reportIssueUrl, safeJSONParse, safeJSONStringify, schemaBaseUrl, schemaDataBaseUrl, schemaLink, schemaRequiredProperties, schemaTypeToDefaultValue, scrollToEl, scrollTop, searchFilterData, searchableTypes, siblingProperty, singleProperty, siteTooBig, siteTypeToColor, siteTypeToIcon, sortProperties, sortedDates, strokeColor, strokeStyle, suggestMatchQuery, suggestQuery, takeAfterViewInit, termLocation, termLocationName, termProperties, termTypeLabel, toSnakeCase, toThousands, typeToNewProperty, typeaheadFocus, uncapitalize, uniqueDatesBetween, updateProperties, valueLink, valueToString, valueTypeToDefault, valueValue, waitFor, wildcardQuery };
14406
+ export { ARRAY_DELIMITER, ApplyPurePipe, BarChartComponent, BibliographiesSearchConfirmComponent, BlankNodeStateComponent, BlankNodeStateNoticeComponent, BlankNodeValueDeltaComponent, CapitalizePipe, ChartComponent, ChartConfigurationDirective, ChartExportButtonComponent, ChartTooltipComponent, ClickOutsideDirective, ClipboardComponent, CollapsibleBoxComponent, CollapsibleBoxStyle, ColorPalette, CompoundDirective, CompoundPipe, ControlValueAccessor, CycleNodesKeyGroup, CyclesCompletenessComponent, CyclesEmissionsChartComponent, CyclesFunctionalUnitMeasureComponent, CyclesMetadataComponent, CyclesNodesComponent, CyclesNodesTimelineComponent, CyclesResultComponent, DataTableComponent, DefaultPipe, DeltaColour, DistributionChartComponent, DrawerContainerComponent, DurationPipe, EllipsisPipe, EngineModelsLinkComponent, EngineModelsLookupInfoComponent, EngineModelsStageComponent, EngineModelsStageDeepComponent, EngineModelsStageDeepService, EngineModelsVersionLinkComponent, EngineOrchestratorEditComponent, EngineRequirementsFormComponent, FileSizePipe, FileUploadErrorKeys, FilesErrorSummaryComponent, FilesFormComponent, FilesFormEditableComponent, FilesUploadErrorsComponent, FilterAccordionComponent, GUIDE_ENABLED, GetPipe, GlossaryMigrationFormat, GuideOverlayComponent, HESvgIconComponent, HE_API_BASE_URL, HE_CALCULATIONS_BASE_URL, HE_MAP_LOADED, HeAuthService, HeCommonService, HeEngineService, HeGlossaryService, HeMendeleyService, HeNodeCsvService, HeNodeService, HeNodeStoreService, HeSchemaService, HeSearchService, HeToastService, HorizontalBarChartComponent, HorizontalButtonsGroupComponent, ImpactAssessmentsGraphComponent, ImpactAssessmentsIndicatorBreakdownChartComponent, ImpactAssessmentsIndicatorsChartComponent, ImpactAssessmentsProductsComponent, IsArrayPipe, IsObjectPipe, IssueConfirmComponent, KeyToLabelPipe, Level, LineChartComponent, LinkKeyValueComponent, LogStatus, LongPressDirective, MAX_RESULTS, MapsDrawingComponent, MapsDrawingConfirmComponent, MendeleySearchResult, MobileShellComponent, NavigationMenuComponent, NoExtPipe, NodeAggregatedComponent, NodeAggregatedInfoComponent, NodeAggregatedQualityScoreComponent, NodeCsvExportConfirmComponent, NodeCsvPreviewComponent, NodeCsvSelectHeadersComponent, NodeIconComponent, NodeJsonldComponent, NodeJsonldSchemaComponent, NodeKeyState, NodeLinkComponent, NodeLogsFileComponent, NodeLogsModelsComponent, NodeLogsTimeComponent, NodeMissingLookupFactorsComponent, NodeQualityScore, NodeRecommendationsComponent, NodeSelectComponent, NodeValueDetailsComponent, PluralizePipe, PopoverComponent, PopoverConfirmComponent, PrecisionPipe, RelatedNodeResult, RemoveMarkdownPipe, RepeatPipe, Repository, ResizedDirective, ResizedEvent, ResponsiveService, SchemaInfoComponent, SchemaVersionLinkComponent, SearchExtendComponent, ShelfDialogComponent, ShellComponent, SitesManagementChartComponent, SitesMapsComponent, SitesNodesComponent, SkeletonTextComponent, SocialTagsComponent, SortByPipe, SortSelectComponent, TagsInputDirective, Template, TermsPropertyContentComponent, TermsSubClassOfContentComponent, TermsUnitsDescriptionComponent, ThousandSuffixesPipe, ThousandsPipe, TimesPipe, ToastComponent, UncapitalizePipe, addPolygonToFeature, afterBarDrawPlugin, allCountriesQuery, allGroups, allOptions, availableProperties, backgroundHoverPlugin, baseApiUrl, baseUrl, bottom, buildSummary, bytesSize, calculateCycleDuration, calculateCycleDurationEnabled, calculateCycleStartDate, calculateCycleStartDateEnabled, capitalize, changelogUrl, clustererImage, code, colorToRgba, compoundToHtml, computeKeys, computeTerms, contactUsEmail, contactUsLink, convertToSvg, coordinatesToPoint, copyObject, countGroupVisibleNodes, countriesQuery, createMarker, cropsQuery, d3ellipse, d3wrap, dataPathLabel, dataPathToKey, defaultFeature, defaultLabel, defaultSuggestionType, defaultSvgIconSize, defaultTicksFont, definitionToSchemaType, distinctUntilChangedDeep, downloadFile, downloadPng, downloadSvg, ellipsis, engineGitBaseUrl, engineGitUrl, errorHasError, errorHasWarning, errorText, evaluateSuccess, exportAsSVG, exportFormats, externalLink, externalNodeLink, fillColor, fillStyle, filterBlankNode$1 as filterBlankNode, filterError, filterParams, findConfigModels, findMatchingModel, findModels, findNodeModel, findOrchestratorModel, findProperty, findPropertyById, flatFilterData, flatFilterNode, formatCustomErrorMessage, formatDate, formatError, formatPropertyError, formatter, getColor, getDatesBetween, gitBranch, gitHome, gitlabRawUrl, glossaryBaseUrl, glossaryLink, groupChanged, groupLogsByModel, groupLogsByTerm, groupNodesByTerm, groupdLogsByKey, grouppedKeys, grouppedValueKeys, groupsLogsByFields, guideModelUrl, guideNamespace, guidePageId, handleAPIError, handleGuideEvent, hasError, hasValidationError, hasWarning, hexToRgba, iconSizes, icons, ignoreKeys$2 as ignoreKeys, initialFilterState, injectResizeEvent$, inputGroupsTermTypes, isAddPropertyEnabled, isChrome, isDateBetween, isEqual, isExternal, isKeyClosedVisible, isKeyHidden, isMaxStage, isMethodModelAllowed, isMigrationError, isMissingOneOfError, isMissingPropertyError, isNonNodeModelKey, isSchemaIri, isScrolledBelow, isState, isTermTypeAllowed, isValidKey, keyToDataPath, levels, listColor, listColorContinuous, listColorWithAlpha, loadMapApi, loadSvgSprite, locationQuery, logToCsv$1 as logToCsv, logValueArray, logsKey, lollipopChartPlugin, lookupUrl, mapFilterData, mapsUrl, markerIcon, markerPie, matchAggregatedQuery, matchAggregatedValidatedQuery, matchBoolPrefixQuery, matchCountry, matchExactQuery, matchGlobalRegion, matchId, matchNameNormalized, matchNestedKey, matchPhrasePrefixQuery, matchPhraseQuery, matchPrimaryProductQuery, matchQuery, matchRegex, matchRegion, matchTermType, matchType, maxAreaSize, measurementValue, mergeDataWithHeaders, methodTierOrder, migrationErrorMessage, migrationsUrl, missingNodeErrors, modelCount, modelKeyParams, modelParams, models, multiMatchQuery, nestedProperty, nestingEnabled, nestingTypeEnabled, nodeAvailableProperties, nodeById, nodeColours$1 as nodeColours, nodeDataState, nodeId, nodeIds, nodeLink, nodeLinkEnabled, nodeLinkTypeEnabled, nodeLogsUrl, nodeQualityScoreColor, nodeQualityScoreLevel, nodeQualityScoreMaxDefault, nodeQualityScoreOrder, nodeSecondaryColours, nodeToAggregationFilename, nodeType, nodeTypeDataState, nodeTypeIcon, nodeUrl, nodeUrlParams, nodeVersion, nodesByState, nodesByType, numberGte, optionsFromGroup, parentKey, parentProperty, parseColor, parseData, parseDataPath, parseLines, parseLogMessage, parseMessage, parseNewValue, pluralize, pointToCoordinates, polygonBounds, polygonToCoordinates, polygonToMap, polygonsFromFeature, populateWithTrackIdsFilterData, postGuideEvent, primaryProduct, productsQuery, propertyError, propertyId, recursiveProperties, refToSchemaType, refreshPropertyKeys, regionsQuery, registerChart, repeat, reportIssueLink, reportIssueUrl, safeJSONParse, safeJSONStringify, schemaBaseUrl, schemaDataBaseUrl, schemaLink, schemaRequiredProperties, schemaTypeToDefaultValue, scrollToEl, scrollTop, searchFilterData, searchableTypes, siblingProperty, singleProperty, siteTooBig, siteTypeToColor, siteTypeToIcon, sortProperties, sortedDates, strokeColor, strokeStyle, suggestMatchQuery, suggestQuery, takeAfterViewInit, termLocation, termLocationName, termProperties, termTypeLabel, toSnakeCase, toThousands, typeToNewProperty, typeaheadFocus, uncapitalize, uniqueDatesBetween, updateProperties, valueLink, valueToString, valueTypeToDefault, valueValue, waitFor, wildcardQuery };
14396
14407
  //# sourceMappingURL=hestia-earth-ui-components.mjs.map