geonetwork-ui 2.9.0-dev.388501cd7 → 2.9.0-dev.3b1e90427

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/fesm2022/geonetwork-ui.mjs +171 -66
  2. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  3. package/index.d.ts +15 -5
  4. package/index.d.ts.map +1 -1
  5. package/package.json +7 -7
  6. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.html +8 -10
  7. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +13 -3
  8. package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.ts +2 -0
  9. package/src/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html +4 -4
  10. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +10 -18
  11. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +96 -9
  12. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +1 -1
  13. package/src/libs/feature/router/src/lib/default/router.module.ts +3 -3
  14. package/src/libs/feature/router/src/lib/default/router.service.ts +2 -2
  15. package/src/libs/feature/router/src/lib/default/services/router-search.service.ts +15 -3
  16. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +40 -4
  17. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +2 -0
  18. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +1 -0
  19. package/src/libs/feature/search/src/lib/state/reducer.ts +4 -0
  20. package/src/libs/feature/search/src/lib/utils/service/search.service.ts +2 -0
  21. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +2 -2
  22. package/src/libs/ui/elements/src/lib/application-banner/application-banner.component.ts +2 -3
  23. package/src/libs/ui/elements/src/lib/image-input/image-input.component.html +5 -2
  24. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +63 -56
  25. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.scss +5 -5
  26. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +1 -1
  27. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +1 -1
  28. package/src/libs/ui/map/src/lib/map-utils.ts +1 -1
  29. package/src/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.html +19 -16
  30. package/src/libs/util/app-config/src/lib/app-config.ts +5 -2
  31. package/src/libs/util/shared/src/lib/links/link-utils.ts +8 -4
  32. package/src/libs/util/shared/src/lib/services/theme.service.ts +9 -23
  33. package/tailwind.base.config.js +3 -2
  34. package/translations/de.json +2 -1
  35. package/translations/en.json +1 -0
  36. package/translations/es.json +1 -0
  37. package/translations/fr.json +1 -0
  38. package/translations/it.json +1 -0
  39. package/translations/nl.json +1 -0
  40. package/translations/pt.json +1 -0
  41. package/translations/sk.json +1 -0
