Compare commits

...

60 commits

Author SHA1 Message Date
dependabot[bot]
72a447d7f6
chore: bump websockets from 13.1 to 14.1
Bumps [websockets](https://github.com/python-websockets/websockets) from 13.1 to 14.1.
- [Release notes](https://github.com/python-websockets/websockets/releases)
- [Commits](https://github.com/python-websockets/websockets/compare/13.1...14.1)

---
updated-dependencies:
- dependency-name: websockets
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-10 08:03:51 +00:00
Yohan Boniface
246aedaeb9
chore: bump pydantic from 2.10.2 to 2.10.3 (#2352)
Some checks are pending
Test & Docs / tests (postgresql, 3.10) (push) Waiting to run
Test & Docs / tests (postgresql, 3.12) (push) Waiting to run
Test & Docs / lint (push) Waiting to run
Test & Docs / docs (push) Waiting to run
2024-12-10 09:02:56 +01:00
Yohan Boniface
ec7c85db3a
chore: bump mkdocs-material from 9.5.47 to 9.5.48 (#2353) 2024-12-10 09:02:40 +01:00
Yohan Boniface
827fd39925
chore: bump ruff from 0.8.1 to 0.8.2 (#2354) 2024-12-10 09:02:23 +01:00
dependabot[bot]
d8e73121cf
chore: bump ruff from 0.8.1 to 0.8.2
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.8.1 to 0.8.2.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.8.1...0.8.2)

---
updated-dependencies:
- dependency-name: ruff
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-09 17:29:29 +00:00
dependabot[bot]
43f3701a6f
chore: bump mkdocs-material from 9.5.47 to 9.5.48
Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.5.47 to 9.5.48.
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.5.47...9.5.48)

---
updated-dependencies:
- dependency-name: mkdocs-material
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-09 17:29:12 +00:00
dependabot[bot]
c42bbf2b7b
chore: bump pydantic from 2.10.2 to 2.10.3
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.10.2 to 2.10.3.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.10.2...v2.10.3)

---
updated-dependencies:
- dependency-name: pydantic
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-09 17:29:05 +00:00
Yohan Boniface
d0156bc7a6
fixup: make sure to redraw tile after a .umap import (#2347)
Some checks are pending
Test & Docs / tests (postgresql, 3.10) (push) Waiting to run
Test & Docs / tests (postgresql, 3.12) (push) Waiting to run
Test & Docs / lint (push) Waiting to run
Test & Docs / docs (push) Waiting to run
Broken since
20b2290d00

Since started as a simple fix, but:
- I first thought my previous fix of the failing test
`test_import_umap_from_textarea` was not a real fix, so I changed a bit
the way we mock tiles URL in tests, but at the end the test was failing
for good reasons
- since 20b2290d00 the reset of tilelayer
was not called anymore after importing a umap file, so I first made a
quick fix for this
- then I decided to refactor a bit more render and propagate, so
`importRaw` would pass the exact imported properties (instead of trying
to blindly target with some properties), and to remove a call to
`propagate`, which at the end should disappear in favor of `render` with
better targeting
2024-12-09 13:12:56 +01:00
Yohan Boniface
a7b714c887
fix: disable for real dragging the map on mobile when scrollWheelZoom is false (#2344)
Some checks failed
Test & Docs / tests (postgresql, 3.10) (push) Has been cancelled
Test & Docs / tests (postgresql, 3.12) (push) Has been cancelled
Test & Docs / lint (push) Has been cancelled
Test & Docs / docs (push) Has been cancelled
Changing map options at this stage is too late.

cf #2340
2024-12-07 15:46:45 +01:00
Yohan Boniface
f3c95bd13d chore: refactor render and propagate to better target UI changes 2024-12-07 15:41:16 +01:00
Yohan Boniface
bf2ed185db fix: make sure to redraw tile after a .umap import
Broken since 20b2290d00
2024-12-07 13:02:04 +01:00
Yohan Boniface
4070da392a chore: catch all "tile*" URL in playwright 2024-12-07 13:01:41 +01:00
David Larlet
ec23f09e5b
chore: bump django from 5.1.3 to 5.1.4 (#2346)
Some checks are pending
Test & Docs / tests (postgresql, 3.10) (push) Waiting to run
Test & Docs / tests (postgresql, 3.12) (push) Waiting to run
Test & Docs / lint (push) Waiting to run
Test & Docs / docs (push) Waiting to run
Bumps [django](https://github.com/django/django) from 5.1.3 to 5.1.4.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2d4add11fd"><code>2d4add1</code></a>
[5.1.x] Bumped version for 5.1.4 release.</li>
<li><a
href="6943d61818"><code>6943d61</code></a>
[5.1.x] Fixed CVE-2024-53908 -- Prevented SQL injections in direct
HasKeyLook...</li>
<li><a
href="bbc74a7f7e"><code>bbc74a7</code></a>
[5.1.x] Fixed CVE-2024-53907 -- Mitigated potential DoS in
strip_tags().</li>
<li><a
href="5b4d949d7c"><code>5b4d949</code></a>
[5.1.x] Removed question marks from headings in
docs/topics/db/fixtures.txt.</li>
<li><a
href="6e3e7353e0"><code>6e3e735</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/35950">#35950</a>
-- Restored refreshing of relations when fields deferred.</li>
<li><a
href="ee2698dcca"><code>ee2698d</code></a>
[5.1.x] Removed reference to &quot;removing older versions of
Django&quot; in tutorial.</li>
<li><a
href="bed70e2c00"><code>bed70e2</code></a>
[5.1.x] Upgraded to Python 3.12, Ubuntu 24.04, and enabled
fail_on_warning fo...</li>
<li><a
href="5f82a5e4c7"><code>5f82a5e</code></a>
[5.1.x] Added stub release notes and release date for 5.1.4, 5.0.10, and
4.2.17.</li>
<li><a
href="4b262408aa"><code>4b26240</code></a>
[5.1.x] Fixed <a
href="https://redirect.github.com/django/django/issues/35942">#35942</a>
-- Fixed createsuperuser crash on Python 3.13+ when user...</li>
<li><a
href="08ac8c1b44"><code>08ac8c1</code></a>
[5.1.x] Updated maintainers of Django Debug Toolbar to Django
Commons.</li>
<li>Additional commits viewable in <a
href="https://github.com/django/django/compare/5.1.3...5.1.4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=django&package-manager=pip&previous-version=5.1.3&new-version=5.1.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/umap-project/umap/network/alerts).

</details>
2024-12-06 14:57:47 -05:00
dependabot[bot]
b10dadd453
chore: bump django from 5.1.3 to 5.1.4
Bumps [django](https://github.com/django/django) from 5.1.3 to 5.1.4.
- [Commits](https://github.com/django/django/compare/5.1.3...5.1.4)

---
updated-dependencies:
- dependency-name: django
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-06 18:38:34 +00:00
Yohan Boniface
42f74e1554 fix: disable for real dragging the map on mobile when scrollWheelZoom is false
Changing map options at this stage is too late.

cf #2340
2024-12-06 11:27:30 +01:00
Yohan Boniface
97ff26b6e8 fix: make that renderUI also recompute scrollWheelZoom
Some checks are pending
Test & Docs / tests (postgresql, 3.10) (push) Waiting to run
Test & Docs / tests (postgresql, 3.12) (push) Waiting to run
Test & Docs / lint (push) Waiting to run
Test & Docs / docs (push) Waiting to run
Otherwise it does not change the behaviour when changing the setting.
2024-12-05 18:39:40 +01:00
Yohan Boniface
b7649a5e47
fix: Avoid map-panning on mobile using two fingers navigation (#2340)
If scrollWheelZoom option is false we deactivate leaflet dragging
options only on mobile
2024-12-05 18:38:08 +01:00
Yohan Boniface
92431d3b83
fix: do not redraw tilelayers each time a map property is changed (#2342) 2024-12-05 18:32:47 +01:00
Yohan Boniface
20b2290d00 fix: do not redraw tilelayers each time a map property is changed 2024-12-05 18:32:05 +01:00
Yohan Boniface
f4814797d7
feat: open importers in a dialog instead of in the form (#2327)
![image](https://github.com/user-attachments/assets/bdc8d7ef-874a-419c-9f02-47aff06081f3)

cf #2302
2024-12-05 18:27:18 +01:00
Yohan Boniface
0b818e8b75
feat: add a disabled/active mode to the submit button of import panel (#2341)
cf #2302

Warning: I removed the historic `width: 100%` on all buttons, who knows
where this will break? :p

Disabled:


![image](https://github.com/user-attachments/assets/000ff44b-bd6e-485b-b27f-39b0a189bf56)

Form valid:


![image](https://github.com/user-attachments/assets/afdbd4b6-7168-4dff-b314-e6556a289369)
2024-12-05 18:04:09 +01:00
Yohan Boniface
b692cb0cd1 chore: rename Importer.isValid to Importer.canSubmit
We are not really checking the validity of the form.
2024-12-05 18:03:30 +01:00
David Larlet
1f13c6ef00 docs-users: Update importers-related tutorial 2024-12-05 18:00:41 +01:00
Yohan Boniface
a9b13c709d feat(importer): check "copy" as default action
Let's make it simpler for new comers, and advanced users will know
where to click to change the behaviour.
2024-12-05 18:00:34 +01:00
Yohan Boniface
50efbc25be feat: add a disabled/active mode to the submit button of import panel
cf #2302
2024-12-05 18:00:26 +01:00
Yohan Boniface
d99fe70e36 feat: display importers in a dialog instead of direclty in the form
The goal is to keep the form smaller, specifically to keep the
submit button visible as much as possible.
2024-12-05 17:59:03 +01:00
Yohan Boniface
d64cdae987 chore: make that Importer extends WithTemplate
Another step is needed to use this.elements instead of this.qs
2024-12-05 17:59:03 +01:00
Yohan Boniface
da86020a0b feat: add icon-magic in 16-white.svg 2024-12-05 17:59:03 +01:00
Yohan Boniface
7f3726ddd1
feat: display an image from Panoramax in OSM template when tag is defined (#2338)
![Screenshot From 2024-12-05
11-45-05](https://github.com/user-attachments/assets/97949b2f-4716-4d56-bb2e-ce481b932dcb)

I initially just wanted to work on that simple Panoramax feature, but
faced a bunch of bugs!

- one bad var remaining since whatever refactor (and no tests for this
popup template!)
- title was duplicated, since whatever refactor (and not tests for
this…)
- title text was in black on blue background
2024-12-05 17:36:07 +01:00
Yohan Boniface
2c601e483d
feat: allow to configure the default label keys per instance (#2291)
fix #2289

Let's add "nom" in OSM France and ANCT instances, then, to make users
experience smoother (a lot of imported data contains a "nom" column, and
no "name" nor "title").
2024-12-05 17:35:48 +01:00
Yohan Boniface
171aba6676
feat: add basic autocompletion on inputs expecting a field name (#2281)
Eg. the labelKey or filterKey input.
2024-12-05 17:32:27 +01:00
Yohan Boniface
b7c77b9c9f
feat: make expression persistent in the overpass importer (#2339)
In other words: fill in the "tags" input with the latest typed
expression.

Otherwise, when making tries with overpass imports, one have to type it
again and again (it's available through the autocomplete, though, but
it's not obvious and it's less friendly IMHO).
2024-12-05 17:31:14 +01:00
Yohan Boniface
82853f7ade chore: add very minimal test for OSM popup template 2024-12-05 17:29:30 +01:00
Florent Triquet
acbdfda581 fix: Avoid map-panning on mobile using two fingers navigation
If scrollWheelZoom option is false we deactivate leaflet dragging options only on mobile
2024-12-05 14:11:05 +01:00
Yohan Boniface
e012d57e5c feat: make expression persistent in the overpass importer
In other words: fill in the "tags" input with the latest
typed expression.

Otherwise, when making tries with overpass imports, one have to
type it again and again (it's available through the autocomplete,
though, but it's not obvious and it's less friendly IMHO).
2024-12-05 12:42:21 +01:00
Yohan Boniface
6a0bc9443b feat: display an image from Panoramax in OSM template when tag is defined 2024-12-05 11:57:48 +01:00
Yohan Boniface
4949fcb4a4 feat: try to guess RGB from color name when element is not in DOM
We often need to compute the text/icon constrast color, but often
the element is not yet in the DOM, so we can't get the background
easily. Let's have a fallback for that instead of trying to have
"load" events everywhere.
2024-12-05 11:53:01 +01:00
Yohan Boniface
430dede0dd fix: fix broken OSM template 2024-12-05 11:46:52 +01:00
Yohan Boniface
d9c04c7d0a fix: do not render normal popup title in OSM template 2024-12-05 11:46:26 +01:00
Yohan Boniface
8f7e5c7252 chore: add missing import in cadastrefr
Some checks failed
Test & Docs / docs (push) Has been cancelled
Test & Docs / tests (postgresql, 3.10) (push) Has been cancelled
Test & Docs / tests (postgresql, 3.12) (push) Has been cancelled
Test & Docs / lint (push) Has been cancelled
2024-12-03 18:07:26 +01:00
Yohan Boniface
c9d532508d
chore: change cadastrefr buttons (#2333)
We remove the cancel button and change the accept label.
2024-12-03 17:56:57 +01:00
Yohan Boniface
6221b709f4
fix: importer.map is undefined in geodatamine importer (#2332)
Broken since the map split I guess.
2024-12-03 17:54:20 +01:00
Yohan Boniface
2b2580fa22
feat: swap import and settings buttons in edit toolbar (#2329)
fix #2297


![image](https://github.com/user-attachments/assets/2c7a98db-03dd-4cc2-afd3-1b5da3ae6964)
2024-12-03 17:53:51 +01:00
Yohan Boniface
26ff82e838 chore: change cadastrefr buttons
We remove the cancel button and change the accept label.
2024-12-03 16:24:30 +01:00
Yohan Boniface
8fa26a02a2 fix: importer.map is undefined
Broken this the map split I guess.
2024-12-03 16:21:37 +01:00
Yohan Boniface
9a900319af feat: swap import and settings buttons in edit toolbar
fix #2297
2024-12-03 15:20:22 +01:00
Yohan Boniface
e01a526935
chore: bump pytest-rerunfailures from 14.0 to 15.0 (#2326)
Some checks are pending
Test & Docs / tests (postgresql, 3.10) (push) Waiting to run
Test & Docs / tests (postgresql, 3.12) (push) Waiting to run
Test & Docs / lint (push) Waiting to run
Test & Docs / docs (push) Waiting to run
2024-12-02 19:51:27 +01:00
Yohan Boniface
8569b827ca
fix: compute length of all shapes for MultiLineString (not only first) (#2310) 2024-12-02 19:46:45 +01:00
dependabot[bot]
2dab2f23b5
chore: bump pytest-rerunfailures from 14.0 to 15.0
Bumps [pytest-rerunfailures](https://github.com/pytest-dev/pytest-rerunfailures) from 14.0 to 15.0.
- [Changelog](https://github.com/pytest-dev/pytest-rerunfailures/blob/master/CHANGES.rst)
- [Commits](https://github.com/pytest-dev/pytest-rerunfailures/compare/14.0...15.0)

---
updated-dependencies:
- dependency-name: pytest-rerunfailures
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-02 18:43:58 +00:00
Yohan Boniface
f4ff1048bd
chore: bump pytest from 8.3.3 to 8.3.4 (#2325) 2024-12-02 19:42:49 +01:00
Yohan Boniface
6310cde28b
chore: bump djlint from 1.36.1 to 1.36.3 (#2324) 2024-12-02 19:41:34 +01:00
Yohan Boniface
666a92ec44 fix: compute length of all shapes for MultiLineString not only first 2024-12-02 19:39:57 +01:00
Yohan Boniface
2f776dab59
feat: highlight importer URL field when it is fulfilled (#2323)
Very small step of #2302 


![image](https://github.com/user-attachments/assets/0ff2c056-91ad-4daa-9882-dd44a4c6ef9f)
2024-12-02 19:04:04 +01:00
Yohan Boniface
bba9487847 feat: highlight importer URL field when it is fulfilled
cf #2302
2024-12-02 18:56:24 +01:00
dependabot[bot]
995052d83e
chore: bump pytest from 8.3.3 to 8.3.4
Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.3.3 to 8.3.4.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.3.3...8.3.4)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-02 17:55:51 +00:00
dependabot[bot]
7e53e50b9c
chore: bump djlint from 1.36.1 to 1.36.3
Bumps [djlint](https://github.com/djlint/djLint) from 1.36.1 to 1.36.3.
- [Release notes](https://github.com/djlint/djLint/releases)
- [Changelog](https://github.com/djlint/djLint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/djlint/djLint/compare/v1.36.1...v1.36.3)

---
updated-dependencies:
- dependency-name: djlint
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-02 17:55:44 +00:00
Yohan Boniface
f6f42f5e6b chore: move form css to a separate file 2024-12-02 17:07:06 +01:00
Yohan Boniface
1a88c11289 fix: don't show default label if another is found in features edit 2024-12-02 12:58:19 +01:00
Yohan Boniface
78d6699a81 feat: allow to configure the default label keys per instance
fix #2289
2024-12-02 12:58:19 +01:00
Yohan Boniface
4acb20f3bb feat: add basic autocompletion on inputs expecting a field name
Eg. the labelKey or filterKey input.
2024-11-19 13:59:55 +01:00
38 changed files with 1027 additions and 764 deletions

View file

@ -47,7 +47,7 @@ Voici un bref passage en revu des différents imports proposés et pour finir l
## 1. Importer le contour dune commune ## 1. Importer le contour dune commune
Cliquez sur loutil dimportation en bas de la barre de droite, puis descendez jusquau cadre « Assistants dimport ». Cliquez sur loutil dimportation en bas de la barre de droite, puis cliquez sur le lien « Assistants dimport ».
Cliquez sur « Communes France » et sélectionnez la commune souhaitée dans une liste déroulante. Une fois la commune sélectionnée, le format est reconnu automatiquement (geojson) puis le type de calque (cliquer sur « ? » pour savoir quel choix opérer) Cliquez sur « Communes France » et sélectionnez la commune souhaitée dans une liste déroulante. Une fois la commune sélectionnée, le format est reconnu automatiquement (geojson) puis le type de calque (cliquer sur « ? » pour savoir quel choix opérer)
@ -64,7 +64,7 @@ Une fois cet import réalisé, tout est réglable : couleur de contour, de fond,
## 2. Importer les contours des départements ou des régions ## 2. Importer les contours des départements ou des régions
Cliquez sur loutil dimportation en bas de la barre de droite, puis descendez jusquau cadre « Assistants dimport ». Cliquez sur loutil dimportation en bas de la barre de droite, puis cliquez sur le lien « Assistants dimport ».
Cliquez sur « Contours nationaux » puis soit départements, soit régions et enfin le type de calque (voir supra lexplication). Tous les départements sont importés : Cliquez sur « Contours nationaux » puis soit départements, soit régions et enfin le type de calque (voir supra lexplication). Tous les départements sont importés :
@ -72,7 +72,7 @@ Cliquez sur « Contours nationaux » puis soit départements, soit régions et
## 3. Importer un point dintérêt issu de GeoDataMine ## 3. Importer un point dintérêt issu de GeoDataMine
Cliquez sur loutil dimportation en bas de la barre de droite, puis descendez jusquau cadre « Assistants dimport ». Cliquez sur loutil dimportation en bas de la barre de droite, puis cliquez sur le lien « Assistants dimport ».
Cliquez sur « GeoDataMine (thèmes OSM) » et sélectionnez les informations souhaitées, routes, bâtiments, commerces, services publics, … Cliquez sur « GeoDataMine (thèmes OSM) » et sélectionnez les informations souhaitées, routes, bâtiments, commerces, services publics, …
Par exemple, en sélectionnant les points deau potable de la CA du Grand Avignon, puis « Copier dans un calque » Par exemple, en sélectionnant les points deau potable de la CA du Grand Avignon, puis « Copier dans un calque »

View file

@ -1,5 +1,5 @@
# Force rtfd to use a recent version of mkdocs # Force rtfd to use a recent version of mkdocs
mkdocs==1.6.1 mkdocs==1.6.1
pymdown-extensions==10.12 pymdown-extensions==10.12
mkdocs-material==9.5.47 mkdocs-material==9.5.48
mkdocs-static-i18n==1.2.3 mkdocs-static-i18n==1.2.3

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 MiB

After

Width:  |  Height:  |  Size: 734 KiB

View file

@ -175,11 +175,6 @@ UMAP_EXTRA_URLS = {
} }
``` ```
#### UMAP_KEEP_VERSIONS
How many datalayer versions to keep. 10 by default.
#### UMAP_DEFAULT_EDIT_STATUS #### UMAP_DEFAULT_EDIT_STATUS
Define the map default edit status. Define the map default edit status.
@ -270,6 +265,16 @@ Available importers:
- `communesfr`: download French communes boundaries, from https://geo.api.gouv.fr/ - `communesfr`: download French communes boundaries, from https://geo.api.gouv.fr/
- `datasets`: define URLs you want to promote to users, with a `name` and a `format` - `datasets`: define URLs you want to promote to users, with a `name` and a `format`
#### UMAP_KEEP_VERSIONS
How many datalayer versions to keep. 10 by default.
#### UMAP_LABEL_KEYS
List of properties to consider as "Feature label" (to show in popup or in browser).
UMAP_LABEL_KEYS = ["name", "title"]
#### UMAP_MAPS_PER_PAGE #### UMAP_MAPS_PER_PAGE
How many maps to show in maps list, like search or home page. How many maps to show in maps list, like search or home page.

View file

@ -1,5 +1,5 @@
# Force rtfd to use a recent version of mkdocs # Force rtfd to use a recent version of mkdocs
mkdocs==1.6.1 mkdocs==1.6.1
pymdown-extensions==10.12 pymdown-extensions==10.12
mkdocs-material==9.5.47 mkdocs-material==9.5.48
mkdocs-static-i18n==1.2.3 mkdocs-static-i18n==1.2.3

View file

@ -28,7 +28,7 @@ classifiers = [
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
] ]
dependencies = [ dependencies = [
"Django==5.1.3", "Django==5.1.4",
"django-agnocomplete==2.2.0", "django-agnocomplete==2.2.0",
"django-environ==0.11.2", "django-environ==0.11.2",
"django-probes==1.7.0", "django-probes==1.7.0",
@ -44,10 +44,10 @@ dependencies = [
[project.optional-dependencies] [project.optional-dependencies]
dev = [ dev = [
"hatch==1.13.0", "hatch==1.13.0",
"ruff==0.8.1", "ruff==0.8.2",
"djlint==1.36.1", "djlint==1.36.3",
"mkdocs==1.6.1", "mkdocs==1.6.1",
"mkdocs-material==9.5.47", "mkdocs-material==9.5.48",
"mkdocs-static-i18n==1.2.3", "mkdocs-static-i18n==1.2.3",
"vermin==1.6.0", "vermin==1.6.0",
"pymdown-extensions==10.12", "pymdown-extensions==10.12",
@ -56,10 +56,10 @@ dev = [
test = [ test = [
"factory-boy==3.3.1", "factory-boy==3.3.1",
"playwright>=1.39", "playwright>=1.39",
"pytest==8.3.3", "pytest==8.3.4",
"pytest-django==4.9.0", "pytest-django==4.9.0",
"pytest-playwright==0.6.2", "pytest-playwright==0.6.2",
"pytest-rerunfailures==14.0", "pytest-rerunfailures==15.0",
"pytest-xdist>=3.5.0,<4", "pytest-xdist>=3.5.0,<4",
] ]
docker = [ docker = [
@ -68,8 +68,8 @@ docker = [
sync = [ sync = [
"channels==4.2.0", "channels==4.2.0",
"daphne==4.1.2", "daphne==4.1.2",
"pydantic==2.10.2", "pydantic==2.10.3",
"websockets==13.1", "websockets==14.1",
] ]
[project.scripts] [project.scripts]

View file

@ -273,6 +273,7 @@ UMAP_HOME_FEED = "latest"
UMAP_IMPORTERS = {} UMAP_IMPORTERS = {}
UMAP_HOST_INFOS = {} UMAP_HOST_INFOS = {}
UMAP_PURGATORY_ROOT = "/tmp/umappurgatory" UMAP_PURGATORY_ROOT = "/tmp/umappurgatory"
UMAP_LABEL_KEYS = ["name", "title"]
UMAP_READONLY = env("UMAP_READONLY", default=False) UMAP_READONLY = env("UMAP_READONLY", default=False)
UMAP_GZIP = True UMAP_GZIP = True

View file

@ -157,613 +157,13 @@ dt {
display: grid; display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-columns: repeat(3, minmax(0, 1fr));
} }
.grid-container.by4 {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.grid-container > * { .grid-container > * {
text-align: center; text-align: center;
} }
/* *********** */
/* forms */
/* *********** */
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: white;
border: 1px solid #CCCCCC;
border-radius: 2px 2px 2px 2px;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset;
color: rgba(0, 0, 0, 0.75);
display: block;
font-family: inherit;
margin: 0;
margin-bottom: var(--box-margin);
padding: 7px;
width: 100%;
}
input[type="range"] {
margin-top: 10px;
margin-bottom: 5px;
width: 100%;
}
input[type="radio"] {
margin-inline-end: var(--text-margin);
}
input[type="checkbox"] {
margin: 0 var(--text-margin);
vertical-align: middle;
appearance: none;
}
input[type="checkbox"]:after {
display: inline-block;
content: ' ';
width: 12px;
height: 12px;
border: 1px solid var(--color-lightGray);
cursor: pointer;
text-align: center;
font-size: 1rem;
line-height: 0.8rem;
}
input[type=checkbox]:checked:after {
background-color: var(--color-lightCyan);
content: '✓';
color: var(--color-darkGray);
}
input[data-modified=true] {
background-color: var(--color-lightCyan);
border: 1px solid var(--color-darkGray);
}
textarea {
height: inherit;
padding: 7px;
min-height: 15rem;
min-height: 6rlh;
}
select {
border: 1px solid #222;
width: 100%;
height: 28px;
line-height: 28px;
margin-top: 5px;
margin-bottom: var(--box-margin);
}
.dark select {
color: #efefef;
background-color: #393F3F;
}
select[multiple="multiple"] {
height: auto;
}
.button,
[type="button"],
input[type="submit"] {
display: block;
margin-bottom: 14px;
text-align: center;
border-radius: 2px;
font-weight: normal;
cursor: pointer;
padding: 7px;
width: 100%;
min-height: 32px;
line-height: 32px;
border: none;
text-decoration: none;
background-color: white;
}
.dark .button,
.dark [type="button"] {
background-color: var(--color-darkerGray);
color: var(--text-color);
border: 1px solid #1b1f20;
}
.dark .button:hover,
.dark [type="button"]:hover,
.dark input[type="submit"]:hover {
background-color: #2e3436;
}
.dark a {
color: var(--text-color);
}
button.flat,
[type="button"].flat,
.dark [type="button"].flat {
border: none;
background-color: inherit;
padding: 0;
text-align: start;
min-height: inherit;
width: initial;
display: initial;
line-height: inherit;
color: var(--text-color);
}
button.flat:hover,
[type="button"].flat:hover,
.dark [type="button"].flat:hover {
text-decoration: underline;
}
.help-text, .helptext {
display: block;
padding: 7px 7px;
margin-bottom: 14px;
background: #393F3F;
color: var(--color-lightGray);
font-size: 10px;
border-radius: 0 2px;
}
.content .helptext {
background-color: #eee;
color: #000;
}
input + .help-text {
margin-top: -14px;
}
.formbox {
min-height: 36px;
margin-bottom: 14px;
}
.formbox.with-switch {
padding-top: 2px;
}
fieldset.formbox {
border: none;
border-top: 1px solid var(--color-lightGray);
}
label {
display: block;
font-size: 12px;
line-height: 21px;
width: 100%;
}
label + label {
margin-top: var(--box-margin);
}
.content label {
font-weight: bold;
}
input[type="checkbox"] + label {
display: inline;
padding: 0 14px;
}
select + .error,
input + .error {
display: block;
padding: 7px 7px;
margin-top: -14px;
margin-bottom: 14px;
background: var(--color-lightGray);
color: #fff;
background-color: #cc0000;
font-size: 11px;
border-radius: 0 2px;
}
input[type="file"] + .error {
margin-top: 0;
}
input[value]:invalid {
border-color: red;
background-color: darkred;
}
.dark input, .dark textarea {
background-color: #232729;
border-color: #1b1f20;
color: #efefef;
}
details {
margin-bottom: 5px;
border-start-start-radius: 4px;
border-start-end-radius: 4px;
}
.dark details {
border: 1px solid #222;
}
details fieldset {
overflow: hidden;
border: 1px solid var(--color-lightGray);
margin: 0;
padding-top: 10px;
}
details summary {
cursor: pointer;
background-color: var(--color-lightGray);
line-height: 30px;
font-size: 1.2em;
padding: 0 5px;
}
.dark details summary {
background-color: #232729;
color: #fff;
}
.dark details fieldset {
border: 1px solid var(--color-darkGray);
}
fieldset legend {
font-size: .9rem;
padding: 0 5px;
}
fieldset.separator {
border: none;
border-top: 1px solid var(--color-lightGray);
}
[data-badge] {
position: relative;
}
[data-badge]:after {
position: absolute;
inset-inline-end: -6px;
top: -6px;
min-width: 8px;
min-height: 8px;
line-height: 8px;
padding: 2px;
font-weight: bold;
background-color: var(--color-accent);
color: var(--color-darkBlue);
text-align: center;
font-size: .75rem;
border-radius: 50%;
content: attr(data-badge);
}
[hidden] {
display: none!important;
}
/* Switch */
input.switch:empty {
display: none;
}
input.switch:empty ~ label {
white-space: nowrap;
position: relative;
float: inline-start;
line-height: 2em;
height: 2em;
text-indent: 6em;
margin: 0.2em 0;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
text-shadow: 0 1px rgba(0, 0, 0, 0.1);
width: 80px;
}
input.switch:empty ~ label:before,
input.switch:empty ~ label:after {
position: absolute;
display: block;
top: 0;
bottom: 0;
inset-inline-start: 0;
content: ' ';
width: 6em;
-webkit-transition: all 100ms ease-in;
transition: all 100ms ease-in;
color: #c9c9c7;
font-weight: bold;
background-color: #ededed;
}
.dark input.switch:empty ~ label:before,
.dark input.switch:empty ~ label:after {
background-color: #272c2e;
}
input.switch:empty ~ label:after {
width: 3em;
margin-inline-start: 0.1em;
background-color: #ededed;
content: "OFF";
text-indent: 3.5em;
border: 1px solid #374E75;
font-weight: bold;
}
.dark input.switch:empty ~ label:after {
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-lightCyan);
border: 1px solid var(--color-lightGray);
color: var(--color-darkGray);
content: "ON";
text-indent: 0.7em;
text-align: start;
font-weight: bold;
}
.dark input.switch:checked ~ label:before {
border: none;
background-color: var(--color-accent);
}
input.switch:checked ~ label:after {
margin-inline-start: 3em;
}
.button-bar, .umap-multiplechoice {
margin-top: 5px;
text-align: center;
display: grid;
width: 100%
}
.button-bar {
grid-gap: 7px;
}
.umap-multiplechoice.by2,
.button-bar.half {
grid-template-columns: 1fr 1fr;
}
.button-bar.by3,
.button-bar.by5,
.button-bar.by6,
.umap-multiplechoice.by3,
.umap-multiplechoice.by5,
.umap-multiplechoice.by6 {
grid-template-columns: 1fr 1fr 1fr;
}
.button-bar.by4,
.umap-multiplechoice.by4 {
grid-template-columns: 1fr 1fr 1fr 1fr;
}
.button-bar .button,
.button-bar [type="button"] {
display: inline-block;
}
.umap-multiplechoice input[type='radio'] {
display: none;
}
.umap-multiplechoice label {
border: 1px solid #374E75;
cursor: pointer;
background-color: #c9c9c7;
min-height: 30px;
line-height: 30px;
text-align: center;
width: 100%;
display: inline-block;
}
.dark .umap-multiplechoice label {
border: 1px solid black;
background-color: #2c3233;
}
.umap-multiplechoice input[type='radio']:checked + label {
background-color: var(--color-accent);
box-shadow: inset 0 0 6px 0px #2c3233;
color: var(--color-darkGray);
}
.inheritable .header,
.inheritable {
clear: both;
overflow: hidden;
}
.inheritable .header {
margin-bottom: 5px;
}
.inheritable .header label {
padding-top: 6px;
}
.inheritable + .inheritable {
border-top: 1px solid #222;
padding-top: 5px;
margin-top: 5px;
}
.umap-field-iconUrl .action-button,
.inheritable .define,
.inheritable .undefine {
float: inline-end;
width: initial;
min-height: 18px;
line-height: 18px;
margin-bottom: 0;
}
.inheritable .quick-actions {
float: inline-end;
}
.inheritable .quick-actions .formbox {
margin-bottom: 0;
}
.inheritable .quick-actions input {
width: 100px;
margin-inline-end: 5px;
}
.inheritable .define,
.inheritable.undefined .undefine,
.inheritable.undefined .show-on-defined {
display: none;
}
.inheritable.undefined .define {
display: block;
}
i.info {
background-repeat: no-repeat;
background-image: url('./img/16.svg');
background-position: -170px -50px;
display: inline-block;
margin-inline-start: 5px;
vertical-align: middle;
width: 16px;
height: 18px;
}
.dark i.info {
background-image: url('./img/16-white.svg');
}
.with-transition {
transition: all .7s;
}
.umap-empty:before, .umap-to-polygon:before,
.umap-clone:before, .umap-edit:before, .umap-download:before,
.umap-to-polyline:before {
background-repeat: no-repeat;
text-indent: 36px;
height: 24px;
line-height: 24px;
display: inline-block;
background-image: url('./img/24.svg');
vertical-align: bottom;
content: " ";
}
.dark .umap-empty:before,
.dark .umap-to-polygon:before,
.dark .umap-clone:before,
.dark .umap-edit:before, .dark .umap-download:before,
.dark .umap-to-polyline:before {
background-image: url('./img/24-white.svg');
vertical-align: middle;
}
.umap-to-polygon:before {
background-position: -72px -42px;
}
.umap-to-polyline:before {
background-position: -106px -42px;
}
.umap-clone:before {
background-position: -144px -78px;
}
.umap-empty:before {
background-position: -108px -78px;
}
.umap-download:before {
background-position: -72px -78px;
}
.permissions-panel,
.umap-upload,
.umap-share,
.umap-datalayer-container,
.umap-layer-properties-container,
.umap-browse-data,
.umap-tilelayer-switcher-container {
padding: 0 10px;
}
.umap-field-datalist {
display: flex;
justify-content: space-between;
font-size: 9px;
margin-top: -8px;
padding: 0 5px;
}
.flat-tabs {
display: flex;
justify-content: space-around;
font-size: 1.2em;
margin-bottom: 20px;
border-bottom: 1px solid #bebebe;
}
.flat-tabs button {
padding: 10px;
text-decoration: none;
cursor: pointer;
border-bottom: 1px solid transparent;
}
.flat-tabs button:hover,
.flat-tabs .on {
font-weight: bold;
border-bottom: 1px solid #444;
}
.dark .flat-tabs button {
color: #fff;
}
.dark .flat-tabs button:hover,
.dark .flat-tabs .on {
border-bottom: 1px solid #fff;
}
.umap-pictogram-category h6 {
font-size: 1.3em;
}
.umap-pictogram-grid {
display: grid;
grid-template-columns: repeat(auto-fill, 30px);
justify-content: space-between;
grid-gap: 5px;
}
.umap-pictogram-choice {
width: 30px;
height: 30px;
line-height: 30px;
cursor: pointer;
background-color: #999;
text-align: center;
margin-bottom: 5px;
display: block;
color: black;
font-weight: bold;
}
.umap-pictogram-choice img {
vertical-align: middle;
max-width: 24px;
}
.umap-pictogram-choice:hover,
.umap-color-picker span:hover {
background-color: #bebebe;
}
.umap-pictogram-choice.selected {
box-shadow: inset 0 0 0 1px #e9e9e9;
}
.umap-pictogram-choice .leaflet-marker-icon {
bottom: 0;
inset-inline-start: 30px;
position: absolute;
}
.umap-color-picker {
clear: both;
margin-bottom: 20px;
overflow: hidden;
display: none;
}
.umap-color-picker span {
width: 20px;
height: 20px;
display: block;
padding: 0;
margin: 0;
cursor: pointer;
float: inline-start;
}
input.blur {
width: calc(100% - 40px);
display: inline-block;
vertical-align: middle;
border-start-end-radius: 0;
border-end-end-radius: 0;
}
.blur + .button:before,
.blur + [type="button"]:before {
content: '✔';
}
.blur + .button,
.blur + [type="button"] {
width: 40px;
height: 18px;
display: inline-block;
vertical-align: middle;
line-height: 18px;
border-start-start-radius: 0;
border-end-start-radius: 0;
box-sizing: border-box;
}
input[type=hidden].blur + .button,
input[type=hidden].blur + [type="button"] {
display: none;
}
.copiable-input {
display: flex;
align-items: end;
}
.copiable-input input {
border-radius: initial;
}
.copiable-input button {
background-position: -46px -92px;
display: inline;
padding: 0 10px;
height: 32px;
width: 32px;
border: 1px solid #202425;
border-radius: initial;
}
/* *********** */ /* *********** */
/* Panel */ /* Panel */

View file

@ -0,0 +1,617 @@
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: white;
border: 1px solid #CCCCCC;
border-radius: 2px 2px 2px 2px;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset;
color: rgba(0, 0, 0, 0.75);
display: block;
font-family: inherit;
margin: 0;
margin-bottom: var(--box-margin);
padding: 7px;
width: 100%;
}
input[type="range"] {
margin-top: 10px;
margin-bottom: 5px;
width: 100%;
}
input[type="radio"] {
margin-inline-end: var(--text-margin);
}
input[type="checkbox"] {
margin: 0 var(--text-margin);
vertical-align: middle;
appearance: none;
}
input[type="checkbox"]:after {
display: inline-block;
content: ' ';
width: 12px;
height: 12px;
border: 1px solid var(--color-lightGray);
cursor: pointer;
text-align: center;
font-size: 1rem;
line-height: 0.8rem;
}
input[type=checkbox]:checked:after {
background-color: var(--color-lightCyan);
content: '✓';
color: var(--color-darkGray);
}
input[data-modified=true] {
background-color: var(--color-lightCyan);
border: 1px solid var(--color-darkGray);
}
textarea {
height: inherit;
padding: 7px;
min-height: 15rem;
min-height: 6rlh;
}
select {
border: 1px solid #222;
width: 100%;
height: 28px;
line-height: 28px;
margin-top: 5px;
margin-bottom: var(--box-margin);
}
.dark select {
color: #efefef;
background-color: #393F3F;
}
select[multiple="multiple"] {
height: auto;
}
.button,
[type="button"],
input[type="submit"] {
display: block;
margin-bottom: 14px;
text-align: center;
border-radius: 2px;
font-weight: normal;
cursor: pointer;
padding: 7px 14px;
min-height: 32px;
line-height: 32px;
border: none;
text-decoration: none;
background-color: white;
}
.dark .button,
.dark [type="button"] {
background-color: var(--color-darkerGray);
color: var(--text-color);
border: 1px solid #1b1f20;
}
.dark .button.primary:not([disabled]),
.dark [type="button"].primary:not([disabled]) {
background-color: var(--color-brightCyan);
color: var(--color-dark);
border: 1px solid #1b1f20;
}
.dark .button:hover,
.dark [type="button"]:hover,
.dark input[type="submit"]:hover {
background-color: #2e3436;
}
.dark a {
color: var(--text-color);
}
.dark [type="button"][disabled],
.dark input[type="submit"][disabled] {
background-color: var(--color-mediumGray);
cursor: not-allowed;
}
button.flat,
[type="button"].flat,
.dark [type="button"].flat {
border: none;
background-color: inherit;
padding: 0;
text-align: start;
min-height: inherit;
width: initial;
display: initial;
line-height: inherit;
color: var(--text-color);
}
button.flat:hover,
[type="button"].flat:hover,
.dark [type="button"].flat:hover {
text-decoration: underline;
}
.help-text, .helptext {
display: block;
padding: 7px 7px;
margin-bottom: 14px;
background: #393F3F;
color: var(--color-lightGray);
font-size: 10px;
border-radius: 0 2px;
}
.content .helptext {
background-color: #eee;
color: #000;
}
input + .help-text {
margin-top: -14px;
}
.formbox {
min-height: 36px;
margin-bottom: 14px;
}
.formbox.with-switch {
padding-top: 2px;
}
fieldset.formbox {
border: none;
border-top: 1px solid var(--color-lightGray);
}
label {
display: block;
font-size: 12px;
line-height: 21px;
width: 100%;
}
label + label {
margin-top: var(--box-margin);
}
.content label {
font-weight: bold;
}
input[type="checkbox"] + label {
display: inline;
padding: 0 14px;
}
select + .error,
input + .error {
display: block;
padding: 7px 7px;
margin-top: -14px;
margin-bottom: 14px;
background: var(--color-lightGray);
color: #fff;
background-color: #cc0000;
font-size: 11px;
border-radius: 0 2px;
}
input[type="file"] + .error {
margin-top: 0;
}
input[value]:invalid {
border-color: red;
background-color: darkred;
}
.dark input, .dark textarea {
background-color: #232729;
border-color: #1b1f20;
color: #efefef;
}
details {
margin-bottom: 5px;
border-start-start-radius: 4px;
border-start-end-radius: 4px;
}
.dark details {
border: 1px solid #222;
}
details fieldset {
overflow: hidden;
border: 1px solid var(--color-lightGray);
margin: 0;
padding-top: 10px;
}
details summary {
cursor: pointer;
background-color: var(--color-lightGray);
line-height: 30px;
font-size: 1.2em;
padding: 0 5px;
}
.dark details summary {
background-color: #232729;
color: #fff;
}
.dark details fieldset {
border: 1px solid var(--color-darkGray);
}
fieldset legend {
font-size: .9rem;
padding: 0 5px;
}
fieldset.separator {
border: none;
border-top: 1px solid var(--color-lightGray);
}
[data-badge] {
position: relative;
}
[data-badge]:after {
position: absolute;
inset-inline-end: -6px;
top: -6px;
min-width: 8px;
min-height: 8px;
line-height: 8px;
padding: 2px;
font-weight: bold;
background-color: var(--color-accent);
color: var(--color-darkBlue);
text-align: center;
font-size: .75rem;
border-radius: 50%;
content: attr(data-badge);
}
[hidden] {
display: none!important;
}
/* Switch */
input.switch:empty {
display: none;
}
input.switch:empty ~ label {
white-space: nowrap;
position: relative;
float: inline-start;
line-height: 2em;
height: 2em;
text-indent: 6em;
margin: 0.2em 0;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
text-shadow: 0 1px rgba(0, 0, 0, 0.1);
width: 80px;
}
input.switch:empty ~ label:before,
input.switch:empty ~ label:after {
position: absolute;
display: block;
top: 0;
bottom: 0;
inset-inline-start: 0;
content: ' ';
width: 6em;
-webkit-transition: all 100ms ease-in;
transition: all 100ms ease-in;
color: #c9c9c7;
font-weight: bold;
background-color: #ededed;
}
.dark input.switch:empty ~ label:before,
.dark input.switch:empty ~ label:after {
background-color: #272c2e;
}
input.switch:empty ~ label:after {
width: 3em;
margin-inline-start: 0.1em;
background-color: #ededed;
content: "OFF";
text-indent: 3.5em;
border: 1px solid #374E75;
font-weight: bold;
}
.dark input.switch:empty ~ label:after {
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-lightCyan);
border: 1px solid var(--color-lightGray);
color: var(--color-darkGray);
content: "ON";
text-indent: 0.7em;
text-align: start;
font-weight: bold;
}
.dark input.switch:checked ~ label:before {
border: none;
background-color: var(--color-accent);
}
input.switch:checked ~ label:after {
margin-inline-start: 3em;
}
.button-bar, .umap-multiplechoice {
margin-top: 5px;
text-align: center;
display: grid;
width: 100%
}
.button-bar {
grid-gap: 7px;
}
.umap-multiplechoice.by2,
.button-bar.half {
grid-template-columns: 1fr 1fr;
}
.button-bar.by3,
.button-bar.by5,
.button-bar.by6,
.umap-multiplechoice.by3,
.umap-multiplechoice.by5,
.umap-multiplechoice.by6 {
grid-template-columns: 1fr 1fr 1fr;
}
.button-bar.by4,
.umap-multiplechoice.by4 {
grid-template-columns: 1fr 1fr 1fr 1fr;
}
.button-bar .button,
.button-bar [type="button"] {
display: inline-block;
}
.umap-multiplechoice input[type='radio'] {
display: none;
}
.umap-multiplechoice label {
border: 1px solid #374E75;
cursor: pointer;
background-color: #c9c9c7;
min-height: 30px;
line-height: 30px;
text-align: center;
width: 100%;
display: inline-block;
}
.dark .umap-multiplechoice label {
border: 1px solid black;
background-color: #2c3233;
}
.umap-multiplechoice input[type='radio']:checked + label {
background-color: var(--color-accent);
box-shadow: inset 0 0 6px 0px #2c3233;
color: var(--color-darkGray);
}
.inheritable .header,
.inheritable {
clear: both;
overflow: hidden;
}
.inheritable .header {
margin-bottom: 5px;
}
.inheritable .header label {
padding-top: 6px;
}
.inheritable + .inheritable {
border-top: 1px solid #222;
padding-top: 5px;
margin-top: 5px;
}
.umap-field-iconUrl .action-button,
.inheritable .define,
.inheritable .undefine {
float: inline-end;
width: initial;
min-height: 18px;
line-height: 18px;
margin-bottom: 0;
}
.inheritable .quick-actions {
float: inline-end;
}
.inheritable .quick-actions .formbox {
margin-bottom: 0;
}
.inheritable .quick-actions input {
width: 100px;
margin-inline-end: 5px;
}
.inheritable .define,
.inheritable.undefined .undefine,
.inheritable.undefined .show-on-defined {
display: none;
}
.inheritable.undefined .define {
display: block;
}
i.info {
background-repeat: no-repeat;
background-image: url('../img/16.svg');
background-position: -170px -50px;
display: inline-block;
margin-inline-start: 5px;
vertical-align: middle;
width: 16px;
height: 18px;
}
.dark i.info {
background-image: url('../img/16-white.svg');
}
.with-transition {
transition: all .7s;
}
.umap-empty:before, .umap-to-polygon:before,
.umap-clone:before, .umap-edit:before, .umap-download:before,
.umap-to-polyline:before {
background-repeat: no-repeat;
text-indent: 36px;
height: 24px;
line-height: 24px;
display: inline-block;
background-image: url('../img/24.svg');
vertical-align: bottom;
content: " ";
}
.dark .umap-empty:before,
.dark .umap-to-polygon:before,
.dark .umap-clone:before,
.dark .umap-edit:before, .dark .umap-download:before,
.dark .umap-to-polyline:before {
background-image: url('../img/24-white.svg');
vertical-align: middle;
}
.umap-to-polygon:before {
background-position: -72px -42px;
}
.umap-to-polyline:before {
background-position: -106px -42px;
}
.umap-clone:before {
background-position: -144px -78px;
}
.umap-empty:before {
background-position: -108px -78px;
}
.umap-download:before {
background-position: -72px -78px;
}
.permissions-panel,
.umap-upload,
.umap-share,
.umap-datalayer-container,
.umap-layer-properties-container,
.umap-browse-data,
.umap-tilelayer-switcher-container {
padding: 0 10px;
}
.umap-field-datalist {
display: flex;
justify-content: space-between;
font-size: 9px;
margin-top: -8px;
padding: 0 5px;
}
.flat-tabs {
display: flex;
justify-content: space-around;
font-size: 1.2em;
margin-bottom: 20px;
border-bottom: 1px solid #bebebe;
}
.flat-tabs button {
padding: 10px;
text-decoration: none;
cursor: pointer;
border-bottom: 1px solid transparent;
}
.flat-tabs button:hover,
.flat-tabs .on {
font-weight: bold;
border-bottom: 1px solid #444;
}
.dark .flat-tabs button {
color: #fff;
}
.dark .flat-tabs button:hover,
.dark .flat-tabs .on {
border-bottom: 1px solid #fff;
}
.umap-pictogram-category h6 {
font-size: 1.3em;
}
.umap-pictogram-grid {
display: grid;
grid-template-columns: repeat(auto-fill, 30px);
justify-content: space-between;
grid-gap: 5px;
}
.umap-pictogram-choice {
width: 30px;
height: 30px;
line-height: 30px;
cursor: pointer;
background-color: #999;
text-align: center;
margin-bottom: 5px;
display: block;
color: black;
font-weight: bold;
}
.umap-pictogram-choice img {
vertical-align: middle;
max-width: 24px;
}
.umap-pictogram-choice:hover,
.umap-color-picker span:hover {
background-color: #bebebe;
}
.umap-pictogram-choice.selected {
box-shadow: inset 0 0 0 1px #e9e9e9;
}
.umap-pictogram-choice .leaflet-marker-icon {
bottom: 0;
inset-inline-start: 30px;
position: absolute;
}
.umap-color-picker {
clear: both;
margin-bottom: 20px;
overflow: hidden;
display: none;
}
.umap-color-picker span {
width: 20px;
height: 20px;
display: block;
padding: 0;
margin: 0;
cursor: pointer;
float: inline-start;
}
input.blur {
width: calc(100% - 40px);
display: inline-block;
vertical-align: middle;
border-start-end-radius: 0;
border-end-end-radius: 0;
}
.blur + .button:before,
.blur + [type="button"]:before {
content: '✔';
}
.blur + .button,
.blur + [type="button"] {
width: 40px;
height: 18px;
display: inline-block;
vertical-align: middle;
line-height: 18px;
border-start-start-radius: 0;
border-end-start-radius: 0;
box-sizing: border-box;
}
input[type=hidden].blur + .button,
input[type=hidden].blur + [type="button"] {
display: none;
}
.copiable-input {
display: flex;
align-items: end;
}
.copiable-input input {
border-radius: initial;
}
.copiable-input button {
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);
}
.umap-upload [type=url] {
margin-bottom: 0;
}

View file

@ -110,6 +110,9 @@ html[dir="rtl"] .icon {
.icon-list { .icon-list {
background-position: var(--tile) calc(var(--tile) * 4); background-position: var(--tile) calc(var(--tile) * 4);
} }
.icon-magic {
background-position: calc(var(--tile) * 7) 0;
}
.icon-marker { .icon-marker {
background-position: calc(var(--tile) * 3) calc(var(--tile) * 5); background-position: calc(var(--tile) * 3) calc(var(--tile) * 5);
} }

View file

@ -1,4 +1,4 @@
<svg id="svg2" width="168" height="168" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <svg id="svg2" width="192" height="192" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<defs id="defs4"> <defs id="defs4">
<clipPath id="clip0_241_10857"> <clipPath id="clip0_241_10857">
<rect id="rect586" width="18.05" height="19.01" fill="#fff"/> <rect id="rect586" width="18.05" height="19.01" fill="#fff"/>
@ -12,6 +12,9 @@
<mask id="mask0_181_11916" x="2" y="2" width="15" height="15" maskUnits="userSpaceOnUse"> <mask id="mask0_181_11916" x="2" y="2" width="15" height="15" maskUnits="userSpaceOnUse">
<path id="path1259" d="m16.04 2.3158h-14.035v14.035h14.035z" fill="#fff"/> <path id="path1259" d="m16.04 2.3158h-14.035v14.035h14.035z" fill="#fff"/>
</mask> </mask>
<clipPath id="clip0_2695_1939">
<rect id="rect1" width="20" height="20" fill="#fff"/>
</clipPath>
</defs> </defs>
<metadata id="metadata7"> <metadata id="metadata7">
<rdf:RDF> <rdf:RDF>
@ -202,5 +205,8 @@
<path id="path6-6" d="m8.5 9.3501h-3v2.39"/> <path id="path6-6" d="m8.5 9.3501h-3v2.39"/>
<path id="path7-2" d="m5.5 9.3501h3v2.39"/> <path id="path7-2" d="m5.5 9.3501h3v2.39"/>
</g> </g>
<g id="g2-67" transform="translate(170.12 814.31)" clip-path="url(#clip0_2695_1939)">
<path id="path1-5" d="m8.8453 14.83c-0.28116 0.6439-1.1722 0.6439-1.4533 0l-0.73138-1.6751c-0.65086-1.4907-1.8224-2.6774-3.2837-3.326l-2.0131-0.89358c-0.64004-0.28408-0.64004-1.2152 0-1.4993l1.9502-0.86569c1.4989-0.66535 2.6914-1.8959 3.3312-3.4375l0.74086-1.7852c0.27491-0.66247 1.1902-0.66247 1.4652 0l0.74083 1.7852c0.63972 1.5416 1.8322 2.7722 3.3311 3.4375l1.9503 0.86569c0.64 0.2841 0.64 1.2152 0 1.4993l-2.0131 0.89358c-1.4613 0.64864-2.6328 1.8353-3.2837 3.326zm-5.0624-6.6444c1.9049 0.84555 3.4537 2.2354 4.3357 4.1478 0.88202-1.9124 2.4308-3.3022 4.3356-4.1478-1.9276-0.85565-3.4813-2.3132-4.3356-4.2596-0.85434 1.9463-2.4081 3.4039-4.3357 4.2596zm12.385 10.723 0.2057-0.4714c0.3667-0.8405 1.0271-1.5098 1.8511-1.8758l0.6336-0.2816c0.3428-0.1523 0.3428-0.6504 0-0.8026l-0.5981-0.2658c-0.8453-0.3755-1.5175-1.0695-1.8779-1.9386l-0.2112-0.5094c-0.1473-0.355-0.6381-0.355-0.7853 0l-0.2112 0.5094c-0.3603 0.8691-1.0326 1.5631-1.8778 1.9386l-0.5983 0.2658c-0.3427 0.1522-0.3427 0.6503 0 0.8026l0.6337 0.2816c0.8241 0.366 1.4844 1.0353 1.8511 1.8758l0.2057 0.4714c0.1505 0.3451 0.6283 0.3451 0.7789 0zm-0.8557-3.0358 0.4687-0.4655 0.459 0.4655-0.459 0.4524z" fill="#efefef"/>
</g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 42 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg width="168" height="168" 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/"> <svg width="192" 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"> <defs id="defs4">
<clipPath id="clip0_241_10857"> <clipPath id="clip0_241_10857">
<rect width="18.049999" height="19.01" fill="#ffffff" id="rect586" x="0" y="0" /> <rect width="18.049999" height="19.01" fill="#ffffff" id="rect586" x="0" y="0" />
@ -13,23 +13,15 @@
<rect width="18" height="12.79" fill="#ffffff" id="rect4" x="0" y="0" /> <rect width="18" height="12.79" fill="#ffffff" id="rect4" x="0" y="0" />
</clipPath> </clipPath>
<mask id="mask0_181_11916" maskUnits="userSpaceOnUse" x="2" y="2" width="15" height="15"> <mask id="mask0_181_11916" maskUnits="userSpaceOnUse" x="2" y="2" width="15" height="15">
<path d="M 16.0401,2.3158 H 2.005 v 14.0351 h 14.0351 z" fill="#ffffff" id="path1259" /> <path d="m 16.0401,2.3158 h -14.0351 v 14.0351 h 14.0351 z" fill="#ffffff" id="path1259" />
</mask> </mask>
<clipPath id="clip0_2695_1939">
<rect width="20" height="20" fill="#ffffff" id="rect1" x="0" y="0" />
</clipPath>
</defs> </defs>
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="11.587678" inkscape:cx="79.049488" inkscape:cy="68.779959" 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="14.041122" inkscape:cx="165.15774" inkscape:cy="24.998002" 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 type="xygrid" id="grid3004" empspacing="4" visible="true" enabled="true" snapvisiblegridlinesonly="true" originx="0" originy="0" spacingy="1" spacingx="1" units="px" />
<sodipodi:guide orientation="-1,0" position="24,168" id="guide3084" inkscape:locked="false" inkscape:label="" inkscape:color="rgb(0,134,229)" /> <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:guide orientation="0,1" position="0,96" id="guide3086" inkscape:locked="false" inkscape:label="" inkscape:color="rgb(0,134,229)" />
<sodipodi:guide orientation="-1,0" position="48,168" id="guide3088" inkscape:locked="false" inkscape:label="" inkscape:color="rgb(0,134,229)" />
<sodipodi:guide orientation="0,1" position="0,72" id="guide3090" inkscape:locked="false" inkscape:label="" inkscape:color="rgb(0,134,229)" />
<sodipodi:guide orientation="-1,0" position="72,168" id="guide14621" inkscape:locked="false" inkscape:label="" inkscape:color="rgb(0,134,229)" />
<sodipodi:guide orientation="0,1" position="0,48" id="guide17864" inkscape:locked="false" />
<sodipodi:guide orientation="0,1" position="0,120" id="guide3026" inkscape:locked="false" inkscape:label="" inkscape:color="rgb(0,134,229)" />
<sodipodi:guide orientation="-1,0" position="96,168" id="guide3028" inkscape:locked="false" inkscape:label="" inkscape:color="rgb(0,134,229)" />
<sodipodi:guide position="120,168" orientation="-1,0" id="guide4869" inkscape:label="" inkscape:color="rgb(0,0,255)" inkscape:locked="false" />
<sodipodi:guide position="0,144" orientation="0,1" id="guide5766" inkscape:locked="false" inkscape:label="" inkscape:color="rgb(0,134,229)" />
<sodipodi:guide position="144,104" orientation="1,0" id="guide1" inkscape:locked="false" />
<sodipodi:guide position="0,24" orientation="0,1" id="guide5005" inkscape:label="" inkscape:locked="false" inkscape:color="rgb(0,134,229)" />
</sodipodi:namedview> </sodipodi:namedview>
<metadata id="metadata7"> <metadata id="metadata7">
<rdf:RDF> <rdf:RDF>
@ -40,23 +32,23 @@
</rdf:RDF> </rdf:RDF>
</metadata> </metadata>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-812.36218)"> <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-812.36218)">
<path style="fill:#f2f2f2;fill-opacity:1;stroke-width:0.25;paint-order:fill markers stroke;stroke:#999999;stroke-opacity:1" d="m 106.58891,43.849359 c -3.10089,-0.58252 -5.52944,-2.863466 -6.31937,-5.935298 -0.23482,-0.913171 -0.294235,-2.2415 -0.14177,-3.169542 0.51108,-3.110805 2.83364,-5.667956 5.86284,-6.455008 3.72982,-0.969088 7.59776,0.861664 9.2444,4.375508 0.52616,1.122793 0.76105,2.331963 0.7086,3.647677 -0.0496,1.245447 -0.28677,2.18265 -0.82249,3.250829 -1.04984,2.093266 -2.88939,3.559535 -5.24807,4.183141 -0.49134,0.129903 -0.73215,0.154443 -1.68896,0.172114 -0.81094,0.01498 -1.24691,-0.004 -1.59518,-0.06942 z m 2.43966,-5.8477 v -3.046165 h -1.02544 -1.02544 v 3.046165 3.046164 h 1.02544 1.02544 z m -0.53434,-4.563852 c 0.33094,-0.09915 0.70763,-0.444612 0.87372,-0.801282 0.4662,-1.001185 -0.2615,-2.144718 -1.36482,-2.144718 -0.44164,0 -0.73107,0.12392 -1.06527,0.456086 -0.42453,0.421956 -0.54914,0.937689 -0.37666,1.558908 0.0814,0.293275 0.60383,0.829099 0.89905,0.922151 0.28553,0.09 0.74987,0.09398 1.03398,0.0089 z" id="path6" transform="translate(0,812.36218)" /> <path style="fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:0.25;stroke-opacity:1;paint-order:fill markers stroke" d="m 106.58891,43.849359 c -3.10089,-0.58252 -5.52944,-2.863466 -6.31937,-5.935298 -0.23482,-0.913171 -0.294235,-2.2415 -0.14177,-3.169542 0.51108,-3.110805 2.83364,-5.667956 5.86284,-6.455008 3.72982,-0.969088 7.59776,0.861664 9.2444,4.375508 0.52616,1.122793 0.76105,2.331963 0.7086,3.647677 -0.0496,1.245447 -0.28677,2.18265 -0.82249,3.250829 -1.04984,2.093266 -2.88939,3.559535 -5.24807,4.183141 -0.49134,0.129903 -0.73215,0.154443 -1.68896,0.172114 -0.81094,0.01498 -1.24691,-0.004 -1.59518,-0.06942 z m 2.43966,-5.8477 v -3.046165 h -1.02544 -1.02544 v 3.046165 3.046164 h 1.02544 1.02544 z m -0.53434,-4.563852 c 0.33094,-0.09915 0.70763,-0.444612 0.87372,-0.801282 0.4662,-1.001185 -0.2615,-2.144718 -1.36482,-2.144718 -0.44164,0 -0.73107,0.12392 -1.06527,0.456086 -0.42453,0.421956 -0.54914,0.937689 -0.37666,1.558908 0.0814,0.293275 0.60383,0.829099 0.89905,0.922151 0.28553,0.09 0.74987,0.09398 1.03398,0.0089 z" id="path6" transform="translate(0,812.36218)" />
<text xml:space="preserve" style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" x="5.7867966" y="897.80786" id="text4457"><tspan y="897.80786" x="5.7867966" sodipodi:role="line" id="tspan4459" style="font-size:40px;line-height:1.25;font-family:sans-serif"> </tspan></text> <text xml:space="preserve" style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" x="5.7867966" y="897.80786" id="text4457"><tspan y="897.80786" x="5.7867966" sodipodi:role="line" id="tspan4459" style="font-size:40px;line-height:1.25;font-family:sans-serif"> </tspan></text>
<g id="g3001" transform="translate(-23.255701,-119.38651)"> <g id="g3001" transform="translate(-23.255701,-119.38651)">
<path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:#999999;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 35.255701,935.74851 c -4.412356,0 -8.00014,3.58778 -8.00014,8.00014 0,4.41235 3.587784,8.00014 8.00014,8.00014 4.412356,0 8.00014,-3.58779 8.00014,-8.00014 0,-4.41236 -3.587784,-8.00014 -8.00014,-8.00014 z m 0,1.00028 c 3.871916,0 6.99986,3.12794 6.99986,6.99986 0,3.87191 -3.127944,6.99986 -6.99986,6.99986 -3.871916,0 -6.999861,-3.12795 -6.999861,-6.99986 0,-3.87192 3.127945,-6.99986 6.999861,-6.99986 z" id="path3014" inkscape:connector-curvature="0" /> <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:#999999;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 35.255701,935.74851 c -4.412356,0 -8.00014,3.58778 -8.00014,8.00014 0,4.41235 3.587784,8.00014 8.00014,8.00014 4.412356,0 8.00014,-3.58779 8.00014,-8.00014 0,-4.41236 -3.587784,-8.00014 -8.00014,-8.00014 z m 0,1.00028 c 3.871916,0 6.99986,3.12794 6.99986,6.99986 0,3.87191 -3.127944,6.99986 -6.99986,6.99986 -3.871916,0 -6.999861,-3.12795 -6.999861,-6.99986 0,-3.87192 3.127945,-6.99986 6.999861,-6.99986 z" id="path3014" inkscape:connector-curvature="0" />
<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" transform="translate(27.255701,-100.61365)"> <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" transform="translate(27.255701,-100.61365)">
<path inkscape:connector-curvature="0" id="path3789" style="font-weight:bold;font-size:12px;-inkscape-font-specification:'Sans Bold';fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 9,1046.0464 H 6.6301966 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 9 v 2.342 H 6.6301966 v -2.342" sodipodi:nodetypes="ccsccccccsccccsccccccccccccc" /> <path inkscape:connector-curvature="0" id="path3789" style="font-weight:bold;font-size:12px;-inkscape-font-specification:'Sans Bold';fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" 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>
</g> </g>
<path style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 78,819.36214 v 2 h 12 v -2 z m 0,3 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z" id="table" inkscape:connector-curvature="0" inkscape:label="table" inkscape:export-filename="/home/ybon/Code/js/leaflet-storage/src/img/browse-data.png" inkscape:export-xdpi="89.996864" inkscape:export-ydpi="89.996864" /> <path style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 78,819.36214 v 2 h 12 v -2 z m 0,3 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z" id="table" inkscape:connector-curvature="0" inkscape:label="table" inkscape:export-filename="/home/ybon/Code/js/leaflet-storage/src/img/browse-data.png" inkscape:export-xdpi="89.996864" inkscape:export-ydpi="89.996864" />
<path style="fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 35,843.36202 v 4 h -4 v 2 h 4 v 4 h 2 v -4 h 4 v -2 h -4 v -4 z" id="rect5280" inkscape:export-filename="/home/ybon/Code/js/leaflet-storage/src/img/add-layer-grey-18.png" inkscape:export-xdpi="89.996864" inkscape:export-ydpi="89.996864" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccc" /> <path style="fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 35,843.36202 v 4 h -4 v 2 h 4 v 4 h 2 v -4 h 4 v -2 h -4 v -4 z" id="rect5280" inkscape:export-filename="/home/ybon/Code/js/leaflet-storage/src/img/add-layer-grey-18.png" inkscape:export-xdpi="89.996864" inkscape:export-ydpi="89.996864" inkscape:connector-curvature="0" sodipodi:nodetypes="ccccccccccccc" />
<path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 13.517525,866.362 c -2.466762,0 -4.48249,2.0158 -4.48249,4.4826 0,0.8297 0.233748,1.5964 0.63035,2.26462 l -3.66537,3.66532 1.587549,1.5876 3.66537,-3.66542 c 0.668139,0.3966 1.434831,0.6303 2.264591,0.6303 2.466762,0 4.48249,-2.0157 4.48249,-4.48242 0,-2.4668 -2.015728,-4.4826 -4.48249,-4.4826 z m 0,1.4943 c 1.659256,0 2.988326,1.329 2.988326,2.9883 0,1.6592 -1.32907,2.98832 -2.988326,2.98832 -1.659256,0 -2.988326,-1.32912 -2.988326,-2.98832 0,-1.6593 1.32907,-2.9883 2.988326,-2.9883 z m 0,1.4941 c -0.816354,0 -1.494163,0.6779 -1.494163,1.4942 0,0.8163 0.677809,1.4942 1.494163,1.4942 0.816354,0 1.494163,-0.6779 1.494163,-1.4942 0,-0.8163 -0.677809,-1.4942 -1.494163,-1.4942 z" id="path4354" inkscape:export-filename="/home/ybon/Code/js/leaflet-storage/src/img/zoom_to.png" inkscape:export-xdpi="89.996864" inkscape:export-ydpi="89.996864" inkscape:connector-curvature="0" /> <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate" d="m 13.517525,866.362 c -2.466762,0 -4.48249,2.0158 -4.48249,4.4826 0,0.8297 0.233748,1.5964 0.63035,2.26462 l -3.66537,3.66532 1.587549,1.5876 3.66537,-3.66542 c 0.668139,0.3966 1.434831,0.6303 2.264591,0.6303 2.466762,0 4.48249,-2.0157 4.48249,-4.48242 0,-2.4668 -2.015728,-4.4826 -4.48249,-4.4826 z m 0,1.4943 c 1.659256,0 2.988326,1.329 2.988326,2.9883 0,1.6592 -1.32907,2.98832 -2.988326,2.98832 -1.659256,0 -2.988326,-1.32912 -2.988326,-2.98832 0,-1.6593 1.32907,-2.9883 2.988326,-2.9883 z m 0,1.4941 c -0.816354,0 -1.494163,0.6779 -1.494163,1.4942 0,0.8163 0.677809,1.4942 1.494163,1.4942 0.816354,0 1.494163,-0.6779 1.494163,-1.4942 0,-0.8163 -0.677809,-1.4942 -1.494163,-1.4942 z" id="path4354" inkscape:export-filename="/home/ybon/Code/js/leaflet-storage/src/img/zoom_to.png" inkscape:export-xdpi="89.996864" inkscape:export-ydpi="89.996864" inkscape:connector-curvature="0" />
<path id="path4392" d="m 37.51751,866.36205 c -2.466762,0 -4.482491,2.0157 -4.482491,4.4825 0,0.8298 0.233749,1.5964 0.630351,2.2645 L 30,876.77459 l 1.587549,1.5875 3.665369,-3.66544 c 0.668139,0.39662 1.434831,0.63042 2.264592,0.63042 2.466762,0 4.48249,-2.01572 4.48249,-4.48252 0,-2.4668 -2.015728,-4.4825 -4.48249,-4.4825 z m 0,1.4942 c 1.659256,0 2.988327,1.329 2.988327,2.9883 0,1.6593 -1.329071,2.9883 -2.988327,2.9883 -1.659256,0 -2.988327,-1.329 -2.988327,-2.9883 0,-1.6593 1.329071,-2.9883 2.988327,-2.9883 z m 0,1.4941 c -0.816355,0 -1.494164,0.6779 -1.494164,1.4942 0,0.8163 0.677809,1.4942 1.494164,1.4942 0.816355,0 1.494163,-0.6779 1.494163,-1.4942 0,-0.8163 -0.677808,-1.4942 -1.494163,-1.4942 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" inkscape:connector-curvature="0" inkscape:export-filename="/home/ybon/Code/js/leaflet-storage/src/img/zoom_to-off.png" inkscape:export-xdpi="89.996864" inkscape:export-ydpi="89.996864" /> <path id="path4392" d="m 37.51751,866.36205 c -2.466762,0 -4.482491,2.0157 -4.482491,4.4825 0,0.8298 0.233749,1.5964 0.630351,2.2645 l -3.66537,3.66554 1.587549,1.5875 3.665369,-3.66544 c 0.668139,0.39662 1.434831,0.63042 2.264592,0.63042 2.466762,0 4.48249,-2.01572 4.48249,-4.48252 0,-2.4668 -2.015728,-4.4825 -4.48249,-4.4825 z m 0,1.4942 c 1.659256,0 2.988327,1.329 2.988327,2.9883 0,1.6593 -1.329071,2.9883 -2.988327,2.9883 -1.659256,0 -2.988327,-1.329 -2.988327,-2.9883 0,-1.6593 1.329071,-2.9883 2.988327,-2.9883 z m 0,1.4941 c -0.816355,0 -1.494164,0.6779 -1.494164,1.4942 0,0.8163 0.677809,1.4942 1.494164,1.4942 0.816355,0 1.494163,-0.6779 1.494163,-1.4942 0,-0.8163 -0.677808,-1.4942 -1.494163,-1.4942 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#b3b3b3;fill-opacity:1;stroke:none;stroke-width:3;marker:none;enable-background:accumulate" inkscape:connector-curvature="0" inkscape:export-filename="/home/ybon/Code/js/leaflet-storage/src/img/zoom_to-off.png" inkscape:export-xdpi="89.996864" inkscape:export-ydpi="89.996864" />
<path style="fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 54,819.36214 v 2 h 12 v -2 z m 0,3 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z" id="table-5" inkscape:connector-curvature="0" inkscape:label="table" inkscape:export-filename="/home/ybon/Code/js/leaflet-storage/src/img/browse-data.png" inkscape:export-xdpi="89.996864" inkscape:export-ydpi="89.996864" /> <path style="fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 54,819.36214 v 2 h 12 v -2 z m 0,3 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z m -5,2 v 1 h 4 v -1 z m 5,0 v 1 h 7 v -1 z" id="table-5" inkscape:connector-curvature="0" inkscape:label="table" inkscape:export-filename="/home/ybon/Code/js/leaflet-storage/src/img/browse-data.png" inkscape:export-xdpi="89.996864" inkscape:export-ydpi="89.996864" />
<g transform="translate(32,-48.000118)" 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" id="text3784-6" /> <g transform="translate(32,-48.000118)" 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" id="text3784-6" />
<path style="fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 63.71429,866.36213 -1.14285,1.14286 2.28571,2.28572 L 66,868.64785 Z M 62,868.07641 l -6.285714,6.28574 2.285715,2.2857 6.285719,-6.28572 z M 55.714286,874.36215 54,878.36214 l 4.000001,-1.71429 z" id="path3684" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccc" /> <path style="fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 63.71429,866.36213 -1.14285,1.14286 2.28571,2.28572 1.14285,-1.14286 z m -1.71429,1.71428 -6.285714,6.28574 2.285715,2.2857 6.285719,-6.28572 z m -6.285714,6.28574 -1.714286,3.99999 4.000001,-1.71429 z" id="path3684" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccc" />
<text xml:space="preserve" style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" x="41.647079" y="916.79706" id="text4457-6"><tspan y="916.79706" x="41.647079" sodipodi:role="line" id="tspan4459-6" style="font-size:30.4762px;line-height:1.25;font-family:sans-serif"> </tspan></text> <text xml:space="preserve" style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" x="41.647079" y="916.79706" id="text4457-6"><tspan y="916.79706" x="41.647079" sodipodi:role="line" id="tspan4459-6" style="font-size:30.4762px;line-height:1.25;font-family:sans-serif"> </tspan></text>
<path style="fill:#b3b3b3;fill-opacity:1;stroke:none" d="m 63.71429,890.36216 -1.14285,1.1428 2.28571,2.2858 L 66,892.64786 Z M 62,892.07646 55.714286,898.36218 58,900.64788 l 6.28572,-6.2857 z m -6.285714,6.28572 -1.714286,4 4,-1.7143 z" id="path3684-2" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccc" /> <path style="fill:#b3b3b3;fill-opacity:1;stroke:none" d="m 63.71429,890.36216 -1.14285,1.1428 2.28571,2.2858 1.14285,-1.1429 z m -1.71429,1.7143 -6.285714,6.28572 2.285714,2.2857 6.28572,-6.2857 z m -6.285714,6.28572 -1.714286,4 4,-1.7143 z" id="path3684-2" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccccc" />
<g id="g4717" transform="translate(-54.789185,-114.477)"> <g id="g4717" transform="translate(-54.789185,-114.477)">
<path style="fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 141.26953,173.42383 -6.75586,2.67969 0.95313,6.3457 5.87109,3.12695 4.14844,-7.87305 z m -1.44726,2.48828 2.99023,1.60156 -0.5918,2.43164 -3.35742,1.50391 -1.73828,-3.81055 z" transform="translate(-1.210815,854.83918)" id="path3862" inkscape:connector-curvature="0" /> <path style="fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 141.26953,173.42383 -6.75586,2.67969 0.95313,6.3457 5.87109,3.12695 4.14844,-7.87305 z m -1.44726,2.48828 2.99023,1.60156 -0.5918,2.43164 -3.35742,1.50391 -1.73828,-3.81055 z" transform="translate(-1.210815,854.83918)" id="path3862" inkscape:connector-curvature="0" />
</g> </g>
@ -82,7 +74,7 @@
<path inkscape:connector-curvature="0" id="path4353-1-6-1-3-3-9" transform="matrix(1.9000195,0,0,1.9000195,-245.02393,606.04174)" d="m 222.11328,179.64258 -1.04883,1.04883 1.58203,1.58007 -1.58203,1.58204 1.04883,1.04687 1.58203,-1.58008 1.58008,1.58008 1.04883,-1.04687 -1.58203,-1.58204 1.58203,-1.58007 -1.04883,-1.04883 -1.58008,1.58008 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.81628;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> <path inkscape:connector-curvature="0" id="path4353-1-6-1-3-3-9" transform="matrix(1.9000195,0,0,1.9000195,-245.02393,606.04174)" d="m 222.11328,179.64258 -1.04883,1.04883 1.58203,1.58007 -1.58203,1.58204 1.04883,1.04687 1.58203,-1.58008 1.58008,1.58008 1.04883,-1.04687 -1.58203,-1.58204 1.58203,-1.58007 -1.04883,-1.04883 -1.58008,1.58008 z" style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.81628;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g> </g>
</g> </g>
<path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 108.14555,816.36218 v 3.8267 H 112 v -3.8267 z m 0.51755,4.35174 -1.24591,2.31321 1.16687,0.61848 1.24404,-2.31507 z m -1.86888,3.47168 -0.27666,0.51571 h -2.42597 v 2.24408 L 100,831.00938 l 1.36261,1.3528 3.86198,-3.83417 h 2.72145 v -3.6959 l 0.015,-0.028 -0.015,-0.008 v -0.0953 h -0.17879 l -0.97303,-0.51571 z" id="path4873" inkscape:connector-curvature="0" /> <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 108.14555,816.36218 v 3.8267 h 3.85445 v -3.8267 z m 0.51755,4.35174 -1.24591,2.31321 1.16687,0.61848 1.24404,-2.31507 z m -1.86888,3.47168 -0.27666,0.51571 h -2.42597 v 2.24408 l -4.09159,4.06399 1.36261,1.3528 3.86198,-3.83417 h 2.72145 v -3.6959 l 0.015,-0.028 -0.015,-0.008 v -0.0953 h -0.17879 l -0.97303,-0.51571 z" id="path4873" inkscape:connector-curvature="0" />
<g id="g4244" transform="matrix(0.51357238,-0.54309229,0.54309229,0.51357238,-518.0199,506.22551)"> <g id="g4244" transform="matrix(0.51357238,-0.54309229,0.54309229,0.51357238,-518.0199,506.22551)">
<path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:#999999;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 220.49219,133.52344 c -0.33017,0.01 -0.66239,0.0456 -0.99414,0.10742 -2.22487,0.41425 -4.02666,1.95747 -4.83203,4.00976 l -0.87696,-1.8164 a 0.50004998,0.50004998 0 0 0 -0.83398,-0.11328 0.50004998,0.50004998 0 0 0 -0.0664,0.54883 l 1.45899,3.01953 a 0.50004998,0.50004998 0 0 0 0.60742,0.25586 l 2.84375,-0.94532 a 0.50028339,0.50028339 0 1 0 -0.31641,-0.94922 l -2.00195,0.66797 c 0.61312,-1.89015 2.20733,-3.32407 4.20117,-3.69531 2.24744,-0.41845 4.51458,0.59912 5.69531,2.55664 1.18073,1.95754 1.02202,4.43774 -0.39648,6.23047 -1.41851,1.79275 -3.79606,2.51535 -5.97266,1.81641 a 0.50004998,0.50004998 0 1 0 -0.30469,0.95117 c 2.57038,0.82539 5.38736,-0.0294 7.0625,-2.14649 0.4188,-0.52924 0.74532,-1.11137 0.97657,-1.7207 0.69373,-1.828 0.53599,-3.91467 -0.50977,-5.64844 -1.22005,-2.02271 -3.42908,-3.19767 -5.74023,-3.1289 z" transform="matrix(0.91921787,0.9720541,-0.9720541,0.91921787,152.1356,647.93271)" id="path4240" inkscape:connector-curvature="0" /> <path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:#999999;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 220.49219,133.52344 c -0.33017,0.01 -0.66239,0.0456 -0.99414,0.10742 -2.22487,0.41425 -4.02666,1.95747 -4.83203,4.00976 l -0.87696,-1.8164 a 0.50004998,0.50004998 0 0 0 -0.83398,-0.11328 0.50004998,0.50004998 0 0 0 -0.0664,0.54883 l 1.45899,3.01953 a 0.50004998,0.50004998 0 0 0 0.60742,0.25586 l 2.84375,-0.94532 a 0.50028339,0.50028339 0 1 0 -0.31641,-0.94922 l -2.00195,0.66797 c 0.61312,-1.89015 2.20733,-3.32407 4.20117,-3.69531 2.24744,-0.41845 4.51458,0.59912 5.69531,2.55664 1.18073,1.95754 1.02202,4.43774 -0.39648,6.23047 -1.41851,1.79275 -3.79606,2.51535 -5.97266,1.81641 a 0.50004998,0.50004998 0 1 0 -0.30469,0.95117 c 2.57038,0.82539 5.38736,-0.0294 7.0625,-2.14649 0.4188,-0.52924 0.74532,-1.11137 0.97657,-1.7207 0.69373,-1.828 0.53599,-3.91467 -0.50977,-5.64844 -1.22005,-2.02271 -3.42908,-3.19767 -5.74023,-3.1289 z" transform="matrix(0.91921787,0.9720541,-0.9720541,0.91921787,152.1356,647.93271)" id="path4240" inkscape:connector-curvature="0" />
</g> </g>
@ -153,53 +145,53 @@
<path id="polygon" style="fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="m 29,888.36218 v 2 h 0.927734 l -0.855468,12 h -1.072266 v 2 h 2 v -1.19922 l 8,-1.60156 v 0.80078 h 2 v -2 h -0.777344 l 1.554688,-7 h 1.222656 v -2 h -2 v 0.72656 l -9,-2.45312 v -1.27344 z" /> <path id="polygon" style="fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:#999999;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="m 29,888.36218 v 2 h 0.927734 l -0.855468,12 h -1.072266 v 2 h 2 v -1.19922 l 8,-1.60156 v 0.80078 h 2 v -2 h -0.777344 l 1.554688,-7 h 1.222656 v -2 h -2 v 0.72656 l -9,-2.45312 v -1.27344 z" />
<path id="marker" d="m 84,936.36218 c -2.625,0 -5.25,1.70216 -6,5.1064 0,2.04256 1.5,6.12768 6,10.8936 4.5,-4.76592 6,-8.85104 6,-10.8936 -0.75,-3.40424 -3.375,-5.1064 -6,-5.1064 z m 0,2.38304 c 1.656857,0 3,1.21928 3,2.72336 0,1.50408 -1.343143,2.72344 -3,2.72344 -1.656848,0 -3,-1.21936 -3,-2.72344 0,-1.50408 1.343152,-2.72336 3,-2.72336 z" style="fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" inkscape:connector-curvature="0" /> <path id="marker" d="m 84,936.36218 c -2.625,0 -5.25,1.70216 -6,5.1064 0,2.04256 1.5,6.12768 6,10.8936 4.5,-4.76592 6,-8.85104 6,-10.8936 -0.75,-3.40424 -3.375,-5.1064 -6,-5.1064 z m 0,2.38304 c 1.656857,0 3,1.21928 3,2.72336 0,1.50408 -1.343143,2.72344 -3,2.72344 -1.656848,0 -3,-1.21936 -3,-2.72344 0,-1.50408 1.343152,-2.72336 3,-2.72336 z" style="fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" inkscape:connector-curvature="0" />
<g transform="matrix(0.16294606,0,0,0.16295934,27.835262,912.23132)" id="settings" style="fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:1.49736;stroke-miterlimit:4;stroke-dasharray:none" class="sprite"> <g transform="matrix(0.16294606,0,0,0.16295934,27.835262,912.23132)" id="settings" style="fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:1.49736;stroke-miterlimit:4;stroke-dasharray:none" class="sprite">
<path inkscape:connector-curvature="0" d="M 98.762,43.652 C 98.576,42.266 97.281,41.07 95.886,40.993 l -6.172,-0.337 c -1.395,-0.076 -2.899,-1.224 -3.341,-2.55 l -2.28,-5.518 c -0.629,-1.249 -0.379,-3.121 0.553,-4.161 l 4.122,-4.6 c 0.933,-1.042 0.962,-2.77 0.066,-3.842 l -8.813,-8.813 c -1.073,-0.897 -2.803,-0.867 -3.845,0.065 l -4.598,4.122 c -1.039,0.934 -2.915,1.182 -4.161,0.551 l -5.521,-2.279 c -1.324,-0.442 -2.472,-1.945 -2.549,-3.34 L 59.01,4.121 C 58.933,2.725 57.738,1.43 56.351,1.243 c 0,0 -3.252,-0.44 -6.248,-0.44 -2.991,0 -6.243,0.44 -6.243,0.44 -1.386,0.188 -2.582,1.483 -2.658,2.878 l -0.338,6.17 c -0.076,1.396 -1.224,2.898 -2.551,3.34 l -5.517,2.279 c -1.249,0.631 -3.122,0.382 -4.161,-0.551 l -4.601,-4.122 c -1.042,-0.932 -2.769,-0.962 -3.842,-0.065 l -8.813,8.813 c -0.897,1.073 -0.867,2.801 0.066,3.842 l 4.122,4.6 c 0.933,1.041 1.182,2.913 0.551,4.161 l -2.279,5.518 c -0.442,1.326 -1.946,2.474 -3.34,2.55 l -6.17,0.337 c -1.396,0.077 -2.691,1.272 -2.879,2.659 0,0 -0.439,3.253 -0.439,6.243 0,2.99 0.44,6.24 0.44,6.24 0.188,1.389 1.483,2.582 2.879,2.659 l 6.169,0.339 c 1.396,0.075 2.898,1.225 3.341,2.549 l 2.278,5.517 c 0.631,1.248 0.381,3.122 -0.551,4.163 l -4.122,4.598 c -0.933,1.042 -0.963,2.771 -0.066,3.845 l 8.814,8.813 c 1.073,0.896 2.801,0.866 3.842,-0.066 l 4.6,-4.122 c 1.041,-0.932 2.913,-1.182 4.161,-0.553 l 5.517,2.28 c 1.327,0.441 2.475,1.946 2.55,3.343 l 0.338,6.168 c 0.076,1.395 1.272,2.692 2.658,2.88 0,0 3.252,0.439 6.244,0.439 2.996,0 6.25,-0.439 6.25,-0.439 1.385,-0.188 2.58,-1.485 2.657,-2.88 L 59.347,89.5 c 0.077,-1.396 1.225,-2.901 2.551,-3.343 l 5.517,-2.28 c 1.248,-0.629 3.122,-0.379 4.163,0.553 l 4.598,4.122 c 1.042,0.933 2.771,0.964 3.843,0.067 l 8.815,-8.814 C 89.73,78.732 89.7,77.002 88.768,75.96 l -4.122,-4.598 c -0.932,-1.041 -1.182,-2.915 -0.553,-4.163 l 2.28,-5.517 c 0.441,-1.324 1.946,-2.474 3.341,-2.549 l 6.172,-0.339 c 1.395,-0.077 2.692,-1.271 2.876,-2.659 0,0 0.441,-3.25 0.441,-6.24 0,-2.99 -0.441,-6.243 -0.441,-6.243 z M 50.104,62.361 c -6.886,0 -12.468,-5.585 -12.468,-12.467 0,-6.885 5.582,-12.467 12.468,-12.467 6.89,0 12.475,5.582 12.475,12.467 -10e-4,6.882 -5.586,12.467 -12.475,12.467 z" id="path27812" style="fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:1.49736;stroke-miterlimit:4;stroke-dasharray:none" /> <path inkscape:connector-curvature="0" d="m 98.762,43.652 c -0.186,-1.386 -1.481,-2.582 -2.876,-2.659 l -6.172,-0.337 c -1.395,-0.076 -2.899,-1.224 -3.341,-2.55 l -2.28,-5.518 c -0.629,-1.249 -0.379,-3.121 0.553,-4.161 l 4.122,-4.6 c 0.933,-1.042 0.962,-2.77 0.066,-3.842 l -8.813,-8.813 c -1.073,-0.897 -2.803,-0.867 -3.845,0.065 l -4.598,4.122 c -1.039,0.934 -2.915,1.182 -4.161,0.551 l -5.521,-2.279 c -1.324,-0.442 -2.472,-1.945 -2.549,-3.34 l -0.337,-6.17 c -0.077,-1.396 -1.272,-2.691 -2.659,-2.878 0,0 -3.252,-0.44 -6.248,-0.44 -2.991,0 -6.243,0.44 -6.243,0.44 -1.386,0.188 -2.582,1.483 -2.658,2.878 l -0.338,6.17 c -0.076,1.396 -1.224,2.898 -2.551,3.34 l -5.517,2.279 c -1.249,0.631 -3.122,0.382 -4.161,-0.551 l -4.601,-4.122 c -1.042,-0.932 -2.769,-0.962 -3.842,-0.065 l -8.813,8.813 c -0.897,1.073 -0.867,2.801 0.066,3.842 l 4.122,4.6 c 0.933,1.041 1.182,2.913 0.551,4.161 l -2.279,5.518 c -0.442,1.326 -1.946,2.474 -3.34,2.55 l -6.17,0.337 c -1.396,0.077 -2.691,1.272 -2.879,2.659 0,0 -0.439,3.253 -0.439,6.243 0,2.99 0.44,6.24 0.44,6.24 0.188,1.389 1.483,2.582 2.879,2.659 l 6.169,0.339 c 1.396,0.075 2.898,1.225 3.341,2.549 l 2.278,5.517 c 0.631,1.248 0.381,3.122 -0.551,4.163 l -4.122,4.598 c -0.933,1.042 -0.963,2.771 -0.066,3.845 l 8.814,8.813 c 1.073,0.896 2.801,0.866 3.842,-0.066 l 4.6,-4.122 c 1.041,-0.932 2.913,-1.182 4.161,-0.553 l 5.517,2.28 c 1.327,0.441 2.475,1.946 2.55,3.343 l 0.338,6.168 c 0.076,1.395 1.272,2.692 2.658,2.88 0,0 3.252,0.439 6.244,0.439 2.996,0 6.25,-0.439 6.25,-0.439 1.385,-0.188 2.58,-1.485 2.657,-2.88 l 0.337,-6.168 c 0.077,-1.396 1.225,-2.901 2.551,-3.343 l 5.517,-2.28 c 1.248,-0.629 3.122,-0.379 4.163,0.553 l 4.598,4.122 c 1.042,0.933 2.771,0.964 3.843,0.067 l 8.815,-8.814 c 0.896,-1.073 0.866,-2.803 -0.066,-3.845 l -4.122,-4.598 c -0.932,-1.041 -1.182,-2.915 -0.553,-4.163 l 2.28,-5.517 c 0.441,-1.324 1.946,-2.474 3.341,-2.549 l 6.172,-0.339 c 1.395,-0.077 2.692,-1.271 2.876,-2.659 0,0 0.441,-3.25 0.441,-6.24 0,-2.99 -0.441,-6.243 -0.441,-6.243 z m -48.658,18.709 c -6.886,0 -12.468,-5.585 -12.468,-12.467 0,-6.885 5.582,-12.467 12.468,-12.467 6.89,0 12.475,5.582 12.475,12.467 -10e-4,6.882 -5.586,12.467 -12.475,12.467 z" id="path27812" style="fill:#f2f2f2;fill-opacity:1;stroke:#999999;stroke-width:1.49736;stroke-miterlimit:4;stroke-dasharray:none" />
</g> </g>
<g clip-path="url(#clip0_241_10857)" id="undo" transform="matrix(0.71300568,0,0,0.66260978,53.493751,938.13028)" style="fill:none;stroke:#f2f2f2;stroke-width:1.45488;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"> <g clip-path="url(#clip0_241_10857)" id="undo" transform="matrix(0.71300568,0,0,0.66260978,53.493751,938.13028)" style="fill:none;stroke:#f2f2f2;stroke-width:1.45488;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1">
<path d="M 1.07001,4.41003 H 10.49 c 0.9234,-0.0066 1.8391,0.16957 2.6941,0.5184 0.8551,0.34883 1.6327,0.8634 2.288,1.51407 0.6553,0.65067 1.1754,1.42458 1.5303,2.27713 0.3549,0.85256 0.5376,1.76697 0.5376,2.69037 0.0067,0.9277 -0.1712,1.8474 -0.5231,2.7058 -0.3519,0.8583 -0.871,1.6382 -1.527,2.2941 -0.656,0.656 -1.4358,1.1751 -2.2941,1.527 -0.8584,0.352 -1.7781,0.5298 -2.7058,0.5231 H 1.07001" stroke="#f2f2f2" stroke-miterlimit="10" id="path580" style="fill:none;stroke:#f2f2f2;stroke-width:1.45486;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" /> <path d="m 1.07001,4.41003 h 9.41999 c 0.9234,-0.0066 1.8391,0.16957 2.6941,0.5184 0.8551,0.34883 1.6327,0.8634 2.288,1.51407 0.6553,0.65067 1.1754,1.42458 1.5303,2.27713 0.3549,0.85256 0.5376,1.76697 0.5376,2.69037 0.0067,0.9277 -0.1712,1.8474 -0.5231,2.7058 -0.3519,0.8583 -0.871,1.6382 -1.527,2.2941 -0.656,0.656 -1.4358,1.1751 -2.2941,1.527 -0.8584,0.352 -1.7781,0.5298 -2.7058,0.5231 h -9.41999" stroke="#f2f2f2" stroke-miterlimit="10" id="path580" style="fill:none;stroke:#f2f2f2;stroke-width:1.45486;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" />
<path d="M 4.75002,8.44998 0.710022,4.39998 4.75002,0.349976" stroke="#f2f2f2" stroke-miterlimit="10" id="path582" style="fill:none;stroke:#f2f2f2;stroke-width:1.45486;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" /> <path d="m 4.75002,8.44998 -4.039998,-4.05 4.039998,-4.050004" stroke="#f2f2f2" stroke-miterlimit="10" id="path582" style="fill:none;stroke:#f2f2f2;stroke-width:1.45486;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" />
</g> </g>
<g id="g1" transform="translate(144,-24.00004)"> <g id="g1" transform="translate(144,-24.00004)">
<path d="m 9,849.93721 v 4.04997 c 0,0.20708 0.167895,0.375 0.375,0.375 h 5.25 c 0.207075,0 0.375,-0.16792 0.375,-0.375 v -4.04997 c 0,-0.20708 -0.167925,-0.375 -0.375,-0.375 h -5.25 c -0.207105,0 -0.375,0.16792 -0.375,0.375 z" stroke="#f2f2f2" id="path438" style="fill:none;stroke:#999999;stroke-width:0.999997;stroke-opacity:1" /> <path d="m 9,849.93721 v 4.04997 c 0,0.20708 0.167895,0.375 0.375,0.375 h 5.25 c 0.207075,0 0.375,-0.16792 0.375,-0.375 v -4.04997 c 0,-0.20708 -0.167925,-0.375 -0.375,-0.375 h -5.25 c -0.207105,0 -0.375,0.16792 -0.375,0.375 z" stroke="#f2f2f2" id="path438" style="fill:none;stroke:#999999;stroke-width:0.999997;stroke-opacity:1" />
<path d="M 15.21255,842.36218 H 6.375 c -0.207105,0 -0.375,0.1679 -0.375,0.37499 v 11.24993 c 0,0.20708 0.167895,0.375 0.375,0.375 h 11.25 c 0.207075,0 0.375,-0.16792 0.375,-0.375 v -8.67664 c 0,-0.0953 -0.0363,-0.18697 -0.1014,-0.25648 l -2.41245,-2.57327 c -0.07095,-0.0756 -0.16995,-0.11853 -0.2736,-0.11853 z" stroke="#f2f2f2" id="save" style="fill:none;stroke:#999999;stroke-width:0.999997;stroke-opacity:1" /> <path d="m 15.21255,842.36218 h -8.83755 c -0.207105,0 -0.375,0.1679 -0.375,0.37499 v 11.24993 c 0,0.20708 0.167895,0.375 0.375,0.375 h 11.25 c 0.207075,0 0.375,-0.16792 0.375,-0.375 v -8.67664 c 0,-0.0953 -0.0363,-0.18697 -0.1014,-0.25648 l -2.41245,-2.57327 c -0.07095,-0.0756 -0.16995,-0.11853 -0.2736,-0.11853 z" stroke="#f2f2f2" id="save" style="fill:none;stroke:#999999;stroke-width:0.999997;stroke-opacity:1" />
</g> </g>
<path id="close" style="color:#000000;fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.188976;stroke-dasharray:none;stroke-opacity:1" d="m 32.353516,820.00866 -0.707032,0.70704 3.646485,3.64648 -3.646485,3.64648 0.707032,0.70704 L 36,825.06921 l 3.646484,3.64649 0.707032,-0.70704 -3.646485,-3.64648 3.646485,-3.64648 -0.707032,-0.70704 L 36,823.65515 Z" /> <path id="close" style="color:#000000;fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.188976;stroke-dasharray:none;stroke-opacity:1" d="m 32.353516,820.00866 -0.707032,0.70704 3.646485,3.64648 -3.646485,3.64648 0.707032,0.70704 3.646484,-3.64649 3.646484,3.64649 0.707032,-0.70704 -3.646485,-3.64648 3.646485,-3.64648 -0.707032,-0.70704 -3.646484,3.64649 z" />
<g clip-path="url(#clip0_576_2753)" id="eye" transform="translate(51,843.33202)"> <g clip-path="url(#clip0_576_2753)" id="eye" transform="translate(51,843.33202)">
<path d="m 9,1 c 3.06,0 6.26,2.74 7.6,4.03 C 15.26,6.33 12.06,9.06 9,9.06 5.94,9.06 2.74,6.33 1.4,5.03 2.74,3.74 5.93,1 9,1 Z M 9,0 C 4.5,0 0,5.03 0,5.03 c 0,0 4.5,5.03 9,5.03 4.5,0 9,-5.03 9,-5.03 C 18,5.03 13.5,0 9,0 Z" fill="#f2f2f2" id="path1" /> <path d="m 9,1 c 3.06,0 6.26,2.74 7.6,4.03 -1.34,1.3 -4.54,4.03 -7.6,4.03 -3.06,0 -6.26,-2.73 -7.6,-4.03 1.34,-1.29 4.53,-4.03 7.6,-4.03 z m 0,-1 c -4.5,0 -9,5.03 -9,5.03 0,0 4.5,5.03 9,5.03 4.5,0 9,-5.03 9,-5.03 0,0 -4.5,-5.03 -9,-5.03 z" fill="#f2f2f2" id="path1" />
<path d="m 8.99999,3.64001 c 0.77,0 1.39001,0.63 1.39001,1.39 0,0.76 -0.63001,1.39 -1.39001,1.39 -0.76,0 -1.39,-0.63 -1.39,-1.39 0,-0.76 0.63,-1.39 1.39,-1.39 z m 0,-1 c -1.32,0 -2.39,1.07 -2.39,2.39 0,1.32 1.07,2.39 2.39,2.39 1.32001,0 2.39001,-1.07 2.39001,-2.39 0,-1.32 -1.07,-2.39 -2.39001,-2.39 z" fill="#f2f2f2" id="path2" /> <path d="m 8.99999,3.64001 c 0.77,0 1.39001,0.63 1.39001,1.39 0,0.76 -0.63001,1.39 -1.39001,1.39 -0.76,0 -1.39,-0.63 -1.39,-1.39 0,-0.76 0.63,-1.39 1.39,-1.39 z m 0,-1 c -1.32,0 -2.39,1.07 -2.39,2.39 0,1.32 1.07,2.39 2.39,2.39 1.32001,0 2.39001,-1.07 2.39001,-2.39 0,-1.32 -1.07,-2.39 -2.39001,-2.39 z" fill="#f2f2f2" id="path2" />
</g> </g>
<g clip-path="url(#clip0_588_799)" id="eye-closed" transform="translate(75,841.96201)"> <g clip-path="url(#clip0_588_799)" id="eye-closed" transform="translate(75,841.96201)">
<path d="m 9,2.36001 c 3.06,0 6.26,2.74 7.6,4.03 -1.34,1.3 -4.54,4.02999 -7.6,4.02999 -3.06,0 -6.26,-2.72999 -7.6,-4.01999 1.34,-1.3 4.54,-4.03 7.6,-4.03 m 0,-1 c -4.5,-0.01 -9,5.03 -9,5.03 0,0 4.5,5.02999 9,5.02999 4.5,0 9,-5.02999 9,-5.02999 0,0 -4.5,-5.03 -9,-5.03 z" fill="#f2f2f2" id="path1-6" style="fill:#b3b3b3;fill-opacity:1" /> <path d="m 9,2.36001 c 3.06,0 6.26,2.74 7.6,4.03 -1.34,1.3 -4.54,4.02999 -7.6,4.02999 -3.06,0 -6.26,-2.72999 -7.6,-4.01999 1.34,-1.3 4.54,-4.03 7.6,-4.03 m 0,-1 c -4.5,-0.01 -9,5.03 -9,5.03 0,0 4.5,5.02999 9,5.02999 4.5,0 9,-5.02999 9,-5.02999 0,0 -4.5,-5.03 -9,-5.03 z" fill="#f2f2f2" id="path1-6" style="fill:#b3b3b3;fill-opacity:1" />
<path d="m 8.99999,5 c 0.77,0 1.39001,0.63 1.39001,1.39 0,0.76 -0.63001,1.39 -1.39001,1.39 -0.76,0 -1.39,-0.63 -1.39,-1.39 0,-0.76 0.63,-1.39 1.39,-1.39 z m 0,-1 c -1.32,0 -2.39,1.07 -2.39,2.39 0,1.32 1.07,2.39 2.39,2.39 C 10.32,8.78 11.39,7.71 11.39,6.39 11.39,5.07 10.32,4 8.99999,4 Z" fill="#f2f2f2" id="path2-7" style="fill:#b3b3b3;fill-opacity:1" /> <path d="m 8.99999,5 c 0.77,0 1.39001,0.63 1.39001,1.39 0,0.76 -0.63001,1.39 -1.39001,1.39 -0.76,0 -1.39,-0.63 -1.39,-1.39 0,-0.76 0.63,-1.39 1.39,-1.39 z m 0,-1 c -1.32,0 -2.39,1.07 -2.39,2.39 0,1.32 1.07,2.39 2.39,2.39 1.32001,0 2.39001,-1.07 2.39001,-2.39 0,-1.32 -1.07,-2.39 -2.39001,-2.39 z" fill="#f2f2f2" id="path2-7" style="fill:#b3b3b3;fill-opacity:1" />
<path d="M 16.8,0.400024 1.19995,12.4" stroke="#f2f2f2" stroke-miterlimit="10" id="path3" /> <path d="m 16.8,0.400024 -15.60005,11.999976" stroke="#f2f2f2" stroke-miterlimit="10" id="path3" />
<path d="M 16.8,0.400024 1.19995,12.4" stroke="#f2f2f2" stroke-miterlimit="10" id="path4" style="stroke:#b3b3b3;stroke-opacity:1" /> <path d="m 16.8,0.400024 -15.60005,11.999976" stroke="#f2f2f2" stroke-miterlimit="10" id="path4" style="stroke:#b3b3b3;stroke-opacity:1" />
</g> </g>
<g id="g2" transform="translate(144)"> <g id="g2" transform="translate(144)">
<path d="m 9,849.93721 v 4.04997 c 0,0.20708 0.167895,0.375 0.375,0.375 h 5.25 c 0.207075,0 0.375,-0.16792 0.375,-0.375 v -4.04997 c 0,-0.20708 -0.167925,-0.375 -0.375,-0.375 h -5.25 c -0.207105,0 -0.375,0.16792 -0.375,0.375 z" stroke="#f2f2f2" id="path438-6" style="fill:none;stroke:#42ece6;stroke-width:0.999997;stroke-opacity:1" /> <path d="m 9,849.93721 v 4.04997 c 0,0.20708 0.167895,0.375 0.375,0.375 h 5.25 c 0.207075,0 0.375,-0.16792 0.375,-0.375 v -4.04997 c 0,-0.20708 -0.167925,-0.375 -0.375,-0.375 h -5.25 c -0.207105,0 -0.375,0.16792 -0.375,0.375 z" stroke="#f2f2f2" id="path438-6" style="fill:none;stroke:#42ece6;stroke-width:0.999997;stroke-opacity:1" />
<path d="M 15.21255,842.36218 H 6.375 c -0.207105,0 -0.375,0.1679 -0.375,0.37499 v 11.24993 c 0,0.20708 0.167895,0.375 0.375,0.375 h 11.25 c 0.207075,0 0.375,-0.16792 0.375,-0.375 v -8.67664 c 0,-0.0953 -0.0363,-0.18697 -0.1014,-0.25648 l -2.41245,-2.57327 c -0.07095,-0.0756 -0.16995,-0.11853 -0.2736,-0.11853 z" stroke="#f2f2f2" id="save-7" style="fill:none;stroke:#42ece6;stroke-width:0.999997;stroke-opacity:1" /> <path d="m 15.21255,842.36218 h -8.83755 c -0.207105,0 -0.375,0.1679 -0.375,0.37499 v 11.24993 c 0,0.20708 0.167895,0.375 0.375,0.375 h 11.25 c 0.207075,0 0.375,-0.16792 0.375,-0.375 v -8.67664 c 0,-0.0953 -0.0363,-0.18697 -0.1014,-0.25648 l -2.41245,-2.57327 c -0.07095,-0.0756 -0.16995,-0.11853 -0.2736,-0.11853 z" stroke="#f2f2f2" id="save-7" style="fill:none;stroke:#42ece6;stroke-width:0.999997;stroke-opacity:1" />
</g> </g>
<path style="fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 156,875.36218 6,-6 h -12 z" id="arrow-down" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" /> <path style="fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 156,875.36218 6,-6 h -12 z" id="arrow-down" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" />
<path style="fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 159,896.36218 -6,-6 v 12 z" id="arrow-right" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" /> <path style="fill:#f2f2f2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 159,896.36218 -6,-6 v 12 z" id="arrow-right" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" />
<path id="permissions" class="sprite" d="m 151.39636,940.36205 c -2.24289,-0.005 -4.05758,1.79327 -4.06262,4.00014 0.005,2.21175 1.81973,3.9966 4.06262,4.00014 1.49552,-0.002 2.79821,-0.80916 3.50023,-2.00007 h 1.64589 l 1.31254,-1.27088 1.00005,0.95837 0.95837,-0.93753 0.97921,0.95838 1.00005,-0.95838 0.97921,0.95838 1.7084,-1.6459 c 0.24596,-0.25014 0.25203,-0.43892 0,-0.68752 l -1.39588,-1.37504 h -8.16683 c -0.69828,-1.20226 -2.01522,-2.00317 -3.52088,-2.00007 z m -1.77089,2.91689 c 0.58953,-0.003 1.05806,0.47235 1.06254,1.06254 -0.004,0.58196 -0.47273,1.05714 -1.06254,1.06253 -0.59953,-0.006 -1.08889,-0.48057 -1.08338,-1.06253 -0.005,-0.59019 0.48385,-1.06537 1.08338,-1.06254 z" fill="#f2f2f2" stroke="#999999" stroke-width="0.166673" /> <path id="permissions" class="sprite" d="m 151.39636,940.36205 c -2.24289,-0.005 -4.05758,1.79327 -4.06262,4.00014 0.005,2.21175 1.81973,3.9966 4.06262,4.00014 1.49552,-0.002 2.79821,-0.80916 3.50023,-2.00007 h 1.64589 l 1.31254,-1.27088 1.00005,0.95837 0.95837,-0.93753 0.97921,0.95838 1.00005,-0.95838 0.97921,0.95838 1.7084,-1.6459 c 0.24596,-0.25014 0.25203,-0.43892 0,-0.68752 l -1.39588,-1.37504 h -8.16683 c -0.69828,-1.20226 -2.01522,-2.00317 -3.52088,-2.00007 z m -1.77089,2.91689 c 0.58953,-0.003 1.05806,0.47235 1.06254,1.06254 -0.004,0.58196 -0.47273,1.05714 -1.06254,1.06253 -0.59953,-0.006 -1.08889,-0.48057 -1.08338,-1.06253 -0.005,-0.59019 0.48385,-1.06537 1.08338,-1.06254 z" fill="#f2f2f2" stroke="#999999" stroke-width="0.166673" />
<path id="import" class="sprite" d="m 156.0004,912.44554 c -4.37271,0 -7.91753,3.54481 -7.91753,7.91753 0,4.37272 3.54482,7.91752 7.91753,7.91752 4.37272,0 7.91752,-3.5448 7.91752,-7.91752 0,-4.37272 -3.5448,-7.91753 -7.91752,-7.91753 z m 0,3.29893 4.6186,4.6186 h -3.29893 v 3.95876 h -2.63909 v -3.95876 h -3.29893 z" fill="#f2f2f2" stroke="#999999" stroke-width="0.164949" /> <path id="import" class="sprite" d="m 156.0004,912.44554 c -4.37271,0 -7.91753,3.54481 -7.91753,7.91753 0,4.37272 3.54482,7.91752 7.91753,7.91752 4.37272,0 7.91752,-3.5448 7.91752,-7.91752 0,-4.37272 -3.5448,-7.91753 -7.91752,-7.91753 z m 0,3.29893 4.6186,4.6186 h -3.29893 v 3.95876 h -2.63909 v -3.95876 h -3.29893 z" fill="#f2f2f2" stroke="#999999" stroke-width="0.164949" />
<g id="tilelayers" transform="matrix(2.5261037,0,0,2.5463653,48.310583,954.88883)" style="stroke-width:0.993545"> <g id="tilelayers" transform="matrix(2.5261037,0,0,2.5463653,48.310583,954.88883)" style="stroke-width:0.993545">
<path d="m 25.978244,7.8843707 h 0.03307 V 7.8512977 4.3049501 4.2718771 h -0.03307 -3.713453 -0.03307 v 0.033073 3.5463476 0.033073 h 0.03307 z M 21.999543,3.7253064 h 4.243946 c 0.06157,0 0.120623,0.024461 0.164173,0.068001 0.04352,0.04354 0.068,0.1025948 0.068,0.1641713 v 4.2439425 c 0,0.061569 -0.02447,0.1206236 -0.068,0.164174 -0.04355,0.04355 -0.102605,0.067998 -0.164173,0.067998 h -4.243946 c -0.06158,0 -0.120628,-0.024448 -0.164171,-0.067998 -0.04354,-0.04355 -0.068,-0.1026054 -0.068,-0.164174 V 3.9574787 c 0,-0.061577 0.02446,-0.1206315 0.068,-0.1641713 0.04354,-0.04354 0.102595,-0.068001 0.164171,-0.068001 z" fill="#f2f2f2" stroke="#999999" stroke-width="0.0657188" id="path1257" /> <path d="m 25.978244,7.8843707 h 0.03307 v -0.033073 -3.5463476 -0.033073 h -0.03307 -3.713453 -0.03307 v 0.033073 3.5463476 0.033073 h 0.03307 z m -3.978701,-4.1590643 h 4.243946 c 0.06157,0 0.120623,0.024461 0.164173,0.068001 0.04352,0.04354 0.068,0.1025948 0.068,0.1641713 v 4.2439425 c 0,0.061569 -0.02447,0.1206236 -0.068,0.164174 -0.04355,0.04355 -0.102605,0.067998 -0.164173,0.067998 h -4.243946 c -0.06158,0 -0.120628,-0.024448 -0.164171,-0.067998 -0.04354,-0.04355 -0.068,-0.1026054 -0.068,-0.164174 v -4.2439425 c 0,-0.061577 0.02446,-0.1206315 0.068,-0.1641713 0.04354,-0.04354 0.102595,-0.068001 0.164171,-0.068001 z" fill="#f2f2f2" stroke="#999999" stroke-width="0.0657188" id="path1257" />
<g mask="url(#mask0_181_11916)" id="g1284" transform="matrix(0.2645833,0,0,0.2645833,20.108331,2.1166664)" style="stroke-width:0.993545"> <g mask="url(#mask0_181_11916)" id="g1284" transform="matrix(0.2645833,0,0,0.2645833,20.108331,2.1166664)" style="stroke-width:0.993545">
<path d="M 16.0401,2.3158 H 2.005 v 14.0351 h 14.0351 z" fill="#d5ecbe" id="path1262" style="stroke-width:0.992312" /> <path d="m 16.0401,2.3158 h -14.0351 v 14.0351 h 14.0351 z" fill="#d5ecbe" id="path1262" style="stroke-width:0.992312" />
<path d="M 2.37597,3.42857 C 2.64371,3.11619 2.99113,2.88224 3.38126,2.75161 3.7714,2.62098 4.18964,2.59855 4.59151,2.68672 c 0.32391,0.15649 0.58536,0.41794 0.74185,0.74185 0.37093,0.72181 0,1.26316 0,2.21554 C 5.25316,7.36842 6.33587,7.72933 6.06519,9.33334 5.98499,9.90476 5.72434,10.7769 5.33336,10.807 4.71181,10.8672 4.39101,8.80201 3.11782,8.59148 c -0.39097,-0.06015 -0.47117,0.11028 -0.74185,0 -1.05263,-0.401 -1.523811,-3.65915 0,-5.16291 z" fill="#e9daab" id="path1264" style="stroke-width:0.992312" /> <path d="m 2.37597,3.42857 c 0.26774,-0.31238 0.61516,-0.54633 1.00529,-0.67696 0.39014,-0.13063 0.80838,-0.15306 1.21025,-0.06489 0.32391,0.15649 0.58536,0.41794 0.74185,0.74185 0.37093,0.72181 0,1.26316 0,2.21554 -0.0802,1.72431 1.00251,2.08522 0.73183,3.68923 -0.0802,0.57142 -0.34085,1.44356 -0.73183,1.47366 -0.62155,0.0602 -0.94235,-2.00499 -2.21554,-2.21552 -0.39097,-0.06015 -0.47117,0.11028 -0.74185,0 -1.05263,-0.401 -1.523811,-3.65915 0,-5.16291 z" fill="#e9daab" id="path1264" style="stroke-width:0.992312" />
<path d="M 7.1779,16.3509 C 5.42352,14.6266 5.01249,14.5965 5.01249,14.1353 4.85209,13.1328 6.75685,12.8421 7.22803,11.178 7.55886,10.005 6.75685,9.61404 6.48617,7.48873 6.32577,6.2356 6.08517,4.27068 7.22803,3.05765 8.37089,1.84462 10.3659,1.88472 11.6591,2.3158 c 1.0647,0.38986 1.9867,1.09245 2.6451,2.01558 0.6584,0.92314 1.0223,2.02371 1.0441,3.15735 0,1.24311 -0.6817,1.65413 -0.7318,3.68927 0.0605,0.7372 0.0605,1.4782 0,2.2155 -0.1546,1.1225 -0.6763,2.1624 -1.4837,2.9574 C 11.629,17.6942 9.22302,18.0451 7.90973,17.0927 7.75936,16.9825 7.83956,17.0426 7.1779,16.3509 Z" fill="#bcd8af" id="path1266" style="stroke-width:0.992312" /> <path d="m 7.1779,16.3509 c -1.75438,-1.7243 -2.16541,-1.7544 -2.16541,-2.2156 -0.1604,-1.0025 1.74436,-1.2932 2.21554,-2.9573 0.33083,-1.173 -0.47118,-1.56396 -0.74186,-3.68927 -0.1604,-1.25313 -0.401,-3.21805 0.74186,-4.43108 1.14286,-1.21303 3.13787,-1.17293 4.43107,-0.74185 1.0647,0.38986 1.9867,1.09245 2.6451,2.01558 0.6584,0.92314 1.0223,2.02371 1.0441,3.15735 0,1.24311 -0.6817,1.65413 -0.7318,3.68927 0.0605,0.7372 0.0605,1.4782 0,2.2155 -0.1546,1.1225 -0.6763,2.1624 -1.4837,2.9574 -1.5038,1.3433 -3.90978,1.6942 -5.22307,0.7418 -0.15037,-0.1102 -0.07017,-0.0501 -0.73183,-0.7418 z" fill="#bcd8af" id="path1266" style="stroke-width:0.992312" />
<path d="m 14.1956,9.33332 c -0.4303,0.37544 -0.6966,0.90438 -0.7419,1.47368 0,0.1203 0,1.213 0.7419,1.4837 0.2937,0.0714 0.6033,0.036 0.8733,-0.0999 0.27,-0.1359 0.4828,-0.3635 0.6004,-0.6419 0.066,-0.2429 0.066,-0.499 0,-0.7419 -0.1604,-1.38345 0.3007,-2.00501 0,-2.21553 -0.3008,-0.21053 -1.0928,0.35087 -1.4737,0.74185 z" fill="#ebe9d6" id="path1268" style="stroke-width:0.992312" /> <path d="m 14.1956,9.33332 c -0.4303,0.37544 -0.6966,0.90438 -0.7419,1.47368 0,0.1203 0,1.213 0.7419,1.4837 0.2937,0.0714 0.6033,0.036 0.8733,-0.0999 0.27,-0.1359 0.4828,-0.3635 0.6004,-0.6419 0.066,-0.2429 0.066,-0.499 0,-0.7419 -0.1604,-1.38345 0.3007,-2.00501 0,-2.21553 -0.3008,-0.21053 -1.0928,0.35087 -1.4737,0.74185 z" fill="#ebe9d6" id="path1268" style="stroke-width:0.992312" />
<path d="m 14.1955,15.2381 c 0.2874,0.0123 0.5733,-0.0483 0.831,-0.1763 0.2577,-0.1279 0.4788,-0.3191 0.6427,-0.5555 0.2005,-0.3308 0.4411,-1.0526 0,-1.4837 -0.2062,-0.1739 -0.4672,-0.2693 -0.7369,-0.2693 -0.2696,0 -0.5306,0.0954 -0.7368,0.2693 0,0 -1.4837,0.7418 -1.4837,1.4837 0,0.7418 1.4837,0.7318 1.4837,0.7318 z" fill="#f3ecdd" id="path1270" style="stroke-width:0.992312" /> <path d="m 14.1955,15.2381 c 0.2874,0.0123 0.5733,-0.0483 0.831,-0.1763 0.2577,-0.1279 0.4788,-0.3191 0.6427,-0.5555 0.2005,-0.3308 0.4411,-1.0526 0,-1.4837 -0.2062,-0.1739 -0.4672,-0.2693 -0.7369,-0.2693 -0.2696,0 -0.5306,0.0954 -0.7368,0.2693 0,0 -1.4837,0.7418 -1.4837,1.4837 0,0.7418 1.4837,0.7318 1.4837,0.7318 z" fill="#f3ecdd" id="path1270" style="stroke-width:0.992312" />
<path d="M 7.90976,1.57394 C 6.01502,2.89725 5.6441,3.86968 5.69422,4.53134 c 0.0802,1.0025 1.09273,1.37343 1.48371,3.00752 0.19537,0.72559 0.19537,1.48994 0,2.21553 -0.58145,1.85461 -2.51629,1.88471 -3.69925,3.68921 -0.6679,1.11 -0.92678,2.4186 -0.73183,3.6993" stroke="#dfa170" stroke-width="0.745158" stroke-miterlimit="10" id="path1272" style="fill:none" /> <path d="m 7.90976,1.57394 c -1.89474,1.32331 -2.26566,2.29574 -2.21554,2.9574 0.0802,1.0025 1.09273,1.37343 1.48371,3.00752 0.19537,0.72559 0.19537,1.48994 0,2.21553 -0.58145,1.85461 -2.51629,1.88471 -3.69925,3.68921 -0.6679,1.11 -0.92678,2.4186 -0.73183,3.6993" stroke="#dfa170" stroke-width="0.745158" stroke-miterlimit="10" id="path1272" style="fill:none" />
<path d="m 5.33325,1.94485 c 1.5732,1.61744 2.60339,3.68483 2.94737,5.91479 0.13097,0.73271 0.13097,1.48283 0,2.21556 -0.33083,1.7042 -1.30326,2.3559 -2.21554,4.4311 -0.31515,0.713 -0.56025,1.455 -0.73183,2.2155" stroke="#e0859b" stroke-width="0.248386" stroke-miterlimit="10" id="path1274" style="fill:none" /> <path d="m 5.33325,1.94485 c 1.5732,1.61744 2.60339,3.68483 2.94737,5.91479 0.13097,0.73271 0.13097,1.48283 0,2.21556 -0.33083,1.7042 -1.30326,2.3559 -2.21554,4.4311 -0.31515,0.713 -0.56025,1.455 -0.73183,2.2155" stroke="#e0859b" stroke-width="0.248386" stroke-miterlimit="10" id="path1274" style="fill:none" />
<path d="m 10.4963,14.5063 c -1.84462,-1.0025 -1.7143,-5.53387 0,-6.64665 0.5915,-0.38096 1.1328,-0.21053 1.4837,-0.74186 0.5213,-0.802 -0.411,-1.69423 0,-2.95739 0.2306,-0.72181 0.8922,-1.52381 1.4737,-1.47369 1.0025,0.0802 2.1253,2.5564 1.4737,4.43108 -0.5314,1.56391 -1.9148,1.51379 -2.2156,3.00751 -0.3408,1.6441 1.2732,2.6266 0.7419,3.6892 -0.3395,0.4362 -0.8182,0.7428 -1.3564,0.8687 -0.5382,0.1259 -1.1033,0.0634 -1.601,-0.1769 z" fill="#ade3ea" id="path1276" style="stroke-width:0.992312" /> <path d="m 10.4963,14.5063 c -1.84462,-1.0025 -1.7143,-5.53387 0,-6.64665 0.5915,-0.38096 1.1328,-0.21053 1.4837,-0.74186 0.5213,-0.802 -0.411,-1.69423 0,-2.95739 0.2306,-0.72181 0.8922,-1.52381 1.4737,-1.47369 1.0025,0.0802 2.1253,2.5564 1.4737,4.43108 -0.5314,1.56391 -1.9148,1.51379 -2.2156,3.00751 -0.3408,1.6441 1.2732,2.6266 0.7419,3.6892 -0.3395,0.4362 -0.8182,0.7428 -1.3564,0.8687 -0.5382,0.1259 -1.1033,0.0634 -1.601,-0.1769 z" fill="#ade3ea" id="path1276" style="stroke-width:0.992312" />
<path d="M 7.90971,2.31578 C 7.51873,3.22806 8.12023,4.46115 8.65156,4.53132 9.18289,4.6015 9.31322,3.87969 10.1353,3.78947 c 0.401,0 0.5213,0.1203 0.7318,0 0.5013,-0.27068 0.6115,-1.62406 0,-2.21554 C 10.6274,1.41713 10.3579,1.31164 10.0755,1.26409 9.79306,1.21654 9.50385,1.22797 9.22606,1.29765 8.94826,1.36734 8.6879,1.49377 8.46135,1.66899 8.23481,1.84421 8.04699,2.06443 7.90971,2.31578 Z" fill="#748ec2" id="path1278" style="stroke-width:0.992312" /> <path d="m 7.90971,2.31578 c -0.39098,0.91228 0.21052,2.14537 0.74185,2.21554 0.53133,0.07018 0.66166,-0.65163 1.48374,-0.74185 0.401,0 0.5213,0.1203 0.7318,0 0.5013,-0.27068 0.6115,-1.62406 0,-2.21554 -0.2397,-0.1568 -0.5092,-0.26229 -0.7916,-0.30984 -0.28244,-0.04755 -0.57165,-0.03612 -0.84944,0.03356 -0.2778,0.06969 -0.53816,0.19612 -0.76471,0.37134 -0.22654,0.17522 -0.41436,0.39544 -0.55164,0.64679 z" fill="#748ec2" id="path1278" style="stroke-width:0.992312" />
<path d="M 10.1354,5.27317 C 9.82458,5.57392 9.25315,6.1253 9.3935,6.74686 c 0.09023,0.401 0.45113,0.78195 0.7419,0.74185 0.2907,-0.0401 0.2907,-0.57143 0.7318,-0.74185 0.4411,-0.17043 0.5113,0.11027 0.7418,0 0.5314,-0.24061 0.6116,-1.92482 0,-2.21554 -0.6115,-0.29073 -1.2431,0.4812 -1.4736,0.74185 z" fill="#f3ecdd" id="path1280" style="stroke-width:0.992312" /> <path d="m 10.1354,5.27317 c -0.31082,0.30075 -0.88225,0.85213 -0.7419,1.47369 0.09023,0.401 0.45113,0.78195 0.7419,0.74185 0.2907,-0.0401 0.2907,-0.57143 0.7318,-0.74185 0.4411,-0.17043 0.5113,0.11027 0.7418,0 0.5314,-0.24061 0.6116,-1.92482 0,-2.21554 -0.6115,-0.29073 -1.2431,0.4812 -1.4736,0.74185 z" fill="#f3ecdd" id="path1280" style="stroke-width:0.992312" />
<path d="M 3.47861,3.78948 C 3.74929,3.62908 4.79189,4.33083 4.96232,5.27319 5.13275,6.21555 4.14027,7.58898 3.47861,7.48873 3.1966,7.37627 2.96599,7.16372 2.83095,6.8918 2.69592,6.61988 2.66595,6.30769 2.74678,6.01504 3.01746,5.46367 4.20042,5.57394 4.22047,5.28321 4.24052,4.99249 3.70919,5.01254 3.47861,4.53133 c -0.1203,-0.27067 -0.14035,-0.65162 0,-0.74185 z" fill="#cfd7c8" id="path1282" style="stroke-width:0.992312" /> <path d="m 3.47861,3.78948 c 0.27068,-0.1604 1.31328,0.54135 1.48371,1.48371 0.17043,0.94236 -0.82205,2.31579 -1.48371,2.21554 -0.28201,-0.11246 -0.51262,-0.32501 -0.64766,-0.59693 -0.13503,-0.27192 -0.165,-0.58411 -0.08417,-0.87676 0.27068,-0.55137 1.45364,-0.4411 1.47369,-0.73183 0.02005,-0.29072 -0.51128,-0.27067 -0.74186,-0.75188 -0.1203,-0.27067 -0.14035,-0.65162 0,-0.74185 z" fill="#cfd7c8" id="path1282" style="stroke-width:0.992312" />
</g> </g>
<path d="m 24.352274,6.3088036 h 0.03307 V 6.2757306 2.7293857 2.6963127 h -0.03307 -3.713451 -0.03307 v 0.033073 3.5463449 0.033073 h 0.03307 z M 20.373578,2.1497393 h 4.24394 c 0.06157,0 0.120624,0.024461 0.164174,0.068002 0.04355,0.043541 0.068,0.102595 0.068,0.1641723 v 4.2439399 c 0,0.061569 -0.02445,0.1206236 -0.068,0.164174 -0.04355,0.04355 -0.102605,0.067998 -0.164174,0.067998 h -4.24394 c -0.06158,0 -0.120631,-0.024447 -0.164172,-0.067998 -0.04354,-0.04355 -0.068,-0.1026054 -0.068,-0.164174 V 2.3819136 c 0,-0.061577 0.02446,-0.1206315 0.068,-0.1641723 0.04354,-0.043541 0.102595,-0.068002 0.164172,-0.068002 z" fill="#f2f2f2" stroke="#999999" stroke-width="0.0657188" id="path1286" /> <path d="m 24.352274,6.3088036 h 0.03307 v -0.033073 -3.5463449 -0.033073 h -0.03307 -3.713451 -0.03307 v 0.033073 3.5463449 0.033073 h 0.03307 z m -3.978696,-4.1590643 h 4.24394 c 0.06157,0 0.120624,0.024461 0.164174,0.068002 0.04355,0.043541 0.068,0.102595 0.068,0.1641723 v 4.2439399 c 0,0.061569 -0.02445,0.1206236 -0.068,0.164174 -0.04355,0.04355 -0.102605,0.067998 -0.164174,0.067998 h -4.24394 c -0.06158,0 -0.120631,-0.024447 -0.164172,-0.067998 -0.04354,-0.04355 -0.068,-0.1026054 -0.068,-0.164174 v -4.2439399 c 0,-0.061577 0.02446,-0.1206315 0.068,-0.1641723 0.04354,-0.043541 0.102595,-0.068002 0.164172,-0.068002 z" fill="#f2f2f2" stroke="#999999" stroke-width="0.0657188" id="path1286" />
</g> </g>
<path style="color:#000000;fill:#f2f2f2;fill-rule:evenodd;fill-opacity:1;stroke:#999999;stroke-opacity:1;stroke-width:0.25;stroke-dasharray:none" d="m 133.73437,963.36133 -4.73437,4.73437 5.05078,4.6836 1.35938,-1.4668 -3.52735,-3.26953 3.26563,-3.26563 z" id="path1-67" /> <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 133.73437,963.36133 -4.73437,4.73437 5.05078,4.6836 1.35938,-1.4668 -3.52735,-3.26953 3.26563,-3.26563 z" id="path1-67" />
<path fill-rule="evenodd" clip-rule="evenodd" d="m 87.166638,966.62162 -3.166579,-2.99638 -3.166613,2.99638 -0.833375,-0.78858 3.4333,-3.24873 c 0.312979,-0.29613 0.82041,-0.29613 1.133389,0 l 3.43324,3.24873 z m -6.333275,3.48122 3.166626,2.99639 3.166649,-2.99639 0.833362,0.78859 -3.433322,3.24872 c -0.312968,0.29608 -0.820411,0.29608 -1.133378,0 l -3.4333,-3.24872 z" fill="#efefef" id="path1-675" style="stroke-width:0.999996" /> <path fill-rule="evenodd" clip-rule="evenodd" d="m 87.166638,966.62162 -3.166579,-2.99638 -3.166613,2.99638 -0.833375,-0.78858 3.4333,-3.24873 c 0.312979,-0.29613 0.82041,-0.29613 1.133389,0 l 3.43324,3.24873 z m -6.333275,3.48122 3.166626,2.99639 3.166649,-2.99639 0.833362,0.78859 -3.433322,3.24872 c -0.312968,0.29608 -0.820411,0.29608 -1.133378,0 l -3.4333,-3.24872 z" fill="#efefef" id="path1-675" style="stroke-width:0.999996" />
<path style="fill:#efefef;fill-opacity:1;stroke-width:0.999996" d="m 63.166637,974.36218 -3.166626,-2.99639 -3.166649,2.99639 -0.833362,-0.78859 3.433322,-3.24872 c 0.312968,-0.29608 0.820411,-0.29608 1.133378,0 l 3.4333,3.24872 z" id="path5" /> <path style="fill:#efefef;fill-opacity:1;stroke-width:0.999996" d="m 63.166637,974.36218 -3.166626,-2.99639 -3.166649,2.99639 -0.833362,-0.78859 3.433322,-3.24872 c 0.312968,-0.29608 0.820411,-0.29608 1.133378,0 l 3.4333,3.24872 z" id="path5" />
<path style="fill:#efefef;fill-opacity:1;stroke-width:0.999996" d="m 56.000071,963.15076 3.43324,3.24873 c 0.312979,0.29613 0.82041,0.29613 1.133389,0 l 3.4333,-3.24873 -0.833375,-0.78858 -3.166613,2.99638 -3.166579,-2.99638 z" id="path1-675-2" /> <path style="fill:#efefef;fill-opacity:1;stroke-width:0.999996" d="m 56.000071,963.15076 3.43324,3.24873 c 0.312979,0.29613 0.82041,0.29613 1.133389,0 l 3.4333,-3.24873 -0.833375,-0.78858 -3.166613,2.99638 -3.166579,-2.99638 z" id="path1-675-2" />
@ -208,7 +200,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 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="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 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;paint-order:fill markers stroke;fill-opacity:1" 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" /> <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="g1-5" transform="translate(0.1,0.1)">
<g id="g24"> <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" /> <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" />
@ -224,5 +216,8 @@
<path d="m 8.5,9.3501 h -3 v 2.39" stroke="#323737" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" id="path6-6" style="stroke:#999999;stroke-opacity:1" /> <path d="m 8.5,9.3501 h -3 v 2.39" stroke="#323737" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" id="path6-6" style="stroke:#999999;stroke-opacity:1" />
<path d="m 5.5,9.3501 h 3 v 2.39" stroke="#323737" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" id="path7-2" style="stroke:#999999;stroke-opacity:1" /> <path d="m 5.5,9.3501 h 3 v 2.39" stroke="#323737" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round" id="path7-2" style="stroke:#999999;stroke-opacity:1" />
</g> </g>
<g clip-path="url(#clip0_2695_1939)" id="g2-67" transform="translate(170.11621,814.31159)">
<path d="m 8.84533,14.8298 c -0.28116,0.6439 -1.1722,0.6439 -1.45333,0 l -0.73138,-1.6751 c -0.65086,-1.4907 -1.82238,-2.6774 -3.2837,-3.32604 l -2.0131,-0.89358 c -0.64004,-0.28408 -0.64004,-1.21518 0,-1.49928 l 1.95022,-0.86569 c 1.4989,-0.66535 2.69143,-1.89594 3.33118,-3.43751 l 0.74086,-1.78516 c 0.27491,-0.662471 1.19025,-0.662472 1.46517,0 l 0.74083,1.78517 c 0.63972,1.54156 1.83222,2.77215 3.33112,3.4375 l 1.9503,0.86569 c 0.64,0.2841 0.64,1.2152 0,1.49928 l -2.0131,0.89358 c -1.4613,0.64864 -2.6328,1.83534 -3.28374,3.32604 z m -5.06236,-6.64435 c 1.90486,0.84555 3.45371,2.23535 4.33568,4.14775 0.88202,-1.9124 2.43085,-3.3022 4.33565,-4.14775 -1.9276,-0.85565 -3.4813,-2.31323 -4.33564,-4.25955 -0.85434,1.94633 -2.4081,3.4039 -4.33569,4.25955 z m 12.38483,10.72295 0.2057,-0.4714 c 0.3667,-0.8405 1.0271,-1.5098 1.8511,-1.8758 l 0.6336,-0.2816 c 0.3428,-0.1523 0.3428,-0.6504 0,-0.8026 l -0.5981,-0.2658 c -0.8453,-0.3755 -1.5175,-1.0695 -1.8779,-1.9386 l -0.2112,-0.5094 c -0.1473,-0.355 -0.6381,-0.355 -0.7853,0 l -0.2112,0.5094 c -0.3603,0.8691 -1.0326,1.5631 -1.8778,1.9386 l -0.5983,0.2658 c -0.3427,0.1522 -0.3427,0.6503 0,0.8026 l 0.6337,0.2816 c 0.8241,0.366 1.4844,1.0353 1.8511,1.8758 l 0.2057,0.4714 c 0.1505,0.3451 0.6283,0.3451 0.7789,0 z m -0.8557,-3.0358 0.4687,-0.4655 0.459,0.4655 -0.459,0.4524 z" fill="#efefef" id="path1-5" />
</g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View file

@ -165,7 +165,9 @@ class Feature {
} }
getSlug() { getSlug() {
return this.properties[this._umap.getProperty('slugKey') || 'name'] || '' return (
this.properties[this._umap.getProperty('slugKey') || U.DEFAULT_LABEL_KEY] || ''
)
} }
getPermalink() { getPermalink() {
@ -234,15 +236,23 @@ class Feature {
container.appendChild(builder.build()) container.appendChild(builder.build())
const properties = [] const properties = []
let labelKeyFound = undefined
for (const property of this.datalayer._propertiesIndex) { for (const property of this.datalayer._propertiesIndex) {
if (['name', 'description'].includes(property)) { if (!labelKeyFound && U.LABEL_KEYS.includes(property)) {
labelKeyFound = property
continue
}
if (property === 'description') {
continue continue
} }
properties.push([`properties.${property}`, { label: property }]) properties.push([`properties.${property}`, { label: property }])
} }
// We always want name and description for now (properties management to come) // We always want name and description for now (properties management to come)
properties.unshift('properties.description') properties.unshift('properties.description')
properties.unshift('properties.name') if (!labelKeyFound) {
labelKeyFound = U.DEFAULT_LABEL_KEY
}
properties.unshift([`properties.${labelKeyFound}`, { label: labelKeyFound }])
builder = new U.FormBuilder(this, properties, { builder = new U.FormBuilder(this, properties, {
id: 'umap-feature-properties', id: 'umap-feature-properties',
}) })
@ -255,7 +265,7 @@ class Feature {
this.getAdvancedEditActions(advancedActions) this.getAdvancedEditActions(advancedActions)
const onLoad = this._umap.editPanel.open({ content: container }) const onLoad = this._umap.editPanel.open({ content: container })
onLoad.then(() => { onLoad.then(() => {
builder.helpers['properties.name'].input.focus() builder.helpers[`properties.${labelKeyFound}`].input.focus()
}) })
this._umap.editedFeature = this this._umap.editedFeature = this
if (!this.ui.isOnScreen(this._umap._leafletMap.getBounds())) this.zoomTo(event) if (!this.ui.isOnScreen(this._umap._leafletMap.getBounds())) this.zoomTo(event)
@ -316,19 +326,21 @@ class Feature {
endEdit() {} endEdit() {}
getDisplayName(fallback) { getDisplayName() {
const key = this.getOption('labelKey') || 'name' const keys = U.LABEL_KEYS.slice() // Copy.
const labelKey = this.getOption('labelKey')
// Variables mode. // Variables mode.
if (Utils.hasVar(key)) { if (labelKey) {
return Utils.greedyTemplate(key, this.extendedProperties()) if (Utils.hasVar(labelKey)) {
return Utils.greedyTemplate(labelKey, this.extendedProperties())
}
keys.unshift(labelKey)
} }
// Simple mode. for (const key of keys) {
return ( const value = this.properties[key]
this.properties[key] || if (value) return value
this.properties.title || }
fallback || return this.datalayer.getName()
this.datalayer.getName()
)
} }
hasPopupFooter() { hasPopupFooter() {

View file

@ -289,7 +289,7 @@ export class DataLayer extends ServerStored {
reindex() { reindex() {
const features = Object.values(this._features) const features = Object.values(this._features)
Utils.sortFeatures(features, this._umap.getProperty('sortKey'), U.lang) this.sortFeatures(features)
this._index = features.map((feature) => stamp(feature)) this._index = features.map((feature) => stamp(feature))
} }
@ -428,6 +428,10 @@ export class DataLayer extends ServerStored {
if (idx !== -1) this._propertiesIndex.splice(idx, 1) if (idx !== -1) this._propertiesIndex.splice(idx, 1)
} }
allProperties() {
return this._propertiesIndex
}
sortedValues(property) { sortedValues(property) {
return Object.values(this._features) return Object.values(this._features)
.map((feature) => feature.properties[property]) .map((feature) => feature.properties[property])
@ -446,6 +450,11 @@ export class DataLayer extends ServerStored {
} }
} }
sortFeatures(collection) {
const sortKeys = this._umap.getProperty('sortKey') || U.DEFAULT_LABEL_KEY
return Utils.sortFeatures(collection, sortKeys, U.lang)
}
makeFeatures(geojson = {}, sync = true) { makeFeatures(geojson = {}, sync = true) {
if (geojson.type === 'Feature' || geojson.coordinates) { if (geojson.type === 'Feature' || geojson.coordinates) {
geojson = [geojson] geojson = [geojson]
@ -454,7 +463,7 @@ export class DataLayer extends ServerStored {
? geojson ? geojson
: geojson.features || geojson.geometries : geojson.features || geojson.geometries
if (!collection) return if (!collection) return
Utils.sortFeatures(collection, this._umap.getProperty('sortKey'), U.lang) this.sortFeatures(collection)
for (const feature of collection) { for (const feature of collection) {
this.makeFeature(feature, sync) this.makeFeature(feature, sync)
} }

View file

@ -1,5 +1,5 @@
import { uMapAlert as Alert } from '../components/alerts/alert.js' import { uMapAlert as Alert } from '../components/alerts/alert.js'
import { AjaxAutocomplete, AjaxAutocompleteMultiple } from './autocomplete.js' import { AjaxAutocomplete, AjaxAutocompleteMultiple, AutocompleteDatalist } from './autocomplete.js'
import Help from './help.js' import Help from './help.js'
import { ServerRequest } from './request.js' import { ServerRequest } from './request.js'
import { SCHEMA } from './schema.js' import { SCHEMA } from './schema.js'
@ -17,6 +17,7 @@ window.U = {
Alert, Alert,
AjaxAutocomplete, AjaxAutocomplete,
AjaxAutocompleteMultiple, AjaxAutocompleteMultiple,
AutocompleteDatalist,
Help, Help,
Icon, Icon,
LAYER_TYPES, LAYER_TYPES,

View file

@ -6,17 +6,14 @@ import Dialog from './ui/dialog.js'
import * as Utils from './utils.js' import * as Utils from './utils.js'
const TEMPLATE = ` const TEMPLATE = `
<div class="umap-upload">
<h3><i class="icon icon-16 icon-upload"></i><span>${translate('Import data')}</span></h3> <h3><i class="icon icon-16 icon-upload"></i><span>${translate('Import data')}</span></h3>
<fieldset class="formbox"> <fieldset class="formbox">
<legend class="counter">${translate('Choose data')}</legend> <legend class="counter">${translate('Choose data')}</legend>
<input type="file" multiple autofocus onchange /> <input type="file" multiple autofocus onchange />
<input type="url" placeholder="${translate('Provide an URL here')}" onchange />
<textarea onchange placeholder="${translate('Paste your data here')}"></textarea> <textarea onchange placeholder="${translate('Paste your data here')}"></textarea>
<div class="importers" hidden> <input class="highlightable" type="url" placeholder="${translate('Provide an URL here')}" onchange />
<h4>${translate('Import helpers:')}</h4> <button class="flat importers" hidden data-ref="importersButton"><i class="icon icon-16 icon-magic"></i>${translate('Import helpers')}</button>
<ul class="grid-container">
</ul>
</div>
</fieldset> </fieldset>
<fieldset class="formbox"> <fieldset class="formbox">
<legend class="counter" data-help="importFormats">${translate( <legend class="counter" data-help="importFormats">${translate(
@ -36,28 +33,40 @@ const TEMPLATE = `
<fieldset id="import-mode" class="formbox"> <fieldset id="import-mode" class="formbox">
<legend class="counter" data-help="importMode">${translate('Choose import mode')}</legend> <legend class="counter" data-help="importMode">${translate('Choose import mode')}</legend>
<label> <label>
<input type="radio" name="action" value="copy" /> <input type="radio" name="action" value="copy" checked onchange />
${translate('Copy into the layer')} ${translate('Copy into the layer')}
</label> </label>
<label> <label>
<input type="radio" name="action" value="link" /> <input type="radio" name="action" value="link" onchange />
${translate('Link to the layer as remote data')} ${translate('Link to the layer as remote data')}
</label> </label>
</fieldset> </fieldset>
<input type="button" class="button" name="submit" value="${translate('Import data')}" /> <input type="button" class="button primary" name="submit" value="${translate('Import data')}" disabled />
</div>
` `
export default class Importer { const GRID_TEMPLATE = `
<div>
<h3><i class="icon icon-16 icon-magic"></i>${translate('Import helpers')}</h3>
<p>${translate('Import helpers will fill the URL field for you.')}</p>
<ul class="grid-container by4" data-ref="grid"></ul>
</div>
`
export default class Importer extends Utils.WithTemplate {
constructor(umap) { constructor(umap) {
super()
this._umap = umap this._umap = umap
this.TYPES = ['geojson', 'csv', 'gpx', 'kml', 'osm', 'georss', 'umap'] this.TYPES = ['geojson', 'csv', 'gpx', 'kml', 'osm', 'georss', 'umap']
this.IMPORTERS = [] this.IMPORTERS = []
this.loadImporters() this.loadImporters()
this.dialog = new Dialog() this.dialog = new Dialog({ className: 'importers dark' })
} }
loadImporters() { loadImporters() {
for (const [name, config] of Object.entries(this._umap.properties.importers || {})) { for (const [name, config] of Object.entries(
this._umap.properties.importers || {}
)) {
const register = (mod) => { const register = (mod) => {
this.IMPORTERS.push(new mod.Importer(this._umap, config)) this.IMPORTERS.push(new mod.Importer(this._umap, config))
} }
@ -112,6 +121,11 @@ export default class Importer {
return this.qs('textarea').value return this.qs('textarea').value
} }
set raw(value) {
this.qs('textarea').value = value
this.onChange()
}
get clear() { get clear() {
return Boolean(this.qs('[name=clear]').checked) return Boolean(this.qs('[name=clear]').checked)
} }
@ -144,20 +158,26 @@ export default class Importer {
) )
} }
showImporters() {
if (!this.IMPORTERS.length) return
const [element, { grid }] = Utils.loadTemplateWithRefs(GRID_TEMPLATE)
for (const plugin of this.IMPORTERS.sort((a, b) => (a.id > b.id ? 1 : -1))) {
const button = Utils.loadTemplate(
`<li><button type="button" class="${plugin.id}">${plugin.name}</button></li>`
)
button.addEventListener('click', () => plugin.open(this))
grid.appendChild(button)
}
this.dialog.open({ template: element, cancel: false, accept: false })
}
build() { build() {
this.container = DomUtil.create('div', 'umap-upload') this.container = this.loadTemplate(TEMPLATE)
this.container.innerHTML = TEMPLATE
if (this.IMPORTERS.length) { if (this.IMPORTERS.length) {
const parent = this.container.querySelector('.importers ul') // TODO use this.elements instead of this.qs
for (const plugin of this.IMPORTERS.sort((a, b) => (a.id > b.id ? 1 : -1))) { const button = this.qs('[data-ref=importersButton]')
L.DomUtil.createButton( button.addEventListener('click', () => this.showImporters())
plugin.id, button.toggleAttribute('hidden', false)
DomUtil.element({ tagName: 'li', parent }),
plugin.name,
() => plugin.open(this)
)
}
this.qs('.importers').toggleAttribute('hidden', false)
} }
for (const type of this.TYPES) { for (const type of this.TYPES) {
DomUtil.element({ DomUtil.element({
@ -168,7 +188,7 @@ export default class Importer {
}) })
} }
this._umap.help.parse(this.container) this._umap.help.parse(this.container)
DomEvent.on(this.qs('[name=submit]'), 'click', this.submit, this) this.qs('[name=submit]').addEventListener('click', () => this.submit())
DomEvent.on(this.qs('[type=file]'), 'change', this.onFileChange, this) DomEvent.on(this.qs('[type=file]'), 'change', this.onFileChange, this)
for (const element of this.container.querySelectorAll('[onchange]')) { for (const element of this.container.querySelectorAll('[onchange]')) {
DomEvent.on(element, 'change', this.onChange, this) DomEvent.on(element, 'change', this.onChange, this)
@ -183,6 +203,7 @@ export default class Importer {
) )
this.qs('[name=layer-name]').toggleAttribute('hidden', Boolean(this.layerId)) this.qs('[name=layer-name]').toggleAttribute('hidden', Boolean(this.layerId))
this.qs('#clear').toggleAttribute('hidden', !this.layerId) this.qs('#clear').toggleAttribute('hidden', !this.layerId)
this.qs('[name=submit').toggleAttribute('disabled', !this.canSubmit())
} }
onFileChange(e) { onFileChange(e) {
@ -204,6 +225,7 @@ export default class Importer {
this.url = null this.url = null
this.format = undefined this.format = undefined
this.layerName = null this.layerName = null
this.raw = null
const layerSelect = this.qs('[name="layer-id"]') const layerSelect = this.qs('[name="layer-id"]')
layerSelect.innerHTML = '' layerSelect.innerHTML = ''
this._umap.eachDataLayerReverse((datalayer) => { this._umap.eachDataLayerReverse((datalayer) => {
@ -236,6 +258,17 @@ export default class Importer {
this.qs('[type=file]').showPicker() this.qs('[type=file]').showPicker()
} }
canSubmit() {
if (!this.format) return false
const hasFiles = Boolean(this.files.length)
const hasRaw = Boolean(this.raw)
const hasUrl = Boolean(this.url)
const hasAction = Boolean(this.action)
if (!hasFiles && !hasRaw && !hasUrl) return false
if (this.url) return hasAction
return true
}
submit() { submit() {
let hasErrors let hasErrors
if (this.format === 'umap') { if (this.format === 'umap') {

View file

@ -2,6 +2,8 @@ import { DomUtil } from '../../../vendors/leaflet/leaflet-src.esm.js'
import { BaseAjax, SingleMixin } from '../autocomplete.js' import { BaseAjax, SingleMixin } from '../autocomplete.js'
import * as Util from '../utils.js' import * as Util from '../utils.js'
import { AutocompleteCommunes } from './communesfr.js' import { AutocompleteCommunes } from './communesfr.js'
import { translate } from '../i18n.js'
import { uMapAlert as Alert } from '../../components/alerts/alert.js'
const TEMPLATE = ` const TEMPLATE = `
<h3>Cadastre</h3> <h3>Cadastre</h3>
@ -56,6 +58,8 @@ export class Importer {
.open({ .open({
template: container, template: container,
className: `${this.id} importer dark`, className: `${this.id} importer dark`,
cancel: false,
accept: translate('Choose this data'),
}) })
.then(confirm) .then(confirm)
} }

View file

@ -37,8 +37,8 @@ class Autocomplete extends SingleMixin(BaseAjax) {
} }
export class Importer { export class Importer {
constructor(map, options = {}) { constructor(umap, options = {}) {
this.map = map this.umap = umap
this.name = options.name || 'GeoDataMine' this.name = options.name || 'GeoDataMine'
this.baseUrl = options?.url || 'https://geodatamine.fr' this.baseUrl = options?.url || 'https://geodatamine.fr'
this.id = 'geodatamine' this.id = 'geodatamine'
@ -49,7 +49,7 @@ export class Importer {
let boundaryName = null let boundaryName = null
const container = DomUtil.create('div') const container = DomUtil.create('div')
container.innerHTML = TEMPLATE container.innerHTML = TEMPLATE
const response = await importer.map.request.get(`${this.baseUrl}/themes`) const response = await this.umap.request.get(`${this.baseUrl}/themes`)
const select = container.querySelector('select') const select = container.querySelector('select')
if (response?.ok) { if (response?.ok) {
const { themes } = await response.json() const { themes } = await response.json()

View file

@ -53,11 +53,15 @@ export class Importer {
'https://photon.komoot.io/api?q={q}&layer=county&layer=city&layer=state' 'https://photon.komoot.io/api?q={q}&layer=county&layer=city&layer=state'
this.id = 'overpass' this.id = 'overpass'
this.boundaryChoice = null this.boundaryChoice = null
this.expression = null
} }
async open(importer) { async open(importer) {
const container = DomUtil.create('div') const container = DomUtil.create('div')
container.innerHTML = TEMPLATE container.innerHTML = TEMPLATE
if (this.expression) {
container.querySelector('[name=tags]').value = this.expression
}
this.autocomplete = new Autocomplete(container.querySelector('#area'), { this.autocomplete = new Autocomplete(container.querySelector('#area'), {
url: this.searchUrl, url: this.searchUrl,
placeholder: translate( placeholder: translate(
@ -80,6 +84,7 @@ export class Importer {
Alert.error(translate('Expression is empty')) Alert.error(translate('Expression is empty'))
return return
} }
this.expression = form.tags
let tags = form.tags let tags = form.tags
if (!tags.startsWith('[')) tags = `[${tags}]` if (!tags.startsWith('[')) tags = `[${tags}]`
let area = '{south},{west},{north},{east}' let area = '{south},{west},{north},{east}'

View file

@ -44,12 +44,12 @@ const ControlsMixin = {
new U.DrawToolbar({ map: this }).addTo(this) new U.DrawToolbar({ map: this }).addTo(this)
const editActions = [ const editActions = [
U.EditCaptionAction, U.EditCaptionAction,
U.EditPropertiesAction, U.ImportAction,
U.EditLayersAction, U.EditLayersAction,
U.ChangeTileLayerAction, U.ChangeTileLayerAction,
U.UpdateExtentAction, U.UpdateExtentAction,
U.UpdatePermsAction, U.UpdatePermsAction,
U.ImportAction, U.EditPropertiesAction,
] ]
if (this.options.editMode === 'advanced') { if (this.options.editMode === 'advanced') {
new U.SettingsToolbar({ actions: editActions }).addTo(this) new U.SettingsToolbar({ actions: editActions }).addTo(this)
@ -96,8 +96,6 @@ const ControlsMixin = {
this._controls.more = new U.MoreControls() this._controls.more = new U.MoreControls()
this._controls.scale = L.control.scale() this._controls.scale = L.control.scale()
this._controls.permanentCredit = new U.PermanentCreditsControl(this) this._controls.permanentCredit = new U.PermanentCreditsControl(this)
if (this.options.scrollWheelZoom) this.scrollWheelZoom.enable()
else this.scrollWheelZoom.disable()
this._umap.drop = new U.DropControl(this) this._umap.drop = new U.DropControl(this)
this._controls.tilelayers = new U.TileLayerControl(this) this._controls.tilelayers = new U.TileLayerControl(this)
}, },
@ -279,12 +277,23 @@ export const LeafletMap = BaseMap.extend({
this.initControls() this.initControls()
// Needs locate control and hash to exist // Needs locate control and hash to exist
this.initCenter() this.initCenter()
this.initTileLayers()
this.renderUI() this.renderUI()
}, },
renderUI: function () { renderUI: function () {
setOptions(this, this._umap.properties) setOptions(this, this._umap.properties)
this.initTileLayers() if (this.options.scrollWheelZoom) {
this.scrollWheelZoom.enable()
this.dragging.enable()
} else {
this.scrollWheelZoom.disable()
// In mobile, do not let the user move the map
// when scrolling the main page and touching the
// map in an iframe. May be a bit dumb, but let's
// try like this for now.
if (L.Browser.mobile) this.dragging.disable()
}
// Needs tilelayer to exist for minimap // Needs tilelayer to exist for minimap
this.renderControls() this.renderControls()
this.handleLimitBounds() this.handleLimitBounds()

View file

@ -115,7 +115,9 @@ class Table extends TitleMixin(PopupTemplate) {
const table = document.createElement('table') const table = document.createElement('table')
for (const key in feature.properties) { for (const key in feature.properties) {
if (typeof feature.properties[key] === 'object' || key === 'name') continue if (typeof feature.properties[key] === 'object' || U.LABEL_KEYS.includes(key)) {
continue
}
table.appendChild(this.makeRow(feature, key)) table.appendChild(this.makeRow(feature, key))
} }
return table return table
@ -150,6 +152,19 @@ class GeoRSSLink extends PopupTemplate {
} }
class OSM extends TitleMixin(PopupTemplate) { class OSM extends TitleMixin(PopupTemplate) {
renderTitle(feature) {
const title = DomUtil.add('h3', 'popup-title')
const color = feature.getPreviewColor()
title.style.backgroundColor = color
const iconUrl = feature.getDynamicOption('iconUrl')
const icon = Icon.makeElement(iconUrl, title)
DomUtil.addClass(icon, 'icon')
Icon.setContrast(icon, title, iconUrl, color)
if (DomUtil.contrastedColor(title, color)) title.style.color = 'white'
DomUtil.add('span', '', title, this.getName(feature))
return title
}
getName(feature) { getName(feature) {
const props = feature.properties const props = feature.properties
const locale = getLocale() const locale = getLocale()
@ -160,15 +175,6 @@ class OSM extends TitleMixin(PopupTemplate) {
renderBody(feature) { renderBody(feature) {
const props = feature.properties const props = feature.properties
const body = document.createElement('div') const body = document.createElement('div')
const title = DomUtil.add('h3', 'popup-title', container)
const color = feature.getPreviewColor()
title.style.backgroundColor = color
const iconUrl = feature.getDynamicOption('iconUrl')
const icon = Icon.makeElement(iconUrl, title)
DomUtil.addClass(icon, 'icon')
Icon.setContrast(icon, title, iconUrl, color)
if (DomUtil.contrastedColor(title, color)) title.style.color = 'white'
DomUtil.add('span', '', title, this.getName(feature))
const street = props['addr:street'] const street = props['addr:street']
if (street) { if (street) {
const row = DomUtil.add('address', 'address', body) const row = DomUtil.add('address', 'address', body)
@ -205,6 +211,13 @@ class OSM extends TitleMixin(PopupTemplate) {
Utils.loadTemplate(`<div><a href="mailto:${email}">${email}</a></div>`) Utils.loadTemplate(`<div><a href="mailto:${email}">${email}</a></div>`)
) )
} }
if (props.panoramax) {
body.appendChild(
Utils.loadTemplate(
`<div><img src="https://api.panoramax.xyz/api/pictures/${props.panoramax}/sd.jpg" /></div>`
)
)
}
const id = props['@id'] || props.id const id = props['@id'] || props.id
if (id) { if (id) {
body.appendChild( body.appendChild(

View file

@ -75,7 +75,7 @@ const FeatureMixin = {
resetTooltip: function () { resetTooltip: function () {
if (!this.feature.hasGeom()) return if (!this.feature.hasGeom()) return
const displayName = this.feature.getDisplayName(null) const displayName = this.feature.getDisplayName()
let showLabel = this.feature.getOption('showLabel') let showLabel = this.feature.getOption('showLabel')
const oldLabelHover = this.feature.getOption('labelHover') const oldLabelHover = this.feature.getOption('labelHover')
@ -255,7 +255,10 @@ const PathMixin = {
if (this._map.measureTools?.enabled()) { if (this._map.measureTools?.enabled()) {
this._map._umap.tooltip.open({ content: this.getMeasure(), anchor: this }) this._map._umap.tooltip.open({ content: this.getMeasure(), anchor: this })
} else if (this._map._umap.editEnabled && !this._map._umap.editedFeature) { } else if (this._map._umap.editEnabled && !this._map._umap.editedFeature) {
this._map._umap.tooltip.open({ content: translate('Click to edit'), anchor: this }) this._map._umap.tooltip.open({
content: translate('Click to edit'),
anchor: this,
})
} }
}, },
@ -267,7 +270,9 @@ const PathMixin = {
this._map.once('moveend', this.makeGeometryEditable, this) this._map.once('moveend', this.makeGeometryEditable, this)
const pointsCount = this._parts.reduce((acc, part) => acc + part.length, 0) const pointsCount = this._parts.reduce((acc, part) => acc + part.length, 0)
if (pointsCount > 100 && this._map.getZoom() < this._map.getMaxZoom()) { if (pointsCount > 100 && this._map.getZoom() < this._map.getMaxZoom()) {
this._map._umap.tooltip.open({ content: L._('Please zoom in to edit the geometry') }) this._map._umap.tooltip.open({
content: L._('Please zoom in to edit the geometry'),
})
this.disableEdit() this.disableEdit()
} else { } else {
this.enableEdit() this.enableEdit()
@ -380,8 +385,19 @@ export const LeafletPolyline = Polyline.extend({
}, },
getMeasure: function (shape) { getMeasure: function (shape) {
let shapes
if (shape) {
shapes = [shape]
} else if (LineUtil.isFlat(this._latlngs)) {
shapes = [this._latlngs]
} else {
shapes = this._latlngs
}
// FIXME: compute from data in feature (with TurfJS) // FIXME: compute from data in feature (with TurfJS)
const length = L.GeoUtil.lineLength(this._map, shape || this._defaultShape()) const length = shapes.reduce(
(acc, shape) => acc + L.GeoUtil.lineLength(this._map, shape),
0
)
return L.GeoUtil.readableDistance(length, this._map.measureTools.getMeasureUnit()) return L.GeoUtil.readableDistance(length, this._map.measureTools.getMeasureUnit())
}, },
}) })

View file

@ -55,7 +55,6 @@ export class DataLayerUpdater extends BaseUpdater {
upsert({ value }) { upsert({ value }) {
// Upsert only happens when a new datalayer is created. // Upsert only happens when a new datalayer is created.
this._umap.createDataLayer(value, false) this._umap.createDataLayer(value, false)
this._umap.render([])
} }
update({ key, metadata, value }) { update({ key, metadata, value }) {

View file

@ -105,7 +105,7 @@ export default class TableEditor extends WithTemplate {
resetProperties() { resetProperties() {
this.properties = this.datalayer._propertiesIndex this.properties = this.datalayer._propertiesIndex
if (this.properties.length === 0) { if (this.properties.length === 0) {
this.properties = ['name', 'description'] this.properties = [U.DEFAULT_LABEL_KEY, 'description']
} }
} }

View file

@ -71,6 +71,10 @@ export default class Umap extends ServerStored {
// To be used in javascript APIs // To be used in javascript APIs
if (geojson.properties.lang) U.lang = geojson.properties.lang if (geojson.properties.lang) U.lang = geojson.properties.lang
// Make it available to utils, without needing a reference to `Umap`.
U.LABEL_KEYS = geojson.properties.defaultLabelKeys || []
U.DEFAULT_LABEL_KEY = U.LABEL_KEYS[0] || 'name'
this.setPropertiesFromQueryString() this.setPropertiesFromQueryString()
// Needed for actions labels // Needed for actions labels
@ -684,7 +688,7 @@ export default class Umap extends ServerStored {
} }
allProperties() { allProperties() {
return [].concat(...this.datalayersIndex.map((dl) => dl._propertiesIndex)) return [].concat(...this.datalayersIndex.map((dl) => dl.allProperties()))
} }
sortedValues(property) { sortedValues(property) {
@ -1257,9 +1261,10 @@ export default class Umap extends ServerStored {
} }
} }
render(fields) { render(fields = []) {
const impacted = this.propagate(fields) // Propagate will remove the fields it has already
if (impacted) return // No need to run a wider reflow // processed
fields = this.propagate(fields)
const impacts = Utils.getImpactsFromSchema(fields) const impacts = Utils.getImpactsFromSchema(fields)
for (const impact of impacts) { for (const impact of impacts) {
@ -1323,14 +1328,13 @@ export default class Umap extends ServerStored {
}) })
}, },
} }
let impacted = false
for (const [field, impact] of Object.entries(impacts)) { for (const [field, impact] of Object.entries(impacts)) {
if (!fields.length || fields.includes(field)) { if (!fields.length || fields.includes(field)) {
impact() impact()
impacted = true fields = fields.filter((item) => item !== field)
} }
} }
return impacted return fields
} }
// TODO: allow to control the default datalayer // TODO: allow to control the default datalayer
@ -1533,7 +1537,6 @@ export default class Umap extends ServerStored {
importRaw(rawData) { importRaw(rawData) {
const importedData = JSON.parse(rawData) const importedData = JSON.parse(rawData)
const mustReindex = 'sortKey' in Object.keys(importedData.properties)
this.setProperties(importedData.properties) this.setProperties(importedData.properties)
@ -1550,12 +1553,12 @@ export default class Umap extends ServerStored {
dataLayer.fromUmapGeoJSON(geojson) dataLayer.fromUmapGeoJSON(geojson)
} }
this._leafletMap.renderUI() // For now render->propagate expect a `properties.` prefix.
this.eachDataLayer((datalayer) => { // Remove this when we have refactored schema and render.
if (mustReindex) datalayer.reindex() const fields = Object.keys(importedData.properties).map(
datalayer.redraw() (field) => `properties.${field}`
}) )
this.propagate() this.render(fields)
this._leafletMap._setDefaultCenter() this._leafletMap._setDefaultCenter()
this.isDirty = true this.isDirty = true
} }

View file

@ -292,7 +292,7 @@ export function naturalSort(a, b, lang) {
} }
export function sortFeatures(features, sortKey, lang) { export function sortFeatures(features, sortKey, lang) {
const sortKeys = (sortKey || 'name').split(',') const sortKeys = sortKey.split(',')
const sort = (a, b, i) => { const sort = (a, b, i) => {
let sortKey = sortKeys[i] let sortKey = sortKeys[i]

View file

@ -170,22 +170,43 @@ L.DomUtil.contrastWCAG21 = (rgb) => {
const contrast = (whiteLum + 0.05) / (lum + 0.05) const contrast = (whiteLum + 0.05) / (lum + 0.05)
return contrast > 3 ? 1 : 0 return contrast > 3 ? 1 : 0
} }
L.DomUtil.colorNameToHex = (str) => {
const ctx = document.createElement('canvas').getContext('2d')
ctx.fillStyle = str
return ctx.fillStyle
}
L.DomUtil.hexToRGB = (hex) => {
return hex
.replace(
/^#?([a-f\d])([a-f\d])([a-f\d])$/i,
(m, r, g, b) => `#${r}${r}${g}${g}${b}${b}`
)
.substring(1)
.match(/.{2}/g)
.map((x) => Number.parseInt(x, 16))
}
const _CACHE_CONSTRAST = {} const _CACHE_CONSTRAST = {}
L.DomUtil.contrastedColor = (el, bgcolor) => { L.DomUtil.contrastedColor = (el, bgcolor) => {
// Return 0 for black and 1 for white // Return 0 for black and 1 for white
// bgcolor is a human color, it can be a any keyword (purple…) // bgcolor is a human color, it can be a any keyword (purple…)
if (typeof _CACHE_CONSTRAST[bgcolor] !== 'undefined') return _CACHE_CONSTRAST[bgcolor] if (typeof _CACHE_CONSTRAST[bgcolor] !== 'undefined') return _CACHE_CONSTRAST[bgcolor]
let out = 0
let rgb = window.getComputedStyle(el).getPropertyValue('background-color') let rgb = window.getComputedStyle(el).getPropertyValue('background-color')
rgb = L.DomUtil.RGBRegex.exec(rgb) rgb = L.DomUtil.RGBRegex.exec(rgb)
if (!rgb || rgb.length !== 4) return out if (rgb && rgb.length === 4) {
rgb = [ rgb = [
Number.parseInt(rgb[1], 10), Number.parseInt(rgb[1], 10),
Number.parseInt(rgb[2], 10), Number.parseInt(rgb[2], 10),
Number.parseInt(rgb[3], 10), Number.parseInt(rgb[3], 10),
] ]
out = L.DomUtil.contrastWCAG21(rgb) } else {
// The element may not yet be added to the DOM, so let's try
// another way
const hex = L.DomUtil.colorNameToHex(bgcolor)
rgb = L.DomUtil.hexToRGB(hex)
}
if (!rgb) return 1
const out = L.DomUtil.contrastWCAG21(rgb)
if (bgcolor) _CACHE_CONSTRAST[bgcolor] = out if (bgcolor) _CACHE_CONSTRAST[bgcolor] = out
return out return out
} }

View file

@ -448,6 +448,17 @@ L.FormBuilder.BlurInput.include({
}, },
}) })
// Adds an autocomplete using all available user defined properties
L.FormBuilder.PropertyInput = L.FormBuilder.BlurInput.extend({
build: function () {
L.FormBuilder.BlurInput.prototype.build.call(this)
const autocomplete = new U.AutocompleteDatalist(this.input)
// Will be used on Umap and DataLayer
const properties = this.builder.obj.allProperties()
autocomplete.suggestions = properties
},
})
L.FormBuilder.IconUrl = L.FormBuilder.BlurInput.extend({ L.FormBuilder.IconUrl = L.FormBuilder.BlurInput.extend({
type: () => 'hidden', type: () => 'hidden',
@ -1110,10 +1121,11 @@ U.FormBuilder = L.FormBuilder.extend({
}, },
customHandlers: { customHandlers: {
sortKey: 'BlurInput', sortKey: 'PropertyInput',
easing: 'Switch', easing: 'Switch',
facetKey: 'BlurInput', facetKey: 'PropertyInput',
slugKey: 'BlurInput', slugKey: 'PropertyInput',
labelKey: 'PropertyInput',
}, },
computeDefaultOptions: function () { computeDefaultOptions: function () {

View file

@ -24,6 +24,7 @@
<link rel="stylesheet" href="{% static 'umap/font.css' %}" /> <link rel="stylesheet" href="{% static 'umap/font.css' %}" />
<link rel="stylesheet" href="{% static 'umap/css/icon.css' %}" /> <link rel="stylesheet" href="{% static 'umap/css/icon.css' %}" />
<link rel="stylesheet" href="{% static 'umap/base.css' %}" /> <link rel="stylesheet" href="{% static 'umap/base.css' %}" />
<link rel="stylesheet" href="{% static 'umap/css/form.css' %}" />
<link rel="stylesheet" href="{% static 'umap/content.css' %}" /> <link rel="stylesheet" href="{% static 'umap/content.css' %}" />
<link rel="stylesheet" href="{% static 'umap/nav.css' %}" /> <link rel="stylesheet" href="{% static 'umap/nav.css' %}" />
<link rel="stylesheet" href="{% static 'umap/map.css' %}" /> <link rel="stylesheet" href="{% static 'umap/map.css' %}" />

View file

@ -42,7 +42,7 @@ class LicenceFactory(factory.django.DjangoModelFactory):
class TileLayerFactory(factory.django.DjangoModelFactory): class TileLayerFactory(factory.django.DjangoModelFactory):
name = "Test zoom layer" name = "Test zoom layer"
url_template = "https://{s}.test.org/osmfr/{z}/{x}/{y}.png" url_template = "https://tile.openstreetmap.org/{z}/{x}/{y}.png"
attribution = "Test layer attribution" attribution = "Test layer attribution"
class Meta: class Meta:
@ -156,5 +156,6 @@ def login_required(response):
def mock_tiles(route): def mock_tiles(route):
print("Intercepted route", route.request.url)
path = Path(__file__).parent / "fixtures/empty_tile.png" path = Path(__file__).parent / "fixtures/empty_tile.png"
route.fulfill(path=path) route.fulfill(path=path)

View file

@ -1,4 +1,5 @@
import os import os
import re
import subprocess import subprocess
import time import time
from pathlib import Path from pathlib import Path
@ -25,7 +26,7 @@ def set_timeout(context):
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
def mock_osm_tiles(page): def mock_osm_tiles(page):
if not bool(os.environ.get("PWDEBUG", False)): if not bool(os.environ.get("PWDEBUG", False)):
page.route("*/**/osmfr/**", mock_tiles) page.route(re.compile(r".*tile\..*"), mock_tiles)
@pytest.fixture @pytest.fixture

View file

@ -15,7 +15,12 @@ DATALAYER_DATA = {
"features": [ "features": [
{ {
"type": "Feature", "type": "Feature",
"properties": {"name": "one point in france", "foo": "point", "bar": "one"}, "properties": {
"name": "one point in france",
"foo": "point",
"bar": "one",
"label": "this is label one",
},
"geometry": {"type": "Point", "coordinates": [3.339844, 46.920255]}, "geometry": {"type": "Point", "coordinates": [3.339844, 46.920255]},
}, },
{ {
@ -24,6 +29,7 @@ DATALAYER_DATA = {
"name": "one polygon in greenland", "name": "one polygon in greenland",
"foo": "polygon", "foo": "polygon",
"bar": "two", "bar": "two",
"label": "this is label two",
}, },
"geometry": { "geometry": {
"type": "Polygon", "type": "Polygon",
@ -44,6 +50,7 @@ DATALAYER_DATA = {
"name": "one line in new zeland", "name": "one line in new zeland",
"foo": "line", "foo": "line",
"bar": "three", "bar": "three",
"label": "this is label three",
}, },
"geometry": { "geometry": {
"type": "LineString", "type": "LineString",
@ -476,3 +483,11 @@ def test_main_toolbox_toggle_all_layers(live_server, map, page):
# Should hidden again all layers # Should hidden again all layers
expect(page.locator(".datalayer.off")).to_have_count(3) expect(page.locator(".datalayer.off")).to_have_count(3)
expect(markers).to_have_count(0) expect(markers).to_have_count(0)
def test_honour_the_label_fields_settings(live_server, map, page, bootstrap, settings):
settings.UMAP_LABEL_KEYS = ["label", "name"]
page.goto(f"{live_server.url}{map.get_absolute_url()}")
expect(page.locator(".panel").get_by_text("this is label one")).to_be_visible()
expect(page.locator(".panel").get_by_text("this is label two")).to_be_visible()
expect(page.locator(".panel").get_by_text("this is label three")).to_be_visible()

View file

@ -72,8 +72,6 @@ def test_umap_import_from_file(live_server, tilelayer, page):
def test_umap_import_from_textarea(live_server, tilelayer, page, settings): def test_umap_import_from_textarea(live_server, tilelayer, page, settings):
page.route("https://tile.openstreetmap.fr/hot/**", mock_tiles)
settings.UMAP_ALLOW_ANONYMOUS = True settings.UMAP_ALLOW_ANONYMOUS = True
page.goto(f"{live_server.url}/map/new/") page.goto(f"{live_server.url}/map/new/")
page.get_by_role("button", name="Open browser").click() page.get_by_role("button", name="Open browser").click()
@ -607,6 +605,7 @@ def test_overpass_import_with_bbox(page, live_server, tilelayer, settings):
} }
page.goto(f"{live_server.url}/map/new/") page.goto(f"{live_server.url}/map/new/")
page.get_by_role("link", name="Import data").click() page.get_by_role("link", name="Import data").click()
page.get_by_role("button", name="Import helpers").click()
page.get_by_role("button", name="Overpass").click() page.get_by_role("button", name="Overpass").click()
page.get_by_placeholder("amenity=drinking_water").fill("building") page.get_by_placeholder("amenity=drinking_water").fill("building")
page.get_by_role("button", name="Choose this data").click() page.get_by_role("button", name="Choose this data").click()
@ -657,6 +656,7 @@ def test_overpass_import_retains_boundary(page, live_server, tilelayer, settings
page.route(re.compile("https://foobar.io/api.*"), handle) page.route(re.compile("https://foobar.io/api.*"), handle)
page.goto(f"{live_server.url}/map/new/") page.goto(f"{live_server.url}/map/new/")
page.get_by_role("link", name="Import data").click() page.get_by_role("link", name="Import data").click()
page.get_by_role("button", name="Import helpers").click()
page.get_by_role("button", name="Overpass").click() page.get_by_role("button", name="Overpass").click()
page.get_by_placeholder("amenity=drinking_water").fill("building") page.get_by_placeholder("amenity=drinking_water").fill("building")
page.get_by_placeholder("Type area name, or let empty").click() page.get_by_placeholder("Type area name, or let empty").click()
@ -669,6 +669,7 @@ def test_overpass_import_retains_boundary(page, live_server, tilelayer, settings
expect(page.get_by_placeholder("Provide an URL here")).to_have_value( expect(page.get_by_placeholder("Provide an URL here")).to_have_value(
"https://my.overpass.io/interpreter?data=[out:json];nwr[building](area:3601393025);out geom;" "https://my.overpass.io/interpreter?data=[out:json];nwr[building](area:3601393025);out geom;"
) )
page.get_by_role("button", name="Import helpers").click()
page.get_by_role("button", name="Overpass").click() page.get_by_role("button", name="Overpass").click()
expect(page.locator("#area")).to_contain_text( expect(page.locator("#area")).to_contain_text(
"Bray-sur-Seine, Seine-et-Marne, Île-de-France, France" "Bray-sur-Seine, Seine-et-Marne, Île-de-France, France"
@ -710,6 +711,7 @@ def test_import_from_datasets(page, live_server, tilelayer, settings):
page.goto(f"{live_server.url}/map/new/") page.goto(f"{live_server.url}/map/new/")
expect(page.locator(".leaflet-marker-icon")).to_be_hidden() expect(page.locator(".leaflet-marker-icon")).to_be_hidden()
page.get_by_role("link", name="Import data").click() page.get_by_role("link", name="Import data").click()
page.get_by_role("button", name="Import helpers").click()
page.get_by_role("button", name="Datasets").click() page.get_by_role("button", name="Datasets").click()
page.get_by_role("dialog").get_by_role("combobox").select_option( page.get_by_role("dialog").get_by_role("combobox").select_option(
"https://remote.org/data.json" "https://remote.org/data.json"

View file

@ -0,0 +1,44 @@
import pytest
from playwright.sync_api import expect
from ..base import DataLayerFactory
pytestmark = pytest.mark.django_db
OSM_DATA = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {"type": "Point", "coordinates": [2.49, 48.79]},
"properties": {
"amenity": "restaurant",
"cuisine": "italian",
"name": "A Casa di Nonna",
"panoramax": "d811b398-d930-4cf8-95a2-0c29c34d9fca",
"phone": "+33 1 48 89 54 12",
"takeaway:covid19": "yes",
"wheelchair": "no",
"id": "node/1130849864",
},
"id": "AzMjk",
},
],
"_umap_options": {
"popupTemplate": "OSM",
},
}
def test_openstreetmap_popup(live_server, map, page):
DataLayerFactory(map=map, data=OSM_DATA)
page.goto(f"{live_server.url}{map.get_absolute_url()}#18/48.79/2.49")
expect(page.locator(".umap-icon-active")).to_be_hidden()
page.locator(".leaflet-marker-icon").click()
expect(page.get_by_role("heading", name="A Casa di Nonna")).to_be_visible()
expect(page.get_by_text("+33 1 48 89 54 12")).to_be_visible()
img = page.locator(".umap-popup-content img")
expect(img).to_have_attribute(
"src",
"https://api.panoramax.xyz/api/pictures/d811b398-d930-4cf8-95a2-0c29c34d9fca/sd.jpg",
)

View file

@ -49,3 +49,37 @@ def test_should_open_popup_on_click(live_server, map, page, bootstrap):
# Close popup # Close popup
page.locator("#map").click() page.locator("#map").click()
expect(line).to_have_attribute("stroke-opacity", "0.5") expect(line).to_have_attribute("stroke-opacity", "0.5")
def test_can_use_measure_on_name(live_server, map, page):
data = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {"name": "linestring"},
"geometry": {
"type": "LineString",
"coordinates": [
[11.25, 53.585984],
[10.151367, 52.975108],
],
},
},
{
"type": "Feature",
"properties": {"name": "multilinestring"},
"geometry": {
"type": "MultiLineString",
"coordinates": [[[8, 53], [13, 52]], [[12, 51], [15, 52]]],
},
},
],
}
map.settings["properties"]["labelKey"] = "{name} ({measure})"
map.settings["properties"]["onLoadPanel"] = "databrowser"
map.save()
DataLayerFactory(map=map, data=data)
page.goto(f"{live_server.url}{map.get_absolute_url()}#6/10/50")
expect(page.get_by_text("linestring (99.7 km)")).to_be_visible()
expect(page.get_by_text("multilinestring (592 km)")).to_be_visible()

View file

@ -609,6 +609,7 @@ class MapDetailMixin(SessionMixin):
"websocketEnabled": settings.WEBSOCKET_ENABLED, "websocketEnabled": settings.WEBSOCKET_ENABLED,
"websocketURI": settings.WEBSOCKET_FRONT_URI, "websocketURI": settings.WEBSOCKET_FRONT_URI,
"importers": settings.UMAP_IMPORTERS, "importers": settings.UMAP_IMPORTERS,
"defaultLabelKeys": settings.UMAP_LABEL_KEYS,
} }
created = bool(getattr(self, "object", None)) created = bool(getattr(self, "object", None))
if (created and self.object.owner) or (not created and not user.is_anonymous): if (created and self.object.owner) or (not created and not user.is_anonymous):