codevdesign 2.0.19 → 2.0.20

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.
@@ -1,198 +1,198 @@
1
- <template>
2
- <v-navigation-drawer
3
- v-model="visible"
4
- location="right"
5
- temporary
6
- color="background"
7
- class="pa-0 elevation-2 csqc-ligneBleue"
8
- :persistent="persistant"
9
- :width="grosseurTiroir"
10
- v-bind="$attrs"
11
- @keydown.esc="!persistant ? fermeture : ''"
12
- @click:outside="!persistant ? fermeture : ''"
13
- >
14
- <v-card
15
- color="background"
16
- class="pa-0 ma-0 pl-8 pt-8"
17
- >
18
- <!-- Bouton en haut à droite -->
19
- <v-btn
20
- icon="mdi-close"
21
- variant="plain"
22
- class="position-absolute iconeHover"
23
- color="primary"
24
- style="right: 5px; top: 5px; border-radius: 0px"
25
- @click="fermeture"
26
- ></v-btn>
27
-
28
- <v-card-title
29
- class="pa-0 ma-0 pb-6 text-wrap"
30
- style="font-size: 24px"
31
- >
32
- <slot name="titre"></slot>
33
- <div text-h5>{{ titre }}</div>
34
- </v-card-title>
35
-
36
- <v-card-text class="pa-0 ma-0 pb-6 pr-6">
37
- <v-container>
38
- <slot></slot>
39
- <slot name="content"></slot>
40
- </v-container>
41
- </v-card-text>
42
- <v-card-actions class="my-2 d-flex justify-end pr-6 pb-5">
43
- <slot name="actions"></slot>
44
- <bouton-tertiaire-standard
45
- v-if="btnAnnuler"
46
- :loading="operationEnCours"
47
- @click="fermeture"
48
- >
49
- {{ props.btnAnnulerTexte ? props.btnAnnulerTexte : $t('csqc.bouton.annuler') }}
50
- </bouton-tertiaire-standard>
51
-
52
- <bouton-primaire-standard
53
- v-if="btnOk"
54
- class="Gouttiere"
55
- :loading="operationEnCours"
56
- :disabled="btnOkDesactiver || operationEnCours"
57
- @click="okBouton"
58
- >
59
- {{ props.btnOkTexte ? props.btnOkTexte : $t('csqc.bouton.ok') }}
60
- </bouton-primaire-standard>
61
- </v-card-actions>
62
- </v-card>
63
- </v-navigation-drawer>
64
- <Teleport to="body">
65
- <v-fab
66
- v-if="retourEnHaut && afficherBoutonHaut"
67
- style="bottom: 24px; position: fixed; right: 24px; z-index: 2000"
68
- elevation="8"
69
- color="primary"
70
- icon="mdi-arrow-up"
71
- @click="allerEnHaut"
72
- />
73
- </Teleport>
74
- </template>
75
- <script lang="ts" setup>
76
- import { ref, computed, watch, nextTick, useAttrs } from 'vue'
77
- import { useDisplay } from 'vuetify'
78
-
79
- const visible = ref(false)
80
- const display = useDisplay()
81
- const attrs = useAttrs()
82
-
83
- // Déclaration des props
84
- const props = defineProps({
85
- titre: {
86
- type: String,
87
- default: '',
88
- required: false,
89
- },
90
- btnAnnuler: {
91
- type: Boolean,
92
- default: true,
93
- required: false,
94
- },
95
- btnOk: {
96
- type: Boolean,
97
- default: true,
98
- required: false,
99
- },
100
- btnAnnulerTexte: {
101
- type: String,
102
- default: '',
103
- required: false,
104
- },
105
- btnOkDesactiver: {
106
- type: Boolean,
107
- default: false,
108
- required: false,
109
- },
110
- operationEnCours: { type: Boolean, default: false },
111
- persistant: { type: Boolean, default: true },
112
- btnOkTexte: {
113
- type: String,
114
- default: '',
115
- required: false,
116
- },
117
- retourEnHaut: {
118
- type: Boolean,
119
- default: true,
120
- },
121
- })
122
-
123
- // Déclaration des événements
124
- const emit = defineEmits(['fermer', 'ok'])
125
-
126
- // Back to top
127
- const afficherBoutonHaut = ref(false)
128
- let conteneurScroll: Element | null = null
129
-
130
- function onScroll() {
131
- afficherBoutonHaut.value = (conteneurScroll?.scrollTop ?? 0) > 350
132
- }
133
-
134
- function allerEnHaut() {
135
- conteneurScroll?.scrollTo({ top: 0, behavior: 'smooth' })
136
- }
137
-
138
- watch(visible, async val => {
139
- if (!props.retourEnHaut) return
140
- if (val) {
141
- await nextTick()
142
- conteneurScroll = document.querySelector('.v-navigation-drawer--active .v-navigation-drawer__content')
143
- conteneurScroll?.addEventListener('scroll', onScroll)
144
- } else {
145
- conteneurScroll?.removeEventListener('scroll', onScroll)
146
- conteneurScroll = null
147
- afficherBoutonHaut.value = false
148
- }
149
- })
150
-
151
- // Méthodes
152
- const ouvrir = () => {
153
- visible.value = true
154
- }
155
-
156
- const fermer = () => {
157
- visible.value = false
158
- }
159
-
160
- const fermeture = () => {
161
- emit('fermer')
162
- fermer()
163
- }
164
-
165
- const okBouton = () => {
166
- emit('ok')
167
- fermer()
168
- }
169
-
170
- // Calcul des tailles du tiroir en fonction du breakpoint
171
- const grosseurTiroir = computed(() => {
172
- if (attrs.width !== undefined && attrs.width !== null) return attrs.width as string | number
173
- switch (display.name.value) {
174
- case 'xs':
175
- return ''
176
- case 'sm':
177
- return 0.95 * display.width.value
178
- case 'md':
179
- return 0.8 * display.width.value
180
- case 'lg':
181
- return 0.7 * display.width.value
182
- case 'xl':
183
- return 0.6 * display.width.value
184
- case 'xxl':
185
- return 0.5 * display.width.value
186
- default:
187
- return ''
188
- }
189
- })
190
-
191
- defineExpose({ ouvrir, fermer })
192
- </script>
193
-
194
- <style>
195
- .csqc-ligneBleue {
196
- border-left: 30px #095797 solid !important;
197
- }
198
- </style>
1
+ <template>
2
+ <v-navigation-drawer
3
+ v-model="visible"
4
+ location="right"
5
+ temporary
6
+ color="background"
7
+ class="pa-0 elevation-2 csqc-ligneBleue"
8
+ :persistent="persistant"
9
+ :width="grosseurTiroir"
10
+ v-bind="$attrs"
11
+ @keydown.esc="!persistant ? fermeture : ''"
12
+ @click:outside="!persistant ? fermeture : ''"
13
+ >
14
+ <v-card
15
+ color="background"
16
+ class="pa-0 ma-0 pl-8 pt-8"
17
+ >
18
+ <!-- Bouton en haut à droite -->
19
+ <v-btn
20
+ icon="mdi-close"
21
+ variant="plain"
22
+ class="position-absolute iconeHover"
23
+ color="primary"
24
+ style="right: 5px; top: 5px; border-radius: 0px"
25
+ @click="fermeture"
26
+ ></v-btn>
27
+
28
+ <v-card-title
29
+ class="pa-0 ma-0 pb-6 text-wrap"
30
+ style="font-size: 24px"
31
+ >
32
+ <slot name="titre"></slot>
33
+ <div text-h5>{{ titre }}</div>
34
+ </v-card-title>
35
+
36
+ <v-card-text class="pa-0 ma-0 pb-6 pr-6">
37
+ <v-container>
38
+ <slot></slot>
39
+ <slot name="content"></slot>
40
+ </v-container>
41
+ </v-card-text>
42
+ <v-card-actions class="my-2 d-flex justify-end pr-6 pb-5">
43
+ <slot name="actions"></slot>
44
+ <bouton-tertiaire-standard
45
+ v-if="btnAnnuler"
46
+ :loading="operationEnCours"
47
+ @click="fermeture"
48
+ >
49
+ {{ props.btnAnnulerTexte ? props.btnAnnulerTexte : $t('csqc.bouton.annuler') }}
50
+ </bouton-tertiaire-standard>
51
+
52
+ <bouton-primaire-standard
53
+ v-if="btnOk"
54
+ class="Gouttiere"
55
+ :loading="operationEnCours"
56
+ :disabled="btnOkDesactiver || operationEnCours"
57
+ @click="okBouton"
58
+ >
59
+ {{ props.btnOkTexte ? props.btnOkTexte : $t('csqc.bouton.ok') }}
60
+ </bouton-primaire-standard>
61
+ </v-card-actions>
62
+ </v-card>
63
+ </v-navigation-drawer>
64
+ <Teleport to="body">
65
+ <v-fab
66
+ v-if="retourEnHaut && afficherBoutonHaut"
67
+ style="bottom: 24px; position: fixed; right: 24px; z-index: 2000"
68
+ elevation="8"
69
+ color="primary"
70
+ icon="mdi-arrow-up"
71
+ @click="allerEnHaut"
72
+ />
73
+ </Teleport>
74
+ </template>
75
+ <script lang="ts" setup>
76
+ import { ref, computed, watch, nextTick, useAttrs } from 'vue'
77
+ import { useDisplay } from 'vuetify'
78
+
79
+ const visible = ref(false)
80
+ const display = useDisplay()
81
+ const attrs = useAttrs()
82
+
83
+ // Déclaration des props
84
+ const props = defineProps({
85
+ titre: {
86
+ type: String,
87
+ default: '',
88
+ required: false,
89
+ },
90
+ btnAnnuler: {
91
+ type: Boolean,
92
+ default: true,
93
+ required: false,
94
+ },
95
+ btnOk: {
96
+ type: Boolean,
97
+ default: true,
98
+ required: false,
99
+ },
100
+ btnAnnulerTexte: {
101
+ type: String,
102
+ default: '',
103
+ required: false,
104
+ },
105
+ btnOkDesactiver: {
106
+ type: Boolean,
107
+ default: false,
108
+ required: false,
109
+ },
110
+ operationEnCours: { type: Boolean, default: false },
111
+ persistant: { type: Boolean, default: true },
112
+ btnOkTexte: {
113
+ type: String,
114
+ default: '',
115
+ required: false,
116
+ },
117
+ retourEnHaut: {
118
+ type: Boolean,
119
+ default: true,
120
+ },
121
+ })
122
+
123
+ // Déclaration des événements
124
+ const emit = defineEmits(['fermer', 'ok'])
125
+
126
+ // Back to top
127
+ const afficherBoutonHaut = ref(false)
128
+ let conteneurScroll: Element | null = null
129
+
130
+ function onScroll() {
131
+ afficherBoutonHaut.value = (conteneurScroll?.scrollTop ?? 0) > 350
132
+ }
133
+
134
+ function allerEnHaut() {
135
+ conteneurScroll?.scrollTo({ top: 0, behavior: 'smooth' })
136
+ }
137
+
138
+ watch(visible, async val => {
139
+ if (!props.retourEnHaut) return
140
+ if (val) {
141
+ await nextTick()
142
+ conteneurScroll = document.querySelector('.v-navigation-drawer--active .v-navigation-drawer__content')
143
+ conteneurScroll?.addEventListener('scroll', onScroll)
144
+ } else {
145
+ conteneurScroll?.removeEventListener('scroll', onScroll)
146
+ conteneurScroll = null
147
+ afficherBoutonHaut.value = false
148
+ }
149
+ })
150
+
151
+ // Méthodes
152
+ const ouvrir = () => {
153
+ visible.value = true
154
+ }
155
+
156
+ const fermer = () => {
157
+ visible.value = false
158
+ }
159
+
160
+ const fermeture = () => {
161
+ emit('fermer')
162
+ fermer()
163
+ }
164
+
165
+ const okBouton = () => {
166
+ emit('ok')
167
+ fermer()
168
+ }
169
+
170
+ // Calcul des tailles du tiroir en fonction du breakpoint
171
+ const grosseurTiroir = computed(() => {
172
+ if (attrs.width !== undefined && attrs.width !== null) return attrs.width as string | number
173
+ switch (display.name.value) {
174
+ case 'xs':
175
+ return ''
176
+ case 'sm':
177
+ return 0.95 * display.width.value
178
+ case 'md':
179
+ return 0.8 * display.width.value
180
+ case 'lg':
181
+ return 0.7 * display.width.value
182
+ case 'xl':
183
+ return 0.6 * display.width.value
184
+ case 'xxl':
185
+ return 0.5 * display.width.value
186
+ default:
187
+ return ''
188
+ }
189
+ })
190
+
191
+ defineExpose({ ouvrir, fermer })
192
+ </script>
193
+
194
+ <style>
195
+ .csqc-ligneBleue {
196
+ border-left: 30px #095797 solid !important;
197
+ }
198
+ </style>