@@ -18970,6 +18970,7 @@ var de = {
18970
18970
  "map.ogc.urlInput.hint": "Die URL des OGC API-Dienstes eingeben",
18971
18971
  "map.select.layer": "Datenquelle",
18972
18972
  "map.select.style": "Style",
18973
+ "map.style.default": "Standard",
18973
18974
  "map.wfs.urlInput.hint": "Die WFS URL eingeben",
18974
18975
  "map.wms.urlInput.hint": "Die WMS URL eingeben",
18975
18976
  "multiselect.filter.placeholder": "Suche",
@@ -19192,6 +19193,7 @@ var de = {
19192
19193
  "search.filters.producerOrg": "Herausgeber",
19193
19194
  "search.filters.publicationYear": "Veröffentlichungsjahr",
19194
19195
  "search.filters.publisherOrg": "Vertreiber",
19196
+ "search.filters.recordKind": "",
19195
19197
  "search.filters.recordKind.all": "Alle",
19196
19198
  "search.filters.recordKind.dataset": "Datensätze",
19197
19199
  "search.filters.recordKind.reuse": "Wiederverwendungen",
@@ -19230,8 +19232,8 @@ var de = {
19230
19232
  "service.metadata.spatialExtent": "Räumliche Ausdehnung",
19231
19233
  "share.tab.permalink": "Teilen",
19232
19234
  "share.tab.webComponent": "Integrieren",
19233
- "stac.filter.reset": "",
19234
19235
  "stac.filter.enable": "",
19236
+ "stac.filter.reset": "",
19235
19237
  "stac.results.noResults": "Ihre Suchfilter lieferten keine Ergebnisse",
19236
19238
  "table.loading.data": "Daten werden geladen...",
19237
19239
  "table.object.count": "Objekte in diesem Datensatz",
@@ -19641,6 +19643,7 @@ var en = {
19641
19643
  "map.ogc.urlInput.hint": "Enter OGC API service URL",
19642
19644
  "map.select.layer": "Data source",
19643
19645
  "map.select.style": "Style",
19646
+ "map.style.default": "Default",
19644
19647
  "map.wfs.urlInput.hint": "Enter WFS service URL",
19645
19648
  "map.wms.urlInput.hint": "Enter WMS service URL",
19646
19649
  "multiselect.filter.placeholder": "Search",
@@ -20313,6 +20316,7 @@ var es = {
20313
20316
  "map.ogc.urlInput.hint": "",
20314
20317
  "map.select.layer": "",
20315
20318
  "map.select.style": "",
20319
+ "map.style.default": "Por defecto",
20316
20320
  "map.wfs.urlInput.hint": "",
20317
20321
  "map.wms.urlInput.hint": "",
20318
20322
  "multiselect.filter.placeholder": "",
@@ -20985,6 +20989,7 @@ var fr = {
20985
20989
  "map.ogc.urlInput.hint": "Entrez l'URL du service OGC API",
20986
20990
  "map.select.layer": "Source de données",
20987
20991
  "map.select.style": "Style",
20992
+ "map.style.default": "Par défaut",
20988
20993
  "map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
20989
20994
  "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
20990
20995
  "multiselect.filter.placeholder": "Rechercher",
@@ -21657,6 +21662,7 @@ var it = {
21657
21662
  "map.ogc.urlInput.hint": "Inserisci URL del servizio OGC API",
21658
21663
  "map.select.layer": "Sorgente dati",
21659
21664
  "map.select.style": "Style",
21665
+ "map.style.default": "Predefinito",
21660
21666
  "map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
21661
21667
  "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
21662
21668
  "multiselect.filter.placeholder": "Cerca",
@@ -22329,6 +22335,7 @@ var nl = {
22329
22335
  "map.ogc.urlInput.hint": "",
22330
22336
  "map.select.layer": "",
22331
22337
  "map.select.style": "",
22338
+ "map.style.default": "Standaard",
22332
22339
  "map.wfs.urlInput.hint": "",
22333
22340
  "map.wms.urlInput.hint": "",
22334
22341
  "multiselect.filter.placeholder": "",
@@ -23001,6 +23008,7 @@ var pt = {
23001
23008
  "map.ogc.urlInput.hint": "",
23002
23009
  "map.select.layer": "",
23003
23010
  "map.select.style": "",
23011
+ "map.style.default": "Padrão",
23004
23012
  "map.wfs.urlInput.hint": "",
23005
23013
  "map.wms.urlInput.hint": "",
23006
23014
  "multiselect.filter.placeholder": "",
@@ -23673,6 +23681,7 @@ var sk = {
23673
23681
  "map.ogc.urlInput.hint": "",
23674
23682
  "map.select.layer": "Zdroj dát",
23675
23683
  "map.select.style": "",
23684
+ "map.style.default": "Predvolené",
23676
23685
  "map.wfs.urlInput.hint": "Zadajte URL adresu služby WFS",
23677
23686
  "map.wms.urlInput.hint": "Zadajte URL adresu služby WMS",
23678
23687
  "multiselect.filter.placeholder": "Hľadať",
@@ -24528,34 +24537,23 @@ class ThemeService {
24528
24537
  static getColor(name) {
24529
24538
  return document.documentElement.style.getPropertyValue(`--color-${name}`);
24530
24539
  }
24531
- static generateBgOpacityClasses(colorName, colorValue, opacities = [0, 10, 25, 50, 75]) {
24532
- const color = chroma(colorValue);
24533
- const styleElement = document.createElement('style');
24534
- styleElement.innerHTML = opacities.reduce((cssRules, opacity) => {
24535
- cssRules += `.bg-${colorName}-opacity-${opacity}{background-color:${color
24536
- .alpha(opacity / 100)
24537
- .css()};}`;
24538
- cssRules += `.hover-bg-${colorName}-opacity-${opacity}:hover {background-color:${color
24539
- .alpha(opacity / 100)
24540
- .css()};}`;
24541
- return cssRules;
24542
- }, '');
24543
- document.getElementsByTagName('head')[0].appendChild(styleElement);
24544
- }
24545
24540
  static applyCssVariables(primaryColor, secondaryColor, mainColor, backgroundColor, mainFont, titleFont, fontsStylesheetUrl) {
24546
- const applyColor = (name, color) => {
24541
+ const applyColor = (name, color, includeRawValues) => {
24547
24542
  document.documentElement.style.setProperty(`--color-${name}`, color.css());
24543
+ if (includeRawValues) {
24544
+ document.documentElement.style.setProperty(`--color-raw-${name}`, color.css().replace(/^rgba?\((.*)\)/, '$1'));
24545
+ }
24548
24546
  };
24549
24547
  const black = chroma('black');
24550
24548
  const white = chroma('white');
24551
- applyColor('primary', chroma(primaryColor));
24549
+ applyColor('primary', chroma(primaryColor), true);
24552
24550
  applyColor('primary-lighter', chroma.scale([primaryColor, white]).mode('lab')(0.3));
24553
24551
  applyColor('primary-lightest', chroma.scale([primaryColor, white]).mode('lab')(0.6));
24554
24552
  applyColor('primary-white', chroma.scale([primaryColor, white]).mode('lab')(0.85));
24555
24553
  applyColor('primary-darker', chroma.scale([primaryColor, black]).mode('lab')(0.3));
24556
24554
  applyColor('primary-darkest', chroma.scale([primaryColor, black]).mode('lab')(0.6));
24557
24555
  applyColor('primary-black', chroma.scale([primaryColor, black]).mode('lab')(0.85));
24558
- applyColor('secondary', chroma(secondaryColor));
24556
+ applyColor('secondary', chroma(secondaryColor), true);
24559
24557
  applyColor('secondary-lighter', chroma.scale([secondaryColor, white]).mode('lab')(0.3));
24560
24558
  applyColor('secondary-lightest', chroma.scale([secondaryColor, white]).mode('lab')(0.6));
24561
24559
  applyColor('secondary-white', chroma.scale([secondaryColor, white]).mode('lab')(0.85));
@@ -25386,9 +25384,11 @@ async function getLayers(url, serviceProtocol) {
25386
25384
  case 'wfs': {
25387
25385
  const endpointWfs = await new WfsEndpoint(url).isReady();
25388
25386
  const featureTypes = await endpointWfs.getFeatureTypes();
25389
- const layers = await Promise.all(featureTypes.map(async (collection) => {
25390
- return await endpointWfs.getFeatureTypeFull(collection.name);
25391
- }));
25387
+ const layers = (await Promise.allSettled(featureTypes.map((collection) => {
25388
+ return endpointWfs.getFeatureTypeFull(collection.name);
25389
+ })))
25390
+ .filter((settled) => settled.status === 'fulfilled')
25391
+ .map((fulfilled) => fulfilled.value);
25392
25392
  return layers;
25393
25393
  }
25394
25394
  case 'wms': {
@@ -25519,7 +25519,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
25519
25519
  }] } });
25520
25520
 
25521
25521
  var name = "geonetwork-ui";
25522
- var version = "2.9.0-dev.388501cd7";
25522
+ var version = "2.9.0-dev.3b1e90427";
25523
25523
  var engines = {
25524
25524
  node: ">=20"
25525
25525
  };
@@ -25559,11 +25559,11 @@ var peerDependencies = {
25559
25559
  };
25560
25560
  var dependencies = {
25561
25561
  "@biesbjerg/ngx-translate-extract-marker": "~1.0.0",
25562
- "@camptocamp/ogc-client": "1.3.1-dev.1d137ae",
25563
- "@geospatial-sdk/core": "0.0.5-dev.42",
25564
- "@geospatial-sdk/geocoding": "0.0.5-dev.42",
25565
- "@geospatial-sdk/legend": "0.0.5-dev.42",
25566
- "@geospatial-sdk/openlayers": "0.0.5-dev.42",
25562
+ "@camptocamp/ogc-client": "1.3.1-dev.12086e8",
25563
+ "@geospatial-sdk/core": "0.0.5-dev.61",
25564
+ "@geospatial-sdk/geocoding": "0.0.5-dev.61",
25565
+ "@geospatial-sdk/legend": "0.0.5-dev.61",
25566
+ "@geospatial-sdk/openlayers": "0.0.5-dev.61",
25567
25567
  "@ltd/j-toml": "~1.35.2",
25568
25568
  "@messageformat/core": "^3.0.1",
25569
25569
  "@ng-icons/core": "29.10.0",
@@ -25589,7 +25589,7 @@ var dependencies = {
25589
25589
  "ngx-chips": "3.0.0",
25590
25590
  "ngx-dropzone": "3.1.0",
25591
25591
  "ngx-translate-messageformat-compiler": "~7.1.0",
25592
- ol: "^8.2.0",
25592
+ ol: "^10.0.0",
25593
25593
  papaparse: "5.4.1",
25594
25594
  pg: "^8.9.0",
25595
25595
  proj4: "^2.9.2",
@@ -28177,8 +28177,9 @@ function getCustomTranslations(langCode) {
28177
28177
  return langCode in customTranslations ? customTranslations[langCode] : {};
28178
28178
  }
28179
28179
  let appConfigLoaded = false;
28180
- function loadAppConfig() {
28181
- return fetch('assets/configuration/default.toml')
28180
+ function loadAppConfig(configUrl = 'assets/configuration/default.toml') {
28181
+ console.log(`[geonetwork-ui] Loading application configuration from ${configUrl}`);
28182
+ return fetch(configUrl)
28182
28183
  .then((resp) => {
28183
28184
  if (!resp.ok)
28184
28185
  throw new Error('Configuration file could not be loaded');
@@ -32021,7 +32022,10 @@ function reducerSearch(state, action) {
32021
32022
  },
32022
32023
  };
32023
32024
  }
32025
+ // From router.effects
32026
+ // From home - fuzzy-search - search.service
32024
32027
  case SET_FILTERS: {
32028
+ console.log('reducerSearch - SET_FILTERS', action.payload);
32025
32029
  return {
32026
32030
  ...state,
32027
32031
  params: {
@@ -32042,6 +32046,7 @@ function reducerSearch(state, action) {
32042
32046
  },
32043
32047
  };
32044
32048
  }
32049
+ // From results WC
32045
32050
  case SET_SEARCH: {
32046
32051
  return {
32047
32052
  ...state,
@@ -32551,10 +32556,12 @@ class SearchService {
32551
32556
  this.facade = inject(SearchFacade);
32552
32557
  }
32553
32558
  setSortAndFilters(filters, sort) {
32559
+ console.log('SearchService - setSortAndFilters', { filters, sort });
32554
32560
  this.setFilters(filters);
32555
32561
  this.setSortBy(sort);
32556
32562
  }
32557
32563
  updateFilters(params) {
32564
+ console.log('SearchService - updateFilters', params);
32558
32565
  this.facade.searchFilters$
32559
32566
  .pipe(first$1(), map$1((filters) => ({ ...filters, ...params })))
32560
32567
  .subscribe((filters) => this.facade.setFilters(filters));
@@ -33149,7 +33156,7 @@ class ApiCardComponent {
33149
33156
  }
33150
33157
  }
33151
33158
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33152
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ApiCardComponent, isStandalone: true, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink", size: "size" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >record.metadata.api.accessServiceProtocol.{{\n link.accessServiceProtocol\n }}</span\n >\n }\n @if (link.accessServiceProtocol === 'GPFDL') {\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n }\n </div>\n @if (size === 'S') {\n <div>\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
33159
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ApiCardComponent, isStandalone: true, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink", size: "size" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >record.metadata.api.accessServiceProtocol.{{\n link.accessServiceProtocol\n }}</span\n >\n }\n @if (link.accessServiceProtocol === 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n }\n </div>\n @if (size === 'S') {\n <div>\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
33153
33160
  provideIcons({
33154
33161
  iconoirSettings,
33155
33162
  }),
@@ -33174,7 +33181,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
33174
33181
  provideNgIconsConfig({
33175
33182
  size: '1.5em',
33176
33183
  }),
33177
- ], template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >record.metadata.api.accessServiceProtocol.{{\n link.accessServiceProtocol\n }}</span\n >\n }\n @if (link.accessServiceProtocol === 'GPFDL') {\n <span\n class=\"bg-primary-opacity-50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n }\n </div>\n @if (size === 'S') {\n <div>\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n </div>\n</ng-template>\n" }]
33184
+ ], template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >record.metadata.api.accessServiceProtocol.{{\n link.accessServiceProtocol\n }}</span\n >\n }\n @if (link.accessServiceProtocol === 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n }\n </div>\n @if (size === 'S') {\n <div>\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n </div>\n</ng-template>\n" }]
33178
33185
  }], propDecorators: { link: [{
33179
33186
  type: Input
33180
33187
  }], currentLink: [{
@@ -33776,7 +33783,7 @@ class ImageInputComponent {
33776
33783
  provideNgIconsConfig({
33777
33784
  size: '1.5rem',
33778
33785
  }),
33779
- ], ngImport: i0, template: "@if (previewUrl) {\n <div class=\"w-80 h-full flex flex-col gap-2\">\n <gn-ui-image-overlay-preview class=\"h-48\" [imageUrl]=\"previewUrl\">\n </gn-ui-image-overlay-preview>\n @if (showAltTextInput) {\n <gn-ui-text-input\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText ?? ''\"\n (valueChange)=\"handleAltTextChange($event)\"\n extraClass=\"gn-ui-editor-textarea\"\n ></gn-ui-text-input>\n }\n <div class=\"flex flex-row gap-2 mt-2\">\n <gn-ui-button\n type=\"gray\"\n (buttonClick)=\"handleDelete()\"\n data-cy=\"delete-image\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirBin\"></ng-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n @if (!showAltTextInput) {\n <gn-ui-button type=\"gray\" (buttonClick)=\"toggleAltTextInput()\">\n <ng-icon name=\"iconoirPlus\" class=\"me-1 text-primary\"></ng-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n }\n </div>\n </div>\n} @else {\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"flex-1 border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center gap-4 transition-colors duration-100\"\n [ngClass]=\"{\n 'border-primary-lighter bg-primary-white': dragFilesOver,\n 'border-gray-300': !dragFilesOver,\n 'cursor-pointer hover:border-gray-500': !getIsActionBlocked(),\n 'cursor-not-allowed': disabled,\n }\"\n [attr.tabindex]=\"getIsActionBlocked() ? null : 0\"\n (keydown.enter)=\"fileInput.click()\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n @if (!isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n @if (!dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirMediaImage\"\n ></ng-icon>\n }\n @if (dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirFramePlusIn\"\n ></ng-icon>\n }\n </div>\n }\n @if (isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 grid items-center justify-center relative\">\n <div class=\"text-gray-100 absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"100\"\n ></mat-progress-spinner>\n </div>\n <div class=\"text-primary absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n </div>\n <span class=\"text-sm text-main font-bold\">{{ uploadProgress }}%</span>\n </div>\n }\n @if (imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n <ng-icon\n name=\"iconoirMediaImageXmark\"\n class=\"place-self-center text-rose-500\"\n data-cy=\"imgErrorIcon\"\n ></ng-icon>\n </div>\n }\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\" data-cy=\"imgInputMsgPrimary\">\n {{ getPrimaryText() | translate }}\n </p>\n <p\n class=\"text-sm\"\n data-cy=\"imgInputMsgSecondary\"\n [class]=\"\n isUploadInProgress\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick($event)\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n #fileInput\n accept=\"image/*\"\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n />\n </label>\n @if (!showUrlInput) {\n <div class=\"flex-none mt-2\">\n <gn-ui-button\n data-cy=\"imgUrlBtn\"\n (buttonClick)=\"displayUrlInput()\"\n type=\"gray\"\n [disabled]=\"disabled\"\n [extraClass]=\"disabled && 'cursor-not-allowed'\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirLink\"></ng-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n }\n @if (showUrlInput) {\n <gn-ui-url-input\n class=\"mt-3.5\"\n data-cy=\"imgUrlInput\"\n (uploadClick)=\"downloadUrl($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n >\n </gn-ui-url-input>\n }\n </div>\n}\n", styles: [":host{--gn-ui-button-padding: 8px 8px;--gn-ui-button-rounded: 8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "directive", type: FilesDropDirective, selector: "[gnUiFilesDrop]", outputs: ["dragFilesOver", "dropFiles"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: UrlInputComponent, selector: "gn-ui-url-input", inputs: ["value", "extraClass", "placeholder", "disabled", "showValidateButton", "resetUrlOnChange"], outputs: ["valueChange", "uploadClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: ["imageUrl"], outputs: ["isPlaceholderShown"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33786
+ ], ngImport: i0, template: "@if (previewUrl) {\n <div class=\"w-[314px] h-full flex flex-col gap-2\">\n <gn-ui-image-overlay-preview\n class=\"w-[314px] h-[314px]\"\n [imageUrl]=\"previewUrl\"\n >\n </gn-ui-image-overlay-preview>\n @if (showAltTextInput) {\n <gn-ui-text-input\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText ?? ''\"\n (valueChange)=\"handleAltTextChange($event)\"\n extraClass=\"gn-ui-editor-textarea\"\n ></gn-ui-text-input>\n }\n <div class=\"flex flex-row gap-2 mt-2\">\n <gn-ui-button\n type=\"gray\"\n (buttonClick)=\"handleDelete()\"\n data-cy=\"delete-image\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirBin\"></ng-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n @if (!showAltTextInput) {\n <gn-ui-button type=\"gray\" (buttonClick)=\"toggleAltTextInput()\">\n <ng-icon name=\"iconoirPlus\" class=\"me-1 text-primary\"></ng-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n }\n </div>\n </div>\n} @else {\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"flex-1 border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center gap-4 transition-colors duration-100\"\n [ngClass]=\"{\n 'border-primary-lighter bg-primary-white': dragFilesOver,\n 'border-gray-300': !dragFilesOver,\n 'cursor-pointer hover:border-gray-500': !getIsActionBlocked(),\n 'cursor-not-allowed': disabled,\n }\"\n [attr.tabindex]=\"getIsActionBlocked() ? null : 0\"\n (keydown.enter)=\"fileInput.click()\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n @if (!isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n @if (!dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirMediaImage\"\n ></ng-icon>\n }\n @if (dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirFramePlusIn\"\n ></ng-icon>\n }\n </div>\n }\n @if (isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 grid items-center justify-center relative\">\n <div class=\"text-gray-100 absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"100\"\n ></mat-progress-spinner>\n </div>\n <div class=\"text-primary absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n </div>\n <span class=\"text-sm text-main font-bold\">{{ uploadProgress }}%</span>\n </div>\n }\n @if (imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n <ng-icon\n name=\"iconoirMediaImageXmark\"\n class=\"place-self-center text-rose-500\"\n data-cy=\"imgErrorIcon\"\n ></ng-icon>\n </div>\n }\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\" data-cy=\"imgInputMsgPrimary\">\n {{ getPrimaryText() | translate }}\n </p>\n <p\n class=\"text-sm\"\n data-cy=\"imgInputMsgSecondary\"\n [class]=\"\n isUploadInProgress\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick($event)\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n #fileInput\n accept=\"image/*\"\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n />\n </label>\n @if (!showUrlInput) {\n <div class=\"flex-none mt-2\">\n <gn-ui-button\n data-cy=\"imgUrlBtn\"\n (buttonClick)=\"displayUrlInput()\"\n type=\"gray\"\n [disabled]=\"disabled\"\n [extraClass]=\"disabled && 'cursor-not-allowed'\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirLink\"></ng-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n }\n @if (showUrlInput) {\n <gn-ui-url-input\n class=\"mt-3.5\"\n data-cy=\"imgUrlInput\"\n (uploadClick)=\"downloadUrl($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n >\n </gn-ui-url-input>\n }\n </div>\n}\n", styles: [":host{--gn-ui-button-padding: 8px 8px;--gn-ui-button-rounded: 8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "directive", type: FilesDropDirective, selector: "[gnUiFilesDrop]", outputs: ["dragFilesOver", "dropFiles"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: UrlInputComponent, selector: "gn-ui-url-input", inputs: ["value", "extraClass", "placeholder", "disabled", "showValidateButton", "resetUrlOnChange"], outputs: ["valueChange", "uploadClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: ["imageUrl"], outputs: ["isPlaceholderShown"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33780
33787
  }
33781
33788
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ImageInputComponent, decorators: [{
33782
33789
  type: Component,
@@ -33802,7 +33809,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
33802
33809
  provideNgIconsConfig({
33803
33810
  size: '1.5rem',
33804
33811
  }),
33805
- ], template: "@if (previewUrl) {\n <div class=\"w-80 h-full flex flex-col gap-2\">\n <gn-ui-image-overlay-preview class=\"h-48\" [imageUrl]=\"previewUrl\">\n </gn-ui-image-overlay-preview>\n @if (showAltTextInput) {\n <gn-ui-text-input\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText ?? ''\"\n (valueChange)=\"handleAltTextChange($event)\"\n extraClass=\"gn-ui-editor-textarea\"\n ></gn-ui-text-input>\n }\n <div class=\"flex flex-row gap-2 mt-2\">\n <gn-ui-button\n type=\"gray\"\n (buttonClick)=\"handleDelete()\"\n data-cy=\"delete-image\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirBin\"></ng-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n @if (!showAltTextInput) {\n <gn-ui-button type=\"gray\" (buttonClick)=\"toggleAltTextInput()\">\n <ng-icon name=\"iconoirPlus\" class=\"me-1 text-primary\"></ng-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n }\n </div>\n </div>\n} @else {\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"flex-1 border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center gap-4 transition-colors duration-100\"\n [ngClass]=\"{\n 'border-primary-lighter bg-primary-white': dragFilesOver,\n 'border-gray-300': !dragFilesOver,\n 'cursor-pointer hover:border-gray-500': !getIsActionBlocked(),\n 'cursor-not-allowed': disabled,\n }\"\n [attr.tabindex]=\"getIsActionBlocked() ? null : 0\"\n (keydown.enter)=\"fileInput.click()\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n @if (!isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n @if (!dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirMediaImage\"\n ></ng-icon>\n }\n @if (dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirFramePlusIn\"\n ></ng-icon>\n }\n </div>\n }\n @if (isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 grid items-center justify-center relative\">\n <div class=\"text-gray-100 absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"100\"\n ></mat-progress-spinner>\n </div>\n <div class=\"text-primary absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n </div>\n <span class=\"text-sm text-main font-bold\">{{ uploadProgress }}%</span>\n </div>\n }\n @if (imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n <ng-icon\n name=\"iconoirMediaImageXmark\"\n class=\"place-self-center text-rose-500\"\n data-cy=\"imgErrorIcon\"\n ></ng-icon>\n </div>\n }\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\" data-cy=\"imgInputMsgPrimary\">\n {{ getPrimaryText() | translate }}\n </p>\n <p\n class=\"text-sm\"\n data-cy=\"imgInputMsgSecondary\"\n [class]=\"\n isUploadInProgress\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick($event)\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n #fileInput\n accept=\"image/*\"\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n />\n </label>\n @if (!showUrlInput) {\n <div class=\"flex-none mt-2\">\n <gn-ui-button\n data-cy=\"imgUrlBtn\"\n (buttonClick)=\"displayUrlInput()\"\n type=\"gray\"\n [disabled]=\"disabled\"\n [extraClass]=\"disabled && 'cursor-not-allowed'\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirLink\"></ng-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n }\n @if (showUrlInput) {\n <gn-ui-url-input\n class=\"mt-3.5\"\n data-cy=\"imgUrlInput\"\n (uploadClick)=\"downloadUrl($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n >\n </gn-ui-url-input>\n }\n </div>\n}\n", styles: [":host{--gn-ui-button-padding: 8px 8px;--gn-ui-button-rounded: 8px}\n"] }]
33812
+ ], template: "@if (previewUrl) {\n <div class=\"w-[314px] h-full flex flex-col gap-2\">\n <gn-ui-image-overlay-preview\n class=\"w-[314px] h-[314px]\"\n [imageUrl]=\"previewUrl\"\n >\n </gn-ui-image-overlay-preview>\n @if (showAltTextInput) {\n <gn-ui-text-input\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText ?? ''\"\n (valueChange)=\"handleAltTextChange($event)\"\n extraClass=\"gn-ui-editor-textarea\"\n ></gn-ui-text-input>\n }\n <div class=\"flex flex-row gap-2 mt-2\">\n <gn-ui-button\n type=\"gray\"\n (buttonClick)=\"handleDelete()\"\n data-cy=\"delete-image\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirBin\"></ng-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n @if (!showAltTextInput) {\n <gn-ui-button type=\"gray\" (buttonClick)=\"toggleAltTextInput()\">\n <ng-icon name=\"iconoirPlus\" class=\"me-1 text-primary\"></ng-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n }\n </div>\n </div>\n} @else {\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"flex-1 border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center gap-4 transition-colors duration-100\"\n [ngClass]=\"{\n 'border-primary-lighter bg-primary-white': dragFilesOver,\n 'border-gray-300': !dragFilesOver,\n 'cursor-pointer hover:border-gray-500': !getIsActionBlocked(),\n 'cursor-not-allowed': disabled,\n }\"\n [attr.tabindex]=\"getIsActionBlocked() ? null : 0\"\n (keydown.enter)=\"fileInput.click()\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n @if (!isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n @if (!dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirMediaImage\"\n ></ng-icon>\n }\n @if (dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirFramePlusIn\"\n ></ng-icon>\n }\n </div>\n }\n @if (isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 grid items-center justify-center relative\">\n <div class=\"text-gray-100 absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"100\"\n ></mat-progress-spinner>\n </div>\n <div class=\"text-primary absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n </div>\n <span class=\"text-sm text-main font-bold\">{{ uploadProgress }}%</span>\n </div>\n }\n @if (imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n <ng-icon\n name=\"iconoirMediaImageXmark\"\n class=\"place-self-center text-rose-500\"\n data-cy=\"imgErrorIcon\"\n ></ng-icon>\n </div>\n }\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\" data-cy=\"imgInputMsgPrimary\">\n {{ getPrimaryText() | translate }}\n </p>\n <p\n class=\"text-sm\"\n data-cy=\"imgInputMsgSecondary\"\n [class]=\"\n isUploadInProgress\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick($event)\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n #fileInput\n accept=\"image/*\"\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n />\n </label>\n @if (!showUrlInput) {\n <div class=\"flex-none mt-2\">\n <gn-ui-button\n data-cy=\"imgUrlBtn\"\n (buttonClick)=\"displayUrlInput()\"\n type=\"gray\"\n [disabled]=\"disabled\"\n [extraClass]=\"disabled && 'cursor-not-allowed'\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirLink\"></ng-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n }\n @if (showUrlInput) {\n <gn-ui-url-input\n class=\"mt-3.5\"\n data-cy=\"imgUrlInput\"\n (uploadClick)=\"downloadUrl($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n >\n </gn-ui-url-input>\n }\n </div>\n}\n", styles: [":host{--gn-ui-button-padding: 8px 8px;--gn-ui-button-rounded: 8px}\n"] }]
33806
33813
  }], propDecorators: { previewUrl: [{
33807
33814
  type: Input
33808
33815
  }], altText: [{
@@ -34555,7 +34562,7 @@ class RecordApiFormComponent {
34555
34562
  }
34556
34563
  }
34557
34564
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34558
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordApiFormComponent, isStandalone: true, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n @if (!supportOffset) {\n <div class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\">\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34565
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordApiFormComponent, isStandalone: true, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n @if (!supportOffset) {\n <div class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\">\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34559
34566
  }
34560
34567
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordApiFormComponent, decorators: [{
34561
34568
  type: Component,
@@ -34566,7 +34573,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
34566
34573
  CopyTextButtonComponent,
34567
34574
  TranslateDirective,
34568
34575
  MatTooltipModule,
34569
- ], template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n @if (!supportOffset) {\n <div class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\">\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"] }]
34576
+ ], template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n @if (!supportOffset) {\n <div class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\">\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"] }]
34570
34577
  }], propDecorators: { apiLink: [{
34571
34578
  type: Input
34572
34579
  }] } });
@@ -34669,13 +34676,12 @@ class ApplicationBannerComponent {
34669
34676
  this.icon = 'matWarning';
34670
34677
  break;
34671
34678
  case 'light':
34672
- this.msgClass =
34673
- 'bg-primary-opacity-10 border-primary-lightest text-black';
34679
+ this.msgClass = 'bg-primary/10 border-primary-lightest text-black';
34674
34680
  this.icon = 'matInfoOutline';
34675
34681
  break;
34676
34682
  case 'secondary':
34677
34683
  default:
34678
- this.msgClass = 'bg-primary-opacity-50 border-primary-darker text-black';
34684
+ this.msgClass = 'bg-primary/50 border-primary-darker text-black';
34679
34685
  this.icon = 'matWarningAmberOutline';
34680
34686
  break;
34681
34687
  }
@@ -34764,7 +34770,7 @@ class InternalLinkCardComponent {
34764
34770
  provideNgIconsConfig({
34765
34771
  size: '1.2em',
34766
34772
  }),
34767
- ], ngImport: i0, template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2 h-full\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n <div class=\"record-card__footer\">\n @if (record.ownerOrganization?.name) {\n <div\n data-cy=\"recordOrg\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n @if (!displayContactIconOnly) {\n <span\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n }\n </div>\n }\n <div class=\"record-card__footer__other\">\n <div\n class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\"\n >\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n @if (metadataQualityDisplay) {\n <gn-ui-metadata-quality\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [popoverDisplay]=\"true\"\n ></gn-ui-metadata-quality>\n }\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n</a>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] md:h-[231px] gap-4;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-full w-[190px] h-[184px];}.size-M .record-card__thumbnail{@apply w-full w-[138px] h-[207px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title{@apply line-clamp-2;}.size-M .record-card__title{@apply line-clamp-2 ml-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract{@apply line-clamp-3;}.size-M .record-card__abstract{@apply line-clamp-3 ml-2;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay", "popoverDisplay", "propsToValidate", "forceComputeScore"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: KindBadgeComponent, selector: "gn-ui-kind-badge", inputs: ["styling", "contentTemplate", "kind", "extraClass"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
34773
+ ], ngImport: i0, template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2\" [class.h-full]=\"size !== 'M'\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n @if (size !== 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n </div>\n </div>\n @if (size === 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n</a>\n\n<ng-template #footerTpl>\n <div class=\"record-card__footer\">\n @if (record.ownerOrganization?.name) {\n <div\n data-cy=\"recordOrg\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n @if (!displayContactIconOnly) {\n <span\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n }\n </div>\n }\n <div class=\"record-card__footer__other\">\n <div class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\">\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n @if (metadataQualityDisplay) {\n <gn-ui-metadata-quality\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [popoverDisplay]=\"true\"\n ></gn-ui-metadata-quality>\n }\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] gap-4 flex-wrap;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-[184px] h-[184px];}.size-M .record-card__thumbnail{@apply w-[138px] h-[138px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title,.size-M .record-card__title{@apply line-clamp-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract,.size-M .record-card__abstract{@apply line-clamp-3;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay", "popoverDisplay", "propsToValidate", "forceComputeScore"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: KindBadgeComponent, selector: "gn-ui-kind-badge", inputs: ["styling", "contentTemplate", "kind", "extraClass"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
34768
34774
  }
34769
34775
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
34770
34776
  type: Component,
@@ -34784,7 +34790,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
34784
34790
  provideNgIconsConfig({
34785
34791
  size: '1.2em',
34786
34792
  }),
34787
- ], template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2 h-full\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n <div class=\"record-card__footer\">\n @if (record.ownerOrganization?.name) {\n <div\n data-cy=\"recordOrg\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n @if (!displayContactIconOnly) {\n <span\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n }\n </div>\n }\n <div class=\"record-card__footer__other\">\n <div\n class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\"\n >\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n @if (metadataQualityDisplay) {\n <gn-ui-metadata-quality\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [popoverDisplay]=\"true\"\n ></gn-ui-metadata-quality>\n }\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n</a>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] md:h-[231px] gap-4;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-full w-[190px] h-[184px];}.size-M .record-card__thumbnail{@apply w-full w-[138px] h-[207px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title{@apply line-clamp-2;}.size-M .record-card__title{@apply line-clamp-2 ml-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract{@apply line-clamp-3;}.size-M .record-card__abstract{@apply line-clamp-3 ml-2;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"] }]
34793
+ ], template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2\" [class.h-full]=\"size !== 'M'\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n @if (size !== 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n </div>\n </div>\n @if (size === 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n</a>\n\n<ng-template #footerTpl>\n <div class=\"record-card__footer\">\n @if (record.ownerOrganization?.name) {\n <div\n data-cy=\"recordOrg\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n @if (!displayContactIconOnly) {\n <span\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n }\n </div>\n }\n <div class=\"record-card__footer__other\">\n <div class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\">\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n @if (metadataQualityDisplay) {\n <gn-ui-metadata-quality\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [popoverDisplay]=\"true\"\n ></gn-ui-metadata-quality>\n }\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] gap-4 flex-wrap;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-[184px] h-[184px];}.size-M .record-card__thumbnail{@apply w-[138px] h-[138px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title,.size-M .record-card__title{@apply line-clamp-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract,.size-M .record-card__abstract{@apply line-clamp-3;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"] }]
34788
34794
  }], propDecorators: { record: [{
34789
34795
  type: Input
34790
34796
  }], linkTarget: [{
@@ -34922,7 +34928,7 @@ class ServiceCapabilitiesComponent {
34922
34928
  : `h-8 rounded-lg`;
34923
34929
  }
34924
34930
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ServiceCapabilitiesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34925
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ServiceCapabilitiesComponent, isStandalone: true, selector: "gn-ui-service-capabilities", inputs: { apiLinks: "apiLinks" }, ngImport: i0, template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary-opacity-10 overflow-visible\" style=\"height: 420px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n @if (loading) {\n <div class=\"flex justify-center w-full h-[200px] items-center\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n }\n @if (!loading) {\n <div>\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [(value)]=\"searchQuery\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div\n class=\"absolute right-14 h-14 w-14 flex items-center justify-center\"\n >\n @if (searchQuery) {\n <button\n #inputBtn\n [aria-label]=\"\n 'service.metadata.search.clear' | translate\n \"\n (click)=\"clearSearch()\"\n class=\"h-12 w-12 border-0 flex items-center justify-center\"\n >\n <ng-icon name=\"matClose\"></ng-icon>\n </button>\n }\n </div>\n <div\n class=\"border-l absolute border-gray-200 right-0 h-14 w-14\"\n >\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1 bg-white\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"w-6 h-6 pt-0.5\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n @for (layerItem of filteredLayers; track layerItem) {\n <gn-ui-button\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n }\n @if (filteredLayers.length === 0) {\n <span class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n }\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n @for (item of layerInformation; track item) {\n <div class=\"flex flex-row gap-4 border-b border-gray-200\">\n <span class=\"font-semibold w-24\">{{\n item.displayName\n }}</span>\n @if (isList(item.value)) {\n <div>\n @for (subItem of item.value; track subItem) {\n <div class=\"flex flex-row break-words max-w-72\">\n {{ subItem }}\n </div>\n }\n </div>\n }\n @if (!isList(item.value)) {\n <div class=\"break-words max-w-72\">\n {{ item.value }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
34931
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ServiceCapabilitiesComponent, isStandalone: true, selector: "gn-ui-service-capabilities", inputs: { apiLinks: "apiLinks" }, ngImport: i0, template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary/10 overflow-visible\" style=\"height: 420px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n @if (loading) {\n <div class=\"flex justify-center w-full h-[200px] items-center\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n }\n @if (!loading) {\n <div>\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [(value)]=\"searchQuery\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div\n class=\"absolute right-14 h-14 w-14 flex items-center justify-center\"\n >\n @if (searchQuery) {\n <button\n #inputBtn\n [aria-label]=\"\n 'service.metadata.search.clear' | translate\n \"\n (click)=\"clearSearch()\"\n class=\"h-12 w-12 border-0 flex items-center justify-center\"\n >\n <ng-icon name=\"matClose\"></ng-icon>\n </button>\n }\n </div>\n <div\n class=\"border-l absolute border-gray-200 right-0 h-14 w-14\"\n >\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1 bg-white\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"w-6 h-6 pt-0.5\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n @for (layerItem of filteredLayers; track layerItem) {\n <gn-ui-button\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n }\n @if (filteredLayers.length === 0) {\n <span class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n }\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n @for (item of layerInformation; track item) {\n <div class=\"flex flex-row gap-4 border-b border-gray-200\">\n <span class=\"font-semibold w-24\">{{\n item.displayName\n }}</span>\n @if (isList(item.value)) {\n <div>\n @for (subItem of item.value; track subItem) {\n <div class=\"flex flex-row break-words max-w-72\">\n {{ subItem }}\n </div>\n }\n </div>\n }\n @if (!isList(item.value)) {\n <div class=\"break-words max-w-72\">\n {{ item.value }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
34926
34932
  provideIcons({
34927
34933
  iconoirSearch,
34928
34934
  matInfoOutline,
@@ -34946,7 +34952,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
34946
34952
  matInfoOutline,
34947
34953
  matClose,
34948
34954
  }),
34949
- ], template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary-opacity-10 overflow-visible\" style=\"height: 420px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n @if (loading) {\n <div class=\"flex justify-center w-full h-[200px] items-center\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n }\n @if (!loading) {\n <div>\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [(value)]=\"searchQuery\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div\n class=\"absolute right-14 h-14 w-14 flex items-center justify-center\"\n >\n @if (searchQuery) {\n <button\n #inputBtn\n [aria-label]=\"\n 'service.metadata.search.clear' | translate\n \"\n (click)=\"clearSearch()\"\n class=\"h-12 w-12 border-0 flex items-center justify-center\"\n >\n <ng-icon name=\"matClose\"></ng-icon>\n </button>\n }\n </div>\n <div\n class=\"border-l absolute border-gray-200 right-0 h-14 w-14\"\n >\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1 bg-white\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"w-6 h-6 pt-0.5\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n @for (layerItem of filteredLayers; track layerItem) {\n <gn-ui-button\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n }\n @if (filteredLayers.length === 0) {\n <span class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n }\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n @for (item of layerInformation; track item) {\n <div class=\"flex flex-row gap-4 border-b border-gray-200\">\n <span class=\"font-semibold w-24\">{{\n item.displayName\n }}</span>\n @if (isList(item.value)) {\n <div>\n @for (subItem of item.value; track subItem) {\n <div class=\"flex flex-row break-words max-w-72\">\n {{ subItem }}\n </div>\n }\n </div>\n }\n @if (!isList(item.value)) {\n <div class=\"break-words max-w-72\">\n {{ item.value }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n" }]
34955
+ ], template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary/10 overflow-visible\" style=\"height: 420px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n @if (loading) {\n <div class=\"flex justify-center w-full h-[200px] items-center\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n }\n @if (!loading) {\n <div>\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [(value)]=\"searchQuery\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div\n class=\"absolute right-14 h-14 w-14 flex items-center justify-center\"\n >\n @if (searchQuery) {\n <button\n #inputBtn\n [aria-label]=\"\n 'service.metadata.search.clear' | translate\n \"\n (click)=\"clearSearch()\"\n class=\"h-12 w-12 border-0 flex items-center justify-center\"\n >\n <ng-icon name=\"matClose\"></ng-icon>\n </button>\n }\n </div>\n <div\n class=\"border-l absolute border-gray-200 right-0 h-14 w-14\"\n >\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1 bg-white\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"w-6 h-6 pt-0.5\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n @for (layerItem of filteredLayers; track layerItem) {\n <gn-ui-button\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n }\n @if (filteredLayers.length === 0) {\n <span class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n }\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n @for (item of layerInformation; track item) {\n <div class=\"flex flex-row gap-4 border-b border-gray-200\">\n <span class=\"font-semibold w-24\">{{\n item.displayName\n }}</span>\n @if (isList(item.value)) {\n <div>\n @for (subItem of item.value; track subItem) {\n <div class=\"flex flex-row break-words max-w-72\">\n {{ subItem }}\n </div>\n }\n </div>\n }\n @if (!isList(item.value)) {\n <div class=\"break-words max-w-72\">\n {{ item.value }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n" }]
34950
34956
  }], propDecorators: { apiLinks: [{
34951
34957
  type: Input
34952
34958
  }] } });
