Files
sam-react-prod/src/lib/utils/export.ts

108 lines
3.0 KiB
TypeScript
Raw Normal View History

/**
*
*
* :
* - (AttendanceManagement)
* - (SalaryManagement)
* -
*/
/**
*
*
* API (Blob) .
*
* @param response - fetch Response (Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)
* @param filename - ( )
*/
export async function downloadExcelFromResponse(
response: Response,
filename: string
): Promise<void> {
if (!response.ok) {
throw new Error(`엑셀 다운로드 실패: ${response.status}`);
}
const blob = await response.blob();
downloadBlob(blob, filename);
}
/**
* Blob을
*
* @param blob - Blob
* @param filename -
*/
export function downloadBlob(blob: Blob, filename: string): void {
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
}
/**
* /
*
* @param prefix - (: '근태현황', '급여명세')
* @param extension - (: 'xlsx')
* @returns (: '근태현황_20250115_143052.xlsx')
*/
export function generateExportFilename(
prefix: string,
extension: string = 'xlsx'
): string {
const now = new Date();
const dateStr = now.toISOString().slice(0, 10).replace(/-/g, '');
const timeStr = now.toTimeString().slice(0, 8).replace(/:/g, '');
return `${prefix}_${dateStr}_${timeStr}.${extension}`;
}
/**
* API fetch
*
* @param token -
* @param params - ()
* @returns fetch
*/
export function createExportFetchOptions(
token: string,
params?: Record<string, string | number | boolean | undefined>
): RequestInit {
return {
method: 'GET',
headers: {
Authorization: `Bearer ${token}`,
Accept: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'X-API-KEY': process.env.NEXT_PUBLIC_API_KEY || '',
},
cache: 'no-store',
};
}
/**
*
*
* @param params -
* @returns URL (: '?year=2025&month=1')
*/
export function buildExportQueryString(
params?: Record<string, string | number | boolean | undefined>
): string {
if (!params) return '';
const searchParams = new URLSearchParams();
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== null && value !== '') {
searchParams.set(key, String(value));
}
});
const queryString = searchParams.toString();
return queryString ? `?${queryString}` : '';
}