# fix
- authentication
- profile
- pencarian user
- forum
## No issue
This commit is contained in:
2024-05-20 10:55:13 +08:00
parent 66b9902d97
commit dbeb740d1f
58 changed files with 1374 additions and 386 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -8,5 +8,5 @@ export async function GET(req: Request) {
skip: +page * 5 - 5, skip: +page * 5 - 5,
}); });
return Response.json(res); // return Response.json(res);
} }

View File

@@ -17,23 +17,19 @@ export default async function Page({ params }: { params: { id: string } }) {
]); ]);
let listMsg = await colab_getMessageByRoomId({ roomId: roomId, page: 1 }); let listMsg = await colab_getMessageByRoomId({ roomId: roomId, page: 1 });
// const listMessage = await colab_V2getListMessageByRoomId({
// roomId: roomId,
// page: 1,
// });
return ( return (
<> <>
{/* <ColabViewChat <ColabViewChat
listMsg={listMsg as any} listMsg={listMsg as any}
dataRoom={dataRoom as any} dataRoom={dataRoom as any}
userLoginId={userLoginId} userLoginId={userLoginId}
/> */} />
<Colab_GroupChatView
{/* <Colab_GroupChatView
userLoginId={userLoginId} userLoginId={userLoginId}
listMsg={listMsg} listMsg={listMsg}
selectRoom={dataRoom as any} selectRoom={dataRoom as any}
/> /> */}
</> </>
); );
} }

View File

@@ -8,9 +8,13 @@ export default async function Page({
children: React.ReactNode; children: React.ReactNode;
params: { id: string }; params: { id: string };
}) { }) {
let eventId = params.id let eventId = params.id;
return <> return (
<LayoutEvent_DetailDraft eventId={eventId}>{children}</LayoutEvent_DetailDraft>; <>
<LayoutEvent_DetailDraft eventId={eventId}>
{children}
</LayoutEvent_DetailDraft>
</> </>
);
} }

View File

@@ -1,8 +1,8 @@
import { Event_DetailDraft } from "@/app_modules/event"; import { Event_DetailDraft } from "@/app_modules/event"
import { Event_getOneById } from "@/app_modules/event/fun/get/get_one_by_id"; import { Event_getOneById } from "@/app_modules/event/fun/get/get_one_by_id"
export default async function Page({params}: {params: {id: string}}) { export default async function Page({ params }: { params: { id: string } }) {
let eventId = params.id let eventId = params.id
const dataEvent = await Event_getOneById(eventId) const dataEvent = await Event_getOneById(eventId)
return <Event_DetailDraft dataEvent={dataEvent as any} />; return <Event_DetailDraft dataEvent={dataEvent as any} />
} }

View File

