Skip to content

Commit 4689bcd

Browse files
committed
show geoadmin iframe in map-container component
1 parent afd20f0 commit 4689bcd

File tree

6 files changed

+62
-463
lines changed

6 files changed

+62
-463
lines changed

apps/datahub/src/app/record/record-metadata/record-metadata.component.html

+2-12
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,7 @@
8181
style="height: 500px"
8282
*ngIf="displayMap$ | async"
8383
>
84-
<gn-ui-map-view
85-
*ngIf="(geoAdminUrl$ | async) === null"
86-
></gn-ui-map-view>
87-
<iframe
88-
class="w-full h-full"
89-
*ngIf="geoAdminUrl$ | async"
90-
[src]="geoAdminUrl$ | async"
91-
></iframe>
84+
<gn-ui-map-view></gn-ui-map-view>
9285
</div>
9386
</mat-tab>
9487
<mat-tab [disabled]="(displayData$ | async) === false">
@@ -113,10 +106,7 @@
113106
</div>
114107
</div>
115108
<gn-ui-data-view-share
116-
*ngIf="
117-
(geoAdminUrl$ | async) === false &&
118-
((displayMap$ | async) || (displayData$ | async))
119-
"
109+
*ngIf="(displayMap$ | async) || (displayData$ | async)"
120110
[viewType]="selectedView$ | async"
121111
></gn-ui-data-view-share>
122112
<div

apps/datahub/src/app/record/record-metadata/record-metadata.component.ts

+2-17
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
ErrorComponent,
66
ErrorType,
77
ImageOverlayPreviewComponent,
8+
MetadataCatalogComponent,
89
MetadataContactComponent,
910
MetadataInfoComponent,
1011
MetadataQualityComponent,
@@ -30,7 +31,6 @@ import { RecordApisComponent } from '../record-apis/record-apis.component'
3031
import { RecordOtherlinksComponent } from '../record-otherlinks/record-otherlinks.component'
3132
import { RecordRelatedRecordsComponent } from '../record-related-records/record-related-records.component'
3233
import { TranslateModule } from '@ngx-translate/core'
33-
import { DomSanitizer } from '@angular/platform-browser'
3434

