From 789e4f84f17d5b66fb3bbc3e550e486a103e7541 Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Mon, 8 Jun 2026 12:12:22 +0800 Subject: [PATCH 1/6] fix: kurangi paddingHorizontal card carousel di halaman utama agar label Pengumuman tidak terpotong di iPhone --- components/home/carouselHome2.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/components/home/carouselHome2.tsx b/components/home/carouselHome2.tsx index 8381596..0bed747 100644 --- a/components/home/carouselHome2.tsx +++ b/components/home/carouselHome2.tsx @@ -67,9 +67,8 @@ export default function CaraouselHome2({ refreshing }: { refreshing: boolean }) From 9dc4d8dc8d761378a02ca2081773e1ee7b693d1c Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Mon, 8 Jun 2026 14:42:27 +0800 Subject: [PATCH 2/6] fix: perbaiki parseDate agar case-insensitive sehingga urutan tanggal notifikasi benar --- app/(application)/notification.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/(application)/notification.tsx b/app/(application)/notification.tsx index 6346a4b..d8e2fa3 100644 --- a/app/(application)/notification.tsx +++ b/app/(application)/notification.tsx @@ -84,7 +84,7 @@ export default function Notification() { } const parseDate = (str: string) => { const [d, m, y] = str.split(' ') - return new Date(Number(y), BULAN[m] ?? 0, Number(d)).getTime() + return new Date(Number(y), BULAN[m?.toUpperCase()] ?? 0, Number(d)).getTime() } const groups: Record = {} From 2cf5c8d96010a4dbe62f3f5cc75d95e7558702b6 Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Mon, 8 Jun 2026 16:26:26 +0800 Subject: [PATCH 3/6] feat: tambah fitur pilih semua pada modal pilih divisi Menambahkan baris "Pilih Semua" / "Batalkan Semua" di atas list pada ModalSelectMultiple untuk kedua kategori choose-division dan share-division. --- components/modalSelectMultiple.tsx | 75 ++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/components/modalSelectMultiple.tsx b/components/modalSelectMultiple.tsx index ebebbd7..2d8b628 100644 --- a/components/modalSelectMultiple.tsx +++ b/components/modalSelectMultiple.tsx @@ -128,6 +128,35 @@ export default function ModalSelectMultiple({ open, close, title, category, choo }; + const groupsWithDivisions = data.filter((group: any) => group.Division?.length > 0) + const isAllSelected = category === 'choose-division' + ? groupsWithDivisions.length > 0 && groupsWithDivisions.every((group: any) => + checked[group.id]?.length === group.Division?.length + ) + : data.length > 0 && selectedDivision.length === data.length + + const handleSelectAll = () => { + if (category === 'choose-division') { + if (isAllSelected) { + setChecked({}) + } else { + const newChecked: CheckedState = {} + data.forEach((group: any) => { + if (group.Division?.length > 0) { + newChecked[group.id] = group.Division.map((d: any) => d.id) + } + }) + setChecked(newChecked) + } + } else { + if (isAllSelected) { + setSelectedDivision([]) + } else { + setSelectedDivision(data.map((d: any) => ({ id: d.id, name: d.name }))) + } + } + } + const handleSubmit = () => { if (category == "choose-division") { const selectedGroups: GroupData[] = []; @@ -154,25 +183,32 @@ export default function ModalSelectMultiple({ open, close, title, category, choo { category == 'share-division' ? <> - { - data.map((item: any, index: number) => { - return ( - { - handleDivisionClick(index) - }}> - {item.name} - { - selectedDivision.some((i: any) => i.id == item.id) - ? - : <> - } - - ) - }) - } + + {isAllSelected ? 'Batalkan Semua' : 'Pilih Semua'} + {isAllSelected && } + + {data.map((item: any, index: number) => { + return ( + { + handleDivisionClick(index) + }}> + {item.name} + { + selectedDivision.some((i: any) => i.id == item.id) + ? + : <> + } + + ) + })} : - data.map((item: any, index: number) => { + <> + + {isAllSelected ? 'Batalkan Semua' : 'Pilih Semua'} + {isAllSelected && } + + {data.map((item: any, index: number) => { return ( { handleGroupCheck(item.id) }}> @@ -199,7 +235,8 @@ export default function ModalSelectMultiple({ open, close, title, category, choo } ) - }) + })} + } @@ -207,4 +244,4 @@ export default function ModalSelectMultiple({ open, close, title, category, choo ) -} \ No newline at end of file +} From c979a6802814fe842c600a9a060b0fa4902d2e83 Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Mon, 8 Jun 2026 16:43:59 +0800 Subject: [PATCH 4/6] feat: tambah fitur pilih semua pada halaman pilih anggota kegiatan & tugas --- .../task/[detail]/add-member.tsx | 25 +++++++++++++++++++ .../(fitur-division)/task/create/member.tsx | 24 ++++++++++++++++++ app/(application)/project/[id]/add-member.tsx | 25 +++++++++++++++++++ app/(application)/project/create/member.tsx | 24 ++++++++++++++++++ 4 files changed, 98 insertions(+) diff --git a/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-member.tsx b/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-member.tsx index d212b12..8739115 100644 --- a/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-member.tsx +++ b/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-member.tsx @@ -74,6 +74,22 @@ export default function AddMemberTask() { } } + const availableData = data.filter((item: any) => !dataOld.some((i: any) => i.idUser == item.idUser)) + const isAllSelected = availableData.length > 0 && availableData.every((item: any) => + selectMember.some((s: any) => s.idUser == item.idUser) + ) + + function handleSelectAll() { + if (isAllSelected) { + setSelectMember([]) + } else { + const newMembers = availableData + .filter((item: any) => !selectMember.some((s: any) => s.idUser == item.idUser)) + .map((item: any) => ({ idUser: item.idUser, name: item.name, img: item.img })) + setSelectMember([...selectMember, ...newMembers]) + } + } + async function handleAddMember() { try { setLoading(true) @@ -159,6 +175,15 @@ export default function AddMemberTask() { showsVerticalScrollIndicator={false} > + {availableData.length > 0 && ( + + {isAllSelected ? 'Batalkan Semua' : 'Pilih Semua'} + {isAllSelected && } + + )} { data.length > 0 ? data.map((item: any, index: any) => { diff --git a/app/(application)/division/[id]/(fitur-division)/task/create/member.tsx b/app/(application)/division/[id]/(fitur-division)/task/create/member.tsx index 1567d06..eefb79d 100644 --- a/app/(application)/division/[id]/(fitur-division)/task/create/member.tsx +++ b/app/(application)/division/[id]/(fitur-division)/task/create/member.tsx @@ -54,6 +54,21 @@ export default function AddMemberCreateTask() { } } + const isAllSelected = data.length > 0 && data.every((item: any) => + selectMember.some((s: any) => s.idUser == item.idUser) + ) + + function handleSelectAll() { + if (isAllSelected) { + setSelectMember([]) + } else { + const newMembers = data + .filter((item: any) => !selectMember.some((s: any) => s.idUser == item.idUser)) + .map((item: any) => ({ idUser: item.idUser, name: item.name, img: item.img })) + setSelectMember([...selectMember, ...newMembers]) + } + } + async function handleAddMember() { try { dispatch(setMemberChoose(selectMember)) @@ -127,6 +142,15 @@ export default function AddMemberCreateTask() { showsVerticalScrollIndicator={false} > + {data.length > 0 && ( + + {isAllSelected ? 'Batalkan Semua' : 'Pilih Semua'} + {isAllSelected && } + + )} { data.length > 0 ? data.map((item: any, index: any) => { diff --git a/app/(application)/project/[id]/add-member.tsx b/app/(application)/project/[id]/add-member.tsx index 10af1ab..4aaddaa 100644 --- a/app/(application)/project/[id]/add-member.tsx +++ b/app/(application)/project/[id]/add-member.tsx @@ -78,6 +78,22 @@ export default function AddMemberProject() { } } + const availableData = data.filter((item: any) => !dataOld.some((i: any) => i.idUser == item.id)) + const isAllSelected = availableData.length > 0 && availableData.every((item: any) => + selectMember.some((s: any) => s.idUser == item.id) + ) + + function handleSelectAll() { + if (isAllSelected) { + setSelectMember([]) + } else { + const newMembers = availableData + .filter((item: any) => !selectMember.some((s: any) => s.idUser == item.id)) + .map((item: any) => ({ idUser: item.id, name: item.name, img: item.img })) + setSelectMember([...selectMember, ...newMembers]) + } + } + async function handleAddMember() { try { setLoading(true) @@ -160,6 +176,15 @@ export default function AddMemberProject() { showsVerticalScrollIndicator={false} style={[Styles.h100, { backgroundColor: colors.background }]} > + {availableData.length > 0 && ( + + {isAllSelected ? 'Batalkan Semua' : 'Pilih Semua'} + {isAllSelected && } + + )} { data.length > 0 ? diff --git a/app/(application)/project/create/member.tsx b/app/(application)/project/create/member.tsx index fbba5a1..170b3d6 100644 --- a/app/(application)/project/create/member.tsx +++ b/app/(application)/project/create/member.tsx @@ -61,6 +61,21 @@ export default function AddMemberCreateProject() { } } + const isAllSelected = data.length > 0 && data.every((item: any) => + selectMember.some((s: any) => s.idUser == item.id) + ) + + function handleSelectAll() { + if (isAllSelected) { + setSelectMember([]) + } else { + const newMembers = data + .filter((item: any) => !selectMember.some((s: any) => s.idUser == item.id)) + .map((item: any) => ({ idUser: item.id, name: item.name, img: item.img })) + setSelectMember([...selectMember, ...newMembers]) + } + } + async function handleAddMember() { try { dispatch(setMemberChoose(selectMember)) @@ -134,6 +149,15 @@ export default function AddMemberCreateProject() { style={[Styles.h100, Styles.flex1, { backgroundColor: colors.background }]} > + {data.length > 0 && ( + + {isAllSelected ? 'Batalkan Semua' : 'Pilih Semua'} + {isAllSelected && } + + )} { data.length > 0 ? data.map((item: any, index: any) => { From a5c58d0de231b88cccdcd6cfffc8085ef1fffc4e Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Mon, 8 Jun 2026 16:49:16 +0800 Subject: [PATCH 5/6] feat: tambah fitur pilih semua pada halaman pilih anggota divisi --- .../division/[id]/add-member.tsx | 27 +++++++++++++++++- .../division/create/add-member.tsx | 28 +++++++++++++++++-- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/app/(application)/division/[id]/add-member.tsx b/app/(application)/division/[id]/add-member.tsx index 1b172c4..ad8205f 100644 --- a/app/(application)/division/[id]/add-member.tsx +++ b/app/(application)/division/[id]/add-member.tsx @@ -77,6 +77,22 @@ export default function AddMemberDivision() { } } + const availableData = data.filter((item: any) => !dataOld.some((i: any) => i.idUser == item.id)) + const isAllSelected = availableData.length > 0 && availableData.every((item: any) => + selectMember.some((s: any) => s.idUser == item.id) + ) + + function handleSelectAll() { + if (isAllSelected) { + setSelectMember([]) + } else { + const newMembers = availableData + .filter((item: any) => !selectMember.some((s: any) => s.idUser == item.id)) + .map((item: any) => ({ idUser: item.id, name: item.name, img: item.img })) + setSelectMember([...selectMember, ...newMembers]) + } + } + async function handleAddMember() { try { setLoading(true) @@ -141,7 +157,7 @@ export default function AddMemberDivision() { selectMember.length > 0 ? - + { selectMember.map((item: any, index: any) => ( + {availableData.length > 0 && ( + + {isAllSelected ? 'Batalkan Semua' : 'Pilih Semua'} + {isAllSelected && } + + )} { data.length > 0 ? data.map((item: any, index: any) => { diff --git a/app/(application)/division/create/add-member.tsx b/app/(application)/division/create/add-member.tsx index 4af4c87..715373b 100644 --- a/app/(application)/division/create/add-member.tsx +++ b/app/(application)/division/create/add-member.tsx @@ -9,8 +9,8 @@ import Styles from "@/constants/Styles"; import { apiGetUser } from "@/lib/api"; import { setFormCreateDivision } from "@/lib/divisionCreate"; import { useAuthSession } from "@/providers/AuthProvider"; -import { AntDesign } from "@expo/vector-icons"; import { useTheme } from "@/providers/ThemeProvider"; +import { AntDesign } from "@expo/vector-icons"; import { router, Stack, useLocalSearchParams } from "expo-router"; import { useEffect, useState } from "react"; import { Pressable, ScrollView, View } from "react-native"; @@ -55,6 +55,21 @@ export default function CreateDivisionAddMember() { } } + const isAllSelected = data.length > 0 && data.every((item: any) => + selectMember.some((s: any) => s.idUser == item.id) + ) + + function handleSelectAll() { + if (isAllSelected) { + setSelectMember([]) + } else { + const newMembers = data + .filter((item: any) => !selectMember.some((s: any) => s.idUser == item.id)) + .map((item: any) => ({ idUser: item.id, name: item.name, img: item.img })) + setSelectMember([...selectMember, ...newMembers]) + } + } + async function handleAddMember() { dispatch(setFormCreateDivision({ ...update, member: selectMember })) router.push(`./add-admin-division`) @@ -93,7 +108,7 @@ export default function CreateDivisionAddMember() { selectMember.length > 0 ? - + { selectMember.map((item: any, index: any) => ( + {data.length > 0 && ( + + {isAllSelected ? 'Batalkan Semua' : 'Pilih Semua'} + {isAllSelected && } + + )} { data.length > 0 ? data.map((item: any, index: any) => { From ae96a79b69f98ef1487e4a2a1f730946d12cab9c Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Mon, 8 Jun 2026 17:26:11 +0800 Subject: [PATCH 6/6] upd: tampilan jarak antar section pada fitur detail kegiatan dan detail tugas divisi --- components/itemSectionTanggalTugas.tsx | 2 +- components/project/sectionFile.tsx | 2 +- components/project/sectionMember.tsx | 2 +- components/project/sectionTanggalTugas.tsx | 6 +++--- components/task/sectionFileTask.tsx | 2 +- components/task/sectionMemberTask.tsx | 2 +- components/task/sectionTanggalTugasTask.tsx | 6 +++--- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/components/itemSectionTanggalTugas.tsx b/components/itemSectionTanggalTugas.tsx index 423a94c..d4b84fb 100644 --- a/components/itemSectionTanggalTugas.tsx +++ b/components/itemSectionTanggalTugas.tsx @@ -97,7 +97,7 @@ export default function ItemSectionTanggalTugas({ status, title, dateStart, date borderWidth: 1, borderColor: colors.icon + '18', backgroundColor: colors.card, - marginBottom: 10, + marginBottom: 0, }} > {/* Accent bar kiri */} diff --git a/components/project/sectionFile.tsx b/components/project/sectionFile.tsx index 58cf85b..1f062e7 100644 --- a/components/project/sectionFile.tsx +++ b/components/project/sectionFile.tsx @@ -127,7 +127,7 @@ export default function SectionFile({ status, member, refreshing }: { status: nu <> - File + File {loading ? ( diff --git a/components/project/sectionMember.tsx b/components/project/sectionMember.tsx index 5a4dd99..e7aae90 100644 --- a/components/project/sectionMember.tsx +++ b/components/project/sectionMember.tsx @@ -74,7 +74,7 @@ export default function SectionMember({ status, refreshing }: { status: number | return ( <> - + Anggota {!loading && data.length > 0 && ( {data.length} orang diff --git a/components/project/sectionTanggalTugas.tsx b/components/project/sectionTanggalTugas.tsx index 21534ad..dd2e1c4 100644 --- a/components/project/sectionTanggalTugas.tsx +++ b/components/project/sectionTanggalTugas.tsx @@ -174,9 +174,9 @@ export default function SectionTanggalTugasProject({ status, member, refreshing, return ( <> - - Tanggal & Tugas - + + Tanggal & Tugas + {loading ? arrSkeleton.map((_, index) => ) : data.length > 0 diff --git a/components/task/sectionFileTask.tsx b/components/task/sectionFileTask.tsx index 8fa002e..8e82d54 100644 --- a/components/task/sectionFileTask.tsx +++ b/components/task/sectionFileTask.tsx @@ -153,7 +153,7 @@ export default function SectionFileTask({ refreshing, isMemberDivision }: { refr <> - File + File {loading ? ( {arrSkeleton.map((_, index) => ( diff --git a/components/task/sectionMemberTask.tsx b/components/task/sectionMemberTask.tsx index 54209b7..8d6948e 100644 --- a/components/task/sectionMemberTask.tsx +++ b/components/task/sectionMemberTask.tsx @@ -100,7 +100,7 @@ export default function SectionMemberTask({ refreshing, isAdminDivision }: { ref return ( <> - + Anggota {!loading && data.length > 0 && ( {data.length} orang diff --git a/components/task/sectionTanggalTugasTask.tsx b/components/task/sectionTanggalTugasTask.tsx index 9783abf..22a3381 100644 --- a/components/task/sectionTanggalTugasTask.tsx +++ b/components/task/sectionTanggalTugasTask.tsx @@ -172,9 +172,9 @@ export default function SectionTanggalTugasTask({ refreshing, isMemberDivision, return ( <> - - Tanggal & Tugas - + + Tanggal & Tugas + {loading ? arrSkeleton.map((_, index) => ) : data.length > 0