From 856c054deb24c08e7d38a8b063452bbe05985ab8 Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 20 May 2025 17:31:58 +0800 Subject: [PATCH] upd: division Deskripsi: - load data all division - search data all division - filter data division - user role pada halaman division No Issues --- app/(application)/division/index.tsx | 267 +++++++++++++++------ app/(application)/profile.tsx | 4 +- components/division/headerDivisionList.tsx | 55 +++-- lib/api.ts | 5 + lib/divisionUpdate.ts | 14 ++ lib/store.ts | 2 + 6 files changed, 244 insertions(+), 103 deletions(-) create mode 100644 lib/divisionUpdate.ts diff --git a/app/(application)/division/index.tsx b/app/(application)/division/index.tsx index 218ceb0..f660987 100644 --- a/app/(application)/division/index.tsx +++ b/app/(application)/division/index.tsx @@ -1,103 +1,210 @@ -import BorderBottomItem from "@/components/borderBottomItem" -import ButtonTab from "@/components/buttonTab" -import InputSearch from "@/components/inputSearch" -import PaperGridContent from "@/components/paperGridContent" -import { ColorsStatus } from "@/constants/ColorsStatus" -import Styles from "@/constants/Styles" -import { AntDesign, Feather, MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons" -import { router, useLocalSearchParams } from "expo-router" -import { useState } from "react" -import { Pressable, SafeAreaView, ScrollView, Text, View } from "react-native" +import BorderBottomItem from "@/components/borderBottomItem"; +import ButtonTab from "@/components/buttonTab"; +import InputSearch from "@/components/inputSearch"; +import PaperGridContent from "@/components/paperGridContent"; +import { ColorsStatus } from "@/constants/ColorsStatus"; +import Styles from "@/constants/Styles"; +import { apiGetDivision } from "@/lib/api"; +import { useAuthSession } from "@/providers/AuthProvider"; +import { + AntDesign, + Feather, + Ionicons, + MaterialCommunityIcons, + MaterialIcons, +} from "@expo/vector-icons"; +import { router, useLocalSearchParams } from "expo-router"; +import { useEffect, useState } from "react"; +import { Pressable, SafeAreaView, ScrollView, Text, View } from "react-native"; +import { useSelector } from "react-redux"; + +type Props = { + id: string; + name: string; + desc: string; + jumlah_member: number; +}; export default function ListDivision() { - const { active } = useLocalSearchParams<{ active?: string }>() - const [isList, setList] = useState(false) + const { active, group, cat } = useLocalSearchParams<{ + active?: string; + group?: string; + cat?: string; + }>(); + const [isList, setList] = useState(false); + const entityUser = useSelector((state: any) => state.user); + const { token, decryptToken } = useAuthSession(); + const [search, setSearch] = useState(""); + const [nameGroup, setNameGroup] = useState(""); + const [data, setData] = useState([]); + + async function handleLoad() { + try { + const hasil = await decryptToken(String(token?.current)); + const response = await apiGetDivision({ + user: hasil, + active: String(active), + search: search, + group: String(group), + kategori: String(cat), + }); + + if (response.success) { + setData(response.data); + setNameGroup(response.filter.name); + } + } catch (error) { + console.error(error); + } + } + + useEffect(() => { + handleLoad(); + }, [active, search, group, cat]); return ( - - { router.push('/division?active=true') }} - label="Aktif" - icon={} - n={2} /> - { router.push('/division?active=false') }} - label="Tidak Aktif" - icon={} - n={2} /> - - - - { setList(!isList) }}> - - - - - Filter : Dinas - { - isList - ? - - { }} - borderType="bottom" + entityUser.role != "user" && entityUser.role != "coadmin" ? + + { + router.replace(`/division?active=true&search=${search}&group=${group}&cat=${cat}`); + }} + label="Aktif" icon={ - - - + } - title="Kasi Pelayanan" - titleWeight="normal" + n={2} /> - { }} - borderType="bottom" + { + router.replace(`/division?active=false&search=${search}&group=${group}&cat=${cat}`); + }} + label="Tidak Aktif" icon={ - - - + } - title="Kaur TU dan Umum" - titleWeight="normal" - /> - { }} - borderType="bottom" - icon={ - - - - } - title="Kasi Pemerintahan" - titleWeight="normal" + n={2} /> : - - - { router.push('/division/234') }} content="page" title="Kaur Pelayanan" headerColor="primary" contentPosition="top"> - Deskripsi Divisi - - { router.push('/division/234') }} content="page" title="Kasi Pemerintahan" headerColor="primary" contentPosition="top"> - Deskripsi Divisi - - { router.push('/division/234') }} content="page" title="Kaur TU dan Umum" headerColor="primary" contentPosition="top"> - Deskripsi Divisi - + + { + router.replace(`/division?&search=${search}&group=${group}&cat=divisi-saya`); + }} + label="Divisi Saya" + icon={ + + } + n={2} + /> + { + router.replace(`/division?&search=${search}&group=${group}&cat=semua`); + }} + label="Semua Divisi" + icon={ + + } + n={2} + /> } + + + { + setList(!isList); + }} + > + + + + {(entityUser.role == "supadmin" || + entityUser.role == "developer") && ( + + Filter : {nameGroup} + + )} + { + data.length == 0 ? ( + + Tidak ada data + + ) : ( + isList ? ( + + {data.map((item, index) => ( + { }} + borderType="bottom" + icon={ + + + + } + title={item.name} + titleWeight="normal" + /> + ))} + + ) : ( + + {data.map((item, index) => ( + { + router.push(`/division/${item.id}`); + }} + content="page" + title={item.name} + headerColor="primary" + contentPosition="top" + > + {item.desc} + + ))} + + ) + ) + } - ) -} \ No newline at end of file + ); +} diff --git a/app/(application)/profile.tsx b/app/(application)/profile.tsx index 7017032..0aff352 100644 --- a/app/(application)/profile.tsx +++ b/app/(application)/profile.tsx @@ -6,7 +6,7 @@ import Styles from "@/constants/Styles"; import { apiGetProfile } from "@/lib/api"; import { setEntities } from "@/lib/entitiesSlice"; import { useAuthSession } from "@/providers/AuthProvider"; -import { Octicons } from "@expo/vector-icons"; +import { AntDesign, Octicons } from "@expo/vector-icons"; import { router, Stack } from "expo-router"; import { useEffect, useState } from "react"; import { Image, SafeAreaView, ScrollView, Text, View } from "react-native"; @@ -40,7 +40,7 @@ export default function Profile() { headerTitleAlign: 'center', headerShadowVisible: false, headerRight: () => } + item={} onPress={() => { AlertKonfirmasi({ title: 'Keluar', diff --git a/components/division/headerDivisionList.tsx b/components/division/headerDivisionList.tsx index 9b18058..71691e8 100644 --- a/components/division/headerDivisionList.tsx +++ b/components/division/headerDivisionList.tsx @@ -1,19 +1,25 @@ +import Styles from "@/constants/Styles" +import { AntDesign, MaterialCommunityIcons } from "@expo/vector-icons" +import { router } from "expo-router" import { useState } from "react" +import { View } from "react-native" +import { useSelector } from "react-redux" import ButtonMenuHeader from "../buttonMenuHeader" import DrawerBottom from "../drawerBottom" -import { View } from "react-native" -import Styles from "@/constants/Styles" import MenuItemRow from "../menuItemRow" -import { AntDesign, MaterialCommunityIcons } from "@expo/vector-icons" import ModalFilter from "../modalFilter" -import { router } from "expo-router" export default function HeaderRightDivisionList() { const [isVisible, setVisible] = useState(false) const [isFilter, setFilter] = useState(false) + const entityUser = useSelector((state: any) => state.user) + return ( <> - { setVisible(true) }} /> + { + entityUser.role != "user" && entityUser.role != "coadmin" && + { setVisible(true) }} /> + } - } - title="Filter" - onPress={() => { - setVisible(false) - setFilter(true) - }} - /> - } - title="Laporan" - onPress={() => { - setVisible(false) - router.push('/division/report') - }} - /> + { + (entityUser.role == "supadmin" || entityUser.role == "developer") && + } + title="Filter" + onPress={() => { + setVisible(false) + setFilter(true) + }} + /> + } + + { + (entityUser.role == "supadmin" || entityUser.role == "developer" || entityUser.role == "cosupadmin") && + } + title="Laporan" + onPress={() => { + setVisible(false) + router.push('/division/report') + }} + /> + } { setFilter(false) }} open={isFilter} page="division" /> diff --git a/lib/api.ts b/lib/api.ts index d1a203f..0f37f54 100644 --- a/lib/api.ts +++ b/lib/api.ts @@ -347,4 +347,9 @@ export const apiCheckFileProject = async ({ data, id }: { data: FormData, id: st export const apiDeleteFileProject = async (data: { user: string }, id: string) => { const response = await api.delete(`/mobile/project/file/${id}`, { data }) return response.data; +}; + +export const apiGetDivision = async ({ user, search, group, kategori, active }: { user: string, search: string, group?: string, kategori?: string, active?: string }) => { + const response = await api.get(`mobile/division?user=${user}&active=${active}&group=${group}&search=${search}&cat=${kategori}`); + return response.data; }; \ No newline at end of file diff --git a/lib/divisionUpdate.ts b/lib/divisionUpdate.ts new file mode 100644 index 0000000..e1caa88 --- /dev/null +++ b/lib/divisionUpdate.ts @@ -0,0 +1,14 @@ +import { createSlice } from '@reduxjs/toolkit'; + +const divisionUpdate = createSlice({ + name: 'divisionUpdate', + initialState: false, + reducers: { + setUpdateDivision: (state, action) => { + return action.payload; + }, + }, +}); + +export const { setUpdateDivision } = divisionUpdate.actions; +export default divisionUpdate.reducer; \ No newline at end of file diff --git a/lib/store.ts b/lib/store.ts index d22690c..aed8bf8 100644 --- a/lib/store.ts +++ b/lib/store.ts @@ -11,6 +11,7 @@ import positionUpdate from './positionSlice'; import projectUpdate from './projectUpdate'; import taskCreate from './taskCreate'; import userReducer from './userSlice'; +import divisionUpdate from './divisionUpdate'; const store = configureStore({ reducer: { @@ -26,6 +27,7 @@ const store = configureStore({ announcementUpdate: announcementUpdate, projectUpdate: projectUpdate, taskCreate: taskCreate, + divisionUpdate: divisionUpdate, } });