From 6f9481c7c90662f17cd3345d12e93e0a7891027a Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Wed, 10 Dec 2025 17:35:15 +0800 Subject: [PATCH] Fix QC ( Ayu ) Fix: - modified: app/(application)/(user)/event/[id]/publish.tsx - modified: app/(application)/(user)/event/create.tsx - modified: app/(application)/(user)/portofolio/[id]/create.tsx - modified: app/(application)/(user)/portofolio/[id]/edit.tsx - modified: app/(application)/admin/collaboration/[id]/group.tsx - modified: app/(application)/admin/collaboration/group.tsx - modified: app/(application)/admin/collaboration/publish.tsx - modified: app/(application)/admin/forum/[id]/list-report-comment.tsx - modified: app/(application)/admin/forum/[id]/list-report-posting.tsx - modified: app/(application)/admin/forum/posting.tsx - modified: app/(application)/admin/forum/report-comment.tsx - modified: app/(application)/admin/forum/report-posting.tsx - modified: app/(application)/admin/voting/[status]/status.tsx - modified: app/(application)/admin/voting/history.tsx - modified: components/Select/SelectCustom.tsx - modified: components/_ShareComponent/GridSpan_4_8.tsx - modified: screens/Authentication/LoginView.tsx - modified: screens/Collaboration/BoxPublishSection.tsx - modified: screens/Event/BoxDetailPublishSection.tsx - modified: screens/Home/topFeatureSection.tsx - modified: screens/Portofolio/ButtonCreatePortofolio.tsx Add: - app/(application)/admin/app-information/business-field/[id]/bidang-update.tsx - app/(application)/admin/app-information/business-field/[id]/sub-bidang-update.tsx ### No Issue --- app.config.js | 2 +- app/(application)/(user)/home.tsx | 8 +- .../(user)/portofolio/[id]/create.tsx | 14 +- .../business-field/[id]/bidang-update.tsx | 129 ++++++++++++++ .../business-field/[id]/index.tsx | 161 ++++++++++-------- .../business-field/[id]/sub-bidang-update.tsx | 135 +++++++++++++++ .../app-information/business-field/create.tsx | 122 +++++++++++-- .../admin/app-information/index.tsx | 2 +- app/(application)/admin/super-admin/index.tsx | 2 +- app/(application)/admin/user-access/index.tsx | 6 +- .../_ShareComponent/GridSpan_NewComponent.tsx | 2 +- ios/HIPMIBadungConnect/Info.plist | 2 +- screens/Authentication/LoginView.tsx | 4 +- screens/Home/topFeatureSection.tsx | 2 +- service/api-admin/api-master-admin.ts | 32 +++- 15 files changed, 512 insertions(+), 111 deletions(-) create mode 100644 app/(application)/admin/app-information/business-field/[id]/bidang-update.tsx create mode 100644 app/(application)/admin/app-information/business-field/[id]/sub-bidang-update.tsx diff --git a/app.config.js b/app.config.js index 65702a1..3d7d71c 100644 --- a/app.config.js +++ b/app.config.js @@ -19,7 +19,7 @@ export default { "NSLocationWhenInUseUsageDescription": "Aplikasi membutuhkan akses lokasi untuk menampilkan peta.", }, associatedDomains: ["applinks:cld-dkr-staging-hipmi.wibudev.com"], - buildNumber: "13", + buildNumber: "14", }, android: { diff --git a/app/(application)/(user)/home.tsx b/app/(application)/(user)/home.tsx index 645280a..de34524 100644 --- a/app/(application)/(user)/home.tsx +++ b/app/(application)/(user)/home.tsx @@ -19,7 +19,7 @@ export default function Application() { const { token, user, userData } = useAuth(); const [data, setData] = useState(); const [refreshing, setRefreshing] = useState(false); - console.log("[User] >>", JSON.stringify(user?.id, null, 2)) + console.log("[User] >>", JSON.stringify(user?.id, null, 2)); // ‼️ Untuk cek apakah: 1. user ada, 2. user punya profile, 3. accept temrs of forum nya ada atau tidak useFocusEffect( @@ -32,7 +32,10 @@ export default function Application() { async function onLoadData() { const response = await apiUser(user?.id as string); - console.log("[Profile ID]>>", JSON.stringify(response?.data?.Profile?.id, null, 2)); + console.log( + "[Profile ID]>>", + JSON.stringify(response?.data?.Profile?.id, null, 2) + ); setData(response.data); } @@ -81,6 +84,7 @@ export default function Application() { ), headerRight: () => ( { - onLoadMaster(); - onLoadMasterSubBidangBisnis(); - }, []); + useFocusEffect( + useCallback(() => { + onLoadMaster(); + onLoadMasterSubBidangBisnis(); + }, []) + ); const onLoadMaster = async () => { try { diff --git a/app/(application)/admin/app-information/business-field/[id]/bidang-update.tsx b/app/(application)/admin/app-information/business-field/[id]/bidang-update.tsx new file mode 100644 index 0000000..7ba25d4 --- /dev/null +++ b/app/(application)/admin/app-information/business-field/[id]/bidang-update.tsx @@ -0,0 +1,129 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + BoxButtonOnFooter, + ButtonCustom, + StackCustom, + TextCustom, + TextInputCustom, + ViewWrapper, +} from "@/components"; +import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { MainColor } from "@/constants/color-palet"; +import { + apiAdminMasterBusinessFieldById, + apiAdminMasterBusinessFieldUpdate, +} from "@/service/api-admin/api-master-admin"; +import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; +import { useCallback, useState } from "react"; +import { Switch } from "react-native-paper"; +import Toast from "react-native-toast-message"; + +export default function AdminAppInformation_BusinessFieldDetail() { + const { id } = useLocalSearchParams(); + const [data, setData] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + useFocusEffect( + useCallback(() => { + onLoadDetail(); + }, [id]) + ); + + const onLoadDetail = async () => { + try { + const response = await apiAdminMasterBusinessFieldById({ + id: id as string, + category: "bidang" + }); + + setData(response.data); + } catch (error) { + console.log("[ERROR]", error); + setData(null); + } + }; + + const handlerSubmit = async () => { + if (!data.name) { + Toast.show({ + type: "error", + text1: "Lengkapi Data", + }); + return; + } + + try { + setIsLoading(true); + const response = await apiAdminMasterBusinessFieldUpdate({ + id: id as string, + data: data, + category: "bidang", + }); + + if (!response.success) { + Toast.show({ + type: "error", + text1: "Gagal update data", + }); + return; + } + + Toast.show({ + type: "success", + text1: "Data berhasil di update", + }); + router.back(); + } catch (error) { + console.log(error); + } finally { + setIsLoading(false); + } + }; + + const buttonSubmit = ( + + handlerSubmit()} + > + Update + + + ); + return ( + <> + + + + + setData({ ...data, name: value })} + /> + + + Status + + setData({ ...data, active: value })} + /> + + + + + ); +} diff --git a/app/(application)/admin/app-information/business-field/[id]/index.tsx b/app/(application)/admin/app-information/business-field/[id]/index.tsx index 4a36a61..968167a 100644 --- a/app/(application)/admin/app-information/business-field/[id]/index.tsx +++ b/app/(application)/admin/app-information/business-field/[id]/index.tsx @@ -1,22 +1,22 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { - BoxButtonOnFooter, - ButtonCustom, + ActionIcon, + BaseBox, + CenterCustom, + LoaderCustom, + Spacing, StackCustom, TextCustom, - TextInputCustom, ViewWrapper, } from "@/components"; +import { IconEdit } from "@/components/_Icon"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent"; import { MainColor } from "@/constants/color-palet"; -import { - apiAdminMasterBusinessFieldById, - apiAdminMasterBusinessFieldUpdate, -} from "@/service/api-admin/api-master-admin"; +import { apiAdminMasterBusinessFieldById } from "@/service/api-admin/api-master-admin"; import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import { useCallback, useState } from "react"; -import { Switch } from "react-native-paper"; -import Toast from "react-native-toast-message"; +import { Divider } from "react-native-paper"; export default function AdminAppInformation_BusinessFieldDetail() { const { id } = useLocalSearchParams(); @@ -33,8 +33,11 @@ export default function AdminAppInformation_BusinessFieldDetail() { try { const response = await apiAdminMasterBusinessFieldById({ id: id as string, + category: "all", }); + console.log("Response >>", JSON.stringify(response, null, 2)); + setData(response.data); } catch (error) { console.log("[ERROR]", error); @@ -42,73 +45,89 @@ export default function AdminAppInformation_BusinessFieldDetail() { } }; - const handlerSubmit = async () => { - if (!data.name) { - Toast.show({ - type: "error", - text1: "Lengkapi Data", - }); - return; - } - - try { - setIsLoading(true); - const response = await apiAdminMasterBusinessFieldUpdate({ - id: id as string, - data: data, - }); - - if (!response.success) { - Toast.show({ - type: "error", - text1: "Gagal update data", - }); - return; - } - - Toast.show({ - type: "success", - text1: "Data berhasil di update", - }); - router.back(); - } catch (error) { - console.log(error); - } finally { - setIsLoading(false); - } - }; - - const buttonSubmit = ( - - handlerSubmit()} - > - Update - - - ); return ( <> - + - + - setData({ ...data, name: value })} - /> + {!data ? ( + + ) : ( + + Nama Bidang + + + + + Status: {data?.bidang?.active ? "Aktif" : "Tidak Aktif"} + + + {data?.bidang?.name} + + } + text2={ + + } + onPress={() => + router.push( + `/admin/app-information/business-field/${id}/bidang-update` + ) + } + /> + + } + /> + + + {/* */} + - Status Aktivasi - setData({ ...data, active: value })} - /> + Sub Bidang Bisnis + + + {data?.subBidang?.map((item: any, index: number) => ( + + + + Status: {item?.isActive ? "Aktif" : "Tidak Aktif"} + + + + {item.name} + + } + text2={ + + + } + onPress={() => + router.push( + `/admin/app-information/business-field/${item?.id}/sub-bidang-update` + ) + } + /> + + } + /> + + + ))} + + )} + + {/* {JSON.stringify(data, null, 2)} */} diff --git a/app/(application)/admin/app-information/business-field/[id]/sub-bidang-update.tsx b/app/(application)/admin/app-information/business-field/[id]/sub-bidang-update.tsx new file mode 100644 index 0000000..9710891 --- /dev/null +++ b/app/(application)/admin/app-information/business-field/[id]/sub-bidang-update.tsx @@ -0,0 +1,135 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + BoxButtonOnFooter, + ButtonCustom, + StackCustom, + TextCustom, + TextInputCustom, + ViewWrapper, +} from "@/components"; +import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { MainColor } from "@/constants/color-palet"; +import { + apiAdminMasterBusinessFieldById, + apiAdminMasterBusinessFieldUpdate, +} from "@/service/api-admin/api-master-admin"; +import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; +import { useCallback, useState } from "react"; +import { Switch } from "react-native-paper"; +import Toast from "react-native-toast-message"; + +export default function AdminAppInformation_BusinessFieldDetail() { + const { id } = useLocalSearchParams(); + const [data, setData] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + useFocusEffect( + useCallback(() => { + onLoadDetail(); + }, [id]) + ); + + const onLoadDetail = async () => { + try { + const response = await apiAdminMasterBusinessFieldById({ + id: id as string, + category: "sub-bidang", + subBidangId: id as string, + }); + + console.log("Response >>", JSON.stringify(response, null, 2)); + + + + + setData(response.data); + } catch (error) { + console.log("[ERROR]", error); + setData(null); + } + }; + + const handlerSubmit = async () => { + if (!data.name) { + Toast.show({ + type: "error", + text1: "Lengkapi Data", + }); + return; + } + + try { + setIsLoading(true); + const response = await apiAdminMasterBusinessFieldUpdate({ + id: id as string, + data: data, + category: "sub-bidang", + }); + + if (!response.success) { + Toast.show({ + type: "error", + text1: "Gagal update data", + }); + return; + } + + Toast.show({ + type: "success", + text1: "Data berhasil di update", + }); + router.back(); + } catch (error) { + console.log(error); + } finally { + setIsLoading(false); + } + }; + + const buttonSubmit = ( + + handlerSubmit()} + > + Update + + + ); + return ( + <> + + + + + setData({ ...data, name: value })} + /> + + + Status + + setData({ ...data, isActive: value })} + /> + + + + + ); +} diff --git a/app/(application)/admin/app-information/business-field/create.tsx b/app/(application)/admin/app-information/business-field/create.tsx index 9a77a91..5c8f487 100644 --- a/app/(application)/admin/app-information/business-field/create.tsx +++ b/app/(application)/admin/app-information/business-field/create.tsx @@ -1,40 +1,81 @@ import { - BoxButtonOnFooter, - ButtonCustom, - StackCustom, - TextInputCustom, - ViewWrapper, + ActionIcon, + BoxButtonOnFooter, + ButtonCustom, + CenterCustom, + Grid, + Spacing, + StackCustom, + TextInputCustom, + ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { MainColor } from "@/constants/color-palet"; +import { ICON_SIZE_XLARGE } from "@/constants/constans-value"; import { apiAdminMasterBusinessFieldCreate } from "@/service/api-admin/api-master-admin"; +import { Ionicons } from "@expo/vector-icons"; import { router } from "expo-router"; +import _ from "lodash"; import { useState } from "react"; +import { View } from "react-native"; +import { Divider } from "react-native-paper"; import Toast from "react-native-toast-message"; export default function AdminAppInformation_BusinessFieldCreate() { - const [data, setData] = useState({ + const [isLoading, setIsLoading] = useState(false); + const [bidang, setBidang] = useState({ name: "", }); - const [isLoading, setIsLoading] = useState(false); + const [subBidang, setSubBidang] = useState([ + { + name: "", + }, + ]); const handlerSubmit = async () => { - if (!data.name) { + if (!bidang.name) { Toast.show({ type: "error", text1: "Lengkapi Data", }); return; } + + if (subBidang[0].name === "") { + Toast.show({ + type: "error", + text1: "Lengkapi Sub Bidang", + }); + return; + } + try { setIsLoading(true); - const response = await apiAdminMasterBusinessFieldCreate({ data: data }); + + const newData = { + bidang: bidang, + subBidang: subBidang, + }; + + console.log("[DATA]", newData); + + const response = await apiAdminMasterBusinessFieldCreate({ + data: newData, + }); + + console.log("[RESPONSE]", response); if (response.success) { Toast.show({ type: "success", text1: "Data berhasil di tambah", }); - router.back(); + // router.back(); + } else { + Toast.show({ + type: "error", + text1: "Gagal tambah data", + }); } } catch (error) { console.log("[ERROR]", error); @@ -50,6 +91,7 @@ export default function AdminAppInformation_BusinessFieldCreate() { const buttonSubmit = ( handlerSubmit()} isLoading={isLoading} > @@ -60,16 +102,70 @@ export default function AdminAppInformation_BusinessFieldCreate() { return ( <> - + setData({ ...data, name: value })} + value={bidang.name} + onChangeText={(value) => setBidang({ ...bidang, name: value })} /> + + + + + {subBidang.map((item, index) => ( + { + const list = _.clone(subBidang); + list[index].name = value; + setSubBidang(list); + }} + /> + ))} + + + + { + setSubBidang([...subBidang, { name: "" }]); + }} + icon={ + + } + size="xl" + /> + { + const list = _.clone(subBidang); + list.pop(); + setSubBidang(list); + }} + icon={ + + } + size="xl" + /> + + diff --git a/app/(application)/admin/app-information/index.tsx b/app/(application)/admin/app-information/index.tsx index 66212ff..7bc697e 100644 --- a/app/(application)/admin/app-information/index.tsx +++ b/app/(application)/admin/app-information/index.tsx @@ -75,7 +75,7 @@ const listPage = [ }, { id: "2", - label: "Bidang Bisnis", + label: "Bidang & Sub Bidang", value: "business", }, { diff --git a/app/(application)/admin/super-admin/index.tsx b/app/(application)/admin/super-admin/index.tsx index bea4a71..6dde028 100644 --- a/app/(application)/admin/super-admin/index.tsx +++ b/app/(application)/admin/super-admin/index.tsx @@ -76,7 +76,7 @@ export default function SuperAdmin_ListUser() { } component2={ - + Username } diff --git a/app/(application)/admin/user-access/index.tsx b/app/(application)/admin/user-access/index.tsx index 8a7f877..cc837d9 100644 --- a/app/(application)/admin/user-access/index.tsx +++ b/app/(application)/admin/user-access/index.tsx @@ -73,11 +73,7 @@ export default function AdminUserAccess() { Aksi } - component2={ - - Username - - } + component2={Username} component3={ Status Akses diff --git a/components/_ShareComponent/GridSpan_NewComponent.tsx b/components/_ShareComponent/GridSpan_NewComponent.tsx index c17fd81..b294933 100644 --- a/components/_ShareComponent/GridSpan_NewComponent.tsx +++ b/components/_ShareComponent/GridSpan_NewComponent.tsx @@ -22,7 +22,7 @@ export const GridSpan_NewComponent = ({ style={{ justifyContent: "flex-start", paddingRight: 5, - paddingLeft: 5, + paddingLeft: 3, }} > {text1} diff --git a/ios/HIPMIBadungConnect/Info.plist b/ios/HIPMIBadungConnect/Info.plist index c092a48..a51442f 100644 --- a/ios/HIPMIBadungConnect/Info.plist +++ b/ios/HIPMIBadungConnect/Info.plist @@ -39,7 +39,7 @@ CFBundleVersion - 13 + 14 ITSAppUsesNonExemptEncryption LSMinimumSystemVersion diff --git a/screens/Authentication/LoginView.tsx b/screens/Authentication/LoginView.tsx index 3aa2fff..c80833d 100644 --- a/screens/Authentication/LoginView.tsx +++ b/screens/Authentication/LoginView.tsx @@ -134,10 +134,10 @@ export default function LoginView() { if (token && token !== "" && isAdmin) { // Akan di aktifkan jika sudah losos review - return ; + // return ; // Sementara gunakan ini - // return ; + return ; } return ( diff --git a/screens/Home/topFeatureSection.tsx b/screens/Home/topFeatureSection.tsx index 90664c1..8befc82 100644 --- a/screens/Home/topFeatureSection.tsx +++ b/screens/Home/topFeatureSection.tsx @@ -15,7 +15,7 @@ export default function Home_FeatureSection() { name: "Collaboration", icon: , onPress: () => router.push("/(application)/(user)/collaboration/(tabs)"), - status: "active", + status: "inactive", }, { name: "Voting", diff --git a/service/api-admin/api-master-admin.ts b/service/api-admin/api-master-admin.ts index 4932dbf..cc668bc 100644 --- a/service/api-admin/api-master-admin.ts +++ b/service/api-admin/api-master-admin.ts @@ -60,10 +60,20 @@ export async function apiAdminMasterBusinessField() { } } -export async function apiAdminMasterBusinessFieldById({ id }: { id: string }) { +export async function apiAdminMasterBusinessFieldById({ + id, + subBidangId, + category, +}: { + id: string; + subBidangId?: string | null; + category: "bidang" | "sub-bidang" | "all"; +}) { + const queryCategory = category ? `?category=${category}` : ""; + const querySubBidang = subBidangId ? `&subBidangId=${subBidangId}` : ""; try { const response = await apiConfig.get( - `/mobile/admin/master/business-field/${id}` + `/mobile/admin/master/business-field/${id}${queryCategory}${querySubBidang}` ); return response.data; } catch (error) { @@ -74,13 +84,15 @@ export async function apiAdminMasterBusinessFieldById({ id }: { id: string }) { export async function apiAdminMasterBusinessFieldUpdate({ id, data, + category, }: { id: string; data: any; + category: "bidang" | "sub-bidang"; }) { try { const response = await apiConfig.put( - `/mobile/admin/master/business-field/${id}`, + `/mobile/admin/master/business-field/${id}?category=${category}`, { data: data, } @@ -179,7 +191,11 @@ export async function apiAdminMasterDonationCategory() { } } -export async function apiAdminMasterDonationCategoryById({ id }: { id: string }) { +export async function apiAdminMasterDonationCategoryById({ + id, +}: { + id: string; +}) { try { const response = await apiConfig.get(`/mobile/admin/master/donation/${id}`); return response.data; @@ -208,7 +224,11 @@ export async function apiAdminMasterDonationCategoryUpdate({ } } -export async function apiAdminMasterDonationCategoryCreate({ data }: { data: any }) { +export async function apiAdminMasterDonationCategoryCreate({ + data, +}: { + data: any; +}) { try { const response = await apiConfig.post(`/mobile/admin/master/donation`, { data: data, @@ -219,4 +239,4 @@ export async function apiAdminMasterDonationCategoryCreate({ data }: { data: any } } -// ================== END DONATION ================== // \ No newline at end of file +// ================== END DONATION ================== //