Files
David Straub a3b3123c46 Show KML and GeoJSON files of the selected place on the map (#1524)
* Show KML and GeoJSON files of the selected place on the map

When a place is selected on the map, the KML and GeoJSON media objects
attached to it are drawn as shapes, lines and points, using the styles
in the file where it has them. A place without coordinates stays
selected and the map fits its files.

The files are listed in the layer switcher while the place is selected
and can be switched off; the setting is saved like that of image
overlays. A hidden file is not downloaded.

* Move place map file loading into a controller

PlaceVectorsController owns the KML and GeoJSON files of the selected
place. Each load aborts the previous one and its downloads, so an older
refresh can no longer overwrite newer files, and a refresh keeps files
whose checksum is unchanged.

Only a 404 closes the selection; other errors keep it. Switching on a
file of a place without coordinates fits the map to the files shown.
A file without description is listed by its Gramps ID.
2026-10-12 21:21:43 +02:00

166 lines
4.6 KiB
JSON

{
"scripts": {
"lint:eslint": "eslint --ext .js,.ts . --ignore-path .gitignore",
"format:eslint": "eslint --ext .js,.ts . --fix --ignore-path .gitignore",
"lint:prettier": "prettier \"**/*.{js,ts}\" --check --ignore-path .gitignore",
"format:prettier": "prettier \"**/*.{js,ts}\" --write --ignore-path .gitignore",
"lint": "npm run lint:eslint && npm run lint:prettier",
"format": "npm run format:eslint && npm run format:prettier",
"test": "vitest run --coverage",
"test:watch": "vitest",
"build": "rimraf dist && rollup -c rollup.config.js",
"start:build": "npm run build && web-dev-server --root-dir dist --app-index index.html --open --compatibility none",
"start": "web-dev-server --app-index index.html --host 0.0.0.0 --node-resolve --open --watch --port 8001",
"typecheck": "tsc --noEmit"
},
"devDependencies": {
"@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-replace": "^5.0.7",
"@rollup/plugin-terser": "^1.0.0",
"@rollup/plugin-typescript": "^12.3.0",
"@typescript-eslint/parser": "^8.56.1",
"@vitest/coverage-v8": "^4.0.18",
"@web/dev-server": "^0.4.6",
"@web/dev-server-esbuild": "^1.0.5",
"@web/dev-server-rollup": "^0.6.4",
"@web/rollup-plugin-html": "^3.1.0",
"@web/rollup-plugin-polyfills-loader": "^2.1.3",
"eslint": "^8.57.1",
"eslint-config-prettier": "^7.2.0",
"eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-lit": "^2.2.1",
"eslint-plugin-lit-a11y": "^4.1.4",
"eslint-plugin-n": "^16.6.2",
"eslint-plugin-no-only-tests": "^3.3.0",
"eslint-plugin-promise": "^6.6.0",
"eslint-plugin-wc": "^3.1.0",
"happy-dom": "^20.8.3",
"husky": "^4.3.8",
"lint-staged": "^10.5.4",
"prettier": "^2.8.8",
"rimraf": "^3.0.2",
"rollup": "^4.59.0",
"rollup-plugin-copy": "^3.5.0",
"rollup-plugin-version-injector": "^1.3.3",
"rollup-plugin-workbox": "^8.1.3",
"typescript": "^5.9.3",
"vitest": "^4.0.18"
},
"browser": {
"crypto": false
},
"eslintConfig": {
"extends": [
"standard",
"plugin:lit/recommended",
"plugin:wc/recommended",
"plugin:lit-a11y/recommended",
"prettier"
],
"plugins": [
"no-only-tests"
],
"rules": {
"no-only-tests/no-only-tests": "error"
},
"env": {
"browser": true
},
"overrides": [
{
"files": [
"test/**/*.js"
],
"rules": {
"import/no-extraneous-dependencies": [
"error",
{
"devDependencies": true
}
],
"no-unused-expressions": "off"
}
},
{
"files": [
"vitest.config.js"
],
"rules": {
"import/no-unresolved": "off"
}
},
{
"files": [
"**/*.ts"
],
"parser": "@typescript-eslint/parser",
"rules": {
"no-undef": "off"
}
}
]
},
"prettier": {
"singleQuote": true,
"arrowParens": "avoid",
"semi": false,
"bracketSpacing": false
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{js,ts}": [
"eslint --fix",
"prettier --write"
]
},
"name": "gramps-js",
"version": "26.10.1",
"description": "The frontend for the Gramps Web genealogical research system.",
"author": "David M. Straub",
"license": "AGPL",
"type": "module",
"dependencies": {
"@americana/diplomat": "^0.5.0",
"@awesome.me/webawesome": "^3.4.0",
"@hpcc-js/wasm": "^2.22.4",
"@material/material-color-utilities": "^0.4.0",
"@material/mwc-button": "^0.27.0",
"@material/mwc-circular-progress": "^0.27.0",
"@material/mwc-drawer": "^0.27.0",
"@material/mwc-linear-progress": "^0.27.0",
"@material/mwc-snackbar": "^0.27.0",
"@material/mwc-textfield": "^0.27.0",
"@material/mwc-top-app-bar": "^0.27.0",
"@material/web": "^2.2.0",
"@mdi/js": "^7.4.47",
"@openhistoricalmap/maplibre-gl-dates": "^1.3.0",
"@tmcw/togeojson": "7.1.2",
"d3": "^7.9.0",
"d3-array": "^3.2.4",
"d3-axis": "^3.0.0",
"d3-color": "^3.1.0",
"d3-hierarchy": "^3.1.2",
"d3-interpolate": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-scale-chromatic": "^3.1.0",
"d3-selection": "^3.0.0",
"d3-shape": "^3.2.0",
"d3-zoom": "^3.0.0",
"dayjs": "^1.11.13",
"dompurify": "^3.4.5",
"jsondiffpatch": "^0.7.6",
"jwt-decode": "^4.0.0",
"lit": "^3.2.1",
"maplibre-gl": "^5.22.0",
"marked": "^18.0.4",
"pwa-helper-components": "^0.2.10",
"pwa-helpers": "^0.9.1",
"tippy.js": "^6.3.7"
}
}