From 5ce891032566e76a7e8bd88acd727a3ae4a79e4a Mon Sep 17 00:00:00 2001 From: Muhammad Eko Date: Fri, 17 Oct 2025 13:36:24 +0700 Subject: [PATCH] organization code --- src/app/(dashboard)/layout.tsx | 8 ++- src/services/api.ts | 96 +++++++++++++++++++++------------- 2 files changed, 67 insertions(+), 37 deletions(-) diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index 0ceebaf..6c732c5 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -24,7 +24,7 @@ export default function DashboardLayout({children}:{children: React.ReactNode}) const pathname = usePathname(); const dispatch = useAppDispatch(); const filter = useAppSelector((state) => state.filter.filter); - const {data: orgMap } = useGetOrganizationsMapQuery(); + const {data: orgMap, isLoading: isLoadingOrgMap } = useGetOrganizationsMapQuery(); const {data: filterOptions } = useGetFilterOptionsQuery(filter); const [region, setRegion] = React.useState(""); const { t } = useLocale(); @@ -61,6 +61,12 @@ export default function DashboardLayout({children}:{children: React.ReactNode}) dispatch(setFilter({...filter, end_date: newEndDate})); } }; + + if (isLoadingOrgMap) return ( +
+ +
+ ) return ( diff --git a/src/services/api.ts b/src/services/api.ts index 3729190..7ac842c 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -3,58 +3,82 @@ import { AttendanceRange, AttendanceSummary, CostData, EmployeeMovement, Employe import { Response , Filter} from './types' import { config } from '@/config'; + +let valueToSap: Record = {} +let sapToValue: Record = {} + +const deepClone = (obj: any) => JSON.parse(JSON.stringify(obj)) const rawBaseQuery = fetchBaseQuery({ baseUrl: config.api.baseApiUrl }); -const baseQuery = async (args:any, api:any, extraOptions:any) => { - const result = await rawBaseQuery(args, api, extraOptions) +const translatedBaseQuery: typeof rawBaseQuery = async (args, api, extraOptions) => { + const request = + typeof args === 'string' + ? { url: args } + : { ...(args as any), params: args.params ? { ...args.params } : undefined } - if (result.data && typeof args === 'object' && typeof args.url === 'string') { - const url = args.url + const url = request.url + const isDashboard = url?.startsWith('/dashboard') && url !== '/dashboard/filter-options' - // Match /dashboard/* but exclude /dashboard/filter-options - const shouldTranslate = - url.startsWith('/dashboard') && !url.startsWith('/dashboard/filter-options') + // Build mapping dictionaries from organizations map in state + const orgMapPre = (api.getState() as any).api.queries['getOrganizationsMap(undefined)']?.data ?? [] + if (Array.isArray(orgMapPre) && orgMapPre.length) { + valueToSap = {} + sapToValue = {} + orgMapPre.forEach((org: OrganizationMap) => { + valueToSap[org.value] = org.sap_code + sapToValue[org.sap_code] = org.value + }) + } - if (shouldTranslate) { - // Get cached organization map data - const orgMap = - api.getState().api.queries['getOrganizationsMap(undefined)']?.data ?? [] + // === Translate REQUEST (value -> sap_code) === + if (isDashboard) { + // ✅ Case 1: params object exists + if (request.params?.organization_code) { + const mapped = String(request.params.organization_code) + .split(',') + .map((o) => valueToSap[o] ?? o) + .join(',') + request.params = { ...request.params, organization_code: mapped } + } else if (url.includes('organization_code=')) { + const u = new URL(url, 'http://dummy') + const orgs = u.searchParams.get('organization_code')?.split(',') ?? [] + const mapped = orgs.map((o) => valueToSap[o] ?? o) + u.searchParams.set('organization_code', mapped.join(',')) + request.url = u.pathname + '?' + u.searchParams.toString() + } + } - if (orgMap.length > 0) { - // Build a fast lookup table for translation - const orgLookup = Object.fromEntries( - orgMap.map((org: OrganizationMap) => [org.value, org.sap_code || org.value]) - ) - // Helper: recursively find and translate organization_code - const translateOrgCode = (obj: any): any => { - if (Array.isArray(obj)) return obj.map(translateOrgCode) - if (obj && typeof obj === 'object') { - const newObj: Record = {} - for (const [key, val] of Object.entries(obj)) { - if (key === 'organization_code' && typeof val === 'string') { - // ✅ Find by sap_code and replace with its value - const mappedOrg = orgMap.find((org: any) => org.sap_code === val) - newObj[key] = mappedOrg?.value || val - } else { - newObj[key] = translateOrgCode(val) - } - } - return newObj + // 2️⃣ Do the request + const result = await rawBaseQuery(request, api, extraOptions) + const orgMap = (api.getState() as any).api.queries['getOrganizationsMap(undefined)']?.data ?? [] + const translateOrgCode = (obj: any): any => { + if (Array.isArray(obj)) return obj.map(translateOrgCode) + if (obj && typeof obj === 'object') { + const newObj: Record = {} + for (const [key, val] of Object.entries(obj)) { + if (key === 'organization_code' && typeof val === 'string') { + const mappedOrg = orgMap.find((org: any) => org.sap_code === val) + newObj[key] = mappedOrg?.value || val + } else { + newObj[key] = translateOrgCode(val) + } } - return obj + return newObj + } + return obj } - result.data = translateOrgCode(result.data) - } - } + // 3️⃣ Translate RESPONSE (sap_code -> value) + if (isDashboard && result.data) { + result.data = translateOrgCode(result.data) } return result } export const api = createApi({ - baseQuery, + baseQuery: translatedBaseQuery, endpoints: (builder) => ({ login: builder.mutation<{ user: User;