From db5d9b0dae95a3ccb421208c5ed625569fd72608 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Thu, 24 Jul 2025 03:32:49 +0200 Subject: [PATCH 01/26] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20=20FileUpload=20c?= =?UTF-8?q?omponent=20interface=20file=20added?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/file/IVFileUpload.type.ts | 46 ++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/components/file/IVFileUpload.type.ts diff --git a/src/components/file/IVFileUpload.type.ts b/src/components/file/IVFileUpload.type.ts new file mode 100644 index 0000000..c38bc11 --- /dev/null +++ b/src/components/file/IVFileUpload.type.ts @@ -0,0 +1,46 @@ +/** + * Interface representing the properties of a FileUpload component. + */ +export default interface IFile { + /** + * Optional unique identifier for the file input. + */ + id?: string; + + /** + * Optional label displayed above or beside the file input. + */ + label?: string; + + /** + * Specifies the types of files that the input accepts. + * Can be a single MIME type string or an array of MIME types. + * Example: "image/*" or ["image/png", "application/pdf"] + */ + accept?: string | string[]; + + /** + * Optional helper text displayed below the input to guide the user. + */ + hint?: string; + + /** + * Optional error message displayed when validation fails. + */ + error?: string; + + /** + * Optional message displayed when the input is valid. + */ + validMessage?: string; + + /** + * If true, disables the file input. + */ + disabled?: boolean; + + /** + * The current value of the file input, typically a file path or name. + */ + modelValue?: string; +} From 4d07c97c7c09e305d2ef43a179c0b88c59edb595 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Thu, 24 Jul 2025 03:33:30 +0200 Subject: [PATCH 02/26] =?UTF-8?q?=F0=9F=92=84=20Update=20the=20primevue=20?= =?UTF-8?q?configuration=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/style/primevue-configuration.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/style/primevue-configuration.css b/src/assets/style/primevue-configuration.css index a92e270..305d47b 100644 --- a/src/assets/style/primevue-configuration.css +++ b/src/assets/style/primevue-configuration.css @@ -13,3 +13,4 @@ @import './primevue-style/overlay.css'; @import './primevue-style/iconfield.css'; @import './primevue-style/progressbar.css'; +@import './primevue-style/fileupload.css'; From bf13fec2ebba5022e5153dfe642c6b96bfa049a2 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Thu, 24 Jul 2025 03:35:53 +0200 Subject: [PATCH 03/26] =?UTF-8?q?=F0=9F=92=84=20Adding=20the=20style=20of?= =?UTF-8?q?=20the=20primevue=20fileupload=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../style/primevue-style/fileupload.css | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/assets/style/primevue-style/fileupload.css diff --git a/src/assets/style/primevue-style/fileupload.css b/src/assets/style/primevue-style/fileupload.css new file mode 100644 index 0000000..a3dba2a --- /dev/null +++ b/src/assets/style/primevue-style/fileupload.css @@ -0,0 +1,24 @@ +:root { + --p-fileupload-basic-gap: 0.5rem; + --p-fileupload-progressbar-height: 0.25rem; + --p-fileupload-file-list-gap: 0.5rem; + --p-fileupload-file-padding: 1rem; + --p-fileupload-file-gap: 1rem; + --p-fileupload-file-border-color: var(--border-default-grey); + --p-fileupload-file-info-gap: 0.5rem; + --p-fileupload-content-highlight-border-color: var(--p-primary-color); + --p-fileupload-content-padding: 0rem; + --p-fileupload-content-gap: 1rem; + --p-fileupload-header-background: transparent; + --p-fileupload-header-color: var(--text-default-grey); + --p-fileupload-header-padding: 0rem; + --p-fileupload-header-border-color: unset; + --p-fileupload-header-border-width: 0; + --p-fileupload-header-border-radius: 0; + --p-fileupload-header-gap: 0.5rem; + --p-fileupload-background: var(--background-transparent); + --p-fileupload-border-color: var(--border-default-grey); + --p-fileupload-color: var(--text-default-grey); + --p-fileupload-border-radius: 0px; + --p-fileupload-transition-duration: var(--transition-duration); +} From abae860b58582d35c4237a8b9dc57f4af49bd988 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Thu, 24 Jul 2025 03:48:59 +0200 Subject: [PATCH 04/26] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20=20FileUpload=20c?= =?UTF-8?q?omponent=20interface=20file=20updated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/file/IVFileUpload.type.ts | 154 ++++++++++++++++++++++- 1 file changed, 153 insertions(+), 1 deletion(-) diff --git a/src/components/file/IVFileUpload.type.ts b/src/components/file/IVFileUpload.type.ts index c38bc11..707f95c 100644 --- a/src/components/file/IVFileUpload.type.ts +++ b/src/components/file/IVFileUpload.type.ts @@ -1,7 +1,9 @@ +import type { HintedString } from '@primevue/core'; + /** * Interface representing the properties of a FileUpload component. */ -export default interface IFile { +export interface IFile { /** * Optional unique identifier for the file input. */ @@ -44,3 +46,153 @@ export default interface IFile { */ modelValue?: string; } + +export interface FileUploadProps { + /** + * Name of the request parameter to identify the files at backend. + */ + name?: string | undefined; + /** + * Remote url to upload the files. + */ + url?: string | undefined; + /** + * Defines the UI of the component, possible values are 'advanced' and 'basic'. + * @defaultValue advanced + */ + mode?: HintedString<'advanced' | 'basic'> | undefined; + /** + * Used to select multiple files at once from file dialog. + * @defaultValue false + */ + multiple?: boolean | undefined; + /** + * Pattern to restrict the allowed file types such as 'image/*'. + */ + accept?: string | undefined; + /** + * Disables the upload functionality. + * @defaultValue false + */ + disabled?: boolean | undefined; + /** + * When enabled, upload begins automatically after selection is completed. + * @defaultValue false + */ + auto?: boolean | undefined; + /** + * Maximum file size allowed in bytes. + */ + maxFileSize?: number | undefined; + /** + * Message of the invalid fize size. + * @defaultValue {0}: Invalid file size, file size should be smaller than {1.} + */ + invalidFileSizeMessage?: string | undefined; + /** + * Message to display when number of files to be uploaded exceeeds the limit. + * @defaultValue Maximum number of files to be uploaded is {0.} + */ + invalidFileLimitMessage?: string | undefined; + /** + * Message of the invalid fize type. + * @defaultValue '{0}: Invalid file type.' + */ + invalidFileTypeMessage?: string | undefined; + /** + * Maximum number of files that can be uploaded. + */ + fileLimit?: number | undefined; + /** + * Cross-site Access-Control requests should be made using credentials such as cookies, authorization headers or TLS client certificates. + * @defaultValue false + */ + withCredentials?: boolean | undefined; + /** + * Width of the image thumbnail in pixels. + * @defaultValue 50 + */ + previewWidth?: number | undefined; + /** + * Label of the choose button. Defaults to PrimeVue Locale configuration. + */ + chooseLabel?: string | undefined; + /** + * Label of the upload button. Defaults to PrimeVue Locale configuration. + */ + uploadLabel?: string | undefined; + /** + * Label of the cancel button. Defaults to PrimeVue Locale configuration. + * @defaultValue Cancel + */ + cancelLabel?: string | undefined; + /** + * Whether to use the default upload or a manual implementation defined in uploadHandler callback. Defaults to PrimeVue Locale configuration. + */ + customUpload?: boolean | undefined; + /** + * Whether to show the upload button. + * @defaultValue true + */ + showUploadButton?: boolean | undefined; + /** + * Whether to show the cancel button. + * @defaultValue true + */ + showCancelButton?: boolean | undefined; + /** + * Icon of the choose button. + */ + chooseIcon?: string | undefined; + /** + * Icon of the upload button. + */ + uploadIcon?: string | undefined; + /** + * Icon of the cancel button. + */ + cancelIcon?: string | undefined; + /** + * Inline style of the component. + */ + style?: unknown; + /** + * Style class of the component. + */ + class?: unknown; + /** + * Used to pass all properties of the ButtonProps to the choose button inside the component. + * @type {ButtonProps} + * @defaultValue null + */ + chooseButtonProps?: object | undefined; + /** + * Used to pass all properties of the ButtonProps to the upload button inside the component. + * @type {ButtonProps} + * @defaultValue { severity: 'secondary' } + */ + uploadButtonProps?: object | undefined; + /** + * Used to pass all properties of the ButtonProps to the cancel button inside the component. + * @type {ButtonProps} + * @defaultValue { severity: 'secondary' } + */ + cancelButtonProps?: object | undefined; +} + +/** + * Extended interface for a customizable FileUpload component. + * + * Combines selected properties from IFile and FileUploadProps, + * while omitting and overriding specific ones for more control. + */ +export default interface IVFileUpload extends + Partial>, + Partial> { + + /** + * If true, enables the advanced mode of the file upload component, + * which may include features like drag-and-drop, file previews, etc. + */ + advanced?: boolean; +} From 16f0617df26cc7dd96923b2eb44c06b7172c7e07 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Thu, 24 Jul 2025 19:20:37 +0200 Subject: [PATCH 05/26] =?UTF-8?q?=E2=9C=A8=20File=20component=20added?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/file/VFile.vue | 213 ++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 src/components/file/VFile.vue diff --git a/src/components/file/VFile.vue b/src/components/file/VFile.vue new file mode 100644 index 0000000..c0cd0a3 --- /dev/null +++ b/src/components/file/VFile.vue @@ -0,0 +1,213 @@ + + + + + From 1acd65a704a02c30fa9b6280768d5b22054e7961 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Thu, 24 Jul 2025 19:21:25 +0200 Subject: [PATCH 06/26] =?UTF-8?q?=E2=9C=A8=20File=20upload=20component=20a?= =?UTF-8?q?dded?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/file/VFileUpload.vue | 371 ++++++++++++++++++++++++++++ 1 file changed, 371 insertions(+) create mode 100644 src/components/file/VFileUpload.vue diff --git a/src/components/file/VFileUpload.vue b/src/components/file/VFileUpload.vue new file mode 100644 index 0000000..9f47ec5 --- /dev/null +++ b/src/components/file/VFileUpload.vue @@ -0,0 +1,371 @@ + + + + + From ea2a8a9bd170f37af6acdeff34e30fab5e2cddc1 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Thu, 24 Jul 2025 19:22:03 +0200 Subject: [PATCH 07/26] Display some file upload components --- src/App.vue | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/App.vue b/src/App.vue index 61efa4d..1f2a29d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -5,10 +5,11 @@ // import VAccordionView from '../template/VAccordionView.vue'; // import VInputView from '../template/VInputView.vue'; // import VCheckboxView from '../template/VCheckboxView.vue'; -import VBadgeView from '../template/VBadgeView.vue'; -import VSelectView from '../template/VSelectView.vue'; +// import VBadgeView from '../template/VBadgeView.vue'; +// import VSelectView from '../template/VSelectView.vue'; // import VProgressBarView from '../template/VProgressBarView.vue'; -import VMessageView from '../template/VMessageView.vue'; +// import VMessageView from '../template/VMessageView.vue'; +import VFileUploadView from '../template/VFileUploadView.vue' @@ -19,8 +20,9 @@ import VMessageView from '../template/VMessageView.vue'; - - + - + + From d72f0b67d23975f29cee88a6e8c9a58d1b436da3 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Fri, 25 Jul 2025 11:19:21 +0200 Subject: [PATCH 08/26] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20=20FileUpload=20c?= =?UTF-8?q?omponent=20interface=20file=20updated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/file/IVFileUpload.type.ts | 27 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/components/file/IVFileUpload.type.ts b/src/components/file/IVFileUpload.type.ts index 707f95c..e77f0a9 100644 --- a/src/components/file/IVFileUpload.type.ts +++ b/src/components/file/IVFileUpload.type.ts @@ -181,18 +181,27 @@ export interface FileUploadProps { } /** - * Extended interface for a customizable FileUpload component. + * Extended interface for the customizable VFileUpload component. * - * Combines selected properties from IFile and FileUploadProps, - * while omitting and overriding specific ones for more control. + * This interface merges selected properties from: + * - `IFile`: your internal file-related interface + * - `FileUploadProps`: the native PrimeVue component props + * + * It omits and overrides specific properties to provide better control + * over the component's behavior and to avoid conflicts with internal logic. */ -export default interface IVFileUpload extends - Partial>, - Partial> { +export default interface IVFileUpload + extends Partial>, // Exclude 'accept' and 'error' from IFile + Partial> // Exclude 'auto', 'mode', and 'multiple' from PrimeVue +{ /** - * If true, enables the advanced mode of the file upload component, - * which may include features like drag-and-drop, file previews, etc. + * Defines the display mode of the file upload component. + * - 'advanced': enables a rich interface with manual control over upload actions + * - 'simple': enables a minimal interface with automatic upload behavior + * + * This property is used internally to determine layout, behavior, and slot rendering. */ - advanced?: boolean; + option?: 'advanced' | 'simple'; } + From 0d925df378dd14e31adfa3b9ed938a1abf7be07a Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Fri, 25 Jul 2025 18:29:22 +0200 Subject: [PATCH 09/26] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20=20FileUpload=20c?= =?UTF-8?q?omponent=20interface=20file=20updated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/file/IVFileUpload.type.ts | 27 ++++++++---------------- 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/components/file/IVFileUpload.type.ts b/src/components/file/IVFileUpload.type.ts index e77f0a9..707f95c 100644 --- a/src/components/file/IVFileUpload.type.ts +++ b/src/components/file/IVFileUpload.type.ts @@ -181,27 +181,18 @@ export interface FileUploadProps { } /** - * Extended interface for the customizable VFileUpload component. + * Extended interface for a customizable FileUpload component. * - * This interface merges selected properties from: - * - `IFile`: your internal file-related interface - * - `FileUploadProps`: the native PrimeVue component props - * - * It omits and overrides specific properties to provide better control - * over the component's behavior and to avoid conflicts with internal logic. + * Combines selected properties from IFile and FileUploadProps, + * while omitting and overriding specific ones for more control. */ -export default interface IVFileUpload - extends Partial>, // Exclude 'accept' and 'error' from IFile - Partial> // Exclude 'auto', 'mode', and 'multiple' from PrimeVue +export default interface IVFileUpload extends + Partial>, + Partial> { -{ /** - * Defines the display mode of the file upload component. - * - 'advanced': enables a rich interface with manual control over upload actions - * - 'simple': enables a minimal interface with automatic upload behavior - * - * This property is used internally to determine layout, behavior, and slot rendering. + * If true, enables the advanced mode of the file upload component, + * which may include features like drag-and-drop, file previews, etc. */ - option?: 'advanced' | 'simple'; + advanced?: boolean; } - From fc64beda13b50f4cd76fd75158bdb853193ac396 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Fri, 25 Jul 2025 18:30:52 +0200 Subject: [PATCH 10/26] =?UTF-8?q?=F0=9F=90=9B=20fix:=20File=20upload=20com?= =?UTF-8?q?ponent=20updated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/file/VFileUpload.vue | 231 +++++++++++++--------------- 1 file changed, 104 insertions(+), 127 deletions(-) diff --git a/src/components/file/VFileUpload.vue b/src/components/file/VFileUpload.vue index 9f47ec5..64dad30 100644 --- a/src/components/file/VFileUpload.vue +++ b/src/components/file/VFileUpload.vue @@ -11,17 +11,16 @@ import type { FileUploadErrorEvent, FileUploadProgressEvent, FileUploadRemoveEve import { computed, useId, ref, onMounted } from 'vue'; import styles from '@visua/typography.module.css'; +const fileUploadRef = ref(); +const fileProgressMap = ref>({}); +const fileSelected = ref(false); +const hasActiveError = ref(false); +const lastSelectedFile = ref(null); + defineOptions({ inheritAttrs: false, }) -const fileUploadRef = ref(); -const fileProgressMap = ref>({}); - -defineExpose({ - upload: () => fileUploadRef.value.upload() -}); - const props = withDefaults(defineProps(), { id: () => useId(), label: 'Ajouter un fichier', @@ -43,7 +42,7 @@ const props = withDefaults(defineProps(), { cancelLabel: 'Annuler', showCancelButton: true, showUploadButton: true, - advanced: false, + advanced: false }) const emit = defineEmits([ @@ -58,22 +57,21 @@ const emit = defineEmits([ 'removeUploadFile', 'uploader', ]); -const fileSelected = ref(false); -const hasActiveError = ref(false); -const lastSelectedFile = ref(null); +defineExpose({ + upload: () => fileUploadRef.value.upload() +}); const handleSelect = (event: FileUploadSelectEvent) => { emit('select', event); - if (!props.advanced && event.files.length > 0 && fileUploadRef.value) { - fileUploadRef.value.clear(); - fileUploadRef.value.files.push(event.files[event.files.length - 1]); + fileUploadRef.value.files = [event.files.at(-1)]; + lastSelectedFile.value = event.files.at(-1); + } fileSelected.value = true; }; - const handleClear = () => { emit('clear'); fileSelected.value = false; @@ -82,13 +80,9 @@ const handleClear = () => { }; const handleUpload = (event: FileUploadUploadEvent) => { - totalSize.value = 0; - totalSizePercent.value = 100; emit('upload', event); - hasActiveError.value = false; }; - const handleRemove = (event: FileUploadRemoveEvent) => { emit('remove', event); fileSelected.value = false; @@ -110,34 +104,19 @@ const handleError = (event: FileUploadErrorEvent) => { hasActiveError.value = true; } -const error = computed(() => hasActiveError.value); - - -const isSimpleAndEmpty = computed(() => { - return !props.advanced && !fileSelected.value; -}); +const uploadEvent = (callback: () => void) => { + callback(); +}; onMounted(() => { const currentFiles = fileUploadRef.value?.files || []; fileSelected.value = currentFiles.length > 0; }); -const totalSize = ref(0); -const totalSizePercent = ref(0); - -const uploadEvent = (callback: () => void) => { - totalSizePercent.value = totalSize.value / 10; - callback(); - fileUploadRef.value.upload(); -}; - const padding = computed(() => props.advanced ? '1.125rem' : '0rem') const borderColor = computed(() => props.advanced ? 'var(--border-default-grey)' : 'transparent'); -const getLastFileSelected = (files: File[]) => { - const indexOfLastFileSelected = files.length - 1; - return files[indexOfLastFileSelected]; -} +const error = computed(() => hasActiveError.value); const labelState = computed(() => { if(!error.value && !props.disabled) return 'default'; @@ -163,7 +142,6 @@ const globalStatusMessage = computed<{ return null; }); - @@ -180,6 +188,11 @@ img{ height: auto; } +.button{ + display: flex; + align-self: self-end; +} + .advanced-file{ border-radius: 3px; width: fit-content; @@ -187,6 +200,7 @@ img{ flex-direction: column; justify-content: space-between; align-items: center; + padding-bottom: 0.25rem; } .simple-file{ @@ -197,10 +211,12 @@ img{ } .file-name{ - max-width: 7.5rem; + width: 6rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + margin: 0rem 0.5rem; + text-align: center; } .file-info{ From bcc2e33d0d584be4f69dd182ad95baadb554fcd1 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Sat, 26 Jul 2025 12:49:43 +0200 Subject: [PATCH 12/26] =?UTF-8?q?=F0=9F=92=84=20Adding=20the=20style=20of?= =?UTF-8?q?=20the=20primevue=20scrollpanel=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/style/primevue-style/scrollpanel.css | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/assets/style/primevue-style/scrollpanel.css diff --git a/src/assets/style/primevue-style/scrollpanel.css b/src/assets/style/primevue-style/scrollpanel.css new file mode 100644 index 0000000..aa06f8c --- /dev/null +++ b/src/assets/style/primevue-style/scrollpanel.css @@ -0,0 +1,11 @@ +:root { + --p-scrollpanel-bar-size: 0.5rem; + --p-scrollpanel-bar-border-radius: 0.25rem; + --p-scrollpanel-bar-focus-ring-width: var(--focus-width); + --p-scrollpanel-bar-focus-ring-style: var(--focus-style); + --p-scrollpanel-bar-focus-ring-color: var(--focus-color); + --p-scrollpanel-bar-focus-ring-offset: var(--focus-offset); + --p-scrollpanel-bar-focus-ring-shadow: none; + --p-scrollpanel-transition-duration: var(--transition-duration); + --p-scrollpanel-bar-background: var(--background-overlay-grey); +} From e9247149fef83ca4629749b39a75ab60d69d1a88 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Sat, 26 Jul 2025 12:50:08 +0200 Subject: [PATCH 13/26] =?UTF-8?q?=F0=9F=92=84=20Update=20the=20primevue=20?= =?UTF-8?q?configuration=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/style/primevue-configuration.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/style/primevue-configuration.css b/src/assets/style/primevue-configuration.css index 305d47b..8120b3b 100644 --- a/src/assets/style/primevue-configuration.css +++ b/src/assets/style/primevue-configuration.css @@ -14,3 +14,4 @@ @import './primevue-style/iconfield.css'; @import './primevue-style/progressbar.css'; @import './primevue-style/fileupload.css'; +@import './primevue-style/scrollpanel.css'; From 2c6c693ceb4c77253d9edd8a07abcdaba12204c7 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Sat, 26 Jul 2025 12:54:39 +0200 Subject: [PATCH 14/26] =?UTF-8?q?=E2=9C=A8=20feature:=20Scroll=20panel=20c?= =?UTF-8?q?omponent=20added?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/scrollpanel/VScrollpanel.vue | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/components/scrollpanel/VScrollpanel.vue diff --git a/src/components/scrollpanel/VScrollpanel.vue b/src/components/scrollpanel/VScrollpanel.vue new file mode 100644 index 0000000..8f9caf5 --- /dev/null +++ b/src/components/scrollpanel/VScrollpanel.vue @@ -0,0 +1,16 @@ + + + From 6f1a6b930c1ce03d0da939b9dd8cd3ec57f92889 Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Sat, 26 Jul 2025 14:19:48 +0200 Subject: [PATCH 15/26] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=20refactor:=20Scrol?= =?UTF-8?q?l=20panel=20component=20updated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/scrollpanel/VScrollpanel.vue | 23 +++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/components/scrollpanel/VScrollpanel.vue b/src/components/scrollpanel/VScrollpanel.vue index 8f9caf5..49e6b9c 100644 --- a/src/components/scrollpanel/VScrollpanel.vue +++ b/src/components/scrollpanel/VScrollpanel.vue @@ -1,5 +1,5 @@ + + From 0ca59dbc5963f2663ae7d42c9041c7c44b112f4d Mon Sep 17 00:00:00 2001 From: Paul Valerie GOMA Date: Sat, 26 Jul 2025 14:20:47 +0200 Subject: [PATCH 16/26] =?UTF-8?q?=F0=9F=90=9B=20fix:=20File=20upload=20com?= =?UTF-8?q?ponent=20updated?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/file/VFileUpload.vue | 67 +++++++++++++++++------------ 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/src/components/file/VFileUpload.vue b/src/components/file/VFileUpload.vue index 64dad30..31f596c 100644 --- a/src/components/file/VFileUpload.vue +++ b/src/components/file/VFileUpload.vue @@ -6,6 +6,7 @@ import VButton from '../button/VButton.vue'; import VButtonGroup from '../button/VButtonGroup.vue'; import VFile from './VFile.vue'; import VMessage from '../message/VMessage.vue'; +import VScrollpanel from '../scrollpanel/VScrollpanel.vue'; import type IVFileUpload from './IVFileUpload.type'; import type { FileUploadErrorEvent, FileUploadProgressEvent, FileUploadRemoveEvent, FileUploadSelectEvent, FileUploadUploadEvent } from 'primevue/fileupload'; import { computed, useId, ref, onMounted } from 'vue'; @@ -67,7 +68,6 @@ const handleSelect = (event: FileUploadSelectEvent) => { if (!props.advanced && event.files.length > 0 && fileUploadRef.value) { fileUploadRef.value.files = [event.files.at(-1)]; lastSelectedFile.value = event.files.at(-1); - } fileSelected.value = true; }; @@ -241,36 +241,40 @@ const globalStatusMessage = computed<{ -