geonetwork-ui 2.8.0-dev.c77b0c7dd → 2.8.0-dev.e22966206

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 (137) hide show
  1. package/esm2022/index.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/common/distribution.mapper.mjs +5 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -1
  4. package/esm2022/libs/api/repository/src/lib/gn4/auth/auth.service.mjs +2 -2
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +7 -3
  6. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +10 -10
  7. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +3 -2
  8. package/esm2022/libs/common/domain/src/index.mjs +3 -0
  9. package/esm2022/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.mjs +1 -1
  10. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +3 -1
  11. package/esm2022/libs/common/domain/src/lib/model/search/sort-by.model.mjs +6 -1
  12. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  13. package/esm2022/libs/data-access/gn4/src/openapi/model/user.api.model.mjs +1 -1
  14. package/esm2022/libs/feature/dataviz/src/index.mjs +2 -1
  15. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +3 -1
  16. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +18 -7
  17. package/esm2022/libs/feature/dataviz/src/lib/stac-view/stac-view.component.mjs +22 -0
  18. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +13 -4
  19. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +23 -8
  20. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +2 -1
  21. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +2 -1
  22. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +5 -1
  23. package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +9 -7
  24. package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +8 -12
  25. package/esm2022/libs/ui/elements/src/lib/error/error.component.mjs +3 -3
  26. package/esm2022/libs/ui/elements/src/lib/external-link-card/external-link-card.component.mjs +11 -4
  27. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  28. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +2 -3
  29. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +5 -1
  30. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +12 -1
  31. package/esm2022/libs/util/shared/src/lib/services/proxy.service.mjs +9 -11
  32. package/esm2022/libs/util/shared/src/lib/utils/sort-by.mjs +9 -6
  33. package/esm2022/translations/de.json +10 -3
  34. package/esm2022/translations/en.json +11 -5
  35. package/esm2022/translations/es.json +9 -2
  36. package/esm2022/translations/fr.json +11 -4
  37. package/esm2022/translations/it.json +12 -5
  38. package/esm2022/translations/nl.json +9 -2
  39. package/esm2022/translations/pt.json +9 -2
  40. package/esm2022/translations/sk.json +10 -3
  41. package/fesm2022/geonetwork-ui.mjs +237 -88
  42. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  43. package/index.d.ts +1 -0
  44. package/index.d.ts.map +1 -1
  45. package/index.ts +1 -0
  46. package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
  47. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  48. package/libs/api/repository/src/lib/gn4/auth/auth.service.d.ts.map +1 -1
  49. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  50. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +7 -7
  51. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  52. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  53. package/libs/common/domain/src/index.d.ts +3 -0
  54. package/libs/common/domain/src/index.d.ts.map +1 -0
  55. package/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.d.ts +1 -1
  56. package/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.d.ts.map +1 -1
  57. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +1 -1
  58. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  59. package/libs/common/domain/src/lib/model/search/sort-by.model.d.ts.map +1 -1
  60. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  61. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  62. package/libs/data-access/gn4/src/openapi/model/user.api.model.d.ts +1 -1
  63. package/libs/feature/dataviz/src/index.d.ts +1 -0
  64. package/libs/feature/dataviz/src/index.d.ts.map +1 -1
  65. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
  66. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  67. package/libs/feature/dataviz/src/lib/stac-view/stac-view.component.d.ts +11 -0
  68. package/libs/feature/dataviz/src/lib/stac-view/stac-view.component.d.ts.map +1 -0
  69. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +3 -2
  70. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  71. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +3 -2
  72. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  73. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  74. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +24 -24
  75. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  76. package/libs/feature/router/src/lib/default/router.service.d.ts +2 -0
  77. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  78. package/libs/feature/router/src/lib/default/state/router.effects.d.ts +3 -1
  79. package/libs/feature/router/src/lib/default/state/router.effects.d.ts.map +1 -1
  80. package/libs/feature/search/src/lib/sort-by/sort-by.component.d.ts +4 -3
  81. package/libs/feature/search/src/lib/sort-by/sort-by.component.d.ts.map +1 -1
  82. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  83. package/libs/ui/elements/src/lib/external-link-card/external-link-card.component.d.ts +3 -2
  84. package/libs/ui/elements/src/lib/external-link-card/external-link-card.component.d.ts.map +1 -1
  85. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  86. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  87. package/libs/util/shared/src/lib/links/link-utils.d.ts +6 -0
  88. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  89. package/libs/util/shared/src/lib/services/proxy.service.d.ts +5 -4
  90. package/libs/util/shared/src/lib/services/proxy.service.d.ts.map +1 -1
  91. package/libs/util/shared/src/lib/utils/sort-by.d.ts.map +1 -1
  92. package/package.json +1 -1
  93. package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +2 -0
  94. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -0
  95. package/src/libs/api/repository/src/lib/gn4/auth/auth.service.ts +4 -1
  96. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +12 -4
  97. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +37 -36
  98. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -2
  99. package/src/libs/common/domain/src/index.ts +2 -0
  100. package/src/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.ts +1 -1
  101. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +4 -0
  102. package/src/libs/common/domain/src/lib/model/search/sort-by.model.ts +5 -0
  103. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -1
  104. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +5 -0
  105. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +19 -0
  106. package/src/libs/data-access/gn4/src/openapi/model/user.api.model.ts +1 -1
  107. package/src/libs/feature/dataviz/src/index.ts +1 -0
  108. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +1 -0
  109. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +16 -5
  110. package/src/libs/feature/dataviz/src/lib/stac-view/stac-view.component.css +0 -0
  111. package/src/libs/feature/dataviz/src/lib/stac-view/stac-view.component.html +5 -0
  112. package/src/libs/feature/dataviz/src/lib/stac-view/stac-view.component.ts +27 -0
  113. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +7 -1
  114. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +23 -4
  115. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +1 -0
  116. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +11 -1
  117. package/src/libs/feature/router/src/lib/default/router.service.ts +8 -0
  118. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +6 -7
  119. package/src/libs/feature/search/src/lib/sort-by/sort-by.component.ts +8 -12
  120. package/src/libs/ui/elements/src/lib/error/error.component.html +5 -1
  121. package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.html +43 -22
  122. package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.ts +12 -3
  123. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +58 -16
  124. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +4 -2
  125. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +4 -0
  126. package/src/libs/util/shared/src/lib/links/link-utils.ts +11 -0
  127. package/src/libs/util/shared/src/lib/services/proxy.service.ts +6 -2
  128. package/src/libs/util/shared/src/lib/utils/sort-by.ts +8 -5
  129. package/translations/de.json +10 -3
  130. package/translations/en.json +11 -5
  131. package/translations/es.json +9 -2
  132. package/translations/fr.json +11 -4
  133. package/translations/it.json +12 -5
  134. package/translations/nl.json +9 -2
  135. package/translations/pt.json +9 -2
  136. package/translations/sk.json +10 -3
  137. package/src/libs/common/domain/src/lib/index.ts +0 -2
