geonetwork-ui 2.2.0-dev.162f13e3 → 2.2.0-dev.177cac3b

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 (101) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +2 -1
  2. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +1 -1
  3. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +64 -0
  4. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +63 -0
  5. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +8 -2
  6. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +5 -3
  7. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +3 -1
  8. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +7 -4
  9. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +1 -1
  10. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +4 -4
  11. package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +1 -1
  12. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  13. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +27 -0
  14. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +17 -0
  15. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  16. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +12 -6
  17. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +3 -3
  18. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +7 -3
  19. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +13 -3
  20. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  21. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +2 -2
  22. package/esm2022/libs/ui/search/src/lib/record-preview-card/record-preview-card.component.mjs +1 -1
  23. package/esm2022/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.mjs +1 -1
  24. package/esm2022/libs/ui/search/src/lib/record-preview-list/record-preview-list.component.mjs +1 -1
  25. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +1 -1
  26. package/esm2022/libs/ui/search/src/lib/record-preview-title/record-preview-title.component.mjs +1 -1
  27. package/esm2022/libs/util/i18n/src/index.mjs +2 -1
  28. package/esm2022/translations/de.json +13 -1
  29. package/esm2022/translations/en.json +16 -4
  30. package/esm2022/translations/es.json +12 -0
  31. package/esm2022/translations/fr.json +16 -4
  32. package/esm2022/translations/it.json +24 -12
  33. package/esm2022/translations/nl.json +12 -0
  34. package/esm2022/translations/pt.json +12 -0
  35. package/fesm2022/geonetwork-ui.mjs +326 -78
  36. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  37. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  38. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts +22 -0
  39. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts.map +1 -0
  40. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts +22 -0
  41. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts.map +1 -0
  42. package/libs/feature/map/src/lib/feature-map.module.d.ts +14 -12
  43. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  44. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  45. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  46. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +2 -1
  47. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  48. package/libs/ui/elements/src/index.d.ts +2 -0
  49. package/libs/ui/elements/src/index.d.ts.map +1 -1
  50. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts +10 -0
  51. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts.map +1 -0
  52. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +8 -0
  53. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -0
  54. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +1 -0
  55. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  56. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +3 -2
  57. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  58. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -11
  59. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  60. package/libs/util/i18n/src/index.d.ts +1 -0
  61. package/libs/util/i18n/src/index.d.ts.map +1 -1
  62. package/package.json +1 -1
  63. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +1 -0
  64. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.css +0 -0
  65. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.html +37 -0
  66. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.ts +64 -0
  67. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.css +0 -0
  68. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.html +55 -0
  69. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.ts +63 -0
  70. package/src/libs/feature/map/src/lib/feature-map.module.ts +4 -0
  71. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +6 -2
  72. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +6 -0
  73. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +12 -4
  74. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -0
  75. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -0
  76. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.ts +1 -1
  77. package/src/libs/ui/elements/src/index.ts +2 -0
  78. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.css +0 -0
  79. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +29 -0
  80. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.ts +15 -0
  81. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +264 -0
  82. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.html +1 -0
  83. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +16 -0
  84. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  85. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +4 -0
  86. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +59 -32
  87. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +5 -0
  88. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +1 -1
  89. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +4 -0
  90. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +6 -0
  91. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +8 -3
  92. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.css +1 -0
  93. package/src/libs/util/i18n/src/index.ts +1 -0
  94. package/translations/de.json +13 -1
  95. package/translations/en.json +16 -4
  96. package/translations/es.json +12 -0
  97. package/translations/fr.json +16 -4
  98. package/translations/it.json +24 -12
  99. package/translations/nl.json +12 -0
  100. package/translations/pt.json +12 -0
  101. package/translations/sk.json +12 -0
