@hestia-earth/ui-components 0.43.25 → 0.43.27

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.
@@ -769,10 +769,14 @@ const polygonBounds = (polygon) => {
769
769
  // resource avoids both. Keep these in sync with the getters in `@hestia-earth/glossary/index.mjs`.
770
770
  const getDefaultModelId = (id) => defaultModelId[id];
771
771
  const getModelGroup = (id, modelId) => (modelGroups[id] || {})[modelId];
772
- const isInSystemBoundary = (id) => {
772
+ /**
773
+ * Whether the term is in the default HESTIA system boundary, or `fallback` when the lookup does not list it.
774
+ */
775
+ const isInSystemBoundaryOr = (id, fallback) => {
773
776
  const value = inHestiaDefaultSystemBoundary[id];
774
- return !value || value === 'true';
777
+ return value ? `${value}` === 'true' : fallback;
775
778
  };
779
+ const isInSystemBoundary = (id) => isInSystemBoundaryOr(id, true);
776
780
  // the resource is the list of ids the lookup is true for; built into a Set once, as the glossary does
777
781
  const plantations = new Set(plantationIds);
778
782
  /**
@@ -5435,7 +5439,7 @@ class HeSearchService {
5435
5439
  })
5436
5440
  .pipe(catchError(() => of(emptySearchResult())), map(({ results }) => results.map(({ _score, ...res }) => res)));
5437
5441
  }
5438
- suggestSource$(term, limit = 5, fields = ['bibliography.title'], includes = ['bibliography.title']) {
5442
+ suggestSource$(term, limit = 5, fields = ['bibliography.title', 'nameSearch'], includes = ['bibliography.title']) {
5439
5443
  return this.suggest$(term, NodeType.Source, [], suggestSourceQuery(term, fields), limit, includes).pipe(map((sources) => sources.map(source => ({
5440
5444
  ...source,
5441
5445
  bibliography: {
@@ -7621,9 +7625,22 @@ const nodeUrlParams = (dataState, dataVersion) => [
7621
7625
  const nodeLink = (node, dataState, dataVersion) => [[node?.['@type']?.toLowerCase(), node?.['@id']].filter(Boolean).join('/'), nodeUrlParams(dataState, dataVersion)]
7622
7626
  .filter(Boolean)
7623
7627
  .join('?');
7624
- const nodeLinkTypeEnabled = (type) => [NodeType.Cycle, NodeType.ImpactAssessment, NodeType.Site, NodeType.Source, NodeType.Term].includes(type);
7625
- const nodeLinkEnabled = (node) => [
7626
- nodeLinkTypeEnabled(node?.['@type'] || node?.type),
7628
+ const defaultNodeLinkTypes = [
7629
+ NodeType.Cycle,
7630
+ NodeType.ImpactAssessment,
7631
+ NodeType.Site,
7632
+ NodeType.Source,
7633
+ NodeType.Term
7634
+ ];
7635
+ /**
7636
+ * The node types `he-node-link` renders as a link. Provide a narrower list where some node pages do not exist.
7637
+ */
7638
+ const HE_NODE_LINK_TYPES = new InjectionToken('HE_NODE_LINK_TYPES', {
7639
+ factory: () => defaultNodeLinkTypes
7640
+ });
7641
+ const nodeLinkTypeEnabled = (type, types = defaultNodeLinkTypes) => types.includes(type);
7642
+ const nodeLinkEnabled = (node, types = defaultNodeLinkTypes) => [
7643
+ nodeLinkTypeEnabled(node?.['@type'] || node?.type, types),
7627
7644
  [
7628
7645
  !!node?.['@id'],
7629
7646
  // handle links on Community Edition
@@ -7691,6 +7708,7 @@ const nodeTypeIconSchema = {
7691
7708
  class NodeLinkComponent {
7692
7709
  constructor() {
7693
7710
  this.route = inject(ActivatedRoute);
7711
+ this.linkTypes = inject(HE_NODE_LINK_TYPES);
7694
7712
  this.dataVersion = toSignal(this.route.queryParams.pipe(map(({ dataVersion }) => dataVersion)));
7695
7713
  this.node = input.required(...(ngDevMode ? [{ debugName: "node" }] : []));
7696
7714
  this.dataState = input(...(ngDevMode ? [undefined, { debugName: "dataState" }] : []));
@@ -7703,7 +7721,7 @@ class NodeLinkComponent {
7703
7721
  baseUrl(),
7704
7722
  nodeLink(this.node(), this.dataState() || nodeDataState(this.node()), nodeDataVersion(this.node()) || this.dataVersion())
7705
7723
  ].join('/'), ...(ngDevMode ? [{ debugName: "url" }] : []));
7706
- this.showLink = computed(() => nodeLinkEnabled(this.node()), ...(ngDevMode ? [{ debugName: "showLink" }] : []));
7724
+ this.showLink = computed(() => nodeLinkEnabled(this.node(), this.linkTypes), ...(ngDevMode ? [{ debugName: "showLink" }] : []));
7707
7725
  this.target = computed(() => (this.showExternalLink() || isExternal() ? '_blank' : '_self'), ...(ngDevMode ? [{ debugName: "target" }] : []));
7708
7726
  }
7709
7727
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NodeLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -8419,7 +8437,7 @@ class BlankNodeIdentityComponent {
8419
8437
  * Shown when nothing distinguishes the blank node from its siblings (e.g. "entry 2").
8420
8438
  */
8421
8439
  this.fallback = input('', ...(ngDevMode ? [{ debugName: "fallback" }] : []));
8422
- this.schemaBaseUrl = schemaBaseUrl;
8440
+ this.schemaBaseUrl = schemaBaseUrl();
8423
8441
  }
8424
8442
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: BlankNodeIdentityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8425
8443
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: BlankNodeIdentityComponent, isStandalone: true, selector: "he-blank-node-identity", inputs: { segments: { classPropertyName: "segments", publicName: "segments", isSignal: true, isRequired: false, transformFunction: null }, scalars: { classPropertyName: "scalars", publicName: "scalars", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, fallback: { classPropertyName: "fallback", publicName: "fallback", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "is-flex is-align-items-center is-flex-wrap-wrap is-gap-4" }, ngImport: i0, template: "@if (segments().length || scalars().length) {\n @for (segment of segments(); track segment.field; let s = $index) {\n @if (s > 0) {\n <span>\u00B7</span>\n }\n <span>{{ segment.field | keyToLabel }}:</span>\n @for (term of segment.terms; track term['@id']) {\n <he-node-link class=\"is-inline-block\" [node]=\"term\">\n <span class=\"break-word\" [innerHtml]=\"term.name | compound: term.termType\"></span>\n </he-node-link>\n }\n }\n @for (scalar of scalars(); track scalar.key; let i = $index) {\n <span class=\"break-word\">\n @if (i > 0 || segments().length) {\n \u00B7\n }\n @if (scalar.field && type()) {\n <a [href]=\"schemaBaseUrl + '/' + type() + '#' + scalar.field\" target=\"_blank\">\n {{ scalar.key }}\n </a>\n @if (scalar.value) {\n : {{ scalar.value }}\n }\n } @else {\n {{ scalar.key }}\n @if (scalar.value) {\n : {{ scalar.value }}\n }\n }\n </span>\n }\n} @else if (fallback()) {\n <span class=\"has-text-grey\">{{ fallback() }}</span>\n}\n", dependencies: [{ kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "dataState", "showExternalLink", "linkClass"] }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: KeyToLabelPipe, name: "keyToLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -9730,11 +9748,10 @@ class NodeJLogModelsComponent {
9730
9748
  const selected = this.term();
9731
9749
  if (selected)
9732
9750
  return group.term?.name?.toLowerCase().includes(selected.name.toLowerCase());
9733
- // hide non-system-boundary terms with no recalculation when "only required" is on
9751
+ // when "only required" is on, terms the system boundary lookup does not list show if recalculated or failed
9734
9752
  return (!this.onlyRequired() ||
9735
9753
  !this.filteredType() ||
9736
- isInSystemBoundary(group.termId) ||
9737
- group.rows.some(row => row.isRecalculated || row.isFailed));
9754
+ isInSystemBoundaryOr(group.termId, group.rows.some(row => row.isRecalculated || row.isFailed)));
9738
9755
  }), ...(ngDevMode ? [{ debugName: "groups" }] : []));
9739
9756
  this.hasLogs = computed(() => !isEmpty(this.jlog()), ...(ngDevMode ? [{ debugName: "hasLogs" }] : []));
9740
9757
  this.methodModelsCount = computed(() => Math.max(1, jLogModelCount(this.allGroups())), ...(ngDevMode ? [{ debugName: "methodModelsCount" }] : []));
@@ -9840,11 +9857,7 @@ const methodIdLabel = (methodId, _model) => (methodId
9840
9857
  }[methodId]
9841
9858
  : '') || (methodId.includes('/') ? methodId.split('/')[0] : keyToLabel(methodId));
9842
9859
  const getModelsAt = (log, index) => ('modelsInSubValues' in log ? !log.modelsInSubValues || !log.isOpen : true) && log.configModels?.[index];
9843
- const isSystemBoundary = (termId) => ({ isRecalculated, isRequired }) => {
9844
- // only exists for some terms
9845
- const inSystemBoundary = isInSystemBoundary(termId);
9846
- return inSystemBoundary || [isRecalculated, isRequired].some(Boolean);
9847
- };
9860
+ const isSystemBoundary = (termId) => ({ isRecalculated, isRequired }) => isInSystemBoundaryOr(termId, [isRecalculated, isRequired].some(Boolean));
9848
9861
  const isGenericTerm = (termId) => [termId.startsWith('excreta')].every(Boolean);
9849
9862
  const extraTermIdsFromConfig = (config, key, logs) => unique([
9850
9863
  ...(config?.models || [])
@@ -13089,7 +13102,10 @@ const isAddPropertyEnabled = (node, schemaType, schema, fullKey = '') => !!schem
13089
13102
  !!Object.keys(nodeAvailableProperties(node, { fullKey, schema })).length &&
13090
13103
  (!fullKey || nestingTypeEnabled(schemaType));
13091
13104
  const editableKey = (key) => !['type', '@type', 'termType'].includes(key);
13092
- const isCollapsible = (value) => Array.isArray(value) && !isExpandable(value) && value.length > 100;
13105
+ const COLLAPSE_LENGTH = 100;
13106
+ // a long list of values, or a long text once displayed: a GeoJSON boundary runs to thousands of characters
13107
+ const isCollapsible = (value, displayed) => (Array.isArray(value) && !isExpandable(value) && value.length > COLLAPSE_LENGTH) ||
13108
+ (typeof displayed === 'string' && displayed.length > COLLAPSE_LENGTH);
13093
13109
  const propertyId = () => uuid();
13094
13110
  const isGeojson = (schema) => schema.geojson;
13095
13111
  const propertyUrl = (node, key) => ['@id', 'id', 'name'].includes(key) && nodeLinkTypeEnabled(node['@type'] || node.type)
@@ -13311,7 +13327,6 @@ const requiredPropertyErrors = (schemas, node, errors, parent = '') => {
13311
13327
  const propertyFromNode = (schemas, errors, nodeSchema, deepEditable, parent = '', node, parentNode) => (key) => {
13312
13328
  const value = node[key];
13313
13329
  const expandable = isExpandable(value);
13314
- const collapsible = isCollapsible(value);
13315
13330
  const isArray = Array.isArray(value);
13316
13331
  const nonExpandableArray = isArray && !expandable;
13317
13332
  const fullKey = Array.isArray(node) ? `${parent}[${key}]` : [parent, key].filter(Boolean).join('.');
@@ -13346,13 +13361,14 @@ const propertyFromNode = (schemas, errors, nodeSchema, deepEditable, parent = ''
13346
13361
  : // handle IRI
13347
13362
  (!schemaType && key === '@id') || editableKey(key);
13348
13363
  const valueType = propertyValueType(schema, value);
13364
+ const displayed = propertyValue(schema, value);
13349
13365
  return {
13350
13366
  id: propertyId(),
13351
13367
  schemaType: isIri ? null : schemaType,
13352
13368
  schema,
13353
13369
  key,
13354
13370
  fullKey,
13355
- value: propertyValue(schema, value),
13371
+ value: displayed,
13356
13372
  editable: inError || editable,
13357
13373
  suggestions: enableSuggestions(nodeSchema, node.type, fullKey, schema),
13358
13374
  addPropertyEnabled: isAddPropertyEnabled(node, schemaType, schema, fullKey),
@@ -13367,8 +13383,8 @@ const propertyFromNode = (schemas, errors, nodeSchema, deepEditable, parent = ''
13367
13383
  isRequired: isKeyRequired(key, schemas[nodeType]),
13368
13384
  isArray,
13369
13385
  isExpandable: expandable,
13370
- isCollapsible: collapsible,
13371
- showMaxLength: 100,
13386
+ isCollapsible: !expandable && isCollapsible(value, displayed),
13387
+ showMaxLength: COLLAPSE_LENGTH,
13372
13388
  isOpen: isOpenDefault(schemaType),
13373
13389
  properties,
13374
13390
  placeholder: propertyPlaceholder(schema, valueType, fullKey, parentSchema),
@@ -14569,11 +14585,11 @@ class FilesUploadErrorsComponent {
14569
14585
  return value !== firstVal;
14570
14586
  }
14571
14587
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilesUploadErrorsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14572
- 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 <p>\n Uploading data with\n <code class=\"is-px-1\">dataPrivate={{ error().value }}</code>\n is not allowed.\n </p>\n <p>\n Please try uploading with\n <code class=\"is-px-1\">dataPrivate={{ !error().value }}</code>\n instead.\n </p>\n }\n @case (ErrorKeys.InvalidJSON) {\n <p>The uploaded content does not appear to contain valid JSON data:</p>\n <pre><code>{{error().error}}</code></pre>\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 }\n @case (ErrorKeys.NoData) {\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 }\n @case (ErrorKeys.SetValueError) {\n <div class=\"notification is-danger is-flex is-flex-direction-column is-gap-8\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span class=\"is-pl-3\">\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\n <pre><code>{{error().key}}</code></pre>\n }\n @case (SchemaErrorKeys.PropertyNotFound) {\n <div class=\"notification is-danger is-flex is-flex-direction-column is-gap-8\" 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 <pre><code>{{error().key}}</code></pre>\n }\n @case (SchemaErrorKeys.PropertyInvalidFormat) {\n <p>\n The following value in the column\n <i>{{ error().key }}</i>\n is not in the correct format:\n </p>\n <pre><code>{{stringify(error().value)}}</code></pre>\n\n @switch (hasNumberWithCommasError()) {\n @case (true) {\n <p>\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><code>3,510.1</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><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 }\n @case (ErrorKeys.PropertyRequired) {\n <p>\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 </p>\n <pre><code>{{error().property}}</code></pre>\n\n @switch (error().property) {\n @case ('id') {\n <p>\n You must assign a unique\n <code>id</code>\n for every record in your data.\n </p>\n }\n @case ('type') {\n <p>\n Every record in your data must contain a\n <code>type</code>\n .\n </p>\n }\n }\n }\n @case (ErrorKeys.PropertyInternal) {\n <p>\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 </p>\n <pre><code>{{error().schemaKey || error().key}}</code></pre>\n\n <p>\n You cannot upload\n <code>internal</code>\n fields to HESTIA.\n </p>\n }\n @case (SchemaErrorKeys.SchemaNotFound) {\n @if (error().key) {\n <p>The following Node does not exist in the schema:</p>\n <pre><code>{{error().key}}</code></pre>\n } @else if (error().schema) {\n <p>The following Node Type does not exist in the schema or can not be uploaded directly:</p>\n <br />\n <pre><code>{{error().schema}}</code></pre>\n }\n\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul class=\"is-list-style-disc\">\n @for (type of nodeTypes; track type) {\n <li>\n <i>{{ type }}</i>\n </li>\n }\n </ul>\n </div>\n }\n @case (ErrorKeys.InvalidFirstColumn) {\n <p>\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 </p>\n }\n @case (ErrorKeys.InvalidExcelFile) {\n <p>\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 </p>\n }\n @case (ErrorKeys.NoHeaders) {\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 }\n @case (ErrorKeys.InvalidSheetName) {\n <p>\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 </p>\n <div class=\"content\">\n <ul class=\"is-list-style-disc\">\n @for (e of error().error.split(';'); track e) {\n <li>\n <code>{{ e }}</code>\n </li>\n }\n </ul>\n </div>\n <p>Please re-upload selecting one of the sheets above.</p>\n }\n @case (ErrorKeys.DuplicatedHeaders) {\n <p>Your upload contains duplicated column headers.</p>\n }\n @case (ErrorKeys.DuplicatedIds) {\n <p>\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 </p>\n <pre><code>{{error().value}}</code></pre>\n\n <p class=\"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 }\n @case (SchemaErrorKeys.DuplicatedIdFields) {\n <p>\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 </p>\n }\n @case (ErrorKeys.NestedHeaders) {\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 }\n @case (ErrorKeys.NestedNodes) {\n <p>To link nodes together, you need to upload each node separately, as we do not allow nesting:</p>\n <pre><code>{{ sampleLinkedNodes | json }}</code></pre>\n }\n @case (ErrorKeys.ReferenceExistingHeaders) {\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=\"has-text-danger has-text-underline\">Incorrect:</p>\n <pre><code>cycle.&#64;id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n <p class=\"has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\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><code>cycle.inputs.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.inputs.0.term.name</code></pre>\n </div>\n }\n @case (ErrorKeys.MultipleNodeTypeCase) {\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><code>impactAssessment.id,impactAssessment.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><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 }\n @case (ErrorKeys.InvalidListIndex) {\n <p>You have used incorrect indexes for the list of blank nodes:</p>\n <p class=\"has-text-danger has-text-underline\">Incorrect:</p>\n <pre><code>cycle.inputs.0.term.name,cycle.inputs.100.term.name</code></pre>\n <p class=\"has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.inputs.0.term.name,cycle.inputs.1.term.name</code></pre>\n\n <p>Please make sure to number correctly the list of Blank Nodes in a consecutive order, without gaps.</p>\n }\n @case (ErrorKeys.MultipleTermHeaders) {\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><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><code>cycle.inputs.0.term.&#64;id</code></pre>\n }\n @case (SchemaErrorKeys.ObjectArrayInvalid) {\n <p>The column header {{ error().key }} must use the array format. Examples:</p>\n <pre><code>{{ error().key + '.0.term.name' }}</code></pre>\n <pre><code>{{ error().key + '.0.value' }}</code></pre>\n <pre><code>{{ error().key + '.1.term.name' }}</code></pre>\n <pre><code>{{ error().key + '.1.value' }}</code></pre>\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n }\n @case (ErrorKeys.MaxSize) {\n <p>\n The maximum file size limit is {{ maxFileSizeMb }}Mb (current file size: {{ error().value }}Mb). Please\n re-upload these data in multiple files.\n </p>\n }\n @case (ErrorKeys.MaxRows) {\n <p>\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 </p>\n }\n @case (ErrorKeys.Mendeley) {\n <p>An error occured while fetching the bibliographic information. Please try re-uploading the file.</p>\n <ng-container *ngTemplateOutlet=\"reportError\" />\n }\n @case (ErrorKeys.Timeout) {\n <p>Time exceeded for current step.</p>\n @if (debug()) {\n <span>You can try to \"Re-index\" or \"Re-upload\" if it still does not work.</span>\n }\n <ng-container *ngTemplateOutlet=\"reportError\" />\n }\n @default {\n <p>{{ message() }}</p>\n @if (debug()) {\n <pre><code>{{ error() | json }}</code></pre>\n }\n <ng-container *ngTemplateOutlet=\"reportError\" />\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 <b>Preview:</b>\n <pre><code>{{stringify(error().node)}}</code></pre>\n }\n </div>\n}\n\n<ng-template #defaultError>\n <p>\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>\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 }); }
14588
+ 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 <p>\n Uploading data with\n <code class=\"is-px-1\">dataPrivate={{ error().value }}</code>\n is not allowed.\n </p>\n <p>\n Please try uploading with\n <code class=\"is-px-1\">dataPrivate={{ !error().value }}</code>\n instead.\n </p>\n }\n @case (ErrorKeys.InvalidJSON) {\n <p>The uploaded content does not appear to contain valid JSON data:</p>\n <pre><code>{{error().error}}</code></pre>\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 }\n @case (ErrorKeys.NoData) {\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 }\n @case (ErrorKeys.SetValueError) {\n <div class=\"notification is-danger is-flex is-flex-direction-column is-gap-8\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span class=\"is-pl-3\">\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\n <pre><code>{{error().key}}</code></pre>\n }\n @case (SchemaErrorKeys.PropertyNotFound) {\n <div class=\"notification is-danger is-flex is-flex-direction-column is-gap-8\" 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 <pre><code>{{error().key}}</code></pre>\n }\n @case (SchemaErrorKeys.PropertyInvalidFormat) {\n <p>\n The following value in the column\n <i>{{ error().key }}</i>\n is not in the correct format:\n </p>\n <pre><code>{{stringify(error().value)}}</code></pre>\n\n @switch (hasNumberWithCommasError()) {\n @case (true) {\n <p>\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><code>3,510.1</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><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 }\n @case (ErrorKeys.PropertyRequired) {\n <p>\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 </p>\n <pre><code>{{error().property}}</code></pre>\n\n @switch (error().property) {\n @case ('id') {\n <p>\n You must assign a unique\n <code>id</code>\n for every record in your data.\n </p>\n }\n @case ('type') {\n <p>\n Every record in your data must contain a\n <code>type</code>\n .\n </p>\n }\n }\n }\n @case (ErrorKeys.PropertyInternal) {\n <p>\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 </p>\n <pre><code>{{error().schemaKey || error().key}}</code></pre>\n\n <p>\n You cannot upload\n <code>internal</code>\n fields to HESTIA.\n </p>\n }\n @case (SchemaErrorKeys.SchemaNotFound) {\n @if (error().key) {\n <p>The following Node does not exist in the schema:</p>\n <pre><code>{{error().key}}</code></pre>\n } @else if (error().schema) {\n <p>The following Node Type does not exist in the schema or can not be uploaded directly:</p>\n <br />\n <pre><code>{{error().schema}}</code></pre>\n }\n\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul class=\"is-list-style-disc\">\n @for (type of nodeTypes; track type) {\n <li>\n <i>{{ type }}</i>\n </li>\n }\n </ul>\n </div>\n }\n @case (ErrorKeys.InvalidFirstColumn) {\n <p>\n <span>\n No data in the HESTIA format was detected on the first sheet. Either try selecting a different sheet in the\n </span>\n <a [href]=\"baseUrl + '/guide/guide-contributing-data-uploading'\" target=\"_blank\">upload screen</a>\n <span>, or check the sheet to ensure the headers follow the schema - see examples</span>\n <a class=\"pl-1\" [href]=\"baseUrl + '/guide/guide-contributing-data-examples'\" target=\"_blank\">here</a>\n </p>\n }\n @case (ErrorKeys.InvalidExcelFile) {\n <p>\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 </p>\n }\n @case (ErrorKeys.NoHeaders) {\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 }\n @case (ErrorKeys.InvalidSheetName) {\n <p>\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 </p>\n <div class=\"content\">\n <ul class=\"is-list-style-disc\">\n @for (e of error().error.split(';'); track e) {\n <li>\n <code>{{ e }}</code>\n </li>\n }\n </ul>\n </div>\n <p>Please re-upload selecting one of the sheets above.</p>\n }\n @case (ErrorKeys.DuplicatedHeaders) {\n <p>Your upload contains duplicated column headers.</p>\n }\n @case (ErrorKeys.DuplicatedIds) {\n <p>\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 </p>\n <pre><code>{{error().value}}</code></pre>\n\n <p class=\"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 }\n @case (SchemaErrorKeys.DuplicatedIdFields) {\n <p>\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 </p>\n }\n @case (ErrorKeys.NestedHeaders) {\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 }\n @case (ErrorKeys.NestedNodes) {\n <p>To link nodes together, you need to upload each node separately, as we do not allow nesting:</p>\n <pre><code>{{ sampleLinkedNodes | json }}</code></pre>\n }\n @case (ErrorKeys.ReferenceExistingHeaders) {\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=\"has-text-danger has-text-underline\">Incorrect:</p>\n <pre><code>cycle.&#64;id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n <p class=\"has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\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><code>cycle.inputs.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.inputs.0.term.name</code></pre>\n </div>\n }\n @case (ErrorKeys.MultipleNodeTypeCase) {\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><code>impactAssessment.id,impactAssessment.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><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 }\n @case (ErrorKeys.InvalidListIndex) {\n <p>You have used incorrect indexes for the list of blank nodes:</p>\n <p class=\"has-text-danger has-text-underline\">Incorrect:</p>\n <pre><code>cycle.inputs.0.term.name,cycle.inputs.100.term.name</code></pre>\n <p class=\"has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.inputs.0.term.name,cycle.inputs.1.term.name</code></pre>\n\n <p>Please make sure to number correctly the list of Blank Nodes in a consecutive order, without gaps.</p>\n }\n @case (ErrorKeys.MultipleTermHeaders) {\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><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><code>cycle.inputs.0.term.&#64;id</code></pre>\n }\n @case (SchemaErrorKeys.ObjectArrayInvalid) {\n <p>The column header {{ error().key }} must use the array format. Examples:</p>\n <pre><code>{{ error().key + '.0.term.name' }}</code></pre>\n <pre><code>{{ error().key + '.0.value' }}</code></pre>\n <pre><code>{{ error().key + '.1.term.name' }}</code></pre>\n <pre><code>{{ error().key + '.1.value' }}</code></pre>\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n }\n @case (ErrorKeys.MaxSize) {\n <p>\n The maximum file size limit is {{ maxFileSizeMb }}Mb (current file size: {{ error().value }}Mb). Please\n re-upload these data in multiple files.\n </p>\n }\n @case (ErrorKeys.MaxRows) {\n <p>\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 </p>\n }\n @case (ErrorKeys.Mendeley) {\n <p>An error occured while fetching the bibliographic information. Please try re-uploading the file.</p>\n <ng-container *ngTemplateOutlet=\"reportError\" />\n }\n @case (ErrorKeys.Timeout) {\n <p>Time exceeded for current step.</p>\n @if (debug()) {\n <span>You can try to \"Re-index\" or \"Re-upload\" if it still does not work.</span>\n }\n <ng-container *ngTemplateOutlet=\"reportError\" />\n }\n @default {\n <p>{{ message() }}</p>\n @if (debug()) {\n <pre><code>{{ error() | json }}</code></pre>\n }\n <ng-container *ngTemplateOutlet=\"reportError\" />\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 <b>Preview:</b>\n <pre><code>{{stringify(error().node)}}</code></pre>\n }\n </div>\n}\n\n<ng-template #defaultError>\n <p>\n <span class=\"is-pr-1\">If you are still stuck, please see</span>\n <a [href]=\"baseUrl + '/guide/guide-contributing-data-examples'\" target=\"_blank\">the example uploads</a>\n <span class=\"is-px-1\">and</span>\n <a [href]=\"baseUrl + '/guide/guide-contributing-data-preparing-your-data'\" target=\"_blank\">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>\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 }); }
14573
14589
  }
14574
14590
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FilesUploadErrorsComponent, decorators: [{
14575
14591
  type: Component$1,
14576
- 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 <p>\n Uploading data with\n <code class=\"is-px-1\">dataPrivate={{ error().value }}</code>\n is not allowed.\n </p>\n <p>\n Please try uploading with\n <code class=\"is-px-1\">dataPrivate={{ !error().value }}</code>\n instead.\n </p>\n }\n @case (ErrorKeys.InvalidJSON) {\n <p>The uploaded content does not appear to contain valid JSON data:</p>\n <pre><code>{{error().error}}</code></pre>\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 }\n @case (ErrorKeys.NoData) {\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 }\n @case (ErrorKeys.SetValueError) {\n <div class=\"notification is-danger is-flex is-flex-direction-column is-gap-8\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span class=\"is-pl-3\">\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\n <pre><code>{{error().key}}</code></pre>\n }\n @case (SchemaErrorKeys.PropertyNotFound) {\n <div class=\"notification is-danger is-flex is-flex-direction-column is-gap-8\" 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 <pre><code>{{error().key}}</code></pre>\n }\n @case (SchemaErrorKeys.PropertyInvalidFormat) {\n <p>\n The following value in the column\n <i>{{ error().key }}</i>\n is not in the correct format:\n </p>\n <pre><code>{{stringify(error().value)}}</code></pre>\n\n @switch (hasNumberWithCommasError()) {\n @case (true) {\n <p>\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><code>3,510.1</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><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 }\n @case (ErrorKeys.PropertyRequired) {\n <p>\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 </p>\n <pre><code>{{error().property}}</code></pre>\n\n @switch (error().property) {\n @case ('id') {\n <p>\n You must assign a unique\n <code>id</code>\n for every record in your data.\n </p>\n }\n @case ('type') {\n <p>\n Every record in your data must contain a\n <code>type</code>\n .\n </p>\n }\n }\n }\n @case (ErrorKeys.PropertyInternal) {\n <p>\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 </p>\n <pre><code>{{error().schemaKey || error().key}}</code></pre>\n\n <p>\n You cannot upload\n <code>internal</code>\n fields to HESTIA.\n </p>\n }\n @case (SchemaErrorKeys.SchemaNotFound) {\n @if (error().key) {\n <p>The following Node does not exist in the schema:</p>\n <pre><code>{{error().key}}</code></pre>\n } @else if (error().schema) {\n <p>The following Node Type does not exist in the schema or can not be uploaded directly:</p>\n <br />\n <pre><code>{{error().schema}}</code></pre>\n }\n\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul class=\"is-list-style-disc\">\n @for (type of nodeTypes; track type) {\n <li>\n <i>{{ type }}</i>\n </li>\n }\n </ul>\n </div>\n }\n @case (ErrorKeys.InvalidFirstColumn) {\n <p>\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 </p>\n }\n @case (ErrorKeys.InvalidExcelFile) {\n <p>\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 </p>\n }\n @case (ErrorKeys.NoHeaders) {\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 }\n @case (ErrorKeys.InvalidSheetName) {\n <p>\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 </p>\n <div class=\"content\">\n <ul class=\"is-list-style-disc\">\n @for (e of error().error.split(';'); track e) {\n <li>\n <code>{{ e }}</code>\n </li>\n }\n </ul>\n </div>\n <p>Please re-upload selecting one of the sheets above.</p>\n }\n @case (ErrorKeys.DuplicatedHeaders) {\n <p>Your upload contains duplicated column headers.</p>\n }\n @case (ErrorKeys.DuplicatedIds) {\n <p>\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 </p>\n <pre><code>{{error().value}}</code></pre>\n\n <p class=\"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 }\n @case (SchemaErrorKeys.DuplicatedIdFields) {\n <p>\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 </p>\n }\n @case (ErrorKeys.NestedHeaders) {\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 }\n @case (ErrorKeys.NestedNodes) {\n <p>To link nodes together, you need to upload each node separately, as we do not allow nesting:</p>\n <pre><code>{{ sampleLinkedNodes | json }}</code></pre>\n }\n @case (ErrorKeys.ReferenceExistingHeaders) {\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=\"has-text-danger has-text-underline\">Incorrect:</p>\n <pre><code>cycle.&#64;id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n <p class=\"has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\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><code>cycle.inputs.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.inputs.0.term.name</code></pre>\n </div>\n }\n @case (ErrorKeys.MultipleNodeTypeCase) {\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><code>impactAssessment.id,impactAssessment.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><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 }\n @case (ErrorKeys.InvalidListIndex) {\n <p>You have used incorrect indexes for the list of blank nodes:</p>\n <p class=\"has-text-danger has-text-underline\">Incorrect:</p>\n <pre><code>cycle.inputs.0.term.name,cycle.inputs.100.term.name</code></pre>\n <p class=\"has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.inputs.0.term.name,cycle.inputs.1.term.name</code></pre>\n\n <p>Please make sure to number correctly the list of Blank Nodes in a consecutive order, without gaps.</p>\n }\n @case (ErrorKeys.MultipleTermHeaders) {\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><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><code>cycle.inputs.0.term.&#64;id</code></pre>\n }\n @case (SchemaErrorKeys.ObjectArrayInvalid) {\n <p>The column header {{ error().key }} must use the array format. Examples:</p>\n <pre><code>{{ error().key + '.0.term.name' }}</code></pre>\n <pre><code>{{ error().key + '.0.value' }}</code></pre>\n <pre><code>{{ error().key + '.1.term.name' }}</code></pre>\n <pre><code>{{ error().key + '.1.value' }}</code></pre>\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n }\n @case (ErrorKeys.MaxSize) {\n <p>\n The maximum file size limit is {{ maxFileSizeMb }}Mb (current file size: {{ error().value }}Mb). Please\n re-upload these data in multiple files.\n </p>\n }\n @case (ErrorKeys.MaxRows) {\n <p>\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 </p>\n }\n @case (ErrorKeys.Mendeley) {\n <p>An error occured while fetching the bibliographic information. Please try re-uploading the file.</p>\n <ng-container *ngTemplateOutlet=\"reportError\" />\n }\n @case (ErrorKeys.Timeout) {\n <p>Time exceeded for current step.</p>\n @if (debug()) {\n <span>You can try to \"Re-index\" or \"Re-upload\" if it still does not work.</span>\n }\n <ng-container *ngTemplateOutlet=\"reportError\" />\n }\n @default {\n <p>{{ message() }}</p>\n @if (debug()) {\n <pre><code>{{ error() | json }}</code></pre>\n }\n <ng-container *ngTemplateOutlet=\"reportError\" />\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 <b>Preview:</b>\n <pre><code>{{stringify(error().node)}}</code></pre>\n }\n </div>\n}\n\n<ng-template #defaultError>\n <p>\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>\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"] }]
14592
+ 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 <p>\n Uploading data with\n <code class=\"is-px-1\">dataPrivate={{ error().value }}</code>\n is not allowed.\n </p>\n <p>\n Please try uploading with\n <code class=\"is-px-1\">dataPrivate={{ !error().value }}</code>\n instead.\n </p>\n }\n @case (ErrorKeys.InvalidJSON) {\n <p>The uploaded content does not appear to contain valid JSON data:</p>\n <pre><code>{{error().error}}</code></pre>\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 }\n @case (ErrorKeys.NoData) {\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 }\n @case (ErrorKeys.SetValueError) {\n <div class=\"notification is-danger is-flex is-flex-direction-column is-gap-8\" role=\"alert\">\n <p>\n <he-svg-icon name=\"exclamation-triangle\" />\n <span class=\"is-pl-3\">\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\n <pre><code>{{error().key}}</code></pre>\n }\n @case (SchemaErrorKeys.PropertyNotFound) {\n <div class=\"notification is-danger is-flex is-flex-direction-column is-gap-8\" 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 <pre><code>{{error().key}}</code></pre>\n }\n @case (SchemaErrorKeys.PropertyInvalidFormat) {\n <p>\n The following value in the column\n <i>{{ error().key }}</i>\n is not in the correct format:\n </p>\n <pre><code>{{stringify(error().value)}}</code></pre>\n\n @switch (hasNumberWithCommasError()) {\n @case (true) {\n <p>\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><code>3,510.1</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><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 }\n @case (ErrorKeys.PropertyRequired) {\n <p>\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 </p>\n <pre><code>{{error().property}}</code></pre>\n\n @switch (error().property) {\n @case ('id') {\n <p>\n You must assign a unique\n <code>id</code>\n for every record in your data.\n </p>\n }\n @case ('type') {\n <p>\n Every record in your data must contain a\n <code>type</code>\n .\n </p>\n }\n }\n }\n @case (ErrorKeys.PropertyInternal) {\n <p>\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 </p>\n <pre><code>{{error().schemaKey || error().key}}</code></pre>\n\n <p>\n You cannot upload\n <code>internal</code>\n fields to HESTIA.\n </p>\n }\n @case (SchemaErrorKeys.SchemaNotFound) {\n @if (error().key) {\n <p>The following Node does not exist in the schema:</p>\n <pre><code>{{error().key}}</code></pre>\n } @else if (error().schema) {\n <p>The following Node Type does not exist in the schema or can not be uploaded directly:</p>\n <br />\n <pre><code>{{error().schema}}</code></pre>\n }\n\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul class=\"is-list-style-disc\">\n @for (type of nodeTypes; track type) {\n <li>\n <i>{{ type }}</i>\n </li>\n }\n </ul>\n </div>\n }\n @case (ErrorKeys.InvalidFirstColumn) {\n <p>\n <span>\n No data in the HESTIA format was detected on the first sheet. Either try selecting a different sheet in the\n </span>\n <a [href]=\"baseUrl + '/guide/guide-contributing-data-uploading'\" target=\"_blank\">upload screen</a>\n <span>, or check the sheet to ensure the headers follow the schema - see examples</span>\n <a class=\"pl-1\" [href]=\"baseUrl + '/guide/guide-contributing-data-examples'\" target=\"_blank\">here</a>\n </p>\n }\n @case (ErrorKeys.InvalidExcelFile) {\n <p>\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 </p>\n }\n @case (ErrorKeys.NoHeaders) {\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 }\n @case (ErrorKeys.InvalidSheetName) {\n <p>\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 </p>\n <div class=\"content\">\n <ul class=\"is-list-style-disc\">\n @for (e of error().error.split(';'); track e) {\n <li>\n <code>{{ e }}</code>\n </li>\n }\n </ul>\n </div>\n <p>Please re-upload selecting one of the sheets above.</p>\n }\n @case (ErrorKeys.DuplicatedHeaders) {\n <p>Your upload contains duplicated column headers.</p>\n }\n @case (ErrorKeys.DuplicatedIds) {\n <p>\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 </p>\n <pre><code>{{error().value}}</code></pre>\n\n <p class=\"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 }\n @case (SchemaErrorKeys.DuplicatedIdFields) {\n <p>\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 </p>\n }\n @case (ErrorKeys.NestedHeaders) {\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 }\n @case (ErrorKeys.NestedNodes) {\n <p>To link nodes together, you need to upload each node separately, as we do not allow nesting:</p>\n <pre><code>{{ sampleLinkedNodes | json }}</code></pre>\n }\n @case (ErrorKeys.ReferenceExistingHeaders) {\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=\"has-text-danger has-text-underline\">Incorrect:</p>\n <pre><code>cycle.&#64;id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\n <p class=\"has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.id,cycle.inputs.0.term.&#64;id,source.id</code></pre>\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><code>cycle.inputs.term.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.inputs.0.term.name</code></pre>\n </div>\n }\n @case (ErrorKeys.MultipleNodeTypeCase) {\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><code>impactAssessment.id,impactAssessment.name</code></pre>\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre><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 }\n @case (ErrorKeys.InvalidListIndex) {\n <p>You have used incorrect indexes for the list of blank nodes:</p>\n <p class=\"has-text-danger has-text-underline\">Incorrect:</p>\n <pre><code>cycle.inputs.0.term.name,cycle.inputs.100.term.name</code></pre>\n <p class=\"has-text-success has-text-underline\">Correct:</p>\n <pre><code>cycle.inputs.0.term.name,cycle.inputs.1.term.name</code></pre>\n\n <p>Please make sure to number correctly the list of Blank Nodes in a consecutive order, without gaps.</p>\n }\n @case (ErrorKeys.MultipleTermHeaders) {\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><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><code>cycle.inputs.0.term.&#64;id</code></pre>\n }\n @case (SchemaErrorKeys.ObjectArrayInvalid) {\n <p>The column header {{ error().key }} must use the array format. Examples:</p>\n <pre><code>{{ error().key + '.0.term.name' }}</code></pre>\n <pre><code>{{ error().key + '.0.value' }}</code></pre>\n <pre><code>{{ error().key + '.1.term.name' }}</code></pre>\n <pre><code>{{ error().key + '.1.value' }}</code></pre>\n <ng-container *ngTemplateOutlet=\"schemaError\" />\n }\n @case (ErrorKeys.MaxSize) {\n <p>\n The maximum file size limit is {{ maxFileSizeMb }}Mb (current file size: {{ error().value }}Mb). Please\n re-upload these data in multiple files.\n </p>\n }\n @case (ErrorKeys.MaxRows) {\n <p>\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 </p>\n }\n @case (ErrorKeys.Mendeley) {\n <p>An error occured while fetching the bibliographic information. Please try re-uploading the file.</p>\n <ng-container *ngTemplateOutlet=\"reportError\" />\n }\n @case (ErrorKeys.Timeout) {\n <p>Time exceeded for current step.</p>\n @if (debug()) {\n <span>You can try to \"Re-index\" or \"Re-upload\" if it still does not work.</span>\n }\n <ng-container *ngTemplateOutlet=\"reportError\" />\n }\n @default {\n <p>{{ message() }}</p>\n @if (debug()) {\n <pre><code>{{ error() | json }}</code></pre>\n }\n <ng-container *ngTemplateOutlet=\"reportError\" />\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 <b>Preview:</b>\n <pre><code>{{stringify(error().node)}}</code></pre>\n }\n </div>\n}\n\n<ng-template #defaultError>\n <p>\n <span class=\"is-pr-1\">If you are still stuck, please see</span>\n <a [href]=\"baseUrl + '/guide/guide-contributing-data-examples'\" target=\"_blank\">the example uploads</a>\n <span class=\"is-px-1\">and</span>\n <a [href]=\"baseUrl + '/guide/guide-contributing-data-preparing-your-data'\" target=\"_blank\">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>\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"] }]
14577
14593
  }], 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 }] }] } });
