From d679b5b54e760a5327835d76c34c5a1fd3f78a26 Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Wed, 21 Jan 2026 11:15:57 +0700 Subject: [PATCH 1/5] fix: show 'Umum' activity and fix select all phase bug --- .../pages/daily-checklist/DailyChecklistContent.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/figma-make/components/pages/daily-checklist/DailyChecklistContent.tsx b/src/figma-make/components/pages/daily-checklist/DailyChecklistContent.tsx index 314381fd..5ed0dd0c 100644 --- a/src/figma-make/components/pages/daily-checklist/DailyChecklistContent.tsx +++ b/src/figma-make/components/pages/daily-checklist/DailyChecklistContent.tsx @@ -51,7 +51,7 @@ const CATEGORIES = [ { value: 'produksi_close', label: 'Produksi Close' }, ]; -const TIME_TYPE_ORDER = ['umum', 'pagi', 'siang', 'sore', 'malam']; +const TIME_TYPE_ORDER = ['Umum', 'Pagi', 'Siang', 'Sore', 'Malam']; const TIME_TYPE_LABELS: { [key: string]: string } = { Umum: 'Umum', Pagi: 'Pagi', @@ -777,7 +777,7 @@ export function DailyChecklistContent() { return; } - toast.success('Draft tersimpan otomatis'); + toast.success('Draft tersimpan!'); }; // Filter functions @@ -825,7 +825,7 @@ export function DailyChecklistContent() { // Group activities by time_type within this phase phaseActivities.forEach((activity) => { - const timeType = activity.time_type || 'umum'; + const timeType = activity.time_type || 'Umum'; if (!grouped[phase.id].timeGroups[timeType]) { grouped[phase.id].timeGroups[timeType] = []; @@ -1084,6 +1084,7 @@ export function DailyChecklistContent() { (phaseId) => { const phaseData = groupActivitiesByPhase()[phaseId]; const { phase, timeGroups } = phaseData; + const timeTypes = Object.keys(timeGroups).sort( (a, b) => TIME_TYPE_ORDER.indexOf(a) - @@ -1440,7 +1441,9 @@ export function DailyChecklistContent() { if (isAllPhasesSelected) { setTempSelectedPhaseIds([]); } else { - setTempSelectedPhaseIds(availablePhases.map((p) => p.id)); + setTempSelectedPhaseIds( + availablePhases.map((p) => String(p.id)) + ); } }} className='checkbox-clean' From 4b2e00d91ac0b178b9532f7c13f6fc5bacc8b889 Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Wed, 21 Jan 2026 11:16:50 +0700 Subject: [PATCH 2/5] chore: reorder activities in the correct order --- .../list-daily-checklist/detail/DetailDailyChecklistContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/figma-make/components/pages/list-daily-checklist/detail/DetailDailyChecklistContent.tsx b/src/figma-make/components/pages/list-daily-checklist/detail/DetailDailyChecklistContent.tsx index a867c29d..0b3ece27 100644 --- a/src/figma-make/components/pages/list-daily-checklist/detail/DetailDailyChecklistContent.tsx +++ b/src/figma-make/components/pages/list-daily-checklist/detail/DetailDailyChecklistContent.tsx @@ -389,7 +389,7 @@ export function DetailDailyChecklistContent() { } = {}; phaseData.activities.forEach((activityData) => { - const timeType = activityData.time_type || 'umum'; + const timeType = activityData.time_type || 'Umum'; if (!timeGroups[timeType]) { timeGroups[timeType] = { activities: [] }; From 248d4f75d8096dbd3395b887342ac7b703e3332c Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Wed, 21 Jan 2026 12:36:40 +0700 Subject: [PATCH 3/5] chore: rename daily checklist submenu to 'Formulir' --- src/config/constant.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/constant.ts b/src/config/constant.ts index 98283c7b..eb271b9b 100644 --- a/src/config/constant.ts +++ b/src/config/constant.ts @@ -28,7 +28,7 @@ export const MAIN_DRAWER_LINKS: SidebarMenuItem[] = [ permission: ['lti.daily_checklist.dashboard.list'], }, { - text: 'Daily Checklist', + text: 'Formulir', link: '/daily-checklist/daily-checklist', icon: 'lucide:clipboard-check', permission: ['lti.daily_checklist.create'], From 0dbcb83c54a4af5eaad674b1afd70f3db9427412 Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Wed, 21 Jan 2026 12:37:53 +0700 Subject: [PATCH 4/5] feat: set default value for date, kandang ID, and category from url query --- .../daily-checklist/DailyChecklistContent.tsx | 276 +++++++++++------- 1 file changed, 176 insertions(+), 100 deletions(-) diff --git a/src/figma-make/components/pages/daily-checklist/DailyChecklistContent.tsx b/src/figma-make/components/pages/daily-checklist/DailyChecklistContent.tsx index 5ed0dd0c..9b2b6bf2 100644 --- a/src/figma-make/components/pages/daily-checklist/DailyChecklistContent.tsx +++ b/src/figma-make/components/pages/daily-checklist/DailyChecklistContent.tsx @@ -41,6 +41,7 @@ import { PhaseActivity } from '@/types/api/daily-checklist/phase-activity'; import DebouncedTextArea from '@/components/input/DebouncedTextArea'; import DropFileInput from '@/components/input/DropFileInput'; import Link from 'next/link'; +import { useRouter, useSearchParams, usePathname } from 'next/navigation'; import { Icon } from '@iconify/react'; // Static categories @@ -67,7 +68,23 @@ interface Phase { } export function DailyChecklistContent() { - const [kandangId, setKandangId] = useState(''); + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + + const [kandangId, setKandangId] = useState( + searchParams.get('kandang_id') || '' + ); + const [date, setDate] = useState(() => { + const paramDate = searchParams.get('date'); + if (paramDate) return paramDate; + + const today = new Date(); + return today.toISOString().split('T')[0]; + }); + const [selectedCategory, setSelectedCategory] = useState( + searchParams.get('category') || '' + ); const { options: kandangOptions, isLoadingOptions: isLoadingKandangs } = useSelect(KandangApi.basePath, 'id', 'name', 'search', { @@ -104,12 +121,6 @@ export function DailyChecklistContent() { ? employeesRes.data || [] : []; - const [date, setDate] = useState(() => { - const today = new Date(); - return today.toISOString().split('T')[0]; - }); - - const [selectedCategory, setSelectedCategory] = useState(''); const [selectedPhaseIds, setSelectedPhaseIds] = useState([]); const [selectedEmployees, setSelectedEmployees] = useState< @@ -118,7 +129,7 @@ export function DailyChecklistContent() { const [dailyChecklistId, setDailyChecklistId] = useState(null); const [checklistStatus, setChecklistStatus] = useState('DRAFT'); - const [isEditMode, setIsEditMode] = useState(false); + // const [isEditMode, setIsEditMode] = useState(false); // Activities grouped by phase const [activitiesByPhase, setActivitiesByPhase] = useState<{ @@ -148,13 +159,57 @@ export function DailyChecklistContent() { const [searchAbk, setSearchAbk] = useState(''); const [searchPhase, setSearchPhase] = useState(''); - const [loading, setLoading] = useState(false); + const [isLoadingSubmit, setIsLoadingSubmit] = useState(false); + const [isLoadingDraft, setIsLoadingDraft] = useState(false); const [initialLoading, setInitialLoading] = useState(true); const [existingDocuments, setExistingDocuments] = useState([]); const [documents, setDocuments] = useState([]); const [deletedDocumentIds, setDeletedDocumentIds] = useState([]); + // Sync state to URL query params + useEffect(() => { + const params = new URLSearchParams(searchParams.toString()); + let pendingUpdate = false; + + // Sync date + if (date) { + if (params.get('date') !== date) { + params.set('date', date); + pendingUpdate = true; + } + } else if (params.has('date')) { + params.delete('date'); + pendingUpdate = true; + } + + // Sync kandang_id + if (kandangId) { + if (params.get('kandang_id') !== kandangId) { + params.set('kandang_id', kandangId); + pendingUpdate = true; + } + } else if (params.has('kandang_id')) { + params.delete('kandang_id'); + pendingUpdate = true; + } + + // Sync category + if (selectedCategory) { + if (params.get('category') !== selectedCategory) { + params.set('category', selectedCategory); + pendingUpdate = true; + } + } else if (params.has('category')) { + params.delete('category'); + pendingUpdate = true; + } + + if (pendingUpdate) { + router.replace(`${pathname}?${params.toString()}`); + } + }, [date, kandangId, selectedCategory, pathname, router, searchParams]); + // Format date for display const formatDateForDisplay = (dateStr: string) => { if (!dateStr) return 'Pilih tanggal'; @@ -179,7 +234,7 @@ export function DailyChecklistContent() { if (!date || !kandangId || !selectedCategory) { setDailyChecklistId(null); setChecklistStatus('DRAFT'); - setIsEditMode(false); + // setIsEditMode(false); setSelectedPhaseIds([]); setActivitiesByPhase({}); setTaskIdsByPhaseActivityId({}); @@ -216,7 +271,7 @@ export function DailyChecklistContent() { existingPhases.data.phases.length > 0 ) { // Existing checklist - EDIT MODE - setIsEditMode(true); + // setIsEditMode(true); const phaseIds = existingPhases.data.phases.map((p) => String(p.phase_id) ); @@ -234,7 +289,7 @@ export function DailyChecklistContent() { } } else { // New checklist - CREATE MODE - setIsEditMode(false); + // setIsEditMode(false); setSelectedPhaseIds([]); } } catch (error) { @@ -608,7 +663,7 @@ export function DailyChecklistContent() { // taskId, // hasTaskId: !!taskId, // checklistStatus, - // isEditable, + // isChecklistStatusDraft, // }); if (!taskId) { @@ -618,7 +673,7 @@ export function DailyChecklistContent() { return; } - if (!isEditable) { + if (!isChecklistStatusDraft) { console.warn( '[CHECKBOX] Checklist is not editable, status:', checklistStatus @@ -736,7 +791,7 @@ export function DailyChecklistContent() { return; } - setLoading(true); + setIsLoadingSubmit(true); try { const submitRes = await DailyChecklistApi.submit( @@ -757,13 +812,15 @@ export function DailyChecklistContent() { console.error('Error submitting:', error); toast.error('Terjadi kesalahan'); } finally { - setLoading(false); + setIsLoadingSubmit(false); } }; const handleSaveDraft = async () => { if (!dailyChecklistId) return; + setIsLoadingDraft(true); + const uploadImageRes = await DailyChecklistApi.uploadImage( Number(dailyChecklistId), 'DRAFT', @@ -774,9 +831,11 @@ export function DailyChecklistContent() { if (isResponseError(uploadImageRes)) { console.error('Error saving draft:', uploadImageRes.message); toast.error('Gagal menyimpan draft'); + setIsLoadingDraft(false); return; } + setIsLoadingDraft(false); toast.success('Draft tersimpan!'); }; @@ -838,7 +897,7 @@ export function DailyChecklistContent() { return grouped; }; - const isEditable = checklistStatus === 'DRAFT'; + const isChecklistStatusDraft = checklistStatus === 'DRAFT'; if (initialLoading) { return ( @@ -871,7 +930,7 @@ export function DailyChecklistContent() {

Daily Checklist

- {isEditMode && ( + {isChecklistStatusDraft && ( @@ -921,7 +980,7 @@ export function DailyChecklistContent() {