Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
2f99431
refactor(reverseGeocoder): introduce shared lib getRefStore
oeninghe-dataport Jan 13, 2026
74e98dd
feat(core): export `center` and `extent` as instable API
oeninghe-dataport Jan 13, 2026
0da4c0a
feat(core): add shared pagination component
oeninghe-dataport Jan 16, 2026
15972bf
test(snowbox): allow jumping to Hamburg via button
oeninghe-dataport Jan 13, 2026
d449c8d
test(snowbox): debug assistant for browser devtools
oeninghe-dataport Feb 16, 2026
1234994
feat(gfi): migrate plugin
oeninghe-dataport Jan 8, 2026
8757e3b
refactor(core): make `renderType` a global plugin option
oeninghe-dataport Feb 17, 2026
425cfdb
feat(gfi): improve support for different rendering options
oeninghe-dataport Feb 17, 2026
bf71346
Merge branch 'next' into vue3/migrate-plugin-gfi
oeninghe-dataport Feb 17, 2026
70ff48d
Merge branch 'next' into vue3/migrate-plugin-gfi
dopenguin Feb 23, 2026
11fe191
Merge branch 'next' into vue3/migrate-plugin-gfi
dopenguin Feb 23, 2026
978d718
fix(gfi): remove legacy manual plugin prefix for console
oeninghe-dataport Mar 2, 2026
6d60086
docs: fix shared locales hint
oeninghe-dataport Mar 2, 2026
6182677
docs: fix shared locales hint
oeninghe-dataport Mar 2, 2026
439ae45
docs: fix shared locales hint
oeninghe-dataport Mar 2, 2026
aa854c8
Merge remote-tracking branch 'origin/next' into vue3/migrate-plugin-gfi
oeninghe-dataport Apr 13, 2026
a0daad3
Merge remote-tracking branch 'origin/next' into vue3/migrate-plugin-gfi
oeninghe-dataport Apr 15, 2026
63a5d72
docs(gfi): remove duplicate ToDo hint
oeninghe-dataport Apr 15, 2026
55ff02a
docs(gfi): use typedoc-linking to layout nineRegions
oeninghe-dataport Apr 15, 2026
c2edb52
feat(core): introduce InterfacePluginOptions
oeninghe-dataport Apr 15, 2026
79852f3
refactor(gfi): introduce new composable usePluginStoreWatcher
oeninghe-dataport Apr 15, 2026
9f25413
fix(core): consider hoveredFeature set from plugin again
oeninghe-dataport Apr 16, 2026
d15b2c2
chore(core): markers: fix double star in comment
oeninghe-dataport Apr 16, 2026
4dfe6af
test(snowbox): enable bindWithCoreHoverSelect for gfi plugin
oeninghe-dataport Apr 16, 2026
875a35c
fix(gfi): wrap text for empty view in feature list
oeninghe-dataport Apr 16, 2026
ec689f1
fix(gfi): highlight selected feature with bindMarkers
oeninghe-dataport Apr 21, 2026
a6e5698
test(snowbox): disable separate geometry display as bindMarkers is used
oeninghe-dataport Apr 21, 2026
ef16d0b
Merge remote-tracking branch 'origin/next' into vue3/migrate-plugin-gfi
oeninghe-dataport Apr 21, 2026
3271a30
test(iceberg): add GFI plugin w/ configuration options
oeninghe-dataport Apr 21, 2026
c7a096d
chore(snowbox): move comment to be at the right spot again
oeninghe-dataport Apr 21, 2026
03243fe
fix(gfi): add plugin options to MapConfiguration
oeninghe-dataport Apr 21, 2026
92c938c
fix(gfi): show export button only if export is configured
oeninghe-dataport Apr 21, 2026
758e48e
Merge branch 'next' into vue3/migrate-plugin-gfi
dopenguin Apr 21, 2026
b13d946
docs(gfi): fix typo in src/plugins/gfi/types.ts
oeninghe-dataport May 4, 2026
78cf7ea
refactor(gfi): simplify v-else-if for gfiUI
oeninghe-dataport May 4, 2026
5c52f98
docs(gfi): improve inter-docs linking
oeninghe-dataport May 4, 2026
2bc62e3
docs(gfi): improve inter-docs linking
oeninghe-dataport May 4, 2026
30369fe
docs(gfi): improve wording for gfi types
oeninghe-dataport May 4, 2026
71e0fe9
fix(gfi): remove superfluous gfiFailedSymbol
oeninghe-dataport May 4, 2026
de7c0a2
docs(gfi): explain where geometry property name default is derived from
oeninghe-dataport May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions examples/iceberg/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import kernExtraIcons from 'virtual:kern-extra-icons'
import { computed, ref } from 'vue'