@@ -35335,7 +35341,7 @@ class RecordPreviewFeedComponent extends RecordPreviewComponent {
35335
35341
  return this.timeFormat.format(this.record.recordCreated, Date.now());
35336
35342
  }
35337
35343
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordPreviewFeedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35338
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordPreviewFeedComponent, isStandalone: true, selector: "gn-ui-record-preview-feed", usesInheritance: true, ngImport: i0, template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n </div>\n <div class=\"pt-5 pb-5 px-10 relative\">\n <div class=\"absolute top-[0.85em] right-[0.85em]\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n <h1\n class=\"font-title text-black text-[21px] font-medium mb-3 pr-8\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </h1>\n <p class=\"line-clamp-3\">\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n />\n </p>\n @if (record.overviews?.[0]) {\n <gn-ui-thumbnail\n class=\"block mt-3 w-full h-[136px] border border-gray-100 rounded-lg overflow-hidden\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n }\n @if (isDownloadable || isViewable) {\n <div class=\"flex flex-row mt-3\">\n @if (isDownloadable) {\n <ng-icon\n class=\"text-primary opacity-45 mr-3\"\n name=\"matCloudDownloadOutline\"\n >\n </ng-icon>\n }\n @if (isViewable) {\n <ng-icon class=\"text-primary opacity-45 mr-3\" name=\"matMapOutline\">\n </ng-icon>\n }\n </div>\n }\n </div>\n </a>\n</div>\n", styles: [".record-container:hover .record-header,.record-container:hover .record-header-image{border-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
35344
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordPreviewFeedComponent, isStandalone: true, selector: "gn-ui-record-preview-feed", usesInheritance: true, ngImport: i0, template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start grow\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n <div class=\"ml-3 shrink-0\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n <div class=\"pt-5 pb-5 px-10 relative\">\n <div class=\"flex flex-col sm:flex-row gap-4 mb-3\">\n @if (record.overviews?.[0]) {\n <gn-ui-thumbnail\n class=\"block shrink-0 w-[120px] h-[120px] border border-gray-100 rounded-lg overflow-hidden\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n }\n <h1\n class=\"font-title text-black text-[21px] font-medium\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </h1>\n </div>\n <p class=\"line-clamp-3\">\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n />\n </p>\n @if (isDownloadable || isViewable) {\n <div class=\"flex flex-row mt-3\">\n @if (isDownloadable) {\n <ng-icon\n class=\"text-primary opacity-45 mr-3\"\n name=\"matCloudDownloadOutline\"\n >\n </ng-icon>\n }\n @if (isViewable) {\n <ng-icon class=\"text-primary opacity-45 mr-3\" name=\"matMapOutline\">\n </ng-icon>\n }\n </div>\n }\n </div>\n </a>\n</div>\n", styles: [".record-container:hover .record-header,.record-container:hover .record-header-image{border-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
35339
35345
  provideIcons({
35340
35346
  matMapOutline,
35341
35347
  matCloudDownloadOutline,
@@ -35365,7 +35371,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
35365
35371
  provideNgIconsConfig({
35366
35372
  size: '1.5em',
35367
35373
  }),
35368
- ], template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n </div>\n <div class=\"pt-5 pb-5 px-10 relative\">\n <div class=\"absolute top-[0.85em] right-[0.85em]\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n <h1\n class=\"font-title text-black text-[21px] font-medium mb-3 pr-8\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </h1>\n <p class=\"line-clamp-3\">\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n />\n </p>\n @if (record.overviews?.[0]) {\n <gn-ui-thumbnail\n class=\"block mt-3 w-full h-[136px] border border-gray-100 rounded-lg overflow-hidden\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n ></gn-ui-thumbnail>\n }\n @if (isDownloadable || isViewable) {\n <div class=\"flex flex-row mt-3\">\n @if (isDownloadable) {\n <ng-icon\n class=\"text-primary opacity-45 mr-3\"\n name=\"matCloudDownloadOutline\"\n >\n </ng-icon>\n }\n @if (isViewable) {\n <ng-icon class=\"text-primary opacity-45 mr-3\" name=\"matMapOutline\">\n </ng-icon>\n }\n </div>\n }\n </div>\n </a>\n</div>\n", styles: [".record-container:hover .record-header,.record-container:hover .record-header-image{border-color:var(--color-primary-lightest)}\n"] }]
35374
+ ], template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start grow\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n <div class=\"ml-3 shrink-0\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n <div class=\"pt-5 pb-5 px-10 relative\">\n <div class=\"flex flex-col sm:flex-row gap-4 mb-3\">\n @if (record.overviews?.[0]) {\n <gn-ui-thumbnail\n class=\"block shrink-0 w-[120px] h-[120px] border border-gray-100 rounded-lg overflow-hidden\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n }\n <h1\n class=\"font-title text-black text-[21px] font-medium\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </h1>\n </div>\n <p class=\"line-clamp-3\">\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n />\n </p>\n @if (isDownloadable || isViewable) {\n <div class=\"flex flex-row mt-3\">\n @if (isDownloadable) {\n <ng-icon\n class=\"text-primary opacity-45 mr-3\"\n name=\"matCloudDownloadOutline\"\n >\n </ng-icon>\n }\n @if (isViewable) {\n <ng-icon class=\"text-primary opacity-45 mr-3\" name=\"matMapOutline\">\n </ng-icon>\n }\n </div>\n }\n </div>\n </a>\n</div>\n", styles: [".record-container:hover .record-header,.record-container:hover .record-header-image{border-color:var(--color-primary-lightest)}\n"] }]
35369
35375
  }], ctorParameters: () => [] });
