Merge pull request #109 from bipproduction/amalia/13-agustus-24

Amalia/13 agustus 24
This commit is contained in:
Amalia
2024-08-13 13:36:45 +08:00
committed by GitHub
82 changed files with 253 additions and 780 deletions

View File

@@ -1,8 +1,12 @@
import { ViewCreateDiscussion } from "@/module/division_new";
import { LayoutNavbarNew } from "@/module/_global";
import { FormCreateDiscussion } from "@/module/discussion";
function Page() {
return (
<ViewCreateDiscussion />
<>
<LayoutNavbarNew back="" title="Tambah Diskusi" menu={<></>} />
<FormCreateDiscussion />
</>
)
}

View File

@@ -1,9 +1,12 @@
import { ViewListDiscussion } from '@/module/division_new';
import { ListDiscussion, NavbarListDiscussion } from '@/module/discussion';
import React from 'react';
function Page() {
return (
<ViewListDiscussion />
<div>
<NavbarListDiscussion />
<ListDiscussion />
</div>
);
}

View File

@@ -1,12 +1,12 @@
import { ViewFilter } from '@/module/_global';
import { ListDivision, ViewCreateReport } from '@/module/division_new';
import { CreateReport, ListDivision } from '@/module/division_new';
import React from 'react';
function Page({ searchParams }: { searchParams: { page: string } }) {
if (searchParams.page == "filter")
return <ViewFilter linkFilter='division'/>
if (searchParams.page == "report")
return <ViewCreateReport />
return <CreateReport />
return (
<ListDivision/>
);

View File

@@ -1,8 +1,8 @@
import { ViewReportDivision } from "@/module/division_new"
import { ReportDivisionId } from "@/module/division_new"
function Page() {
return (
<ViewReportDivision/>
<ReportDivisionId />
)
}

View File

@@ -1,6 +0,0 @@
import { apiDiscussion } from "@/module/division_new";
import { NextRequest } from "next/server";
export async function GET(req: NextRequest) {
return apiDiscussion(req, "GET")
}

View File

@@ -1,6 +0,0 @@
import { apiDiscussion } from "@/module/division_new";
import { NextRequest } from "next/server";
export async function POST(req: NextRequest) {
return apiDiscussion(req, "POST")
}

View File

@@ -0,0 +1,119 @@
import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth";
import _ from "lodash";
import { NextResponse } from "next/server";
// GET ALL DISCUSSION DIVISION ACTIVE = TRUE
export async function GET(request: Request) {
try {
const user = await funGetUserByCookies()
if (user.id == undefined) {
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
}
const { searchParams } = new URL(request.url);
const idDivision = searchParams.get("division");
const title = searchParams.get('search');
if (idDivision != "null" && idDivision != null && idDivision != undefined) {
const cekDivision = await prisma.division.count({
where: {
id: idDivision,
isActive: true
}
})
if (cekDivision == 0) {
return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 404 });
}
const data = await prisma.divisionDisscussion.findMany({
where: {
isActive: true,
idDivision: idDivision,
title: {
contains: (title == undefined || title == "null") ? "" : title,
mode: "insensitive"
}
},
orderBy: {
createdAt: 'desc'
},
select: {
id: true,
title: true,
desc: true,
status: true,
createdAt: true,
User: {
select: {
name: true
}
},
DivisionDisscussionComment: {
select: {
id: true,
}
}
}
});
const fixData = data.map((v: any) => ({
..._.omit(v, ["User", "DivisionDisscussionComment"]),
user_name: v.User.name,
total_komentar: v.DivisionDisscussionComment.length
}))
return NextResponse.json({ success: true, message: "Berhasil mendapatkan diskusi", data: fixData, }, { status: 200 });
} else {
return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 404 });
}
} catch (error) {
console.log(error);
return NextResponse.json({ success: false, message: "Gagal mendapatkan diskusi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
}
}
// CREATE DISCUSSION
export async function POST(request: Request) {
try {
const user = await funGetUserByCookies()
if (user.id == undefined) {
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
}
const { idDivision, desc } = (await request.json());
const cekDivision = await prisma.division.count({
where: {
id: idDivision,
isActive: true
}
})
if (cekDivision == 0) {
return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 404 });
}
const data = await prisma.divisionDisscussion.create({
data: {
idDivision,
desc,
createdBy: user.id
},
});
return NextResponse.json({ success: true, message: "Berhasil menambahkan diskusi", data, }, { status: 200 });
} catch (error) {
console.log(error);
return NextResponse.json({ success: false, message: "Gagal menambahkan diskusi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
}
};

View File

@@ -1,7 +0,0 @@
import { apiDivision } from "@/module/division_new";
import { NextRequest } from "next/server";
export const dynamic = 'force-dynamic'
export async function GET(req: NextRequest) {
return apiDivision(req, "GET")
}

View File

@@ -1,6 +0,0 @@
import { apiDivision } from "@/module/division_new";
import { NextRequest } from "next/server";
export async function POST(req: NextRequest) {
return apiDivision(req, "POST")
}

View File

@@ -19,7 +19,7 @@ export async function GET(request: Request) {
const idGroup = searchParams.get("group");
const name = searchParams.get('search');
if (idGroup == null || idGroup == undefined) {
if (idGroup == "null" || idGroup == undefined) {
grup = user.idGroup
} else {
grup = idGroup
@@ -31,7 +31,7 @@ export async function GET(request: Request) {
idVillage: String(villaId),
idGroup: grup,
name: {
contains: (name == undefined || name == null) ? "" : name,
contains: (name == undefined || name == "null") ? "" : name,
mode: "insensitive"
}
},

View File

@@ -9,13 +9,16 @@ export async function GET(request: Request) {
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
}
const res = await prisma.userRole.findMany({
where: {
isActive: true
},
select: {
id: true,
name: true,
},
});
return NextResponse.json({ success: true, message: "Berhasil role user", data: res, }, { status: 200 });
return NextResponse.json({ success: true, message: "Berhasil mendapatkan role user", data: res, }, { status: 200 });
} catch (error) {
console.error(error);
return NextResponse.json({ success: false, message: "Gagal mendapatkan role user, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });

View File

@@ -1,45 +0,0 @@
export const API_ADDRESS = {
// Group
"apiGetAllGroup": "/api/group/get?path=get-all-group",
"apiGetOneGroup": "/api/group/get?path=get-one-group",
"apiCreateGroup": "/api/group/post?path=create-group",
"apiUpdateGroup": "/api/group/post?path=update-group",
"apiDeleteGroup": "/api/group/post?path=delete-group",
// User
"apiGetAllUser": "/api/user/get?path=get-all-users",
"apiGetOneUser": "/api/user/get?path=get-one-users",
"apiCreateUser": "/api/user/post?path=create-users",
"apiUpdateUser": "/api/user/post?path=update-users",
"apiDeleteUser": "/api/user/post?path=delete-users",
"apiGetRoleUser": "/api/user/get?path=get-role-user",
// Announcement
"apiGetAllAnnouncement": "/api/announcement/get?path=get-all-announcement",
"apiGetOneAnnouncement": "/api/announcement/get?path=get-one-announcement",
"apiGetUserAnnouncement": "/api/announcement/get?path=get-user-announcement",
"apiCreateAnnouncement": "/api/announcement/post?path=create-announcement",
"apiUpdateAnnouncement": "/api/announcement/post?path=update-announcement",
"apiDeleteAnnouncement": "/api/announcement/post?path=delete-announcement",
// Village
"apiGetAllVillage": "/api/village/get?path=get-all-village",
"apiGetOneVillage": "/api/village/get?path=get-one-village",
"apiCreateVillage": "/api/village/post?path=create-village",
"apiUpdateVillage": "/api/village/post?path=update-village",
"apiDeleteVillage": "/api/village/post?path=delete-village",
// Position
"apiGetAllPosition": "/api/position/get?path=get-all-position",
"apiGetOnePosition": "/api/position/get?path=get-one-position",
"apiCreatePosition": "/api/position/post?path=create-position",
"apiUpdatePosition": "/api/position/post?path=update-position",
"apiDeletePosition": "/api/position/post?path=delete-position",
// Division
"apiGetAllDivision": "/api/division/get?path=get-all-division",
"apiGetOneDivision": "/api/division/get?path=get-one-division",
"apiGetOneDetailDivision": "/api/division/get?path=get-one-detail-division",
"apiCreateDivision": "/api/division/post?path=create-division",
}

View File

@@ -1,4 +1,3 @@
import { API_ADDRESS } from "./bin/api_address";
import prisma from "./bin/prisma";
import { pwd_key_config } from "./bin/val_global";
import SkeletonSingle from "./components/skeleton_single";
@@ -21,5 +20,4 @@ export { LayoutNavbarNew };
export { ViewFilter };
export { prisma };
export { pwd_key_config };
export { API_ADDRESS };
export {SkeletonSingle}

View File

@@ -1,5 +1,4 @@
"use client"
import { API_ADDRESS } from "@/module/_global";
import { Box, Flex, Grid, Group, Spoiler, Stack, Text } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
import { useState } from "react";

View File

@@ -1,5 +1,5 @@
'use client'
import { API_ADDRESS, WARNA } from '@/module/_global';
import { WARNA } from '@/module/_global';
import { ActionIcon, Box, Center, Divider, Grid, Group, Spoiler, Text, TextInput } from '@mantine/core';
import React, { useState } from 'react';
import { TfiAnnouncement } from "react-icons/tfi";

View File

@@ -0,0 +1,7 @@
import FormCreateDiscussion from "./ui/form_create_discussion";
import ListDiscussion from "./ui/list_discussion";
import NavbarListDiscussion from "./ui/navbar_list_discussion";
export { ListDiscussion }
export { NavbarListDiscussion }
export { FormCreateDiscussion }

View File

@@ -0,0 +1,20 @@
import { IFormDiscussion } from "./type_discussion";
export const funGetAllDiscussion = async (path?: string) => {
const response = await fetch(`/api/discussion${(path) ? path : ''}`, { next: { tags: ['discussion'] } });
return await response.json().catch(() => null);
}
export const funCreateDiscussion = async (data: IFormDiscussion) => {
if (data.desc == "")
return { success: false, message: 'Diskusi tidak boleh kosong' }
const response = await fetch("/api/discussion", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(data),
});
return await response.json().catch(() => null);
}

View File

@@ -0,0 +1,14 @@
export interface IDataDiscussion {
id: string
title: string
desc: string
status: boolean
createdAt: string
user_name: string
total_komentar: number
}
export interface IFormDiscussion {
desc: string,
idDivision: string
}

View File

@@ -1,15 +1,18 @@
import { WARNA } from "@/module/_global";
import { Box, Stack, SimpleGrid, Flex, Text } from "@mantine/core";
import { useParams } from "next/navigation";
import { IoAddCircle } from "react-icons/io5";
export default function DrawerListDiscussion() {
const param = useParams<{ id: string }>()
return (
<Box>
<Stack pt={10}>
<SimpleGrid
cols={{ base: 2, sm: 2, lg: 3 }}
>
<Flex onClick={() => window.location.href = "/discussion/create"} justify={'center'} align={'center'} direction={'column'} >
<Flex onClick={() => window.location.href = "/division/" + param.id + "/discussion/create"} justify={'center'} align={'center'} direction={'column'} >
<Box>
<IoAddCircle size={30} color={WARNA.biruTua} />
</Box>

View File

@@ -1,14 +0,0 @@
import { NextRequest } from "next/server";
import { API_INDEX_DISCUSSION } from "./api_index";
type Method = "GET" | "POST";
export async function apiDiscussion(req: NextRequest, method: Method) {
const { searchParams } = new URL(req.url);
const path = searchParams.get("path");
const act = API_INDEX_DISCUSSION.find((v) => v.path === path && v.method === method);
if (!path)
return Response.json({ message: "page not found" }, { status: 404 });
if (act) return act.bin(req);
return Response.json({ message: "404" });
}

View File

@@ -1,39 +0,0 @@
import getAllDiscussion from "./get/getAllDiscussion";
import getOneDiscussion from "./get/getOneDiscussion";
import createCommentDiscussion from "./post/createCommentDiscussion";
import createDiscussion from "./post/createDiscussion";
import deleteDiscussion from "./post/deleteDiscussion";
import updateDiscussion from "./post/updateDiscussion";
export const API_INDEX_DISCUSSION = [
{
path: "get-all-discussion",
method: "GET",
bin: getAllDiscussion,
},
{
path: "get-one-discussion",
method: "GET",
bin: getOneDiscussion,
},
{
path: "create-discussion",
method: "POST",
bin: createDiscussion,
},
{
path: "create-comment-discussion",
method: "POST",
bin: createCommentDiscussion,
},
{
path: "update-discussion",
method: "POST",
bin: updateDiscussion,
},
{
path: "delete-discussion",
method: "POST",
bin: deleteDiscussion,
},
];

View File

@@ -1,20 +0,0 @@
import { prisma } from "@/module/_global";
import { NextRequest } from "next/server";
export default async function getAllDiscussion(req: NextRequest) {
try {
const searchParams = req.nextUrl.searchParams
const divisionID = searchParams.get('divisionID');
const data = await prisma.divisionDisscussion.findMany({
where: {
isActive: true,
idDivision: String(divisionID)
}
})
return Response.json(data);
} catch (error) {
console.error(error);
return Response.json({ success: false, message: "Internal Server Error" }, { status: 500 });
}
}

View File

@@ -1,34 +0,0 @@
import { prisma } from "@/module/_global";
import { NextRequest } from "next/server";
export default async function getOneDiscussion(req: NextRequest) {
try {
const searchParams = req.nextUrl.searchParams
const id = searchParams.get('id');
const data = await prisma.divisionDisscussion.findUnique({
where: {
id: String(id)
}
})
const comment = await prisma.divisionDisscussionComment.findMany({
where: {
idDisscussion: String(id)
}
})
const allData = {
data: data,
comment: comment
}
return Response.json(allData);
} catch (error) {
console.error(error);
return Response.json(
{ message: "Internal Server Error", success: false },
{ status: 500 }
);
}
}

View File

@@ -1,19 +0,0 @@
import { prisma } from "@/module/_global";
export default async function createCommentDiscussion(req: Request) {
try {
const data = await req.json()
const insert = await prisma.divisionDisscussionComment.create({
data: {
idDisscussion: data.idDiscussion,
comment: data.comment,
createdBy: data.createdBy
}
})
return Response.json(insert, { status: 201 });
} catch (error) {
console.error(error);
return Response.json({ success: false, message: "Internal Server Error" }, { status: 500 });
}
}

View File

@@ -1,23 +0,0 @@
import { prisma } from "@/module/_global";
export default async function createDiscussion(req: Request) {
try {
const data = await req.json();
const insert = await prisma.divisionDisscussion.create({
data: {
idDivision: data.idDivision,
desc: data.desc,
createdBy: data.createdBy
},
select: {
id: true
}
})
return Response.json(insert, { status: 201 });
} catch (error) {
console.error(error);
return Response.json({ success: false, message: "Internal Server Error" }, { status: 500 });
}
}

View File

@@ -1,26 +0,0 @@
import { prisma } from "@/module/_global";
export default async function deleteDiscussion(req: Request) {
try {
const data = await req.json()
const del = await prisma.divisionDisscussion.update({
where: {
id: data.id
},
data: {
isActive: false
}
})
return Response.json(
{ success: true, message: "Sukses Delete Diskusi" },
{ status: 200 }
);
} catch (error) {
console.error(error);
return Response.json(
{ message: "Internal Server Error", success: false },
{ status: 500 }
);
}
}

View File

@@ -1,21 +0,0 @@
import { prisma } from "@/module/_global";
export default async function updateDiscussion(req: Request) {
try {
const data = await req.json()
const update = await prisma.divisionDisscussion.update({
where:{
id: data.id
},
data:{
desc: data.desc,
}
})
return Response.json({ success: true, message: "Sukses Update Diskusi" }, { status: 200 });
} catch (error) {
console.error(error);
return Response.json({ message: "Internal Server Error", success: false }, { status: 500 });
}
}

View File

@@ -1,11 +0,0 @@
import { LayoutNavbarNew } from "@/module/_global";
import FormCreateDiscussion from "../component/form_create_discussion";
export default function ViewCreateDiscussion() {
return (
<>
<LayoutNavbarNew back="" title="Tambah Diskusi" menu={<></>} />
<FormCreateDiscussion />
</>
)
}

View File

@@ -1,6 +1,5 @@
"use client"
import { Avatar, Badge, Box, Center, Divider, Flex, Grid, Group, Text, TextInput } from "@mantine/core";
import NavbarDetailDiscussion from "../component/navbar_detail_discussion";
import { WARNA } from "@/module/_global";
import { GrChatOption } from "react-icons/gr";
import { LuSendHorizonal } from "react-icons/lu";
@@ -52,7 +51,7 @@ export default function ViewDetailDiscussion() {
return (
<>
<NavbarDetailDiscussion />
{/* <NavbarDetailDiscussion /> */}
<Box p={20}>
<Flex
justify={"space-between"}

View File

@@ -1,11 +0,0 @@
import ListDiscussion from "../component/list_discussion";
import NavbarListDiscussion from "../component/navbar_list_discussion";
export default function ViewListDiscussion() {
return (
<div>
<NavbarListDiscussion />
<ListDiscussion/>
</div>
);
}

View File

@@ -1,14 +0,0 @@
import { NextRequest } from "next/server";
import { API_INDEX_DIVISION } from "./api_index";
type Method = "GET" | "POST";
export async function apiDivision(req: NextRequest, method: Method) {
const { searchParams } = new URL(req.url);
const path = searchParams.get("path");
const act = API_INDEX_DIVISION.find((v) => v.path === path && v.method === method);
if (!path)
return Response.json({ message: "page not found" }, { status: 404 });
if (act) return act.bin(req);
return Response.json({ message: "404" });
}

View File

@@ -1,39 +0,0 @@
import getAllDivision from "./get/getAllDivision";
import getOneDivision from "./get/getOneDivision";
import getOneDetailDivision from "./get/getOneDetailDivision";
import createDivision from "./post/createDivision";
import deleteDivision from "./post/deleteDivision";
import updateDivision from "./post/updateDivision";
export const API_INDEX_DIVISION = [
{
path: "create-division",
method: "POST",
bin: createDivision,
},
{
path: "update-division",
method: "POST",
bin: updateDivision,
},
{
path: "delete-division",
method: "POST",
bin: deleteDivision,
},
{
path: "get-all-division",
method: "GET",
bin: getAllDivision,
},
{
path: "get-one-division",
method: "GET",
bin: getOneDivision,
},
{
path: "get-one-detail-division",
method: "GET",
bin: getOneDetailDivision,
},
];

View File

@@ -1,30 +0,0 @@
import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth";
import { NextRequest } from "next/server";
export default async function getAllDivision(req: NextRequest) {
try {
let grup
const user = await funGetUserByCookies()
const searchParams = req.nextUrl.searchParams
let groupID = searchParams.get('groupID');
if (groupID == null || groupID == undefined) {
grup = user.idGroup
} else {
grup = groupID
}
const division = await prisma.division.findMany({
where: {
isActive: true,
idGroup: grup
}
})
return Response.json(division);
} catch (error) {
console.error(error);
return Response.json({ success: false, message: "Internal Server Error" }, { status: 500 });
}
}

View File

@@ -1,87 +0,0 @@
import { prisma } from '@/module/_global';
import { NextRequest } from "next/server";
export const dynamic = 'force-dynamic'
export default async function getOneDetailDivision(req: NextRequest) {
try {
const searchParams = req.nextUrl.searchParams
const id = searchParams.get('divisionId');
const division = await prisma.division.findUnique({
where: {
id: String(id),
},
select: {
id: true,
name: true,
},
});
const member = await prisma.divisionMember.findMany({
where: {
idDivision: String(id),
},
select: {
idUser: true,
isLeader: true
}
})
const tugas = await prisma.divisionProject.count({
where: {
idDivision: String(id),
status: {
lte: 1
},
isActive: true
}
})
const dokumen = await prisma.divisionDocumentFolderFile.count({
where: {
idDivision: String(id),
isActive: true,
category: "FILE"
}
})
const diskusi = await prisma.divisionDisscussion.count({
where: {
idDivision: String(id),
isActive: true,
status: 1
}
})
const kalender = await prisma.divisionCalendar.count({
where: {
idDivision: String(id),
isActive: true,
dateStart: {
lte: new Date()
}
}
})
const allData = {
// division: division,
division: { name: name },
jumlah: {
tugas: 1,
dokumen: dokumen,
diskusi: diskusi,
kalender: kalender
},
member: member,
}
return Response.json(allData);
} catch (error) {
console.error(error);
return Response.json(
{ message: "Internal Server Error", success: false },
{ status: 500 }
);
}
}

View File

@@ -1,41 +0,0 @@
import { prisma } from "@/module/_global";
import { NextRequest } from "next/server";
export default async function getOneDivision(req: NextRequest) {
try {
const searchParams = req.nextUrl.searchParams
const id = searchParams.get('divisionID');
const division = await prisma.division.findUnique({
where: {
id: String(id),
},
select: {
id: true,
name: true,
},
});
const member = await prisma.divisionMember.findMany({
where: {
idDivision: String(id),
},
select: {
idUser: true,
isLeader: true
}
})
const allData = {
division: division,
member: member
}
return Response.json(allData);
} catch (error) {
console.error(error);
return Response.json(
{ message: "Internal Server Error", success: false },
{ status: 500 }
);
}
}

View File

@@ -1,43 +0,0 @@
import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth";
import _ from "lodash";
import { revalidatePath } from "next/cache";
export default async function createDivision(req: Request) {
try {
const sent = await req.json();
const user = await funGetUserByCookies();
const insertDivision = await prisma.division.create({
data: {
name: sent.data.name,
idVillage: String(user.idVillage),
idGroup: sent.data.idGroup,
desc: sent.data.desc,
createdBy: String(user.id)
},
select: {
id: true
}
})
const dataMember = sent.member.map((v: any) => ({
..._.omit(v, ["isActive", "nik", "name", "phone", "email", "gender", "group", "position"]),
idUser: v.id,
idDivision: insertDivision.id,
isAdmin: sent.admin.some((i: any) => i == v.id)
}))
const insertMember = await prisma.divisionMember.createMany({
data: dataMember
})
revalidatePath("/division");
return Response.json({ success: true, message: "Sukses menambahkan data divisi" }, { status: 201 });
} catch (error) {
console.error(error);
return Response.json({ success: false, message: "Internal Server Error" }, { status: 500 });
}
}

View File

@@ -1,27 +0,0 @@
import { prisma } from "@/module/_global";
export default async function deleteDivision(req: Request) {
try {
const data = await req.json();
const update = await prisma.division.update({
where: {
id: data.id,
},
data: {
isActive: false,
},
});
return Response.json(
{ success: true, message: "Sukses Delete Division" },
{ status: 200 }
);
} catch (error) {
console.error(error);
return Response.json(
{ message: "Internal Server Error", success: false },
{ status: 500 }
);
}
}

View File

@@ -1,24 +0,0 @@
import { prisma } from "@/module/_global";
export default async function updateDivision(req: Request) {
try {
const data = await req.json()
const update = await prisma.division.update({
where: {
id: data.id
},
data: {
name: data.name,
desc: data.desc
}
})
// belom update member nihhhh
return Response.json({ success: true, message: "Sukses Update Divisi" }, { status: 200 });
} catch (error) {
console.error(error);
return Response.json({ message: "Internal Server Error", success: false }, { status: 500 });
}
}

View File

@@ -8,36 +8,31 @@ import ViewDetailEventDivision from "./_division_fitur/calender/view/view_detail
import ViewDivisionCalender from "./_division_fitur/calender/view/view_division_calender";
import ViewHistoryDivisionCalender from "./_division_fitur/calender/view/view_history_division_calender";
import ViewUpdateDivisionCalender from "./_division_fitur/calender/view/view_update_division_calender";
import { apiDiscussion } from "./_division_fitur/discussion/api/api_discussion";
import ViewCreateDiscussion from "./_division_fitur/discussion/view/view_create_discussion";
import ViewDetailDiscussion from "./_division_fitur/discussion/view/view_detail_discussion";
import ViewEditDiscussion from "./_division_fitur/discussion/view/view_edit_discussion";
import ViewListDiscussion from "./_division_fitur/discussion/view/view_list_discussion";
import ViewDocumentDivision from "./_division_fitur/document/view/view_document_division";
import ViewCreateTaskDivision from "./_division_fitur/task/view/view_create_division_task";
import ViewDetailDivisionTask from "./_division_fitur/task/view/view_detail_division_task";
import ViewDivisionTask from "./_division_fitur/task/view/view_division_task";
import ViewUpdateProgressDivisionTask from "./_division_fitur/task/view/view_update_progress_division_task";
import { apiDivision } from "./api/api_division";
import CreateAdminDivision from "./components/create_admin_division";
import CreateUsers from "./components/create_users";
import ViewCreateReport from "./view/view_create_report";
import ViewReportDivision from "./view/view_report_division";
import ListDivision from './components/list_division';
import CreateDivision from './components/create_division';
import NavbarDetailDivision from './components/navbar_detail_division';
import CarouselDivision from './components/carousel_division';
import FeatureDetailDivision from './components/feature_detail_division';
import ListTaskOnDetailDivision from './components/list_task';
import ListDocumentOnDetailDivision from './components/list_document';
import ListDiscussionOnDetailDivision from './components/list_discussion';
import InformationDivision from './components/information_division';
import CreateAnggotaDivision from './components/create_anggota_division';
import EditDivision from './components/edit_division';
import CreateAdminDivision from "./ui/create_admin_division";
import CreateUsers from "./ui/create_users";
import ListDivision from './ui/list_division';
import CreateDivision from './ui/create_division';
import NavbarDetailDivision from './ui/navbar_detail_division';
import CarouselDivision from './ui/carousel_division';
import FeatureDetailDivision from './ui/feature_detail_division';
import ListTaskOnDetailDivision from './ui/list_task';
import ListDocumentOnDetailDivision from './ui/list_document';
import ListDiscussionOnDetailDivision from './ui/list_discussion';
import InformationDivision from './ui/information_division';
import CreateAnggotaDivision from './ui/create_anggota_division';
import EditDivision from './ui/edit_division';
import CreateReport from './ui/create_report';
import ReportDivisionId from './ui/report_division_id';
export { CreateUsers };
export { CreateAdminDivision };
export { ViewCreateReport };
export { ViewDivisionTask };
export { ViewDetailDivisionTask };
export { ViewUpdateProgressDivisionTask };
@@ -51,14 +46,9 @@ export { ViewDetailEventDivision };
export { ViewUpdateDivisionCalender };
export { UpdateUserDivisionCalender };
export { UpdateUlangiEvent };
export { ViewListDiscussion };
export { ViewCreateDiscussion };
export { ViewDetailDiscussion };
export { ViewEditDiscussion };
export { ViewDocumentDivision };
export { ViewReportDivision };
export { apiDivision }
export { apiDiscussion }
export type { IFormDivision, IFormMemberDivision, IFormFixDivision, IDataDivison, IDataMemberDivision }
export { ListDivision }
export { CreateDivision }
@@ -71,3 +61,5 @@ export { ListDiscussionOnDetailDivision }
export { InformationDivision }
export { CreateAnggotaDivision }
export { EditDivision }
export { CreateReport }
export { ReportDivisionId }

View File

@@ -1,53 +1,18 @@
"use client"
import { API_ADDRESS, LayoutNavbarNew, WARNA } from '@/module/_global';
import { LayoutNavbarNew, WARNA } from '@/module/_global';
import LayoutModal from '@/module/_global/layout/layout_modal';
import { funGetUserByCookies } from '@/module/auth';
import { TypeUser } from '@/module/user';
import { useHookstate } from '@hookstate/core';
import { funGetAllmember, TypeUser } from '@/module/user';
import { Avatar, Box, Button, Divider, Group, Stack, Text, TextInput } from '@mantine/core';
import { useParams, useRouter } from 'next/navigation';
import React, { useState } from 'react';
import toast from 'react-hot-toast';
import { FaCheck } from 'react-icons/fa6';
import { HiMagnifyingGlass } from 'react-icons/hi2';
import { globalMemberDivision } from '../lib/val_division';
import { useShallowEffect } from '@mantine/hooks';
import { funGetAllmember } from '@/module/user/member/lib/api_member';
import { IDataMemberDivision } from '../lib/type_division';
import { funAddDivisionMember, funGetDivisionById } from '../lib/api_division';
const dataUser = [
{
id: 1,
img: "https://i.pravatar.cc/1000?img=3",
name: "Doni Setiawan",
},
{
id: 2,
img: "https://i.pravatar.cc/1000?img=10",
name: "Ilham Udin",
},
{
id: 3,
img: "https://i.pravatar.cc/1000?img=11",
name: "Didin Anang",
},
{
id: 4,
img: "https://i.pravatar.cc/1000?img=21",
name: "Angga Saputra",
},
{
id: 5,
img: "https://i.pravatar.cc/1000?img=32",
name: "Marcel Widianto",
},
{
id: 6,
img: "https://i.pravatar.cc/1000?img=37",
name: "Bagas Nusantara",
},
];
export default function CreateAnggotaDivision() {
const router = useRouter()

View File

@@ -1,5 +1,5 @@
"use client";
import { API_ADDRESS, LayoutNavbarNew, WARNA } from "@/module/_global";
import { LayoutNavbarNew, WARNA } from "@/module/_global";
import { useHookstate } from "@hookstate/core";
import {
Avatar,

View File

@@ -1,7 +1,7 @@
'use client'
import { API_ADDRESS, LayoutDrawer, LayoutNavbarNew, WARNA } from '@/module/_global';
import { LayoutDrawer, LayoutNavbarNew, WARNA } from '@/module/_global';
import { ActionIcon, Avatar, Box, Card, Center, Divider, Flex, Grid, Group, Text, TextInput, Title } from '@mantine/core';
import { useRouter } from 'next/navigation';
import { useRouter, useSearchParams } from 'next/navigation';
import React, { useState } from 'react';
import { HiMenu } from 'react-icons/hi';
import { HiMagnifyingGlass, HiMiniPresentationChartBar, HiMiniUserGroup, HiOutlineListBullet, HiSquares2X2 } from 'react-icons/hi2';
@@ -19,6 +19,8 @@ export default function ListDivision() {
const [data, setData] = useState<IDataDivison[]>([])
const [jumlah, setJumlah] = useState(0)
const [searchQuery, setSearchQuery] = useState('')
const searchParams = useSearchParams()
const group = searchParams.get('group')
const handleList = () => {
setIsList(!isList)
@@ -27,7 +29,7 @@ export default function ListDivision() {
const fetchData = async (search: string) => {
try {
setData([]);
const response = await funGetAllDivision('?search=' + search)
const response = await funGetAllDivision('?search=' + search + '&group=' + group)
if (response.success) {
setData(response.data)

View File

@@ -1,5 +1,5 @@
"use client"
import { API_ADDRESS, LayoutNavbarNew, WARNA } from '@/module/_global';
import { LayoutNavbarNew, WARNA } from '@/module/_global';
import { useHookstate } from '@hookstate/core';
import { Avatar, Box, Button, Checkbox, Divider, Flex, Group, Stack, Text, TextInput } from '@mantine/core';
import { useRouter } from 'next/navigation';
@@ -35,37 +35,8 @@ export default function NavbarAdminDivision({ data, onSuccess }: { data: any, on
} catch (error) {
console.log(error);
onSuccess(false)
toast.error("Gagal menambahkan grup, coba lagi nanti");
toast.error("Gagal menambahkan divisi, coba lagi nanti");
}
// try {
// const res = await fetch(API_ADDRESS.apiCreateDivision, {
// method: 'POST',
// headers: {
// 'Content-Type': 'application/json'
// },
// body: JSON.stringify({
// data: data,
// member: member.get(),
// admin: value
// })
// })
// const errorData = await res.json();
// if (res.status == 201) {
// toast.success('Sukses! data tersimpan')
// onSuccess(true)
// } else {
// toast.error(errorData.message);
// onSuccess(false)
// }
// } catch (error) {
// toast.error('Error')
// onSuccess(false)
// }
}
return (

View File

@@ -1,12 +1,12 @@
"use client"
import { API_ADDRESS, LayoutNavbarNew, WARNA } from '@/module/_global';
import { LayoutNavbarNew, WARNA } from '@/module/_global';
import { useHookstate } from '@hookstate/core';
import { Avatar, Box, Button, Center, Input, SimpleGrid, Stack, Text, TextInput } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import { useRouter } from 'next/navigation';
import React, { useState } from 'react';
import { HiMagnifyingGlass } from 'react-icons/hi2';
import { TypeUser } from '@/module/user';
import { funGetAllmember, TypeUser } from '@/module/user';
import { funGetUserByCookies } from '@/module/auth';
import toast from 'react-hot-toast';
import { globalMemberDivision } from '../lib/val_division';
@@ -22,21 +22,26 @@ export default function NavbarCreateUsers({ grup, onClose }: { grup?: string, on
if (selectedFiles.some((i: any) => i.id == dataMember[index].id)) {
setSelectedFiles(selectedFiles.filter((i: any) => i.id != dataMember[index].id))
} else {
setSelectedFiles([...selectedFiles, {idUser: dataMember[index].id, name: dataMember[index].name}])
setSelectedFiles([...selectedFiles, { idUser: dataMember[index].id, name: dataMember[index].name }])
}
};
async function loadData() {
const loadMember = await fetch(API_ADDRESS.apiGetAllUser + '&active=true&groupID=' + grup);
async function loadData(search: string) {
const res = await funGetAllmember('?active=true&group=' + grup + '&search=' + search);
const user = await funGetUserByCookies();
const hasil = await loadMember.json()
setDataMember(hasil.filter((i: any) => i.id != user.id))
// cek data member sebelumnya
if (member.length > 0) {
setSelectedFiles(JSON.parse(JSON.stringify(member.get())))
if (res.success) {
setDataMember(res.data.filter((i: any) => i.id != user.id))
// cek data member sebelumnya
if (member.length > 0) {
setSelectedFiles(JSON.parse(JSON.stringify(member.get())))
}
} else {
toast.error(res.message)
}
}
@@ -49,7 +54,7 @@ export default function NavbarCreateUsers({ grup, onClose }: { grup?: string, on
}
useShallowEffect(() => {
loadData()
loadData("")
}, []);
return (
@@ -69,6 +74,7 @@ export default function NavbarCreateUsers({ grup, onClose }: { grup?: string, on
radius={30}
leftSection={<HiMagnifyingGlass size={20} />}
placeholder="Pencarian"
onChange={(e) => loadData(e.target.value)}
/>
<Box pt={10}>
<SimpleGrid

View File

@@ -1,9 +0,0 @@
import React from 'react';
import CreateReport from '../components/create_report';
export default function ViewCreateReport() {
return (
<CreateReport/>
);
}

View File

@@ -1,9 +0,0 @@
import React from 'react';
import ReportDivisionId from '../components/report_division_id';
export default function ViewReportDivision() {
return (
<ReportDivisionId/>
);
}

View File

@@ -1,4 +1,4 @@
import { API_ADDRESS, LayoutDrawer, WARNA } from "@/module/_global";
import { LayoutDrawer, WARNA } from "@/module/_global";
import {
Box,
Button,

View File

@@ -1,5 +1,5 @@
"use client";
import { API_ADDRESS, LayoutDrawer, WARNA } from "@/module/_global";
import { LayoutDrawer, WARNA } from "@/module/_global";
import LayoutModal from "@/module/_global/layout/layout_modal";
import {
Box,

View File

@@ -1,4 +1,4 @@
import { API_ADDRESS, LayoutDrawer, SkeletonSingle, WARNA } from "@/module/_global";
import { LayoutDrawer, SkeletonSingle, WARNA } from "@/module/_global";
import {
ActionIcon,
Box,

View File

@@ -1,4 +1,4 @@
import { API_ADDRESS, LayoutDrawer, WARNA } from "@/module/_global"
import { LayoutDrawer, WARNA } from "@/module/_global"
import LayoutModal from "@/module/_global/layout/layout_modal"
import { funGetAllGroup, IDataGroup } from "@/module/group"
import { Box, Stack, SimpleGrid, Flex, Text, Select, TextInput, Button } from "@mantine/core"

View File

@@ -1,4 +1,4 @@
import { WARNA, LayoutDrawer, API_ADDRESS } from "@/module/_global";
import { WARNA, LayoutDrawer } from "@/module/_global";
import { funGetAllGroup, IDataGroup } from "@/module/group";
import { Box, Stack, SimpleGrid, Flex, TextInput, Button, Text, Select } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
@@ -30,7 +30,7 @@ export default function DrawerListPosition({ onCreated }: { onCreated: (val: boo
}
} catch (error) {
console.error(error)
toast.error("Gagal mendapatkan grup, coba lagi nanti");
toast.error("Gagal mendapatkan jabatan, coba lagi nanti");
}
}
@@ -41,29 +41,6 @@ export default function DrawerListPosition({ onCreated }: { onCreated: (val: boo
async function onSubmit() {
try {
// const res = await fetch(API_ADDRESS.apiCreatePosition, {
// method: 'POST',
// headers: {
// 'Content-Type': 'application/json'
// },
// body: JSON.stringify({
// name: listData.name,
// idGroup: listData.idGroup
// })
// })
// if (!res.ok) {
// const errorData = await res.json();
// if (errorData.message === "Position sudah ada") {
// toast.error('Gagal! Position sudah ada');
// } else {
// toast.error('Error');
// }
// } else {
// setOpenDrawerGroup(false)
// toast.success('Sukses! data tersimpan')
// }
// onCreated(true)
const res = await funCreatePosition({
name: listData.name,
idGroup: listData.idGroup
@@ -76,7 +53,7 @@ export default function DrawerListPosition({ onCreated }: { onCreated: (val: boo
} else {
toast.error(res.message)
}
} catch (error) {
toast.error('Error')
}

View File

@@ -1,4 +1,4 @@
import { API_ADDRESS, LayoutDrawer, SkeletonSingle, WARNA } from "@/module/_global";
import { LayoutDrawer, SkeletonSingle, WARNA } from "@/module/_global";
import { ActionIcon, Box, Group, Text, TextInput } from "@mantine/core";
import React, { useEffect, useState } from "react";
import { FaUserTie } from "react-icons/fa6";

View File

@@ -3,9 +3,11 @@ import { apiUser } from "./api/api_user";
import createLogUser from "./log/fun/createLogUser";
import ViewEditProfile from "./profile/view/view_edit_profile";
import ViewProfile from "./profile/view/view_profile";
import { funGetAllmember } from './member/lib/api_member';
export { ViewProfile };
export { ViewEditProfile };
export { apiUser };
export { createLogUser };
export type { TypeUser }
export { funGetAllmember }

View File

@@ -8,4 +8,4 @@ export { NavbarListMember }
export { ListMember }
export { CreateMember }
export { NavbarDetailMember }
export {EditMember}
export {EditMember}

View File

@@ -1,5 +1,5 @@
"use client";
import { API_ADDRESS, WARNA } from "@/module/_global";
import { WARNA } from "@/module/_global";
import LayoutModal from "@/module/_global/layout/layout_modal";
import { funGetAllGroup, IDataGroup } from "@/module/group";
import { Box, Button, Select, Stack, TextInput } from "@mantine/core";

View File

@@ -1,5 +1,5 @@
"use client";
import { API_ADDRESS, WARNA } from "@/module/_global";
import { WARNA } from "@/module/_global";
import LayoutModal from "@/module/_global/layout/layout_modal";
import { Box, Flex, SimpleGrid, Stack, Text } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
@@ -28,7 +28,7 @@ export default function DrawerDetailMember({
isActive: status,
});
if (res.success) {
if (res.success) {
toast.success(res.message);
onDeleted(true);
} else {

View File

@@ -1,5 +1,5 @@
'use client'
import { API_ADDRESS, WARNA } from "@/module/_global";
import { WARNA } from "@/module/_global";
import LayoutModal from "@/module/_global/layout/layout_modal";
import { funGetAllGroup, IDataGroup } from "@/module/group";
import { funGetAllPosition } from "@/module/position/lib/api_position";
@@ -13,7 +13,7 @@ import { IDataPositionMember, IDataROleMember, IEditDataMember, IFormMember } fr
import { funEditMember, funGetOneMember, funGetRoleUser } from "../lib/api_member";
export default function EditMember({ id }: { id: string}) {
export default function EditMember({ id }: { id: string }) {
const [isModal, setModal] = useState(false)
const router = useRouter()
const [listGroup, setListGorup] = useState<IDataGroup[]>([])
@@ -47,7 +47,7 @@ export default function EditMember({ id }: { id: string}) {
async function getOneData() {
try {
const res = await funGetOneMember(id)
const res = await funGetOneMember(id)
setData(res.data)
getAllPosition(res.data?.idGroup)
} catch (error) {
@@ -59,8 +59,8 @@ export default function EditMember({ id }: { id: string}) {
try {
const res = await funGetAllPosition(
"?active=true" + "&group=" + `${val}`
);
setListPosition(res.data);
);
setListPosition(res.data);
} catch (error) {
console.error(error)
@@ -96,7 +96,7 @@ export default function EditMember({ id }: { id: string}) {
async function onSubmit(val: boolean) {
try {
const res = await funEditMember(id,{
const res = await funEditMember(id, {
id: data.id,
nik: data.nik,
name: data.name,

View File

@@ -1,5 +1,5 @@
'use client'
import { LayoutNavbarHome, LayoutIconBack, WARNA, LayoutDrawer, API_ADDRESS } from "@/module/_global";
import { LayoutNavbarHome, LayoutIconBack, WARNA, LayoutDrawer } from "@/module/_global";
import { Box, Group, ActionIcon, Stack, Text, Center, Avatar } from "@mantine/core";
import { HiMenu } from "react-icons/hi";
import { HiUser } from "react-icons/hi2";

View File

@@ -1,5 +1,5 @@
import { API_ADDRESS, WARNA } from "@/module/_global"
import { WARNA } from "@/module/_global"
import { Box, Group, ActionIcon, Text, TextInput } from "@mantine/core"
import { useShallowEffect } from "@mantine/hooks"
import { useRouter, useSearchParams } from "next/navigation"