@@ -13,7 +13,7 @@ import { TranslatePipe } from '@ngx-translate/core'
13
13
 
14
14
  interface SortChoice {
15
15
  label: string
16
- value: string
16
+ value: SortByField
17
17
  }
18
18
 
19
19
  @Component({
@@ -27,24 +27,20 @@ export class SortByComponent implements OnInit {
27
27
  choices: SortChoice[] = [
28
28
  {
29
29
  label: marker('results.sortBy.relevancy'),
30
- value: SortByEnum.RELEVANCY.join(','),
30
+ value: SortByEnum.RELEVANCY,
31
31
  },
32
32
  {
33
33
  label: marker('results.sortBy.dateStamp'),
34
- value: SortByEnum.CREATE_DATE.join(','),
35
- },
36
- {
37
- label: marker('results.sortBy.changeDate'),
38
- value: SortByEnum.CHANGE_DATE.join(','),
34
+ value: SortByEnum.RESOURCE_DATES,
39
35
  },
40
36
  {
41
37
  label: marker('results.sortBy.popularity'),
42
- value: SortByEnum.POPULARITY.join(','),
38
+ value: SortByEnum.POPULARITY,
43
39
  },
44
40
  ]
45
41
  currentSortBy$ = this.facade.sortBy$.pipe(
46
42
  filter((sortBy) => !!sortBy),
47
- map((sortBy) => sortBy.join(','))
43
+ map((sortBy) => sortBy)
48
44
  )
49
45
 
50
46
  constructor(
@@ -56,12 +52,12 @@ export class SortByComponent implements OnInit {
56
52
  if (this.isQualitySortable) {
57
53
  this.choices.push({
58
54
  label: marker('results.sortBy.qualityScore'),
59
- value: SortByEnum.QUALITY_SCORE.join(','),
55
+ value: SortByEnum.QUALITY_SCORE,
60
56
  })
61
57
  }
62
58
  }
63
59
 
64
- changeSortBy(criteriaAsString: string) {
65
- this.searchService.setSortBy(criteriaAsString.split(',') as SortByField)
60
+ changeSortBy(criteria: SortByField): void {
61
+ this.searchService.setSortBy(criteria)
66
62
  }
67
63
  }
@@ -1,5 +1,9 @@
1
1
  <div
2
- class="p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg"
2
+ class="p-[1.7em] text-[1.5em] text-center rounded-lg"
3
+ [ngClass]="{
4
+ 'bg-red-50 text-red-800': type !== types.DATASET_HAS_NO_LINK,
5
+ 'bg-gray-100 text-black': type === types.DATASET_HAS_NO_LINK,
6
+ }"
3
7
  >
4
8
  <div
5
9
  *ngIf="type === types.COULD_NOT_REACH_API"
@@ -1,15 +1,48 @@
1
- <a
2
- [href]="link.url"
3
- target="_blank"
4
- class="group flex flex-row justify-between card-shadow cursor-pointer rounded overflow-hidden"
5
- [ngClass]="cardClass"
6
- [title]="title"
7
- >
1
+ <ng-container *ngIf="isDatabase; else clickableLink">
2
+ <div [ngClass]="cardClass" [title]="title">
3
+ <ng-container *ngTemplateOutlet="cardContent"></ng-container>
4
+ <div
5
+ class="flex min-w-[32px]"
6
+ [ngClass]="size === 'S' ? 'items-end' : 'items-center'"
7
+ >
8
+ <div
9
+ class="gn-ui-card-icon"
10
+ [title]="'record.metadata.link.postgis.tooltip' | translate"
11
+ >
12
+ <ng-icon
13
+ class="inline-block card-icon align-middle"
14
+ name="iconoirDatabase"
15
+ ></ng-icon>
16
+ </div>
17
+ </div>
18
+ </div>
19
+ </ng-container>
20
+
21
+ <ng-template #clickableLink>
22
+ <a [href]="link.url" target="_blank" [ngClass]="cardClass" [title]="title">
23
+ <ng-container *ngTemplateOutlet="cardContent"></ng-container>
24
+ <div
25
+ class="flex min-w-[32px]"
26
+ [ngClass]="size === 'S' ? 'items-end' : 'items-center'"
27
+ >
28
+ <div class="gn-ui-card-icon">
29
+ <ng-icon
30
+ class="inline-block card-icon align-middle"
31
+ name="matOpenInNew"
32
+ ></ng-icon>
33
+ </div>
34
+ </div>
35
+ </a>
36
+ </ng-template>
37
+ <ng-template #cardContent>
8
38
  <div class="flex flex-col justify-between flex-1 min-w-0">
9
39
  <div class="gn-ui-card-title">
10
40
  {{ link.description || link.name }}
11
41
  </div>
12
42
  <div class="gn-ui-card-detail">
43
+ <ng-container *ngIf="isDatabase">
44
+ {{ 'record.metadata.link.postgis.table' | translate }}
45
+ </ng-container>
13
46
  {{ link.name }}
14
47
  </div>
15
48
  <p *ngIf="!link.name && !link.description" class="gn-ui-card-title">
@@ -20,21 +53,9 @@
20
53
  class="inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100"
21
54
  [style.background-color]="getLinkColor(link)"
22
55
  data-cy="download-format"
23
- >{{
24
- getLinkFormat(link) || ('downloads.format.unknown' | translate)
25
- }}</span
26
56
  >
57
+ {{ getLinkFormat(link) || ('downloads.format.unknown' | translate) }}
58
+ </span>
27
59
  </div>
28
60
  </div>
29
- <div
30
- class="flex min-w-[32px]"
31
- [ngClass]="size === 'S' ? 'items-end' : 'items-center'"
32
- >
33
- <div class="gn-ui-card-icon">
34
- <ng-icon
35
- class="inline-block card-icon align-middle"
36
- name="matOpenInNew"
37
- ></ng-icon>
38
- </div>
39
- </div>
40
- </a>
61
+ </ng-template>
@@ -7,6 +7,7 @@ import {
7
7
  provideNgIconsConfig,
8
8
  } from '@ng-icons/core'
9
9
  import { matOpenInNew } from '@ng-icons/material-icons/baseline'
10
+ import { iconoirDatabase } from '@ng-icons/iconoir'
10
11
  import { getBadgeColor, getFileFormat } from '../../../../../../libs/util/shared/src'
11
12
  import { TranslatePipe } from '@ngx-translate/core'
12
13
 
@@ -21,6 +22,7 @@ type CardSize = 'L' | 'M' | 'S' | 'XS'
21
22
  providers: [
22
23
  provideIcons({
23
24
  matOpenInNew,
25
+ iconoirDatabase,
24
26
  }),
25
27
  provideNgIconsConfig({ size: '1.5em' }),
26
28
  ],
@@ -37,7 +39,7 @@ export class ExternalLinkCardComponent {
37
39
 
38
40
  @Input() set size(value: CardSize) {
39
41
  this._size = value
40
- this.cardClass = this.sizeClassMap[value]
42
+ this.cardClass = `group flex flex-row justify-between card-shadow rounded overflow-hidden ${this.sizeClassMap[value]}`
41
43
  }
42
44
  get size(): CardSize {
43
45
  return this._size
@@ -51,11 +53,18 @@ export class ExternalLinkCardComponent {
51
53
  return this.link.name || this.link.description || ''
52
54
  }
53
55
 
54
- getLinkFormat(link: any) {
56
+ get isDatabase(): boolean {
57
+ return (
58
+ this.link.type === 'service' &&
59
+ this.link.accessServiceProtocol === 'postgis'
60
+ )
61
+ }
62
+
63
+ getLinkFormat(link: DatasetOnlineResource): string {
55
64
  return getFileFormat(link)
56
65
  }
57
66
 
58
- getLinkColor(link: any) {
67
+ getLinkColor(link: DatasetOnlineResource): string {
59
68
  return getBadgeColor(getFileFormat(link))
60
69
  }
61
70
  }
@@ -3,7 +3,11 @@
3
3
  ghostClass="h-[178px]"
4
4
  [showContent]="fieldReady('abstract')"
5
5
  >
6
- <gn-ui-max-lines [maxLines]="6" *ngIf="metadata.abstract">
6
+ <gn-ui-max-lines
7
+ [maxLines]="6"
8
+ *ngIf="metadata.abstract"
9
+ data-test="metadata-info-abstract"
10
+ >
7
11
  <div class="mb-6">
8
12
  <gn-ui-markdown-parser
9
13
  [textContent]="metadata.abstract"
@@ -24,7 +28,7 @@
24
28
  ghostClass="h-[31px] w-3/4"
25
29
  [showContent]="fieldReady('keywords')"
26
30
  >
27
- <div *ngIf="metadata.keywords?.length">
31
+ <gn-ui-max-lines [maxLines]="7" *ngIf="metadata.keywords?.length">
28
32
  <div class="metadata-info-keywords sm:pb-4 flex flex-wrap gap-2">
29
33
  <gn-ui-badge
30
34
  class="inline-block lowercase"
@@ -34,7 +38,7 @@
34
38
  >{{ keyword.label }}</gn-ui-badge
35
39
  >
36
40
  </div>
37
- </div>
41
+ </gn-ui-max-lines>
38
42
  </gn-ui-content-ghost>
39
43
  </div>
40
44
 
@@ -101,19 +105,31 @@
101
105
  <gn-ui-expandable-panel
102
106
  *ngIf="
103
107
  (metadata.kind === 'dataset' && metadata.lineage) ||
108
+ resourceContact ||
109
+ metadata.resourceCreated ||
110
+ metadata.resourcePublished ||
104
111
  metadata.resourceUpdated ||
105
- metadata.updateFrequency ||
106
- (metadata.kind === 'dataset' && metadata.status)
112
+ (metadata.kind === 'dataset' && metadata.updateFrequency) ||
113
+ metadata.otherLanguages?.length ||
114
+ (metadata.kind === 'dataset' && temporalExtent)
107
115
  "
108
116
  [title]="'record.metadata.details' | translate"
109
117
  data-test="details-panel"
110
118
  >
111
- <div *ngIf="metadata.lineage" class="text-gray-900 flex flex-col mt-4 gap-2">
119
+ <div
120
+ *ngIf="metadata.kind === 'dataset' && metadata.lineage"
121
+ class="text-gray-900 flex flex-col mt-4 gap-2"
122
+ data-test="details-panel-lineage"
123
+ >
112
124
  <p class="whitespace-pre-line break-words text-gray-900" gnUiLinkify>
113
125
  {{ metadata.lineage }}
114
126
  </p>
115
127
  </div>
116
- <div class="flex flex-row gap-6 mt-5 mb-8" *ngIf="resourceContact">
128
+ <div
129
+ class="flex flex-row gap-6 mt-5 mb-8 resource-contact"
130
+ *ngIf="resourceContact"
131
+ data-test="details-panel-resource-contact"
132
+ >
117
133
  <div
118
134
  *ngIf="resourceContact.organization?.logoUrl?.href"
119
135
  class="flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden"
@@ -165,19 +181,37 @@
165
181
  <div
166
182
  class="py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700"
167
183
  >
168
- <div *ngIf="metadata.resourceCreated">
184
+ <div
185
+ *ngIf="metadata.resourceCreated"
186
+ data-test="details-panel-resource-created"
187
+ >
169
188
  <p class="text-sm" translate>record.metadata.creation</p>
170
- <p class="text-primary font-medium mt-1">
189
+ <p class="text-primary font-medium mt-1 resource-created">
171
190
  {{ formatDate(metadata.resourceCreated) }}
172
191
  </p>
173
192
  </div>
174
- <div *ngIf="metadata.resourcePublished">
193
+ <div
194
+ *ngIf="metadata.resourcePublished"
195
+ data-test="details-panel-resource-published"
196
+ >
175
197
  <p class="text-sm" translate>record.metadata.publication</p>
176
- <p class="text-primary font-medium mt-1">
198
+ <p class="text-primary font-medium mt-1 resource-published">
177
199
  {{ formatDate(metadata.resourcePublished) }}
178
200
  </p>
179
201
  </div>
180
- <div *ngIf="updateFrequency">
202
+ <div
203
+ *ngIf="metadata.resourceUpdated"
204
+ data-test="details-panel-resource-updated"
205
+ >
206
+ <p class="text-sm" translate>record.metadata.update</p>
207
+ <p class="text-primary font-medium mt-1 resource-updated">
208
+ {{ formatDate(metadata.resourceUpdated) }}
209
+ </p>
210
+ </div>
211
+ <div
212
+ *ngIf="metadata.kind === 'dataset' && metadata.updateFrequency"
213
+ data-test="details-panel-update-frequency"
214
+ >
181
215
  <p class="text-sm" translate>record.metadata.updateFrequency</p>
182
216
  <p
183
217
  class="text-primary font-medium mt-1 updateFrequency"
@@ -187,11 +221,14 @@
187
221
  {{ updateFrequency }}
188
222
  </p>
189
223
  </div>
190
- <div *ngIf="metadata.otherLanguages?.length">
224
+ <div
225
+ *ngIf="metadata.otherLanguages?.length"
226
+ data-test="details-panel-other-languages"
227
+ >
191
228
  <p class="text-sm mb-1" translate>record.metadata.languages</p>
192
229
  <div class="flex flex-row gap-1 flex-wrap">
193
230
  <p
194
- class="text-primary font-medium"
231
+ class="text-primary font-medium other-languages"
195
232
  translate
196
233
  *ngFor="let language of metadata.otherLanguages"
197
234
  >
@@ -199,9 +236,14 @@
199
236
  </p>
200
237
  </div>
201
238
  </div>
202
- <div *ngIf="temporalExtent">
239
+ <div
240
+ *ngIf="metadata.kind === 'dataset' && temporalExtent"
241
+ data-test="details-panel-temporal-extent"
242
+ >
203
243
  <p class="text-sm" translate>record.metadata.temporalExtent</p>
204
- <div class="flex flex-row gap-1 mb-1 text-primary font-medium">
244
+ <div
245
+ class="flex flex-row gap-1 mb-1 text-primary font-medium temporal-extent"
246
+ >
205
247
  <p
206
248
  *ngIf="temporalExtent.start && temporalExtent.end"
207
249
  translate
@@ -90,8 +90,10 @@ export class DropdownSelectorComponent implements OnInit {
90
90
 
91
91
  get selectedChoice(): DropdownChoice {
92
92
  return (
93
- this.choices.find((choice) => choice.value === this.selected) ??
94
- this.choices[0]
93
+ this.choices.find(
94
+ (choice) =>
95
+ JSON.stringify(choice.value) === JSON.stringify(this.selected)
96
+ ) ?? this.choices[0]
95
97
  )
96
98
  }
97
99
 
@@ -39,6 +39,10 @@ export class LinkClassifierService {
39
39
  return [LinkUsage.API, LinkUsage.DOWNLOAD, LinkUsage.GEODATA]
40
40
  case 'GPFDL':
41
41
  return [LinkUsage.API]
42
+ case 'postgis':
43
+ return [LinkUsage.UNKNOWN]
44
+ case 'stac':
45
+ return [LinkUsage.API]
42
46
  default:
43
47
  return [LinkUsage.UNKNOWN]
44
48
  }
@@ -150,6 +150,12 @@ export const FORMATS = {
150
150
  color: '#5A9E6F',
151
151
  mimeTypes: ['image/webp'],
152
152
  },
153
+ postgis: {
154
+ extensions: ['postgis'],
155
+ priority: 18,
156
+ color: '#336791',
157
+ mimeTypes: [],
158
+ },
153
159
  } as const
154
160
 
155
161
  export type FileFormat = keyof typeof FORMATS
@@ -195,6 +201,11 @@ export function getFileFormatFromServiceOutput(
195
201
  export function getFileFormat(
196
202
  link: DatasetOnlineResource | ServiceOnlineResource
197
203
  ): FileFormat {
204
+ if ('accessServiceProtocol' in link) {
205
+ if (link.accessServiceProtocol in FORMATS) {
206
+ return link.accessServiceProtocol as FileFormat
207
+ }
208
+ }
198
209
  if ('mimeType' in link) {
199
210
  const mimeTypeFormat = mimeTypeToFormat(link.mimeType)
200
211
  if (mimeTypeFormat !== null) {
@@ -1,4 +1,4 @@
1
- import { Inject, Injectable, InjectionToken, Optional } from '@angular/core'
1
+ import { Injectable, InjectionToken, Injector } from '@angular/core'
2
2
  import { Location } from '@angular/common'
3
3
 
4
4
  export const PROXY_PATH = new InjectionToken<string>('proxyPath')
@@ -7,8 +7,12 @@ export const PROXY_PATH = new InjectionToken<string>('proxyPath')
7
7
  providedIn: 'root',
8
8
  })
9
9
  export class ProxyService {
10
+ private get proxyPath(): string | null {
11
+ return this.injector.get(PROXY_PATH, null)
12
+ }
13
+
10
14
  constructor(
11
- @Optional() @Inject(PROXY_PATH) private proxyPath: string,
15
+ private injector: Injector,
12
16
  private location: Location
13
17
  ) {}
14
18
 
@@ -6,12 +6,15 @@ export function sortByToStrings(sortBy: SortByField): string[] {
6
6
  }
7
7
 
8
8
  export function sortByToString(sortBy: SortByField): string {
9
- return sortByToStrings(sortBy)[0]
9
+ return sortByToStrings(sortBy).join(',')
10
10
  }
11
11
 
12
12
  export function sortByFromString(sortByString: string): SortByField {
13
- return [
14
- sortByString.startsWith('-') ? 'desc' : 'asc',
15
- sortByString.startsWith('-') ? sortByString.substring(1) : sortByString,
16
- ]
13
+ const fields = sortByString
14
+ .split(',')
15
+ .map((field) => [
16
+ field.startsWith('-') ? 'desc' : 'asc',
17
+ field.startsWith('-') ? field.substring(1) : field,
18
+ ]) as SortByField
19
+ return fields.length > 1 ? fields : (fields[0] as SortByField)
17
20
  }
@@ -418,6 +418,8 @@
418
418
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
419
419
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
420
420
  "record.metadata.api.accessServiceProtocol.other": "",
421
+ "record.metadata.api.accessServiceProtocol.postgis": "",
422
+ "record.metadata.api.accessServiceProtocol.stac": "",
421
423
  "record.metadata.api.accessServiceProtocol.tms": "",
422
424
  "record.metadata.api.accessServiceProtocol.wfs": "",
423
425
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -465,7 +467,8 @@
465
467
  "record.metadata.isGeographical": "Geographischer Datensatz",
466
468
  "record.metadata.keywords": "Stichworte",
467
469
  "record.metadata.languages": "Sprachen",
468
- "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
470
+ "record.metadata.link.postgis.table": "",
471
+ "record.metadata.link.postgis.tooltip": "",
469
472
  "record.metadata.linked.datasets": "Verknüpfte Datensätze",
470
473
  "record.metadata.linked.records": "Verknüpfte Inhalte",
471
474
  "record.metadata.linked.reuses": "Verknüpfte Wiederverwendungen",
@@ -506,6 +509,9 @@
506
509
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
507
510
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
508
511
  "record.metadata.related": "Entdecken Sie den Katalog",
512
+ "record.metadata.resourceCreated": "Erstellt am {date}",
513
+ "record.metadata.resourcePublished": "Veröffentlicht am {date}",
514
+ "record.metadata.resourceUpdated": "Zuletzt aktualisiert am {date}",
509
515
  "record.metadata.ressources.and.links": "Ressourcen und Links",
510
516
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
511
517
  "record.metadata.status": "Status",
@@ -518,8 +524,9 @@
518
524
  "record.metadata.title": "Titel",
519
525
  "record.metadata.topics": "Kategorien",
520
526
  "record.metadata.uniqueId": "Eindeutige Kennung",
527
+ "record.metadata.update": "Aktualisierungsdatum",
521
528
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
522
- "record.metadata.updatedOn": "Geändert am",
529
+ "record.metadata.updatedOn": "Informationen geändert am",
523
530
  "record.metadata.usage": "Nutzung und Einschränkungen",
524
531
  "record.metadata.userFeedbacks": "",
525
532
  "record.metadata.userFeedbacks.anonymousUser": "",
@@ -534,6 +541,7 @@
534
541
  "record.tab.chart": "Diagramm",
535
542
  "record.tab.data": "Tabelle",
536
543
  "record.tab.map": "Karte",
544
+ "record.tab.stac": "",
537
545
  "record.was.created.time": "erstellte diesen Ressource {time}",
538
546
  "records": "Datensätze",
539
547
  "results.layout.selectOne": "Layout auswählen",
@@ -542,7 +550,6 @@
542
550
  "results.records.hits.found": "{hits, plural, =0{Keine Ressource entsprechen der angegebenen Suche.} one{1 Ressource gefunden.} other{{hits} Ressourcen gefunden.}}",
543
551
  "results.records.hits.selected": "{ amount } ausgewählt",
544
552
  "results.showMore": "Mehr Ergebnisse anzeigen...",
545
- "results.sortBy.changeDate": "",
546
553
  "results.sortBy.dateStamp": "Neueste",
547
554
  "results.sortBy.popularity": "Beliebtheit",
548
555
  "results.sortBy.qualityScore": "Fertigstellungsanzeige",
@@ -241,7 +241,6 @@
241
241
  "editor.record.form.topics.inspire.intelligence": "Intelligence / Military",
242
242
  "editor.record.form.topics.inspire.location": "Location",
243
243
  "editor.record.form.topics.inspire.oceans": "Oceans",
244
- "editor.record.form.topics.inspire.placeholder": "Select an INSPIRE theme",
245
244
  "editor.record.form.topics.inspire.planning": "Planning / Cadastre",
246
245
  "editor.record.form.topics.inspire.society": "Society",
247
246
  "editor.record.form.topics.inspire.structure": "Structure",
@@ -419,6 +418,8 @@
419
418
  "record.metadata.api.accessServiceProtocol.maplibre-style": "maplibre-style",
420
419
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "ogcFeatures",
421
420
  "record.metadata.api.accessServiceProtocol.other": "other",
421
+ "record.metadata.api.accessServiceProtocol.postgis": "PostGIS",
422
+ "record.metadata.api.accessServiceProtocol.stac": "STAC",
422
423
  "record.metadata.api.accessServiceProtocol.tms": "tms",
423
424
  "record.metadata.api.accessServiceProtocol.wfs": "wfs",
424
425
  "record.metadata.api.accessServiceProtocol.wms": "wms",
@@ -466,7 +467,8 @@
466
467
  "record.metadata.isGeographical": "Geographical dataset",
467
468
  "record.metadata.keywords": "Keywords",
468
469
  "record.metadata.languages": "Languages",
469
- "record.metadata.lastUpdate": "Last updated on {date}",
470
+ "record.metadata.link.postgis.table": "table :",
471
+ "record.metadata.link.postgis.tooltip": "PostGIS resources do not have access links",
470
472
  "record.metadata.linked.datasets": "Associated datasets",
471
473
  "record.metadata.linked.records": "Associated content",
472
474
  "record.metadata.linked.reuses": "Associated reuses",
@@ -507,6 +509,9 @@
507
509
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
508
510
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
509
511
  "record.metadata.related": "Explore the catalog",
512
+ "record.metadata.resourceCreated": "Created on {date}",
513
+ "record.metadata.resourcePublished": "Published on {date}",
514
+ "record.metadata.resourceUpdated": "Last updated on {date}",
510
515
  "record.metadata.ressources.and.links": "Resources and links",
511
516
  "record.metadata.sheet": "Original metadata",
512
517
  "record.metadata.status": "Status",
@@ -519,8 +524,9 @@
519
524
  "record.metadata.title": "Title",
520
525
  "record.metadata.topics": "Categories",
521
526
  "record.metadata.uniqueId": "Unique Identifier",
527
+ "record.metadata.update": "Date of update",
522
528
  "record.metadata.updateFrequency": "Data Update Frequency",
523
- "record.metadata.updatedOn": "Updated on",
529
+ "record.metadata.updatedOn": "Metadata modified on",
524
530
  "record.metadata.usage": "License and Conditions",
525
531
  "record.metadata.userFeedbacks": "Questions / Answers",
526
532
  "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
@@ -535,6 +541,7 @@
535
541
  "record.tab.chart": "Chart",
536
542
  "record.tab.data": "Table",
537
543
  "record.tab.map": "Map",
544
+ "record.tab.stac": "STAC",
538
545
  "record.was.created.time": "created this record {time}",
539
546
  "records": "datasets",
540
547
  "results.layout.selectOne": "Results layout",
@@ -543,7 +550,6 @@
543
550
  "results.records.hits.found": "{hits, plural, =0{No record match the specified search.} one{1 record found.} other{{hits} records found.}}",
544
551
  "results.records.hits.selected": "{ amount } selected",
545
552
  "results.showMore": "Show more results...",
546
- "results.sortBy.changeDate": "Last modification",
547
553
  "results.sortBy.dateStamp": "Newest",
548
554
  "results.sortBy.popularity": "Popularity",
549
555
  "results.sortBy.qualityScore": "Completion score",
@@ -554,7 +560,7 @@
554
560
  "search.error.organizationHasNoDataset": "This organization has no records yet.",
555
561
  "search.error.organizationNotFound": "This organization could not be found.",
556
562
  "search.error.receivedError": "An error was received",
557
- "search.error.recordHasnolink": "This record currently has no link yet, please come back later.",
563
+ "search.error.recordHasnolink": "This record currently has no link.",
558
564
  "search.error.recordNotFound": "The record with identifier \"{ id }\" could not be found.",
559
565
  "search.field.any.placeholder": "Search in the catalog ...",
560
566
  "search.field.sortBy": "Sort by:",
@@ -418,6 +418,8 @@
418
418
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
419
419
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
420
420
  "record.metadata.api.accessServiceProtocol.other": "",
421
+ "record.metadata.api.accessServiceProtocol.postgis": "",
422
+ "record.metadata.api.accessServiceProtocol.stac": "",
421
423
  "record.metadata.api.accessServiceProtocol.tms": "",
422
424
  "record.metadata.api.accessServiceProtocol.wfs": "",
423
425
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -465,7 +467,8 @@
465
467
  "record.metadata.isGeographical": "",
466
468
  "record.metadata.keywords": "",
467
469
  "record.metadata.languages": "",
468
- "record.metadata.lastUpdate": "",
470
+ "record.metadata.link.postgis.table": "",
471
+ "record.metadata.link.postgis.tooltip": "",
469
472
  "record.metadata.linked.datasets": "",
470
473
  "record.metadata.linked.records": "",
471
474
  "record.metadata.linked.reuses": "",
@@ -506,6 +509,9 @@
506
509
  "record.metadata.quality.updateFrequency.failed": "",
507
510
  "record.metadata.quality.updateFrequency.success": "",
508
511
  "record.metadata.related": "",
512
+ "record.metadata.resourceCreated": "",
513
+ "record.metadata.resourcePublished": "",
514
+ "record.metadata.resourceUpdated": "",
509
515
  "record.metadata.ressources.and.links": "Recursos y enlaces",
510
516
  "record.metadata.sheet": "",
511
517
  "record.metadata.status": "",
@@ -518,6 +524,7 @@
518
524
  "record.metadata.title": "",
519
525
  "record.metadata.topics": "",
520
526
  "record.metadata.uniqueId": "",
527
+ "record.metadata.update": "",
521
528
  "record.metadata.updateFrequency": "",
522
529
  "record.metadata.updatedOn": "",
523
530
  "record.metadata.usage": "",
@@ -534,6 +541,7 @@
534
541
  "record.tab.chart": "",
535
542
  "record.tab.data": "",
536
543
  "record.tab.map": "",
544
+ "record.tab.stac": "",
537
545
  "record.was.created.time": "",
538
546
  "records": "",
539
547
  "results.layout.selectOne": "",
@@ -542,7 +550,6 @@
542
550
  "results.records.hits.found": "",
543
551
  "results.records.hits.selected": "",
544
552
  "results.showMore": "",
545
- "results.sortBy.changeDate": "",
546
553
  "results.sortBy.dateStamp": "",
547
554
  "results.sortBy.popularity": "",
548
555
  "results.sortBy.qualityScore": "",