QC Voting
- # fix - Beranda dan mandatori input ## No issuee
This commit is contained in:
BIN
public/portofolio/logo/5fc311b4-8a01-4385-a87d-87d1a3953d88.png
Normal file
BIN
public/portofolio/logo/5fc311b4-8a01-4385-a87d-87d1a3953d88.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.1 KiB |
BIN
public/portofolio/logo/e3a15736-527c-4b3c-a730-074fa44a48ed.png
Normal file
BIN
public/portofolio/logo/e3a15736-527c-4b3c-a730-074fa44a48ed.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 7.4 KiB |
BIN
public/profile/foto/86585f77-3e32-417f-a414-22ea6858e3fd.jpeg
Normal file
BIN
public/profile/foto/86585f77-3e32-417f-a414-22ea6858e3fd.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
@@ -4,6 +4,7 @@ import ColabViewChat from "@/app_modules/colab/detail/chat";
|
||||
import colab_V2getListMessageByRoomId from "@/app_modules/colab/fun/chat/get_message_by_room_id";
|
||||
import colab_getMessageByRoomId from "@/app_modules/colab/fun/get/room_chat/get_message_by_room_id";
|
||||
import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
|
||||
import { user_getOneByUserId } from "@/app_modules/home/fun/get/get_one_user_by_id";
|
||||
import _ from "lodash";
|
||||
|
||||
export default async function Page({ params }: { params: { id: string } }) {
|
||||
@@ -16,20 +17,23 @@ export default async function Page({ params }: { params: { id: string } }) {
|
||||
"ProjectCollaboration_AnggotaRoomChat",
|
||||
]);
|
||||
let listMsg = await colab_getMessageByRoomId({ roomId: roomId, page: 1 });
|
||||
const dataUserLogin = await user_getOneByUserId(userLoginId);
|
||||
// console.log(dataUserLogin);
|
||||
|
||||
return (
|
||||
<>
|
||||
<ColabViewChat
|
||||
{/* <ColabViewChat
|
||||
listMsg={listMsg as any}
|
||||
dataRoom={dataRoom as any}
|
||||
userLoginId={userLoginId}
|
||||
/>
|
||||
/> */}
|
||||
|
||||
{/* <Colab_GroupChatView
|
||||
<Colab_GroupChatView
|
||||
userLoginId={userLoginId}
|
||||
listMsg={listMsg}
|
||||
selectRoom={dataRoom as any}
|
||||
/> */}
|
||||
dataUserLogin={dataUserLogin as any}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -127,13 +127,13 @@ function DetailRiwayat({ listRiwayat }: { listRiwayat: MODEL_EVENT[] }) {
|
||||
sx={{ borderStyle: "solid", borderWidth: "0.5px" }}
|
||||
radius={"xl"}
|
||||
src={
|
||||
RouterProfile.api_foto_profile + e.User.Profile.imagesId
|
||||
RouterProfile.api_foto_profile + e?.User?.Profile?.imagesId
|
||||
}
|
||||
/>
|
||||
</Grid.Col>
|
||||
<Grid.Col span={"auto"}>
|
||||
<Group align="center" h={"100%"}>
|
||||
<Text>{e.User.Profile.name}</Text>
|
||||
<Text>{e?.User?.Profile?.name}</Text>
|
||||
</Group>
|
||||
</Grid.Col>
|
||||
</Grid>
|
||||
|
||||
@@ -130,13 +130,13 @@ function TableStatus({ listPublish }: { listPublish: MODEL_EVENT[] }) {
|
||||
radius={"xl"}
|
||||
src={
|
||||
RouterProfile.api_foto_profile +
|
||||
e.User.Profile.imagesId
|
||||
e?.User?.Profile?.imagesId
|
||||
}
|
||||
/>
|
||||
</Grid.Col>
|
||||
<Grid.Col span={"auto"}>
|
||||
<Group align="center" h={"100%"}>
|
||||
<Text>{e.User.Profile.name}</Text>
|
||||
<Text>{e?.User?.Profile?.name}</Text>
|
||||
</Group>
|
||||
</Grid.Col>
|
||||
</Grid>
|
||||
|
||||
@@ -69,7 +69,7 @@ function TableStatus({ listReject }: { listReject: MODEL_EVENT[] }) {
|
||||
const TableRows = data.map((e, i) => (
|
||||
<tr key={i}>
|
||||
<td>
|
||||
<Box w={200}>{e.Author.Profile.name}</Box>
|
||||
<Box w={200}>{e?.Author?.Profile?.name}</Box>
|
||||
</td>
|
||||
<td>
|
||||
<Box w={200}>{e.title}</Box>
|
||||
|
||||
@@ -66,7 +66,7 @@ function TableStatus({ listReview }: { listReview: MODEL_EVENT[] }) {
|
||||
|
||||
const TableRows = data.map((e, i) => (
|
||||
<tr key={i}>
|
||||
<td>{e.Author.Profile.name}</td>
|
||||
<td>{e?.Author?.Profile?.name}</td>
|
||||
<td>{e.title}</td>
|
||||
<td>{e.lokasi}</td>
|
||||
<td>{e.EventMaster_TipeAcara.name}</td>
|
||||
|
||||
@@ -70,16 +70,16 @@ function TableStatus({ listPublish }: { listPublish: MODEL_VOTING[] }) {
|
||||
<Center>
|
||||
<Button
|
||||
loading={
|
||||
e.id === voteId ? (loading === true ? true : false) : false
|
||||
e?.id === voteId ? (loading === true ? true : false) : false
|
||||
}
|
||||
radius={"xl"}
|
||||
color="green"
|
||||
leftIcon={<IconEyeCheck />}
|
||||
onClick={async () => {
|
||||
setVoteId(e.id);
|
||||
setVoteId(e?.id);
|
||||
setLoading(true);
|
||||
await new Promise((r) => setTimeout(r, 500));
|
||||
onList(e.id, setHasil, setKontributor, setLoading, open);
|
||||
onList(e?.id, setHasil, setKontributor, setLoading, open);
|
||||
}}
|
||||
>
|
||||
Lihat Hasil
|
||||
@@ -87,7 +87,10 @@ function TableStatus({ listPublish }: { listPublish: MODEL_VOTING[] }) {
|
||||
</Center>
|
||||
</td>
|
||||
<td>
|
||||
<Center>{e.title}</Center>
|
||||
<Center>{e?.Author?.Profile?.name}</Center>
|
||||
</td>
|
||||
<td>
|
||||
<Center>{e?.title}</Center>
|
||||
</td>
|
||||
<td>
|
||||
<Center>
|
||||
@@ -97,27 +100,27 @@ function TableStatus({ listPublish }: { listPublish: MODEL_VOTING[] }) {
|
||||
maxHeight={50}
|
||||
showLabel="tampilkan"
|
||||
>
|
||||
{e.deskripsi}
|
||||
{e?.deskripsi}
|
||||
</Spoiler>
|
||||
</Center>
|
||||
</td>
|
||||
<th>
|
||||
<Stack>
|
||||
{e.Voting_DaftarNamaVote.map((v) => (
|
||||
<Box key={v.id}>
|
||||
<Text>- {v.value}</Text>
|
||||
{e?.Voting_DaftarNamaVote.map((v) => (
|
||||
<Box key={v?.id}>
|
||||
<Text>- {v?.value}</Text>
|
||||
</Box>
|
||||
))}
|
||||
</Stack>
|
||||
</th>
|
||||
<td>
|
||||
<Center>
|
||||
{e.awalVote.toLocaleDateString("id-ID", { dateStyle: "long" })}
|
||||
{e?.awalVote.toLocaleDateString("id-ID", { dateStyle: "long" })}
|
||||
</Center>
|
||||
</td>
|
||||
<td>
|
||||
<Center>
|
||||
{e.akhirVote.toLocaleDateString("id-ID", { dateStyle: "long" })}
|
||||
{e?.akhirVote.toLocaleDateString("id-ID", { dateStyle: "long" })}
|
||||
</Center>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -131,7 +134,10 @@ function TableStatus({ listPublish }: { listPublish: MODEL_VOTING[] }) {
|
||||
size={"xl"}
|
||||
withCloseButton={false}
|
||||
>
|
||||
<ComponentAdminVote_DetailHasil hasil={hasil} kontributor={kontributor}/>
|
||||
<ComponentAdminVote_DetailHasil
|
||||
hasil={hasil}
|
||||
kontributor={kontributor}
|
||||
/>
|
||||
</Modal>
|
||||
<Box>
|
||||
<Box bg={"green.1"} p={"xs"}>
|
||||
@@ -152,6 +158,9 @@ function TableStatus({ listPublish }: { listPublish: MODEL_VOTING[] }) {
|
||||
<th>
|
||||
<Center>Aksi</Center>
|
||||
</th>
|
||||
<th>
|
||||
<Center>Author</Center>
|
||||
</th>
|
||||
<th>
|
||||
<Center>Judul</Center>
|
||||
</th>
|
||||
|
||||
@@ -87,6 +87,9 @@ function TableStatus({ listData }: { listData: MODEL_VOTING[] }) {
|
||||
</Spoiler>
|
||||
</Center>
|
||||
</td>
|
||||
<td>
|
||||
<Center>{e?.Author?.Profile?.name}</Center>
|
||||
</td>
|
||||
<td>
|
||||
<Center>{e.title}</Center>
|
||||
</td>
|
||||
@@ -184,7 +187,9 @@ function TableStatus({ listData }: { listData: MODEL_VOTING[] }) {
|
||||
<th>
|
||||
<Center>Catatan</Center>
|
||||
</th>
|
||||
|
||||
<th>
|
||||
<Center>Author</Center>
|
||||
</th>
|
||||
<th>
|
||||
<Center>Judul</Center>
|
||||
</th>
|
||||
|
||||
@@ -36,6 +36,7 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob
|
||||
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
|
||||
import { AdminEvent_funEditCatatanById } from "../../fun/edit/fun_edit_status_reject_by_id";
|
||||
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
|
||||
import moment from "moment";
|
||||
|
||||
export default function AdminVote_TableReview({
|
||||
listVote,
|
||||
@@ -58,9 +59,14 @@ function TableStatus({ listData }: { listData: MODEL_VOTING[] }) {
|
||||
const [data, setData] = useState(listData);
|
||||
const [votingId, setVotingId] = useState("");
|
||||
const [catatan, setCatatan] = useState("");
|
||||
const [isLoadingPublish, setLoadingPublish] = useState(false);
|
||||
const [isSaveLoading, setSaveLoading] = useState(false);
|
||||
|
||||
const TableRows = data.map((e, i) => (
|
||||
<tr key={i}>
|
||||
<td>
|
||||
<Center>{e?.Author?.Profile?.name}</Center>
|
||||
</td>
|
||||
<td>
|
||||
<Center>{e.title}</Center>
|
||||
</td>
|
||||
@@ -99,11 +105,23 @@ function TableStatus({ listData }: { listData: MODEL_VOTING[] }) {
|
||||
<td>
|
||||
<Stack align="center">
|
||||
<Button
|
||||
loaderPosition="center"
|
||||
loading={
|
||||
e?.id === votingId ? (isLoadingPublish ? true : false) : false
|
||||
}
|
||||
w={120}
|
||||
color={"green"}
|
||||
leftIcon={<IconEyeShare />}
|
||||
radius={"xl"}
|
||||
onClick={() => onPublish(e.id, setData, e.awalVote)}
|
||||
onClick={() =>
|
||||
onPublish(
|
||||
e.id,
|
||||
setData,
|
||||
e.awalVote,
|
||||
setLoadingPublish,
|
||||
setVotingId
|
||||
)
|
||||
}
|
||||
>
|
||||
Publish
|
||||
</Button>
|
||||
@@ -146,12 +164,15 @@ function TableStatus({ listData }: { listData: MODEL_VOTING[] }) {
|
||||
}}
|
||||
/>
|
||||
<Group position="right">
|
||||
<Button radius={"xl"} onClick={() => close()}>
|
||||
Batal
|
||||
</Button>
|
||||
<Button
|
||||
loaderPosition="center"
|
||||
loading={isSaveLoading ? true : false}
|
||||
radius={"xl"}
|
||||
onClick={() => {
|
||||
onReject(votingId, setData, catatan, close);
|
||||
|
||||
// console.log("hehe")
|
||||
onReject(votingId, setData, catatan, close, setSaveLoading);
|
||||
}}
|
||||
>
|
||||
Simpan
|
||||
@@ -178,6 +199,9 @@ function TableStatus({ listData }: { listData: MODEL_VOTING[] }) {
|
||||
>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<Center>Author</Center>
|
||||
</th>
|
||||
<th>
|
||||
<Center>Judul</Center>
|
||||
</th>
|
||||
@@ -217,19 +241,26 @@ function TableStatus({ listData }: { listData: MODEL_VOTING[] }) {
|
||||
);
|
||||
}
|
||||
|
||||
async function onPublish(voteId: string, setData: any, awalVote: Date) {
|
||||
async function onPublish(
|
||||
voteId: string,
|
||||
setData: any,
|
||||
awalVote: Date,
|
||||
setLoadingPublish: any,
|
||||
setVotingId: any
|
||||
) {
|
||||
const hariIni = new Date();
|
||||
if (awalVote < hariIni)
|
||||
return ComponentGlobal_NotifikasiPeringatan(
|
||||
"Tanggal Mulai Votig Lewat, Edit Kembali",
|
||||
1500
|
||||
);
|
||||
const cekHari = moment(awalVote).diff(hariIni, "days");
|
||||
|
||||
if (cekHari < 0)
|
||||
return ComponentGlobal_NotifikasiPeringatan("Tanggal Voting Lewat");
|
||||
|
||||
setVotingId(voteId);
|
||||
await AdminVote_funEditStatusPublishById(voteId).then(async (res) => {
|
||||
if (res.status === 200) {
|
||||
await AdminVote_getListTableByStatusId("2").then((val) => {
|
||||
setData(val);
|
||||
ComponentGlobal_NotifikasiBerhasil(res.message);
|
||||
setLoadingPublish(true);
|
||||
});
|
||||
} else {
|
||||
ComponentGlobal_NotifikasiGagal(res.message);
|
||||
@@ -241,7 +272,8 @@ async function onReject(
|
||||
voteId: string,
|
||||
setData: any,
|
||||
catatan: string,
|
||||
close: any
|
||||
close: any,
|
||||
setSaveLoading: any
|
||||
) {
|
||||
const data = {
|
||||
id: voteId,
|
||||
@@ -251,6 +283,7 @@ async function onReject(
|
||||
if (res.status === 200) {
|
||||
await AdminVote_getListTableByStatusId("2").then((val) => {
|
||||
setData(val);
|
||||
setSaveLoading(true);
|
||||
ComponentGlobal_NotifikasiBerhasil(res.message);
|
||||
close();
|
||||
});
|
||||
|
||||
@@ -1,8 +1,22 @@
|
||||
"use client"
|
||||
"use client";
|
||||
|
||||
import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog";
|
||||
import { MODEL_VOTE_KONTRIBUTOR, MODEL_VOTING_DAFTAR_NAMA_VOTE } from "@/app_modules/vote/model/interface";
|
||||
import { Paper, Stack, Center, Title, Grid, Card, Avatar, Badge, Divider, Text } from "@mantine/core";
|
||||
import {
|
||||
MODEL_VOTE_KONTRIBUTOR,
|
||||
MODEL_VOTING_DAFTAR_NAMA_VOTE,
|
||||
} from "@/app_modules/vote/model/interface";
|
||||
import {
|
||||
Paper,
|
||||
Stack,
|
||||
Center,
|
||||
Title,
|
||||
Grid,
|
||||
Card,
|
||||
Avatar,
|
||||
Badge,
|
||||
Divider,
|
||||
Text,
|
||||
} from "@mantine/core";
|
||||
import _ from "lodash";
|
||||
import router from "next/router";
|
||||
|
||||
@@ -11,7 +25,7 @@ export default function ComponentAdminVote_DetailHasil({
|
||||
kontributor,
|
||||
}: {
|
||||
hasil?: MODEL_VOTING_DAFTAR_NAMA_VOTE[];
|
||||
kontributor?: MODEL_VOTE_KONTRIBUTOR[]
|
||||
kontributor?: MODEL_VOTE_KONTRIBUTOR[];
|
||||
}) {
|
||||
return (
|
||||
<>
|
||||
@@ -58,7 +72,7 @@ export default function ComponentAdminVote_DetailHasil({
|
||||
span={2}
|
||||
onClick={() =>
|
||||
router.push(
|
||||
RouterProfile.katalog + e.Author.Profile.id
|
||||
RouterProfile.katalog + e?.Author?.Profile?.id
|
||||
)
|
||||
}
|
||||
>
|
||||
@@ -73,7 +87,7 @@ export default function ComponentAdminVote_DetailHasil({
|
||||
src={
|
||||
e
|
||||
? RouterProfile.api_foto_profile +
|
||||
e.Author.Profile.imagesId
|
||||
e?.Author?.Profile?.imagesId
|
||||
: "/aset/global/avatar.png"
|
||||
}
|
||||
/>
|
||||
@@ -81,7 +95,7 @@ export default function ComponentAdminVote_DetailHasil({
|
||||
<Grid.Col span={5}>
|
||||
<Stack justify="center" h={"100%"}>
|
||||
<Text truncate fz={"sm"} fw={"bold"}>
|
||||
{e ? e.Author.Profile.name : "Nama author"}
|
||||
{e ? e?.Author?.Profile?.name : "Nama author"}
|
||||
</Text>
|
||||
</Stack>
|
||||
</Grid.Col>
|
||||
|
||||
@@ -23,7 +23,18 @@ export async function AdminVote_getListTableByStatusId(statusId: string) {
|
||||
akhirVote: true,
|
||||
catatan: true,
|
||||
authorId: true,
|
||||
Author: true,
|
||||
Author: {
|
||||
select: {
|
||||
id: true,
|
||||
username: true,
|
||||
Profile: {
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
voting_StatusId: true,
|
||||
Voting_DaftarNamaVote: true,
|
||||
},
|
||||
@@ -52,7 +63,18 @@ export async function AdminVote_getListTableByStatusId(statusId: string) {
|
||||
akhirVote: true,
|
||||
catatan: true,
|
||||
authorId: true,
|
||||
Author: true,
|
||||
Author: {
|
||||
select: {
|
||||
id: true,
|
||||
username: true,
|
||||
Profile: {
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
voting_StatusId: true,
|
||||
Voting_DaftarNamaVote: true,
|
||||
},
|
||||
@@ -63,6 +85,9 @@ export async function AdminVote_getListTableByStatusId(statusId: string) {
|
||||
|
||||
if (statusId === "2") {
|
||||
const getData = await prisma.voting.findMany({
|
||||
orderBy: {
|
||||
updatedAt: "desc",
|
||||
},
|
||||
where: {
|
||||
voting_StatusId: "2",
|
||||
isActive: true,
|
||||
@@ -78,7 +103,18 @@ export async function AdminVote_getListTableByStatusId(statusId: string) {
|
||||
akhirVote: true,
|
||||
catatan: true,
|
||||
authorId: true,
|
||||
Author: true,
|
||||
Author: {
|
||||
select: {
|
||||
id: true,
|
||||
username: true,
|
||||
Profile: {
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
voting_StatusId: true,
|
||||
Voting_DaftarNamaVote: true,
|
||||
},
|
||||
@@ -104,7 +140,18 @@ export async function AdminVote_getListTableByStatusId(statusId: string) {
|
||||
akhirVote: true,
|
||||
catatan: true,
|
||||
authorId: true,
|
||||
Author: true,
|
||||
Author: {
|
||||
select: {
|
||||
id: true,
|
||||
username: true,
|
||||
Profile: {
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
voting_StatusId: true,
|
||||
Voting_DaftarNamaVote: true,
|
||||
},
|
||||
@@ -112,6 +159,4 @@ export async function AdminVote_getListTableByStatusId(statusId: string) {
|
||||
|
||||
return getData;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ export default function ColabViewChat({
|
||||
down: false,
|
||||
});
|
||||
|
||||
const [topik, setTopic] = useState("")
|
||||
const [topik, setTopic] = useState("");
|
||||
|
||||
useShallowEffect(() => {
|
||||
evnPesan.on(topik, (msgg) => {
|
||||
@@ -86,11 +86,8 @@ export default function ColabViewChat({
|
||||
});
|
||||
}, [data]);
|
||||
|
||||
|
||||
|
||||
// Kirim pesan
|
||||
async function onSend() {
|
||||
|
||||
// console.log(JSON.stringify(data[0], null, 2));
|
||||
const kiriman = {
|
||||
id: "clw8glvt4000j12efrecoubug",
|
||||
|
||||
@@ -44,15 +44,19 @@ import useInfiniteScroll, {
|
||||
} from "react-easy-infinite-scroll-hook";
|
||||
import toast from "react-simple-toasts";
|
||||
import colab_getOneMessageById from "../../fun/get/room_chat/get_one_message_by_id";
|
||||
import { MODEL_USER } from "@/app_modules/home/model/interface";
|
||||
import { evnPesan } from "@/util/evn";
|
||||
|
||||
export default function Colab_GroupChatView({
|
||||
userLoginId,
|
||||
listMsg,
|
||||
selectRoom,
|
||||
dataUserLogin,
|
||||
}: {
|
||||
userLoginId: string;
|
||||
listMsg: any;
|
||||
selectRoom: MODEL_COLLABORATION_ROOM_CHAT;
|
||||
dataUserLogin: MODEL_USER;
|
||||
}) {
|
||||
const router = useRouter();
|
||||
const [loadingBack, setLoadingBack] = useState(false);
|
||||
@@ -63,6 +67,7 @@ export default function Colab_GroupChatView({
|
||||
const [totalPage, setTotalPage] = useState(1);
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [isGet, setIsGet] = useState(true);
|
||||
const [newMessageId, setIdMessage] = useState("");
|
||||
|
||||
const next = async (direction: ScrollDirection) => {
|
||||
try {
|
||||
@@ -93,28 +98,32 @@ export default function Colab_GroupChatView({
|
||||
next,
|
||||
rowCount: data.length,
|
||||
hasMore: { up: isGet },
|
||||
scrollThreshold: 0.1,
|
||||
scrollThreshold: 0.5,
|
||||
});
|
||||
|
||||
async function onSend() {
|
||||
await colab_funCreateMessageByUserId(msg, selectRoom.id).then(
|
||||
async (res) => {
|
||||
if (res.status === 200) {
|
||||
mqtt_client.publish(selectRoom.id, msg);
|
||||
setIdMessage(res.data?.id as any);
|
||||
setMsg("");
|
||||
|
||||
await colab_getOneMessageById({
|
||||
messageId: res.data?.id as any,
|
||||
}).then((res) => {
|
||||
// setNewMessage(res);
|
||||
// console.log(res);
|
||||
// const d = JSON.parse(JSON.stringify(res));
|
||||
// setData([...data, ...[d]]);
|
||||
|
||||
mqtt_client.on("message", (a, b) => {
|
||||
setData([...data, ...[res]]);
|
||||
});
|
||||
});
|
||||
const kiriman: MODEL_COLLABORATION_MESSAGE = {
|
||||
createdAt: new Date(),
|
||||
id: newMessageId,
|
||||
isActive: true,
|
||||
message: msg,
|
||||
isFile: false,
|
||||
updatedAt: new Date(),
|
||||
userId: dataUserLogin.id,
|
||||
User: {
|
||||
id: dataUserLogin.id,
|
||||
Profile: {
|
||||
id: dataUserLogin.Profile?.id as any,
|
||||
name: dataUserLogin.Profile?.name as any,
|
||||
},
|
||||
},
|
||||
};
|
||||
mqtt_client.publish(selectRoom.id, JSON.stringify(kiriman));
|
||||
} else {
|
||||
ComponentGlobal_NotifikasiGagal(res.message);
|
||||
}
|
||||
@@ -124,32 +133,38 @@ export default function Colab_GroupChatView({
|
||||
|
||||
useShallowEffect(() => {
|
||||
mqtt_client.subscribe(selectRoom.id);
|
||||
|
||||
// mqtt_client.on("message", (a, b) => {
|
||||
// // loadDataNew(b.toString());
|
||||
// // onList(b);
|
||||
// onList2(newMessage);
|
||||
// mqtt_client.on("message", (topic: any, message: any) => {
|
||||
// onList(message.toString());
|
||||
// });
|
||||
}, []);
|
||||
|
||||
async function onList2(dt: any) {
|
||||
console.log(dt);
|
||||
setData([...data, ...[dt]]);
|
||||
}
|
||||
|
||||
// const loadDataNew = (dt: any) => {
|
||||
// setData([JSON.parse(dt),...data]);
|
||||
// };
|
||||
|
||||
async function onList(b: any) {
|
||||
await colab_getMessageByRoomId({
|
||||
roomId: selectRoom?.id,
|
||||
page: 1,
|
||||
}).then((val) => {
|
||||
const d = JSON.parse(JSON.stringify(val[5]));
|
||||
setData([...data, ...[d]]);
|
||||
// setTotalPage(totalPage);
|
||||
mqtt_client.on("message", (topic: any, message: any) => {
|
||||
let dd = _.clone(data);
|
||||
const a = [...dd, JSON.parse(message)];
|
||||
// console.log(dd.length);
|
||||
setData(a);
|
||||
});
|
||||
}, [data]);
|
||||
|
||||
async function onList(message: any) {
|
||||
const kiriman: MODEL_COLLABORATION_MESSAGE = {
|
||||
createdAt: new Date(),
|
||||
id: newMessageId,
|
||||
isActive: true,
|
||||
message: message,
|
||||
isFile: false,
|
||||
updatedAt: new Date(),
|
||||
userId: dataUserLogin.id,
|
||||
User: {
|
||||
id: dataUserLogin.id,
|
||||
Profile: {
|
||||
id: dataUserLogin.Profile?.id as any,
|
||||
name: dataUserLogin.Profile?.name as any,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const dataLama = _.clone(data);
|
||||
setData([...dataLama, { ...kiriman }]);
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
@@ -42,6 +42,8 @@ export interface MODEL_COLLABORATION_PARTISIPASI {
|
||||
|
||||
export interface MODEL_COLLABORATION_ROOM_CHAT {
|
||||
id: string;
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
name: string;
|
||||
isActive: true;
|
||||
Author: MODEL_USER;
|
||||
@@ -79,5 +81,34 @@ export interface MODEL_COLLABORATION_MESSAGE {
|
||||
userId: string;
|
||||
message: string;
|
||||
isFile: boolean;
|
||||
User: MODEL_USER;
|
||||
User: MODEL_USER_FOR_MESSAGE;
|
||||
}
|
||||
|
||||
interface MODEL_USER_FOR_MESSAGE {
|
||||
id: string;
|
||||
username?: string;
|
||||
nomor?: string;
|
||||
active?: boolean;
|
||||
createdAt?: Date;
|
||||
updatedAt?: Date;
|
||||
masterUserRoleId?: string;
|
||||
Profile?: MODEL_PROFILE_FOR_MESSAGE;
|
||||
}
|
||||
|
||||
|
||||
interface MODEL_PROFILE_FOR_MESSAGE{
|
||||
userId?: string;
|
||||
User?: MODEL_USER;
|
||||
id: string;
|
||||
name: string;
|
||||
email?: string;
|
||||
alamat?: string;
|
||||
jenisKelamin?: string;
|
||||
active?: string;
|
||||
createdAt?: Date;
|
||||
updatedAt?: Date;
|
||||
// ImageProfile?: MODEL_IMAGES;
|
||||
// imagesId?: string;
|
||||
// ImagesBackground?: MODEL_IMAGES;
|
||||
// imagesBackgroundId?: string;
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ import { RouterHome } from "@/app/lib/router_hipmi/router_home";
|
||||
import { useForm } from "@mantine/form";
|
||||
import { useTimeout } from "@mantine/hooks";
|
||||
import { validRegex } from "../../component/regular_expressions";
|
||||
import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input";
|
||||
|
||||
export default function CreateProfile({ userId }: { userId: any }) {
|
||||
const [filePP, setFilePP] = useState<File | null>(null);
|
||||
@@ -203,9 +204,11 @@ export default function CreateProfile({ userId }: { userId: any }) {
|
||||
maxLength={100}
|
||||
placeholder="Contoh: User@gmail.com"
|
||||
error={
|
||||
value.email.length > 0 && !value.email.match(validRegex)
|
||||
? "Invalid email"
|
||||
: ""
|
||||
value.email.length > 0 && !value.email.match(validRegex) ? (
|
||||
<ComponentGlobal_ErrorInput text="Invalid Email" />
|
||||
) : (
|
||||
""
|
||||
)
|
||||
}
|
||||
onChange={(val) => {
|
||||
setValue({
|
||||
|
||||
@@ -23,6 +23,9 @@ export default function ComponentVote_HeaderTamplate({
|
||||
bg?: any;
|
||||
}) {
|
||||
const router = useRouter();
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [isRightLoading, setRightLoading] = useState(false);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Header
|
||||
@@ -35,8 +38,10 @@ export default function ComponentVote_HeaderTamplate({
|
||||
<ActionIcon variant="transparent" disabled></ActionIcon>
|
||||
) : (
|
||||
<ActionIcon
|
||||
loading={isLoading ? true : false}
|
||||
variant="transparent"
|
||||
onClick={() => {
|
||||
setIsLoading(true);
|
||||
if (route === null || route === undefined) {
|
||||
return router.back();
|
||||
} else {
|
||||
@@ -54,8 +59,13 @@ export default function ComponentVote_HeaderTamplate({
|
||||
} else {
|
||||
return (
|
||||
<ActionIcon
|
||||
loading={isRightLoading ? true : false}
|
||||
variant="transparent"
|
||||
onClick={() => router.push(route2)}
|
||||
onClick={() => {
|
||||
setRightLoading;
|
||||
true;
|
||||
router.push(route2);
|
||||
}}
|
||||
>
|
||||
{icon}
|
||||
</ActionIcon>
|
||||
|
||||
@@ -5,7 +5,7 @@ import { Center } from "@mantine/core";
|
||||
export default function ComponentVote_IsEmptyData({ text }: { text: string }) {
|
||||
return (
|
||||
<>
|
||||
<Center h={"50vh"} fz={"sm"} fw={"bold"}>
|
||||
<Center h={"50vh"} fz={"sm"} fw={"bold"} c={"gray"}>
|
||||
{text}
|
||||
</Center>
|
||||
</>
|
||||
|
||||
22
src/app_modules/vote/component/noted_box.tsx
Normal file
22
src/app_modules/vote/component/noted_box.tsx
Normal file
@@ -0,0 +1,22 @@
|
||||
import { Center, Grid, Group, Paper, Text, Title } from "@mantine/core";
|
||||
|
||||
export default function ComponentVote_NotedBox({
|
||||
informasi,
|
||||
}: {
|
||||
informasi: string;
|
||||
}) {
|
||||
return (
|
||||
<>
|
||||
<Paper bg={"blue.3"} p={10}>
|
||||
<Group>
|
||||
<Text fz={10} fs={"italic"}>
|
||||
<Text span inherit c={"red"}>
|
||||
Alasan:{" "}
|
||||
</Text>
|
||||
{informasi}
|
||||
</Text>
|
||||
</Group>
|
||||
</Paper>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -29,9 +29,11 @@ import { data } from "autoprefixer";
|
||||
import { Vote_funCreate } from "../fun/create/create_vote";
|
||||
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
|
||||
import { MODEL_VOTING } from "../model/interface";
|
||||
import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown";
|
||||
|
||||
export default function Vote_Create() {
|
||||
const router = useRouter();
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [hotMenu, setHotMenu] = useAtom(gs_vote_hotMenu);
|
||||
const [tabsStatus, setTabsStatus] = useAtom(gs_vote_status);
|
||||
|
||||
@@ -47,11 +49,11 @@ export default function Vote_Create() {
|
||||
|
||||
const [listVote, setListVote] = useState([
|
||||
{
|
||||
name: "Nama Voting",
|
||||
name: "Nama Pilihan",
|
||||
value: "",
|
||||
},
|
||||
{
|
||||
name: "Nama Voting",
|
||||
name: "Nama Pilihan",
|
||||
value: "",
|
||||
},
|
||||
]);
|
||||
@@ -64,6 +66,7 @@ export default function Vote_Create() {
|
||||
label="Judul"
|
||||
withAsterisk
|
||||
placeholder="Masukan judul"
|
||||
maxLength={100}
|
||||
onChange={(val) => {
|
||||
setData({
|
||||
...data,
|
||||
@@ -71,12 +74,14 @@ export default function Vote_Create() {
|
||||
});
|
||||
}}
|
||||
/>
|
||||
<Stack spacing={5}>
|
||||
<Textarea
|
||||
label="Deskripsi"
|
||||
autosize
|
||||
minRows={2}
|
||||
maxRows={5}
|
||||
withAsterisk
|
||||
maxLength={300}
|
||||
placeholder="Masukan deskripsi"
|
||||
onChange={(val) => {
|
||||
setData({
|
||||
@@ -85,6 +90,11 @@ export default function Vote_Create() {
|
||||
});
|
||||
}}
|
||||
/>
|
||||
<ComponentGlobal_InputCountDown
|
||||
maxInput={300}
|
||||
lengthInput={data.deskripsi.length}
|
||||
/>
|
||||
</Stack>
|
||||
|
||||
<DatePickerInput
|
||||
label="Jangka Waktu"
|
||||
@@ -108,7 +118,7 @@ export default function Vote_Create() {
|
||||
<Stack spacing={0}>
|
||||
<Center>
|
||||
<Text fw={"bold"} fz={"sm"}>
|
||||
Daftar Voting
|
||||
Daftar Pilihan
|
||||
</Text>
|
||||
</Center>
|
||||
|
||||
@@ -119,6 +129,7 @@ export default function Vote_Create() {
|
||||
<TextInput
|
||||
label={e.name}
|
||||
withAsterisk
|
||||
maxLength={100}
|
||||
placeholder="Nama pilihan voting"
|
||||
onChange={(v) => {
|
||||
const val = _.clone(listVote);
|
||||
@@ -131,20 +142,14 @@ export default function Vote_Create() {
|
||||
</Stack>
|
||||
|
||||
<Group position="center">
|
||||
{listVote.length >= 4 ? (
|
||||
""
|
||||
) : (
|
||||
<Button
|
||||
disabled={listVote.length >= 4 ? true : false}
|
||||
compact
|
||||
w={100}
|
||||
radius={"xl"}
|
||||
leftIcon={<IconPlus size={15} />}
|
||||
variant="outline"
|
||||
onClick={() => {
|
||||
// if (listVote.length >= 4)
|
||||
// return ComponentGlobal_NotifikasiPeringatan(
|
||||
// "Daftar Voting Maksimal 4"
|
||||
// );
|
||||
setListVote([
|
||||
...listVote,
|
||||
{ name: "Nama Voting", value: "" },
|
||||
@@ -153,38 +158,39 @@ export default function Vote_Create() {
|
||||
>
|
||||
<Text fz={8}>Tambah List</Text>
|
||||
</Button>
|
||||
)}
|
||||
|
||||
{listVote.length <= 2 ? (
|
||||
""
|
||||
) : (
|
||||
<Button
|
||||
disabled={listVote.length <= 2 ? true : false}
|
||||
compact
|
||||
w={100}
|
||||
radius={"xl"}
|
||||
leftIcon={<IconMinus size={15} />}
|
||||
variant="outline"
|
||||
onClick={() => {
|
||||
if (listVote.length <= 2)
|
||||
return ComponentGlobal_NotifikasiPeringatan(
|
||||
"Daftar Voting Minimal 2"
|
||||
);
|
||||
setListVote([...listVote.slice(0, -1)]);
|
||||
}}
|
||||
>
|
||||
<Text fz={8}>Kurangi List</Text>
|
||||
</Button>
|
||||
)}
|
||||
</Group>
|
||||
</Stack>
|
||||
</Stack>
|
||||
|
||||
<Button
|
||||
// disabled
|
||||
loaderPosition="center"
|
||||
loading={isLoading ? true : false}
|
||||
mt={"lg"}
|
||||
radius={"xl"}
|
||||
onClick={() => {
|
||||
onSave(router, setHotMenu, setTabsStatus, data as any, listVote);
|
||||
onSave(
|
||||
router,
|
||||
setHotMenu,
|
||||
setTabsStatus,
|
||||
data as any,
|
||||
listVote,
|
||||
setIsLoading
|
||||
);
|
||||
}}
|
||||
>
|
||||
Simpan
|
||||
@@ -199,7 +205,8 @@ async function onSave(
|
||||
setHotMenu: any,
|
||||
setTabsStatus: any,
|
||||
data: MODEL_VOTING,
|
||||
listVote: any[]
|
||||
listVote: any[],
|
||||
setIsLoading: any
|
||||
) {
|
||||
if (_.values(data).includes(""))
|
||||
return ComponentGlobal_NotifikasiPeringatan("Lengkapi Data");
|
||||
@@ -213,7 +220,9 @@ async function onSave(
|
||||
return ComponentGlobal_NotifikasiPeringatan("Lengkapi Tanggal");
|
||||
|
||||
if (_.values(listVote.map((e) => e.value)).includes(""))
|
||||
return ComponentGlobal_NotifikasiPeringatan("Isi Semua Nama Voting");
|
||||
return ComponentGlobal_NotifikasiPeringatan("Lengkapi Pilihan Voting");
|
||||
|
||||
// console.log("berhasil");
|
||||
|
||||
await Vote_funCreate(data, listVote).then((res) => {
|
||||
if (res.status === 201) {
|
||||
@@ -221,6 +230,7 @@ async function onSave(
|
||||
setTabsStatus("Review");
|
||||
router.replace(RouterVote.status);
|
||||
ComponentGlobal_NotifikasiBerhasil(res.message);
|
||||
setIsLoading(true);
|
||||
} else {
|
||||
ComponentGlobal_NotifikasiGagal(res.message);
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import { Vote_funEditStatusByStatusId } from "../../fun/edit/fun_edit_status_by_
|
||||
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
|
||||
import { Vote_funDeleteById } from "../../fun/delete/fun_delete_by_id";
|
||||
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
|
||||
import moment from "moment";
|
||||
|
||||
export default function Vote_DetailDraft({
|
||||
dataVote,
|
||||
@@ -41,7 +42,10 @@ function ButtonAction({
|
||||
|
||||
async function onUpdate() {
|
||||
const hariIni = new Date();
|
||||
if (awalVote < hariIni) return ComponentGlobal_NotifikasiPeringatan("Tanggal Voting Lewat");
|
||||
const cekHari = moment(awalVote).diff(hariIni, "days");
|
||||
|
||||
if (cekHari < 0)
|
||||
return ComponentGlobal_NotifikasiPeringatan("Tanggal Voting Lewat");
|
||||
|
||||
await Vote_funEditStatusByStatusId(voteId, "2").then((res) => {
|
||||
if (res.status === 200) {
|
||||
|
||||
@@ -19,6 +19,7 @@ import { MODEL_VOTING } from "../../model/interface";
|
||||
import { Vote_funDeleteById } from "../../fun/delete/fun_delete_by_id";
|
||||
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
|
||||
import { Vote_funEditStatusByStatusId } from "../../fun/edit/fun_edit_status_by_id";
|
||||
import ComponentVote_NotedBox from "../../component/noted_box";
|
||||
|
||||
export default function Vote_DetailReject({
|
||||
dataVote,
|
||||
@@ -28,6 +29,7 @@ export default function Vote_DetailReject({
|
||||
return (
|
||||
<>
|
||||
<Stack spacing={"xl"}>
|
||||
<ComponentVote_NotedBox informasi={dataVote?.catatan} />
|
||||
<ComponentVote_DetailDataSebelumPublish data={dataVote as any} />
|
||||
<ButtonAction voteId={dataVote.id} />
|
||||
</Stack>
|
||||
|
||||
@@ -22,6 +22,7 @@ import ComponentVote_DetailDataSebelumPublish from "../../component/detail/detai
|
||||
import { Vote_funEditStatusByStatusId } from "../../fun/edit/fun_edit_status_by_id";
|
||||
import { MODEL_VOTING } from "../../model/interface";
|
||||
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
|
||||
import { useState } from "react";
|
||||
|
||||
export default function Vote_DetailReview({
|
||||
dataVote,
|
||||
@@ -40,6 +41,7 @@ export default function Vote_DetailReview({
|
||||
|
||||
function ButtonAction({ voteId }: { voteId: string }) {
|
||||
const router = useRouter();
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [tabsStatus, setTabsStatus] = useAtom(gs_vote_status);
|
||||
|
||||
async function onUpdate() {
|
||||
@@ -48,6 +50,7 @@ function ButtonAction({ voteId }: { voteId: string }) {
|
||||
setTabsStatus("Draft");
|
||||
ComponentGlobal_NotifikasiBerhasil("Berhasil Batalkan Review", 2000);
|
||||
router.back();
|
||||
setIsLoading(true);
|
||||
} else {
|
||||
ComponentGlobal_NotifikasiGagal(res.message);
|
||||
}
|
||||
@@ -56,9 +59,11 @@ function ButtonAction({ voteId }: { voteId: string }) {
|
||||
return (
|
||||
<>
|
||||
<Button
|
||||
loaderPosition="center"
|
||||
loading={isLoading ? true : false}
|
||||
radius={"xl"}
|
||||
color="red"
|
||||
onClick={() => {
|
||||
color="orange"
|
||||
onClick={() => {8
|
||||
onUpdate();
|
||||
}}
|
||||
>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil";
|
||||
import {
|
||||
ActionIcon,
|
||||
Box,
|
||||
Button,
|
||||
Center,
|
||||
@@ -15,7 +16,7 @@ import {
|
||||
} from "@mantine/core";
|
||||
import { DatePickerInput } from "@mantine/dates";
|
||||
import { useCounter } from "@mantine/hooks";
|
||||
import { IconHome, IconPlus } from "@tabler/icons-react";
|
||||
import { IconHome, IconMinus, IconPlus, IconTrash } from "@tabler/icons-react";
|
||||
import { useAtom } from "jotai";
|
||||
import moment from "moment";
|
||||
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
|
||||
@@ -27,9 +28,12 @@ import {
|
||||
MODEL_VOTING,
|
||||
MODEL_VOTING_DAFTAR_NAMA_VOTE,
|
||||
} from "../model/interface";
|
||||
import _ from "lodash";
|
||||
import _, { slice } from "lodash";
|
||||
import { Vote_funEditById } from "../fun/edit/fun_edit_by_id";
|
||||
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
|
||||
import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown";
|
||||
import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input";
|
||||
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
|
||||
|
||||
export default function Vote_Edit({
|
||||
dataVote,
|
||||
@@ -39,7 +43,7 @@ export default function Vote_Edit({
|
||||
listDaftarVote: MODEL_VOTING_DAFTAR_NAMA_VOTE[];
|
||||
}) {
|
||||
const [data, setData] = useState(dataVote);
|
||||
const [listVoting, setListVoting] = useState(listDaftarVote);
|
||||
const [pilihanNama, setPilihanNama] = useState(listDaftarVote);
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -47,8 +51,16 @@ export default function Vote_Edit({
|
||||
<TextInput
|
||||
label="Judul"
|
||||
withAsterisk
|
||||
placeholder="Masukan judul"
|
||||
placeholder="Judul"
|
||||
value={data.title}
|
||||
maxLength={100}
|
||||
error={
|
||||
data.title === "" ? (
|
||||
<ComponentGlobal_ErrorInput text="Masukan judul" />
|
||||
) : (
|
||||
""
|
||||
)
|
||||
}
|
||||
onChange={(val) => {
|
||||
setData({
|
||||
...data,
|
||||
@@ -56,14 +68,24 @@ export default function Vote_Edit({
|
||||
});
|
||||
}}
|
||||
/>
|
||||
|
||||
<Stack spacing={5}>
|
||||
<Textarea
|
||||
label="Deskripsi"
|
||||
autosize
|
||||
minRows={2}
|
||||
maxRows={5}
|
||||
withAsterisk
|
||||
placeholder="Masukan deskripsi"
|
||||
placeholder="Deskripsi"
|
||||
value={data.deskripsi}
|
||||
maxLength={300}
|
||||
error={
|
||||
data.deskripsi === "" ? (
|
||||
<ComponentGlobal_ErrorInput text="Masukan deskripsi" />
|
||||
) : (
|
||||
""
|
||||
)
|
||||
}
|
||||
onChange={(val) => {
|
||||
setData({
|
||||
...data,
|
||||
@@ -71,6 +93,11 @@ export default function Vote_Edit({
|
||||
});
|
||||
}}
|
||||
/>
|
||||
<ComponentGlobal_InputCountDown
|
||||
lengthInput={data.deskripsi.length}
|
||||
maxInput={300}
|
||||
/>
|
||||
</Stack>
|
||||
|
||||
<DatePickerInput
|
||||
label="Jangka Waktu"
|
||||
@@ -82,45 +109,97 @@ export default function Vote_Edit({
|
||||
return moment(date).diff(Date.now(), "days") < 0;
|
||||
}}
|
||||
value={[data.awalVote, data.akhirVote]}
|
||||
onChange={(val: any) =>
|
||||
error={
|
||||
data.awalVote === null || data.akhirVote === null ? (
|
||||
<ComponentGlobal_ErrorInput text="Invalid Date" />
|
||||
) : (
|
||||
""
|
||||
)
|
||||
}
|
||||
onChange={(val: any) => {
|
||||
setData({
|
||||
...data,
|
||||
awalVote: val[0],
|
||||
akhirVote: val[1],
|
||||
})
|
||||
}
|
||||
});
|
||||
}}
|
||||
/>
|
||||
|
||||
<Stack spacing={0}>
|
||||
<Center>
|
||||
<Text fw={"bold"} fz={"sm"}>
|
||||
Daftar Voting
|
||||
Daftar Pilihan
|
||||
</Text>
|
||||
</Center>
|
||||
|
||||
<Stack>
|
||||
<Stack>
|
||||
{listVoting.map((e, index) => (
|
||||
<Box key={index}>
|
||||
{pilihanNama.map((e, index) => (
|
||||
<Grid key={index} h="100%" align="center">
|
||||
<Grid.Col span={10}>
|
||||
<Box>
|
||||
<TextInput
|
||||
label={"Nama Voting"}
|
||||
label={"Nama Pilihan"}
|
||||
withAsterisk
|
||||
placeholder="Nama pilihan voting"
|
||||
placeholder="Nama pilihan"
|
||||
value={e.value}
|
||||
maxLength={100}
|
||||
error={
|
||||
e.value === "" ? (
|
||||
<ComponentGlobal_ErrorInput text="Masukan nama pilihan" />
|
||||
) : (
|
||||
""
|
||||
)
|
||||
}
|
||||
onChange={(v) => {
|
||||
const cloneData = _.clone(listVoting);
|
||||
const cloneData = _.clone(pilihanNama);
|
||||
cloneData[index].value = v.currentTarget.value;
|
||||
|
||||
setListVoting([...listVoting]);
|
||||
setPilihanNama([...pilihanNama]);
|
||||
}}
|
||||
/>
|
||||
</Box>
|
||||
</Grid.Col>
|
||||
<Grid.Col span={2} mt={"md"}>
|
||||
<ActionIcon
|
||||
variant="transparent"
|
||||
radius={"xl"}
|
||||
disabled={pilihanNama.length < 3 ? true : false}
|
||||
onClick={() => {
|
||||
pilihanNama.splice(index, 1);
|
||||
setPilihanNama([...pilihanNama]);
|
||||
}}
|
||||
>
|
||||
<IconTrash
|
||||
style={{
|
||||
transition: "0.5s",
|
||||
}}
|
||||
color={pilihanNama.length < 3 ? "gray" : "red"}
|
||||
/>
|
||||
</ActionIcon>
|
||||
</Grid.Col>
|
||||
</Grid>
|
||||
))}
|
||||
</Stack>
|
||||
|
||||
<Group position="center">
|
||||
<Button
|
||||
disabled={pilihanNama.length >= 4 ? true : false}
|
||||
compact
|
||||
w={100}
|
||||
radius={"xl"}
|
||||
leftIcon={<IconPlus size={15} />}
|
||||
variant="outline"
|
||||
onClick={() => {
|
||||
setPilihanNama([...(pilihanNama as any), { value: "" }]);
|
||||
}}
|
||||
>
|
||||
<Text fz={8}>Tambah List</Text>
|
||||
</Button>
|
||||
</Group>
|
||||
</Stack>
|
||||
</Stack>
|
||||
|
||||
<ButtonAction data={data} listVoting={listVoting} />
|
||||
<ButtonAction data={data} listVoting={pilihanNama} />
|
||||
|
||||
{/* <pre>{JSON.stringify(listDaftarVote, null, 2)}</pre> */}
|
||||
</Stack>
|
||||
@@ -136,16 +215,20 @@ function ButtonAction({
|
||||
listVoting: MODEL_VOTING_DAFTAR_NAMA_VOTE[];
|
||||
}) {
|
||||
const router = useRouter();
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [hotMenu, setHotMenu] = useAtom(gs_vote_hotMenu);
|
||||
const [tabsStatus, setTabsStatus] = useAtom(gs_vote_status);
|
||||
|
||||
async function onUpdate() {
|
||||
// console.log(listVoting);
|
||||
|
||||
await Vote_funEditById(data, listVoting).then((res) => {
|
||||
if (res.status === 200) {
|
||||
ComponentGlobal_NotifikasiBerhasil("Berhasil Update");
|
||||
// setHotMenu(1);
|
||||
// setTabsStatus("Draft");
|
||||
router.back();
|
||||
setIsLoading(true);
|
||||
} else {
|
||||
ComponentGlobal_NotifikasiGagal(res.message);
|
||||
}
|
||||
@@ -154,7 +237,14 @@ function ButtonAction({
|
||||
|
||||
return (
|
||||
<>
|
||||
<Button mt={"lg"} radius={"xl"} color="green" onClick={() => onUpdate()}>
|
||||
<Button
|
||||
loaderPosition="center"
|
||||
loading={isLoading ? true : false}
|
||||
mt={"lg"}
|
||||
radius={"xl"}
|
||||
color="green"
|
||||
onClick={() => onUpdate()}
|
||||
>
|
||||
Update
|
||||
</Button>
|
||||
</>
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
MODEL_VOTING_DAFTAR_NAMA_VOTE,
|
||||
} from "../../model/interface";
|
||||
import { revalidatePath } from "next/cache";
|
||||
import _ from "lodash";
|
||||
|
||||
export async function Vote_funEditById(
|
||||
data: MODEL_VOTING,
|
||||
@@ -22,22 +23,34 @@ export async function Vote_funEditById(
|
||||
awalVote: data.awalVote,
|
||||
akhirVote: data.akhirVote,
|
||||
},
|
||||
select: {
|
||||
Voting_DaftarNamaVote: {
|
||||
where: {
|
||||
isActive: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (!updtVoting) return { status: 400, message: "Gagal Update" };
|
||||
|
||||
for (let e of listVoting) {
|
||||
const updtListVoting = await prisma.voting_DaftarNamaVote.updateMany({
|
||||
const delPilihan = await prisma.voting_DaftarNamaVote.deleteMany({
|
||||
where: {
|
||||
id: e.id,
|
||||
votingId: data.id,
|
||||
},
|
||||
});
|
||||
if (!delPilihan) return { status: 400, message: "Gagal Update Pilihan" };
|
||||
|
||||
for (let v of listVoting) {
|
||||
const val = v.value;
|
||||
|
||||
const namaPilihan = await prisma.voting_DaftarNamaVote.create({
|
||||
data: {
|
||||
value: e.value,
|
||||
value: val,
|
||||
votingId: data.id,
|
||||
},
|
||||
});
|
||||
|
||||
if (!updtListVoting)
|
||||
return { status: 400, message: "Gagal Update Daftar Vote" };
|
||||
if (!namaPilihan) return { status: 400, message: "Gagal Membuat List" };
|
||||
}
|
||||
|
||||
revalidatePath("/dev/vote/detail/draft");
|
||||
|
||||
@@ -6,6 +6,7 @@ export async function Vote_getListDaftarNamaById(voteId: string) {
|
||||
const data = await prisma.voting_DaftarNamaVote.findMany({
|
||||
where: {
|
||||
votingId: voteId,
|
||||
isActive: true,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -21,15 +21,17 @@ export async function Vote_getOnebyId(voteId: string) {
|
||||
voting_StatusId: true,
|
||||
Voting_DaftarNamaVote: {
|
||||
orderBy: {
|
||||
createdAt: "asc"
|
||||
}
|
||||
createdAt: "asc",
|
||||
},
|
||||
where: {
|
||||
isActive: true,
|
||||
},
|
||||
},
|
||||
Author: {
|
||||
select: {
|
||||
Profile: true
|
||||
}
|
||||
}
|
||||
|
||||
Profile: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ import {
|
||||
Title,
|
||||
rem,
|
||||
} from "@mantine/core";
|
||||
import { IconCirclePlus } from "@tabler/icons-react";
|
||||
import { IconCirclePlus, IconPencilPlus } from "@tabler/icons-react";
|
||||
import moment from "moment";
|
||||
import { useRouter } from "next/navigation";
|
||||
import ComponentVote_CardViewPublish from "../component/card_view_publish";
|
||||
@@ -27,6 +27,8 @@ import { MODEL_VOTING } from "../model/interface";
|
||||
import ComponentGlobal_AuthorNameOnHeader from "@/app_modules/component_global/author_name_on_header";
|
||||
import _ from "lodash";
|
||||
import ComponentVote_IsEmptyData from "../component/is_empty_data";
|
||||
import { useState } from "react";
|
||||
import { useWindowScroll } from "@mantine/hooks";
|
||||
|
||||
export default function Vote_Beranda({
|
||||
dataVote,
|
||||
@@ -34,25 +36,33 @@ export default function Vote_Beranda({
|
||||
dataVote: MODEL_VOTING[];
|
||||
}) {
|
||||
const router = useRouter();
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [scroll, scrollTo] = useWindowScroll();
|
||||
|
||||
return (
|
||||
<>
|
||||
<Affix position={{ bottom: rem(150), right: rem(30) }}>
|
||||
<ActionIcon
|
||||
loading={isLoading ? true : false}
|
||||
opacity={scroll.y > 0 ? 0.5 : ""}
|
||||
style={{
|
||||
transition: "0.5s",
|
||||
}}
|
||||
size={"xl"}
|
||||
radius={"xl"}
|
||||
variant="transparent"
|
||||
bg={"blue"}
|
||||
onClick={() => {
|
||||
setIsLoading(true);
|
||||
router.push(RouterVote.create);
|
||||
}}
|
||||
>
|
||||
<IconCirclePlus color="white" size={40} />
|
||||
<IconPencilPlus color="white" />
|
||||
</ActionIcon>
|
||||
</Affix>
|
||||
|
||||
{_.isEmpty(dataVote) ? (
|
||||
<ComponentVote_IsEmptyData text="Tidak ada data"/>
|
||||
<ComponentVote_IsEmptyData text="Tidak ada data" />
|
||||
) : (
|
||||
<Stack>
|
||||
{dataVote.map((e, i) => (
|
||||
|
||||
@@ -10,16 +10,16 @@ export default function MqttLoader() {
|
||||
useEffect(() => {
|
||||
mqtt_client.on("connect", () => {
|
||||
console.log("connected");
|
||||
mqtt_client.subscribe("pesan");
|
||||
// mqtt_client.subscribe("pesan");
|
||||
// fetch("").then((res) => {
|
||||
// mqtt_client.subscribe("pesan");
|
||||
// });
|
||||
});
|
||||
|
||||
mqtt_client.on("message", (apa: any, itu: any) => {
|
||||
console.log(itu)
|
||||
evnPesan.emit("pesan", itu);
|
||||
});
|
||||
// mqtt_client.on("message", (apa: any, itu: any) => {
|
||||
// console.log(itu)
|
||||
// evnPesan.emit("pesan", itu);
|
||||
// });
|
||||
}, []);
|
||||
return null;
|
||||
}
|
||||
|
||||
25
zCoba.js
25
zCoba.js
@@ -53,14 +53,23 @@ const _ = require("lodash");
|
||||
|
||||
// randomNumberPerSecond()
|
||||
|
||||
function CobaTanggal() {
|
||||
const tgl = "2024-01-25T12:00:24.008Z";
|
||||
const i = _.random(0, 100);
|
||||
// setInterval(() => console.log("hello" + i), 1000);
|
||||
const waktu = Date.now()
|
||||
const dt = moment(waktu).locale("fr").format()
|
||||
console.log(dt)
|
||||
// function CobaTanggal() {
|
||||
// const tgl = "2024-01-25T12:00:24.008Z";
|
||||
// const i = _.random(0, 100);
|
||||
// // setInterval(() => console.log("hello" + i), 1000);
|
||||
// const waktu = Date.now()
|
||||
// const dt = moment(waktu).locale("fr").format()
|
||||
// console.log(dt)
|
||||
|
||||
// }
|
||||
|
||||
// CobaTanggal();
|
||||
|
||||
function CobaSplice() {
|
||||
let array = [1, 2, 3, 4, 5];
|
||||
let indexToRemove = 1;
|
||||
array.splice(indexToRemove, 1);
|
||||
console.log(array);
|
||||
}
|
||||
|
||||
CobaTanggal();
|
||||
CobaSplice();
|
||||
|
||||
Reference in New Issue
Block a user