🐛 fix: bugs fixed

This commit is contained in:
Paul Valerie GOMA 2025-08-11 16:20:56 +02:00
parent e20626296e
commit 5f5c532d8e

View File

@ -15,7 +15,11 @@ import styles from '@visua/typography.module.css';
const fileUploadRef = ref(); const fileUploadRef = ref();
const fileProgressMap = ref<Record<string, number>>({}); const fileProgressMap = ref<Record<string, number>>({});
const hasActiveError = ref(false); const hasValidationError = ref(false);
const hasSystemError = ref(false);
const systemErrorMessage = ref('');
defineOptions({ defineOptions({
inheritAttrs: false, inheritAttrs: false,
@ -72,7 +76,6 @@ const handleSelect = (event: FileUploadSelectEvent) => {
const handleClear = () => { const handleClear = () => {
emit('clear'); emit('clear');
hasActiveError.value = false;
}; };
const handleUpload = (event: FileUploadUploadEvent) => { const handleUpload = (event: FileUploadUploadEvent) => {
@ -81,7 +84,6 @@ const handleUpload = (event: FileUploadUploadEvent) => {
const handleRemove = (event: FileUploadRemoveEvent) => { const handleRemove = (event: FileUploadRemoveEvent) => {
emit('remove', event); emit('remove', event);
hasActiveError.value =false;
}; };
const handleProgress = (event: FileUploadProgressEvent) => { const handleProgress = (event: FileUploadProgressEvent) => {
@ -95,11 +97,21 @@ const handleProgress = (event: FileUploadProgressEvent) => {
const handleError = (event: FileUploadErrorEvent) => { const handleError = (event: FileUploadErrorEvent) => {
emit('error', event); emit('error', event);
hasActiveError.value = true; hasSystemError.value = true;
const status = event.xhr?.status;
const statusText = event.xhr?.statusText || 'Erreur inconnue';
const fileNames = Array.isArray(event.files)
? event.files.map(f => f.name).join(', ')
: event.files.name;
systemErrorMessage.value = `Echec de téléversement du fichier ${fileNames} {Status : ${status} | Message : <${statusText}>}`;
if (!props.advanced && fileUploadRef.value) { if (!props.advanced && fileUploadRef.value) {
fileUploadRef.value.uploadedFiles = []; fileUploadRef.value.uploadedFiles = [];
} }
} };
const lastSelectedFile = computed(() => { const lastSelectedFile = computed(() => {
const files = fileUploadRef.value?.files || []; const files = fileUploadRef.value?.files || [];
@ -114,10 +126,10 @@ const padding = computed(() => props.advanced ? '1.125rem' : '0rem')
const borderColor = computed(() => props.advanced ? 'var(--border-default-grey)' : 'transparent'); const borderColor = computed(() => props.advanced ? 'var(--border-default-grey)' : 'transparent');
const labelState = computed(() => { const labelState = computed(() => {
if(!hasActiveError.value && !props.disabled) return 'default'; if ((hasValidationError.value || hasSystemError.value) && !props.disabled) return 'error';
else if(hasActiveError.value && !props.disabled) return 'error'; return 'default';
else return undefined });
})
type MessageType = 'alert' | 'warning' | 'success' | 'info'; type MessageType = 'alert' | 'warning' | 'success' | 'info';
@ -222,21 +234,21 @@ const globalStatusMessage = computed<{
title="parcourir les fichiers" title="parcourir les fichiers"
/> />
<span <span
v-if="(!slotProps.files || slotProps.files.length === 0) && (!slotProps.uploadedFiles || slotProps.uploadedFiles.length === 0) && !hasActiveError" v-if="(!slotProps.files || slotProps.files.length === 0) && (!slotProps.uploadedFiles || slotProps.uploadedFiles.length === 0) && !(hasSystemError || hasValidationError)"
:class="[styles['text-body-SM-detail-text-Regular']]" :class="[styles['text-body-SM-detail-text-Regular']]"
> >
Aucun fichier sélectionné Aucun fichier sélectionné
</span> </span>
</div> </div>
</template> </template>
<template #empty v-if="props.advanced && !hasActiveError"> <template #empty v-if="props.advanced && !(hasSystemError || hasValidationError)">
<div class="fileupload-empty" :class="[styles['text-body-SM-detail-text-Regular']]"> <div class="fileupload-empty" :class="[styles['text-body-SM-detail-text-Regular']]">
<i class="ri-upload-cloud-line upload-cloud-icon"></i> <i class="ri-upload-cloud-line upload-cloud-icon"></i>
<p>Glissez-déposez les fichiers ici pour les téléverser.</p> <p>Glissez-déposez les fichiers ici pour les téléverser.</p>
</div> </div>
</template> </template>
<template #content="slotProps"> <template #content="slotProps">
<div v-if="props.advanced && !hasActiveError" style="margin-top: 0.75rem;" class="file-content"> <div v-if="props.advanced && !(hasValidationError || hasSystemError)" style="margin-top: 0.75rem;" class="file-content">
<VMessage <VMessage
v-if="globalStatusMessage" v-if="globalStatusMessage"
:type="globalStatusMessage.type" :type="globalStatusMessage.type"
@ -271,7 +283,7 @@ const globalStatusMessage = computed<{
</div> </div>
</VScrollPanel> </VScrollPanel>
</div> </div>
<div v-if="!props.advanced && !hasActiveError"> <div v-if="!props.advanced && !(hasValidationError || hasSystemError)">
<VFile <VFile
v-if="lastSelectedFile" v-if="lastSelectedFile"
:file="lastSelectedFile" :file="lastSelectedFile"
@ -289,15 +301,18 @@ const globalStatusMessage = computed<{
role="alert" role="alert"
aria-live="polite" aria-live="polite"
> >
<VHint <VHint
v-for="message of slotProps.messages" v-for="message of [...(slotProps.messages ?? []), ...(hasSystemError ? [systemErrorMessage] : [])]"
:key="message" :key="message"
:title="message" :title="message"
type="alert" type="alert"
icon icon
/> />
</div> </div>
<VLabelErrorProxy :hasError="(slotProps.messages ?? []).length > 0" @update:error="hasActiveError = $event" /> <VLabelErrorProxy
:hasError="(slotProps.messages ?? []).length > 0"
@update:error="hasValidationError = $event"
/>
</template> </template>
</FileUpload> </FileUpload>
</div> </div>