35370
35376
 
35371
35377
  class RecordPreviewListComponent extends RecordPreviewComponent {
@@ -36158,6 +36164,7 @@ class FuzzySearchComponent {
36158
36164
  this.inputSubmitted.emit(any);
36159
36165
  }
36160
36166
  else {
36167
+ console.log('FuzzySearchComponent - handleInputSubmission', any);
36161
36168
  this.searchService.updateFilters({ any });
36162
36169
  }
36163
36170
  }
@@ -38381,12 +38388,12 @@ class DataService {
38381
38388
  throw new Error(`ogc.unreachable.unknown`);
38382
38389
  });
38383
38390
  }
38384
- async getItemsFromOgcApi(url) {
38391
+ async getItemsFromOgcApi(url, limit) {
38385
38392
  const endpoint = new OgcApiEndpoint(url);
38386
38393
  return await endpoint.featureCollections
38387
38394
  .then((collections) => {
38388
38395
  return collections.length
38389
- ? endpoint.getCollectionItems(collections[0])
38396
+ ? endpoint.getCollectionItems(collections[0], limit)
38390
38397
  : null;
38391
38398
  })
38392
38399
  .catch(() => {
@@ -38482,7 +38489,9 @@ class DataService {
38482
38489
  if (!geojsonUrl) {
38483
38490
  return throwError(() => 'ogc.geojson.notsupported');
38484
38491
  }
38485
- return openDataset(geojsonUrl, 'geojson', undefined, cacheActive);
38492
+ const urlWithoutLimit = new URL(geojsonUrl);
38493
+ urlWithoutLimit.searchParams.delete('limit');
38494
+ return openDataset(urlWithoutLimit.toString(), 'geojson', undefined, cacheActive);
38486
38495
  }));
38487
38496
  }
38488
38497
  return throwError(() => 'protocol not supported');
@@ -39159,7 +39168,7 @@ class ChartViewComponent {
39159
39168
  this.changeDetector.detectChanges();
39160
39169
  }
39161
39170
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ChartViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39162
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { featureCatalog: "featureCatalog", cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType", userChartConfig: "userChartConfig" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n @if (!isCountAggregation) {\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"yChoices\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n class=\"select-y-prop\"\n ></gn-ui-dropdown-selector>\n }\n }\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: ChartComponent, selector: "gn-ui-chart", inputs: ["data", "labelProperty", "prettyLabel", "valueProperty", "secondaryValueProperty", "type"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39171
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { featureCatalog: "featureCatalog", cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType", userChartConfig: "userChartConfig" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n <gn-ui-dropdown-selector\n class=\"basis-1/4 select-y-prop\"\n [choices]=\"yChoices\"\n [disabled]=\"isCountAggregation\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n ></gn-ui-dropdown-selector>\n }\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: ChartComponent, selector: "gn-ui-chart", inputs: ["data", "labelProperty", "prettyLabel", "valueProperty", "secondaryValueProperty", "type"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39163
39172
  }
39164
39173
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ChartViewComponent, decorators: [{
39165
39174
  type: Component,
@@ -39170,7 +39179,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
39170
39179
  LoadingMaskComponent,
39171
39180
  PopupAlertComponent,
39172
39181
  TranslatePipe,
39173
- ], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n @if (!isCountAggregation) {\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"yChoices\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n class=\"select-y-prop\"\n ></gn-ui-dropdown-selector>\n }\n }\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n" }]
39182
+ ], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n <gn-ui-dropdown-selector\n class=\"basis-1/4 select-y-prop\"\n [choices]=\"yChoices\"\n [disabled]=\"isCountAggregation\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n ></gn-ui-dropdown-selector>\n }\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n" }]
39174
39183
  }], propDecorators: { featureCatalog: [{
39175
39184
  type: Input
39176
39185
  }], cacheActive: [{
@@ -39483,7 +39492,7 @@ class MdViewFacade {
39483
39492
  if (this.linkClassifier.hasUsage(link, LinkUsage.GEODATA)) {
39484
39493
  if (link.type === 'service' &&
39485
39494
  link.accessServiceProtocol === 'ogcFeatures') {
39486
- return from(this.dataService.getItemsFromOgcApi(link.url.href)).pipe(map$1((collectionRecords) => {
39495
+ return from(this.dataService.getItemsFromOgcApi(link.url.href, 1)).pipe(map$1((collectionRecords) => {
39487
39496
  return collectionRecords &&
39488
39497
  collectionRecords[0] &&
39489
39498
  collectionRecords[0].geometry
@@ -39901,6 +39910,7 @@ class ExternalViewerButtonComponent {
39901
39910
  this.translateService = inject(TranslateService);
39902
39911
  this.urlTemplate = inject(EXTERNAL_VIEWER_URL_TEMPLATE, { optional: true });
39903
39912
  this.openinNewTab = inject(EXTERNAL_VIEWER_OPEN_NEW_TAB);
39913
+ this.mimeType = '';
39904
39914
  this.extraClass = '';
39905
39915
  }
39906
39916
  get externalViewer() {
@@ -39931,11 +39941,12 @@ class ExternalViewerButtonComponent {
39931
39941
  const url = templateUrl
39932
39942
  .replace('${layer_name}', `${layerName}`)
39933
39943
  .replace('${service_url}', `${encodeURIComponent(this.link.url.toString())}`)
39934
- .replace('${service_type}', `${this.supportedLinkLayerType}`);
39944
+ .replace('${service_type}', `${this.supportedLinkLayerType}`)
39945
+ .replace('${mime_type}', `${encodeURIComponent(this.mimeType)}`);
39935
39946
  window.open(url, this.openinNewTab ? '_blank' : '_self').focus();
39936
39947
  }
39937
39948
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ExternalViewerButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39938
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ExternalViewerButtonComponent, isStandalone: true, selector: "gn-ui-external-viewer-button", inputs: { link: "link", extraClass: "extraClass" }, ngImport: i0, template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
39949
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ExternalViewerButtonComponent, isStandalone: true, selector: "gn-ui-external-viewer-button", inputs: { link: "link", mimeType: "mimeType", extraClass: "extraClass" }, ngImport: i0, template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
39939
39950
  provideIcons({ matOpenInNew }),
39940
39951
  provideNgIconsConfig({
39941
39952
  size: '1.5em',
@@ -39952,6 +39963,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
39952
39963
  ], template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n" }]
39953
39964
  }], propDecorators: { link: [{
39954
39965
  type: Input
39966
+ }], mimeType: [{
39967
+ type: Input
39955
39968
  }], extraClass: [{
39956
39969
  type: Input
39957
39970
  }] } });
@@ -40147,7 +40160,7 @@ class GpfApiDlComponent {
40147
40160
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
40148
40161
  }
40149
40162
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GpfApiDlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
40150
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: GpfApiDlComponent, isStandalone: true, selector: "gn-ui-gpf-api-dl", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-4 py-2 text-white rounded hover:bg-primary transition\"\n [attr.title]=\"'record.metadata.api.form.resetTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.resetTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.reset</span>\n </button>\n </div>\n\n <!-- Dropdown Selectors -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <gn-ui-dropdown-selector\n #zone\n [title]=\"'record.metadata.api.form.zoneTitle' | translate\"\n [choices]=\"bucketPromisesZone\"\n (selectValue)=\"setZone($event)\"\n [selected]=\"zone$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #format\n [title]=\"'record.metadata.api.form.formatTitle' | translate\"\n [choices]=\"bucketPromisesFormat\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.formatTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.formatTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #crs\n [title]=\"'record.metadata.api.form.crsTitle' | translate\"\n [choices]=\"bucketPromisesCrs\"\n (selectValue)=\"setCrs($event)\"\n [selected]=\"crs$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.crsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.crsTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n\n <!-- Filtered Items Section -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <h3\n class=\"text-lg font-medium\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.itemsDescription' | translate\n \"\n >\n record.metadata.api.form.items\n </h3>\n <div\n class=\"overflow-auto max-h-60\"\n [attr.title]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n >\n @for (link of listFilteredProduct$ | async; track link) {\n <div class=\"mb-2 sm:mb-3\">\n <gn-ui-gpf-api-dl-list-item\n [link]=\"link\"\n color=\"rgb(124 45 18)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"true\"\n [attr.title]=\"'record.metadata.api.form.productTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.productTooltip' | translate\n \"\n ></gn-ui-gpf-api-dl-list-item>\n </div>\n }\n </div>\n </div>\n\n <!-- Pagination Section -->\n <div class=\"flex items-center justify-between\">\n <button\n (click)=\"lessResult()\"\n [class]=\"\n 'px-4 py-2 text-white rounded transition ' +\n ((page$ | async) <= 1\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary-opacity-50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.previousPageTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.previousPageTooltip' | translate\n \"\n >\n <span translate>record.metadata.api.form.previousPage</span>\n </button>\n <div\n class=\"font-semibold place-content-center\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.paginationDescription' | translate\n \"\n >\n {{ page$ | async }}/{{ pageMax$ | async }}\n </div>\n <button\n (click)=\"moreResult()\"\n [class]=\"\n 'bg-primary-opacity-50 px-4 py-2 text-white rounded transition ' +\n ((page$ | async) >= (pageMax$ | async)\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary-opacity-50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.nextPage</span>\n </button>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: GpfApiDlListItemComponent, selector: "gn-ui-gpf-api-dl-list-item", inputs: ["link", "color", "format", "isFromWfs"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
40163
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: GpfApiDlComponent, isStandalone: true, selector: "gn-ui-gpf-api-dl", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-4 py-2 text-white rounded hover:bg-primary transition\"\n [attr.title]=\"'record.metadata.api.form.resetTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.resetTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.reset</span>\n </button>\n </div>\n\n <!-- Dropdown Selectors -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <gn-ui-dropdown-selector\n #zone\n [title]=\"'record.metadata.api.form.zoneTitle' | translate\"\n [choices]=\"bucketPromisesZone\"\n (selectValue)=\"setZone($event)\"\n [selected]=\"zone$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #format\n [title]=\"'record.metadata.api.form.formatTitle' | translate\"\n [choices]=\"bucketPromisesFormat\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.formatTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.formatTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #crs\n [title]=\"'record.metadata.api.form.crsTitle' | translate\"\n [choices]=\"bucketPromisesCrs\"\n (selectValue)=\"setCrs($event)\"\n [selected]=\"crs$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.crsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.crsTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n\n <!-- Filtered Items Section -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <h3\n class=\"text-lg font-medium\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.itemsDescription' | translate\n \"\n >\n record.metadata.api.form.items\n </h3>\n <div\n class=\"overflow-auto max-h-60\"\n [attr.title]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n >\n @for (link of listFilteredProduct$ | async; track link) {\n <div class=\"mb-2 sm:mb-3\">\n <gn-ui-gpf-api-dl-list-item\n [link]=\"link\"\n color=\"rgb(124 45 18)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"true\"\n [attr.title]=\"'record.metadata.api.form.productTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.productTooltip' | translate\n \"\n ></gn-ui-gpf-api-dl-list-item>\n </div>\n }\n </div>\n </div>\n\n <!-- Pagination Section -->\n <div class=\"flex items-center justify-between\">\n <button\n (click)=\"lessResult()\"\n [class]=\"\n 'px-4 py-2 text-white rounded transition ' +\n ((page$ | async) <= 1\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.previousPageTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.previousPageTooltip' | translate\n \"\n >\n <span translate>record.metadata.api.form.previousPage</span>\n </button>\n <div\n class=\"font-semibold place-content-center\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.paginationDescription' | translate\n \"\n >\n {{ page$ | async }}/{{ pageMax$ | async }}\n </div>\n <button\n (click)=\"moreResult()\"\n [class]=\"\n 'bg-primary/50 px-4 py-2 text-white rounded transition ' +\n ((page$ | async) >= (pageMax$ | async)\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.nextPage</span>\n </button>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: GpfApiDlListItemComponent, selector: "gn-ui-gpf-api-dl-list-item", inputs: ["link", "color", "format", "isFromWfs"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
40151
40164
  }
40152
40165
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GpfApiDlComponent, decorators: [{
40153
40166
  type: Component,
@@ -40157,7 +40170,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
40157
40170
  TranslatePipe,
40158
40171
  DropdownSelectorComponent,
40159
40172
  GpfApiDlListItemComponent,
40160
- ], template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-4 py-2 text-white rounded hover:bg-primary transition\"\n [attr.title]=\"'record.metadata.api.form.resetTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.resetTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.reset</span>\n </button>\n </div>\n\n <!-- Dropdown Selectors -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <gn-ui-dropdown-selector\n #zone\n [title]=\"'record.metadata.api.form.zoneTitle' | translate\"\n [choices]=\"bucketPromisesZone\"\n (selectValue)=\"setZone($event)\"\n [selected]=\"zone$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #format\n [title]=\"'record.metadata.api.form.formatTitle' | translate\"\n [choices]=\"bucketPromisesFormat\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.formatTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.formatTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #crs\n [title]=\"'record.metadata.api.form.crsTitle' | translate\"\n [choices]=\"bucketPromisesCrs\"\n (selectValue)=\"setCrs($event)\"\n [selected]=\"crs$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.crsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.crsTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n\n <!-- Filtered Items Section -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <h3\n class=\"text-lg font-medium\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.itemsDescription' | translate\n \"\n >\n record.metadata.api.form.items\n </h3>\n <div\n class=\"overflow-auto max-h-60\"\n [attr.title]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n >\n @for (link of listFilteredProduct$ | async; track link) {\n <div class=\"mb-2 sm:mb-3\">\n <gn-ui-gpf-api-dl-list-item\n [link]=\"link\"\n color=\"rgb(124 45 18)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"true\"\n [attr.title]=\"'record.metadata.api.form.productTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.productTooltip' | translate\n \"\n ></gn-ui-gpf-api-dl-list-item>\n </div>\n }\n </div>\n </div>\n\n <!-- Pagination Section -->\n <div class=\"flex items-center justify-between\">\n <button\n (click)=\"lessResult()\"\n [class]=\"\n 'px-4 py-2 text-white rounded transition ' +\n ((page$ | async) <= 1\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary-opacity-50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.previousPageTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.previousPageTooltip' | translate\n \"\n >\n <span translate>record.metadata.api.form.previousPage</span>\n </button>\n <div\n class=\"font-semibold place-content-center\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.paginationDescription' | translate\n \"\n >\n {{ page$ | async }}/{{ pageMax$ | async }}\n </div>\n <button\n (click)=\"moreResult()\"\n [class]=\"\n 'bg-primary-opacity-50 px-4 py-2 text-white rounded transition ' +\n ((page$ | async) >= (pageMax$ | async)\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary-opacity-50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.nextPage</span>\n </button>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"] }]
40173
+ ], template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-4 py-2 text-white rounded hover:bg-primary transition\"\n [attr.title]=\"'record.metadata.api.form.resetTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.resetTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.reset</span>\n </button>\n </div>\n\n <!-- Dropdown Selectors -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <gn-ui-dropdown-selector\n #zone\n [title]=\"'record.metadata.api.form.zoneTitle' | translate\"\n [choices]=\"bucketPromisesZone\"\n (selectValue)=\"setZone($event)\"\n [selected]=\"zone$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #format\n [title]=\"'record.metadata.api.form.formatTitle' | translate\"\n [choices]=\"bucketPromisesFormat\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.formatTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.formatTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #crs\n [title]=\"'record.metadata.api.form.crsTitle' | translate\"\n [choices]=\"bucketPromisesCrs\"\n (selectValue)=\"setCrs($event)\"\n [selected]=\"crs$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.crsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.crsTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n\n <!-- Filtered Items Section -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <h3\n class=\"text-lg font-medium\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.itemsDescription' | translate\n \"\n >\n record.metadata.api.form.items\n </h3>\n <div\n class=\"overflow-auto max-h-60\"\n [attr.title]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n >\n @for (link of listFilteredProduct$ | async; track link) {\n <div class=\"mb-2 sm:mb-3\">\n <gn-ui-gpf-api-dl-list-item\n [link]=\"link\"\n color=\"rgb(124 45 18)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"true\"\n [attr.title]=\"'record.metadata.api.form.productTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.productTooltip' | translate\n \"\n ></gn-ui-gpf-api-dl-list-item>\n </div>\n }\n </div>\n </div>\n\n <!-- Pagination Section -->\n <div class=\"flex items-center justify-between\">\n <button\n (click)=\"lessResult()\"\n [class]=\"\n 'px-4 py-2 text-white rounded transition ' +\n ((page$ | async) <= 1\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.previousPageTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.previousPageTooltip' | translate\n \"\n >\n <span translate>record.metadata.api.form.previousPage</span>\n </button>\n <div\n class=\"font-semibold place-content-center\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.paginationDescription' | translate\n \"\n >\n {{ page$ | async }}/{{ pageMax$ | async }}\n </div>\n <button\n (click)=\"moreResult()\"\n [class]=\"\n 'bg-primary/50 px-4 py-2 text-white rounded transition ' +\n ((page$ | async) >= (pageMax$ | async)\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.nextPage</span>\n </button>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"] }]
40161
40174
  }], propDecorators: { apiLink: [{
40162
40175
  type: Input
40163
40176
  }] } });
