Skip to content

Commit e5df283

Browse files
authored
Merge pull request #156 from team-incube/develop
v3.0.2
2 parents 59aff25 + 0bc551c commit e5df283

File tree

8 files changed

+68
-37
lines changed

8 files changed

+68
-37
lines changed

src/feature/evidence/ui/EvidenceForm.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export default function EvidenceForm({
5050
handleSubmit,
5151
watch,
5252
setValue,
53+
getValues,
5354
formState: { errors },
5455
} = useForm<EvidenceFormValues>({
5556
resolver: zodResolver(EvidenceFormSchema),
@@ -119,8 +120,11 @@ export default function EvidenceForm({
119120
setShowDeleteConfirm(true);
120121
};
121122

122-
const handleDeleteConfirm = () => {
123-
handleSubmit((data) => processSubmit(data, 'delete'))();
123+
const handleDeleteConfirm = (e?: React.MouseEvent) => {
124+
e?.preventDefault();
125+
e?.stopPropagation();
126+
const data = getValues();
127+
processSubmit(data, 'delete');
124128
};
125129

126130
return (

src/feature/project-create/ui/ProjectCreateForm.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export default function ProjectCreateForm({
5050
handleSubmit,
5151
watch,
5252
setValue,
53+
getValues,
5354
formState: { errors },
5455
} = useForm<ProjectFormValues>({
5556
resolver: zodResolver(ProjectFormSchema),
@@ -112,8 +113,11 @@ export default function ProjectCreateForm({
112113
setShowDeleteConfirm(true);
113114
};
114115

115-
const handleDeleteConfirm = () => {
116-
handleSubmit((data) => processSubmit(data, 'delete'))();
116+
const handleDeleteConfirm = (e?: React.MouseEvent) => {
117+
e?.preventDefault();
118+
e?.stopPropagation();
119+
const data = getValues();
120+
processSubmit(data, 'delete');
117121
};
118122

119123
return (

src/feature/score/ui/ScoreForm.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,11 @@ export default function ScoreForm({
114114
setShowDeleteConfirm(true);
115115
};
116116

117-
const handleDeleteConfirm = () => {
118-
onSubmit('delete');
117+
const handleDeleteConfirm = (e?: React.MouseEvent) => {
118+
e?.preventDefault();
119+
e?.stopPropagation();
120+
const data = methods.getValues();
121+
processSubmit(data, 'delete');
119122
};
120123

121124
return (
-101 KB
Loading

src/shared/asset/img/yearTable.png

-286 KB
Loading

src/shared/model/useHandlingFileUploader.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,11 @@ export default function useFileUploaderState({
3131
setExistingFiles(normalizedFiles);
3232
}, [uploadedFiles]);
3333

34-
const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
35-
const selectedFiles = e.target.files;
36-
if (!selectedFiles || selectedFiles.length === 0) return;
34+
const handleFiles = (files: File[] | FileList) => {
35+
if (!files || files.length === 0) return;
3736

3837
if (!isMultiple) {
39-
const file = selectedFiles[0];
38+
const file = files[0];
4039

4140
const newExisting: FileType[] = [];
4241
const newLocal = [
@@ -50,7 +49,7 @@ export default function useFileUploaderState({
5049
setNewFiles(newLocal);
5150
onChange?.({ existing: newExisting, new: [file] });
5251
} else {
53-
const fileArray = Array.from(selectedFiles);
52+
const fileArray = Array.from(files);
5453
const validLocalFiles: LocalFile[] = fileArray.map((file) => ({
5554
id: crypto.randomUUID(),
5655
name: file.name,
@@ -62,7 +61,13 @@ export default function useFileUploaderState({
6261
onChange?.({ existing: existingFiles, new: updatedNewFiles.map((f) => f.file) });
6362
}
6463
}
64+
};
6565

66+
const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
67+
const selectedFiles = e.target.files;
68+
if (selectedFiles) {
69+
handleFiles(selectedFiles);
70+
}
6671
e.target.value = '';
6772
};
6873

@@ -112,6 +117,7 @@ export default function useFileUploaderState({
112117
displayFiles,
113118
buttonText,
114119
handleFileChange,
120+
handleFiles,
115121
handleRemoveFile,
116122
};
117123
}

src/shared/ui/ConfirmModal/index.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ interface ConfirmModalProps {
88
message: string;
99
confirmText?: string;
1010
cancelText?: string;
11-
onConfirm: () => void;
12-
onCancel: () => void;
11+
onConfirm: (e?: React.MouseEvent) => void;
12+
onCancel: (e?: React.MouseEvent) => void;
1313
}
1414

1515
export default function ConfirmModal({
@@ -28,10 +28,10 @@ export default function ConfirmModal({
2828
<p className="text-body1 text-gray-700">{message}</p>
2929
</div>
3030
<div className="flex gap-3">
31-
<Button variant="border" onClick={onCancel}>
31+
<Button type="button" variant="border" onClick={onCancel}>
3232
{cancelText}
3333
</Button>
34-
<Button variant="active" onClick={onConfirm}>
34+
<Button type="button" variant="active" onClick={onConfirm}>
3535
{confirmText}
3636
</Button>
3737
</div>

src/shared/ui/FileUploader/index.tsx

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
'use client';
22

3-
import React, { useEffect, useRef } from 'react';
3+
import React, { useEffect, useRef, useState } from 'react';
44

55
import { AllowedExtension, FileType } from '@/entities/file/model/file';
66
import Chain from '@/shared/asset/svg/Chain';
77
import useFileUploaderState from '@/shared/model/useHandlingFileUploader';
88
import FileList from '@/shared/ui/FileList';
99

10-
interface FileUploaderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | "accept"> {
10+
interface FileUploaderProps extends Omit<
11+
React.InputHTMLAttributes<HTMLInputElement>,
12+
'value' | 'onChange' | 'accept'
13+
> {
1114
label: string;
1215
uploadedFiles?: FileType | FileType[];
1316
isMultiple?: boolean;
1417
accept?: AllowedExtension | AllowedExtension[];
15-
onChange?: (files: { existing: FileType[], new: File[] }) => void;
18+
onChange?: (files: { existing: FileType[]; new: File[] }) => void;
1619
}
1720

1821
interface NewFileInputProps {
@@ -30,15 +33,7 @@ const NewFileInput = ({ file }: NewFileInputProps) => {
3033
}
3134
}, [file]);
3235

33-
return (
34-
<input
35-
ref={ref}
36-
type="file"
37-
name="newFiles"
38-
className="hidden"
39-
readOnly
40-
/>
41-
);
36+
return <input ref={ref} type="file" name="newFiles" className="hidden" readOnly />;
4237
};
4338

4439
export default function FileUploader({
@@ -55,9 +50,29 @@ export default function FileUploader({
5550
displayFiles,
5651
buttonText,
5752
handleFileChange,
53+
handleFiles,
5854
handleRemoveFile,
5955
} = useFileUploaderState({ uploadedFiles, isMultiple, onChange });
6056

57+
const [isDragging, setIsDragging] = useState(false);
58+
59+
const onDragOver = (e: React.DragEvent<HTMLDivElement>) => {
60+
e.preventDefault();
61+
setIsDragging(true);
62+
};
63+
64+
const onDragLeave = (e: React.DragEvent<HTMLDivElement>) => {
65+
e.preventDefault();
66+
if (e.relatedTarget instanceof Node && e.currentTarget.contains(e.relatedTarget)) return;
67+
setIsDragging(false);
68+
};
69+
70+
const onDrop = (e: React.DragEvent<HTMLDivElement>) => {
71+
e.preventDefault();
72+
setIsDragging(false);
73+
handleFiles(e.dataTransfer.files);
74+
};
75+
6176
const inputRef = useRef<HTMLInputElement>(null);
6277

6378
const openFileDialog = () => {
@@ -72,16 +87,18 @@ export default function FileUploader({
7287
<div
7388
role="button"
7489
tabIndex={0}
75-
className="focus:ring-main-500 flex cursor-pointer items-center gap-2 rounded-xl border border-gray-300 p-3 hover:border-gray-300 focus:outline-none"
90+
onDragOver={onDragOver}
91+
onDragLeave={onDragLeave}
92+
onDrop={onDrop}
93+
className={`focus:ring-main-500 flex cursor-pointer items-center gap-2 rounded-xl border p-3 focus:outline-none ${
94+
isDragging ? 'border-main-500 bg-blue-50' : 'border-gray-300'
95+
}`}
7696
onClick={openFileDialog}
7797
>
7898
<span className="text-gray-400">
7999
<Chain />
80100
</span>
81-
<span
82-
className="max-w-[220px] truncate text-sm text-gray-400"
83-
title={buttonText}
84-
>
101+
<span className="max-w-[220px] truncate text-sm text-gray-400" title={buttonText}>
85102
{buttonText}
86103
</span>
87104

@@ -113,12 +130,9 @@ export default function FileUploader({
113130
))}
114131

115132
{newFiles.map((localFile) => (
116-
<NewFileInput
117-
key={localFile.id}
118-
file={localFile.file}
119-
/>
133+
<NewFileInput key={localFile.id} file={localFile.file} />
120134
))}
121135
</div>
122136
</div>
123137
);
124-
}
138+
}

0 commit comments

Comments
 (0)