Compare commits
No commits in common. "master" and "3.0.0" have entirely different histories.
26
.github/workflows/release-helm.yml
vendored
|
@ -1,26 +0,0 @@
|
|||
name: Release Charts
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
release:
|
||||
# depending on default permission settings for your org (contents being read-only or read-write for workloads), you will have to add permissions
|
||||
# see: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#modifying-the-permissions-for-the-github_token
|
||||
permissions:
|
||||
contents: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Publish Helm charts
|
||||
uses: stefanprodan/helm-gh-pages@v1.7.0
|
||||
with:
|
||||
charts_dir: charts
|
||||
linting: off
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
@ -1,5 +1,5 @@
|
|||
# This part installs deps needed at runtime.
|
||||
FROM python:3.12-slim AS common
|
||||
FROM python:3.11-slim AS runtime
|
||||
|
||||
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 common AS build
|
||||
FROM runtime 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 common
|
||||
FROM runtime
|
||||
|
||||
COPY --from=build /srv/umap/docker/ /srv/umap/docker/
|
||||
COPY --from=build /venv/ /venv/
|
||||
|
|
2
Makefile
|
@ -65,7 +65,7 @@ publish: ## Publish the Python package to Pypi
|
|||
test: testpy testjs
|
||||
|
||||
testpy:
|
||||
pytest -vv umap/tests/ --dist=loadgroup --reruns 1 --maxfail 10
|
||||
pytest -vv umap/tests/ --dist=loadgroup --reruns 1
|
||||
|
||||
test-integration:
|
||||
pytest -xv umap/tests/integration/ --dist=loadgroup
|
||||
|
|
|
@ -66,11 +66,7 @@ spec:
|
|||
{{- end }}
|
||||
envFrom:
|
||||
- secretRef:
|
||||
{{- if .Values.umap.envFromSecret }}
|
||||
name: {{ .Values.umap.envFromSecret }}
|
||||
{{- else }}
|
||||
name: {{ include "umap.fullname" . }}-env
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /etc/umap/
|
||||
|
@ -84,11 +80,7 @@ spec:
|
|||
volumes:
|
||||
- name: config
|
||||
secret:
|
||||
{{- if .Values.umap.configFromSecret }}
|
||||
secretName: {{ .Values.umap.configFromSecret }}
|
||||
{{- else }}
|
||||
secretName: {{ include "umap.fullname" . }}-config
|
||||
{{- end }}
|
||||
- name: statics
|
||||
emptyDir: {}
|
||||
{{- if .Values.persistence.enabled }}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
{{ if not .Values.umap.configFromSecret }}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
|
@ -8,4 +7,3 @@ metadata:
|
|||
type: Opaque
|
||||
data:
|
||||
umap.conf: {{ .Values.umap.config | b64enc }}
|
||||
{{- end }}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
{{ if not .Values.umap.envFromSecret }}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
|
@ -10,4 +9,3 @@ data:
|
|||
{{- range $key, $value := .Values.umap.environment }}
|
||||
{{ $key }}: "{{ $value | b64enc }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
|
|
@ -77,18 +77,11 @@ umap:
|
|||
SECRET_KEY: CHANGE_ME
|
||||
STATIC_ROOT: /srv/umap/static
|
||||
MEDIA_ROOT: /srv/umap/uploads
|
||||
# Configure environment variables using an existing secret in the same namespace.
|
||||
# In this case the values above are not used
|
||||
envFromSecret: null
|
||||
|
||||
# You can also provide umap.conf content here:
|
||||
config: |
|
||||
from umap.settings.base import *
|
||||
|
||||
# See: https://github.com/umap-project/umap/blob/master/umap/settings/local.py.sample
|
||||
# Configure config file using an existing secret in the same namespace.
|
||||
# In this case the values above are not used
|
||||
configFromSecret: null
|
||||
|
||||
persistence:
|
||||
enabled: true
|
||||
|
|
|
@ -26,10 +26,10 @@ services:
|
|||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
image: umap/umap:3.0.2
|
||||
image: umap/umap:3.0.0
|
||||
ports:
|
||||
- "${PORT-8000}:8000"
|
||||
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,20 +39,7 @@ 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:
|
||||
|
|
|
@ -1,111 +0,0 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
# Force rtfd to use a recent version of mkdocs
|
||||
mkdocs==1.6.1
|
||||
pymdown-extensions==10.14.3
|
||||
mkdocs-material==9.6.12
|
||||
mkdocs-material==9.6.10
|
||||
mkdocs-static-i18n==1.3.0
|
||||
|
|
|
@ -1,61 +1,5 @@
|
|||
# Changelog
|
||||
|
||||
## 3.0.5 - 2025-04-25
|
||||
|
||||
* allow to save a remote data with unloaded data by @yohanboniface in #2657
|
||||
* allow to save/undo/sync drag'n'drop of datalayers by @yohanboniface in #2677
|
||||
* setting center and zoom manually should set dirty status by @yohanboniface in #2676
|
||||
* fix error when saving and deleting heatmap layer by @yohanboniface in #2681
|
||||
* make rules reordering syncable, savable and undoable by @yohanboniface in #2672
|
||||
* loading remote data should not make the map dirty by @yohanboniface in #2679
|
||||
* implement a design system for UI consistency by @davidbgk in #2654
|
||||
* pass CSRF_TRUSTED_ORIGINS env to settings by @lippoliv in #2656
|
||||
* do not display "saved" message if some request failed by @yohanboniface in #2669
|
||||
* show an error message if saving layer failed by @yohanboniface in #2670
|
||||
* naive support for GeometryCollection as Feature geometry by @yohanboniface in #2658
|
||||
* add a back button in rules form by @yohanboniface in #2673
|
||||
|
||||
## New Contributors
|
||||
* @lippoliv made their first contribution in #2656
|
||||
|
||||
## 3.0.4 - 2025-04-14
|
||||
|
||||
* do not show "back to home" button in iframes by @yohanboniface in #2644
|
||||
* remove "hide home button" shown twice in map settings by @yohanboniface in #2645
|
||||
* adapt Helm chart to match La Suite's expectations by @ohemelaar in #2646
|
||||
* update colors by @yohanboniface in #2647
|
||||
|
||||
|
||||
## 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
|
||||
* fix categorized layer crashing with null value by @yohanboniface in #2621
|
||||
* properly call endEdit for markers by @yohanboniface in #2617
|
||||
* fix result tools buttons background color by @yohanboniface in #2620
|
||||
* fix min-height of select in caption bar by @yohanboniface in #2622
|
||||
* give priority to small usernames on autocomplete by @yohanboniface in #2604
|
||||
|
||||
## 3.0.1 - 2025-04-07
|
||||
|
||||
* fix showLabel wrongly using MultiChoices by @yohanboniface in #2609
|
||||
|
||||
|
||||
## 3.0.0 - 2025-04-07
|
||||
|
||||
This is the first release to officially support colaborative real-time map editing.
|
||||
|
@ -74,13 +18,6 @@ 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
|
||||
|
|
|
@ -95,12 +95,6 @@ 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.
|
||||
|
|
|
@ -1,10 +1,84 @@
|
|||
# Configuring Nginx
|
||||
|
||||
See [WSGI](wsgi.md) or [ASGI](asgi.md) for a basic setup.
|
||||
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.
|
||||
|
||||
Then consider adding this configuration
|
||||
```nginx title="nginx.conf"
|
||||
upstream umap {
|
||||
server unix:///srv/umap/umap.sock;
|
||||
}
|
||||
|
||||
## Static files and geojson
|
||||
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
|
||||
|
||||
```nginx title="nginx.conf"
|
||||
location /static {
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
# 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.
|
|
@ -1,87 +0,0 @@
|
|||
# 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/).
|
|
@ -1,5 +1,5 @@
|
|||
# Force rtfd to use a recent version of mkdocs
|
||||
mkdocs==1.6.1
|
||||
pymdown-extensions==10.14.3
|
||||
mkdocs-material==9.6.12
|
||||
mkdocs-material==9.6.10
|
||||
mkdocs-static-i18n==1.3.0
|
||||
|
|
|
@ -18,12 +18,10 @@ 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
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
"dependencies": {
|
||||
"@dwayneparton/geojson-to-gpx": "^0.2.0",
|
||||
"@placemarkio/tokml": "0.3.4",
|
||||
"@tmcw/togeojson": "^7.1.0",
|
||||
"@tmcw/togeojson": "^5.8.0",
|
||||
"colorbrewer": "1.5.7",
|
||||
"csv2geojson": "github:umap-project/csv2geojson#patched",
|
||||
"dompurify": "3.2.4",
|
||||
|
|
|
@ -32,7 +32,7 @@ dependencies = [
|
|||
"django-agnocomplete==2.2.0",
|
||||
"django-environ==0.12.0",
|
||||
"django-probes==1.7.0",
|
||||
"Pillow==11.2.1",
|
||||
"Pillow==11.1.0",
|
||||
"psycopg==3.2.6",
|
||||
"requests==2.32.3",
|
||||
"rcssmin==1.2.1",
|
||||
|
@ -43,11 +43,11 @@ dependencies = [
|
|||
|
||||
[project.optional-dependencies]
|
||||
dev = [
|
||||
"hatch==1.14.1",
|
||||
"ruff==0.11.6",
|
||||
"hatch==1.14.0",
|
||||
"ruff==0.11.2",
|
||||
"djlint==1.36.4",
|
||||
"mkdocs==1.6.1",
|
||||
"mkdocs-material==9.6.12",
|
||||
"mkdocs-material==9.6.10",
|
||||
"mkdocs-static-i18n==1.3.0",
|
||||
"vermin==1.6.0",
|
||||
"pymdown-extensions==10.14.3",
|
||||
|
@ -58,20 +58,20 @@ test = [
|
|||
"factory-boy==3.3.3",
|
||||
"playwright>=1.39",
|
||||
"pytest==8.3.5",
|
||||
"pytest-django==4.11.1",
|
||||
"pytest-django==4.10.0",
|
||||
"pytest-playwright==0.7.0",
|
||||
"pytest-rerunfailures==15.0",
|
||||
"pytest-xdist>=3.5.0,<4",
|
||||
"moto[s3]==5.1.4"
|
||||
"moto[s3]==5.1.1"
|
||||
]
|
||||
docker = [
|
||||
"uvicorn==0.34.2",
|
||||
"uvicorn==0.34.0",
|
||||
]
|
||||
s3 = [
|
||||
"django-storages[s3]==1.14.6",
|
||||
"django-storages[s3]==1.14.5",
|
||||
]
|
||||
sync = [
|
||||
"pydantic==2.11.3",
|
||||
"pydantic==2.11.1",
|
||||
"redis==5.2.1",
|
||||
"websockets==15.0.1",
|
||||
]
|
||||
|
|
|
@ -1 +1 @@
|
|||
VERSION = "3.0.5"
|
||||
VERSION = "3.0.0"
|
||||
|
|
|
@ -2,7 +2,6 @@ from agnocomplete.core import AgnocompleteModel
|
|||
from agnocomplete.register import register
|
||||
from django.conf import settings
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.db.models.functions import Length
|
||||
|
||||
|
||||
@register
|
||||
|
@ -14,11 +13,3 @@ class AutocompleteUser(AgnocompleteModel):
|
|||
data = super().item(current_item)
|
||||
data["url"] = current_item.get_url()
|
||||
return data
|
||||
|
||||
def build_extra_filtered_queryset(self, queryset, **kwargs):
|
||||
order_by = []
|
||||
for field_name in self.fields:
|
||||
if not field_name[0].isalnum():
|
||||
field_name = field_name[1:]
|
||||
order_by.append(Length(field_name).asc())
|
||||
return queryset.order_by(*order_by)
|
||||
|
|
|
@ -13,7 +13,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: uMap\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-11 15:30+0000\n"
|
||||
"POT-Creation-Date: 2025-03-03 17:36+0000\n"
|
||||
"PO-Revision-Date: 2013-11-22 14:00+0000\n"
|
||||
"Last-Translator: prendi <prendi@openmailbox.org>, 2017\n"
|
||||
"Language-Team: Greek (http://app.transifex.com/openstreetmap/umap/language/el/)\n"
|
||||
|
@ -40,205 +40,137 @@ msgstr "Λόγω συντήρησης, ο ιστότοπος είναι μόνο
|
|||
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. Then, please logout and login again with the new provider."
|
||||
msgstr "Η χρήση του «%(name)s» για τον έλεγχο ταυτότητας έχει ξεπεραστεί και θα καταργηθεί σύντομα. Παρακαλούμε ρυθμίστε έναν άλλο πάροχο παρακάτω πριν χάσετε την πρόσβαση στο λογαριασμό και τους χάρτες σας. Στη συνέχεια, παρακαλούμε αποσυνδεθείτε και συνδεθείτε ξανά με τον νέο πάροχο."
|
||||
" and maps."
|
||||
msgstr ""
|
||||
|
||||
#: models.py:61 models.py:80
|
||||
#: models.py:60 models.py:79
|
||||
msgid "name"
|
||||
msgstr "όνομα"
|
||||
|
||||
#: models.py:63 models.py:493
|
||||
#: models.py:62 models.py:485
|
||||
msgid "description"
|
||||
msgstr "περιγραφή"
|
||||
|
||||
#: models.py:111
|
||||
#: models.py:110
|
||||
msgid "details"
|
||||
msgstr "λεπτομέρειες"
|
||||
|
||||
#: models.py:112
|
||||
#: models.py:111
|
||||
msgid "Link to a page where the licence is detailed."
|
||||
msgstr "Σύνδεσμος σελίδας αναλυτικής Άδειας Χρήσης."
|
||||
|
||||
#: models.py:122
|
||||
#: models.py:121
|
||||
msgid "URL template using OSM tile format"
|
||||
msgstr "Πρότυπο URL που χρησιμοποιεί μορφοποίηση πλακιδίων OSM"
|
||||
|
||||
#: models.py:128
|
||||
#: models.py:127
|
||||
msgid "Order of the tilelayers in the edit box"
|
||||
msgstr "Σειρά των υπόβαθρων στο πλαίσιο επεξεργασίας"
|
||||
|
||||
#: models.py:176 models.py:487
|
||||
#: models.py:175 models.py:479
|
||||
msgid "Only editable with secret edit link"
|
||||
msgstr "Επεξεργάσιμο μόνο με μυστικό σύνδεσμο"
|
||||
|
||||
#: models.py:177 models.py:488
|
||||
#: models.py:176 models.py:480
|
||||
msgid "Everyone can edit"
|
||||
msgstr "Όλοι μπορούν να επεξεργαστούν"
|
||||
|
||||
#: models.py:180 models.py:481
|
||||
#: models.py:179 models.py:473
|
||||
msgid "Everyone"
|
||||
msgstr "Οποιοσδήποτε"
|
||||
|
||||
#: models.py:181 models.py:190 models.py:482
|
||||
#: models.py:180 models.py:189 models.py:474
|
||||
msgid "Editors and team only"
|
||||
msgstr "Μόνο συντάκτες και ομάδα"
|
||||
|
||||
#: models.py:182 models.py:483
|
||||
#: models.py:181 models.py:475
|
||||
msgid "Owner only"
|
||||
msgstr "Μόνο ο κάτοχος"
|
||||
|
||||
#: models.py:185
|
||||
#: models.py:184
|
||||
msgid "Draft (private)"
|
||||
msgstr "Πρόχειρο (ιδιωτικό)"
|
||||
|
||||
#: models.py:186
|
||||
#: models.py:185
|
||||
msgid "Everyone (public)"
|
||||
msgstr "Όλοι (δημόσιος)"
|
||||
|
||||
#: models.py:189
|
||||
#: models.py:188
|
||||
msgid "Anyone with link"
|
||||
msgstr "Οποιοδήποτε με τον σύνδεσμο"
|
||||
|
||||
#: models.py:191
|
||||
#: models.py:190
|
||||
msgid "Blocked"
|
||||
msgstr "Αποκλεισμένος"
|
||||
|
||||
#: models.py:192 models.py:477
|
||||
#: models.py:191 models.py:469
|
||||
msgid "Deleted"
|
||||
msgstr "Διαγράφηκε"
|
||||
|
||||
#: models.py:195
|
||||
#: models.py:194
|
||||
msgid "center"
|
||||
msgstr "κέντρο"
|
||||
|
||||
#: models.py:196
|
||||
#: models.py:195
|
||||
msgid "zoom"
|
||||
msgstr "εστίαση"
|
||||
|
||||
#: models.py:198
|
||||
#: models.py:197
|
||||
msgid "locate"
|
||||
msgstr "εντοπισμός θέσης"
|
||||
|
||||
#: models.py:198
|
||||
#: models.py:197
|
||||
msgid "Locate user on load?"
|
||||
msgstr "Εντοπισμός θέσης χρήστη κατά την φόρτωση;"
|
||||
|
||||
#: models.py:202
|
||||
#: models.py:201
|
||||
msgid "Choose the map licence."
|
||||
msgstr "Επιλογή άδειας χρήσης του χάρτη."
|
||||
|
||||
#: models.py:203
|
||||
#: models.py:202
|
||||
msgid "licence"
|
||||
msgstr "άδεια"
|
||||
|
||||
#: models.py:214
|
||||
#: models.py:213
|
||||
msgid "owner"
|
||||
msgstr "ιδιοκτήτης"
|
||||
|
||||
#: models.py:218
|
||||
#: models.py:217
|
||||
msgid "editors"
|
||||
msgstr "συντάκτες"
|
||||
|
||||
#: models.py:224
|
||||
#: models.py:223
|
||||
msgid "team"
|
||||
msgstr "ομάδα"
|
||||
|
||||
#: models.py:230 models.py:509
|
||||
#: models.py:229 models.py:501
|
||||
msgid "edit status"
|
||||
msgstr "κατάσταση επεξεργασίας"
|
||||
|
||||
#: models.py:235 models.py:514
|
||||
#: models.py:234 models.py:506
|
||||
msgid "share status"
|
||||
msgstr "κατάσταση διαμοιρασμού"
|
||||
|
||||
#: models.py:238 models.py:504
|
||||
#: models.py:237 models.py:496
|
||||
msgid "settings"
|
||||
msgstr "ρυθμίσεις"
|
||||
|
||||
#: models.py:410
|
||||
#: models.py:407
|
||||
msgid "Clone of"
|
||||
msgstr "Κλώνος του"
|
||||
|
||||
#: models.py:476 models.py:480 models.py:486
|
||||
#: models.py:468 models.py:472 models.py:478
|
||||
msgid "Inherit"
|
||||
msgstr "Κληρονόμοι"
|
||||
|
||||
#: models.py:499
|
||||
#: models.py:491
|
||||
msgid "display on load"
|
||||
msgstr "εμφάνιση κατά τη φόρτωση"
|
||||
|
||||
#: models.py:500
|
||||
#: models.py:492
|
||||
msgid "Display this layer on load."
|
||||
msgstr "Εμφάνιση αυτού του επιπέδου κατά την φόρτωση."
|
||||
|
||||
#: settings/base.py:295
|
||||
msgid "Art and Culture"
|
||||
msgstr "Τέχνες και Πολιτισμός"
|
||||
|
||||
#: settings/base.py:296
|
||||
msgid "Cycling"
|
||||
msgstr "Ποδηλασία"
|
||||
|
||||
#: settings/base.py:297
|
||||
msgid "Business"
|
||||
msgstr "Επιχειρήσεις"
|
||||
|
||||
#: settings/base.py:298
|
||||
msgid "Environment"
|
||||
msgstr "Περιβάλλον"
|
||||
|
||||
#: settings/base.py:299
|
||||
msgid "Education"
|
||||
msgstr "Εκπαίδευση"
|
||||
|
||||
#: settings/base.py:300
|
||||
msgid "Food and Agriculture"
|
||||
msgstr "Διατροφή και Γεωργία"
|
||||
|
||||
#: settings/base.py:301
|
||||
msgid "Geopolitics"
|
||||
msgstr "Γεωπολιτική"
|
||||
|
||||
#: settings/base.py:302
|
||||
msgid "Health"
|
||||
msgstr "Υγεία"
|
||||
|
||||
#: settings/base.py:303
|
||||
msgid "Hiking"
|
||||
msgstr "Πεζοπορία-Ορειβασία"
|
||||
|
||||
#: settings/base.py:304
|
||||
msgid "History"
|
||||
msgstr "Ιστορία"
|
||||
|
||||
#: settings/base.py:305
|
||||
msgid "Public sector"
|
||||
msgstr "Δημόσιος τομέας"
|
||||
|
||||
#: settings/base.py:306
|
||||
msgid "Science"
|
||||
msgstr "Επιστήμες"
|
||||
|
||||
#: settings/base.py:307
|
||||
msgid "Shopping"
|
||||
msgstr "Ψώνια"
|
||||
|
||||
#: settings/base.py:308
|
||||
msgid "Sport and Leisure"
|
||||
msgstr "Αθλητισμός και ελεύθερος χρόνος"
|
||||
|
||||
#: settings/base.py:309
|
||||
msgid "Travel"
|
||||
msgstr "Ταξίδια"
|
||||
|
||||
#: settings/base.py:310
|
||||
msgid "Transports"
|
||||
msgstr "Μεταφορές"
|
||||
|
||||
#: settings/base.py:311
|
||||
msgid "Tourism"
|
||||
msgstr "Τουρισμός"
|
||||
|
||||
#: templates/403.html:8
|
||||
msgid ""
|
||||
"<a href=\"https://discover.umap-project.org/support/faq/#map-statuses\" "
|
||||
|
@ -491,7 +423,7 @@ msgstr "Οι ομάδες μου"
|
|||
msgid "Map of the uMaps"
|
||||
msgstr "Χάρτης των uMaps"
|
||||
|
||||
#: templates/umap/home.html:25
|
||||
#: templates/umap/home.html:24
|
||||
msgid "Get inspired, browse maps"
|
||||
msgstr "Περιηγήσου και αναζήτησε την έμπνευση στους χάρτες!"
|
||||
|
||||
|
@ -499,15 +431,11 @@ msgstr "Περιηγήσου και αναζήτησε την έμπνευση
|
|||
msgid "You are logged in. Continuing..."
|
||||
msgstr "Είστε συνδεδεμένοι. Συνέχεια..."
|
||||
|
||||
#: templates/umap/map_list.html:18 views.py:444
|
||||
#: templates/umap/map_list.html:11 views.py:437
|
||||
msgid "by"
|
||||
msgstr "από"
|
||||
|
||||
#: templates/umap/map_list.html:22
|
||||
msgid "See the map"
|
||||
msgstr "Δες τον χάρτη"
|
||||
|
||||
#: templates/umap/map_list.html:28
|
||||
#: templates/umap/map_list.html:20
|
||||
msgid "More"
|
||||
msgstr "Περισσότερα"
|
||||
|
||||
|
@ -666,15 +594,11 @@ msgid_plural "%(count)s maps found:"
|
|||
msgstr[0] "%(count)s χάρτης βρέθηκε:"
|
||||
msgstr[1] "%(count)s χάρτες βρέθηκαν:"
|
||||
|
||||
#: templates/umap/search.html:30
|
||||
#: templates/umap/search.html:28
|
||||
msgid "No map found."
|
||||
msgstr "Δεν βρέθηκε κανένας χάρτης."
|
||||
|
||||
#: templates/umap/search.html:36
|
||||
msgid "Latest created maps in category"
|
||||
msgstr "Τελευταία δημιουργημένοι χάρτες στην κατηγορία"
|
||||
|
||||
#: templates/umap/search.html:43
|
||||
#: templates/umap/search.html:33
|
||||
msgid "Latest created maps"
|
||||
msgstr "Χάρτες που δημιουργήθηκαν τελευταίοι"
|
||||
|
||||
|
@ -682,11 +606,7 @@ msgstr "Χάρτες που δημιουργήθηκαν τελευταίοι"
|
|||
msgid "Search maps"
|
||||
msgstr "Αναζήτηση χαρτών"
|
||||
|
||||
#: templates/umap/search_bar.html:14
|
||||
msgid "Any category"
|
||||
msgstr "Οποιαδήποτε κατηγορία"
|
||||
|
||||
#: templates/umap/search_bar.html:19
|
||||
#: templates/umap/search_bar.html:16
|
||||
msgid "Search"
|
||||
msgstr "Αναζήτηση"
|
||||
|
||||
|
@ -750,70 +670,70 @@ msgstr "Χρήστες"
|
|||
msgid "New team"
|
||||
msgstr "Νέα ομάδα"
|
||||
|
||||
#: views.py:235
|
||||
#: views.py:234
|
||||
msgid "Cannot delete a team with more than one member"
|
||||
msgstr "Δεν είναι δυνατή η διαγραφή μιας ομάδας που έχει περισσότερα από ένα μέλη"
|
||||
|
||||
#: views.py:239
|
||||
#: views.py:238
|
||||
#, python-format
|
||||
msgid "Team “%(name)s” has been deleted"
|
||||
msgstr "Η ομάδα «%(name)s» έχει διαγραφεί."
|
||||
|
||||
#: views.py:449
|
||||
#: views.py:442
|
||||
msgid "View the map"
|
||||
msgstr "Προβολή του χάρτη"
|
||||
|
||||
#: views.py:845
|
||||
#: views.py:838
|
||||
msgid "See full screen"
|
||||
msgstr "Προβολή πλήρους οθόνης"
|
||||
|
||||
#: views.py:988
|
||||
#: views.py:981
|
||||
msgid "Map editors updated with success!"
|
||||
msgstr "Η ενημέρωση των συντακτών χάρτη ήταν επιτυχής!"
|
||||
|
||||
#: views.py:1024
|
||||
#: views.py:1017
|
||||
#, python-format
|
||||
msgid "The uMap edit link for your map: %(map_name)s"
|
||||
msgstr "Ο uMap σύνδεσμος επεξεργασίας του χάρτη σας: %(map_name)s"
|
||||
|
||||
#: views.py:1027
|
||||
#: views.py:1020
|
||||
#, python-format
|
||||
msgid "Here is your secret edit link: %(link)s"
|
||||
msgstr "Εδώ είναι ο μυστικός σύνδεσμος επεξεργασίας: %(link)s"
|
||||
|
||||
#: views.py:1034
|
||||
#: views.py:1027
|
||||
#, python-format
|
||||
msgid "Can't send email to %(email)s"
|
||||
msgstr "Αδυναμία αποστολής email στο %(email)s"
|
||||
|
||||
#: views.py:1037
|
||||
#: views.py:1030
|
||||
#, python-format
|
||||
msgid "Email sent to %(email)s"
|
||||
msgstr "Μήνυμα email στάλθηκε στο %(email)s"
|
||||
|
||||
#: views.py:1048
|
||||
#: views.py:1041
|
||||
msgid "Only its owner can delete the map."
|
||||
msgstr "Μονό ο ιδιοκτήτης μπορεί να διαγράψει αυτό τον χάρτη."
|
||||
|
||||
#: views.py:1054
|
||||
#: views.py:1044
|
||||
msgid "Map successfully deleted."
|
||||
msgstr "Ο χάρτης διαγράφηκε με επιτυχία."
|
||||
|
||||
#: views.py:1080
|
||||
#: views.py:1070
|
||||
#, 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 "Ο χάρτης κλωνοποιήθηκε! Αν θέλετε να τον επεξεργαστείτε από κάποιον άλλο υπολογιστή, παρακαλώ χρησιμοποιήστε αυτόν τον σύνδεσμο: %(anonymous_url)s"
|
||||
|
||||
#: views.py:1085
|
||||
#: views.py:1075
|
||||
msgid "Congratulations, your map has been cloned!"
|
||||
msgstr "Συγχαρητήρια ο χάρτης σας κλωνοποιήθηκε!"
|
||||
|
||||
#: views.py:1339
|
||||
#: views.py:1329
|
||||
msgid "Layer successfully deleted."
|
||||
msgstr "Το επίπεδο διαγράφηκε με επιτυχία."
|
||||
|
||||
#: views.py:1361
|
||||
#: views.py:1351
|
||||
msgid "Permissions updated with success!"
|
||||
msgstr "Τα δικαιώματα ενημερώθηκαν με επιτυχία!"
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-25 15:38+0000\n"
|
||||
"POT-Creation-Date: 2025-04-04 16:49+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"
|
||||
|
@ -165,71 +165,71 @@ msgstr ""
|
|||
msgid "Display this layer on load."
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:296
|
||||
#: settings/base.py:295
|
||||
msgid "Art and Culture"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:297
|
||||
#: settings/base.py:296
|
||||
msgid "Cycling"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:298
|
||||
#: settings/base.py:297
|
||||
msgid "Business"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:299
|
||||
#: settings/base.py:298
|
||||
msgid "Environment"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:300
|
||||
#: settings/base.py:299
|
||||
msgid "Education"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:301
|
||||
#: settings/base.py:300
|
||||
msgid "Food and Agriculture"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:302
|
||||
#: settings/base.py:301
|
||||
msgid "Geopolitics"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:303
|
||||
#: settings/base.py:302
|
||||
msgid "Health"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:304
|
||||
#: settings/base.py:303
|
||||
msgid "Hiking"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:305
|
||||
#: settings/base.py:304
|
||||
msgid "History"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:306
|
||||
#: settings/base.py:305
|
||||
msgid "Public sector"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:307
|
||||
#: settings/base.py:306
|
||||
msgid "Science"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:308
|
||||
#: settings/base.py:307
|
||||
msgid "Shopping"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:309
|
||||
#: settings/base.py:308
|
||||
msgid "Sport and Leisure"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:310
|
||||
#: settings/base.py:309
|
||||
msgid "Travel"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:311
|
||||
#: settings/base.py:310
|
||||
msgid "Transports"
|
||||
msgstr ""
|
||||
|
||||
#: settings/base.py:312
|
||||
#: settings/base.py:311
|
||||
msgid "Tourism"
|
||||
msgstr ""
|
||||
|
||||
|
@ -663,11 +663,7 @@ msgstr[1] ""
|
|||
msgid "No map found."
|
||||
msgstr ""
|
||||
|
||||
#: templates/umap/search.html:36
|
||||
msgid "Latest created maps in category"
|
||||
msgstr ""
|
||||
|
||||
#: templates/umap/search.html:43
|
||||
#: templates/umap/search.html:35
|
||||
msgid "Latest created maps"
|
||||
msgstr ""
|
||||
|
||||
|
@ -788,25 +784,25 @@ msgstr ""
|
|||
msgid "Only its owner can delete the map."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:1054
|
||||
#: views.py:1051
|
||||
msgid "Map successfully deleted."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:1080
|
||||
#: views.py:1077
|
||||
#, 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:1085
|
||||
#: views.py:1082
|
||||
msgid "Congratulations, your map has been cloned!"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:1339
|
||||
#: views.py:1336
|
||||
msgid "Layer successfully deleted."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:1361
|
||||
#: views.py:1358
|
||||
msgid "Permissions updated with success!"
|
||||
msgstr ""
|
||||
|
|
|
@ -17,7 +17,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: uMap\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-11 15:30+0000\n"
|
||||
"POT-Creation-Date: 2025-03-03 17:36+0000\n"
|
||||
"PO-Revision-Date: 2013-11-22 14:00+0000\n"
|
||||
"Last-Translator: Ignacio L'Episcopo, 2024-2025\n"
|
||||
"Language-Team: Spanish (http://app.transifex.com/openstreetmap/umap/language/es/)\n"
|
||||
|
@ -44,205 +44,137 @@ msgstr "Sitio en modo solo lectura por mantenimiento"
|
|||
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. Then, please logout and login again with the new provider."
|
||||
msgstr "El uso de “%(name)s” para autenticar está obsoleto y se eliminará pronto. Por favor, configura otro proveedor a continuación antes de perder acceso a tu cuenta y mapas. Luego, cierra sesión e inicia sesión nuevamente con el nuevo proveedor."
|
||||
" and maps."
|
||||
msgstr ""
|
||||
|
||||
#: models.py:61 models.py:80
|
||||
#: models.py:60 models.py:79
|
||||
msgid "name"
|
||||
msgstr "nombre"
|
||||
|
||||
#: models.py:63 models.py:493
|
||||
#: models.py:62 models.py:485
|
||||
msgid "description"
|
||||
msgstr "descripción"
|
||||
|
||||
#: models.py:111
|
||||
#: models.py:110
|
||||
msgid "details"
|
||||
msgstr "detalles"
|
||||
|
||||
#: models.py:112
|
||||
#: models.py:111
|
||||
msgid "Link to a page where the licence is detailed."
|
||||
msgstr "Enlace a una página donde se detalla la licencia."
|
||||
|
||||
#: models.py:122
|
||||
#: models.py:121
|
||||
msgid "URL template using OSM tile format"
|
||||
msgstr "Plantilla de URL usando el formato de teselas OSM"
|
||||
|
||||
#: models.py:128
|
||||
#: models.py:127
|
||||
msgid "Order of the tilelayers in the edit box"
|
||||
msgstr "Orden de las capas de teselas en el cuadro de edición"
|
||||
|
||||
#: models.py:176 models.py:487
|
||||
#: models.py:175 models.py:479
|
||||
msgid "Only editable with secret edit link"
|
||||
msgstr "Solo editable con enlace secreto de edición"
|
||||
|
||||
#: models.py:177 models.py:488
|
||||
#: models.py:176 models.py:480
|
||||
msgid "Everyone can edit"
|
||||
msgstr "Todos pueden editar"
|
||||
|
||||
#: models.py:180 models.py:481
|
||||
#: models.py:179 models.py:473
|
||||
msgid "Everyone"
|
||||
msgstr "Todos"
|
||||
|
||||
#: models.py:181 models.py:190 models.py:482
|
||||
#: models.py:180 models.py:189 models.py:474
|
||||
msgid "Editors and team only"
|
||||
msgstr "Solo editores y equipo"
|
||||
|
||||
#: models.py:182 models.py:483
|
||||
#: models.py:181 models.py:475
|
||||
msgid "Owner only"
|
||||
msgstr "Solo el propietario"
|
||||
|
||||
#: models.py:185
|
||||
#: models.py:184
|
||||
msgid "Draft (private)"
|
||||
msgstr "Borrador (privado)"
|
||||
|
||||
#: models.py:186
|
||||
#: models.py:185
|
||||
msgid "Everyone (public)"
|
||||
msgstr "Todos (público)"
|
||||
|
||||
#: models.py:189
|
||||
#: models.py:188
|
||||
msgid "Anyone with link"
|
||||
msgstr "Cualquiera con el enlace"
|
||||
|
||||
#: models.py:191
|
||||
#: models.py:190
|
||||
msgid "Blocked"
|
||||
msgstr "Bloqueado"
|
||||
|
||||
#: models.py:192 models.py:477
|
||||
#: models.py:191 models.py:469
|
||||
msgid "Deleted"
|
||||
msgstr "Eliminado"
|
||||
|
||||
#: models.py:195
|
||||
#: models.py:194
|
||||
msgid "center"
|
||||
msgstr "centro"
|
||||
|
||||
#: models.py:196
|
||||
#: models.py:195
|
||||
msgid "zoom"
|
||||
msgstr "zoom"
|
||||
|
||||
#: models.py:198
|
||||
#: models.py:197
|
||||
msgid "locate"
|
||||
msgstr "localizar"
|
||||
|
||||
#: models.py:198
|
||||
#: models.py:197
|
||||
msgid "Locate user on load?"
|
||||
msgstr "¿Localizar al usuario al cargar?"
|
||||
|
||||
#: models.py:202
|
||||
#: models.py:201
|
||||
msgid "Choose the map licence."
|
||||
msgstr "Elige la licencia del mapa."
|
||||
|
||||
#: models.py:203
|
||||
#: models.py:202
|
||||
msgid "licence"
|
||||
msgstr "licencia"
|
||||
|
||||
#: models.py:214
|
||||
#: models.py:213
|
||||
msgid "owner"
|
||||
msgstr "propietario"
|
||||
|
||||
#: models.py:218
|
||||
#: models.py:217
|
||||
msgid "editors"
|
||||
msgstr "editores"
|
||||
|
||||
#: models.py:224
|
||||
#: models.py:223
|
||||
msgid "team"
|
||||
msgstr "equipo"
|
||||
|
||||
#: models.py:230 models.py:509
|
||||
#: models.py:229 models.py:501
|
||||
msgid "edit status"
|
||||
msgstr "estado de edición"
|
||||
|
||||
#: models.py:235 models.py:514
|
||||
#: models.py:234 models.py:506
|
||||
msgid "share status"
|
||||
msgstr "estado de compartir"
|
||||
|
||||
#: models.py:238 models.py:504
|
||||
#: models.py:237 models.py:496
|
||||
msgid "settings"
|
||||
msgstr "ajustes"
|
||||
|
||||
#: models.py:410
|
||||
#: models.py:407
|
||||
msgid "Clone of"
|
||||
msgstr "Clon de"
|
||||
|
||||
#: models.py:476 models.py:480 models.py:486
|
||||
#: models.py:468 models.py:472 models.py:478
|
||||
msgid "Inherit"
|
||||
msgstr "Heredar"
|
||||
|
||||
#: models.py:499
|
||||
#: models.py:491
|
||||
msgid "display on load"
|
||||
msgstr "mostrar al cargar"
|
||||
|
||||
#: models.py:500
|
||||
#: models.py:492
|
||||
msgid "Display this layer on load."
|
||||
msgstr "Mostrar esta capa al cargar."
|
||||
|
||||
#: settings/base.py:295
|
||||
msgid "Art and Culture"
|
||||
msgstr "Arte y cultura"
|
||||
|
||||
#: settings/base.py:296
|
||||
msgid "Cycling"
|
||||
msgstr "Ciclismo"
|
||||
|
||||
#: settings/base.py:297
|
||||
msgid "Business"
|
||||
msgstr "Negocios"
|
||||
|
||||
#: settings/base.py:298
|
||||
msgid "Environment"
|
||||
msgstr "Medio ambiente"
|
||||
|
||||
#: settings/base.py:299
|
||||
msgid "Education"
|
||||
msgstr "Educación"
|
||||
|
||||
#: settings/base.py:300
|
||||
msgid "Food and Agriculture"
|
||||
msgstr "Alimentos y agricultura"
|
||||
|
||||
#: settings/base.py:301
|
||||
msgid "Geopolitics"
|
||||
msgstr "Geopolítica"
|
||||
|
||||
#: settings/base.py:302
|
||||
msgid "Health"
|
||||
msgstr "Salud"
|
||||
|
||||
#: settings/base.py:303
|
||||
msgid "Hiking"
|
||||
msgstr "Senderismo"
|
||||
|
||||
#: settings/base.py:304
|
||||
msgid "History"
|
||||
msgstr "Historia"
|
||||
|
||||
#: settings/base.py:305
|
||||
msgid "Public sector"
|
||||
msgstr "Sector público"
|
||||
|
||||
#: settings/base.py:306
|
||||
msgid "Science"
|
||||
msgstr "Ciencia"
|
||||
|
||||
#: settings/base.py:307
|
||||
msgid "Shopping"
|
||||
msgstr "Compras"
|
||||
|
||||
#: settings/base.py:308
|
||||
msgid "Sport and Leisure"
|
||||
msgstr "Deporte y ocio"
|
||||
|
||||
#: settings/base.py:309
|
||||
msgid "Travel"
|
||||
msgstr "Viajes"
|
||||
|
||||
#: settings/base.py:310
|
||||
msgid "Transports"
|
||||
msgstr "Transporte"
|
||||
|
||||
#: settings/base.py:311
|
||||
msgid "Tourism"
|
||||
msgstr "Turismo"
|
||||
|
||||
#: templates/403.html:8
|
||||
msgid ""
|
||||
"<a href=\"https://discover.umap-project.org/support/faq/#map-statuses\" "
|
||||
|
@ -495,7 +427,7 @@ msgstr "Mis equipos"
|
|||
msgid "Map of the uMaps"
|
||||
msgstr "Mapa de los uMaps"
|
||||
|
||||
#: templates/umap/home.html:25
|
||||
#: templates/umap/home.html:24
|
||||
msgid "Get inspired, browse maps"
|
||||
msgstr "Inspírate, navega por los mapas"
|
||||
|
||||
|
@ -503,15 +435,11 @@ msgstr "Inspírate, navega por los mapas"
|
|||
msgid "You are logged in. Continuing..."
|
||||
msgstr "Has iniciado sesión. Continuando..."
|
||||
|
||||
#: templates/umap/map_list.html:18 views.py:444
|
||||
#: templates/umap/map_list.html:11 views.py:437
|
||||
msgid "by"
|
||||
msgstr "por"
|
||||
|
||||
#: templates/umap/map_list.html:22
|
||||
msgid "See the map"
|
||||
msgstr "Ver el mapa"
|
||||
|
||||
#: templates/umap/map_list.html:28
|
||||
#: templates/umap/map_list.html:20
|
||||
msgid "More"
|
||||
msgstr "Más"
|
||||
|
||||
|
@ -671,15 +599,11 @@ msgstr[0] "%(count)s mapa encontrado:"
|
|||
msgstr[1] "%(count)s mapas encontrados:"
|
||||
msgstr[2] "%(count)s mapas encontrados:"
|
||||
|
||||
#: templates/umap/search.html:30
|
||||
#: templates/umap/search.html:28
|
||||
msgid "No map found."
|
||||
msgstr "No se ha encontrado ningún mapa."
|
||||
|
||||
#: templates/umap/search.html:36
|
||||
msgid "Latest created maps in category"
|
||||
msgstr "Últimos mapas creados en la categoría"
|
||||
|
||||
#: templates/umap/search.html:43
|
||||
#: templates/umap/search.html:33
|
||||
msgid "Latest created maps"
|
||||
msgstr "Últimos mapas creados"
|
||||
|
||||
|
@ -687,11 +611,7 @@ msgstr "Últimos mapas creados"
|
|||
msgid "Search maps"
|
||||
msgstr "Buscar mapas"
|
||||
|
||||
#: templates/umap/search_bar.html:14
|
||||
msgid "Any category"
|
||||
msgstr "Cualquier categoría"
|
||||
|
||||
#: templates/umap/search_bar.html:19
|
||||
#: templates/umap/search_bar.html:16
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
|
@ -755,70 +675,70 @@ msgstr "Usuarios"
|
|||
msgid "New team"
|
||||
msgstr "Nuevo equipo"
|
||||
|
||||
#: views.py:235
|
||||
#: views.py:234
|
||||
msgid "Cannot delete a team with more than one member"
|
||||
msgstr "No se puede eliminar un equipo con más de un miembro"
|
||||
|
||||
#: views.py:239
|
||||
#: views.py:238
|
||||
#, python-format
|
||||
msgid "Team “%(name)s” has been deleted"
|
||||
msgstr "El equipo “%(name)s” ha sido eliminado"
|
||||
|
||||
#: views.py:449
|
||||
#: views.py:442
|
||||
msgid "View the map"
|
||||
msgstr "Ver el mapa"
|
||||
|
||||
#: views.py:845
|
||||
#: views.py:838
|
||||
msgid "See full screen"
|
||||
msgstr "Ver en pantalla completa"
|
||||
|
||||
#: views.py:988
|
||||
#: views.py:981
|
||||
msgid "Map editors updated with success!"
|
||||
msgstr "¡Los editores del mapas han sido actualizados con éxito!"
|
||||
|
||||
#: views.py:1024
|
||||
#: views.py:1017
|
||||
#, python-format
|
||||
msgid "The uMap edit link for your map: %(map_name)s"
|
||||
msgstr "El enlace de edición de uMap para tu mapa: %(map_name)s"
|
||||
|
||||
#: views.py:1027
|
||||
#: views.py:1020
|
||||
#, python-format
|
||||
msgid "Here is your secret edit link: %(link)s"
|
||||
msgstr "Aquí está tu enlace secreto de edición: %(link)s"
|
||||
|
||||
#: views.py:1034
|
||||
#: views.py:1027
|
||||
#, python-format
|
||||
msgid "Can't send email to %(email)s"
|
||||
msgstr "No se puede enviar correo electrónico a %(email)s"
|
||||
|
||||
#: views.py:1037
|
||||
#: views.py:1030
|
||||
#, python-format
|
||||
msgid "Email sent to %(email)s"
|
||||
msgstr "Correo electrónico enviado a %(email)s"
|
||||
|
||||
#: views.py:1048
|
||||
#: views.py:1041
|
||||
msgid "Only its owner can delete the map."
|
||||
msgstr "Sólo el propietario puede borrar el mapa."
|
||||
|
||||
#: views.py:1054
|
||||
#: views.py:1044
|
||||
msgid "Map successfully deleted."
|
||||
msgstr "Mapa eliminado correctamente."
|
||||
|
||||
#: views.py:1080
|
||||
#: views.py:1070
|
||||
#, 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 "¡Tu mapa ha sido clonado! Si quieres editar este mapa desde otro ordenador, usa este enlace: %(anonymous_url)s"
|
||||
|
||||
#: views.py:1085
|
||||
#: views.py:1075
|
||||
msgid "Congratulations, your map has been cloned!"
|
||||
msgstr "¡Enhorabuena! ¡Tu mapa ha sido clonado!"
|
||||
|
||||
#: views.py:1339
|
||||
#: views.py:1329
|
||||
msgid "Layer successfully deleted."
|
||||
msgstr "Se eliminó la capa con éxito."
|
||||
|
||||
#: views.py:1361
|
||||
#: views.py:1351
|
||||
msgid "Permissions updated with success!"
|
||||
msgstr "¡Permisos actualizados con éxito!"
|
||||
|
|
|
@ -24,7 +24,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: uMap\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-11 15:30+0000\n"
|
||||
"POT-Creation-Date: 2025-04-04 16:49+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,11 +682,7 @@ msgstr[2] "%(count)s cartes trouvées :"
|
|||
msgid "No map found."
|
||||
msgstr "Aucune carte trouvée."
|
||||
|
||||
#: 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
|
||||
#: templates/umap/search.html:35
|
||||
msgid "Latest created maps"
|
||||
msgstr "Dernières cartes créées."
|
||||
|
||||
|
@ -807,25 +803,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:1054
|
||||
#: views.py:1051
|
||||
msgid "Map successfully deleted."
|
||||
msgstr "La carte a bien été supprimée."
|
||||
|
||||
#: views.py:1080
|
||||
#: views.py:1077
|
||||
#, 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:1085
|
||||
#: views.py:1082
|
||||
msgid "Congratulations, your map has been cloned!"
|
||||
msgstr "Votre carte a été dupliquée !"
|
||||
|
||||
#: views.py:1339
|
||||
#: views.py:1336
|
||||
msgid "Layer successfully deleted."
|
||||
msgstr "Calque supprimé."
|
||||
|
||||
#: views.py:1361
|
||||
#: views.py:1358
|
||||
msgid "Permissions updated with success!"
|
||||
msgstr "Les permissions ont bien été modifiées !"
|
||||
|
|
|
@ -11,7 +11,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: uMap\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-04-11 15:30+0000\n"
|
||||
"POT-Creation-Date: 2025-03-03 17:36+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,205 +38,137 @@ 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. 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."
|
||||
" and maps."
|
||||
msgstr ""
|
||||
|
||||
#: models.py:61 models.py:80
|
||||
#: models.py:60 models.py:79
|
||||
msgid "name"
|
||||
msgstr "naam"
|
||||
|
||||
#: models.py:63 models.py:493
|
||||
#: models.py:62 models.py:485
|
||||
msgid "description"
|
||||
msgstr "omschrijving"
|
||||
|
||||
#: models.py:111
|
||||
#: models.py:110
|
||||
msgid "details"
|
||||
msgstr "details"
|
||||
|
||||
#: models.py:112
|
||||
#: models.py:111
|
||||
msgid "Link to a page where the licence is detailed."
|
||||
msgstr "Link naar pagina waar de licentie details staan"
|
||||
|
||||
#: models.py:122
|
||||
#: models.py:121
|
||||
msgid "URL template using OSM tile format"
|
||||
msgstr "URL-sjabloon met OSM tegel-formaat"
|
||||
|
||||
#: models.py:128
|
||||
#: models.py:127
|
||||
msgid "Order of the tilelayers in the edit box"
|
||||
msgstr "Volgorde van de tegel-lagen in het bewerkingsvak."
|
||||
|
||||
#: models.py:176 models.py:487
|
||||
#: models.py:175 models.py:479
|
||||
msgid "Only editable with secret edit link"
|
||||
msgstr "Alleen te bewerken met een geheime link"
|
||||
|
||||
#: models.py:177 models.py:488
|
||||
#: models.py:176 models.py:480
|
||||
msgid "Everyone can edit"
|
||||
msgstr "Iedereen kan wijzigingen maken"
|
||||
|
||||
#: models.py:180 models.py:481
|
||||
#: models.py:179 models.py:473
|
||||
msgid "Everyone"
|
||||
msgstr "Iedereen"
|
||||
|
||||
#: models.py:181 models.py:190 models.py:482
|
||||
#: models.py:180 models.py:189 models.py:474
|
||||
msgid "Editors and team only"
|
||||
msgstr "Alleen redacteuren en team"
|
||||
|
||||
#: models.py:182 models.py:483
|
||||
#: models.py:181 models.py:475
|
||||
msgid "Owner only"
|
||||
msgstr "Alleen eigenaar"
|
||||
|
||||
#: models.py:185
|
||||
#: models.py:184
|
||||
msgid "Draft (private)"
|
||||
msgstr "Ontwerp (privé)"
|
||||
|
||||
#: models.py:186
|
||||
#: models.py:185
|
||||
msgid "Everyone (public)"
|
||||
msgstr "Iedereen (openbaar)"
|
||||
|
||||
#: models.py:189
|
||||
#: models.py:188
|
||||
msgid "Anyone with link"
|
||||
msgstr "Iedereen met een link"
|
||||
|
||||
#: models.py:191
|
||||
#: models.py:190
|
||||
msgid "Blocked"
|
||||
msgstr "geblokkeerd"
|
||||
|
||||
#: models.py:192 models.py:477
|
||||
#: models.py:191 models.py:469
|
||||
msgid "Deleted"
|
||||
msgstr "Verwijderd"
|
||||
|
||||
#: models.py:195
|
||||
#: models.py:194
|
||||
msgid "center"
|
||||
msgstr "centreer"
|
||||
|
||||
#: models.py:196
|
||||
#: models.py:195
|
||||
msgid "zoom"
|
||||
msgstr "zoom"
|
||||
|
||||
#: models.py:198
|
||||
#: models.py:197
|
||||
msgid "locate"
|
||||
msgstr "zoek"
|
||||
|
||||
#: models.py:198
|
||||
#: models.py:197
|
||||
msgid "Locate user on load?"
|
||||
msgstr "Gebruiker zoeken tijdens laden?"
|
||||
|
||||
#: models.py:202
|
||||
#: models.py:201
|
||||
msgid "Choose the map licence."
|
||||
msgstr "Kies de kaartlicentie"
|
||||
|
||||
#: models.py:203
|
||||
#: models.py:202
|
||||
msgid "licence"
|
||||
msgstr "Licentie"
|
||||
|
||||
#: models.py:214
|
||||
#: models.py:213
|
||||
msgid "owner"
|
||||
msgstr "eigenaar"
|
||||
|
||||
#: models.py:218
|
||||
#: models.py:217
|
||||
msgid "editors"
|
||||
msgstr "editors"
|
||||
|
||||
#: models.py:224
|
||||
#: models.py:223
|
||||
msgid "team"
|
||||
msgstr "team"
|
||||
|
||||
#: models.py:230 models.py:509
|
||||
#: models.py:229 models.py:501
|
||||
msgid "edit status"
|
||||
msgstr "wijzig status"
|
||||
|
||||
#: models.py:235 models.py:514
|
||||
#: models.py:234 models.py:506
|
||||
msgid "share status"
|
||||
msgstr "deel status"
|
||||
|
||||
#: models.py:238 models.py:504
|
||||
#: models.py:237 models.py:496
|
||||
msgid "settings"
|
||||
msgstr "instellingen"
|
||||
|
||||
#: models.py:410
|
||||
#: models.py:407
|
||||
msgid "Clone of"
|
||||
msgstr "Kopie van"
|
||||
|
||||
#: models.py:476 models.py:480 models.py:486
|
||||
#: models.py:468 models.py:472 models.py:478
|
||||
msgid "Inherit"
|
||||
msgstr "overerven"
|
||||
|
||||
#: models.py:499
|
||||
#: models.py:491
|
||||
msgid "display on load"
|
||||
msgstr "toon tijdens laden"
|
||||
|
||||
#: models.py:500
|
||||
#: models.py:492
|
||||
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\" "
|
||||
|
@ -489,7 +421,7 @@ msgstr "Mijn teams"
|
|||
msgid "Map of the uMaps"
|
||||
msgstr "Kaart van de uMaps"
|
||||
|
||||
#: templates/umap/home.html:25
|
||||
#: templates/umap/home.html:24
|
||||
msgid "Get inspired, browse maps"
|
||||
msgstr "Laat u inspireren, blader door kaarten"
|
||||
|
||||
|
@ -497,15 +429,11 @@ msgstr "Laat u inspireren, blader door kaarten"
|
|||
msgid "You are logged in. Continuing..."
|
||||
msgstr "U bent ingelogd. Ga verder..."
|
||||
|
||||
#: templates/umap/map_list.html:18 views.py:444
|
||||
#: templates/umap/map_list.html:11 views.py:437
|
||||
msgid "by"
|
||||
msgstr "door"
|
||||
|
||||
#: templates/umap/map_list.html:22
|
||||
msgid "See the map"
|
||||
msgstr "Zie de kaart"
|
||||
|
||||
#: templates/umap/map_list.html:28
|
||||
#: templates/umap/map_list.html:20
|
||||
msgid "More"
|
||||
msgstr "Meer"
|
||||
|
||||
|
@ -664,15 +592,11 @@ msgid_plural "%(count)s maps found:"
|
|||
msgstr[0] "%(count)s kaarten gevonden:"
|
||||
msgstr[1] "%(count)s kaarten gevonden:"
|
||||
|
||||
#: templates/umap/search.html:30
|
||||
#: templates/umap/search.html:28
|
||||
msgid "No map found."
|
||||
msgstr "Geen kaart gevonden."
|
||||
|
||||
#: templates/umap/search.html:36
|
||||
msgid "Latest created maps in category"
|
||||
msgstr "Laatst gemaakte kaarten in categorie"
|
||||
|
||||
#: templates/umap/search.html:43
|
||||
#: templates/umap/search.html:33
|
||||
msgid "Latest created maps"
|
||||
msgstr "Laatste gemaakte kaarten"
|
||||
|
||||
|
@ -680,11 +604,7 @@ msgstr "Laatste gemaakte kaarten"
|
|||
msgid "Search maps"
|
||||
msgstr "Zoek kaarten"
|
||||
|
||||
#: templates/umap/search_bar.html:14
|
||||
msgid "Any category"
|
||||
msgstr "Elke categorie"
|
||||
|
||||
#: templates/umap/search_bar.html:19
|
||||
#: templates/umap/search_bar.html:16
|
||||
msgid "Search"
|
||||
msgstr "Zoeken"
|
||||
|
||||
|
@ -748,70 +668,70 @@ msgstr "Gebruikers"
|
|||
msgid "New team"
|
||||
msgstr "Nieuw Team"
|
||||
|
||||
#: views.py:235
|
||||
#: views.py:234
|
||||
msgid "Cannot delete a team with more than one member"
|
||||
msgstr "Kan een team met meer dan één lid niet verwijderen"
|
||||
|
||||
#: views.py:239
|
||||
#: views.py:238
|
||||
#, python-format
|
||||
msgid "Team “%(name)s” has been deleted"
|
||||
msgstr "Team “%(name)s” is verwijderd"
|
||||
|
||||
#: views.py:449
|
||||
#: views.py:442
|
||||
msgid "View the map"
|
||||
msgstr "Bekijk de kaart"
|
||||
|
||||
#: views.py:845
|
||||
#: views.py:838
|
||||
msgid "See full screen"
|
||||
msgstr "Volledig scherm weergeven"
|
||||
|
||||
#: views.py:988
|
||||
#: views.py:981
|
||||
msgid "Map editors updated with success!"
|
||||
msgstr "Kaarteditors met succes bijgewerkt!"
|
||||
|
||||
#: views.py:1024
|
||||
#: views.py:1017
|
||||
#, 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:1027
|
||||
#: views.py:1020
|
||||
#, python-format
|
||||
msgid "Here is your secret edit link: %(link)s"
|
||||
msgstr "Hier is je geheime bewerkingslink: %(link)s"
|
||||
|
||||
#: views.py:1034
|
||||
#: views.py:1027
|
||||
#, python-format
|
||||
msgid "Can't send email to %(email)s"
|
||||
msgstr "Kan geen e-mail verzenden naar %(email)s"
|
||||
|
||||
#: views.py:1037
|
||||
#: views.py:1030
|
||||
#, python-format
|
||||
msgid "Email sent to %(email)s"
|
||||
msgstr "E-mail verzonden naar %(email)s"
|
||||
|
||||
#: views.py:1048
|
||||
#: views.py:1041
|
||||
msgid "Only its owner can delete the map."
|
||||
msgstr "Kaart kan alleen door eigenaar worden verwijderd."
|
||||
|
||||
#: views.py:1054
|
||||
#: views.py:1044
|
||||
msgid "Map successfully deleted."
|
||||
msgstr "Kaart succesvol verwijderd."
|
||||
|
||||
#: views.py:1080
|
||||
#: views.py:1070
|
||||
#, 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:1085
|
||||
#: views.py:1075
|
||||
msgid "Congratulations, your map has been cloned!"
|
||||
msgstr "Gefeliciteerd, uw kaart is gekopieerd!"
|
||||
|
||||
#: views.py:1339
|
||||
#: views.py:1329
|
||||
msgid "Layer successfully deleted."
|
||||
msgstr "Laag is verwijderd."
|
||||
|
||||
#: views.py:1361
|
||||
#: views.py:1351
|
||||
msgid "Permissions updated with success!"
|
||||
msgstr "Machtigingen met succes bijgewerkt!"
|
||||
|
|
|
@ -551,7 +551,6 @@ class DataLayer(NamedModel):
|
|||
if self.old_id:
|
||||
metadata["old_id"] = self.old_id
|
||||
metadata["id"] = self.pk
|
||||
metadata["rank"] = self.rank
|
||||
metadata["permissions"] = {"edit_status": self.edit_status}
|
||||
metadata["editMode"] = "advanced" if self.can_edit(request) else "disabled"
|
||||
metadata["_referenceVersion"] = self.reference_version
|
||||
|
|
|
@ -19,7 +19,6 @@ env = environ.Env()
|
|||
|
||||
INTERNAL_IPS = env.list("INTERNAL_IPS", default=["127.0.0.1"])
|
||||
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", default=["*"])
|
||||
CSRF_TRUSTED_ORIGINS = env.list("CSRF_TRUSTED_ORIGINS", default=[])
|
||||
ADMINS = tuple(parseaddr(email) for email in env.list("ADMINS", default=[]))
|
||||
ASGI_APPLICATION = "umap.asgi.application"
|
||||
|
||||
|
@ -165,8 +164,8 @@ LOGIN_REDIRECT_URL = "login_popup_end"
|
|||
STATIC_URL = "/static/"
|
||||
MEDIA_URL = "/uploads/"
|
||||
|
||||
STATIC_ROOT = env("STATIC_ROOT", default=os.path.join("static"))
|
||||
MEDIA_ROOT = env("MEDIA_ROOT", default=os.path.join("uploads"))
|
||||
STATIC_ROOT = os.path.join("static")
|
||||
MEDIA_ROOT = os.path.join("uploads")
|
||||
|
||||
STATICFILES_FINDERS = [
|
||||
"django.contrib.staticfiles.finders.FileSystemFinder",
|
||||
|
|
|
@ -235,7 +235,3 @@ dt {
|
|||
display: block;
|
||||
overflow-x: auto;
|
||||
}
|
||||
mark {
|
||||
background-color: var(--color-lightCyan);
|
||||
padding: 0 var(--small-box-padding);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
.umap-main-edit-toolbox [type=button] {
|
||||
color: #fff;
|
||||
font-size: 0.8rem;
|
||||
font-size: 1em;
|
||||
background-color: var(--color-darkGray);
|
||||
width: auto;
|
||||
margin-bottom: 0;
|
||||
|
@ -167,7 +167,7 @@
|
|||
.umap-caption-bar .umap-map-author {
|
||||
margin-inline-end: 10px;
|
||||
}
|
||||
.umap-caption-bar:has(select:not([hidden])) > button + button:after,
|
||||
.umap-caption-bar > button + button:after,
|
||||
.umap-caption-bar > button + button:before {
|
||||
content: '|';
|
||||
padding-inline-start: 10px;
|
||||
|
@ -206,7 +206,6 @@
|
|||
margin-top: 0;
|
||||
line-height: initial;
|
||||
height: initial;
|
||||
min-height: initial;
|
||||
width: auto;
|
||||
padding: 0 var(--text-margin);
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ input[type="text"], input[type="password"], input[type="date"],
|
|||
input[type="datetime-local"], input[type="email"], input[type="number"],
|
||||
input[type="search"], input[type="tel"], input[type="time"], input[type="file"],
|
||||
input[type="url"], textarea {
|
||||
background-color: var(--color-light);
|
||||
background-color: white;
|
||||
border: 2px solid var(--color-darkBlue);
|
||||
color: var(--text-color);
|
||||
display: block;
|
||||
|
@ -14,6 +14,7 @@ input[type="url"], textarea {
|
|||
margin: 0;
|
||||
padding: .5rem 1rem;
|
||||
width: 100%;
|
||||
line-height: inherit;
|
||||
min-height: 40px;
|
||||
}
|
||||
input[type="range"] {
|
||||
|
@ -47,7 +48,7 @@ input[type=checkbox]:checked:after {
|
|||
}
|
||||
input[data-modified=true] {
|
||||
background-color: var(--color-lightCyan);
|
||||
border: 1px solid var(--color-veryDarkGray);
|
||||
border: 1px solid var(--color-darkGray);
|
||||
}
|
||||
input + select,
|
||||
select + input,
|
||||
|
@ -71,7 +72,7 @@ select {
|
|||
.dark select {
|
||||
color: var(--text-color);
|
||||
background-color: var(--color-darkGray);
|
||||
border-color: var(--color-veryDarkGray);
|
||||
border-color: var(--color-dark);
|
||||
border-width: 1px;
|
||||
}
|
||||
select[multiple="multiple"] {
|
||||
|
@ -89,7 +90,7 @@ input[type="submit"] {
|
|||
text-decoration: none;
|
||||
justify-content: center;
|
||||
background-color: var(--color-darkBlue);
|
||||
color: var(--color-light);
|
||||
color: white;
|
||||
font-weight: normal;
|
||||
min-height: 40px;
|
||||
}
|
||||
|
@ -97,21 +98,21 @@ input[type="submit"] {
|
|||
.dark [type="button"] {
|
||||
background-color: var(--color-darkerGray);
|
||||
color: var(--text-color);
|
||||
border: 1px solid var(--color-veryDarkGray);
|
||||
border: 1px solid #1b1f20;
|
||||
}
|
||||
.button.primary {
|
||||
font-weight: bold;
|
||||
}
|
||||
.dark .button.primary:not([disabled]),
|
||||
.dark [type="button"].primary:not([disabled]) {
|
||||
background-color: var(--color-verySoftCyan);
|
||||
background-color: var(--color-brightCyan);
|
||||
color: var(--color-dark);
|
||||
border: 1px solid var(--color-veryDarkGray);
|
||||
border: 1px solid #1b1f20;
|
||||
}
|
||||
.dark .button:hover,
|
||||
.dark [type="button"]:hover,
|
||||
.dark input[type="submit"]:hover {
|
||||
background-color: var(--color-darkerGray);
|
||||
background-color: #2e3436;
|
||||
}
|
||||
.dark a {
|
||||
color: var(--text-color);
|
||||
|
@ -151,14 +152,14 @@ button.round.small {
|
|||
display: block;
|
||||
padding: 7px 7px;
|
||||
margin-bottom: 14px;
|
||||
background: var(--color-mediumGray);
|
||||
background: #393F3F;
|
||||
color: var(--color-lightGray);
|
||||
font-size: 10px;
|
||||
border-radius: 0 2px;
|
||||
}
|
||||
.content .helptext {
|
||||
background-color: var(--color-lightGray);
|
||||
color: var(--color-dark);
|
||||
background-color: #eee;
|
||||
color: #000;
|
||||
}
|
||||
input + .help-text {
|
||||
margin-top: -14px;
|
||||
|
@ -205,8 +206,8 @@ input + .error {
|
|||
margin-top: -14px;
|
||||
margin-bottom: 14px;
|
||||
background: var(--color-lightGray);
|
||||
color: var(--color-light);
|
||||
background-color: var(--color-red);
|
||||
color: #fff;
|
||||
background-color: #cc0000;
|
||||
font-size: 11px;
|
||||
border-radius: 0 2px;
|
||||
}
|
||||
|
@ -214,14 +215,14 @@ input[type="file"] + .error {
|
|||
margin-top: 0;
|
||||
}
|
||||
input[value]:invalid {
|
||||
border-color: var(--color-red);
|
||||
background-color: var(--color-darkRed);
|
||||
border-color: red;
|
||||
background-color: darkred;
|
||||
}
|
||||
.dark input, .dark textarea {
|
||||
background-color: var(--color-darkerGray);
|
||||
border-color: var(--color-veryDarkGray);
|
||||
border-color: var(--color-dark);
|
||||
border-width: 1px;
|
||||
color: var(--color-lightGray);
|
||||
color: #efefef;
|
||||
}
|
||||
details {
|
||||
margin-bottom: 5px;
|
||||
|
@ -229,7 +230,7 @@ details {
|
|||
border-start-end-radius: 4px;
|
||||
}
|
||||
.dark details {
|
||||
border: 1px solid var(--color-veryDarkGray);
|
||||
border: 1px solid #222;
|
||||
}
|
||||
details fieldset {
|
||||
overflow: hidden;
|
||||
|
@ -245,8 +246,8 @@ details summary {
|
|||
padding: 0 5px;
|
||||
}
|
||||
.dark details summary {
|
||||
background-color: var(--color-darkerGray);
|
||||
color: var(--color-light);
|
||||
background-color: #232729;
|
||||
color: #fff;
|
||||
}
|
||||
.dark details fieldset {
|
||||
border: 1px solid var(--color-darkGray);
|
||||
|
@ -311,34 +312,33 @@ input.switch:empty ~ label:after {
|
|||
width: 6em;
|
||||
-webkit-transition: all 100ms ease-in;
|
||||
transition: all 100ms ease-in;
|
||||
color: var(--color-mediumGray);
|
||||
color: #c9c9c7;
|
||||
font-weight: bold;
|
||||
background-color: var(--color-lighterGray);
|
||||
background-color: #ededed;
|
||||
}
|
||||
.dark input.switch:empty ~ label:before,
|
||||
.dark input.switch:empty ~ label:after {
|
||||
background-color: var(--color-darkerGray);
|
||||
background-color: #272c2e;
|
||||
}
|
||||
input.switch:empty ~ label:after {
|
||||
width: 3em;
|
||||
margin-inline-start: 0.1em;
|
||||
background-color: var(--color-lightGray);
|
||||
background-color: #ededed;
|
||||
content: "OFF";
|
||||
text-indent: 3.5em;
|
||||
border: 1px solid var(--color-darkerGray);
|
||||
border: 1px solid #374E75;
|
||||
font-weight: bold;
|
||||
}
|
||||
.dark input.switch:empty ~ label:after {
|
||||
border: 1px solid var(--color-veryDarkGray);
|
||||
background-color: var(--color-darkerGray);
|
||||
color: var(--color-lightGray);
|
||||
border: 1px solid #202425;
|
||||
background-color: #2c3233;
|
||||
}
|
||||
input.switch:checked:empty ~ label:after {
|
||||
content: ' ';
|
||||
}
|
||||
.dark input.switch:checked ~ label:before,
|
||||
input.switch:checked ~ label:before {
|
||||
background-color: var(--color-verySoftCyan);
|
||||
background-color: var(--color-lightCyan);
|
||||
border: 1px solid var(--color-lightGray);
|
||||
color: var(--color-darkGray);
|
||||
content: "ON";
|
||||
|
@ -348,7 +348,7 @@ input.switch:checked ~ label:before {
|
|||
}
|
||||
.dark input.switch:checked ~ label:before {
|
||||
border: none;
|
||||
background-color: var(--color-verySoftCyan);
|
||||
background-color: var(--color-accent);
|
||||
}
|
||||
input.switch:checked ~ label:after {
|
||||
margin-inline-start: 3em;
|
||||
|
@ -388,9 +388,9 @@ input.switch:checked ~ label:after {
|
|||
display: none;
|
||||
}
|
||||
.umap-multiplechoice label {
|
||||
border: 1px solid var(--color-veryDarkGray);
|
||||
border: 1px solid #374E75;
|
||||
cursor: pointer;
|
||||
background-color: var(--color-lightGray);
|
||||
background-color: #c9c9c7;
|
||||
min-height: 30px;
|
||||
line-height: 30px;
|
||||
text-align: center;
|
||||
|
@ -398,11 +398,12 @@ input.switch:checked ~ label:after {
|
|||
display: inline-block;
|
||||
}
|
||||
.dark .umap-multiplechoice label {
|
||||
border: 1px solid var(--color-veryDarkGray);
|
||||
background-color: var(--color-darkGray);
|
||||
border: 1px solid black;
|
||||
background-color: #2c3233;
|
||||
}
|
||||
.umap-multiplechoice input[type='radio']:checked + label {
|
||||
background-color: var(--color-verySoftCyan);
|
||||
background-color: var(--color-accent);
|
||||
box-shadow: inset 0 0 6px 0px #2c3233;
|
||||
color: var(--color-darkGray);
|
||||
}
|
||||
.inheritable .header .buttons {
|
||||
|
@ -420,7 +421,7 @@ input.switch:checked ~ label:after {
|
|||
width: initial;
|
||||
}
|
||||
.inheritable + .inheritable {
|
||||
border-top: 1px solid var(--color-darkerGray);
|
||||
border-top: 1px solid #222;
|
||||
padding-top: 5px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
@ -504,7 +505,7 @@ i.info {
|
|||
justify-content: space-around;
|
||||
font-size: 1.2em;
|
||||
margin-bottom: 20px;
|
||||
border-bottom: 1px solid var(--color-lighterGray);
|
||||
border-bottom: 1px solid #bebebe;
|
||||
}
|
||||
.flat-tabs button {
|
||||
padding: 10px;
|
||||
|
@ -515,14 +516,14 @@ i.info {
|
|||
.flat-tabs button:hover,
|
||||
.flat-tabs .on {
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid var(--color-mediumGray);
|
||||
border-bottom: 1px solid #444;
|
||||
}
|
||||
.dark .flat-tabs button {
|
||||
color: var(--color-light);
|
||||
color: #fff;
|
||||
}
|
||||
.dark .flat-tabs button:hover,
|
||||
.dark .flat-tabs .on {
|
||||
border-bottom: 1px solid var(--color-light);
|
||||
border-bottom: 1px solid #fff;
|
||||
}
|
||||
.umap-pictogram-category h6 {
|
||||
font-size: 1.3em;
|
||||
|
@ -538,11 +539,11 @@ i.info {
|
|||
height: 30px;
|
||||
line-height: 30px;
|
||||
cursor: pointer;
|
||||
background-color: var(--color-lightGray);
|
||||
background-color: #999;
|
||||
text-align: center;
|
||||
margin-bottom: 5px;
|
||||
display: inline-block;
|
||||
color: var(--color-dark);
|
||||
color: black;
|
||||
font-weight: bold;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
@ -552,10 +553,10 @@ i.info {
|
|||
}
|
||||
.umap-pictogram-choice:hover,
|
||||
.umap-color-picker span:hover {
|
||||
background-color: var(--color-lighterGray);
|
||||
background-color: #bebebe;
|
||||
}
|
||||
.umap-pictogram-choice.selected {
|
||||
box-shadow: inset 0 0 0 1px var(--color-lighterGray);
|
||||
box-shadow: inset 0 0 0 1px #e9e9e9;
|
||||
}
|
||||
|
||||
.umap-pictogram-choice .leaflet-marker-icon {
|
||||
|
@ -610,11 +611,13 @@ input[type=hidden].blur + [type="button"] {
|
|||
border-radius: initial;
|
||||
}
|
||||
.copiable-input button {
|
||||
background-color: var(--background-color);
|
||||
color: var(--text-color);
|
||||
border: 2px solid var(--color-darkBlue);
|
||||
border-left: none;
|
||||
width: 40px;
|
||||
background-position: -46px -92px;
|
||||
display: inline;
|
||||
padding: 0 10px;
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
border: 1px solid #202425;
|
||||
border-radius: initial;
|
||||
}
|
||||
input.highlightable:not(:placeholder-shown) {
|
||||
border: 1px solid var(--color-brightCyan);
|
||||
|
|
|
@ -75,7 +75,7 @@ html[dir="rtl"] .icon {
|
|||
background-position: calc(var(--tile) * 4) 0;
|
||||
}
|
||||
.icon-copy {
|
||||
background-position: calc(var(--tile) * 4) calc(var(--tile) * 7);
|
||||
background-position: calc(var(--tile) * 2) calc(var(--tile) * 4);
|
||||
}
|
||||
.icon-delete {
|
||||
background-position: calc(var(--tile) * 5) calc(var(--tile) * 2);
|
||||
|
|
|
@ -59,16 +59,3 @@
|
|||
.tooltip-accent li:last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.umap-tooltip-container.tooltip-right:before {
|
||||
right: 100%;
|
||||
top: calc(50% - var(--arrow-size));
|
||||
border: solid transparent;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
border-right-color: var(--tooltip-color);
|
||||
border-width: var(--arrow-size);
|
||||
}
|
||||
|
|
|
@ -202,7 +202,7 @@
|
|||
<path id="path8" transform="translate(0 812.36)" d="m8.1903 37.424c-0.48722-0.17411-0.79231-0.44207-0.99467-0.87363l-0.1908-0.40689-1.3703-0.0034c-1.4983-0.0037-1.5911-0.03214-1.5406-0.47225l0.026557-0.23161 2.8423-0.0451 0.19827-0.3895c0.34789-0.68343 0.86349-1.0091 1.5923-1.0058 0.71771 0.0033 1.3415 0.43242 1.6291 1.1207l0.11636 0.27848h4.6574c4.5203 0 4.66 0.0047 4.7428 0.1594 0.1159 0.21656 0.10767 0.30093-0.04419 0.45278-0.11466 0.11466-0.66063 0.1295-4.7632 0.1295h-4.6337l-0.10498 0.2903c-0.15257 0.42194-0.62749 0.84447-1.1103 0.98785-0.49622 0.14736-0.6615 0.14879-1.0524 0.0091zm0.96896-0.84513c0.698-0.33122 0.698-1.3772 0-1.7084-0.35156-0.16682-0.49258-0.16849-0.82704-0.0098-0.33761 0.16021-0.5445 0.51333-0.5445 0.92936 0 0.36801 0.16007 0.60614 0.53566 0.79693 0.31576 0.16039 0.48419 0.15875 0.83587-0.0081z" fill="#f2f2f2" stroke="#999" stroke-width=".25" style="paint-order:fill markers stroke"/>
|
||||
<path id="path9" transform="translate(0 812.36)" d="m12.773 42.244c-0.4045-0.18728-0.73246-0.52685-0.9029-0.93487l-0.12875-0.30821-7.6214-0.04285-0.026557-0.23161c-0.055311-0.48238-0.16774-0.4688 3.8893-0.46961l3.7189-7.33e-4 0.21287-0.43192c0.65163-1.3222 2.4726-1.2846 3.1257 0.06446l0.17859 0.36892h2.2972c2.2584 0 2.2988 3e-3 2.391 0.17524 0.06808 0.12721 0.06936 0.22886 0.0047 0.37084l-0.08912 0.1956h-4.6108l-0.15493 0.35024c-0.38713 0.87516-1.4373 1.2865-2.2839 0.89448zm1.0632-0.70036c0.37802-0.15795 0.5443-0.42579 0.54116-0.87174-4e-3 -0.57358-0.36338-0.90877-0.9743-0.90877-0.31204 0-0.40386 0.04292-0.64992 0.30383-0.25777 0.27331-0.28248 0.33986-0.2461 0.66262 0.04524 0.40136 0.22819 0.65122 0.5956 0.81339 0.31718 0.14001 0.39991 0.14008 0.73356 6.68e-4z" fill="#f2f2f2" stroke="#999" stroke-width=".25" style="paint-order:fill markers stroke"/>
|
||||
<path id="path1-67-5" d="m154.68 963.54 4.7344 4.7344-5.0508 4.6836-1.3594-1.4668 3.5274-3.2695-3.2656-3.2656z" color="#000000" fill="#f2f2f2" fill-rule="evenodd" stroke="#999" stroke-width=".25"/>
|
||||
<path id="copy" d="m106.17 986.36v3.6522h4.1739v4.1739h3.6522v-7.8261zm-4.1739 4.1739v7.8261h7.8261v-7.8261z" fill="#f2f2f2" style="paint-order:fill markers stroke"/>
|
||||
<path id="copy" d="m58 914.36v3.5h4v4h3.5v-7.5zm-4 4v7.5h7.5v-7.5z" fill="#f2f2f2" style="paint-order:fill markers stroke"/>
|
||||
<g id="g1-5" transform="translate(.1 .1)">
|
||||
<g id="g24" fill="#f2f2f2" stroke="#999" stroke-width=".2">
|
||||
<path id="path24" d="m12 912.36c-4.4183 0-8 3.5817-8 8 0.00463 1.6156 0.49829 3.1919 1.416 4.5215 0.19802 0.28729 0.41463 0.56131 0.64844 0.82032 1.5128 1.6866 3.6699 2.6526 5.9355 2.6582 2.2669-6e-3 4.4249-0.97357 5.9375-2.6621 0.23535-0.26077 0.45327-0.53676 0.65234-0.82617 0.91377-1.3275 1.4053-2.9001 1.4102-4.5117 0-4.4183-3.5817-8-8-8zm-5.3242 12.506c1.3285-1.5609 3.2745-2.461 5.3242-2.4629 2.0504 1e-3 3.9972 0.90149 5.3262 2.4629 0 0-0.0035-3e-3 0.0059 6e-3 0 0-0.5371 0.5762-0.83984 0.82812-0.17533 0.14821-0.35784 0.2877-0.54687 0.41797-0.06626 0.0467-0.13333 0.0923-0.20117 0.13672-0.2448 0.15763-0.4992 0.29983-0.76172 0.42578-0.93187 0.44366-1.9503 0.67577-2.9824 0.67969-0.61808-5e-3 -1.2328-0.0915-1.8281-0.25781-0.67532-0.18416-1.3192-0.46858-1.9102-0.84375-0.0685-0.0444-0.13622-0.09-0.20312-0.13672-0.00521-4e-3 -0.010422-8e-3 -0.015625-0.0117-0.18766-0.12974-0.36887-0.26858-0.54297-0.41602-0.29972-0.24977-0.57803-0.52416-0.83203-0.82031m-0.5918-0.81445c-0.69766-1.1081-1.0705-2.3898-1.0762-3.6992 0-3.866 3.134-7 7-7l-4.1e-5 -1.6e-4c3.866 0 7 3.134 7 7-0.0054 1.3023-0.37406 2.5773-1.0645 3.6816-1.5163-1.6794-3.6729-2.6381-5.9355-2.6387-2.2613 8e-3 -4.4134 0.97341-5.9238 2.6562" style="paint-order:fill markers stroke"/>
|
||||
|
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
@ -62,6 +62,5 @@
|
|||
</g>
|
||||
<path id="downloadfile" d="m5.6444 59.434v1.035h1.0542zm1.1759 1.6123h-1.1759c-0.32472 0-0.58796-0.25845-0.58796-0.57727v-1.1545h-2.3519v5.1955h4.1157zm-4.1157-2.3091h3.0616l1.6421 1.6123v4.1605c0 0.31882-0.26324 0.57728-0.58796 0.57728h-4.1157c-0.32472 0-0.58796-0.25845-0.58796-0.57728v-5.1955c0-0.31882 0.26324-0.57727 0.58796-0.57727zm1.7639 3.9214v-1.3236h0.58796v1.3236l0.38009-0.37318 0.41575 0.4082-1.0898 1.07-1.0898-1.07 0.41575-0.4082z" fill="#f2f2f2" fill-rule="evenodd" stroke="#999" stroke-opacity=".5098" stroke-width=".066146"/>
|
||||
<path id="path3014" d="m4.6307 2.6463c-1.5327 0-2.7792 1.2449-2.7792 2.7776 0 1.5327 1.2464 2.7771 2.7792 2.7771 1.5327 0 2.7776-1.2443 2.7776-2.7771 0-1.5327-1.2449-2.7776-2.7776-2.7776zm0 0.26355c1.3898-1e-7 2.5141 1.1243 2.5141 2.5141 0 1.3898-1.1243 2.5135-2.5141 2.5135-1.3898-1e-7 -2.5135-1.1238-2.5135-2.5135 1e-7 -1.3898 1.1238-2.5141 2.5135-2.5141zm-0.0041342 0.75034c-0.14358 0-0.29261 0.015464-0.447 0.046509-0.15439 0.030939-0.3253 0.078749-0.51211 0.14366v0.72864c0.15748-0.10213 0.30911-0.17843 0.45424-0.22944 0.14512-0.052458 0.28009-0.079065 0.40514-0.079065 0.13277 0 0.23595 0.03107 0.31006 0.093018 0.074105 0.06029 0.1111 0.14436 0.1111 0.2527-1.6e-6 0.071155-0.020845 0.1422-0.062528 0.21342-0.040142 0.071155-0.10424 0.14694-0.19224 0.22738l-0.14779 0.13488c-0.16365 0.15162-0.271 0.27666-0.32194 0.37569-0.050949 0.097508-0.076481 0.21007-0.076481 0.33693v0.11369h0.83612v-0.10439c-1.7e-6 -0.069638 0.016152-0.13347 0.048576-0.19069 0.03242-0.058808 0.1012-0.13607 0.20619-0.23203l0.14779-0.13229c0.14512-0.13769 0.24778-0.26586 0.30799-0.38499 0.060208-0.12069 0.090431-0.25714 0.090434-0.40876-2.5e-6 -0.29549-0.098491-0.51969-0.29611-0.67283-0.19762-0.15469-0.48474-0.23203-0.86145-0.23203zm-0.47956 2.7016v0.82579h0.83612v-0.82579h-0.83612z" fill="#f2f2f2" stroke="#999" stroke-width=".066146"/>
|
||||
<path id="copy" d="m42.218 69.321v1.2884h1.4725v1.4725h1.2884v-2.7609zm-1.4725 1.4725v2.7609h2.7609v-2.7609z" fill="#f2f2f2" stroke-width=".26458" style="paint-order:fill markers stroke"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
@ -31,7 +31,7 @@
|
|||
<path id="permissions" class="sprite" d="m60.085 50.8c-0.89012-0.0021-1.6103 0.71168-1.6123 1.5875 2e-3 0.87776 0.72218 1.5861 1.6123 1.5875 0.59351-8.73e-4 1.1105-0.32112 1.3891-0.79375h0.65319l0.5209-0.50436 0.39688 0.38034 0.38034-0.37207 0.38861 0.38034 0.39688-0.38034 0.38861 0.38034 0.67799-0.65319c0.09761-0.09927 0.10002-0.17419 0-0.27285l-0.55397-0.5457h-3.2411c-0.27712-0.47713-0.79976-0.79498-1.3973-0.79375zm-0.7028 1.1576c0.23396-0.0011 0.4199 0.18746 0.42168 0.42168-0.0017 0.23096-0.18761 0.41954-0.42168 0.42168-0.23793-0.0024-0.43214-0.19072-0.42995-0.42168-0.0022-0.23422 0.19202-0.4228 0.42995-0.42168z" fill="#4d4d4d" stroke-width=".26458"/>
|
||||
<polygon id="home" class="sprite" transform="matrix(.0635 0 0 .0635 30.162 20.902)" points="12.5 50 12.5 87.5 43.75 87.5 43.75 62.5 56.25 62.5 56.25 87.5 87.5 87.5 87.5 50 100 50 50 0 0 50" fill="#4d4d4d"/>
|
||||
<path id="geolocation" class="sprite" d="m7.9375 33.338c0-0.11924-0.0078-0.23671-0.02082-0.35278h-0.35666c-0.1591-1.276-1.1688-2.2856-2.4448-2.4451v-0.35631c-0.11606-0.01304-0.23354-0.02082-0.35278-0.02082s-0.23671 0.0078-0.35278 0.02082v0.35666c-1.276 0.1591-2.2856 1.1688-2.4451 2.4448h-0.3563c-0.01305 0.11606-0.02081 0.23354-0.02081 0.35278 0 0.11924 0.0078 0.23671 0.02081 0.35278h0.35666c0.1591 1.276 1.1688 2.2857 2.4448 2.4451v0.35666c0.11606 0.0127 0.23354 0.02037 0.35278 0.02037s0.23671-0.0077 0.35278-0.0209v-0.35666c1.2756-0.15944 2.2856-1.1688 2.4451-2.4448h0.35666c0.0127-0.11571 0.02046-0.23319 0.02046-0.35278zm-2.8222 2.0849v-0.32104c0-0.19508-0.15804-0.35278-0.35278-0.35278-0.19473 0-0.35278 0.15769-0.35278 0.35278v0.32104c-0.88547-0.14888-1.5829-0.84597-1.7318-1.7318l0.32068-2.65e-4c0.19509 0 0.35278-0.15805 0.35278-0.35278s-0.15769-0.35278-0.35278-0.35278h-0.32103c0.14922-0.88547 0.84667-1.5829 1.7321-1.7321v0.32103c0 0.19473 0.15804 0.35278 0.35278 0.35278 0.19473 0 0.35278-0.15804 0.35278-0.35278v-0.32103c0.88582 0.14887 1.5833 0.84632 1.7321 1.7321h-0.32103c-0.19509 0-0.35278 0.15804-0.35278 0.35278s0.15769 0.35278 0.35278 0.35278l0.32103 2.65e-4c-0.14922 0.88582-0.84631 1.5829-1.7321 1.7318z" fill="#4d4d4d" stroke-width=".26458"/>
|
||||
<g id="share" class="sprite" transform="matrix(.26458 0 0 .26458 -21.696 -210.18)">
|
||||
<g id="share" class="sprite" transform="matrix(.26458 0 0 .26458 -2.6458 -229.23)">
|
||||
<circle id="path4309" cx="100" cy="992.36" r="11" fill="none" stroke="#464646" stroke-width="2"/>
|
||||
<circle id="path4819" transform="rotate(248.18)" cx="-963.89" cy="-276.04" r="2.5" fill="#464646"/>
|
||||
<circle id="path4819-2" transform="rotate(248.18)" cx="-956.38" cy="-281.16" r="2.5" fill="#464646"/>
|
||||
|
@ -97,6 +97,5 @@
|
|||
<path id="path3789" d="m9 1046h-2.3698v-0.3223c0-0.3596 0.072207-0.6775 0.21663-0.9539 0.14442-0.2807 0.44857-0.636 0.91247-1.0658l0.42013-0.3816c0.24945-0.228 0.43107-0.4429 0.54486-0.6446 0.11816-0.2019 0.17724-0.4036 0.17724-0.6053-4.6e-6 -0.3071-0.10504-0.5462-0.3151-0.7171-0.21007-0.1756-0.50329-0.2632-0.87965-0.2632-0.35449 0-0.73742 0.075-1.1488 0.2237-0.41138 0.1446-0.84026 0.3618-1.2867 0.6513v-2.0659c0.52954-0.184 1.0131-0.32 1.4508-0.4077 0.43763-0.088 0.85995-0.1317 1.267-0.1317 1.0678 0 1.8818 0.2194 2.442 0.6579 0.56017 0.4341 0.84026 1.0702 0.84026 1.9078-7e-6 0.4298-0.08535 0.8159-0.25602 1.158-0.17068 0.3377-0.46171 0.7017-0.87308 1.092l-0.42013 0.375c-0.2976 0.272-0.49235 0.4913-0.58425 0.658-0.091909 0.1622-0.13786 0.342-0.13786 0.5394v0.296m-2.3698 0.9739h2.3698v2.342h-2.3698v-2.342" fill="#4d4d4d" stroke-width=".75"/>
|
||||
</g>
|
||||
</g>
|
||||
<path id="copy" d="m42.218 69.321v1.2884h1.4725v1.4725h1.2884v-2.7609zm-1.4725 1.4725v2.7609h2.7609v-2.7609z" fill="#4d4d4d" stroke-width=".26458" style="paint-order:fill markers stroke"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg width="216" height="192" id="svg2" version="1.1" inkscape:version="1.4.1 (93de688d07, 2025-03-30)" sodipodi:docname="16-white.svg" inkscape:export-filename="16-white.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<svg width="216" height="192" id="svg2" version="1.1" inkscape:version="1.4 (e7c3feb100, 2024-10-09)" sodipodi:docname="16-white.svg" inkscape:export-filename="16-white.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<defs id="defs4">
|
||||
<clipPath id="clip0_241_10857">
|
||||
<rect width="18.049999" height="19.01" fill="#ffffff" id="rect586" x="0" y="0" />
|
||||
|
@ -25,7 +25,7 @@
|
|||
<rect width="18.049999" height="19.01" fill="#ffffff" id="rect586-6" x="0" y="0" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="25.78129" inkscape:cx="104.97923" inkscape:cy="178.69548" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" inkscape:window-width="1920" inkscape:window-height="1011" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" showguides="true" inkscape:guide-bbox="true" inkscape:snap-grids="true" inkscape:snap-to-guides="true" inkscape:showpageshadow="2" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1">
|
||||
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="4.4320814" inkscape:cx="116.08541" inkscape:cy="109.65503" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" inkscape:window-width="1920" inkscape:window-height="1011" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" showguides="true" inkscape:guide-bbox="true" inkscape:snap-grids="true" inkscape:snap-to-guides="true" inkscape:showpageshadow="2" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1">
|
||||
<inkscape:grid type="xygrid" id="grid3004" empspacing="4" visible="true" enabled="true" snapvisiblegridlinesonly="true" originx="0" originy="0" spacingy="1" spacingx="1" units="px" />
|
||||
<inkscape:grid id="grid1" units="px" originx="0" originy="0" spacingx="24" spacingy="24" empcolor="#203fff" empopacity="0.85490196" color="#3f3fff" opacity="0.1254902" empspacing="1" enabled="true" visible="true" />
|
||||
</sodipodi:namedview>
|
||||
|
@ -213,7 +213,7 @@
|
|||
<path style="fill:#f2f2f2;stroke:#999999;stroke-width:0.25;paint-order:fill markers stroke" d="m 8.1902877,37.423896 c -0.4872187,-0.174113 -0.7923051,-0.442073 -0.9946703,-0.873627 l -0.1907982,-0.406887 -1.3702708,-0.0034 c -1.4982701,-0.0037 -1.5910875,-0.03214 -1.5406237,-0.47225 l 0.026557,-0.23161 1.4211632,-0.02255 1.4211632,-0.02255 0.1982698,-0.389502 c 0.347892,-0.683434 0.8634941,-1.009111 1.592299,-1.005764 0.7177082,0.0033 1.3415151,0.432422 1.6290831,1.120669 l 0.116359,0.278485 h 4.65745 c 4.520341,0 4.659962,0.0047 4.742759,0.159402 0.1159,0.216562 0.107667,0.300926 -0.04419,0.452784 -0.114657,0.114657 -0.660626,0.129501 -4.763204,0.129501 h -4.633703 l -0.104975,0.290304 c -0.152574,0.421935 -0.6274874,0.844474 -1.1103021,0.987854 -0.4962156,0.147361 -0.6614998,0.148792 -1.0523644,0.0091 z m 0.9689602,-0.845129 c 0.6980003,-0.331223 0.6980003,-1.377155 0,-1.708378 -0.3515556,-0.166824 -0.4925823,-0.168492 -0.8270409,-0.0098 -0.3376099,0.160207 -0.5444962,0.513326 -0.5444962,0.929363 0,0.368008 0.1600657,0.606145 0.5356626,0.796928 0.3157622,0.16039 0.4841923,0.158752 0.8358745,-0.0081 z" id="path8" transform="translate(0,812.36218)" />
|
||||
<path style="fill:#f2f2f2;stroke:#999999;stroke-width:0.25;paint-order:fill markers stroke" d="m 12.773494,42.243521 c -0.4045,-0.187277 -0.732456,-0.526846 -0.902897,-0.934868 l -0.128748,-0.308213 -3.8106837,-0.02143 -3.8106834,-0.02142 -0.026557,-0.23161 c -0.055311,-0.482381 -0.1677415,-0.468805 3.8892984,-0.469606 l 3.7189457,-7.33e-4 0.21287,-0.431917 c 0.651632,-1.322166 2.472575,-1.284611 3.125651,0.06446 l 0.178591,0.36892 h 2.297219 c 2.258426,0 2.298803,0.003 2.391007,0.175244 0.06808,0.127207 0.06936,0.228859 0.0047,0.370843 l -0.08912,0.1956 h -2.305381 -2.30538 l -0.15493,0.350241 c -0.387132,0.875164 -1.437261,1.286451 -2.283867,0.894485 z m 1.063202,-0.700358 c 0.378023,-0.157949 0.544298,-0.425794 0.541165,-0.871741 -0.004,-0.573585 -0.363385,-0.908772 -0.974299,-0.908772 -0.312041,0 -0.40386,0.04292 -0.649922,0.303826 -0.257768,0.273313 -0.282484,0.339859 -0.246104,0.662621 0.04524,0.401361 0.228194,0.651219 0.595596,0.813394 0.317179,0.140006 0.399909,0.140082 0.733564,6.68e-4 z" id="path9" transform="translate(0,812.36218)" />
|
||||
<path style="color:#000000;fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:0.25;stroke-dasharray:none;stroke-opacity:1" d="m 154.67579,963.53902 4.73437,4.73437 -5.05078,4.6836 -1.35938,-1.4668 3.52735,-3.26953 -3.26563,-3.26563 z" id="path1-67-5" />
|
||||
<path id="copy" style="fill:#f2f2f2;fill-opacity:1;stroke-width:1;paint-order:fill markers stroke" d="m 106.17392,986.36222 v 3.65217 h 4.17391 v 4.17392 h 3.65217 v -7.82609 z m -4.17392,4.17391 v 7.82609 h 7.82609 v -7.82609 z" />
|
||||
<path id="copy" style="fill:#f2f2f2;fill-opacity:1;paint-order:fill markers stroke" d="m 58,914.36218 v 3.5 h 4 v 4 h 3.5 v -7.5 z m -4,4 v 7.5 h 7.5 v -7.5 z" />
|
||||
<g id="g1-5" transform="translate(0.1,0.1)">
|
||||
<g id="g24">
|
||||
<path d="m 12,912.36218 c -4.4182692,0 -8,3.58172 -8,8 0.00463,1.61557 0.4982915,3.19189 1.4160156,4.52148 0.1980248,0.28729 0.4146342,0.56131 0.6484375,0.82032 1.5128357,1.68659 3.6698868,2.65261 5.9355469,2.6582 2.266949,-0.006 4.424914,-0.97357 5.9375,-2.66211 0.23535,-0.26077 0.45327,-0.53676 0.652344,-0.82617 0.913769,-1.32754 1.405284,-2.9001 1.410156,-4.51172 0,-4.41828 -3.58173,-8 -8,-8 z m -5.3242188,12.50586 c 1.3285496,-1.56088 3.274489,-2.46104 5.3242188,-2.46289 2.050412,10e-4 3.997179,0.90149 5.326172,2.46289 0,0 -0.0035,-0.003 0.0059,0.006 0,0 -0.537098,0.5762 -0.839844,0.82812 -0.175326,0.14821 -0.35784,0.2877 -0.546874,0.41797 -0.06626,0.0467 -0.133328,0.0923 -0.201172,0.13672 -0.244804,0.15763 -0.499205,0.29983 -0.761719,0.42578 -0.931874,0.44366 -1.950332,0.67577 -2.982422,0.67969 -0.618083,-0.005 -1.232807,-0.0915 -1.828125,-0.25781 -0.6753225,-0.18416 -1.3192066,-0.46858 -1.9101562,-0.84375 -0.0685,-0.0444 -0.1362192,-0.09 -0.203125,-0.13672 -0.00521,-0.004 -0.010422,-0.008 -0.015625,-0.0117 -0.1876607,-0.12974 -0.3688672,-0.26858 -0.5429688,-0.41602 -0.2997188,-0.24977 -0.5780329,-0.52416 -0.8320313,-0.82031 m -0.5917968,-0.81445 c -0.6976631,-1.10814 -1.0705109,-2.38976 -1.0761719,-3.69922 0,-3.86599 3.1340146,-7 7,-7 l -4.1e-5,-1.6e-4 c 3.865985,0 7,3.13401 7,7 -0.0054,1.30234 -0.374061,2.57734 -1.064453,3.68164 -1.516341,-1.67935 -3.672913,-2.63806 -5.935547,-2.63867 -2.2612709,0.008 -4.4133749,0.97341 -5.9238281,2.65625" style="fill:#f2f2f2;stroke:#999999;stroke-width:0.2;paint-order:fill markers stroke" id="path24" sodipodi:nodetypes="scccccccsccccccccccccccccccccccc" />
|
||||
|
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg width="288" height="288" viewBox="0 0 76.199991 76.199991" version="1.1" id="svg2876" inkscape:version="1.4.1 (93de688d07, 2025-03-30)" sodipodi:docname="24-white.svg" inkscape:export-filename="../24-white.svg" inkscape:export-xdpi="7.52" inkscape:export-ydpi="7.52" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview id="namedview2878" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:showpageshadow="2" inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:document-units="px" showgrid="true" showguides="true" inkscape:zoom="7.9044052" inkscape:cx="138.0243" inkscape:cy="242.26997" inkscape:window-width="1920" inkscape:window-height="1011" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="layer1">
|
||||
<svg width="288" height="288" viewBox="0 0 76.199991 76.199991" version="1.1" id="svg2876" inkscape:version="1.4 (e7c3feb100, 2024-10-09)" sodipodi:docname="24-white.svg" inkscape:export-filename="../24-white.svg" inkscape:export-xdpi="7.52" inkscape:export-ydpi="7.52" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview id="namedview2878" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:showpageshadow="2" inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:document-units="px" showgrid="true" showguides="true" inkscape:zoom="8.896373" inkscape:cx="51.706465" inkscape:cy="46.423413" inkscape:window-width="1920" inkscape:window-height="1011" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="layer1">
|
||||
<inkscape:grid type="xygrid" id="grid2997" empspacing="6" originx="0" originy="0" spacingy="0.2645833" spacingx="0.2645833" units="px" visible="true" />
|
||||
<inkscape:grid id="grid1" units="px" originx="0" originy="0" spacingx="9.5249989" spacingy="9.5249989" empcolor="#3f3fff" empopacity="0.25098039" color="#3f3fff" opacity="0.1254902" empspacing="1" dotted="false" gridanglex="30" gridanglez="30" visible="true" />
|
||||
</sodipodi:namedview>
|
||||
|
@ -77,6 +77,5 @@
|
|||
<path d="m 5.6444435,59.43432 v 1.034991 h 1.0541546 z m 1.1759257,1.612262 h -1.1759257 c -0.3247228,0 -0.5879626,-0.258453 -0.5879626,-0.577271 v -1.154545 h -2.3518514 v 5.195451 h 4.1157397 z m -4.1157397,-2.309089 h 3.0615854 l 1.6421175,1.612259 v 4.160465 c 0,0.318822 -0.2632403,0.577275 -0.5879632,0.577275 h -4.1157397 c -0.3247231,0 -0.5879631,-0.258453 -0.5879631,-0.577275 v -5.195451 c 0,-0.31882 0.26324,-0.577273 0.5879631,-0.577273 z m 1.7638882,3.92135 v -1.323625 h 0.5879632 v 1.323625 l 0.3800861,-0.373177 0.415753,0.408196 -1.0898206,1.070004 -1.0898208,-1.070004 0.4157526,-0.408196 z" fill-rule="evenodd" id="downloadfile" style="fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:0.0661458;stroke-dasharray:none;stroke-opacity:0.509804" />
|
||||
<path id="path3014" style="fill:#f2f2f2;stroke:#999999;stroke-opacity:1;stroke-width:0.06614583;stroke-dasharray:none;fill-opacity:1" d="M 4.6307246 2.6463498 C 3.0979756 2.6463498 1.8515665 3.8912088 1.8515664 5.4239577 C 1.8515664 6.9567067 3.0979756 8.2010487 4.6307246 8.2010488 C 6.1634736 8.2010488 7.4083325 6.9567067 7.4083325 5.4239577 C 7.4083325 3.8912088 6.1634735 2.6463498 4.6307246 2.6463498 z M 4.6307246 2.9098996 C 6.0204823 2.9098995 7.1447827 4.0342 7.1447827 5.4239577 C 7.1447827 6.8137155 6.0204823 7.9374991 4.6307246 7.9374991 C 3.2409669 7.937499 2.1171832 6.8137154 2.1171832 5.4239577 C 2.1171833 4.0342 3.2409669 2.9098996 4.6307246 2.9098996 z M 4.6265904 3.6602413 C 4.4830079 3.6602413 4.3339769 3.6757056 4.1795894 3.7067501 C 4.0252001 3.7376887 3.8542856 3.7854994 3.667476 3.8504105 L 3.667476 4.5790481 C 3.8249518 4.476919 3.9765859 4.4006165 4.1217118 4.3496048 C 4.2668361 4.2971467 4.4017991 4.2705399 4.5268549 4.2705399 C 4.6596277 4.2705399 4.7628056 4.3016097 4.8369135 4.3635574 C 4.9110183 4.4238471 4.9480162 4.5079171 4.9480178 4.6162552 C 4.9480162 4.6874104 4.9271727 4.758453 4.8854893 4.8296788 C 4.8453469 4.9008341 4.7812531 4.9766217 4.693253 5.0570551 L 4.5454584 5.1919305 C 4.3818056 5.3435544 4.2744616 5.4685934 4.2235143 5.5676182 C 4.172565 5.6651259 4.1470332 5.7776896 4.1470332 5.9045485 L 4.1470332 6.0182366 L 4.9831578 6.0182366 L 4.9831578 5.9138502 C 4.9831561 5.8442119 4.9993102 5.7803848 5.0317336 5.7231642 C 5.0641535 5.6643561 5.1329366 5.5870926 5.2379226 5.491137 L 5.3857171 5.3588454 C 5.53084 5.2211562 5.6334948 5.0929891 5.6937086 4.973856 C 5.7539162 4.8531707 5.7841399 4.7167194 5.7841424 4.5650955 C 5.7841399 4.2696088 5.6856516 4.0454092 5.4880365 3.8922684 C 5.2904177 3.7375754 5.0032968 3.6602413 4.6265904 3.6602413 z M 4.1470332 6.3618848 L 4.1470332 7.1876741 L 4.9831578 7.1876741 L 4.9831578 6.3618848 L 4.1470332 6.3618848 z " />
|
||||
<g id="text3784" style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#4d4d4d;fill-opacity:1;stroke:none;stroke-width:0.75" transform="matrix(0.35277776,0,0,0.35277776,1.8079862,-363.00384)" />
|
||||
<path id="copy" style="fill:#f2f2f2;stroke-width:0.264582;paint-order:fill markers stroke;fill-opacity:1" d="m 42.218298,69.320832 v 1.288405 h 1.472463 v 1.472465 h 1.288405 v -2.76087 z m -1.472465,1.472463 v 2.760871 h 2.760869 v -2.760871 z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg width="288" height="288" viewBox="0 0 76.199999 76.199999" version="1.1" id="svg6237" inkscape:version="1.4.1 (93de688d07, 2025-03-30)" sodipodi:docname="24.svg" inkscape:export-filename="../24.svg" inkscape:export-xdpi="7.52" inkscape:export-ydpi="7.52" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview id="namedview6239" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:showpageshadow="2" inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:document-units="px" showgrid="true" showguides="true" inkscape:zoom="8.9060631" inkscape:cx="172.74748" inkscape:cy="256.79135" inkscape:window-width="1920" inkscape:window-height="1011" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="layer1">
|
||||
<svg width="288" height="288" viewBox="0 0 76.199999 76.199999" version="1.1" id="svg6237" inkscape:version="1.4 (e7c3feb100, 2024-10-09)" sodipodi:docname="24.svg" inkscape:export-filename="../24.svg" inkscape:export-xdpi="7.52" inkscape:export-ydpi="7.52" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview id="namedview6239" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:showpageshadow="2" inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:document-units="px" showgrid="true" showguides="true" inkscape:zoom="5.1755289" inkscape:cx="321.22321" inkscape:cy="85.788333" inkscape:window-width="1920" inkscape:window-height="1011" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="layer1">
|
||||
<inkscape:grid type="xygrid" id="grid6358" empspacing="6" originx="0" originy="0" spacingy="0.26458333" spacingx="0.26458333" units="px" visible="true" />
|
||||
<inkscape:grid id="grid1" units="px" originx="0" originy="0" spacingx="9.5249999" spacingy="9.5249999" empcolor="#3f3fff" empopacity="0.25098039" color="#ff0000" opacity="0.83529412" empspacing="0" dotted="false" gridanglex="30" gridanglez="30" visible="true" />
|
||||
</sodipodi:namedview>
|
||||
|
@ -44,7 +44,7 @@
|
|||
<path d="m 60.085221,50.800004 c -0.890121,-0.0021 -1.610321,0.711677 -1.612305,1.5875 0.002,0.877761 0.722184,1.586074 1.612305,1.5875 0.593513,-8.73e-4 1.110529,-0.321123 1.389062,-0.79375 h 0.65319 l 0.520899,-0.504362 0.396875,0.380339 0.380338,-0.37207 0.388607,0.380338 0.396875,-0.380338 0.388607,0.380338 0.677994,-0.65319 c 0.09761,-0.09927 0.100016,-0.174188 0,-0.272852 l -0.553971,-0.545703 h -3.241146 c -0.277124,-0.47713 -0.799763,-0.794983 -1.39733,-0.79375 z m -0.7028,1.157552 c 0.233962,-0.0011 0.419905,0.187463 0.42168,0.42168 -0.0017,0.230958 -0.187613,0.419542 -0.42168,0.42168 -0.237929,-0.0024 -0.43214,-0.190722 -0.429948,-0.42168 -0.0022,-0.234217 0.192019,-0.422799 0.429948,-0.42168 z" id="permissions" style="fill:#4d4d4d;fill-opacity:1;stroke-width:0.264583" class="sprite" />
|
||||
<polygon points="12.5,50 12.5,87.5 43.75,87.5 43.75,62.5 56.25,62.5 56.25,87.5 87.5,87.5 87.5,50 100,50 50,0 0,50 " id="home" transform="matrix(0.0635,0,0,0.0635,30.162499,20.902083)" style="fill:#4d4d4d;fill-opacity:1" class="sprite" />
|
||||
<path inkscape:connector-curvature="0" d="m 7.937502,33.337505 c 0,-0.119238 -0.0078,-0.236713 -0.02082,-0.352777 h -0.356658 c -0.159103,-1.275998 -1.168753,-2.285648 -2.44475,-2.445102 v -0.356307 c -0.116064,-0.01304 -0.233539,-0.02082 -0.352778,-0.02082 -0.119239,0 -0.236714,0.0078 -0.352778,0.02082 v 0.356659 c -1.275997,0.159102 -2.285647,1.168752 -2.445103,2.44475 h -0.356305 c -0.01305,0.116064 -0.02081,0.233539 -0.02081,0.352777 0,0.119239 0.0078,0.236714 0.02081,0.352779 h 0.356658 c 0.159103,1.275996 1.168753,2.285659 2.44475,2.445123 v 0.356658 c 0.116064,0.0127 0.233539,0.02037 0.352778,0.02037 0.119239,0 0.236714,-0.0077 0.352778,-0.0209 v -0.356658 c 1.275644,-0.159438 2.285647,-1.168757 2.445102,-2.444753 h 0.356659 c 0.0127,-0.115712 0.02046,-0.233187 0.02046,-0.352779 z m -2.822223,2.084929 v -0.32104 c 0,-0.195085 -0.158044,-0.352777 -0.352777,-0.352777 -0.194734,0 -0.352778,0.157692 -0.352778,0.352777 v 0.32104 c -0.885472,-0.148883 -1.582914,-0.845973 -1.731786,-1.731798 l 0.320675,-2.65e-4 c 0.195086,0 0.352778,-0.158046 0.352778,-0.352779 0,-0.194733 -0.157692,-0.352777 -0.352778,-0.352777 h -0.321028 c 0.149225,-0.885473 0.846667,-1.582915 1.732139,-1.73214 v 0.32103 c 0,0.194733 0.158044,0.352777 0.352778,0.352777 0.194733,0 0.352777,-0.158044 0.352777,-0.352777 v -0.32103 c 0.885825,0.148873 1.583267,0.846315 1.732139,1.73214 h -0.321028 c -0.195086,0 -0.352777,0.158044 -0.352777,0.352777 0,0.194733 0.157691,0.352779 0.352777,0.352779 l 0.321028,2.65e-4 c -0.149225,0.885825 -0.846314,1.582915 -1.732139,1.731798 z" id="geolocation" style="fill:#4d4d4d;fill-opacity:1;stroke-width:0.264583" class="sprite" />
|
||||
<g id="share" class="sprite" transform="matrix(0.26458333,0,0,0.26458333,-21.695832,-210.17502)">
|
||||
<g id="share" class="sprite" transform="matrix(0.26458333,0,0,0.26458333,-2.6458336,-229.22505)">
|
||||
<circle id="path4309" style="fill:none;stroke:#464646;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" cx="100" cy="992.3623" r="11" />
|
||||
<circle transform="rotate(-111.82202)" id="path4819" style="fill:#464646;fill-opacity:1;stroke:none;stroke-width:4.28879" cx="-963.88702" cy="-276.03735" r="2.5" />
|
||||
<circle transform="rotate(-111.82202)" id="path4819-2" style="fill:#464646;fill-opacity:1;stroke:none;stroke-width:4.28879" cx="-956.38037" cy="-281.15619" r="2.5" />
|
||||
|
@ -77,7 +77,7 @@
|
|||
</g>
|
||||
<path style="fill:#464646;fill-opacity:1;stroke:none;stroke-width:1.84551;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" inkscape:transform-center-x="-0.0017170804" inkscape:transform-center-y="-1.1593678" d="m 31.537126,45.771563 0.577355,-2.184903 -1.687401,-1.349931 h 2.154994 l 0.756436,-2.28465 0.754501,2.284227 h 2.154902 l -1.688682,1.351121 0.575368,2.185485 -1.798166,-1.252432 z" id="star" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccc" class="sprite" />
|
||||
<path style="fill:none;fill-opacity:1;stroke:#464646;stroke-width:0.264583;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" inkscape:transform-center-x="-0.0017170804" inkscape:transform-center-y="-1.1593678" d="m 40.742193,45.771563 0.577355,-2.184903 -1.687401,-1.349931 h 2.154994 l 0.756436,-2.28465 0.754502,2.284227 h 2.154901 l -1.688682,1.351121 0.575368,2.185485 -1.798169,-1.252432 z" id="starred" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccc" class="sprite" />
|
||||
<path d="m 45.33157,52.032514 0.367177,0.21791 c 0.07232,0.04294 0.09577,0.135732 0.0524,0.207275 -0.01292,0.02122 -0.03092,0.03903 -0.0524,0.0518 l -2.836254,1.6832 -2.836235,-1.6832 c -0.07233,-0.04294 -0.09579,-0.135704 -0.05238,-0.207274 0.0129,-0.02125 0.03089,-0.03905 0.05238,-0.05181 l 0.367179,-0.21791 2.469056,1.465315 z m 0,1.419992 0.367177,0.217911 c 0.07232,0.04294 0.09577,0.135731 0.0524,0.207274 -0.01292,0.02125 -0.03092,0.03903 -0.0524,0.05181 l -2.679097,1.58996 c -0.09674,0.05739 -0.217576,0.05739 -0.314315,0 l -2.679077,-1.58996 c -0.07233,-0.04292 -0.09579,-0.135705 -0.05238,-0.207249 0.0129,-0.02127 0.03089,-0.03908 0.05238,-0.05183 l 0.367179,-0.217911 2.469056,1.465315 z m -2.31192,-4.196946 2.679097,1.589967 c 0.07232,0.04292 0.09577,0.135715 0.0524,0.207256 -0.01292,0.02126 -0.03092,0.03906 -0.0524,0.05182 l -2.836254,1.683221 -2.836235,-1.683221 c -0.07233,-0.04292 -0.09579,-0.135716 -0.05238,-0.207256 0.0129,-0.02126 0.03089,-0.03906 0.05238,-0.05182 l 2.679077,-1.589967 c 0.09674,-0.05741 0.217576,-0.05741 0.314315,0 z" fill="#4d4d4d" id="datalayers" style="stroke-width:0.264583" />
|
||||
<path d="m 45.33157,52.032511 0.367177,0.21791 c 0.07232,0.04294 0.09577,0.135732 0.0524,0.207275 -0.01292,0.02122 -0.03092,0.03903 -0.0524,0.0518 l -2.836254,1.6832 -2.836235,-1.6832 c -0.07233,-0.04294 -0.09579,-0.135704 -0.05238,-0.207274 0.0129,-0.02125 0.03089,-0.03905 0.05238,-0.05181 l 0.367179,-0.21791 2.469056,1.465315 z m 0,1.419992 0.367177,0.217911 c 0.07232,0.04294 0.09577,0.135731 0.0524,0.207274 -0.01292,0.02125 -0.03092,0.03903 -0.0524,0.05181 l -2.679097,1.58996 c -0.09674,0.05739 -0.217576,0.05739 -0.314315,0 l -2.679077,-1.58996 c -0.07233,-0.04292 -0.09579,-0.135705 -0.05238,-0.207249 0.0129,-0.02127 0.03089,-0.03908 0.05238,-0.05183 l 0.367179,-0.217911 2.469056,1.465315 z m -2.31192,-4.196946 2.679097,1.589967 c 0.07232,0.04292 0.09577,0.135715 0.0524,0.207256 -0.01292,0.02126 -0.03092,0.03906 -0.0524,0.05182 l -2.836254,1.683221 -2.836235,-1.683221 c -0.07233,-0.04292 -0.09579,-0.135716 -0.05238,-0.207256 0.0129,-0.02126 0.03089,-0.03906 0.05238,-0.05182 l 2.679077,-1.589967 c 0.09674,-0.05741 0.217576,-0.05741 0.314315,0 z" fill="#4d4d4d" id="datalayers" style="stroke-width:0.264583" />
|
||||
<g id="tilelayers" transform="translate(19.049999,56.885416)">
|
||||
<path d="m 26.772659,3.4276506 h -4.243945 c -0.07035,0 -0.137814,0.027945 -0.187558,0.077687 -0.04974,0.049744 -0.07769,0.1172104 -0.07769,0.1875578 v 4.2439431 c 0,0.070353 0.02794,0.1378215 0.07769,0.1875631 0.04974,0.049742 0.11721,0.077682 0.187558,0.077682 h 4.243945 c 0.07035,0 0.137822,-0.02794 0.187563,-0.077682 0.04974,-0.049742 0.07768,-0.1172104 0.07768,-0.1875631 v -4.2439431 c 0,-0.070347 -0.02794,-0.1378135 -0.07768,-0.1875578 -0.04974,-0.049742 -0.11721,-0.077687 -0.187563,-0.077687 z m -0.265245,4.1590648 h -3.713453 v -3.546348 h 3.713453 z" fill="#464646" id="path2349" style="stroke-width:0.264583" />
|
||||
<g mask="url(#mask0_181_11898)" id="g2376" transform="matrix(0.26458333,0,0,0.26458333,20.637501,1.8520833)">
|
||||
|
@ -110,6 +110,5 @@
|
|||
<path inkscape:connector-curvature="0" id="path3789" style="font-weight:bold;font-size:12px;-inkscape-font-specification:'Sans Bold';fill:#4d4d4d;stroke-width:0.75" d="m 9,1046.0464 h -2.3698034 v -0.3223 c 0,-0.3596 0.072207,-0.6775 0.2166302,-0.9539 0.1444174,-0.2807 0.4485749,-0.636 0.9124728,-1.0658 l 0.4201314,-0.3816 c 0.249449,-0.228 0.4310681,-0.4429 0.5448577,-0.6446 0.1181576,-0.2019 0.1772384,-0.4036 0.177243,-0.6053 -4.6e-6,-0.3071 -0.1050376,-0.5462 -0.3150985,-0.7171 -0.2100697,-0.1756 -0.5032861,-0.2632 -0.87965,-0.2632 -0.3544889,0 -0.7374207,0.075 -1.1487968,0.2237 -0.4113804,0.1446 -0.840264,0.3618 -1.2866522,0.6513 v -2.0659 c 0.5295391,-0.184 1.0131273,-0.32 1.4507661,-0.4077 0.437634,-0.088 0.8599531,-0.1317 1.2669587,-0.1317 1.0678292,0 1.8818328,0.2194 2.442012,0.6579 0.560169,0.4341 0.840256,1.0702 0.840263,1.9078 -7e-6,0.4298 -0.08535,0.8159 -0.256017,1.158 -0.170685,0.3377 -0.461713,0.7017 -0.873085,1.092 l -0.4201313,0.375 c -0.297598,0.272 -0.4923463,0.4913 -0.5842451,0.658 -0.091909,0.1622 -0.1378603,0.342 -0.1378556,0.5394 v 0.296 m -2.3698034,0.9739 h 2.3698034 v 2.342 h -2.3698034 v -2.342" sodipodi:nodetypes="ccsccccccsccccsccccccccccccc" />
|
||||
</g>
|
||||
</g>
|
||||
<path id="copy" style="fill:#4d4d4d;stroke-width:0.264582;paint-order:fill markers stroke" d="m 42.218298,69.320832 v 1.288405 h 1.472463 v 1.472465 h 1.288405 v -2.76087 z m -1.472465,1.472463 v 2.760871 h 2.760869 v -2.760871 z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 40 KiB |
|
@ -7,7 +7,6 @@ import {
|
|||
import { translate } from './i18n.js'
|
||||
import { Request, ServerRequest } from './request.js'
|
||||
import { escapeHTML, generateId } from './utils.js'
|
||||
import * as Utils from './utils.js'
|
||||
|
||||
export class BaseAutocomplete {
|
||||
constructor(parent, options) {
|
||||
|
@ -292,9 +291,10 @@ class BaseServerAjax extends BaseAjax {
|
|||
export const SingleMixin = (Base) =>
|
||||
class extends Base {
|
||||
initSelectedContainer() {
|
||||
const el = Utils.loadTemplate('<div class="umap-singleresult"></div>')
|
||||
this.input.parentNode.insertBefore(el, this.input.nextSibling)
|
||||
return el
|
||||
return DomUtil.after(
|
||||
this.input,
|
||||
DomUtil.element({ tagName: 'div', className: 'umap-singleresult' })
|
||||
)
|
||||
}
|
||||
|
||||
displaySelected(result) {
|
||||
|
@ -322,9 +322,10 @@ export const SingleMixin = (Base) =>
|
|||
export const MultipleMixin = (Base) =>
|
||||
class extends Base {
|
||||
initSelectedContainer() {
|
||||
const el = Utils.loadTemplate('<ul class="umap-multiresult"></ul>')
|
||||
this.input.parentNode.insertBefore(el, this.input.nextSibling)
|
||||
return el
|
||||
return DomUtil.after(
|
||||
this.input,
|
||||
DomUtil.element({ tagName: 'ul', className: 'umap-multiresult' })
|
||||
)
|
||||
}
|
||||
|
||||
displaySelected(result) {
|
||||
|
|
|
@ -5,7 +5,6 @@ import { translate } from './i18n.js'
|
|||
import * as Icon from './rendering/icon.js'
|
||||
import ContextMenu from './ui/contextmenu.js'
|
||||
import * as Utils from './utils.js'
|
||||
import { SCHEMA } from './schema.js'
|
||||
|
||||
export default class Browser {
|
||||
constructor(umap, leafletMap) {
|
||||
|
@ -22,24 +21,35 @@ export default class Browser {
|
|||
addFeature(feature, parent) {
|
||||
if (feature.isFiltered()) return
|
||||
if (this.options.inBbox && !feature.isOnScreen(this.bounds)) return
|
||||
const template = `
|
||||
<li class="feature ${feature.getClassName()}">
|
||||
<button class="icon icon-16 icon-zoom" title="${translate('Bring feature to center')}" data-ref=zoom></button>
|
||||
<button class="icon icon-16 show-on-edit icon-edit" title="${translate('Edit this feature')}" data-ref=edit></button>
|
||||
<button class="icon icon-16 show-on-edit icon-delete" title="${translate('Delete this feature')}" data-ref=remove></button>
|
||||
<i class="icon icon-16 icon-${feature.getClassName()} feature-color" data-ref=colorBox></i>
|
||||
<span class="feature-title" data-ref=label></span>
|
||||
</li>
|
||||
`
|
||||
const [row, { zoom, edit, remove, colorBox, label }] =
|
||||
Utils.loadTemplateWithRefs(template)
|
||||
label.textContent = label.title = feature.getDisplayName() || '—'
|
||||
const row = DomUtil.create('li', `${feature.getClassName()} feature`)
|
||||
const zoom_to = DomUtil.createButtonIcon(
|
||||
row,
|
||||
'icon-zoom',
|
||||
translate('Bring feature to center')
|
||||
)
|
||||
const edit = DomUtil.createButtonIcon(
|
||||
row,
|
||||
'show-on-edit icon-edit',
|
||||
translate('Edit this feature')
|
||||
)
|
||||
const del = DomUtil.createButtonIcon(
|
||||
row,
|
||||
'show-on-edit icon-delete',
|
||||
translate('Delete this feature')
|
||||
)
|
||||
const colorBox = DomUtil.create(
|
||||
'i',
|
||||
`icon icon-16 icon-${feature.getClassName()} feature-color`,
|
||||
row
|
||||
)
|
||||
const title = DomUtil.create('span', 'feature-title', row)
|
||||
const symbol = feature._getIconUrl
|
||||
? Icon.formatUrl(feature._getIconUrl(), feature)
|
||||
: null
|
||||
title.textContent = title.title = feature.getDisplayName() || '—'
|
||||
const bgcolor = feature.getPreviewColor()
|
||||
colorBox.style.backgroundColor = bgcolor
|
||||
if (symbol && symbol !== SCHEMA.iconUrl.default) {
|
||||
if (symbol && symbol !== U.SCHEMA.iconUrl.default) {
|
||||
const icon = Icon.makeElement(symbol, colorBox)
|
||||
Icon.setContrast(icon, colorBox, symbol, bgcolor)
|
||||
} else if (DomUtil.contrastedColor(colorBox, bgcolor)) {
|
||||
|
@ -48,10 +58,10 @@ export default class Browser {
|
|||
const viewFeature = (e) => {
|
||||
feature.zoomTo({ ...e, callback: () => feature.view() })
|
||||
}
|
||||
zoom.addEventListener('click', viewFeature)
|
||||
label.addEventListener('click', viewFeature)
|
||||
edit.addEventListener('click', () => feature.edit())
|
||||
remove.addEventListener('click', () => feature.del())
|
||||
DomEvent.on(zoom_to, 'click', viewFeature)
|
||||
DomEvent.on(title, 'click', viewFeature)
|
||||
DomEvent.on(edit, 'click', feature.edit, feature)
|
||||
DomEvent.on(del, 'click', feature.del, feature)
|
||||
// HOTFIX. Remove when this is released:
|
||||
// https://github.com/Leaflet/Leaflet/pull/9052
|
||||
DomEvent.disableClickPropagation(row)
|
||||
|
@ -63,51 +73,51 @@ export default class Browser {
|
|||
}
|
||||
|
||||
addDataLayer(datalayer, parent) {
|
||||
const open = this.mode !== 'layers' ? ' open' : ''
|
||||
const [container, { headline, toolbox, label }] = Utils.loadTemplateWithRefs(`
|
||||
<details class="datalayer ${datalayer.getHidableClass()}" id="${this.datalayerId(datalayer)}"${open}>
|
||||
<summary data-ref=headline>
|
||||
<span data-ref=toolbox></span>
|
||||
<span class="datalayer-name" data-id="${datalayer.id}" data-ref=label></span>
|
||||
<span class="datalayer-counter"></span>
|
||||
</summary>
|
||||
<ul></ul>
|
||||
</details>
|
||||
`)
|
||||
datalayer.renderToolbox(toolbox)
|
||||
parent.appendChild(container)
|
||||
let className = `datalayer ${datalayer.getHidableClass()}`
|
||||
if (this.mode !== 'layers') className += ' show-list'
|
||||
const container = DomUtil.create('div', className, parent)
|
||||
const headline = DomUtil.create('h5', '', container)
|
||||
container.id = this.datalayerId(datalayer)
|
||||
const ul = DomUtil.create('ul', '', container)
|
||||
this.updateDatalayer(datalayer)
|
||||
}
|
||||
|
||||
updateDatalayer(datalayer) {
|
||||
// Compute once, but use it for each feature later.
|
||||
this.bounds = this._leafletMap.getBounds()
|
||||
const id = this.datalayerId(datalayer)
|
||||
const parent = document.getElementById(id)
|
||||
const parent = DomUtil.get(this.datalayerId(datalayer))
|
||||
// Panel is not open
|
||||
if (!parent) return
|
||||
parent.classList.toggle('off', !datalayer.isVisible())
|
||||
const label = parent.querySelector('.datalayer-name')
|
||||
const container = parent.querySelector('ul')
|
||||
const headline = parent.querySelector('h5')
|
||||
const toggleList = () => parent.classList.toggle('show-list')
|
||||
headline.innerHTML = ''
|
||||
const toggle = DomUtil.create('i', 'icon icon-16 datalayer-toggle-list', headline)
|
||||
DomEvent.on(toggle, 'click', toggleList)
|
||||
datalayer.renderToolbox(headline)
|
||||
const name = DomUtil.create('span', 'datalayer-name', headline)
|
||||
name.textContent = name.title = datalayer.options.name
|
||||
DomEvent.on(name, 'click', toggleList)
|
||||
container.innerHTML = ''
|
||||
datalayer.eachFeature((feature) => this.addFeature(feature, container))
|
||||
datalayer.propagate(['properties.name'])
|
||||
|
||||
const total = datalayer.count()
|
||||
if (!total) return
|
||||
const current = container.querySelectorAll('li').length
|
||||
const count = total === current ? total : `${current}/${total}`
|
||||
const counter = parent.querySelector('.datalayer-counter')
|
||||
const counter = DomUtil.create('span', 'datalayer-counter', headline)
|
||||
counter.textContent = `(${count})`
|
||||
counter.title = translate(`Features in this layer: ${count}`)
|
||||
}
|
||||
|
||||
toggleBadge() {
|
||||
Utils.toggleBadge(this.filtersTitle, this.hasFilters())
|
||||
Utils.toggleBadge('.umap-control-browse', this.hasFilters())
|
||||
U.Utils.toggleBadge(this.filtersTitle, this.hasFilters())
|
||||
U.Utils.toggleBadge('.umap-control-browse', this.hasFilters())
|
||||
}
|
||||
|
||||
onFormChange() {
|
||||
this._umap.datalayers.browsable().map((datalayer) => {
|
||||
this._umap.eachBrowsableDataLayer((datalayer) => {
|
||||
datalayer.resetLayer(true)
|
||||
this.updateDatalayer(datalayer)
|
||||
if (this._umap.fullPanel?.isOpen()) datalayer.tableEdit()
|
||||
|
@ -130,7 +140,7 @@ export default class Browser {
|
|||
onMoveEnd() {
|
||||
if (!this.isOpen()) return
|
||||
const isListDynamic = this.options.inBbox
|
||||
this._umap.datalayers.browsable().map((datalayer) => {
|
||||
this._umap.eachBrowsableDataLayer((datalayer) => {
|
||||
if (!isListDynamic && !datalayer.hasDynamicData()) return
|
||||
this.updateDatalayer(datalayer)
|
||||
})
|
||||
|
@ -139,7 +149,7 @@ export default class Browser {
|
|||
update() {
|
||||
if (!this.isOpen()) return
|
||||
this.dataContainer.innerHTML = ''
|
||||
this._umap.datalayers.browsable().map((datalayer) => {
|
||||
this._umap.eachBrowsableDataLayer((datalayer) => {
|
||||
this.addDataLayer(datalayer, this.dataContainer)
|
||||
})
|
||||
}
|
||||
|
@ -147,51 +157,21 @@ export default class Browser {
|
|||
open(mode) {
|
||||
// Force only if mode is known, otherwise keep current mode.
|
||||
if (mode) this.mode = mode
|
||||
const template = `
|
||||
<div>
|
||||
<h3><i class="icon icon-16 icon-layers"></i>${translate('Data browser')}</h3>
|
||||
<details class="filters" data-ref="details">
|
||||
<summary data-ref=filtersTitle><i class="icon icon-16 icon-filters"></i>${translate('Filters')}</summary>
|
||||
<fieldset>
|
||||
<div data-ref=formContainer>
|
||||
</div>
|
||||
<button class="flat" type="button" data-ref=reset><i class="icon icon-16 icon-restore" title=""></i>${translate('Reset all')}</button>
|
||||
</fieldset>
|
||||
</details>
|
||||
<div class="main-toolbox">
|
||||
<i class="icon icon-16 icon-eye" title="${translate('show/hide all layers')}" data-ref="toggle"></i>
|
||||
<i class="icon icon-16 icon-zoom" title="${translate('zoom to data extent')}" data-ref="fitBounds"></i>
|
||||
<i class="icon icon-16 icon-download" title="${translate('download visible data')}" data-ref="download"></i>
|
||||
</div>
|
||||
<div data-ref=dataContainer></div>
|
||||
</div>
|
||||
`
|
||||
const [
|
||||
container,
|
||||
{
|
||||
details,
|
||||
filtersTitle,
|
||||
toggle,
|
||||
fitBounds,
|
||||
download,
|
||||
dataContainer,
|
||||
formContainer,
|
||||
reset,
|
||||
},
|
||||
] = Utils.loadTemplateWithRefs(template)
|
||||
const container = DomUtil.create('div')
|
||||
// HOTFIX. Remove when this is released:
|
||||
// https://github.com/Leaflet/Leaflet/pull/9052
|
||||
DomEvent.disableClickPropagation(container)
|
||||
details.open = this.mode === 'filters'
|
||||
toggle.addEventListener('click', () => this.toggleLayers())
|
||||
fitBounds.addEventListener('click', () => this._umap.fitDataBounds())
|
||||
download.addEventListener('click', () => this.downloadVisible(download))
|
||||
download.hidden = this._umap.getProperty('embedControl') === false
|
||||
|
||||
this.filtersTitle = filtersTitle
|
||||
this.dataContainer = dataContainer
|
||||
this.formContainer = formContainer
|
||||
DomUtil.createTitle(container, translate('Data browser'), 'icon-layers')
|
||||
this.formContainer = DomUtil.createFieldset(container, L._('Filters'), {
|
||||
on: this.mode === 'filters',
|
||||
className: 'filters',
|
||||
icon: 'icon-filters',
|
||||
})
|
||||
this.filtersTitle = container.querySelector('summary')
|
||||
this.toggleBadge()
|
||||
this.addMainToolbox(container)
|
||||
this.dataContainer = DomUtil.create('div', '', container)
|
||||
|
||||
let fields = [
|
||||
[
|
||||
|
@ -204,19 +184,27 @@ export default class Browser {
|
|||
builder.on('set', () => this.onFormChange())
|
||||
let filtersBuilder
|
||||
this.formContainer.appendChild(builder.build())
|
||||
builder.form.addEventListener('reset', () => {
|
||||
DomEvent.on(builder.form, 'reset', () => {
|
||||
window.setTimeout(builder.syncAll.bind(builder))
|
||||
})
|
||||
if (this._umap.properties.facetKey) {
|
||||
fields = this._umap.facets.build()
|
||||
filtersBuilder = new Form(this._umap.facets, fields)
|
||||
filtersBuilder.on('set', () => this.onFormChange())
|
||||
filtersBuilder.form.addEventListener('reset', () => {
|
||||
DomEvent.on(filtersBuilder.form, 'reset', () => {
|
||||
window.setTimeout(filtersBuilder.syncAll.bind(filtersBuilder))
|
||||
})
|
||||
this.formContainer.appendChild(filtersBuilder.build())
|
||||
}
|
||||
reset.addEventListener('click', () => this.resetFilters())
|
||||
const reset = DomUtil.createButton('flat', this.formContainer, '', () =>
|
||||
this.resetFilters()
|
||||
)
|
||||
DomUtil.createIcon(reset, 'icon-restore')
|
||||
DomUtil.element({
|
||||
tagName: 'span',
|
||||
parent: reset,
|
||||
textContent: translate('Reset all'),
|
||||
})
|
||||
|
||||
this._umap.panel.open({
|
||||
content: container,
|
||||
|
@ -232,6 +220,20 @@ export default class Browser {
|
|||
}
|
||||
}
|
||||
|
||||
addMainToolbox(container) {
|
||||
const [toolbox, { toggle, fitBounds, download }] = Utils.loadTemplateWithRefs(`
|
||||
<div class="main-toolbox">
|
||||
<i class="icon icon-16 icon-eye" title="${translate('show/hide all layers')}" data-ref="toggle"></i>
|
||||
<i class="icon icon-16 icon-zoom" title="${translate('zoom to data extent')}" data-ref="fitBounds"></i>
|
||||
<i class="icon icon-16 icon-download" title="${translate('download visible data')}" data-ref="download"></i>
|
||||
</div>
|
||||
`)
|
||||
container.appendChild(toolbox)
|
||||
toggle.addEventListener('click', () => this.toggleLayers())
|
||||
fitBounds.addEventListener('click', () => this._umap.fitDataBounds())
|
||||
download.addEventListener('click', () => this.downloadVisible(download))
|
||||
}
|
||||
|
||||
downloadVisible(element) {
|
||||
const menu = new ContextMenu({ fixed: true })
|
||||
const items = []
|
||||
|
@ -248,10 +250,10 @@ export default class Browser {
|
|||
// If at least one layer is shown, hide it
|
||||
// otherwise show all
|
||||
let allHidden = true
|
||||
this._umap.datalayers.browsable().map((datalayer) => {
|
||||
this._umap.eachBrowsableDataLayer((datalayer) => {
|
||||
if (datalayer.isVisible()) allHidden = false
|
||||
})
|
||||
this._umap.datalayers.browsable().map((datalayer) => {
|
||||
this._umap.eachBrowsableDataLayer((datalayer) => {
|
||||
datalayer._forcedVisibility = true
|
||||
if (allHidden) {
|
||||
datalayer.show()
|
||||
|
@ -262,13 +264,15 @@ export default class Browser {
|
|||
}
|
||||
|
||||
static backButton(umap) {
|
||||
const button = Utils.loadTemplate(
|
||||
`<button class="icon icon-16 icon-back" title="${translate('Back to browser')}"></button>`
|
||||
const button = DomUtil.createButtonIcon(
|
||||
DomUtil.create('li', '', undefined),
|
||||
'icon-back',
|
||||
translate('Back to browser')
|
||||
)
|
||||
// Fixme: remove me when this is merged and released
|
||||
// https://github.com/Leaflet/Leaflet/pull/9052
|
||||
DomEvent.disableClickPropagation(button)
|
||||
button.addEventListener('click', () => umap.openBrowser())
|
||||
DomEvent.on(button, 'click', () => umap.openBrowser())
|
||||
return button
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,18 +68,16 @@ export default class Caption extends Utils.WithTemplate {
|
|||
this.elements.description.hidden = true
|
||||
}
|
||||
this.elements.datalayersContainer.innerHTML = ''
|
||||
this._umap.datalayers
|
||||
.reverse()
|
||||
.map((datalayer) =>
|
||||
this.addDataLayer(datalayer, this.elements.datalayersContainer)
|
||||
)
|
||||
this._umap.eachDataLayerReverse((datalayer) =>
|
||||
this.addDataLayer(datalayer, this.elements.datalayersContainer)
|
||||
)
|
||||
this.addCredits()
|
||||
if (this._umap.properties.created_at) {
|
||||
const created_at = translate('created at {date}', {
|
||||
date: this._umap.createdAt.toLocaleDateString(),
|
||||
date: new Date(this._umap.properties.created_at).toLocaleDateString(),
|
||||
})
|
||||
const modified_at = translate('modified at {date}', {
|
||||
date: this._umap.modifiedAt.toLocaleDateString(),
|
||||
date: new Date(this._umap.properties.modified_at).toLocaleDateString(),
|
||||
})
|
||||
this.elements.dates.innerHTML = `${created_at} - ${modified_at}`
|
||||
} else {
|
||||
|
@ -87,7 +85,7 @@ export default class Caption extends Utils.WithTemplate {
|
|||
}
|
||||
this._umap.panel.open({ content: this.element }).then(() => {
|
||||
// Create the legend when the panel is actually on the DOM
|
||||
this._umap.datalayers.reverse().map((datalayer) => datalayer.renderLegend())
|
||||
this._umap.eachDataLayerReverse((datalayer) => datalayer.renderLegend())
|
||||
this._umap.propagate()
|
||||
})
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ class Feature {
|
|||
constructor(umap, datalayer, geojson = {}, id = null) {
|
||||
this._umap = umap
|
||||
this.sync = umap.syncEngine.proxy(this)
|
||||
this._isDirty = false
|
||||
this._ui = null
|
||||
|
||||
// DataLayer the feature belongs to
|
||||
|
@ -53,6 +54,17 @@ class Feature {
|
|||
}
|
||||
}
|
||||
|
||||
set isDirty(status) {
|
||||
this._isDirty = status
|
||||
if (this.datalayer) {
|
||||
this.datalayer.isDirty = status
|
||||
}
|
||||
}
|
||||
|
||||
get isDirty() {
|
||||
return this._isDirty
|
||||
}
|
||||
|
||||
get ui() {
|
||||
if (!this._ui) this.makeUI()
|
||||
return this._ui
|
||||
|
@ -134,13 +146,14 @@ class Feature {
|
|||
}
|
||||
|
||||
onCommit() {
|
||||
this.pullGeometry(false)
|
||||
// When the layer is a remote layer, we don't want to sync the creation of the
|
||||
// points via the websocket, as the other peers will get them themselves.
|
||||
const oldGeoJSON = this._just_married ? null : Utils.CopyJSON(this.toGeoJSON())
|
||||
this.pullGeometry(false)
|
||||
if (this.datalayer?.isRemoteLayer()) return
|
||||
if (this._needs_upsert) {
|
||||
if (this._just_married) {
|
||||
this.sync.upsert(this.toGeoJSON(), null)
|
||||
this._needs_upsert = false
|
||||
this._just_married = false
|
||||
} else {
|
||||
this.sync.update('geometry', this.geometry, this._geometry_bk)
|
||||
}
|
||||
|
@ -205,7 +218,6 @@ class Feature {
|
|||
|
||||
edit(event) {
|
||||
if (!this._umap.editEnabled || this.isReadOnly()) return
|
||||
if (this._umap.editedFeature === this) return
|
||||
const container = DomUtil.create('div', 'umap-feature-container')
|
||||
DomUtil.createTitle(
|
||||
container,
|
||||
|
@ -314,9 +326,7 @@ class Feature {
|
|||
]
|
||||
}
|
||||
|
||||
endEdit() {
|
||||
this.ui.disableEdit()
|
||||
}
|
||||
endEdit() {}
|
||||
|
||||
getDisplayName() {
|
||||
const keys = U.LABEL_KEYS.slice() // Copy.
|
||||
|
@ -355,6 +365,7 @@ class Feature {
|
|||
}
|
||||
|
||||
del(sync) {
|
||||
this.isDirty = true
|
||||
this._umap._leafletMap.closePopup()
|
||||
if (this.datalayer) {
|
||||
this.datalayer.removeFeature(this, sync)
|
||||
|
@ -399,11 +410,13 @@ class Feature {
|
|||
|
||||
changeDataLayer(datalayer) {
|
||||
if (this.datalayer) {
|
||||
this.datalayer.isDirty = true
|
||||
this.datalayer.removeFeature(this)
|
||||
}
|
||||
|
||||
datalayer.addFeature(this)
|
||||
this.sync.upsert(this.toGeoJSON())
|
||||
datalayer.isDirty = true
|
||||
this.redraw()
|
||||
}
|
||||
|
||||
|
@ -470,6 +483,7 @@ class Feature {
|
|||
|
||||
deleteProperty(property) {
|
||||
delete this.properties[property]
|
||||
this.isDirty = true
|
||||
}
|
||||
|
||||
renameProperty(from, to) {
|
||||
|
@ -562,6 +576,7 @@ class Feature {
|
|||
delete geojson.id
|
||||
delete geojson.properties.id
|
||||
const feature = this.datalayer.makeFeature(geojson)
|
||||
feature.isDirty = true
|
||||
feature.edit()
|
||||
return feature
|
||||
}
|
||||
|
@ -597,7 +612,7 @@ class Feature {
|
|||
this.datalayer.hideFeature(this)
|
||||
this.makeUI()
|
||||
this.datalayer.showFeature(this)
|
||||
} else if (this.datalayer?.isBrowsable()) {
|
||||
} else {
|
||||
this.ui._redraw()
|
||||
}
|
||||
}
|
||||
|
@ -813,6 +828,11 @@ class Path extends Feature {
|
|||
)
|
||||
}
|
||||
|
||||
endEdit() {
|
||||
this.ui.disableEdit()
|
||||
super.endEdit()
|
||||
}
|
||||
|
||||
transferShape(at, to) {
|
||||
const shape = this.ui.enableEdit().deleteShapeAt(at)
|
||||
// FIXME: make Leaflet.Editable send an event instead
|
||||
|
@ -1036,6 +1056,7 @@ export class LineString extends Path {
|
|||
this.pullGeometry()
|
||||
if (!this.ui.editEnabled()) this.edit()
|
||||
this.ui.editor.reset()
|
||||
this.isDirty = true
|
||||
}
|
||||
|
||||
isMulti() {
|
||||
|
|
|
@ -64,9 +64,6 @@ export class DataLayer {
|
|||
|
||||
this.setOptions(data)
|
||||
this.pane.dataset.id = this.id
|
||||
if (this.options.rank === undefined) {
|
||||
this.options.rank = this._umap.datalayers.count()
|
||||
}
|
||||
|
||||
if (!Utils.isObject(this.options.remoteData)) {
|
||||
this.options.remoteData = {}
|
||||
|
@ -125,20 +122,6 @@ export class DataLayer {
|
|||
return `datalayer-${stamp(this)}`
|
||||
}
|
||||
|
||||
get rank() {
|
||||
// Make sure we always have a valid rank. Undefined rank may happen
|
||||
// after importing an old umap backup, and not touching the layers
|
||||
// after that.
|
||||
if (this.options.rank === undefined) {
|
||||
this.options.rank = this.getDOMOrder()
|
||||
}
|
||||
return this.options.rank
|
||||
}
|
||||
|
||||
set rank(value) {
|
||||
this.options.rank = value
|
||||
}
|
||||
|
||||
getSyncMetadata() {
|
||||
return {
|
||||
subject: 'datalayer',
|
||||
|
@ -147,10 +130,6 @@ export class DataLayer {
|
|||
}
|
||||
|
||||
render(fields, builder) {
|
||||
// Propagate will remove the fields it has already
|
||||
// processed
|
||||
fields = this.propagate(fields)
|
||||
|
||||
const impacts = Utils.getImpactsFromSchema(fields)
|
||||
|
||||
for (const impact of impacts) {
|
||||
|
@ -170,36 +149,10 @@ export class DataLayer {
|
|||
case 'remote-data':
|
||||
this.fetchRemoteData()
|
||||
break
|
||||
case 'datalayer-rank':
|
||||
this._umap.reorderDataLayers()
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This method does a targeted update of the UI,
|
||||
// it whould be merged with `render`` method and the
|
||||
// SCHEMA at some point
|
||||
propagate(fields = []) {
|
||||
const impacts = {
|
||||
'properties.name': () => {
|
||||
Utils.eachElement('.datalayer-name', (el) => {
|
||||
if (el.dataset.id === this.id) {
|
||||
el.textContent = this.getName()
|
||||
el.title = this.getName()
|
||||
}
|
||||
})
|
||||
},
|
||||
}
|
||||
for (const [field, impact] of Object.entries(impacts)) {
|
||||
if (!fields.length || fields.includes(field)) {
|
||||
impact()
|
||||
fields = fields.filter((item) => item !== field)
|
||||
}
|
||||
}
|
||||
return fields
|
||||
}
|
||||
|
||||
showAtLoad() {
|
||||
return this.autoLoaded() && this.showAtZoom()
|
||||
}
|
||||
|
@ -267,11 +220,17 @@ export class DataLayer {
|
|||
this._loading = true
|
||||
const [geojson, response, error] = await this._umap.server.get(this._dataUrl())
|
||||
if (!error) {
|
||||
this._umap.modifiedAt = response.headers.get('last-modified')
|
||||
this.setReferenceVersion({ response, sync: false })
|
||||
delete geojson._umap_options
|
||||
// FIXME: for now the _umap_options property is set dynamically from backend
|
||||
// And thus it's not in the geojson file in the server
|
||||
// So do not let all options to be reset
|
||||
// Fix is a proper migration so all datalayers settings are
|
||||
// in DB, and we remove it from geojson flat files.
|
||||
if (geojson._umap_options) {
|
||||
geojson._umap_options.editMode = this.options.editMode
|
||||
}
|
||||
// In case of maps pre 1.0 still around
|
||||
delete geojson._storage
|
||||
if (geojson._storage) geojson._storage.editMode = this.options.editMode
|
||||
await this.fromUmapGeoJSON(geojson)
|
||||
this.backupOptions()
|
||||
this._loading = false
|
||||
|
@ -300,6 +259,7 @@ export class DataLayer {
|
|||
|
||||
async fromUmapGeoJSON(geojson) {
|
||||
if (geojson._storage) geojson._umap_options = geojson._storage // Retrocompat
|
||||
geojson._umap_options.id = this.id
|
||||
if (geojson._umap_options) this.setOptions(geojson._umap_options)
|
||||
if (this.isRemoteLayer()) {
|
||||
await this.fetchRemoteData()
|
||||
|
@ -308,6 +268,15 @@ export class DataLayer {
|
|||
}
|
||||
}
|
||||
|
||||
clear() {
|
||||
this.sync.startBatch()
|
||||
for (const feature of Object.values(this._features)) {
|
||||
feature.del()
|
||||
}
|
||||
this.sync.commitBatch()
|
||||
this.dataChanged()
|
||||
}
|
||||
|
||||
backupData() {
|
||||
if (this._geojson) {
|
||||
this._geojson_bk = Utils.CopyJSON(this._geojson)
|
||||
|
@ -334,10 +303,7 @@ export class DataLayer {
|
|||
async getUrl(url, initialUrl) {
|
||||
const response = await this._umap.request.get(url)
|
||||
return new Promise((resolve) => {
|
||||
if (response?.ok) {
|
||||
this._umap.modifiedAt = response.headers.get('last-modified')
|
||||
return resolve(response.text())
|
||||
}
|
||||
if (response?.ok) return resolve(response.text())
|
||||
Alert.error(
|
||||
translate('Cannot load remote data for layer "{layer}" with url "{url}"', {
|
||||
layer: this.getName(),
|
||||
|
@ -358,7 +324,7 @@ export class DataLayer {
|
|||
url = this._umap.proxyUrl(url, this.options.remoteData.ttl)
|
||||
}
|
||||
return await this.getUrl(url, remoteUrl).then((raw) => {
|
||||
this.clear(false)
|
||||
this.clear()
|
||||
return this._umap.formatter
|
||||
.parse(raw, this.options.remoteData.format)
|
||||
.then((geojson) => this.fromGeoJSON(geojson, false))
|
||||
|
@ -398,7 +364,12 @@ export class DataLayer {
|
|||
}
|
||||
|
||||
connectToMap() {
|
||||
this._umap.datalayers.add(this)
|
||||
if (!this._umap.datalayers[this.id]) {
|
||||
this._umap.datalayers[this.id] = this
|
||||
}
|
||||
if (!this._umap.datalayersIndex.includes(this)) {
|
||||
this._umap.datalayersIndex.push(this)
|
||||
}
|
||||
this._umap.onDataLayersChanged()
|
||||
}
|
||||
|
||||
|
@ -443,10 +414,6 @@ 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)
|
||||
|
@ -517,19 +484,8 @@ export class DataLayer {
|
|||
const features = []
|
||||
this.sortFeatures(collection)
|
||||
for (const featureJson of collection) {
|
||||
if (featureJson.geometry?.type === 'GeometryCollection') {
|
||||
for (const geometry of featureJson.geometry.geometries) {
|
||||
const feature = this.makeFeature({
|
||||
type: 'Feature',
|
||||
geometry,
|
||||
properties: featureJson.properties,
|
||||
})
|
||||
if (feature) features.push(feature)
|
||||
}
|
||||
} else {
|
||||
const feature = this.makeFeature(featureJson, sync)
|
||||
if (feature) features.push(feature)
|
||||
}
|
||||
const feature = this.makeFeature(featureJson, sync)
|
||||
if (feature) features.push(feature)
|
||||
}
|
||||
return features
|
||||
}
|
||||
|
@ -642,33 +598,16 @@ export class DataLayer {
|
|||
|
||||
del(sync = true) {
|
||||
const oldValue = Utils.CopyJSON(this.umapGeoJSON())
|
||||
// TODO merge datalayer del and features del in same
|
||||
// batch
|
||||
this.clear()
|
||||
this.erase()
|
||||
if (sync) {
|
||||
this.isDeleted = true
|
||||
this.sync.delete(oldValue)
|
||||
}
|
||||
this.hide()
|
||||
this.parentPane.removeChild(this.pane)
|
||||
this._umap.onDataLayersChanged()
|
||||
this.layer.onDelete(this._leafletMap)
|
||||
this.propagateDelete()
|
||||
this._leaflet_events_bk = this._leaflet_events
|
||||
}
|
||||
|
||||
empty() {
|
||||
if (this.isRemoteLayer()) return
|
||||
this.sync.startBatch()
|
||||
this.clear()
|
||||
this.sync.commitBatch()
|
||||
}
|
||||
|
||||
clear(sync = true) {
|
||||
for (const feature of Object.values(this._features)) {
|
||||
feature.del(sync)
|
||||
}
|
||||
this.dataChanged()
|
||||
}
|
||||
|
||||
clone() {
|
||||
|
@ -681,13 +620,24 @@ export class DataLayer {
|
|||
return datalayer
|
||||
}
|
||||
|
||||
erase() {
|
||||
this.hide()
|
||||
this._umap.datalayersIndex.splice(this.getRank(), 1)
|
||||
this.parentPane.removeChild(this.pane)
|
||||
this._umap.onDataLayersChanged()
|
||||
this.layer.onDelete(this._leafletMap)
|
||||
this.propagateDelete()
|
||||
this._leaflet_events_bk = this._leaflet_events
|
||||
this.clear()
|
||||
}
|
||||
|
||||
redraw() {
|
||||
if (!this.isVisible()) return
|
||||
this.eachFeature((feature) => feature.redraw())
|
||||
}
|
||||
|
||||
edit() {
|
||||
if (!this._umap.editEnabled) {
|
||||
if (!this._umap.editEnabled || !this.isLoaded()) {
|
||||
return
|
||||
}
|
||||
const container = DomUtil.create('div', 'umap-layer-properties-container')
|
||||
|
@ -1095,11 +1045,23 @@ export class DataLayer {
|
|||
}
|
||||
|
||||
getPreviousBrowsable() {
|
||||
return this._umap.datalayers.prev(this)
|
||||
let id = this.getRank()
|
||||
let next
|
||||
const index = this._umap.datalayersIndex
|
||||
while (((id = index[++id] ? id : 0), (next = index[id]))) {
|
||||
if (next === this || next.canBrowse()) break
|
||||
}
|
||||
return next
|
||||
}
|
||||
|
||||
getNextBrowsable() {
|
||||
return this._umap.datalayers.next(this)
|
||||
let id = this.getRank()
|
||||
let prev
|
||||
const index = this._umap.datalayersIndex
|
||||
while (((id = index[--id] ? id : index.length - 1), (prev = index[id]))) {
|
||||
if (prev === this || prev.canBrowse()) break
|
||||
}
|
||||
return prev
|
||||
}
|
||||
|
||||
umapGeoJSON() {
|
||||
|
@ -1110,8 +1072,8 @@ export class DataLayer {
|
|||
}
|
||||
}
|
||||
|
||||
getDOMOrder() {
|
||||
return Array.from(this.parentPane.children).indexOf(this.pane)
|
||||
getRank() {
|
||||
return this._umap.datalayersIndex.indexOf(this)
|
||||
}
|
||||
|
||||
isReadOnly() {
|
||||
|
@ -1133,21 +1095,15 @@ export class DataLayer {
|
|||
}
|
||||
}
|
||||
|
||||
prepareOptions() {
|
||||
const options = Utils.CopyJSON(this.options)
|
||||
delete options.permissions
|
||||
return JSON.stringify(options)
|
||||
}
|
||||
|
||||
async save() {
|
||||
if (this.isDeleted) return await this.saveDelete()
|
||||
if (!this.isRemoteLayer() && !this.isLoaded()) return
|
||||
if (!this.isLoaded()) return
|
||||
const geojson = this.umapGeoJSON()
|
||||
const formData = new FormData()
|
||||
formData.append('name', this.options.name)
|
||||
formData.append('display_on_load', !!this.options.displayOnLoad)
|
||||
formData.append('rank', this.rank)
|
||||
formData.append('settings', this.prepareOptions())
|
||||
formData.append('rank', this.getRank())
|
||||
formData.append('settings', JSON.stringify(this.options))
|
||||
// Filename support is shaky, don't do it for now.
|
||||
const blob = new Blob([JSON.stringify(geojson)], { type: 'application/json' })
|
||||
formData.append('geojson', blob)
|
||||
|
@ -1182,15 +1138,12 @@ export class DataLayer {
|
|||
await this._umap.saveAll()
|
||||
}
|
||||
)
|
||||
} else {
|
||||
console.debug(error)
|
||||
Alert.error(translate('Cannot save layer, please try again in a few minutes.'))
|
||||
}
|
||||
} else {
|
||||
// Response contains geojson only if save has conflicted and conflicts have
|
||||
// been resolved. So we need to reload to get extra data (added by someone else)
|
||||
if (data.geojson) {
|
||||
this.clear(false)
|
||||
this.clear()
|
||||
this.fromGeoJSON(data.geojson)
|
||||
delete data.geojson
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ export default class Facets {
|
|||
this.selected[name] = selected
|
||||
}
|
||||
|
||||
this._umap.datalayers.browsable().map((datalayer) => {
|
||||
this._umap.eachBrowsableDataLayer((datalayer) => {
|
||||
datalayer.eachFeature((feature) => {
|
||||
for (const name of names) {
|
||||
let value = feature.properties[name]
|
||||
|
|
|
@ -132,9 +132,6 @@ export class MutatingForm extends Form {
|
|||
const properties = Object.assign({}, defaults)
|
||||
if (properties.type === Array) {
|
||||
properties.handler = 'CheckBoxes'
|
||||
} else if (properties.type === Boolean) {
|
||||
if (properties.nullable) properties.handler = 'NullableChoices'
|
||||
else properties.handler = 'Switch'
|
||||
} else if (properties.choices) {
|
||||
const text_length = properties.choices.reduce(
|
||||
(acc, [_, label]) => acc + label.length,
|
||||
|
@ -148,6 +145,9 @@ export class MutatingForm extends Form {
|
|||
properties.handler = 'Select'
|
||||
properties.selectOptions = properties.choices
|
||||
}
|
||||
} else if (properties.type === Boolean) {
|
||||
if (properties.nullable) properties.handler = 'NullableChoices'
|
||||
else properties.handler = 'Switch'
|
||||
} else if (properties.type === 'Text') {
|
||||
properties.handler = 'Textarea'
|
||||
} else if (properties.type === Number) {
|
||||
|
|
|
@ -560,7 +560,7 @@ Fields.SlideshowDelay = class extends Fields.IntSelect {
|
|||
Fields.DataLayerSwitcher = class extends Fields.Select {
|
||||
getOptions() {
|
||||
const options = []
|
||||
this.builder._umap.datalayers.reverse().map((datalayer) => {
|
||||
this.builder._umap.eachDataLayerReverse((datalayer) => {
|
||||
if (
|
||||
datalayer.isLoaded() &&
|
||||
!datalayer.isDataReadOnly() &&
|
||||
|
@ -808,10 +808,9 @@ Fields.IconUrl = class extends Fields.BlurInput {
|
|||
}
|
||||
|
||||
addCategory(items, name) {
|
||||
const hidden = name ? '' : ' hidden'
|
||||
const [parent, { grid }] = Utils.loadTemplateWithRefs(`
|
||||
<div class="umap-pictogram-category">
|
||||
<h6${hidden}>${name}</h6>
|
||||
<h6 hidden=${!name}>${name}</h6>
|
||||
<div class="umap-pictogram-grid" data-ref=grid></div>
|
||||
</div>
|
||||
`)
|
||||
|
@ -925,8 +924,7 @@ Fields.Url = class extends Fields.Input {
|
|||
Fields.Switch = class extends Fields.CheckBox {
|
||||
getTemplate() {
|
||||
const label = this.properties.label
|
||||
const help = this.properties.helpEntries?.join() || ''
|
||||
return `${super.getTemplate()}<label title="${label}" for="${this.id}" data-ref=customLabel data-help="${help}">${label}</label>`
|
||||
return `${super.getTemplate()}<label title="${label}" for="${this.id}" data-ref=customLabel>${label}</label>`
|
||||
}
|
||||
|
||||
build() {
|
||||
|
|
|
@ -243,7 +243,7 @@ export default class Importer extends Utils.WithTemplate {
|
|||
this.raw = null
|
||||
const layerSelect = this.qs('[name="layer-id"]')
|
||||
layerSelect.innerHTML = ''
|
||||
this._umap.datalayers.reverse().map((datalayer) => {
|
||||
this._umap.eachDataLayerReverse((datalayer) => {
|
||||
if (datalayer.isLoaded() && !datalayer.isRemoteLayer()) {
|
||||
DomUtil.element({
|
||||
tagName: 'option',
|
||||
|
|
|
@ -8,20 +8,18 @@ import { AutocompleteCommunes } from './communesfr.js'
|
|||
const TEMPLATE = `
|
||||
<h3>Cadastre</h3>
|
||||
<p>Importer les données cadastrales d’une commune française.</p>
|
||||
<div class="formbox">
|
||||
<select name="theme">
|
||||
<option value="batiments">Bâtiments</option>
|
||||
<option value="communes">Communes</option>
|
||||
<option value="feuilles">Feuilles</option>
|
||||
<option value="lieux_dits">Lieux dits</option>
|
||||
<option value="parcelles" selected>Parcelles</option>
|
||||
<option value="prefixes_sections">Préfixes sections</option>
|
||||
<option value="sections">Sections</option>
|
||||
<option value="subdivisions_fiscales">Subdivisions fiscales</option>
|
||||
</select>
|
||||
<label id="boundary">
|
||||
</label>
|
||||
</div>
|
||||
<select name="theme">
|
||||
<option value="batiments">Bâtiments</option>
|
||||
<option value="communes">Communes</option>
|
||||
<option value="feuilles">Feuilles</option>
|
||||
<option value="lieux_dits">Lieux dits</option>
|
||||
<option value="parcelles" selected>Parcelles</option>
|
||||
<option value="prefixes_sections">Préfixes sections</option>
|
||||
<option value="sections">Sections</option>
|
||||
<option value="subdivisions_fiscales">Subdivisions fiscales</option>
|
||||
</select>
|
||||
<label id="boundary">
|
||||
</label>
|
||||
`
|
||||
|
||||
export class Importer {
|
||||
|
|
|
@ -16,17 +16,15 @@ const BOUNDARY_TYPES = {
|
|||
const TEMPLATE = `
|
||||
<h3>GeoDataMine</h3>
|
||||
<p>${translate('GeoDataMine: thematic data from OpenStreetMap')}.</p>
|
||||
<div class="formbox">
|
||||
<select name="theme">
|
||||
<option value="">${translate('Choose a theme')}</option>
|
||||
</select>
|
||||
<label>
|
||||
<input type="checkbox" name="aspoint" />
|
||||
${translate('Simplify all geometries to points')}
|
||||
</label>
|
||||
<label id="boundary">
|
||||
</label>
|
||||
</div>
|
||||
<select name="theme">
|
||||
<option value="">${translate('Choose a theme')}</option>
|
||||
</select>
|
||||
<label>
|
||||
<input type="checkbox" name="aspoint" />
|
||||
${translate('Symplify all geometries to points')}
|
||||
</label>
|
||||
<label id="boundary">
|
||||
</label>
|
||||
`
|
||||
|
||||
class Autocomplete extends SingleMixin(BaseAjax) {
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
export class DataLayerManager extends Object {
|
||||
add(datalayer) {
|
||||
this[datalayer.id] = datalayer
|
||||
}
|
||||
active() {
|
||||
return Object.values(this)
|
||||
.filter((datalayer) => !datalayer.isDeleted)
|
||||
.sort((a, b) => a.rank > b.rank)
|
||||
}
|
||||
reverse() {
|
||||
return this.active().reverse()
|
||||
}
|
||||
count() {
|
||||
return this.active().length
|
||||
}
|
||||
find(func) {
|
||||
for (const datalayer of this.reverse()) {
|
||||
if (func.call(datalayer, datalayer)) {
|
||||
return datalayer
|
||||
}
|
||||
}
|
||||
}
|
||||
filter(func) {
|
||||
return this.active().filter(func)
|
||||
}
|
||||
visible() {
|
||||
return this.filter((datalayer) => datalayer.isVisible())
|
||||
}
|
||||
browsable() {
|
||||
return this.reverse().filter((datalayer) => datalayer.allowBrowse())
|
||||
}
|
||||
prev(datalayer) {
|
||||
const browsable = this.browsable()
|
||||
const current = browsable.indexOf(datalayer)
|
||||
const prev = browsable[current - 1] || browsable[browsable.length - 1]
|
||||
if (!prev.canBrowse()) return this.prev(prev)
|
||||
return prev
|
||||
}
|
||||
next(datalayer) {
|
||||
const browsable = this.browsable()
|
||||
const current = browsable.indexOf(datalayer)
|
||||
const next = browsable[current + 1] || browsable[0]
|
||||
if (!next.canBrowse()) return this.next(next)
|
||||
return next
|
||||
}
|
||||
}
|
|
@ -159,7 +159,7 @@ export class MapPermissions {
|
|||
`<fieldset class="separator"><legend>${translate('Datalayers')}</legend></fieldset>`
|
||||
)
|
||||
container.appendChild(fieldset)
|
||||
this._umap.datalayers.active().map((datalayer) => {
|
||||
this._umap.eachDataLayer((datalayer) => {
|
||||
datalayer.permissions.edit(fieldset)
|
||||
})
|
||||
}
|
||||
|
|
251
umap/static/umap/js/modules/rendering/controls.js
vendored
|
@ -1,251 +0,0 @@
|
|||
import { Control } from '../../../vendors/leaflet/leaflet-src.esm.js'
|
||||
import * as Utils from '../utils.js'
|
||||
import { translate } from '../i18n.js'
|
||||
|
||||
export const HomeControl = Control.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
},
|
||||
|
||||
onAdd: (map) => {
|
||||
const path = map._umap.getStaticPathFor('home.svg')
|
||||
const container = Utils.loadTemplate(
|
||||
`<a href="/" class="home-button" title="${translate('Back to home')}"><img src="${path}" alt="${translate('Home logo')}" width="38px" height="38px" /></a>`
|
||||
)
|
||||
return container
|
||||
},
|
||||
})
|
||||
|
||||
export const EditControl = Control.extend({
|
||||
options: {
|
||||
position: 'topright',
|
||||
},
|
||||
|
||||
onAdd: (map) => {
|
||||
const template = `
|
||||
<div class="edit-enable">
|
||||
<button type="button" data-ref="button">${translate('Edit')}</button>
|
||||
</div>
|
||||
`
|
||||
const [container, { button }] = Utils.loadTemplateWithRefs(template)
|
||||
button.addEventListener('click', () => map._umap.enableEdit())
|
||||
button.addEventListener('mouseover', () => {
|
||||
map._umap.tooltip.open({
|
||||
content: map._umap.help.displayLabel('TOGGLE_EDIT'),
|
||||
anchor: button,
|
||||
position: 'bottom',
|
||||
delay: 750,
|
||||
duration: 5000,
|
||||
})
|
||||
})
|
||||
return container
|
||||
},
|
||||
})
|
||||
|
||||
export const MoreControl = Control.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
},
|
||||
|
||||
onAdd: function (map) {
|
||||
const pos = this.getPosition()
|
||||
const corner = map._controlCorners[pos]
|
||||
const className = 'umap-more-controls'
|
||||
const template = `
|
||||
<div class="umap-control-text">
|
||||
<button class="umap-control-more" type="button" data-ref="button"></button>
|
||||
</div>
|
||||
`
|
||||
const [container, { button }] = Utils.loadTemplateWithRefs(template)
|
||||
button.addEventListener('click', () => corner.classList.toggle(className))
|
||||
button.addEventListener('mouseover', () => {
|
||||
const extended = corner.classList.contains(className)
|
||||
map._umap.tooltip.open({
|
||||
content: extended ? translate('Hide controls') : translate('More controls'),
|
||||
anchor: button,
|
||||
position: 'right',
|
||||
delay: 750,
|
||||
})
|
||||
})
|
||||
return container
|
||||
},
|
||||
})
|
||||
|
||||
export const PermanentCreditsControl = Control.extend({
|
||||
options: {
|
||||
position: 'bottomleft',
|
||||
},
|
||||
|
||||
onAdd: (map) => {
|
||||
const container = Utils.loadTemplate(
|
||||
`<div class="umap-permanent-credits-container text">${Utils.toHTML(map.options.permanentCredit)}</div>`
|
||||
)
|
||||
const background = map.options.permanentCreditBackground ? '#FFFFFFB0' : ''
|
||||
container.style.backgroundColor = background
|
||||
return container
|
||||
},
|
||||
})
|
||||
|
||||
const BaseButton = Control.extend({
|
||||
initialize: function (umap, options) {
|
||||
this._umap = umap
|
||||
Control.prototype.initialize.call(this, options)
|
||||
},
|
||||
|
||||
onAdd: function (map) {
|
||||
const template = `
|
||||
<div class="${this.options.className} umap-control">
|
||||
<button type="button" title="${this.options.title}" data-ref="button"></button>
|
||||
</div>
|
||||
`
|
||||
const [container, { button }] = Utils.loadTemplateWithRefs(template)
|
||||
button.addEventListener('click', (event) => {
|
||||
event.stopPropagation()
|
||||
this.onClick()
|
||||
})
|
||||
button.addEventListener('dblclick', (event) => {
|
||||
event.stopPropagation()
|
||||
})
|
||||
this.afterAdd(container)
|
||||
return container
|
||||
},
|
||||
|
||||
afterAdd: (container) => {},
|
||||
})
|
||||
|
||||
export const DataLayersControl = BaseButton.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
className: 'umap-control-browse',
|
||||
title: translate('Open browser'),
|
||||
},
|
||||
|
||||
afterAdd: function (container) {
|
||||
Utils.toggleBadge(container, this._umap.browser?.hasFilters())
|
||||
},
|
||||
|
||||
onClick: function () {
|
||||
this._umap.openBrowser()
|
||||
},
|
||||
})
|
||||
|
||||
export const CaptionControl = BaseButton.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
className: 'umap-control-caption',
|
||||
title: translate('About'),
|
||||
},
|
||||
|
||||
onClick: function () {
|
||||
this._umap.openCaption()
|
||||
},
|
||||
})
|
||||
|
||||
export const EmbedControl = BaseButton.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
title: translate('Share and download'),
|
||||
className: 'leaflet-control-embed',
|
||||
},
|
||||
|
||||
onClick: function () {
|
||||
this._umap.share.open()
|
||||
},
|
||||
})
|
||||
|
||||
export const AttributionControl = Control.Attribution.extend({
|
||||
options: {
|
||||
prefix: '',
|
||||
},
|
||||
|
||||
_update: function () {
|
||||
// Layer is no more on the map
|
||||
if (!this._map) return
|
||||
Control.Attribution.prototype._update.call(this)
|
||||
const shortCredit = this._map._umap.getProperty('shortCredit')
|
||||
const captionMenus = this._map._umap.getProperty('captionMenus')
|
||||
// Use our own container, so we can hide/show on small screens
|
||||
const originalCredits = this._container.innerHTML
|
||||
this._container.innerHTML = ''
|
||||
const template = `
|
||||
<div class="attribution-container">
|
||||
${originalCredits}
|
||||
<span data-ref="short"> — ${Utils.toHTML(shortCredit)}</span>
|
||||
<a href="#" data-ref="caption"> — ${translate('Open caption')}</a>
|
||||
<a href="/" data-ref="home"> — ${translate('Home')}</a>
|
||||
<a href="https://umap-project.org/" data-ref="site"> — ${translate('Powered by uMap')}</a>
|
||||
<a href="#" class="attribution-toggle"></a>
|
||||
</div>
|
||||
`
|
||||
const [container, { short, caption, home, site }] =
|
||||
Utils.loadTemplateWithRefs(template)
|
||||
caption.addEventListener('click', () => this._map._umap.openCaption())
|
||||
this._container.appendChild(container)
|
||||
short.hidden = !shortCredit
|
||||
caption.hidden = !captionMenus
|
||||
site.hidden = !captionMenus
|
||||
home.hidden = this._map._umap.isEmbed || !captionMenus
|
||||
},
|
||||
})
|
||||
|
||||
/* Used in edit mode to define the default tilelayer */
|
||||
export const TileLayerChooser = BaseButton.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
},
|
||||
|
||||
onClick: function () {
|
||||
this.openSwitcher({ edit: true })
|
||||
},
|
||||
|
||||
openSwitcher: function (options = {}) {
|
||||
const template = `
|
||||
<div class="umap-edit-tilelayers">
|
||||
<h3><i class="icon icon-16 icon-tilelayer" title=""></i><span class="">${translate('Change tilelayers')}</span></h3>
|
||||
<ul data-ref="tileContainer"></ul>
|
||||
</div>
|
||||
`
|
||||
const [container, { tileContainer }] = Utils.loadTemplateWithRefs(template)
|
||||
this.buildList(tileContainer, options)
|
||||
const panel = options.edit ? this._umap.editPanel : this._umap.panel
|
||||
panel.open({ content: container, highlight: 'tilelayers' })
|
||||
},
|
||||
|
||||
buildList: function (container, options) {
|
||||
this._umap._leafletMap.eachTileLayer((tilelayer) => {
|
||||
const browserIsHttps = window.location.protocol === 'https:'
|
||||
const tileLayerIsHttp = tilelayer.options.url_template.indexOf('http:') === 0
|
||||
if (browserIsHttps && tileLayerIsHttp) return
|
||||
container.appendChild(this.addTileLayerElement(tilelayer, options))
|
||||
})
|
||||
},
|
||||
|
||||
addTileLayerElement: function (tilelayer, options) {
|
||||
const selectedClass = this._umap._leafletMap.hasLayer(tilelayer) ? 'selected' : ''
|
||||
const src = Utils.template(
|
||||
tilelayer.options.url_template,
|
||||
this._umap._leafletMap.options.demoTileInfos
|
||||
)
|
||||
const template = `
|
||||
<li>
|
||||
<img src="${src}" loading="lazy" />
|
||||
<div>${tilelayer.options.name}</div>
|
||||
</li>
|
||||
`
|
||||
const li = Utils.loadTemplate(template)
|
||||
li.addEventListener('click', () => {
|
||||
const oldTileLayer = this._umap.properties.tilelayer
|
||||
this._umap._leafletMap.selectTileLayer(tilelayer)
|
||||
this._umap._leafletMap._controls.tilelayers.setLayers()
|
||||
if (options?.edit) {
|
||||
this._umap.properties.tilelayer = tilelayer.toJSON()
|
||||
this._umap.sync.update(
|
||||
'properties.tilelayer',
|
||||
this._umap.properties.tilelayer,
|
||||
oldTileLayer
|
||||
)
|
||||
}
|
||||
})
|
||||
return li
|
||||
},
|
||||
})
|
|
@ -41,11 +41,6 @@ export const Heat = L.HeatLayer.extend({
|
|||
}
|
||||
},
|
||||
|
||||
removeLayer: (layer) => {
|
||||
// No op, there is no "removeLatLng" in Leaflet.heat
|
||||
// but this method is expected by DataLayer
|
||||
},
|
||||
|
||||
onAdd: function (map) {
|
||||
LayerMixin.onAdd.call(this, map)
|
||||
return L.HeatLayer.prototype.onAdd.call(this, map)
|
||||
|
|
|
@ -11,17 +11,6 @@ import {
|
|||
import { uMapAlert as Alert } from '../../components/alerts/alert.js'
|
||||
import DropControl from '../drop.js'
|
||||
import { translate } from '../i18n.js'
|
||||
import {
|
||||
AttributionControl,
|
||||
CaptionControl,
|
||||
DataLayersControl,
|
||||
EmbedControl,
|
||||
EditControl,
|
||||
HomeControl,
|
||||
MoreControl,
|
||||
PermanentCreditsControl,
|
||||
TileLayerChooser,
|
||||
} from './controls.js'
|
||||
import * as Utils from '../utils.js'
|
||||
import * as Icon from './icon.js'
|
||||
|
||||
|
@ -34,7 +23,6 @@ BaseMap.mergeOptions({
|
|||
|
||||
const ControlsMixin = {
|
||||
HIDDABLE_CONTROLS: [
|
||||
'home',
|
||||
'zoom',
|
||||
'search',
|
||||
'fullscreen',
|
||||
|
@ -51,15 +39,14 @@ const ControlsMixin = {
|
|||
this._controls = {}
|
||||
|
||||
if (this._umap.hasEditMode() && !this.options.noControl) {
|
||||
new EditControl(this).addTo(this)
|
||||
new U.EditControl(this).addTo(this)
|
||||
}
|
||||
this._controls.home = new HomeControl(this._umap)
|
||||
this._controls.zoom = new Control.Zoom({
|
||||
zoomInTitle: translate('Zoom in'),
|
||||
zoomOutTitle: translate('Zoom out'),
|
||||
})
|
||||
this._controls.datalayers = new DataLayersControl(this._umap)
|
||||
this._controls.caption = new CaptionControl(this._umap)
|
||||
this._controls.datalayers = new U.DataLayersControl(this._umap)
|
||||
this._controls.caption = new U.CaptionControl(this._umap)
|
||||
this._controls.locate = new U.Locate(this, {
|
||||
strings: {
|
||||
title: translate('Center map on your location'),
|
||||
|
@ -80,8 +67,8 @@ const ControlsMixin = {
|
|||
},
|
||||
})
|
||||
this._controls.search = new U.SearchControl()
|
||||
this._controls.embed = new EmbedControl(this._umap)
|
||||
this._controls.tilelayersChooser = new TileLayerChooser(this._umap)
|
||||
this._controls.embed = new Control.Embed(this._umap)
|
||||
this._controls.tilelayersChooser = new U.TileLayerChooser(this)
|
||||
this._controls.editinosm = new Control.EditInOSM({
|
||||
position: 'topleft',
|
||||
widgetOptions: {
|
||||
|
@ -91,9 +78,9 @@ const ControlsMixin = {
|
|||
},
|
||||
})
|
||||
this._controls.measure = new L.MeasureControl().initHandler(this)
|
||||
this._controls.more = new MoreControl()
|
||||
this._controls.more = new U.MoreControls()
|
||||
this._controls.scale = L.control.scale()
|
||||
this._controls.permanentCredit = new PermanentCreditsControl(this)
|
||||
this._controls.permanentCredit = new U.PermanentCreditsControl(this)
|
||||
this._umap.drop = new DropControl(this._umap, this, this._container)
|
||||
this._controls.tilelayers = new U.TileLayerControl(this)
|
||||
},
|
||||
|
@ -104,7 +91,11 @@ const ControlsMixin = {
|
|||
}
|
||||
if (this.options.noControl) return
|
||||
|
||||
this._controls.attribution = new AttributionControl().addTo(this)
|
||||
// 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 () {
|
||||
if (this.selectedTilelayer) {
|
||||
|
@ -327,7 +318,7 @@ export const LeafletMap = BaseMap.extend({
|
|||
} else if (this.options.defaultView === 'latest') {
|
||||
this._umap.onceDataLoaded(() => {
|
||||
if (!this._umap.hasData()) return
|
||||
const datalayer = this._umap.datalayers.visible()[0]
|
||||
const datalayer = this._umap.firstVisibleDatalayer()
|
||||
let feature
|
||||
if (datalayer) {
|
||||
const feature = datalayer.getFeatureByIndex(-1)
|
||||
|
|
|
@ -109,7 +109,9 @@ const PointMixin = {
|
|||
addInteractions() {
|
||||
FeatureMixin.addInteractions.call(this)
|
||||
this.on('dragend', (event) => {
|
||||
this.isDirty = true
|
||||
this.feature.edit(event)
|
||||
// this.feature.pullGeometry(false)
|
||||
})
|
||||
if (!this.feature.isReadOnly()) this.on('mouseover', this._enableDragging)
|
||||
this.on('mouseout', this._onMouseOut)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { stamp } from '../../vendors/leaflet/leaflet-src.esm.js'
|
||||
import { DomEvent, DomUtil, stamp } from '../../vendors/leaflet/leaflet-src.esm.js'
|
||||
import { AutocompleteDatalist } from './autocomplete.js'
|
||||
import { MutatingForm } from './form/builder.js'
|
||||
import { translate } from './i18n.js'
|
||||
|
@ -119,9 +119,10 @@ class Rule {
|
|||
'options.smoothFactor',
|
||||
'options.dashArray',
|
||||
]
|
||||
const container = DomUtil.create('div')
|
||||
const builder = new MutatingForm(this, options)
|
||||
const container = document.createElement('div')
|
||||
container.appendChild(builder.build())
|
||||
const defaultShapeProperties = DomUtil.add('div', '', container)
|
||||
defaultShapeProperties.appendChild(builder.build())
|
||||
const autocomplete = new AutocompleteDatalist(builder.helpers.condition.input)
|
||||
const properties = this._umap.allProperties()
|
||||
autocomplete.suggestions = properties
|
||||
|
@ -136,45 +137,43 @@ class Rule {
|
|||
.map((str) => `${value}${str || ''}`)
|
||||
}
|
||||
})
|
||||
const backButton = Utils.loadTemplate(`
|
||||
<button class="flat" type="button" data-ref="add">
|
||||
<i class="icon icon-16 icon-back" title="${translate('Back to list')}"></i>
|
||||
</button>`)
|
||||
backButton.addEventListener('click', () =>
|
||||
this._umap.edit().then(() => {
|
||||
this._umap.editPanel.container.querySelector('details#rules').open = true
|
||||
})
|
||||
)
|
||||
|
||||
this._umap.editPanel.open({
|
||||
content: container,
|
||||
highlight: 'settings',
|
||||
actions: [backButton],
|
||||
})
|
||||
this._umap.editPanel.open({ content: container, highlight: 'settings' })
|
||||
}
|
||||
|
||||
renderToolbox(ul) {
|
||||
const template = `
|
||||
<li data-id="${stamp(this)}" class="orderable">
|
||||
<button class="icon icon-16 icon-eye" title="${translate('Toggle rule')}" data-ref=toggle></button>
|
||||
<button class="icon icon-16 icon-edit show-on-edit" title="${translate('Edit')}" data-ref=edit></button>
|
||||
<button class="icon icon-16 icon-delete show-on-edit" title="${translate('Delete rule')}" data-ref=remove></button>
|
||||
<span>${this.condition || translate('empty rule')}</span>
|
||||
<i class="icon icon-16 icon-drag" title="${translate('Drag to reorder')}"></i>
|
||||
</li>
|
||||
`
|
||||
const [li, { toggle, edit, remove }] = Utils.loadTemplateWithRefs(template)
|
||||
ul.appendChild(li)
|
||||
li.classList.toggle('off', !this.active)
|
||||
edit.addEventListener('click', () => this.edit())
|
||||
remove.addEventListener('click', () => {
|
||||
if (!confirm(translate('Are you sure you want to delete this rule?'))) return
|
||||
this._delete()
|
||||
this._umap.editPanel.close()
|
||||
})
|
||||
toggle.addEventListener('click', () => {
|
||||
renderToolbox(row) {
|
||||
row.classList.toggle('off', !this.active)
|
||||
const toggle = DomUtil.createButtonIcon(
|
||||
row,
|
||||
'icon-eye',
|
||||
translate('Show/hide layer')
|
||||
)
|
||||
const edit = DomUtil.createButtonIcon(
|
||||
row,
|
||||
'icon-edit show-on-edit',
|
||||
translate('Edit')
|
||||
)
|
||||
const remove = DomUtil.createButtonIcon(
|
||||
row,
|
||||
'icon-delete show-on-edit',
|
||||
translate('Delete layer')
|
||||
)
|
||||
DomEvent.on(edit, 'click', this.edit, this)
|
||||
DomEvent.on(
|
||||
remove,
|
||||
'click',
|
||||
function () {
|
||||
if (!confirm(translate('Are you sure you want to delete this rule?'))) return
|
||||
this._delete()
|
||||
this._umap.editPanel.close()
|
||||
},
|
||||
this
|
||||
)
|
||||
DomUtil.add('span', '', row, this.condition || translate('empty rule'))
|
||||
DomUtil.createIcon(row, 'icon-drag', translate('Drag to reorder'))
|
||||
row.dataset.id = stamp(this)
|
||||
DomEvent.on(toggle, 'click', () => {
|
||||
this.active = !this.active
|
||||
li.classList.toggle('off', !this.active)
|
||||
row.classList.toggle('off', !this.active)
|
||||
this._umap.render(['rules'])
|
||||
})
|
||||
}
|
||||
|
@ -208,9 +207,8 @@ export default class Rules {
|
|||
}
|
||||
|
||||
onReorder(src, dst, initialIndex, finalIndex) {
|
||||
const oldRules = Utils.CopyJSON(this._umap.properties.rules || {})
|
||||
const moved = this.rules.find((rule) => stamp(rule) === +src.dataset.id)
|
||||
const reference = this.rules.find((rule) => stamp(rule) === +dst.dataset.id)
|
||||
const moved = this.rules.find((rule) => stamp(rule) === src.dataset.id)
|
||||
const reference = this.rules.find((rule) => stamp(rule) === dst.dataset.id)
|
||||
const movedIdx = this.rules.indexOf(moved)
|
||||
let referenceIdx = this.rules.indexOf(reference)
|
||||
const minIndex = Math.min(movedIdx, referenceIdx)
|
||||
|
@ -224,28 +222,20 @@ export default class Rules {
|
|||
this.rules.splice(newIdx, 0, moved)
|
||||
this._umap.render(['rules'])
|
||||
this.commit()
|
||||
this._umap.sync.update('properties.rules', this._umap.properties.rules, oldRules)
|
||||
}
|
||||
|
||||
edit(container) {
|
||||
const template = `
|
||||
<details id="rules">
|
||||
<summary>${translate('Conditional style rules')}</summary>
|
||||
<fieldset>
|
||||
<ul data-ref=ul></ul>
|
||||
<button class="umap-add" type="button" data-ref=add>${translate('Add rule')}</button>
|
||||
</fieldset>
|
||||
</details>
|
||||
`
|
||||
const [body, { ul, add }] = Utils.loadTemplateWithRefs(template)
|
||||
const body = DomUtil.createFieldset(container, translate('Conditional style rules'))
|
||||
if (this.rules.length) {
|
||||
const ul = DomUtil.create('ul', '', body)
|
||||
for (const rule of this.rules) {
|
||||
rule.renderToolbox(ul)
|
||||
rule.renderToolbox(DomUtil.create('li', 'orderable', ul))
|
||||
}
|
||||
|
||||
const orderable = new Orderable(ul, this.onReorder.bind(this))
|
||||
}
|
||||
add.addEventListener('click', () => this.addRule())
|
||||
container.appendChild(body)
|
||||
|
||||
DomUtil.createButton('umap-add', body, translate('Add rule'), this.addRule, this)
|
||||
}
|
||||
|
||||
addRule() {
|
||||
|
|
|
@ -10,7 +10,7 @@ import { translate } from './i18n.js'
|
|||
* - `type`: The type of the data
|
||||
* - `impacts`: A list of impacts than happen when this property is updated, among
|
||||
* 'ui', 'data', 'limit-bounds', 'datalayer-index', 'remote-data',
|
||||
* 'background', 'sync', 'datalayer-rank'.
|
||||
* 'background' 'sync'.
|
||||
*
|
||||
* - Extra keys are being passed to the FormBuilder automatically.
|
||||
*/
|
||||
|
@ -204,12 +204,6 @@ 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'],
|
||||
|
@ -281,12 +275,6 @@ 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'],
|
||||
|
@ -436,10 +424,6 @@ export const SCHEMA = {
|
|||
],
|
||||
default: 'Default',
|
||||
},
|
||||
rank: {
|
||||
type: Number,
|
||||
impacts: ['datalayer-rank'],
|
||||
},
|
||||
remoteData: {
|
||||
type: Object,
|
||||
impacts: ['remote-data'],
|
||||
|
|
|
@ -204,8 +204,8 @@ class IframeExporter {
|
|||
delete this.queryString.feature
|
||||
}
|
||||
if (this.options.keepCurrentDatalayers) {
|
||||
this._umap.datalayers.visible().map((datalayer) => {
|
||||
if (datalayer.createdOnServer) {
|
||||
this._umap.eachDataLayer((datalayer) => {
|
||||
if (datalayer.isVisible() && datalayer.createdOnServer) {
|
||||
datalayers.push(datalayer.id)
|
||||
}
|
||||
})
|
||||
|
|
|
@ -66,7 +66,7 @@ export default class Slideshow extends WithTemplate {
|
|||
}
|
||||
|
||||
defaultDatalayer() {
|
||||
return this._umap.datalayers.find((d) => d.canBrowse())
|
||||
return this._umap.findDataLayer((d) => d.canBrowse())
|
||||
}
|
||||
|
||||
startSpinner() {
|
||||
|
|
|
@ -207,45 +207,31 @@ export class SyncEngine {
|
|||
this._send(operation)
|
||||
}
|
||||
|
||||
_getDirtyObjects() {
|
||||
const dirty = new Map()
|
||||
async save() {
|
||||
const needSave = new Map()
|
||||
if (!this._umap.id) {
|
||||
// There is no operation for first map save
|
||||
dirty.set(this._umap, [])
|
||||
}
|
||||
const addDirtyObject = (operation) => {
|
||||
const updater = this._getUpdater(operation.subject)
|
||||
const obj = updater.getStoredObject(operation.metadata)
|
||||
if (!dirty.has(obj)) {
|
||||
dirty.set(obj, [])
|
||||
}
|
||||
dirty.get(obj).push(operation)
|
||||
needSave.set(this._umap, [])
|
||||
}
|
||||
for (const operation of this._operations.sorted()) {
|
||||
if (operation.dirty) {
|
||||
addDirtyObject(operation)
|
||||
if (operation.verb === 'batch') {
|
||||
for (const op of operation.operations) {
|
||||
addDirtyObject(op)
|
||||
}
|
||||
const updater = this._getUpdater(operation.subject)
|
||||
const obj = updater.getStoredObject(operation.metadata)
|
||||
if (!needSave.has(obj)) {
|
||||
needSave.set(obj, [])
|
||||
}
|
||||
needSave.get(obj).push(operation)
|
||||
}
|
||||
}
|
||||
return dirty
|
||||
}
|
||||
|
||||
async save() {
|
||||
const needSave = this._getDirtyObjects()
|
||||
for (const [obj, operations] of needSave.entries()) {
|
||||
const ok = await obj.save()
|
||||
if (!ok) return false
|
||||
if (!ok) break
|
||||
for (const operation of operations) {
|
||||
operation.dirty = false
|
||||
}
|
||||
}
|
||||
this.saved()
|
||||
this._undoManager.toggleState()
|
||||
return true
|
||||
}
|
||||
|
||||
saved() {
|
||||
|
|
|
@ -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>
|
||||
`
|
||||
|
||||
|
@ -207,7 +207,7 @@ export class BottomBar extends WithTemplate {
|
|||
const select = this.elements.layers
|
||||
const selected = select.options[select.selectedIndex].value
|
||||
if (!selected) return
|
||||
this._umap.datalayers.active().map((datalayer) => {
|
||||
this._umap.eachDataLayer((datalayer) => {
|
||||
datalayer.toggle(datalayer.id === selected)
|
||||
})
|
||||
})
|
||||
|
@ -228,12 +228,12 @@ export class BottomBar extends WithTemplate {
|
|||
|
||||
buildDataLayerSwitcher() {
|
||||
this.elements.layers.innerHTML = ''
|
||||
const datalayers = this._umap.datalayers.filter((d) => d.options.inCaption)
|
||||
const datalayers = this._umap.datalayersIndex.filter((d) => d.options.inCaption)
|
||||
if (datalayers.length < 2) {
|
||||
this.elements.layers.hidden = true
|
||||
} else {
|
||||
this.elements.layers.appendChild(Utils.loadTemplate(`<option value=""></option>`))
|
||||
this.elements.layers.hidden = !this._umap.getProperty('layerSwitcher')
|
||||
this.elements.layers.hidden = false
|
||||
const visible = datalayers.filter((datalayer) => datalayer.isVisible())
|
||||
for (const datalayer of datalayers) {
|
||||
const selected = visible.length === 1 && datalayer.isVisible() ? 'selected' : ''
|
||||
|
|
|
@ -4,8 +4,6 @@ export class Positioned {
|
|||
this.anchorTop(anchor)
|
||||
} else if (anchor && position === 'bottom') {
|
||||
this.anchorBottom(anchor)
|
||||
} else if (anchor && position === 'right') {
|
||||
this.anchorRight(anchor)
|
||||
} else {
|
||||
this.anchorAbsolute()
|
||||
}
|
||||
|
@ -14,7 +12,6 @@ export class Positioned {
|
|||
toggleClassPosition(position) {
|
||||
this.container.classList.toggle('tooltip-bottom', position === 'bottom')
|
||||
this.container.classList.toggle('tooltip-top', position === 'top')
|
||||
this.container.classList.toggle('tooltip-right', position === 'right')
|
||||
}
|
||||
|
||||
anchorTop(el) {
|
||||
|
@ -36,16 +33,6 @@ export class Positioned {
|
|||
})
|
||||
}
|
||||
|
||||
anchorRight(el) {
|
||||
this.toggleClassPosition('right')
|
||||
const coords = this.getPosition(el)
|
||||
console.log(coords)
|
||||
this.setPosition({
|
||||
left: coords.right + 11,
|
||||
top: coords.top,
|
||||
})
|
||||
}
|
||||
|
||||
anchorAbsolute() {
|
||||
const left =
|
||||
this.parent.offsetLeft +
|
||||
|
|
|
@ -33,7 +33,6 @@ import { EditPanel, FullPanel, Panel } from './ui/panel.js'
|
|||
import Tooltip from './ui/tooltip.js'
|
||||
import URLs from './urls.js'
|
||||
import * as Utils from './utils.js'
|
||||
import { DataLayerManager } from './managers.js'
|
||||
|
||||
export default class Umap {
|
||||
constructor(element, geojson) {
|
||||
|
@ -58,8 +57,6 @@ export default class Umap {
|
|||
},
|
||||
geojson.properties
|
||||
)
|
||||
this.createdAt = new Date(this.properties.created_at)
|
||||
this.modifiedAt = this.properties.modified_at
|
||||
this.searchParams = new URLSearchParams(window.location.search)
|
||||
|
||||
// Locale name (pt_PT, en_US…)
|
||||
|
@ -107,11 +104,6 @@ export default class Umap {
|
|||
|
||||
if (geojson.properties.schema) this.overrideSchema(geojson.properties.schema)
|
||||
|
||||
// Do not display in an iframe.
|
||||
if (this.isEmbed) {
|
||||
this.properties.homeControl = false
|
||||
}
|
||||
|
||||
this._leafletMap.setup()
|
||||
|
||||
this.panel = new Panel(this, this._leafletMap)
|
||||
|
@ -167,7 +159,8 @@ export default class Umap {
|
|||
}
|
||||
|
||||
// Global storage for retrieving datalayers and features.
|
||||
this.datalayers = new DataLayerManager()
|
||||
this.datalayers = {} // All datalayers, including deleted.
|
||||
this.datalayersIndex = [] // Datalayers actually on the map and ordered.
|
||||
this.featuresIndex = {}
|
||||
|
||||
this.formatter = new Formatter(this)
|
||||
|
@ -217,6 +210,7 @@ export default class Umap {
|
|||
}
|
||||
|
||||
window.onbeforeunload = () => (this.editEnabled && this.isDirty) || null
|
||||
this.backup()
|
||||
}
|
||||
|
||||
get isDirty() {
|
||||
|
@ -243,24 +237,6 @@ export default class Umap {
|
|||
this._activeFeature = feature
|
||||
}
|
||||
|
||||
get modifiedAt() {
|
||||
return this._modifiedAt
|
||||
}
|
||||
|
||||
set modifiedAt(at) {
|
||||
if (!at) return
|
||||
if (typeof at === 'string') {
|
||||
at = new Date(at)
|
||||
}
|
||||
if (!this._modifiedAt || at > this._modifiedAt) {
|
||||
this._modifiedAt = at
|
||||
}
|
||||
}
|
||||
|
||||
get isEmbed() {
|
||||
return window.self !== window.top
|
||||
}
|
||||
|
||||
setPropertiesFromQueryString() {
|
||||
const asBoolean = (key) => {
|
||||
const value = this.searchParams.get(key)
|
||||
|
@ -549,6 +525,7 @@ export default class Umap {
|
|||
'Ctrl+e': {
|
||||
if: () => this.hasEditMode(),
|
||||
do: () => {
|
||||
console.log('doing')
|
||||
if (!this.editEnabled) this.enableEdit()
|
||||
else if (!this.isDirty) this.disableEdit()
|
||||
},
|
||||
|
@ -615,7 +592,7 @@ export default class Umap {
|
|||
this.datalayersLoaded = true
|
||||
this.fire('datalayersloaded')
|
||||
const toLoad = []
|
||||
for (const datalayer of this.datalayers.active()) {
|
||||
for (const datalayer of this.datalayersIndex) {
|
||||
if (datalayer.showAtLoad()) toLoad.push(() => datalayer.show())
|
||||
}
|
||||
while (toLoad.length) {
|
||||
|
@ -629,7 +606,7 @@ export default class Umap {
|
|||
|
||||
createDataLayer(options = {}, sync = true) {
|
||||
options.name =
|
||||
options.name || `${translate('Layer')} ${this.datalayers.count() + 1}`
|
||||
options.name || `${translate('Layer')} ${this.datalayersIndex.length + 1}`
|
||||
const datalayer = new DataLayer(this, this._leafletMap, options)
|
||||
|
||||
if (sync !== false) {
|
||||
|
@ -640,6 +617,7 @@ export default class Umap {
|
|||
|
||||
createDirtyDataLayer(options) {
|
||||
const datalayer = this.createDataLayer(options, true)
|
||||
datalayer.isDirty = true
|
||||
return datalayer
|
||||
}
|
||||
|
||||
|
@ -649,19 +627,19 @@ export default class Umap {
|
|||
}
|
||||
|
||||
reindexDataLayers() {
|
||||
this.datalayers.active().map((datalayer) => datalayer.reindex())
|
||||
this.eachDataLayer((datalayer) => datalayer.reindex())
|
||||
this.onDataLayersChanged()
|
||||
}
|
||||
|
||||
reorderDataLayers() {
|
||||
const parent = this._leafletMap.getPane('overlayPane')
|
||||
const datalayers = Object.values(this.datalayers)
|
||||
.filter((datalayer) => !datalayer._isDeleted)
|
||||
.sort((datalayer1, datalayer2) => datalayer1.rank > datalayer2.rank)
|
||||
for (const datalayer of datalayers) {
|
||||
const child = parent.querySelector(`[data-id="${datalayer.id}"]`)
|
||||
parent.appendChild(child)
|
||||
indexDatalayers() {
|
||||
const panes = this._leafletMap.getPane('overlayPane')
|
||||
|
||||
this.datalayersIndex = []
|
||||
for (const pane of panes.children) {
|
||||
if (!pane.dataset || !pane.dataset.id) continue
|
||||
this.datalayersIndex.push(this.datalayers[pane.dataset.id])
|
||||
}
|
||||
this.onDataLayersChanged()
|
||||
}
|
||||
|
||||
onceDatalayersLoaded(callback, context) {
|
||||
|
@ -692,8 +670,8 @@ export default class Umap {
|
|||
async saveAll() {
|
||||
if (!this.isDirty) return
|
||||
if (this._defaultExtent) this._setCenterAndZoom()
|
||||
const status = await this.sync.save()
|
||||
if (!status) return
|
||||
this.backup()
|
||||
await this.sync.save()
|
||||
// Do a blind render for now, as we are not sure what could
|
||||
// have changed, we'll be more subtil when we'll remove the
|
||||
// save action
|
||||
|
@ -711,6 +689,24 @@ export default class Umap {
|
|||
return this.properties.name || translate('Untitled map')
|
||||
}
|
||||
|
||||
backup() {
|
||||
this.backupProperties()
|
||||
this._datalayersIndex_bk = [].concat(this.datalayersIndex)
|
||||
}
|
||||
|
||||
backupProperties() {
|
||||
this._backupProperties = Object.assign({}, this.properties)
|
||||
this._backupProperties.tilelayer = Object.assign({}, this.properties.tilelayer)
|
||||
this._backupProperties.limitBounds = Object.assign({}, this.properties.limitBounds)
|
||||
this._backupProperties.permissions = Object.assign({}, this.permissions.properties)
|
||||
}
|
||||
|
||||
resetProperties() {
|
||||
this.properties = Object.assign({}, this._backupProperties)
|
||||
this.properties.tilelayer = Object.assign({}, this._backupProperties.tilelayer)
|
||||
this.permissions.properties = Object.assign({}, this._backupProperties.permissions)
|
||||
}
|
||||
|
||||
setProperties(newProperties) {
|
||||
for (const key of Object.keys(SCHEMA)) {
|
||||
if (newProperties[key] !== undefined) {
|
||||
|
@ -723,24 +719,24 @@ export default class Umap {
|
|||
}
|
||||
|
||||
hasData() {
|
||||
for (const datalayer of this.datalayers.active()) {
|
||||
for (const datalayer of this.datalayersIndex) {
|
||||
if (datalayer.hasData()) return true
|
||||
}
|
||||
}
|
||||
|
||||
hasLayers() {
|
||||
return Boolean(this.datalayers.count())
|
||||
return Boolean(this.datalayersIndex.length)
|
||||
}
|
||||
|
||||
allProperties() {
|
||||
return [].concat(...this.datalayers.active().map((dl) => dl.allProperties()))
|
||||
return [].concat(...this.datalayersIndex.map((dl) => dl.allProperties()))
|
||||
}
|
||||
|
||||
sortedValues(property) {
|
||||
return []
|
||||
.concat(...this.datalayers.active().map((dl) => dl.sortedValues(property)))
|
||||
.concat(...this.datalayersIndex.map((dl) => dl.sortedValues(property)))
|
||||
.filter((val, idx, arr) => arr.indexOf(val) === idx)
|
||||
.sort(Utils.naturalSort)
|
||||
.sort(U.Utils.naturalSort)
|
||||
}
|
||||
|
||||
editCaption() {
|
||||
|
@ -803,7 +799,7 @@ export default class Umap {
|
|||
`<button type="button">${translate('Use current center and zoom')}</button>`
|
||||
)
|
||||
button.addEventListener('click', () => {
|
||||
this.setCenterAndZoom()
|
||||
this._setCenterAndZoom()
|
||||
builder.fetchAll()
|
||||
})
|
||||
container.appendChild(form)
|
||||
|
@ -825,7 +821,6 @@ export default class Umap {
|
|||
'properties.displayPopupFooter',
|
||||
'properties.captionBar',
|
||||
'properties.captionMenus',
|
||||
'properties.layerSwitcher',
|
||||
])
|
||||
const builder = new MutatingForm(this, UIFields, { umap: this })
|
||||
const controlsOptions = DomUtil.createFieldset(
|
||||
|
@ -1161,7 +1156,7 @@ export default class Umap {
|
|||
}
|
||||
this._advancedActions(container)
|
||||
|
||||
return this.editPanel.open({
|
||||
this.editPanel.open({
|
||||
content: container,
|
||||
className: 'dark',
|
||||
highlight: 'settings',
|
||||
|
@ -1215,8 +1210,12 @@ export default class Umap {
|
|||
})
|
||||
}
|
||||
} else {
|
||||
this.permissions.setProperties(data.permissions)
|
||||
this.permissions.commit()
|
||||
if (!this.permissions.isDirty) {
|
||||
// Do not override local changes to permissions,
|
||||
// but update in case some other editors changed them in the meantime.
|
||||
this.permissions.setProperties(data.permissions)
|
||||
this.permissions.commit()
|
||||
}
|
||||
this._leafletMap.once('saved', () => {
|
||||
Alert.success(data.info || translate('Map has been saved!'))
|
||||
})
|
||||
|
@ -1253,7 +1252,7 @@ export default class Umap {
|
|||
|
||||
toGeoJSON() {
|
||||
let features = []
|
||||
this.datalayers.active().map((datalayer) => {
|
||||
this.eachDataLayer((datalayer) => {
|
||||
if (datalayer.isVisible()) {
|
||||
features = features.concat(datalayer.featuresToGeoJSON())
|
||||
}
|
||||
|
@ -1329,20 +1328,13 @@ export default class Umap {
|
|||
if (fields.includes('properties.rules')) {
|
||||
this.rules.load()
|
||||
}
|
||||
this.datalayers.visible().map((datalayer) => {
|
||||
this.eachVisibleDataLayer((datalayer) => {
|
||||
datalayer.redraw()
|
||||
})
|
||||
break
|
||||
case 'datalayer-index':
|
||||
this.reindexDataLayers()
|
||||
break
|
||||
case 'datalayer-rank':
|
||||
// When drag'n'dropping datalayers,
|
||||
// this get called once per datalayers.
|
||||
// (and same for undo/redo of the action)
|
||||
// TODO: call only once
|
||||
this.reorderDataLayers()
|
||||
break
|
||||
case 'background':
|
||||
this._leafletMap.initTileLayers()
|
||||
break
|
||||
|
@ -1431,7 +1423,7 @@ export default class Umap {
|
|||
) {
|
||||
return datalayer
|
||||
}
|
||||
datalayer = this.datalayers.find((datalayer) => {
|
||||
datalayer = this.findDataLayer((datalayer) => {
|
||||
if (!datalayer.isDataReadOnly() && datalayer.isBrowsable()) {
|
||||
fallback = datalayer
|
||||
if (datalayer.isVisible()) return true
|
||||
|
@ -1446,37 +1438,61 @@ export default class Umap {
|
|||
return this.createDirtyDataLayer()
|
||||
}
|
||||
|
||||
eachFeature(callback) {
|
||||
this.datalayers.browsable().map((datalayer) => {
|
||||
if (datalayer.isVisible()) datalayer.eachFeature(callback)
|
||||
findDataLayer(method, context) {
|
||||
for (let i = this.datalayersIndex.length - 1; i >= 0; i--) {
|
||||
if (method.call(context, this.datalayersIndex[i])) {
|
||||
return this.datalayersIndex[i]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
eachDataLayer(method, context) {
|
||||
for (let i = 0; i < this.datalayersIndex.length; i++) {
|
||||
method.call(context, this.datalayersIndex[i])
|
||||
}
|
||||
}
|
||||
|
||||
eachDataLayerReverse(method, context, filter) {
|
||||
for (let i = this.datalayersIndex.length - 1; i >= 0; i--) {
|
||||
if (filter && !filter.call(context, this.datalayersIndex[i])) continue
|
||||
method.call(context, this.datalayersIndex[i])
|
||||
}
|
||||
}
|
||||
|
||||
eachBrowsableDataLayer(method, context) {
|
||||
this.eachDataLayerReverse(method, context, (d) => d.allowBrowse())
|
||||
}
|
||||
|
||||
eachVisibleDataLayer(method, context) {
|
||||
this.eachDataLayerReverse(method, context, (d) => d.isVisible())
|
||||
}
|
||||
|
||||
eachFeature(callback, context) {
|
||||
this.eachBrowsableDataLayer((datalayer) => {
|
||||
if (datalayer.isVisible()) datalayer.eachFeature(callback, context)
|
||||
})
|
||||
}
|
||||
|
||||
removeDataLayers() {
|
||||
this.datalayers.active().map((datalayer) => {
|
||||
this.eachDataLayerReverse((datalayer) => {
|
||||
datalayer.del()
|
||||
})
|
||||
}
|
||||
|
||||
emptyDataLayers() {
|
||||
this.datalayers.active().map((datalayer) => {
|
||||
this.eachDataLayerReverse((datalayer) => {
|
||||
datalayer.empty()
|
||||
})
|
||||
}
|
||||
|
||||
editDatalayers() {
|
||||
if (!this.editEnabled) return
|
||||
const template = `
|
||||
<div>
|
||||
<h3><i class="icon icon-16 icon-layers"></i>${translate('Manage layers')}</h3>
|
||||
<ul data-ref=ul></ul>
|
||||
</div>
|
||||
`
|
||||
const [container, { ul }] = Utils.loadTemplateWithRefs(template)
|
||||
this.datalayers.reverse().map((datalayer) => {
|
||||
const row = Utils.loadTemplate(
|
||||
`<li class="orderable"><i class="icon icon-16 icon-drag" title="${translate('Drag to reorder')}"></i></li>`
|
||||
)
|
||||
const container = DomUtil.create('div')
|
||||
DomUtil.createTitle(container, translate('Manage layers'), 'icon-layers')
|
||||
const ul = DomUtil.create('ul', '', container)
|
||||
this.eachDataLayerReverse((datalayer) => {
|
||||
const row = DomUtil.create('li', 'orderable', ul)
|
||||
DomUtil.createIcon(row, 'icon-drag', translate('Drag to reorder'))
|
||||
datalayer.renderToolbox(row)
|
||||
const builder = new MutatingForm(
|
||||
datalayer,
|
||||
|
@ -1487,27 +1503,20 @@ export default class Umap {
|
|||
row.appendChild(form)
|
||||
row.classList.toggle('off', !datalayer.isVisible())
|
||||
row.dataset.id = datalayer.id
|
||||
ul.appendChild(row)
|
||||
})
|
||||
const onReorder = (src, dst, initialIndex, finalIndex) => {
|
||||
const movedLayer = this.datalayers[src.dataset.id]
|
||||
const targetLayer = this.datalayers[dst.dataset.id]
|
||||
const minIndex = Math.min(movedLayer.getDOMOrder(), targetLayer.getDOMOrder())
|
||||
const maxIndex = Math.max(movedLayer.getDOMOrder(), targetLayer.getDOMOrder())
|
||||
const minIndex = Math.min(movedLayer.getRank(), targetLayer.getRank())
|
||||
const maxIndex = Math.max(movedLayer.getRank(), targetLayer.getRank())
|
||||
if (finalIndex === 0) movedLayer.bringToTop()
|
||||
else if (finalIndex > initialIndex) movedLayer.insertBefore(targetLayer)
|
||||
else movedLayer.insertAfter(targetLayer)
|
||||
this.sync.startBatch()
|
||||
this.datalayers.reverse().map((datalayer) => {
|
||||
const rank = datalayer.getDOMOrder()
|
||||
if (rank >= minIndex && rank <= maxIndex) {
|
||||
const oldRank = datalayer.rank
|
||||
datalayer.rank = rank
|
||||
datalayer.sync.update('options.rank', rank, oldRank)
|
||||
}
|
||||
this.eachDataLayerReverse((datalayer) => {
|
||||
if (datalayer.getRank() >= minIndex && datalayer.getRank() <= maxIndex)
|
||||
datalayer.isDirty = true
|
||||
})
|
||||
this.sync.commitBatch()
|
||||
this.onDataLayersChanged()
|
||||
this.indexDatalayers()
|
||||
}
|
||||
const orderable = new Orderable(ul, onReorder)
|
||||
|
||||
|
@ -1529,6 +1538,18 @@ export default class Umap {
|
|||
return datalayer
|
||||
}
|
||||
|
||||
firstVisibleDatalayer() {
|
||||
return this.findDataLayer((datalayer) => {
|
||||
if (datalayer.isVisible()) return true
|
||||
})
|
||||
}
|
||||
|
||||
ensurePanesOrder() {
|
||||
this.eachDataLayer((datalayer) => {
|
||||
datalayer.bringToTop()
|
||||
})
|
||||
}
|
||||
|
||||
openBrowser(mode) {
|
||||
this.onceDatalayersLoaded(() => this.browser.open(mode))
|
||||
}
|
||||
|
@ -1679,7 +1700,7 @@ export default class Umap {
|
|||
|
||||
getLayersBounds() {
|
||||
const bounds = new latLngBounds()
|
||||
this.datalayers.browsable().map((d) => {
|
||||
this.eachBrowsableDataLayer((d) => {
|
||||
if (d.isVisible()) bounds.extend(d.layer.getBounds())
|
||||
})
|
||||
return bounds
|
||||
|
|
|
@ -283,8 +283,6 @@ export function greedyTemplate(str, data, ignore) {
|
|||
}
|
||||
|
||||
export function naturalSort(a, b, lang) {
|
||||
a ??= ''
|
||||
b ??= ''
|
||||
return a
|
||||
.toString()
|
||||
.toLowerCase()
|
||||
|
|
|
@ -1,3 +1,183 @@
|
|||
U.HomeControl = L.Control.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
},
|
||||
|
||||
onAdd: (map) => {
|
||||
const path = map._umap.getStaticPathFor('home.svg')
|
||||
const container = U.Utils.loadTemplate(
|
||||
`<a href="/" class="home-button" title="${L._('Back to home')}"><img src="${path}" alt="${L._('Home logo')}" width="38px" height="38px" /></a>`
|
||||
)
|
||||
return container
|
||||
},
|
||||
})
|
||||
|
||||
U.EditControl = L.Control.extend({
|
||||
options: {
|
||||
position: 'topright',
|
||||
},
|
||||
|
||||
onAdd: function (map) {
|
||||
const container = L.DomUtil.create('div', 'edit-enable')
|
||||
const enableEditing = L.DomUtil.createButton(
|
||||
'',
|
||||
container,
|
||||
L._('Edit'),
|
||||
map._umap.enableEdit,
|
||||
map._umap
|
||||
)
|
||||
L.DomEvent.on(
|
||||
enableEditing,
|
||||
'mouseover',
|
||||
() => {
|
||||
map._umap.tooltip.open({
|
||||
content: map._umap.help.displayLabel('TOGGLE_EDIT'),
|
||||
anchor: enableEditing,
|
||||
position: 'bottom',
|
||||
delay: 750,
|
||||
duration: 5000,
|
||||
})
|
||||
},
|
||||
this
|
||||
)
|
||||
|
||||
return container
|
||||
},
|
||||
})
|
||||
|
||||
U.MoreControls = L.Control.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
},
|
||||
|
||||
onAdd: function () {
|
||||
const container = L.DomUtil.create('div', 'umap-control-text')
|
||||
const moreButton = L.DomUtil.createButton(
|
||||
'umap-control-more',
|
||||
container,
|
||||
L._('More controls'),
|
||||
this.toggle,
|
||||
this
|
||||
)
|
||||
const lessButton = L.DomUtil.createButton(
|
||||
'umap-control-less',
|
||||
container,
|
||||
L._('Hide controls'),
|
||||
this.toggle,
|
||||
this
|
||||
)
|
||||
return container
|
||||
},
|
||||
|
||||
toggle: function () {
|
||||
const pos = this.getPosition()
|
||||
const corner = this._map._controlCorners[pos]
|
||||
const className = 'umap-more-controls'
|
||||
if (L.DomUtil.hasClass(corner, className)) L.DomUtil.removeClass(corner, className)
|
||||
else L.DomUtil.addClass(corner, className)
|
||||
},
|
||||
})
|
||||
|
||||
U.PermanentCreditsControl = L.Control.extend({
|
||||
options: {
|
||||
position: 'bottomleft',
|
||||
},
|
||||
|
||||
initialize: function (map, options) {
|
||||
this.map = map
|
||||
L.Control.prototype.initialize.call(this, options)
|
||||
},
|
||||
|
||||
onAdd: function () {
|
||||
this.paragraphContainer = L.DomUtil.create(
|
||||
'div',
|
||||
'umap-permanent-credits-container text'
|
||||
)
|
||||
this.setCredits()
|
||||
this.setBackground()
|
||||
return this.paragraphContainer
|
||||
},
|
||||
|
||||
setCredits: function () {
|
||||
this.paragraphContainer.innerHTML = U.Utils.toHTML(this.map.options.permanentCredit)
|
||||
},
|
||||
|
||||
setBackground: function () {
|
||||
if (this.map.options.permanentCreditBackground) {
|
||||
this.paragraphContainer.style.backgroundColor = '#FFFFFFB0'
|
||||
} else {
|
||||
this.paragraphContainer.style.backgroundColor = ''
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
L.Control.Button = L.Control.extend({
|
||||
initialize: function (umap, options) {
|
||||
this._umap = umap
|
||||
L.Control.prototype.initialize.call(this, options)
|
||||
},
|
||||
|
||||
getClassName: function () {
|
||||
return this.options.className
|
||||
},
|
||||
|
||||
onAdd: function (map) {
|
||||
const container = L.DomUtil.create('div', `${this.getClassName()} umap-control`)
|
||||
const button = L.DomUtil.createButton(
|
||||
'',
|
||||
container,
|
||||
this.options.title,
|
||||
this.onClick,
|
||||
this
|
||||
)
|
||||
L.DomEvent.on(button, 'dblclick', L.DomEvent.stopPropagation)
|
||||
this.afterAdd(container)
|
||||
return container
|
||||
},
|
||||
|
||||
afterAdd: (container) => {},
|
||||
})
|
||||
|
||||
U.DataLayersControl = L.Control.Button.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
className: 'umap-control-browse',
|
||||
title: L._('Open browser'),
|
||||
},
|
||||
|
||||
afterAdd: function (container) {
|
||||
U.Utils.toggleBadge(container, this._umap.browser?.hasFilters())
|
||||
},
|
||||
|
||||
onClick: function () {
|
||||
this._umap.openBrowser()
|
||||
},
|
||||
})
|
||||
|
||||
U.CaptionControl = L.Control.Button.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
className: 'umap-control-caption',
|
||||
title: L._('About'),
|
||||
},
|
||||
|
||||
onClick: function () {
|
||||
this._umap.openCaption()
|
||||
},
|
||||
})
|
||||
|
||||
L.Control.Embed = L.Control.Button.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
title: L._('Share and download'),
|
||||
className: 'leaflet-control-embed umap-control',
|
||||
},
|
||||
|
||||
onClick: function () {
|
||||
this._umap.share.open()
|
||||
},
|
||||
})
|
||||
|
||||
/* Used in view mode to define the current tilelayer */
|
||||
U.TileLayerControl = L.Control.IconLayers.extend({
|
||||
initialize: function (map, options) {
|
||||
|
@ -58,6 +238,128 @@ U.TileLayerControl = L.Control.IconLayers.extend({
|
|||
},
|
||||
})
|
||||
|
||||
/* Used in edit mode to define the default tilelayer */
|
||||
U.TileLayerChooser = L.Control.extend({
|
||||
options: {
|
||||
position: 'topleft',
|
||||
},
|
||||
|
||||
initialize: function (map, options = {}) {
|
||||
this.map = map
|
||||
L.Control.prototype.initialize.call(this, options)
|
||||
},
|
||||
|
||||
onAdd: function () {
|
||||
const container = L.DomUtil.create('div', 'leaflet-control-tilelayers umap-control')
|
||||
const changeMapBackgroundButton = L.DomUtil.createButton(
|
||||
'',
|
||||
container,
|
||||
L._('Change map background'),
|
||||
this.openSwitcher,
|
||||
this
|
||||
)
|
||||
L.DomEvent.on(changeMapBackgroundButton, 'dblclick', L.DomEvent.stopPropagation)
|
||||
return container
|
||||
},
|
||||
|
||||
openSwitcher: function (options = {}) {
|
||||
const container = L.DomUtil.create('div', 'umap-edit-tilelayers')
|
||||
L.DomUtil.createTitle(container, L._('Change tilelayers'), 'icon-tilelayer')
|
||||
this._tilelayers_container = L.DomUtil.create('ul', '', container)
|
||||
this.buildList(options)
|
||||
const panel = options.edit ? this.map._umap.editPanel : this.map._umap.panel
|
||||
panel.open({ content: container, highlight: 'tilelayers' })
|
||||
},
|
||||
|
||||
buildList: function (options) {
|
||||
this.map.eachTileLayer(function (tilelayer) {
|
||||
if (
|
||||
window.location.protocol === 'https:' &&
|
||||
tilelayer.options.url_template.indexOf('http:') === 0
|
||||
)
|
||||
return
|
||||
this.addTileLayerElement(tilelayer, options)
|
||||
}, this)
|
||||
},
|
||||
|
||||
addTileLayerElement: function (tilelayer, options) {
|
||||
const selectedClass = this.map.hasLayer(tilelayer) ? 'selected' : ''
|
||||
const el = L.DomUtil.create('li', selectedClass, this._tilelayers_container)
|
||||
const img = L.DomUtil.create('img', '', el)
|
||||
const name = L.DomUtil.create('div', '', el)
|
||||
img.src = U.Utils.template(
|
||||
tilelayer.options.url_template,
|
||||
this.map.options.demoTileInfos
|
||||
)
|
||||
img.loading = 'lazy'
|
||||
name.textContent = tilelayer.options.name
|
||||
L.DomEvent.on(
|
||||
el,
|
||||
'click',
|
||||
() => {
|
||||
const oldTileLayer = this.map._umap.properties.tilelayer
|
||||
this.map.selectTileLayer(tilelayer)
|
||||
this.map._controls.tilelayers.setLayers()
|
||||
if (options?.edit) {
|
||||
this.map._umap.properties.tilelayer = tilelayer.toJSON()
|
||||
this.map._umap.isDirty = true
|
||||
this.map._umap.sync.update(
|
||||
'properties.tilelayer',
|
||||
this.map._umap.properties.tilelayer,
|
||||
oldTileLayer
|
||||
)
|
||||
}
|
||||
},
|
||||
this
|
||||
)
|
||||
},
|
||||
})
|
||||
|
||||
U.AttributionControl = L.Control.Attribution.extend({
|
||||
options: {
|
||||
prefix: '',
|
||||
},
|
||||
|
||||
_update: function () {
|
||||
// Layer is no more on the map
|
||||
if (!this._map) return
|
||||
L.Control.Attribution.prototype._update.call(this)
|
||||
// Use our own container, so we can hide/show on small screens
|
||||
const credits = this._container.innerHTML
|
||||
this._container.innerHTML = ''
|
||||
const container = L.DomUtil.create('div', 'attribution-container', this._container)
|
||||
container.innerHTML = credits
|
||||
const shortCredit = this._map._umap.getProperty('shortCredit')
|
||||
const captionMenus = this._map._umap.getProperty('captionMenus')
|
||||
if (shortCredit) {
|
||||
L.DomUtil.element({
|
||||
tagName: 'span',
|
||||
parent: container,
|
||||
safeHTML: ` — ${U.Utils.toHTML(shortCredit)}`,
|
||||
})
|
||||
}
|
||||
if (captionMenus) {
|
||||
const link = L.DomUtil.add('a', '', container, ` — ${L._('Open caption')}`)
|
||||
L.DomEvent.on(link, 'click', L.DomEvent.stop)
|
||||
.on(link, 'click', () => this._map._umap.openCaption())
|
||||
.on(link, 'dblclick', L.DomEvent.stop)
|
||||
}
|
||||
if (window.top === window.self && captionMenus) {
|
||||
// We are not in iframe mode
|
||||
L.DomUtil.createLink('', container, ` — ${L._('Home')}`, '/')
|
||||
}
|
||||
if (captionMenus) {
|
||||
L.DomUtil.createLink(
|
||||
'',
|
||||
container,
|
||||
` — ${L._('Powered by uMap')}`,
|
||||
'https://umap-project.org/'
|
||||
)
|
||||
}
|
||||
L.DomUtil.createLink('attribution-toggle', this._container, '')
|
||||
},
|
||||
})
|
||||
|
||||
/*
|
||||
* Take control over L.Control.Locate to be able to
|
||||
* call start() before adding the control (and thus the button) to the map.
|
||||
|
@ -159,6 +461,7 @@ U.Search = L.PhotonSearch.extend({
|
|||
event.stopPropagation()
|
||||
const datalayer = this.map._umap.defaultEditDataLayer()
|
||||
const marker = datalayer.makeFeature(feature)
|
||||
marker.isDirty = true
|
||||
marker.edit()
|
||||
})
|
||||
geom.addEventListener('mousedown', async (event) => {
|
||||
|
@ -299,8 +602,14 @@ U.Editable = L.Editable.extend({
|
|||
if (event.layer instanceof U.LeafletMarker) event.layer.feature.del()
|
||||
})
|
||||
this.on('editable:drawing:commit', function (event) {
|
||||
event.layer.feature.isDirty = true
|
||||
if (this._umap.editedFeature !== event.layer) event.layer.feature.edit(event)
|
||||
})
|
||||
this.on('editable:editing', (event) => {
|
||||
const feature = event.layer.feature
|
||||
feature.isDirty = true
|
||||
// feature.pullGeometry(false)
|
||||
})
|
||||
this.on('editable:vertex:ctrlclick', (event) => {
|
||||
const index = event.vertex.getIndex()
|
||||
if (
|
||||
|
@ -320,7 +629,7 @@ U.Editable = L.Editable.extend({
|
|||
const line = new U.LineString(this._umap, datalayer, {
|
||||
geometry: { type: 'LineString', coordinates: [] },
|
||||
})
|
||||
line._needs_upsert = true
|
||||
line._just_married = true
|
||||
return line.ui
|
||||
},
|
||||
|
||||
|
@ -329,7 +638,7 @@ U.Editable = L.Editable.extend({
|
|||
const poly = new U.Polygon(this._umap, datalayer, {
|
||||
geometry: { type: 'Polygon', coordinates: [] },
|
||||
})
|
||||
poly._needs_upsert = true
|
||||
poly._just_married = true
|
||||
return poly.ui
|
||||
},
|
||||
|
||||
|
@ -338,7 +647,7 @@ U.Editable = L.Editable.extend({
|
|||
const point = new U.Point(this._umap, datalayer, {
|
||||
geometry: { type: 'Point', coordinates: [latlng.lng, latlng.lat] },
|
||||
})
|
||||
point._needs_upsert = true
|
||||
point._just_married = true
|
||||
return point.ui
|
||||
},
|
||||
|
||||
|
@ -354,6 +663,7 @@ U.Editable = L.Editable.extend({
|
|||
// Overrided from Leaflet.Editable
|
||||
const datalayer = this._umap.defaultEditDataLayer()
|
||||
datalayer.addFeature(layer.feature)
|
||||
layer.isDirty = true
|
||||
return layer
|
||||
},
|
||||
|
||||
|
|
|
@ -65,6 +65,18 @@ L.DomUtil.createButton = (className, container, content, callback, context) => {
|
|||
return el
|
||||
}
|
||||
|
||||
L.DomUtil.createLink = (className, container, content, url, target, title) => {
|
||||
const el = L.DomUtil.add('a', className, container, content)
|
||||
el.href = url
|
||||
if (target) {
|
||||
el.target = target
|
||||
}
|
||||
if (title) {
|
||||
el.title = title
|
||||
}
|
||||
return el
|
||||
}
|
||||
|
||||
L.DomUtil.createIcon = (parent, className, title, size = 16) => {
|
||||
return L.DomUtil.element({
|
||||
tagName: 'i',
|
||||
|
@ -101,12 +113,8 @@ L.DomUtil.createCopiableInput = (parent, label, value) => {
|
|||
input.type = 'text'
|
||||
input.readOnly = true
|
||||
input.value = value
|
||||
const button = L.DomUtil.createButtonIcon(
|
||||
wrapper,
|
||||
'icon-copy',
|
||||
L._('copy'),
|
||||
() => L.Util.copyToClipboard(input.value),
|
||||
24
|
||||
const button = L.DomUtil.createButtonIcon(wrapper, 'icon-copy', L._('copy'), () =>
|
||||
L.Util.copyToClipboard(input.value)
|
||||
)
|
||||
button.type = 'button'
|
||||
return input
|
||||
|
@ -128,6 +136,16 @@ L.DomUtil.element = ({ tagName, parent, ...attrs }) => {
|
|||
return el
|
||||
}
|
||||
|
||||
L.DomUtil.before = (target, el) => {
|
||||
target.parentNode.insertBefore(el, target)
|
||||
return el
|
||||
}
|
||||
|
||||
L.DomUtil.after = (target, el) => {
|
||||
target.parentNode.insertBefore(el, target.nextSibling)
|
||||
return el
|
||||
}
|
||||
|
||||
// From https://gist.github.com/Accudio/b9cb16e0e3df858cef0d31e38f1fe46f
|
||||
// convert colour in range 0-255 to the modifier used within luminance calculation
|
||||
L.DomUtil.colourMod = (colour) => {
|
||||
|
@ -192,6 +210,24 @@ L.DomUtil.contrastedColor = (el, bgcolor) => {
|
|||
if (bgcolor) _CACHE_CONSTRAST[bgcolor] = out
|
||||
return out
|
||||
}
|
||||
L.DomEvent.once = (el, types, fn, context) => {
|
||||
// cf https://github.com/Leaflet/Leaflet/pull/3528#issuecomment-134551575
|
||||
|
||||
if (typeof types === 'object') {
|
||||
for (const type in types) {
|
||||
L.DomEvent.once(el, type, types[type], fn)
|
||||
}
|
||||
return L.DomEvent
|
||||
}
|
||||
|
||||
const handler = L.bind(() => {
|
||||
L.DomEvent.off(el, types, fn, context).off(el, types, handler, context)
|
||||
}, L.DomEvent)
|
||||
|
||||
// add a listener that's executed once and removed after that
|
||||
return L.DomEvent.on(el, types, fn, context).on(el, types, handler, context)
|
||||
}
|
||||
|
||||
L.LatLng.prototype.isValid = function () {
|
||||
return (
|
||||
Number.isFinite(this.lat) &&
|
||||
|
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "ካፕሽን",
|
||||
"Center map on your location": "መገኛዎን የሚያሳየውን ካርታ ወደ መሀል ያድርጉ",
|
||||
"Change map background": "የካርታውን የጀርባ ገፅታ ይቀይሩ",
|
||||
"Change tilelayers": "የታይልሌየሩን",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "የረጃውን ፎርማት ቀይር",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -536,14 +538,7 @@ const locale = {
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("am_ET", locale)
|
||||
L.setLocale("am_ET")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "ካፕሽን",
|
||||
"Center map on your location": "መገኛዎን የሚያሳየውን ካርታ ወደ መሀል ያድርጉ",
|
||||
"Change map background": "የካርታውን የጀርባ ገፅታ ይቀይሩ",
|
||||
"Change tilelayers": "የታይልሌየሩን",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "የረጃውን ፎርማት ቀይር",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "شرح",
|
||||
"Center map on your location": "Center map on your location",
|
||||
"Change map background": "Change map background",
|
||||
"Change tilelayers": "Change tilelayers",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "اختر تنسيق البيانات",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -536,14 +538,7 @@ const locale = {
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("ar", locale)
|
||||
L.setLocale("ar")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "شرح",
|
||||
"Center map on your location": "Center map on your location",
|
||||
"Change map background": "Change map background",
|
||||
"Change tilelayers": "Change tilelayers",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "اختر تنسيق البيانات",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Caption",
|
||||
"Center map on your location": "Center map on your location",
|
||||
"Change map background": "Change map background",
|
||||
"Change tilelayers": "Change tilelayers",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Choose the data format",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -536,14 +538,7 @@ const locale = {
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("ast", locale)
|
||||
L.setLocale("ast")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Caption",
|
||||
"Center map on your location": "Center map on your location",
|
||||
"Change map background": "Change map background",
|
||||
"Change tilelayers": "Change tilelayers",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Choose the data format",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Надпис",
|
||||
"Center map on your location": "Center map on your location",
|
||||
"Change map background": "Промяна фона на картата",
|
||||
"Change tilelayers": "Променете слоевете",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Изберете формата на данните",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -536,14 +538,7 @@ const locale = {
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("bg", locale)
|
||||
L.setLocale("bg")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Надпис",
|
||||
"Center map on your location": "Center map on your location",
|
||||
"Change map background": "Промяна фона на картата",
|
||||
"Change tilelayers": "Променете слоевете",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Изберете формата на данните",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Alc'hwez",
|
||||
"Center map on your location": "Kreizañ ar gartenn war al lec'h m'emaoc'h",
|
||||
"Change map background": "Cheñch foñs ar gartenn",
|
||||
"Change tilelayers": "Cheñch foñs ar gartenn",
|
||||
"Change": "Kemmañ",
|
||||
"Choose the data format": "Diuzañ furmad ar roadennoù",
|
||||
|
@ -456,6 +457,7 @@ const locale = {
|
|||
"Choose this dataset": "Dibab an hollad cheñchamantoù-mañ",
|
||||
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: thematic data from OpenStreetMap",
|
||||
"Choose a theme": "Dibab un tem",
|
||||
"Symplify all geometries to points": "Symplify all geometries to points",
|
||||
"Choose this data": "Dibab ar roadennoù-mañ",
|
||||
"Search admin boundary": "Search admin boundary",
|
||||
"Please choose a theme and a boundary first.": "Please choose a theme and a boundary first.",
|
||||
|
@ -536,14 +538,7 @@ const locale = {
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("br", locale)
|
||||
L.setLocale("br")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Alc'hwez",
|
||||
"Center map on your location": "Kreizañ ar gartenn war al lec'h m'emaoc'h",
|
||||
"Change map background": "Cheñch foñs ar gartenn",
|
||||
"Change tilelayers": "Cheñch foñs ar gartenn",
|
||||
"Change": "Kemmañ",
|
||||
"Choose the data format": "Diuzañ furmad ar roadennoù",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"Choose this dataset": "Dibab an hollad cheñchamantoù-mañ",
|
||||
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: thematic data from OpenStreetMap",
|
||||
"Choose a theme": "Dibab un tem",
|
||||
"Symplify all geometries to points": "Symplify all geometries to points",
|
||||
"Choose this data": "Dibab ar roadennoù-mañ",
|
||||
"Search admin boundary": "Search admin boundary",
|
||||
"Please choose a theme and a boundary first.": "Please choose a theme and a boundary first.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Petició proxy en memòria cau",
|
||||
"Caption": "Llegenda",
|
||||
"Center map on your location": "Centra el mapa a la vostra ubicació",
|
||||
"Change map background": "Canvia el fons del mapa",
|
||||
"Change tilelayers": "Canvia les capes de tessel·les",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Trieu el format de dades",
|
||||
|
@ -84,7 +85,7 @@ const locale = {
|
|||
"Custom background": "Fons personalitzat",
|
||||
"Custom overlay": "Superposició personalitzada",
|
||||
"dash array": "matriu de guions",
|
||||
"Data is browsable": "Les dades es poden navegar",
|
||||
"Data is browsable": "Data is browsable",
|
||||
"Datalayers": "Capes de dades",
|
||||
"Default interaction options": "Opcions d'interacció predeterminades",
|
||||
"Default properties": "Propietats predeterminades",
|
||||
|
@ -176,12 +177,12 @@ const locale = {
|
|||
"Icon shape": "forma de la icona",
|
||||
"Icon symbol": "Imatge de la icona",
|
||||
"If false, the polygon or line will act as a part of the underlying map.": "If false, the polygon or line will act as a part of the underlying map.",
|
||||
"Iframe with custom height (in px): {{{https://iframe.url.com|height}}}": "Iframe amb alçada personalitzada (height en px): {{{https://iframe.url.com|height}}}",
|
||||
"Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}": "Iframe amb alçada i amplada personalitzada (height i width en px): {{{https://iframe.url.com|height*width}}}",
|
||||
"Iframe with custom height (in px): {{{https://iframe.url.com|height}}}": "Iframe with custom height (in px): {{{https://iframe.url.com|height}}}",
|
||||
"Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}": "Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}",
|
||||
"iframe": "iframe",
|
||||
"Iframe: {{{https://iframe.url.com}}}": "Iframe: {{{https://iframe.url.com}}}",
|
||||
"Image with custom width (in px): {{https://image.url.com|width}}": "Imatge amb amplada personalitzada (width en px): {{https://image.url.com|width}}",
|
||||
"Image: {{https://image.url.com}}": "Imatge: {{https://image.url.com}}",
|
||||
"Image with custom width (in px): {{https://image.url.com|width}}": "Image with custom width (in px): {{https://image.url.com|width}}",
|
||||
"Image: {{https://image.url.com}}": "Image: {{https://image.url.com}}",
|
||||
"Import data": "Importa dades",
|
||||
"Import in a new layer": "Import in a new layer",
|
||||
"Imports all umap data, including layers and settings.": "Imports all umap data, including layers and settings.",
|
||||
|
@ -202,14 +203,14 @@ const locale = {
|
|||
"Labels are clickable": "Les etiquetes es poden fer clic",
|
||||
"Latest feature": "Darrera característica",
|
||||
"Latitude": "Latitud",
|
||||
"Layer properties": "Propietats de la capa",
|
||||
"Layer properties": "Layer properties",
|
||||
"Layer": "Capa",
|
||||
"Licence": "Llicència",
|
||||
"licence": "llicència",
|
||||
"Limit bounds": "Límits",
|
||||
"Link to view the map": "Enllaç per veure el mapa",
|
||||
"Link to…": "Link to…",
|
||||
"Link with text: [[https://example.com|text of the link]]": "Enllaç amb text: [[https://example.com|text de l'enllaç]]",
|
||||
"Link with text: [[https://example.com|text of the link]]": "Link with text: [[https://example.com|text of the link]]",
|
||||
"Long credits": "Crèdits llargs",
|
||||
"Longitude": "Longitud",
|
||||
"Make main shape": "Make main shape",
|
||||
|
@ -301,17 +302,17 @@ const locale = {
|
|||
"Secret edit link:": "Secret edit link:",
|
||||
"See full screen": "Mostra-ho a pantalla completa",
|
||||
"See on OpenStreetMap": "See on OpenStreetMap",
|
||||
"Set it to false to hide this layer from the slideshow, the data browser, the popup navigation…": "Estableix-lo com a fals per ocultar aquesta capa de la presentació de diapositives, el navegador de dades, la navegació emergent...",
|
||||
"Set it to false to hide this layer from the slideshow, the data browser, the popup navigation…": "Set it to false to hide this layer from the slideshow, the data browser, the popup navigation…",
|
||||
"settings": "settings",
|
||||
"Shape properties": "Propietats de la forma",
|
||||
"Shape properties": "Shape properties",
|
||||
"Share and download": "Comparteix i baixa",
|
||||
"Share this link to open a customized map view": "Comparteix aquest enllaç per obrir una vista de mapa personalitzada",
|
||||
"Short credits": "Crèdits curts",
|
||||
"Short link": "Enllaç curt",
|
||||
"Show this layer in the caption": "Mostra aquesta capa a la llegenda",
|
||||
"Show this layer in the caption": "Show this layer in the caption",
|
||||
"Show/hide layer": "Mostra/amaga la capa",
|
||||
"Side panel": "panell lateral",
|
||||
"Simple link: [[https://example.com]]": "Enllaç senzill: [[https://example.com]]",
|
||||
"Simple link: [[https://example.com]]": "Simple link: [[https://example.com]]",
|
||||
"Simplify": "Simplificar",
|
||||
"Skipping unknown geometry.type: {type}": "S'està ometent el tipus de geometria desconegut: {type}",
|
||||
"Slideshow": "Presentació",
|
||||
|
@ -323,7 +324,7 @@ const locale = {
|
|||
"Stop editing": "Atura l'edició",
|
||||
"Stop slideshow": "Atura la presentació",
|
||||
"Street": "Street",
|
||||
"stroke": "línia",
|
||||
"stroke": "stroke",
|
||||
"Supported scheme": "Esquema suportat",
|
||||
"Supported variables that will be dynamically replaced": "Supported variables that will be dynamically replaced",
|
||||
"Symbol": "Symbol",
|
||||
|
@ -364,7 +365,7 @@ const locale = {
|
|||
"Visibility: {status}": "Visibilitat: {status}",
|
||||
"weight": "pes",
|
||||
"Where do we go from here?": "On anem des d'aquí?",
|
||||
"Whether to display or not polygons paths.": "Si es mostren o no els camins de polígons.",
|
||||
"Whether to display or not polygons paths.": "Whether to display or not polygons paths.",
|
||||
"Whether to fill polygons with color.": "emplenar polígons amb color..",
|
||||
"Who can edit \"{layer}\"": "Qui pot editar \"{layer}\"",
|
||||
"Who can edit": "Qui pot editar",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -502,7 +504,7 @@ const locale = {
|
|||
"Type editor's username": "Escriviu el nom d'usuari de l'editor",
|
||||
"Map": "Mapa",
|
||||
"Manage collaborators": "Gestiona els col·laboradors",
|
||||
"show/hide all layers": "mostrar/ocultar totes les capes",
|
||||
"show/hide all layers": "show/hide all layers",
|
||||
"zoom to data extent": "zoom to data extent",
|
||||
"download visible data": "download visible data",
|
||||
"Import helpers": "Import helpers",
|
||||
|
@ -520,10 +522,10 @@ const locale = {
|
|||
"Anonymous": "Anonymous",
|
||||
"created at {date}": "created at {date}",
|
||||
"modified at {date}": "modified at {date}",
|
||||
"Default zoom": "Zoom predeterminat",
|
||||
"Default latitude": "Latitud predeterminada",
|
||||
"Default longitude": "Longitud predeterminada",
|
||||
"Edit map default view": "Edita la visualització predeterminada del mapa",
|
||||
"Default zoom": "Default zoom",
|
||||
"Default latitude": "Default latitude",
|
||||
"Default longitude": "Default longitude",
|
||||
"Edit map default view": "Edit map default view",
|
||||
"Use current center and zoom": "Use current center and zoom",
|
||||
"Layer permalink": "Layer permalink",
|
||||
"Back to home": "Back to home",
|
||||
|
@ -533,17 +535,10 @@ const locale = {
|
|||
"Cancel last edit": "Cancel last edit",
|
||||
"Redo last edit": "Redo last edit",
|
||||
"Links": "Links",
|
||||
"Images": "Imatges",
|
||||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("ca", locale)
|
||||
L.setLocale("ca")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Petició proxy en memòria cau",
|
||||
"Caption": "Llegenda",
|
||||
"Center map on your location": "Centra el mapa a la vostra ubicació",
|
||||
"Change map background": "Canvia el fons del mapa",
|
||||
"Change tilelayers": "Canvia les capes de tessel·les",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Trieu el format de dades",
|
||||
|
@ -84,7 +85,7 @@
|
|||
"Custom background": "Fons personalitzat",
|
||||
"Custom overlay": "Superposició personalitzada",
|
||||
"dash array": "matriu de guions",
|
||||
"Data is browsable": "Les dades es poden navegar",
|
||||
"Data is browsable": "Data is browsable",
|
||||
"Datalayers": "Capes de dades",
|
||||
"Default interaction options": "Opcions d'interacció predeterminades",
|
||||
"Default properties": "Propietats predeterminades",
|
||||
|
@ -176,12 +177,12 @@
|
|||
"Icon shape": "forma de la icona",
|
||||
"Icon symbol": "Imatge de la icona",
|
||||
"If false, the polygon or line will act as a part of the underlying map.": "If false, the polygon or line will act as a part of the underlying map.",
|
||||
"Iframe with custom height (in px): {{{https://iframe.url.com|height}}}": "Iframe amb alçada personalitzada (height en px): {{{https://iframe.url.com|height}}}",
|
||||
"Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}": "Iframe amb alçada i amplada personalitzada (height i width en px): {{{https://iframe.url.com|height*width}}}",
|
||||
"Iframe with custom height (in px): {{{https://iframe.url.com|height}}}": "Iframe with custom height (in px): {{{https://iframe.url.com|height}}}",
|
||||
"Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}": "Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}",
|
||||
"iframe": "iframe",
|
||||
"Iframe: {{{https://iframe.url.com}}}": "Iframe: {{{https://iframe.url.com}}}",
|
||||
"Image with custom width (in px): {{https://image.url.com|width}}": "Imatge amb amplada personalitzada (width en px): {{https://image.url.com|width}}",
|
||||
"Image: {{https://image.url.com}}": "Imatge: {{https://image.url.com}}",
|
||||
"Image with custom width (in px): {{https://image.url.com|width}}": "Image with custom width (in px): {{https://image.url.com|width}}",
|
||||
"Image: {{https://image.url.com}}": "Image: {{https://image.url.com}}",
|
||||
"Import data": "Importa dades",
|
||||
"Import in a new layer": "Import in a new layer",
|
||||
"Imports all umap data, including layers and settings.": "Imports all umap data, including layers and settings.",
|
||||
|
@ -202,14 +203,14 @@
|
|||
"Labels are clickable": "Les etiquetes es poden fer clic",
|
||||
"Latest feature": "Darrera característica",
|
||||
"Latitude": "Latitud",
|
||||
"Layer properties": "Propietats de la capa",
|
||||
"Layer properties": "Layer properties",
|
||||
"Layer": "Capa",
|
||||
"Licence": "Llicència",
|
||||
"licence": "llicència",
|
||||
"Limit bounds": "Límits",
|
||||
"Link to view the map": "Enllaç per veure el mapa",
|
||||
"Link to…": "Link to…",
|
||||
"Link with text: [[https://example.com|text of the link]]": "Enllaç amb text: [[https://example.com|text de l'enllaç]]",
|
||||
"Link with text: [[https://example.com|text of the link]]": "Link with text: [[https://example.com|text of the link]]",
|
||||
"Long credits": "Crèdits llargs",
|
||||
"Longitude": "Longitud",
|
||||
"Make main shape": "Make main shape",
|
||||
|
@ -301,17 +302,17 @@
|
|||
"Secret edit link:": "Secret edit link:",
|
||||
"See full screen": "Mostra-ho a pantalla completa",
|
||||
"See on OpenStreetMap": "See on OpenStreetMap",
|
||||
"Set it to false to hide this layer from the slideshow, the data browser, the popup navigation…": "Estableix-lo com a fals per ocultar aquesta capa de la presentació de diapositives, el navegador de dades, la navegació emergent...",
|
||||
"Set it to false to hide this layer from the slideshow, the data browser, the popup navigation…": "Set it to false to hide this layer from the slideshow, the data browser, the popup navigation…",
|
||||
"settings": "settings",
|
||||
"Shape properties": "Propietats de la forma",
|
||||
"Shape properties": "Shape properties",
|
||||
"Share and download": "Comparteix i baixa",
|
||||
"Share this link to open a customized map view": "Comparteix aquest enllaç per obrir una vista de mapa personalitzada",
|
||||
"Short credits": "Crèdits curts",
|
||||
"Short link": "Enllaç curt",
|
||||
"Show this layer in the caption": "Mostra aquesta capa a la llegenda",
|
||||
"Show this layer in the caption": "Show this layer in the caption",
|
||||
"Show/hide layer": "Mostra/amaga la capa",
|
||||
"Side panel": "panell lateral",
|
||||
"Simple link: [[https://example.com]]": "Enllaç senzill: [[https://example.com]]",
|
||||
"Simple link: [[https://example.com]]": "Simple link: [[https://example.com]]",
|
||||
"Simplify": "Simplificar",
|
||||
"Skipping unknown geometry.type: {type}": "S'està ometent el tipus de geometria desconegut: {type}",
|
||||
"Slideshow": "Presentació",
|
||||
|
@ -323,7 +324,7 @@
|
|||
"Stop editing": "Atura l'edició",
|
||||
"Stop slideshow": "Atura la presentació",
|
||||
"Street": "Street",
|
||||
"stroke": "línia",
|
||||
"stroke": "stroke",
|
||||
"Supported scheme": "Esquema suportat",
|
||||
"Supported variables that will be dynamically replaced": "Supported variables that will be dynamically replaced",
|
||||
"Symbol": "Symbol",
|
||||
|
@ -364,7 +365,7 @@
|
|||
"Visibility: {status}": "Visibilitat: {status}",
|
||||
"weight": "pes",
|
||||
"Where do we go from here?": "On anem des d'aquí?",
|
||||
"Whether to display or not polygons paths.": "Si es mostren o no els camins de polígons.",
|
||||
"Whether to display or not polygons paths.": "Whether to display or not polygons paths.",
|
||||
"Whether to fill polygons with color.": "emplenar polígons amb color..",
|
||||
"Who can edit \"{layer}\"": "Qui pot editar \"{layer}\"",
|
||||
"Who can edit": "Qui pot editar",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -502,7 +504,7 @@
|
|||
"Type editor's username": "Escriviu el nom d'usuari de l'editor",
|
||||
"Map": "Mapa",
|
||||
"Manage collaborators": "Gestiona els col·laboradors",
|
||||
"show/hide all layers": "mostrar/ocultar totes les capes",
|
||||
"show/hide all layers": "show/hide all layers",
|
||||
"zoom to data extent": "zoom to data extent",
|
||||
"download visible data": "download visible data",
|
||||
"Import helpers": "Import helpers",
|
||||
|
@ -520,10 +522,10 @@
|
|||
"Anonymous": "Anonymous",
|
||||
"created at {date}": "created at {date}",
|
||||
"modified at {date}": "modified at {date}",
|
||||
"Default zoom": "Zoom predeterminat",
|
||||
"Default latitude": "Latitud predeterminada",
|
||||
"Default longitude": "Longitud predeterminada",
|
||||
"Edit map default view": "Edita la visualització predeterminada del mapa",
|
||||
"Default zoom": "Default zoom",
|
||||
"Default latitude": "Default latitude",
|
||||
"Default longitude": "Default longitude",
|
||||
"Edit map default view": "Edit map default view",
|
||||
"Use current center and zoom": "Use current center and zoom",
|
||||
"Layer permalink": "Layer permalink",
|
||||
"Back to home": "Back to home",
|
||||
|
@ -533,15 +535,8 @@
|
|||
"Cancel last edit": "Cancel last edit",
|
||||
"Redo last edit": "Redo last edit",
|
||||
"Links": "Links",
|
||||
"Images": "Imatges",
|
||||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Požadavek na zástupnou mezipaměť",
|
||||
"Caption": "Popisek",
|
||||
"Center map on your location": "Přemístit se na mapě na vaši polohu",
|
||||
"Change map background": "Změnit pozadí mapy",
|
||||
"Change tilelayers": "Změnit pozadí mapy",
|
||||
"Change": "Změnit",
|
||||
"Choose the data format": "Vyberte formát dat",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -536,14 +538,7 @@ const locale = {
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("cs_CZ", locale)
|
||||
L.setLocale("cs_CZ")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Požadavek na zástupnou mezipaměť",
|
||||
"Caption": "Popisek",
|
||||
"Center map on your location": "Přemístit se na mapě na vaši polohu",
|
||||
"Change map background": "Změnit pozadí mapy",
|
||||
"Change tilelayers": "Změnit pozadí mapy",
|
||||
"Change": "Změnit",
|
||||
"Choose the data format": "Vyberte formát dat",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Forespørgsel i proxycache",
|
||||
"Caption": "Billedtekst",
|
||||
"Center map on your location": "Centrer kort på din placering",
|
||||
"Change map background": "Skift kortbaggrund",
|
||||
"Change tilelayers": "Skift kortlag",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Vælg dataformat",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -536,14 +538,7 @@ const locale = {
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("da", locale)
|
||||
L.setLocale("da")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Forespørgsel i proxycache",
|
||||
"Caption": "Billedtekst",
|
||||
"Center map on your location": "Centrer kort på din placering",
|
||||
"Change map background": "Skift kortbaggrund",
|
||||
"Change tilelayers": "Skift kortlag",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Vælg dataformat",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Proxycache-Anfrage",
|
||||
"Caption": "Überschrift",
|
||||
"Center map on your location": "Die Karte auf deinen Standort ausrichten",
|
||||
"Change map background": "Hintergrundkarte ändern",
|
||||
"Change tilelayers": "Kachelebenen ändern",
|
||||
"Change": "Ändern",
|
||||
"Choose the data format": "Wähle das Datenformat",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -536,14 +538,7 @@ const locale = {
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("de", locale)
|
||||
L.setLocale("de")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Proxycache-Anfrage",
|
||||
"Caption": "Überschrift",
|
||||
"Center map on your location": "Die Karte auf deinen Standort ausrichten",
|
||||
"Change map background": "Hintergrundkarte ändern",
|
||||
"Change tilelayers": "Kachelebenen ändern",
|
||||
"Change": "Ändern",
|
||||
"Choose the data format": "Wähle das Datenformat",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Αίτημα μεσολάβησης προσωρινής μνήμης",
|
||||
"Caption": "Λεζάντα",
|
||||
"Center map on your location": "Κεντράρισμα του χάρτη στην τοποθεσία σας",
|
||||
"Change map background": "Αλλαγή υποβάθρου του χάρτη",
|
||||
"Change tilelayers": "Αλλαγή χαρτογραφικού υπόβαθρου",
|
||||
"Change": "Αλλαγή",
|
||||
"Choose the data format": "Επιλογή μορφοποίησης δεδομένων",
|
||||
|
@ -433,117 +434,111 @@ const locale = {
|
|||
"key~value (eg. name~Grisy)": "κλειδί~τιμή (π.χ. όνομα~Grisy)",
|
||||
"key=\"value|value2\" (eg. name=\"Paris|Berlin\")": "κλειδί=\"value|value2\" (eg. όνομα=\"Παρίσι|Βερολίνο\")",
|
||||
"More info about Overpass syntax": "Περισσότερες πληροφορίες σχετικά με τη σύνταξη της Υπέρβασης",
|
||||
"For more complex needs, see": "Για πιο σύνθετες ανάγκες, βλ.",
|
||||
"Choose data": "Επιλογή δεδομένων",
|
||||
"Choose the format": "Επιλογή μορφοποίησης",
|
||||
"Choose the layer": "Επιλογή επιπέδου",
|
||||
"Layer name": "Όνομα επιπέδου",
|
||||
"Choose import mode": "Επιλογή τρόπου εισαγωγής",
|
||||
"Copy into the layer": "Αντιγραφή στο επίπεδο",
|
||||
"Link to the layer as remote data": "Σύνδεση με το επίπεδο ως απομακρυσμένα δεδομένα",
|
||||
"For more complex needs, see": "For more complex needs, see",
|
||||
"Choose data": "Choose data",
|
||||
"Choose the format": "Choose the format",
|
||||
"Choose the layer": "Choose the layer",
|
||||
"Layer name": "Layer name",
|
||||
"Choose import mode": "Choose import mode",
|
||||
"Copy into the layer": "Copy into the layer",
|
||||
"Link to the layer as remote data": "Link to the layer as remote data",
|
||||
"Condition": "Συνθήκη",
|
||||
"key=value or key!=value": "key=value ή key!=value",
|
||||
"Are you sure you want to delete this rule?": "Θέλετε σίγουρα να διαγραφεί αυτός ο κανόνας;",
|
||||
"empty rule": "κενός κανόνας",
|
||||
"Conditional style rules": "Κανόνες μορφοποίησης υπό όρους",
|
||||
"Add rule": "Προσθήκη κανόνα",
|
||||
"Browser: data": "Περιηγητής: δεδομένα",
|
||||
"Browser: layers": "Περιηγητής: επίπεδα",
|
||||
"Browser: filters": "Περιηγητής: φίλτρα",
|
||||
"Enable real-time collaboration": "Ενεργοποίηση συνεργασίας σε πραγματικό χρόνο",
|
||||
"Browser: data": "Browser: data",
|
||||
"Browser: layers": "Browser: layers",
|
||||
"Browser: filters": "Browser: filters",
|
||||
"Enable real-time collaboration": "Enable real-time collaboration",
|
||||
"✅ Copied!": "✅ Αντιγράφηκε!",
|
||||
"Choose a dataset": "Επιλογή συνόλου δεδομένων",
|
||||
"Choose this dataset": "Επιλογή αυτού του συνόλου δεδομένων",
|
||||
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: θεματικά δεδομένα από το OpenStreetMap",
|
||||
"Choose a theme": "Επιλογή θέματος",
|
||||
"Choose this data": "Επιλογή αυτών των δεδομένων",
|
||||
"Choose a dataset": "Choose a dataset",
|
||||
"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": "Αναζήτηση διοικητικού ορίου",
|
||||
"Please choose a theme and a boundary first.": "Επιλέξτε πρώτα ένα θέμα και ένα όριο.",
|
||||
"Please choose a theme and a boundary first.": "Please choose a theme and a boundary first.",
|
||||
"Expression": "Έκφραση",
|
||||
"Geometry mode": "Λειτουργία γεωμετρίας",
|
||||
"Only geometry centers": "Μόνο γεωμετρικά κέντρα",
|
||||
"Search area": "Περιοχή αναζήτησης",
|
||||
"Type area name, or let empty to load data in current map view": "Πληκτρολογήστε το όνομα της περιοχής ή αφήστε το κενό, για να φορτώσετε δεδομένα στην τρέχουσα προβολή χάρτη.",
|
||||
"Data successfully imported!": "Τα δεδομένα εισήχθησαν επιτυχώς!",
|
||||
"Clear data": "Εκκαθάριση δεδομένων",
|
||||
"Remove layers": "Αφαίρεση επιπέδων",
|
||||
"Categorized": "Κατηγοριοποιημένο",
|
||||
"Alphabetical": "Αλφαβητικά",
|
||||
"Category property": "Ιδιότητα κατηγορίας",
|
||||
"Only geometry centers": "Only geometry centers",
|
||||
"Search area": "Search area",
|
||||
"Type area name, or let empty to load data in current map view": "Type area name, or let empty to load data in current map view",
|
||||
"Data successfully imported!": "Data successfully imported!",
|
||||
"Clear data": "Clear data",
|
||||
"Remove layers": "Remove layers",
|
||||
"Categorized": "Categorized",
|
||||
"Alphabetical": "Alphabetical",
|
||||
"Category property": "Category property",
|
||||
"Color palette": "Παλέτα χρωμάτων",
|
||||
"Categories": "Κατηγορίες",
|
||||
"Comma separated list of categories.": "Λίστα κατηγοριών χωρισμένες με κόμμα.",
|
||||
"Categories mode": "Λειτουργία κατηγοριών",
|
||||
"Remove filter for this column": "Αφαίρεση φίλτρου από αυτή τη στήλη",
|
||||
"Add filter for this column": "Προσθήκη φίλτρου από αυτή τη στήλη",
|
||||
"Rename this column": "Μετονομασία αυτής της στήλης",
|
||||
"Delete this column": "Διαγραφή αυτής της στήλης",
|
||||
"Name “{name}” should not contain a dot.": "Το όνομα \"{name}\" δεν πρέπει να περιέχει τελεία.",
|
||||
"This name already exists: “{name}”": "Αυτό το όνομα υπάρχει ήδη: \"{name}\"",
|
||||
"Delete selected rows": "Διαγραφή επιλεγμένων γραμμών",
|
||||
"Found {count} rows. Are you sure you want to delete all?": "Βρέθηκαν {count} σειρές. Είστε σίγουροι ότι θέλετε να τις διαγράψετε όλες;",
|
||||
"Remove filter for this column": "Remove filter for this column",
|
||||
"Add filter for this column": "Add filter for this column",
|
||||
"Rename this column": "Rename this column",
|
||||
"Delete this column": "Delete this column",
|
||||
"Name “{name}” should not contain a dot.": "Name “{name}” should not contain a dot.",
|
||||
"This name already exists: “{name}”": "This name already exists: “{name}”",
|
||||
"Delete selected rows": "Delete selected rows",
|
||||
"Found {count} rows. Are you sure you want to delete all?": "Found {count} rows. Are you sure you want to delete all?",
|
||||
"Expression is empty": "Η έκφραση είναι κενή",
|
||||
"OK": "OK",
|
||||
"Cancel": "Άκυρο",
|
||||
"Attach map to a team": "Σύνδεση χάρτη με μια ομάδα",
|
||||
"Display the polygon inverted": "Εμφανίζει το πολύγωνο ανεστραμμένο",
|
||||
"Proportional circles": "Αναλογικοί κύκλοι",
|
||||
"Property name to compute circles": "Όνομα ιδιότητας για τον υπολογισμό κύκλων",
|
||||
"Min circle radius": "Ελάχιστη ακτίνα κύκλου",
|
||||
"Max circle radius": "Μέγιστη ακτίνα κύκλου",
|
||||
"Display the open browser control": "Εμφάνιση του χειριστηρίου ανοικτού προγράμματος περιήγησης",
|
||||
"Copy as GeoJSON": "Αντιγραφή ως GeoJSON",
|
||||
"Please zoom in to edit the geometry": "Παρακαλώ εστιάστε για να επεξεργαστείτε τη γεωμετρία",
|
||||
"New map": "Νέος χάρτης",
|
||||
"My maps": "Οι χάρτες μου",
|
||||
"My teams": "Οι ομάδες μου",
|
||||
"My profile": "Το προφίλ μου",
|
||||
"Type new owner's username": "Πληκτρολογήστε το όνομα χρήστη του νέου ιδιοκτήτη",
|
||||
"Type editor's username": "Πληκτρολογήστε το όνομα χρήστη του συντάκτη",
|
||||
"Map": "Χάρτης",
|
||||
"Manage collaborators": "Διαχείριση συνεργατών",
|
||||
"show/hide all layers": "εμφάνιση/απόκρυψη όλων των επιπέδων",
|
||||
"zoom to data extent": "εστίαση στην έκταση των δεδομένων",
|
||||
"download visible data": "λήψη ορατών δεδομένων",
|
||||
"Import helpers": "Βοηθοί εισαγωγής",
|
||||
"Import helpers will fill the URL field for you.": "Οι βοηθοί εισαγωγής θα συμπληρώσουν το πεδίο URL για εσάς.",
|
||||
"Attach map to a team": "Attach map to a team",
|
||||
"Display the polygon inverted": "Display the polygon inverted",
|
||||
"Proportional circles": "Proportional circles",
|
||||
"Property name to compute circles": "Property name to compute circles",
|
||||
"Min circle radius": "Min circle radius",
|
||||
"Max circle radius": "Max circle radius",
|
||||
"Display the open browser control": "Display the open browser control",
|
||||
"Copy as GeoJSON": "Copy as GeoJSON",
|
||||
"Please zoom in to edit the geometry": "Please zoom in to edit the geometry",
|
||||
"New map": "New map",
|
||||
"My maps": "My maps",
|
||||
"My teams": "My teams",
|
||||
"My profile": "My profile",
|
||||
"Type new owner's username": "Type new owner's username",
|
||||
"Type editor's username": "Type editor's username",
|
||||
"Map": "Map",
|
||||
"Manage collaborators": "Manage collaborators",
|
||||
"show/hide all layers": "show/hide all layers",
|
||||
"zoom to data extent": "zoom to data extent",
|
||||
"download visible data": "download visible data",
|
||||
"Import helpers": "Import helpers",
|
||||
"Import helpers will fill the URL field for you.": "Import helpers will fill the URL field for you.",
|
||||
"Wikipedia": "Wikipedia",
|
||||
"Save draft": "Αποθήκευση προσχεδίου",
|
||||
"No data has been found for import": "Δεν βρέθηκαν δεδομένα για την εισαγωγή",
|
||||
"Successfully imported {count} feature(s)": "Εισήχθησαν επιτυχώς {count} χαρακτηριστικό(ά)",
|
||||
"Disconnected": "Αποσυνδεδεμένο",
|
||||
"You must be logged in": "Πρέπει να συνδεθείτε",
|
||||
"on hover": "στην αιώρηση",
|
||||
"Cannot load remote data for layer \"{layer}\" with url \"{url}\"": "Δεν είναι δυνατή η φόρτωση απομακρυσμένων δεδομένων για το επίπεδο \"{layer}\" με url \"{url}\"",
|
||||
"Cannot parse remote data for layer \"{layer}\" with url \"{url}\"": "Δεν είναι δυνατή η ανάλυση απομακρυσμένων δεδομένων για το επίπεδο \"{layer}\" με url \"{url}\"",
|
||||
"Import failed: invalid data": "Η εισαγωγή απέτυχε: μη έγκυρα δεδομένα",
|
||||
"Anonymous": "Ανώνυμος",
|
||||
"created at {date}": "δημιουργήθηκε {ημερομηνία}",
|
||||
"modified at {date}": "τροποποιήθηκε {ημερομηνία}",
|
||||
"Default zoom": "Προκαθορισμένη εστίαση",
|
||||
"Default latitude": "Προκαθορισμένο γεωγραφικό πλάτος",
|
||||
"Default longitude": "Προκαθορισμένο γεωγραφικό μήκος",
|
||||
"Edit map default view": "Επεξεργασία προεπιλεγμένης προβολής χάρτη",
|
||||
"Use current center and zoom": "Χρήση τρέχοντος κέντρου και εστίασης",
|
||||
"Layer permalink": "Mόνιμο url του επιπέδου",
|
||||
"Back to home": "Επιστροφή στην αρχική σελίδα",
|
||||
"Home logo": "Λογότυπο αρχικής σελίδας",
|
||||
"Add this geometry to my map": "Προσθήκη αυτής της γεωμετρίας στο χάρτη μου",
|
||||
"Add this place to my map": "Προσθήκη αυτής της τοποθεσίας στον χάρτη μου",
|
||||
"Cancel last edit": "Ακύρωση τελευταίας επεξεργασίας",
|
||||
"Redo last edit": "Αναίρεση ακύρωσης τελευταίας επεξεργασίας",
|
||||
"Links": "Σύνδεσμοι",
|
||||
"Images": "Εικόνες",
|
||||
"Save draft": "Save draft",
|
||||
"No data has been found for import": "No data has been found for import",
|
||||
"Successfully imported {count} feature(s)": "Successfully imported {count} feature(s)",
|
||||
"Disconnected": "Disconnected",
|
||||
"You must be logged in": "You must be logged in",
|
||||
"on hover": "on hover",
|
||||
"Cannot load remote data for layer \"{layer}\" with url \"{url}\"": "Cannot load remote data for layer \"{layer}\" with url \"{url}\"",
|
||||
"Cannot parse remote data for layer \"{layer}\" with url \"{url}\"": "Cannot parse remote data for layer \"{layer}\" with url \"{url}\"",
|
||||
"Import failed: invalid data": "Import failed: invalid data",
|
||||
"Anonymous": "Anonymous",
|
||||
"created at {date}": "created at {date}",
|
||||
"modified at {date}": "modified at {date}",
|
||||
"Default zoom": "Default zoom",
|
||||
"Default latitude": "Default latitude",
|
||||
"Default longitude": "Default longitude",
|
||||
"Edit map default view": "Edit map default view",
|
||||
"Use current center and zoom": "Use current center and zoom",
|
||||
"Layer permalink": "Layer permalink",
|
||||
"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",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Ετικέτες",
|
||||
"Geocode": "Γεωκωδικοποίηση",
|
||||
"Display the back to home icon": "Εμφάνιση του εικονιδίου επιστροφής στην αρχική σελίδα",
|
||||
"Do you want to display layer switcher in caption bar?": "Θέλετε να εμφανίσετε τον διακόπτη επιπέδων στη γραμμή λεζάντας;",
|
||||
"Simplify all geometries to points": "Απλοποίηση όλων των γεωμετριών σε σημεία",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Tags": "Tags",
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("el", locale)
|
||||
L.setLocale("el")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Αίτημα μεσολάβησης προσωρινής μνήμης",
|
||||
"Caption": "Λεζάντα",
|
||||
"Center map on your location": "Κεντράρισμα του χάρτη στην τοποθεσία σας",
|
||||
"Change map background": "Αλλαγή υποβάθρου του χάρτη",
|
||||
"Change tilelayers": "Αλλαγή χαρτογραφικού υπόβαθρου",
|
||||
"Change": "Αλλαγή",
|
||||
"Choose the data format": "Επιλογή μορφοποίησης δεδομένων",
|
||||
|
@ -433,115 +434,109 @@
|
|||
"key~value (eg. name~Grisy)": "κλειδί~τιμή (π.χ. όνομα~Grisy)",
|
||||
"key=\"value|value2\" (eg. name=\"Paris|Berlin\")": "κλειδί=\"value|value2\" (eg. όνομα=\"Παρίσι|Βερολίνο\")",
|
||||
"More info about Overpass syntax": "Περισσότερες πληροφορίες σχετικά με τη σύνταξη της Υπέρβασης",
|
||||
"For more complex needs, see": "Για πιο σύνθετες ανάγκες, βλ.",
|
||||
"Choose data": "Επιλογή δεδομένων",
|
||||
"Choose the format": "Επιλογή μορφοποίησης",
|
||||
"Choose the layer": "Επιλογή επιπέδου",
|
||||
"Layer name": "Όνομα επιπέδου",
|
||||
"Choose import mode": "Επιλογή τρόπου εισαγωγής",
|
||||
"Copy into the layer": "Αντιγραφή στο επίπεδο",
|
||||
"Link to the layer as remote data": "Σύνδεση με το επίπεδο ως απομακρυσμένα δεδομένα",
|
||||
"For more complex needs, see": "For more complex needs, see",
|
||||
"Choose data": "Choose data",
|
||||
"Choose the format": "Choose the format",
|
||||
"Choose the layer": "Choose the layer",
|
||||
"Layer name": "Layer name",
|
||||
"Choose import mode": "Choose import mode",
|
||||
"Copy into the layer": "Copy into the layer",
|
||||
"Link to the layer as remote data": "Link to the layer as remote data",
|
||||
"Condition": "Συνθήκη",
|
||||
"key=value or key!=value": "key=value ή key!=value",
|
||||
"Are you sure you want to delete this rule?": "Θέλετε σίγουρα να διαγραφεί αυτός ο κανόνας;",
|
||||
"empty rule": "κενός κανόνας",
|
||||
"Conditional style rules": "Κανόνες μορφοποίησης υπό όρους",
|
||||
"Add rule": "Προσθήκη κανόνα",
|
||||
"Browser: data": "Περιηγητής: δεδομένα",
|
||||
"Browser: layers": "Περιηγητής: επίπεδα",
|
||||
"Browser: filters": "Περιηγητής: φίλτρα",
|
||||
"Enable real-time collaboration": "Ενεργοποίηση συνεργασίας σε πραγματικό χρόνο",
|
||||
"Browser: data": "Browser: data",
|
||||
"Browser: layers": "Browser: layers",
|
||||
"Browser: filters": "Browser: filters",
|
||||
"Enable real-time collaboration": "Enable real-time collaboration",
|
||||
"✅ Copied!": "✅ Αντιγράφηκε!",
|
||||
"Choose a dataset": "Επιλογή συνόλου δεδομένων",
|
||||
"Choose this dataset": "Επιλογή αυτού του συνόλου δεδομένων",
|
||||
"GeoDataMine: thematic data from OpenStreetMap": "GeoDataMine: θεματικά δεδομένα από το OpenStreetMap",
|
||||
"Choose a theme": "Επιλογή θέματος",
|
||||
"Choose this data": "Επιλογή αυτών των δεδομένων",
|
||||
"Choose a dataset": "Choose a dataset",
|
||||
"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": "Αναζήτηση διοικητικού ορίου",
|
||||
"Please choose a theme and a boundary first.": "Επιλέξτε πρώτα ένα θέμα και ένα όριο.",
|
||||
"Please choose a theme and a boundary first.": "Please choose a theme and a boundary first.",
|
||||
"Expression": "Έκφραση",
|
||||
"Geometry mode": "Λειτουργία γεωμετρίας",
|
||||
"Only geometry centers": "Μόνο γεωμετρικά κέντρα",
|
||||
"Search area": "Περιοχή αναζήτησης",
|
||||
"Type area name, or let empty to load data in current map view": "Πληκτρολογήστε το όνομα της περιοχής ή αφήστε το κενό, για να φορτώσετε δεδομένα στην τρέχουσα προβολή χάρτη.",
|
||||
"Data successfully imported!": "Τα δεδομένα εισήχθησαν επιτυχώς!",
|
||||
"Clear data": "Εκκαθάριση δεδομένων",
|
||||
"Remove layers": "Αφαίρεση επιπέδων",
|
||||
"Categorized": "Κατηγοριοποιημένο",
|
||||
"Alphabetical": "Αλφαβητικά",
|
||||
"Category property": "Ιδιότητα κατηγορίας",
|
||||
"Only geometry centers": "Only geometry centers",
|
||||
"Search area": "Search area",
|
||||
"Type area name, or let empty to load data in current map view": "Type area name, or let empty to load data in current map view",
|
||||
"Data successfully imported!": "Data successfully imported!",
|
||||
"Clear data": "Clear data",
|
||||
"Remove layers": "Remove layers",
|
||||
"Categorized": "Categorized",
|
||||
"Alphabetical": "Alphabetical",
|
||||
"Category property": "Category property",
|
||||
"Color palette": "Παλέτα χρωμάτων",
|
||||
"Categories": "Κατηγορίες",
|
||||
"Comma separated list of categories.": "Λίστα κατηγοριών χωρισμένες με κόμμα.",
|
||||
"Categories mode": "Λειτουργία κατηγοριών",
|
||||
"Remove filter for this column": "Αφαίρεση φίλτρου από αυτή τη στήλη",
|
||||
"Add filter for this column": "Προσθήκη φίλτρου από αυτή τη στήλη",
|
||||
"Rename this column": "Μετονομασία αυτής της στήλης",
|
||||
"Delete this column": "Διαγραφή αυτής της στήλης",
|
||||
"Name “{name}” should not contain a dot.": "Το όνομα \"{name}\" δεν πρέπει να περιέχει τελεία.",
|
||||
"This name already exists: “{name}”": "Αυτό το όνομα υπάρχει ήδη: \"{name}\"",
|
||||
"Delete selected rows": "Διαγραφή επιλεγμένων γραμμών",
|
||||
"Found {count} rows. Are you sure you want to delete all?": "Βρέθηκαν {count} σειρές. Είστε σίγουροι ότι θέλετε να τις διαγράψετε όλες;",
|
||||
"Remove filter for this column": "Remove filter for this column",
|
||||
"Add filter for this column": "Add filter for this column",
|
||||
"Rename this column": "Rename this column",
|
||||
"Delete this column": "Delete this column",
|
||||
"Name “{name}” should not contain a dot.": "Name “{name}” should not contain a dot.",
|
||||
"This name already exists: “{name}”": "This name already exists: “{name}”",
|
||||
"Delete selected rows": "Delete selected rows",
|
||||
"Found {count} rows. Are you sure you want to delete all?": "Found {count} rows. Are you sure you want to delete all?",
|
||||
"Expression is empty": "Η έκφραση είναι κενή",
|
||||
"OK": "OK",
|
||||
"Cancel": "Άκυρο",
|
||||
"Attach map to a team": "Σύνδεση χάρτη με μια ομάδα",
|
||||
"Display the polygon inverted": "Εμφανίζει το πολύγωνο ανεστραμμένο",
|
||||
"Proportional circles": "Αναλογικοί κύκλοι",
|
||||
"Property name to compute circles": "Όνομα ιδιότητας για τον υπολογισμό κύκλων",
|
||||
"Min circle radius": "Ελάχιστη ακτίνα κύκλου",
|
||||
"Max circle radius": "Μέγιστη ακτίνα κύκλου",
|
||||
"Display the open browser control": "Εμφάνιση του χειριστηρίου ανοικτού προγράμματος περιήγησης",
|
||||
"Copy as GeoJSON": "Αντιγραφή ως GeoJSON",
|
||||
"Please zoom in to edit the geometry": "Παρακαλώ εστιάστε για να επεξεργαστείτε τη γεωμετρία",
|
||||
"New map": "Νέος χάρτης",
|
||||
"My maps": "Οι χάρτες μου",
|
||||
"My teams": "Οι ομάδες μου",
|
||||
"My profile": "Το προφίλ μου",
|
||||
"Type new owner's username": "Πληκτρολογήστε το όνομα χρήστη του νέου ιδιοκτήτη",
|
||||
"Type editor's username": "Πληκτρολογήστε το όνομα χρήστη του συντάκτη",
|
||||
"Map": "Χάρτης",
|
||||
"Manage collaborators": "Διαχείριση συνεργατών",
|
||||
"show/hide all layers": "εμφάνιση/απόκρυψη όλων των επιπέδων",
|
||||
"zoom to data extent": "εστίαση στην έκταση των δεδομένων",
|
||||
"download visible data": "λήψη ορατών δεδομένων",
|
||||
"Import helpers": "Βοηθοί εισαγωγής",
|
||||
"Import helpers will fill the URL field for you.": "Οι βοηθοί εισαγωγής θα συμπληρώσουν το πεδίο URL για εσάς.",
|
||||
"Attach map to a team": "Attach map to a team",
|
||||
"Display the polygon inverted": "Display the polygon inverted",
|
||||
"Proportional circles": "Proportional circles",
|
||||
"Property name to compute circles": "Property name to compute circles",
|
||||
"Min circle radius": "Min circle radius",
|
||||
"Max circle radius": "Max circle radius",
|
||||
"Display the open browser control": "Display the open browser control",
|
||||
"Copy as GeoJSON": "Copy as GeoJSON",
|
||||
"Please zoom in to edit the geometry": "Please zoom in to edit the geometry",
|
||||
"New map": "New map",
|
||||
"My maps": "My maps",
|
||||
"My teams": "My teams",
|
||||
"My profile": "My profile",
|
||||
"Type new owner's username": "Type new owner's username",
|
||||
"Type editor's username": "Type editor's username",
|
||||
"Map": "Map",
|
||||
"Manage collaborators": "Manage collaborators",
|
||||
"show/hide all layers": "show/hide all layers",
|
||||
"zoom to data extent": "zoom to data extent",
|
||||
"download visible data": "download visible data",
|
||||
"Import helpers": "Import helpers",
|
||||
"Import helpers will fill the URL field for you.": "Import helpers will fill the URL field for you.",
|
||||
"Wikipedia": "Wikipedia",
|
||||
"Save draft": "Αποθήκευση προσχεδίου",
|
||||
"No data has been found for import": "Δεν βρέθηκαν δεδομένα για την εισαγωγή",
|
||||
"Successfully imported {count} feature(s)": "Εισήχθησαν επιτυχώς {count} χαρακτηριστικό(ά)",
|
||||
"Disconnected": "Αποσυνδεδεμένο",
|
||||
"You must be logged in": "Πρέπει να συνδεθείτε",
|
||||
"on hover": "στην αιώρηση",
|
||||
"Cannot load remote data for layer \"{layer}\" with url \"{url}\"": "Δεν είναι δυνατή η φόρτωση απομακρυσμένων δεδομένων για το επίπεδο \"{layer}\" με url \"{url}\"",
|
||||
"Cannot parse remote data for layer \"{layer}\" with url \"{url}\"": "Δεν είναι δυνατή η ανάλυση απομακρυσμένων δεδομένων για το επίπεδο \"{layer}\" με url \"{url}\"",
|
||||
"Import failed: invalid data": "Η εισαγωγή απέτυχε: μη έγκυρα δεδομένα",
|
||||
"Anonymous": "Ανώνυμος",
|
||||
"created at {date}": "δημιουργήθηκε {ημερομηνία}",
|
||||
"modified at {date}": "τροποποιήθηκε {ημερομηνία}",
|
||||
"Default zoom": "Προκαθορισμένη εστίαση",
|
||||
"Default latitude": "Προκαθορισμένο γεωγραφικό πλάτος",
|
||||
"Default longitude": "Προκαθορισμένο γεωγραφικό μήκος",
|
||||
"Edit map default view": "Επεξεργασία προεπιλεγμένης προβολής χάρτη",
|
||||
"Use current center and zoom": "Χρήση τρέχοντος κέντρου και εστίασης",
|
||||
"Layer permalink": "Mόνιμο url του επιπέδου",
|
||||
"Back to home": "Επιστροφή στην αρχική σελίδα",
|
||||
"Home logo": "Λογότυπο αρχικής σελίδας",
|
||||
"Add this geometry to my map": "Προσθήκη αυτής της γεωμετρίας στο χάρτη μου",
|
||||
"Add this place to my map": "Προσθήκη αυτής της τοποθεσίας στον χάρτη μου",
|
||||
"Cancel last edit": "Ακύρωση τελευταίας επεξεργασίας",
|
||||
"Redo last edit": "Αναίρεση ακύρωσης τελευταίας επεξεργασίας",
|
||||
"Links": "Σύνδεσμοι",
|
||||
"Images": "Εικόνες",
|
||||
"Save draft": "Save draft",
|
||||
"No data has been found for import": "No data has been found for import",
|
||||
"Successfully imported {count} feature(s)": "Successfully imported {count} feature(s)",
|
||||
"Disconnected": "Disconnected",
|
||||
"You must be logged in": "You must be logged in",
|
||||
"on hover": "on hover",
|
||||
"Cannot load remote data for layer \"{layer}\" with url \"{url}\"": "Cannot load remote data for layer \"{layer}\" with url \"{url}\"",
|
||||
"Cannot parse remote data for layer \"{layer}\" with url \"{url}\"": "Cannot parse remote data for layer \"{layer}\" with url \"{url}\"",
|
||||
"Import failed: invalid data": "Import failed: invalid data",
|
||||
"Anonymous": "Anonymous",
|
||||
"created at {date}": "created at {date}",
|
||||
"modified at {date}": "modified at {date}",
|
||||
"Default zoom": "Default zoom",
|
||||
"Default latitude": "Default latitude",
|
||||
"Default longitude": "Default longitude",
|
||||
"Edit map default view": "Edit map default view",
|
||||
"Use current center and zoom": "Use current center and zoom",
|
||||
"Layer permalink": "Layer permalink",
|
||||
"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",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Ετικέτες",
|
||||
"Geocode": "Γεωκωδικοποίηση",
|
||||
"Display the back to home icon": "Εμφάνιση του εικονιδίου επιστροφής στην αρχική σελίδα",
|
||||
"Do you want to display layer switcher in caption bar?": "Θέλετε να εμφανίσετε τον διακόπτη επιπέδων στη γραμμή λεζάντας;",
|
||||
"Simplify all geometries to points": "Απλοποίηση όλων των γεωμετριών σε σημεία",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Tags": "Tags",
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Caption",
|
||||
"Center map on your location": "Center map on your location",
|
||||
"Change map background": "Change map background",
|
||||
"Change tilelayers": "Change tilelayers",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Choose the data format",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -536,14 +538,7 @@ const locale = {
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("en", locale)
|
||||
L.setLocale("en")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Caption",
|
||||
"Center map on your location": "Center map on your location",
|
||||
"Change map background": "Change map background",
|
||||
"Change tilelayers": "Change tilelayers",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Choose the data format",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Caption",
|
||||
"Center map on your location": "Center map on your location",
|
||||
"Change map background": "Change basemap",
|
||||
"Change tilelayers": "Set map background",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Choose...",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Almacenar en caché la solicitud de proxy",
|
||||
"Caption": "Leyenda",
|
||||
"Center map on your location": "Centrar el mapa en tu ubicación",
|
||||
"Change map background": "Cambiar el fondo del mapa",
|
||||
"Change tilelayers": "Cambiar capas de teselas",
|
||||
"Change": "Cambiar",
|
||||
"Choose the data format": "Elegir el formato de datos",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -525,25 +527,18 @@ const locale = {
|
|||
"Default longitude": "Longitud predeterminada",
|
||||
"Edit map default view": "Editar vista predeterminada del mapa",
|
||||
"Use current center and zoom": "Usar el centro y zoom actuales",
|
||||
"Layer permalink": "Enlace permanente de la capa",
|
||||
"Back to home": "Volver al inicio",
|
||||
"Home logo": "Logo de inicio",
|
||||
"Add this geometry to my map": "Agregar esta geometría a mi mapa",
|
||||
"Add this place to my map": "Agregar este lugar a mi mapa",
|
||||
"Cancel last edit": "Cancelar la última edición",
|
||||
"Redo last edit": "Rehacer la última edición",
|
||||
"Links": "Enlaces",
|
||||
"Images": "Imágenes",
|
||||
"Layer permalink": "Layer permalink",
|
||||
"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",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Etiquetas",
|
||||
"Geocode": "Geocodificar",
|
||||
"Display the back to home icon": "Mostrar el ícono de volver al inicio",
|
||||
"Do you want to display layer switcher in caption bar?": "¿Quieres mostrar el selector de capas en la barra de título?",
|
||||
"Simplify all geometries to points": "Simplificar todas las geometrías a puntos",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Tags": "Tags",
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("es", locale)
|
||||
L.setLocale("es")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Almacenar en caché la solicitud de proxy",
|
||||
"Caption": "Leyenda",
|
||||
"Center map on your location": "Centrar el mapa en tu ubicación",
|
||||
"Change map background": "Cambiar el fondo del mapa",
|
||||
"Change tilelayers": "Cambiar capas de teselas",
|
||||
"Change": "Cambiar",
|
||||
"Choose the data format": "Elegir el formato de datos",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -525,23 +527,16 @@
|
|||
"Default longitude": "Longitud predeterminada",
|
||||
"Edit map default view": "Editar vista predeterminada del mapa",
|
||||
"Use current center and zoom": "Usar el centro y zoom actuales",
|
||||
"Layer permalink": "Enlace permanente de la capa",
|
||||
"Back to home": "Volver al inicio",
|
||||
"Home logo": "Logo de inicio",
|
||||
"Add this geometry to my map": "Agregar esta geometría a mi mapa",
|
||||
"Add this place to my map": "Agregar este lugar a mi mapa",
|
||||
"Cancel last edit": "Cancelar la última edición",
|
||||
"Redo last edit": "Rehacer la última edición",
|
||||
"Links": "Enlaces",
|
||||
"Images": "Imágenes",
|
||||
"Layer permalink": "Layer permalink",
|
||||
"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",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Etiquetas",
|
||||
"Geocode": "Geocodificar",
|
||||
"Display the back to home icon": "Mostrar el ícono de volver al inicio",
|
||||
"Do you want to display layer switcher in caption bar?": "¿Quieres mostrar el selector de capas en la barra de título?",
|
||||
"Simplify all geometries to points": "Simplificar todas las geometrías a puntos",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Tags": "Tags",
|
||||
"Geocode": "Geocode"
|
||||
}
|
|
@ -45,6 +45,7 @@ const locale = {
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Legend",
|
||||
"Center map on your location": "Sea oma asukoht keskpunktiks",
|
||||
"Change map background": "Vaheta kaardi taust",
|
||||
"Change tilelayers": "Vaheta kaardi taust",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Vali andmevorming",
|
||||
|
@ -456,6 +457,7 @@ 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.",
|
||||
|
@ -536,14 +538,7 @@ const locale = {
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|
||||
L.registerLocale("et", locale)
|
||||
L.setLocale("et")
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
"Cache proxied request": "Cache proxied request",
|
||||
"Caption": "Legend",
|
||||
"Center map on your location": "Sea oma asukoht keskpunktiks",
|
||||
"Change map background": "Vaheta kaardi taust",
|
||||
"Change tilelayers": "Vaheta kaardi taust",
|
||||
"Change": "Change",
|
||||
"Choose the data format": "Vali andmevorming",
|
||||
|
@ -456,6 +457,7 @@
|
|||
"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.",
|
||||
|
@ -536,12 +538,5 @@
|
|||
"Images": "Images",
|
||||
"Iframes": "Iframes",
|
||||
"Tags": "Tags",
|
||||
"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",
|
||||
"Back to list": "Back to list",
|
||||
"Toggle rule": "Toggle rule",
|
||||
"Delete rule": "Delete rule",
|
||||
"Cannot save layer, please try again in a few minutes.": "Cannot save layer, please try again in a few minutes."
|
||||
"Geocode": "Geocode"
|
||||
}
|