geonetwork-ui 2.3.0-dev.61774f7d → 2.3.0-dev.6b7e19cb
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/feature/dataviz/src/lib/service/data.service.mjs +35 -2
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +64 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +20 -6
- package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
- package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +16 -1
- package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +73 -20
- package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
- package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
- package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +1 -1
- package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +29 -8
- package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +3 -2
- package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +1 -1
- package/esm2022/libs/feature/search/src/index.mjs +2 -1
- package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +1 -1
- package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
- package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
- package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
- package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +77 -15
- package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +1 -6
- package/esm2022/libs/ui/inputs/src/index.mjs +16 -15
- package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
- package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
- package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +17 -8
- package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
- package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +5 -3
- package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +11 -9
- package/esm2022/libs/ui/layout/src/index.mjs +2 -1
- package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
- package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
- package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
- package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
- package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
- package/esm2022/translations/de.json +20 -14
- package/esm2022/translations/en.json +20 -14
- package/esm2022/translations/es.json +20 -14
- package/esm2022/translations/fr.json +20 -14
- package/esm2022/translations/it.json +20 -14
- package/esm2022/translations/nl.json +20 -14
- package/esm2022/translations/pt.json +20 -14
- package/fesm2022/geonetwork-ui.mjs +1336 -864
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
- package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +3 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
- package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +10 -5
- package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
- package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +1 -0
- package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
- package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
- package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
- package/libs/feature/search/src/index.d.ts +1 -0
- package/libs/feature/search/src/index.d.ts.map +1 -1
- package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +3 -3
- package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
- package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +12 -3
- package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/ui-elements.module.d.ts +29 -30
- package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
- package/libs/ui/inputs/src/index.d.ts +15 -14
- package/libs/ui/inputs/src/index.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
- package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
- package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
- package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +1 -1
- package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
- package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
- package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +2 -1
- package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
- package/libs/ui/layout/src/index.d.ts +1 -0
- package/libs/ui/layout/src/index.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
- package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
- package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
- package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
- package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
- package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
- package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
- package/src/libs/common/fixtures/src/lib/records.fixtures.ts +2 -2
- package/src/libs/feature/dataviz/src/lib/service/data.service.ts +51 -1
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +0 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css +0 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +33 -33
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +16 -0
- package/src/libs/feature/editor/src/lib/fields.config.ts +15 -0
- package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
- package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +32 -18
- package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +72 -17
- package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +1 -0
- package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +26 -8
- package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +2 -1
- package/src/libs/feature/record/src/lib/state/mdview.facade.ts +0 -1
- package/src/libs/feature/search/src/index.ts +1 -0
- package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -2
- package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
- package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
- package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
- package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
- package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +26 -10
- package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +87 -8
- package/src/libs/ui/elements/src/lib/ui-elements.module.ts +0 -2
- package/src/libs/ui/inputs/src/index.ts +15 -14
- package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
- package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
- package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
- package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
- package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +13 -0
- package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
- package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
- package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
- package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -0
- package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +1 -0
- package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
- package/src/libs/ui/layout/src/index.ts +1 -0
- package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
- package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
- package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
- package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +8 -4
- package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
- package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
- package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
- package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
- package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
- package/translations/de.json +20 -14
- package/translations/en.json +20 -14
- package/translations/es.json +20 -14
- package/translations/fr.json +20 -14
- package/translations/it.json +20 -14
- package/translations/nl.json +20 -14
- package/translations/pt.json +20 -14
- package/translations/sk.json +20 -14
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core'
|
|
2
|
+
import { MatNativeDateModule } from '@angular/material/core'
|
|
3
|
+
import { MatDatepickerModule } from '@angular/material/datepicker'
|
|
4
|
+
import { MatIconModule } from '@angular/material/icon'
|
|
5
|
+
|
|
6
|
+
@Component({
|
|
7
|
+
selector: 'gn-ui-date-picker',
|
|
8
|
+
templateUrl: './date-picker.component.html',
|
|
9
|
+
styleUrls: ['./date-picker.component.css'],
|
|
10
|
+
standalone: true,
|
|
11
|
+
imports: [MatIconModule, MatNativeDateModule, MatDatepickerModule],
|
|
12
|
+
})
|
|
13
|
+
export class DatePickerComponent {
|
|
14
|
+
@Input() date: Date
|
|
15
|
+
@Output() dateChange = new EventEmitter<Date>()
|
|
16
|
+
}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { Component } from '@angular/core'
|
|
2
|
-
import {
|
|
2
|
+
import { MatNativeDateModule } from '@angular/material/core'
|
|
3
|
+
import {
|
|
4
|
+
MatDatepickerInputEvent,
|
|
5
|
+
MatDatepickerModule,
|
|
6
|
+
} from '@angular/material/datepicker'
|
|
7
|
+
import { MatIconModule } from '@angular/material/icon'
|
|
3
8
|
|
|
4
9
|
@Component({
|
|
5
10
|
selector: 'gn-ui-date-range-picker',
|
|
6
11
|
templateUrl: './date-range-picker.component.html',
|
|
7
12
|
styleUrls: ['./date-range-picker.component.css'],
|
|
13
|
+
standalone: true,
|
|
14
|
+
imports: [MatIconModule, MatNativeDateModule, MatDatepickerModule],
|
|
8
15
|
})
|
|
9
16
|
export class DateRangePickerComponent {
|
|
10
17
|
startDate: Date
|
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
CdkConnectedOverlay,
|
|
3
3
|
CdkOverlayOrigin,
|
|
4
4
|
ConnectedPosition,
|
|
5
|
+
OverlayModule,
|
|
5
6
|
} from '@angular/cdk/overlay'
|
|
6
7
|
import {
|
|
7
8
|
ChangeDetectionStrategy,
|
|
@@ -17,6 +18,10 @@ import {
|
|
|
17
18
|
} from '@angular/core'
|
|
18
19
|
import { firstValueFrom } from 'rxjs'
|
|
19
20
|
import { DropdownChoice } from './dropdown-selector.model'
|
|
21
|
+
import { CommonModule } from '@angular/common'
|
|
22
|
+
import { TranslateModule } from '@ngx-translate/core'
|
|
23
|
+
import { MatIconModule } from '@angular/material/icon'
|
|
24
|
+
import { ButtonComponent } from '../button/button.component'
|
|
20
25
|
|
|
21
26
|
const DEFAULT_ROW_NUMBERS = 6
|
|
22
27
|
|
|
@@ -25,6 +30,14 @@ const DEFAULT_ROW_NUMBERS = 6
|
|
|
25
30
|
templateUrl: './dropdown-selector.component.html',
|
|
26
31
|
styleUrls: ['./dropdown-selector.component.css'],
|
|
27
32
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
33
|
+
standalone: true,
|
|
34
|
+
imports: [
|
|
35
|
+
CommonModule,
|
|
36
|
+
ButtonComponent,
|
|
37
|
+
OverlayModule,
|
|
38
|
+
MatIconModule,
|
|
39
|
+
TranslateModule,
|
|
40
|
+
],
|
|
28
41
|
})
|
|
29
42
|
export class DropdownSelectorComponent implements OnInit {
|
|
30
43
|
@Input() title: string
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<div class="flex flex-row gap-x-4 items-center">
|
|
2
|
+
<gn-ui-button
|
|
3
|
+
data-test="previousButton"
|
|
4
|
+
[type]="isFirst ? 'default' : 'outline'"
|
|
5
|
+
[disabled]="isFirst"
|
|
6
|
+
(buttonClick)="previousButtonClicked()"
|
|
7
|
+
>
|
|
8
|
+
<mat-icon
|
|
9
|
+
class="material-symbols-outlined text-[14px] text-center pt-[5px]"
|
|
10
|
+
>
|
|
11
|
+
arrow_back
|
|
12
|
+
</mat-icon>
|
|
13
|
+
</gn-ui-button>
|
|
14
|
+
<gn-ui-button
|
|
15
|
+
data-test="nextButton"
|
|
16
|
+
[type]="isLast ? 'default' : 'outline'"
|
|
17
|
+
[disabled]="isLast"
|
|
18
|
+
(buttonClick)="nextButtonClicked()"
|
|
19
|
+
>
|
|
20
|
+
<mat-icon
|
|
21
|
+
class="material-symbols-outlined text-[14px] text-center pt-[5px]"
|
|
22
|
+
>
|
|
23
|
+
arrow_forward
|
|
24
|
+
</mat-icon>
|
|
25
|
+
</gn-ui-button>
|
|
26
|
+
</div>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ChangeDetectionStrategy,
|
|
3
|
+
Component,
|
|
4
|
+
EventEmitter,
|
|
5
|
+
Input,
|
|
6
|
+
Output,
|
|
7
|
+
} from '@angular/core'
|
|
8
|
+
import { ButtonComponent } from '../button/button.component'
|
|
9
|
+
import { MatIconModule } from '@angular/material/icon'
|
|
10
|
+
|
|
11
|
+
@Component({
|
|
12
|
+
selector: 'gn-ui-previous-next-buttons',
|
|
13
|
+
templateUrl: './previous-next-buttons.component.html',
|
|
14
|
+
styleUrls: ['./previous-next-buttons.component.css'],
|
|
15
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
16
|
+
standalone: true,
|
|
17
|
+
imports: [ButtonComponent, MatIconModule],
|
|
18
|
+
})
|
|
19
|
+
export class PreviousNextButtonsComponent {
|
|
20
|
+
@Input() isFirst: boolean
|
|
21
|
+
@Input() isLast: boolean
|
|
22
|
+
|
|
23
|
+
@Output() directionButtonClicked: EventEmitter<string> = new EventEmitter()
|
|
24
|
+
|
|
25
|
+
previousButtonClicked() {
|
|
26
|
+
this.directionButtonClicked.next('previous')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
nextButtonClicked() {
|
|
30
|
+
this.directionButtonClicked.next('next')
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -29,6 +29,7 @@ export class TextInputComponent implements AfterViewInit {
|
|
|
29
29
|
@Input() extraClass = ''
|
|
30
30
|
@Input() hint: string
|
|
31
31
|
@Input() required = false
|
|
32
|
+
@Input() disabled: boolean
|
|
32
33
|
rawChange = new Subject<string>()
|
|
33
34
|
@Output() valueChange = this.rawChange.pipe(distinctUntilChanged())
|
|
34
35
|
@ViewChild('input') input
|
|
@@ -36,7 +36,6 @@ import { ImageInputComponent } from './image-input/image-input.component'
|
|
|
36
36
|
|
|
37
37
|
@NgModule({
|
|
38
38
|
declarations: [
|
|
39
|
-
DropdownSelectorComponent,
|
|
40
39
|
AutocompleteComponent,
|
|
41
40
|
TextInputComponent,
|
|
42
41
|
DragAndDropFileInputComponent,
|
|
@@ -49,7 +48,6 @@ import { ImageInputComponent } from './image-input/image-input.component'
|
|
|
49
48
|
CopyTextButtonComponent,
|
|
50
49
|
CheckboxComponent,
|
|
51
50
|
SearchInputComponent,
|
|
52
|
-
DateRangePickerComponent,
|
|
53
51
|
],
|
|
54
52
|
imports: [
|
|
55
53
|
CommonModule,
|
|
@@ -73,6 +71,8 @@ import { ImageInputComponent } from './image-input/image-input.component'
|
|
|
73
71
|
TextAreaComponent,
|
|
74
72
|
ButtonComponent,
|
|
75
73
|
ImageInputComponent,
|
|
74
|
+
DropdownSelectorComponent,
|
|
75
|
+
DateRangePickerComponent,
|
|
76
76
|
],
|
|
77
77
|
exports: [
|
|
78
78
|
DropdownSelectorComponent,
|
|
@@ -6,4 +6,5 @@ export * from './lib/form-field-wrapper/form-field-wrapper.component'
|
|
|
6
6
|
export * from './lib/interactive-table/interactive-table-column/interactive-table-column.component'
|
|
7
7
|
export * from './lib/interactive-table/interactive-table.component'
|
|
8
8
|
export * from './lib/sticky-header/sticky-header.component'
|
|
9
|
+
export * from './lib/block-list/block-list.component'
|
|
9
10
|
export * from './lib/ui-layout.module'
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
:host .block-list-container ::ng-deep > * {
|
|
2
|
+
flex-shrink: 0;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
:host {
|
|
6
|
+
position: relative;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.list-page-dot {
|
|
10
|
+
width: 6px;
|
|
11
|
+
height: 6px;
|
|
12
|
+
border-radius: 6px;
|
|
13
|
+
position: relative;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.list-page-dot:after {
|
|
17
|
+
content: '';
|
|
18
|
+
position: absolute;
|
|
19
|
+
left: -7px;
|
|
20
|
+
top: -7px;
|
|
21
|
+
width: 20px;
|
|
22
|
+
height: 20px;
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<div
|
|
2
|
+
class="block-list-container flex flex-col"
|
|
3
|
+
#blockContainer
|
|
4
|
+
[ngClass]="containerClass"
|
|
5
|
+
[ngStyle]="{ minHeight: minHeight + 'px' }"
|
|
6
|
+
>
|
|
7
|
+
<ng-content></ng-content>
|
|
8
|
+
</div>
|
|
9
|
+
<div
|
|
10
|
+
*ngIf="pagesCount > 1"
|
|
11
|
+
class="absolute flex flex-row justify-center gap-[14px] p-1"
|
|
12
|
+
[ngClass]="paginationContainerClass"
|
|
13
|
+
>
|
|
14
|
+
<button
|
|
15
|
+
*ngFor="let page of pages"
|
|
16
|
+
class="list-page-dot"
|
|
17
|
+
(click)="goToPage(page)"
|
|
18
|
+
[ngClass]="currentPage === page ? 'bg-primary' : 'bg-gray-400'"
|
|
19
|
+
></button>
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AfterViewInit,
|
|
3
|
+
ChangeDetectionStrategy,
|
|
4
|
+
ChangeDetectorRef,
|
|
5
|
+
Component,
|
|
6
|
+
ContentChildren,
|
|
7
|
+
ElementRef,
|
|
8
|
+
Input,
|
|
9
|
+
QueryList,
|
|
10
|
+
ViewChild,
|
|
11
|
+
} from '@angular/core'
|
|
12
|
+
import { CommonModule } from '@angular/common'
|
|
13
|
+
|
|
14
|
+
@Component({
|
|
15
|
+
selector: 'gn-ui-block-list',
|
|
16
|
+
templateUrl: './block-list.component.html',
|
|
17
|
+
styleUrls: ['./block-list.component.css'],
|
|
18
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
19
|
+
standalone: true,
|
|
20
|
+
imports: [CommonModule],
|
|
21
|
+
})
|
|
22
|
+
export class BlockListComponent implements AfterViewInit {
|
|
23
|
+
@Input() pageSize = 5
|
|
24
|
+
@Input() containerClass = ''
|
|
25
|
+
@Input() paginationContainerClass = 'w-full bottom-0 top-auto'
|
|
26
|
+
@ContentChildren('block', { read: ElementRef }) blocks: QueryList<
|
|
27
|
+
ElementRef<HTMLElement>
|
|
28
|
+
>
|
|
29
|
+
@ViewChild('blockContainer') blockContainer: ElementRef<HTMLElement>
|
|
30
|
+
|
|
31
|
+
protected minHeight = 0
|
|
32
|
+
|
|
33
|
+
protected currentPage = 0
|
|
34
|
+
protected get pages() {
|
|
35
|
+
return new Array(this.pagesCount).fill(0).map((_, i) => i)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
get isFirstPage() {
|
|
39
|
+
return this.currentPage === 0
|
|
40
|
+
}
|
|
41
|
+
get isLastPage() {
|
|
42
|
+
return this.currentPage === this.pagesCount - 1
|
|
43
|
+
}
|
|
44
|
+
get pagesCount() {
|
|
45
|
+
return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
constructor(private changeDetector: ChangeDetectorRef) {}
|
|
49
|
+
|
|
50
|
+
ngAfterViewInit() {
|
|
51
|
+
this.blocks.changes.subscribe(this.refreshBlocksVisibility)
|
|
52
|
+
this.refreshBlocksVisibility()
|
|
53
|
+
|
|
54
|
+
// we store the first height as the min-height of the list container
|
|
55
|
+
this.minHeight = this.blockContainer.nativeElement.clientHeight
|
|
56
|
+
this.changeDetector.detectChanges()
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
protected refreshBlocksVisibility = () => {
|
|
60
|
+
this.blocks.forEach((block, index) => {
|
|
61
|
+
block.nativeElement.style.display =
|
|
62
|
+
index >= this.currentPage * this.pageSize &&
|
|
63
|
+
index < (this.currentPage + 1) * this.pageSize
|
|
64
|
+
? null
|
|
65
|
+
: 'none'
|
|
66
|
+
})
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public goToPage(index: number) {
|
|
70
|
+
this.currentPage = Math.max(Math.min(index, this.pagesCount - 1), 0)
|
|
71
|
+
this.changeDetector.detectChanges()
|
|
72
|
+
this.refreshBlocksVisibility()
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public previousPage() {
|
|
76
|
+
if (this.isFirstPage) return
|
|
77
|
+
this.goToPage(this.currentPage - 1)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public nextPage() {
|
|
81
|
+
if (this.isLastPage) return
|
|
82
|
+
this.goToPage(this.currentPage + 1)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
:host .carousel-container ::ng-deep > * {
|
|
2
2
|
flex-shrink: 0;
|
|
3
3
|
}
|
|
4
|
+
|
|
4
5
|
:host {
|
|
5
6
|
position: relative;
|
|
7
|
+
display: block;
|
|
6
8
|
}
|
|
9
|
+
|
|
7
10
|
.carousel-step-dot {
|
|
8
11
|
width: 6px;
|
|
9
12
|
height: 6px;
|
|
10
13
|
border-radius: 6px;
|
|
11
14
|
position: relative;
|
|
12
15
|
}
|
|
16
|
+
|
|
13
17
|
.carousel-step-dot:after {
|
|
14
18
|
content: '';
|
|
15
19
|
position: absolute;
|
|
16
|
-
left: -
|
|
17
|
-
top: -
|
|
18
|
-
width:
|
|
19
|
-
height:
|
|
20
|
+
left: -7px;
|
|
21
|
+
top: -7px;
|
|
22
|
+
width: 20px;
|
|
23
|
+
height: 20px;
|
|
20
24
|
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
<div #carouselOverflowContainer class="
|
|
2
|
-
<div class="carousel-container flex
|
|
1
|
+
<div #carouselOverflowContainer class="w-full">
|
|
2
|
+
<div class="carousel-container flex" [ngClass]="containerClass">
|
|
3
3
|
<ng-content></ng-content>
|
|
4
4
|
</div>
|
|
5
5
|
</div>
|
|
6
6
|
<div
|
|
7
7
|
*ngIf="steps.length > 1"
|
|
8
|
-
class="absolute
|
|
8
|
+
class="absolute flex flex-row justify-center gap-[14px] p-1"
|
|
9
9
|
[ngClass]="stepsContainerClass"
|
|
10
10
|
>
|
|
11
11
|
<button
|
|
12
12
|
*ngFor="let step of steps; let i = index"
|
|
13
13
|
class="carousel-step-dot"
|
|
14
14
|
(click)="scrollToStep(i)"
|
|
15
|
-
[ngClass]="
|
|
15
|
+
[ngClass]="currentStep === i ? 'bg-primary' : 'bg-gray-400'"
|
|
16
16
|
></button>
|
|
17
17
|
</div>
|
|
@@ -4,25 +4,49 @@ import {
|
|
|
4
4
|
ChangeDetectorRef,
|
|
5
5
|
Component,
|
|
6
6
|
ElementRef,
|
|
7
|
+
EventEmitter,
|
|
7
8
|
Input,
|
|
9
|
+
Output,
|
|
8
10
|
ViewChild,
|
|
9
11
|
} from '@angular/core'
|
|
10
12
|
import EmblaCarousel, { EmblaCarouselType } from 'embla-carousel'
|
|
13
|
+
import { CommonModule } from '@angular/common'
|
|
11
14
|
|
|
12
15
|
@Component({
|
|
13
16
|
selector: 'gn-ui-carousel',
|
|
14
17
|
templateUrl: './carousel.component.html',
|
|
15
18
|
styleUrls: ['./carousel.component.css'],
|
|
16
19
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
20
|
+
standalone: true,
|
|
21
|
+
imports: [CommonModule],
|
|
17
22
|
})
|
|
18
23
|
export class CarouselComponent implements AfterViewInit {
|
|
24
|
+
@ViewChild('carouselOverflowContainer') carouselOverflowContainer: ElementRef
|
|
25
|
+
|
|
19
26
|
@Input() containerClass = ''
|
|
20
|
-
@Input() stepsContainerClass = ''
|
|
21
|
-
@
|
|
22
|
-
|
|
23
|
-
steps: number[] = []
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
@Input() stepsContainerClass = 'w-full bottom-0 top-auto'
|
|
28
|
+
@Output() currentStepChange = new EventEmitter<number>()
|
|
29
|
+
|
|
30
|
+
protected steps: number[] = []
|
|
31
|
+
protected emblaApi: EmblaCarouselType
|
|
32
|
+
protected currentStep = 0
|
|
33
|
+
|
|
34
|
+
protected refreshSteps = () => {
|
|
35
|
+
this.steps = this.emblaApi.scrollSnapList()
|
|
36
|
+
this.currentStep = this.emblaApi.selectedScrollSnap()
|
|
37
|
+
this.currentStepChange.emit(this.currentStep)
|
|
38
|
+
this.changeDetector.detectChanges()
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
get isFirstStep() {
|
|
42
|
+
return this.currentStep === 0
|
|
43
|
+
}
|
|
44
|
+
get isLastStep() {
|
|
45
|
+
return this.currentStep === this.steps.length - 1
|
|
46
|
+
}
|
|
47
|
+
get stepsCount() {
|
|
48
|
+
return this.steps.length
|
|
49
|
+
}
|
|
26
50
|
|
|
27
51
|
constructor(private changeDetector: ChangeDetectorRef) {}
|
|
28
52
|
|
|
@@ -33,18 +57,24 @@ export class CarouselComponent implements AfterViewInit {
|
|
|
33
57
|
duration: 15,
|
|
34
58
|
}
|
|
35
59
|
)
|
|
36
|
-
|
|
37
|
-
this.steps = this.emblaApi.scrollSnapList()
|
|
38
|
-
this.selectedStep = this.emblaApi.selectedScrollSnap()
|
|
39
|
-
this.changeDetector.detectChanges()
|
|
40
|
-
}
|
|
60
|
+
|
|
41
61
|
this.emblaApi
|
|
42
|
-
.on('init', refreshSteps)
|
|
43
|
-
.on('reInit', refreshSteps)
|
|
44
|
-
.on('select', refreshSteps)
|
|
62
|
+
.on('init', this.refreshSteps)
|
|
63
|
+
.on('reInit', this.refreshSteps)
|
|
64
|
+
.on('select', this.refreshSteps)
|
|
45
65
|
}
|
|
46
66
|
|
|
47
|
-
scrollToStep(stepIndex: number) {
|
|
67
|
+
public scrollToStep(stepIndex: number) {
|
|
48
68
|
this.emblaApi.scrollTo(stepIndex)
|
|
49
69
|
}
|
|
70
|
+
|
|
71
|
+
public slideToPrevious() {
|
|
72
|
+
if (this.isFirstStep) return
|
|
73
|
+
this.emblaApi.scrollPrev()
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public slideToNext() {
|
|
77
|
+
if (this.isLastStep) return
|
|
78
|
+
this.emblaApi.scrollNext()
|
|
79
|
+
}
|
|
50
80
|
}
|
|
@@ -15,14 +15,12 @@ import { CarouselComponent } from './carousel/carousel.component'
|
|
|
15
15
|
StickyHeaderComponent,
|
|
16
16
|
AnchorLinkDirective,
|
|
17
17
|
ExpandablePanelButtonComponent,
|
|
18
|
-
CarouselComponent,
|
|
19
18
|
],
|
|
20
19
|
exports: [
|
|
21
20
|
ExpandablePanelComponent,
|
|
22
21
|
StickyHeaderComponent,
|
|
23
22
|
AnchorLinkDirective,
|
|
24
23
|
ExpandablePanelButtonComponent,
|
|
25
|
-
CarouselComponent,
|
|
26
24
|
],
|
|
27
25
|
})
|
|
28
26
|
export class UiLayoutModule {}
|
|
@@ -94,6 +94,27 @@ export const FORMATS = {
|
|
|
94
94
|
color: '#de630b',
|
|
95
95
|
mimeTypes: ['application/x-dxf', 'image/x-dxf'],
|
|
96
96
|
},
|
|
97
|
+
html: {
|
|
98
|
+
extensions: ['html', 'htm'],
|
|
99
|
+
priority: 12,
|
|
100
|
+
color: '#f2bb3a',
|
|
101
|
+
mimeTypes: ['text/html'],
|
|
102
|
+
},
|
|
103
|
+
fgb: {
|
|
104
|
+
extensions: ['fgb', 'flatgeobuf'],
|
|
105
|
+
priority: 13,
|
|
106
|
+
color: '#f2bb3a',
|
|
107
|
+
mimeTypes: ['application/flatgeobuf'],
|
|
108
|
+
},
|
|
109
|
+
jsonfg: {
|
|
110
|
+
extensions: ['jsonfg', 'jsonfgc'],
|
|
111
|
+
priority: 14,
|
|
112
|
+
color: '#f2bb3a',
|
|
113
|
+
mimeTypes: [
|
|
114
|
+
'application/vnd.ogc.fg+json',
|
|
115
|
+
'application/vnd.ogc.fg+json;compatibility=geojson',
|
|
116
|
+
],
|
|
117
|
+
},
|
|
97
118
|
} as const
|
|
98
119
|
|
|
99
120
|
export type FileFormat = keyof typeof FORMATS
|
package/translations/de.json
CHANGED
|
@@ -145,6 +145,17 @@
|
|
|
145
145
|
"downloads.format.unknown": "unbekannt",
|
|
146
146
|
"downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
|
|
147
147
|
"dropFile": "Datei ablegen",
|
|
148
|
+
"editor.record.form.license": "Lizenz",
|
|
149
|
+
"editor.record.form.license.cc-by": "",
|
|
150
|
+
"editor.record.form.license.cc-by-sa": "",
|
|
151
|
+
"editor.record.form.license.cc-zero": "",
|
|
152
|
+
"editor.record.form.license.etalab": "",
|
|
153
|
+
"editor.record.form.license.etalab-v2": "",
|
|
154
|
+
"editor.record.form.license.odbl": "",
|
|
155
|
+
"editor.record.form.license.odc-by": "",
|
|
156
|
+
"editor.record.form.license.pddl": "",
|
|
157
|
+
"editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
|
|
158
|
+
"editor.record.form.resourceUpdated": "",
|
|
148
159
|
"editor.record.loadError.body": "",
|
|
149
160
|
"editor.record.loadError.closeMessage": "",
|
|
150
161
|
"editor.record.loadError.title": "",
|
|
@@ -215,6 +226,7 @@
|
|
|
215
226
|
"multiselect.filter.placeholder": "Suche",
|
|
216
227
|
"nav.back": "Zurück",
|
|
217
228
|
"next": "weiter",
|
|
229
|
+
"ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
|
|
218
230
|
"organisation.filter.placeholder": "Ergebnisse filtern",
|
|
219
231
|
"organisation.sort.sortBy": "Sortieren nach:",
|
|
220
232
|
"organisations.hits.found": "{hits, plural, =0{Keine Organisation gefunden} other{{hits} von {total} Organisationen angezeigt}}",
|
|
@@ -279,14 +291,6 @@
|
|
|
279
291
|
"record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
|
|
280
292
|
"record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
|
|
281
293
|
"record.metadata.related": "Ähnliche Datensätze",
|
|
282
|
-
"record.metadata.userFeedbacks": "",
|
|
283
|
-
"record.metadata.userFeedbacks.anonymousUser": "",
|
|
284
|
-
"record.metadata.userFeedbacks.sortSelector.label": "",
|
|
285
|
-
"record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
|
|
286
|
-
"record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
|
|
287
|
-
"record.metadata.userFeedbacks.newComment.placeholder": "",
|
|
288
|
-
"record.metadata.userFeedbacks.newAnswer.placeholder": "",
|
|
289
|
-
"record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
|
|
290
294
|
"record.metadata.sheet": "Weitere Informationen verfügbar unter:",
|
|
291
295
|
"record.metadata.status": "Status",
|
|
292
296
|
"record.metadata.technical": "Technische Informationen",
|
|
@@ -301,6 +305,14 @@
|
|
|
301
305
|
"record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
|
|
302
306
|
"record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
|
|
303
307
|
"record.metadata.usage": "Nutzung und Einschränkungen",
|
|
308
|
+
"record.metadata.userFeedbacks": "",
|
|
309
|
+
"record.metadata.userFeedbacks.anonymousUser": "",
|
|
310
|
+
"record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
|
|
311
|
+
"record.metadata.userFeedbacks.newAnswer.placeholder": "",
|
|
312
|
+
"record.metadata.userFeedbacks.newComment.placeholder": "",
|
|
313
|
+
"record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
|
|
314
|
+
"record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
|
|
315
|
+
"record.metadata.userFeedbacks.sortSelector.label": "",
|
|
304
316
|
"record.more.details": "Weitere Details",
|
|
305
317
|
"record.tab.chart": "Diagramm",
|
|
306
318
|
"record.tab.data": "Tabelle",
|
|
@@ -360,12 +372,6 @@
|
|
|
360
372
|
"table.loading.data": "Daten werden geladen...",
|
|
361
373
|
"table.object.count": "Objekte in diesem Datensatz",
|
|
362
374
|
"table.select.data": "Datenquelle",
|
|
363
|
-
"timeSincePipe.lessThanAMinute": "",
|
|
364
|
-
"timeSincePipe.minutesAgo": "",
|
|
365
|
-
"timeSincePipe.hoursAgo": "",
|
|
366
|
-
"timeSincePipe.daysAgo": "",
|
|
367
|
-
"timeSincePipe.monthsAgo": "",
|
|
368
|
-
"timeSincePipe.yearsAgo": "",
|
|
369
375
|
"tooltip.html.copy": "HTML kopieren",
|
|
370
376
|
"tooltip.id.copy": "Eindeutige Kennung kopieren",
|
|
371
377
|
"tooltip.url.copy": "URL kopieren",
|
package/translations/en.json
CHANGED
|
@@ -145,6 +145,17 @@
|
|
|
145
145
|
"downloads.format.unknown": "unknown",
|
|
146
146
|
"downloads.wfs.featuretype.not.found": "The layer was not found",
|
|
147
147
|
"dropFile": "drop file",
|
|
148
|
+
"editor.record.form.license": "License",
|
|
149
|
+
"editor.record.form.license.cc-by": "Creative Commons CC-BY",
|
|
150
|
+
"editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
|
|
151
|
+
"editor.record.form.license.cc-zero": "Creative Commons CC-0",
|
|
152
|
+
"editor.record.form.license.etalab": "Open Licence (Etalab)",
|
|
153
|
+
"editor.record.form.license.etalab-v2": "Open Licence v2.0 (Etalab)",
|
|
154
|
+
"editor.record.form.license.odbl": "Open Data Commons ODbL",
|
|
155
|
+
"editor.record.form.license.odc-by": "Open Data Commons ODC-By",
|
|
156
|
+
"editor.record.form.license.pddl": "Open Data Commons PDDL",
|
|
157
|
+
"editor.record.form.license.unknown": "Unknown or absent",
|
|
158
|
+
"editor.record.form.resourceUpdated": "Last update date",
|
|
148
159
|
"editor.record.loadError.body": "The record could not be loaded:",
|
|
149
160
|
"editor.record.loadError.closeMessage": "Understood",
|
|
150
161
|
"editor.record.loadError.title": "Error loading record",
|
|
@@ -215,6 +226,7 @@
|
|
|
215
226
|
"multiselect.filter.placeholder": "Search",
|
|
216
227
|
"nav.back": "Back",
|
|
217
228
|
"next": "next",
|
|
229
|
+
"ogc.unreachable.unknown": "The service could not be reached",
|
|
218
230
|
"organisation.filter.placeholder": "Filter results",
|
|
219
231
|
"organisation.sort.sortBy": "Sort by:",
|
|
220
232
|
"organisations.hits.found": "{hits, plural, =0{No organizations found} other{{hits} out of {total} organizations shown}}",
|
|
@@ -279,14 +291,6 @@
|
|
|
279
291
|
"record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
|
|
280
292
|
"record.metadata.quality.updateFrequency.success": "Update frequency is specified",
|
|
281
293
|
"record.metadata.related": "Related records",
|
|
282
|
-
"record.metadata.userFeedbacks": "Questions / Answers",
|
|
283
|
-
"record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
|
|
284
|
-
"record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
|
|
285
|
-
"record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
|
|
286
|
-
"record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
|
|
287
|
-
"record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
|
|
288
|
-
"record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
|
|
289
|
-
"record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
|
|
290
294
|
"record.metadata.sheet": "Original metadata",
|
|
291
295
|
"record.metadata.status": "Status",
|
|
292
296
|
"record.metadata.technical": "Technical information",
|
|
@@ -301,6 +305,14 @@
|
|
|
301
305
|
"record.metadata.updateFrequency": "Data Update Frequency",
|
|
302
306
|
"record.metadata.updatedOn": "Last Data Information Update",
|
|
303
307
|
"record.metadata.usage": "License and Conditions",
|
|
308
|
+
"record.metadata.userFeedbacks": "Questions / Answers",
|
|
309
|
+
"record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
|
|
310
|
+
"record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
|
|
311
|
+
"record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
|
|
312
|
+
"record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
|
|
313
|
+
"record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
|
|
314
|
+
"record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
|
|
315
|
+
"record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
|
|
304
316
|
"record.more.details": "Read more",
|
|
305
317
|
"record.tab.chart": "Chart",
|
|
306
318
|
"record.tab.data": "Table",
|
|
@@ -360,12 +372,6 @@
|
|
|
360
372
|
"table.loading.data": "Loading data...",
|
|
361
373
|
"table.object.count": "objects in this dataset",
|
|
362
374
|
"table.select.data": "Data source",
|
|
363
|
-
"timeSincePipe.lessThanAMinute": "Less than a minute ago",
|
|
364
|
-
"timeSincePipe.minutesAgo": "{value} minute{s} ago",
|
|
365
|
-
"timeSincePipe.hoursAgo": "{value} hour{s} ago",
|
|
366
|
-
"timeSincePipe.daysAgo": "{value} day{s} ago",
|
|
367
|
-
"timeSincePipe.monthsAgo": "{value} month{s} ago",
|
|
368
|
-
"timeSincePipe.yearsAgo": "{value} year{s} ago",
|
|
369
375
|
"tooltip.html.copy": "Copy HTML",
|
|
370
376
|
"tooltip.id.copy": "Copy unique identifier",
|
|
371
377
|
"tooltip.url.copy": "Copy URL",
|