import GfiConfig from './components/GfiConfig.vue'
import IcebergMap from './components/IcebergMap.vue'
import LayoutChooser from './components/LayoutChooser.vue'
import TaskMenu from './components/TaskMenu.vue'
Expand All @@ -55,6 +56,11 @@ const configTasks = [
label: 'Layout wählen',
component: LayoutChooser,
},
{
id: 'configure-gfi',
label: 'GFI konfigurieren',
component: GfiConfig,
},
]
const tasks = computed(() => [
'menu',
Expand Down
84 changes: 84 additions & 0 deletions examples/iceberg/components/GfiConfig.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<template>
<fieldset class="kern-fieldset">
<legend class="kern-label">
Wie soll die Auswahl für das GFI-Plugin ablaufen?
</legend>
<div class="kern-fieldset__body">
<div
v-for="mode of selectionModes"
:key="mode.value"
class="kern-form-check"
>
<input
:id="`${id}-${mode.value}`"
v-model="selectionMode"
class="kern-form-check__radio"
:name="`${id}-layout`"
type="radio"
:value="mode.value"
/>
<label :for="`${id}-${mode.value}`" class="kern-label">
{{ mode.label }}
</label>
</div>
</div>
</fieldset>
</template>

<script setup lang="ts">
import type { MapConfiguration } from '@polar/polar'

import { isEqual } from 'es-toolkit'
import { computed, useId } from 'vue'

import { useIcebergStore } from '../stores/iceberg'

const id = useId()
const store = useIcebergStore()

const selectionModes = [
{
value: 'direct',
label: 'Direkte Auswahl',
config: {
directSelect: true,
},
},
{
value: 'multi',
label: 'Mehrfachauswahl',
config: {
directSelect: true,
multiSelect: 'box',
},
},
{
value: 'pins',
label: 'Auswahl über das Pins-Plugin',
config: {
coordinateSources: [
{
plugin: 'pins',
key: 'coordinate',
},
],
},
},
] satisfies {
value: 'direct' | 'multi' | 'pins'
label: string
config: Partial<MapConfiguration['gfi']>
}[]

const selectionMode = computed({
get: () =>
selectionModes.find((mode) =>
isEqual(mode.config, store.mapConfiguration.gfi)
)?.value || 'direct',
set: (value) => {
store.mapConfiguration.gfi = selectionModes.find(
(mode) => mode.value === value
)?.config as MapConfiguration['gfi']
},
})
</script>
11 changes: 11 additions & 0 deletions examples/iceberg/components/IcebergMap.vue
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import pluginAddressSearch from '@polar/polar/plugins/addressSearch'
import pluginAttributions from '@polar/polar/plugins/attributions'
import pluginFilter from '@polar/polar/plugins/filter'
import pluginFullscreen from '@polar/polar/plugins/fullscreen'
import pluginGfi from '@polar/polar/plugins/gfi'
import pluginIconMenu from '@polar/polar/plugins/iconMenu'
import pluginLayerChooser from '@polar/polar/plugins/layerChooser'
import pluginPins from '@polar/polar/plugins/pins'
Expand Down Expand Up @@ -119,6 +120,16 @@ watch(map, (map) => {
layoutTag: 'TOP_LEFT',
searchMethods: [],
}),
pluginGfi({
displayComponent: true,
layoutTag: 'TOP_LEFT',
layers: {
'1454': {
window: true,
geometry: true,
},
},
}),
pluginPins({
coordinateSources: [{ plugin: 'addressSearch', key: 'chosenAddress' }],
boundary: {
Expand Down
5 changes: 4 additions & 1 deletion examples/iceberg/stores/iceberg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ export const useIcebergStore = defineStore('iceberg', () => {
name: 'Ausgleichsflächen',
styleId: 'panda',
visibility: true,
minZoom: 5,
},
{
id: '1693',
Expand Down Expand Up @@ -69,6 +68,7 @@ export const useIcebergStore = defineStore('iceberg', () => {
visibility: true,
type: 'mask',
name: 'snowbox.layers.mml',
minZoom: 5,
},
],
startCenter: [565874, 5934140],
Expand Down Expand Up @@ -132,6 +132,9 @@ export const useIcebergStore = defineStore('iceberg', () => {
displayComponent: true,
layoutTag: 'TOP_RIGHT',
},
gfi: {
directSelect: true,
} as MapConfiguration['gfi'],
markers: {
layers: [
{
Expand Down
14 changes: 12 additions & 2 deletions examples/snowbox/YetAnotherEmptyComponent.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
<template>
<div style="background: #fff">Awesome</div>
<div style="background: #fff; z-index: 99999; pointer-events: all">
Awesome
<button @click="goHamburg()">Go to Hamburg</button>
</div>
</template>

<script setup lang="ts">
// keep this block to enforce language
// eslint-disable-next-line
// @ts-nocheck

const coreStore = document.getElementById('snowbox').store

function goHamburg() {
coreStore.center = [561210, 5932600]
}
</script>
25 changes: 25 additions & 0 deletions examples/snowbox/debug-assistant.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { getStore } from '@polar/polar'

function initializeDebugAssistant() {
const map = document.getElementById('snowbox')
const coreStore = getStore(map, 'core')
const activePluginIds = coreStore.activePluginIds

window.map = map
window.olMap = coreStore.map
window.coreStore = coreStore
window.activePluginIds = activePluginIds
for (const pluginId of activePluginIds) {
window[`${pluginId}Store`] = coreStore.getPluginStore(pluginId)
}
}

// We want to load as late as possible.
// Especially, the timeout stuff from snowbox code should be done when doing this.
setTimeout(() => {
initializeDebugAssistant()

// 7 seconds may be long sometimes, inform the developer about it.
// eslint-disable-next-line no-console
console.info('POLAR debug assistant was successfully initialized')
}, 7000)
1 change: 1 addition & 0 deletions examples/snowbox/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate, max-age=0" />
<link rel="stylesheet" href="@polar/polar/polar.css" />
<script type="module" defer src="index.js"></script>
<script type="module" defer src="debug-assistant.js"></script>
<style>
/* style just for example page, not directly related to POLAR */
:root {
Expand Down
81 changes: 81 additions & 0 deletions examples/snowbox/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import pluginFooter from '@polar/polar/plugins/footer'
import pluginFullscreen from '@polar/polar/plugins/fullscreen'
import pluginGeoLocation from '@polar/polar/plugins/geoLocation'
import pluginGfi from '@polar/polar/plugins/gfi'
import pluginIconMenu from '@polar/polar/plugins/iconMenu'
import pluginLayerChooser from '@polar/polar/plugins/layerChooser'
import pluginLoadingIndicator from '@polar/polar/plugins/loadingIndicator'
Expand All @@ -32,6 +33,7 @@
const ausgleichsflaechen = '1454'
const reports = '6059'
const denkmal = 'denkmaelerWMS'
const kielPolygon = 'kiel_polygon'
const hamburgBorder = '6074'

let colorScheme = 'light'
Expand Down Expand Up @@ -93,7 +95,7 @@
colorScheme,
startCenter: [565874, 5934140],
layers: [
// TODO: Add internalization to snowbox

Check warning on line 98 in examples/snowbox/index.js

View workflow job for this annotation

GitHub Actions / Linting

Unexpected 'todo' comment: 'TODO: Add internalization to snowbox'
{
id: basemapId,
visibility: true,
Expand Down Expand Up @@ -149,6 +151,12 @@
},
},
},
{
id: kielPolygon,
type: 'mask',
name: 'Kiel Polygone',
visibility: true,
},
],
layout: 'standard',
checkServiceAvailability: true,
Expand Down Expand Up @@ -213,6 +221,18 @@
label_off: 'Mach klein',
},
},
gfi: {
layer: {
[reports]: {
property: {
addr: 'Adresse',
statu: 'Status',
beschr: 'Beschr.',
kat_text: 'Kat.',
},
},
},
},
iconMenu: {
hints: {
attributions: 'LMAO',
Expand Down Expand Up @@ -403,7 +423,68 @@
plugin: pluginLayerChooser({}),
},
],
[
{
plugin: pluginGfi({
layers: {
[reports]: {
window: true,
geometry: false,
properties: [
'addr',
'statu',
'beschr',
'pic',
'kat_text',
'skat_text',
],
exportProperty: 'pic',
showTooltip: (feature) => [
[
'span',
`Coordinates: ${feature.getGeometry().getCoordinates().join(', ')}`,
],
],
},
[kielPolygon]: {
window: true,
},
},
afterLoadFunction: (featuresByLayerId) => {
Object.values(featuresByLayerId).forEach((featureList) => {
featureList.forEach((feature) => {
if (feature.properties) {
feature.properties = {
addr: [
feature.properties.str,
feature.properties.hsnr,
].join(' '),
...feature.properties,
}
}
})
})
return featuresByLayerId
},
featureList: {
activeLayers: {
plugin: 'layerChooser',
key: 'activeMaskIds',
},
mode: 'visible',
bindWithCoreHoverSelect: true,
pageLength: 5,
text: {
title: (feature) =>
feature.get('str') + ' ' + feature.get('hsnr'),
subtitle: 'Michels Meldung',
subSubtitle: (feature) => feature.get('skat_text'),
},
},
}),
},
],
// TODO: Delete the mock plugins including the components once the correct plugins have been implemented

Check warning on line 487 in examples/snowbox/index.js

View workflow job for this annotation

GitHub Actions / Linting

Unexpected 'todo' comment: 'TODO: Delete the mock plugins including...'
[
{
plugin: {
Expand Down
10 changes: 10 additions & 0 deletions examples/snowbox/services.js
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,14 @@ export default [
featureNS: 'http://www.deegree.org/app',
featurePrefix: 'app',
},
{
id: 'kiel_polygon',
name: 'Kiel Polygon',
url: 'https://polar.dataport.de/qgisserver?MAP=/home/qgis/projects/dev_services.qgz',
typ: 'WFS',
featureType: 'polygon_kiel',
outputFormat: 'XML',
version: '1.1.0',
legendURL: '',
},
]
2 changes: 1 addition & 1 deletion src/architecture.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ describe('Architectural checks', () => {
.matchingPattern('^plugins/.*$')
.should()
.matchPattern(
'^plugins/[^/]+/((index|locales|store|types)\\.ts|utils/.*\\.ts|components/.*\\.spec\\.ts|stores/.*\\.ts)$'
'^plugins/[^/]+/((index|locales|store|types)\\.ts|utils/.*\\.ts|components/.*\\.spec\\.ts|stores/.*\\.ts|composables/.*\\.ts)$'
)
.check()
expect(violations).toEqual([])
Expand Down
Loading
Loading