Compare commits

..

15 commits

Author SHA1 Message Date
Yohan Boniface
071a8c539d 3.0.3
Some checks failed
Test & Docs / tests (postgresql, 3.10) (push) Has been cancelled
Test & Docs / tests (postgresql, 3.12) (push) Has been cancelled
Test & Docs / lint (push) Has been cancelled
2025-04-11 18:09:14 +02:00
Yohan Boniface
ec8fa87b41 i18n 2025-04-11 17:33:22 +02:00
Yohan Boniface
ef072f0a8e
feat: allow to hide the back to home button (#2638) 2025-04-11 17:30:15 +02:00
Yohan Boniface
33f407fd60
feat: hidden download button in browser when embedControl=false (#2640)
cf #2629
2025-04-11 17:27:02 +02:00
David Larlet
324c5cf6bf feat: allow to hide the back to home button
Co-authored-by: Yohan Boniface <yohanboniface@free.fr>
2025-04-11 17:22:09 +02:00
Yohan Boniface
e53cdcb04e feat: hidden download button in browser when embedControl=false
cf #2629

Co-authored-by: David Larlet <david@larlet.fr>
2025-04-11 17:15:39 +02:00
David Larlet
5e3170891a
feat: allow to hide the layer switcher from bottom bar (#2639) 2025-04-11 10:58:54 -04:00
David Larlet
495286c261
feat: allow to hide the layer switcher from bottom bar 2025-04-11 10:44:01 -04:00
Yohan Boniface
15972bab3d
document that nginx needs to be added in Docker stack to serve statics (#2636) 2025-04-11 16:19:47 +02:00
Yohan Boniface
bd91934544
fix: do not try to remove a feature not yet added (#2637)
cf #2625

This happens while drawing a line or polygon and then hitting escape
while the path is not yet valid.
2025-04-11 16:19:29 +02:00
Yohan Boniface
581140e08a
fix: do not try to remove a feature not yet added
cf #2625

This happens while drawing a line or polygon and then hitting escape
while the path is not yet valid.
2025-04-11 10:02:31 -04:00
David Larlet
10f87c0b6e
fix: display search category on list page (#2635) 2025-04-11 08:24:07 -04:00
Yohan Boniface
0ec4e74f8f wip: add nginx in docker-compose.yml 2025-04-11 11:31:54 +02:00
Yohan Boniface
89033e04a2 chore: add a deploy overview doc page 2025-04-11 10:09:24 +02:00
David Larlet
38f4fd5bb3
fix: display search category on list page 2025-04-10 17:13:33 -04:00
54 changed files with 621 additions and 243 deletions

View file

@ -1,5 +1,5 @@
# This part installs deps needed at runtime.
FROM python:3.11-slim AS runtime
FROM python:3.12-slim AS common
RUN apt-get update && \
apt-get install -y --no-install-recommends \
@ -13,7 +13,7 @@ RUN apt-get update && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# This part adds deps needed only at buildtime.
FROM runtime AS build
FROM common AS build
RUN apt-get update && \
apt-get install -y --no-install-recommends \
@ -40,7 +40,7 @@ COPY . /srv/umap
RUN /venv/bin/pip install .[docker,s3,sync]
FROM runtime
FROM common
COPY --from=build /srv/umap/docker/ /srv/umap/docker/
COPY --from=build /venv/ /venv/

View file

@ -26,10 +26,10 @@ services:
condition: service_healthy
redis:
condition: service_healthy
image: umap/umap:3.0.0
ports:
- "${PORT-8000}:8000"
image: umap/umap:3.0.2
environment:
- STATIC_ROOT=/srv/umap/static
- MEDIA_ROOT=/srv/umap/uploads
- DATABASE_URL=postgis://postgres@db/postgres
- SECRET_KEY=some-long-and-weirdly-unrandom-secret-key
- SITE_URL=https://umap.local/
@ -39,7 +39,20 @@ services:
- REDIS_URL=redis://redis:6379
volumes:
- data:/srv/umap/uploads
- static:/srv/umap/static
proxy:
image: nginx:latest
ports:
- "8000:80"
volumes:
- ./docker/nginx.conf:/etc/nginx/nginx.conf:ro
- static:/static:ro
- data:/data:ro
depends_on:
- app
volumes:
data:
static:
db:

111
docker/nginx.conf Normal file
View file

@ -0,0 +1,111 @@
events {
worker_connections 1024; # Adjust this to your needs
}
http {
proxy_cache_path /tmp/nginx_ajax_proxy_cache levels=1:2 keys_zone=ajax_proxy:10m inactive=60m;
proxy_cache_key "$uri$is_args$args";
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
types {
application/javascript mjs;
}
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# Server block
server {
listen 80;
server_name localhost;
# Static file serving
location /static/ {
alias /static/;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
expires 365d;
access_log /dev/null;
}
# Geojson files
location /uploads/ {
alias /data/;
expires 30d;
}
location /favicon.ico {
alias /static/favicon.ico;
}
# X-Accel-Redirect
location /internal/ {
internal;
gzip_vary on;
gzip_static on;
add_header X-DataLayer-Version $upstream_http_x_datalayer_version;
alias /data/;
}
# Ajax proxy
location ~ ^/proxy/(.*) {
internal;
add_header X-Proxy-Cache $upstream_cache_status always;
proxy_cache_background_update on;
proxy_cache_use_stale updating;
proxy_cache ajax_proxy;
proxy_cache_valid 1m; # Default. Umap will override using X-Accel-Expires
set $target_url $1;
# URL is encoded, so we need a few hack to clean it back.
if ( $target_url ~ (.+)%3A%2F%2F(.+) ){ # fix :// between scheme and destination
set $target_url $1://$2;
}
if ( $target_url ~ (.+?)%3A(.*) ){ # fix : between destination and port
set $target_url $1:$2;
}
if ( $target_url ~ (.+?)%2F(.*) ){ # fix / after port, the rest will be decoded by proxy_pass
set $target_url $1/$2;
}
resolver 8.8.8.8;
add_header X-Proxy-Target $target_url; # For debugging
proxy_pass_request_headers off;
proxy_set_header Content-Type $http_content_type;
proxy_set_header Content-Encoding $http_content_encoding;
proxy_set_header Content-Length $http_content_length;
proxy_read_timeout 10s;
proxy_connect_timeout 5s;
proxy_ssl_server_name on;
proxy_pass $target_url;
proxy_intercept_errors on;
error_page 301 302 307 = @handle_proxy_redirect;
}
location @handle_proxy_redirect {
resolver 8.8.8.8;
set $saved_redirect_location '$upstream_http_location';
proxy_pass $saved_redirect_location;
}
# Proxy pass to ASGI server
location / {
proxy_pass http://app:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_redirect off;
proxy_buffering off;
}
}
}

View file

@ -1,5 +1,21 @@
# Changelog
## 3.0.3 - 2025-04-11
* do not try to remove a feature not yet added by @yohanboniface in #2637
* document that nginx needs to be added in Docker stack to serve statics by @yohanboniface in #2636
* display back help button in switch fields by @yohanboniface in #2634
* use Last-Modified header from remote data when available by @yohanboniface in #2624
* fix text overflow on search results by @yohanboniface in #2628
* redirect to user dashboard after map delete by @yohanboniface in #2626
* add missing margin-bottom in importers by @yohanboniface in #2627
* fix pictogram categories always hidden by @yohanboniface in #2630
* display search category on list page by @davidbgk in #2635
* allow to hide the layer switcher from bottom bar by @davidbgk in #2639
* hidden download button in browser when embedControl=false by @yohanboniface in #2640
* allow to hide the back to home button by @davidbgk in #2638
## 3.0.2 - 2025-04-08
* fix copiable input CSS by @yohanboniface in #2616
@ -32,6 +48,13 @@ Other notable changes:
Note: you may want to update your search index to include the category search,
see https://docs.umap-project.org/en/stable/config/settings/#umap_search_configuration
### Breaking change
* The Docker image will not serve assets and data files anymore, an Nginx container must
be configured. See [docker-compose.yml](https://github.com/umap-project/umap/blob/master/docker-compose.yml)
for an example.
### New features
* add collaborative real-time map editing
* add atomic undo redo by @yohanboniface in #2570

View file

@ -95,6 +95,12 @@ A switch will be available for them in the "advanced properties" of the map.
See [the documentation about ASGI deployment](../deploy/asgi.md) for more information.
#### REDIS_URL
Connection URL to the Redis server. Only need for the real-time editing.
Default: `redis://localhost:6379`
#### SECRET_KEY
Must be defined to something unique and secret.

View file

@ -1,84 +1,10 @@
# Configuring Nginx
Here are some configuration files to use umap with nginx and [uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/), a server for python, which will handle your processes for you.
See [WSGI](wsgi.md) or [ASGI](asgi.md) for a basic setup.
```nginx title="nginx.conf"
upstream umap {
server unix:///srv/umap/umap.sock;
}
Then consider adding this configuration
server {
# the port your site will be served on
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
# the domain name it will serve for
server_name your-domain.org;
charset utf-8;
# max upload size
client_max_body_size 5M; # adjust to taste
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass umap;
include /srv/umap/uwsgi_params;
}
}
```
## uWSGI
```nginx title="uwsgi_params"
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
```
```ini title="uwsgi.ini"
[uwsgi]
uid = umap
gid = users
# Python related settings
# the base directory (full path)
chdir = /srv/umap/
# umap's wsgi module
module = umap.wsgi
# the virtualenv (full path)
home = /srv/umap/venv
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# the socket (use the full path to be safe)
socket = /srv/umap/umap.sock
# ... with appropriate permissions - may be needed
chmod-socket = 666
stats = /srv/umap/stats.sock
# clear environment on exit
vacuum = true
plugins = python3
```
## Static files
## Static files and geojson
```nginx title="nginx.conf"
location /static {

37
docs/deploy/overview.md Normal file
View file

@ -0,0 +1,37 @@
# Deploying uMap
uMap is a python package, running [Django](https://docs.djangoproject.com/en/5.2/howto/deployment/),
so anyone experimented with this stack will find it familiar, but there are some speficic details
to know about.
## Data
One important design point of uMap is that while metadata are stored in a PostgreSQL database, the
data itself is stored in the file system, as geojson files. This design choice has been made
to make uMap scale better, as there are much more reads than writes, and when some
map is shared a lot (like on a national media) we want to be able to serve it without needing an
overcomplex and costly stack.
So when a request for data is made (that is on a *DataLayer*), the flow is that uMap will read
the request headers to check for permissions, and then it will forward the request to Nginx,
that will properly serve the data (a geojson file), without consuming a python worker, and with
much more efficiency than python.
In DEBUG mode, uMap will serve the geojson itself, but this is not recommended in production,
unless you have a very small audience.
Data can also be stored in a [S3 like storage](../config/storage/#using-s3).
## Assets (JS, CSS…)
As any web app, uMap also needs static files to be served. In DEBUG mode, Django will do this
kindly, but not in production. See [Nginx configuration](nginx.md) for this.
Assets can also be stored in a [S3 like storage](../config/storage/#using-s3).
## python app (metadata, permissions…)
uMap needs a python server, which can either be of [WSGI](wsgi.md) or [ASGI](asgi.md) (this later
is needed in order to use the collaborative live editing).
## Redis
Still when using the collaborative live editing, uMap needs a [Redis](../config/settings.md#redis_url) server, to act as pubsub.

87
docs/deploy/wsgi.md Normal file
View file

@ -0,0 +1,87 @@
# WSGI
WSGI is the historical standard to serve python in general, and uMap in this case.
From recently, uMap also supports [ASGI](asgi.md), which is required to use the
collaborative editing feature.
## uWSGI
In Nginx host, use:
```nginx title="nginx.conf"
upstream umap {
server unix:///srv/umap/umap.sock;
}
server {
# the port your site will be served on
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
# the domain name it will serve for
server_name your-domain.org;
charset utf-8;
# max upload size
client_max_body_size 5M; # adjust to taste
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass umap;
include /srv/umap/uwsgi_params;
}
}
```
```nginx title="uwsgi_params"
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
```
```ini title="uwsgi.ini"
[uwsgi]
uid = umap
gid = users
# Python related settings
# the base directory (full path)
chdir = /srv/umap/
# umap's wsgi module
module = umap.wsgi
# the virtualenv (full path)
home = /srv/umap/venv
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# the socket (use the full path to be safe)
socket = /srv/umap/umap.sock
# ... with appropriate permissions - may be needed
chmod-socket = 666
stats = /srv/umap/stats.sock
# clear environment on exit
vacuum = true
plugins = python3
```
See also [Django documentation](https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/).

View file

@ -18,10 +18,12 @@ nav:
- Storage: config/storage.md
- Icon packs: config/icons.md
- Deployment:
- Overview: deploy/overview.md
- Docker: deploy/docker.md
- Helm: deploy/helm.md
- Nginx: deploy/nginx.md
- ASGI: deploy/asgi.md
- WSGI: deploy/wsgi.md
- Changelog: changelog.md
theme:
name: material

View file

@ -1 +1 @@
VERSION = "3.0.2"
VERSION = "3.0.3"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-04 16:49+0000\n"
"POT-Creation-Date: 2025-04-11 15:30+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -663,7 +663,11 @@ msgstr[1] ""
msgid "No map found."
msgstr ""
#: templates/umap/search.html:35
#: templates/umap/search.html:36
msgid "Latest created maps in category"
msgstr ""
#: templates/umap/search.html:43
msgid "Latest created maps"
msgstr ""
@ -784,25 +788,25 @@ msgstr ""
msgid "Only its owner can delete the map."
msgstr ""
#: views.py:1051
#: views.py:1054
msgid "Map successfully deleted."
msgstr ""
#: views.py:1077
#: views.py:1080
#, python-format
msgid ""
"Your map has been cloned! If you want to edit this map from another "
"computer, please use this link: %(anonymous_url)s"
msgstr ""
#: views.py:1082
#: views.py:1085
msgid "Congratulations, your map has been cloned!"
msgstr ""
#: views.py:1336
#: views.py:1339
msgid "Layer successfully deleted."
msgstr ""
#: views.py:1358
#: views.py:1361
msgid "Permissions updated with success!"
msgstr ""

Binary file not shown.

View file

@ -24,7 +24,7 @@ msgid ""
msgstr ""
"Project-Id-Version: uMap\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-04 16:49+0000\n"
"POT-Creation-Date: 2025-04-11 15:30+0000\n"
"PO-Revision-Date: 2013-11-22 14:00+0000\n"
"Last-Translator: yohanboniface <yohanboniface@free.fr>, 2013-2014,2018-2019,2023-2025\n"
"Language-Team: French (http://app.transifex.com/openstreetmap/umap/language/fr/)\n"
@ -682,7 +682,11 @@ msgstr[2] "%(count)s cartes trouvées :"
msgid "No map found."
msgstr "Aucune carte trouvée."
#: templates/umap/search.html:35
#: templates/umap/search.html:36
msgid "Latest created maps in category"
msgstr "Dernières cartes créées dans la catégorie"
#: templates/umap/search.html:43
msgid "Latest created maps"
msgstr "Dernières cartes créées."
@ -803,25 +807,25 @@ msgstr "Courriel envoyé à %(email)s"
msgid "Only its owner can delete the map."
msgstr "Seul le créateur de la carte peut la supprimer."
#: views.py:1051
#: views.py:1054
msgid "Map successfully deleted."
msgstr "La carte a bien été supprimée."
#: views.py:1077
#: views.py:1080
#, python-format
msgid ""
"Your map has been cloned! If you want to edit this map from another "
"computer, please use this link: %(anonymous_url)s"
msgstr "Votre carte a été dupliquée ! Si vous souhaitez la modifier depuis un autre ordinateur, veuillez utiliser ce lien : %(anonymous_url)s"
#: views.py:1082
#: views.py:1085
msgid "Congratulations, your map has been cloned!"
msgstr "Votre carte a été dupliquée !"
#: views.py:1336
#: views.py:1339
msgid "Layer successfully deleted."
msgstr "Calque supprimé."
#: views.py:1358
#: views.py:1361
msgid "Permissions updated with success!"
msgstr "Les permissions ont bien été modifiées !"

Binary file not shown.

View file

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: uMap\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-03 17:36+0000\n"
"POT-Creation-Date: 2025-04-11 15:30+0000\n"
"PO-Revision-Date: 2013-11-22 14:00+0000\n"
"Last-Translator: Gideon van Melle <translations@gvmelle.com>, 2025\n"
"Language-Team: Dutch (http://app.transifex.com/openstreetmap/umap/language/nl/)\n"
@ -38,137 +38,205 @@ msgstr "Site is 'alleen lezen' wegens onderhoud"
msgid ""
"Using “%(name)s” to authenticate is deprecated and will be removed soon. "
"Please configure another provider below before losing access to your account"
" and maps."
msgstr ""
" and maps. Then, please logout and login again with the new provider."
msgstr "Het gebruik van %(name)s om te verifiëren is afgeschaft en zal binnenkort worden verwijderd. Configureer hieronder een andere provider voordat u de toegang tot uw account en kaarten verliest. Log uit en log opnieuw in met de nieuwe provider."
#: models.py:60 models.py:79
#: models.py:61 models.py:80
msgid "name"
msgstr "naam"
#: models.py:62 models.py:485
#: models.py:63 models.py:493
msgid "description"
msgstr "omschrijving"
#: models.py:110
#: models.py:111
msgid "details"
msgstr "details"
#: models.py:111
#: models.py:112
msgid "Link to a page where the licence is detailed."
msgstr "Link naar pagina waar de licentie details staan"
#: models.py:121
#: models.py:122
msgid "URL template using OSM tile format"
msgstr "URL-sjabloon met OSM tegel-formaat"
#: models.py:127
#: models.py:128
msgid "Order of the tilelayers in the edit box"
msgstr "Volgorde van de tegel-lagen in het bewerkingsvak."
#: models.py:175 models.py:479
#: models.py:176 models.py:487
msgid "Only editable with secret edit link"
msgstr "Alleen te bewerken met een geheime link"
#: models.py:176 models.py:480
#: models.py:177 models.py:488
msgid "Everyone can edit"
msgstr "Iedereen kan wijzigingen maken"
#: models.py:179 models.py:473
#: models.py:180 models.py:481
msgid "Everyone"
msgstr "Iedereen"
#: models.py:180 models.py:189 models.py:474
#: models.py:181 models.py:190 models.py:482
msgid "Editors and team only"
msgstr "Alleen redacteuren en team"
#: models.py:181 models.py:475
#: models.py:182 models.py:483
msgid "Owner only"
msgstr "Alleen eigenaar"
#: models.py:184
#: models.py:185
msgid "Draft (private)"
msgstr "Ontwerp (privé)"
#: models.py:185
#: models.py:186
msgid "Everyone (public)"
msgstr "Iedereen (openbaar)"
#: models.py:188
#: models.py:189
msgid "Anyone with link"
msgstr "Iedereen met een link"
#: models.py:190
#: models.py:191
msgid "Blocked"
msgstr "geblokkeerd"
#: models.py:191 models.py:469
#: models.py:192 models.py:477
msgid "Deleted"
msgstr "Verwijderd"
#: models.py:194
#: models.py:195
msgid "center"
msgstr "centreer"
#: models.py:195
#: models.py:196
msgid "zoom"
msgstr "zoom"
#: models.py:197
#: models.py:198
msgid "locate"
msgstr "zoek"
#: models.py:197
#: models.py:198
msgid "Locate user on load?"
msgstr "Gebruiker zoeken tijdens laden?"
#: models.py:201
#: models.py:202
msgid "Choose the map licence."
msgstr "Kies de kaartlicentie"
#: models.py:202
#: models.py:203
msgid "licence"
msgstr "Licentie"
#: models.py:213
#: models.py:214
msgid "owner"
msgstr "eigenaar"
#: models.py:217
#: models.py:218
msgid "editors"
msgstr "editors"
#: models.py:223
#: models.py:224
msgid "team"
msgstr "team"
#: models.py:229 models.py:501
#: models.py:230 models.py:509
msgid "edit status"
msgstr "wijzig status"
#: models.py:234 models.py:506
#: models.py:235 models.py:514
msgid "share status"
msgstr "deel status"
#: models.py:237 models.py:496
#: models.py:238 models.py:504
msgid "settings"
msgstr "instellingen"
#: models.py:407
#: models.py:410
msgid "Clone of"
msgstr "Kopie van"
#: models.py:468 models.py:472 models.py:478
#: models.py:476 models.py:480 models.py:486
msgid "Inherit"
msgstr "overerven"
#: models.py:491
#: models.py:499
msgid "display on load"
msgstr "toon tijdens laden"
#: models.py:492
#: models.py:500
msgid "Display this layer on load."
msgstr "Toon deze laag tijdens laden."
#: settings/base.py:295
msgid "Art and Culture"
msgstr "Kunst en cultuur"
#: settings/base.py:296
msgid "Cycling"
msgstr "Fietsen"
#: settings/base.py:297
msgid "Business"
msgstr "Zakelijk"
#: settings/base.py:298
msgid "Environment"
msgstr "Mlieu"
#: settings/base.py:299
msgid "Education"
msgstr "Educatie"
#: settings/base.py:300
msgid "Food and Agriculture"
msgstr "Voedsel en landbouw"
#: settings/base.py:301
msgid "Geopolitics"
msgstr "Geopolitiek"
#: settings/base.py:302
msgid "Health"
msgstr "Gezondheid"
#: settings/base.py:303
msgid "Hiking"
msgstr "Hiking"
#: settings/base.py:304
msgid "History"
msgstr "Geschiedenis"
#: settings/base.py:305
msgid "Public sector"
msgstr "Publieke sector"
#: settings/base.py:306
msgid "Science"
msgstr "Wetenschap"
#: settings/base.py:307
msgid "Shopping"
msgstr "Winkelen"
#: settings/base.py:308
msgid "Sport and Leisure"
msgstr "Sport en vrijetijd"
#: settings/base.py:309
msgid "Travel"
msgstr "Reizen"
#: settings/base.py:310
msgid "Transports"
msgstr "Transport"
#: settings/base.py:311
msgid "Tourism"
msgstr "Toerisme"
#: templates/403.html:8
msgid ""
"<a href=\"https://discover.umap-project.org/support/faq/#map-statuses\" "
@ -421,7 +489,7 @@ msgstr "Mijn teams"
msgid "Map of the uMaps"
msgstr "Kaart van de uMaps"
#: templates/umap/home.html:24
#: templates/umap/home.html:25
msgid "Get inspired, browse maps"
msgstr "Laat u inspireren, blader door kaarten"
@ -429,11 +497,15 @@ msgstr "Laat u inspireren, blader door kaarten"
msgid "You are logged in. Continuing..."
msgstr "U bent ingelogd. Ga verder..."
#: templates/umap/map_list.html:11 views.py:437
#: templates/umap/map_list.html:18 views.py:444
msgid "by"
msgstr "door"
#: templates/umap/map_list.html:20
#: templates/umap/map_list.html:22
msgid "See the map"
msgstr "Zie de kaart"
#: templates/umap/map_list.html:28
msgid "More"
msgstr "Meer"
@ -592,11 +664,15 @@ msgid_plural "%(count)s maps found:"
msgstr[0] "%(count)s kaarten gevonden:"
msgstr[1] "%(count)s kaarten gevonden:"
#: templates/umap/search.html:28
#: templates/umap/search.html:30
msgid "No map found."
msgstr "Geen kaart gevonden."
#: templates/umap/search.html:33
#: templates/umap/search.html:36
msgid "Latest created maps in category"
msgstr ""
#: templates/umap/search.html:43
msgid "Latest created maps"
msgstr "Laatste gemaakte kaarten"
@ -604,7 +680,11 @@ msgstr "Laatste gemaakte kaarten"
msgid "Search maps"
msgstr "Zoek kaarten"
#: templates/umap/search_bar.html:16
#: templates/umap/search_bar.html:14
msgid "Any category"
msgstr "Elke categorie"
#: templates/umap/search_bar.html:19
msgid "Search"
msgstr "Zoeken"
@ -668,70 +748,70 @@ msgstr "Gebruikers"
msgid "New team"
msgstr "Nieuw Team"
#: views.py:234
#: views.py:235
msgid "Cannot delete a team with more than one member"
msgstr "Kan een team met meer dan één lid niet verwijderen"
#: views.py:238
#: views.py:239
#, python-format
msgid "Team “%(name)s” has been deleted"
msgstr "Team “%(name)s” is verwijderd"
#: views.py:442
#: views.py:449
msgid "View the map"
msgstr "Bekijk de kaart"
#: views.py:838
#: views.py:845
msgid "See full screen"
msgstr "Volledig scherm weergeven"
#: views.py:981
#: views.py:988
msgid "Map editors updated with success!"
msgstr "Kaarteditors met succes bijgewerkt!"
#: views.py:1017
#: views.py:1024
#, python-format
msgid "The uMap edit link for your map: %(map_name)s"
msgstr "De uMap-bewerkingslink voor uw kaart: %(map_name)s"
#: views.py:1020
#: views.py:1027
#, python-format
msgid "Here is your secret edit link: %(link)s"
msgstr "Hier is je geheime bewerkingslink: %(link)s"
#: views.py:1027
#: views.py:1034
#, python-format
msgid "Can't send email to %(email)s"
msgstr "Kan geen e-mail verzenden naar %(email)s"
#: views.py:1030
#: views.py:1037
#, python-format
msgid "Email sent to %(email)s"
msgstr "E-mail verzonden naar %(email)s"
#: views.py:1041
#: views.py:1048
msgid "Only its owner can delete the map."
msgstr "Kaart kan alleen door eigenaar worden verwijderd."
#: views.py:1044
#: views.py:1054
msgid "Map successfully deleted."
msgstr "Kaart succesvol verwijderd."
#: views.py:1070
#: views.py:1080
#, python-format
msgid ""
"Your map has been cloned! If you want to edit this map from another "
"computer, please use this link: %(anonymous_url)s"
msgstr "Uw kaart is gekopieerd! Als u deze kaart wilt wijzigen vanaf een andere computer, gebruik dan deze link: %(anonymous_url)s"
#: views.py:1075
#: views.py:1085
msgid "Congratulations, your map has been cloned!"
msgstr "Gefeliciteerd, uw kaart is gekopieerd!"
#: views.py:1329
#: views.py:1339
msgid "Layer successfully deleted."
msgstr "Laag is verwijderd."
#: views.py:1351
#: views.py:1361
msgid "Permissions updated with success!"
msgstr "Machtigingen met succes bijgewerkt!"

View file

@ -164,8 +164,8 @@ LOGIN_REDIRECT_URL = "login_popup_end"
STATIC_URL = "/static/"
MEDIA_URL = "/uploads/"
STATIC_ROOT = os.path.join("static")
MEDIA_ROOT = os.path.join("uploads")
STATIC_ROOT = env("STATIC_ROOT", default=os.path.join("static"))
MEDIA_ROOT = env("MEDIA_ROOT", default=os.path.join("uploads"))
STATICFILES_FINDERS = [
"django.contrib.staticfiles.finders.FileSystemFinder",

View file

@ -235,3 +235,7 @@ dt {
display: block;
overflow-x: auto;
}
mark {
background-color: var(--color-lightCyan);
padding: 0 var(--small-box-padding);
}

View file

@ -167,7 +167,7 @@
.umap-caption-bar .umap-map-author {
margin-inline-end: 10px;
}
.umap-caption-bar > button + button:after,
.umap-caption-bar:has(select:not([hidden])) > button + button:after,
.umap-caption-bar > button + button:before {
content: '|';
padding-inline-start: 10px;

View file

@ -232,6 +232,7 @@ export default class Browser {
toggle.addEventListener('click', () => this.toggleLayers())
fitBounds.addEventListener('click', () => this._umap.fitDataBounds())
download.addEventListener('click', () => this.downloadVisible(download))
download.hidden = this._umap.getProperty('embedControl') === false
}
downloadVisible(element) {

View file

@ -418,6 +418,10 @@ export class DataLayer {
removeFeature(feature, sync) {
const id = stamp(feature)
// This feature was not yet added, may be after
// hitting Escape while drawing a new line or
// polygon, not yet valid (not enough points)
if (!this._index.includes(id)) return
if (sync !== false) {
const oldValue = feature.toGeoJSON()
feature.sync.delete(oldValue)

View file

@ -23,6 +23,7 @@ BaseMap.mergeOptions({
const ControlsMixin = {
HIDDABLE_CONTROLS: [
'home',
'zoom',
'search',
'fullscreen',
@ -41,6 +42,7 @@ const ControlsMixin = {
if (this._umap.hasEditMode() && !this.options.noControl) {
new U.EditControl(this).addTo(this)
}
this._controls.home = new U.HomeControl(this._umap)
this._controls.zoom = new Control.Zoom({
zoomInTitle: translate('Zoom in'),
zoomOutTitle: translate('Zoom out'),
@ -91,10 +93,6 @@ const ControlsMixin = {
}
if (this.options.noControl) return
// Do not display in an iframe.
if (window.self === window.top) {
this._controls.home = new U.HomeControl().addTo(this)
}
this._controls.attribution = new U.AttributionControl().addTo(this)
if (this.options.miniMap) {
this.whenReady(function () {

View file

@ -204,6 +204,12 @@ export const SCHEMA = {
type: Object,
impacts: ['data'],
},
homeControl: {
type: Boolean,
impacts: ['ui'],
label: translate('Display the back to home icon'),
default: true,
},
iconClass: {
type: String,
impacts: ['data'],
@ -275,6 +281,12 @@ export const SCHEMA = {
label: translate('Label key'),
inheritable: true,
},
layerSwitcher: {
type: Boolean,
impacts: ['ui'],
label: translate('Do you want to display layer switcher in caption bar?'),
default: true,
},
licence: {
type: String,
impacts: ['ui'],

View file

@ -180,7 +180,7 @@ const BOTTOM_BAR_TEMPLATE = `
<button class="umap-about-link flat" type="button" title="${translate('Open caption')}" data-ref="caption">${translate('Open caption')}</button>
<button class="umap-open-browser-link flat" type="button" title="${translate('Browse data')}" data-ref="browse">${translate('Browse data')}</button>
<button class="umap-open-browser-link flat" type="button" title="${translate('Filter data')}" data-ref="filter">${translate('Filter data')}</button>
<select data-ref=layers></select>
<select data-ref="layers"></select>
</div>
`
@ -233,7 +233,7 @@ export class BottomBar extends WithTemplate {
this.elements.layers.hidden = true
} else {
this.elements.layers.appendChild(Utils.loadTemplate(`<option value=""></option>`))
this.elements.layers.hidden = false
this.elements.layers.hidden = !this._umap.getProperty('layerSwitcher')
const visible = datalayers.filter((datalayer) => datalayer.isVisible())
for (const datalayer of datalayers) {
const selected = visible.length === 1 && datalayer.isVisible() ? 'selected' : ''

View file

@ -106,6 +106,11 @@ export default class Umap {
if (geojson.properties.schema) this.overrideSchema(geojson.properties.schema)
// Do not display in an iframe.
if (window.self !== window.top) {
geojson.properties.homeControl = false
}
this._leafletMap.setup()
this.panel = new Panel(this, this._leafletMap)
@ -828,6 +833,7 @@ export default class Umap {
UIFields.push(`properties.${name}Control`)
}
UIFields = UIFields.concat([
'properties.homeControl',
'properties.moreControl',
'properties.scrollWheelZoom',
'properties.miniMap',
@ -836,6 +842,7 @@ export default class Umap {
'properties.displayPopupFooter',
'properties.captionBar',
'properties.captionMenus',
'properties.layerSwitcher',
])
const builder = new MutatingForm(this, UIFields, { umap: this })
const controlsOptions = DomUtil.createFieldset(

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Vyberte tuto datovou sadu",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: tematická data z OpenStreetMap",
"Choose a theme": "Vyberte si téma",
"Symplify all geometries to points": "Zjednodušte všechny geometrie na body",
"Choose this data": "Zvolte tato data",
"Search admin boundary": "Hledat hranici správce",
"Please choose a theme and a boundary first.": "Nejprve si vyberte téma a hranice.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("cs_CZ", locale)
L.setLocale("cs_CZ")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Vyberte tuto datovou sadu",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: tematická data z OpenStreetMap",
"Choose a theme": "Vyberte si téma",
"Symplify all geometries to points": "Zjednodušte všechny geometrie na body",
"Choose this data": "Zvolte tato data",
"Search admin boundary": "Hledat hranici správce",
"Please choose a theme and a boundary first.": "Nejprve si vyberte téma a hranice.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Diesen Datensatz auswählen",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: thematische Daten von OpenStreetMap",
"Choose a theme": "Thema auswählen",
"Symplify all geometries to points": "Alle Geometrien zu Punkten vereinfachen",
"Choose this data": "Diese Daten auswählen",
"Search admin boundary": "Administrative Grenze suchen",
"Please choose a theme and a boundary first.": "Bitte wähle zuerst ein Thema und eine administrative Grenze.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("de", locale)
L.setLocale("de")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Diesen Datensatz auswählen",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: thematische Daten von OpenStreetMap",
"Choose a theme": "Thema auswählen",
"Symplify all geometries to points": "Alle Geometrien zu Punkten vereinfachen",
"Choose this data": "Diese Daten auswählen",
"Search admin boundary": "Administrative Grenze suchen",
"Please choose a theme and a boundary first.": "Bitte wähle zuerst ein Thema und eine administrative Grenze.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Choose this dataset",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: thematic data from OpenStreetMap",
"Choose a theme": "Choose a theme",
"Symplify all geometries to points": "Symplify all geometries to points",
"Choose this data": "Choose this data",
"Search admin boundary": "Search admin boundary",
"Please choose a theme and a boundary first.": "Please choose a theme and a boundary first.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("en", locale)
L.setLocale("en")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Choose this dataset",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: thematic data from OpenStreetMap",
"Choose a theme": "Choose a theme",
"Symplify all geometries to points": "Symplify all geometries to points",
"Choose this data": "Choose this data",
"Search admin boundary": "Search admin boundary",
"Please choose a theme and a boundary first.": "Please choose a theme and a boundary first.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Elegir este conjunto de datos",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: datos temáticos de OpenStreetMap",
"Choose a theme": "Elegir un tema",
"Symplify all geometries to points": "Simplificar todas las geometrías a puntos",
"Choose this data": "Elegir estos datos",
"Search admin boundary": "Buscar límite administrativo",
"Please choose a theme and a boundary first.": "Primero elige un tema y un límite.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("es", locale)
L.setLocale("es")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Elegir este conjunto de datos",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: datos temáticos de OpenStreetMap",
"Choose a theme": "Elegir un tema",
"Symplify all geometries to points": "Simplificar todas las geometrías a puntos",
"Choose this data": "Elegir estos datos",
"Search admin boundary": "Buscar límite administrativo",
"Please choose a theme and a boundary first.": "Primero elige un tema y un límite.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Aukeratu datu-multzo hau",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: OpenStreetMap-eko datu tematikoak",
"Choose a theme": "Aukeratu gai bat",
"Symplify all geometries to points": "Sinplifikatu geometria guztiak puntutan",
"Choose this data": "Aukeratu datu hauek",
"Search admin boundary": "Bilatu muga administratiboa",
"Please choose a theme and a boundary first.": "Aukeratu gai bat eta muga bat.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("eu", locale)
L.setLocale("eu")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Aukeratu datu-multzo hau",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: OpenStreetMap-eko datu tematikoak",
"Choose a theme": "Aukeratu gai bat",
"Symplify all geometries to points": "Sinplifikatu geometria guztiak puntutan",
"Choose this data": "Aukeratu datu hauek",
"Search admin boundary": "Bilatu muga administratiboa",
"Please choose a theme and a boundary first.": "Aukeratu gai bat eta muga bat.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "انتخاب این مجموعه‌داده",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine:داده‌های موضوعی از اوپن‌استریت‌مپ",
"Choose a theme": "یک موضوع انتخاب کنید",
"Symplify all geometries to points": "همهٔ هندسه‌ها به نقطه ساده شوند",
"Choose this data": "انتخاب این داده",
"Search admin boundary": "جستجوی تقسیمات (admin boundary)",
"Please choose a theme and a boundary first.": "لطفاً ابتدا یک موضوع و یک تقسیمات انتخاب کنید.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("fa_IR", locale)
L.setLocale("fa_IR")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "انتخاب این مجموعه‌داده",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine:داده‌های موضوعی از اوپن‌استریت‌مپ",
"Choose a theme": "یک موضوع انتخاب کنید",
"Symplify all geometries to points": "همهٔ هندسه‌ها به نقطه ساده شوند",
"Choose this data": "انتخاب این داده",
"Search admin boundary": "جستجوی تقسیمات (admin boundary)",
"Please choose a theme and a boundary first.": "لطفاً ابتدا یک موضوع و یک تقسیمات انتخاب کنید.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Choisir ce jeu de données",
"GeoDataMine: thematic data from OpenStreetMap": "GéoDataMine : données thématiques à partir d'OpenStreetMap",
"Choose a theme": "Choisir un thème",
"Symplify all geometries to points": "Simplifier les géométries en points",
"Choose this data": "Choisir ces données",
"Search admin boundary": "Chercher une limite administrative",
"Please choose a theme and a boundary first.": "Merci de choisir un thème et une limite administrative.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Catégories",
"Geocode": "Géocoder"
"Geocode": "Géocoder",
"Display the back to home icon": "Afficher le bouton de retour à l'accueil",
"Do you want to display layer switcher in caption bar?": "Afficher un sélecteur de calques dans la barre de légende ?",
"Simplify all geometries to points": "Simplifier les géométries en points"
}
L.registerLocale("fr", locale)
L.setLocale("fr")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Choisir ce jeu de données",
"GeoDataMine: thematic data from OpenStreetMap": "GéoDataMine : données thématiques à partir d'OpenStreetMap",
"Choose a theme": "Choisir un thème",
"Symplify all geometries to points": "Simplifier les géométries en points",
"Choose this data": "Choisir ces données",
"Search admin boundary": "Chercher une limite administrative",
"Please choose a theme and a boundary first.": "Merci de choisir un thème et une limite administrative.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Catégories",
"Geocode": "Géocoder"
"Geocode": "Géocoder",
"Display the back to home icon": "Afficher le bouton de retour à l'accueil",
"Do you want to display layer switcher in caption bar?": "Afficher un sélecteur de calques dans la barre de légende ?",
"Simplify all geometries to points": "Simplifier les géométries en points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Escoller este conxunto de datos",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: datos temáticos de OpenStreetMap",
"Choose a theme": "Escoller un tema",
"Symplify all geometries to points": "Simplificar todas as xeometrías a puntos",
"Choose this data": "Escoller estes datos",
"Search admin boundary": "Buscar un límite administrativo",
"Please choose a theme and a boundary first.": "Escolle primeiro un tema e un límite.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("gl", locale)
L.setLocale("gl")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Escoller este conxunto de datos",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: datos temáticos de OpenStreetMap",
"Choose a theme": "Escoller un tema",
"Symplify all geometries to points": "Simplificar todas as xeometrías a puntos",
"Choose this data": "Escoller estes datos",
"Search admin boundary": "Buscar un límite administrativo",
"Please choose a theme and a boundary first.": "Escolle primeiro un tema e un límite.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Ezen adatkészlet kiválasztása",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: tematikus adatok az OpenStreetMap-ről",
"Choose a theme": "Téma kiválasztása",
"Symplify all geometries to points": "Az összes alakzat egyszerűsítése pontokká",
"Choose this data": "Ezen adatok kiválasztása",
"Search admin boundary": "Közigazgatási határ keresése",
"Please choose a theme and a boundary first.": "Először válasszon ki egy témát és egy határt.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("hu", locale)
L.setLocale("hu")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Ezen adatkészlet kiválasztása",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: tematikus adatok az OpenStreetMap-ről",
"Choose a theme": "Téma kiválasztása",
"Symplify all geometries to points": "Az összes alakzat egyszerűsítése pontokká",
"Choose this data": "Ezen adatok kiválasztása",
"Search admin boundary": "Közigazgatási határ keresése",
"Please choose a theme and a boundary first.": "Először válasszon ki egy témát és egy határt.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Scegli questo dataset",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: thematic data from OpenStreetMap",
"Choose a theme": "Seleziona un tema",
"Symplify all geometries to points": "Semplifica tutte le geometrie in punti",
"Choose this data": "Seleziona questi dati",
"Search admin boundary": "Cerca confini amministrativi",
"Please choose a theme and a boundary first.": "Please choose a theme and a boundary first.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("it", locale)
L.setLocale("it")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Scegli questo dataset",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: thematic data from OpenStreetMap",
"Choose a theme": "Seleziona un tema",
"Symplify all geometries to points": "Semplifica tutte le geometrie in punti",
"Choose this data": "Seleziona questi dati",
"Search admin boundary": "Cerca confini amministrativi",
"Please choose a theme and a boundary first.": "Please choose a theme and a boundary first.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Kies deze dataset",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: thematische data van OpenStreetMap",
"Choose a theme": "Kies een thema",
"Symplify all geometries to points": "Symplificeer alle geometrieën tot punten",
"Choose this data": "Kies deze data",
"Search admin boundary": "Zoeken administrative grens",
"Please choose a theme and a boundary first.": "Kies eerst een thema en een grens.",
@ -528,17 +527,20 @@ const locale = {
"Edit map default view": "Standaardweergave van de kaart bewerken",
"Use current center and zoom": "Gebruik huidig centrum en zoomniveau",
"Layer permalink": "Permalink-laag",
"Back to home": "Back to home",
"Home logo": "Home logo",
"Add this geometry to my map": "Add this geometry to my map",
"Add this place to my map": "Add this place to my map",
"Cancel last edit": "Cancel last edit",
"Redo last edit": "Redo last edit",
"Links": "Links",
"Images": "Images",
"Back to home": "Terug naar thuispagina",
"Home logo": "Thuispagina logo",
"Add this geometry to my map": "Voeg deze geometrie toe aan mijn kaart",
"Add this place to my map": "Voeg deze plaats toe aan mijn kaart",
"Cancel last edit": "Laatste bewerking annuleren",
"Redo last edit": "Laatste bewerking opnieuw uitvoeren",
"Links": "Koppelingen",
"Images": "Afbeeldingen",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("nl", locale)
L.setLocale("nl")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Kies deze dataset",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: thematische data van OpenStreetMap",
"Choose a theme": "Kies een thema",
"Symplify all geometries to points": "Symplificeer alle geometrieën tot punten",
"Choose this data": "Kies deze data",
"Search admin boundary": "Zoeken administrative grens",
"Please choose a theme and a boundary first.": "Kies eerst een thema en een grens.",
@ -528,15 +527,18 @@
"Edit map default view": "Standaardweergave van de kaart bewerken",
"Use current center and zoom": "Gebruik huidig centrum en zoomniveau",
"Layer permalink": "Permalink-laag",
"Back to home": "Back to home",
"Home logo": "Home logo",
"Add this geometry to my map": "Add this geometry to my map",
"Add this place to my map": "Add this place to my map",
"Cancel last edit": "Cancel last edit",
"Redo last edit": "Redo last edit",
"Links": "Links",
"Images": "Images",
"Back to home": "Terug naar thuispagina",
"Home logo": "Thuispagina logo",
"Add this geometry to my map": "Voeg deze geometrie toe aan mijn kaart",
"Add this place to my map": "Voeg deze plaats toe aan mijn kaart",
"Cancel last edit": "Laatste bewerking annuleren",
"Redo last edit": "Laatste bewerking opnieuw uitvoeren",
"Links": "Koppelingen",
"Images": "Afbeeldingen",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Escolher este conjunto de dados",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: dados temáticos do OpenStreetMap",
"Choose a theme": "Escolher um tema",
"Symplify all geometries to points": "Simplificar todas as geometrias para pontos",
"Choose this data": "Selecionar estes dados",
"Search admin boundary": "Pesquisar limite administrativo",
"Please choose a theme and a boundary first.": "Escolha primeiro um tema e um limite.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("pt", locale)
L.setLocale("pt")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Escolher este conjunto de dados",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: dados temáticos do OpenStreetMap",
"Choose a theme": "Escolher um tema",
"Symplify all geometries to points": "Simplificar todas as geometrias para pontos",
"Choose this data": "Selecionar estes dados",
"Search admin boundary": "Pesquisar limite administrativo",
"Please choose a theme and a boundary first.": "Escolha primeiro um tema e um limite.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "Escolher este conjunto de dados",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: dados temáticos do OpenStreetMap",
"Choose a theme": "Escolher um tema",
"Symplify all geometries to points": "Simplificar todas as geometrias para pontos",
"Choose this data": "Escolher estes dados",
"Search admin boundary": "Pesquisar limites administrativos",
"Please choose a theme and a boundary first.": "Escolha primeiro um tema e um limite.",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("pt_PT", locale)
L.setLocale("pt_PT")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "Escolher este conjunto de dados",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: dados temáticos do OpenStreetMap",
"Choose a theme": "Escolher um tema",
"Symplify all geometries to points": "Simplificar todas as geometrias para pontos",
"Choose this data": "Escolher estes dados",
"Search admin boundary": "Pesquisar limites administrativos",
"Please choose a theme and a boundary first.": "Escolha primeiro um tema e um limite.",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -457,7 +457,6 @@ const locale = {
"Choose this dataset": "選擇這個資料集",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine從開放街圖來的主題資料",
"Choose a theme": "選擇主題",
"Symplify all geometries to points": "簡化所有地理範圍的節點",
"Choose this data": "選擇這個資料",
"Search admin boundary": "搜尋行政邊界",
"Please choose a theme and a boundary first.": "請先選擇主題與邊界。",
@ -538,7 +537,10 @@ const locale = {
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}
L.registerLocale("zh_TW", locale)
L.setLocale("zh_TW")

View file

@ -457,7 +457,6 @@
"Choose this dataset": "選擇這個資料集",
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine從開放街圖來的主題資料",
"Choose a theme": "選擇主題",
"Symplify all geometries to points": "簡化所有地理範圍的節點",
"Choose this data": "選擇這個資料",
"Search admin boundary": "搜尋行政邊界",
"Please choose a theme and a boundary first.": "請先選擇主題與邊界。",
@ -538,5 +537,8 @@
"Images": "Images",
"Iframes": "Iframes",
"Tags": "Tags",
"Geocode": "Geocode"
"Geocode": "Geocode",
"Display the back to home icon": "Display the back to home icon",
"Do you want to display layer switcher in caption bar?": "Do you want to display layer switcher in caption bar?",
"Simplify all geometries to points": "Simplify all geometries to points"
}

View file

@ -32,7 +32,16 @@
{% endif %}
{% else %}
<h2>
{% if request.GET.tags %}
{% trans "Latest created maps in category" %}
{% for value, label in UMAP_TAGS %}
{% if request.GET.tags == value %}
<mark>{{ label }}</mark>:
{% endif %}
{% endfor %}
{% else %}
{% trans "Latest created maps" %}
{% endif %}
</h2>
<div class="grid-container">
{% include "umap/map_list.html" with prefix="search_map" %}

View file

@ -69,13 +69,7 @@ def test_zoomcontrol_impacts_ui(live_server, page, tilelayer):
# Hide them
page.get_by_text("User interface options").click()
hide_zoom_controls = (
page.locator(".panel")
.filter(has_text=re.compile("Display the zoom control"))
.locator("label")
.nth(2)
)
hide_zoom_controls.click()
page.locator(".panel .umap-field-zoomControl").get_by_text("never").click()
expect(zoom_in).to_be_hidden()
expect(zoom_out).to_be_hidden()