@@ -40166,6 +40179,7 @@ marker('map.dropdown.placeholder');
40166
40179
  marker('wfs.feature.limit');
40167
40180
  marker('dataset.error.restrictedAccess');
40168
40181
  marker('map.select.style');
40182
+ marker('map.style.default');
40169
40183
  class MapViewComponent {
40170
40184
  constructor() {
40171
40185
  this.mdViewFacade = inject(MdViewFacade);
@@ -40232,7 +40246,8 @@ class MapViewComponent {
40232
40246
  return compatibleLinks[0];
40233
40247
  }
40234
40248
  }
40235
- }));
40249
+ }), shareReplay$1(1));
40250
+ this.isWmsStyleMode$ = this.selectedSourceLink$.pipe(map$1((src) => src?.type === 'service' && src?.accessServiceProtocol === 'wms'), distinctUntilChanged(), shareReplay$1(1));
40236
40251
  this.styleLinks$ = this.selectedSourceLink$.pipe(switchMap$1((src) => {
40237
40252
  if (src &&
40238
40253
  src.type === 'service' &&
@@ -40249,6 +40264,17 @@ class MapViewComponent {
40249
40264
  return of(src);
40250
40265
  }));
40251
40266
  }
40267
+ if (src &&
40268
+ src.type === 'service' &&
40269
+ src.accessServiceProtocol === 'wms') {
40270
+ return from(new WmsEndpoint(src.url.toString()).isReady()).pipe(map$1((endpoint) => {
40271
+ const layer = endpoint.getLayerByName(src.name);
40272
+ return layer?.styles || [];
40273
+ }), catchError((error) => {
40274
+ this.handleError(error);
40275
+ return of([]);
40276
+ }));
40277
+ }
40252
40278
  return of([]);
40253
40279
  }), tap$1((styles) => {
40254
40280
  if (this._styleFromConfig && this._styleFromConfig <= styles.length) {
@@ -40258,23 +40284,60 @@ class MapViewComponent {
40258
40284
  this.selectedStyleId$.next(0);
40259
40285
  }
40260
40286
  }), shareReplay$1(1));
