diff --git a/app/(application)/division/[id]/(fitur-division)/task/[detail]/index.tsx b/app/(application)/division/[id]/(fitur-division)/task/[detail]/index.tsx index 2e9eb93..d4ac8f3 100644 --- a/app/(application)/division/[id]/(fitur-division)/task/[detail]/index.tsx +++ b/app/(application)/division/[id]/(fitur-division)/task/[detail]/index.tsx @@ -26,6 +26,7 @@ type Props = { reason: string status: number isActive: boolean + idGroup: string } export default function DetailTaskDivision() { @@ -159,7 +160,7 @@ export default function DetailTaskDivision() { } - + diff --git a/app/(application)/project/[id]/index.tsx b/app/(application)/project/[id]/index.tsx index 9fe7b47..a57d685 100644 --- a/app/(application)/project/[id]/index.tsx +++ b/app/(application)/project/[id]/index.tsx @@ -150,7 +150,7 @@ export default function DetailProject() { } - + diff --git a/components/ModalRiwayatApproval.tsx b/components/ModalRiwayatApproval.tsx index 3cc8523..0dbd256 100644 --- a/components/ModalRiwayatApproval.tsx +++ b/components/ModalRiwayatApproval.tsx @@ -33,13 +33,7 @@ function ApprovalStatusBadge({ status }: { status: number }) { : { label: 'Menunggu', color: '#FFA94D' } return ( - + {config.label} @@ -79,16 +73,10 @@ export default function ModalRiwayatApproval({ isVisible, setVisible, data, load data.map((item, index) => ( {/* Status + tanggal */} - + {item.createdAt} @@ -97,15 +85,15 @@ export default function ModalRiwayatApproval({ isVisible, setVisible, data, load {/* Pengaju */} - - Diajukan Oleh: + + Diajukan Oleh: {item.submitter.name} {/* Approver */} - - Disetujui Oleh: + + Disetujui Oleh: {item.approver?.name ?? '-'} @@ -113,16 +101,11 @@ export default function ModalRiwayatApproval({ isVisible, setVisible, data, load {/* Catatan penolakan */} {item.note && ( - - + + Alasan Penolakan - + {item.note} @@ -130,7 +113,7 @@ export default function ModalRiwayatApproval({ isVisible, setVisible, data, load )) ) : ( - + Belum ada riwayat persetujuan )} diff --git a/components/home/carouselHome.tsx b/components/home/carouselHome.tsx index 80c5e20..a0aed3c 100644 --- a/components/home/carouselHome.tsx +++ b/components/home/carouselHome.tsx @@ -36,7 +36,7 @@ export default function CaraouselHome({ refreshing }: { refreshing: boolean }) { async function handleUser() { const hasil = await decryptToken(String(token?.current)) const response = await apiGetProfile({ id: hasil }) - dispatch(setEntityUser({ role: response.data.idUserRole, admin: false, isApprover: response.data.isApprover ?? false })) + dispatch(setEntityUser({ role: response.data.idUserRole, admin: false, isApprover: response.data.isApprover ?? false, idGroup: response.data.idGroup ?? '' })) } useEffect(() => { diff --git a/components/home/carouselHome2.tsx b/components/home/carouselHome2.tsx index 501385f..8381596 100644 --- a/components/home/carouselHome2.tsx +++ b/components/home/carouselHome2.tsx @@ -59,7 +59,7 @@ export default function CaraouselHome2({ refreshing }: { refreshing: boolean }) // Sync User Role to Redux useEffect(() => { if (profile) { - dispatch(setEntityUser({ role: profile.idUserRole, admin: false, isApprover: profile.isApprover ?? false })) + dispatch(setEntityUser({ role: profile.idUserRole, admin: false, isApprover: profile.isApprover ?? false, idGroup: profile.idGroup ?? '' })) } }, [profile, dispatch]) diff --git a/components/project/sectionTanggalTugas.tsx b/components/project/sectionTanggalTugas.tsx index 19483f6..21534ad 100644 --- a/components/project/sectionTanggalTugas.tsx +++ b/components/project/sectionTanggalTugas.tsx @@ -39,7 +39,7 @@ type ApprovalRecord = { createdAt: string } -export default function SectionTanggalTugasProject({ status, member, refreshing }: { status: number | undefined, member: boolean, refreshing?: boolean }) { +export default function SectionTanggalTugasProject({ status, member, refreshing, idGroup }: { status: number | undefined, member: boolean, refreshing?: boolean, idGroup: string }) { const { colors } = useTheme(); const entityUser = useSelector((state: any) => state.user) const dispatch = useDispatch() @@ -61,7 +61,7 @@ export default function SectionTanggalTugasProject({ status, member, refreshing const [tugas, setTugas] = useState({ id: '', status: 0 }) const [showDeleteModal, setShowDeleteModal] = useState(false) - const isApprover = entityUser.isApprover || ['supadmin', 'developer'].includes(entityUser.role) + const isApprover = (entityUser.isApprover && entityUser.idGroup === idGroup) || ['supadmin', 'developer'].includes(entityUser.role) const isAdmin = entityUser.role !== 'user' && entityUser.role !== 'coadmin' async function handleLoad(loading: boolean) { diff --git a/components/task/sectionTanggalTugasTask.tsx b/components/task/sectionTanggalTugasTask.tsx index 5a4e013..9783abf 100644 --- a/components/task/sectionTanggalTugasTask.tsx +++ b/components/task/sectionTanggalTugasTask.tsx @@ -38,7 +38,7 @@ type ApprovalRecord = { createdAt: string } -export default function SectionTanggalTugasTask({ refreshing, isMemberDivision, isAdminDivision, status }: { refreshing: boolean, isMemberDivision: boolean, isAdminDivision: boolean, status?: number }) { +export default function SectionTanggalTugasTask({ refreshing, isMemberDivision, isAdminDivision, status, idGroup }: { refreshing: boolean, isMemberDivision: boolean, isAdminDivision: boolean, status?: number, idGroup: string }) { const { colors } = useTheme() const dispatch = useDispatch() const entityUser = useSelector((state: any) => state.user); @@ -60,7 +60,7 @@ export default function SectionTanggalTugasTask({ refreshing, isMemberDivision, const [tugas, setTugas] = useState({ id: '', status: 0 }) const [showDeleteModal, setShowDeleteModal] = useState(false) - const isApprover = entityUser.isApprover || ['supadmin', 'developer'].includes(entityUser.role) + const isApprover = (entityUser.isApprover && entityUser.idGroup === idGroup) || ['supadmin', 'developer'].includes(entityUser.role) const isAdmin = entityUser.role !== 'user' && entityUser.role !== 'coadmin' const canTakeAction = isMemberDivision || isAdmin diff --git a/constants/styles/approval.styles.ts b/constants/styles/approval.styles.ts new file mode 100644 index 0000000..17254dc --- /dev/null +++ b/constants/styles/approval.styles.ts @@ -0,0 +1,13 @@ +import { StyleSheet } from "react-native"; + +const ApprovalStyles = StyleSheet.create({ + approvalBadge: { borderRadius: 20, paddingHorizontal: 10, paddingVertical: 3, alignSelf: 'flex-start' }, + approvalItem: { borderWidth: 1, borderRadius: 10, padding: 12, marginBottom: 10 }, + approvalItemHeader: { justifyContent: 'space-between', marginBottom: 8 }, + approvalIconMr: { marginRight: 6 }, + approvalNoteBox: { borderRadius: 8, padding: 8, marginTop: 4 }, + approvalNoteLabel: { marginBottom: 2 }, + approvalEmptyText: { textAlign: 'center' }, +}); + +export default ApprovalStyles; diff --git a/constants/styles/index.ts b/constants/styles/index.ts index 2047cc0..226f46c 100644 --- a/constants/styles/index.ts +++ b/constants/styles/index.ts @@ -10,6 +10,7 @@ import ModalStyles from './modal.styles'; import HeaderStyles from './header.styles'; import ComponentStyles from './component.styles'; import NotificationStyles from './notification.styles'; +import ApprovalStyles from './approval.styles'; const Styles = StyleSheet.create({ ...SpacingStyles, @@ -23,6 +24,7 @@ const Styles = StyleSheet.create({ ...HeaderStyles, ...ComponentStyles, ...NotificationStyles, + ...ApprovalStyles, }); export default Styles;