codevdesign 1.0.26 → 1.0.27
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/composants/csqcAide.vue +55 -55
- package/composants/csqcAlerteErreur.vue +87 -87
- package/composants/csqcChaise/chaiseConteneur.vue +7 -3
- package/composants/csqcChaise/chaiseItem.vue +54 -54
- package/composants/csqcCodeBudgetaireGenerique.vue +336 -336
- package/composants/csqcConfirmation.vue +75 -75
- package/composants/csqcDate.vue +57 -57
- package/composants/csqcDialogue.vue +118 -118
- package/composants/csqcEntete.vue +163 -163
- package/composants/csqcImportCSV.vue +125 -125
- package/composants/csqcOptionSwitch.vue +120 -120
- package/composants/csqcRecherche.vue +212 -212
- package/composants/csqcRechercheUtilisateur.vue +197 -197
- package/composants/csqcSnackbar.vue +88 -88
- package/composants/csqcTable/csqcTable.vue +383 -383
- package/composants/csqcTable/csqcTableModaleChoixColonnes.vue +586 -586
- package/composants/csqcTexteBilingue.vue +175 -175
- package/composants/csqcTiroir.vue +156 -156
- package/composants/gabarit/csqcMenu.vue +281 -281
- package/composants/gabarit/pivEntete.vue +205 -205
- package/modeles/composants/csqcMenuModele.ts +18 -18
- package/modeles/composants/datatableColonne.ts +31 -31
- package/package.json +1 -1
|
@@ -1,205 +1,205 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<v-toolbar
|
|
3
|
-
color="primary"
|
|
4
|
-
height="72px"
|
|
5
|
-
elevation="1"
|
|
6
|
-
>
|
|
7
|
-
<v-row
|
|
8
|
-
class="pl-6 pr-6"
|
|
9
|
-
align="center"
|
|
10
|
-
no-gutters
|
|
11
|
-
>
|
|
12
|
-
<!-- Première colonne : Logo -->
|
|
13
|
-
<v-col cols="auto">
|
|
14
|
-
<a
|
|
15
|
-
:href="href"
|
|
16
|
-
:target="cssUrlValide ? '_blank' : undefined"
|
|
17
|
-
:rel="cssUrlValide ? 'noopener noreferrer' : undefined"
|
|
18
|
-
>
|
|
19
|
-
<!-- Placeholder (même taille) pendant la décision -->
|
|
20
|
-
<div
|
|
21
|
-
v-if="!ready"
|
|
22
|
-
class="logo-placeholder"
|
|
23
|
-
></div>
|
|
24
|
-
<!-- On ne rend l'image qu'une fois la source choisie -->
|
|
25
|
-
<img
|
|
26
|
-
v-else
|
|
27
|
-
class="logo-img"
|
|
28
|
-
id="pivImage"
|
|
29
|
-
:src="currentSrc!"
|
|
30
|
-
:alt="$t('csqc.pivFooter.logoAlt')"
|
|
31
|
-
decoding="async"
|
|
32
|
-
loading="eager"
|
|
33
|
-
@error="ErreurLogo"
|
|
34
|
-
/>
|
|
35
|
-
</a>
|
|
36
|
-
</v-col>
|
|
37
|
-
|
|
38
|
-
<!-- Colonne pour le nom de l'application (Pour le mode desktop) -->
|
|
39
|
-
<v-col
|
|
40
|
-
v-if="!estMobile"
|
|
41
|
-
class="d-flex justify-center"
|
|
42
|
-
>
|
|
43
|
-
<v-app-bar-title
|
|
44
|
-
class="pl-12 ml-12"
|
|
45
|
-
style="font-size: 16px !important"
|
|
46
|
-
>
|
|
47
|
-
{{ formulaireNom }}
|
|
48
|
-
</v-app-bar-title>
|
|
49
|
-
</v-col>
|
|
50
|
-
|
|
51
|
-
<!-- Colonne pour le bouton de langue et icône d'aide -->
|
|
52
|
-
<v-col class="d-none d-flex justify-end">
|
|
53
|
-
<!-- langue -->
|
|
54
|
-
<v-btn
|
|
55
|
-
variant="text"
|
|
56
|
-
@click="enregistrerLangue()"
|
|
57
|
-
>{{ $t('csqc.pivEntete.langue') }}
|
|
58
|
-
</v-btn>
|
|
59
|
-
|
|
60
|
-
<!-- icône d'aide si dispo -->
|
|
61
|
-
<v-btn
|
|
62
|
-
v-if="aideUrl"
|
|
63
|
-
icon="mdi-help-circle-outline"
|
|
64
|
-
:href="aideUrl"
|
|
65
|
-
target="_blank"
|
|
66
|
-
rel="noopener noreferrer"
|
|
67
|
-
style="margin-top: -6px"
|
|
68
|
-
>
|
|
69
|
-
</v-btn>
|
|
70
|
-
|
|
71
|
-
<slot name="droite"></slot>
|
|
72
|
-
</v-col>
|
|
73
|
-
|
|
74
|
-
<!-- Colonne pour le nom de l'application (Pour le mode mobile) -->
|
|
75
|
-
<v-col
|
|
76
|
-
v-if="props.estMobile"
|
|
77
|
-
cols="12"
|
|
78
|
-
>
|
|
79
|
-
<v-app-bar-title style="font-size: 16px !important">
|
|
80
|
-
{{ formulaireNom }}
|
|
81
|
-
</v-app-bar-title>
|
|
82
|
-
</v-col>
|
|
83
|
-
</v-row>
|
|
84
|
-
</v-toolbar>
|
|
85
|
-
</template>
|
|
86
|
-
|
|
87
|
-
<script setup lang="ts">
|
|
88
|
-
import { ref, watch, computed } from 'vue'
|
|
89
|
-
import { useLocale } from 'vuetify'
|
|
90
|
-
import { useI18n } from 'vue-i18n'
|
|
91
|
-
|
|
92
|
-
const { current } = useLocale()
|
|
93
|
-
const props = defineProps({
|
|
94
|
-
estMobile: { type: Boolean, default: false },
|
|
95
|
-
urlBase: { type: String, required: true },
|
|
96
|
-
aideUrl: { type: String, default: '' },
|
|
97
|
-
cssUrl: { type: String, default: '' },
|
|
98
|
-
logoUrl: { type: String, default: '' },
|
|
99
|
-
lienLogo: { type: String, default: '' },
|
|
100
|
-
formulaireId: { type: Number, default: 0 },
|
|
101
|
-
formulaireNom: { type: String, default: '' },
|
|
102
|
-
})
|
|
103
|
-
const emit = defineEmits(['changementLangue'])
|
|
104
|
-
const { t } = useI18n()
|
|
105
|
-
|
|
106
|
-
const FALLBACK = '/images/QUEBEC_blanc.svg'
|
|
107
|
-
const currentSrc = ref<string | null>(null) // pas d'image tant que null
|
|
108
|
-
const ready = ref(false)
|
|
109
|
-
|
|
110
|
-
const formulaireNom = computed(() => {
|
|
111
|
-
return props.formulaireNom || t('nom_application')
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
const href = computed(() => (props.cssUrl?.trim() ? props.cssUrl.trim() : '/'))
|
|
115
|
-
const cssUrlValide = computed(() => /^https?:\/\//i.test(href.value))
|
|
116
|
-
|
|
117
|
-
let loadToken = 0 // ← identifiant de “requête” pour annuler logiquement
|
|
118
|
-
|
|
119
|
-
// Sur changement de l’URL du logo, on tente de le charger, sinon fallback apres 3.5 secs
|
|
120
|
-
watch(
|
|
121
|
-
() => props.logoUrl,
|
|
122
|
-
async (nouvelle, ancienne) => {
|
|
123
|
-
const url = (nouvelle ?? '').trim()
|
|
124
|
-
|
|
125
|
-
// même URL → ne rien faire
|
|
126
|
-
if (url === (ancienne ?? '').trim() && currentSrc.value !== null) return
|
|
127
|
-
|
|
128
|
-
// pas d’URL → fallback immédiat
|
|
129
|
-
if (!url) {
|
|
130
|
-
currentSrc.value = FALLBACK
|
|
131
|
-
ready.value = true
|
|
132
|
-
return
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// nouvelle tentative (avec “annulation logique”)
|
|
136
|
-
const token = ++loadToken
|
|
137
|
-
ready.value = false
|
|
138
|
-
const ok = await loadWithTimeout(url, 3500)
|
|
139
|
-
if (token !== loadToken) return // une nouvelle tentative a démarré entre-temps
|
|
140
|
-
|
|
141
|
-
currentSrc.value = ok ? url : FALLBACK
|
|
142
|
-
ready.value = true
|
|
143
|
-
},
|
|
144
|
-
{ immediate: true },
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
// Charge une image avec un timeout
|
|
148
|
-
function loadWithTimeout(url: string, timeoutMs: number): Promise<boolean> {
|
|
149
|
-
return new Promise<boolean>(resolve => {
|
|
150
|
-
const img = new Image()
|
|
151
|
-
const timer = setTimeout(() => {
|
|
152
|
-
// trop long → on abandonne
|
|
153
|
-
img.src = '' // stoppe le chargement
|
|
154
|
-
resolve(false)
|
|
155
|
-
}, timeoutMs)
|
|
156
|
-
|
|
157
|
-
img.onload = () => {
|
|
158
|
-
clearTimeout(timer)
|
|
159
|
-
resolve(true)
|
|
160
|
-
}
|
|
161
|
-
img.onerror = () => {
|
|
162
|
-
clearTimeout(timer)
|
|
163
|
-
resolve(false)
|
|
164
|
-
}
|
|
165
|
-
img.src = url
|
|
166
|
-
})
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Si l'image choisie a un problème, switch sur le fallback
|
|
170
|
-
function ErreurLogo() {
|
|
171
|
-
if (currentSrc.value !== FALLBACK) currentSrc.value = FALLBACK
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
const enregistrerLangue = (): void => {
|
|
175
|
-
const langueDispo: string = current.value === 'fr' ? 'en' : 'fr'
|
|
176
|
-
let returnUrl = window.location.pathname + window.location.search
|
|
177
|
-
if (import.meta.env.MODE === 'development') {
|
|
178
|
-
returnUrl = '/'
|
|
179
|
-
}
|
|
180
|
-
window.location.href =
|
|
181
|
-
props.urlBase + `/Traducteur/SetLanguage?culture=${langueDispo}&returnUrl=${encodeURIComponent(returnUrl)}`
|
|
182
|
-
emit('changementLangue')
|
|
183
|
-
}
|
|
184
|
-
</script>
|
|
185
|
-
|
|
186
|
-
<style scoped>
|
|
187
|
-
.container {
|
|
188
|
-
max-width: none !important;
|
|
189
|
-
}
|
|
190
|
-
.theme--light.v-app-bar.v-toolbar.v-sheet {
|
|
191
|
-
background: #095797;
|
|
192
|
-
|
|
193
|
-
color: #fff;
|
|
194
|
-
}
|
|
195
|
-
.logo-placeholder {
|
|
196
|
-
height: 72px;
|
|
197
|
-
width: 180px;
|
|
198
|
-
}
|
|
199
|
-
.logo-img {
|
|
200
|
-
height: 72px;
|
|
201
|
-
transition: opacity 0.15s;
|
|
202
|
-
opacity: 1;
|
|
203
|
-
display: block;
|
|
204
|
-
}
|
|
205
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<v-toolbar
|
|
3
|
+
color="primary"
|
|
4
|
+
height="72px"
|
|
5
|
+
elevation="1"
|
|
6
|
+
>
|
|
7
|
+
<v-row
|
|
8
|
+
class="pl-6 pr-6"
|
|
9
|
+
align="center"
|
|
10
|
+
no-gutters
|
|
11
|
+
>
|
|
12
|
+
<!-- Première colonne : Logo -->
|
|
13
|
+
<v-col cols="auto">
|
|
14
|
+
<a
|
|
15
|
+
:href="href"
|
|
16
|
+
:target="cssUrlValide ? '_blank' : undefined"
|
|
17
|
+
:rel="cssUrlValide ? 'noopener noreferrer' : undefined"
|
|
18
|
+
>
|
|
19
|
+
<!-- Placeholder (même taille) pendant la décision -->
|
|
20
|
+
<div
|
|
21
|
+
v-if="!ready"
|
|
22
|
+
class="logo-placeholder"
|
|
23
|
+
></div>
|
|
24
|
+
<!-- On ne rend l'image qu'une fois la source choisie -->
|
|
25
|
+
<img
|
|
26
|
+
v-else
|
|
27
|
+
class="logo-img"
|
|
28
|
+
id="pivImage"
|
|
29
|
+
:src="currentSrc!"
|
|
30
|
+
:alt="$t('csqc.pivFooter.logoAlt')"
|
|
31
|
+
decoding="async"
|
|
32
|
+
loading="eager"
|
|
33
|
+
@error="ErreurLogo"
|
|
34
|
+
/>
|
|
35
|
+
</a>
|
|
36
|
+
</v-col>
|
|
37
|
+
|
|
38
|
+
<!-- Colonne pour le nom de l'application (Pour le mode desktop) -->
|
|
39
|
+
<v-col
|
|
40
|
+
v-if="!estMobile"
|
|
41
|
+
class="d-flex justify-center"
|
|
42
|
+
>
|
|
43
|
+
<v-app-bar-title
|
|
44
|
+
class="pl-12 ml-12"
|
|
45
|
+
style="font-size: 16px !important"
|
|
46
|
+
>
|
|
47
|
+
{{ formulaireNom }}
|
|
48
|
+
</v-app-bar-title>
|
|
49
|
+
</v-col>
|
|
50
|
+
|
|
51
|
+
<!-- Colonne pour le bouton de langue et icône d'aide -->
|
|
52
|
+
<v-col class="d-none d-flex justify-end">
|
|
53
|
+
<!-- langue -->
|
|
54
|
+
<v-btn
|
|
55
|
+
variant="text"
|
|
56
|
+
@click="enregistrerLangue()"
|
|
57
|
+
>{{ $t('csqc.pivEntete.langue') }}
|
|
58
|
+
</v-btn>
|
|
59
|
+
|
|
60
|
+
<!-- icône d'aide si dispo -->
|
|
61
|
+
<v-btn
|
|
62
|
+
v-if="aideUrl"
|
|
63
|
+
icon="mdi-help-circle-outline"
|
|
64
|
+
:href="aideUrl"
|
|
65
|
+
target="_blank"
|
|
66
|
+
rel="noopener noreferrer"
|
|
67
|
+
style="margin-top: -6px"
|
|
68
|
+
>
|
|
69
|
+
</v-btn>
|
|
70
|
+
|
|
71
|
+
<slot name="droite"></slot>
|
|
72
|
+
</v-col>
|
|
73
|
+
|
|
74
|
+
<!-- Colonne pour le nom de l'application (Pour le mode mobile) -->
|
|
75
|
+
<v-col
|
|
76
|
+
v-if="props.estMobile"
|
|
77
|
+
cols="12"
|
|
78
|
+
>
|
|
79
|
+
<v-app-bar-title style="font-size: 16px !important">
|
|
80
|
+
{{ formulaireNom }}
|
|
81
|
+
</v-app-bar-title>
|
|
82
|
+
</v-col>
|
|
83
|
+
</v-row>
|
|
84
|
+
</v-toolbar>
|
|
85
|
+
</template>
|
|
86
|
+
|
|
87
|
+
<script setup lang="ts">
|
|
88
|
+
import { ref, watch, computed } from 'vue'
|
|
89
|
+
import { useLocale } from 'vuetify'
|
|
90
|
+
import { useI18n } from 'vue-i18n'
|
|
91
|
+
|
|
92
|
+
const { current } = useLocale()
|
|
93
|
+
const props = defineProps({
|
|
94
|
+
estMobile: { type: Boolean, default: false },
|
|
95
|
+
urlBase: { type: String, required: true },
|
|
96
|
+
aideUrl: { type: String, default: '' },
|
|
97
|
+
cssUrl: { type: String, default: '' },
|
|
98
|
+
logoUrl: { type: String, default: '' },
|
|
99
|
+
lienLogo: { type: String, default: '' },
|
|
100
|
+
formulaireId: { type: Number, default: 0 },
|
|
101
|
+
formulaireNom: { type: String, default: '' },
|
|
102
|
+
})
|
|
103
|
+
const emit = defineEmits(['changementLangue'])
|
|
104
|
+
const { t } = useI18n()
|
|
105
|
+
|
|
106
|
+
const FALLBACK = '/images/QUEBEC_blanc.svg'
|
|
107
|
+
const currentSrc = ref<string | null>(null) // pas d'image tant que null
|
|
108
|
+
const ready = ref(false)
|
|
109
|
+
|
|
110
|
+
const formulaireNom = computed(() => {
|
|
111
|
+
return props.formulaireNom || t('nom_application')
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
const href = computed(() => (props.cssUrl?.trim() ? props.cssUrl.trim() : '/'))
|
|
115
|
+
const cssUrlValide = computed(() => /^https?:\/\//i.test(href.value))
|
|
116
|
+
|
|
117
|
+
let loadToken = 0 // ← identifiant de “requête” pour annuler logiquement
|
|
118
|
+
|
|
119
|
+
// Sur changement de l’URL du logo, on tente de le charger, sinon fallback apres 3.5 secs
|
|
120
|
+
watch(
|
|
121
|
+
() => props.logoUrl,
|
|
122
|
+
async (nouvelle, ancienne) => {
|
|
123
|
+
const url = (nouvelle ?? '').trim()
|
|
124
|
+
|
|
125
|
+
// même URL → ne rien faire
|
|
126
|
+
if (url === (ancienne ?? '').trim() && currentSrc.value !== null) return
|
|
127
|
+
|
|
128
|
+
// pas d’URL → fallback immédiat
|
|
129
|
+
if (!url) {
|
|
130
|
+
currentSrc.value = FALLBACK
|
|
131
|
+
ready.value = true
|
|
132
|
+
return
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// nouvelle tentative (avec “annulation logique”)
|
|
136
|
+
const token = ++loadToken
|
|
137
|
+
ready.value = false
|
|
138
|
+
const ok = await loadWithTimeout(url, 3500)
|
|
139
|
+
if (token !== loadToken) return // une nouvelle tentative a démarré entre-temps
|
|
140
|
+
|
|
141
|
+
currentSrc.value = ok ? url : FALLBACK
|
|
142
|
+
ready.value = true
|
|
143
|
+
},
|
|
144
|
+
{ immediate: true },
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
// Charge une image avec un timeout
|
|
148
|
+
function loadWithTimeout(url: string, timeoutMs: number): Promise<boolean> {
|
|
149
|
+
return new Promise<boolean>(resolve => {
|
|
150
|
+
const img = new Image()
|
|
151
|
+
const timer = setTimeout(() => {
|
|
152
|
+
// trop long → on abandonne
|
|
153
|
+
img.src = '' // stoppe le chargement
|
|
154
|
+
resolve(false)
|
|
155
|
+
}, timeoutMs)
|
|
156
|
+
|
|
157
|
+
img.onload = () => {
|
|
158
|
+
clearTimeout(timer)
|
|
159
|
+
resolve(true)
|
|
160
|
+
}
|
|
161
|
+
img.onerror = () => {
|
|
162
|
+
clearTimeout(timer)
|
|
163
|
+
resolve(false)
|
|
164
|
+
}
|
|
165
|
+
img.src = url
|
|
166
|
+
})
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Si l'image choisie a un problème, switch sur le fallback
|
|
170
|
+
function ErreurLogo() {
|
|
171
|
+
if (currentSrc.value !== FALLBACK) currentSrc.value = FALLBACK
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const enregistrerLangue = (): void => {
|
|
175
|
+
const langueDispo: string = current.value === 'fr' ? 'en' : 'fr'
|
|
176
|
+
let returnUrl = window.location.pathname + window.location.search
|
|
177
|
+
if (import.meta.env.MODE === 'development') {
|
|
178
|
+
returnUrl = '/'
|
|
179
|
+
}
|
|
180
|
+
window.location.href =
|
|
181
|
+
props.urlBase + `/Traducteur/SetLanguage?culture=${langueDispo}&returnUrl=${encodeURIComponent(returnUrl)}`
|
|
182
|
+
emit('changementLangue')
|
|
183
|
+
}
|
|
184
|
+
</script>
|
|
185
|
+
|
|
186
|
+
<style scoped>
|
|
187
|
+
.container {
|
|
188
|
+
max-width: none !important;
|
|
189
|
+
}
|
|
190
|
+
.theme--light.v-app-bar.v-toolbar.v-sheet {
|
|
191
|
+
background: #095797;
|
|
192
|
+
|
|
193
|
+
color: #fff;
|
|
194
|
+
}
|
|
195
|
+
.logo-placeholder {
|
|
196
|
+
height: 72px;
|
|
197
|
+
width: 180px;
|
|
198
|
+
}
|
|
199
|
+
.logo-img {
|
|
200
|
+
height: 72px;
|
|
201
|
+
transition: opacity 0.15s;
|
|
202
|
+
opacity: 1;
|
|
203
|
+
display: block;
|
|
204
|
+
}
|
|
205
|
+
</style>
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
export interface MenuItem {
|
|
2
|
-
nom: string
|
|
3
|
-
path: string
|
|
4
|
-
droit: string
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export interface SousListe {
|
|
8
|
-
droit: string
|
|
9
|
-
id: number
|
|
10
|
-
nom: string
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface SousListeItems {
|
|
14
|
-
parentId: number
|
|
15
|
-
nom: string
|
|
16
|
-
path: string
|
|
17
|
-
droit: string
|
|
18
|
-
}
|
|
1
|
+
export interface MenuItem {
|
|
2
|
+
nom: string
|
|
3
|
+
path: string
|
|
4
|
+
droit: string
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface SousListe {
|
|
8
|
+
droit: string
|
|
9
|
+
id: number
|
|
10
|
+
nom: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface SousListeItems {
|
|
14
|
+
parentId: number
|
|
15
|
+
nom: string
|
|
16
|
+
path: string
|
|
17
|
+
droit: string
|
|
18
|
+
}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import type { DataTableCompareFunction, DataTableHeader, FilterFunction } from 'vuetify'
|
|
2
|
-
import { HeaderCellProps } from 'vuetify/lib/components/VDataTable/types.mjs';
|
|
3
|
-
import { SelectItemKey } from 'vuetify/lib/util/helpers.mjs';
|
|
4
|
-
|
|
5
|
-
class datatableColonne<T = any> implements DataTableHeader<T> {
|
|
6
|
-
key?: 'data-table-group' | 'data-table-select' | 'data-table-expand' | (string & {});
|
|
7
|
-
value?: SelectItemKey<T>;
|
|
8
|
-
title?: string;
|
|
9
|
-
fixed?: boolean | 'start' | 'end';
|
|
10
|
-
align?: 'start' | 'end' | 'center';
|
|
11
|
-
width?: number | string;
|
|
12
|
-
minWidth?: number | string;
|
|
13
|
-
maxWidth?: number | string;
|
|
14
|
-
nowrap?: boolean;
|
|
15
|
-
intent?: number;
|
|
16
|
-
headerProps?: Record<string, any>;
|
|
17
|
-
cellProps?: HeaderCellProps;
|
|
18
|
-
sortable?: boolean;
|
|
19
|
-
sort?: DataTableCompareFunction;
|
|
20
|
-
sortRaw?: DataTableCompareFunction;
|
|
21
|
-
filter?: FilterFunction;
|
|
22
|
-
children?: DataTableHeader<T>[];
|
|
23
|
-
|
|
24
|
-
constructor(title: string, key: string) {
|
|
25
|
-
this.title = title
|
|
26
|
-
this.key = key
|
|
27
|
-
this.align = key === 'action' ? 'end' : key === 'estActif' ? 'center' : 'start'
|
|
28
|
-
this.sortable = key !== 'action'
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
export default datatableColonne
|
|
1
|
+
import type { DataTableCompareFunction, DataTableHeader, FilterFunction } from 'vuetify'
|
|
2
|
+
import { HeaderCellProps } from 'vuetify/lib/components/VDataTable/types.mjs';
|
|
3
|
+
import { SelectItemKey } from 'vuetify/lib/util/helpers.mjs';
|
|
4
|
+
|
|
5
|
+
class datatableColonne<T = any> implements DataTableHeader<T> {
|
|
6
|
+
key?: 'data-table-group' | 'data-table-select' | 'data-table-expand' | (string & {});
|
|
7
|
+
value?: SelectItemKey<T>;
|
|
8
|
+
title?: string;
|
|
9
|
+
fixed?: boolean | 'start' | 'end';
|
|
10
|
+
align?: 'start' | 'end' | 'center';
|
|
11
|
+
width?: number | string;
|
|
12
|
+
minWidth?: number | string;
|
|
13
|
+
maxWidth?: number | string;
|
|
14
|
+
nowrap?: boolean;
|
|
15
|
+
intent?: number;
|
|
16
|
+
headerProps?: Record<string, any>;
|
|
17
|
+
cellProps?: HeaderCellProps;
|
|
18
|
+
sortable?: boolean;
|
|
19
|
+
sort?: DataTableCompareFunction;
|
|
20
|
+
sortRaw?: DataTableCompareFunction;
|
|
21
|
+
filter?: FilterFunction;
|
|
22
|
+
children?: DataTableHeader<T>[];
|
|
23
|
+
|
|
24
|
+
constructor(title: string, key: string) {
|
|
25
|
+
this.title = title
|
|
26
|
+
this.key = key
|
|
27
|
+
this.align = key === 'action' ? 'end' : key === 'estActif' ? 'center' : 'start'
|
|
28
|
+
this.sortable = key !== 'action'
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export default datatableColonne
|