Sfoglia il codice sorgente

update number digit & alignment

tags/Baseline_30082024_FRONTEND_UAT
kelvinsuen 1 anno fa
parent
commit
0f8f3bd5be
6 ha cambiato i file con 96 aggiunte e 95 eliminazioni
  1. +29
    -10
      src/components/CreateProject/ResourceAllocation.tsx
  2. +28
    -7
      src/components/CreateTaskTemplate/ResourceAllocation.tsx
  3. +2
    -2
      src/components/ProgressByClient/ProgressByClient.tsx
  4. +4
    -4
      src/components/ProgressByTeam/ProgressByTeam.tsx
  5. +31
    -70
      src/components/ProjectFinancialSummary/ProjectFinancialCard.tsx
  6. +2
    -2
      src/components/ProjectResourceConsumptionRanking/ProjectResourceConsumptionRanking.tsx

+ 29
- 10
src/components/CreateProject/ResourceAllocation.tsx Vedi File

@@ -63,10 +63,14 @@ const ResourceAllocationByGrade: React.FC<Props> = ({ grades }) => {

const manhourPercentageByGrade = watch("manhourPercentageByGrade");
const totalManhour = watch("totalManhour");
const totalPercentage = Math.round(Object.values(manhourPercentageByGrade).reduce(
const totalPercentage = Object.values(manhourPercentageByGrade).reduce(
(acc, percent) => acc + percent,
0,
) * 100) / 100;
);
// const totalPercentage = Math.round(Object.values(manhourPercentageByGrade).reduce(
// (acc, percent) => acc + percent,
// 0,
// ) * 100) / 100;

const makeUpdatePercentage = useCallback(
(gradeId: Grade["id"]) => (percentage?: number) => {
@@ -152,7 +156,7 @@ const ResourceAllocationByGrade: React.FC<Props> = ({ grades }) => {
<TableCellEdit
key={`${column.id}${idx}`}
value={manhourPercentageByGrade[column.id]}
renderValue={(val) => val + "%"}
renderValue={((val) => (val.toString().includes(".")? val.toString() : val.toFixed(1)) + "%")}
// renderValue={(val) => percentFormatter.format(val)}
onChange={makeUpdatePercentage(column.id)}
convertValue={(inputValue) => Number(inputValue)}
@@ -162,7 +166,7 @@ const ResourceAllocationByGrade: React.FC<Props> = ({ grades }) => {
/>
))}
<TableCell sx={{ ...(totalPercentage === 100 && leftBorderCellSx), ...(totalPercentage !== 100 && { ...errorCellSx, borderRight: "1px solid", borderColor: "error.main" }) }}>
{totalPercentage + "%"}
{((totalPercentage.toString().includes(".") && totalPercentage.toString() || totalPercentage.toFixed(1)) + "%")}
{/* {percentFormatter.format(totalPercentage)} */}
</TableCell>
</TableRow>
@@ -271,7 +275,7 @@ const ResourceAllocationByStage: React.FC<Props> = ({ grades, allTasks }) => {
<TableCellEdit
value={currentTaskGroups[tg.id].percentAllocation}
// renderValue={(val) => percentFormatter.format(val)}
renderValue={(val) => val + "%"}
renderValue={(val) => ((val.toString().includes(".")? val.toString() : val.toFixed(1)) + "%")}
onChange={makeUpdatePercentage(tg.id)}
convertValue={(inputValue) => Number(inputValue)}
cellSx={{
@@ -311,12 +315,27 @@ const ResourceAllocationByStage: React.FC<Props> = ({ grades, allTasks }) => {
...(Object.values(currentTaskGroups).reduce((acc, tg) => acc + tg.percentAllocation, 0,) !== 100 && errorCellSx)
}}
>
{percentFormatter.format(
Object.values(currentTaskGroups).reduce(
(acc, tg) => acc + tg.percentAllocation / 100,
{((Object.values(currentTaskGroups).reduce(
(acc, tg) => acc + tg.percentAllocation,
0,
),
)}
).toString().includes(".") && Object.values(currentTaskGroups).reduce(
(acc, tg) => acc + tg.percentAllocation,
0,) || Object.values(currentTaskGroups).reduce(
(acc, tg) => (acc + tg.percentAllocation),
0,
).toFixed(1)) + "%" )}
{/* {percentFormatter.format(
Object.values(currentTaskGroups).reduce(
(acc, tg) => acc + tg.percentAllocation / 100,
0,
),
).includes(".") && percentFormatter.format(Object.values(currentTaskGroups).reduce(
(acc, tg) => acc + tg.percentAllocation / 100,
0,),
) || Object.values(currentTaskGroups).reduce(
(acc, tg) => (acc + tg.percentAllocation),
0,
).toFixed(1) + "%" } */}
</TableCell>
<TableCell sx={rightBorderCellSx}>
{manhourFormatter.format(


+ 28
- 7
src/components/CreateTaskTemplate/ResourceAllocation.tsx Vedi File

@@ -53,10 +53,14 @@ const ResourceAllocationByGrade: React.FC<Props> = ({ grades }) => {
const { watch, register, setValue, formState: { errors }, setError, clearErrors } = useFormContext<NewTaskTemplateFormInputs>();

const manhourPercentageByGrade = watch("manhourPercentageByGrade");
const totalPercentage = Math.round(Object.values(manhourPercentageByGrade).reduce(
const totalPercentage = Object.values(manhourPercentageByGrade).reduce(
(acc, percent) => acc + percent,
0,
) * 100) / 100;
);
// const totalPercentage = Math.round(Object.values(manhourPercentageByGrade).reduce(
// (acc, percent) => acc + percent,
// 0,
// ) * 100) / 100;

const makeUpdatePercentage = useCallback(
(gradeId: Grade["id"]) => (percentage?: number) => {
@@ -114,7 +118,8 @@ const ResourceAllocationByGrade: React.FC<Props> = ({ grades }) => {
<TableCellEdit
key={`${column.id}${idx}`}
value={manhourPercentageByGrade[column.id]}
renderValue={(val) => val + "%"}
renderValue={(val) => ((val.toString().includes(".")? val.toString() : val.toFixed(1)) + "%")}
// renderValue={(val) => val.toFixed(1) + "%"}
onChange={makeUpdatePercentage(column.id)}
convertValue={(inputValue) => Number(inputValue)}
cellSx={{ backgroundColor: "primary.lightest" }}
@@ -123,7 +128,8 @@ const ResourceAllocationByGrade: React.FC<Props> = ({ grades }) => {
/>
))}
<TableCell sx={{ ...(totalPercentage === 100 && leftBorderCellSx), ...(totalPercentage !== 100 && { ...errorCellSx, borderRight: "1px solid", borderColor: "error.main" }) }}>
{totalPercentage + "%"}
{((totalPercentage.toString().includes(".") && totalPercentage.toString() || totalPercentage.toFixed(1) )+ "%")}
{/* {totalPercentage.toFixed(1) + "%"} */}
</TableCell>
</TableRow>
</TableBody>
@@ -214,7 +220,7 @@ const ResourceAllocationByStage: React.FC<Props> = ({ grades, allTasks }) => {
<TableCellEdit
value={currentTaskGroups[tg.id].percentAllocation}
// renderValue={(val) => percentFormatter.format(val)}
renderValue={(val) => val + "%"}
renderValue={(val) => ((val.toString().includes(".")? val.toString() : val.toFixed(1)) + "%")}
onChange={makeUpdatePercentage(tg.id)}
convertValue={(inputValue) => Number(inputValue)}
cellSx={{
@@ -239,12 +245,27 @@ const ResourceAllocationByStage: React.FC<Props> = ({ grades, allTasks }) => {
...(Object.values(currentTaskGroups).reduce((acc, tg) => acc + tg.percentAllocation, 0,) !== 100 && { ...errorCellSx, borderRight: "1px solid", borderColor: "error.main"})
}}
>
{percentFormatter.format(
{((Object.values(currentTaskGroups).reduce(
(acc, tg) => acc + tg.percentAllocation,
0,
).toString().includes(".") && Object.values(currentTaskGroups).reduce(
(acc, tg) => acc + tg.percentAllocation,
0,) || Object.values(currentTaskGroups).reduce(
(acc, tg) => (acc + tg.percentAllocation),
0,
).toFixed(1)) + "%" )}
{/* {percentFormatter.format(
Object.values(currentTaskGroups).reduce(
(acc, tg) => acc + tg.percentAllocation / 100,
0,
),
)}
).includes(".") && percentFormatter.format(Object.values(currentTaskGroups).reduce(
(acc, tg) => acc + tg.percentAllocation / 100,
0,),
) || Object.values(currentTaskGroups).reduce(
(acc, tg) => (acc + tg.percentAllocation),
0,
).toFixed(1) + "%" } */}
</TableCell>
</TableRow>
</TableBody>


+ 2
- 2
src/components/ProgressByClient/ProgressByClient.tsx Vedi File

@@ -385,7 +385,7 @@ const ProgressByClient: React.FC<Props> = () => {
enabled: true,
y: {
formatter: function (val) {
return val.toFixed(1) + "%";
return (val.toString().includes(".") ? val.toString() : val.toFixed(1)) + "%";
}
}
},
@@ -427,7 +427,7 @@ const ProgressByClient: React.FC<Props> = () => {
<br>
${t("Spent Manhours")}: ${spentManhours.toFixed(2)} hours
<br>
Percentage: ${value.toFixed(1)}%
Percentage: ${value.toString().includes(".") ? value.toString() : value.toFixed(1)}%
</div>
`;



+ 4
- 4
src/components/ProgressByTeam/ProgressByTeam.tsx Vedi File

@@ -468,7 +468,7 @@ const ProgressByTeam: React.FC = () => {
enabled: true,
y: {
formatter: function (val) {
return val.toFixed(1) + "%";
return (val.toString().includes(".") ? val.toString() : val.toFixed(1)) + "%";
}
}
},
@@ -505,9 +505,9 @@ const ProgressByTeam: React.FC = () => {
const tooltipContent = `
<div style="width: auto;">
<span style="font-weight: bold;">${projectCode} - ${projectName}</span>
<br>${t("Budget Manhours")}:${budgetManhours.toFixed(2)} hours
<br>${t("Spent Manhours")}:${spentManhours.toFixed(2)} hours
<br>Percentage:${value.toFixed(1)}%
<br>${t("Budget Manhours")}: ${budgetManhours.toFixed(2)} hours
<br>${t("Spent Manhours")}: ${spentManhours.toFixed(2)} hours
<br>Percentage: ${value.toString().includes(".") ? value.toString() : value.toFixed(1)}%
</div>
`;



+ 31
- 70
src/components/ProjectFinancialSummary/ProjectFinancialCard.tsx Vedi File

@@ -35,6 +35,10 @@ interface Props {
Index: number;
}

const dataBaseStyle:any = { color: "#6b87cf", textAlign: "right" }
const dataNegativeStyle:any = { color: "#f896aa", textAlign: "right" }
const dataPositiveStyle:any = { color: "#71d19e", textAlign: "right" }

const ProjectFinancialCard: React.FC<Props> = ({
Title,
TotalActiveProjectNumber,
@@ -77,74 +81,63 @@ const ProjectFinancialCard: React.FC<Props> = ({
{Title}
</div>
<hr />
<div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
<div className="text-sm font-medium mx-5" style={{ color: "#898d8d" }}>
{t("Total Active Project")}
</div>
<div className="text-lg font-medium ml-5" style={{ color: "#6b87cf" }}>
<div className="text-lg font-medium mx-5" style={dataBaseStyle}>
{TotalActiveProjectNumber.toLocaleString()}
</div>
<hr />
<div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
<div className="text-sm font-medium mx-5" style={{ color: "#898d8d" }}>
{t("Total Fees")}
</div>
<div className="text-lg font-medium ml-5" style={{ color: "#6b87cf" }}>
<div className="text-lg font-medium mx-5" style={dataBaseStyle}>
{TotalFees.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
</div>
<hr />
<div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
<div className="text-sm font-medium mx-5" style={{ color: "#898d8d" }}>
{t("Total Budget")}
</div>
<div className="text-lg font-medium ml-5" style={{ color: "#6b87cf" }}>
<div className="text-lg font-medium mx-5" style={dataBaseStyle}>
{TotalBudget.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
</div>
<hr />
<div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
<div className="text-sm font-medium mx-5" style={{ color: "#898d8d" }}>
{t("Total Cumulative Expenditure")}
</div>
<div className="text-lg font-medium ml-5" style={{ color: "#6b87cf" }}>
<div className="text-lg font-medium mx-5" style={dataBaseStyle}>
{TotalCumulative.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
</div>
<hr />
<div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
<div className="text-sm font-medium mx-5" style={{ color: "#898d8d" }}>
{t("Total Invoiced Amount")}
</div>
<div className="text-lg font-medium ml-5" style={{ color: "#6b87cf" }}>
<div className="text-lg font-medium mx-5" style={dataBaseStyle}>
{TotalInvoicedAmount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
</div>
<hr />
<div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
<div className="text-sm font-medium mx-5" style={{ color: "#898d8d" }}>
{t("Total Un-Invoiced Amount")}
</div>
<div className="text-lg font-medium ml-5" style={{ color: "#6b87cf" }}>
<div className="text-lg font-medium mx-5" style={dataBaseStyle}>
{TotalUnInvoicedAmount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
</div>
<hr />
<div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
<div className="text-sm font-medium mx-5" style={{ color: "#898d8d" }}>
{t("Total Received Amount")}
</div>
<div className="text-lg font-medium ml-5" style={{ color: "#6b87cf" }}>
<div className="text-lg font-medium mx-5" style={dataBaseStyle}>
{TotalReceivedAmount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
</div>
<hr />
<div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
<div className="text-sm font-medium mx-5" style={{ color: "#898d8d" }}>
{t("Cash Flow Status")}
</div>
{CashFlowStatus === "Negative" && (
<>
<div
className="text-lg font-medium ml-5"
style={{ color: "#f896aa" }}
>
{t(CashFlowStatus)}
</div>
<hr />
</>
)}
{CashFlowStatus === "Positive" && (
<>
<div
className="text-lg font-medium ml-5"
style={{ color: "#71d19e" }}
className="text-lg font-medium mx-5"
style={CashFlowStatus === "Negative" && dataNegativeStyle || dataPositiveStyle}
>
{t(CashFlowStatus)}
</div>
@@ -152,52 +145,30 @@ const ProjectFinancialCard: React.FC<Props> = ({
</>
)}
<div
className="text-sm mt-2 font-medium ml-5"
className="text-sm mt-2 font-medium mx-5"
style={{ color: "#898d8d" }}
>
{t("Cost Performance Index") + " (CPI)"}
</div>
{Number(CostPerformanceIndex) < 1 && (
<>
<div
className="text-lg font-medium ml-5 mb-2"
style={{ color: "#f896aa" }}
>
{CostPerformanceIndex}
</div>
<hr />
</>
)}
{Number(CostPerformanceIndex) >= 1 && (
{ (
<>
<div
className="text-lg font-medium ml-5 mb-2"
style={{ color: "#71d19e" }}
className="text-lg font-medium mx-5 mb-2"
style={Number(CostPerformanceIndex) < 1 && dataNegativeStyle || dataPositiveStyle}
>
{CostPerformanceIndex}
</div>
<hr />
</>
)}
<div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
<div className="text-sm font-medium mx-5" style={{ color: "#898d8d" }}>
{t("Projected Cash Flow Status")}
</div>
{ProjectedCashFlowStatus === "Negative" && (
<>
<div
className="text-lg font-medium ml-5"
style={{ color: "#f896aa" }}
>
{t(ProjectedCashFlowStatus)}
</div>
<hr />
</>
)}
{ProjectedCashFlowStatus === "Positive" && (
<>
<div
className="text-lg font-medium ml-5"
style={{ color: "#71d19e" }}
className="text-lg font-medium mx-5"
style={ProjectedCashFlowStatus === "Negative" && dataNegativeStyle || dataPositiveStyle}
>
{t(ProjectedCashFlowStatus)}
</div>
@@ -205,7 +176,7 @@ const ProjectFinancialCard: React.FC<Props> = ({
</>
)}
<div
className="text-sm mt-2 font-medium ml-5"
className="text-sm mt-2 font-medium mx-5"
style={{ color: "#898d8d" }}
>
{t("Projected Cost Performance Index") + " (CPI)"}
@@ -213,18 +184,8 @@ const ProjectFinancialCard: React.FC<Props> = ({
{Number(ProjectedCPI) < 1 && (
<>
<div
className="text-lg font-medium ml-5 mb-2"
style={{ color: "#f896aa" }}
>
{ProjectedCPI}
</div>
</>
)}
{Number(ProjectedCPI) >= 1 && (
<>
<div
className="text-lg font-medium ml-5 mb-2"
style={{ color: "#71d19e" }}
className="text-lg font-medium mx-5 mb-2"
style={Number(ProjectedCPI) < 1 && dataNegativeStyle || dataPositiveStyle}
>
{ProjectedCPI}
</div>


+ 2
- 2
src/components/ProjectResourceConsumptionRanking/ProjectResourceConsumptionRanking.tsx Vedi File

@@ -554,7 +554,7 @@ const ProjectResourceConsumptionRanking: React.FC = () => {
enabled: true,
y: {
formatter: function (val) {
return val.toFixed(1) + "%";
return (val.toString().includes(".") ? val.toString() : val.toFixed(1)) + "%";
}
}
},
@@ -596,7 +596,7 @@ const ProjectResourceConsumptionRanking: React.FC = () => {
<br>
${t("Spent Manhours")}: ${spentManhours.toFixed(2)} ${t("hours")}
<br>
Percentage: ${value.toFixed(1)}%
Percentage: ${value.toString().includes(".") ? value.toString() : value.toFixed(1)}%
</div>
`;



Caricamento…
Annulla
Salva