Desc:
- Perubahan minor
This commit is contained in:
2023-10-06 13:33:59 +08:00
parent 8188728e6a
commit cc3aad4e86
12 changed files with 274 additions and 167 deletions

View File

@@ -44,18 +44,19 @@ model UserSession {
} }
model Profile { model Profile {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
email String @unique email String @unique
alamat String alamat String
jenisKelamin String jenisKelamin String
active Boolean @default(true) active Boolean @default(true)
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt updatedAt DateTime @default(now()) @updatedAt
User User? @relation(fields: [userId], references: [id]) User User? @relation(fields: [userId], references: [id])
userId String? @unique userId String? @unique
ImageProfile Images? @relation(fields: [imagesId], references: [id]) ImageProfile Images? @relation(fields: [imagesId], references: [id])
imagesId String? @unique imagesId String? @unique
Katalog Katalog[]
} }
model Images { model Images {
@@ -66,3 +67,27 @@ model Images {
updatedAt DateTime @default(now()) @updatedAt updatedAt DateTime @default(now()) @updatedAt
Profile Profile? Profile Profile?
} }
model Katalog {
id String @id @default(cuid())
namaBisnis String
alamatKantor String
tlpn String
deskripssi String
active Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
Profile Profile? @relation(fields: [profileId], references: [id])
profileId String?
MasterBidangBisnis MasterBidangBisnis @relation(fields: [masterBidangBisnisId], references: [id])
masterBidangBisnisId String
}
model MasterBidangBisnis {
id String @id
name String
active Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
Katalog Katalog[]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

View File

@@ -0,0 +1,25 @@
import { myConsole } from "@/app/fun/my_console";
import prisma from "@/app/lib/prisma";
import { NextResponse } from "next/server";
export async function POST(req: Request) {
if (req.method === "POST") {
const body = await req.json();
// myConsole(body);
const data = await prisma.katalog.create({
data: {
profileId: body.profileId,
namaBisnis: body.namaBisnis,
alamatKantor: body.alamatKantor,
tlpn: body.tlpn,
deskripssi: body.deskripssi,
masterBidangBisnisId: body.masterBidangBisnisId,
},
});
console.log(data)
return NextResponse.json({ status: 201, success: true });
}
return NextResponse.json({ success: false });
}

View File

@@ -1,12 +1,14 @@
import { loadListPortofolio } from "@/app_modules/katalog/portofolio/fun/fun_get_all_portofolio";
import { getProfile } from "@/app_modules/katalog/profile"; import { getProfile } from "@/app_modules/katalog/profile";
import { KatalogView } from "@/app_modules/katalog/view"; import { KatalogView } from "@/app_modules/katalog/view";
export default async function Page() { export default async function Page() {
const data = await getProfile(); const data = await getProfile();
const listPorto = await loadListPortofolio(data?.id as string)
return ( return (
<> <>
{/* {JSON.stringify(data)} */} {/* {JSON.stringify(data)} */}
<KatalogView data={data} /> <KatalogView data={data} porto={listPorto} />
</> </>
); );
} }

View File

@@ -1,5 +1,5 @@
export function myConsole(value: any) { export function myConsole(value: any) {
const onData = false const onData = true
if (onData) { if (onData) {
console.log(value); console.log(value);
} }

View File

@@ -11,4 +11,7 @@ export const ApiHipmi = {
create_profile: "/api/profile/create", create_profile: "/api/profile/create",
edit_profile: "/api/profile/edit", edit_profile: "/api/profile/edit",
get_foto: "/api/profile/foto/", get_foto: "/api/profile/foto/",
//Portofolio
create_portofolio: "/api/portofolio/create",
}; };

View File

@@ -36,6 +36,7 @@ import { useAtom } from "jotai";
import { gs_token } from "./state/global_state"; import { gs_token } from "./state/global_state";
import { loadDataProfile } from "../katalog/profile/fun/fun_get_profile"; import { loadDataProfile } from "../katalog/profile/fun/fun_get_profile";
import { gs_profile } from "../katalog/profile/state/global_state"; import { gs_profile } from "../katalog/profile/state/global_state";
import { loadListPortofolio } from "../katalog/portofolio/fun/fun_get_all_portofolio";
const listHalaman = [ const listHalaman = [
{ {
@@ -98,6 +99,11 @@ export default function HomeView() {
loadDataProfile(setProfile); loadDataProfile(setProfile);
}, []); }, []);
// const [listPorto, setListPorto] = useState<any | null>(null);
// useShallowEffect(() => {
// loadListPortofolio(profile?.id).then((res) => setListPorto(res));
// }, [profile?.id]);
return ( return (
<> <>
{/* <pre>{JSON.stringify(profile, null, 2)}</pre> */} {/* <pre>{JSON.stringify(profile, null, 2)}</pre> */}

View File

@@ -4,7 +4,8 @@ import { getProfile } from "./api/get-profile";
import EditProfileLayout from "./edit/layout"; import EditProfileLayout from "./edit/layout";
import EditProfileView from "./edit/view"; import EditProfileView from "./edit/view";
import UploadFotoProfile from "./upload/view"; import UploadFotoProfile from "./upload/view";
import UploadFotoProfileLayout from "./upload/layout"; import UploadFotoProfileLayout from "./upload/layout"
import ProfileView from "./view/view";
export { export {
ProfileLayout, ProfileLayout,
@@ -14,4 +15,5 @@ export {
EditProfileLayout, EditProfileLayout,
UploadFotoProfile, UploadFotoProfile,
UploadFotoProfileLayout, UploadFotoProfileLayout,
ProfileView
}; };

View File

@@ -0,0 +1,192 @@
"use client";
import { Warna } from "@/app/lib/warna";
import {
ActionIcon,
BackgroundImage,
Box,
Center,
Flex,
Grid,
Group,
Image,
Paper,
Text,
} from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
import {
IconAddressBook,
IconCamera,
IconEditCircle,
IconGenderFemale,
IconGenderMale,
IconHome,
IconMail,
} from "@tabler/icons-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { myConsole } from "@/app/fun/my_console";
import { useAtom } from "jotai";
import { ApiHipmi } from "@/app/lib/api";
import { loadDataProfile } from "../fun/fun_get_profile";
import { getFotoProfile } from "../api/get-foto-profile";
export default function ProfileView({data}: {data: any}) {
const router = useRouter();
//Get data profile
const [profile, setProfile] = useState(data);
useShallowEffect(() => {
loadDataProfile(setProfile);
}, []);
const [foto, setFoto] = useState<any | null>(null);
useShallowEffect(() => {
if (profile?.imagesId === undefined || profile?.imagesId === null) {
myConsole("Waiting data");
} else {
getFotoProfile(profile.imagesId).then((res) => setFoto(res?.url));
}
myConsole(profile?.imagesId);
}, [profile?.imagesId]);
return (
<>
{/* {JSON.stringify(data)} */}
{/* Background dan foto */}
<Box>
<Paper bg={"gray"} p={"md"}>
<Image alt="" src={"/aset/logo.png"} />
</Paper>
<Center>
{foto ? (
<Image
radius={50}
alt=""
src={ApiHipmi.get_foto + `${foto}`}
height={100}
width={100}
sx={{
position: "absolute",
marginBottom: 10,
paddingBottom: 10,
}}
/>
) : (
<Image
radius={50}
alt=""
src={"/aset/avatar.png"}
height={100}
width={100}
sx={{
position: "absolute",
marginBottom: 10,
paddingBottom: 10,
}}
/>
)}
</Center>
<Center>
<ActionIcon
mr={-70}
mt={10}
variant="transparent"
bg={"gray"}
radius={50}
onClick={() => router.push("/dev/katalog/profile/upload")}
sx={{ position: "relative" }}
>
<IconCamera color="black" size={20} />
</ActionIcon>
</Center>
</Box>
{/* Username dan Nama */}
<Group position="apart">
<Flex direction={"column"} mt={"lg"}>
<Text fz={"lg"} fw={"bold"}>
{profile?.name}
</Text>
<Text fz={"xs"}>@{profile?.User?.username}</Text>
</Flex>
<ActionIcon
variant="transparent"
onClick={() => {
router.push("/dev/katalog/profile/edit");
}}
>
<IconEditCircle color={Warna.hijau_muda} size={20} />
</ActionIcon>
</Group>
{/* Info user: nomor, email dll */}
<Flex direction={"column"} pt={"lg"}>
<Grid>
<Grid.Col span={"content"}>
<IconAddressBook />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text>
{" "}
<Text>+{profile?.User.nomor}</Text>
</Text>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col span={"content"}>
<IconMail />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text>
{" "}
<Text> {profile?.email}</Text>
</Text>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col span={"content"}>
<IconHome />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text> {profile?.alamat}</Text>
</Grid.Col>
</Grid>
{(() => {
if (profile?.jenisKelamin === "Laki - laki") {
return (
<>
<Grid>
<Grid.Col span={"content"}>
<IconGenderMale />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text> {profile?.jenisKelamin}</Text>
</Grid.Col>
</Grid>
</>
);
} else {
return (
<>
<Grid>
<Grid.Col span={"content"}>
<IconGenderFemale />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text> {profile?.jenisKelamin}</Text>
</Grid.Col>
</Grid>
</>
);
}
})()}
</Flex>
{/* <pre>{JSON.stringify(profile, null, 2)}</pre> */}
</>
);
}

View File

@@ -25,7 +25,7 @@ export default function KatalogLayout({ children }: { children: any }) {
Katalog Katalog
</Text> </Text>
<Group spacing={"sm"}> <Group spacing={"sm"}>
<ActionIcon> <ActionIcon variant="transparent" onClick={() => router.push("/dev/katalog/portofolio/create")}>
<IconPencilPlus /> <IconPencilPlus />
</ActionIcon> </ActionIcon>
{/* <Logout /> */} {/* <Logout /> */}

View File

@@ -25,169 +25,21 @@ import {
} from "@tabler/icons-react"; } from "@tabler/icons-react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { getProfile } from "../profile"; import { ProfileView, getProfile } from "../profile";
import { gs_profile } from "../profile/state/global_state"; import { gs_profile } from "../profile/state/global_state";
import { myConsole } from "@/app/fun/my_console"; import { myConsole } from "@/app/fun/my_console";
import { useAtom } from "jotai"; import { useAtom } from "jotai";
import { loadDataProfile } from "../profile/fun/fun_get_profile"; import { loadDataProfile } from "../profile/fun/fun_get_profile";
import { getFotoProfile } from "../profile/api/get-foto-profile"; import { getFotoProfile } from "../profile/api/get-foto-profile";
import { ApiHipmi } from "@/app/lib/api"; import { ApiHipmi } from "@/app/lib/api";
import { PortofolioView } from "../portofolio";
export default function KatalogView({data}: {data: any}) { export default function KatalogView({ data, porto }: { data: any, porto: any }) {
const router = useRouter();
//Get data profile
const [profile, setProfile] = useState(data)
useShallowEffect(() => {
loadDataProfile(setProfile);
}, []);
const [foto, setFoto] = useState<any | null>(null);
useShallowEffect(() => {
if (profile?.imagesId === undefined || profile?.imagesId === null) {
myConsole("Waiting data");
} else {
getFotoProfile(profile.imagesId).then((res) => setFoto(res?.url));
}
myConsole(profile?.imagesId);
}, [profile?.imagesId]);
return ( return (
<> <>
{/* Background dan foto */}
<Box> <ProfileView data={data} />
<Paper bg={"gray"} p={"md"}> <PortofolioView profileId={data.id} porto={porto}/>
<Image alt="" src={"/aset/logo.png"} />
</Paper>
<Center>
{foto ? (
<Image
radius={50}
alt=""
src={ApiHipmi.get_foto + `${foto}`}
height={100}
width={100}
sx={{
position: "absolute",
marginBottom: 10,
paddingBottom: 10,
}}
/>
) : (
<Image
radius={50}
alt=""
src={"/aset/avatar.png"}
height={100}
width={100}
sx={{
position: "absolute",
marginBottom: 10,
paddingBottom: 10,
}}
/>
)}
</Center>
<Center>
<ActionIcon
mr={-70}
mt={10}
variant="transparent"
bg={"gray"}
radius={50}
onClick={() => router.push("/dev/katalog/profile/upload")}
sx={{ position: "relative" }}
>
<IconCamera color="black" size={20} />
</ActionIcon>
</Center>
</Box>
{/* Username dan Nama */}
<Group position="apart">
<Flex direction={"column"} mt={"lg"}>
<Text fz={"lg"} fw={"bold"}>
{profile?.name}
</Text>
<Text fz={"xs"}>@{profile?.User?.username}</Text>
</Flex>
<ActionIcon
variant="transparent"
onClick={() => {
router.push("/dev/katalog/profile/edit");
}}
>
<IconEditCircle color={Warna.hijau_muda} size={20} />
</ActionIcon>
</Group>
{/* Info user: nomor, email dll */}
<Flex direction={"column"} pt={"lg"}>
<Grid>
<Grid.Col span={"content"}>
<IconAddressBook />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text>
{" "}
<Text>+{profile?.User.nomor}</Text>
</Text>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col span={"content"}>
<IconMail />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text>
{" "}
<Text> {profile?.email}</Text>
</Text>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col span={"content"}>
<IconHome />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text> {profile?.alamat}</Text>
</Grid.Col>
</Grid>
{(() => {
if (profile?.jenisKelamin === "Laki - laki") {
return (
<>
<Grid>
<Grid.Col span={"content"}>
<IconGenderMale />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text> {profile?.jenisKelamin}</Text>
</Grid.Col>
</Grid>
</>
);
} else {
return (
<>
<Grid>
<Grid.Col span={"content"}>
<IconGenderFemale />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text> {profile?.jenisKelamin}</Text>
</Grid.Col>
</Grid>
</>
);
}
})()}
</Flex>
{/* <pre>{JSON.stringify(profile, null, 2)}</pre> */}
</> </>
); );
} }