@@ -8,7 +8,7 @@ import { forum_countPostingByAuthorId } from "@/app_modules/forum/fun/count/coun
export default async function Page({ params }: { params: { id: string } }) { export default async function Page({ params }: { params: { id: string } }) {
const authorId = params.id; const authorId = params.id;
const userLoginId = await user_getOneUserId() const userLoginId = await user_getOneUserId();
const dataAuthor = await user_getOneByUserId(authorId); const dataAuthor = await user_getOneByUserId(authorId);
const auhtorSelectedData = _.omit(dataAuthor, [ const auhtorSelectedData = _.omit(dataAuthor, [
"Profile.email", "Profile.email",
@@ -25,14 +25,11 @@ export default async function Page({ params }: { params: { id: string } }) {
// setTimeout(a, 1000); // setTimeout(a, 1000);
// }); // });
const dataPosting = await forum_getListPostingByAuhtorId(authorId); const dataPosting = await forum_getListPostingByAuhtorId(authorId);
const totalPosting = await forum_countPostingByAuthorId(authorId); const totalPosting = await forum_countPostingByAuthorId(authorId);
return ( return (
<> <>
<Forum_Forumku <Forum_Forumku
auhtorSelectedData={auhtorSelectedData as any} auhtorSelectedData={auhtorSelectedData as any}
dataPosting={dataPosting as any} dataPosting={dataPosting as any}

View File

@@ -1,11 +1,15 @@
import MqttLoader from '@/util/mqtt_loader'; import MqttLoader from "@/util/mqtt_loader";
import RootStyleRegistry from './emotion'; import RootStyleRegistry from "./emotion";
export default function RootLayout({
export default function RootLayout({ children }: { children: React.ReactNode }) { children,
}: {
children: React.ReactNode;
}) {
return ( return (
<RootStyleRegistry> <RootStyleRegistry>
<MqttLoader /> <MqttLoader />
{children}</RootStyleRegistry> {children}
</RootStyleRegistry>
); );
} }

View File

@@ -27,11 +27,13 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob
import { IconPencilCheck } from "@tabler/icons-react"; import { IconPencilCheck } from "@tabler/icons-react";
import { RouterHome } from "@/app/lib/router_hipmi/router_home"; import { RouterHome } from "@/app/lib/router_hipmi/router_home";
import { auth_funEditAktivasiKodeOtpById } from "../fun/fun_edit_aktivasi_kode_otp_by_id"; import { auth_funEditAktivasiKodeOtpById } from "../fun/fun_edit_aktivasi_kode_otp_by_id";
import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input";
export default function Register({ dataOtp }: { dataOtp: any }) { export default function Register({ dataOtp }: { dataOtp: any }) {
const router = useRouter(); const router = useRouter();
const [nomor, setNomor] = useState(dataOtp.nomor); const [nomor, setNomor] = useState(dataOtp.nomor);
const [value, setValue] = useState(""); const [value, setValue] = useState("");
const [isValue, setIsValue] = useState(false);
const focusTrapRef = useFocusTrap(); const focusTrapRef = useFocusTrap();
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
@@ -42,17 +44,12 @@ export default function Register({ dataOtp }: { dataOtp: any }) {
}; };
// console.log(body); // console.log(body);
if (body.username === "") if (body.username === "") {
return ComponentGlobal_NotifikasiPeringatan("Lengkapi Username"); setIsValue(true);
return null;
if (body.username.length < 5) }
return ComponentGlobal_NotifikasiPeringatan("Username tidak sesuai"); if (body.username.length < 5) return null;
if (_.values(body.username).includes(" ")) return null;
if (_.values(body.username).includes(" "))
return ComponentGlobal_NotifikasiPeringatan(
"Username tidak sesuai",
3000
);
await Auth_funRegister(body).then(async (res) => { await Auth_funRegister(body).then(async (res) => {
if (res.status === 200) { if (res.status === 200) {
@@ -92,23 +89,27 @@ export default function Register({ dataOtp }: { dataOtp: any }) {
<Title order={4}>REGISTRASI</Title> <Title order={4}>REGISTRASI</Title>
<Text fz={"xs"}>Masukan username anda !</Text> <Text fz={"xs"}>Masukan username anda !</Text>
</Stack> </Stack>
<Stack spacing={0}> <Stack spacing={"sm"}>
<TextInput <TextInput
ref={focusTrapRef} ref={focusTrapRef}
placeholder="Masukan Username" placeholder="Masukan Username"
maxLength={50}
error={ error={
value.length > 0 && value.length < 5 ? ( value.length > 0 && value.length < 5 ? (
<Text>Minimal 5 karakter</Text> <ComponentGlobal_ErrorInput text="Minimal 5 karakter !" />
) : _.values(value).includes(" ") ? ( ) : _.values(value).includes(" ") ? (
<Stack spacing={0}> <Stack spacing={5}>
<Text>- Tidak boleh ada space</Text> <ComponentGlobal_ErrorInput text="Tidak boleh ada space" />
<Text>- Sambungkan huruf meggunakan karakter _</Text> <ComponentGlobal_ErrorInput text="Sambungkan huruf meggunakan karakter _" />
</Stack> </Stack>
) : isValue ? (
<ComponentGlobal_ErrorInput text="Masukan username anda" />
) : ( ) : (
"" ""
) )
} }
onChange={(val) => { onChange={(val) => {
val.currentTarget.value.length > 0 ? setIsValue(false) : "";
setValue(val.currentTarget.value); setValue(val.currentTarget.value);
}} }}
/> />

View File

@@ -46,6 +46,7 @@ import useInfiniteScroll, {
import toast from "react-simple-toasts"; import toast from "react-simple-toasts";
import colab_getOneMessageById from "../../fun/get/room_chat/get_one_message_by_id"; import colab_getOneMessageById from "../../fun/get/room_chat/get_one_message_by_id";
import { List } from "react-virtualized"; import { List } from "react-virtualized";
import { evnPesan } from "@/util/evn";
const list = Array(100).fill(0); const list = Array(100).fill(0);
export default function ColabViewChat({ export default function ColabViewChat({
@@ -74,23 +75,53 @@ export default function ColabViewChat({
down: false, down: false,
}); });
const [topik, setTopic] = useState("")
useShallowEffect(() => {
evnPesan.on(topik, (msgg) => {
let dd: any[] = _.clone(data);
const a = [...dd, JSON.parse(msgg)];
// console.log(dd.length);
setData(a);
});
}, [data]);
// Kirim pesan // Kirim pesan
async function onSend() { async function onSend() {
await colab_funCreateMessageByUserId(msg, dataRoom.id).then(async (res) => {
if (res.status === 200) {
const newData = await colab_getMessageByRoomId({
roomId: dataRoom?.id,
page: 1,
});
setData(newData as any); // console.log(JSON.stringify(data[0], null, 2));
setHasMore({ up: true }); const kiriman = {
id: "clw8glvt4000j12efrecoubug",
createdAt: "2024-05-15T23:35:05.032Z",
isActive: true,
message: msg,
isFile: false,
User: {
id: "clvag8xt10007134j8sapm46n",
Profile: {
id: "clvajdger000g134jhhhg21c4",
name: "malikkurosaki",
},
},
};
mqtt_client.publish("pesan", JSON.stringify(kiriman));
// await colab_funCreateMessageByUserId(msg, dataRoom.id).then(async (res) => {
// if (res.status === 200) {
// const newData = await colab_getMessageByRoomId({
// roomId: dataRoom?.id,
// page: 1,
// });
// setData(newData as any);
// setHasMore({ up: true });
setMsg(""); setMsg("");
} else { // } else {
ComponentGlobal_NotifikasiGagal(res.message); // ComponentGlobal_NotifikasiGagal(res.message);
} // }
}); // });
} }
const next = async (direction: ScrollDirection) => { const next = async (direction: ScrollDirection) => {
@@ -220,19 +251,19 @@ export default function ColabViewChat({
dangerouslySetInnerHTML={{ __html: e?.message }} dangerouslySetInnerHTML={{ __html: e?.message }}
/> />
{/* <Group spacing={"xs"}> <Group spacing={"xs"}>
<Text fz={7}> <Text fz={7}>
{new Intl.DateTimeFormat("id-ID", { {/* {new Intl.DateTimeFormat("id-ID", {
timeStyle: "medium", timeStyle: "medium",
}).format(e.createdAt)} }).format(e.createdAt)} */}
</Text> </Text>
<IconCircle size={3} /> <IconCircle size={3} />
<Text fz={7}> <Text fz={7}>
{new Intl.DateTimeFormat("id-ID", { {/* {new Intl.DateTimeFormat("id-ID", {
dateStyle: "medium", dateStyle: "medium",
}).format(e.createdAt)} }).format(e.createdAt)} */}
</Text> </Text>
</Group> */} </Group>
</Stack> </Stack>
</Paper> </Paper>
</Group> </Group>
@@ -246,19 +277,19 @@ export default function ColabViewChat({
<div <div
dangerouslySetInnerHTML={{ __html: e?.message }} dangerouslySetInnerHTML={{ __html: e?.message }}
/> />
{/* <Group spacing={"xs"}> <Group spacing={"xs"}>
<Text fz={7}> <Text fz={7}>
{new Intl.DateTimeFormat("id-ID", { {/* {new Intl.DateTimeFormat("id-ID", {
timeStyle: "medium", timeStyle: "medium",
}).format(e.createdAt)} }).format(e.createdAt)} */}
</Text> </Text>
<IconCircle size={3} /> <IconCircle size={3} />
<Text fz={7}> <Text fz={7}>
{new Intl.DateTimeFormat("id-ID", { {/* {new Intl.DateTimeFormat("id-ID", {
dateStyle: "medium", dateStyle: "medium",
}).format(e.createdAt)} }).format(e.createdAt)} */}
</Text> </Text>
</Group> */} </Group>
</Stack> </Stack>
</Paper> </Paper>
</Group> </Group>

View File

@@ -103,9 +103,6 @@ export default function Colab_GroupChatView({
mqtt_client.publish(selectRoom.id, msg); mqtt_client.publish(selectRoom.id, msg);
setMsg(""); setMsg("");
// const d = JSON.parse(JSON.stringify(res.data));
// setData([...data, ...[d]]);
await colab_getOneMessageById({ await colab_getOneMessageById({
messageId: res.data?.id as any, messageId: res.data?.id as any,
}).then((res) => { }).then((res) => {
@@ -114,9 +111,9 @@ export default function Colab_GroupChatView({
// const d = JSON.parse(JSON.stringify(res)); // const d = JSON.parse(JSON.stringify(res));
// setData([...data, ...[d]]); // setData([...data, ...[d]]);
mqtt_client.on("message", (a,b) => { mqtt_client.on("message", (a, b) => {
setData([...data, ...[res]]) setData([...data, ...[res]]);
}) });
}); });
} else { } else {
ComponentGlobal_NotifikasiGagal(res.message); ComponentGlobal_NotifikasiGagal(res.message);

View File

@@ -12,8 +12,8 @@ export default async function colab_getMessageByRoomId({
roomId: string; roomId: string;
page: number; page: number;
}) { }) {
const lewat = page * 10 - 10; const lewat = page * 6 - 6;
const ambil = 10; const ambil = 6;
const getList = await prisma.projectCollaboration_Message.findMany({ const getList = await prisma.projectCollaboration_Message.findMany({
orderBy: { orderBy: {

View File

@@ -0,0 +1,25 @@
"use client";
import { Group, Text } from "@mantine/core";
import { IconAlertTriangle } from "@tabler/icons-react";
export default function ComponentGlobal_ErrorInput({
max,
text,
color,
}: {
max?: number;
text?: string;
color?: string;
}) {
return (
<>
<Group spacing={"xs"}>
<IconAlertTriangle size={15} color={color ? color : "red"} />
<Text fz={10} fs={"italic"} color={color ? color : "red"}>
{text ? text : ` Maksimal ${max ? max : "-"} karakter !`}
</Text>
</Group>
</>
);
}

View File

@@ -0,0 +1,23 @@
"use client";
import { Text } from "@mantine/core";
import { useState } from "react";
export default function ComponentGlobal_InputCountDown({
maxInput,
lengthInput,
}: {
maxInput: number;
lengthInput: number;
}) {
return (
<>
<Text fz={"xs"} fs={"italic"} color="gray">
{maxInput - lengthInput < 0 ? 0 : maxInput - lengthInput} /{" "}
<Text span inherit c={maxInput - lengthInput < 0 ? "red" : ""} style={{transition: "0.5s"}}>
{maxInput}
</Text>
</Text>
</>
);
}

View File

@@ -15,14 +15,14 @@ export default function ComponentEvent_DetailData({
const jam = tgl.toLocaleTimeString([], { const jam = tgl.toLocaleTimeString([], {
hour: "2-digit", hour: "2-digit",
minute: "2-digit", minute: "2-digit",
hour12: false,
}); });
return ( return (
<> <>
{/* <pre>{JSON.stringify(jam)}</pre> */}
<Paper withBorder p={"md"} shadow="lg"> <Paper withBorder p={"md"} shadow="lg">
<Stack px={"sm"}> <Stack px={"sm"}>
<Title order={4}>{data ? data?.title : null}</Title> <Title w={"100%"} order={4}>{data ? data?.title : null}</Title>
<Grid> <Grid>
<Grid.Col span={4}> <Grid.Col span={4}>
<Text fw={"bold"} fz={"sm"}> <Text fw={"bold"} fz={"sm"}>
@@ -52,7 +52,7 @@ export default function ComponentEvent_DetailData({
</Text> </Text>
</Grid.Col> </Grid.Col>
<Grid.Col span={1}>:</Grid.Col> <Grid.Col span={1}>:</Grid.Col>
<Grid.Col span={"auto"}>{hari}</Grid.Col> <Grid.Col span={"auto"}>{hari ? hari : ""}</Grid.Col>
</Grid> </Grid>
<Grid> <Grid>
<Grid.Col span={4}> <Grid.Col span={4}>
@@ -61,7 +61,7 @@ export default function ComponentEvent_DetailData({
</Text> </Text>
</Grid.Col> </Grid.Col>
<Grid.Col span={1}>:</Grid.Col> <Grid.Col span={1}>:</Grid.Col>
<Grid.Col span={"auto"}>{jam}</Grid.Col> <Grid.Col span={"auto"}>{jam ? jam : ""}</Grid.Col>
</Grid> </Grid>
<Stack spacing={2}> <Stack spacing={2}>
<Text fw={"bold"} fz={"sm"}> <Text fw={"bold"} fz={"sm"}>

View File

@@ -1,15 +1,21 @@
"use client" "use client";
import { Group, Text } from "@mantine/core"; import { Group, Text } from "@mantine/core";
import { IconAlertTriangle } from "@tabler/icons-react"; import { IconAlertTriangle } from "@tabler/icons-react";
export default function ComponentEvent_ErrorMaximalInput({max}:{max: number}){ export default function ComponentEvent_ErrorMaximalInput({
max,
text,
}: {
max?: number;
text?: string;
}) {
return ( return (
<> <>
<Group spacing={"xs"}> <Group spacing={"xs"}>
<IconAlertTriangle size={15} /> <IconAlertTriangle size={15} />
<Text fz={10} fs={"italic"}> <Text fz={10} fs={"italic"}>
Maksimal {max} karakter ! {text ? text : ` Maksimal ${max} karakter !`}
</Text> </Text>
</Group> </Group>
</> </>

View File

@@ -15,7 +15,7 @@ export default function ComponentEvent_HeaderTamplate({
bg, bg,
}: { }: {
hideBack?: boolean; hideBack?: boolean;
changeIconBack?: any changeIconBack?: any;
route?: any; route?: any;
route2?: any; route2?: any;
title: string; title: string;
@@ -23,6 +23,8 @@ export default function ComponentEvent_HeaderTamplate({
bg?: any; bg?: any;
}) { }) {
const router = useRouter(); const router = useRouter();
const [isLoadingBack, setLoadingBack] = useState(false);
const [isLoadingOtherIcon, setLoadingOtherIcon] = useState(false);
return ( return (
<> <>
<Header <Header
@@ -35,8 +37,10 @@ export default function ComponentEvent_HeaderTamplate({
<ActionIcon variant="transparent" disabled></ActionIcon> <ActionIcon variant="transparent" disabled></ActionIcon>
) : ( ) : (
<ActionIcon <ActionIcon
loading={isLoadingBack ? true : false}
variant="transparent" variant="transparent"
onClick={() => { onClick={() => {
setLoadingBack(true);
if (route === null || route === undefined) { if (route === null || route === undefined) {
return router.back(); return router.back();
} else { } else {
@@ -44,7 +48,7 @@ export default function ComponentEvent_HeaderTamplate({
} }
}} }}
> >
{changeIconBack ? changeIconBack: <IconChevronLeft />} {changeIconBack ? changeIconBack : <IconChevronLeft />}
</ActionIcon> </ActionIcon>
)} )}
<Title order={5}>{title}</Title> <Title order={5}>{title}</Title>
@@ -54,8 +58,12 @@ export default function ComponentEvent_HeaderTamplate({
} else { } else {
return ( return (
<ActionIcon <ActionIcon
loading={isLoadingOtherIcon ? true : false}
variant="transparent" variant="transparent"
onClick={() => router.push(route2)} onClick={() => {
setLoadingOtherIcon(true);
router.push(route2);
}}
> >
{icon} {icon}
</ActionIcon> </ActionIcon>

View File

@@ -0,0 +1,13 @@
"use client";
import { Center } from "@mantine/core";
export default function ComponentEvent_IsEmptyData({ text }: { text: string }) {
return (
<>
<Center h={"50vh"} fz={"sm"} c="gray" fw={"bold"} style={{zIndex: 1}}>
{text}
</Center>
</>
);
}

View File

@@ -48,23 +48,21 @@ export default function Event_Create({
const [tabsStatus, setTabsStatus] = useAtom(gs_event_status); const [tabsStatus, setTabsStatus] = useAtom(gs_event_status);
const [listTipe, setListTipe] = useState(listTipeAcara); const [listTipe, setListTipe] = useState(listTipeAcara);
const [hotMenu, setHotMenu] = useAtom(gs_event_hotMenu); const [hotMenu, setHotMenu] = useAtom(gs_event_hotMenu);
const [isTime, setIsTime] = useState(false);
// Masimal karakter state const [isLoading, setLoading] = useState(false);
const [maxTitle, setMaxTitle] = useState("");
const [maxLokasi, setMaxLokasi] = useState("");
const [maxDeskripsi, setMaxDeskripsi] = useState("");
const [value, setValue] = useState({ const [value, setValue] = useState({
title: "", title: "",
lokasi: "", lokasi: "",
deskripsi: "", deskripsi: "",
tanggal: Date, tanggal: Date.toString(),
eventMaster_TipeAcaraId: 0, eventMaster_TipeAcaraId: 0,
authorId: authorId, authorId: authorId,
}); });
return ( return (
<> <>
{/* <pre>{JSON.stringify(value, null, 2)}</pre> */}
<Stack px={"sm"}> <Stack px={"sm"}>
<TextInput <TextInput
label="Judul" label="Judul"
@@ -72,21 +70,19 @@ export default function Event_Create({
withAsterisk withAsterisk
maxLength={100} maxLength={100}
error={ error={
maxTitle.length >= 100 ? ( value.title.length >= 100 ? (
<ComponentEvent_ErrorMaximalInput max={100} /> <ComponentEvent_ErrorMaximalInput max={100} />
) : ( ) : (
"" ""
) )
} }
onChange={(val) => { onChange={(val) => {
setMaxTitle(val.target.value);
setValue({ setValue({
...value, ...value,
title: val.target.value, title: val.target.value,
}); });
}} }}
/> />
<Select <Select
withAsterisk withAsterisk
label="Tipe Acara" label="Tipe Acara"
@@ -107,16 +103,15 @@ export default function Event_Create({
label="Lokasi" label="Lokasi"
placeholder="Masukan lokasi acara" placeholder="Masukan lokasi acara"
withAsterisk withAsterisk
maxLength={200} maxLength={100}
error={ error={
maxLokasi.length >= 200 ? ( value.lokasi.length >= 100 ? (
<ComponentEvent_ErrorMaximalInput max={200} /> <ComponentEvent_ErrorMaximalInput max={100} />
) : ( ) : (
"" ""
) )
} }
onChange={(val) => { onChange={(val) => {
setMaxLokasi(val.target.value);
setValue({ setValue({
...value, ...value,
lokasi: val.target.value, lokasi: val.target.value,
@@ -124,48 +119,68 @@ export default function Event_Create({
}} }}
/> />
<DateTimePicker <DateTimePicker
// onClick={() => {
// console.log(moment().diff(moment("2024-02-01"), "days"));
// }}
excludeDate={(date) => { excludeDate={(date) => {
return moment(date).diff(Date.now(), "days") < 0; return moment(date).diff(Date.now(), "days") < 0;
}} }}
withAsterisk withAsterisk
label="Tanggal & Waktu " label="Tanggal & Waktu "
placeholder="Masukan tangal dan waktu acara" placeholder="Masukan tangal dan waktu acara"
onChange={(val: any) => error={
isTime ? (
<ComponentEvent_ErrorMaximalInput text="Invalid Time !" />
) : (
""
)
}
onChange={(val) => {
// console.log(
// moment(val?.toISOString().toString()).diff(moment(), "minutes" )
// );
moment(val?.toISOString().toString()).diff(moment(), "minutes") < 0
? setIsTime(true)
: setIsTime(false);
setValue({ setValue({
...value, ...value,
tanggal: val, tanggal: val as any,
}) });
} }}
/> />
<Textarea <Textarea
label="Deskripsi" label="Deskripsi"
placeholder="Deskripsikan acara yang akan di selenggarakan" placeholder="Deskripsikan acara yang akan di selenggarakan"
withAsterisk withAsterisk
autosize autosize
maxLength={500} maxLength={200}
error={ error={
maxDeskripsi.length >= 500 ? ( value.deskripsi.length >= 200 ? (
<ComponentEvent_ErrorMaximalInput max={500} /> <ComponentEvent_ErrorMaximalInput max={200} />
) : ( ) : (
"" ""
) )
} }
onChange={(val) => { onChange={(val) => {
setMaxDeskripsi(val.target.value);
setValue({ setValue({
...value, ...value,
deskripsi: val.target.value, deskripsi: val.target.value,
}); });
}} }}
/> />
<Button <Button
disabled={
value.title === "" ||
value.lokasi === "" ||
value.deskripsi === "" ||
value.eventMaster_TipeAcaraId === 0 ||
value.tanggal === "function Date() { [native code] }"
}
loaderPosition="center"
loading={isLoading ? true : false}
radius={"xl"} radius={"xl"}
mt={"xl"} mt={"xl"}
onClick={() => onSave(router, setTabsStatus, value, setHotMenu)} onClick={() =>
onSave(router, setTabsStatus, value, setHotMenu, setLoading)
}
> >
Simpan Simpan
</Button> </Button>
@@ -178,19 +193,30 @@ async function onSave(
router: AppRouterInstance, router: AppRouterInstance,
setTabsStatus: any, setTabsStatus: any,
value: any, value: any,
setHotMenu: any setHotMenu: any,
setLoading: any
) { ) {
if (_.values(value).includes("")) if (_.values(value).includes(""))
return ComponentGlobal_NotifikasiPeringatan("Lengkapi Data"); return ComponentGlobal_NotifikasiPeringatan("Lengkapi Data");
if (value.title.length >= 100) return null;
if (value.lokasi.length >= 100) return null;
if (value.eventMaster_TipeAcaraId === 0) if (value.eventMaster_TipeAcaraId === 0)
return ComponentGlobal_NotifikasiPeringatan("Pilih Tipe Acara"); return ComponentGlobal_NotifikasiPeringatan("Pilih Tipe Acara");
if (moment(value.tanggal).format() === "Invalid date") if (moment(value.tanggal).format() === "Invalid date")
return ComponentGlobal_NotifikasiPeringatan("Lengkapi Tanggal"); return ComponentGlobal_NotifikasiPeringatan("Lengkapi Tanggal");
if (
moment(value.tanggal.toISOString().toString()).diff(moment(), "minutes") < 0
)
return null;
if (value.deskripsi.length >= 200) return null;
await Event_funCreate(value).then((res) => { await Event_funCreate(value).then((res) => {
if (res.status === 201) { if (res.status === 201) {
ComponentGlobal_NotifikasiBerhasil(res.message); ComponentGlobal_NotifikasiBerhasil(res.message);
setTabsStatus("Review"); setTabsStatus("Review");
setHotMenu(1); setHotMenu(1);
setLoading(true);
router.push(RouterEvent.status_page); router.push(RouterEvent.status_page);
} else { } else {
ComponentGlobal_NotifikasiGagal(res.message); ComponentGlobal_NotifikasiGagal(res.message);

View File

@@ -1,8 +1,8 @@
"use client"; "use client";
import { Button, Stack } from "@mantine/core"; import { Button, Group, Stack } from "@mantine/core";
import ComponentEvent_DetailData from "../../component/detail/detail_data"; import ComponentEvent_DetailData from "../../component/detail/detail_data";
import { useRouter } from "next/navigation";
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
import { useAtom } from "jotai"; import { useAtom } from "jotai";
import { gs_event_status } from "../../global_state"; import { gs_event_status } from "../../global_state";
@@ -10,52 +10,73 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob
import { MODEL_EVENT } from "../../model/interface"; import { MODEL_EVENT } from "../../model/interface";
import { Event_funEditStatusById } from "../../fun/edit/fun_edit_status_by_id"; import { Event_funEditStatusById } from "../../fun/edit/fun_edit_status_by_id";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
import { useState } from "react"; import React, { useState } from "react";
import ComponentEvent_CatatanReject from "../../component/catatan_reject"; import ComponentEvent_CatatanReject from "../../component/catatan_reject";
import { useRouter } from "next/navigation";
export default function Event_DetailDraft({ export default function Event_DetailDraft({
dataEvent, dataEvent,
}: { }: {
dataEvent: MODEL_EVENT; dataEvent: MODEL_EVENT;
}) { }) {
const router = useRouter();
const [tabsStatus, setTabsStatus] = useAtom(gs_event_status);
return ( return (
<> <>
{/* <pre>{JSON.stringify(dataEvent.catatan)}</pre> */} {/* <pre>{JSON.stringify(dataEvent.catatan)}</pre> */}
<Stack spacing={"lg"}> <Stack spacing={"lg"}>
{dataEvent.catatan ? ( {dataEvent?.catatan ? (
<ComponentEvent_CatatanReject catatan={dataEvent.catatan} /> <ComponentEvent_CatatanReject catatan={dataEvent?.catatan} />
) : ( ) : (
"" ""
)} )}
<ComponentEvent_DetailData data={dataEvent} /> <ComponentEvent_DetailData data={dataEvent} />
<Button <ButtonAction eventId={dataEvent?.id} />
radius={"xl"}
color="yellow"
onClick={() => {
onClick(router, setTabsStatus, dataEvent.id);
}}
>
Ajukan Review
</Button>
</Stack> </Stack>
</> </>
); );
} }
async function onClick( function ButtonAction({ eventId }: { eventId: string }) {
router: AppRouterInstance, const router = useRouter();
setTabsStatus: any, const [tabsStatus, setTabsStatus] = useAtom(gs_event_status);
eventId: string
) { async function onDelete() {
console.log(eventId);
}
async function onAjukan() {
await Event_funEditStatusById("2", eventId).then((res) => { await Event_funEditStatusById("2", eventId).then((res) => {
if (res.status === 200) { if (res.status === 200) {
ComponentGlobal_NotifikasiBerhasil(res.message, 1500); ComponentGlobal_NotifikasiBerhasil(res.message, 2000);
setTabsStatus("Review"); setTabsStatus("Review");
router.back(); router.back();
} else { } else {
ComponentGlobal_NotifikasiGagal(res.message); ComponentGlobal_NotifikasiGagal(res.message);
} }
}); });
}
return (
<>
<Group grow>
<Button
radius={"xl"}
color="yellow"
onClick={() => {
onAjukan();
}}
>
Ajukan Review
</Button>
<Button
radius={"xl"}
color="red"
onClick={() => {
// onClick(router, setTabsStatus, dataEvent.id);
}}
>
Hapus
</Button>
</Group>
</>
);
} }

View File

@@ -22,5 +22,5 @@ export default function LayoutEvent_DetailDraft({
{children} {children}
</AppComponentGlobal_LayoutTamplate> </AppComponentGlobal_LayoutTamplate>
</> </>
); )
} }

View File

@@ -11,6 +11,7 @@ import { MODEL_EVENT } from "../../model/interface";
import { Event_funEditStatusById } from "../../fun/edit/fun_edit_status_by_id"; import { Event_funEditStatusById } from "../../fun/edit/fun_edit_status_by_id";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
import ComponentEvent_CatatanReject from "../../component/catatan_reject"; import ComponentEvent_CatatanReject from "../../component/catatan_reject";
import { useState } from "react";
export default function Event_DetailReview({ export default function Event_DetailReview({
dataEvent, dataEvent,
@@ -19,15 +20,20 @@ export default function Event_DetailReview({
}) { }) {
const router = useRouter(); const router = useRouter();
const [tabsStatus, setTabsStatus] = useAtom(gs_event_status); const [tabsStatus, setTabsStatus] = useAtom(gs_event_status);
const [isLoading, setLoading] = useState(false);
return ( return (
<> <>
<Stack spacing={"xl"}> <Stack spacing={"xl"}>
<ComponentEvent_DetailData data={dataEvent} /> <ComponentEvent_DetailData data={dataEvent} />
<Button <Button
loaderPosition="center"
loading={isLoading ? true : false}
radius={"xl"} radius={"xl"}
color={"red"} color={"orange"}
onClick={() => onClick(router, setTabsStatus, dataEvent.id)} onClick={() =>
onClick(router, setTabsStatus, dataEvent.id, setLoading)
}
> >
Batalkan Review Batalkan Review
</Button> </Button>
@@ -39,12 +45,14 @@ export default function Event_DetailReview({
async function onClick( async function onClick(
router: AppRouterInstance, router: AppRouterInstance,
setTabsStatus: any, setTabsStatus: any,
eventId: string eventId: string,
setLoading: any
) { ) {
await Event_funEditStatusById("3", eventId).then((res) => { await Event_funEditStatusById("3", eventId).then((res) => {
if (res.status === 200) { if (res.status === 200) {
ComponentGlobal_NotifikasiBerhasil(res.message, 1500); ComponentGlobal_NotifikasiBerhasil(res.message, 1500);
setTabsStatus("Draft"); setTabsStatus("Draft");
setLoading(true);
router.back(); router.back();
} else { } else {
ComponentGlobal_NotifikasiGagal(res.message); ComponentGlobal_NotifikasiGagal(res.message);

View File

@@ -9,6 +9,7 @@ export async function Event_getByStatusId(statusId: string, authorId: string) {
tanggal: "desc", tanggal: "desc",
}, },
where: { where: {
active: true,
eventMaster_StatusId: "1", eventMaster_StatusId: "1",
authorId: authorId, authorId: authorId,
tanggal: { tanggal: {
@@ -27,9 +28,10 @@ export async function Event_getByStatusId(statusId: string, authorId: string) {
if (statusId === "2") { if (statusId === "2") {
const data = await prisma.event.findMany({ const data = await prisma.event.findMany({
orderBy: { orderBy: {
createdAt: "desc", updatedAt: "desc",
}, },
where: { where: {
active: true,
eventMaster_StatusId: "2", eventMaster_StatusId: "2",
authorId: authorId, authorId: authorId,
}, },
@@ -44,7 +46,11 @@ export async function Event_getByStatusId(statusId: string, authorId: string) {
} }
if (statusId === "3") { if (statusId === "3") {
const data = await prisma.event.findMany({ const data = await prisma.event.findMany({
orderBy: {
updatedAt: "desc",
},
where: { where: {
active: true,
eventMaster_StatusId: "3", eventMaster_StatusId: "3",
authorId: authorId, authorId: authorId,
}, },
@@ -59,7 +65,11 @@ export async function Event_getByStatusId(statusId: string, authorId: string) {
} }
if (statusId === "4") { if (statusId === "4") {
const data = await prisma.event.findMany({ const data = await prisma.event.findMany({
orderBy: {
updatedAt: "desc",
},
where: { where: {
active: true,
eventMaster_StatusId: "4", eventMaster_StatusId: "4",
authorId: authorId, authorId: authorId,
}, },

View File

@@ -9,6 +9,7 @@ export async function Event_getListAllPublish() {
tanggal: "desc", tanggal: "desc",
}, },
where: { where: {
active: true,
eventMaster_StatusId: "1", eventMaster_StatusId: "1",
tanggal: { tanggal: {
gte: new Date(), gte: new Date(),

View File

@@ -30,6 +30,8 @@ import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog";
import ComponentGlobal_AuthorNameOnHeader from "@/app_modules/component_global/author_name_on_header"; import ComponentGlobal_AuthorNameOnHeader from "@/app_modules/component_global/author_name_on_header";
import _ from "lodash"; import _ from "lodash";
import { IconCirclePlus } from "@tabler/icons-react"; import { IconCirclePlus } from "@tabler/icons-react";
import ComponentEvent_IsEmptyData from "../component/is_empty_data";
import { useWindowScroll } from "@mantine/hooks";
export default function Event_Beranda({ export default function Event_Beranda({
dataEvent, dataEvent,
@@ -37,21 +39,18 @@ export default function Event_Beranda({
dataEvent: MODEL_EVENT[]; dataEvent: MODEL_EVENT[];
}) { }) {
const router = useRouter(); const router = useRouter();
const [loading, setLoading] = useState(false); const [isLoading, setLoading] = useState(false);
const [scroll, scrollTo] = useWindowScroll();
// if (_.isEmpty(dataEvent))
// return (
// <Center h={"80vh"}>
// <Text fw={"bold"} fz={"sm"}>
// Tidak Ada Event
// </Text>
// </Center>
// );
return ( return (
<> <>
<Affix position={{ bottom: rem(150), right: rem(30) }}> <Affix position={{ bottom: rem(150), right: rem(30) }} zIndex={99}>
<ActionIcon <ActionIcon
loading={loading ? true : false} loading={isLoading ? true : false}
opacity={scroll.y > 0 ? 0.5 : ""}
style={{
transition: "0.5s",
}}
size={"xl"} size={"xl"}
radius={"xl"} radius={"xl"}
variant="transparent" variant="transparent"
@@ -64,44 +63,41 @@ export default function Event_Beranda({
<IconCirclePlus color="white" size={40} /> <IconCirclePlus color="white" size={40} />
</ActionIcon> </ActionIcon>
</Affix> </Affix>
{_.isEmpty(dataEvent) ? ( {_.isEmpty(dataEvent) ? (
<Center h={"80vh"}> <ComponentEvent_IsEmptyData text="Tidak ada data" />
<Text fw={"bold"} fz={"sm"}>
Tidak Ada Event
</Text>
</Center>
) : ( ) : (
<Box> <Box>
{dataEvent.map((e, i) => ( {Array(10)
<Card key={e.id} shadow="lg" radius={"md"} withBorder mb={"sm"}> .fill(0)
.map((e, i) => (
<Card key={i} shadow="lg" radius={"md"} withBorder mb={"sm"}>
<Card.Section px={"sm"} pt={"sm"}> <Card.Section px={"sm"} pt={"sm"}>
<ComponentGlobal_AuthorNameOnHeader <ComponentGlobal_AuthorNameOnHeader
profileId={e.Author.Profile.id} profileId={e?.Author.Profile.id}
imagesId={e.Author.Profile.imagesId} imagesId={e?.Author.Profile.imagesId}
authorName={e.Author.Profile.name} authorName={e?.Author.Profile.name}
/> />
</Card.Section> </Card.Section>
<Card.Section <Card.Section
p={"sm"} p={"sm"}
onClick={() => router.push(RouterEvent.detail_main + e.id)} onClick={() => router.push(RouterEvent.detail_main + e?.id)}
> >
<Stack> <Stack>
<Grid> <Grid>
<Grid.Col span={8}> <Grid.Col span={8}>
<Title order={6} truncate> <Title order={6} truncate>
{e.title} {e?.title}
</Title> </Title>
</Grid.Col> </Grid.Col>
<Grid.Col span={4}> <Grid.Col span={4}>
<Text fz={"sm"} truncate> <Text fz={"sm"} truncate>
{moment(e.tanggal).format("ll")} {moment(e?.tanggal).format("ll")}
</Text> </Text>
</Grid.Col> </Grid.Col>
</Grid> </Grid>
<Text fz={"sm"} lineClamp={2}> <Text fz={"sm"} lineClamp={2}>
{e.deskripsi} {e?.deskripsi}
</Text> </Text>
</Stack> </Stack>
</Card.Section> </Card.Section>

View File

@@ -0,0 +1,156 @@
"use client";
import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog";
import {
Stack,
Grid,
Avatar,
Divider,
Text,
Group,
Badge,
Loader,
} from "@mantine/core";
import { useRouter } from "next/navigation";
import moment from "moment";
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
import { RouterForum } from "@/app/lib/router_hipmi/router_forum";
import {
IconCircleFilled,
IconDots,
IconEdit,
IconFlag3,
IconMessageCircle,
IconTrash,
} from "@tabler/icons-react";
import { IconCircle } from "@tabler/icons-react";
import { IoIosMore } from "react-icons/io";
import { useDisclosure } from "@mantine/hooks";
import { useState } from "react";
import ComponentForum_PostingButtonMore from "../more_button/posting_button_more";
import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2";
import { data } from "autoprefixer";
import ComponentForum_BerandaButtonMore from "./beranda_button_more";
export default function ComponentForum_BerandaAuthorNameOnHeader({
authorId,
postingId,
imagesId,
authorName,
tglPublish,
isPembatas,
isMoreButton,
statusId,
userLoginId,
setData,
}: {
authorId?: string;
postingId?: string;
imagesId?: string;
authorName?: string;
tglPublish?: Date;
isPembatas?: boolean;
isMoreButton?: boolean;
statusId?: string;
userLoginId: string;
setData?: any;
}) {
const router = useRouter();
const [loading, setLoading] = useState(false);
return (
<>
<Stack spacing={"xs"}>
<Grid>
<Grid.Col
span={"content"}
onClick={() => {
if (authorId) {
setLoading(true);
router.push(RouterForum.forumku + authorId);
} else {
ComponentGlobal_NotifikasiPeringatan("Id tidak ditemukan");
}
}}
>
{loading ? (
<Loader color="gray" variant="dots" />
) : (
<Avatar
size={40}
sx={{ borderStyle: "solid", borderWidth: "0.5px" }}
radius={"xl"}
bg={"gray.1"}
src={
imagesId
? RouterProfile.api_foto_profile + imagesId
: "/aset/global/avatar.png"
}
/>
)}
</Grid.Col>
<Grid.Col span={"auto"}>
<Stack justify="center" h={"100%"} spacing={0}>
<Grid>
<Grid.Col span={"auto"}>
<Text lineClamp={1} fz={"sm"} fw={"bold"}>
{authorName ? authorName : "Nama author "}
</Text>
</Grid.Col>
<Grid.Col span={"content"}></Grid.Col>
</Grid>
<Badge
w={70}
variant="light"
color={(statusId as any) === 1 ? "green" : "red"}
>
<Text fz={10}>
{(statusId as any) === 1 ? "Open" : "Close"}
</Text>
</Badge>
</Stack>
</Grid.Col>
<Grid.Col span={"content"}>
<Group position="center" spacing={"xs"}>
<Group spacing={3}>
<Text c={"gray"} fz={"sm"}>
{tglPublish
? tglPublish.toLocaleDateString(["id-ID"], {
day: "numeric",
month: "short",
})
: new Date().toLocaleDateString(["id-ID"], {
day: "numeric",
month: "short",
})}
<IconCircle
size={5}
color="gray"
style={{ marginLeft: "5px" }}
/>
</Text>
</Group>
{isMoreButton ? (
<Group position="right">
<ComponentForum_BerandaButtonMore
authorId={authorId}
postingId={postingId as any}
statusId={statusId}
userLoginId={userLoginId}
setData={setData}
/>
</Group>
) : (
""
)}
</Group>
</Grid.Col>
</Grid>
{isPembatas ? <Divider /> : ""}
</Stack>
</>
);
}

View File

@@ -0,0 +1,352 @@
"use client";
import { RouterForum } from "@/app/lib/router_hipmi/router_forum";
import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil";
import {
Drawer,
Stack,
Grid,
Button,
Modal,
Title,
Group,
ActionIcon,
Text,
Box,
Center,
Loader,
} from "@mantine/core";
import { useDisclosure, useShallowEffect } from "@mantine/hooks";
import {
IconTrash,
IconEdit,
IconFlag3,
IconDots,
IconSquareRoundedX,
IconSquareCheck,
} from "@tabler/icons-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { createStyles } from "@mantine/core";
import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2";
import { useAtom } from "jotai";
import { gs_forum_loading_edit_posting } from "../../global_state";
import ComponentForum_LoadingDrawer from "../loading_drawer";
import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
import { forum_funEditStatusPostingById } from "../../fun/edit/fun_edit_status_posting_by_id";
import { forum_getListAllPosting } from "../../fun/get/get_list_all_posting";
import { forum_getListPostingByAuhtorId } from "../../fun/get/get_list_posting_by_author_id";
export default function ComponentForum_BerandaButtonMore({
authorId,
postingId,
statusId,
userLoginId,
setData,
}: {
authorId: any;
postingId?: any;
statusId?: any;
userLoginId: any;
setData: any;
}) {
const router = useRouter();
// modal & drawer
const [opened, { open, close }] = useDisclosure(false);
const [openDel, setOpenDel] = useState(false);
const [openStatusClose, setOpenStatusClose] = useState(false);
// loading
const [loadingEdit, setLoadingEdit] = useState(false);
const [loadingReport, setLoadingReport] = useState(false);
// if (loadingEdit) return <ComponentGlobal_V2_LoadingPage />;
return (
<>
<Drawer
// className={classes.radiusCustom}
opened={opened}
onClose={close}
withCloseButton={false}
overlayProps={{ opacity: 0.1, blur: 1 }}
position="bottom"
size={"auto"}
>
<Stack>
{userLoginId != authorId ? (
""
) : (
<Stack>
<Grid
onClick={() => {
close();
setOpenStatusClose(true);
}}
>
<Grid.Col span={"content"}>
{statusId === 1 ? (
<IconSquareRoundedX color="red" />
) : (
<IconSquareCheck />
)}
</Grid.Col>
<Grid.Col span={"auto"}>
{statusId === 1 ? (
<Text c={"red"}>Tutup forum</Text>
) : (
<Text>Buka forum</Text>
)}
</Grid.Col>
</Grid>
<Grid
onClick={() => {
close();
setOpenDel(true);
}}
>
<Grid.Col span={"content"}>
<IconTrash color="red" />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text c={"red"}>Hapus</Text>
</Grid.Col>
</Grid>
<Grid
onClick={() => {
setLoadingEdit(true);
router.push(RouterForum.edit_posting + postingId);
}}
>
<Grid.Col span={"content"}>
<IconEdit color={loadingEdit ? "gray" : "black"} />
</Grid.Col>
<Grid.Col span={"auto"}>
<Group>
<Text c={loadingEdit ? "gray" : "black"}>Edit posting</Text>{" "}
{loadingEdit ? <Loader size={"sm"} /> : ""}
</Group>
</Grid.Col>
</Grid>
</Stack>
)}
{userLoginId == authorId ? (
""
) : (
<Grid
onClick={() => {
setLoadingReport(true);
router.push(RouterForum.report_posting + postingId);
}}
>
<Grid.Col span={"content"}>
<IconFlag3 color={loadingReport ? "gray" : "black"} />
</Grid.Col>
<Grid.Col span={"auto"}>
<Group>
<Text c={loadingReport ? "gray" : "black"}>
Laporkan posting
</Text>{" "}
{loadingReport ? <Loader size={"sm"} /> : ""}
</Group>
</Grid.Col>
</Grid>
)}
<Button variant="outline" radius={"xl"} onClick={close}>
Batal
</Button>
</Stack>
</Drawer>
<Modal
opened={openDel}
onClose={() => {
setOpenDel(false);
}}
centered
withCloseButton={false}
>
<ButtonDelete
postingId={postingId}
setOpenDel={setOpenDel}
setData={setData}
/>
</Modal>
<Modal
opened={openStatusClose}
onClose={() => setOpenStatusClose(false)}
centered
withCloseButton={false}
>
<ButtonStatus
postingId={postingId}
setOpenStatus={setOpenStatusClose}
statusId={statusId}
setData={setData}
userLoginId={userLoginId}
authorId={authorId}
/>
</Modal>
<ActionIcon variant="transparent" onClick={() => open()}>
<IconDots size={20} />
</ActionIcon>
</>
);
}
function ButtonDelete({
postingId,
setOpenDel,
setData,
}: {
postingId?: string;
setOpenDel: any;
setData: any;
}) {
const [loading, setLoading] = useState(false);
async function onDelete() {
setOpenDel(false);
await forum_funDeletePostingById(postingId as any).then(async (res) => {
if (res.status === 200) {
ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000);
setLoading(true);
const listForum = await forum_getListAllPosting();
setData(listForum);
} else {
ComponentGlobal_NotifikasiGagal(res.message);
}
});
}
return (
<>
<Stack>
<Title order={6}>Yakin menghapus posting ini ?</Title>
<Group position="center">
<Button radius={"xl"} onClick={() => setOpenDel(false)}>
Batal
</Button>
<Button
loaderPosition="center"
loading={loading ? true : false}
color="red"
radius={"xl"}
onClick={() => {
onDelete();
}}
>
Hapus
</Button>
</Group>
</Stack>
</>
);
}
function ButtonStatus({
postingId,
setOpenStatus,
statusId,
setData,
userLoginId,
authorId,
}: {
postingId?: string;
setOpenStatus: any;
statusId?: any;
setData: any;
userLoginId: string;
authorId: string;
}) {
const [loading, setLoading] = useState(false);
async function onTutupForum() {
setOpenStatus(false);
await forum_funEditStatusPostingById(postingId as any, 2).then(
async (res) => {
if (res.status === 200) {
await forum_getListAllPosting().then((val) => {
setData(val as any);
ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000);
setLoading(true);
});
} else {
ComponentGlobal_NotifikasiGagal(res.message);
}
}
);
}
async function onBukaForum() {
setOpenStatus(false);
await forum_funEditStatusPostingById(postingId as any, 1).then(
async (res) => {
if (res.status === 200) {
await forum_getListAllPosting().then((val) => {
setData(val as any);
ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000);
setLoading(true);
});
} else {
ComponentGlobal_NotifikasiGagal(res.message);
}
}
);
}
return (
<>
<Stack>
{statusId === 1 ? (
<Title order={6}>Yakin menutup forum ini ?</Title>
) : (
<Title order={6}>Yakin membuka forum ini ?</Title>
)}
<Group position="center">
<Button radius={"xl"} onClick={() => setOpenStatus(false)}>
Batal
</Button>
{statusId === 1 ? (
<Button
loaderPosition="center"
loading={loading ? true : false}
color="orange"
radius={"xl"}
onClick={() => {
onTutupForum();
}}
>
Tutup
</Button>
) : (
<Button
loaderPosition="center"
loading={loading ? true : false}
color="green"
radius={"xl"}
onClick={() => {
onBukaForum();
}}
>
Buka
</Button>
)}
</Group>
</Stack>
</>
);
}

View File

@@ -0,0 +1,101 @@
"use client";
import { RouterForum } from "@/app/lib/router_hipmi/router_forum";
import { Stack, Card, Group, ActionIcon, Divider, Text } from "@mantine/core";
import { IconMessageCircle, IconMessageCircleOff } from "@tabler/icons-react";
import { useState } from "react";
import { useShallowEffect } from "@mantine/hooks";
import { useRouter } from "next/navigation";
import { useAtom } from "jotai";
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
import { IconMessageCircleX } from "@tabler/icons-react";
import { MODEL_FORUM_POSTING } from "../../model/interface";
import ComponentForum_BerandaAuthorNameOnHeader from "./beranda_author_header";
export default function ComponentForum_BerandaCardView({
data,
setData,
setLoadingKomen,
setLoadingDetail,
userLoginId,
}: {
data: MODEL_FORUM_POSTING[];
setData: any;
setLoadingKomen: any;
setLoadingDetail: any;
userLoginId: any;
}) {
const router = useRouter();
return (
<>
<Stack spacing={"xl"}>
{data.map((e, i) => (
<Card key={i}>
<Card.Section>
{/* <pre>{JSON.stringify(e.Author.id, null, 2)}</pre>
<pre>{JSON.stringify(userLoginId, null, 2)}</pre> */}
<ComponentForum_BerandaAuthorNameOnHeader
authorName={e?.Author?.Profile?.name}
imagesId={e?.Author?.Profile?.imagesId}
tglPublish={e?.createdAt}
isMoreButton={true}
authorId={e?.Author?.id}
postingId={e?.id}
statusId={e?.ForumMaster_StatusPosting?.id}
userLoginId={userLoginId}
setData={setData}
/>
</Card.Section>
<Card.Section
sx={{ zIndex: 0 }}
p={"lg"}
onClick={() => {
// console.log("halaman forum");
setLoadingDetail(true);
router.push(RouterForum.main_detail + e.id);
}}
>
<Text fz={"sm"} lineClamp={4}>
<div dangerouslySetInnerHTML={{ __html: e.diskusi }} />
</Text>
</Card.Section>
<Card.Section>
<Stack>
<Group spacing={"xs"} px={"sm"}>
<ActionIcon
// loading={loadingKomen ? true : false}
variant="transparent"
sx={{ zIndex: 1 }}
onClick={() => {
(e?.ForumMaster_StatusPosting.id as any) === 1
? (router.push(RouterForum.komentar + e?.id),
setLoadingKomen(true))
: router.push(RouterForum.main_detail + e?.id);
}}
>
{(e?.ForumMaster_StatusPosting?.id as any) === 1 ? (
<IconMessageCircle color="gray" size={25} />
) : (
<IconMessageCircleX color="gray" size={25} />
)}
</ActionIcon>
{/* <TotalKomentar postingId={e?.id} /> */}
<Text c={"gray"}>{e?._count}</Text>
</Group>
<Divider />
</Stack>
</Card.Section>
</Card>
))}
</Stack>
</>
);
}

View File

@@ -32,8 +32,7 @@ export default function ComponentForum_HeaderTamplate({
bg?: any; bg?: any;
}) { }) {
const router = useRouter(); const router = useRouter();
const [loading, setLoading] = useState(false); const [isLoading, setLoading] = useState(false);
if (loading) return <ComponentGlobal_V2_LoadingPage />;
return ( return (
<> <>
@@ -47,6 +46,7 @@ export default function ComponentForum_HeaderTamplate({
<ActionIcon variant="transparent" disabled></ActionIcon> <ActionIcon variant="transparent" disabled></ActionIcon>
) : ( ) : (
<ActionIcon <ActionIcon
loading={isLoading ? true : false}
variant="transparent" variant="transparent"
onClick={() => { onClick={() => {
setLoading(true); setLoading(true);

View File

@@ -29,6 +29,7 @@ import { useDisclosure } from "@mantine/hooks";
import { useState } from "react"; import { useState } from "react";
import ComponentForum_PostingButtonMore from "../more_button/posting_button_more"; import ComponentForum_PostingButtonMore from "../more_button/posting_button_more";
import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2";
import { data } from "autoprefixer";
export default function ComponentForum_PostingAuthorNameOnHeader({ export default function ComponentForum_PostingAuthorNameOnHeader({
authorId, authorId,
@@ -40,6 +41,7 @@ export default function ComponentForum_PostingAuthorNameOnHeader({
isMoreButton, isMoreButton,
statusId, statusId,
userLoginId, userLoginId,
setData,
}: { }: {
authorId?: string; authorId?: string;
postingId?: string; postingId?: string;
@@ -50,6 +52,7 @@ export default function ComponentForum_PostingAuthorNameOnHeader({
isMoreButton?: boolean; isMoreButton?: boolean;
statusId?: string; statusId?: string;
userLoginId: string; userLoginId: string;
setData?:any
}) { }) {
const router = useRouter(); const router = useRouter();
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
@@ -128,6 +131,7 @@ export default function ComponentForum_PostingAuthorNameOnHeader({
/> />
</Text> </Text>
</Group> </Group>
{isMoreButton ? ( {isMoreButton ? (
<Group position="right"> <Group position="right">
<ComponentForum_PostingButtonMore <ComponentForum_PostingButtonMore
@@ -135,6 +139,7 @@ export default function ComponentForum_PostingAuthorNameOnHeader({
postingId={postingId as any} postingId={postingId as any}
statusId={statusId} statusId={statusId}
userLoginId={userLoginId} userLoginId={userLoginId}
setData={setData}
/> />
</Group> </Group>
) : ( ) : (

View File

@@ -17,14 +17,16 @@ import { IconMessageCircleX } from "@tabler/icons-react";
export default function ComponentForum_MainCardView({ export default function ComponentForum_MainCardView({
data, data,
setData,
setLoadingKomen, setLoadingKomen,
setLoadingDetail, setLoadingDetail,
userLoginId, userLoginId,
}: { }: {
data: MODEL_FORUM_POSTING[]; data: MODEL_FORUM_POSTING[];
setData: any,
setLoadingKomen: any; setLoadingKomen: any;
setLoadingDetail: any; setLoadingDetail: any;
userLoginId: any userLoginId: any;
}) { }) {
const router = useRouter(); const router = useRouter();
return ( return (
@@ -33,7 +35,9 @@ export default function ComponentForum_MainCardView({
{data.map((e, i) => ( {data.map((e, i) => (
<Card key={i}> <Card key={i}>
<Card.Section> <Card.Section>
{/* <pre>{JSON.stringify( typeof e.ForumMaster_StatusPosting.id)}</pre> */} {/* <pre>{JSON.stringify(e.Author.id, null, 2)}</pre>
<pre>{JSON.stringify(userLoginId, null, 2)}</pre> */}
<ComponentForum_PostingAuthorNameOnHeader <ComponentForum_PostingAuthorNameOnHeader
authorName={e?.Author?.Profile?.name} authorName={e?.Author?.Profile?.name}
imagesId={e?.Author?.Profile?.imagesId} imagesId={e?.Author?.Profile?.imagesId}
@@ -43,6 +47,7 @@ export default function ComponentForum_MainCardView({
postingId={e?.id} postingId={e?.id}
statusId={e?.ForumMaster_StatusPosting?.id} statusId={e?.ForumMaster_StatusPosting?.id}
userLoginId={userLoginId} userLoginId={userLoginId}
setData={setData}
/> />
</Card.Section> </Card.Section>
<Card.Section <Card.Section

View File

@@ -37,17 +37,21 @@ import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id"; import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
import { forum_funEditStatusPostingById } from "../../fun/edit/fun_edit_status_posting_by_id"; import { forum_funEditStatusPostingById } from "../../fun/edit/fun_edit_status_posting_by_id";
import { forum_getListAllPosting } from "../../fun/get/get_list_all_posting";
import { forum_getListPostingByAuhtorId } from "../../fun/get/get_list_posting_by_author_id";
export default function ComponentForum_PostingButtonMore({ export default function ComponentForum_PostingButtonMore({
authorId, authorId,
postingId, postingId,
statusId, statusId,
userLoginId, userLoginId,
setData,
}: { }: {
authorId: any; authorId: any;
postingId?: any; postingId?: any;
statusId?: any; statusId?: any;
userLoginId: any; userLoginId: any;
setData: any;
}) { }) {
const router = useRouter(); const router = useRouter();
@@ -170,7 +174,11 @@ export default function ComponentForum_PostingButtonMore({
centered centered
withCloseButton={false} withCloseButton={false}
> >
<ButtonDelete postingId={postingId} setOpenDel={setOpenDel} /> <ButtonDelete
postingId={postingId}
setOpenDel={setOpenDel}
setData={setData}
/>
</Modal> </Modal>
<Modal <Modal
@@ -183,6 +191,9 @@ export default function ComponentForum_PostingButtonMore({
postingId={postingId} postingId={postingId}
setOpenStatus={setOpenStatusClose} setOpenStatus={setOpenStatusClose}
statusId={statusId} statusId={statusId}
setData={setData}
userLoginId={userLoginId}
authorId={authorId}
/> />
</Modal> </Modal>
@@ -196,18 +207,22 @@ export default function ComponentForum_PostingButtonMore({
function ButtonDelete({ function ButtonDelete({
postingId, postingId,
setOpenDel, setOpenDel,
setData,
}: { }: {
postingId?: string; postingId?: string;
setOpenDel: any; setOpenDel: any;
setData: any;
}) { }) {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
async function onDelete() { async function onDelete() {
setOpenDel(false); setOpenDel(false);
await forum_funDeletePostingById(postingId as any).then((res) => { await forum_funDeletePostingById(postingId as any).then(async (res) => {
if (res.status === 200) { if (res.status === 200) {
ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000);
setLoading(true); setLoading(true);
const listForum = await forum_getListAllPosting();
setData(listForum);
} else { } else {
ComponentGlobal_NotifikasiGagal(res.message); ComponentGlobal_NotifikasiGagal(res.message);
} }
@@ -242,37 +257,61 @@ function ButtonStatus({
postingId, postingId,
setOpenStatus, setOpenStatus,
statusId, statusId,
setData,
userLoginId,
authorId,
}: { }: {
postingId?: string; postingId?: string;
setOpenStatus: any; setOpenStatus: any;
statusId?: any; statusId?: any;
setData: any;
userLoginId: string;
authorId: string;
}) { }) {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
async function onTutupForum() { async function onTutupForum() {
setOpenStatus(false); setOpenStatus(false);
await forum_funEditStatusPostingById(postingId as any, 2).then((res) => { await forum_funEditStatusPostingById(postingId as any, 2).then(
async (res) => {
if (res.status === 200) { if (res.status === 200) {
if (userLoginId === authorId) {
await forum_getListPostingByAuhtorId(authorId).then((val: any) =>
setData(val)
);
} else {
await forum_getListAllPosting().then((val) => setData(val as any));
}
ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000);
setLoading(true); setLoading(true);
} else { } else {
ComponentGlobal_NotifikasiGagal(res.message); ComponentGlobal_NotifikasiGagal(res.message);
} }
}); }
);
} }
async function onBukaForum() { async function onBukaForum() {
setOpenStatus(false); setOpenStatus(false);
await forum_funEditStatusPostingById(postingId as any, 1).then((res) => { await forum_funEditStatusPostingById(postingId as any, 1).then(
async (res) => {
if (res.status === 200) { if (res.status === 200) {
if (userLoginId === authorId) {
await forum_getListPostingByAuhtorId(authorId).then((val: any) =>
setData(val)
);
} else {
await forum_getListAllPosting().then((val) => setData(val as any));
}
ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000); ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000);
setLoading(true); setLoading(true);
} else { } else {
ComponentGlobal_NotifikasiGagal(res.message); ComponentGlobal_NotifikasiGagal(res.message);
} }
}); }
);
} }
return ( return (

View File

@@ -2,12 +2,14 @@
import { import {
ActionIcon, ActionIcon,
Box,
Button, Button,
Center, Center,
Group, Group,
Loader, Loader,
Paper, Paper,
Stack, Stack,
Text,
} from "@mantine/core"; } from "@mantine/core";
import "react-quill/dist/quill.snow.css"; import "react-quill/dist/quill.snow.css";
import "react-quill/dist/quill.bubble.css"; import "react-quill/dist/quill.bubble.css";
@@ -23,6 +25,9 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; import { RouterForum } from "@/app/lib/router_hipmi/router_forum";
import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input";
import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown";
import _ from "lodash";
const ReactQuill = dynamic( const ReactQuill = dynamic(
() => { () => {
return import("react-quill"); return import("react-quill");
@@ -32,7 +37,8 @@ const ReactQuill = dynamic(
export default function Forum_Create() { export default function Forum_Create() {
const [value, setValue] = useState(""); const [value, setValue] = useState("");
const [maxForum, setMaxForum] = useState(0); const [totalLength, setTotalLength] = useState(0);
const [reload, setReload] = useState(false); const [reload, setReload] = useState(false);
useShallowEffect(() => { useShallowEffect(() => {
if (window && window.document) setReload(true); if (window && window.document) setReload(true);
@@ -48,27 +54,27 @@ export default function Forum_Create() {
return ( return (
<> <>
<Stack> <Stack>
<Paper withBorder shadow="lg"> <Paper withBorder shadow="lg" p={"xs"}>
<ReactQuill <ReactQuill
theme="bubble" theme="bubble"
placeholder="Apa yang sedang hangat dibicarakan ?" placeholder="Apa yang sedang ingin dibahas ?"
style={{ height: 150 }} style={{ height: 150 }}
onChange={(val) => { onChange={(val) => {
// if (val.length > 300) {
// setMaxForum(val.length);
// }
setValue(val); setValue(val);
}} }}
/> />
</Paper> </Paper>
<Group position="right"> <Group position="right">
{/* <ActionIcon> <ComponentGlobal_InputCountDown
<IconPhotoUp /> maxInput={500}
</ActionIcon> */} lengthInput={value.length}
/>
</Group>
<Group position="right">
<ButtonAction value={value} /> <ButtonAction value={value} />
</Group> </Group>
</Stack> </Stack>
{/* <div dangerouslySetInnerHTML={{ __html: value }} /> */} {/* <pre> {JSON.stringify(value, null, 2)}</pre> */}
</> </>
); );
} }
@@ -78,6 +84,10 @@ function ButtonAction({ value }: { value: string }) {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
async function onCreate() { async function onCreate() {
if (value.length > 500) {
return null;
}
await forum_funCreate(value).then((res) => { await forum_funCreate(value).then((res) => {
if (res.status === 201) { if (res.status === 201) {
setLoading(true); setLoading(true);
@@ -91,6 +101,14 @@ function ButtonAction({ value }: { value: string }) {
return ( return (
<> <>
<Button <Button
style={{
transition: "0.5s",
}}
disabled={
value === "<p><br></p>" || value === "" || value.length > 500
? true
: false
}
radius={"xl"} radius={"xl"}
loading={loading ? true : false} loading={loading ? true : false}
loaderPosition="center" loaderPosition="center"

View File

@@ -10,6 +10,7 @@ import {
Divider, Divider,
Group, Group,
Paper, Paper,
Spoiler,
Stack, Stack,
Text, Text,
} from "@mantine/core"; } from "@mantine/core";
@@ -34,6 +35,7 @@ const ReactQuill = dynamic(
); );
import "react-quill/dist/quill.bubble.css"; import "react-quill/dist/quill.bubble.css";
import { forum_getKomentarById } from "../fun/get/get_komentar_by_id"; import { forum_getKomentarById } from "../fun/get/get_komentar_by_id";
import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown";
export default function Forum_Detail({ export default function Forum_Detail({
dataPosting, dataPosting,
@@ -162,14 +164,20 @@ function CreateKomentar({
const router = useRouter(); const router = useRouter();
const [value, setValue] = useState(""); const [value, setValue] = useState("");
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [isEmpty, setIsEmpty] = useState(false);
async function onComment() { async function onComment() {
if (value.length > 500) {
return null;
}
await forum_funCreateKomentar(postingId, value).then(async (res) => { await forum_funCreateKomentar(postingId, value).then(async (res) => {
if (res.status === 201) { if (res.status === 201) {
await forum_getKomentarById(postingId).then((val) => { await forum_getKomentarById(postingId).then((val) => {
setKomentar(val); setKomentar(val);
// setLoading(true); // setLoading(true);
setValue(""); setValue("");
setIsEmpty(true);
ComponentGlobal_NotifikasiBerhasil(res.message, 2000); ComponentGlobal_NotifikasiBerhasil(res.message, 2000);
}); });
// router.replace(RouterForum.main_detail + postingId, { scroll: false }); // router.replace(RouterForum.main_detail + postingId, { scroll: false });
@@ -192,8 +200,22 @@ function CreateKomentar({
}} }}
/> />
</Paper> </Paper>
<Group position="right">
<ComponentGlobal_InputCountDown
maxInput={500}
lengthInput={value.length}
/>
</Group>
<Group position="right"> <Group position="right">
<Button <Button
style={{
transition: "0.5s",
}}
disabled={
value === "" || value === "<p><br></p>" || value.length > 500
? true
: false
}
loaderPosition="center" loaderPosition="center"
loading={loading ? true : false} loading={loading ? true : false}
radius={"xl"} radius={"xl"}
@@ -248,7 +270,13 @@ function KomentarView({
<Stack spacing={"xs"}> <Stack spacing={"xs"}>
<Text fz={"sm"} lineClamp={4}> <Text fz={"sm"} lineClamp={4}>
{e.komentar ? ( {e.komentar ? (
<Spoiler
hideLabel="sembunyikan"
maxHeight={100}
showLabel="tampilkan"
>
<div dangerouslySetInnerHTML={{ __html: e.komentar }} /> <div dangerouslySetInnerHTML={{ __html: e.komentar }} />
</Spoiler>
) : ( ) : (
"" ""
)} )}

View File

@@ -1,4 +1,4 @@
"use client" "use client";
import { import {
ActionIcon, ActionIcon,
@@ -16,7 +16,6 @@ import { useShallowEffect } from "@mantine/hooks";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2";
import dynamic from "next/dynamic"; import dynamic from "next/dynamic";
import React, { useState } from "react"; import React, { useState } from "react";
import { useAtom } from "jotai"; import { useAtom } from "jotai";
@@ -73,10 +72,12 @@ function ButtonAction() {
return ( return (
<> <>
<Button radius={"xl"} onClick={() => { <Button
router.back() radius={"xl"}
onClick={() => {
}}> router.back();
}}
>
Update Update
</Button> </Button>
</> </>

View File

@@ -24,6 +24,8 @@ import { MODEL_FORUM_POSTING } from "../../model/interface";
import { forum_funEditPostingById } from "../../fun/edit/fun_edit_posting_by_id"; import { forum_funEditPostingById } from "../../fun/edit/fun_edit_posting_by_id";
import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown";
const ReactQuill = dynamic( const ReactQuill = dynamic(
() => { () => {
return import("react-quill"); return import("react-quill");
@@ -52,10 +54,10 @@ export default function Forum_EditPosting({
return ( return (
<> <>
<Stack> <Stack>
<Paper withBorder shadow="lg"> <Paper withBorder shadow="lg" p={"xs"}>
<ReactQuill <ReactQuill
theme="bubble" theme="bubble"
placeholder="Apa yang sedang hangat dibicarakan ?" placeholder="Apa yang sedang ingin dibahas ?"
style={{ height: 150 }} style={{ height: 150 }}
value={value.diskusi} value={value.diskusi}
onChange={(val) => { onChange={(val) => {
@@ -66,6 +68,12 @@ export default function Forum_EditPosting({
}} }}
/> />
</Paper> </Paper>
<Group position="right">
<ComponentGlobal_InputCountDown
maxInput={500}
lengthInput={value.diskusi.length}
/>
</Group>
<Group position="right"> <Group position="right">
{/* <ActionIcon> {/* <ActionIcon>
<IconPhotoUp /> <IconPhotoUp />
@@ -73,7 +81,7 @@ export default function Forum_EditPosting({
<ButtonAction diskusi={value.diskusi as any} postingId={value.id} /> <ButtonAction diskusi={value.diskusi as any} postingId={value.id} />
</Group> </Group>
</Stack> </Stack>
{/* <div dangerouslySetInnerHTML={{ __html: value }} /> */} {/* <div dangerouslySetInnerHTML={{ __html: value.diskusi }} /> */}
</> </>
); );
} }
@@ -89,11 +97,14 @@ function ButtonAction({
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
async function onUpdate() { async function onUpdate() {
if (diskusi === "<p><br></p>" || diskusi === "")
return ComponentGlobal_NotifikasiPeringatan("Masukan postingan anda");
await forum_funEditPostingById(postingId, diskusi).then((res) => { await forum_funEditPostingById(postingId, diskusi).then((res) => {
if (res.status === 200) { if (res.status === 200) {
setLoading(true); setLoading(true);
ComponentGlobal_NotifikasiBerhasil(res.message); ComponentGlobal_NotifikasiBerhasil(res.message);
setTimeout(() => router.back(), 1000) setTimeout(() => router.back(), 1000);
} else { } else {
ComponentGlobal_NotifikasiGagal(res.message); ComponentGlobal_NotifikasiGagal(res.message);
} }
@@ -103,9 +114,17 @@ function ButtonAction({
return ( return (
<> <>
<Button <Button
disabled={
diskusi === "<p><br></p>" || diskusi === "" || diskusi.length > 500
? true
: false
}
loaderPosition="center" loaderPosition="center"
loading={loading ? true : false} loading={loading ? true : false}
radius={"xl"} radius={"xl"}
style={{
transition: "0.5s",
}}
onClick={() => { onClick={() => {
onUpdate(); onUpdate();
}} }}

View File

@@ -177,7 +177,7 @@ function ForumPosting({
userLoginId: any; userLoginId: any;
}) { }) {
const router = useRouter(); const router = useRouter();
const [data, setData] = useState(dataPosting);
const [loadingDetail, setLoadingDetail] = useState(false); const [loadingDetail, setLoadingDetail] = useState(false);
const [loadingKomen, setLoadingKomen] = useState(false); const [loadingKomen, setLoadingKomen] = useState(false);
@@ -185,11 +185,15 @@ function ForumPosting({
if (loadingKomen) return <ComponentGlobal_V2_LoadingPage />; if (loadingKomen) return <ComponentGlobal_V2_LoadingPage />;
return ( return (
<> <>
<ComponentForum_MainCardView <ComponentForum_MainCardView
data={dataPosting} data={data}
setLoadingKomen={setLoadingKomen} setLoadingKomen={setLoadingKomen}
setLoadingDetail={setLoadingDetail} setLoadingDetail={setLoadingDetail}
userLoginId={userLoginId} userLoginId={userLoginId}
setData={setData}
/> />
{/* <Stack> {/* <Stack>

View File

@@ -37,11 +37,6 @@ export async function forum_getListAllPosting() {
}, },
}, },
ForumMaster_StatusPosting: true, ForumMaster_StatusPosting: true,
// _count: {
// select: {
// Forum_Komentar: true,
// },
// },
}, },
}); });

View File

@@ -1,9 +1,9 @@
"use server" "use server";
import prisma from "@/app/lib/prisma"; import prisma from "@/app/lib/prisma";
import _ from "lodash" import _ from "lodash";
export async function forum_funSearchListPosting(text:string) { export async function forum_funSearchListPosting(text: string) {
const get = await prisma.forum_Posting.findMany({ const get = await prisma.forum_Posting.findMany({
orderBy: [ orderBy: [
// { // {
@@ -15,6 +15,7 @@ export async function forum_funSearchListPosting(text:string) {
], ],
take: 10, take: 10,
where: { where: {
isActive: true,
diskusi: { diskusi: {
contains: text, contains: text,
mode: "insensitive", mode: "insensitive",

View File

@@ -27,13 +27,14 @@ import { MODEL_FORUM_POSTING } from "../model/interface";
import { forum_funCreateKomentar } from "../fun/create/fun_create_komentar"; import { forum_funCreateKomentar } from "../fun/create/fun_create_komentar";
import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown";
export default function Forum_Komentar({ export default function Forum_Komentar({
dataPosting, dataPosting,
userLoginId, userLoginId,
}: { }: {
dataPosting: MODEL_FORUM_POSTING; dataPosting: MODEL_FORUM_POSTING;
userLoginId: any userLoginId: any;
}) { }) {
return ( return (
<> <>
@@ -77,11 +78,15 @@ function CreateKomentar({ postingId }: { postingId: string }) {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
async function onComment() { async function onComment() {
if (value.length > 500) {
return null;
}
await forum_funCreateKomentar(postingId, value).then((res) => { await forum_funCreateKomentar(postingId, value).then((res) => {
if (res.status === 201) { if (res.status === 201) {
setLoading(true);
ComponentGlobal_NotifikasiBerhasil(res.message); ComponentGlobal_NotifikasiBerhasil(res.message);
router.replace(RouterForum.main_detail + postingId, { scroll: false }); router.replace(RouterForum.main_detail + postingId, { scroll: false });
setLoading(true);
router.refresh(); router.refresh();
} else { } else {
ComponentGlobal_NotifikasiGagal(res.message); ComponentGlobal_NotifikasiGagal(res.message);
@@ -102,11 +107,25 @@ function CreateKomentar({ postingId }: { postingId: string }) {
}} }}
/> />
</Paper> </Paper>
<Group position="right">
<ComponentGlobal_InputCountDown
maxInput={500}
lengthInput={value.length}
/>
</Group>
<Group position="right"> <Group position="right">
<Button <Button
disabled={
value === "" || value === "<p><br></p>" || value.length > 500
? true
: false
}
loaderPosition="center" loaderPosition="center"
loading={loading ? true : false} loading={loading ? true : false}
radius={"xl"} radius={"xl"}
style={{
transition: "0.5s",
}}
onClick={() => onComment()} onClick={() => onComment()}
> >
Balas Balas

View File

@@ -36,6 +36,7 @@ import ComponentForum_MainCardView from "../component/main_card_view";
import { forum_getListAllPosting } from "../fun/get/get_list_all_posting"; import { forum_getListAllPosting } from "../fun/get/get_list_all_posting";
import { forum_funSearchListPosting } from "../fun/search/fun_search_list_posting"; import { forum_funSearchListPosting } from "../fun/search/fun_search_list_posting";
import _ from "lodash"; import _ from "lodash";
import ComponentForum_BerandaCardView from "../component/beranda/beranda_card";
export default function Forum_Beranda({ export default function Forum_Beranda({
listForum, listForum,
@@ -105,8 +106,9 @@ export default function Forum_Beranda({
</Stack> </Stack>
</Stack> </Stack>
) : ( ) : (
<ComponentForum_MainCardView <ComponentForum_BerandaCardView
data={data} data={data}
setData={setData}
setLoadingKomen={setLoadingKomen} setLoadingKomen={setLoadingKomen}
setLoadingDetail={setLoadingDetail} setLoadingDetail={setLoadingDetail}
userLoginId={userLoginId} userLoginId={userLoginId}

View File

@@ -16,6 +16,7 @@ import {
Paper, Paper,
Select, Select,
Stack, Stack,
Text,
TextInput, TextInput,
Textarea, Textarea,
Title, Title,
@@ -32,6 +33,8 @@ import { NotifPeringatan } from "@/app_modules/donasi/component/notifikasi/notif
import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input";
import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown";
export default function CreatePortofolio({ export default function CreatePortofolio({
bidangBisnis, bidangBisnis,
@@ -60,6 +63,7 @@ export default function CreatePortofolio({
const [file, setFile] = useState<File | any>(null); const [file, setFile] = useState<File | any>(null);
const [img, setImg] = useState<any | null>(null); const [img, setImg] = useState<any | null>(null);
const [isFile, setIsFile] = useState(false);
return ( return (
<> <>
@@ -72,7 +76,7 @@ export default function CreatePortofolio({
withAsterisk withAsterisk
label="Nama Bisnis" label="Nama Bisnis"
placeholder="Nama bisnis" placeholder="Nama bisnis"
error={value.namaBisnis.length > 100 ? "Maksimal 100 karakter" : ""} maxLength={100}
onChange={(val) => { onChange={(val) => {
setValue({ setValue({
...value, ...value,
@@ -99,9 +103,7 @@ export default function CreatePortofolio({
withAsterisk withAsterisk
label="Alamat Kantor" label="Alamat Kantor"
placeholder="Alamat kantor" placeholder="Alamat kantor"
error={ maxLength={100}
value.alamatKantor.length > 100 ? "Maksimal 100 karakter" : ""
}
onChange={(val) => { onChange={(val) => {
setValue({ setValue({
...value, ...value,
@@ -121,14 +123,15 @@ export default function CreatePortofolio({
}); });
}} }}
/> />
<Stack spacing={5}>
<Textarea <Textarea
maxLength={150}
autosize autosize
minRows={2} minRows={2}
maxRows={5} maxRows={5}
withAsterisk withAsterisk
label="Deskripsi" label="Deskripsi"
placeholder="Deskripsi singkat mengenai usaha" placeholder="Deskripsi singkat mengenai usaha"
error={value.deskripsi.length > 150 ? "Maksimal 150 karakter" : ""}
onChange={(val) => { onChange={(val) => {
setValue({ setValue({
...value, ...value,
@@ -136,6 +139,11 @@ export default function CreatePortofolio({
}); });
}} }}
/> />
<ComponentGlobal_InputCountDown
maxInput={150}
lengthInput={value.deskripsi.length}
/>
</Stack>
</Stack> </Stack>
<Stack> <Stack>
@@ -145,6 +153,8 @@ export default function CreatePortofolio({
<Image alt="Foto" src={img ? img : "/aset/no-img.png"} /> <Image alt="Foto" src={img ? img : "/aset/no-img.png"} />
</Paper> </Paper>
</AspectRatio> </AspectRatio>
{isFile ? <ComponentGlobal_ErrorInput text="Upload gambar" /> : ""}
<Center> <Center>
<FileButton <FileButton
onChange={async (files: any | null) => { onChange={async (files: any | null) => {
@@ -160,6 +170,7 @@ export default function CreatePortofolio({
} else { } else {
setImg(buffer); setImg(buffer);
setFile(files); setFile(files);
setIsFile(false);
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
@@ -187,6 +198,7 @@ export default function CreatePortofolio({
<ComponentKatalog_NotedBox informasi="Isi hanya pada sosial media yang anda miliki" /> <ComponentKatalog_NotedBox informasi="Isi hanya pada sosial media yang anda miliki" />
<TextInput <TextInput
label="Facebook" label="Facebook"
maxLength={100}
placeholder="Facebook" placeholder="Facebook"
onChange={(val) => { onChange={(val) => {
setMedsos({ setMedsos({
@@ -197,6 +209,7 @@ export default function CreatePortofolio({
/> />
<TextInput <TextInput
label="Instagram" label="Instagram"
maxLength={100}
placeholder="Instagram" placeholder="Instagram"
onChange={(val) => { onChange={(val) => {
setMedsos({ setMedsos({
@@ -207,6 +220,7 @@ export default function CreatePortofolio({
/> />
<TextInput <TextInput
label="Tiktok" label="Tiktok"
maxLength={100}
placeholder="Tiktok" placeholder="Tiktok"
onChange={(val) => { onChange={(val) => {
setMedsos({ setMedsos({
@@ -217,6 +231,7 @@ export default function CreatePortofolio({
/> />
<TextInput <TextInput
label="Twitter" label="Twitter"
maxLength={100}
placeholder="Twitter" placeholder="Twitter"
onChange={(val) => { onChange={(val) => {
setMedsos({ setMedsos({
@@ -227,6 +242,7 @@ export default function CreatePortofolio({
/> />
<TextInput <TextInput
label="Youtube" label="Youtube"
maxLength={100}
placeholder="Youtube" placeholder="Youtube"
onChange={(val) => { onChange={(val) => {
setMedsos({ setMedsos({
@@ -245,7 +261,15 @@ export default function CreatePortofolio({
loading={loading ? true : false} loading={loading ? true : false}
loaderPosition="center" loaderPosition="center"
onClick={() => { onClick={() => {
onSubmit(router, profileId, value as any, file, medsos, setLoading); onSubmit(
router,
profileId,
value as any,
file,
medsos,
setLoading,
setIsFile
);
}} }}
> >
Simpan Simpan
@@ -263,7 +287,8 @@ async function onSubmit(
dataPorto: MODEL_PORTOFOLIO_OLD, dataPorto: MODEL_PORTOFOLIO_OLD,
file: FormData, file: FormData,
dataMedsos: any, dataMedsos: any,
setLoading: any setLoading: any,
setIsFile: any
) { ) {
const porto = { const porto = {
namaBisnis: dataPorto.namaBisnis, namaBisnis: dataPorto.namaBisnis,
@@ -272,14 +297,13 @@ async function onSubmit(
tlpn: dataPorto.tlpn, tlpn: dataPorto.tlpn,
deskripsi: dataPorto.deskripsi, deskripsi: dataPorto.deskripsi,
}; };
if (_.values(porto).includes("")) if (_.values(porto).includes(""))
return ComponentGlobal_NotifikasiPeringatan("Lengkapi Data"); return ComponentGlobal_NotifikasiPeringatan("Lengkapi Data");
if (!file) if (file === null) {
return ComponentGlobal_NotifikasiPeringatan("Lengkapi logo bisnis"); setIsFile(true);
return null;
if (porto.namaBisnis.length > 100) return null; }
if (porto.alamatKantor.length > 100) return null;
if (porto.deskripsi.length > 150) return null;
const gambar = new FormData(); const gambar = new FormData();
gambar.append("file", file as any); gambar.append("file", file as any);

View File

@@ -13,6 +13,8 @@ import { Portofolio_funEditDataBisnis } from "../../fun/edit/fun_edit_data_bisni
import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input";
import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown";
export default function Portofolio_EditDataBisnis({ export default function Portofolio_EditDataBisnis({
dataPorto, dataPorto,
@@ -35,7 +37,14 @@ export default function Portofolio_EditDataBisnis({
value={value.namaBisnis} value={value.namaBisnis}
label="Nama Bisnis" label="Nama Bisnis"
placeholder="Nama bisnis" placeholder="Nama bisnis"
error={value.namaBisnis.length > 100 ? "Maksimal 100 karakter" : ""} maxLength={100}
error={
value.namaBisnis === "" ? (
<ComponentGlobal_ErrorInput text="Masukan nama bisnis" />
) : (
""
)
}
onChange={(val) => { onChange={(val) => {
setValue({ setValue({
...value, ...value,
@@ -66,8 +75,13 @@ export default function Portofolio_EditDataBisnis({
value={value.alamatKantor} value={value.alamatKantor}
label="Alamat Kantor" label="Alamat Kantor"
placeholder="Alamat kantor" placeholder="Alamat kantor"
maxLength={100}
error={ error={
value.alamatKantor.length > 100 ? "Maksimal 100 karakter" : "" value.alamatKantor === "" ? (
<ComponentGlobal_ErrorInput text="Masukan alamat kantor" />
) : (
""
)
} }
onChange={(val) => { onChange={(val) => {
setValue({ setValue({
@@ -80,8 +94,16 @@ export default function Portofolio_EditDataBisnis({
withAsterisk withAsterisk
value={value.tlpn} value={value.tlpn}
label="Nomor Telepon Kantor" label="Nomor Telepon Kantor"
placeholder="62 xxx xxx xxx" placeholder="Nomor telepon kantor"
type="number" type="number"
maxLength={15}
error={
value.tlpn === "" ? (
<ComponentGlobal_ErrorInput text="Masukan nomor telepon kantor" />
) : (
""
)
}
onChange={(val) => { onChange={(val) => {
setValue({ setValue({
...value, ...value,
@@ -89,6 +111,7 @@ export default function Portofolio_EditDataBisnis({
}); });
}} }}
/> />
<Stack spacing={5}>
<Textarea <Textarea
autosize autosize
minRows={2} minRows={2}
@@ -97,7 +120,14 @@ export default function Portofolio_EditDataBisnis({
value={value.deskripsi} value={value.deskripsi}
label="Deskripsi" label="Deskripsi"
placeholder="Deskripsi singkat mengenai usaha" placeholder="Deskripsi singkat mengenai usaha"
error={value.deskripsi.length > 150 ? "Maksimal 150 karakter" : ""} maxLength={150}
error={
value.deskripsi === "" ? (
<ComponentGlobal_ErrorInput text="Masukan deskripsi" />
) : (
""
)
}
onChange={(val) => { onChange={(val) => {
setValue({ setValue({
...value, ...value,
@@ -105,6 +135,11 @@ export default function Portofolio_EditDataBisnis({
}); });
}} }}
/> />
<ComponentGlobal_InputCountDown
maxInput={150}
lengthInput={value.deskripsi.length}
/>
</Stack>
</Stack> </Stack>
<Button <Button
radius={"xl"} radius={"xl"}
@@ -126,12 +161,13 @@ async function onUpdate(
data: MODEL_PORTOFOLIO, data: MODEL_PORTOFOLIO,
setLoading: any setLoading: any
) { ) {
if (_.values(data).includes("")) if (_.values(data).includes("")) {
return ComponentGlobal_NotifikasiPeringatan("Lengkapi Data"); return null;
}
if (data.namaBisnis.length > 100) return null; // if (data.namaBisnis.length > 100) return null;
if (data.alamatKantor.length > 100) return null; // if (data.alamatKantor.length > 100) return null;
if (data.deskripsi.length > 150) return null; // if (data.deskripsi.length > 150) return null;
await Portofolio_funEditDataBisnis(data).then((res) => { await Portofolio_funEditDataBisnis(data).then((res) => {
if (res.status === 200) { if (res.status === 200) {

View File

@@ -185,7 +185,7 @@ export default function ViewPortofolio({
</Grid> </Grid>
</Stack> </Stack>
</Paper> </Paper>
{userLoginId === dataPorto.Profile.User.id ? ( {userLoginId === dataPorto?.Profile?.User?.id ? (
<Button <Button
radius={"xl"} radius={"xl"}
bg={"red"} bg={"red"}
@@ -233,7 +233,7 @@ async function onDelete(
if (res.status === 200) { if (res.status === 200) {
setLoadingDel(true); setLoadingDel(true);
ComponentGlobal_NotifikasiBerhasil(res.message); ComponentGlobal_NotifikasiBerhasil(res.message);
router.push(RouterProfile.katalog + `${dataPorto.profileId}`); router.back();
} else { } else {
ComponentGlobal_NotifikasiGagal(res.message); ComponentGlobal_NotifikasiGagal(res.message);
} }

View File

@@ -128,17 +128,7 @@ export default function CreateProfile({ userId }: { userId: any }) {
<Stack> <Stack>
<ComponentKatalog_NotedBox informasi="Upload foto latar belakang profile anda." /> <ComponentKatalog_NotedBox informasi="Upload foto latar belakang profile anda." />
<AspectRatio ratio={16 / 9}> <AspectRatio ratio={16 / 9}>
<Paper <Paper radius={"md"} withBorder shadow="lg" bg={"gray.2"}>
radius={"md"}
withBorder
shadow="lg"
bg={"gray.2"}
// sx={{
// borderStyle: "solid",
// borderColor: "black",
// borderWidth: "1px",
// }}
>
{imgBG ? ( {imgBG ? (
<Image alt="Foto" src={imgBG ? imgBG : "/aset/no-img.png"} /> <Image alt="Foto" src={imgBG ? imgBG : "/aset/no-img.png"} />
) : ( ) : (
@@ -197,6 +187,7 @@ export default function CreateProfile({ userId }: { userId: any }) {
<TextInput <TextInput
withAsterisk withAsterisk
label="Nama" label="Nama"
maxLength={50}
placeholder="Nama lengkap" placeholder="Nama lengkap"
onChange={(val) => { onChange={(val) => {
setValue({ setValue({
@@ -209,6 +200,7 @@ export default function CreateProfile({ userId }: { userId: any }) {
withAsterisk withAsterisk
icon={<IconAt size={15} />} icon={<IconAt size={15} />}
label="Email" label="Email"
maxLength={100}
placeholder="Contoh: User@gmail.com" placeholder="Contoh: User@gmail.com"
error={ error={
value.email.length > 0 && !value.email.match(validRegex) value.email.length > 0 && !value.email.match(validRegex)
@@ -225,8 +217,8 @@ export default function CreateProfile({ userId }: { userId: any }) {
<TextInput <TextInput
withAsterisk withAsterisk
label="Alamat" label="Alamat"
maxLength={100}
placeholder="Alamat lengkap" placeholder="Alamat lengkap"
error={value.alamat.length > 100 ? "Max 100 karakter" : ""}
onChange={(val) => { onChange={(val) => {
setValue({ setValue({
...value, ...value,
@@ -288,7 +280,6 @@ function ButtonAction({
if (_.values(body).includes("")) if (_.values(body).includes(""))
return ComponentGlobal_NotifikasiPeringatan("Lengkapi Data"); return ComponentGlobal_NotifikasiPeringatan("Lengkapi Data");
if (!body.email.match(validRegex)) return null; if (!body.email.match(validRegex)) return null;
if (body.alamat.length > 100) return null;
const gambarPP = new FormData(); const gambarPP = new FormData();
gambarPP.append("filePP", filePP as any); gambarPP.append("filePP", filePP as any);

View File

@@ -19,6 +19,7 @@ import { Profile_funEditById } from "../fun/update/fun_edit_profile_by_id";
import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog";
import { validRegex } from "../../component/regular_expressions"; import { validRegex } from "../../component/regular_expressions";
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input";
export default function EditProfile({ data }: { data: MODEL_PROFILE }) { export default function EditProfile({ data }: { data: MODEL_PROFILE }) {
const router = useRouter(); const router = useRouter();
@@ -31,10 +32,8 @@ export default function EditProfile({ data }: { data: MODEL_PROFILE }) {
const body = dataProfile; const body = dataProfile;
// console.log(body) // console.log(body)
if (_.values(body).includes("")) if (_.values(body).includes("")) return null;
return ComponentGlobal_NotifikasiPeringatan("Lengkapi data");
if (!body.email.match(validRegex)) return null; if (!body.email.match(validRegex)) return null;
if (body.alamat.length > 100) return null;
await Profile_funEditById(body).then((res) => { await Profile_funEditById(body).then((res) => {
if (res.status === 200) { if (res.status === 200) {
@@ -77,7 +76,6 @@ export default function EditProfile({ data }: { data: MODEL_PROFILE }) {
value={dataProfile?.User?.username} value={dataProfile?.User?.username}
onChange={(val) => { onChange={(val) => {
// const dataUsername = _.clone(dataProfile) // const dataUsername = _.clone(dataProfile)
setDataProfile({ setDataProfile({
...(dataProfile as any), ...(dataProfile as any),
User: { User: {
@@ -90,7 +88,15 @@ export default function EditProfile({ data }: { data: MODEL_PROFILE }) {
<TextInput <TextInput
withAsterisk withAsterisk
label="Nama" label="Nama"
placeholder="Nama" placeholder="nama"
maxLength={50}
error={
dataProfile?.name === "" ? (
<ComponentGlobal_ErrorInput text="Masukan nama" />
) : (
""
)
}
value={dataProfile?.name} value={dataProfile?.name}
onChange={(val) => { onChange={(val) => {
setDataProfile({ setDataProfile({
@@ -105,10 +111,14 @@ export default function EditProfile({ data }: { data: MODEL_PROFILE }) {
label="Email" label="Email"
placeholder="email" placeholder="email"
error={ error={
dataProfile?.email?.length > 0 && dataProfile?.email === "" ? (
!dataProfile?.email.match(validRegex) <ComponentGlobal_ErrorInput text="Masukan email " />
? "Invalid email" ) : dataProfile?.email?.length > 0 &&
: "" !dataProfile?.email.match(validRegex) ? (
<ComponentGlobal_ErrorInput text="Invalid email" />
) : (
""
)
} }
value={dataProfile?.email} value={dataProfile?.email}
onChange={(val) => { onChange={(val) => {
@@ -124,7 +134,14 @@ export default function EditProfile({ data }: { data: MODEL_PROFILE }) {
label="Alamat" label="Alamat"
placeholder="alamat" placeholder="alamat"
value={dataProfile.alamat} value={dataProfile.alamat}
error={dataProfile.alamat.length > 100 ? "Max 100 karakter" : ""} maxLength={100}
error={
dataProfile?.alamat === "" ? (
<ComponentGlobal_ErrorInput text="Masukan alamat " />
) : (
""
)
}
onChange={(val) => { onChange={(val) => {
setDataProfile({ setDataProfile({
...dataProfile, ...dataProfile,

3
src/util/evn.ts Normal file
View File

@@ -0,0 +1,3 @@
import { EventEmitter } from "events";
export const evnPesan = new EventEmitter();

View File

@@ -4,17 +4,22 @@ import { useEffect, useState } from "react";
import mqtt_client from "./mqtt_client"; import mqtt_client from "./mqtt_client";
import { useAtom } from "jotai"; import { useAtom } from "jotai";
import { gs_coba_chat } from "@/app/makuro/gs_coba"; import { gs_coba_chat } from "@/app/makuro/gs_coba";
import { evnPesan } from "./evn";
export default function MqttLoader() { export default function MqttLoader() {
useEffect(() => { useEffect(() => {
mqtt_client.on("connect", () => { mqtt_client.on("connect", () => {
console.log("connected"); console.log("connected");
// mqtt_client.subscribe("server12"); mqtt_client.subscribe("pesan");
// fetch("").then((res) => {
// mqtt_client.subscribe("pesan");
// });
}); });
// mqtt_client.on("message", (apa) => { mqtt_client.on("message", (apa: any, itu: any) => {
// console.log("Ini yang di utils"); console.log(itu)
// }); evnPesan.emit("pesan", itu);
});
}, []); }, []);
return null; return null;
} }