geonetwork-ui 2.4.2 → 2.5.0-dev.22c177ea1
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/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +31 -16
- package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +2 -2
- package/esm2022/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.mjs +18 -16
- package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +3 -1
- package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +12 -17
- package/esm2022/libs/feature/editor/src/lib/components/wizard-summarize/wizard-summarize.component.mjs +11 -11
- package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +3 -3
- package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +6 -7
- package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +46 -1
- package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +3 -2
- package/esm2022/libs/ui/dataviz/src/index.mjs +3 -3
- package/esm2022/libs/ui/dataviz/src/lib/data-table/custom.mat.paginator.intl.mjs +51 -0
- package/esm2022/libs/ui/dataviz/src/lib/data-table/data-table.component.mjs +133 -0
- package/esm2022/libs/ui/dataviz/src/lib/data-table/data-table.data.source.mjs +24 -0
- package/esm2022/libs/ui/dataviz/src/lib/data-table/data-table.fixtures.mjs +82 -0
- package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +18 -10
- package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +14 -12
- package/esm2022/libs/util/data-fetcher/src/index.mjs +3 -1
- package/esm2022/libs/util/data-fetcher/src/lib/model.mjs +7 -3
- package/esm2022/libs/util/data-fetcher/src/lib/readers/wfs.mjs +20 -2
- package/esm2022/libs/util/data-fetcher/src/lib/utils.mjs +3 -3
- package/esm2022/libs/util/shared/src/lib/services/date.service.mjs +41 -0
- package/esm2022/libs/util/shared/src/lib/services/index.mjs +2 -1
- package/esm2022/libs/util/shared/src/lib/utils/temporal-extent-union.mjs +4 -4
- package/esm2022/translations/de.json +7 -0
- package/esm2022/translations/en.json +7 -0
- package/esm2022/translations/es.json +7 -0
- package/esm2022/translations/fr.json +7 -0
- package/esm2022/translations/it.json +7 -0
- package/esm2022/translations/nl.json +7 -0
- package/esm2022/translations/pt.json +7 -0
- package/fesm2022/geonetwork-ui.mjs +727 -379
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +2 -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.map +1 -1
- package/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.d.ts +7 -9
- package/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts +3 -6
- package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/wizard-summarize/wizard-summarize.component.d.ts +3 -3
- package/libs/feature/editor/src/lib/components/wizard-summarize/wizard-summarize.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/feature-record.module.d.ts +2 -2
- package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
- package/libs/feature/search/src/lib/utils/service/fields.d.ts +10 -0
- 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/dataviz/src/index.d.ts +2 -2
- package/libs/ui/dataviz/src/index.d.ts.map +1 -1
- package/libs/ui/dataviz/src/lib/data-table/custom.mat.paginator.intl.d.ts +14 -0
- package/libs/ui/dataviz/src/lib/data-table/custom.mat.paginator.intl.d.ts.map +1 -0
- package/libs/ui/dataviz/src/lib/data-table/data-table.component.d.ts +45 -0
- package/libs/ui/dataviz/src/lib/data-table/data-table.component.d.ts.map +1 -0
- package/libs/ui/dataviz/src/lib/data-table/data-table.data.source.d.ts +12 -0
- package/libs/ui/dataviz/src/lib/data-table/data-table.data.source.d.ts.map +1 -0
- package/libs/ui/dataviz/src/lib/data-table/data-table.fixtures.d.ts +10 -0
- package/libs/ui/dataviz/src/lib/data-table/data-table.fixtures.d.ts.map +1 -0
- package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +5 -0
- package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
- package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +3 -2
- package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
- package/libs/util/data-fetcher/src/index.d.ts +3 -1
- package/libs/util/data-fetcher/src/index.d.ts.map +1 -1
- package/libs/util/data-fetcher/src/lib/model.d.ts +1 -1
- package/libs/util/data-fetcher/src/lib/model.d.ts.map +1 -1
- package/libs/util/data-fetcher/src/lib/readers/wfs.d.ts.map +1 -1
- package/libs/util/shared/src/lib/services/date.service.d.ts +13 -0
- package/libs/util/shared/src/lib/services/date.service.d.ts.map +1 -0
- package/libs/util/shared/src/lib/services/index.d.ts +1 -0
- package/libs/util/shared/src/lib/services/index.d.ts.map +1 -1
- package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts +2 -1
- package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +33 -16
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +1 -5
- package/src/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.html +3 -3
- package/src/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.ts +17 -15
- package/src/libs/feature/dataviz/src/lib/service/data.service.ts +2 -0
- package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.html +4 -3
- package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.ts +9 -18
- package/src/libs/feature/editor/src/lib/components/wizard-summarize/wizard-summarize.component.ts +3 -4
- package/src/libs/feature/record/src/lib/data-view/data-view.component.html +1 -1
- package/src/libs/feature/record/src/lib/feature-record.module.ts +6 -4
- package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -0
- package/src/libs/feature/search/src/lib/utils/service/fields.ts +55 -0
- package/src/libs/ui/dataviz/src/index.ts +2 -2
- package/src/libs/ui/dataviz/src/lib/data-table/custom.mat.paginator.intl.ts +52 -0
- package/src/libs/ui/dataviz/src/lib/{table/table.component.css → data-table/data-table.component.css} +4 -0
- package/src/libs/ui/dataviz/src/lib/data-table/data-table.component.html +67 -0
- package/src/libs/ui/dataviz/src/lib/data-table/data-table.component.ts +173 -0
- package/src/libs/ui/dataviz/src/lib/data-table/data-table.data.source.ts +33 -0
- package/src/libs/ui/dataviz/src/lib/data-table/data-table.fixtures.ts +84 -0
- package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +3 -3
- package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +12 -2
- package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +4 -2
- package/src/libs/util/data-fetcher/src/index.ts +3 -0
- package/src/libs/util/data-fetcher/src/lib/model.ts +6 -2
- package/src/libs/util/data-fetcher/src/lib/readers/wfs.ts +23 -1
- package/src/libs/util/data-fetcher/src/lib/utils.ts +2 -2
- package/src/libs/util/shared/src/lib/services/date.service.ts +45 -0
- package/src/libs/util/shared/src/lib/services/index.ts +1 -0
- package/src/libs/util/shared/src/lib/utils/temporal-extent-union.ts +6 -3
- package/translations/de.json +7 -0
- package/translations/en.json +7 -0
- package/translations/es.json +7 -0
- package/translations/fr.json +7 -0
- package/translations/it.json +7 -0
- package/translations/nl.json +7 -0
- package/translations/pt.json +7 -0
- package/translations/sk.json +7 -0
- package/esm2022/libs/ui/dataviz/src/lib/table/table.component.mjs +0 -61
- package/esm2022/libs/ui/dataviz/src/lib/table/table.fixtures.mjs +0 -40
- package/libs/ui/dataviz/src/lib/table/table.component.d.ts +0 -29
- package/libs/ui/dataviz/src/lib/table/table.component.d.ts.map +0 -1
- package/libs/ui/dataviz/src/lib/table/table.fixtures.d.ts +0 -11
- package/libs/ui/dataviz/src/lib/table/table.fixtures.d.ts.map +0 -1
- package/src/libs/ui/dataviz/src/lib/table/table.component.html +0 -40
- package/src/libs/ui/dataviz/src/lib/table/table.component.ts +0 -80
- package/src/libs/ui/dataviz/src/lib/table/table.fixtures.ts +0 -40
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
} from '../../../../../../../libs/api/metadata-converter/src'
|
|
29
29
|
import { LangService } from '../../../../../../../libs/util/i18n/src'
|
|
30
30
|
import { formatDate, isDateRange } from './date-range.utils'
|
|
31
|
+
import { CatalogRecord } from '../../../../../../../libs/common/domain/src/lib/model/record'
|
|
31
32
|
|
|
32
33
|
export type DateRange = { start?: Date; end?: Date }
|
|
33
34
|
|
|
@@ -50,7 +51,7 @@ export class ElasticsearchService {
|
|
|
50
51
|
size = 0,
|
|
51
52
|
from = 0,
|
|
52
53
|
sortBy: SortByField = null,
|
|
53
|
-
requestFields: RequestFields =
|
|
54
|
+
requestFields: RequestFields = null,
|
|
54
55
|
searchFilters: SearchFilters = {},
|
|
55
56
|
configFilters: SearchFilters = {},
|
|
56
57
|
uuids?: string[],
|
|
@@ -68,7 +69,7 @@ export class ElasticsearchService {
|
|
|
68
69
|
geometry
|
|
69
70
|
),
|
|
70
71
|
...(size > 0 ? { track_total_hits: true } : {}),
|
|
71
|
-
_source: requestFields,
|
|
72
|
+
...(requestFields && { _source: requestFields }),
|
|
72
73
|
}
|
|
73
74
|
this.processRuntimeFields(payload)
|
|
74
75
|
return payload
|
|
@@ -134,8 +135,7 @@ export class ElasticsearchService {
|
|
|
134
135
|
}
|
|
135
136
|
|
|
136
137
|
getRelatedRecordPayload(
|
|
137
|
-
|
|
138
|
-
uuid: string,
|
|
138
|
+
record: CatalogRecord,
|
|
139
139
|
size = 6,
|
|
140
140
|
_source = [...ES_SOURCE_SUMMARY, 'allKeywords', 'createDate']
|
|
141
141
|
): EsSearchParams {
|
|
@@ -148,9 +148,23 @@ export class ElasticsearchService {
|
|
|
148
148
|
fields: [
|
|
149
149
|
'resourceTitleObject.default',
|
|
150
150
|
'resourceAbstractObject.default',
|
|
151
|
-
'
|
|
151
|
+
'allKeywords',
|
|
152
|
+
],
|
|
153
|
+
like: [
|
|
154
|
+
{
|
|
155
|
+
doc: {
|
|
156
|
+
resourceTitleObject: {
|
|
157
|
+
default: record.title,
|
|
158
|
+
},
|
|
159
|
+
resourceAbstractObject: {
|
|
160
|
+
default: record.abstract,
|
|
161
|
+
},
|
|
162
|
+
allKeywords: record.keywords.map(
|
|
163
|
+
(keyword) => keyword.label
|
|
164
|
+
),
|
|
165
|
+
},
|
|
166
|
+
},
|
|
152
167
|
],
|
|
153
|
-
like: title,
|
|
154
168
|
min_term_freq: 1,
|
|
155
169
|
max_query_terms: 12,
|
|
156
170
|
},
|
|
@@ -166,7 +180,7 @@ export class ElasticsearchService {
|
|
|
166
180
|
},
|
|
167
181
|
},
|
|
168
182
|
],
|
|
169
|
-
must_not: [{ wildcard: { uuid:
|
|
183
|
+
must_not: [{ wildcard: { uuid: record.uniqueIdentifier } }],
|
|
170
184
|
},
|
|
171
185
|
},
|
|
172
186
|
size,
|
|
@@ -220,6 +234,7 @@ export class ElasticsearchService {
|
|
|
220
234
|
private filtersToQuery(
|
|
221
235
|
filters: FieldFilters | FiltersAggregationParams | string
|
|
222
236
|
): FilterQuery {
|
|
237
|
+
const addQuote = (key: string) => (/^\/.+\/$/.test(key) ? key : `"${key}"`)
|
|
223
238
|
const makeQuery = (filter: FieldFilter): string => {
|
|
224
239
|
if (typeof filter === 'string') {
|
|
225
240
|
return filter
|
|
@@ -227,9 +242,9 @@ export class ElasticsearchService {
|
|
|
227
242
|
return Object.keys(filter)
|
|
228
243
|
.map((key) => {
|
|
229
244
|
if (filter[key] === true) {
|
|
230
|
-
return
|
|
245
|
+
return addQuote(key)
|
|
231
246
|
}
|
|
232
|
-
return
|
|
247
|
+
return `-${addQuote(key)}`
|
|
233
248
|
})
|
|
234
249
|
.join(' OR ')
|
|
235
250
|
}
|
|
@@ -518,13 +533,15 @@ export class ElasticsearchService {
|
|
|
518
533
|
switch (aggregation.type) {
|
|
519
534
|
case 'filters':
|
|
520
535
|
return {
|
|
521
|
-
filters:
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
536
|
+
filters: {
|
|
537
|
+
filters: Object.keys(aggregation.filters).reduce((prev, curr) => {
|
|
538
|
+
const filter = aggregation.filters[curr]
|
|
539
|
+
return {
|
|
540
|
+
...prev,
|
|
541
|
+
[curr]: this.filtersToQuery(filter)[0],
|
|
542
|
+
}
|
|
543
|
+
}, {}),
|
|
544
|
+
},
|
|
528
545
|
}
|
|
529
546
|
case 'terms':
|
|
530
547
|
return {
|
|
@@ -143,11 +143,7 @@ export class Gn4Repository implements RecordsRepositoryInterface {
|
|
|
143
143
|
'bucket',
|
|
144
144
|
null,
|
|
145
145
|
JSON.stringify(
|
|
146
|
-
this.gn4SearchHelper.getRelatedRecordPayload(
|
|
147
|
-
similarTo.title,
|
|
148
|
-
similarTo.uniqueIdentifier,
|
|
149
|
-
3
|
|
150
|
-
)
|
|
146
|
+
this.gn4SearchHelper.getRelatedRecordPayload(similarTo, 3)
|
|
151
147
|
)
|
|
152
148
|
)
|
|
153
149
|
.pipe(
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<div class="flex flex-row h-full overflow-auto">
|
|
2
|
-
<gn-ui-table
|
|
2
|
+
<gn-ui-data-table
|
|
3
3
|
#table
|
|
4
4
|
class="w-1/2 overflow-auto"
|
|
5
|
-
[
|
|
5
|
+
[dataset]="dataset"
|
|
6
6
|
[activeId]="selectionId"
|
|
7
7
|
(selected)="onTableSelect($event)"
|
|
8
|
-
></gn-ui-table>
|
|
8
|
+
></gn-ui-data-table>
|
|
9
9
|
<gn-ui-map-container
|
|
10
10
|
#mapContainer
|
|
11
11
|
class="w-1/2 h-full"
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
ViewChild,
|
|
9
9
|
} from '@angular/core'
|
|
10
10
|
import {
|
|
11
|
-
|
|
11
|
+
DataTableComponent,
|
|
12
12
|
TableItemId,
|
|
13
13
|
TableItemModel,
|
|
14
14
|
} from '../../../../../../libs/ui/dataviz/src'
|
|
@@ -19,18 +19,19 @@ import {
|
|
|
19
19
|
FeatureDetailComponent,
|
|
20
20
|
MapContainerComponent,
|
|
21
21
|
} from '../../../../../../libs/ui/map/src'
|
|
22
|
+
import { BaseReader } from '../../../../../../libs/util/data-fetcher/src'
|
|
22
23
|
|
|
23
24
|
@Component({
|
|
24
25
|
selector: 'gn-ui-geo-table-view',
|
|
25
26
|
templateUrl: './geo-table-view.component.html',
|
|
26
27
|
styleUrls: ['./geo-table-view.component.css'],
|
|
27
28
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
28
|
-
imports: [
|
|
29
|
+
imports: [MapContainerComponent, FeatureDetailComponent, DataTableComponent],
|
|
29
30
|
standalone: true,
|
|
30
31
|
})
|
|
31
32
|
export class GeoTableViewComponent implements OnInit, OnDestroy {
|
|
32
|
-
@Input()
|
|
33
|
-
@ViewChild('table') uiTable:
|
|
33
|
+
@Input() dataset: BaseReader
|
|
34
|
+
@ViewChild('table') uiTable: DataTableComponent
|
|
34
35
|
@ViewChild('mapContainer') mapContainer: MapContainerComponent
|
|
35
36
|
|
|
36
37
|
tableData: TableItemModel[]
|
|
@@ -39,21 +40,16 @@ export class GeoTableViewComponent implements OnInit, OnDestroy {
|
|
|
39
40
|
selection: Feature
|
|
40
41
|
private subscription = new Subscription()
|
|
41
42
|
|
|
42
|
-
get features() {
|
|
43
|
-
return this.data.features
|
|
44
|
-
}
|
|
45
|
-
|
|
46
43
|
constructor(private changeRef: ChangeDetectorRef) {}
|
|
47
44
|
|
|
48
|
-
ngOnInit()
|
|
49
|
-
this.
|
|
50
|
-
this.mapContext = this.initMapContext()
|
|
45
|
+
async ngOnInit() {
|
|
46
|
+
this.mapContext = await this.initMapContext()
|
|
51
47
|
}
|
|
52
48
|
|
|
53
49
|
onTableSelect(tableEntry: TableItemModel) {
|
|
54
50
|
const { id } = tableEntry
|
|
55
51
|
this.selectionId = id
|
|
56
|
-
this.selection = this.getFeatureFromId(id)
|
|
52
|
+
// this.selection = this.getFeatureFromId(id)
|
|
57
53
|
if (this.selection) {
|
|
58
54
|
this.animateToFeature(this.selection)
|
|
59
55
|
}
|
|
@@ -77,7 +73,8 @@ export class GeoTableViewComponent implements OnInit, OnDestroy {
|
|
|
77
73
|
}))
|
|
78
74
|
}
|
|
79
75
|
|
|
80
|
-
private initMapContext(): MapContext {
|
|
76
|
+
private async initMapContext(): Promise<MapContext> {
|
|
77
|
+
this.dataset.selectAll()
|
|
81
78
|
return {
|
|
82
79
|
layers: [
|
|
83
80
|
{
|
|
@@ -86,7 +83,11 @@ export class GeoTableViewComponent implements OnInit, OnDestroy {
|
|
|
86
83
|
},
|
|
87
84
|
{
|
|
88
85
|
type: 'geojson',
|
|
89
|
-
data:
|
|
86
|
+
data: {
|
|
87
|
+
type: 'FeatureCollection',
|
|
88
|
+
// FIXME: we're not getting geojson here
|
|
89
|
+
features: await this.dataset.read(),
|
|
90
|
+
},
|
|
90
91
|
},
|
|
91
92
|
],
|
|
92
93
|
view: {
|
|
@@ -112,7 +113,8 @@ export class GeoTableViewComponent implements OnInit, OnDestroy {
|
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
private getFeatureFromId(id: TableItemId) {
|
|
115
|
-
|
|
116
|
+
// FIXME: restore this once we need it?
|
|
117
|
+
// return this.features.find((feature) => feature.id === id)
|
|
116
118
|
}
|
|
117
119
|
|
|
118
120
|
ngOnDestroy(): void {
|
|
@@ -168,6 +168,7 @@ export class DataService {
|
|
|
168
168
|
map((urls) =>
|
|
169
169
|
Object.keys(urls).map((format) => ({
|
|
170
170
|
...wfsLink,
|
|
171
|
+
name: wfsLink.name,
|
|
171
172
|
type: 'download',
|
|
172
173
|
url: new URL(urls[format]),
|
|
173
174
|
mimeType: getMimeTypeForFormat(
|
|
@@ -187,6 +188,7 @@ export class DataService {
|
|
|
187
188
|
return Object.keys(collectionInfo.bulkDownloadLinks).map((downloadLink) => {
|
|
188
189
|
return {
|
|
189
190
|
...ogcApiLink,
|
|
191
|
+
name: collectionInfo.id,
|
|
190
192
|
type: 'download',
|
|
191
193
|
url: new URL(collectionInfo.bulkDownloadLinks[downloadLink]),
|
|
192
194
|
mimeType: getMimeTypeForFormat(
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
<div class="w-full h-full flex flex-col">
|
|
2
2
|
<div class="relative h-full">
|
|
3
|
-
<gn-ui-table
|
|
3
|
+
<gn-ui-data-table
|
|
4
|
+
*ngIf="tableData$ | async as dataset"
|
|
4
5
|
class="overflow-auto grow"
|
|
5
|
-
[
|
|
6
|
+
[dataset]="dataset"
|
|
6
7
|
(selected)="onTableSelect($event)"
|
|
7
|
-
></gn-ui-table>
|
|
8
|
+
></gn-ui-data-table>
|
|
8
9
|
<gn-ui-loading-mask
|
|
9
10
|
*ngIf="loading"
|
|
10
11
|
class="absolute inset-0"
|
|
@@ -3,14 +3,13 @@ import { BehaviorSubject, Observable, of } from 'rxjs'
|
|
|
3
3
|
import {
|
|
4
4
|
catchError,
|
|
5
5
|
finalize,
|
|
6
|
-
map,
|
|
7
6
|
shareReplay,
|
|
8
7
|
startWith,
|
|
9
8
|
switchMap,
|
|
10
9
|
} from 'rxjs/operators'
|
|
11
|
-
import {
|
|
10
|
+
import { BaseReader, FetchError } from '../../../../../../libs/util/data-fetcher/src'
|
|
12
11
|
import { DataService } from '../service/data.service'
|
|
13
|
-
import {
|
|
12
|
+
import { DataTableComponent } from '../../../../../../libs/ui/dataviz/src'
|
|
14
13
|
import { DatasetOnlineResource } from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
15
14
|
import { TranslateModule, TranslateService } from '@ngx-translate/core'
|
|
16
15
|
import {
|
|
@@ -26,7 +25,7 @@ import { CommonModule } from '@angular/common'
|
|
|
26
25
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
27
26
|
imports: [
|
|
28
27
|
CommonModule,
|
|
29
|
-
|
|
28
|
+
DataTableComponent,
|
|
30
29
|
LoadingMaskComponent,
|
|
31
30
|
PopupAlertComponent,
|
|
32
31
|
TranslateModule,
|
|
@@ -45,25 +44,19 @@ export class TableViewComponent {
|
|
|
45
44
|
tableData$ = this.currentLink$.pipe(
|
|
46
45
|
switchMap((link) => {
|
|
47
46
|
this.error = null
|
|
48
|
-
if (!link) return of(
|
|
47
|
+
if (!link) return of(undefined)
|
|
49
48
|
this.loading = true
|
|
50
|
-
return this.
|
|
51
|
-
map((items) =>
|
|
52
|
-
items.map((item) => ({
|
|
53
|
-
id: item.id,
|
|
54
|
-
...item.properties,
|
|
55
|
-
}))
|
|
56
|
-
),
|
|
49
|
+
return this.getDatasetReader(link).pipe(
|
|
57
50
|
catchError((error) => {
|
|
58
51
|
this.handleError(error)
|
|
59
|
-
return of(
|
|
52
|
+
return of(undefined)
|
|
60
53
|
}),
|
|
61
54
|
finalize(() => {
|
|
62
55
|
this.loading = false
|
|
63
56
|
})
|
|
64
57
|
)
|
|
65
58
|
}),
|
|
66
|
-
startWith(
|
|
59
|
+
startWith(undefined),
|
|
67
60
|
shareReplay(1)
|
|
68
61
|
)
|
|
69
62
|
|
|
@@ -72,10 +65,8 @@ export class TableViewComponent {
|
|
|
72
65
|
private translateService: TranslateService
|
|
73
66
|
) {}
|
|
74
67
|
|
|
75
|
-
|
|
76
|
-
return this.dataService
|
|
77
|
-
.getDataset(link)
|
|
78
|
-
.pipe(switchMap((dataset) => dataset.read()))
|
|
68
|
+
getDatasetReader(link: DatasetOnlineResource): Observable<BaseReader> {
|
|
69
|
+
return this.dataService.getDataset(link)
|
|
79
70
|
}
|
|
80
71
|
|
|
81
72
|
onTableSelect(event) {
|
package/src/libs/feature/editor/src/lib/components/wizard-summarize/wizard-summarize.component.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Component } from '@angular/core'
|
|
2
2
|
import { WizardService } from '../../services/wizard.service'
|
|
3
|
-
import {
|
|
3
|
+
import { DateService } from '../../../../../../../libs/util/shared/src'
|
|
4
4
|
|
|
5
5
|
@Component({
|
|
6
6
|
selector: 'gn-ui-wizard-summarize',
|
|
@@ -28,9 +28,8 @@ export class WizardSummarizeComponent {
|
|
|
28
28
|
|
|
29
29
|
get createdDate() {
|
|
30
30
|
const time = this.wizardService.getWizardFieldData('datepicker')
|
|
31
|
-
const locale = this.translateService.currentLang
|
|
32
31
|
|
|
33
|
-
return new Date(Number(time))
|
|
32
|
+
return this.dateService.formatDate(new Date(Number(time)), {
|
|
34
33
|
year: 'numeric',
|
|
35
34
|
month: 'long',
|
|
36
35
|
day: 'numeric',
|
|
@@ -54,6 +53,6 @@ export class WizardSummarizeComponent {
|
|
|
54
53
|
|
|
55
54
|
constructor(
|
|
56
55
|
private wizardService: WizardService,
|
|
57
|
-
private
|
|
56
|
+
private dateService: DateService
|
|
58
57
|
) {}
|
|
59
58
|
}
|
|
@@ -4,7 +4,10 @@ import { StoreModule } from '@ngrx/store'
|
|
|
4
4
|
import { EffectsModule } from '@ngrx/effects'
|
|
5
5
|
import { UiLayoutModule } from '../../../../../libs/ui/layout/src'
|
|
6
6
|
import { FeatureMapModule } from '../../../../../libs/feature/map/src'
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
DropdownSelectorComponent,
|
|
9
|
+
UiInputsModule,
|
|
10
|
+
} from '../../../../../libs/ui/inputs/src'
|
|
8
11
|
import { UiElementsModule } from '../../../../../libs/ui/elements/src'
|
|
9
12
|
import { MdViewFacade } from './state'
|
|
10
13
|
import { MdViewEffects } from './state/mdview.effects'
|
|
@@ -16,9 +19,8 @@ import { MatTabsModule } from '@angular/material/tabs'
|
|
|
16
19
|
import { UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
|
|
17
20
|
import { TranslateModule } from '@ngx-translate/core'
|
|
18
21
|
import { FeatureCatalogModule } from '../../../../../libs/feature/catalog/src'
|
|
19
|
-
import {
|
|
22
|
+
import { DataTableComponent } from '../../../../../libs/ui/dataviz/src'
|
|
20
23
|
import { NgIconsModule, provideNgIconsConfig } from '@ng-icons/core'
|
|
21
|
-
import { DropdownSelectorComponent } from '../../../../../libs/ui/inputs/src'
|
|
22
24
|
|
|
23
25
|
@NgModule({
|
|
24
26
|
imports: [
|
|
@@ -33,7 +35,7 @@ import { DropdownSelectorComponent } from '../../../../../libs/ui/inputs/src'
|
|
|
33
35
|
MatTabsModule,
|
|
34
36
|
UiWidgetsModule,
|
|
35
37
|
TranslateModule,
|
|
36
|
-
|
|
38
|
+
DataTableComponent,
|
|
37
39
|
NgIconsModule,
|
|
38
40
|
DropdownSelectorComponent,
|
|
39
41
|
],
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Injectable, Injector } from '@angular/core'
|
|
2
2
|
import {
|
|
3
3
|
AbstractSearchField,
|
|
4
|
+
AvailableServicesField,
|
|
4
5
|
DateRangeSearchField,
|
|
5
6
|
FieldValue,
|
|
6
7
|
FullTextSearchField,
|
|
@@ -91,6 +92,7 @@ export class FieldsService {
|
|
|
91
92
|
),
|
|
92
93
|
user: new UserSearchField(this.injector),
|
|
93
94
|
changeDate: new DateRangeSearchField('changeDate', this.injector, 'desc'),
|
|
95
|
+
availableServices: new AvailableServicesField(this.injector),
|
|
94
96
|
} as Record<string, AbstractSearchField>
|
|
95
97
|
|
|
96
98
|
get supportedFields() {
|
|
@@ -9,6 +9,7 @@ import { PlatformServiceInterface } from '../../../../../../../libs/common/domai
|
|
|
9
9
|
import {
|
|
10
10
|
AggregationBuckets,
|
|
11
11
|
AggregationsParams,
|
|
12
|
+
FieldFilter,
|
|
12
13
|
FieldFilterByExpression,
|
|
13
14
|
FieldFilters,
|
|
14
15
|
TermBucket,
|
|
@@ -425,3 +426,57 @@ export class DateRangeSearchField extends SimpleSearchField {
|
|
|
425
426
|
return 'dateRange'
|
|
426
427
|
}
|
|
427
428
|
}
|
|
429
|
+
|
|
430
|
+
marker('search.filters.availableServices.view')
|
|
431
|
+
marker('search.filters.availableServices.download')
|
|
432
|
+
|
|
433
|
+
export class AvailableServicesField extends SimpleSearchField {
|
|
434
|
+
private translateService = this.injector.get(TranslateService)
|
|
435
|
+
|
|
436
|
+
constructor(injector: Injector) {
|
|
437
|
+
super('availableServices', injector, 'asc')
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
linkProtocolViewFilter = '/OGC:WMT?S.*/'
|
|
441
|
+
linkProtocolDownloadFilter = '/OGC:WFS.*/'
|
|
442
|
+
|
|
443
|
+
protected async getBucketLabel(bucket: TermBucket) {
|
|
444
|
+
return firstValueFrom(
|
|
445
|
+
this.translateService.get(
|
|
446
|
+
`search.filters.availableServices.${bucket.term}`
|
|
447
|
+
)
|
|
448
|
+
)
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
protected getAggregations(): AggregationsParams {
|
|
452
|
+
return {
|
|
453
|
+
availableServices: {
|
|
454
|
+
type: 'filters',
|
|
455
|
+
filters: {
|
|
456
|
+
view: `+linkProtocol:${this.linkProtocolViewFilter}`,
|
|
457
|
+
download: `+linkProtocol:${this.linkProtocolDownloadFilter}`,
|
|
458
|
+
},
|
|
459
|
+
},
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
getFiltersForValues(values: FieldValue[]): Observable<FieldFilters> {
|
|
464
|
+
const filters: FieldFilter = {}
|
|
465
|
+
if (values.includes('view')) filters[this.linkProtocolViewFilter] = true
|
|
466
|
+
if (values.includes('download'))
|
|
467
|
+
filters[this.linkProtocolDownloadFilter] = true
|
|
468
|
+
|
|
469
|
+
return of({
|
|
470
|
+
linkProtocol: filters,
|
|
471
|
+
})
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
getValuesForFilter(filters: FieldFilters): Observable<FieldValue[]> {
|
|
475
|
+
const linkFilter = filters.linkProtocol
|
|
476
|
+
if (!linkFilter) return of([])
|
|
477
|
+
const values = []
|
|
478
|
+
if (linkFilter[this.linkProtocolViewFilter]) values.push('view')
|
|
479
|
+
if (linkFilter[this.linkProtocolDownloadFilter]) values.push('download')
|
|
480
|
+
return of(values)
|
|
481
|
+
}
|
|
482
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export * from './lib/ui-dataviz.module'
|
|
2
2
|
export * from './lib/chart/chart.component'
|
|
3
|
-
export * from './lib/table/table.component'
|
|
4
|
-
export * from './lib/table/table.fixtures'
|
|
3
|
+
export * from './lib/data-table/data-table.component'
|
|
4
|
+
export * from './lib/data-table/data-table.fixtures'
|
|
5
5
|
export * from './lib/figure/figure.component'
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core'
|
|
2
|
+
import { MatPaginatorIntl } from '@angular/material/paginator'
|
|
3
|
+
import { TranslateService } from '@ngx-translate/core'
|
|
4
|
+
import { Subject } from 'rxjs'
|
|
5
|
+
|
|
6
|
+
@Injectable()
|
|
7
|
+
export class CustomMatPaginatorIntl extends MatPaginatorIntl {
|
|
8
|
+
override changes = new Subject<void>()
|
|
9
|
+
|
|
10
|
+
constructor(private translate: TranslateService) {
|
|
11
|
+
super()
|
|
12
|
+
this.setLabels()
|
|
13
|
+
this.translate.onLangChange.subscribe(() => {
|
|
14
|
+
this.setLabels()
|
|
15
|
+
this.changes.next()
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
setLabels() {
|
|
20
|
+
this.itemsPerPageLabel = this.translate.instant(
|
|
21
|
+
'table.paginator.itemsPerPage'
|
|
22
|
+
)
|
|
23
|
+
this.nextPageLabel = this.translate.instant('table.paginator.nextPage')
|
|
24
|
+
this.previousPageLabel = this.translate.instant(
|
|
25
|
+
'table.paginator.previousPage'
|
|
26
|
+
)
|
|
27
|
+
this.firstPageLabel = this.translate.instant('table.paginator.firstPage')
|
|
28
|
+
this.lastPageLabel = this.translate.instant('table.paginator.lastPage')
|
|
29
|
+
this.getRangeLabel = this.getRangeLabelIntl
|
|
30
|
+
this.changes.next()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
getRangeLabelIntl(page: number, pageSize: number, length: number): string {
|
|
34
|
+
if (length === 0 || pageSize === 0) {
|
|
35
|
+
return this.translate.instant('table.paginator.rangeLabel', {
|
|
36
|
+
startIndex: 0,
|
|
37
|
+
endIndex: 0,
|
|
38
|
+
length,
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
const startIndex = page * pageSize
|
|
42
|
+
const endIndex =
|
|
43
|
+
startIndex < length
|
|
44
|
+
? Math.min(startIndex + pageSize, length)
|
|
45
|
+
: startIndex + pageSize
|
|
46
|
+
return this.translate.instant('table.paginator.rangeLabel', {
|
|
47
|
+
startIndex: startIndex + 1,
|
|
48
|
+
endIndex,
|
|
49
|
+
length,
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<div class="flex flex-col border border-gray-300 rounded-lg bg-white h-full">
|
|
2
|
+
<div class="flex-1 overflow-y-hidden overflow-x-auto rounded-lg relative">
|
|
3
|
+
<table
|
|
4
|
+
mat-table
|
|
5
|
+
[dataSource]="dataSource"
|
|
6
|
+
matSort
|
|
7
|
+
(matSortChange)="setSort($event)"
|
|
8
|
+
[matSortDisableClear]="true"
|
|
9
|
+
*ngrxLet="properties$ as properties"
|
|
10
|
+
>
|
|
11
|
+
<ng-container *ngFor="let prop of properties" [matColumnDef]="prop">
|
|
12
|
+
<th
|
|
13
|
+
mat-header-cell
|
|
14
|
+
*matHeaderCellDef
|
|
15
|
+
mat-sort-header
|
|
16
|
+
class="text-sm text-black bg-white"
|
|
17
|
+
>
|
|
18
|
+
{{ prop }}
|
|
19
|
+
</th>
|
|
20
|
+
<td
|
|
21
|
+
mat-cell
|
|
22
|
+
*matCellDef="let element"
|
|
23
|
+
class="whitespace-nowrap pr-1 truncate"
|
|
24
|
+
>
|
|
25
|
+
{{ element[prop] }}
|
|
26
|
+
</td>
|
|
27
|
+
</ng-container>
|
|
28
|
+
|
|
29
|
+
<tr mat-header-row *matHeaderRowDef="properties; sticky: true"></tr>
|
|
30
|
+
<tr
|
|
31
|
+
[id]="getRowEltId(row.id)"
|
|
32
|
+
mat-row
|
|
33
|
+
*matRowDef="let row; columns: properties"
|
|
34
|
+
(click)="selected.emit(row)"
|
|
35
|
+
[class.active]="row.id === activeId"
|
|
36
|
+
></tr>
|
|
37
|
+
</table>
|
|
38
|
+
<gn-ui-loading-mask
|
|
39
|
+
*ngIf="loading$ | async"
|
|
40
|
+
class="sticky inset-0"
|
|
41
|
+
[message]="'table.loading.data' | translate"
|
|
42
|
+
></gn-ui-loading-mask>
|
|
43
|
+
<gn-ui-popup-alert
|
|
44
|
+
*ngIf="error"
|
|
45
|
+
type="warning"
|
|
46
|
+
icon="matErrorOutlineOutline"
|
|
47
|
+
class="absolute m-2 inset-0 z-[100]"
|
|
48
|
+
>
|
|
49
|
+
<span translate>{{ error }}</span>
|
|
50
|
+
</gn-ui-popup-alert>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="flex justify-between items-center overflow-hidden">
|
|
53
|
+
<div class="text-gray-900 px-4 py-2 text-sm">
|
|
54
|
+
<span class="count font-extrabold text-primary">{{ count }}</span
|
|
55
|
+
> <span translate>table.object.count</span>.
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<mat-paginator
|
|
59
|
+
class="my-[-16px]"
|
|
60
|
+
(page)="setPagination()"
|
|
61
|
+
[length]="count"
|
|
62
|
+
[pageSize]="10"
|
|
63
|
+
[showFirstLastButtons]="true"
|
|
64
|
+
[hidePageSize]="true"
|
|
65
|
+
></mat-paginator>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|