From 825310b16b3e9c8b9cfc3b2149e406eecc1a7052 Mon Sep 17 00:00:00 2001 From: leoho2fi Date: Mon, 22 Apr 2024 15:22:06 +0800 Subject: [PATCH] add report ar01 --- public/temp/AR01_Late Start Report.xlsx | Bin 12581 -> 12958 bytes public/temp/AR02_Delay Report.xlsx | Bin 0 -> 13358 bytes .../(main)/analytics/LateStartReport/page.tsx | 2 +- .../ResourceOvercomsumptionReport/page.tsx | 24 --- src/app/api/report/index.ts | 6 +- .../DownloadReportButton.tsx | 40 ----- .../LateStartReport/LateStartReport.tsx | 4 +- .../{ => Report}/LateStartReport/index.ts | 0 .../DownloadReportButton.tsx | 137 ++++++++++++++++++ .../LateStartReportGen/LateStartReportGen.tsx | 12 +- .../LateStartReportGenLoading.tsx | 0 .../LateStartReportGenWrapper.tsx | 4 +- .../{ => Report}/LateStartReportGen/index.ts | 0 src/components/ReportSearchBox/SearchBox.tsx | 103 ++++++++++++- src/components/SearchBox/index.ts | 1 + 15 files changed, 253 insertions(+), 80 deletions(-) create mode 100644 public/temp/AR02_Delay Report.xlsx delete mode 100644 src/app/(main)/analytics/ResourceOvercomsumptionReport/page.tsx delete mode 100644 src/components/LateStartReportGen/DownloadReportButton.tsx rename src/components/{ => Report}/LateStartReport/LateStartReport.tsx (68%) rename src/components/{ => Report}/LateStartReport/index.ts (100%) create mode 100644 src/components/Report/LateStartReportGen/DownloadReportButton.tsx rename src/components/{ => Report}/LateStartReportGen/LateStartReportGen.tsx (76%) rename src/components/{ => Report}/LateStartReportGen/LateStartReportGenLoading.tsx (100%) rename src/components/{ => Report}/LateStartReportGen/LateStartReportGenWrapper.tsx (75%) rename src/components/{ => Report}/LateStartReportGen/index.ts (100%) diff --git a/public/temp/AR01_Late Start Report.xlsx b/public/temp/AR01_Late Start Report.xlsx index 03d6b6b9e3c5bfedd5dfc213cb61cad67522123d..24da97fdaf261701fcfd8b1110216245b4c543b3 100644 GIT binary patch delta 4915 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 delta 4497 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 diff --git a/public/temp/AR02_Delay Report.xlsx b/public/temp/AR02_Delay Report.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a8c53a8da3210313d4a5864ff08822fdc5a8b5a9 GIT binary patch literal 13358 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 { - return ( - - - Resource Overconsumption Report - - {/* }> - - */} - - - ); -}; -export default ProjectLateReport; diff --git a/src/app/api/report/index.ts b/src/app/api/report/index.ts index 588692c..3eeab3d 100644 --- a/src/app/api/report/index.ts +++ b/src/app/api/report/index.ts @@ -18,10 +18,10 @@ export interface LateStart { } export const preloadProjects = () => { - fetchProjectsCashFlow(); + fetchProjectsLateStart(); }; -export const fetchProjectsCashFlow = cache(async () => { +export const fetchProjectsLateStart = cache(async () => { return mockProjects; }); @@ -38,7 +38,7 @@ const mockProjects: LateStart[] = [ targetEndDate: "30/3/2024", client: "ss", subsidiary: "sus", - nextstage:"s1", + nextstage:"", nextstageenddate:"30/2/2024", }, ]; diff --git a/src/components/LateStartReportGen/DownloadReportButton.tsx b/src/components/LateStartReportGen/DownloadReportButton.tsx deleted file mode 100644 index b838fba..0000000 --- a/src/components/LateStartReportGen/DownloadReportButton.tsx +++ /dev/null @@ -1,40 +0,0 @@ -// DownloadReportButton.tsx -// import React, { useState } from 'react'; -// import { generateFakeData } from '../utils/generateFakeData'; -// import { downloadExcel } from '../utils/downloadExcel'; - -// export const DownloadReportButton: React.FC = () => { -// const [isLoading, setIsLoading] = useState(false); - -// const handleDownload = async () => { -// setIsLoading(true); -// const data = generateFakeData(10); -// downloadExcel(data); -// setIsLoading(false); -// }; - -// return ( -// -// ); -// }; - -import React from 'react'; - -export const DownloadReportButton: React.FC = () => { - const handleDownload = () => { - const link = document.createElement('a'); - link.href = '/temp/AR01_Late Start Report.xlsx'; // Adjust the path as necessary - link.download = 'AR01_Late Start Report.xlsx'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - - return ( - - ); -}; \ No newline at end of file diff --git a/src/components/LateStartReport/LateStartReport.tsx b/src/components/Report/LateStartReport/LateStartReport.tsx similarity index 68% rename from src/components/LateStartReport/LateStartReport.tsx rename to src/components/Report/LateStartReport/LateStartReport.tsx index 85df0b9..eee4e56 100644 --- a/src/components/LateStartReport/LateStartReport.tsx +++ b/src/components/Report/LateStartReport/LateStartReport.tsx @@ -1,9 +1,9 @@ //src\components\LateStartReport\LateStartReport.tsx "use client"; import * as React from "react"; -import "../../app/global.css"; +import "../../../app/global.css"; import { Suspense } from "react"; -import LateStartReportGen from "@/components/LateStartReportGen"; +import LateStartReportGen from "@/components/Report/LateStartReportGen"; const LateStartReport: React.FC = () => { diff --git a/src/components/LateStartReport/index.ts b/src/components/Report/LateStartReport/index.ts similarity index 100% rename from src/components/LateStartReport/index.ts rename to src/components/Report/LateStartReport/index.ts diff --git a/src/components/Report/LateStartReportGen/DownloadReportButton.tsx b/src/components/Report/LateStartReportGen/DownloadReportButton.tsx new file mode 100644 index 0000000..33691c0 --- /dev/null +++ b/src/components/Report/LateStartReportGen/DownloadReportButton.tsx @@ -0,0 +1,137 @@ +// DownloadReportButton.tsx +import React, { useState } from 'react'; +import * as XLSX from 'xlsx-js-style'; +//import { generateFakeData } from '../utils/generateFakeData'; +//import { downloadExcel } from '../utils/downloadExcel'; + +interface CellObject { + v?: string | number; // value of cell + s?: { // style of cell + font?: { + name: string; + sz: number; + bold?: boolean; + } + }; + } + +export const DownloadReportButton: React.FC = () => { + const [isLoading, setIsLoading] = useState(false); + + const handleDownload = async () => { + setIsLoading(true); + + try { + const response = await fetch('/temp/AR01_Late Start Report.xlsx', { + headers: { + 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + }); + if (!response.ok) throw new Error('Network response was not ok.'); + + const data = await response.blob(); + const reader = new FileReader(); + reader.onload = (e) => { + if (e.target && e.target.result) { + const ab = e.target.result as ArrayBuffer; + const workbook = XLSX.read(ab, { type: 'array' }); + const firstSheetName = workbook.SheetNames[0]; + const worksheet = workbook.Sheets[firstSheetName]; + + // Add the current date to cell C2 + const cellAddress = 'C2'; + const date = new Date().toISOString().split('T')[0]; // Format YYYY-MM-DD + const formattedDate = date.replace(/-/g, '/'); // Change format to YYYY/MM/DD + XLSX.utils.sheet_add_aoa(worksheet, [[formattedDate]], { origin: cellAddress }); + + // Calculate the maximum length of content in each column and set column width + const colWidths: number[] = []; + + const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: "", blankrows: true }) as (string | number)[][]; + jsonData.forEach((row: (string | number)[]) => { + row.forEach((cell: string | number, index: number) => { + const valueLength = cell.toString().length; + colWidths[index] = Math.max(colWidths[index] || 0, valueLength); + }); + }); + + // Apply calculated widths to each column, skipping column A + worksheet['!cols'] = colWidths.map((width, index) => { + if (index === 0) { + return { wch: 8 }; // Set default or specific width for column A if needed + } + return { wch: width + 2 }; // Add padding to width + }); + + // Style for cell A1: Font size 16 and bold + if (worksheet['A1']) { + worksheet['A1'].s = { + font: { + bold: true, + sz: 16, // Font size 16 + //name: 'Times New Roman' // Specify font + } + }; + } + + // Apply styles from A2 to A4 (bold) + ['A2', 'A3', 'A4'].forEach(cell => { + if (worksheet[cell]) { + worksheet[cell].s = { font: { bold: true } }; + } + }); + + // Formatting from A6 to J6 + // Apply styles from A6 to J6 (bold, bottom border, center alignment) + for (let col = 0; col < 10; col++) { // Columns A to J + const cellRef = XLSX.utils.encode_col(col) + '6'; + if (worksheet[cellRef]) { + worksheet[cellRef].s = { + font: { bold: true }, + alignment: { horizontal: 'center' }, + border: { + bottom: { style: 'thin', color: { auto: 1 } } + } + }; + } + } + + // Convert workbook back to XLSX file + XLSX.writeFile(workbook, 'Updated_Report.xlsx'); + } else { + throw new Error('Failed to load file'); + } + }; + reader.readAsArrayBuffer(data); + } catch (error) { + console.error('Error downloading the file: ', error); + } + + setIsLoading(false); + }; + + return ( + + ); + }; + +// import React from 'react'; + +// export const DownloadReportButton: React.FC = () => { +// const handleDownload = () => { +// const link = document.createElement('a'); +// link.href = '/temp/AR01_Late Start Report.xlsx'; // Adjust the path as necessary +// link.download = 'AR01_Late Start Report.xlsx'; +// document.body.appendChild(link); +// link.click(); +// document.body.removeChild(link); +// }; + +// return ( +// +// ); +// }; \ No newline at end of file diff --git a/src/components/LateStartReportGen/LateStartReportGen.tsx b/src/components/Report/LateStartReportGen/LateStartReportGen.tsx similarity index 76% rename from src/components/LateStartReportGen/LateStartReportGen.tsx rename to src/components/Report/LateStartReportGen/LateStartReportGen.tsx index 8ebfae2..81ff1a0 100644 --- a/src/components/LateStartReportGen/LateStartReportGen.tsx +++ b/src/components/Report/LateStartReportGen/LateStartReportGen.tsx @@ -1,14 +1,14 @@ //src\components\LateStartReportGen\LateStartReportGen.tsx "use client"; import React, { useMemo, useState } from "react"; -import SearchBox, { Criterion } from "../SearchBox"; +import SearchBox, { Criterion } from "../../ReportSearchBox"; import { useTranslation } from "react-i18next"; -import { CashFlow } from "@/app/api/cashflow"; -import { DownloadReportButton } from './DownloadReportButton'; +import { LateStart } from "@/app/api/report"; +//import { DownloadReportButton } from './DownloadReportButton'; interface Props { - projects: CashFlow[]; + projects: LateStart[]; } -type SearchQuery = Partial>; +type SearchQuery = Partial>; type SearchParamNames = keyof SearchQuery; const ProgressByClientSearch: React.FC = ({ projects }) => { @@ -36,7 +36,7 @@ const ProgressByClientSearch: React.FC = ({ projects }) => { console.log(query); }} /> - + {/* */} ); }; diff --git a/src/components/LateStartReportGen/LateStartReportGenLoading.tsx b/src/components/Report/LateStartReportGen/LateStartReportGenLoading.tsx similarity index 100% rename from src/components/LateStartReportGen/LateStartReportGenLoading.tsx rename to src/components/Report/LateStartReportGen/LateStartReportGenLoading.tsx diff --git a/src/components/LateStartReportGen/LateStartReportGenWrapper.tsx b/src/components/Report/LateStartReportGen/LateStartReportGenWrapper.tsx similarity index 75% rename from src/components/LateStartReportGen/LateStartReportGenWrapper.tsx rename to src/components/Report/LateStartReportGen/LateStartReportGenWrapper.tsx index 5ba8325..2ea7f26 100644 --- a/src/components/LateStartReportGen/LateStartReportGenWrapper.tsx +++ b/src/components/Report/LateStartReportGen/LateStartReportGenWrapper.tsx @@ -1,5 +1,5 @@ //src\components\LateStartReportGen\LateStartReportGenWrapper.tsx -import { fetchProjectsCashFlow } from "@/app/api/cashflow"; +import { fetchProjectsLateStart } from "@/app/api/report"; import React from "react"; import LateStartReportGen from "./LateStartReportGen"; import LateStartReportGenLoading from "./LateStartReportGenLoading"; @@ -9,7 +9,7 @@ interface SubComponents { } const LateStartReportGenWrapper: React.FC & SubComponents = async () => { - const clentprojects = await fetchProjectsCashFlow(); + const clentprojects = await fetchProjectsLateStart(); return ; }; diff --git a/src/components/LateStartReportGen/index.ts b/src/components/Report/LateStartReportGen/index.ts similarity index 100% rename from src/components/LateStartReportGen/index.ts rename to src/components/Report/LateStartReportGen/index.ts diff --git a/src/components/ReportSearchBox/SearchBox.tsx b/src/components/ReportSearchBox/SearchBox.tsx index fe058f7..6ca34f1 100644 --- a/src/components/ReportSearchBox/SearchBox.tsx +++ b/src/components/ReportSearchBox/SearchBox.tsx @@ -1,3 +1,4 @@ +//src\components\ReportSearchBox\SearchBox.tsx "use client"; import Grid from "@mui/material/Grid"; @@ -21,6 +22,8 @@ import { DatePicker } from "@mui/x-date-pickers/DatePicker"; import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider"; import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; import { Box } from "@mui/material"; +import * as XLSX from 'xlsx-js-style'; +//import { DownloadReportButton } from '../LateStartReportGen/DownloadReportButton'; interface BaseCriterion { label: string; @@ -108,8 +111,104 @@ function SearchBox({ const handleSearch = () => { onSearch(inputs); + }; + + const handleDownload = async () => { + //setIsLoading(true); + try { + const response = await fetch('/temp/AR01_Late Start Report.xlsx', { + headers: { + 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }, + }); + if (!response.ok) throw new Error('Network response was not ok.'); + + const data = await response.blob(); + const reader = new FileReader(); + reader.onload = (e) => { + if (e.target && e.target.result) { + const ab = e.target.result as ArrayBuffer; + const workbook = XLSX.read(ab, { type: 'array' }); + const firstSheetName = workbook.SheetNames[0]; + const worksheet = workbook.Sheets[firstSheetName]; + + // Add the current date to cell C2 + const cellAddress = 'C2'; + const date = new Date().toISOString().split('T')[0]; // Format YYYY-MM-DD + const formattedDate = date.replace(/-/g, '/'); // Change format to YYYY/MM/DD + XLSX.utils.sheet_add_aoa(worksheet, [[formattedDate]], { origin: cellAddress }); + + // Calculate the maximum length of content in each column and set column width + const colWidths: number[] = []; + + const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: "", blankrows: true }) as (string | number)[][]; + jsonData.forEach((row: (string | number)[]) => { + row.forEach((cell: string | number, index: number) => { + const valueLength = cell.toString().length; + colWidths[index] = Math.max(colWidths[index] || 0, valueLength); + }); + }); + + // Apply calculated widths to each column, skipping column A + worksheet['!cols'] = colWidths.map((width, index) => { + if (index === 0) { + return { wch: 8 }; // Set default or specific width for column A if needed + } + return { wch: width + 2 }; // Add padding to width + }); + + // Style for cell A1: Font size 16 and bold + if (worksheet['A1']) { + worksheet['A1'].s = { + font: { + bold: true, + sz: 16, // Font size 16 + //name: 'Times New Roman' // Specify font + } + }; + } + + // Apply styles from A2 to A4 (bold) + ['A2', 'A3', 'A4'].forEach(cell => { + if (worksheet[cell]) { + worksheet[cell].s = { font: { bold: true } }; + } + }); + + // Formatting from A6 to J6 + // Apply styles from A6 to J6 (bold, bottom border, center alignment) + for (let col = 0; col < 10; col++) { // Columns A to J + const cellRef = XLSX.utils.encode_col(col) + '6'; + if (worksheet[cellRef]) { + worksheet[cellRef].s = { + font: { bold: true }, + alignment: { horizontal: 'center' }, + border: { + bottom: { style: 'thin', color: { auto: 1 } } + } + }; + } + } + + // Format filename with date + const today = new Date().toISOString().split('T')[0].replace(/-/g, '_'); // Get current date and format as YYYY_MM_DD + const filename = `AR01_Late_Start_Report_${today}.xlsx`; // Append formatted date to the filename + + // Convert workbook back to XLSX file + XLSX.writeFile(workbook, filename); + } else { + throw new Error('Failed to load file'); + } + }; + reader.readAsArrayBuffer(data); + } catch (error) { + console.error('Error downloading the file: ', error); + } + + //setIsLoading(false); + }; return ( @@ -188,9 +287,9 @@ function SearchBox({ diff --git a/src/components/SearchBox/index.ts b/src/components/SearchBox/index.ts index c4da6a2..37a0659 100644 --- a/src/components/SearchBox/index.ts +++ b/src/components/SearchBox/index.ts @@ -1,2 +1,3 @@ +//src\components\SearchBox\index.ts export { default } from "./SearchBox"; export type { Criterion } from "./SearchBox";