Merge pull request #214 from bipproduction/amalia/10-september-24

Amalia/10 september 24
This commit is contained in:
Amalia
2024-09-10 17:26:54 +08:00
committed by GitHub
23 changed files with 271 additions and 179 deletions

View File

@@ -0,0 +1,12 @@
import { WrapLayoutDivision } from "@/module/division_new";
import _ from "lodash"
export default async function Layout({ children }: { children: React.ReactNode }) {
return (
<>
<WrapLayoutDivision>
{children}
</WrapLayoutDivision>
</>
);
}

View File

@@ -1,8 +1,9 @@
import { prisma } from "@/module/_global"; import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth"; import { funGetUserByCookies } from "@/module/auth";
import { createLogUser } from "@/module/user";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
// CREATE COMENT BY ID // CREATE COMENT BY ID KOMENTAR
export async function POST(request: Request, context: { params: { id: string } }) { export async function POST(request: Request, context: { params: { id: string } }) {
try { try {
const user = await funGetUserByCookies() const user = await funGetUserByCookies()
@@ -34,9 +35,15 @@ export async function POST(request: Request, context: { params: { id: string } }
comment: comment, comment: comment,
idDisscussion: id, idDisscussion: id,
createdBy: user.id createdBy: user.id
},
select: {
id: true
} }
}) })
// create log user
const log = await createLogUser({ act: 'CREATE', desc: 'User menambah komentar pada diskusi', table: 'divisionDisscussionComment', data: data.id })
return NextResponse.json({ success: true, message: "Berhasil menambah komentar", data: data, }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil menambah komentar", data: data, }, { status: 200 });
} catch (error) { } catch (error) {

View File

@@ -1,6 +1,6 @@
import { prisma } from "@/module/_global"; import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth"; import { funGetUserByCookies } from "@/module/auth";
import { stat } from "fs"; import { createLogUser } from "@/module/user";
import _ from "lodash"; import _ from "lodash";
import moment from "moment"; import moment from "moment";
import "moment/locale/id"; import "moment/locale/id";
@@ -68,10 +68,11 @@ export async function GET(request: Request, context: { params: { id: string } })
const username = data?.User.name const username = data?.User.name
const user_img = data?.User.img const user_img = data?.User.img
const createdAt = moment(data?.createdAt).format("ll") const createdAt = moment(data?.createdAt).format("ll")
const isCreator = data?.createdBy == user.id
const result = { ...userMember, username, createdAt, user_img } const result = { ...userMember, username, createdAt, user_img, isCreator }
const omitData = _.omit(result, ["User"]) const omitData = _.omit(result, ["User"])
@@ -95,7 +96,7 @@ export async function GET(request: Request, context: { params: { id: string } })
} }
// ONE OR CLOSE DISCUSSION // OPEN OR CLOSE DISCUSSION
export async function DELETE(request: Request, context: { params: { id: string } }) { export async function DELETE(request: Request, context: { params: { id: string } }) {
try { try {
const user = await funGetUserByCookies() const user = await funGetUserByCookies()
@@ -131,6 +132,10 @@ export async function DELETE(request: Request, context: { params: { id: string }
status: newStatus status: newStatus
} }
}); });
// create log user
const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate status diskusi', table: 'divisionDisscussion', data: id })
return NextResponse.json({ success: true, message: "Berhasil mengedit diskusi" }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil mengedit diskusi" }, { status: 200 });
} catch (error) { } catch (error) {
@@ -167,6 +172,9 @@ export async function PUT(request: Request, context: { params: { id: string } })
isActive: false isActive: false
} }
}); });
// create log user
const log = await createLogUser({ act: 'DELETE', desc: 'User menghapus data diskusi', table: 'divisionDisscussion', data: id })
return NextResponse.json({ success: true, message: "Berhasil menghapus diskusi" }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil menghapus diskusi" }, { status: 200 });
} catch (error) { } catch (error) {
console.error(error); console.error(error);
@@ -203,6 +211,9 @@ export async function POST(request: Request, context: { params: { id: string } }
desc: desc desc: desc
} }
}); });
// create log user
const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate data diskusi', table: 'divisionDisscussion', data: id })
return NextResponse.json({ success: true, message: "Berhasil mengedit diskusi" }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil mengedit diskusi" }, { status: 200 });
} catch (error) { } catch (error) {

View File

@@ -4,6 +4,7 @@ import _ from "lodash";
import moment from "moment"; import moment from "moment";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import "moment/locale/id"; import "moment/locale/id";
import { createLogUser } from "@/module/user";
// GET ALL DISCUSSION DIVISION ACTIVE = TRUE // GET ALL DISCUSSION DIVISION ACTIVE = TRUE
@@ -116,8 +117,14 @@ export async function POST(request: Request) {
desc, desc,
createdBy: user.id createdBy: user.id
}, },
select: {
id: true
}
}); });
// create log user
const log = await createLogUser({ act: 'CREATE', desc: 'User membuat data diskusi', table: 'divisionDisscussion', data: data.id })
return NextResponse.json({ success: true, message: "Berhasil menambahkan diskusi", data, }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil menambahkan diskusi", data, }, { status: 200 });
} catch (error) { } catch (error) {
console.error(error); console.error(error);

View File

@@ -1,5 +1,6 @@
import { prisma } from "@/module/_global"; import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth"; import { funGetUserByCookies } from "@/module/auth";
import { createLogUser } from "@/module/user";
import _ from "lodash"; import _ from "lodash";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
@@ -65,6 +66,9 @@ export async function POST(request: Request) {
}) })
} }
// create log user
const log = await createLogUser({ act: 'UPDATE', desc: 'User memindahkan file atau folder', table: 'divisionDocumentFolderFile', data: '' })
return NextResponse.json({ success: true, message: "Berhasil memindahkan item" }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil memindahkan item" }, { status: 200 });
} catch (error) { } catch (error) {

View File

@@ -1,5 +1,6 @@
import { prisma } from "@/module/_global"; import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth"; import { funGetUserByCookies } from "@/module/auth";
import { createLogUser } from "@/module/user";
import _ from "lodash"; import _ from "lodash";
import moment from "moment"; import moment from "moment";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
@@ -281,8 +282,14 @@ export async function POST(request: Request) {
extension: "folder", extension: "folder",
createdBy: user.id, createdBy: user.id,
}, },
select: {
id: true
}
}); });
// create log user
const log = await createLogUser({ act: 'CREATE', desc: 'User membuat folder baru', table: 'divisionDocumentFolderFile', data: data.id })
return NextResponse.json({ success: true, message: "Berhasil membuat folder baru" }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil membuat folder baru" }, { status: 200 });
} catch (error) { } catch (error) {
console.error(error); console.error(error);
@@ -339,6 +346,9 @@ export async function PUT(request: Request) {
}) })
// create log user
const log = await createLogUser({ act: 'UPDATE', desc: 'User mengubah nama file atau folder', table: 'divisionDocumentFolderFile', data: id })
return NextResponse.json({ success: true, message: "Berhasil mengubah nama item" }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil mengubah nama item" }, { status: 200 });
} catch (error) { } catch (error) {
@@ -370,6 +380,9 @@ export async function DELETE(request: Request) {
}) })
} }
// create log user
const log = await createLogUser({ act: 'DELETE', desc: 'User menghapus file atau folder', table: 'divisionDocumentFolderFile', data: '' })
return NextResponse.json({ success: true, message: "Berhasil menghapus item" }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil menghapus item" }, { status: 200 });
} catch (error) { } catch (error) {

View File

@@ -4,6 +4,7 @@ import _ from "lodash";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import fs from "fs"; import fs from "fs";
import path from "path"; import path from "path";
import { createLogUser } from "@/module/user";
// UPLOAD FILE // UPLOAD FILE
@@ -92,6 +93,9 @@ export async function POST(request: Request) {
// Tulis file ke sistem // Tulis file ke sistem
fs.writeFileSync(filePath, buffer); fs.writeFileSync(filePath, buffer);
// create log user
const log = await createLogUser({ act: 'CREATE', desc: 'User mengupload file baru', table: 'divisionDocumentFolderFile', data: dataInsert.id })
return NextResponse.json({ success: true, message: "Berhasil upload file" }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil upload file" }, { status: 200 });
} catch (error) { } catch (error) {
console.error(error); console.error(error);

View File

@@ -1,5 +1,6 @@
import { prisma } from "@/module/_global"; import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth"; import { funGetUserByCookies } from "@/module/auth";
import { createLogUser } from "@/module/user";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
@@ -75,14 +76,11 @@ export async function DELETE(request: Request, context: { params: { id: string }
}, },
}); });
return NextResponse.json( // create log user
{ const log = await createLogUser({ act: 'UPDATE', desc: 'User mengedit status data grup', table: 'group', data: id })
success: true,
message: "Grup berhasil diedit", return NextResponse.json( { success: true, message: "Grup berhasil diedit", data, }, { status: 200 } );
data,
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
return NextResponse.json({ success: false, message: "Gagal mengedit grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); return NextResponse.json({ success: false, message: "Gagal mengedit grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
@@ -123,14 +121,11 @@ export async function PUT(request: Request, context: { params: { id: string } })
}, },
}); });
return NextResponse.json( // create log user
{ const log = await createLogUser({ act: 'UPDATE', desc: 'User mengedit data grup', table: 'group', data: id })
success: true,
message: "Grup berhasil diedit", return NextResponse.json( { success: true, message: "Grup berhasil diedit", data, }, { status: 200 } );
data,
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
return NextResponse.json({ success: false, message: "Gagal mengedit grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); return NextResponse.json({ success: false, message: "Gagal mengedit grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });

View File

@@ -1,5 +1,6 @@
import { prisma } from "@/module/_global"; import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth"; import { funGetUserByCookies } from "@/module/auth";
import { createLogUser } from "@/module/user";
import { revalidatePath, revalidateTag } from "next/cache"; import { revalidatePath, revalidateTag } from "next/cache";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
@@ -56,6 +57,9 @@ export async function POST(request: Request) {
name, name,
idVillage: String(villaId) idVillage: String(villaId)
}, },
select: {
id: true
}
}); });
revalidatePath('/api/group?active=true', "page") revalidatePath('/api/group?active=true', "page")
@@ -63,6 +67,10 @@ export async function POST(request: Request) {
revalidatePath('/group?active=true', 'page') revalidatePath('/group?active=true', 'page')
revalidateTag('group') revalidateTag('group')
// create log user
const log = await createLogUser({ act: 'CREATE', desc: 'User membuat data grup', table: 'group', data: data.id })
return NextResponse.json({ success: true, message: "Berhasil menambahkan grup", data, }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil menambahkan grup", data, }, { status: 200 });
} catch (error) { } catch (error) {
console.error(error); console.error(error);

View File

@@ -1,5 +1,6 @@
import { prisma } from "@/module/_global"; import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth"; import { funGetUserByCookies } from "@/module/auth";
import { createLogUser } from "@/module/user";
import _ from "lodash"; import _ from "lodash";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
@@ -43,14 +44,11 @@ export async function POST(request: Request, context: { params: { id: string } }
}) })
} }
// create log user
const log = await createLogUser({ act: 'CREATE', desc: 'User menambahkan anggota tugas divisi', table: 'divisionProject', data: id })
return NextResponse.json(
{ return NextResponse.json( { success: true, message: "Berhasil menambahkan anggota tugas", }, { status: 200 } );
success: true,
message: "Berhasil menambahkan anggota tugas",
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
return NextResponse.json({ success: false, message: "Gagal menambah anggota tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); return NextResponse.json({ success: false, message: "Gagal menambah anggota tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
@@ -92,14 +90,10 @@ export async function DELETE(request: Request, context: { params: { id: string }
} }
}) })
// create log user
const log = await createLogUser({ act: 'DELETE', desc: 'User mengeluarkan anggota dari tugas divisi', table: 'divisionProject', data: id })
return NextResponse.json( return NextResponse.json( { success: true, message: "Berhasil mengeluarkan anggota", }, { status: 200 } );
{
success: true,
message: "Berhasil mengeluarkan anggota",
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
return NextResponse.json({ success: false, message: "Gagal mengeluarkan anggota, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); return NextResponse.json({ success: false, message: "Gagal mengeluarkan anggota, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });

View File

@@ -1,5 +1,6 @@
import { prisma } from "@/module/_global"; import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth"; import { funGetUserByCookies } from "@/module/auth";
import { createLogUser } from "@/module/user";
import _ from "lodash"; import _ from "lodash";
import moment from "moment"; import moment from "moment";
import "moment/locale/id" import "moment/locale/id"
@@ -184,16 +185,15 @@ export async function POST(request: Request, context: { params: { id: string } }
dateStart: new Date(moment(dateStart).format('YYYY-MM-DD')), dateStart: new Date(moment(dateStart).format('YYYY-MM-DD')),
dateEnd: new Date(moment(dateEnd).format('YYYY-MM-DD')), dateEnd: new Date(moment(dateEnd).format('YYYY-MM-DD')),
}, },
select: {
id: true
}
}); });
return NextResponse.json( // create log user
{ const log = await createLogUser({ act: 'CREATE', desc: 'User menambahkan detail tugas divisi', table: 'divisionProjectTask', data: create.id })
success: true,
message: "Detail tugas berhasil ditambahkan", return NextResponse.json({ success: true, message: "Detail tugas berhasil ditambahkan", data, }, { status: 200 });
data,
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
return NextResponse.json({ success: false, message: "Gagal mengedit detail tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); return NextResponse.json({ success: false, message: "Gagal mengedit detail tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
@@ -238,13 +238,10 @@ export async function DELETE(request: Request, context: { params: { id: string }
} }
}); });
return NextResponse.json( // create log user
{ const log = await createLogUser({ act: 'UPDATE', desc: 'User membatalkan tugas divisi', table: 'divisionProject', data: id })
success: true,
message: "Tugas berhasil dibatalkan", return NextResponse.json({ success: true, message: "Tugas berhasil dibatalkan", }, { status: 200 });
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
return NextResponse.json({ success: false, message: "Gagal membatalkan tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); return NextResponse.json({ success: false, message: "Gagal membatalkan tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
@@ -287,13 +284,10 @@ export async function PUT(request: Request, context: { params: { id: string } })
} }
}); });
return NextResponse.json( // create log user
{ const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate data tugas divisi', table: 'divisionProject', data: id })
success: true,
message: "Tugas berhasil diedit", return NextResponse.json( { success: true, message: "Tugas berhasil diedit", }, { status: 200 } );
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
return NextResponse.json({ success: false, message: "Gagal mengedit tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); return NextResponse.json({ success: false, message: "Gagal mengedit tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });

View File

@@ -1,5 +1,6 @@
import { prisma } from "@/module/_global"; import { prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth"; import { funGetUserByCookies } from "@/module/auth";
import { createLogUser } from "@/module/user";
import _ from "lodash"; import _ from "lodash";
import moment from "moment"; import moment from "moment";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
@@ -67,14 +68,10 @@ export async function DELETE(request: Request, context: { params: { id: string }
} }
}) })
return NextResponse.json( // create log user
{ const log = await createLogUser({ act: 'DELETE', desc: 'User menghapus detail task divisi', table: 'divisionProjectTask', data: id })
success: true,
message: "Tugas berhasil dihapus", return NextResponse.json({ success: true, message: "Tugas berhasil dihapus", data, }, { status: 200 });
data,
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
return NextResponse.json({ success: false, message: "Gagal menghapus tugas divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); return NextResponse.json({ success: false, message: "Gagal menghapus tugas divisi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
@@ -146,14 +143,10 @@ export async function PUT(request: Request, context: { params: { id: string } })
} }
}) })
return NextResponse.json( // create log user
{ const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate status detail task divisi', table: 'divisionProjectTask', data: id })
success: true,
message: "Status detail tugas berhasil diupdate", return NextResponse.json({ success: true, message: "Status detail tugas berhasil diupdate", data, }, { status: 200 });
data,
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
return NextResponse.json({ success: false, message: "Gagal mengupdate status detail tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); return NextResponse.json({ success: false, message: "Gagal mengupdate status detail tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
@@ -230,14 +223,10 @@ export async function POST(request: Request, context: { params: { id: string } }
}, },
}); });
return NextResponse.json( // create log user
{ const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate data detail task divisi', table: 'divisionProjectTask', data: id })
success: true,
message: "Detail tugas berhasil diedit", return NextResponse.json({ success: true, message: "Detail tugas berhasil diedit", data, }, { status: 200 });
data,
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
return NextResponse.json({ success: false, message: "Gagal mengedit detail tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); return NextResponse.json({ success: false, message: "Gagal mengedit detail tugas, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });

View File

@@ -4,6 +4,7 @@ import _ from "lodash";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import fs from "fs"; import fs from "fs";
import path from "path"; import path from "path";
import { createLogUser } from "@/module/user";
// HAPUS DETAIL FILE, HAPUS FILE DI ASSETS DAN DATABASE (BUKAN PAKE ISACTIVE) // HAPUS DETAIL FILE, HAPUS FILE DI ASSETS DAN DATABASE (BUKAN PAKE ISACTIVE)
export async function DELETE(request: Request, context: { params: { id: string } }) { export async function DELETE(request: Request, context: { params: { id: string } }) {
@@ -55,15 +56,10 @@ export async function DELETE(request: Request, context: { params: { id: string }
}, },
}); });
// create log user
const log = await createLogUser({ act: 'DELETE', desc: 'User menghpus file divisi', table: 'divisionProject', data: String(dataRelasi?.idProject) })
return NextResponse.json( return NextResponse.json({ success: true, message: "File berhasil dihapus", data, }, { status: 200 });
{
success: true,
message: "File berhasil dihapus",
data,
},
{ status: 200 }
);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
@@ -155,7 +151,8 @@ export async function POST(request: Request, context: { params: { id: string } }
}) })
} }
// create log user
const log = await createLogUser({ act: 'CREATE', desc: 'User meambahkan file tugas divisi baru', table: 'divisionProject', data: id })
return NextResponse.json({ success: true, message: "Berhasil membuat tugas divisi" }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil membuat tugas divisi" }, { status: 200 });
} catch (error) { } catch (error) {

View File

@@ -5,6 +5,7 @@ import { NextResponse } from "next/server";
import path from "path"; import path from "path";
import fs from "fs"; import fs from "fs";
import moment from "moment"; import moment from "moment";
import { createLogUser } from "@/module/user";
// GET ALL DATA TUGAS DIVISI // GET ALL DATA TUGAS DIVISI
@@ -196,6 +197,9 @@ export async function POST(request: Request) {
}) })
} }
// create log user
const log = await createLogUser({ act: 'CREATE', desc: 'User membuat tugas divisi baru', table: 'divisionProject', data: data.id })
return NextResponse.json({ success: true, message: "Berhasil membuat tugas divisi" }, { status: 200 }); return NextResponse.json({ success: true, message: "Berhasil membuat tugas divisi" }, { status: 200 });

