geonetwork-ui 2.2.0-dev.e3947702 → 2.2.0-dev.ecc0ab67
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 +42 -51
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +4 -3
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +16 -11
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +23 -16
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +21 -18
- package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +10 -3
- package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
- package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
- package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
- package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
- package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
- package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
- package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
- package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
- package/esm2022/libs/feature/search/src/index.mjs +4 -1
- package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +1 -1
- package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
- package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
- package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
- package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
- package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
- package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
- package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
- package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -4
- package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
- package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
- package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
- package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
- package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
- package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
- package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +35 -22
- package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +2 -3
- package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
- package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
- package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
- package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
- package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +3 -2
- package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +5 -5
- package/esm2022/libs/ui/layout/src/index.mjs +3 -1
- package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
- package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
- package/esm2022/libs/ui/search/src/index.mjs +1 -2
- package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
- package/esm2022/libs/util/i18n/src/index.mjs +1 -2
- package/esm2022/translations/de.json +6 -4
- package/esm2022/translations/en.json +9 -7
- package/esm2022/translations/es.json +6 -4
- package/esm2022/translations/fr.json +9 -7
- package/esm2022/translations/it.json +8 -6
- package/esm2022/translations/nl.json +6 -4
- package/esm2022/translations/pt.json +6 -4
- package/fesm2022/geonetwork-ui.mjs +511 -525
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -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/gn4.metadata.mapper.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +5 -4
- 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 +3 -2
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
- package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +5 -10
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
- package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
- package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
- package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
- package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
- package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
- package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
- package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
- package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
- package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
- package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
- package/libs/feature/search/src/index.d.ts +3 -0
- package/libs/feature/search/src/index.d.ts.map +1 -1
- package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -3
- package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
- package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
- package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
- package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
- package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
- package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
- package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
- package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
- package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
- package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
- package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
- package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
- package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
- package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
- package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
- package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
- package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
- package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
- package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +7 -3
- package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
- package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/index.d.ts +1 -0
- package/libs/ui/inputs/src/index.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +1 -1
- package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +18 -18
- package/libs/ui/layout/src/index.d.ts +2 -0
- package/libs/ui/layout/src/index.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
- package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
- package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
- package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
- package/libs/ui/search/src/index.d.ts +0 -1
- package/libs/ui/search/src/index.d.ts.map +1 -1
- package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
- package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
- package/libs/util/i18n/src/index.d.ts +0 -1
- package/libs/util/i18n/src/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +6 -6
- package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -3
- package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +22 -4
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +69 -65
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +3 -2
- package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +19 -12
- package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +62 -43
- package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +91 -59
- package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
- package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
- package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
- package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +5 -11
- package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
- package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
- package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
- package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
- package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
- package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
- package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
- package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
- package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
- package/src/libs/common/fixtures/src/lib/records.fixtures.ts +6 -2
- package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
- package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
- package/src/libs/feature/search/src/index.ts +3 -0
- package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -1
- package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
- package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
- package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
- package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
- package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
- package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
- package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
- package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
- package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
- package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
- package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
- package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
- package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
- package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +3 -2
- package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -2
- package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
- package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +45 -18
- package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +31 -12
- package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +1 -2
- package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
- package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
- package/src/libs/ui/inputs/src/index.ts +1 -0
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
- package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
- package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
- package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +1 -0
- package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +1 -1
- package/src/libs/ui/layout/src/index.ts +2 -0
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
- package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
- package/src/libs/ui/search/src/index.ts +0 -1
- package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
- package/src/libs/util/i18n/src/index.ts +0 -1
- package/translations/de.json +6 -4
- package/translations/en.json +9 -7
- package/translations/es.json +6 -4
- package/translations/fr.json +9 -7
- package/translations/it.json +8 -6
- package/translations/nl.json +6 -4
- package/translations/pt.json +6 -4
- package/translations/sk.json +6 -4
- package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
- package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
- package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
- package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
- package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
- package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
- package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
- package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
- package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
- package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
- package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
- package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
- package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
- package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
- package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
- package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
- package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
- package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<gn-ui-interactive-table
|
|
2
|
+
[items]="records$ | async"
|
|
3
|
+
(itemClick)="handleRecordClick($event)"
|
|
4
|
+
>
|
|
5
|
+
<!-- SELECTED COLUMN -->
|
|
6
|
+
<gn-ui-interactive-table-column>
|
|
7
|
+
<ng-template #header>
|
|
8
|
+
<gn-ui-checkbox
|
|
9
|
+
[checked]="isAllSelected() | async"
|
|
10
|
+
[indeterminate]="isSomeSelected() | async"
|
|
11
|
+
(changed)="toggleSelectAll()"
|
|
12
|
+
type="default"
|
|
13
|
+
class="-m-2 mr-3"
|
|
14
|
+
>
|
|
15
|
+
</gn-ui-checkbox>
|
|
16
|
+
</ng-template>
|
|
17
|
+
<ng-template #cell let-item>
|
|
18
|
+
<gn-ui-checkbox
|
|
19
|
+
[checked]="isChecked(item) | async"
|
|
20
|
+
(changed)="handleRecordSelectedChange($event, item)"
|
|
21
|
+
class="-m-2"
|
|
22
|
+
type="default"
|
|
23
|
+
></gn-ui-checkbox>
|
|
24
|
+
</ng-template>
|
|
25
|
+
</gn-ui-interactive-table-column>
|
|
26
|
+
|
|
27
|
+
<!-- TITLE COLUMN -->
|
|
28
|
+
<gn-ui-interactive-table-column
|
|
29
|
+
[sortable]="true"
|
|
30
|
+
[activeSort]="isSortedBy('resourceTitleObject.default.keyword') | async"
|
|
31
|
+
(sortChange)="setSortBy('resourceTitleObject.default.keyword', $event)"
|
|
32
|
+
>
|
|
33
|
+
<ng-template #header>
|
|
34
|
+
<span translate>record.metadata.title</span>
|
|
35
|
+
</ng-template>
|
|
36
|
+
<ng-template #cell let-item>
|
|
37
|
+
{{ item.title }}
|
|
38
|
+
</ng-template>
|
|
39
|
+
</gn-ui-interactive-table-column>
|
|
40
|
+
|
|
41
|
+
<!-- FORMATS COLUMN -->
|
|
42
|
+
<gn-ui-interactive-table-column>
|
|
43
|
+
<ng-template #header>
|
|
44
|
+
<span translate>record.metadata.formats</span>
|
|
45
|
+
</ng-template>
|
|
46
|
+
<ng-template #cell let-item>
|
|
47
|
+
<div
|
|
48
|
+
class="flex justify-start items-center gap-2"
|
|
49
|
+
*ngIf="getRecordFormats(item) as formats"
|
|
50
|
+
[title]="formats.join(', ')"
|
|
51
|
+
>
|
|
52
|
+
<span
|
|
53
|
+
class="badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0"
|
|
54
|
+
[style.background-color]="getBadgeColor(formats[0])"
|
|
55
|
+
*ngIf="formats[0]"
|
|
56
|
+
>
|
|
57
|
+
{{ formats[0] }}
|
|
58
|
+
</span>
|
|
59
|
+
<span
|
|
60
|
+
class="badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0"
|
|
61
|
+
[style.background-color]="getBadgeColor(formats[1])"
|
|
62
|
+
*ngIf="formats[1]"
|
|
63
|
+
>
|
|
64
|
+
{{ formats[1] }}
|
|
65
|
+
</span>
|
|
66
|
+
<div class="flex-shrink-0" *ngIf="formats.slice(2).length > 0">
|
|
67
|
+
<span>+{{ formats.slice(2).length }}</span>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
<div *ngIf="!getRecordFormats(item)"></div>
|
|
71
|
+
</ng-template>
|
|
72
|
+
</gn-ui-interactive-table-column>
|
|
73
|
+
|
|
74
|
+
<!-- OWNER COLUMN -->
|
|
75
|
+
<gn-ui-interactive-table-column
|
|
76
|
+
[sortable]="true"
|
|
77
|
+
[activeSort]="isSortedBy('recordOwner') | async"
|
|
78
|
+
(sortChange)="setSortBy('recordOwner', $event)"
|
|
79
|
+
>
|
|
80
|
+
<ng-template #header>
|
|
81
|
+
<span translate>record.metadata.author</span>
|
|
82
|
+
</ng-template>
|
|
83
|
+
<ng-template #cell let-item>
|
|
84
|
+
<mat-icon class="material-symbols-outlined">person</mat-icon>
|
|
85
|
+
<span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>
|
|
86
|
+
</ng-template>
|
|
87
|
+
</gn-ui-interactive-table-column>
|
|
88
|
+
|
|
89
|
+
<!-- STATUS COLUMN -->
|
|
90
|
+
<gn-ui-interactive-table-column>
|
|
91
|
+
<ng-template #header>
|
|
92
|
+
<span translate>record.metadata.status</span>
|
|
93
|
+
</ng-template>
|
|
94
|
+
<ng-template #cell let-item>
|
|
95
|
+
{{ item.status }}
|
|
96
|
+
</ng-template>
|
|
97
|
+
</gn-ui-interactive-table-column>
|
|
98
|
+
|
|
99
|
+
<!-- UPDATE DATE COLUMN -->
|
|
100
|
+
<gn-ui-interactive-table-column
|
|
101
|
+
[sortable]="true"
|
|
102
|
+
[activeSort]="isSortedBy('changeDate') | async"
|
|
103
|
+
(sortChange)="setSortBy('changeDate', $event)"
|
|
104
|
+
>
|
|
105
|
+
<ng-template #header>
|
|
106
|
+
<span translate>record.metadata.updatedOn</span>
|
|
107
|
+
</ng-template>
|
|
108
|
+
<ng-template #cell let-item>
|
|
109
|
+
{{ dateToString(item.recordUpdated) }}
|
|
110
|
+
</ng-template>
|
|
111
|
+
</gn-ui-interactive-table-column>
|
|
112
|
+
</gn-ui-interactive-table>
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Component, EventEmitter, Output } from '@angular/core'
|
|
2
|
+
import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
3
|
+
import {
|
|
4
|
+
FileFormat,
|
|
5
|
+
getBadgeColor,
|
|
6
|
+
getFileFormat,
|
|
7
|
+
getFormatPriority,
|
|
8
|
+
} from '../../../../../../libs/util/shared/src'
|
|
9
|
+
import { UiInputsModule } from '../../../../../../libs/ui/inputs/src'
|
|
10
|
+
import {
|
|
11
|
+
InteractiveTableColumnComponent,
|
|
12
|
+
InteractiveTableComponent,
|
|
13
|
+
} from '../../../../../../libs/ui/layout/src'
|
|
14
|
+
import { MatIconModule } from '@angular/material/icon'
|
|
15
|
+
import { TranslateModule } from '@ngx-translate/core'
|
|
16
|
+
import { SearchFacade } from '../state/search.facade'
|
|
17
|
+
import { SelectionService } from '../../../../../../libs/api/repository/src'
|
|
18
|
+
import { combineLatest, firstValueFrom, Observable } from 'rxjs'
|
|
19
|
+
import { CommonModule } from '@angular/common'
|
|
20
|
+
import { map, take } from 'rxjs/operators'
|
|
21
|
+
import { FieldSort } from '../../../../../../libs/common/domain/src/lib/model/search'
|
|
22
|
+
import { SearchService } from '../utils/service/search.service'
|
|
23
|
+
|
|
24
|
+
@Component({
|
|
25
|
+
selector: 'gn-ui-results-table',
|
|
26
|
+
templateUrl: './results-table.component.html',
|
|
27
|
+
styleUrls: ['./results-table.component.css'],
|
|
28
|
+
standalone: true,
|
|
29
|
+
imports: [
|
|
30
|
+
CommonModule,
|
|
31
|
+
UiInputsModule,
|
|
32
|
+
InteractiveTableComponent,
|
|
33
|
+
InteractiveTableColumnComponent,
|
|
34
|
+
MatIconModule,
|
|
35
|
+
TranslateModule,
|
|
36
|
+
],
|
|
37
|
+
})
|
|
38
|
+
export class ResultsTableComponent {
|
|
39
|
+
@Output() recordClick = new EventEmitter<CatalogRecord>()
|
|
40
|
+
|
|
41
|
+
records$ = this.searchFacade.results$
|
|
42
|
+
selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$
|
|
43
|
+
|
|
44
|
+
constructor(
|
|
45
|
+
private searchFacade: SearchFacade,
|
|
46
|
+
private searchService: SearchService,
|
|
47
|
+
private selectionService: SelectionService
|
|
48
|
+
) {}
|
|
49
|
+
|
|
50
|
+
dateToString(date: Date): string {
|
|
51
|
+
return date?.toLocaleDateString(undefined, {
|
|
52
|
+
year: 'numeric',
|
|
53
|
+
month: 'long',
|
|
54
|
+
day: 'numeric',
|
|
55
|
+
timeZone: 'UTC',
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
getStatus(isPublishedToAll: boolean | unknown) {
|
|
60
|
+
return isPublishedToAll ? 'published' : 'not published'
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
getRecordFormats(record: CatalogRecord): FileFormat[] {
|
|
64
|
+
if (record.kind === 'service' || !('distributions' in record)) {
|
|
65
|
+
return []
|
|
66
|
+
}
|
|
67
|
+
const formats = Array.from(
|
|
68
|
+
new Set(
|
|
69
|
+
record.distributions.map((distribution) => getFileFormat(distribution))
|
|
70
|
+
)
|
|
71
|
+
).filter((format) => !!format)
|
|
72
|
+
formats.sort((a, b) => getFormatPriority(b) - getFormatPriority(a))
|
|
73
|
+
return formats
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
formatUserInfo(userInfo: string | unknown): string {
|
|
77
|
+
const infos = (typeof userInfo === 'string' ? userInfo : '').split('|')
|
|
78
|
+
if (infos && infos.length === 4) {
|
|
79
|
+
return `${infos[2]} ${infos[1]}`
|
|
80
|
+
}
|
|
81
|
+
return undefined
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
getBadgeColor(format: FileFormat): string {
|
|
85
|
+
return getBadgeColor(format)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
handleRecordClick(item: unknown) {
|
|
89
|
+
this.recordClick.emit(item as CatalogRecord)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
setSortBy(col: string, order: 'asc' | 'desc') {
|
|
93
|
+
this.searchService.setSortBy([order, col])
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
isSortedBy(col: string): Observable<'asc' | 'desc' | null> {
|
|
97
|
+
return this.searchFacade.sortBy$.pipe(
|
|
98
|
+
take(1),
|
|
99
|
+
map((sortOrder) => {
|
|
100
|
+
const sortArray = Array.isArray(sortOrder[0])
|
|
101
|
+
? (sortOrder as FieldSort[])
|
|
102
|
+
: ([sortOrder] as FieldSort[])
|
|
103
|
+
for (const sort of sortArray) {
|
|
104
|
+
if (sort[1] === col) {
|
|
105
|
+
return sort[0]
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return null
|
|
109
|
+
})
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
isChecked(record: CatalogRecord): Observable<boolean> {
|
|
114
|
+
return this.selectedRecords$.pipe(
|
|
115
|
+
take(1),
|
|
116
|
+
map((selectedRecords) => {
|
|
117
|
+
return selectedRecords.includes(record.uniqueIdentifier)
|
|
118
|
+
})
|
|
119
|
+
)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
handleRecordSelectedChange(selected: boolean, record: CatalogRecord) {
|
|
123
|
+
if (!selected) {
|
|
124
|
+
this.selectionService.deselectRecords([record])
|
|
125
|
+
} else {
|
|
126
|
+
this.selectionService.selectRecords([record])
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async toggleSelectAll() {
|
|
131
|
+
const records = await firstValueFrom(this.records$)
|
|
132
|
+
if (await firstValueFrom(this.isAllSelected())) {
|
|
133
|
+
this.selectionService.deselectRecords(records)
|
|
134
|
+
} else {
|
|
135
|
+
this.selectionService.selectRecords(records)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
isAllSelected(): Observable<boolean> {
|
|
140
|
+
return combineLatest([this.records$, this.selectedRecords$]).pipe(
|
|
141
|
+
take(1),
|
|
142
|
+
map(([records, selectedRecords]) => {
|
|
143
|
+
return records.every((record) =>
|
|
144
|
+
selectedRecords.includes(record.uniqueIdentifier)
|
|
145
|
+
)
|
|
146
|
+
})
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
isSomeSelected(): Observable<boolean> {
|
|
151
|
+
return combineLatest([this.records$, this.selectedRecords$]).pipe(
|
|
152
|
+
take(1),
|
|
153
|
+
map(([records, selectedRecords]) => {
|
|
154
|
+
const allSelected = records.every((record) =>
|
|
155
|
+
selectedRecords.includes(record.uniqueIdentifier)
|
|
156
|
+
)
|
|
157
|
+
const someSelected = records.some((record) =>
|
|
158
|
+
selectedRecords.includes(record.uniqueIdentifier)
|
|
159
|
+
)
|
|
160
|
+
return !allSelected && someSelected
|
|
161
|
+
})
|
|
162
|
+
)
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -41,7 +41,7 @@ import { getSearchStateSearch } from './selectors'
|
|
|
41
41
|
import { HttpErrorResponse } from '@angular/common/http'
|
|
42
42
|
import { switchMapWithSearchId } from '../utils/operators/search.operator'
|
|
43
43
|
import { Geometry } from 'geojson'
|
|
44
|
-
import { FILTER_GEOMETRY } from '../
|
|
44
|
+
import { FILTER_GEOMETRY } from '../filter-geometry.token'
|
|
45
45
|
import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
|
|
46
46
|
import { FavoritesService } from '../../../../../../libs/api/repository/src'
|
|
47
47
|
import { PlatformServiceInterface } from '../../../../../../libs/common/domain/src/lib/platform.service.interface'
|
|
@@ -126,10 +126,11 @@ export class SearchEffects {
|
|
|
126
126
|
),
|
|
127
127
|
switchMap(([state, favorites]) => {
|
|
128
128
|
if (!state.params.useSpatialFilter || !this.filterGeometry$) {
|
|
129
|
-
return of([state, favorites,
|
|
129
|
+
return of([state, favorites, undefined])
|
|
130
130
|
}
|
|
131
131
|
return this.filterGeometry$.pipe(
|
|
132
132
|
tap((geom) => {
|
|
133
|
+
if (!geom) return
|
|
133
134
|
try {
|
|
134
135
|
const trace = validGeoJson(geom, true) as string[]
|
|
135
136
|
if (trace?.length > 0) {
|
|
@@ -145,7 +146,7 @@ export class SearchEffects {
|
|
|
145
146
|
}),
|
|
146
147
|
map((geom) => [state, favorites, geom]),
|
|
147
148
|
catchError((e) => {
|
|
148
|
-
return of([state, favorites,
|
|
149
|
+
return of([state, favorites, undefined])
|
|
149
150
|
})
|
|
150
151
|
)
|
|
151
152
|
}),
|
|
@@ -153,7 +154,7 @@ export class SearchEffects {
|
|
|
153
154
|
([state, favorites, geometry]: [
|
|
154
155
|
SearchStateSearch,
|
|
155
156
|
string[],
|
|
156
|
-
Geometry |
|
|
157
|
+
Geometry | undefined
|
|
157
158
|
]) => {
|
|
158
159
|
const { currentPage, pageSize, sort } = state.params
|
|
159
160
|
const filters = {
|
|
@@ -40,7 +40,7 @@ import {
|
|
|
40
40
|
isEndOfResults,
|
|
41
41
|
totalPages,
|
|
42
42
|
} from './selectors'
|
|
43
|
-
import { FILTER_GEOMETRY } from '../
|
|
43
|
+
import { FILTER_GEOMETRY } from '../filter-geometry.token'
|
|
44
44
|
import { Geometry } from 'geojson'
|
|
45
45
|
import { catchError, map, shareReplay } from 'rxjs/operators'
|
|
46
46
|
import {
|
|
@@ -215,5 +215,6 @@ export class SearchFacade {
|
|
|
215
215
|
this.store.dispatch(new SetFilters({}, this.searchId))
|
|
216
216
|
this.store.dispatch(new SetSortBy([], this.searchId))
|
|
217
217
|
this.store.dispatch(new SetFavoritesOnly(false, this.searchId))
|
|
218
|
+
return this
|
|
218
219
|
}
|
|
219
220
|
}
|
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
FieldValue,
|
|
5
5
|
FullTextSearchField,
|
|
6
6
|
IsSpatialSearchField,
|
|
7
|
-
KeySearchField,
|
|
8
7
|
LicenseSearchField,
|
|
8
|
+
MultilingualSearchField,
|
|
9
9
|
OrganizationSearchField,
|
|
10
10
|
OwnerSearchField,
|
|
11
11
|
SimpleSearchField,
|
|
12
|
-
|
|
12
|
+
TranslatedSearchField,
|
|
13
13
|
} from './fields'
|
|
14
14
|
import { forkJoin, Observable, of } from 'rxjs'
|
|
15
15
|
import { map } from 'rxjs/operators'
|
|
@@ -21,6 +21,7 @@ export type FieldValues = Record<string, FieldValue[] | FieldValue>
|
|
|
21
21
|
|
|
22
22
|
marker('search.filters.format')
|
|
23
23
|
marker('search.filters.inspireKeyword')
|
|
24
|
+
marker('search.filters.keyword')
|
|
24
25
|
marker('search.filters.isSpatial')
|
|
25
26
|
marker('search.filters.license')
|
|
26
27
|
marker('search.filters.publicationYear')
|
|
@@ -37,29 +38,33 @@ marker('search.filters.contact')
|
|
|
37
38
|
export class FieldsService {
|
|
38
39
|
private fields = {
|
|
39
40
|
publisher: new OrganizationSearchField(this.injector),
|
|
40
|
-
format: new SimpleSearchField('format', 'asc'
|
|
41
|
-
resourceType: new
|
|
42
|
-
|
|
41
|
+
format: new SimpleSearchField('format', this.injector, 'asc'),
|
|
42
|
+
resourceType: new TranslatedSearchField(
|
|
43
|
+
'resourceType',
|
|
44
|
+
this.injector,
|
|
45
|
+
'asc'
|
|
46
|
+
),
|
|
47
|
+
representationType: new TranslatedSearchField(
|
|
43
48
|
'cl_spatialRepresentationType.key',
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
this.injector,
|
|
50
|
+
'asc'
|
|
46
51
|
),
|
|
47
52
|
publicationYear: new SimpleSearchField(
|
|
48
53
|
'publicationYearForResource',
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
this.injector,
|
|
55
|
+
'desc'
|
|
51
56
|
),
|
|
52
|
-
topic: new
|
|
53
|
-
inspireKeyword: new
|
|
57
|
+
topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
|
|
58
|
+
inspireKeyword: new TranslatedSearchField(
|
|
54
59
|
'th_httpinspireeceuropaeutheme-theme.link',
|
|
55
|
-
|
|
56
|
-
'asc'
|
|
57
|
-
this.injector
|
|
60
|
+
this.injector,
|
|
61
|
+
'asc'
|
|
58
62
|
),
|
|
63
|
+
keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
|
|
59
64
|
documentStandard: new SimpleSearchField(
|
|
60
65
|
'documentStandard',
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
this.injector,
|
|
67
|
+
'asc'
|
|
63
68
|
),
|
|
64
69
|
isSpatial: new IsSpatialSearchField(this.injector),
|
|
65
70
|
q: new FullTextSearchField(),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { firstValueFrom, Observable, of, switchMap
|
|
2
|
-
import {
|
|
1
|
+
import { firstValueFrom, Observable, of, switchMap } from 'rxjs'
|
|
2
|
+
import { map } from 'rxjs/operators'
|
|
3
3
|
import { Injector } from '@angular/core'
|
|
4
4
|
import { TranslateService } from '@ngx-translate/core'
|
|
5
5
|
import { marker } from '@biesbjerg/ngx-translate-extract-marker'
|
|
@@ -13,7 +13,10 @@ import {
|
|
|
13
13
|
FieldFilters,
|
|
14
14
|
TermBucket,
|
|
15
15
|
} from '../../../../../../../libs/common/domain/src/lib/model/search'
|
|
16
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
ElasticsearchService,
|
|
18
|
+
METADATA_LANGUAGE,
|
|
19
|
+
} from '../../../../../../../libs/api/repository/src'
|
|
17
20
|
import { LangService } from '../../../../../../../libs/util/i18n/src'
|
|
18
21
|
|
|
19
22
|
export type FieldValue = string | number
|
|
@@ -36,8 +39,9 @@ export class SimpleSearchField implements AbstractSearchField {
|
|
|
36
39
|
|
|
37
40
|
constructor(
|
|
38
41
|
protected esFieldName: string,
|
|
42
|
+
protected injector: Injector,
|
|
39
43
|
protected order: 'asc' | 'desc' = 'asc',
|
|
40
|
-
protected
|
|
44
|
+
protected orderType: 'key' | 'count' = 'key'
|
|
41
45
|
) {}
|
|
42
46
|
|
|
43
47
|
protected getAggregations(): AggregationsParams {
|
|
@@ -46,13 +50,13 @@ export class SimpleSearchField implements AbstractSearchField {
|
|
|
46
50
|
type: 'terms',
|
|
47
51
|
field: this.esFieldName,
|
|
48
52
|
limit: 1000,
|
|
49
|
-
sort: [this.order,
|
|
53
|
+
sort: [this.order, this.orderType],
|
|
50
54
|
},
|
|
51
55
|
}
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
protected async getBucketLabel(bucket: TermBucket): Promise<string> {
|
|
55
|
-
return bucket.term
|
|
59
|
+
return bucket.term.toString()
|
|
56
60
|
}
|
|
57
61
|
|
|
58
62
|
getAvailableValues(): Observable<FieldAvailableValue[]> {
|
|
@@ -88,9 +92,18 @@ export class SimpleSearchField implements AbstractSearchField {
|
|
|
88
92
|
}
|
|
89
93
|
}
|
|
90
94
|
|
|
91
|
-
export class
|
|
95
|
+
export class TranslatedSearchField extends SimpleSearchField {
|
|
92
96
|
protected platformService = this.injector.get(PlatformServiceInterface)
|
|
93
97
|
|
|
98
|
+
constructor(
|
|
99
|
+
protected esFieldName: string,
|
|
100
|
+
protected injector: Injector,
|
|
101
|
+
protected order: 'asc' | 'desc' = 'asc',
|
|
102
|
+
protected orderType: 'key' | 'count' = 'key'
|
|
103
|
+
) {
|
|
104
|
+
super(esFieldName, injector, order, orderType)
|
|
105
|
+
}
|
|
106
|
+
|
|
94
107
|
protected async getTranslation(key: string) {
|
|
95
108
|
return firstValueFrom(this.platformService.translateKey(key))
|
|
96
109
|
}
|
|
@@ -100,6 +113,7 @@ export class KeySearchField extends SimpleSearchField {
|
|
|
100
113
|
}
|
|
101
114
|
|
|
102
115
|
getAvailableValues(): Observable<FieldAvailableValue[]> {
|
|
116
|
+
if (this.orderType === 'count') return super.getAvailableValues()
|
|
103
117
|
// sort values by alphabetical order
|
|
104
118
|
return super
|
|
105
119
|
.getAvailableValues()
|
|
@@ -111,34 +125,29 @@ export class KeySearchField extends SimpleSearchField {
|
|
|
111
125
|
}
|
|
112
126
|
}
|
|
113
127
|
|
|
114
|
-
|
|
128
|
+
/**
|
|
129
|
+
* This search field will either target the `.default` field, or a specific `.langxyz` field according
|
|
130
|
+
* to the defined METADATA_LANGUAGE token
|
|
131
|
+
* The provided ES field name should not include any prefix such as `.langeng`
|
|
132
|
+
*/
|
|
133
|
+
export class MultilingualSearchField extends SimpleSearchField {
|
|
115
134
|
private langService = this.injector.get(LangService)
|
|
116
|
-
private
|
|
117
|
-
.getThesaurusByLang(this.thesaurusName, this.langService.iso3)
|
|
118
|
-
.pipe(
|
|
119
|
-
catchError(() => {
|
|
120
|
-
console.warn('Error while loading thesaurus language package')
|
|
121
|
-
return of([])
|
|
122
|
-
}),
|
|
123
|
-
shareReplay(1)
|
|
124
|
-
)
|
|
135
|
+
private searchLanguage = this.injector.get(METADATA_LANGUAGE, null)
|
|
125
136
|
|
|
126
137
|
constructor(
|
|
127
|
-
esFieldName: string,
|
|
128
|
-
protected
|
|
129
|
-
order: 'asc' | 'desc' = 'asc',
|
|
130
|
-
|
|
138
|
+
protected esFieldName: string,
|
|
139
|
+
protected injector: Injector,
|
|
140
|
+
protected order: 'asc' | 'desc' = 'asc',
|
|
141
|
+
protected orderType: 'key' | 'count' = 'key'
|
|
131
142
|
) {
|
|
132
|
-
super(esFieldName, order,
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
this.
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
)
|
|
141
|
-
)
|
|
143
|
+
super(esFieldName, injector, order, orderType)
|
|
144
|
+
// note: we're excluding the metadata language "current" value because that would produce
|
|
145
|
+
// permalinks that might not work for different users
|
|
146
|
+
if (this.searchLanguage && this.searchLanguage !== 'current') {
|
|
147
|
+
this.esFieldName += `.lang${this.searchLanguage}`
|
|
148
|
+
} else {
|
|
149
|
+
this.esFieldName += '.default'
|
|
150
|
+
}
|
|
142
151
|
}
|
|
143
152
|
}
|
|
144
153
|
|
|
@@ -163,7 +172,7 @@ export class IsSpatialSearchField extends SimpleSearchField {
|
|
|
163
172
|
private translateService = this.injector.get(TranslateService)
|
|
164
173
|
|
|
165
174
|
constructor(injector: Injector) {
|
|
166
|
-
super('isSpatial', 'asc'
|
|
175
|
+
super('isSpatial', injector, 'asc')
|
|
167
176
|
this.esService.registerRuntimeField(
|
|
168
177
|
'isSpatial',
|
|
169
178
|
`String result = 'no';
|
|
@@ -223,7 +232,7 @@ export class LicenseSearchField extends SimpleSearchField {
|
|
|
223
232
|
private translateService = this.injector.get(TranslateService)
|
|
224
233
|
|
|
225
234
|
constructor(injector: Injector) {
|
|
226
|
-
super('license', 'asc'
|
|
235
|
+
super('license', injector, 'asc')
|
|
227
236
|
this.esService.registerRuntimeField(
|
|
228
237
|
'license',
|
|
229
238
|
`String raw = '';
|
|
@@ -330,7 +339,7 @@ export class OrganizationSearchField implements AbstractSearchField {
|
|
|
330
339
|
}
|
|
331
340
|
export class OwnerSearchField extends SimpleSearchField {
|
|
332
341
|
constructor(injector: Injector) {
|
|
333
|
-
super('owner', 'asc'
|
|
342
|
+
super('owner', injector, 'asc')
|
|
334
343
|
}
|
|
335
344
|
|
|
336
345
|
getAvailableValues(): Observable<FieldAvailableValue[]> {
|
package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
<gn-ui-content-ghost
|
|
2
2
|
[showContent]="imageUrl !== undefined"
|
|
3
|
-
ghostClass="h-
|
|
3
|
+
ghostClass="h-48 mb-3"
|
|
4
4
|
>
|
|
5
5
|
<div
|
|
6
6
|
*ngIf="imageUrl"
|
|
7
|
+
[showContent]="imageUrl !== undefined"
|
|
7
8
|
data-cy="record-thumbnail"
|
|
8
|
-
class="flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300
|
|
9
|
+
class="flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-48 mb-3"
|
|
9
10
|
>
|
|
10
11
|
<gn-ui-thumbnail
|
|
11
12
|
class="relative h-full w-full"
|
|
@@ -74,12 +74,12 @@
|
|
|
74
74
|
margin-top: 0;
|
|
75
75
|
margin-bottom: 10px;
|
|
76
76
|
color: var(--color-primary) !important;
|
|
77
|
-
text-decoration: none
|
|
78
|
-
@apply font-bold;
|
|
77
|
+
text-decoration: none;
|
|
79
78
|
}
|
|
80
79
|
|
|
81
80
|
:host ::ng-deep .markdown-body p > a:hover {
|
|
82
81
|
color: var(--color-primary-darker) !important;
|
|
82
|
+
@apply underline;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
/** Blockquotes **/
|
|
@@ -10,6 +10,50 @@
|
|
|
10
10
|
</gn-ui-content-ghost>
|
|
11
11
|
</div>
|
|
12
12
|
|
|
13
|
+
<gn-ui-expandable-panel [title]="'record.metadata.usage' | translate">
|
|
14
|
+
<div class="flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900">
|
|
15
|
+
<ng-container *ngFor="let license of licenses">
|
|
16
|
+
<div *ngIf="license.url; else noUrl" class="text-primary">
|
|
17
|
+
<a
|
|
18
|
+
[href]="license.url"
|
|
19
|
+
target="_blank"
|
|
20
|
+
class="cursor-pointer hover:underline transition-all"
|
|
21
|
+
>
|
|
22
|
+
{{ license.text }}
|
|
23
|
+
<mat-icon
|
|
24
|
+
class="material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0"
|
|
25
|
+
>open_in_new</mat-icon
|
|
26
|
+
>
|
|
27
|
+
</a>
|
|
28
|
+
</div>
|
|
29
|
+
<ng-template #noUrl>
|
|
30
|
+
<div class="text-primary" gnUiLinkify>
|
|
31
|
+
{{ license.text }}
|
|
32
|
+
</div>
|
|
33
|
+
</ng-template>
|
|
34
|
+
</ng-container>
|
|
35
|
+
<ng-container *ngIf="legalConstraints.length">
|
|
36
|
+
<gn-ui-markdown-parser
|
|
37
|
+
*ngFor="let constraint of legalConstraints"
|
|
38
|
+
[textContent]="constraint"
|
|
39
|
+
>
|
|
40
|
+
</gn-ui-markdown-parser>
|
|
41
|
+
</ng-container>
|
|
42
|
+
<ng-container *ngIf="otherConstraints.length">
|
|
43
|
+
<div gnUiLinkify *ngFor="let constraint of otherConstraints">
|
|
44
|
+
<h5 translate class="font-medium text-black text-sm mb-[2px] mt-[16px]">
|
|
45
|
+
record.metadata.otherConstraints
|
|
46
|
+
</h5>
|
|
47
|
+
<gn-ui-markdown-parser [textContent]="constraint">
|
|
48
|
+
</gn-ui-markdown-parser>
|
|
49
|
+
</div>
|
|
50
|
+
</ng-container>
|
|
51
|
+
|
|
52
|
+
<span class="noUsage" *ngIf="!hasUsage">
|
|
53
|
+
{{ 'record.metadata.noUsage' | translate }}
|
|
54
|
+
</span>
|
|
55
|
+
</div>
|
|
56
|
+
</gn-ui-expandable-panel>
|
|
13
57
|
<gn-ui-expandable-panel
|
|
14
58
|
class="metadata-origin"
|
|
15
59
|
*ngIf="
|
|
@@ -22,7 +66,7 @@
|
|
|
22
66
|
>
|
|
23
67
|
<p
|
|
24
68
|
*ngIf="metadata.lineage"
|
|
25
|
-
class="mb-5 pt-4 whitespace-pre-line break-words"
|
|
69
|
+
class="mb-5 pt-4 whitespace-pre-line break-words text-gray-900"
|
|
26
70
|
gnUiLinkify
|
|
27
71
|
>
|
|
28
72
|
{{ metadata.lineage }}
|
|
@@ -54,23 +98,6 @@
|
|
|
54
98
|
</div>
|
|
55
99
|
</div>
|
|
56
100
|
</gn-ui-expandable-panel>
|
|
57
|
-
<gn-ui-expandable-panel [title]="'record.metadata.usage' | translate">
|
|
58
|
-
<div class="py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2">
|
|
59
|
-
<gn-ui-badge *ngIf="metadata.extras?.isOpenData">
|
|
60
|
-
<span translate>record.metadata.isOpenData</span>
|
|
61
|
-
</gn-ui-badge>
|
|
62
|
-
<span
|
|
63
|
-
class="text-primary font-medium"
|
|
64
|
-
*ngFor="let usage of usages"
|
|
65
|
-
gnUiLinkify
|
|
66
|
-
>
|
|
67
|
-
{{ usage }}
|
|
68
|
-
</span>
|
|
69
|
-
<span class="text-primary font-medium noUsage" *ngIf="!hasUsage">
|
|
70
|
-
{{ 'record.metadata.noUsage' | translate }}
|
|
71
|
-
</span>
|
|
72
|
-
</div>
|
|
73
|
-
</gn-ui-expandable-panel>
|
|
74
101
|
<gn-ui-expandable-panel
|
|
75
102
|
*ngIf="metadata.landingPage"
|
|
76
103
|
[title]="'record.metadata.details' | translate"
|