geonetwork-ui 2.6.0-dev.7be6567ef → 2.6.0-dev.9df114cd4
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.
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +6 -1
- package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
- package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +5 -1
- package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +5 -1
- package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +6 -1
- package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +7 -6
- package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
- package/esm2022/libs/ui/elements/src/index.mjs +2 -1
- package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +163 -0
- package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -3
- package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -4
- package/esm2022/libs/ui/inputs/src/index.mjs +1 -2
- package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +4 -3
- package/esm2022/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.mjs +43 -3
- package/esm2022/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2022/translations/de.json +8 -1
- package/esm2022/translations/en.json +8 -1
- package/esm2022/translations/es.json +8 -1
- package/esm2022/translations/fr.json +10 -3
- package/esm2022/translations/it.json +8 -1
- package/esm2022/translations/nl.json +8 -1
- package/esm2022/translations/pt.json +8 -1
- package/fesm2022/geonetwork-ui.mjs +292 -44
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +3 -0
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts +1 -1
- package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
- package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
- package/libs/ui/elements/src/index.d.ts +1 -0
- package/libs/ui/elements/src/index.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +43 -0
- package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -0
- package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
- package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
- package/libs/ui/inputs/src/index.d.ts +0 -1
- package/libs/ui/inputs/src/index.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts +10 -3
- package/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +6 -0
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +3 -0
- package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +4 -0
- package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.ts +4 -0
- package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +5 -0
- package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +1 -7
- package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +14 -6
- package/src/libs/feature/search/src/lib/results-list/results-list.container.component.css +6 -0
- package/src/libs/ui/elements/src/index.ts +1 -0
- package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.css +0 -0
- package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +156 -0
- package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +190 -0
- package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +4 -2
- package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -0
- package/src/libs/ui/inputs/src/index.ts +0 -1
- package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +5 -5
- package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.ts +2 -1
- package/src/libs/ui/layout/src/lib/anchor-link/anchor-link.directive.ts +46 -2
- package/src/libs/ui/widgets/src/lib/progress-bar/progress-bar.component.html +2 -2
- package/tailwind.base.css +16 -11
- package/translations/de.json +8 -1
- package/translations/en.json +8 -1
- package/translations/es.json +8 -1
- package/translations/fr.json +10 -3
- package/translations/it.json +8 -1
- package/translations/nl.json +8 -1
- package/translations/pt.json +8 -1
- package/translations/sk.json +8 -1
- package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +0 -16
- package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts +0 -8
- package/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.d.ts.map +0 -1
- package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +0 -3
- package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +0 -9
- package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.ts +0 -15
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Component,
|
|
3
|
+
Input,
|
|
4
|
+
TemplateRef,
|
|
5
|
+
OnInit,
|
|
6
|
+
Output,
|
|
7
|
+
EventEmitter,
|
|
8
|
+
ElementRef,
|
|
9
|
+
} from '@angular/core'
|
|
10
|
+
import {
|
|
11
|
+
CatalogRecord,
|
|
12
|
+
Organization,
|
|
13
|
+
} from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
14
|
+
import { NgClass, NgIf, NgTemplateOutlet } from '@angular/common'
|
|
15
|
+
import { MarkdownParserComponent } from '../markdown-parser/markdown-parser.component'
|
|
16
|
+
import { MetadataQualityComponent } from '../metadata-quality/metadata-quality.component'
|
|
17
|
+
import { ThumbnailComponent } from '../thumbnail/thumbnail.component'
|
|
18
|
+
import {
|
|
19
|
+
propagateToDocumentOnly,
|
|
20
|
+
removeWhitespace,
|
|
21
|
+
stripHtml,
|
|
22
|
+
} from '../../../../../../libs/util/shared/src'
|
|
23
|
+
import {
|
|
24
|
+
NgIconComponent,
|
|
25
|
+
provideIcons,
|
|
26
|
+
provideNgIconsConfig,
|
|
27
|
+
} from '@ng-icons/core'
|
|
28
|
+
import {
|
|
29
|
+
matLocationSearchingOutline,
|
|
30
|
+
matEmailOutline,
|
|
31
|
+
matPhoneOutline,
|
|
32
|
+
matLocationOnOutline,
|
|
33
|
+
} from '@ng-icons/material-icons/outline'
|
|
34
|
+
import { matCode } from '@ng-icons/material-icons/baseline'
|
|
35
|
+
import { iconoirDatabase, iconoirMap, iconoirInternet } from '@ng-icons/iconoir'
|
|
36
|
+
import { TranslateModule } from '@ngx-translate/core'
|
|
37
|
+
import { marker } from '@biesbjerg/ngx-translate-extract-marker'
|
|
38
|
+
import { fromEvent, Subscription } from 'rxjs'
|
|
39
|
+
|
|
40
|
+
marker('record.kind.dataset')
|
|
41
|
+
marker('record.kind.reuse')
|
|
42
|
+
marker('record.kind.service')
|
|
43
|
+
|
|
44
|
+
type CardSize = 'L' | 'M' | 'S' | 'XS'
|
|
45
|
+
|
|
46
|
+
@Component({
|
|
47
|
+
selector: 'gn-ui-internal-link-card',
|
|
48
|
+
standalone: true,
|
|
49
|
+
imports: [
|
|
50
|
+
NgClass,
|
|
51
|
+
NgIf,
|
|
52
|
+
ThumbnailComponent,
|
|
53
|
+
MetadataQualityComponent,
|
|
54
|
+
NgTemplateOutlet,
|
|
55
|
+
NgIconComponent,
|
|
56
|
+
TranslateModule,
|
|
57
|
+
MarkdownParserComponent,
|
|
58
|
+
],
|
|
59
|
+
providers: [
|
|
60
|
+
provideIcons({
|
|
61
|
+
matLocationSearchingOutline,
|
|
62
|
+
matCode,
|
|
63
|
+
iconoirDatabase,
|
|
64
|
+
iconoirMap,
|
|
65
|
+
iconoirInternet,
|
|
66
|
+
matEmailOutline,
|
|
67
|
+
matPhoneOutline,
|
|
68
|
+
matLocationOnOutline,
|
|
69
|
+
}),
|
|
70
|
+
provideNgIconsConfig({
|
|
71
|
+
size: '1.2em',
|
|
72
|
+
}),
|
|
73
|
+
],
|
|
74
|
+
templateUrl: './internal-link-card.component.html',
|
|
75
|
+
styleUrls: ['./internal-link-card.component.css'],
|
|
76
|
+
})
|
|
77
|
+
export class InternalLinkCardComponent implements OnInit {
|
|
78
|
+
@Input() record: CatalogRecord
|
|
79
|
+
@Input() metadataQualityDisplay: boolean
|
|
80
|
+
@Input() favoriteTemplate: TemplateRef<{ $implicit: CatalogRecord }>
|
|
81
|
+
@Input() linkHref: string = null
|
|
82
|
+
@Input() isGeodata: boolean
|
|
83
|
+
@Input() set size(value: CardSize) {
|
|
84
|
+
this._size = value
|
|
85
|
+
this.cardClass = this.sizeClassMap[value] || ''
|
|
86
|
+
this.thumbnailContainerClass = this.thumbnailSizeClassMap[value] || 'hidden'
|
|
87
|
+
}
|
|
88
|
+
get size(): CardSize {
|
|
89
|
+
return this._size
|
|
90
|
+
}
|
|
91
|
+
@Output() mdSelect = new EventEmitter<CatalogRecord>()
|
|
92
|
+
subscription = new Subscription()
|
|
93
|
+
|
|
94
|
+
abstract: string
|
|
95
|
+
|
|
96
|
+
cardClass = ''
|
|
97
|
+
thumbnailContainerClass = ''
|
|
98
|
+
|
|
99
|
+
private _size: CardSize = 'M'
|
|
100
|
+
|
|
101
|
+
private readonly sizeClassMap: Record<CardSize, string> = {
|
|
102
|
+
L: 'min-h-[190px] md:w-[992px] py-3 px-3 flex items-start gap-5',
|
|
103
|
+
M: 'min-h-[140px] md:w-[570px] py-3 px-3 flex items-start gap-4',
|
|
104
|
+
S: 'min-h-[220px] md:w-[370px] py-3 px-3 flex gap-4',
|
|
105
|
+
XS: 'min-h-[108px] md:w-[570px] py-3 px-3 flex gap-4',
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private readonly thumbnailSizeClassMap: Record<CardSize, string> = {
|
|
109
|
+
L: 'w-[190px] h-[180px] rounded-lg overflow-hidden shrink-0',
|
|
110
|
+
M: 'w-[110px] h-[140px] rounded-lg overflow-hidden shrink-0',
|
|
111
|
+
S: 'hidden',
|
|
112
|
+
XS: 'hidden',
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private readonly titleClassMap: Record<CardSize, string> = {
|
|
116
|
+
L: 'text-xl line-clamp-2',
|
|
117
|
+
M: 'text-base line-clamp-2',
|
|
118
|
+
S: 'text-base line-clamp-3',
|
|
119
|
+
XS: 'text-base mt-3 line-clamp-2',
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
constructor(protected elementRef: ElementRef) {}
|
|
123
|
+
|
|
124
|
+
ngOnInit(): void {
|
|
125
|
+
this.abstract = removeWhitespace(stripHtml(this.record?.abstract))
|
|
126
|
+
this.subscription.add(
|
|
127
|
+
fromEvent(this.elementRef.nativeElement, 'click').subscribe(
|
|
128
|
+
(event: Event) => {
|
|
129
|
+
event.preventDefault()
|
|
130
|
+
propagateToDocumentOnly(event)
|
|
131
|
+
this.mdSelect.emit(this.record)
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
get organization(): Organization {
|
|
138
|
+
return this.record.ownerOrganization
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
get contacts() {
|
|
142
|
+
return (
|
|
143
|
+
(this.record.kind === 'dataset'
|
|
144
|
+
? this.record.contactsForResource
|
|
145
|
+
: this.record.contacts) || []
|
|
146
|
+
)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
getTitleClass() {
|
|
150
|
+
return (
|
|
151
|
+
this.titleClassMap[this._size] +
|
|
152
|
+
' ' +
|
|
153
|
+
(this.record.ownerOrganization?.name ? '' : 'mt-3') || ''
|
|
154
|
+
)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
openExternalUrl(event: Event, url: URL): void {
|
|
158
|
+
event.stopPropagation()
|
|
159
|
+
window.open(url, '_blank')
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
openMailto(event: Event, email: string): void {
|
|
163
|
+
event.stopPropagation()
|
|
164
|
+
window.open(`mailto:${email}`, '_blank')
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
copyToClipboard(event: Event, text: string): void {
|
|
168
|
+
event.stopPropagation()
|
|
169
|
+
navigator.clipboard.writeText(text)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
get shouldShowThumbnail(): boolean {
|
|
173
|
+
return this.size === 'L' || this.size === 'M'
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
getKindInfo(): { text: string; icon: string } {
|
|
177
|
+
if (!this.record?.kind) return { text: '', icon: '' }
|
|
178
|
+
|
|
179
|
+
switch (this.record.kind.toLowerCase()) {
|
|
180
|
+
case 'dataset':
|
|
181
|
+
return { text: 'record.kind.dataset', icon: 'iconoirDatabase' }
|
|
182
|
+
case 'reuse':
|
|
183
|
+
return { text: 'record.kind.reuse', icon: 'iconoirMap' }
|
|
184
|
+
case 'service':
|
|
185
|
+
return { text: 'record.kind.service', icon: 'matCode' }
|
|
186
|
+
default:
|
|
187
|
+
return { text: '', icon: '' }
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
<div *ngIf="metadataQualityDisplay" class="
|
|
1
|
+
<div *ngIf="metadataQualityDisplay" class="metadata-quality">
|
|
2
2
|
<div
|
|
3
3
|
class="flex items-center"
|
|
4
|
-
[class]="
|
|
4
|
+
[class]="
|
|
5
|
+
smaller ? 'leading-[8px] min-w-[120px] m-h-[120px]' : 'min-w-[200px]'
|
|
6
|
+
"
|
|
5
7
|
>
|
|
6
8
|
<gn-ui-progress-bar
|
|
7
9
|
tabindex="0"
|
|
@@ -20,6 +20,7 @@ import { ThumbnailComponent } from './thumbnail/thumbnail.component'
|
|
|
20
20
|
import { TimeSincePipe } from './user-feedback-item/time-since.pipe'
|
|
21
21
|
import { UserPreviewComponent } from './user-preview/user-preview.component'
|
|
22
22
|
import { ApplicationBannerComponent } from './application-banner/application-banner.component'
|
|
23
|
+
import { InternalLinkCardComponent } from './internal-link-card/internal-link-card.component'
|
|
23
24
|
|
|
24
25
|
@NgModule({
|
|
25
26
|
imports: [
|
|
@@ -42,6 +43,7 @@ import { ApplicationBannerComponent } from './application-banner/application-ban
|
|
|
42
43
|
TextInputComponent,
|
|
43
44
|
ImageInputComponent,
|
|
44
45
|
ApplicationBannerComponent,
|
|
46
|
+
InternalLinkCardComponent,
|
|
45
47
|
],
|
|
46
48
|
providers: [
|
|
47
49
|
provideNgIconsConfig({
|
|
@@ -56,6 +58,7 @@ import { ApplicationBannerComponent } from './application-banner/application-ban
|
|
|
56
58
|
MarkdownParserComponent,
|
|
57
59
|
ImageInputComponent,
|
|
58
60
|
ApplicationBannerComponent,
|
|
61
|
+
InternalLinkCardComponent,
|
|
59
62
|
],
|
|
60
63
|
})
|
|
61
64
|
export class UiElementsModule {}
|
|
@@ -15,7 +15,6 @@ export * from './lib/dropdown-selector/dropdown-selector.model'
|
|
|
15
15
|
export * from './lib/editable-label/editable-label.directive'
|
|
16
16
|
export * from './lib/file-input/file-input.component'
|
|
17
17
|
export * from './lib/files-drop/files-drop.directive'
|
|
18
|
-
export * from './lib/navigation-button/navigation-button.component'
|
|
19
18
|
export * from './lib/search-input/search-input.component'
|
|
20
19
|
export * from './lib/star-toggle/star-toggle.component'
|
|
21
20
|
export * from './lib/switch-toggle/switch-toggle.component'
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
<div class="inline-block relative align-middle" style="line-height: 0.7em">
|
|
2
|
-
<button
|
|
3
|
-
type="
|
|
2
|
+
<gn-ui-button
|
|
3
|
+
[type]="'outline'"
|
|
4
4
|
class="-m-[8px] p-[8px]"
|
|
5
|
-
(
|
|
5
|
+
(buttonClick)="toggle($event)"
|
|
6
6
|
[ngClass]="{
|
|
7
7
|
enabled: toggled,
|
|
8
|
-
|
|
8
|
+
disabled: !toggled,
|
|
9
9
|
'transition hover:scale-125 will-change-transform': !disabled,
|
|
10
10
|
'cursor-default': disabled,
|
|
11
11
|
}"
|
|
12
12
|
>
|
|
13
13
|
<ng-icon [name]="toggled ? 'matStar' : 'matStarBorder'"></ng-icon>
|
|
14
|
-
</button>
|
|
14
|
+
</gn-ui-button>
|
|
15
15
|
<svg
|
|
16
16
|
#starOverlay
|
|
17
17
|
class="star-toggle-overlay"
|
|
@@ -11,6 +11,7 @@ import { propagateToDocumentOnly } from '../../../../../../libs/util/shared/src'
|
|
|
11
11
|
import { NgIcon, provideIcons } from '@ng-icons/core'
|
|
12
12
|
import { CommonModule } from '@angular/common'
|
|
13
13
|
import { matStar, matStarBorder } from '@ng-icons/material-icons/baseline'
|
|
14
|
+
import { ButtonComponent } from '../button/button.component'
|
|
14
15
|
|
|
15
16
|
@Component({
|
|
16
17
|
selector: 'gn-ui-star-toggle',
|
|
@@ -18,7 +19,7 @@ import { matStar, matStarBorder } from '@ng-icons/material-icons/baseline'
|
|
|
18
19
|
styleUrls: ['./star-toggle.component.css'],
|
|
19
20
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
20
21
|
standalone: true,
|
|
21
|
-
imports: [CommonModule, NgIcon],
|
|
22
|
+
imports: [CommonModule, NgIcon, ButtonComponent],
|
|
22
23
|
viewProviders: [provideIcons({ matStar, matStarBorder })],
|
|
23
24
|
})
|
|
24
25
|
export class StarToggleComponent {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
AfterViewChecked,
|
|
2
3
|
ChangeDetectorRef,
|
|
3
4
|
Directive,
|
|
4
5
|
HostBinding,
|
|
@@ -11,20 +12,34 @@ import {
|
|
|
11
12
|
@Directive({
|
|
12
13
|
selector: '[gnUiAnchorLink]',
|
|
13
14
|
})
|
|
14
|
-
export class AnchorLinkDirective
|
|
15
|
+
export class AnchorLinkDirective
|
|
16
|
+
implements OnInit, AfterViewChecked, OnDestroy
|
|
17
|
+
{
|
|
15
18
|
@Input('gnUiAnchorLink') targetId: string
|
|
16
19
|
@Input('gnUiAnchorLinkDisabledClass') disabledClass: string
|
|
17
20
|
@Input('gnUiAnchorLinkEnabledClass') enabledClass: string
|
|
21
|
+
@Input('gnUiAnchorLinkInViewClass') inViewClass: string
|
|
22
|
+
@Input('gnUiAnchorLinkOutOfViewClass') outOfViewClass: string
|
|
18
23
|
|
|
19
24
|
@HostBinding('class')
|
|
20
25
|
get elementClass(): string {
|
|
21
|
-
|
|
26
|
+
if (this.disabled) {
|
|
27
|
+
return this.disabledClass
|
|
28
|
+
}
|
|
29
|
+
if (this.inView) {
|
|
30
|
+
return `${this.inViewClass} ${this.enabledClass}`
|
|
31
|
+
} else {
|
|
32
|
+
return `${this.outOfViewClass} ${this.enabledClass}`
|
|
33
|
+
}
|
|
22
34
|
}
|
|
23
35
|
|
|
24
36
|
disabled = false
|
|
25
37
|
observer = new MutationObserver(() => {
|
|
26
38
|
this.refreshDisabledState()
|
|
27
39
|
})
|
|
40
|
+
inView = false
|
|
41
|
+
intersectionObserver: IntersectionObserver
|
|
42
|
+
initialized = false
|
|
28
43
|
|
|
29
44
|
constructor(private changeDetector: ChangeDetectorRef) {}
|
|
30
45
|
|
|
@@ -36,8 +51,37 @@ export class AnchorLinkDirective implements OnInit, OnDestroy {
|
|
|
36
51
|
this.refreshDisabledState()
|
|
37
52
|
}
|
|
38
53
|
|
|
54
|
+
ngAfterViewChecked() {
|
|
55
|
+
if (!this.initialized && !this.disabled) {
|
|
56
|
+
const target = document.getElementById(this.targetId)
|
|
57
|
+
if (target) {
|
|
58
|
+
this.initializeIntersectionObserver(target)
|
|
59
|
+
this.initialized = true
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
initializeIntersectionObserver(target: HTMLElement) {
|
|
65
|
+
this.intersectionObserver = new IntersectionObserver(
|
|
66
|
+
(entries) => {
|
|
67
|
+
entries.forEach((entry) => {
|
|
68
|
+
this.inView = entry.isIntersecting
|
|
69
|
+
this.changeDetector.detectChanges()
|
|
70
|
+
})
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
root: null,
|
|
74
|
+
rootMargin: '-30% 0% -60% 0%',
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
this.intersectionObserver.observe(target)
|
|
78
|
+
}
|
|
79
|
+
|
|
39
80
|
ngOnDestroy() {
|
|
40
81
|
this.observer.disconnect()
|
|
82
|
+
if (this.intersectionObserver) {
|
|
83
|
+
this.intersectionObserver.disconnect()
|
|
84
|
+
}
|
|
41
85
|
}
|
|
42
86
|
|
|
43
87
|
refreshDisabledState() {
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
>
|
|
9
9
|
{{ progress }}%
|
|
10
10
|
</div>
|
|
11
|
-
<div class="flex-grow h-[
|
|
11
|
+
<div class="flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full">
|
|
12
12
|
<div
|
|
13
13
|
[style.width.%]="progress"
|
|
14
14
|
class="{{ color.innerBar }} transition-width duration-500
|
|
15
|
-
ease-in-out rounded-full shadow-sm h-
|
|
15
|
+
ease-in-out rounded-full shadow-sm w-[52px] h-[4px]"
|
|
16
16
|
></div>
|
|
17
17
|
</div>
|
|
18
18
|
</div>
|
package/tailwind.base.css
CHANGED
|
@@ -66,15 +66,20 @@
|
|
|
66
66
|
/* this is a base class, do not use it directly */
|
|
67
67
|
.gn-ui-btn {
|
|
68
68
|
--rounded: var(--gn-ui-button-rounded, 0.25em);
|
|
69
|
+
--border-width: var(--gn-ui-button-border-width, 1px);
|
|
69
70
|
--padding: var(--gn-ui-button-padding, 1em);
|
|
70
71
|
--width: var(--gn-ui-button-width, auto);
|
|
71
72
|
--height: var(--gn-ui-button-height, auto);
|
|
72
|
-
--background: var(--gn-ui-button-background, --color-background);
|
|
73
|
+
--background: var(--gn-ui-button-background, var(--color-background));
|
|
74
|
+
--bg-hover: var(--gn-ui-button-bg-hover, var(--color-background));
|
|
73
75
|
--font-size: var(--gn-ui-button-font-size, 1em);
|
|
76
|
+
--color: var(--gn-ui-button-color, var(--color-main));
|
|
74
77
|
@apply flex flex-row items-center justify-center
|
|
75
78
|
text-[length:--font-size] leading-none
|
|
79
|
+
text-[color:--color]
|
|
76
80
|
p-[--padding] rounded-[--rounded] w-[--width] h-[--height] overflow-hidden
|
|
77
|
-
bg-[--background] transition-all duration-100
|
|
81
|
+
border-[length:--border-width] bg-[--background] transition-all duration-100
|
|
82
|
+
hover:bg-[--bg-hover] focus:bg-[--bg-hover] active:bg-[--background]
|
|
78
83
|
outline-none
|
|
79
84
|
relative
|
|
80
85
|
disabled:opacity-50 disabled:pointer-events-none
|
|
@@ -90,43 +95,43 @@
|
|
|
90
95
|
.gn-ui-btn-default {
|
|
91
96
|
@apply gn-ui-btn text-white
|
|
92
97
|
bg-gray-700 hover:bg-gray-800 active:bg-gray-900
|
|
93
|
-
border
|
|
98
|
+
border-gray-700 focus:ring-4 focus:ring-gray-200;
|
|
94
99
|
}
|
|
95
100
|
|
|
96
101
|
.gn-ui-btn-primary {
|
|
97
102
|
@apply gn-ui-btn text-white
|
|
98
103
|
bg-primary hover:bg-primary-darker focus:bg-primary-darker active:bg-primary-darkest
|
|
99
|
-
border
|
|
104
|
+
border-primary focus:ring-4 focus:ring-primary-lightest;
|
|
100
105
|
}
|
|
101
106
|
|
|
102
107
|
.gn-ui-btn-secondary {
|
|
103
108
|
@apply gn-ui-btn text-white
|
|
104
109
|
bg-secondary hover:bg-secondary-darker focus:bg-secondary-darker active:bg-secondary-darkest
|
|
105
|
-
border
|
|
110
|
+
border-secondary focus:ring-4 focus:ring-secondary-lightest;
|
|
106
111
|
}
|
|
107
112
|
|
|
108
113
|
.gn-ui-btn-gray {
|
|
109
114
|
@apply gn-ui-btn text-black
|
|
110
115
|
bg-gray-100 hover:bg-gray-200 focus:bg-gray-200 active:bg-gray-300
|
|
111
|
-
border
|
|
116
|
+
border-gray-100 focus:ring-4 focus:ring-gray-50;
|
|
112
117
|
}
|
|
113
118
|
|
|
114
119
|
.gn-ui-btn-black {
|
|
115
120
|
@apply gn-ui-btn text-white
|
|
116
121
|
bg-black hover:bg-gray-950 focus:bg-gray-950 active:bg-gray-900
|
|
117
|
-
border
|
|
122
|
+
border-black focus:ring-4 focus:ring-gray-300;
|
|
118
123
|
}
|
|
119
124
|
|
|
120
125
|
.gn-ui-btn-outline {
|
|
121
|
-
@apply gn-ui-btn
|
|
126
|
+
@apply gn-ui-btn
|
|
122
127
|
hover:text-primary-darker focus:text-primary-darker active:text-primary-black
|
|
123
|
-
border
|
|
128
|
+
border-gray-300 hover:border-primary-lighter focus:border-primary-lighter focus:ring-4 focus:ring-primary-lightest active:border-primary-darker;
|
|
124
129
|
}
|
|
125
130
|
|
|
126
131
|
.gn-ui-btn-light {
|
|
127
|
-
@apply gn-ui-btn
|
|
132
|
+
@apply gn-ui-btn
|
|
128
133
|
hover:bg-gray-50 focus:bg-gray-50 active:bg-gray-100
|
|
129
|
-
border
|
|
134
|
+
border-white focus:ring-4 focus:ring-gray-300;
|
|
130
135
|
}
|
|
131
136
|
|
|
132
137
|
.gn-ui-card-xs {
|
package/translations/de.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"": "",
|
|
3
3
|
"Add Layer As": "",
|
|
4
|
+
"Enter to search": "",
|
|
4
5
|
"button.login": "",
|
|
5
6
|
"catalog.figures.datasets": "{count, plural, =0{Datensätze} one{Datensatz} other{Datensätze}}",
|
|
6
7
|
"catalog.figures.organizations": "{count, plural, =0{Organisationen} one{Organisation} other{Organisationen}}",
|
|
@@ -62,7 +63,6 @@
|
|
|
62
63
|
"datahub.news.contact.title": "Ein spezielles Bedürfnis?",
|
|
63
64
|
"datahub.news.feed": "Nachrichtenfeed",
|
|
64
65
|
"datahub.news.figures": "Indikatoren",
|
|
65
|
-
"datahub.record.addToFavorites": "Zu Favoriten hinzufügen",
|
|
66
66
|
"datahub.search.back": "Zurück",
|
|
67
67
|
"datahub.search.filter.all": "Alle",
|
|
68
68
|
"datahub.search.filter.generatedByAPI": "Generiert durch eine API",
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
"dataset.error.http": "Die Daten konnten aufgrund eines HTTP-Fehlers nicht geladen werden: \"{ info }\"",
|
|
73
73
|
"dataset.error.network": "Die Daten konnten aufgrund eines Netzwerkfehlers oder CORS-Beschränkungen nicht geladen werden: \"{ info }\"",
|
|
74
74
|
"dataset.error.parse": "Die Daten wurden geladen, konnten aber nicht gelesen werden: \"{ info }\"",
|
|
75
|
+
"dataset.error.restrictedAccess": "",
|
|
75
76
|
"dataset.error.unknown": "Die Daten können nicht angezeigt werden: \"{ info }\"",
|
|
76
77
|
"dataset.error.unsupportedType": "Der folgende Inhaltstyp wird nicht unterstützt: \"{ info }\"",
|
|
77
78
|
"domain.contact.role.author": "",
|
|
@@ -331,6 +332,7 @@
|
|
|
331
332
|
"map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
|
|
332
333
|
"multiselect.filter.placeholder": "Suche",
|
|
333
334
|
"nav.back": "Zurück",
|
|
335
|
+
"navbar.mobile.menuTitle": "Schnellzugriff",
|
|
334
336
|
"next": "weiter",
|
|
335
337
|
"ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
|
|
336
338
|
"organisation.filter.placeholder": "Ergebnisse filtern",
|
|
@@ -354,8 +356,12 @@
|
|
|
354
356
|
"record.action.duplicating": "",
|
|
355
357
|
"record.action.rollback": "",
|
|
356
358
|
"record.action.view": "Anzeigen",
|
|
359
|
+
"record.card.metadata.contact": "",
|
|
357
360
|
"record.externalViewer.open": "In externem Kartenviewer öffnen",
|
|
358
361
|
"record.feature.limit": "Die Vorschau wurde aufgrund zu vieler Elemente deaktiviert",
|
|
362
|
+
"record.kind.dataset": "",
|
|
363
|
+
"record.kind.reuse": "",
|
|
364
|
+
"record.kind.service": "",
|
|
359
365
|
"record.metadata.about": "Beschreibung",
|
|
360
366
|
"record.metadata.api": "API",
|
|
361
367
|
"record.metadata.api.form.closeButton": "Schließen",
|
|
@@ -389,6 +395,7 @@
|
|
|
389
395
|
"record.metadata.api.form.zoneTitle": "",
|
|
390
396
|
"record.metadata.api.form.zoneTooltip": "",
|
|
391
397
|
"record.metadata.api.gpfdl": "",
|
|
398
|
+
"record.metadata.capabilities": "",
|
|
392
399
|
"record.metadata.catalog": "Katalog",
|
|
393
400
|
"record.metadata.contact": "Kontakt",
|
|
394
401
|
"record.metadata.creation": "Erstellungsdatum",
|
package/translations/en.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"": "",
|
|
3
3
|
"Add Layer As": "",
|
|
4
|
+
"Enter to search": "",
|
|
4
5
|
"button.login": "Log in",
|
|
5
6
|
"catalog.figures.datasets": "{count, plural, =0{datasets} one{dataset} other{datasets}}",
|
|
6
7
|
"catalog.figures.organizations": "{count, plural, =0{organizations} one{organization} other{organizations}}",
|
|
@@ -62,7 +63,6 @@
|
|
|
62
63
|
"datahub.news.contact.title": "A specific need?",
|
|
63
64
|
"datahub.news.feed": "News feed",
|
|
64
65
|
"datahub.news.figures": "Indicators",
|
|
65
|
-
"datahub.record.addToFavorites": "Add to favorites",
|
|
66
66
|
"datahub.search.back": "Back",
|
|
67
67
|
"datahub.search.filter.all": "All",
|
|
68
68
|
"datahub.search.filter.generatedByAPI": "Generated by an API",
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
"dataset.error.http": "The data could not be loaded because of an HTTP error: \"{ info }\"",
|
|
73
73
|
"dataset.error.network": "The data could not be loaded because of a network error or CORS limitations: \"{ info }\"",
|
|
74
74
|
"dataset.error.parse": "The data was loaded but could not be parsed: \"{ info }\"",
|
|
75
|
+
"dataset.error.restrictedAccess": "Access to this resource is restricted",
|
|
75
76
|
"dataset.error.unknown": "The data cannot be displayed: \"{ info }\"",
|
|
76
77
|
"dataset.error.unsupportedType": "The following content type is unsupported: \"{ info }\"",
|
|
77
78
|
"domain.contact.role.author": "Author",
|
|
@@ -331,6 +332,7 @@
|
|
|
331
332
|
"map.wms.urlInput.hint": "Enter WMS service URL",
|
|
332
333
|
"multiselect.filter.placeholder": "Search",
|
|
333
334
|
"nav.back": "Back",
|
|
335
|
+
"navbar.mobile.menuTitle": "Quick access",
|
|
334
336
|
"next": "Next",
|
|
335
337
|
"ogc.unreachable.unknown": "The service could not be reached",
|
|
336
338
|
"organisation.filter.placeholder": "Filter results",
|
|
@@ -354,8 +356,12 @@
|
|
|
354
356
|
"record.action.duplicating": "Duplicating...",
|
|
355
357
|
"record.action.rollback": "Rollback",
|
|
356
358
|
"record.action.view": "View",
|
|
359
|
+
"record.card.metadata.contact": "Metadata Contact",
|
|
357
360
|
"record.externalViewer.open": "Open in the external map viewer",
|
|
358
361
|
"record.feature.limit": "Preview disabled due to too many elements",
|
|
362
|
+
"record.kind.dataset": "Data",
|
|
363
|
+
"record.kind.reuse": "Reuse",
|
|
364
|
+
"record.kind.service": "Service",
|
|
359
365
|
"record.metadata.about": "Description",
|
|
360
366
|
"record.metadata.api": "API",
|
|
361
367
|
"record.metadata.api.form.closeButton": "Close",
|
|
@@ -389,6 +395,7 @@
|
|
|
389
395
|
"record.metadata.api.form.zoneTitle": "Zone",
|
|
390
396
|
"record.metadata.api.form.zoneTooltip": "Dropdown for selecting a geographic zone",
|
|
391
397
|
"record.metadata.api.gpfdl": "Data download",
|
|
398
|
+
"record.metadata.capabilities": "",
|
|
392
399
|
"record.metadata.catalog": "Catalog",
|
|
393
400
|
"record.metadata.contact": "Contact",
|
|
394
401
|
"record.metadata.creation": "Date of creation",
|
package/translations/es.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"": "",
|
|
3
3
|
"Add Layer As": "",
|
|
4
|
+
"Enter to search": "",
|
|
4
5
|
"button.login": "",
|
|
5
6
|
"catalog.figures.datasets": "conjuntos de datos",
|
|
6
7
|
"catalog.figures.organizations": "organizaciones",
|
|
@@ -62,7 +63,6 @@
|
|
|
62
63
|
"datahub.news.contact.title": "",
|
|
63
64
|
"datahub.news.feed": "",
|
|
64
65
|
"datahub.news.figures": "",
|
|
65
|
-
"datahub.record.addToFavorites": "",
|
|
66
66
|
"datahub.search.back": "",
|
|
67
67
|
"datahub.search.filter.all": "",
|
|
68
68
|
"datahub.search.filter.generatedByAPI": "",
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
"dataset.error.http": "",
|
|
73
73
|
"dataset.error.network": "",
|
|
74
74
|
"dataset.error.parse": "",
|
|
75
|
+
"dataset.error.restrictedAccess": "",
|
|
75
76
|
"dataset.error.unknown": "",
|
|
76
77
|
"dataset.error.unsupportedType": "",
|
|
77
78
|
"domain.contact.role.author": "",
|
|
@@ -331,6 +332,7 @@
|
|
|
331
332
|
"map.wms.urlInput.hint": "",
|
|
332
333
|
"multiselect.filter.placeholder": "",
|
|
333
334
|
"nav.back": "",
|
|
335
|
+
"navbar.mobile.menuTitle": "Acceso rápido",
|
|
334
336
|
"next": "",
|
|
335
337
|
"ogc.unreachable.unknown": "",
|
|
336
338
|
"organisation.filter.placeholder": "",
|
|
@@ -354,8 +356,12 @@
|
|
|
354
356
|
"record.action.duplicating": "",
|
|
355
357
|
"record.action.rollback": "",
|
|
356
358
|
"record.action.view": "",
|
|
359
|
+
"record.card.metadata.contact": "",
|
|
357
360
|
"record.externalViewer.open": "",
|
|
358
361
|
"record.feature.limit": "",
|
|
362
|
+
"record.kind.dataset": "",
|
|
363
|
+
"record.kind.reuse": "",
|
|
364
|
+
"record.kind.service": "",
|
|
359
365
|
"record.metadata.about": "",
|
|
360
366
|
"record.metadata.api": "",
|
|
361
367
|
"record.metadata.api.form.closeButton": "",
|
|
@@ -389,6 +395,7 @@
|
|
|
389
395
|
"record.metadata.api.form.zoneTitle": "",
|
|
390
396
|
"record.metadata.api.form.zoneTooltip": "",
|
|
391
397
|
"record.metadata.api.gpfdl": "",
|
|
398
|
+
"record.metadata.capabilities": "",
|
|
392
399
|
"record.metadata.catalog": "",
|
|
393
400
|
"record.metadata.contact": "",
|
|
394
401
|
"record.metadata.creation": "",
|
package/translations/fr.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"": "",
|
|
3
3
|
"Add Layer As": "",
|
|
4
|
+
"Enter to search": "",
|
|
4
5
|
"button.login": "Se connecter",
|
|
5
6
|
"catalog.figures.datasets": "{count, plural, =0{données} one{donnée} other{données}}",
|
|
6
7
|
"catalog.figures.organizations": "{count, plural, =0{organisations} one{organisation} other{organisations}}",
|
|
@@ -62,7 +63,6 @@
|
|
|
62
63
|
"datahub.news.contact.title": "Un besoin spécifique ?",
|
|
63
64
|
"datahub.news.feed": "Fil d'activité",
|
|
64
65
|
"datahub.news.figures": "Quelques chiffres",
|
|
65
|
-
"datahub.record.addToFavorites": "Ajouter aux favoris",
|
|
66
66
|
"datahub.search.back": "Retour",
|
|
67
67
|
"datahub.search.filter.all": "Tous",
|
|
68
68
|
"datahub.search.filter.generatedByAPI": "généré par une API",
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
"dataset.error.http": "Le chargement des données a échoué en raison d'une erreur HTTP: \"{ info }\"",
|
|
73
73
|
"dataset.error.network": "Le chargement des données a échoué en raison d'une erreur réseau ou de limitations CORS: \"{ info }\"",
|
|
74
74
|
"dataset.error.parse": "Les données ont été chargées mais leur décodage a échoué: \"{ info }\"",
|
|
75
|
+
"dataset.error.restrictedAccess": "L’accès à cette ressource est restreint",
|
|
75
76
|
"dataset.error.unknown": "Les données ne peuvent être affichées: \"{ info }\"",
|
|
76
77
|
"dataset.error.unsupportedType": "Le type de contenu suivant n'est pas pris en charge: \"{ info }\"",
|
|
77
78
|
"domain.contact.role.author": "Auteur",
|
|
@@ -331,6 +332,7 @@
|
|
|
331
332
|
"map.wms.urlInput.hint": "Entrez l'URL du service WMS",
|
|
332
333
|
"multiselect.filter.placeholder": "Rechercher",
|
|
333
334
|
"nav.back": "Retour",
|
|
335
|
+
"navbar.mobile.menuTitle": "Navigation rapide",
|
|
334
336
|
"next": "Suivant",
|
|
335
337
|
"ogc.unreachable.unknown": "Le service n'est pas accessible",
|
|
336
338
|
"organisation.filter.placeholder": "Filtrer les résultats",
|
|
@@ -354,9 +356,13 @@
|
|
|
354
356
|
"record.action.duplicating": "Duplication...",
|
|
355
357
|
"record.action.rollback": "Restaurer",
|
|
356
358
|
"record.action.view": "Voir",
|
|
359
|
+
"record.card.metadata.contact": "Contact de la métadonnée ",
|
|
357
360
|
"record.externalViewer.open": "Ouvrir dans le visualiseur externe",
|
|
358
361
|
"record.feature.limit": "L’aperçu a été désactivé en raison d’un trop grand nombre d'éléments",
|
|
359
|
-
"record.
|
|
362
|
+
"record.kind.dataset": "Donnée",
|
|
363
|
+
"record.kind.reuse": "Réutilisation",
|
|
364
|
+
"record.kind.service": "Service",
|
|
365
|
+
"record.metadata.about": "A propos",
|
|
360
366
|
"record.metadata.api": "API",
|
|
361
367
|
"record.metadata.api.form.closeButton": "Fermer",
|
|
362
368
|
"record.metadata.api.form.closeForm": "Fermer le panneau de personnalisation",
|
|
@@ -389,6 +395,7 @@
|
|
|
389
395
|
"record.metadata.api.form.zoneTitle": "Zone",
|
|
390
396
|
"record.metadata.api.form.zoneTooltip": "Menu déroulant pour sélectionner une zone géographique",
|
|
391
397
|
"record.metadata.api.gpfdl": "Téléchargement",
|
|
398
|
+
"record.metadata.capabilities": "Capacités du service",
|
|
392
399
|
"record.metadata.catalog": "Catalogue",
|
|
393
400
|
"record.metadata.contact": "Contact",
|
|
394
401
|
"record.metadata.creation": "Date de création",
|
|
@@ -398,7 +405,7 @@
|
|
|
398
405
|
"record.metadata.keywords": "Mots-clés",
|
|
399
406
|
"record.metadata.languages": "Langues",
|
|
400
407
|
"record.metadata.lastUpdate": "Mis à jour le {date}",
|
|
401
|
-
"record.metadata.links": "
|
|
408
|
+
"record.metadata.links": "Ressources & liens",
|
|
402
409
|
"record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
|
|
403
410
|
"record.metadata.otherConstraints": "Limitations d'usage",
|
|
404
411
|
"record.metadata.owner": "Catalogue d'origine",
|