@tekkare/romulus 0.1.122 → 0.1.123
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/module.json +1 -1
- package/dist/runtime/components/ComplexSelect.vue +1 -1
- package/dist/runtime/components/DropdownSelect.vue +1 -1
- package/dist/runtime/components/FilterComplex.vue +1 -1
- package/dist/runtime/components/FilterDropdown.vue +1 -1
- package/dist/runtime/components/Modal.vue +14 -1
- package/dist/runtime/components/MultipleSelect.vue +1 -1
- package/dist/runtime/composables/useRmDialog.js +2 -0
- package/dist/runtime/utils/panels.d.ts +16 -1
- package/dist/runtime/utils/panels.js +12 -6
- package/package.json +1 -1
package/dist/module.json
CHANGED
|
@@ -278,7 +278,7 @@ function applyPreset(preset: RmComplexSelectPreset) {
|
|
|
278
278
|
|
|
279
279
|
let unregister: (() => void) | undefined
|
|
280
280
|
onMounted(() => {
|
|
281
|
-
unregister = rmPanelRegister(close)
|
|
281
|
+
unregister = rmPanelRegister(close, () => isOpen.value)
|
|
282
282
|
})
|
|
283
283
|
|
|
284
284
|
onUnmounted(() => {
|
|
@@ -302,7 +302,7 @@ function onKeydown(e: KeyboardEvent) {
|
|
|
302
302
|
|
|
303
303
|
let unregister: (() => void) | undefined
|
|
304
304
|
onMounted(() => {
|
|
305
|
-
unregister = rmPanelRegister(close)
|
|
305
|
+
unregister = rmPanelRegister(close, () => isOpen.value)
|
|
306
306
|
document.addEventListener('click', onClickOutside)
|
|
307
307
|
document.addEventListener('keydown', onKeydown)
|
|
308
308
|
})
|
|
@@ -159,7 +159,7 @@ function onClickOutside(e: Event) {
|
|
|
159
159
|
|
|
160
160
|
let unregister: (() => void) | undefined
|
|
161
161
|
onMounted(() => {
|
|
162
|
-
unregister = rmPanelRegister(close)
|
|
162
|
+
unregister = rmPanelRegister(close, () => isOpen.value)
|
|
163
163
|
document.addEventListener('click', onClickOutside)
|
|
164
164
|
})
|
|
165
165
|
onUnmounted(() => {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { computed, ref, toRef } from 'vue'
|
|
3
3
|
import { PhX } from '@phosphor-icons/vue'
|
|
4
4
|
import { useRmDialog } from '../composables/useRmDialog'
|
|
5
|
+
import { rmPanelsDismiss } from '../utils/panels'
|
|
5
6
|
|
|
6
7
|
export interface RmModalProps {
|
|
7
8
|
/** Whether the modal is open */
|
|
@@ -37,6 +38,18 @@ function close() {
|
|
|
37
38
|
emit('update:modelValue', false)
|
|
38
39
|
}
|
|
39
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Un panneau ouvert prend le clic avant le voile.
|
|
43
|
+
*
|
|
44
|
+
* Une liste deployee dans le formulaire deborde souvent de la boite : le clic
|
|
45
|
+
* qui vise a la refermer tombe sur le voile, et la modale partait avec, tout
|
|
46
|
+
* le formulaire avec elle.
|
|
47
|
+
*/
|
|
48
|
+
function onOverlayClick() {
|
|
49
|
+
if (rmPanelsDismiss()) return
|
|
50
|
+
close()
|
|
51
|
+
}
|
|
52
|
+
|
|
40
53
|
const surface = ref<HTMLElement | null>(null)
|
|
41
54
|
useRmDialog({ open: toRef(props, 'modelValue'), surface, close })
|
|
42
55
|
|
|
@@ -62,7 +75,7 @@ const modalStyle = computed(() => {
|
|
|
62
75
|
<div
|
|
63
76
|
v-if="modelValue"
|
|
64
77
|
class="rm-modal-overlay"
|
|
65
|
-
@click.self="
|
|
78
|
+
@click.self="onOverlayClick"
|
|
66
79
|
>
|
|
67
80
|
<div
|
|
68
81
|
ref="surface"
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { nextTick, onBeforeUnmount, watch } from "vue";
|
|
2
|
+
import { rmPanelsDismiss } from "../utils/panels.js";
|
|
2
3
|
const FOCUSABLE = [
|
|
3
4
|
"a[href]",
|
|
4
5
|
"button:not([disabled])",
|
|
@@ -15,6 +16,7 @@ export function useRmDialog({ open, surface, close }) {
|
|
|
15
16
|
function onKeydown(event) {
|
|
16
17
|
if (event.key === "Escape") {
|
|
17
18
|
event.stopPropagation();
|
|
19
|
+
if (rmPanelsDismiss()) return;
|
|
18
20
|
close();
|
|
19
21
|
return;
|
|
20
22
|
}
|
|
@@ -2,7 +2,22 @@
|
|
|
2
2
|
* Inscrit un panneau. A appeler au montage, cote client seulement : sur le
|
|
3
3
|
* serveur le registre est partage par toutes les requetes et personne ne le
|
|
4
4
|
* vide.
|
|
5
|
+
*
|
|
6
|
+
* `isOpen` est facultatif mais vivement conseille : sans lui, le panneau ne
|
|
7
|
+
* protege pas la surface qui le porte du clic qui le referme.
|
|
5
8
|
*/
|
|
6
|
-
export declare function rmPanelRegister(close: () => void): () => boolean;
|
|
9
|
+
export declare function rmPanelRegister(close: () => void, isOpen?: () => boolean): () => boolean;
|
|
7
10
|
/** Ferme tous les panneaux sauf celui qui vient de s'ouvrir. */
|
|
8
11
|
export declare function rmPanelOpened(self: () => void): void;
|
|
12
|
+
/**
|
|
13
|
+
* Referme les panneaux deployes, et dit s'il y en avait.
|
|
14
|
+
*
|
|
15
|
+
* Une modale se ferme au clic sur son voile et a `Escape`. Un panneau pose
|
|
16
|
+
* dans son formulaire deborde souvent de la boite : le clic qui vise a le
|
|
17
|
+
* refermer tombe alors sur le voile, et l'utilisateur perd tout son
|
|
18
|
+
* formulaire pour avoir voulu replier une liste. Meme geste au clavier.
|
|
19
|
+
*
|
|
20
|
+
* La surface appelle donc ceci d'abord : si un panneau etait ouvert, le geste
|
|
21
|
+
* lui revient et s'arrete la.
|
|
22
|
+
*/
|
|
23
|
+
export declare function rmPanelsDismiss(): boolean;
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
const
|
|
2
|
-
export function rmPanelRegister(close) {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
const panels = /* @__PURE__ */ new Set();
|
|
2
|
+
export function rmPanelRegister(close, isOpen) {
|
|
3
|
+
const panel = { close, isOpen };
|
|
4
|
+
panels.add(panel);
|
|
5
|
+
return () => panels.delete(panel);
|
|
5
6
|
}
|
|
6
7
|
export function rmPanelOpened(self) {
|
|
7
|
-
|
|
8
|
-
if (close !== self) close();
|
|
8
|
+
panels.forEach((panel) => {
|
|
9
|
+
if (panel.close !== self) panel.close();
|
|
9
10
|
});
|
|
10
11
|
}
|
|
12
|
+
export function rmPanelsDismiss() {
|
|
13
|
+
const open = [...panels].filter((panel) => panel.isOpen?.());
|
|
14
|
+
open.forEach((panel) => panel.close());
|
|
15
|
+
return open.length > 0;
|
|
16
|
+
}
|