Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix filing details #54

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions apps/api/src/aws/aws.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,13 @@ export class AwsService {
constructor() {}

async uploadFileToS3(fileName: string, file: Buffer, folderName?: string) {
const MAX_UPLOAD_SIZE = 1024 * 1024 * 10; // 10MB
const currentDate = new Date();
const dateWithTimestamp = currentDate.toISOString();
const fileType = '.' + fileName.split('.').pop();

if (file.byteLength > MAX_UPLOAD_SIZE) throw new Error('ไฟล์ใหญ่เกิน 10MB');

// '{2024-09-05T16:19:34.142Z}-' has 27 characters
const truncatedFileName = truncateTextByBytes(
fileName.slice(0, -fileType.length),
Expand Down
7 changes: 5 additions & 2 deletions apps/api/src/user-filing/user-filing.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export class UserFilingService {
return userFilings;
}

async userOpenFiling(userId: string, filingId: string): Promise<UserFiling> {
async userOpenFiling(userId: string, filingId: string) {
if (!isUUID(userId) || !isUUID(filingId)) {
throw new BadRequestException('Id is not in UUID format');
}
Expand All @@ -58,6 +58,9 @@ export class UserFilingService {
lastOpen: new Date(),
};

return await this.userFilingRepository.save(preparedUserFiling);
return await this.userFilingRepository.upsert(preparedUserFiling, {
conflictPaths: ['user', 'filing'],
skipUpdateIfNoValuesChanged: true,
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import updateFilingName from '@/src/service/filing/updateFiling';
import { isUUID } from '@/src/lib/utils';
import getUsersMap from '@/src/service/user/getUsersMap';
import { getUserId } from '@/src/service/auth';
import userOpenFiling from '@/src/service/user-filing/userOpenFiling';

export default function Page({
params,
Expand Down Expand Up @@ -62,11 +63,13 @@ export default function Page({
if (filingData) setFiling(filingData);
if (latestDocumentData) setLatestDocument(latestDocumentData);

if (documentsData.length === 0) return;
setDocuments(documentsData);

const updatedUsernameMap = await getUsersMap(documentsData, userId);
const [updatedUsernameMap] = await Promise.all([
getUsersMap(documentsData, userId),
userOpenFiling(userId, params.filingId),
]);
setUsernameMap(updatedUsernameMap);

if (documentsData.length > 0) setDocuments(documentsData);
} catch (err) {
if (err instanceof Error) {
toast({
Expand Down
11 changes: 7 additions & 4 deletions apps/web/src/app/admin/project/[projectId]/[filingId]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import updateFilingName from '@/src/service/filing/updateFiling';
import { isUUID } from '@/src/lib/utils';
import { getUserId } from '@/src/service/auth';
import getUsersMap from '@/src/service/user/getUsersMap';
import userOpenFiling from '@/src/service/user-filing/userOpenFiling';

export default function Page({
params,
Expand Down Expand Up @@ -62,11 +63,13 @@ export default function Page({
if (filingData) setFiling(filingData);
if (latestDocumentData) setLatestDocument(latestDocumentData);

if (documentsData.length === 0) return;
setDocuments(documentsData);

const updatedUsernameMap = await getUsersMap(documentsData, userId);
const [updatedUsernameMap] = await Promise.all([
getUsersMap(documentsData, userId),
userOpenFiling(userId, params.filingId),
]);
setUsernameMap(updatedUsernameMap);

if (documentsData.length > 0) setDocuments(documentsData);
} catch (err) {
if (err instanceof Error) {
toast({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,10 @@ import ButtonPanel from './buttonPanel';
import FileInputPanel from './fileInputPanel';
import ActivityPanel from './activityPanel';
import { DocumentType } from '@/src/interface/document';
import createDocument from '@/src/service/document/createDocument';
import { DocumentActivity, FilingStatus } from '@/src/constant/enum';
import { getFileType } from '@/src/lib/utils';
import updateFilingName from '@/src/service/filing/updateFiling';
import { FilingStatus } from '@/src/constant/enum';
import { toast } from '../../ui/use-toast';
import uploadFileToS3 from '@/src/service/aws/uploadFileToS3';
import { zodDocumentFiles } from '@/src/constant/schema';
import { createdFormSchema } from '@/src/constant/schema';
import submitCreatedFormSchema from '@/src/lib/submitCreatedFormSchema';

export default function CreateDocumentClient({
setShowCreateDocument,
Expand All @@ -39,14 +36,6 @@ export default function CreateDocumentClient({
projectId: string;
status: FilingStatus;
}) {
const createdFormSchema = z.object({
// Server side ไม่รู้จัก FileList ***
file: zodDocumentFiles,
activity: z.nativeEnum(DocumentActivity, { message: 'กรุณากรอกกิจกรรม' }),
detail: z.string().min(1, { message: 'กรุณากรอกรายละเอียด' }),
note: z.string().optional(),
});

const form = useForm<z.infer<typeof createdFormSchema>>({
resolver: zodResolver(createdFormSchema),
defaultValues: {
Expand All @@ -59,44 +48,14 @@ export default function CreateDocumentClient({
async function onSubmit(values: z.infer<typeof createdFormSchema>) {
// TODO: change to actual userId
try {
const swap = getFileType(values.file[0]) !== 'pdf';
const pdfFile = values.file[swap ? 1 : 0];
const docFile = values.file[swap ? 0 : 1];
const folderName = `${projectId}/${filingId}`;

const [pdfName, docName] = await Promise.all([
uploadFileToS3({
file: pdfFile,
folderName,
}),
docFile &&
uploadFileToS3({
file: docFile,
folderName,
}),
]);

if (!pdfName || (docFile && !docName))
throw new Error('Upload file failed');
const newDocument = await submitCreatedFormSchema(
values,
projectId,
filingId,
'd1c0d106-1a4a-4729-9033-1b2b2d52e98a',
status,
);

const [newDocument, _] = await Promise.all([
createDocument({
document: {
name: values.detail,
filingId,
pdfName: pdfName,
docName: docName ?? '',
activity: values.activity as DocumentActivity,
userId: 'd1c0d106-1a4a-4729-9033-1b2b2d52e98a',
detail: values.note,
},
}),
status === FilingStatus.DRAFT &&
updateFilingName({
filingId,
filingStatus: FilingStatus.DOCUMENT_CREATED,
}),
]);
afterCreateDocument(newDocument);
toast({
title: 'สร้างเอกสารสำเร็จ',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,11 @@ import { Select } from '../../ui/select';
import ButtonPanel from './buttonPanel';
import FileInputPanel from './fileInputPanel';
import ActivityPanel from './activityPanel';
import { getFileType } from '@/src/lib/utils';
import { DocumentType } from '@/src/interface/document';
import { DocumentActivity } from '@/src/constant/enum';
import { toast } from '../../ui/use-toast';
import uploadFileToS3 from '@/src/service/aws/uploadFileToS3';
import createDocument from '@/src/service/document/createDocument';
import { zodDocumentFiles } from '@/src/constant/schema';
import { createdFormSchema } from '@/src/constant/schema';
import submitCreatedFormSchema from '@/src/lib/submitCreatedFormSchema';

export default function UpdateDocumentAdmin({
setShowCreateDocument,
Expand All @@ -36,14 +34,6 @@ export default function UpdateDocumentAdmin({
filingId: string;
projectId: string;
}) {
const createdFormSchema = z.object({
file: zodDocumentFiles,
activity: z.nativeEnum(DocumentActivity, { message: 'กรุณากรอกกิจกรรม' }),
detail: z.string().min(1, { message: 'กรุณากรอกรายละเอียด' }),
note: z.string().optional(),
comment: z.string().optional(),
});

const form = useForm<z.infer<typeof createdFormSchema>>({
resolver: zodResolver(createdFormSchema),
defaultValues: {
Expand All @@ -57,38 +47,13 @@ export default function UpdateDocumentAdmin({
async function onSubmit(values: z.infer<typeof createdFormSchema>) {
// TODO: change to actual userId
try {
const swap = getFileType(values.file[0]) !== 'pdf';
const pdfFile = values.file[swap ? 1 : 0];
const docFile = values.file[swap ? 0 : 1];
const folderName = `${projectId}/${filingId}`;

const [pdfName, docName] = await Promise.all([
uploadFileToS3({
file: pdfFile,
folderName,
}),
docFile &&
uploadFileToS3({
file: docFile,
folderName,
}),
]);
const newDocument = await submitCreatedFormSchema(
values,
projectId,
filingId,
'd1c0d106-1a4a-4729-9033-1b2b2d52e98a',
);

if (!pdfName || (docFile && !docName))
throw new Error('Upload file failed');

const newDocument = await createDocument({
document: {
name: values.detail,
filingId,
pdfName: pdfName,
docName: docName ?? '',
activity: values.activity as DocumentActivity,
userId: 'd1c0d106-1a4a-4729-9033-1b2b2d52e98a',
detail: values.note,
comment: values.comment,
},
});
afterCreateDocument(newDocument);
toast({
title: 'แก้ไขเอกสารสำเร็จ',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,77 +36,75 @@ export default function DisplayWithNoteAndStatus({
const [isOpen, setIsOpen] = useState(false);

return (
<div className="w-full relative">
<Collapsible className="bg-gray-100 rounded-lg font-sukhumvit text-xl w-full">
<div className="flex flex-row px-8">
<NameDate
title={user?.username ?? 'Secretary ESC'}
date={'ส่งเอกสารเมื่อ ' + convertDate(document.createdAt)}
activity={TextDocumentActivity[document.activity]}
>
<CircleUserRound size={30} className="shrink-0" />
</NameDate>
<div className="px-8 py-4 font-bold space-y-4 w-[35vw] grow">
<div className="font-bold text-sm">ความคิดเห็น</div>
<TextareaForDisplay value={document.comment} />
</div>
<div className="py-8 flex flex-col justify-between w-auto items-end space-y-5">
{handleDeleteDocument ? (
<DraftDocumentPopover
isOpen={isOpen}
setIsOpen={setIsOpen}
handleDeleteButton={() => {
handleDeleteDocument(document.id);
}}
/>
) : (
<StatusButton
status={document.status}
showReplyButton={showReplyButton}
setShowCreateDocument={setShowCreateDocument}
/>
)}
<CollapsibleTrigger
onClick={() => {
setExpanded(!expanded);
<Collapsible className="bg-gray-100 rounded-lg font-sukhumvit text-xl w-full">
<div className="flex flex-row px-8">
<NameDate
title={user?.username ?? 'Secretary ESC'}
date={`ส่งเอกสารเมื่อ ${convertDate(document.createdAt)}`}
activity={TextDocumentActivity[document.activity]}
>
<CircleUserRound size={30} className="shrink-0" />
</NameDate>
<div className="px-8 py-4 font-bold space-y-4 w-[35vw] grow">
<div className="font-bold text-sm">ความคิดเห็น</div>
<TextareaForDisplay value={document.comment} />
</div>
<div className="py-8 flex flex-col justify-between w-auto items-end space-y-5">
{handleDeleteDocument ? (
<DraftDocumentPopover
isOpen={isOpen}
setIsOpen={setIsOpen}
handleDeleteButton={() => {
handleDeleteDocument(document.id);
}}
>
{expanded ? <ChevronUp /> : <ChevronDown />}
</CollapsibleTrigger>
</div>
/>
) : (
<StatusButton
status={document.status}
showReplyButton={showReplyButton}
setShowCreateDocument={setShowCreateDocument}
/>
)}
<CollapsibleTrigger
onClick={() => {
setExpanded(!expanded);
}}
>
{expanded ? <ChevronUp /> : <ChevronDown />}
</CollapsibleTrigger>
</div>
<CollapsibleContent>
<div className="border-t-2 px-8 py-4 font-bold text-sm flex flex-col space-y-4 ">
<div>
<span className="font-bold">รายละเอียดเอกสาร: </span>
<span className="font-normal">{document.name}</span>
</div>
<CollapsibleContent>
<div className="border-t-2 px-8 py-4 font-bold text-sm flex flex-col space-y-4 ">
<div>
<span className="font-bold">รายละเอียดเอกสาร: </span>
<span className="font-normal">{document.name}</span>
</div>
<div className="flex flex-row">
<div className="space-y-2 w-[40vw]">
<div>หมายเหตุ</div>
<TextareaForDisplay value={document.detail} />
</div>
<div className="flex flex-row">
<div className="space-y-2">
<div>หมายเหตุ</div>
<TextareaForDisplay value={document.detail} />
</div>
<div className="pl-5">
<div>ไฟล์แนบ</div>
<div className="flex flex-col gap-6 pt-2">
<div className="pl-5">
<div>ไฟล์แนบ</div>
<div className="flex flex-col gap-6 pt-2">
<FileDisplay
fileName={document.pdfName}
fileType="pdf"
folderName={folderName}
/>
{document.docName !== '' && document.docName !== '-' && (
<FileDisplay
fileName={document.pdfName}
fileType="pdf"
fileName={document.docName}
fileType="doc"
folderName={folderName}
/>
{document.docName !== '' && document.docName !== '-' && (
<FileDisplay
fileName={document.docName}
fileType="doc"
folderName={folderName}
/>
)}
</div>
)}
</div>
</div>
</div>
</CollapsibleContent>
</Collapsible>
</div>
</div>
</CollapsibleContent>
</Collapsible>
);
}
Loading