14578
14594
 
14579
14595
  /**
@@ -15321,14 +15337,20 @@ const hasValidationError = (errors = [], level) => {
15321
15337
  : allErrors.length > 0;
15322
15338
  };
15323
15339
 
15340
+ const foldText = (text = '') => text
15341
+ .normalize('NFD')
15342
+ .replace(/\p{Diacritic}/gu, '')
15343
+ .toLowerCase();
15344
+ const matchesSearchTerm = (text, searchTerm) => foldText(text).includes(foldText(searchTerm));
15345
+
15324
15346
  const initialFilterState = {
15325
15347
  limit: 100,
15326
15348
  filter: '',
15327
15349
  data: [],
15328
15350
  mapFn: null,
15329
15351
  filterFn: (item, filter) => item.type === 'group' ||
15330
- (item.type === 'option' && item.label.toLowerCase().includes(filter)) ||
15331
- item.value.toLowerCase().includes(filter),
15352
+ (item.type === 'option' && matchesSearchTerm(item.label, filter)) ||
15353
+ matchesSearchTerm(item.value, filter),
15332
15354
  value: null
15333
15355
  };
15334
15356
 
@@ -15385,7 +15407,7 @@ const disabledValues = (values) => values
15385
15407
  .flatMap(v => (v.type === 'group' ? disabledValues(v.options) : v.disabled ? v.value : null))
15386
15408
  .filter(Boolean);
15387
15409
  const getDirectOptionsCount = (group) => group.options.filter(item => item.type === 'option').length;
15388
- const isItemMatch = (item, searchTerm) => item.label.toLowerCase().includes(searchTerm.toLowerCase());
15410
+ const isItemMatch = (item, searchTerm) => matchesSearchTerm(item.label, searchTerm);
15389
15411
  const hasMatchingNestedOption = (group, searchTerm) => group.options.some(item => item.type === 'option' ? isItemMatch(item, searchTerm) : hasMatchingNestedOption(item, searchTerm));
15390
15412
  const getFilteredDirectChildren = ({ options }, searchTerm) => (searchTerm?.trim()
15391
15413
  ? options.filter(item => isItemMatch(item, searchTerm) ||
@@ -15981,5 +16003,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
15981
16003
  * Generated bundle index. Do not edit.
15982
16004
  */
