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)/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) => { 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 = {} 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) => { 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 }) 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/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 +} 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