@@ -1,10 +1,18 @@
1
- <div>
2
- <span class="align-text-top mr-1.5 favorite-count" *ngIf="hasFavoriteCount">{{
3
- favoriteCount
4
- }}</span>
1
+ <div class="flex flex-row content-center">
2
+ <span
3
+ class="align-text-top mr-1.5 mt-1.5 favorite-count"
4
+ *ngIf="hasFavoriteCount && displayCount"
5
+ >{{ favoriteCount }}</span
6
+ >
5
7
  <gn-ui-star-toggle
6
8
  [toggled]="isFavorite$ | async"
7
9
  (newValue)="toggleFavorite($event)"
8
10
  [disabled]="loading || (isAnonymous$ | async)"
11
+ class="mt-1"
9
12
  ></gn-ui-star-toggle>
13
+ <span
14
+ class="align-text-top ml-1.5 favorite-count mt-1.5"
15
+ *ngIf="!displayCount"
16
+ translate="datahub.record.addToFavorites"
17
+ ></span>
10
18
  </div>
@@ -24,6 +24,7 @@ import { PlatformServiceInterface } from '../../../../../../../libs/common/domai
24
24
  changeDetection: ChangeDetectionStrategy.OnPush,
25
25
  })
26
26
  export class FavoriteStarComponent implements AfterViewInit, OnDestroy {
27
+ @Input() displayCount? = true
27
28
  @Input() set record(value) {
28
29
  this.record_ = value
29
30
  this.favoriteCount =
@@ -5,5 +5,6 @@
5
5
  [selected]="currentLang"
6
6
  ariaName="languages"
7
7
  [showTitle]="false"
8
+ [extraBtnClass]="'flex justify-items-center text-white !pl-2 !py-1'"
8
9
  >
9
10
  </gn-ui-dropdown-selector>
@@ -34,7 +34,7 @@ export class LanguageSwitcherComponent implements OnInit {
34
34
  ngOnInit(): void {
35
35
  const languages = this.languagePlaceholder || DEFAULT_LANGUAGES
36
36
  this.languageList = languages.map((language) => ({
37
- label: `language.${language}`,
37
+ label: `${language}`.toUpperCase(),
38
38
  value: language,
39
39
  }))
40
40
  }
@@ -19,3 +19,5 @@ export * from './lib/related-record-card/related-record-card.component'
19
19
  export * from './lib/search-results-error/search-results-error.component'
20
20
  export * from './lib/user-preview/user-preview.component'
21
21
  export * from './lib/record-api-form/record-api-form.component'
22
+ export * from './lib/markdown-parser/markdown-parser.component'
23
+ export * from './lib/image-overlay-preview/image-overlay-preview.component'
@@ -0,0 +1,29 @@
1
+ <gn-ui-content-ghost
2
+ [showContent]="imageUrl !== undefined"
3
+ ghostClass="h-36 mb-3"
4
+ >
5
+ <div
6
+ *ngIf="imageUrl"
7
+ data-cy="record-thumbnail"
8
+ class="flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 h-36 group-hover:shadow-xl group-hover:border-0 mb-3"
9
+ >
10
+ <gn-ui-thumbnail
11
+ class="relative h-full w-full"
12
+ [thumbnailUrl]="imageUrl"
13
+ fit="cover"
14
+ (placeholderShown)="isPlaceholderShown.emit($event)"
15
+ ></gn-ui-thumbnail>
16
+ <div class="relative">
17
+ <gn-ui-button
18
+ class="absolute bottom-0 right-0 z-10 mr-2 mb-2"
19
+ [type]="'outline'"
20
+ [extraClass]="'!py-2 !px-0'"
21
+ (buttonClick)="openLightbox(imageUrl)"
22
+ >
23
+ <mat-icon class="material-symbols-outlined font-extralight"
24
+ >zoom_out_map</mat-icon
25
+ >
26
+ </gn-ui-button>
27
+ </div>
28
+ </div>
29
+ </gn-ui-content-ghost>
@@ -0,0 +1,15 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core'
2
+ import * as basicLightbox from 'basiclightbox'
3
+
4
+ @Component({
5
+ selector: 'gn-ui-image-overlay-preview',
6
+ templateUrl: './image-overlay-preview.component.html',
7
+ styleUrls: ['./image-overlay-preview.component.css'],
8
+ })
9
+ export class ImageOverlayPreviewComponent {
10
+ @Input() imageUrl: string
11
+ @Output() isPlaceholderShown = new EventEmitter<boolean>()
12
+ openLightbox(src: string) {
13
+ basicLightbox.create(`<img src="${src}"/>`).show()
14
+ }
15
+ }
@@ -0,0 +1,264 @@
1
+ /** Body **/
2
+ :host /deep/ .markdown-body {
3
+ -ms-text-size-adjust: 100%;
4
+ -webkit-text-size-adjust: 100%;
5
+ margin: 0px 0px 1.5rem 0px;
6
+ line-height: 1.5;
7
+ word-wrap: break-word;
8
+ }
9
+
10
+ /** Emphasis **/
11
+
12
+ :host /deep/ .markdown-body strong {
13
+ @apply font-bold;
14
+ color: var(--color-secondary-darker);
15
+ }
16
+
17
+ /** Headings **/
18
+
19
+ :host /deep/ .markdown-body h1,
20
+ :host /deep/ .markdown-body h2,
21
+ :host /deep/ .markdown-body h3,
22
+ :host /deep/ .markdown-body h4,
23
+ :host /deep/ .markdown-body h5,
24
+ :host /deep/ .markdown-body h6 {
25
+ margin-top: 24px;
26
+ margin-bottom: 16px;
27
+ line-height: 1.25;
28
+ @apply text-title font-title font-bold;
29
+ }
30
+
31
+ :host /deep/ .markdown-body h1 {
32
+ margin: 0.67em 0;
33
+ padding-bottom: 0.3em;
34
+ font-size: 2em;
35
+ color: var(--color-primary);
36
+ }
37
+
38
+ :host /deep/ .markdown-body h2 {
39
+ padding-bottom: 0.3em;
40
+ font-size: 1.5em;
41
+ color: var(--color-secondary);
42
+ }
43
+
44
+ :host /deep/ .markdown-body h3 {
45
+ font-size: 1.25em;
46
+ color: var(--color-secondary);
47
+ }
48
+
49
+ :host /deep/ .markdown-body h4 {
50
+ font-size: 1em;
51
+ color: var(--color-secondary);
52
+ }
53
+
54
+ :host /deep/ .markdown-body h5 {
55
+ font-size: 0.875em;
56
+ color: var(--color-secondary);
57
+ }
58
+
59
+ :host /deep/ .markdown-body h6 {
60
+ font-size: 0.85em;
61
+ color: var(--color-secondary-lighter);
62
+ }
63
+
64
+ /** Paragraphs **/
65
+
66
+ :host /deep/ .markdown-body p {
67
+ margin-top: 0;
68
+ margin-bottom: 10px;
69
+ }
70
+
71
+ /** Links **/
72
+
73
+ :host /deep/ .markdown-body p > a {
74
+ margin-top: 0;
75
+ margin-bottom: 10px;
76
+ color: var(--color-primary) !important;
77
+ text-decoration: none !important;
78
+ @apply font-bold;
79
+ }
80
+
81
+ :host /deep/ .markdown-body p > a:hover {
82
+ color: var(--color-primary-darker) !important;
83
+ }
84
+
85
+ /** Blockquotes **/
86
+
87
+ :host /deep/ .markdown-body blockquote {
88
+ margin: 0;
89
+ padding: 0 1em;
90
+ color: var(--color-secondary-lighter);
91
+ border-left: 0.25em solid var(--color-primary-lighter);
92
+ }
93
+
94
+ /** Code **/
95
+
96
+ :host /deep/ .markdown-body pre {
97
+ margin-top: 0;
98
+ margin-bottom: 0;
99
+ font-size: 12px;
100
+ background-color: var(--color-gray-100);
101
+ word-wrap: normal;
102
+ }
103
+
104
+ :host /deep/ .markdown-body pre {
105
+ padding: 16px;
106
+ overflow: auto;
107
+ font-size: 85%;
108
+ line-height: 1.45;
109
+ color: var(--color-secondary);
110
+ border-radius: 6px;
111
+ }
112
+
113
+ :host /deep/ .markdown-body code {
114
+ padding: 0.2em 0.4em;
115
+ margin: 0;
116
+ font-size: 85%;
117
+ white-space: break-spaces;
118
+ border-radius: 6px;
119
+ }
120
+
121
+ :host /deep/ .markdown-body pre code {
122
+ display: inline;
123
+ max-width: auto;
124
+ padding: 0;
125
+ margin: 0;
126
+ overflow: visible;
127
+ line-height: inherit;
128
+ word-wrap: normal;
129
+ border: 0;
130
+ }
131
+
132
+ /** Horizontal rules **/
133
+
134
+ :host /deep/ .markdown-body hr {
135
+ box-sizing: content-box;
136
+ overflow: hidden;
137
+ background: transparent;
138
+ border-bottom: 1px solid var(--color-secondary);
139
+ height: 0.15em;
140
+ padding: 0;
141
+ margin: 24px 0;
142
+ background-color: var(--color-secondary);
143
+ border: 0;
144
+ }
145
+
146
+ :host /deep/ .markdown-body hr::before {
147
+ display: table;
148
+ content: '';
149
+ }
150
+
151
+ :host /deep/ .markdown-body hr::after {
152
+ display: table;
153
+ clear: both;
154
+ content: '';
155
+ }
156
+
157
+ /** Lists **/
158
+
159
+ :host /deep/ .markdown-body ul,
160
+ :host /deep/ .markdown-body ol {
161
+ margin-top: 0;
162
+ margin-bottom: 0;
163
+ padding-left: 2em;
164
+ list-style: revert;
165
+ }
166
+
167
+ :host /deep/ .markdown-body ol ol,
168
+ :host /deep/ .markdown-body ul ol {
169
+ list-style-type: lower-roman;
170
+ }
171
+
172
+ :host /deep/ .markdown-body ul ul ol,
173
+ :host /deep/ .markdown-body ul ol ol,
174
+ :host /deep/ .markdown-body ol ul ol,
175
+ :host /deep/ .markdown-body ol ol ol {
176
+ list-style-type: lower-alpha;
177
+ }
178
+
179
+ :host /deep/ .markdown-body ol[type='a s'] {
180
+ list-style-type: lower-alpha;
181
+ }
182
+
183
+ :host /deep/ .markdown-body ol[type='A s'] {
184
+ list-style-type: upper-alpha;
185
+ }
186
+
187
+ :host /deep/ .markdown-body ol[type='i s'] {
188
+ list-style-type: lower-roman;
189
+ }
190
+
191
+ :host /deep/ .markdown-body ol[type='I s'] {
192
+ list-style-type: upper-roman;
193
+ }
194
+
195
+ :host /deep/ .markdown-body ol[type='1'] {
196
+ list-style: unset;
197
+ list-style-type: decimal;
198
+ }
199
+
200
+ :host /deep/ .markdown-body div > ol:not([type]) {
201
+ list-style: unset;
202
+ list-style-type: decimal;
203
+ }
204
+
205
+ /** Table **/
206
+
207
+ :host /deep/ .markdown-body table {
208
+ border-spacing: 0;
209
+ border-collapse: collapse;
210
+ display: block;
211
+ width: max-content;
212
+ max-width: 100%;
213
+ overflow: auto;
214
+ padding-bottom: 15px;
215
+ }
216
+
217
+ :host /deep/ .markdown-body td,
218
+ :host /deep/ .markdown-body th {
219
+ padding: 0;
220
+ }
221
+
222
+ :host /deep/ .markdown-body th {
223
+ color: var(--color-secondary);
224
+ }
225
+
226
+ :host /deep/ .markdown-body table th,
227
+ :host /deep/ .markdown-body table td {
228
+ padding: 6px 13px;
229
+ border: 1px solid var(--color-gray-500);
230
+ }
231
+
232
+ :host /deep/ .markdown-body table td > :last-child {
233
+ margin-bottom: 0;
234
+ }
235
+
236
+ :host /deep/ .markdown-body table tr {
237
+ background-color: #ffffff;
238
+ border-top: 1px solid var(--color-secondary-lighter);
239
+ }
240
+
241
+ :host /deep/ .markdown-body table tr:nth-child(2n) {
242
+ background-color: var(--color-gray-100);
243
+ }
244
+
245
+ :host /deep/ .markdown-body table img {
246
+ background-color: transparent;
247
+ }
248
+
249
+ /** Images **/
250
+
251
+ :host /deep/ .markdown-body img {
252
+ border-style: none;
253
+ max-width: 100%;
254
+ box-sizing: content-box;
255
+ background-color: transparent;
256
+ }
257
+
258
+ :host /deep/ .markdown-body img[align='right'] {
259
+ padding-left: 20px;
260
+ }
261
+
262
+ :host /deep/ .markdown-body img[align='left'] {
263
+ padding-right: 20px;
264
+ }
@@ -0,0 +1 @@
1
+ <div class="markdown-body" [innerHTML]="parsedMarkdown"></div>
@@ -0,0 +1,16 @@
1
+ import { Component, Input, ChangeDetectionStrategy } from '@angular/core'
2
+ import { marked } from 'marked'
3
+
4
+ @Component({
5
+ selector: 'gn-ui-markdown-parser',
6
+ templateUrl: './markdown-parser.component.html',
7
+ styleUrls: ['./markdown-parser.component.css'],
8
+ changeDetection: ChangeDetectionStrategy.OnPush,
9
+ })
10
+ export class MarkdownParserComponent {
11
+ @Input() textContent: string
12
+
13
+ get parsedMarkdown() {
14
+ return marked.parse(this.textContent)
15
+ }
16
+ }
@@ -20,7 +20,7 @@
20
20
  (click)="onOrganizationClick()"
21
21
  data-cy="organization-name"
22
22
  >
23
- {{ shownOrganization.name }}
23
+ {{ shownOrganization?.name }}
24
24
  </div>
25
25
  </div>
26
26
  <div *ngIf="shownOrganization?.website">
@@ -7,3 +7,7 @@
7
7
  padding-bottom: 10px;
8
8
  @apply border-b border-gray-300;
9
9
  }
10
+
11
+ :host ::ng-deep gn-ui-copy-text-button button mat-icon {
12
+ transform: scale(0.8);
13
+ }
@@ -1,32 +1,10 @@
1
- <p
2
- class="text-[28px] text-title text-center mb-6 font-title sm:text-left"
3
- translate
4
- >
5
- record.metadata.about
6
- </p>
7
1
  <div class="mb-6 md-description sm:mb-4 sm:pr-16">
8
2
  <gn-ui-content-ghost ghostClass="h-32" [showContent]="fieldReady('abstract')">
9
3
  <gn-ui-max-lines [maxLines]="6" *ngIf="metadata.abstract">
10
4
  <div>
11
- <p
12
- class="whitespace-pre-line break-words sm:mb-4 sm:pr-16"
13
- [innerHTML]="metadata.abstract"
14
- gnUiLinkify
15
- ></p>
16
- <ng-container *ngIf="metadata.keywords?.length">
17
- <p class="mb-3 font-medium text-primary text-sm" translate>
18
- record.metadata.keywords
19
- </p>
20
- <div class="sm:pb-4 sm:pr-16">
21
- <gn-ui-badge
22
- class="inline-block mr-2 mb-2 lowercase"
23
- (click)="onKeywordClick(keyword)"
24
- [clickable]="true"
25
- *ngFor="let keyword of metadata.keywords"
26
- >{{ keyword }}</gn-ui-badge
27
- >
28
- </div>
29
- </ng-container>
5
+ <gn-ui-markdown-parser
6
+ [textContent]="metadata.abstract"
7
+ ></gn-ui-markdown-parser>
30
8
  </div>
31
9
  </gn-ui-max-lines>
32
10
  </gn-ui-content-ghost>
@@ -97,12 +75,61 @@
97
75
  *ngIf="metadata.landingPage"
98
76
  [title]="'record.metadata.details' | translate"
99
77
  >
100
- <div class="py-5 px-5 rounded bg-gray-100 text-gray-700">
101
- <p class="text-sm" translate>record.metadata.sheet</p>
102
- <p class="text-primary font-medium mt-1" translate>
103
- <a [href]="metadata.landingPage" target="_blank">
104
- <span class="break-all" gnUiLinkify>{{ metadata.landingPage }}</span>
105
- </a>
106
- </p>
78
+ <div class="flex flex-col gap-4 mr-4 py-5 rounded text-gray-700">
79
+ <div *ngIf="metadata.recordUpdated">
80
+ <p class="text-sm" translate>record.metadata.updatedOn</p>
81
+ <p class="text-primary font-medium">
82
+ {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}
83
+ </p>
84
+ </div>
85
+ <div *ngIf="metadata.landingPage">
86
+ <p class="text-sm" translate>record.metadata.sheet</p>
87
+ <p class="text-primary font-medium" translate>
88
+ <a [href]="metadata.landingPage" target="_blank">
89
+ <span class="break-all" gnUiLinkify>{{ metadata.landingPage }}</span>
90
+ </a>
91
+ </p>
92
+ </div>
93
+ <div *ngIf="metadata.ownerOrganization">
94
+ <p class="text-sm" translate>record.metadata.owner</p>
95
+ <p class="text-primary font-medium">
96
+ {{ metadata.ownerOrganization.name }}
97
+ </p>
98
+ </div>
99
+ <div *ngIf="metadata.uniqueIdentifier">
100
+ <p class="text-sm" translate>record.metadata.uniqueId</p>
101
+ <div class="flex flex-row content-align items-end gap-1">
102
+ <gn-ui-copy-text-button
103
+ [text]="metadata.uniqueIdentifier"
104
+ [tooltipText]="'tooltip.id.copy' | translate"
105
+ [displayText]="false"
106
+ ></gn-ui-copy-text-button>
107
+ <p class="text-primary font-medium">
108
+ {{ metadata.uniqueIdentifier }}
109
+ </p>
110
+ </div>
111
+ </div>
112
+ <div *ngIf="metadata.themes?.length">
113
+ <p class="text-sm mb-1" translate>record.metadata.themes</p>
114
+ <div class="sm:pb-4 sm:pr-16">
115
+ <gn-ui-badge
116
+ class="inline-block mr-2 lowercase"
117
+ *ngFor="let theme of metadata.themes"
118
+ >{{ theme }}</gn-ui-badge
119
+ >
120
+ </div>
121
+ </div>
122
+ <div *ngIf="metadata.keywords?.length">
123
+ <p class="text-sm mb-1" translate>record.metadata.keywords</p>
124
+ <div class="sm:pb-4 sm:pr-16">
125
+ <gn-ui-badge
126
+ class="inline-block mr-2 mb-2 lowercase"
127
+ (click)="onKeywordClick(keyword)"
128
+ [clickable]="true"
129
+ *ngFor="let keyword of metadata.keywords"
130
+ >{{ keyword }}</gn-ui-badge
131
+ >
132
+ </div>
133
+ </div>
107
134
  </div>
108
135
  </gn-ui-expandable-panel>
@@ -56,4 +56,9 @@ export class MetadataInfoComponent {
56
56
  onKeywordClick(keyword: string) {
57
57
  this.keyword.emit(keyword)
58
58
  }
59
+
60
+ copyText() {
61
+ navigator.clipboard.writeText(this.metadata.uniqueIdentifier)
62
+ ;(event.target as HTMLElement).blur()
63
+ }
59
64
  }
@@ -6,7 +6,7 @@
6
6
  <div class="h-52 bg-gray-100">
7
7
  <gn-ui-thumbnail
8
8
  class="h-52 w-full object-cover"
9
- [thumbnailUrl]="record.overviews?.[0].url.toString()"
9
+ [thumbnailUrl]="record.overviews?.[0]?.url.toString()"
10
10
  ></gn-ui-thumbnail>
11
11
  </div>
12
12
  <div class="flex flex-col justify-between h-44 px-5 pt-4 pb-6">
@@ -10,6 +10,8 @@ import {
10
10
  Optional,
11
11
  SimpleChanges,
12
12
  ViewChild,
13
+ Output,
14
+ EventEmitter,
13
15
  } from '@angular/core'
14
16
 
15
17
  export const THUMBNAIL_PLACEHOLDER = new InjectionToken<string>(
@@ -36,6 +38,7 @@ export class ThumbnailComponent implements OnInit, OnChanges {
36
38
  @Input() fit: FitOptions | FitOptions[] = 'cover'
37
39
  @ViewChild('imageElement') imgElement: ElementRef<HTMLImageElement>
38
40
  @ViewChild('containerElement') containerElement: ElementRef<HTMLDivElement>
41
+ @Output() placeholderShown = new EventEmitter<boolean>()
39
42
  imgUrl: string
40
43
  imgFit: FitOptions
41
44
  placeholderUrl = this.optionalPlaceholderUrl || DEFAULT_PLACEHOLDER
@@ -85,6 +88,7 @@ export class ThumbnailComponent implements OnInit, OnChanges {
85
88
  private setNewSrcImage(image: ThumbnailImageObject) {
86
89
  this.imgFit = image.fit
87
90
  this.imgUrl = image.url
91
+ this.placeholderShown.emit(this.isPlaceholder)
88
92
  }
89
93
 
90
94
  private setPlaceholder(): void {
@@ -29,6 +29,8 @@ import { GnUiLinkifyDirective } from './metadata-info/linkify.directive'
29
29
  import { PaginationButtonsComponent } from './pagination-buttons/pagination-buttons.component'
30
30
  import { MaxLinesComponent } from './max-lines/max-lines.component'
31
31
  import { RecordApiFormComponent } from './record-api-form/record-api-form.component'
32
+ import { MarkdownParserComponent } from './markdown-parser/markdown-parser.component'
33
+ import { ImageOverlayPreviewComponent } from './image-overlay-preview/image-overlay-preview.component'
32
34
 
33
35
  @NgModule({
34
36
  imports: [
@@ -65,6 +67,8 @@ import { RecordApiFormComponent } from './record-api-form/record-api-form.compon
65
67
  PaginationButtonsComponent,
66
68
  MaxLinesComponent,
67
69
  RecordApiFormComponent,
70
+ MarkdownParserComponent,
71
+ ImageOverlayPreviewComponent,
68
72
  ],
69
73
  exports: [
70
74
  MetadataInfoComponent,
@@ -85,6 +89,8 @@ import { RecordApiFormComponent } from './record-api-form/record-api-form.compon
85
89
  UserPreviewComponent,
86
90
  PaginationButtonsComponent,
87
91
  RecordApiFormComponent,
92
+ MarkdownParserComponent,
93
+ ImageOverlayPreviewComponent,
88
94
  ],
89
95
  })
90
96
  export class UiElementsModule {}
@@ -1,6 +1,11 @@
1
1
  <button
2
- class="group flex items-center justify-center backdrop-blur p-1 bg-primary-opacity-50 text-white rounded"
2
+ class="group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center"
3
3
  >
4
- <mat-icon class="material-symbols-outlined align-middle">{{ icon }}</mat-icon>
5
- <span class="mx-2 hidden group-hover:inline">{{ label }}</span>
4
+ <mat-icon class="material-symbols-outlined align-middle w-[18px]">{{
5
+ icon
6
+ }}</mat-icon>
7
+ <span
8
+ class="mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75"
9
+ >{{ label.toUpperCase() }}</span
10
+ >
6
11
  </button>
@@ -11,6 +11,7 @@ mat-icon {
11
11
  font-size: 1.5em;
12
12
  margin-top: -0.1em;
13
13
  font-variation-settings: 'opsz' 40;
14
+ stroke: var(--color-primary-darker);
14
15
  }
15
16
 
16
17
  .star-filled {
@@ -5,3 +5,4 @@ export * from './lib/lang.service'
5
5
  export * from './lib/file.translate.loader'
6
6
  export * from './lib/testing/test.translate.module'
7
7
  export * from './lib/embedded.translate.loader'
8
+ export * from './lib/translate.loader.utils'
@@ -115,6 +115,7 @@
115
115
  "datahub.news.contact.title": "",
116
116
  "datahub.news.feed": "Nachrichtenfeed",
117
117
  "datahub.news.figures": "Indikatoren",
118
+ "datahub.record.addToFavorites": "",
118
119
  "datahub.search.back": "Zurück zu den Ergebnissen",
119
120
  "datahub.search.filter.all": "Alle",
120
121
  "datahub.search.filter.generatedByWfs": "Generiert durch API",
@@ -175,10 +176,15 @@
175
176
  "map.add.layer.file": "Aus einer Datei",
176
177
  "map.add.layer.wfs": "Aus WFS",
177
178
  "map.add.layer.wms": "Aus WMS",
179
+ "map.layer.add": "",
180
+ "map.layers.available": "",
178
181
  "map.layers.list": "Ebenen",
179
182
  "map.loading.data": "Kartendaten werden geladen...",
183
+ "map.loading.service": "",
180
184
  "map.navigation.message": "Bitte verwenden Sie STRG + Maus (oder zwei Finger auf einem Mobilgerät), um die Karte zu navigieren",
181
185
  "map.select.layer": "Datenquelle",
186
+ "map.wfs.urlInput.hint": "",
187
+ "map.wms.urlInput.hint": "",
182
188
  "multiselect.filter.placeholder": "Suche",
183
189
  "nav.back": "Zurück",
184
190
  "next": "weiter",
@@ -213,14 +219,16 @@
213
219
  "record.metadata.catalog": "Katalog",
214
220
  "record.metadata.contact": "Kontakt",
215
221
  "record.metadata.createdOn": "Erstellt am",
216
- "record.metadata.details": "Details",
222
+ "record.metadata.details": "Technische Informationen",
217
223
  "record.metadata.download": "Downloads",
218
224
  "record.metadata.formats": "",
219
225
  "record.metadata.isOpenData": "Open Data",
220
226
  "record.metadata.keywords": "Stichworte",
227
+ "record.metadata.lastUpdate": "",
221
228
  "record.metadata.links": "Links",
222
229
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Verwendungsbedingungen angegeben.",
223
230
  "record.metadata.origin": "Über die Daten",
231
+ "record.metadata.owner": "",
224
232
  "record.metadata.preview": "Vorschau",
225
233
  "record.metadata.publications": "Veröffentlichungen",
226
234
  "record.metadata.quality": "",
@@ -243,7 +251,10 @@
243
251
  "record.metadata.quality.updateFrequency.success": "",
244
252
  "record.metadata.related": "Ähnliche Datensätze",
245
253
  "record.metadata.sheet": "Weitere Informationen erhalten Sie unter :",
254
+ "record.metadata.themes": "",
246
255
  "record.metadata.title": "Titel",
256
+ "record.metadata.type": "",
257
+ "record.metadata.uniqueId": "",
247
258
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
248
259
  "record.metadata.updateStatus": "Aktualisierungsstatus der Daten",
249
260
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
@@ -307,6 +318,7 @@
307
318
  "table.object.count": "Objekte in diesem Datensatz",
308
319
  "table.select.data": "Datenquelle",
309
320
  "tooltip.html.copy": "HTML kopieren",
321
+ "tooltip.id.copy": "",
310
322
  "tooltip.url.copy": "URL kopieren",
311
323
  "tooltip.url.open": "URL öffnen",
312
324
  "ui.readLess": "Weniger lesen",