3535
@Component({
3636
selector: 'datahub-record-metadata',
@@ -51,6 +51,7 @@ import { DomSanitizer } from '@angular/platform-browser'
5151
MetadataInfoComponent,
5252
MetadataContactComponent,
5353
MetadataQualityComponent,
54+
MetadataCatalogComponent,
5455
RecordRelatedRecordsComponent,
5556
DataViewComponent,
5657
MapViewComponent,
@@ -70,21 +71,6 @@ export class RecordMetadataComponent {
7071
startWith(false)
7172
)
7273

73-
geoAdminUrl$ = this.metadataViewFacade.otherLinks$.pipe(
74-
map((mapApiLinks) => {
75-
return mapApiLinks?.find((link) =>
76-
link?.url.toString().startsWith('https://map.geo.admin.ch/')
77-
)
78-
}),
79-
filter((geoAdminUrl) => !!geoAdminUrl),
80-
map((link) =>
81-
this.sanitizer.bypassSecurityTrustResourceUrl(
82-
link.url.toString().replace('?layers=', '#/embed?layers=')
83-
)
84-
),
85-
startWith(null)
86-
)
87-
8874
displayData$ = combineLatest([
8975
this.metadataViewFacade.dataLinks$,
9076
this.metadataViewFacade.geoDataLinks$,
@@ -163,7 +149,6 @@ export class RecordMetadataComponent {
163149
public metadataViewFacade: MdViewFacade,
164150
private searchService: SearchService,
165151
private sourceService: SourcesService,
166-
private sanitizer: DomSanitizer,
167152
private orgsService: OrganizationsServiceInterface
168153
) {}
169154

libs/feature/record/src/lib/map-view/map-view.component.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import {
3636
import {
3737
FeatureDetailComponent,
3838
MapContainerComponent,
39-
prioritizePageScroll,
4039
} from '@geonetwork-ui/ui/map'
4140
import { Feature } from 'geojson'
4241
import { NgIconComponent, provideIcons } from '@ng-icons/core'
@@ -158,9 +157,10 @@ export class MapViewComponent implements AfterViewInit {
158157
private changeRef: ChangeDetectorRef
159158
) {}
160159

161-
async ngAfterViewInit() {
162-
const map = await this.mapContainer.openlayersMap
163-
prioritizePageScroll(map.getInteractions())
160+
ngAfterViewInit() {
161+
// SPECIFIC GEOCAT
162+
// const map = await this.mapContainer.openlayersMap
163+
// prioritizePageScroll(map.getInteractions())
164164
}
165165

166166
onMapFeatureSelect(features: Feature[]): void {
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,4 @@
1-
<div class="h-full w-full" #map></div>
2-
<div
3-
class="absolute inset-0 p-2 rounded z-40 transition-all flex flex-col justify-center items-center text-primary font-sans pointer-events-none"
4-
[ngClass]="
5-
(displayMessage$ | async) ? 'visible opacity-100' : 'invisible opacity-0'
6-
"
7-
>
8-
<div
9-
class="absolute z-[-1] inset-0 bg-gradient-to-b from-white to-primary-lightest opacity-60"
10-
></div>
11-
<ng-icon
12-
class="!w-16 !h-16 text-[64px] mb-4"
13-
name="matSwipeOutline"
14-
></ng-icon>
15-
<p translate>map.navigation.message</p>
16-
</div>
1+
<ng-container *ngFor="let url of [geoadminUrl]">
2+
<!-- this will recreate the iframe on src change -->
3+
<iframe *ngIf="url" class="h-full w-full" [src]="url"></iframe>
4+
</ng-container>
Original file line numberDiff line numberDiff line change
@@ -1,228 +1 @@
1-
import {
2-
ComponentFixture,
3-
discardPeriodicTasks,
4-
fakeAsync,
5-
TestBed,
6-
tick,
7-
} from '@angular/core/testing'
8-
import { MockBuilder } from 'ng-mocks'
9-
import {
10-
mapCtxFixture,
11-
mapCtxLayerWmsFixture,
12-
mapCtxLayerXyzFixture,
13-
} from '@geonetwork-ui/common/fixtures'
14-
import { applyContextDiffToMap } from '@geospatial-sdk/openlayers'
15-
import { MapContainerComponent } from './map-container.component'
16-
import { computeMapContextDiff } from '@geospatial-sdk/core'
17-
18-
jest.mock('@geospatial-sdk/core', () => ({
19-
computeMapContextDiff: jest.fn(() => ({
20-
'this is': 'a diff',
21-
})),
22-
}))
23-
24-
jest.mock('@geospatial-sdk/openlayers', () => ({
25-
applyContextDiffToMap: jest.fn(),
26-
createMapFromContext: jest.fn(() => Promise.resolve(new OpenLayersMapMock())),
27-
listen: jest.fn(),
28-
}))
29-
30-
let mapmutedCallback
31-
let movestartCallback
32-
let singleclickCallback
33-
class OpenLayersMapMock {
34-
_size = undefined
35-
setTarget = jest.fn()
36-
updateSize() {
37-
this._size = [100, 100]
38-
}
39-
getSize() {
40-
return this._size
41-
}
42-
on(type, callback) {
43-
if (type === 'mapmuted') {
44-
mapmutedCallback = callback
45-
}
46-
if (type === 'movestart') {
47-
movestartCallback = callback
48-
}
49-
if (type === 'singleclick') {
50-
singleclickCallback = callback
51-
}
52-
}
53-
off() {
54-
// do nothing!
55-
}
56-
}
57-
58-
const defaultBaseMap = {
59-
attributions:
60-
'<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>',
61-
type: 'xyz',
62-
url: 'https://{a-c}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png',
63-
}
64-
65-
describe('MapContainerComponent', () => {
66-
let component: MapContainerComponent
67-
let fixture: ComponentFixture<MapContainerComponent>
68-
69-
beforeEach(() => {
70-
jest.clearAllMocks()
71-
})
72-
73-
beforeEach(() => {
74-
return MockBuilder(MapContainerComponent)
75-
})
76-
77-
beforeEach(async () => {
78-
await TestBed.configureTestingModule({}).compileComponents()
79-
})
80-
81-
beforeEach(() => {
82-
fixture = TestBed.createComponent(MapContainerComponent)
83-
component = fixture.componentInstance
84-
fixture.detectChanges()
85-
})
86-
87-
it('creates', () => {
88-
expect(component).toBeTruthy()
89-
})
90-
91-
describe('#processContext', () => {
92-
it('returns a default context if null provided', () => {
93-
expect(component.processContext(null)).toEqual({
94-
layers: [defaultBaseMap],
95-
view: {
96-
center: [0, 15],
97-
zoom: 2,
98-
},
99-
})
100-
})
101-
it('adds base layers to context', () => {
102-
const context = {
103-
layers: [mapCtxLayerWmsFixture()],
104-
view: null,
105-
}
106-
expect(component.processContext(context)).toEqual({
107-
layers: [defaultBaseMap, mapCtxLayerWmsFixture()],
108-
view: {
109-
center: [0, 15],
110-
zoom: 2,
111-
},
112-
})
113-
})
114-
it('uses provided basemaps if any', () => {
115-
component['basemapLayers'] = [mapCtxLayerXyzFixture()]
116-
const context = { layers: [], view: null }
117-
expect(component.processContext(context)).toEqual({
118-
layers: [defaultBaseMap, mapCtxLayerXyzFixture()],
119-
view: {
120-
center: [0, 15],
121-
zoom: 2,
122-
},
123-
})
124-
})
125-
it('does not use the default base layer if specified', () => {
126-
component['doNotUseDefaultBasemap'] = true
127-
const context = { layers: [mapCtxLayerXyzFixture()], view: null }
128-
expect(component.processContext(context)).toEqual({
129-
layers: [mapCtxLayerXyzFixture()],
130-
view: {
131-
center: [0, 15],
132-
zoom: 2,
133-
},
134-
})
135-
})
136-
it('applies map constraints if any', () => {
137-
component['mapViewConstraints'] = {
138-
maxZoom: 18,
139-
maxExtent: [10, 20, 30, 40],
140-
}
141-
const context = { layers: [mapCtxLayerXyzFixture()], view: null }
142-
expect(component.processContext(context)).toEqual({
143-
layers: [defaultBaseMap, mapCtxLayerXyzFixture()],
144-
view: {
145-
center: [0, 15],
146-
zoom: 2,
147-
maxExtent: [10, 20, 30, 40],
148-
maxZoom: 18,
149-
},
150-
})
151-
})
152-
})
153-
154-
describe('#afterViewInit', () => {
155-
beforeEach(async () => {
156-
await component.ngAfterViewInit()
157-
})
158-
it('creates a map', () => {
159-
expect(component.olMap).toBeInstanceOf(OpenLayersMapMock)
160-
})
161-
describe('display message that map navigation has been muted', () => {
162-
let messageDisplayed
163-
beforeEach(() => {
164-
messageDisplayed = null
165-
component.displayMessage$.subscribe(
166-
(value) => (messageDisplayed = value)
167-
)
168-
})
169-
it('mapmuted event displays message after 300ms (delay for eventually hiding message)', fakeAsync(() => {
170-
mapmutedCallback()
171-
tick(400)
172-
expect(messageDisplayed).toEqual(true)
173-
discardPeriodicTasks()
174-
}))
175-
it('message goes away after 2s', fakeAsync(() => {
176-
mapmutedCallback()
177-
tick(2500)
178-
expect(messageDisplayed).toEqual(false)
179-
discardPeriodicTasks()
180-
}))
181-
it('message does not display if map fires movestart event', fakeAsync(() => {
182-
movestartCallback()
183-
tick(300)
184-
expect(messageDisplayed).toEqual(false)
185-
discardPeriodicTasks()
186-
}))
187-
it('message does not display if map fires singleclick event', fakeAsync(() => {
188-
singleclickCallback()
189-
tick(300)
190-
expect(messageDisplayed).toEqual(false)
191-
discardPeriodicTasks()
192-
}))
193-
})
194-
})
195-
196-
describe('#ngOnChanges', () => {
197-
beforeEach(async () => {
198-
await component.ngAfterViewInit()
199-
})
200-
it('updates the map with the new context', async () => {
201-
const newContext = {
202-
...mapCtxFixture(),
203-
layers: [mapCtxLayerWmsFixture()],
204-
}
205-
await component.ngOnChanges({
206-
context: {
207-
currentValue: mapCtxFixture(),
208-
previousValue: newContext,
209-
firstChange: false,
210-
isFirstChange: () => false,
211-
},
212-
})
213-
expect(computeMapContextDiff).toHaveBeenCalledWith(
214-
{
215-
layers: [defaultBaseMap, ...mapCtxFixture().layers],
216-
view: mapCtxFixture().view,
217-
},
218-
{
219-
layers: [defaultBaseMap, mapCtxLayerWmsFixture()],
220-
view: mapCtxFixture().view,
221-
}
222-
)
223-
expect(applyContextDiffToMap).toHaveBeenCalledWith(component.olMap, {
224-
'this is': 'a diff',
225-
})
226-
})
227-
})
228-
})
1+
describe.skip('MapContainerComponent', () => {})

0 commit comments

Comments
 (0)