Deskripsi:
- Upload ke stroage untuk job
## Np Issuee
This commit is contained in:
2024-09-19 15:59:21 +08:00
parent 128dc98839
commit f96d80d55d
153 changed files with 1369 additions and 1200 deletions

View File

@@ -0,0 +1,49 @@
import { AccentColor } from "@/app_modules/_global/color";
import { job_getAllListPublish } from "@/app_modules/job/fun/get/get_all_publish";
import { Center, Button, Affix, rem } from "@mantine/core";
import { useWindowScroll } from "@mantine/hooks";
import { useState } from "react";
export function Job_ComponentButtonUpdateBeranda({
onSetData,
onSetIsNewPost,
}: {
onSetData: (val: any) => void;
onSetIsNewPost: (val: any) => void;
}) {
const [scroll, scrollTo] = useWindowScroll();
const [isLoading, setIsLoading] = useState(false);
async function onLoadData() {
const loadData = await job_getAllListPublish({ page: 1 });
if (loadData) {
onSetData(loadData);
onSetIsNewPost(false);
setIsLoading(false);
}
}
return (
<>
<Affix position={{ top: rem(100) }} w={"100%"}>
<Center>
<Button
style={{
transition: "0.5s",
border: `1px solid ${AccentColor.skyblue}`,
}}
bg={AccentColor.blue}
loaderPosition="center"
loading={isLoading ? true : false}
radius={"xl"}
opacity={scroll.y > 0 ? 0.5 : 0.8}
onClick={() => onLoadData()}
>
Update beranda
</Button>
</Center>
</Affix>
</>
);
}

View File

