mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-20 13:32:00 +00:00
refactor(FE): menambahkan parameter params useApprovalSteps dan return rawData
This commit is contained in:
@@ -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(() => {
|
||||||
|
|||||||
Vendored
+1
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user