geonetwork-ui 2.6.0-dev.9d3ad45e2 → 2.6.0-dev.a225a5e7a
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 +36 -4
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +8 -4
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +5 -2
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +2 -2
- package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +3 -3
- package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +36 -6
- package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
- package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +266 -11
- package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +3 -1
- package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +7 -1
- package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +3 -1
- package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +7 -1
- package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +3 -1
- package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +19 -34
- package/esm2022/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.mjs +59 -0
- package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
- package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +3 -3
- package/esm2022/libs/ui/search/src/index.mjs +2 -1
- package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +19 -12
- package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +27 -14
- package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +10 -4
- package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +42 -1
- package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +24 -2
- package/esm2022/translations/de.json +29 -4
- package/esm2022/translations/en.json +29 -4
- package/esm2022/translations/es.json +28 -3
- package/esm2022/translations/fr.json +29 -4
- package/esm2022/translations/it.json +28 -3
- package/esm2022/translations/nl.json +28 -3
- package/esm2022/translations/pt.json +28 -3
- package/fesm2022/geonetwork-ui.mjs +775 -150
- 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/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +0 -1
- package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +1 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +1 -1
- package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +7 -2
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
- package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +3 -0
- package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts +48 -3
- package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.actions.d.ts +10 -0
- package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.effects.d.ts +6 -0
- package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.facade.d.ts +2 -0
- package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +2 -0
- package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +2 -0
- package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +3 -6
- package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts +14 -0
- package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts.map +1 -0
- package/libs/ui/search/src/index.d.ts +1 -0
- package/libs/ui/search/src/index.d.ts.map +1 -1
- package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +3 -3
- package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
- package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +5 -1
- package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
- package/libs/ui/search/src/lib/ui-search.module.d.ts +2 -1
- package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
- package/libs/util/i18n/src/lib/i18n.constants.d.ts +1 -0
- package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
- package/libs/util/i18n/src/lib/language-codes.d.ts +23 -1
- package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +54 -4
- package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +0 -1
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +13 -3
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +5 -1
- package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +6 -3
- package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -1
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +2 -2
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +57 -4
- package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +3 -0
- package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +117 -11
- package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +316 -6
- package/src/libs/feature/record/src/lib/state/mdview.actions.ts +10 -0
- package/src/libs/feature/record/src/lib/state/mdview.effects.ts +22 -0
- package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -0
- package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +12 -0
- package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +9 -0
- package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +7 -75
- package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +20 -51
- package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.html +69 -0
- package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.ts +61 -0
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +1 -0
- package/src/libs/ui/search/src/index.ts +1 -0
- package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +11 -3
- package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +14 -11
- package/src/libs/ui/search/src/lib/results-table/results-table.component.css +4 -0
- package/src/libs/ui/search/src/lib/results-table/results-table.component.html +27 -17
- package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +20 -10
- package/src/libs/ui/search/src/lib/ui-search.module.ts +3 -0
- package/src/libs/util/i18n/src/lib/i18n.constants.ts +42 -0
- package/src/libs/util/i18n/src/lib/language-codes.ts +23 -1
- package/tailwind.base.css +1 -1
- package/translations/de.json +29 -4
- package/translations/en.json +29 -4
- package/translations/es.json +28 -3
- package/translations/fr.json +29 -4
- package/translations/it.json +28 -3
- package/translations/nl.json +28 -3
- package/translations/pt.json +28 -3
- package/translations/sk.json +28 -3
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<div
|
|
2
|
+
data-cy="recordOrg"
|
|
3
|
+
class="flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2"
|
|
4
|
+
>
|
|
5
|
+
<div class="flex items-center flex-1 min-w-0">
|
|
6
|
+
<div class="w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3">
|
|
7
|
+
<gn-ui-thumbnail
|
|
8
|
+
[thumbnailUrl]="record.ownerOrganization?.logoUrl?.toString() || ''"
|
|
9
|
+
[fit]="'contain'"
|
|
10
|
+
class="w-full h-full rounded-lg"
|
|
11
|
+
></gn-ui-thumbnail>
|
|
12
|
+
</div>
|
|
13
|
+
<div *ngIf="organization?.name" class="flex-1 w-0 overflow-hidden">
|
|
14
|
+
<div
|
|
15
|
+
class="text-xs text-black font-normal leading-tight truncate"
|
|
16
|
+
translate
|
|
17
|
+
>
|
|
18
|
+
record.card.metadata.contact
|
|
19
|
+
</div>
|
|
20
|
+
<div
|
|
21
|
+
data-cy="recordOrgName"
|
|
22
|
+
class="text-xl text-primary-black font-medium truncate"
|
|
23
|
+
>
|
|
24
|
+
{{ organization.name }}
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
<div *ngIf="size === 'L'" class="ml-2 flex space-x-2">
|
|
29
|
+
<div *ngIf="organization?.website" class="flex">
|
|
30
|
+
<button
|
|
31
|
+
[title]="organization.website"
|
|
32
|
+
class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest"
|
|
33
|
+
(click)="openExternalUrl($event, organization.website)"
|
|
34
|
+
>
|
|
35
|
+
<ng-icon name="iconoirInternet"></ng-icon>
|
|
36
|
+
</button>
|
|
37
|
+
</div>
|
|
38
|
+
<div *ngIf="contacts[0]?.email" class="flex">
|
|
39
|
+
<button
|
|
40
|
+
[title]="contacts[0].email"
|
|
41
|
+
class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest"
|
|
42
|
+
data-cy="contact-email"
|
|
43
|
+
(click)="openMailto($event, contacts[0].email)"
|
|
44
|
+
>
|
|
45
|
+
<ng-icon name="matEmailOutline"></ng-icon>
|
|
46
|
+
</button>
|
|
47
|
+
</div>
|
|
48
|
+
<div *ngIf="contacts[0]?.phone" class="flex">
|
|
49
|
+
<button
|
|
50
|
+
[title]="'Copy to clipboard'"
|
|
51
|
+
class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group"
|
|
52
|
+
data-cy="contact-phone"
|
|
53
|
+
(click)="copyToClipboard($event, contacts[0].phone)"
|
|
54
|
+
>
|
|
55
|
+
<ng-icon name="matPhoneOutline"></ng-icon>
|
|
56
|
+
</button>
|
|
57
|
+
</div>
|
|
58
|
+
<div *ngIf="contacts[0]?.address" class="flex">
|
|
59
|
+
<button
|
|
60
|
+
[title]="'Copy to clipboard'"
|
|
61
|
+
class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group"
|
|
62
|
+
data-cy="contact-phone"
|
|
63
|
+
(click)="copyToClipboard($event, contacts[0].address)"
|
|
64
|
+
>
|
|
65
|
+
<ng-icon name="matLocationOnOutline"></ng-icon>
|
|
66
|
+
</button>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core'
|
|
2
|
+
import { NgIf } from '@angular/common'
|
|
3
|
+
import {
|
|
4
|
+
CatalogRecord,
|
|
5
|
+
Organization,
|
|
6
|
+
} from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
7
|
+
import { ThumbnailComponent } from '../thumbnail/thumbnail.component'
|
|
8
|
+
import { NgIconComponent, provideIcons } from '@ng-icons/core'
|
|
9
|
+
import {
|
|
10
|
+
matEmailOutline,
|
|
11
|
+
matPhoneOutline,
|
|
12
|
+
matLocationOnOutline,
|
|
13
|
+
} from '@ng-icons/material-icons/outline'
|
|
14
|
+
import { iconoirInternet } from '@ng-icons/iconoir'
|
|
15
|
+
import { TranslateModule } from '@ngx-translate/core'
|
|
16
|
+
|
|
17
|
+
@Component({
|
|
18
|
+
selector: 'gn-ui-internal-link-card-contact',
|
|
19
|
+
standalone: true,
|
|
20
|
+
imports: [NgIf, ThumbnailComponent, NgIconComponent, TranslateModule],
|
|
21
|
+
providers: [
|
|
22
|
+
provideIcons({
|
|
23
|
+
iconoirInternet,
|
|
24
|
+
matEmailOutline,
|
|
25
|
+
matPhoneOutline,
|
|
26
|
+
matLocationOnOutline,
|
|
27
|
+
}),
|
|
28
|
+
],
|
|
29
|
+
templateUrl: './internal-link-card-contact.component.html',
|
|
30
|
+
})
|
|
31
|
+
export class InternalLinkCardContactComponent {
|
|
32
|
+
@Input() record: CatalogRecord
|
|
33
|
+
@Input() size: 'L' | 'M' | 'S' | 'XS' = 'M'
|
|
34
|
+
|
|
35
|
+
get organization(): Organization {
|
|
36
|
+
return this.record.ownerOrganization
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
get contacts() {
|
|
40
|
+
return (
|
|
41
|
+
(this.record.kind === 'dataset'
|
|
42
|
+
? this.record.contactsForResource
|
|
43
|
+
: this.record.contacts) || []
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
openExternalUrl(event: Event, url: URL): void {
|
|
48
|
+
event.stopPropagation()
|
|
49
|
+
window.open(url, '_blank')
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
openMailto(event: Event, email: string): void {
|
|
53
|
+
event.stopPropagation()
|
|
54
|
+
window.open(`mailto:${email}`, '_blank')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
copyToClipboard(event: Event, text: string): void {
|
|
58
|
+
event.stopPropagation()
|
|
59
|
+
navigator.clipboard.writeText(text)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -19,3 +19,4 @@ export * from './lib/results-list-item/results-list-item.component'
|
|
|
19
19
|
export * from './lib/results-hits-search-kind/results-hits-search-kind.component'
|
|
20
20
|
export * from './lib/results-hits-number/results-hits-number.component'
|
|
21
21
|
export * from './lib/results-table/results-table.component'
|
|
22
|
+
export * from './lib/results-table/action-menu/action-menu.component'
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
>
|
|
7
7
|
<ul class="flex flex-col gap-2 w-full">
|
|
8
8
|
<gn-ui-button
|
|
9
|
-
*ngIf="
|
|
9
|
+
*ngIf="page === 'main'"
|
|
10
10
|
type="light"
|
|
11
11
|
extraClass="flex flex-row items-center gap-2 w-full justify-start"
|
|
12
12
|
(buttonClick)="duplicate.emit()"
|
|
@@ -18,14 +18,22 @@
|
|
|
18
18
|
>record.action.duplicating</span
|
|
19
19
|
></gn-ui-button
|
|
20
20
|
>
|
|
21
|
+
<gn-ui-button
|
|
22
|
+
*ngIf="page === 'record'"
|
|
23
|
+
type="light"
|
|
24
|
+
extraClass="flex flex-row items-center gap-2 w-full justify-start"
|
|
25
|
+
(buttonClick)="switch.emit()"
|
|
26
|
+
data-test="record-menu-switch-button"
|
|
27
|
+
><span translate>record.action.switchLang</span></gn-ui-button
|
|
28
|
+
>
|
|
21
29
|
<gn-ui-button
|
|
22
30
|
type="light"
|
|
23
31
|
extraClass="flex flex-row items-center gap-2 w-full justify-start"
|
|
24
32
|
(buttonClick)="displayDeleteMenu()"
|
|
25
33
|
[disabled]="!canDelete"
|
|
26
34
|
data-test="record-menu-delete-button"
|
|
27
|
-
><span *ngIf="
|
|
28
|
-
<span *ngIf="
|
|
35
|
+
><span *ngIf="page !== 'draft'" translate>record.action.delete</span>
|
|
36
|
+
<span *ngIf="page === 'draft'" translate
|
|
29
37
|
>record.action.rollback</span
|
|
30
38
|
></gn-ui-button
|
|
31
39
|
>
|
|
@@ -30,13 +30,14 @@ type ActionMenuPage = 'mainMenu' | 'deleteMenu' | 'rollbackMenu'
|
|
|
30
30
|
],
|
|
31
31
|
})
|
|
32
32
|
export class ActionMenuComponent {
|
|
33
|
-
@Input() canDuplicate
|
|
34
|
-
@Input() canDelete
|
|
35
|
-
@Input()
|
|
33
|
+
@Input() canDuplicate = true
|
|
34
|
+
@Input() canDelete = true
|
|
35
|
+
@Input() page: 'draft' | 'main' | 'record'
|
|
36
36
|
@Output() duplicate = new EventEmitter<void>()
|
|
37
37
|
@Output() delete = new EventEmitter<void>()
|
|
38
38
|
@Output() closeActionMenu = new EventEmitter<void>()
|
|
39
39
|
@Output() rollback = new EventEmitter<void>()
|
|
40
|
+
@Output() switch = new EventEmitter<void>()
|
|
40
41
|
|
|
41
42
|
@ViewChild(MatMenuTrigger) trigger: MatMenuTrigger
|
|
42
43
|
|
|
@@ -47,20 +48,22 @@ export class ActionMenuComponent {
|
|
|
47
48
|
private cdr: ChangeDetectorRef
|
|
48
49
|
) {}
|
|
49
50
|
|
|
50
|
-
openMenu() {
|
|
51
|
-
this.trigger.openMenu()
|
|
52
|
-
}
|
|
53
|
-
|
|
54
51
|
displayMainMenu() {
|
|
55
52
|
this.sectionDisplayed = 'mainMenu'
|
|
56
53
|
this.cdr.markForCheck()
|
|
57
54
|
}
|
|
58
55
|
|
|
59
56
|
displayDeleteMenu() {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
switch (this.page) {
|
|
58
|
+
case 'draft':
|
|
59
|
+
this.sectionDisplayed = 'rollbackMenu'
|
|
60
|
+
break
|
|
61
|
+
case 'record':
|
|
62
|
+
this.delete.emit()
|
|
63
|
+
break
|
|
64
|
+
case 'main':
|
|
65
|
+
default:
|
|
66
|
+
this.sectionDisplayed = 'deleteMenu'
|
|
64
67
|
}
|
|
65
68
|
this.cdr.markForCheck()
|
|
66
69
|
}
|
|
@@ -143,29 +143,39 @@
|
|
|
143
143
|
<gn-ui-interactive-table-column>
|
|
144
144
|
<ng-template #header> </ng-template>
|
|
145
145
|
<ng-template #cell let-item>
|
|
146
|
-
<
|
|
147
|
-
|
|
148
|
-
#actionMenuButton
|
|
149
|
-
(buttonClick)="openActionMenu(item, template)"
|
|
150
|
-
type="light"
|
|
151
|
-
data-test="record-menu-button"
|
|
152
|
-
[disabled]="
|
|
153
|
-
(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'
|
|
154
|
-
"
|
|
155
|
-
>
|
|
146
|
+
<div class="flex justify-end items-center gap-4 w-full">
|
|
147
|
+
<!-- IS MULTILINGUAL -->
|
|
156
148
|
<ng-icon
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
name="matMoreVert"
|
|
149
|
+
*ngIf="isMultilingual(item)"
|
|
150
|
+
data-cy="multilingual-indicator"
|
|
151
|
+
name="iconoirTranslate"
|
|
152
|
+
[attr.title]="getTxtHoverMultilingual(item)"
|
|
162
153
|
></ng-icon>
|
|
163
|
-
|
|
154
|
+
<!-- MORE ACTIONS MENU BUTTON -->
|
|
155
|
+
<gn-ui-button
|
|
156
|
+
cdkOverlayOrigin
|
|
157
|
+
#actionMenuButton
|
|
158
|
+
(buttonClick)="openActionMenu(item, template)"
|
|
159
|
+
type="light"
|
|
160
|
+
data-test="record-menu-button"
|
|
161
|
+
[disabled]="
|
|
162
|
+
(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'
|
|
163
|
+
"
|
|
164
|
+
>
|
|
165
|
+
<ng-icon
|
|
166
|
+
[ngClass]="{
|
|
167
|
+
'text-purple-light':
|
|
168
|
+
(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',
|
|
169
|
+
}"
|
|
170
|
+
name="matMoreVert"
|
|
171
|
+
></ng-icon>
|
|
172
|
+
</gn-ui-button>
|
|
173
|
+
</div>
|
|
164
174
|
<ng-template #template>
|
|
165
175
|
<gn-ui-action-menu
|
|
166
176
|
[canDuplicate]="canDuplicate(item) && !isDuplicating"
|
|
167
177
|
[canDelete]="canDelete(item)"
|
|
168
|
-
[
|
|
178
|
+
[page]="isDraftPage ? 'draft' : 'main'"
|
|
169
179
|
(duplicate)="handleDuplicate(item)"
|
|
170
180
|
(delete)="handleDelete(item)"
|
|
171
181
|
(closeActionMenu)="closeActionMenu()"
|
|
@@ -28,16 +28,11 @@ import {
|
|
|
28
28
|
getFileFormat,
|
|
29
29
|
getFormatPriority,
|
|
30
30
|
} from '../../../../../../libs/util/shared/src'
|
|
31
|
-
import { TranslateModule } from '@ngx-translate/core'
|
|
31
|
+
import { TranslateModule, TranslateService } from '@ngx-translate/core'
|
|
32
32
|
import { ActionMenuComponent } from './action-menu/action-menu.component'
|
|
33
33
|
import { NgIconComponent, provideIcons } from '@ng-icons/core'
|
|
34
|
-
import { iconoirUser, iconoirLock } from '@ng-icons/iconoir'
|
|
35
|
-
import {
|
|
36
|
-
CdkConnectedOverlay,
|
|
37
|
-
CdkOverlayOrigin,
|
|
38
|
-
Overlay,
|
|
39
|
-
OverlayRef,
|
|
40
|
-
} from '@angular/cdk/overlay'
|
|
34
|
+
import { iconoirUser, iconoirLock, iconoirTranslate } from '@ng-icons/iconoir'
|
|
35
|
+
import { CdkOverlayOrigin, Overlay, OverlayRef } from '@angular/cdk/overlay'
|
|
41
36
|
import { TemplatePortal } from '@angular/cdk/portal'
|
|
42
37
|
import { matMoreVert } from '@ng-icons/material-icons/baseline'
|
|
43
38
|
|
|
@@ -57,7 +52,9 @@ import { matMoreVert } from '@ng-icons/material-icons/baseline'
|
|
|
57
52
|
NgIconComponent,
|
|
58
53
|
CdkOverlayOrigin,
|
|
59
54
|
],
|
|
60
|
-
providers: [
|
|
55
|
+
providers: [
|
|
56
|
+
provideIcons({ iconoirUser, iconoirLock, iconoirTranslate, matMoreVert }),
|
|
57
|
+
],
|
|
61
58
|
})
|
|
62
59
|
export class ResultsTableComponent {
|
|
63
60
|
@Input() records: CatalogRecord[] = []
|
|
@@ -89,7 +86,8 @@ export class ResultsTableComponent {
|
|
|
89
86
|
private overlay: Overlay,
|
|
90
87
|
private viewContainerRef: ViewContainerRef,
|
|
91
88
|
private cdr: ChangeDetectorRef,
|
|
92
|
-
private dateService: DateService
|
|
89
|
+
private dateService: DateService,
|
|
90
|
+
private translateService: TranslateService
|
|
93
91
|
) {}
|
|
94
92
|
|
|
95
93
|
openActionMenu(item, template) {
|
|
@@ -219,4 +217,16 @@ export class ResultsTableComponent {
|
|
|
219
217
|
handleRecordSelectedChange(selected: boolean, record: CatalogRecord) {
|
|
220
218
|
this.recordsSelectedChange.emit([[record], selected])
|
|
221
219
|
}
|
|
220
|
+
|
|
221
|
+
isMultilingual(record: CatalogRecord): boolean {
|
|
222
|
+
return record.otherLanguages.length > 0
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
getTxtHoverMultilingual(record: CatalogRecord) {
|
|
226
|
+
return this.translateService.instant('dashboard.records.isMultilingual', {
|
|
227
|
+
languages: [...[record.defaultLanguage], ...record.otherLanguages].join(
|
|
228
|
+
', '
|
|
229
|
+
),
|
|
230
|
+
})
|
|
231
|
+
}
|
|
222
232
|
}
|
|
@@ -39,6 +39,7 @@ import {
|
|
|
39
39
|
matMapOutline,
|
|
40
40
|
} from '@ng-icons/material-icons/outline'
|
|
41
41
|
import { matFace } from '@ng-icons/material-icons/baseline'
|
|
42
|
+
import { ActionMenuComponent } from './results-table/action-menu/action-menu.component'
|
|
42
43
|
|
|
43
44
|
@NgModule({
|
|
44
45
|
declarations: [
|
|
@@ -79,6 +80,7 @@ import { matFace } from '@ng-icons/material-icons/baseline'
|
|
|
79
80
|
}),
|
|
80
81
|
KindBadgeComponent,
|
|
81
82
|
MetadataQualityComponent,
|
|
83
|
+
ActionMenuComponent,
|
|
82
84
|
],
|
|
83
85
|
exports: [
|
|
84
86
|
RecordPreviewListComponent,
|
|
@@ -93,6 +95,7 @@ import { matFace } from '@ng-icons/material-icons/baseline'
|
|
|
93
95
|
ResultsHitsSearchKindComponent,
|
|
94
96
|
RecordPreviewFeedComponent,
|
|
95
97
|
RecordPreviewRowComponent,
|
|
98
|
+
ActionMenuComponent,
|
|
96
99
|
],
|
|
97
100
|
providers: [
|
|
98
101
|
provideNgIconsConfig({
|
|
@@ -19,12 +19,54 @@ marker('language.pt')
|
|
|
19
19
|
marker('language.ru')
|
|
20
20
|
marker('language.zh')
|
|
21
21
|
marker('language.sk')
|
|
22
|
+
marker('language.rm')
|
|
23
|
+
marker('language.ar')
|
|
24
|
+
marker('language.da')
|
|
25
|
+
marker('language.no')
|
|
26
|
+
marker('language.pl')
|
|
27
|
+
marker('language.sv')
|
|
28
|
+
marker('language.tr')
|
|
29
|
+
marker('language.hy')
|
|
30
|
+
marker('language.az')
|
|
31
|
+
marker('language.ka')
|
|
32
|
+
marker('language.uk')
|
|
33
|
+
marker('language.cy')
|
|
22
34
|
|
|
23
35
|
export const DEFAULT_LANG = 'en'
|
|
24
36
|
|
|
25
37
|
// Caution: changing this can break language selection from third parties!
|
|
26
38
|
export const LANGUAGE_STORAGE_KEY = 'geonetwork-ui-language'
|
|
27
39
|
|
|
40
|
+
export const SUPPORTED_LANGUAGES = [
|
|
41
|
+
'en',
|
|
42
|
+
'nl',
|
|
43
|
+
'fr',
|
|
44
|
+
'de',
|
|
45
|
+
'ko',
|
|
46
|
+
'es',
|
|
47
|
+
'cs',
|
|
48
|
+
'ca',
|
|
49
|
+
'fi',
|
|
50
|
+
'is',
|
|
51
|
+
'it',
|
|
52
|
+
'pt',
|
|
53
|
+
'ru',
|
|
54
|
+
'zh',
|
|
55
|
+
'sk',
|
|
56
|
+
'rm',
|
|
57
|
+
'ar',
|
|
58
|
+
'da',
|
|
59
|
+
'no',
|
|
60
|
+
'pl',
|
|
61
|
+
'sv',
|
|
62
|
+
'tr',
|
|
63
|
+
'hy',
|
|
64
|
+
'az',
|
|
65
|
+
'ka',
|
|
66
|
+
'uk',
|
|
67
|
+
'cy',
|
|
68
|
+
]
|
|
69
|
+
|
|
28
70
|
export function HttpLoaderFactory(http: HttpClient) {
|
|
29
71
|
return new FileTranslateLoader(http, './assets/i18n/')
|
|
30
72
|
}
|
|
@@ -15,6 +15,17 @@ export const LANG_3_TO_2_MAPPER = {
|
|
|
15
15
|
chi: 'zh',
|
|
16
16
|
slo: 'sk',
|
|
17
17
|
roh: 'rm',
|
|
18
|
+
ara: 'ar',
|
|
19
|
+
dan: 'da',
|
|
20
|
+
nor: 'no',
|
|
21
|
+
pol: 'pl',
|
|
22
|
+
swe: 'sv',
|
|
23
|
+
tur: 'tr',
|
|
24
|
+
arm: 'hy',
|
|
25
|
+
aze: 'az',
|
|
26
|
+
geo: 'ka',
|
|
27
|
+
ukr: 'uk',
|
|
28
|
+
wel: 'cy',
|
|
18
29
|
}
|
|
19
30
|
|
|
20
31
|
export const LANGUAGE_NAMES = {
|
|
@@ -33,7 +44,18 @@ export const LANGUAGE_NAMES = {
|
|
|
33
44
|
ru: 'Русский',
|
|
34
45
|
zh: '中文',
|
|
35
46
|
sk: 'Slovenčina',
|
|
36
|
-
|
|
47
|
+
rm: 'Rumantsch',
|
|
48
|
+
ar: 'العربية',
|
|
49
|
+
da: 'Dansk',
|
|
50
|
+
no: 'Norsk',
|
|
51
|
+
pl: 'Polski',
|
|
52
|
+
sv: 'Swedish',
|
|
53
|
+
tr: 'Türkçe',
|
|
54
|
+
hy: 'հայերեն',
|
|
55
|
+
az: 'Azərbaycan dili',
|
|
56
|
+
ka: 'ქართული',
|
|
57
|
+
uk: 'українська',
|
|
58
|
+
wel: 'Cymraeg',
|
|
37
59
|
}
|
|
38
60
|
|
|
39
61
|
export const LANG_2_TO_3_MAPPER = Object.entries(LANG_3_TO_2_MAPPER).reduce(
|
package/tailwind.base.css
CHANGED
package/translations/de.json
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"dashboard.labels.mySpace": "Mein Bereich",
|
|
31
31
|
"dashboard.records.all": "Metadatenkatalog",
|
|
32
32
|
"dashboard.records.hasDraft": "",
|
|
33
|
+
"dashboard.records.isMultilingual": "Dieser Eintrag ist mehrsprachig ({languages})",
|
|
33
34
|
"dashboard.records.myDraft": "Meine Entwürfe",
|
|
34
35
|
"dashboard.records.myRecords": "Meine Datensätze",
|
|
35
36
|
"dashboard.records.search": "Suche nach \"{searchText}\"",
|
|
@@ -204,9 +205,13 @@
|
|
|
204
205
|
"editor.record.form.license.odc-by": "",
|
|
205
206
|
"editor.record.form.license.pddl": "",
|
|
206
207
|
"editor.record.form.license.unknown": "",
|
|
208
|
+
"editor.record.form.multilingual.activate": "",
|
|
209
|
+
"editor.record.form.multilingual.default": "",
|
|
207
210
|
"editor.record.form.multilingual.enable": "",
|
|
211
|
+
"editor.record.form.multilingual.forbidden": "",
|
|
208
212
|
"editor.record.form.multilingual.open": "",
|
|
209
213
|
"editor.record.form.multilingual.title": "",
|
|
214
|
+
"editor.record.form.multilingual.validate": "",
|
|
210
215
|
"editor.record.form.page.accessAndContact": "",
|
|
211
216
|
"editor.record.form.page.description": "",
|
|
212
217
|
"editor.record.form.page.resources": "",
|
|
@@ -238,6 +243,10 @@
|
|
|
238
243
|
"editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
|
|
239
244
|
"editor.record.lock.format": "",
|
|
240
245
|
"editor.record.lock.reason": "",
|
|
246
|
+
"editor.record.multilingual.confirmation.cancelText": "",
|
|
247
|
+
"editor.record.multilingual.confirmation.confirmText": "",
|
|
248
|
+
"editor.record.multilingual.confirmation.message": "",
|
|
249
|
+
"editor.record.multilingual.confirmation.title": "",
|
|
241
250
|
"editor.record.onlineResource.protocol.other": "",
|
|
242
251
|
"editor.record.onlineResourceError.body": "",
|
|
243
252
|
"editor.record.onlineResourceError.closeMessage": "",
|
|
@@ -298,20 +307,32 @@
|
|
|
298
307
|
"input.image.uploadErrorLabel": "",
|
|
299
308
|
"input.image.uploadProgressCancel": "",
|
|
300
309
|
"input.image.uploadProgressLabel": "",
|
|
310
|
+
"language.ar": "",
|
|
311
|
+
"language.az": "",
|
|
301
312
|
"language.ca": "Katalanisch",
|
|
302
313
|
"language.cs": "Tschechisch",
|
|
314
|
+
"language.cy": "",
|
|
315
|
+
"language.da": "",
|
|
303
316
|
"language.de": "Deutsch",
|
|
304
317
|
"language.en": "Englisch",
|
|
305
318
|
"language.es": "Spanisch",
|
|
306
319
|
"language.fi": "Finnisch",
|
|
307
320
|
"language.fr": "Französisch",
|
|
321
|
+
"language.hy": "",
|
|
308
322
|
"language.is": "Isländisch",
|
|
309
323
|
"language.it": "Italienisch",
|
|
324
|
+
"language.ka": "",
|
|
310
325
|
"language.ko": "Koreanisch",
|
|
311
326
|
"language.nl": "Niederländisch",
|
|
327
|
+
"language.no": "",
|
|
328
|
+
"language.pl": "",
|
|
312
329
|
"language.pt": "Portugiesisch",
|
|
330
|
+
"language.rm": "",
|
|
313
331
|
"language.ru": "Russisch",
|
|
314
332
|
"language.sk": "Slowakisch",
|
|
333
|
+
"language.sv": "",
|
|
334
|
+
"language.tr": "",
|
|
335
|
+
"language.uk": "",
|
|
315
336
|
"language.zh": "Chinesisch",
|
|
316
337
|
"map.add.layer": "Eine Ebene hinzufügen",
|
|
317
338
|
"map.add.layer.catalog": "Aus dem Katalog",
|
|
@@ -358,6 +379,7 @@
|
|
|
358
379
|
"record.action.duplicate": "",
|
|
359
380
|
"record.action.duplicating": "",
|
|
360
381
|
"record.action.rollback": "",
|
|
382
|
+
"record.action.switchLang": "",
|
|
361
383
|
"record.action.view": "Anzeigen",
|
|
362
384
|
"record.card.metadata.contact": "",
|
|
363
385
|
"record.externalViewer.open": "In externem Kartenviewer öffnen",
|
|
@@ -408,9 +430,15 @@
|
|
|
408
430
|
"record.metadata.download": "Downloads",
|
|
409
431
|
"record.metadata.feature.catalog": "",
|
|
410
432
|
"record.metadata.formats": "Formate",
|
|
433
|
+
"record.metadata.isGeographical": "Geographischer Datensatz",
|
|
411
434
|
"record.metadata.keywords": "Stichworte",
|
|
412
435
|
"record.metadata.languages": "Sprachen",
|
|
413
436
|
"record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
|
|
437
|
+
"record.metadata.linked.datasets": "Verknüpfte Datensätze",
|
|
438
|
+
"record.metadata.linked.records": "Verknüpfte Inhalte",
|
|
439
|
+
"record.metadata.linked.reuses": "Verknüpfte Wiederverwendungen",
|
|
440
|
+
"record.metadata.linked.services": "Verknüpfte Dienste",
|
|
441
|
+
"record.metadata.linked.sourceDatasets": "Quelldatensätze",
|
|
414
442
|
"record.metadata.links": "Links",
|
|
415
443
|
"record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
|
|
416
444
|
"record.metadata.otherConstraints": "Zusätzliche Bedingungen",
|
|
@@ -437,8 +465,7 @@
|
|
|
437
465
|
"record.metadata.quality.topic.success": "Thema angegeben",
|
|
438
466
|
"record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
|
|
439
467
|
"record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
|
|
440
|
-
"record.metadata.related": "
|
|
441
|
-
"record.metadata.related.contents": "",
|
|
468
|
+
"record.metadata.related": "Entdecken Sie den Katalog",
|
|
442
469
|
"record.metadata.ressources.and.links": "Ressourcen und Links",
|
|
443
470
|
"record.metadata.sheet": "Weitere Informationen verfügbar unter:",
|
|
444
471
|
"record.metadata.status": "Status",
|
|
@@ -450,7 +477,6 @@
|
|
|
450
477
|
"record.metadata.temporalExtent.untilDate": "Bis {end}",
|
|
451
478
|
"record.metadata.title": "Titel",
|
|
452
479
|
"record.metadata.topics": "Kategorien",
|
|
453
|
-
"record.metadata.isGeographical": "Geographischer Datensatz",
|
|
454
480
|
"record.metadata.uniqueId": "Eindeutige Kennung",
|
|
455
481
|
"record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
|
|
456
482
|
"record.metadata.updatedOn": "Geändert am",
|
|
@@ -570,7 +596,6 @@
|
|
|
570
596
|
"tooltip.html.copy": "HTML kopieren",
|
|
571
597
|
"tooltip.id.copy": "Eindeutige Kennung kopieren",
|
|
572
598
|
"tooltip.url.copy": "URL kopieren",
|
|
573
|
-
"tooltip.url.open": "URL öffnen",
|
|
574
599
|
"ui.readLess": "Weniger lesen",
|
|
575
600
|
"ui.readMore": "Weiterlesen",
|
|
576
601
|
"wfs.feature.limit": "Zu viele Features, um den WFS-Layer anzuzeigen!",
|