codevdesign 1.0.39 → 1.0.40

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,175 +1,175 @@
1
- <template>
2
- <v-row dense>
3
- <v-col
4
- v-if="afficherChampFr"
5
- cols="12"
6
- >
7
- <label
8
- v-if="!libelleInterieur"
9
- :for="`saisieChampFr-${cleTradFr}`"
10
- :class="{ libelle: true, required: estRequis }"
11
- >{{ $t(cleTradFr) }}
12
- </label>
13
- <csqcAide
14
- v-if="props.aide && !libelleInterieur"
15
- :aide="props.aide"
16
- hover
17
- :style-css="'padding-bottom:6px;padding-left:8px;'"
18
- />
19
- <v-textarea
20
- v-if="textarea"
21
- :id="`saisieChampFr-${cleTradFr}`"
22
- v-model="model[champs.Francais]"
23
- density="comfortable"
24
- v-bind="$attrs"
25
- rows="1"
26
- :label="libelleInterieur ? $t(cleTradFr) : ''"
27
- :rules="reglesInterne"
28
- :autofocus="autofocus && afficherChampFr"
29
- />
30
- <v-text-field
31
- v-else
32
- :id="`saisieChampFr-${cleTradFr}`"
33
- v-model="model[champs.Francais]"
34
- density="comfortable"
35
- v-bind="$attrs"
36
- :label="libelleInterieur ? $t(cleTradFr) : ''"
37
- :rules="reglesInterne"
38
- :autofocus="autofocus && afficherChampFr"
39
- />
40
- </v-col>
41
- <v-col
42
- v-if="afficherChampEn"
43
- cols="12"
44
- >
45
- <label
46
- v-if="!libelleInterieur"
47
- :for="`saisieChampEn-${cleTradEn}`"
48
- :class="{ libelle: true, required: estRequis }"
49
- >{{ $t(cleTradEn) }}</label
50
- ><csqcAide
51
- v-if="props.aide && !libelleInterieur"
52
- :aide="props.aide"
53
- hover
54
- :style-css="'padding-bottom:6px;padding-left:8px;'"
55
- />
56
- <v-textarea
57
- v-if="textarea"
58
- :id="`saisieChampEn-${cleTradEn}`"
59
- v-model="model[champs.Anglais]"
60
- rows="1"
61
- v-bind="$attrs"
62
- density="comfortable"
63
- :label="libelleInterieur ? $t(cleTradEn) : ''"
64
- :rules="reglesInterne"
65
- :autofocus="autofocus && !afficherChampFr"
66
- />
67
- <v-text-field
68
- v-else
69
- :id="`saisieChampEn-${cleTradEn}`"
70
- v-model="model[champs.Anglais]"
71
- density="comfortable"
72
- v-bind="$attrs"
73
- :label="libelleInterieur ? $t(cleTradEn) : ''"
74
- :rules="reglesInterne"
75
- :autofocus="autofocus && !afficherChampFr"
76
- />
77
- </v-col>
78
- </v-row>
79
- </template>
80
-
81
- <script setup lang="ts" generic="T extends { id: number }">
82
- import { estRequis as estRequisRegle, estUniqueBilingue, estMinimumLongueur, estMaximumLongueur } from './validateurs'
83
- import { ChoixLangue } from '@/enums/choixLangue'
84
- import csqcAide from './csqcAide.vue'
85
- import { computed, type PropType, toRefs } from 'vue'
86
- import { useI18n } from 'vue-i18n'
87
- const { t } = useI18n({ useScope: 'global' })
88
-
89
- const props = defineProps<{
90
- aide?: string
91
- textarea?: boolean
92
- libelleInterieur?: boolean
93
- estRequis?: boolean
94
- autofocus?: boolean
95
- estUniqueValeurs?: T[]
96
- minimumLongueur?: number
97
- maximumLongueur?: number
98
- regles?: ((v: string) => string | true)[]
99
- langue: ChoixLangue
100
- i18nLibelleRacine: string
101
- champs: { ['Francais']: keyof T; ['Anglais']: keyof T }
102
- }>()
103
-
104
- const { textarea, libelleInterieur, autofocus, estUniqueValeurs, regles, langue, i18nLibelleRacine, champs } =
105
- toRefs(props)
106
-
107
- const minimumLongueur = computed(() => props.minimumLongueur)
108
- const maximumLongueur = computed(() => props.maximumLongueur)
109
- const estRequis = computed(() => props.estRequis)
110
-
111
- const model = defineModel({
112
- type: Object as PropType<T>,
113
- required: true,
114
- })
115
-
116
- const reglesInterne = computed(() => {
117
- const _regles: ((v: string) => string | true)[] = regles.value ?? []
118
-
119
- if (minimumLongueur.value && maximumLongueur.value && minimumLongueur.value > maximumLongueur.value) {
120
- console.error(
121
- `CsqcTexteBilingue - Longueur min > max. (Min ${minimumLongueur.value} > Max ${maximumLongueur.value})`,
122
- )
123
- throw Error(
124
- `CsqcTexteBilingue - Longueur min > max. (Min ${minimumLongueur.value} > Max ${maximumLongueur.value})`,
125
- )
126
- }
127
-
128
- if (estRequis.value) _regles.push(v => estRequisRegle(v, t))
129
-
130
- if (estUniqueValeurs.value) {
131
- _regles.push(v =>
132
- estUniqueBilingue(
133
- v,
134
- model.value,
135
- {
136
- champs: { Anglais: champs.value.Anglais, Francais: champs.value.Francais },
137
- valeurs: estUniqueValeurs.value!,
138
- langueCss: langue.value,
139
- },
140
- t,
141
- ),
142
- )
143
- }
144
-
145
- if (minimumLongueur.value !== undefined) _regles.push(v => estMinimumLongueur(v, minimumLongueur.value!, t))
146
-
147
- if (maximumLongueur.value !== undefined) _regles.push(v => estMaximumLongueur(v, maximumLongueur.value!, t))
148
-
149
- return _regles
150
- })
151
-
152
- // Clés i18n
153
- const cleTradEn = computed(() => {
154
- switch (langue.value) {
155
- case ChoixLangue.Bilingue:
156
- case ChoixLangue.Anglais:
157
- return `${i18nLibelleRacine.value}.${String(champs.value.Anglais)}`
158
- default:
159
- return 'cle_manquante'
160
- }
161
- })
162
-
163
- const cleTradFr = computed(() => {
164
- switch (langue.value) {
165
- case ChoixLangue.Bilingue:
166
- case ChoixLangue.Francais:
167
- return `${i18nLibelleRacine.value}.${String(champs.value.Francais)}`
168
- default:
169
- return 'cle_manquante'
170
- }
171
- })
172
-
173
- const afficherChampFr = computed(() => langue.value === ChoixLangue.Francais || langue.value === ChoixLangue.Bilingue)
174
- const afficherChampEn = computed(() => langue.value === ChoixLangue.Anglais || langue.value === ChoixLangue.Bilingue)
175
- </script>
1
+ <template>
2
+ <v-row dense>
3
+ <v-col
4
+ v-if="afficherChampFr"
5
+ cols="12"
6
+ >
7
+ <label
8
+ v-if="!libelleInterieur"
9
+ :for="`saisieChampFr-${cleTradFr}`"
10
+ :class="{ libelle: true, required: estRequis }"
11
+ >{{ $t(cleTradFr) }}
12
+ </label>
13
+ <csqcAide
14
+ v-if="props.aide && !libelleInterieur"
15
+ :aide="props.aide"
16
+ hover
17
+ :style-css="'padding-bottom:6px;padding-left:8px;'"
18
+ />
19
+ <v-textarea
20
+ v-if="textarea"
21
+ :id="`saisieChampFr-${cleTradFr}`"
22
+ v-model="model[champs.Francais]"
23
+ density="comfortable"
24
+ v-bind="$attrs"
25
+ rows="1"
26
+ :label="libelleInterieur ? $t(cleTradFr) : ''"
27
+ :rules="reglesInterne"
28
+ :autofocus="autofocus && afficherChampFr"
29
+ />
30
+ <v-text-field
31
+ v-else
32
+ :id="`saisieChampFr-${cleTradFr}`"
33
+ v-model="model[champs.Francais]"
34
+ density="comfortable"
35
+ v-bind="$attrs"
36
+ :label="libelleInterieur ? $t(cleTradFr) : ''"
37
+ :rules="reglesInterne"
38
+ :autofocus="autofocus && afficherChampFr"
39
+ />
40
+ </v-col>
41
+ <v-col
42
+ v-if="afficherChampEn"
43
+ cols="12"
44
+ >
45
+ <label
46
+ v-if="!libelleInterieur"
47
+ :for="`saisieChampEn-${cleTradEn}`"
48
+ :class="{ libelle: true, required: estRequis }"
49
+ >{{ $t(cleTradEn) }}</label
50
+ ><csqcAide
51
+ v-if="props.aide && !libelleInterieur"
52
+ :aide="props.aide"
53
+ hover
54
+ :style-css="'padding-bottom:6px;padding-left:8px;'"
55
+ />
56
+ <v-textarea
57
+ v-if="textarea"
58
+ :id="`saisieChampEn-${cleTradEn}`"
59
+ v-model="model[champs.Anglais]"
60
+ rows="1"
61
+ v-bind="$attrs"
62
+ density="comfortable"
63
+ :label="libelleInterieur ? $t(cleTradEn) : ''"
64
+ :rules="reglesInterne"
65
+ :autofocus="autofocus && !afficherChampFr"
66
+ />
67
+ <v-text-field
68
+ v-else
69
+ :id="`saisieChampEn-${cleTradEn}`"
70
+ v-model="model[champs.Anglais]"
71
+ density="comfortable"
72
+ v-bind="$attrs"
73
+ :label="libelleInterieur ? $t(cleTradEn) : ''"
74
+ :rules="reglesInterne"
75
+ :autofocus="autofocus && !afficherChampFr"
76
+ />
77
+ </v-col>
78
+ </v-row>
79
+ </template>
80
+
81
+ <script setup lang="ts" generic="T extends { id: number }">
82
+ import { estRequis as estRequisRegle, estUniqueBilingue, estMinimumLongueur, estMaximumLongueur } from './validateurs'
83
+ import { ChoixLangue } from '@/enums/choixLangue'
84
+ import csqcAide from './csqcAide.vue'
85
+ import { computed, type PropType, toRefs } from 'vue'
86
+ import { useI18n } from 'vue-i18n'
87
+ const { t } = useI18n({ useScope: 'global' })
88
+
89
+ const props = defineProps<{
90
+ aide?: string
91
+ textarea?: boolean
92
+ libelleInterieur?: boolean
93
+ estRequis?: boolean
94
+ autofocus?: boolean
95
+ estUniqueValeurs?: T[]
96
+ minimumLongueur?: number
97
+ maximumLongueur?: number
98
+ regles?: ((v: string) => string | true)[]
99
+ langue: ChoixLangue
100
+ i18nLibelleRacine: string
101
+ champs: { ['Francais']: keyof T; ['Anglais']: keyof T }
102
+ }>()
103
+
104
+ const { textarea, libelleInterieur, autofocus, estUniqueValeurs, regles, langue, i18nLibelleRacine, champs } =
105
+ toRefs(props)
106
+
107
+ const minimumLongueur = computed(() => props.minimumLongueur)
108
+ const maximumLongueur = computed(() => props.maximumLongueur)
109
+ const estRequis = computed(() => props.estRequis)
110
+
111
+ const model = defineModel({
112
+ type: Object as PropType<T>,
113
+ required: true,
114
+ })
115
+
116
+ const reglesInterne = computed(() => {
117
+ const _regles: ((v: string) => string | true)[] = regles.value ?? []
118
+
119
+ if (minimumLongueur.value && maximumLongueur.value && minimumLongueur.value > maximumLongueur.value) {
120
+ console.error(
121
+ `CsqcTexteBilingue - Longueur min > max. (Min ${minimumLongueur.value} > Max ${maximumLongueur.value})`,
122
+ )
123
+ throw Error(
124
+ `CsqcTexteBilingue - Longueur min > max. (Min ${minimumLongueur.value} > Max ${maximumLongueur.value})`,
125
+ )
126
+ }
127
+
128
+ if (estRequis.value) _regles.push(v => estRequisRegle(v, t))
129
+
130
+ if (estUniqueValeurs.value) {
131
+ _regles.push(v =>
132
+ estUniqueBilingue(
133
+ v,
134
+ model.value,
135
+ {
136
+ champs: { Anglais: champs.value.Anglais, Francais: champs.value.Francais },
137
+ valeurs: estUniqueValeurs.value!,
138
+ langueCss: langue.value,
139
+ },
140
+ t,
141
+ ),
142
+ )
143
+ }
144
+
145
+ if (minimumLongueur.value !== undefined) _regles.push(v => estMinimumLongueur(v, minimumLongueur.value!, t))
146
+
147
+ if (maximumLongueur.value !== undefined) _regles.push(v => estMaximumLongueur(v, maximumLongueur.value!, t))
148
+
149
+ return _regles
150
+ })
151
+
152
+ // Clés i18n
153
+ const cleTradEn = computed(() => {
154
+ switch (langue.value) {
155
+ case ChoixLangue.Bilingue:
156
+ case ChoixLangue.Anglais:
157
+ return `${i18nLibelleRacine.value}.${String(champs.value.Anglais)}`
158
+ default:
159
+ return 'cle_manquante'
160
+ }
161
+ })
162
+
163
+ const cleTradFr = computed(() => {
164
+ switch (langue.value) {
165
+ case ChoixLangue.Bilingue:
166
+ case ChoixLangue.Francais:
167
+ return `${i18nLibelleRacine.value}.${String(champs.value.Francais)}`
168
+ default:
169
+ return 'cle_manquante'
170
+ }
171
+ })
172
+
173
+ const afficherChampFr = computed(() => langue.value === ChoixLangue.Francais || langue.value === ChoixLangue.Bilingue)
174
+ const afficherChampEn = computed(() => langue.value === ChoixLangue.Anglais || langue.value === ChoixLangue.Bilingue)
175
+ </script>
@@ -1,156 +1,156 @@
1
- <template>
2
- <v-navigation-drawer
3
- v-model="visible"
4
- location="right"
5
- temporary
6
- v-bind="$attrs"
7
- :width="grosseurTiroir"
8
- class="pa-0 elevation-2 csqc-ligneBleue"
9
- :persistent="persistant"
10
- @keydown.esc="!persistant ? fermeture : ''"
11
- @click:outside="!persistant ? fermeture : ''"
12
- >
13
- <v-card class="pa-0 ma-0 pl-8 pt-8">
14
- <!-- Bouton en haut à droite -->
15
- <v-btn
16
- icon="mdi-close"
17
- variant="text"
18
- class="position-absolute couleurHover"
19
- style="top: 5px; right: 5px"
20
- @click="fermeture"
21
- ></v-btn>
22
-
23
- <v-card-title
24
- class="pa-0 ma-0 pb-6 text-wrap"
25
- style="font-size: 24px"
26
- >
27
- <slot name="titre"></slot>
28
- <div text-h5>{{ titre }}</div>
29
- </v-card-title>
30
-
31
- <v-card-text class="pa-0 ma-0 pb-6 pr-6">
32
- <v-container>
33
- <slot></slot>
34
- <slot name="content"></slot>
35
- </v-container>
36
- </v-card-text>
37
- <v-card-actions class="my-2 d-flex justify-end pr-6 pb-5">
38
- <slot name="actions"></slot>
39
- <v-btn
40
- v-if="btnAnnuler"
41
- color="primary"
42
- variant="text"
43
- :loading="operationEnCours"
44
- @click="fermeture"
45
- >
46
- {{ props.btnAnnulerTexte ? props.btnAnnulerTexte : $t('csqc.bouton.annuler') }}
47
- </v-btn>
48
-
49
- <v-btn
50
- v-if="btnOk"
51
- class="Gouttiere"
52
- color="primary"
53
- variant="flat"
54
- :loading="operationEnCours"
55
- :disabled="btnOkDesactiver || operationEnCours"
56
- @click="okBouton"
57
- >
58
- {{ props.btnOkTexte ? props.btnOkTexte : $t('csqc.bouton.ok') }}
59
- </v-btn>
60
- </v-card-actions>
61
- </v-card>
62
- </v-navigation-drawer>
63
- </template>
64
- <script lang="ts" setup>
65
- import { ref, computed } from 'vue'
66
- import { useDisplay } from 'vuetify'
67
-
68
- const visible = ref(false)
69
- const display = useDisplay()
70
-
71
- // Déclaration des props
72
- const props = defineProps({
73
- titre: {
74
- type: String,
75
- default: '',
76
- required: false,
77
- },
78
- btnAnnuler: {
79
- type: Boolean,
80
- default: true,
81
- required: false,
82
- },
83
- btnOk: {
84
- type: Boolean,
85
- default: true,
86
- required: false,
87
- },
88
- btnAnnulerTexte: {
89
- type: String,
90
- default: '',
91
- required: false,
92
- },
93
- btnOkDesactiver: {
94
- type: Boolean,
95
- default: false,
96
- required: false,
97
- },
98
- operationEnCours: { type: Boolean, default: false },
99
- persistant: { type: Boolean, default: true },
100
- btnOkTexte: {
101
- type: String,
102
- default: '',
103
- required: false,
104
- },
105
- })
106
-
107
- // Déclaration des événements
108
- const emit = defineEmits(['fermer', 'ok'])
109
-
110
- // Méthodes
111
- const ouvrir = () => {
112
- visible.value = true
113
- }
114
-
115
- const fermer = () => {
116
- visible.value = false
117
- }
118
-
119
- const fermeture = () => {
120
- emit('fermer')
121
- fermer()
122
- }
123
-
124
- const okBouton = () => {
125
- emit('ok')
126
- fermer()
127
- }
128
-
129
- // Calcul des tailles du tiroir en fonction du breakpoint
130
- const grosseurTiroir = computed(() => {
131
- switch (display.name.value) {
132
- case 'xs':
133
- return ''
134
- case 'sm':
135
- return 0.95 * display.width.value
136
- case 'md':
137
- return 0.8 * display.width.value
138
- case 'lg':
139
- return 0.7 * display.width.value
140
- case 'xl':
141
- return 0.6 * display.width.value
142
- case 'xxl':
143
- return 0.5 * display.width.value
144
- default:
145
- return ''
146
- }
147
- })
148
-
149
- defineExpose({ ouvrir, fermer })
150
- </script>
151
-
152
- <style>
153
- .csqc-ligneBleue {
154
- border-left: 30px #095797 solid !important;
155
- }
156
- </style>
1
+ <template>
2
+ <v-navigation-drawer
3
+ v-model="visible"
4
+ location="right"
5
+ temporary
6
+ v-bind="$attrs"
7
+ :width="grosseurTiroir"
8
+ class="pa-0 elevation-2 csqc-ligneBleue"
9
+ :persistent="persistant"
10
+ @keydown.esc="!persistant ? fermeture : ''"
11
+ @click:outside="!persistant ? fermeture : ''"
12
+ >
13
+ <v-card class="pa-0 ma-0 pl-8 pt-8">
14
+ <!-- Bouton en haut à droite -->
15
+ <v-btn
16
+ icon="mdi-close"
17
+ variant="text"
18
+ class="position-absolute couleurHover"
19
+ style="top: 5px; right: 5px"
20
+ @click="fermeture"
21
+ ></v-btn>
22
+
23
+ <v-card-title
24
+ class="pa-0 ma-0 pb-6 text-wrap"
25
+ style="font-size: 24px"
26
+ >
27
+ <slot name="titre"></slot>
28
+ <div text-h5>{{ titre }}</div>
29
+ </v-card-title>
30
+
31
+ <v-card-text class="pa-0 ma-0 pb-6 pr-6">
32
+ <v-container>
33
+ <slot></slot>
34
+ <slot name="content"></slot>
35
+ </v-container>
36
+ </v-card-text>
37
+ <v-card-actions class="my-2 d-flex justify-end pr-6 pb-5">
38
+ <slot name="actions"></slot>
39
+ <v-btn
40
+ v-if="btnAnnuler"
41
+ color="primary"
42
+ variant="text"
43
+ :loading="operationEnCours"
44
+ @click="fermeture"
45
+ >
46
+ {{ props.btnAnnulerTexte ? props.btnAnnulerTexte : $t('csqc.bouton.annuler') }}
47
+ </v-btn>
48
+
49
+ <v-btn
50
+ v-if="btnOk"
51
+ class="Gouttiere"
52
+ color="primary"
53
+ variant="flat"
54
+ :loading="operationEnCours"
55
+ :disabled="btnOkDesactiver || operationEnCours"
56
+ @click="okBouton"
57
+ >
58
+ {{ props.btnOkTexte ? props.btnOkTexte : $t('csqc.bouton.ok') }}
59
+ </v-btn>
60
+ </v-card-actions>
61
+ </v-card>
62
+ </v-navigation-drawer>
63
+ </template>
64
+ <script lang="ts" setup>
65
+ import { ref, computed } from 'vue'
66
+ import { useDisplay } from 'vuetify'
67
+
68
+ const visible = ref(false)
69
+ const display = useDisplay()
70
+
71
+ // Déclaration des props
72
+ const props = defineProps({
73
+ titre: {
74
+ type: String,
75
+ default: '',
76
+ required: false,
77
+ },
78
+ btnAnnuler: {
79
+ type: Boolean,
80
+ default: true,
81
+ required: false,
82
+ },
83
+ btnOk: {
84
+ type: Boolean,
85
+ default: true,
86
+ required: false,
87
+ },
88
+ btnAnnulerTexte: {
89
+ type: String,
90
+ default: '',
91
+ required: false,
92
+ },
93
+ btnOkDesactiver: {
94
+ type: Boolean,
95
+ default: false,
96
+ required: false,
97
+ },
98
+ operationEnCours: { type: Boolean, default: false },
99
+ persistant: { type: Boolean, default: true },
100
+ btnOkTexte: {
101
+ type: String,
102
+ default: '',
103
+ required: false,
104
+ },
105
+ })
106
+
107
+ // Déclaration des événements
108
+ const emit = defineEmits(['fermer', 'ok'])
109
+
110
+ // Méthodes
111
+ const ouvrir = () => {
112
+ visible.value = true
113
+ }
114
+
115
+ const fermer = () => {
116
+ visible.value = false
117
+ }
118
+
119
+ const fermeture = () => {
120
+ emit('fermer')
121
+ fermer()
122
+ }
123
+
124
+ const okBouton = () => {
125
+ emit('ok')
126
+ fermer()
127
+ }
128
+
129
+ // Calcul des tailles du tiroir en fonction du breakpoint
130
+ const grosseurTiroir = computed(() => {
131
+ switch (display.name.value) {
132
+ case 'xs':
133
+ return ''
134
+ case 'sm':
135
+ return 0.95 * display.width.value
136
+ case 'md':
137
+ return 0.8 * display.width.value
138
+ case 'lg':
139
+ return 0.7 * display.width.value
140
+ case 'xl':
141
+ return 0.6 * display.width.value
142
+ case 'xxl':
143
+ return 0.5 * display.width.value
144
+ default:
145
+ return ''
146
+ }
147
+ })
148
+
149
+ defineExpose({ ouvrir, fermer })
150
+ </script>
151
+
152
+ <style>
153
+ .csqc-ligneBleue {
154
+ border-left: 30px #095797 solid !important;
155
+ }
156
+ </style>