refactor(FE): menambahkan parameter params useApprovalSteps dan return rawData

This commit is contained in:
randy-ar
2025-11-12 17:03:37 +07:00
parent 6670f1e31b
commit fa3ba46810
3 changed files with 106 additions and 11 deletions
+97 -9
View File
@@ -191,6 +191,53 @@ export const formatGroupedApprovalsToApprovalSteps = (
export default ApprovalSteps; export default ApprovalSteps;
/**
* Mengubah array BaseApproval (datar) menjadi BaseGroupedApproval (berkelompok).
*/
const groupApprovalsByStep = (
approvals: BaseApproval[]
): BaseGroupedApproval[] => {
const groups: Record<number, BaseGroupedApproval> = {};
for (const approval of approvals) {
if (!groups[approval.step_number]) {
groups[approval.step_number] = {
step_number: approval.step_number,
step_name: approval.step_name,
approvals: [],
};
}
groups[approval.step_number].approvals.push(approval);
}
return Object.values(groups);
};
/**
* Mengubah array BaseGroupedApproval (berkelompok) kembali menjadi BaseApproval[] (datar).
*/
const flattenGroupedApprovals = (
groupedApprovals: BaseGroupedApproval[]
): BaseApproval[] => {
return groupedApprovals.flatMap((group) => group.approvals);
};
/**
* Type guard untuk memeriksa apakah data adalah BaseGroupedApproval[].
*/
const isGroupedApprovalData = (
data: BaseApproval[] | BaseGroupedApproval[]
): data is BaseGroupedApproval[] => {
if (!data || data.length === 0) {
return true;
}
const firstElement = data[0];
return (
typeof firstElement === 'object' &&
firstElement !== null &&
'approvals' in firstElement &&
Array.isArray(firstElement.approvals)
);
};
const useApprovalSteps = <T extends ModuleWithApproval>({ const useApprovalSteps = <T extends ModuleWithApproval>({
moduleUrl, moduleUrl,
moduleName, moduleName,
@@ -204,6 +251,7 @@ const useApprovalSteps = <T extends ModuleWithApproval>({
page: number; page: number;
limit: number; limit: number;
search?: string; search?: string;
group_step_number?: boolean;
}; };
}) => { }) => {
const paramString = new URLSearchParams({ const paramString = new URLSearchParams({
@@ -211,17 +259,15 @@ const useApprovalSteps = <T extends ModuleWithApproval>({
limit: params?.limit?.toString() || '', limit: params?.limit?.toString() || '',
search: params?.search || '', search: params?.search || '',
}).toString(); }).toString();
const SWR_KEY_CONSTANTS = '/constants'; const SWR_KEY_CONSTANTS = '/constants';
const SWR_KEY_APPROVALS = const SWR_KEY_APPROVALS =
moduleName && moduleId moduleName && moduleId
? `/approvals?module_name=${moduleName}&module_id=${moduleId}&group_step_number=true${ ? `/approvals?module_name=${moduleName}&module_id=${moduleId}${
params ? `&${paramString}` : '' params ? `&${paramString}` : ''
}` }`
: null; : null;
const SWR_KEY_CURRENT_DATA = moduleUrl; const SWR_KEY_CURRENT_DATA = moduleUrl;
// Get Approval Lines dari GET /constant
const { data: constData, isLoading: constIsLoading } = useSWR( const { data: constData, isLoading: constIsLoading } = useSWR(
SWR_KEY_CONSTANTS, SWR_KEY_CONSTANTS,
async (url) => { async (url) => {
@@ -229,16 +275,16 @@ const useApprovalSteps = <T extends ModuleWithApproval>({
} }
); );
// Get Grouped Data dari GET /approvals
const { const {
data: approvalData, data: approvalData,
isLoading: approvalIsLoading, isLoading: approvalIsLoading,
mutate: mutateApprovals, mutate: mutateApprovals,
} = useSWR(SWR_KEY_APPROVALS, async (url) => { } = useSWR(SWR_KEY_APPROVALS, async (url) => {
return await httpClientFetcher<BaseApiResponse<BaseGroupedApproval[]>>(url); return await httpClientFetcher<
BaseApiResponse<BaseApproval[] | BaseGroupedApproval[]>
>(url);
}); });
// Get latest approval
const { const {
data: currentData, data: currentData,
isLoading: currentIsLoading, isLoading: currentIsLoading,
@@ -259,15 +305,29 @@ const useApprovalSteps = <T extends ModuleWithApproval>({
})?.steps ?? []) })?.steps ?? [])
: []; : [];
const grouped = isResponseSuccess(approvalData) ? approvalData.data : [];
const latest = isResponseSuccess(currentData) const latest = isResponseSuccess(currentData)
? currentData.data?.approval ? currentData.data?.approval
: undefined; : undefined;
const rawData = isResponseSuccess(approvalData)
? approvalData.data
: undefined;
let processedGroupedApprovals: BaseGroupedApproval[] = [];
if (rawData) {
if (isGroupedApprovalData(rawData)) {
processedGroupedApprovals = rawData;
} else {
processedGroupedApprovals = groupApprovalsByStep(
rawData as BaseApproval[]
);
}
}
return { return {
approvalLine: line, approvalLine: line,
groupedApprovals: grouped, groupedApprovals: processedGroupedApprovals,
latestApproval: latest, latestApproval: latest,
}; };
}, [constData, approvalData, currentData, moduleName]); }, [constData, approvalData, currentData, moduleName]);
@@ -290,11 +350,39 @@ const useApprovalSteps = <T extends ModuleWithApproval>({
} }
}, [isLoading, approvalLine, groupedApprovals, latestApproval]); }, [isLoading, approvalLine, groupedApprovals, latestApproval]);
const rawDataApprovals = useMemo(() => {
const rawData = isResponseSuccess(approvalData)
? approvalData.data
: undefined;
if (!rawData) {
return undefined;
}
const isDataCurrentlyGrouped = isGroupedApprovalData(rawData);
const wantsGrouped = params?.group_step_number !== false;
if (wantsGrouped) {
if (isDataCurrentlyGrouped) {
return rawData as BaseGroupedApproval[];
} else {
return groupApprovalsByStep(rawData as BaseApproval[]);
}
} else {
if (isDataCurrentlyGrouped) {
return flattenGroupedApprovals(rawData as BaseGroupedApproval[]);
} else {
return rawData as BaseApproval[];
}
}
}, [approvalData, params?.group_step_number]);
// Return Hook // Return Hook
return { return {
approvals, approvals,
isLoading, isLoading,
rawData: isResponseSuccess(currentData) ? currentData.data : undefined, rawData: isResponseSuccess(currentData) ? currentData.data : undefined,
rawDataApprovals: rawDataApprovals,
refresh, refresh,
}; };
}; };
@@ -34,14 +34,13 @@ import { Kandang } from '@/types/api/master-data/kandang';
import Collapse from '@/components/Collapse'; import Collapse from '@/components/Collapse';
import { ProjectFlockApi } from '@/services/api/production/project-flock'; import { ProjectFlockApi } from '@/services/api/production/project-flock';
import { BaseApiResponse } from '@/types/api/api-general'; import { BaseApiResponse } from '@/types/api/api-general';
import { APPROVAL_WORKFLOWS, FLOCK_CATEGORY_OPTIONS } from '@/config/constant'; import { FLOCK_CATEGORY_OPTIONS } from '@/config/constant';
import { useModal } from '@/components/Modal'; import { useModal } from '@/components/Modal';
import ConfirmationModal from '@/components/modal/ConfirmationModal'; import ConfirmationModal from '@/components/modal/ConfirmationModal';
import ProjectFlockKandangTable from './ProjectFlockKandangTable'; import ProjectFlockKandangTable from './ProjectFlockKandangTable';
import ApprovalSteps, { import ApprovalSteps, {
useApprovalSteps, useApprovalSteps,
} from '@/components/pages/ApprovalSteps'; } from '@/components/pages/ApprovalSteps';
import Card from '@/components/Card';
interface ProjectFlockFormProps { interface ProjectFlockFormProps {
formType?: 'add' | 'edit' | 'detail'; formType?: 'add' | 'edit' | 'detail';
@@ -151,11 +150,18 @@ const ProjectFlockForm = ({
const { const {
approvals, approvals,
isLoading: approvalsLoading, isLoading: approvalsLoading,
rawData: rawApprovals,
rawDataApprovals: rawDataApprovals,
refresh: refreshApprovals, refresh: refreshApprovals,
} = useApprovalSteps({ } = useApprovalSteps({
moduleUrl: `/production/project-flocks/${initialValues?.id}`, moduleUrl: `/production/project-flocks/${initialValues?.id}`,
moduleName: 'PROJECT_FLOCKS', moduleName: 'PROJECT_FLOCKS',
moduleId: initialValues?.id.toString() ?? '', moduleId: initialValues?.id.toString() ?? '',
params: {
page: 1,
limit: 10,
group_step_number: false,
},
}); });
useEffect(() => { useEffect(() => {
+1
View File
@@ -98,6 +98,7 @@ export type flags =
| 'OVK'; | 'OVK';
export type BaseApproval = { export type BaseApproval = {
id?: number;
step_number: number; step_number: number;
step_name: string; step_name: string;
action: string; action: string;