From 6e34eede4b81217ab7c759169fe550f6289a1a39 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 7 Apr 2026 16:01:13 +0700 Subject: [PATCH 1/2] refactor(FE-jumlah-pakai-zero-restriction): Update validation message for qty in StockObjectSchema --- .gitignore | 3 +++ .../pages/production/recording/form/RecordingForm.schema.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e47b8ec3..9e1fadc8 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,6 @@ next-env.d.ts # claude .claude + +# rtk +rtk.exe diff --git a/src/components/pages/production/recording/form/RecordingForm.schema.ts b/src/components/pages/production/recording/form/RecordingForm.schema.ts index 2a78ffe0..e4cf7a49 100644 --- a/src/components/pages/production/recording/form/RecordingForm.schema.ts +++ b/src/components/pages/production/recording/form/RecordingForm.schema.ts @@ -71,7 +71,7 @@ const StockObjectSchema: Yup.ObjectSchema = Yup.object({ .typeError('Produk harus berupa angka!'), qty: Yup.number() .required('Jumlah penggunaan wajib diisi!') - .min(1, 'Jumlah penggunaan tidak boleh 0!') + .moreThan(0, 'Jumlah penggunaan harus lebih dari 0!') .typeError('Jumlah penggunaan harus berupa angka!'), }); From b89730ab68a28c72c73475a3afd022b779326d8b Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 7 Apr 2026 16:06:46 +0700 Subject: [PATCH 2/2] feat(FE-invalidate-mutation): Refactor SWR keys for recording detail pages and add cache invalidation --- src/app/production/recording/detail/edit/page.tsx | 7 +++++-- src/app/production/recording/detail/page.tsx | 7 +++++-- .../pages/production/recording/form/RecordingForm.tsx | 6 ++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/app/production/recording/detail/edit/page.tsx b/src/app/production/recording/detail/edit/page.tsx index ad6c6a9a..aa5f1f46 100644 --- a/src/app/production/recording/detail/edit/page.tsx +++ b/src/app/production/recording/detail/edit/page.tsx @@ -11,10 +11,13 @@ const RecordingEdit = () => { const searchParams = useSearchParams(); const recordingId = searchParams.get('recordingId'); + const recordingDetailKey = recordingId + ? ['recording-detail', recordingId] + : null; const { data: recording, isLoading: isLoadingRecording } = useSWR( - recordingId, - (id: string) => RecordingApi.getSingle(parseInt(id)) + recordingDetailKey, + ([, id]: [string, string]) => RecordingApi.getSingle(parseInt(id)) ); if (!recordingId) { diff --git a/src/app/production/recording/detail/page.tsx b/src/app/production/recording/detail/page.tsx index 194365a3..136c4283 100644 --- a/src/app/production/recording/detail/page.tsx +++ b/src/app/production/recording/detail/page.tsx @@ -11,10 +11,13 @@ const RecordingDetail = () => { const searchParams = useSearchParams(); const recordingId = searchParams.get('recordingId'); + const recordingDetailKey = recordingId + ? ['recording-detail', recordingId] + : null; const { data: recording, isLoading: isLoadingRecording } = useSWR( - recordingId, - (id: string) => RecordingApi.getSingle(parseInt(id)) + recordingDetailKey, + ([, id]: [string, string]) => RecordingApi.getSingle(parseInt(id)) ); if (!recordingId) { diff --git a/src/components/pages/production/recording/form/RecordingForm.tsx b/src/components/pages/production/recording/form/RecordingForm.tsx index 0ac34983..2a044874 100644 --- a/src/components/pages/production/recording/form/RecordingForm.tsx +++ b/src/components/pages/production/recording/form/RecordingForm.tsx @@ -4,7 +4,7 @@ import { useMemo, useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { useFormik } from 'formik'; -import useSWR from 'swr'; +import useSWR, { useSWRConfig } from 'swr'; import { Icon } from '@iconify/react'; import Button from '@/components/Button'; @@ -183,6 +183,7 @@ const productionStandardColumns: ColumnDef[] = [ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { // ===== HOOKS & ROUTER ===== const router = useRouter(); + const { mutate } = useSWRConfig(); // ===== STATE MANAGEMENT ===== const [selectedRecordDate, setSelectedRecordDate] = useState( @@ -319,11 +320,12 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { setRecordingFormErrorMessage(res.message); return; } + await mutate(['recording-detail', recordingId.toString()]); toast.success(res?.message as string); router.refresh(); router.push('/production/recording'); }, - [router] + [mutate, router] ); const deleteRecordingClickHandler = useCallback(() => {