40261
- this.styleDropdownChoices$ = this.styleLinks$.pipe(map$1((links) => links.length
40287
+ this.styleDropdownChoices$ = combineLatest([
40288
+ this.styleLinks$,
40289
+ this.isWmsStyleMode$,
40290
+ ]).pipe(map$1(([links, isWmsStyleMode]) => links.length
40262
40291
  ? links.map((link, index) => ({
40263
- label: getLinkLabel(link),
40292
+ label: isWmsStyleMode
40293
+ ? link.title || link.name
40294
+ : getLinkLabel(link),
40264
40295
  value: index,
40265
40296
  }))
40266
40297
  : [
40267
40298
  {
40268
- label: '\u00A0\u00A0\u00A0\u00A0',
40299
+ label: this.translateService.instant('map.style.default'),
40269
40300
  value: 0,
40270
40301
  },
40271
40302
  ]));
40303
+ this.selectedWmsStyleName$ = combineLatest([
40304
+ this.styleLinks$,
40305
+ this.isWmsStyleMode$,
40306
+ this.selectedStyleId$.pipe(distinctUntilChanged()),
40307
+ ]).pipe(map$1(([styles, isWmsStyleMode, styleIdx]) => isWmsStyleMode && Array.isArray(styles)
40308
+ ? styles[styleIdx]?.name
40309
+ : undefined));
40272
40310
  this.selectedLink$ = combineLatest([
40273
40311
  this.selectedSourceLink$,
40274
40312
  this.styleLinks$,
40275
40313
  this.selectedStyleId$.pipe(distinctUntilChanged()),
40276
- ]).pipe(map$1(([src, styles, styleIdx]) => (styles.length ? styles[styleIdx] : src)), shareReplay$1(1));
40277
- this.currentLayers$ = combineLatest([this.selectedLink$, this.excludeWfs$]).pipe(switchMap$1(([link, excludeWfs]) => {
40314
+ this.isWmsStyleMode$,
40315
+ ]).pipe(map$1(([src, styles, styleIdx, isWmsStyleMode]) => !isWmsStyleMode && styles.length ? styles[styleIdx] : src), shareReplay$1(1));
40316
+ this.wmsMimeType$ = this.selectedSourceLink$.pipe(switchMap$1((link) => {
40317
+ if (link?.type === 'service' && link?.accessServiceProtocol === 'wms') {
40318
+ return from(new WmsEndpoint(link.url.toString())
40319
+ .isReady()
40320
+ .then((endpoint) => {
40321
+ return endpoint.describeLayer(link.name).then((description) => {
40322
+ if (description) {
40323
+ return description.owsType === 'wfs'
40324
+ ? 'image/png'
40325
+ : 'image/jpeg';
40326
+ }
40327
+ const layer = endpoint.getLayerByName(link.name);
40328
+ return layer?.opaque ? 'image/jpeg' : 'image/png';
40329
+ });
40330
+ })
40331
+ .catch(() => 'image/png'));
40332
+ }
40333
+ return of('');
40334
+ }), shareReplay$1(1));
40335
+ this.currentLayers$ = combineLatest([
40336
+ this.selectedLink$,
40337
+ this.excludeWfs$,
40338
+ this.selectedWmsStyleName$,
40339
+ this.wmsMimeType$,
40340
+ ]).pipe(switchMap$1(([link, excludeWfs, wmsStyleName, wmsMimeType]) => {
40278
40341
  if (!link) {
40279
40342
  return of([]);
40280
40343
  }
@@ -40288,7 +40351,13 @@ class MapViewComponent {
40288
40351
  this.handleError('dataset.error.restrictedAccess');
40289
40352
  return of([]);
40290
40353
  }
40291
- return this.getLayerFromLink(link).pipe(map$1((layer) => [layer]), catchError((e) => {
40354
+ return this.getLayerFromLink(link).pipe(map$1((layer) => layer.type === 'wms'
40355
+ ? {
40356
+ ...layer,
40357
+ ...(wmsStyleName && { style: wmsStyleName }),
40358
+ ...(wmsMimeType && { format: wmsMimeType }),
40359
+ }
40360
+ : layer), map$1((layer) => [layer]), catchError((e) => {
40292
40361
  this.handleError(e);
40293
40362
  return of([]);
40294
40363
  }), finalize(() => (this.loading = false)));
@@ -40442,7 +40511,7 @@ class MapViewComponent {
40442
40511
  this.changeRef.detectChanges();
40443
40512
  }
40444
40513
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MapViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
40445
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", selectedView: "selectedView", datavizConfig: "datavizConfig", displaySource: "displaySource" }, outputs: { linkSelected: "linkSelected", styleSelected: "styleSelected" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n @if ((styleLinks$ | async)?.length > 0) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"_styleFromConfig\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n } @else {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0 text-gray-400\"\n extraBtnClass=\"font-sans font-bold text-gray-400\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [disabled]=\"true\"\n ></gn-ui-dropdown-selector>\n }\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "extentChange", "sourceLoadError", "resolvedExtentChange"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature", "featureCatalog"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "extraClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: MapLegendComponent, selector: "gn-ui-map-legend", inputs: ["context"], outputs: ["legendStatusChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
40514
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", selectedView: "selectedView", datavizConfig: "datavizConfig", displaySource: "displaySource" }, outputs: { linkSelected: "linkSelected", styleSelected: "styleSelected" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"selectedStyleId$ | async\"\n [disabled]=\"(styleDropdownChoices$ | async)?.length <= 1\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n [mimeType]=\"wmsMimeType$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "extentChange", "sourceLoadError", "resolvedExtentChange"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature", "featureCatalog"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "mimeType", "extraClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: MapLegendComponent, selector: "gn-ui-map-legend", inputs: ["context"], outputs: ["legendStatusChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
40446
40515
  provideIcons({ matClose }),
40447
40516
  provideNgIconsConfig({
40448
40517
  size: '1.5em',
@@ -40469,7 +40538,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
40469
40538
  provideNgIconsConfig({
40470
40539
  size: '1.5em',
40471
40540
  }),
40472
- ], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n @if ((styleLinks$ | async)?.length > 0) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"_styleFromConfig\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n } @else {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0 text-gray-400\"\n extraBtnClass=\"font-sans font-bold text-gray-400\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [disabled]=\"true\"\n ></gn-ui-dropdown-selector>\n }\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n" }]
40541
+ ], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"selectedStyleId$ | async\"\n [disabled]=\"(styleDropdownChoices$ | async)?.length <= 1\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n [mimeType]=\"wmsMimeType$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n" }]
40473
40542
  }], propDecorators: { exceedsLimit: [{
40474
40543
  type: Input
40475
40544
  }], selectedView: [{
@@ -44303,6 +44372,7 @@ class RouterFacade {
44303
44372
  });
44304
44373
  }
44305
44374
  updateSearch(query) {
44375
+ console.log('RouterFacade - updateSearch', query);
44306
44376
  this.go({
44307
44377
  path: this.routerService.getSearchRoute(),
44308
44378
  ...(query && { query: flattenQueryParams(query) }),
@@ -44310,6 +44380,7 @@ class RouterFacade {
44310
44380
  });
44311
44381
  }
44312
44382
  setSearch(query) {
44383
+ console.log('RouterFacade - setSearch', query);
44313
44384
  this.go({
44314
44385
  path: this.routerService.getSearchRoute(),
44315
44386
  ...(query && { query: flattenQueryParams(query) }),
@@ -44349,6 +44420,12 @@ class RouterEffects {
44349
44420
  this.syncSearchState$ = createEffect(() => this.facade.searchParams$.pipe(mergeMap((searchParams) => this.fieldsService
44350
44421
  .buildFiltersFromFieldValues(searchParams)
44351
44422
  .pipe(map$1((filters) => [searchParams, filters]))), startWith([null, {}]), pairwise(), map$1(([[oldParams, oldFilters], [newParams, newFilters]]) => {
44423
+ console.log('RouterEffects - syncSearchState', {
44424
+ oldParams,
44425
+ newParams,
44426
+ oldFilters,
44427
+ newFilters,
44428
+ });
44352
44429
  let sortBy = ROUTE_PARAMS.SORT in newParams
44353
44430
  ? sortByFromString(newParams[ROUTE_PARAMS.SORT])
44354
44431
  : this.routerService.getDefaultSort();
@@ -44386,6 +44463,23 @@ class RouterEffects {
44386
44463
  }
44387
44464
  return of(...actions);
44388
44465
  })));
44466
+ /**
44467
+ * This effect is needed because on the page load, the search params from the URL are
44468
+ * directly applied to the underlying search facade; this means that it doesn't go
44469
+ * through the RouterSearchService which makes sure that a relevancy sort is applied
44470
+ * whenever there's a full text search criteria set.
44471
+ */
44472
+ this.applyInitialRelevancySort$ = createEffect(() => this.facade.searchParams$.pipe(take(1), tap$1((filters) => {
44473
+ const relevancySort = sortByToString(SortByEnum.RELEVANCY);
44474
+ if (filters['q'] &&
44475
+ (!Array.isArray(filters['q']) || filters['q'].length > 0) &&
44476
+ !filters[ROUTE_PARAMS.SORT]) {
44477
+ this.facade.updateSearch({
44478
+ ...filters,
44479
+ [ROUTE_PARAMS.SORT]: relevancySort,
44480
+ });
44481
+ }
44482
+ })), { dispatch: false });
44389
44483
  /**
44390
44484
  * This effect will load the metadata when a navigation to
44391
44485
  * a metadata record happens
@@ -44476,6 +44570,7 @@ class RouterSearchService {
44476
44570
  this.fieldsService = inject(FieldsService);
44477
44571
  }
44478
44572
  setSortAndFilters(filters, sortBy) {
44573
+ console.log('RouterSearchService - setSortAndFilters', { filters, sortBy });
44479
44574
  this.fieldsService
44480
44575
  .readFieldValuesFromFilters(filters)
44481
44576
  .subscribe((values) => {
@@ -44486,17 +44581,27 @@ class RouterSearchService {
44486
44581
  });
44487
44582
  }
44488
44583
  async setFilters(newFilters) {
44489
- const sortBy = await firstValueFrom(this.searchFacade.sortBy$);
44584
+ let sortBy = await firstValueFrom(this.searchFacade.sortBy$);
44490
44585
  const fieldSearchParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(newFilters));
44586
+ // apply relevancy sort if a full text criteria is given
44587
+ sortBy = newFilters['any'] ? SortByEnum.RELEVANCY : sortBy;
44491
44588
  this.facade.setSearch({
44492
44589
  ...fieldSearchParams,
44493
44590
  [ROUTE_PARAMS.SORT]: sortBy ? sortByToString(sortBy) : undefined,
44494
44591
  });
44495
44592
  }
44496
44593
  async updateFilters(newFilters) {
44594
+ console.log('RouterSearchService - updateFilters', newFilters);
44497
44595
  const currentFilters = await firstValueFrom(this.searchFacade.searchFilters$);
44498
44596
  const updatedFilters = { ...currentFilters, ...newFilters };
44499
- const newParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(updatedFilters));
44597
+ let newParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(updatedFilters));
44598
+ if (newFilters['any']) {
44599
+ newParams = {
44600
+ ...newParams,
44601
+ [ROUTE_PARAMS.SORT]: sortByToString(SortByEnum.RELEVANCY),
44602
+ };
44603
+ }
44604
+ console.log('RouterSearchService - updateFilters - newParams', newParams);
44500
44605
  this.facade.updateSearch(newParams);
44501
44606
  }
44502
44607
  setSortBy(sortBy) {