@@ -15,7 +15,7 @@ import { MODEL_JOB } from "../../model/interface";
import { funGlobal_UploadToStorage } from "@/app_modules/_global/fun";
import { DIRECTORY_ID } from "@/app/lib";
export function Job_ComponentButtonUpdate({
export function Job_ComponentButtonUpdateData({
value,
file,
}: {
@@ -48,6 +48,7 @@ export function Job_ComponentButtonUpdate({
const updateWithFile = await job_EditById({
data: value,
fileId: uploadFile.data.id,
});
if (updateWithFile.status !== 200)
return ComponentGlobal_NotifikasiGagal(updateWithFile.message);

View File

@@ -1,66 +0,0 @@
"use client";
import { RouterJob } from "@/app/lib/router_hipmi/router_job";
import { AccentColor } from "@/app_modules/_global/color/color_pallet";
import { Affix, rem, ActionIcon, Loader, Box } from "@mantine/core";
import { IconPencilPlus } from "@tabler/icons-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
export default function ComponentJob_CreateButton() {
const router = useRouter();
const [isLoading, setLoading] = useState(false);
return (
<>
<ActionIcon
variant="transparent"
radius={"xl"}
size={"xl"}
style={{
position: "absolute",
zIndex: 1,
bottom: 100,
right: 30,
transition: "0.5s",
border: `1px solid ${AccentColor.skyblue}`,
backgroundColor: AccentColor.blue,
padding: 3,
}}
onClick={() => {
setLoading(true);
router.push(RouterJob.create);
}}
>
{isLoading ? (
<Loader color={AccentColor.yellow} size={25} />
) : (
<IconPencilPlus color="white" />
)}
</ActionIcon>
{/* <Affix withinPortal position={{ bottom: 150, right: 30 }}>
<ActionIcon
style={{
transition: "0.5s",
border: `1px solid ${AccentColor.skyblue}`,
}}
bg={AccentColor.blue}
size={"xl"}
radius={"xl"}
variant="transparent"
onClick={() => {
setLoading(true);
router.push(RouterJob.create);
}}
>
{isLoading ? (
<Loader color={AccentColor.yellow} size={25} />
) : (
<IconPencilPlus color="white" />
)}
</ActionIcon>
</Affix> */}
</>
);
}

View File

@@ -1,7 +1,9 @@
import Job_ComponentButtonSaveCreate from "./button/comp_button_save_create";
import { Job_ComponentButtonUpdate } from "./button/comp_button_update";
import { Job_ComponentButtonUpdateBeranda } from "./button/comp_button_update_beranda";
import { Job_ComponentButtonUpdateData } from "./button/comp_button_update_data";
import { Job_ComponentBoxUploadImage } from "./detail/comp_box_upload_image";
export { Job_ComponentButtonSaveCreate };
export { Job_ComponentBoxUploadImage };
export { Job_ComponentButtonUpdate };
export { Job_ComponentButtonUpdateData as Job_ComponentButtonUpdate };
export { Job_ComponentButtonUpdateBeranda };

View File

@@ -2,7 +2,6 @@
import {
AspectRatio,
Box,
Button,
Center,
FileButton,
@@ -29,13 +28,11 @@ import {
import {
ComponentGlobal_BoxInformation,
ComponentGlobal_BoxUploadImage,
ComponentGlobal_CardStyles,
ComponentGlobal_InputCountDown,
} from "@/app_modules/_global/component";
import {
Job_ComponentBoxUploadImage,
Job_ComponentButtonSaveCreate,
} from "../component";
import { Job_ComponentButtonSaveCreate } from "../component";
import { defaultDeskripsi, defaultSyarat } from "../component/default_value";
export default function Job_Create() {
@@ -57,7 +54,7 @@ export default function Job_Create() {
<ComponentGlobal_BoxInformation informasi="Poster atau gambar lowongan kerja bersifat opsional, tidak wajib untuk dimasukkan dan upload lah gambar yang sesuai dengan deskripsi lowongan kerja. " />
<Stack spacing={"xs"}>
<Job_ComponentBoxUploadImage>
<ComponentGlobal_BoxUploadImage>
{img ? (
<AspectRatio ratio={1 / 1} mah={265} mx={"auto"}>
<Image
@@ -75,7 +72,7 @@ export default function Job_Create() {
</Text>
</Stack>
)}
</Job_ComponentBoxUploadImage>
</ComponentGlobal_BoxUploadImage>
<Center>
<FileButton

View File

@@ -1,53 +1,35 @@
"use client";
import { RouterJob } from "@/app/lib/router_hipmi/router_job";
import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/_global/notif_global/notifikasi_berhasil";
import {
AspectRatio,
Button,
Center,
FileButton,
Group,
Image,
Loader,
Modal,
Paper,
Stack,
Text,
TextInput,
Title,
TextInput
} from "@mantine/core";
import {
useDisclosure,
useShallowEffect,
useWindowScroll,
} from "@mantine/hooks";
import { IconCamera, IconUpload } from "@tabler/icons-react";
import { useAtom } from "jotai";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { gs_job_hot_menu, gs_job_status } from "../global_state";
import { MODEL_JOB } from "../model/interface";
import { APIs } from "@/app/lib";
import {
AccentColor,
MainColor,
} from "@/app_modules/_global/color/color_pallet";
import { ComponentGlobal_BoxUploadImage, ComponentGlobal_CardStyles } from "@/app_modules/_global/component";
import ComponentGlobal_InputCountDown from "@/app_modules/_global/component/input_countdown";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/_global/notif_global/notifikasi_gagal";
import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global/notifikasi_peringatan";
import dynamic from "next/dynamic";
import { job_EditById } from "../fun/edit/fun_edit_by_id";
import "react-quill/dist/quill.snow.css";
import { Job_ComponentBoxUploadImage, Job_ComponentButtonUpdate } from "../component";
const ReactQuill = dynamic(
() => {
return import("react-quill");
},
{ ssr: false }
);
import "react-quill/dist/quill.snow.css";
import { Job_ComponentBoxUploadImage, Job_ComponentButtonUpdate } from "../component";
import { APIs } from "@/app/lib";
import { ComponentGlobal_CardStyles } from "@/app_modules/_global/component";
export default function Job_Edit({ dataJob }: { dataJob: MODEL_JOB }) {
const [value, setValue] = useState(dataJob);
@@ -63,7 +45,7 @@ export default function Job_Edit({ dataJob }: { dataJob: MODEL_JOB }) {
<>
<Stack>
<Stack spacing={"xs"}>
<Job_ComponentBoxUploadImage>
<ComponentGlobal_BoxUploadImage>
{value.imageId ? (
<AspectRatio ratio={1 / 1} mah={265} mx={"auto"}>
<Image
@@ -81,7 +63,7 @@ export default function Job_Edit({ dataJob }: { dataJob: MODEL_JOB }) {
</Text>
</Stack>
)}
</Job_ComponentBoxUploadImage>
</ComponentGlobal_BoxUploadImage>
<Center>
<FileButton

View File

@@ -1,12 +1,12 @@
"use server";
import { prisma } from "@/app/lib";
import { user_funGetOneUserId } from "@/app_modules/fun_global";
import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
import { revalidatePath } from "next/cache";
import { MODEL_JOB } from "../../model/interface";
export async function job_funCreateNoFile({ data }: { data: MODEL_JOB }) {
const authorId = await user_funGetOneUserId();
const authorId = await funGetUserIdByToken();
const createNoImage = await prisma.job.create({
data: {

View File

@@ -1,15 +1,9 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_funGetOneUserId } from "@/app_modules/fun_global/get_user_token";
import _ from "lodash";
import { v4 } from "uuid";
import fs from "fs";
import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
import { revalidatePath } from "next/cache";
import { MODEL_JOB } from "../../model/interface";
import path from "path";
import { funGlobal_UploadToStorage } from "@/app_modules/_global/fun";
import { DIRECTORY_ID } from "@/app/lib";
export async function job_funCreateWithFile({
data,
@@ -18,15 +12,14 @@ export async function job_funCreateWithFile({
data: MODEL_JOB;
fileId: string;
}) {
const authorId = await user_funGetOneUserId();
console.log(authorId);
const userLoginId = await funGetUserIdByToken();
const createDataWithoutImg = await prisma.job.create({
data: {
title: data.title,
content: data.content,
deskripsi: data.deskripsi,
authorId: authorId,
authorId: userLoginId,
imageId: fileId,
},
select: {

View File

@@ -1,21 +1,18 @@
"use server";
import prisma from "@/app/lib/prisma";
import _ from "lodash";
import { v4 } from "uuid";
import fs from "fs";
import { MODEL_JOB } from "../../model/interface";
import { revalidatePath } from "next/cache";
import { RouterJob } from "@/app/lib/router_hipmi/router_job";
import { revalidatePath } from "next/cache";
import { MODEL_JOB } from "../../model/interface";
export async function job_EditById({
data,
imageId,
fileId,
}: {
data: MODEL_JOB;
imageId?: string;
fileId?: string;
}) {
if (imageId == undefined) {
if (fileId == undefined) {
const updt = await prisma.job.update({
where: {
id: data.id,
@@ -28,7 +25,7 @@ export async function job_EditById({
});
if (!updt) return { status: 400, message: "Gagal Update" };
revalidatePath(RouterJob.status);
return {
status: 200,
message: "Berhasil Update",
@@ -42,7 +39,7 @@ export async function job_EditById({
title: data.title,
content: data.content,
deskripsi: data.deskripsi,
imageId: imageId,
imageId: fileId,
},
});
if (!updtWithFile) return { status: 400, message: "Gagal Update" };

View File

@@ -1,11 +1,10 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_funGetOneUserId } from "@/app_modules/fun_global/get_user_token";
import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
export async function job_getAllArsipById({page}: {page: number}) {
const authorId = await user_funGetOneUserId();
export async function job_getAllArsipById({ page }: { page: number }) {
const userLoginId = await funGetUserIdByToken();
const takeData = 10;
const skipData = page * takeData - takeData;
@@ -17,7 +16,7 @@ export async function job_getAllArsipById({page}: {page: number}) {
updatedAt: "desc",
},
where: {
authorId: authorId,
authorId: userLoginId,
isArsip: true,
isActive: true,
},

View File

@@ -1,7 +1,6 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_funGetOneUserId } from "@/app_modules/fun_global/get_user_token";
export async function job_getAllListPublish({
page,

View File

@@ -1,7 +1,7 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_funGetOneUserId } from "@/app_modules/fun_global/get_user_token";
import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
export default async function job_getAllStatusDraft({
page,
@@ -11,7 +11,8 @@ export default async function job_getAllStatusDraft({
const takeData = 10;
const skipData = page * takeData - takeData;
const authorId = await user_funGetOneUserId();
const userLoginId = await funGetUserIdByToken();
const data = await prisma.job.findMany({
take: takeData,
skip: skipData,
@@ -20,7 +21,7 @@ export default async function job_getAllStatusDraft({
},
where: {
masterStatusId: "3",
authorId: authorId,
authorId: userLoginId,
isActive: true,
},
});

View File

@@ -1,7 +1,7 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_funGetOneUserId } from "@/app_modules/fun_global/get_user_token";
import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
export default async function job_getAllStatusPublish({
page,
@@ -11,7 +11,8 @@ export default async function job_getAllStatusPublish({
const takeData = 10;
const skipData = page * takeData - takeData;
const authorId = await user_funGetOneUserId();
const userLoginId = await funGetUserIdByToken();
const data = await prisma.job.findMany({
take: takeData,
skip: skipData,
@@ -20,7 +21,7 @@ export default async function job_getAllStatusPublish({
},
where: {
masterStatusId: "1",
authorId: authorId,
authorId: userLoginId,
isActive: true,
isArsip: false,
},

View File

@@ -1,17 +1,17 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_funGetOneUserId } from "@/app_modules/fun_global/get_user_token";
import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
export default async function job_getAllStatusReject({
page,
}: {
page: number;
}) {
const userLoginId = await funGetUserIdByToken();
const takeData = 10;
const skipData = page * takeData - takeData;
const authorId = await user_funGetOneUserId();
const data = await prisma.job.findMany({
take: takeData,
skip: skipData,
@@ -20,7 +20,7 @@ export default async function job_getAllStatusReject({
},
where: {
masterStatusId: "4",
authorId: authorId,
authorId: userLoginId,
isActive: true,
},
});

View File

@@ -1,17 +1,17 @@
"use server";
import prisma from "@/app/lib/prisma";
import { user_funGetOneUserId } from "@/app_modules/fun_global/get_user_token";
import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
export default async function job_getAllStatusReview({
page,
}: {
page: number;
}) {
const userLoginId = await funGetUserIdByToken();
const takeData = 10;
const skipData = page * takeData - takeData;
const authorId = await user_funGetOneUserId();
const data = await prisma.job.findMany({
take: takeData,
skip: skipData,
@@ -20,7 +20,7 @@ export default async function job_getAllStatusReview({
},
where: {
masterStatusId: "2",
authorId: authorId,
authorId: userLoginId,
isActive: true,
},
});

View File

@@ -3,7 +3,15 @@
import { RouterJob } from "@/app/lib/router_hipmi/router_job";
import ComponentGlobal_CreateButton from "@/app_modules/_global/component/button_create";
import ComponentGlobal_IsEmptyData from "@/app_modules/_global/component/is_empty_data";
import { Center, Loader, Stack, TextInput } from "@mantine/core";
import {
Affix,
Button,
Center,
Loader,
rem,
Stack,
TextInput,
} from "@mantine/core";
import { IconSearch } from "@tabler/icons-react";
import _ from "lodash";
import { ScrollOnly } from "next-scroll-loader";
@@ -11,11 +19,15 @@ import { useState } from "react";
import ComponentJob_BerandaCardView from "../../component/beranda/card_view";
import { job_getAllListPublish } from "../../fun/get/get_all_publish";
import { MODEL_JOB } from "../../model/interface";
import { useShallowEffect } from "@mantine/hooks";
import mqtt_client from "@/util/mqtt_client";
import { Job_ComponentButtonUpdateBeranda } from "../../component";
export function Job_UiBeranda({ listData }: { listData: MODEL_JOB[] }) {
const [data, setData] = useState(listData);
const [activePage, setActivePage] = useState(1);
const [isSearch, setIsSearch] = useState("");
const [isNewPost, setIsNewPost] = useState(false);
async function onSearch(text: string) {
setIsSearch(text);
@@ -27,21 +39,45 @@ export function Job_UiBeranda({ listData }: { listData: MODEL_JOB[] }) {
setActivePage(1);
}
useShallowEffect(() => {
onLoadNewData({
onLoad(val) {
setData(val);
},
});
mqtt_client.subscribe("Job_new_post");
mqtt_client.on("message", (topic, message) => {
if (topic === "Job_new_post") {
setIsNewPost(true);
}
});
}, [setIsNewPost, setData]);
async function onLoadNewData({ onLoad }: { onLoad: (val: any) => void }) {
const loadData = await job_getAllListPublish({ page: 1 });
onLoad(loadData);
}
return (
<>
<Stack my={1} spacing={30}>
{/* <ComponentJob_CreateButton /> */}
<ComponentGlobal_CreateButton path={RouterJob.create}/>
{isNewPost && (
<Job_ComponentButtonUpdateBeranda
onSetIsNewPost={(val) => setIsNewPost(val)}
onSetData={(val) => setData(val)}
/>
)}
<ComponentGlobal_CreateButton path={RouterJob.create} />
<TextInput
style={{
position: "sticky",
top: 0,
zIndex: 99,
}}
radius={"xl"}
icon={<IconSearch/>}
icon={<IconSearch />}
placeholder="Pekerjaan apa yang anda cari ?"
onChange={(val) => {
onSearch(val.currentTarget.value);