codevdesign 0.0.78 → 0.0.79

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,385 +1,386 @@
1
- <template>
2
- <div>
3
- <v-row>
4
- <slot name="ligne" />
5
- <!-- Affichage de la boite de recherche-->
6
- <v-col>
7
- <slot name="recherche"></slot>
8
- <Recherche
9
- v-if="rechercheAfficher"
10
- :recherche-texte="rechercheTexte"
11
- :chargement="chargementListe"
12
- :recherche="recherche"
13
- :recherche-avancee="rechercheAvancee"
14
- :recherche-avancee-texte="rechercheAvanceeTexte"
15
- :recherche-avancee-largeur="rechercheAvanceeLargeur"
16
- :recherche-avancee-style="rechercheAvanceeStyle"
17
- class="flex-grow-1"
18
- @update:recherche="chargerRecherche"
19
- >
20
- <template #milieu>
21
- <slot name="milieu" />
22
- </template>
23
-
24
- <template #droite>
25
- <slot name="droite" />
26
- <v-btn
27
- v-if="btnAjouter"
28
- color="primary"
29
- class="ml-1 float-right"
30
- @click.stop="ajouter"
31
- >
32
- {{ props.btnAjouterTexte ? props.btnAjouterTexte : $t('csqc.bouton.ajouter') }}
33
- </v-btn>
34
-
35
- <exportExcelComponent
36
- v-if="excel"
37
- :liste="filteredItems"
38
- :chargement-liste="chargementListe"
39
- :nom-fichier="excelNomFichier"
40
- class="mt-1 ml-1 float-right"
41
- />
42
- </template>
43
- <template #rechercheAvanceeTitre>
44
- <slot name="rechercheAvanceeTitre" />
45
- </template>
46
- <template #rechercheAvanceeApresTitre>
47
- <slot name="rechercheAvanceeApresTitre" />
48
- </template>
49
- <template #rechercheAvancee>
50
- <slot name="rechercheAvancee" />
51
- </template>
52
- </Recherche>
53
- </v-col>
54
- </v-row>
55
-
56
- <!-- datatable-->
57
- <v-row>
58
- <v-col
59
- cols="12"
60
- class="d-flex ControlesDatatable flex-wrap"
61
- >
62
- <v-data-table
63
- ref="datatable"
64
- color="green"
65
- :headers="colonnes"
66
- :item-key="itemKey"
67
- :items="liste"
68
- :search="recherche"
69
- :loading="chargementListe"
70
- :hover="hover"
71
- :density="densite"
72
- :items-per-page="itemsParPage"
73
- :item-per-page-options="itemsParPageOptions"
74
- :sort-by="triDepart"
75
- :multi-sort="estMultiTriActif"
76
- @click:row="cliqueLigne"
77
- >
78
- <!-- utilisation des slots via le component parent-->
79
- <!-- eslint-disable-next-line -->
80
- <template
81
- v-for="(_, slot) of $slots"
82
- :key="slot"
83
- #[slot]="scope"
84
- >
85
- <slot
86
- :name="slot"
87
- v-bind="scope"
88
- />
89
- </template>
90
-
91
- <!-- boutons supprimer et modifier -->
92
- <!-- eslint-disable-next-line -->
93
- <template v-slot:item.action="{ item }">
94
- <slot name="actionsCustom"></slot>
95
- <v-icon
96
- v-if="props.btnSupprimer"
97
- size="large"
98
- class="iconeSupprimer float-right"
99
- @click.stop.prevent="ouvrirModaleSupprimer(item)"
100
- >
101
- mdi-delete
102
- </v-icon>
103
-
104
- <v-icon
105
- v-if="props.btnModifier"
106
- size="large"
107
- class="iconeEditer float-right"
108
- @click.stop.prevent="modifier(item)"
109
- >
110
- mdi-pencil
111
- </v-icon>
112
- </template>
113
- </v-data-table>
114
-
115
- <!-- Fenêtre de suppression -->
116
- <confirmation
117
- v-if="props.btnSupprimer"
118
- ref="modaleSupprimer"
119
- :texte="supprimerTexte"
120
- :titre="supprimerTitreTexte"
121
- :largeur="modaleSupprimerLargeur"
122
- @confirmer="supprimer"
123
- />
124
- </v-col>
125
- </v-row>
126
- </div>
127
- </template>
128
-
129
- <script setup lang="ts">
130
- /* eslint-disable @typescript-eslint/no-explicit-any */
131
-
132
- import { ref, computed, type Slots, type PropType } from 'vue'
133
- import Recherche from '../csqcRecherche.vue'
134
- import confirmation from '../csqcConfirmation.vue'
135
- import exportExcelComponent from './csqcTableExportExcel.vue'
136
- //import ModaleChoix from './csqc-table-modale-choix-colonnes.vue';
137
- //import axios from 'axios'
138
- import { useI18n } from 'vue-i18n'
139
- import Colonne from '../../modeles/composants/datatableColonne'
140
- import type { SortItem } from 'vuetify/lib/components/VDataTable/composables/sort.mjs'
141
-
142
- // Props
143
- const props = defineProps({
144
- btnAjouter: { type: Boolean, default: true },
145
- btnAjouterTexte: { type: String, default: '' },
146
- btnModifier: { type: Boolean, default: true },
147
- btnSupprimer: { type: Boolean, default: true },
148
- chargementListe: { type: Boolean, default: false },
149
- operationEnCours: { type: Boolean, default: false },
150
- //choixSwitchOptionDepart: { type: Boolean, default: false },
151
- // classeRangee: { type: String, default: '' },
152
- colonnes: {
153
- type: Array as PropType<Colonne[]>,
154
- default: () => [],
155
- },
156
- densite: { type: String as PropType<'default' | 'comfortable' | 'compact'>, default: 'default' },
157
- excel: { type: Boolean, default: false },
158
- excelNomFichier: { type: String, default: 'csqc' },
159
- //filtresDepart: { type: Object, default: null },
160
- //flechesTri: { type: Boolean, default: false },
161
- formulaireId: { type: Number, default: -1 },
162
- identifiant: {
163
- type: [String, null] as PropType<string | null>,
164
- default: null,
165
- },
166
- itemKey: { type: String, default: 'id' },
167
- itemsParPage: { type: Number, default: 10 },
168
- liste: {
169
- type: Array as PropType<Record<string, any>[]>,
170
- default: () => [],
171
- },
172
- hover: { type: Boolean, default: false },
173
- // modulerDense: { type: Boolean, default: false },
174
- // multifiltre: { type: Boolean, default: false },
175
- itemsParPageOptions: { type: Array, default: () => [10, 25, 30, -1] },
176
- //pageCourante: { type: Number, default: 1 },
177
- //paginationBottom: { type: Boolean, default: true },
178
- // paginationTop: { type: Boolean, default: false },
179
- // permettreChoixColonnes: { type: Boolean, default: false },
180
- // rechercheDepart: { type: String, default: '' },
181
- rechercheTexte: { type: String, default: '' },
182
- rechercheAfficher: { type: Boolean, default: true },
183
- rechercheAvancee: { type: Boolean, default: false },
184
- rechercheAvanceeTexte: { type: String, default: '' },
185
- rechercheAvanceeLargeur: { type: Number, default: 12 },
186
- rechercheAvanceeStyle: { type: String, default: '' },
187
- // selectionChoixColonnesDepart: { type: String, default: '' },
188
- // showSelect: { type: Boolean, default: false },
189
-
190
- modaleSupprimerChamp: { type: String, default: '' },
191
- modaleSupprimerTexte: { type: String, default: '' },
192
- modaleSupprimerTitre: { type: String, default: '' },
193
- modaleSupprimerLargeur: { type: String, default: '525px' },
194
- triDescDepart: { type: Boolean, default: false },
195
- triParDepart: {
196
- type: [Array, String] as PropType<string | string[] | SortItem[] | undefined>,
197
- default: undefined,
198
- },
199
- //urlbase: { type: String, default: '' },
200
- })
201
-
202
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
203
- const slots = defineSlots<Slots>()
204
- const { t } = useI18n({ useScope: 'global' })
205
- const itemSelectionne = ref(null)
206
- const modaleSupprimer = ref<InstanceType<typeof confirmation> | null>(null)
207
- const supprimerTexte = computed(() => {
208
- if (itemSelectionne.value == null) return ''
209
-
210
- if (props.modaleSupprimerTexte != null && props.modaleSupprimerTexte != '') return props.modaleSupprimerTexte
211
-
212
- return t('csqc.message.supprimerMessage', { nom: itemSelectionne?.value[props.modaleSupprimerChamp] ?? '' })
213
- })
214
-
215
- const supprimerTitreTexte = computed(() => props.modaleSupprimerTitre || t('csqc.message.supprimerTitre'))
216
-
217
- // Fonction pour ouvrir le dialogue pour un item spécifique
218
- const ouvrirModaleSupprimer = (item: any) => {
219
- itemSelectionne.value = item
220
-
221
- //modaleSupprimer.value?.ouvrir()
222
- emit('supprimer', itemSelectionne.value)
223
- }
224
-
225
- const supprimer = () => {
226
- emit('supprimer', itemSelectionne.value)
227
- }
228
-
229
- const recherche = ref<string>('')
230
- const chargerRecherche = (val: string) => {
231
- recherche.value = val
232
- }
233
-
234
- const ajouter = () => {
235
- emit('ajouter')
236
- }
237
-
238
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
239
- const cliqueLigne = (e: Event, { item }: { item: any }) => {
240
- emit('cliqueLigne', item)
241
- }
242
-
243
- const modifier = (item: any) => {
244
- emit('modifier', item)
245
- }
246
- const filteredItems = computed(() => {
247
- if (!recherche.value) return props.liste // Si rien écrit, affiche tout
248
-
249
- return props.liste.filter(item =>
250
- Object.values(item).some(val => String(val).toLowerCase().includes(recherche.value.toLowerCase())),
251
- )
252
- })
253
-
254
- const triDepart = computed<SortItem[] | undefined>(() => {
255
- if (props.triParDepart == null) return undefined
256
-
257
- const ordre = props.triDescDepart ? 'desc' : 'asc'
258
-
259
- if (typeof props.triParDepart === 'string') return [{ key: props.triParDepart, order: ordre }]
260
-
261
- //On a un tableau de tri
262
- let retour: SortItem[] = []
263
- for (let i = 0; i < props.triParDepart.length; i += 1) {
264
- const tri = props.triParDepart[i]!
265
- if (typeof tri == 'string') retour.push({ key: tri, order: ordre })
266
- else retour.push(tri) //C'est un SortItem déjà bâti
267
- }
268
- return retour
269
- })
270
-
271
- const estMultiTriActif = computed(() => {
272
- if (props.triParDepart == null) return false
273
-
274
- if (typeof props.triParDepart === 'string') return false
275
-
276
- return true
277
- })
278
-
279
- const onPanelChange = (val: unknown) => {
280
- if (typeof val === 'string' || typeof val === 'number' || val === null) {
281
- const isOpen = val !== null && val !== ''
282
- emit('panneau:etat', isOpen)
283
- } else {
284
- emit('panneau:etat', false)
285
- }
286
- }
287
- const emit = defineEmits(['ajouter', 'cliqueLigne', 'supprimer', 'modifier', 'donneesExportees', 'panneau:etat'])
288
- </script>
289
-
290
- <style scoped lang="css">
291
- .ControlesDatatable {
292
- gap: 4px;
293
- }
294
-
295
- /* barre de recherche design QC*/
296
- .BarreRecherche {
297
- min-height: 40px;
298
- }
299
-
300
- .BarreRechercheBackIcone {
301
- border-right: 1px solid #808a9d;
302
- border-top: 1px solid #808a9d;
303
- border-bottom: 1px solid #808a9d;
304
- background-color: #095797 !important;
305
- height: 40px !important;
306
- width: 40px !important;
307
- max-width: 40px !important;
308
- min-width: 40px !important;
309
- padding-right: 0 !important;
310
- padding-left: 0 !important;
311
- border-radius: 0;
312
- margin-left: -16px;
313
- }
314
-
315
- /* icone loupe */
316
- .BarreRechercheIcone {
317
- font-size: 34px !important;
318
- margin-left: 1px !important;
319
- margin-top: 2px !important;
320
- color: white !important;
321
- }
322
-
323
- /* datatable contour */
324
- .v-data-table {
325
- border: 1px solid #d3d3d3;
326
- border-radius: 5px;
327
- overflow: hidden;
328
- }
329
-
330
- /* hover */
331
- .v-data-table:hover {
332
- cursor: pointer !important;
333
- }
334
-
335
- /* datatable row */
336
- .v-data-table .v-table__wrapper > table > thead > tr > td,
337
- .v-data-table .v-table__wrapper > table > thead > tr th,
338
- .v-data-table .v-table__wrapper > table tbody > tr > td,
339
- .v-data-table .v-table__wrapper > table tbody > tr th {
340
- background-color: #d3d3d375 !important;
341
- }
342
-
343
- /* datatable header contour */
344
- .v-data-table .v-table__wrapper > table > thead > tr > th,
345
- .v-data-table .v-table__wrapper > table tbody > tr > th {
346
- background-color: white !important;
347
- border-bottom: 4px #223654 solid !important;
348
- }
349
-
350
- /* datatable header intérieur*/
351
- .v-data-table-header__content {
352
- background-color: white !important;
353
- color: #223654 !important;
354
- font-weight: 600;
355
- font-size: 15px;
356
- height: 46px;
357
- }
358
-
359
- /* datatable footer */
360
- .v-data-table-footer {
361
- background-color: white !important;
362
- border-top: 4px #223654 solid !important;
363
- }
364
-
365
- /* datatable row hover */
366
- .v-data-table .v-table__wrapper > table tbody > tr:hover > td,
367
- .v-data-table .v-table__wrapper > table tbody > tr:hover {
368
- background-color: #e0e0e0 !important;
369
- }
370
-
371
- .iconeSupprimer:hover {
372
- color: red;
373
- }
374
- .v-icon.v-icon.v-icon--link.iconeSupprimer:hover {
375
- color: red !important;
376
- }
377
- .iconeEditer:hover {
378
- color: #095797;
379
- }
380
-
381
- /* hover icone à droite du ajouter*/
382
- .text-grisMoyen:hover {
383
- color: #095797 !important;
384
- }
385
- </style>
1
+ <template>
2
+ <div>
3
+ <v-row v-if="barreHautAfficher">
4
+ <slot name="ligne" />
5
+ <!-- Affichage de la boite de recherche-->
6
+ <v-col>
7
+ <slot name="recherche"></slot>
8
+ <Recherche
9
+ :afficher="rechercheAfficher"
10
+ :recherche-texte="rechercheTexte"
11
+ :chargement="chargementListe"
12
+ :recherche="recherche"
13
+ :recherche-avancee="rechercheAvancee"
14
+ :recherche-avancee-texte="rechercheAvanceeTexte"
15
+ :recherche-avancee-largeur="rechercheAvanceeLargeur"
16
+ :recherche-avancee-style="rechercheAvanceeStyle"
17
+ class="flex-grow-1"
18
+ @update:recherche="chargerRecherche"
19
+ >
20
+ <template #milieu>
21
+ <slot name="milieu" />
22
+ </template>
23
+
24
+ <template #droite>
25
+ <slot name="droite" />
26
+ <v-btn
27
+ v-if="btnAjouter"
28
+ color="primary"
29
+ class="ml-1 float-right"
30
+ @click.stop="ajouter"
31
+ >
32
+ {{ props.btnAjouterTexte ? props.btnAjouterTexte : $t('csqc.bouton.ajouter') }}
33
+ </v-btn>
34
+
35
+ <exportExcelComponent
36
+ v-if="excel"
37
+ :liste="filteredItems"
38
+ :chargement-liste="chargementListe"
39
+ :nom-fichier="excelNomFichier"
40
+ class="mt-1 ml-1 float-right"
41
+ />
42
+ </template>
43
+ <template #rechercheAvanceeTitre>
44
+ <slot name="rechercheAvanceeTitre" />
45
+ </template>
46
+ <template #rechercheAvanceeApresTitre>
47
+ <slot name="rechercheAvanceeApresTitre" />
48
+ </template>
49
+ <template #rechercheAvancee>
50
+ <slot name="rechercheAvancee" />
51
+ </template>
52
+ </Recherche>
53
+ </v-col>
54
+ </v-row>
55
+
56
+ <!-- datatable-->
57
+ <v-row>
58
+ <v-col
59
+ cols="12"
60
+ class="d-flex ControlesDatatable flex-wrap"
61
+ >
62
+ <v-data-table
63
+ ref="datatable"
64
+ color="green"
65
+ :headers="colonnes"
66
+ :item-key="itemKey"
67
+ :items="liste"
68
+ :search="recherche"
69
+ :loading="chargementListe"
70
+ :hover="hover"
71
+ :density="densite"
72
+ :items-per-page="itemsParPage"
73
+ :item-per-page-options="itemsParPageOptions"
74
+ :sort-by="triDepart"
75
+ :multi-sort="estMultiTriActif"
76
+ @click:row="cliqueLigne"
77
+ >
78
+ <!-- utilisation des slots via le component parent-->
79
+ <!-- eslint-disable-next-line -->
80
+ <template
81
+ v-for="(_, slot) of $slots"
82
+ :key="slot"
83
+ #[slot]="scope"
84
+ >
85
+ <slot
86
+ :name="slot"
87
+ v-bind="scope"
88
+ />
89
+ </template>
90
+
91
+ <!-- boutons supprimer et modifier -->
92
+ <!-- eslint-disable-next-line -->
93
+ <template v-slot:item.action="{ item }">
94
+ <slot name="actionsCustom"></slot>
95
+ <v-icon
96
+ v-if="props.btnSupprimer"
97
+ size="large"
98
+ class="iconeSupprimer float-right"
99
+ @click.stop.prevent="ouvrirModaleSupprimer(item)"
100
+ >
101
+ mdi-delete
102
+ </v-icon>
103
+
104
+ <v-icon
105
+ v-if="props.btnModifier"
106
+ size="large"
107
+ class="iconeEditer float-right"
108
+ @click.stop.prevent="modifier(item)"
109
+ >
110
+ mdi-pencil
111
+ </v-icon>
112
+ </template>
113
+ </v-data-table>
114
+
115
+ <!-- Fenêtre de suppression -->
116
+ <confirmation
117
+ v-if="props.btnSupprimer"
118
+ ref="modaleSupprimer"
119
+ :texte="supprimerTexte"
120
+ :titre="supprimerTitreTexte"
121
+ :largeur="modaleSupprimerLargeur"
122
+ @confirmer="supprimer"
123
+ />
124
+ </v-col>
125
+ </v-row>
126
+ </div>
127
+ </template>
128
+
129
+ <script setup lang="ts">
130
+ /* eslint-disable @typescript-eslint/no-explicit-any */
131
+
132
+ import { ref, computed, type Slots, type PropType } from 'vue'
133
+ import Recherche from '../csqcRecherche.vue'
134
+ import confirmation from '../csqcConfirmation.vue'
135
+ import exportExcelComponent from './csqcTableExportExcel.vue'
136
+ //import ModaleChoix from './csqc-table-modale-choix-colonnes.vue';
137
+ //import axios from 'axios'
138
+ import { useI18n } from 'vue-i18n'
139
+ import Colonne from '../../modeles/composants/datatableColonne'
140
+ import type { SortItem } from 'vuetify/lib/components/VDataTable/composables/sort.mjs'
141
+
142
+ // Props
143
+ const props = defineProps({
144
+ barreHautAfficher: { type: Boolean, default: true },
145
+ btnAjouter: { type: Boolean, default: true },
146
+ btnAjouterTexte: { type: String, default: '' },
147
+ btnModifier: { type: Boolean, default: true },
148
+ btnSupprimer: { type: Boolean, default: true },
149
+ chargementListe: { type: Boolean, default: false },
150
+ operationEnCours: { type: Boolean, default: false },
151
+ //choixSwitchOptionDepart: { type: Boolean, default: false },
152
+ // classeRangee: { type: String, default: '' },
153
+ colonnes: {
154
+ type: Array as PropType<Colonne[]>,
155
+ default: () => [],
156
+ },
157
+ densite: { type: String as PropType<'default' | 'comfortable' | 'compact'>, default: 'default' },
158
+ excel: { type: Boolean, default: false },
159
+ excelNomFichier: { type: String, default: 'csqc' },
160
+ //filtresDepart: { type: Object, default: null },
161
+ //flechesTri: { type: Boolean, default: false },
162
+ formulaireId: { type: Number, default: -1 },
163
+ identifiant: {
164
+ type: [String, null] as PropType<string | null>,
165
+ default: null,
166
+ },
167
+ itemKey: { type: String, default: 'id' },
168
+ itemsParPage: { type: Number, default: 10 },
169
+ liste: {
170
+ type: Array as PropType<Record<string, any>[]>,
171
+ default: () => [],
172
+ },
173
+ hover: { type: Boolean, default: false },
174
+ // modulerDense: { type: Boolean, default: false },
175
+ // multifiltre: { type: Boolean, default: false },
176
+ itemsParPageOptions: { type: Array, default: () => [10, 25, 30, -1] },
177
+ //pageCourante: { type: Number, default: 1 },
178
+ //paginationBottom: { type: Boolean, default: true },
179
+ // paginationTop: { type: Boolean, default: false },
180
+ // permettreChoixColonnes: { type: Boolean, default: false },
181
+ // rechercheDepart: { type: String, default: '' },
182
+ rechercheTexte: { type: String, default: '' },
183
+ rechercheAfficher: { type: Boolean, default: true },
184
+ rechercheAvancee: { type: Boolean, default: false },
185
+ rechercheAvanceeTexte: { type: String, default: '' },
186
+ rechercheAvanceeLargeur: { type: Number, default: 12 },
187
+ rechercheAvanceeStyle: { type: String, default: '' },
188
+ // selectionChoixColonnesDepart: { type: String, default: '' },
189
+ // showSelect: { type: Boolean, default: false },
190
+
191
+ modaleSupprimerChamp: { type: String, default: '' },
192
+ modaleSupprimerTexte: { type: String, default: '' },
193
+ modaleSupprimerTitre: { type: String, default: '' },
194
+ modaleSupprimerLargeur: { type: String, default: '525px' },
195
+ triDescDepart: { type: Boolean, default: false },
196
+ triParDepart: {
197
+ type: [Array, String] as PropType<string | string[] | SortItem[] | undefined>,
198
+ default: undefined,
199
+ },
200
+ //urlbase: { type: String, default: '' },
201
+ })
202
+
203
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
204
+ const slots = defineSlots<Slots>()
205
+ const { t } = useI18n({ useScope: 'global' })
206
+ const itemSelectionne = ref(null)
207
+ const modaleSupprimer = ref<InstanceType<typeof confirmation> | null>(null)
208
+ const supprimerTexte = computed(() => {
209
+ if (itemSelectionne.value == null) return ''
210
+
211
+ if (props.modaleSupprimerTexte != null && props.modaleSupprimerTexte != '') return props.modaleSupprimerTexte
212
+
213
+ return t('csqc.message.supprimerMessage', { nom: itemSelectionne?.value[props.modaleSupprimerChamp] ?? '' })
214
+ })
215
+
216
+ const supprimerTitreTexte = computed(() => props.modaleSupprimerTitre || t('csqc.message.supprimerTitre'))
217
+
218
+ // Fonction pour ouvrir le dialogue pour un item spécifique
219
+ const ouvrirModaleSupprimer = (item: any) => {
220
+ itemSelectionne.value = item
221
+
222
+ //modaleSupprimer.value?.ouvrir()
223
+ emit('supprimer', itemSelectionne.value)
224
+ }
225
+
226
+ const supprimer = () => {
227
+ emit('supprimer', itemSelectionne.value)
228
+ }
229
+
230
+ const recherche = ref<string>('')
231
+ const chargerRecherche = (val: string) => {
232
+ recherche.value = val
233
+ }
234
+
235
+ const ajouter = () => {
236
+ emit('ajouter')
237
+ }
238
+
239
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
240
+ const cliqueLigne = (e: Event, { item }: { item: any }) => {
241
+ emit('cliqueLigne', item)
242
+ }
243
+
244
+ const modifier = (item: any) => {
245
+ emit('modifier', item)
246
+ }
247
+ const filteredItems = computed(() => {
248
+ if (!recherche.value) return props.liste // Si rien écrit, affiche tout
249
+
250
+ return props.liste.filter(item =>
251
+ Object.values(item).some(val => String(val).toLowerCase().includes(recherche.value.toLowerCase())),
252
+ )
253
+ })
254
+
255
+ const triDepart = computed<SortItem[] | undefined>(() => {
256
+ if (props.triParDepart == null) return undefined
257
+
258
+ const ordre = props.triDescDepart ? 'desc' : 'asc'
259
+
260
+ if (typeof props.triParDepart === 'string') return [{ key: props.triParDepart, order: ordre }]
261
+
262
+ //On a un tableau de tri
263
+ let retour: SortItem[] = []
264
+ for (let i = 0; i < props.triParDepart.length; i += 1) {
265
+ const tri = props.triParDepart[i]!
266
+ if (typeof tri == 'string') retour.push({ key: tri, order: ordre })
267
+ else retour.push(tri) //C'est un SortItem déjà bâti
268
+ }
269
+ return retour
270
+ })
271
+
272
+ const estMultiTriActif = computed(() => {
273
+ if (props.triParDepart == null) return false
274
+
275
+ if (typeof props.triParDepart === 'string') return false
276
+
277
+ return true
278
+ })
279
+
280
+ const onPanelChange = (val: unknown) => {
281
+ if (typeof val === 'string' || typeof val === 'number' || val === null) {
282
+ const isOpen = val !== null && val !== ''
283
+ emit('panneau:etat', isOpen)
284
+ } else {
285
+ emit('panneau:etat', false)
286
+ }
287
+ }
288
+ const emit = defineEmits(['ajouter', 'cliqueLigne', 'supprimer', 'modifier', 'donneesExportees', 'panneau:etat'])
289
+ </script>
290
+
291
+ <style scoped lang="css">
292
+ .ControlesDatatable {
293
+ gap: 4px;
294
+ }
295
+
296
+ /* barre de recherche design QC*/
297
+ .BarreRecherche {
298
+ min-height: 40px;
299
+ }
300
+
301
+ .BarreRechercheBackIcone {
302
+ border-right: 1px solid #808a9d;
303
+ border-top: 1px solid #808a9d;
304
+ border-bottom: 1px solid #808a9d;
305
+ background-color: #095797 !important;
306
+ height: 40px !important;
307
+ width: 40px !important;
308
+ max-width: 40px !important;
309
+ min-width: 40px !important;
310
+ padding-right: 0 !important;
311
+ padding-left: 0 !important;
312
+ border-radius: 0;
313
+ margin-left: -16px;
314
+ }
315
+
316
+ /* icone loupe */
317
+ .BarreRechercheIcone {
318
+ font-size: 34px !important;
319
+ margin-left: 1px !important;
320
+ margin-top: 2px !important;
321
+ color: white !important;
322
+ }
323
+
324
+ /* datatable contour */
325
+ .v-data-table {
326
+ border: 1px solid #d3d3d3;
327
+ border-radius: 5px;
328
+ overflow: hidden;
329
+ }
330
+
331
+ /* hover */
332
+ .v-data-table:hover {
333
+ cursor: pointer !important;
334
+ }
335
+
336
+ /* datatable row */
337
+ .v-data-table .v-table__wrapper > table > thead > tr > td,
338
+ .v-data-table .v-table__wrapper > table > thead > tr th,
339
+ .v-data-table .v-table__wrapper > table tbody > tr > td,
340
+ .v-data-table .v-table__wrapper > table tbody > tr th {
341
+ background-color: #d3d3d375 !important;
342
+ }
343
+
344
+ /* datatable header contour */
345
+ .v-data-table .v-table__wrapper > table > thead > tr > th,
346
+ .v-data-table .v-table__wrapper > table tbody > tr > th {
347
+ background-color: white !important;
348
+ border-bottom: 4px #223654 solid !important;
349
+ }
350
+
351
+ /* datatable header intérieur*/
352
+ .v-data-table-header__content {
353
+ background-color: white !important;
354
+ color: #223654 !important;
355
+ font-weight: 600;
356
+ font-size: 15px;
357
+ height: 46px;
358
+ }
359
+
360
+ /* datatable footer */
361
+ .v-data-table-footer {
362
+ background-color: white !important;
363
+ border-top: 4px #223654 solid !important;
364
+ }
365
+
366
+ /* datatable row hover */
367
+ .v-data-table .v-table__wrapper > table tbody > tr:hover > td,
368
+ .v-data-table .v-table__wrapper > table tbody > tr:hover {
369
+ background-color: #e0e0e0 !important;
370
+ }
371
+
372
+ .iconeSupprimer:hover {
373
+ color: red;
374
+ }
375
+ .v-icon.v-icon.v-icon--link.iconeSupprimer:hover {
376
+ color: red !important;
377
+ }
378
+ .iconeEditer:hover {
379
+ color: #095797;
380
+ }
381
+
382
+ /* hover icone à droite du ajouter*/
383
+ .text-grisMoyen:hover {
384
+ color: #095797 !important;
385
+ }
386
+ </style>