View File

@@ -3,7 +3,6 @@ import { ActionIcon, Avatar, Badge, Box, Center, Divider, Flex, Grid, Group, Inp
import { globalRole, LayoutDrawer, LayoutNavbarNew, SkeletonDetailDiscussionComment, SkeletonDetailDiscussionMember, SkeletonSingle, WARNA } from "@/module/_global"; import { globalRole, LayoutDrawer, LayoutNavbarNew, SkeletonDetailDiscussionComment, SkeletonDetailDiscussionMember, SkeletonSingle, WARNA } from "@/module/_global";
import { GrChatOption } from "react-icons/gr"; import { GrChatOption } from "react-icons/gr";
import { LuSendHorizonal } from "react-icons/lu"; import { LuSendHorizonal } from "react-icons/lu";
import NavbarDetailDiscussion from "@/module/discussion/ui/navbar_detail_discussion";
import { useState } from "react"; import { useState } from "react";
import { funCreateComent, funGetAllDiscussion, funGetDiscussionById } from "../lib/api_discussion"; import { funCreateComent, funGetAllDiscussion, funGetDiscussionById } from "../lib/api_discussion";
import { useShallowEffect } from "@mantine/hooks"; import { useShallowEffect } from "@mantine/hooks";
@@ -16,8 +15,7 @@ import { useHookstate } from "@hookstate/core";
import { globalRefreshDiscussion } from "../lib/val_discussion"; import { globalRefreshDiscussion } from "../lib/val_discussion";
import { HiMenu } from "react-icons/hi"; import { HiMenu } from "react-icons/hi";
import DrawerDetailDiscussion from "./drawer_detail_discussion"; import DrawerDetailDiscussion from "./drawer_detail_discussion";
import { funGetUserByCookies } from "@/module/auth"; import {globalIsAdminDivision } from "@/module/division_new";
import { funGetDivisionById } from "@/module/division_new";
export default function DetailDiscussion({ id, idDivision }: { id: string, idDivision: string }) { export default function DetailDiscussion({ id, idDivision }: { id: string, idDivision: string }) {
const [isData, setData] = useState<IDetailDiscussion>() const [isData, setData] = useState<IDetailDiscussion>()
@@ -27,20 +25,16 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv
const router = useRouter() const router = useRouter()
const refresh = useHookstate(globalRefreshDiscussion) const refresh = useHookstate(globalRefreshDiscussion)
const roleLogin = useHookstate(globalRole) const roleLogin = useHookstate(globalRole)
const [isAdmin, setAdmin] = useState(false)
const [isCreator, setCreator] = useState(false) const [isCreator, setCreator] = useState(false)
const adminLogin = useHookstate(globalIsAdminDivision)
const getData = async () => { const getData = async () => {
try { try {
setIsLoad(true) setIsLoad(true)
const response = await funGetDiscussionById(id) const response = await funGetDiscussionById(id)
const res = await funGetDivisionById(param.id);
const login = await funGetUserByCookies()
const cek = res.data.member.some((i: any) => i.idUser == login.id && i.isAdmin == true)
setAdmin(cek)
setData(response.data) setData(response.data)
setIsLoad(false) setIsLoad(false)
setCreator(response.data.createdBy == login.id) setCreator(response.data.isCreator)
} catch (error) { } catch (error) {
console.error(error) console.error(error)
} finally { } finally {
@@ -52,19 +46,25 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv
getData() getData()
}, [refresh.get()]) }, [refresh.get()])
async function reloadData() {
try {
const response = await funGetDiscussionById(id)
setData(response.data)
} catch (error) {
console.error(error)
}
}
const sendComent = async () => { const sendComent = async () => {
try { try {
if (isComent.trim() == "") { if (isComent.trim() == "") {
return toast.error("Masukkan Komentar Anda") return toast.error("Masukkan Komentar Anda")
} }
const response = await funCreateComent(id, { const response = await funCreateComent(id, { comment: isComent, idDiscussion: param.detail })
comment: isComent,
idDiscussion: param.detail
})
if (response.success) { if (response.success) {
setIsComent("") setIsComent("")
getData() reloadData()
} else { } else {
toast.error(response.message) toast.error(response.message)
} }
@@ -82,7 +82,7 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv
{/* <NavbarDetailDiscussion id={id} status={Number(isData?.status)} idDivision={idDivision} /> */} {/* <NavbarDetailDiscussion id={id} status={Number(isData?.status)} idDivision={idDivision} /> */}
<LayoutNavbarNew back={`/division/${param.id}/discussion/`} title="Diskusi " <LayoutNavbarNew back={`/division/${param.id}/discussion/`} title="Diskusi "
menu={ menu={
((roleLogin.get() != 'user' && roleLogin.get() != 'coadmin') || isAdmin || isCreator) ? ((roleLogin.get() != 'user' && roleLogin.get() != 'coadmin') || adminLogin.get() || isCreator) ?
<ActionIcon variant="light" onClick={() => setOpenDrawer(true)} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> <ActionIcon variant="light" onClick={() => setOpenDrawer(true)} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings">
<HiMenu size={20} color='white' /> <HiMenu size={20} color='white' />
</ActionIcon> </ActionIcon>

View File

@@ -15,6 +15,8 @@ import EditDivision from './ui/edit_division';
import CreateReport from './ui/create_report'; import CreateReport from './ui/create_report';
import ReportDivisionId from './ui/report_division_id'; import ReportDivisionId from './ui/report_division_id';
import { funGetDivisionById, funGetListDivisionByIdDivision, funGetSearchMemberDivision } from './lib/api_division'; import { funGetDivisionById, funGetListDivisionByIdDivision, funGetSearchMemberDivision } from './lib/api_division';
import { globalIsAdminDivision } from './lib/val_division';
import WrapLayoutDivision from './ui/wrap_division';
export { CreateUsers }; export { CreateUsers };
export { CreateAdminDivision }; export { CreateAdminDivision };
@@ -35,3 +37,5 @@ export { ReportDivisionId }
export { funGetDivisionById } export { funGetDivisionById }
export { funGetListDivisionByIdDivision } export { funGetListDivisionByIdDivision }
export { funGetSearchMemberDivision } export { funGetSearchMemberDivision }
export { globalIsAdminDivision }
export { WrapLayoutDivision }

View File

@@ -2,3 +2,4 @@ import { hookstate } from "@hookstate/core";
import { IFormMemberDivision } from "./type_division"; import { IFormMemberDivision } from "./type_division";
export const globalMemberDivision = hookstate<IFormMemberDivision[]>([]); export const globalMemberDivision = hookstate<IFormMemberDivision[]>([]);
export const globalIsAdminDivision = hookstate<boolean>(false)

View File

@@ -0,0 +1,28 @@
'use client'
import { useHookstate } from "@hookstate/core";
import { useShallowEffect } from "@mantine/hooks";
import { globalIsAdminDivision } from "../lib/val_division";
import { funGetDivisionById } from "../lib/api_division";
import { useParams } from "next/navigation";
import { funGetUserByCookies } from "@/module/auth";
export default function WrapLayoutDivision({ children }: { children: React.ReactNode }) {
const isAdmin = useHookstate(globalIsAdminDivision)
const param = useParams<{ id: string }>()
const getData = async () => {
const res = await funGetDivisionById(param.id);
const login = await funGetUserByCookies()
const cek = res.data.member.some((i: any) => i.idUser == login.id && i.isAdmin == true)
isAdmin.set(cek)
}
useShallowEffect(() => {
getData()
}, [])
return (
<>
{children}
</>
);
}

View File

@@ -1,5 +1,5 @@
'use client' 'use client'
import { LayoutDrawer, SkeletonSingle, WARNA } from "@/module/_global"; import { globalRole, LayoutDrawer, SkeletonSingle, WARNA } from "@/module/_global";
import { Box, Group, Flex, Avatar, Text, SimpleGrid, Stack, Grid } from "@mantine/core"; import { Box, Group, Flex, Avatar, Text, SimpleGrid, Stack, Grid } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks"; import { useShallowEffect } from "@mantine/hooks";
import { useParams, useRouter } from "next/navigation"; import { useParams, useRouter } from "next/navigation";
@@ -10,6 +10,8 @@ import { IDataMemberTaskDivision } from "../lib/type_task";
import { FaUser } from "react-icons/fa6"; import { FaUser } from "react-icons/fa6";
import { IoIosCloseCircle } from "react-icons/io"; import { IoIosCloseCircle } from "react-icons/io";
import LayoutModal from "@/module/_global/layout/layout_modal"; import LayoutModal from "@/module/_global/layout/layout_modal";
import { useHookstate } from "@hookstate/core";
import { globalIsAdminDivision } from "@/module/division_new";
export default function ListAnggotaDetailTask() { export default function ListAnggotaDetailTask() {
@@ -20,6 +22,8 @@ export default function ListAnggotaDetailTask() {
const [isOpenModal, setOpenModal] = useState(false) const [isOpenModal, setOpenModal] = useState(false)
const [dataChoose, setDataChoose] = useState({ id: '', name: '' }) const [dataChoose, setDataChoose] = useState({ id: '', name: '' })
const router = useRouter() const router = useRouter()
const roleLogin = useHookstate(globalRole)
const adminLogin = useHookstate(globalIsAdminDivision)
async function getOneData() { async function getOneData() {
try { try {
@@ -140,7 +144,8 @@ export default function ListAnggotaDetailTask() {
<Text c={WARNA.biruTua}>Lihat profil</Text> <Text c={WARNA.biruTua}>Lihat profil</Text>
</Box> </Box>
</Flex> </Flex>
{
(roleLogin.get() != "user" && roleLogin.get() != "coadmin") || adminLogin.get() ?
<Flex onClick={() => { setOpenModal(true) }} justify={'center'} align={'center'} direction={'column'} > <Flex onClick={() => { setOpenModal(true) }} justify={'center'} align={'center'} direction={'column'} >
<Box> <Box>
<IoIosCloseCircle size={30} color={WARNA.biruTua} /> <IoIosCloseCircle size={30} color={WARNA.biruTua} />
@@ -149,6 +154,8 @@ export default function ListAnggotaDetailTask() {
<Text c={WARNA.biruTua}>Keluarkan anggota</Text> <Text c={WARNA.biruTua}>Keluarkan anggota</Text>
</Box> </Box>
</Flex> </Flex>
: <></>
}
</SimpleGrid> </SimpleGrid>
</Stack> </Stack>
</Box> </Box>

View File

@@ -1,5 +1,5 @@
import { WARNA } from "@/module/_global"; import { WARNA } from "@/module/_global";
import { ActionIcon, Avatar, Badge, Box, Card, Center, Divider, Flex, Grid, Group, Progress, Skeleton, Text, TextInput, Title } from "@mantine/core"; import { ActionIcon, Avatar, Box, Card, Center, Divider, Flex, Grid, Group, Progress, Skeleton, Text, TextInput, Title } from "@mantine/core";
import { useParams, useRouter, useSearchParams } from "next/navigation"; import { useParams, useRouter, useSearchParams } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { HiMagnifyingGlass, HiMiniPresentationChartBar, HiOutlineListBullet, HiSquares2X2 } from "react-icons/hi2"; import { HiMagnifyingGlass, HiMiniPresentationChartBar, HiOutlineListBullet, HiSquares2X2 } from "react-icons/hi2";
@@ -67,6 +67,7 @@ export default function ListDivisionTask() {
radius={30} radius={30}
leftSection={<HiMagnifyingGlass size={20} />} leftSection={<HiMagnifyingGlass size={20} />}
placeholder="Pencarian" placeholder="Pencarian"
onChange={(val) => setSearchQuery(val.target.value)}
/> />
</Grid.Col> </Grid.Col>
<Grid.Col span={'auto'}> <Grid.Col span={'auto'}>
@@ -181,7 +182,7 @@ export default function ListDivisionTask() {
<Avatar> <Avatar>
<MdAccountCircle size={32} color={WARNA.biruTua} /> <MdAccountCircle size={32} color={WARNA.biruTua} />
</Avatar> </Avatar>
<Avatar>+{v.member - 1}</Avatar> <Avatar>{(v.member == 0) ? "0" : "+" + (v.member - 1)}</Avatar>
</Avatar.Group> </Avatar.Group>
</Group> </Group>
</Box> </Box>

View File

@@ -1,5 +1,5 @@
'use client' 'use client'
import { LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global"; import { globalRole, LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global";
import { ActionIcon, Box, Flex, SimpleGrid, Stack, Text } from "@mantine/core"; import { ActionIcon, Box, Flex, SimpleGrid, Stack, Text } from "@mantine/core";
import { useParams, useRouter } from "next/navigation"; import { useParams, useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
@@ -10,12 +10,16 @@ import { HiMenu } from "react-icons/hi";
import { IoAddCircle } from "react-icons/io5"; import { IoAddCircle } from "react-icons/io5";
import { FaFileCirclePlus, FaPencil, FaUsers } from "react-icons/fa6"; import { FaFileCirclePlus, FaPencil, FaUsers } from "react-icons/fa6";
import { MdCancel } from "react-icons/md"; import { MdCancel } from "react-icons/md";
import { globalIsAdminDivision } from "@/module/division_new";
import { useHookstate } from "@hookstate/core";
export default function NavbarDetailDivisionTask() { export default function NavbarDetailDivisionTask() {
const router = useRouter() const router = useRouter()
const param = useParams<{ id: string, detail: string }>() const param = useParams<{ id: string, detail: string }>()
const [name, setName] = useState('') const [name, setName] = useState('')
const [isOpen, setOpen] = useState(false) const [isOpen, setOpen] = useState(false)
const roleLogin = useHookstate(globalRole)
const adminLogin = useHookstate(globalIsAdminDivision)
async function getOneData() { async function getOneData() {
try { try {
@@ -80,9 +84,25 @@ export default function NavbarDetailDivisionTask() {
cursor: 'pointer' cursor: 'pointer'
}} }}
onClick={() => { onClick={() => {
router.push(param.detail + '/add-member') router.push(param.detail + '/add-file')
}} }}
> >
<Box>
<FaFileCirclePlus size={30} color={WARNA.biruTua} />
</Box>
<Box>
<Text c={WARNA.biruTua} ta='center'>Tambah file</Text>
</Box>
</Flex>
{
(roleLogin.get() != "user" && roleLogin.get() != "coadmin") || adminLogin.get() ?
<>
<Flex justify={'center'} align={'center'} direction={'column'}
style={{
cursor: 'pointer'
}}
onClick={() => { router.push(param.detail + '/add-member') }} >
<Box> <Box>
<FaUsers size={30} color={WARNA.biruTua} /> <FaUsers size={30} color={WARNA.biruTua} />
</Box> </Box>
@@ -95,24 +115,7 @@ export default function NavbarDetailDivisionTask() {
style={{ style={{
cursor: 'pointer' cursor: 'pointer'
}} }}
onClick={() => { onClick={() => { router.push(param.detail + '/edit') }} >
router.push(param.detail + '/add-file')
}}
>
<Box>
<FaFileCirclePlus size={30} color={WARNA.biruTua} />
</Box>
<Box>
<Text c={WARNA.biruTua} ta='center'>Tambah file</Text>
</Box>
</Flex>
<Flex justify={'center'} align={'center'} direction={'column'}
style={{
cursor: 'pointer'
}}
onClick={() => { router.push(param.detail + '/edit') }}
>
<Box> <Box>
<FaPencil size={30} color={WARNA.biruTua} /> <FaPencil size={30} color={WARNA.biruTua} />
</Box> </Box>
@@ -125,8 +128,7 @@ export default function NavbarDetailDivisionTask() {
style={{ style={{
cursor: 'pointer' cursor: 'pointer'
}} }}
onClick={() => { router.push(param.detail + '/cancel') }} onClick={() => { router.push(param.detail + '/cancel') }} >
>
<Box> <Box>
<MdCancel size={30} color={WARNA.biruTua} /> <MdCancel size={30} color={WARNA.biruTua} />
</Box> </Box>
@@ -134,6 +136,10 @@ export default function NavbarDetailDivisionTask() {
<Text c={WARNA.biruTua} ta='center'>Batal</Text> <Text c={WARNA.biruTua} ta='center'>Batal</Text>
</Box> </Box>
</Flex> </Flex>
</> : <></>
}
</SimpleGrid> </SimpleGrid>
</Stack> </Stack>

View File

@@ -1,21 +1,27 @@
'use client' 'use client'
import { LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global"; import { globalRole, LayoutDrawer, LayoutNavbarNew, WARNA } from "@/module/_global";
import { ActionIcon } from "@mantine/core"; import { ActionIcon } from "@mantine/core";
import { useState } from "react"; import { useState } from "react";
import { HiMenu } from "react-icons/hi"; import { HiMenu } from "react-icons/hi";
import DrawerDivisionTask from "./drawer_division_task"; import DrawerDivisionTask from "./drawer_division_task";
import { useParams } from "next/navigation"; import { useParams } from "next/navigation";
import { useHookstate } from "@hookstate/core";
import { globalIsAdminDivision } from "@/module/division_new";
export default function NavbarDivisionTask() { export default function NavbarDivisionTask() {
const [openDrawer, setOpenDrawer] = useState(false) const [openDrawer, setOpenDrawer] = useState(false)
const param = useParams<{ id: string}>() const param = useParams<{ id: string }>()
const roleLogin = useHookstate(globalRole)
const adminLogin = useHookstate(globalIsAdminDivision)
return ( return (
<> <>
<LayoutNavbarNew back={`/division/${param.id}`} title="Divisi - Tugas" <LayoutNavbarNew back={`/division/${param.id}`} title="Divisi - Tugas"
menu={ menu={((roleLogin.get() != "user" && roleLogin.get() != "coadmin") || adminLogin.get()) ?
<ActionIcon variant="light" onClick={() => setOpenDrawer(true)} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings"> <ActionIcon variant="light" onClick={() => setOpenDrawer(true)} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings">
<HiMenu size={20} color='white' /> <HiMenu size={20} color='white' />
</ActionIcon> </ActionIcon>
: <></>
} }
/> />
<LayoutDrawer opened={openDrawer} title={'Menu'} onClose={() => setOpenDrawer(false)}> <LayoutDrawer opened={openDrawer} title={'Menu'} onClose={() => setOpenDrawer(false)}>

View File

@@ -19,12 +19,12 @@ export default function TabsDivisionTask() {
{ {
id: "0", id: "0",
title: "Segera", title: "Segera",
icon: <RiProgress3Line style={iconStyle} /> icon: <TbClockPause style={iconStyle} />
}, },
{ {
id: "1", id: "1",
title: "Dikerjakan", title: "Dikerjakan",
icon: <TbClockPause style={iconStyle} /> icon: <RiProgress3Line style={iconStyle} />
}, },
{ {
id: "2", id: "2",
@@ -77,7 +77,7 @@ export default function TabsDivisionTask() {
color={ color={
status == item.id status == item.id
? "white" ? "white"
: WARNA.biruTua : (status == null && item.id == "0") ? "white" : WARNA.biruTua
} }
onClick={() => { router.push("?status=" + item.id) }} onClick={() => { router.push("?status=" + item.id) }}
defaultValue={(status == "1" || status == "2" || status == "3") ? status : "0"} defaultValue={(status == "1" || status == "2" || status == "3") ? status : "0"}
@@ -85,7 +85,7 @@ export default function TabsDivisionTask() {
bg={ bg={
status == item.id status == item.id
? "#FF9861" ? "#FF9861"
: "transparent" : (status == null && item.id == "0") ? "#FF9861" : "transparent"
} }
> >
{item.icon} {item.icon}