@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
|
All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.2.21](https://github.com/bipproduction/hipmi/compare/v1.2.20...v1.2.21) (2024-12-09)
|
||||||
|
|
||||||
## [1.2.20](https://github.com/bipproduction/hipmi/compare/v1.2.19...v1.2.20) (2024-12-09)
|
## [1.2.20](https://github.com/bipproduction/hipmi/compare/v1.2.19...v1.2.20) (2024-12-09)
|
||||||
|
|
||||||
## [1.2.19](https://github.com/bipproduction/hipmi/compare/v1.2.18...v1.2.19) (2024-12-06)
|
## [1.2.19](https://github.com/bipproduction/hipmi/compare/v1.2.18...v1.2.19) (2024-12-06)
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "hipmi",
|
"name": "hipmi",
|
||||||
"version": "1.2.20",
|
"version": "1.2.21",
|
||||||
"private": true,
|
"private": true,
|
||||||
"prisma": {
|
"prisma": {
|
||||||
"seed": "npx tsx prisma/seed.ts --yes"
|
"seed": "npx tsx prisma/seed.ts --yes"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "bun --bun run next dev --experimental-https",
|
"dev": "bun --bun run next dev --experimental-https",
|
||||||
"build": "NODE_OPTIONS='--max-old-space-size=2048' bun --bun run next build",
|
"build": "NODE_OPTIONS='--max-old-space-size=2048' bun --bun run next build",
|
||||||
|
|||||||
67
src/app/api/new/forum/route.ts
Normal file
67
src/app/api/new/forum/route.ts
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
import { prisma } from "@/app/lib"
|
||||||
|
import { NextResponse } from "next/server";
|
||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
// GET ALL DATA PORTOFOLIO BY PROFILE ID
|
||||||
|
export async function GET(request: Request) {
|
||||||
|
try {
|
||||||
|
const { searchParams } = new URL(request.url)
|
||||||
|
const page = searchParams.get("page")
|
||||||
|
const search = searchParams.get("search")
|
||||||
|
const dataSkip = Number(page) * 5 - 5;
|
||||||
|
|
||||||
|
const data = await prisma.forum_Posting.findMany({
|
||||||
|
take: 5,
|
||||||
|
skip: dataSkip,
|
||||||
|
orderBy: {
|
||||||
|
createdAt: "desc",
|
||||||
|
},
|
||||||
|
where: {
|
||||||
|
isActive: true,
|
||||||
|
diskusi: {
|
||||||
|
mode: "insensitive",
|
||||||
|
contains: (search == undefined || search == "null") ? "" : search,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
diskusi: true,
|
||||||
|
createdAt: true,
|
||||||
|
isActive: true,
|
||||||
|
authorId: true,
|
||||||
|
Author: {
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
username: true,
|
||||||
|
Profile: {
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
name: true,
|
||||||
|
imageId: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Forum_Komentar: {
|
||||||
|
where: {
|
||||||
|
isActive: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ForumMaster_StatusPosting: {
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
status: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
forumMaster_StatusPostingId: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return NextResponse.json({ success: true, message: "Berhasil mendapatkan data", data }, { status: 200 });
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
return NextResponse.json({ success: false, message: "Gagal mendapatkan data, coba lagi nanti ", reason: (error as Error).message, }, { status: 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,6 +20,7 @@ import { Event_funJoinAndConfirmEvent } from "../fun/create/fun_join_and_confirm
|
|||||||
import { gs_event_hotMenu } from "../global_state";
|
import { gs_event_hotMenu } from "../global_state";
|
||||||
import { MODEL_EVENT } from "../model/interface";
|
import { MODEL_EVENT } from "../model/interface";
|
||||||
import { Event_funJoinEvent } from "../fun/create/fun_join_event";
|
import { Event_funJoinEvent } from "../fun/create/fun_join_event";
|
||||||
|
import "moment/locale/id";
|
||||||
|
|
||||||
export default function Ui_Konfirmasi({
|
export default function Ui_Konfirmasi({
|
||||||
userLoginId,
|
userLoginId,
|
||||||
@@ -88,7 +89,7 @@ export default function Ui_Konfirmasi({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Jika tanggal acara lewat
|
// Jika tanggal acara sudah lewat
|
||||||
if (moment(data?.tanggalSelesai).diff(moment(), "minute") < 0) {
|
if (moment(data?.tanggalSelesai).diff(moment(), "minute") < 0) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -97,6 +98,15 @@ export default function Ui_Konfirmasi({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Jika join true
|
||||||
|
if (isJoin == true && moment(data?.tanggal).diff(moment(), "minute") > 0) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<UserJoinTrue title={data?.title} tanggal={data?.tanggal} />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Jika belum join dan tanggal mulai acara belum lewat
|
// Jika belum join dan tanggal mulai acara belum lewat
|
||||||
if (isJoin == false && moment(data?.tanggal).diff(moment(), "minute") > 0) {
|
if (isJoin == false && moment(data?.tanggal).diff(moment(), "minute") > 0) {
|
||||||
return (
|
return (
|
||||||
@@ -125,8 +135,13 @@ export default function Ui_Konfirmasi({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Jika sudah join, belum konfirm dan acara sudah mulai
|
// Jika sudah join, sudah konfirmasi dan tanggal mulai acara sudah lewat
|
||||||
if (isPresent && moment(data?.tanggal).diff(moment(), "minute") < 0) {
|
// if (isPresent && moment(data?.tanggal).diff(moment(), "minute") < 0)
|
||||||
|
if (
|
||||||
|
isPresent &&
|
||||||
|
isJoin &&
|
||||||
|
moment(data?.tanggal).diff(moment(), "minute") < 0
|
||||||
|
) {
|
||||||
return <UserAlreadyConfirm title={data.title} />;
|
return <UserAlreadyConfirm title={data.title} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,6 +214,52 @@ function SkeletonIsDataNull() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function UserJoinTrue({ title, tanggal }: { title: string; tanggal: Date }) {
|
||||||
|
const router = useRouter();
|
||||||
|
const [isLoading, setLoading] = useState(false);
|
||||||
|
const [hotMenu, setHotMenu] = useAtom(gs_event_hotMenu);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<UIGlobal_LayoutDefault>
|
||||||
|
<Stack h={"100vh"} justify="center">
|
||||||
|
<ComponentGlobal_CardStyles>
|
||||||
|
<Stack align="center" justify="center">
|
||||||
|
<Text align="center">
|
||||||
|
Terima kasih, Bapak/Ibu, Anda telah berhasil bergabung dalam
|
||||||
|
acara{" "}
|
||||||
|
<Text inherit span fw={"bold"}>
|
||||||
|
{title}
|
||||||
|
</Text>{" "}
|
||||||
|
. Mohon ditunggu hingga tanggal{" "}
|
||||||
|
<Text inherit span fw={"bold"}>
|
||||||
|
{moment(tanggal).format("DD-MM-YYYY")}
|
||||||
|
</Text>{" "}
|
||||||
|
untuk melakukan konfirmasi kehadiran melalui aplikasi HIPMI APP.
|
||||||
|
</Text>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
loading={isLoading}
|
||||||
|
loaderPosition="center"
|
||||||
|
radius={"xl"}
|
||||||
|
color="green"
|
||||||
|
c={"black"}
|
||||||
|
onClick={() => {
|
||||||
|
setHotMenu(0);
|
||||||
|
setLoading(true);
|
||||||
|
router.push(RouterEvent.beranda, { scroll: false });
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Beranda
|
||||||
|
</Button>
|
||||||
|
</Stack>
|
||||||
|
</ComponentGlobal_CardStyles>
|
||||||
|
</Stack>
|
||||||
|
</UIGlobal_LayoutDefault>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function UserAllowToJoin({
|
function UserAllowToJoin({
|
||||||
title,
|
title,
|
||||||
tanggal,
|
tanggal,
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ export default function DrawerKatalogNew({ opened, close, userRoleId, userId }:
|
|||||||
))}
|
))}
|
||||||
|
|
||||||
<Component_ButtonLogout userId={userId} />
|
<Component_ButtonLogout userId={userId} />
|
||||||
{userRoleId != "1" && (
|
{userRoleId != "1" && userRoleId != "" && (
|
||||||
<Stack align="center" spacing={"xs"}>
|
<Stack align="center" spacing={"xs"}>
|
||||||
<ActionIcon
|
<ActionIcon
|
||||||
variant="transparent"
|
variant="transparent"
|
||||||
|
|||||||
@@ -15,9 +15,11 @@ export default function LayoutKatalogNew({ children }: { children: any }) {
|
|||||||
const [userRoleId, setUserRoleId] = useState("")
|
const [userRoleId, setUserRoleId] = useState("")
|
||||||
const [userLoginId, setUserLoginId] = useState("")
|
const [userLoginId, setUserLoginId] = useState("")
|
||||||
const [opened, { open, close }] = useDisclosure()
|
const [opened, { open, close }] = useDisclosure()
|
||||||
|
const [loading, setLoading] = useState(true);
|
||||||
|
|
||||||
async function getProfile() {
|
async function getProfile() {
|
||||||
try {
|
try {
|
||||||
|
setLoading(true)
|
||||||
const response = await apiGetUserProfile(`?profile=${param.id}`)
|
const response = await apiGetUserProfile(`?profile=${param.id}`)
|
||||||
const response2 = await funGetUserIdByToken()
|
const response2 = await funGetUserIdByToken()
|
||||||
if (response.success) {
|
if (response.success) {
|
||||||
@@ -27,6 +29,8 @@ export default function LayoutKatalogNew({ children }: { children: any }) {
|
|||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
} finally {
|
||||||
|
setLoading(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,13 +45,15 @@ export default function LayoutKatalogNew({ children }: { children: any }) {
|
|||||||
<UIGlobal_LayoutHeaderTamplate
|
<UIGlobal_LayoutHeaderTamplate
|
||||||
title="KATALOG"
|
title="KATALOG"
|
||||||
customButtonRight={
|
customButtonRight={
|
||||||
authorId !== userLoginId ? (
|
loading ?
|
||||||
<ActionIcon disabled variant="transparent"></ActionIcon>
|
<ActionIcon disabled variant="transparent"></ActionIcon> :
|
||||||
) : (
|
authorId == userLoginId ? (
|
||||||
<ActionIcon c="white" variant="transparent" onClick={() => open()}>
|
<ActionIcon c="white" variant="transparent" onClick={() => open()}>
|
||||||
<IconDotsVertical />
|
<IconDotsVertical />
|
||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
)
|
) : (
|
||||||
|
<ActionIcon disabled variant="transparent"></ActionIcon>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import { APIs } from "@/app/lib";
|
import { APIs } from "@/app/lib";
|
||||||
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
|
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
|
||||||
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
|
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
|
||||||
import { Avatar, Stack } from "@mantine/core";
|
import { Avatar, Loader, Stack } from "@mantine/core";
|
||||||
import { useShallowEffect } from "@mantine/hooks";
|
import { useShallowEffect } from "@mantine/hooks";
|
||||||
import "mapbox-gl/dist/mapbox-gl.css";
|
import "mapbox-gl/dist/mapbox-gl.css";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
@@ -44,7 +44,10 @@ export function UiMap_MapBoxViewNew({ mapboxToken, }: { mapboxToken: string }) {
|
|||||||
<Stack style={{ borderRadius: "10px" }}>
|
<Stack style={{ borderRadius: "10px" }}>
|
||||||
{
|
{
|
||||||
loading ?
|
loading ?
|
||||||
<></> :
|
<Stack align="center" spacing="sm">
|
||||||
|
<Loader color="gray" variant="dots" />
|
||||||
|
</Stack>
|
||||||
|
:
|
||||||
<Map
|
<Map
|
||||||
mapboxAccessToken={mapboxToken}
|
mapboxAccessToken={mapboxToken}
|
||||||
mapStyle={"mapbox://styles/mapbox/streets-v11"}
|
mapStyle={"mapbox://styles/mapbox/streets-v11"}
|
||||||
|
|||||||
Reference in New Issue
Block a user