refactor(FE-435,436): Use S3 public base URL for document links

This commit is contained in:
rstubryan
2025-12-30 20:52:12 +07:00
parent 13c1a82142
commit c291ba3246
5 changed files with 74 additions and 47 deletions
@@ -16,7 +16,7 @@ import {
} from '@/components/pages/expense/form/ExpenseRequestForm.schema'; } from '@/components/pages/expense/form/ExpenseRequestForm.schema';
import { ExpenseApi } from '@/services/api/expense'; import { ExpenseApi } from '@/services/api/expense';
import { isResponseSuccess } from '@/lib/api-helper'; import { isResponseSuccess } from '@/lib/api-helper';
import { ACCEPTED_FILE_TYPE } from '@/config/constant'; import { ACCEPTED_FILE_TYPE, S3_PUBLIC_BASE_URL } from '@/config/constant';
interface ExpenseRealizationContentProps { interface ExpenseRealizationContentProps {
initialValues?: Expense; initialValues?: Expense;
@@ -103,24 +103,32 @@ const ExpenseRealizationContent = ({
initialValues?.realization_docs.length > 0 && ( initialValues?.realization_docs.length > 0 && (
<ul className='list-disc'> <ul className='list-disc'>
{initialValues?.realization_docs.map( {initialValues?.realization_docs.map(
(realizationDocument, realizationDocumentIdx) => ( (realizationDocument, realizationDocumentIdx) => {
<li key={realizationDocumentIdx}> const path = realizationDocument.path.startsWith(
<Link '/'
href={realizationDocument.path} )
target='_blank' ? realizationDocument.path.slice(1)
rel='noopener noreferrer' : realizationDocument.path;
className='text-blue-500 underline' const documentUrl = `${S3_PUBLIC_BASE_URL}/${path}`;
> return (
{realizationDocument.path}{' '} <li key={realizationDocumentIdx}>
<Icon <Link
icon='cuida:open-in-new-tab-outline' href={documentUrl}
width={12} target='_blank'
height={12} rel='noopener noreferrer'
className='inline' className='text-blue-500 underline'
/> >
</Link> {realizationDocument.path}{' '}
</li> <Icon
) icon='cuida:open-in-new-tab-outline'
width={12}
height={12}
className='inline'
/>
</Link>
</li>
);
}
)} )}
</ul> </ul>
)} )}
@@ -27,7 +27,7 @@ import {
UploadRequestDocumentsFormSchema, UploadRequestDocumentsFormSchema,
UploadRequestDocumentsFormValues, UploadRequestDocumentsFormValues,
} from '@/components/pages/expense/form/ExpenseRequestForm.schema'; } from '@/components/pages/expense/form/ExpenseRequestForm.schema';
import { ACCEPTED_FILE_TYPE } from '@/config/constant'; import { ACCEPTED_FILE_TYPE, S3_PUBLIC_BASE_URL } from '@/config/constant';
import { ExpenseApi } from '@/services/api/expense'; import { ExpenseApi } from '@/services/api/expense';
import { isResponseSuccess } from '@/lib/api-helper'; import { isResponseSuccess } from '@/lib/api-helper';
import { EXPENSE_REQUEST_APPROVAL_LINE } from '@/config/approval-line'; import { EXPENSE_REQUEST_APPROVAL_LINE } from '@/config/approval-line';
@@ -489,24 +489,32 @@ const ExpenseRequestContent = ({
initialValues?.documents.length > 0 && ( initialValues?.documents.length > 0 && (
<ul className='list-disc'> <ul className='list-disc'>
{initialValues?.documents.map( {initialValues?.documents.map(
(requestDocument, requestDocumentIdx) => ( (requestDocument, requestDocumentIdx) => {
<li key={requestDocumentIdx}> const path = requestDocument.path.startsWith(
<Link '/'
href={requestDocument.path} )
target='_blank' ? requestDocument.path.slice(1)
rel='noopener noreferrer' : requestDocument.path;
className='text-blue-500 underline' const documentUrl = `${S3_PUBLIC_BASE_URL}/${path}`;
> return (
{requestDocument.path}{' '} <li key={requestDocumentIdx}>
<Icon <Link
icon='cuida:open-in-new-tab-outline' href={documentUrl}
width={12} target='_blank'
height={12} rel='noopener noreferrer'
className='inline' className='text-blue-500 underline'
/> >
</Link> {requestDocument.path}{' '}
</li> <Icon
) icon='cuida:open-in-new-tab-outline'
width={12}
height={12}
className='inline'
/>
</Link>
</li>
);
}
)} )}
</ul> </ul>
)} )}
@@ -1,6 +1,7 @@
import * as Yup from 'yup'; import * as Yup from 'yup';
import { Expense } from '@/types/api/expense'; import { Expense } from '@/types/api/expense';
import { formatDate } from '@/lib/helper'; import { formatDate } from '@/lib/helper';
import { S3_PUBLIC_BASE_URL } from '@/config/constant';
type ExpenseRealizationFormSchemaType = { type ExpenseRealizationFormSchemaType = {
category?: { category?: {
@@ -138,10 +139,13 @@ export const getExpenseRealizationFormInitialValues = (
label: initialValues.supplier.name, label: initialValues.supplier.name,
} }
: undefined, : undefined,
existing_documents: initialValues?.realization_docs?.map((doc) => ({ existing_documents: initialValues?.realization_docs?.map((doc) => {
name: doc.path, const path = doc.path.startsWith('/') ? doc.path.slice(1) : doc.path;
url: doc.path, return {
})), name: doc.path,
url: `${S3_PUBLIC_BASE_URL}/${path}`,
};
}),
documents: [], documents: [],
realizations: initialValues?.kandangs realizations: initialValues?.kandangs
? initialValues.kandangs.map((kandangExpense) => { ? initialValues.kandangs.map((kandangExpense) => {
@@ -1,6 +1,7 @@
import * as Yup from 'yup'; import * as Yup from 'yup';
import { Expense } from '@/types/api/expense'; import { Expense } from '@/types/api/expense';
import { formatDate } from '@/lib/helper'; import { formatDate } from '@/lib/helper';
import { S3_PUBLIC_BASE_URL } from '@/config/constant';
type ExpenseFormSchemaType = { type ExpenseFormSchemaType = {
category?: { category?: {
@@ -144,11 +145,14 @@ export const getExpenseFormInitialValues = (
label: initialValues.supplier.name, label: initialValues.supplier.name,
} }
: undefined, : undefined,
existing_documents: initialValues?.documents?.map((doc) => ({ existing_documents: initialValues?.documents?.map((doc) => {
id: doc.id, const path = doc.path.startsWith('/') ? doc.path.slice(1) : doc.path;
name: doc.path, return {
url: doc.path, id: doc.id,
})), name: doc.path,
url: `${S3_PUBLIC_BASE_URL}/${path}`,
};
}),
deleted_documents: [], deleted_documents: [],
documents: [], documents: [],
expense_nonstocks: initialValues?.kandangs expense_nonstocks: initialValues?.kandangs
+3
View File
@@ -349,6 +349,9 @@ export const ACCEPTED_FILE_TYPE = {
}, },
}; };
export const S3_PUBLIC_BASE_URL = process.env
.NEXT_PUBLIC_S3_PUBLIC_BASE_URL as string;
export const FILTER_TYPE_OPTIONS = [ export const FILTER_TYPE_OPTIONS = [
{ {
label: 'Tanggal Realisasi', label: 'Tanggal Realisasi',