15983
16005
 
15984
- export { ARRAY_DELIMITER, ApplyPurePipe, BarChartComponent, BibliographiesSearchConfirmComponent, BlankNodeStateComponent, BlankNodeStateNoticeComponent, BlankNodeValueDeltaComponent, CapitalizePipe, ChartComponent, ChartConfigurationDirective, ChartExportButtonComponent, ChartTooltipComponent, ClickOutsideDirective, ClipboardComponent, CollapsibleBlockComponent, CollapsibleBoxComponent, CollapsibleBoxStyle, CompoundDirective, CompoundPipe, ContributionChartComponent, ControlValueAccessor, CycleNodesKeyGroup, CyclesCompletenessComponent, CyclesEmissionsCategoryService, CyclesEmissionsChartComponent, CyclesFunctionalUnitMeasureComponent, CyclesMetadataComponent, CyclesNodesComponent, CyclesNodesTimelineComponent, CyclesResultComponent, DataTableComponent, DefaultPipe, DeltaColour, DistributionChartComponent, DrawerContainerComponent, DurationPipe, EllipsisPipe, EngineModelsLinkComponent, EngineModelsLookupInfoComponent, EngineModelsStageComponent, EngineModelsStageDeepComponent, EngineModelsStageDeepService, EngineModelsVersionInfoComponent, EngineModelsVersionLinkComponent, EngineOrchestratorEditComponent, EngineRequirementsFormComponent, FileSizePipe, FileUploadErrorKeys, FilesDragDropDirective, FilesDropZoneComponent, FilesErrorSummaryComponent, FilesFormComponent, FilesFormEditableComponent, FilesUploadErrorsComponent, FilterAccordionComponent, FormulaBlockComponent, GUIDE_ENABLED, GetPipe, GlossaryMigrationFormat, GuideOverlayComponent, HE_API_BASE_URL, HE_CALCULATIONS_BASE_URL, HE_MAP_LOADED, HE_REGION_GEOJSON_BASE_URL, 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, MaxPipe, MeanPipe, MedianPipe, MendeleySearchResult, MinPipe, MobileShellComponent, NavigationMenuComponent, NoExtPipe, NodeAggregatedComponent, NodeAggregatedFormulasComponent, NodeAggregatedInfoComponent, NodeAggregatedQualityScoreComponent, NodeAggregationLogsComponent, NodeCsvExportConfirmComponent, NodeCsvPreviewComponent, NodeCsvSelectHeadersComponent, NodeIconComponent, NodeJLogModelsComponent, NodeJsonldComponent, NodeJsonldSchemaComponent, NodeKeyState, NodeLinkComponent, NodeLogsFileComponent, NodeLogsModelsComponent, NodeLogsTimeComponent, NodeMissingLookupFactorsComponent, NodeQualityScore, NodeRecommendationsComponent, NodeSelectComponent, NodeValueDetailsComponent, PipelineStagesProgressComponent, PluralizePipe, PopoverComponent, PopoverConfirmComponent, PrecisionPipe, RelatedNodeResult, RemoveMarkdownPipe, RepeatPipe, Repository, ResizedDirective, ResizedEvent, ResponsiveService, SchemaInfoComponent, SchemaVersionLinkComponent, SearchExtendComponent, ShelfDialogComponent, ShellComponent, SiteNodesKeyGroup, SitesManagementChartComponent, SitesMapsComponent, SitesNodesComponent, SkeletonTextComponent, SocialTagsComponent, SortByPipe, SortSelectComponent, SumPipe, TagsInputDirective, Template, TermsPropertyContentComponent, TermsSubClassOfContentComponent, TermsUnitsDescriptionComponent, ThousandSuffixesPipe, ThousandsPipe, TimesPipe, ToastComponent, UncapitalizePipe, addPolygonToFeature, aggregatedSitePrimaryProduct, allCountriesQuery, allGroups, allOptions, availableProperties, axisLabelSettings, backgroundModelParams, baseApiUrl, baseUrl, bottom, buildSummary, bytesSize, calculateCycleDuration, calculateCycleDurationEnabled, calculateCycleStartDate, calculateCycleStartDateEnabled, capitalize, changelogUrl, clustererImage, code, compoundToHtml, computeKeys, computeTerms, contactUsEmail, contactUsLink, coordinatesToPoint, copyObject, countGroupVisibleNodes, countriesQuery, createMarker, cropsQuery, dataPathLabel, dataPathToKey, dataVersionHeader, dataVersionHeaderKey, defaultFeature, defaultLabel, defaultSuggestionType, definitionToSchemaType, distinctUntilChangedDeep, ellipsis, engineGitBaseUrl, engineGitUrl, errorText, errorsLabel, evaluateSuccess, exportFormats, externalLink, externalNodeLink, fillColor, fillStyle, filterBlankNode$1 as filterBlankNode, filterParams, findBackgroundModel, findConfigModels, findMatchingModel, findModels, findNodeModel, findOrchestratorModel, findProperty, findPropertyById, findTermModels, flatFilterData, flatFilterNode, formatCustomErrorMessage, formatDate, formatError, formatPropertyError, formatter$1 as formatter, getDatesBetween, gitBranch, gitHome, glossaryBaseUrl, glossaryLink, groupBlankNodesByTermIdentity, groupChanged, groupJLogByField, groupJLogByTerm, groupLogsByTerm, groupNodesByTerm, groupdLogsByKey, grouppedKeys, grouppedValueKeys, groupsLogsByFields, guideModelUrl, guideNamespace, handleAPIError, handleGuideEvent, hasError, hasValidationError, hasWarning, highestMethodTier, ignoreKeys$2 as ignoreKeys, impactAssessmentProduct, initialFilterState, injectResizeEvent$, inputGroupsTermTypes, isAddPropertyEnabled, isChrome, isDateBetween, isEqual, isExternal, isIdenticalNodeValue, isKeyClosedVisible, isKeyHidden, isMaxStage, isMethodModelAllowed, isNonNodeModelKey, isSchemaIri, isScrolledBelow, isState, isTermTypeAllowed, isValidKey, jLogModelCount, keyToDataPath, levels, loadMapApi, locationQuery, logToCsv, logValueArray, logsKey, 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, modelCount, modelKeyParams, modelParams, models, multiMatchQuery, nestedProperty, nestingEnabled, nestingTypeEnabled, noValue, nodeAvailableProperties, nodeById, nodeChartLabels, nodeColours, nodeDataState, nodeDataStates, nodeDataVersion, nodeId, nodeIdWithoutDataVersion, nodeIds, nodeLink, nodeLinkEnabled, nodeLinkTypeEnabled, nodeLogsUrl, nodeQualityScoreColor, nodeQualityScoreLevel, nodeQualityScoreMaxDefault, nodeQualityScoreOrder, nodeRequestId, nodeSecondaryColours, nodeToAggregationFilename, nodeType, nodeTypeDataState, nodeTypeIcon, nodeTypeIconSchema, nodeUrl, nodeUrlParams, nodeVersion, nodeVersionKey, nodesByState, nodesByType, numberGte, openNodeUrl, openUrl, optionsFromGroup, parentKey, parentProperty, parseData, parseDataPath, parseLines, parseMessage, parseNewValue, pluralize, pointToCoordinates, polygonBounds, polygonToCoordinates, polygonToMap, polygonsFromFeature, populateWithTrackIdsFilterData, postGuideEvent, primaryProduct, productsQuery, propertyError, propertyId, recursiveProperties, refToSchemaType, refreshPropertyKeys, regionsQuery, repeat, reportIssueLink, reportIssueUrl, safeJSONParse, safeJSONStringify, schemaBaseUrl, schemaDataBaseUrl, schemaLink, schemaRequiredProperties, schemaTypeToDefaultValue, scrollToEl, scrollTop, searchFilterData, searchableTypes, siblingProperty, simplifyContributions, singleProperty, siteTooBig, siteTypeToColor, siteTypeToIcon, sortProperties, sortedDates, strokeColor, strokeStyle, subValueKeys, suggestMatchQuery, suggestQuery, suggestTerms, takeAfterViewInit, termLocation, termLocationName, termProperties, termSearch, termTypeLabel, toSnakeCase, toTextParts, toThousands, typeToNewProperty, typeaheadFocus, uncapitalize, uniqueDatesBetween, updateProperties, valueLink, valueToString, valueTypeToDefault, valueValue, waitFor, wildcardQuery };
16006
+ export { ARRAY_DELIMITER, ApplyPurePipe, BarChartComponent, BibliographiesSearchConfirmComponent, BlankNodeStateComponent, BlankNodeStateNoticeComponent, BlankNodeValueDeltaComponent, CapitalizePipe, ChartComponent, ChartConfigurationDirective, ChartExportButtonComponent, ChartTooltipComponent, ClickOutsideDirective, ClipboardComponent, CollapsibleBlockComponent, CollapsibleBoxComponent, CollapsibleBoxStyle, CompoundDirective, CompoundPipe, ContributionChartComponent, ControlValueAccessor, CycleNodesKeyGroup, CyclesCompletenessComponent, CyclesEmissionsCategoryService, CyclesEmissionsChartComponent, CyclesFunctionalUnitMeasureComponent, CyclesMetadataComponent, CyclesNodesComponent, CyclesNodesTimelineComponent, CyclesResultComponent, DataTableComponent, DefaultPipe, DeltaColour, DistributionChartComponent, DrawerContainerComponent, DurationPipe, EllipsisPipe, EngineModelsLinkComponent, EngineModelsLookupInfoComponent, EngineModelsStageComponent, EngineModelsStageDeepComponent, EngineModelsStageDeepService, EngineModelsVersionInfoComponent, EngineModelsVersionLinkComponent, EngineOrchestratorEditComponent, EngineRequirementsFormComponent, FileSizePipe, FileUploadErrorKeys, FilesDragDropDirective, FilesDropZoneComponent, FilesErrorSummaryComponent, FilesFormComponent, FilesFormEditableComponent, FilesUploadErrorsComponent, FilterAccordionComponent, FormulaBlockComponent, GUIDE_ENABLED, GetPipe, GlossaryMigrationFormat, GuideOverlayComponent, HE_API_BASE_URL, HE_CALCULATIONS_BASE_URL, HE_MAP_LOADED, HE_NODE_LINK_TYPES, HE_REGION_GEOJSON_BASE_URL, 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, MaxPipe, MeanPipe, MedianPipe, MendeleySearchResult, MinPipe, MobileShellComponent, NavigationMenuComponent, NoExtPipe, NodeAggregatedComponent, NodeAggregatedFormulasComponent, NodeAggregatedInfoComponent, NodeAggregatedQualityScoreComponent, NodeAggregationLogsComponent, NodeCsvExportConfirmComponent, NodeCsvPreviewComponent, NodeCsvSelectHeadersComponent, NodeIconComponent, NodeJLogModelsComponent, NodeJsonldComponent, NodeJsonldSchemaComponent, NodeKeyState, NodeLinkComponent, NodeLogsFileComponent, NodeLogsModelsComponent, NodeLogsTimeComponent, NodeMissingLookupFactorsComponent, NodeQualityScore, NodeRecommendationsComponent, NodeSelectComponent, NodeValueDetailsComponent, PipelineStagesProgressComponent, PluralizePipe, PopoverComponent, PopoverConfirmComponent, PrecisionPipe, RelatedNodeResult, RemoveMarkdownPipe, RepeatPipe, Repository, ResizedDirective, ResizedEvent, ResponsiveService, SchemaInfoComponent, SchemaVersionLinkComponent, SearchExtendComponent, ShelfDialogComponent, ShellComponent, SiteNodesKeyGroup, SitesManagementChartComponent, SitesMapsComponent, SitesNodesComponent, SkeletonTextComponent, SocialTagsComponent, SortByPipe, SortSelectComponent, SumPipe, TagsInputDirective, Template, TermsPropertyContentComponent, TermsSubClassOfContentComponent, TermsUnitsDescriptionComponent, ThousandSuffixesPipe, ThousandsPipe, TimesPipe, ToastComponent, UncapitalizePipe, addPolygonToFeature, aggregatedSitePrimaryProduct, allCountriesQuery, allGroups, allOptions, availableProperties, axisLabelSettings, backgroundModelParams, baseApiUrl, baseUrl, bottom, buildSummary, bytesSize, calculateCycleDuration, calculateCycleDurationEnabled, calculateCycleStartDate, calculateCycleStartDateEnabled, capitalize, changelogUrl, clustererImage, code, compoundToHtml, computeKeys, computeTerms, contactUsEmail, contactUsLink, coordinatesToPoint, copyObject, countGroupVisibleNodes, countriesQuery, createMarker, cropsQuery, dataPathLabel, dataPathToKey, dataVersionHeader, dataVersionHeaderKey, defaultFeature, defaultLabel, defaultNodeLinkTypes, defaultSuggestionType, definitionToSchemaType, distinctUntilChangedDeep, ellipsis, engineGitBaseUrl, engineGitUrl, errorText, errorsLabel, evaluateSuccess, exportFormats, externalLink, externalNodeLink, fillColor, fillStyle, filterBlankNode$1 as filterBlankNode, filterParams, findBackgroundModel, findConfigModels, findMatchingModel, findModels, findNodeModel, findOrchestratorModel, findProperty, findPropertyById, findTermModels, flatFilterData, flatFilterNode, formatCustomErrorMessage, formatDate, formatError, formatPropertyError, formatter$1 as formatter, getDatesBetween, gitBranch, gitHome, glossaryBaseUrl, glossaryLink, groupBlankNodesByTermIdentity, groupChanged, groupJLogByField, groupJLogByTerm, groupLogsByTerm, groupNodesByTerm, groupdLogsByKey, grouppedKeys, grouppedValueKeys, groupsLogsByFields, guideModelUrl, guideNamespace, handleAPIError, handleGuideEvent, hasError, hasValidationError, hasWarning, highestMethodTier, ignoreKeys$2 as ignoreKeys, impactAssessmentProduct, initialFilterState, injectResizeEvent$, inputGroupsTermTypes, isAddPropertyEnabled, isChrome, isDateBetween, isEqual, isExternal, isIdenticalNodeValue, isKeyClosedVisible, isKeyHidden, isMaxStage, isMethodModelAllowed, isNonNodeModelKey, isSchemaIri, isScrolledBelow, isState, isTermTypeAllowed, isValidKey, jLogModelCount, keyToDataPath, levels, loadMapApi, locationQuery, logToCsv, logValueArray, logsKey, lookupUrl, mapFilterData, mapsUrl, markerIcon, markerPie, matchAggregatedQuery, matchAggregatedValidatedQuery, matchBoolPrefixQuery, matchCountry, matchExactQuery, matchGlobalRegion, matchId, matchNameNormalized, matchNestedKey, matchPhrasePrefixQuery, matchPhraseQuery, matchPrimaryProductQuery, matchQuery, matchRegex, matchRegion, matchTermType, matchType, matchesSearchTerm, maxAreaSize, measurementValue, mergeDataWithHeaders, methodTierOrder, migrationErrorMessage, migrationsUrl, modelCount, modelKeyParams, modelParams, models, multiMatchQuery, nestedProperty, nestingEnabled, nestingTypeEnabled, noValue, nodeAvailableProperties, nodeById, nodeChartLabels, nodeColours, nodeDataState, nodeDataStates, nodeDataVersion, nodeId, nodeIdWithoutDataVersion, nodeIds, nodeLink, nodeLinkEnabled, nodeLinkTypeEnabled, nodeLogsUrl, nodeQualityScoreColor, nodeQualityScoreLevel, nodeQualityScoreMaxDefault, nodeQualityScoreOrder, nodeRequestId, nodeSecondaryColours, nodeToAggregationFilename, nodeType, nodeTypeDataState, nodeTypeIcon, nodeTypeIconSchema, nodeUrl, nodeUrlParams, nodeVersion, nodeVersionKey, nodesByState, nodesByType, numberGte, openNodeUrl, openUrl, optionsFromGroup, parentKey, parentProperty, parseData, parseDataPath, parseLines, parseMessage, parseNewValue, pluralize, pointToCoordinates, polygonBounds, polygonToCoordinates, polygonToMap, polygonsFromFeature, populateWithTrackIdsFilterData, postGuideEvent, primaryProduct, productsQuery, propertyError, propertyId, recursiveProperties, refToSchemaType, refreshPropertyKeys, regionsQuery, repeat, reportIssueLink, reportIssueUrl, safeJSONParse, safeJSONStringify, schemaBaseUrl, schemaDataBaseUrl, schemaLink, schemaRequiredProperties, schemaTypeToDefaultValue, scrollToEl, scrollTop, searchFilterData, searchableTypes, siblingProperty, simplifyContributions, singleProperty, siteTooBig, siteTypeToColor, siteTypeToIcon, sortProperties, sortedDates, strokeColor, strokeStyle, subValueKeys, suggestMatchQuery, suggestQuery, suggestTerms, takeAfterViewInit, termLocation, termLocationName, termProperties, termSearch, termTypeLabel, toSnakeCase, toTextParts, toThousands, typeToNewProperty, typeaheadFocus, uncapitalize, uniqueDatesBetween, updateProperties, valueLink, valueToString, valueTypeToDefault, valueValue, waitFor, wildcardQuery };
15985
16007
  //# sourceMappingURL=hestia-earth-ui-components.mjs.map