codevdesign 1.0.78 → 1.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.
- package/assets/csqc.css +28 -30
- package/composants/csqcAide.vue +1 -1
- package/composants/csqcAlerteErreur.vue +1 -1
- package/composants/csqcChaise/chaiseConteneur.vue +3 -3
- package/composants/csqcChaise/chaiseItem.vue +54 -54
- package/composants/csqcCodeBudgetaireGenerique.vue +254 -254
- package/composants/csqcConfirmation.vue +76 -75
- package/composants/csqcDate.vue +89 -86
- package/composants/csqcDialogue.vue +120 -118
- package/composants/csqcEditeurTexteRiche.vue +378 -378
- package/composants/csqcEntete.vue +17 -17
- package/composants/csqcImportCSV.vue +2 -2
- package/composants/csqcModaleSaisie.vue +97 -97
- package/composants/csqcRecherche.vue +7 -7
- package/composants/csqcRechercheUtilisateur.vue +198 -198
- package/composants/csqcSnackbar.vue +207 -207
- package/composants/csqcSwitch.vue +5 -5
- package/composants/csqcTable/csqcTable.vue +19 -14
- package/composants/csqcTable/csqcTableModaleChoixColonnes.vue +4 -4
- package/composants/csqcTable/sortableDataTable.ts +1 -1
- package/composants/csqcTexteBilingue.vue +175 -175
- package/composants/csqcTiroir.vue +197 -197
- package/composants/gabarit/csqcMenu.vue +4 -4
- package/composants/gabarit/pivEntete.vue +5 -3
- package/composants/gabarit/pivPiedPage.vue +44 -29
- package/composants/validateurs.ts +8 -2
- package/editeur.ts +1 -1
- package/importCSV.ts +1 -1
- package/index.ts +80 -80
- package/locales/en.json +1 -1
- package/locales/fr.json +3 -3
- package/modeles/assurancesAssuranceGeneraleGrics.ts +3 -3
- package/modeles/assurancesAssurancePersonnelleGrics.ts +6 -6
- package/modeles/assurancesContratGrics.ts +6 -6
- package/modeles/assurancesDetailsPrimeReguliereGrics.ts +4 -4
- package/modeles/assurancesDonneesAssureurGrics.ts +5 -5
- package/modeles/assurancesEmployeGrics.ts +4 -4
- package/modeles/assurancesGrics.ts +6 -6
- package/modeles/assurancesRegimeAssuranceGrics.ts +2 -2
- package/modeles/assurancesRegimeBaseEmployeurGrics.ts +2 -2
- package/modeles/assurancesRegimeBaseGrics.ts +2 -2
- package/modeles/composants/csqcMenuModele.ts +18 -18
- package/modeles/composants/datatableColonne.ts +19 -19
- package/modeles/employeAdresseGrics.ts +6 -6
- package/modeles/employeAdressesPersonnellesGrics.ts +4 -4
- package/modeles/employeAffectationCorpsEmploiGrics.ts +2 -2
- package/modeles/employeBanquesCongeBanqueGrics.ts +2 -2
- package/modeles/employeBanquesCongeGrics.ts +6 -6
- package/modeles/employeBanquesCongeRegimeAbsenceGrics.ts +2 -2
- package/modeles/employeCourrielsPersonnels.ts +2 -2
- package/modeles/employeCourrielsProfessionnels.ts +2 -2
- package/modeles/employeEmploisCategorieGrics.ts +2 -2
- package/modeles/employeEmploisClasseGrics.ts +2 -2
- package/modeles/employeEmploisCorpsEmploiGrics.ts +2 -2
- package/modeles/employeEmploisEtatEmploiGrics.ts +2 -2
- package/modeles/employeEmploisGrics.ts +29 -29
- package/modeles/employeEmploisGroupePaieGrics.ts +2 -2
- package/modeles/employeEmploisLieuTravailPrincipalGrics.ts +3 -3
- package/modeles/employeEmploisLieuxTravailSecondairesGrics.ts +3 -3
- package/modeles/employeEmploisRegimeAbsenceGrics.ts +2 -2
- package/modeles/employeEmploisSecteurGrics.ts +2 -2
- package/modeles/employeEmploisStatutEngagementGrics.ts +2 -2
- package/modeles/employeExperienceEmploiGrics.ts +2 -2
- package/modeles/employeExperienceEmployeGrics.ts +5 -5
- package/modeles/employeExperienceExperiencesGrics.ts +4 -4
- package/modeles/employeExperienceExperiencesTotalesGrics.ts +7 -7
- package/modeles/employeExperienceGrics.ts +9 -9
- package/modeles/employeGrics.ts +23 -23
- package/modeles/employeTelephoneGrics.ts +4 -4
- package/modeles/employeTelephonesPersonnelsGrics.ts +3 -3
- package/modeles/employeTelephonesProfessionnelsGrics.ts +3 -3
- package/modeles/groupeCE.ts +6 -6
- package/modeles/groupeCEIntervalle.ts +6 -6
- package/modeles/historiquesAbsenceBanqueGrics.ts +2 -2
- package/modeles/historiquesAbsenceGrics.ts +13 -13
- package/modeles/historiquesAbsenceLieuTravailGrics.ts +2 -2
- package/modeles/historiquesAbsenceSousBanqueGrics.ts +2 -2
- package/modeles/motifsAbsenceBanque.ts +2 -2
- package/modeles/motifsAbsenceGrics.ts +9 -9
- package/modeles/motifsAbsenceRegimeAbsence.ts +2 -2
- package/modeles/motifsAbsenceSousMotifs.ts +2 -2
- package/modeles/motifsAbsenceTraitementBanques.ts +3 -3
- package/modeles/syndicat.ts +18 -18
- package/modeles/syndicatGroupeCe.ts +3 -3
- package/modeles/syndicatResponsable.ts +8 -8
- package/modeles/syndicatUnite.ts +3 -3
- package/modeles/unite.ts +15 -15
- package/modeles/uniteTypeEnseignement.ts +4 -4
- package/modeles/utilisateur.ts +8 -8
- package/outils/appAxios.ts +16 -16
- package/outils/csqcOutils.ts +6 -5
- package/outils/csqcRafraichisseurTokenParent.ts +20 -4
- package/outils/rafraichisseurToken.ts +1 -1
- package/package.json +1 -1
|
@@ -1,207 +1,207 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<!--
|
|
3
|
-
FIFO Snackbar
|
|
4
|
-
- On affiche 1 snackbar à la fois.
|
|
5
|
-
- Les demandes suivantes sont mises en file (FIFO) et s’affichent après fermeture.
|
|
6
|
-
- color/location sont figées par item via props (pas via $attrs) pour éviter les changements live.
|
|
7
|
-
-->
|
|
8
|
-
<v-snackbar
|
|
9
|
-
:model-value="snackbar"
|
|
10
|
-
:timeout="-1"
|
|
11
|
-
:style="props.styleCss"
|
|
12
|
-
:color="colorAffiche"
|
|
13
|
-
:location="locationAffiche"
|
|
14
|
-
multi-line
|
|
15
|
-
v-bind="attrsAffiches"
|
|
16
|
-
@update:model-value="
|
|
17
|
-
v => {
|
|
18
|
-
if (!v) fermer()
|
|
19
|
-
}
|
|
20
|
-
"
|
|
21
|
-
>
|
|
22
|
-
<template v-if="titreAffiche || messageAffiche">
|
|
23
|
-
<b style="font-size: 12pt">{{ titreAffiche }}</b>
|
|
24
|
-
<br v-if="titreAffiche" />
|
|
25
|
-
<b>{{ messageAffiche }}</b>
|
|
26
|
-
</template>
|
|
27
|
-
|
|
28
|
-
<template #actions>
|
|
29
|
-
<!-- Toujours afficher la fermeture si timeout = -1 -->
|
|
30
|
-
<v-icon
|
|
31
|
-
v-if="props.btnFermer || timeoutAffiche === -1"
|
|
32
|
-
color="white"
|
|
33
|
-
style="cursor: pointer"
|
|
34
|
-
@click.stop="fermer"
|
|
35
|
-
>
|
|
36
|
-
mdi-close
|
|
37
|
-
</v-icon>
|
|
38
|
-
</template>
|
|
39
|
-
</v-snackbar>
|
|
40
|
-
</template>
|
|
41
|
-
|
|
42
|
-
<script setup lang="ts">
|
|
43
|
-
import { computed, ref, watch, useAttrs, toRaw } from 'vue'
|
|
44
|
-
|
|
45
|
-
// - color/location sont en props (et non via $attrs) pour être snapshottées proprement.
|
|
46
|
-
const props = defineProps({
|
|
47
|
-
styleCss: { type: String, required: false },
|
|
48
|
-
|
|
49
|
-
// Durée d’affichage (ms). -1 = ne ferme jamais automatiquement
|
|
50
|
-
temps: { type: Number, required: false, default: 4000 },
|
|
51
|
-
|
|
52
|
-
// Déclencheur : à chaque changement non-vide, on queue un item
|
|
53
|
-
message: { type: String, required: true },
|
|
54
|
-
titre: { type: String, required: false },
|
|
55
|
-
|
|
56
|
-
btnFermer: { type: Boolean, required: false, default: true },
|
|
57
|
-
|
|
58
|
-
// en props pour éviter le "live update" via $attrs
|
|
59
|
-
color: { type: String, required: false, default: 'success' },
|
|
60
|
-
location: { type: [String, Array, Object] as any, required: false },
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
const emit = defineEmits(['fermer:snackbar'])
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* ============================================================================
|
|
67
|
-
* $attrs : on forward tout sauf color/location (qui sont gérés par props & snapshot)
|
|
68
|
-
* ============================================================================
|
|
69
|
-
*/
|
|
70
|
-
const attrs = useAttrs()
|
|
71
|
-
|
|
72
|
-
const attrsSansCouleur = computed(() => {
|
|
73
|
-
const { color, location, ...rest } = attrs as any
|
|
74
|
-
return rest
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* ============================================================================
|
|
79
|
-
* FIFO Queue (snapshot par item)
|
|
80
|
-
* ============================================================================
|
|
81
|
-
*/
|
|
82
|
-
type ItemSnack = {
|
|
83
|
-
message: string
|
|
84
|
-
titre?: string
|
|
85
|
-
color: string
|
|
86
|
-
location?: any
|
|
87
|
-
attrs: Record<string, any>
|
|
88
|
-
timeout: number // -1 = manuel
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const file = ref<ItemSnack[]>([])
|
|
92
|
-
const enCours = ref<ItemSnack | null>(null)
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* ============================================================================
|
|
96
|
-
* État UI
|
|
97
|
-
* ============================================================================
|
|
98
|
-
*/
|
|
99
|
-
const snackbar = ref(false)
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* ============================================================================
|
|
103
|
-
* Computeds d’affichage (basés sur l’item en cours)
|
|
104
|
-
* ============================================================================
|
|
105
|
-
*/
|
|
106
|
-
const attrsAffiches = computed(() => {
|
|
107
|
-
// On évite de forward color/location par attrs (même s’ils y étaient)
|
|
108
|
-
const a = (enCours.value?.attrs ?? {}) as any
|
|
109
|
-
const { color, location, ...rest } = a
|
|
110
|
-
return rest
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
const messageAffiche = computed(() => enCours.value?.message ?? '')
|
|
114
|
-
const titreAffiche = computed(() => enCours.value?.titre ?? '')
|
|
115
|
-
const colorAffiche = computed(() => enCours.value?.color ?? 'success')
|
|
116
|
-
const locationAffiche = computed(() => enCours.value?.location)
|
|
117
|
-
const timeoutAffiche = computed(() => enCours.value?.timeout ?? props.temps)
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* ============================================================================
|
|
121
|
-
* Timer (auto-close géré par nous, puisque v-snackbar est timeout=-1)
|
|
122
|
-
* ============================================================================
|
|
123
|
-
*/
|
|
124
|
-
let timer: number | null = null
|
|
125
|
-
|
|
126
|
-
function clearTimer() {
|
|
127
|
-
if (timer != null) {
|
|
128
|
-
window.clearTimeout(timer)
|
|
129
|
-
timer = null
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function scheduleAutoClose() {
|
|
134
|
-
clearTimer()
|
|
135
|
-
|
|
136
|
-
const t = timeoutAffiche.value
|
|
137
|
-
if (t === -1) return
|
|
138
|
-
|
|
139
|
-
// 1 seconde minimum, sinon on ne la voit pas
|
|
140
|
-
const ms = Math.max(1000, t)
|
|
141
|
-
|
|
142
|
-
timer = window.setTimeout(() => {
|
|
143
|
-
fermer()
|
|
144
|
-
}, ms)
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* ============================================================================
|
|
149
|
-
* Navigation FIFO
|
|
150
|
-
* ============================================================================
|
|
151
|
-
*/
|
|
152
|
-
function afficherProchain() {
|
|
153
|
-
// Un seul snackbar à la fois
|
|
154
|
-
if (snackbar.value) return
|
|
155
|
-
if (enCours.value) return
|
|
156
|
-
|
|
157
|
-
const next = file.value.shift()
|
|
158
|
-
if (!next) return
|
|
159
|
-
|
|
160
|
-
enCours.value = next
|
|
161
|
-
snackbar.value = true
|
|
162
|
-
scheduleAutoClose()
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function fermer() {
|
|
166
|
-
clearTimer()
|
|
167
|
-
snackbar.value = false
|
|
168
|
-
emit('fermer:snackbar')
|
|
169
|
-
|
|
170
|
-
// On attend un tick pour éviter les glitches (transition/DOM)
|
|
171
|
-
setTimeout(() => {
|
|
172
|
-
enCours.value = null
|
|
173
|
-
afficherProchain()
|
|
174
|
-
}, 0)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* ============================================================================
|
|
179
|
-
* queue (snapshot) à chaque nouveau message
|
|
180
|
-
* ============================================================================
|
|
181
|
-
*/
|
|
182
|
-
watch(
|
|
183
|
-
() => props.message,
|
|
184
|
-
nouveau => {
|
|
185
|
-
if (!nouveau) return
|
|
186
|
-
|
|
187
|
-
// Normalisation timeout
|
|
188
|
-
const timeout = props.temps < -1 ? -1 : props.temps >= 0 && props.temps < 1000 ? 1000 : props.temps
|
|
189
|
-
|
|
190
|
-
file.value.push({
|
|
191
|
-
message: String(nouveau),
|
|
192
|
-
titre: props.titre ? String(props.titre) : undefined,
|
|
193
|
-
|
|
194
|
-
// ✅ Primitives + props => stable (pas de "live update")
|
|
195
|
-
color: String(props.color ?? 'success'),
|
|
196
|
-
location: props.location,
|
|
197
|
-
|
|
198
|
-
// On forward les autres attrs (snapshot) : variant, rounded, etc.
|
|
199
|
-
attrs: structuredClone(toRaw(attrsSansCouleur.value)),
|
|
200
|
-
|
|
201
|
-
timeout,
|
|
202
|
-
})
|
|
203
|
-
|
|
204
|
-
afficherProchain()
|
|
205
|
-
},
|
|
206
|
-
)
|
|
207
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<!--
|
|
3
|
+
FIFO Snackbar
|
|
4
|
+
- On affiche 1 snackbar à la fois.
|
|
5
|
+
- Les demandes suivantes sont mises en file (FIFO) et s’affichent après fermeture.
|
|
6
|
+
- color/location sont figées par item via props (pas via $attrs) pour éviter les changements live.
|
|
7
|
+
-->
|
|
8
|
+
<v-snackbar
|
|
9
|
+
:model-value="snackbar"
|
|
10
|
+
:timeout="-1"
|
|
11
|
+
:style="props.styleCss"
|
|
12
|
+
:color="colorAffiche"
|
|
13
|
+
:location="locationAffiche"
|
|
14
|
+
multi-line
|
|
15
|
+
v-bind="attrsAffiches"
|
|
16
|
+
@update:model-value="
|
|
17
|
+
v => {
|
|
18
|
+
if (!v) fermer()
|
|
19
|
+
}
|
|
20
|
+
"
|
|
21
|
+
>
|
|
22
|
+
<template v-if="titreAffiche || messageAffiche">
|
|
23
|
+
<b style="font-size: 12pt">{{ titreAffiche }}</b>
|
|
24
|
+
<br v-if="titreAffiche" />
|
|
25
|
+
<b>{{ messageAffiche }}</b>
|
|
26
|
+
</template>
|
|
27
|
+
|
|
28
|
+
<template #actions>
|
|
29
|
+
<!-- Toujours afficher la fermeture si timeout = -1 -->
|
|
30
|
+
<v-icon
|
|
31
|
+
v-if="props.btnFermer || timeoutAffiche === -1"
|
|
32
|
+
color="white"
|
|
33
|
+
style="cursor: pointer"
|
|
34
|
+
@click.stop="fermer"
|
|
35
|
+
>
|
|
36
|
+
mdi-close
|
|
37
|
+
</v-icon>
|
|
38
|
+
</template>
|
|
39
|
+
</v-snackbar>
|
|
40
|
+
</template>
|
|
41
|
+
|
|
42
|
+
<script setup lang="ts">
|
|
43
|
+
import { computed, ref, watch, useAttrs, toRaw } from 'vue'
|
|
44
|
+
|
|
45
|
+
// - color/location sont en props (et non via $attrs) pour être snapshottées proprement.
|
|
46
|
+
const props = defineProps({
|
|
47
|
+
styleCss: { type: String, required: false },
|
|
48
|
+
|
|
49
|
+
// Durée d’affichage (ms). -1 = ne ferme jamais automatiquement
|
|
50
|
+
temps: { type: Number, required: false, default: 4000 },
|
|
51
|
+
|
|
52
|
+
// Déclencheur : à chaque changement non-vide, on queue un item
|
|
53
|
+
message: { type: String, required: true },
|
|
54
|
+
titre: { type: String, required: false },
|
|
55
|
+
|
|
56
|
+
btnFermer: { type: Boolean, required: false, default: true },
|
|
57
|
+
|
|
58
|
+
// en props pour éviter le "live update" via $attrs
|
|
59
|
+
color: { type: String, required: false, default: 'success' },
|
|
60
|
+
location: { type: [String, Array, Object] as any, required: false },
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
const emit = defineEmits(['fermer:snackbar'])
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* ============================================================================
|
|
67
|
+
* $attrs : on forward tout sauf color/location (qui sont gérés par props & snapshot)
|
|
68
|
+
* ============================================================================
|
|
69
|
+
*/
|
|
70
|
+
const attrs = useAttrs()
|
|
71
|
+
|
|
72
|
+
const attrsSansCouleur = computed(() => {
|
|
73
|
+
const { color, location, ...rest } = attrs as any
|
|
74
|
+
return rest
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* ============================================================================
|
|
79
|
+
* FIFO Queue (snapshot par item)
|
|
80
|
+
* ============================================================================
|
|
81
|
+
*/
|
|
82
|
+
type ItemSnack = {
|
|
83
|
+
message: string
|
|
84
|
+
titre?: string
|
|
85
|
+
color: string
|
|
86
|
+
location?: any
|
|
87
|
+
attrs: Record<string, any>
|
|
88
|
+
timeout: number // -1 = manuel
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const file = ref<ItemSnack[]>([])
|
|
92
|
+
const enCours = ref<ItemSnack | null>(null)
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* ============================================================================
|
|
96
|
+
* État UI
|
|
97
|
+
* ============================================================================
|
|
98
|
+
*/
|
|
99
|
+
const snackbar = ref(false)
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* ============================================================================
|
|
103
|
+
* Computeds d’affichage (basés sur l’item en cours)
|
|
104
|
+
* ============================================================================
|
|
105
|
+
*/
|
|
106
|
+
const attrsAffiches = computed(() => {
|
|
107
|
+
// On évite de forward color/location par attrs (même s’ils y étaient)
|
|
108
|
+
const a = (enCours.value?.attrs ?? {}) as any
|
|
109
|
+
const { color, location, ...rest } = a
|
|
110
|
+
return rest
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
const messageAffiche = computed(() => enCours.value?.message ?? '')
|
|
114
|
+
const titreAffiche = computed(() => enCours.value?.titre ?? '')
|
|
115
|
+
const colorAffiche = computed(() => enCours.value?.color ?? 'success')
|
|
116
|
+
const locationAffiche = computed(() => enCours.value?.location)
|
|
117
|
+
const timeoutAffiche = computed(() => enCours.value?.timeout ?? props.temps)
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* ============================================================================
|
|
121
|
+
* Timer (auto-close géré par nous, puisque v-snackbar est timeout=-1)
|
|
122
|
+
* ============================================================================
|
|
123
|
+
*/
|
|
124
|
+
let timer: number | null = null
|
|
125
|
+
|
|
126
|
+
function clearTimer() {
|
|
127
|
+
if (timer != null) {
|
|
128
|
+
window.clearTimeout(timer)
|
|
129
|
+
timer = null
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function scheduleAutoClose() {
|
|
134
|
+
clearTimer()
|
|
135
|
+
|
|
136
|
+
const t = timeoutAffiche.value
|
|
137
|
+
if (t === -1) return
|
|
138
|
+
|
|
139
|
+
// 1 seconde minimum, sinon on ne la voit pas
|
|
140
|
+
const ms = Math.max(1000, t)
|
|
141
|
+
|
|
142
|
+
timer = window.setTimeout(() => {
|
|
143
|
+
fermer()
|
|
144
|
+
}, ms)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* ============================================================================
|
|
149
|
+
* Navigation FIFO
|
|
150
|
+
* ============================================================================
|
|
151
|
+
*/
|
|
152
|
+
function afficherProchain() {
|
|
153
|
+
// Un seul snackbar à la fois
|
|
154
|
+
if (snackbar.value) return
|
|
155
|
+
if (enCours.value) return
|
|
156
|
+
|
|
157
|
+
const next = file.value.shift()
|
|
158
|
+
if (!next) return
|
|
159
|
+
|
|
160
|
+
enCours.value = next
|
|
161
|
+
snackbar.value = true
|
|
162
|
+
scheduleAutoClose()
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function fermer() {
|
|
166
|
+
clearTimer()
|
|
167
|
+
snackbar.value = false
|
|
168
|
+
emit('fermer:snackbar')
|
|
169
|
+
|
|
170
|
+
// On attend un tick pour éviter les glitches (transition/DOM)
|
|
171
|
+
setTimeout(() => {
|
|
172
|
+
enCours.value = null
|
|
173
|
+
afficherProchain()
|
|
174
|
+
}, 0)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* ============================================================================
|
|
179
|
+
* queue (snapshot) à chaque nouveau message
|
|
180
|
+
* ============================================================================
|
|
181
|
+
*/
|
|
182
|
+
watch(
|
|
183
|
+
() => props.message,
|
|
184
|
+
nouveau => {
|
|
185
|
+
if (!nouveau) return
|
|
186
|
+
|
|
187
|
+
// Normalisation timeout
|
|
188
|
+
const timeout = props.temps < -1 ? -1 : props.temps >= 0 && props.temps < 1000 ? 1000 : props.temps
|
|
189
|
+
|
|
190
|
+
file.value.push({
|
|
191
|
+
message: String(nouveau),
|
|
192
|
+
titre: props.titre ? String(props.titre) : undefined,
|
|
193
|
+
|
|
194
|
+
// ✅ Primitives + props => stable (pas de "live update")
|
|
195
|
+
color: String(props.color ?? 'success'),
|
|
196
|
+
location: props.location,
|
|
197
|
+
|
|
198
|
+
// On forward les autres attrs (snapshot) : variant, rounded, etc.
|
|
199
|
+
attrs: structuredClone(toRaw(attrsSansCouleur.value)),
|
|
200
|
+
|
|
201
|
+
timeout,
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
afficherProchain()
|
|
205
|
+
},
|
|
206
|
+
)
|
|
207
|
+
</script>
|
|
@@ -155,7 +155,6 @@
|
|
|
155
155
|
|
|
156
156
|
/* NULL (centre + très distinct) */
|
|
157
157
|
:deep(.switch-tristate.is-null .v-switch__track) {
|
|
158
|
-
opacity: 1 !important;
|
|
159
158
|
background:
|
|
160
159
|
repeating-linear-gradient(
|
|
161
160
|
45deg,
|
|
@@ -165,15 +164,16 @@
|
|
|
165
164
|
rgba(255, 255, 255, 0.05) 12px
|
|
166
165
|
),
|
|
167
166
|
rgb(var(--v-theme-warning)) !important;
|
|
167
|
+
opacity: 1 !important;
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
:deep(.switch-tristate.is-null .v-switch__thumb) {
|
|
171
|
-
transform: translateX(calc((100% - 20px) / 2)) !important;
|
|
172
171
|
background: white !important;
|
|
173
|
-
opacity: 1 !important;
|
|
174
172
|
box-shadow:
|
|
175
173
|
0 0 0 2px rgba(var(--v-theme-warning), 0.55),
|
|
176
174
|
0 2px 6px rgba(0, 0, 0, 0.18) !important;
|
|
175
|
+
opacity: 1 !important;
|
|
176
|
+
transform: translateX(calc((100% - 20px) / 2)) !important;
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
/* Icône minus visible sur fond blanc */
|
|
@@ -194,10 +194,10 @@
|
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
.label-ligne {
|
|
197
|
-
display: flex;
|
|
198
197
|
align-items: baseline;
|
|
199
|
-
|
|
198
|
+
display: flex;
|
|
200
199
|
gap: 12px;
|
|
200
|
+
justify-content: space-between;
|
|
201
201
|
}
|
|
202
202
|
|
|
203
203
|
.label-gauche {
|
|
@@ -72,7 +72,6 @@
|
|
|
72
72
|
>
|
|
73
73
|
<v-data-table
|
|
74
74
|
ref="datatable"
|
|
75
|
-
v-bind="$attrs"
|
|
76
75
|
:headers="colonnesAffichees"
|
|
77
76
|
:item-key="itemKey"
|
|
78
77
|
:items="listeEffective"
|
|
@@ -84,6 +83,8 @@
|
|
|
84
83
|
:item-per-page-options="itemsParPageOptions"
|
|
85
84
|
:sort-by="triDepart"
|
|
86
85
|
:multi-sort="estMultiTriActif"
|
|
86
|
+
striped="even"
|
|
87
|
+
v-bind="$attrs"
|
|
87
88
|
@click:row="cliqueLigne"
|
|
88
89
|
>
|
|
89
90
|
<!-- utilisation des slots via le component parent-->
|
|
@@ -141,8 +142,8 @@
|
|
|
141
142
|
@confirmer="supprimer"
|
|
142
143
|
/>
|
|
143
144
|
<modale-choix
|
|
144
|
-
ref="modaleChoix"
|
|
145
145
|
v-if="permettreChoixColonnes"
|
|
146
|
+
ref="modaleChoix"
|
|
146
147
|
:urlbase="urlbase"
|
|
147
148
|
:formulaire-id="formulaireId"
|
|
148
149
|
:identifiant="identifiant"
|
|
@@ -576,26 +577,26 @@
|
|
|
576
577
|
}
|
|
577
578
|
|
|
578
579
|
.BarreRechercheBackIcone {
|
|
580
|
+
background-color: #095797 !important;
|
|
581
|
+
border-bottom: 1px solid #808a9d;
|
|
582
|
+
border-radius: 0 4px 4px 0 !important;
|
|
579
583
|
border-right: 1px solid #808a9d;
|
|
580
584
|
border-top: 1px solid #808a9d;
|
|
581
|
-
border-bottom: 1px solid #808a9d;
|
|
582
|
-
background-color: #095797 !important;
|
|
583
585
|
height: 40px !important;
|
|
584
|
-
|
|
586
|
+
margin-left: -16px;
|
|
585
587
|
max-width: 40px !important;
|
|
586
588
|
min-width: 40px !important;
|
|
587
|
-
padding-right: 0 !important;
|
|
588
589
|
padding-left: 0 !important;
|
|
589
|
-
|
|
590
|
-
|
|
590
|
+
padding-right: 0 !important;
|
|
591
|
+
width: 40px !important;
|
|
591
592
|
}
|
|
592
593
|
|
|
593
594
|
/* icone loupe */
|
|
594
595
|
.BarreRechercheIcone {
|
|
596
|
+
color: white !important;
|
|
595
597
|
font-size: 34px !important;
|
|
596
598
|
margin-left: 1px !important;
|
|
597
599
|
margin-top: 2px !important;
|
|
598
|
-
color: white !important;
|
|
599
600
|
}
|
|
600
601
|
|
|
601
602
|
/* datatable contour */
|
|
@@ -625,12 +626,16 @@
|
|
|
625
626
|
border-bottom: 4px #223654 solid !important;
|
|
626
627
|
}
|
|
627
628
|
|
|
629
|
+
:deep(.v-table__wrapper > table > thead > tr > th) {
|
|
630
|
+
background-color: rgb(var(--v-theme-bleuMoyen)) !important;
|
|
631
|
+
}
|
|
632
|
+
|
|
628
633
|
/* datatable header intérieur*/
|
|
629
|
-
.v-data-table-header__content {
|
|
630
|
-
background-color:
|
|
631
|
-
color:
|
|
632
|
-
font-weight: 600;
|
|
634
|
+
:deep(.v-data-table-header__content) {
|
|
635
|
+
background-color: rgb(var(--v-theme-bleuMoyen)) !important;
|
|
636
|
+
color: rgb(var(--v-theme-blanc)) !important;
|
|
633
637
|
font-size: 15px;
|
|
638
|
+
font-weight: 600;
|
|
634
639
|
height: 46px;
|
|
635
640
|
}
|
|
636
641
|
|
|
@@ -663,8 +668,8 @@
|
|
|
663
668
|
|
|
664
669
|
/* icône d'ancre drag & drop */
|
|
665
670
|
.ancre-drag {
|
|
666
|
-
cursor: grab;
|
|
667
671
|
color: #808a9d;
|
|
672
|
+
cursor: grab;
|
|
668
673
|
}
|
|
669
674
|
.ancre-drag:active {
|
|
670
675
|
cursor: grabbing;
|
|
@@ -41,11 +41,11 @@
|
|
|
41
41
|
<!-- TABLE 1 : Liste des vues -->
|
|
42
42
|
<v-data-table
|
|
43
43
|
id="choixColonnes-choix"
|
|
44
|
+
v-model:expanded="expandedChoixIds"
|
|
44
45
|
class="limiteHauteurChoix"
|
|
45
46
|
:headers="colonnesChoix"
|
|
46
47
|
:items="choix"
|
|
47
48
|
:item-value="row => choixOf(row)._id"
|
|
48
|
-
v-model:expanded="expandedChoixIds"
|
|
49
49
|
show-expand
|
|
50
50
|
:single-expand="true"
|
|
51
51
|
:items-per-page="-1"
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
{{ t('csqc.bouton.ajouter') }}
|
|
66
66
|
</v-btn>
|
|
67
67
|
</template>
|
|
68
|
-
<template
|
|
68
|
+
<template #item.data-table-expand="{ internalItem, isExpanded, toggleExpand }">
|
|
69
69
|
<v-btn
|
|
70
70
|
:append-icon="isExpanded(internalItem) ? 'mdi-chevron-up' : 'mdi-chevron-down'"
|
|
71
71
|
:text="isExpanded(internalItem) ? 'Fermer' : 'Ouvrir'"
|
|
@@ -110,6 +110,7 @@
|
|
|
110
110
|
<!-- TABLE 2 : Colonnes de la vue sélectionnée -->
|
|
111
111
|
<v-data-table
|
|
112
112
|
id="choixColonnes-vue"
|
|
113
|
+
v-sortable-data-table
|
|
113
114
|
class="limiteHauteurChoix colonnes mt-1 mb-4 ordonable"
|
|
114
115
|
:headers="colonnesChoixColonne"
|
|
115
116
|
:items="colonnesEnCours"
|
|
@@ -119,7 +120,6 @@
|
|
|
119
120
|
:items-per-page="-1"
|
|
120
121
|
fixed-header
|
|
121
122
|
:sort-by="triColonnesChoix"
|
|
122
|
-
v-sortable-data-table
|
|
123
123
|
@sorted="changeOrdre"
|
|
124
124
|
>
|
|
125
125
|
<!-- Alerte dans l'entête si aucune colonne n'est sélectionnée -->
|
|
@@ -393,7 +393,7 @@
|
|
|
393
393
|
const desactiverAjout = ref(false)
|
|
394
394
|
|
|
395
395
|
// Tri visuel (on veut ordre asc)
|
|
396
|
-
const triColonnesChoix = ref<
|
|
396
|
+
const triColonnesChoix = ref<{ key: string; order?: 'asc' | 'desc' }[]>([{ key: 'ordre', order: 'asc' }])
|
|
397
397
|
|
|
398
398
|
// Règles validation
|
|
399
399
|
const regles = reactive({
|
|
@@ -14,7 +14,7 @@ export const vSortableDataTable: Directive<HTMLElement, EmitSorted> = {
|
|
|
14
14
|
onEnd: evt => binding.value?.(evt),
|
|
15
15
|
})
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
;(el as any).__csqcSortable = sortable
|
|
18
18
|
},
|
|
19
19
|
beforeUnmount(el) {
|
|
20
20
|
const sortable = (el as any).__csqcSortable as Sortable | undefined
|