diff --git a/docs-users/fr/support/faq.md b/docs-users/fr/support/faq.md
index 0705713f9..b19367273 100644
--- a/docs-users/fr/support/faq.md
+++ b/docs-users/fr/support/faq.md
@@ -10,3 +10,30 @@
* `Lien simple : [[http://example.com]]` → Lien simple : [http://example.com](http://example.com)
* `Lien avec texte : [[http://exemple.fr|texte du lien]]` → Lien avec texte : [texte du lien](http://example.com)
* `--- pour un séparateur horizontal` ⤵
+
+## Quels sont les raccourcis clavier? {: #keyboard-shortcuts}
+
+Sur MacOS, utliser `Cmd` à la place de `Ctrl`.
+
+### Génériques
+
+* `Ctrl+F` → ouvre le panneau de recherche
+* `Ctrl+E` → bascule en mode édition
+* `Escape` → ferme le panneau ou la fenêtre dialogue ouverte
+* `Shift+drag` sur la carte → zoom vers cette zone
+* `Shift+click` sur les boutons de zoom → zoom ou dézoom de trois niveaux
+
+### En mode édition
+
+* `Ctrl+E` → retour à l'aperçu
+* `Ctrl+S` → sauvegarde la carte
+* `Ctrl+Z` → annule tous les changements depuis la dernière sauvegarde
+* `Ctrl+M` → ajouter un nouveau marqueur
+* `Ctrl+P` → commence un nouveau polygone
+* `Ctrl+L` → commence une nouvelle ligne
+* `Ctrl+I` → ouvre le panneau d'import de données
+* `Ctrl+O` → ouvre le panneau d'import et le navigateur de fichiers
+* `Ctrl++` → zoom
+* `Ctrl+-` → dézoome
+* `Shift+click` sur un élément → ouvre le panneau d'édition de cet élément
+* `Ctrl+Shift+click` sur un élément → ouvre le panneau d'édition du calque de cet élément
diff --git a/docs-users/support/faq.md b/docs-users/support/faq.md
index 552bcee8a..fd979517c 100644
--- a/docs-users/support/faq.md
+++ b/docs-users/support/faq.md
@@ -10,3 +10,31 @@
* `Simple link: [[http://example.com]]` → Simple link: [http://example.com](http://example.com)
* `Link with text: [[http://example.com|text of the link]]` → Link with text: [text of the link](http://example.com)
* `--- for a horizontal rule` ⤵
+
+## What are the available keyboard shortcuts? {: #keyboard-shortcuts}
+
+In MacOS, `Ctrl` is replaced by `Cmd`.
+
+### Globals
+
+* `Ctrl+F` → open search panel
+* `Ctrl+E` → switch to edit mode
+* `Escape` → close open panel or dialog
+* `Shift+drag` on the map → zoom to this map extent
+* `Shift+click` on the zoom buttons → zoom in/out by 3 levels
+
+### In edit mode
+
+* `Ctrl+E` → back to preview mode
+* `Ctrl+S` → save map
+* `Ctrl+Z` → undo all changes until last save
+* `Ctrl+M` → add a new marker
+* `Ctrl+P` → start a new polygon
+* `Ctrl+L` → start a new line
+* `Ctrl+I` → open importer panel
+* `Ctrl+O` → open importer panel and file browser
+* `Ctrl++` → zoom in
+* `Ctrl+-` → zoom out
+* `Shift+click` on a feature → edit this feature
+* `Ctrl+Shift+click` on a feature → edit this feature layer
+
diff --git a/umap/static/umap/js/modules/ui/panel.js b/umap/static/umap/js/modules/ui/panel.js
index 5694a0809..986f4fac1 100644
--- a/umap/static/umap/js/modules/ui/panel.js
+++ b/umap/static/umap/js/modules/ui/panel.js
@@ -20,6 +20,10 @@ export class Panel {
if (!this.mode) this.mode = mode
}
+ isOpen() {
+ return this.container.classList.contains("on")
+ }
+
open({ content, className, actions = [] } = {}) {
this.container.className = `with-transition panel ${this.classname} ${this.mode || ''}`
this.container.innerHTML = ''
diff --git a/umap/static/umap/js/umap.core.js b/umap/static/umap/js/umap.core.js
index c485b3be0..9d23e8862 100644
--- a/umap/static/umap/js/umap.core.js
+++ b/umap/static/umap/js/umap.core.js
@@ -245,33 +245,6 @@ L.DomEvent.once = (el, types, fn, context) => {
return L.DomEvent.on(el, types, fn, context).on(el, types, handler, context)
}
-/*
- * Global events
- */
-U.Keys = {
- LEFT: 37,
- UP: 38,
- RIGHT: 39,
- DOWN: 40,
- TAB: 9,
- ENTER: 13,
- ESC: 27,
- APPLE: 91,
- SHIFT: 16,
- ALT: 17,
- CTRL: 18,
- E: 69,
- F: 70,
- H: 72,
- I: 73,
- L: 76,
- M: 77,
- O: 79,
- P: 80,
- S: 83,
- Z: 90,
-}
-
L.LatLng.prototype.isValid = function () {
return (
isFinite(this.lat) &&
diff --git a/umap/static/umap/js/umap.js b/umap/static/umap/js/umap.js
index c9ea9d0ca..e956970ae 100644
--- a/umap/static/umap/js/umap.js
+++ b/umap/static/umap/js/umap.js
@@ -518,73 +518,81 @@ U.Map = L.Map.extend({
initShortcuts: function () {
const globalShortcuts = function (e) {
- const key = e.keyCode
- const hasModifier = (e.ctrlKey || e.metaKey) && !e.shiftKey
- /* Generic shortcuts */
- if (key === U.Keys.F && hasModifier) {
- L.DomEvent.stop(e)
- this.search()
- } else if (e.keyCode === U.Keys.ESC) {
+ if (e.key === 'Escape') {
if (this.dialog.visible) {
this.dialog.close()
- } else {
- this.panel.close()
+ } else if (this.editEnabled && this.editTools.drawing()) {
+ this.editTools.stopDrawing()
+ } else if (this.measureTools.enabled()) {
+ this.measureTools.stopDrawing()
+ } else if (this.editPanel?.isOpen()) {
this.editPanel?.close()
+ } else if (this.fullPanel?.isOpen()) {
this.fullPanel?.close()
+ } else if (this.panel.isOpen()) {
+ this.panel.close()
}
}
- if (!this.hasEditMode()) return
+ // From now on, only ctrl/meta shortcut
+ if (!(e.ctrlKey || e.metaKey) || e.shiftKey) return
- /* Edit mode only shortcuts */
- if (key === U.Keys.E && hasModifier && !this.editEnabled) {
- L.DomEvent.stop(e)
- this.enableEdit()
- } else if (key === U.Keys.E && hasModifier && this.editEnabled && !this.isDirty) {
+ if (e.key === 'f') {
L.DomEvent.stop(e)
- this.disableEdit()
+ this.search()
}
- if (key === U.Keys.S && hasModifier) {
- L.DomEvent.stop(e)
- if (this.isDirty) {
- this.save()
+
+ /* Edit mode only shortcuts */
+ if (!this.hasEditMode()) return
+
+
+
+ // Edit mode Off
+ if (!this.editEnabled) {
+ switch (e.key) {
+ case 'e':
+ L.DomEvent.stop(e)
+ this.enableEdit()
+ break
}
+ return
}
- if (key === U.Keys.Z && hasModifier && this.isDirty) {
- L.DomEvent.stop(e)
- this.askForReset()
- }
- if (key === U.Keys.M && hasModifier && this.editEnabled) {
- L.DomEvent.stop(e)
- this.editTools.startMarker()
- }
- if (key === U.Keys.P && hasModifier && this.editEnabled) {
- L.DomEvent.stop(e)
- this.editTools.startPolygon()
- }
- if (key === U.Keys.L && hasModifier && this.editEnabled) {
- L.DomEvent.stop(e)
- this.editTools.startPolyline()
- }
- if (key === U.Keys.I && hasModifier && this.editEnabled) {
- L.DomEvent.stop(e)
- this.importer.open()
- }
- if (key === U.Keys.O && hasModifier && this.editEnabled) {
- L.DomEvent.stop(e)
- this.importer.openFiles()
- }
- if (key === U.Keys.H && hasModifier && this.editEnabled) {
- L.DomEvent.stop(e)
- this.help.show('edit')
- }
- if (e.keyCode === U.Keys.ESC) {
- if (this.editEnabled && this.editTools.drawing()) {
- this.editTools.stopDrawing()
- }
- if (this.measureTools.enabled()) this.measureTools.stopDrawing()
+
+ // Edit mode on
+ let used = true
+ switch (e.key) {
+ case 'e':
+ if (!this.isDirty) this.disableEdit()
+ break
+ case 's':
+ if (this.isDirty) this.save()
+ break
+ case 'z':
+ if (this.isDirty) this.askForReset()
+ break
+ case 'm':
+ this.editTools.startMarker()
+ break
+ case 'p':
+ this.editTools.startPolygon()
+ break
+ case 'l':
+ this.editTools.startPolyline()
+ break
+ case 'i':
+ this.importer.open()
+ break
+ case 'o':
+ this.importer.openFiles()
+ break
+ case 'h':
+ this.help.show('edit')
+ break
+ default:
+ used = false
}
+ if (used) L.DomEvent.stop(e)
}
L.DomEvent.addListener(document, 'keydown', globalShortcuts, this)
},