diff --git a/src/app/api/division/route.ts b/src/app/api/division/route.ts
index f52e24d..cc52a2d 100644
--- a/src/app/api/division/route.ts
+++ b/src/app/api/division/route.ts
@@ -127,7 +127,7 @@ export async function POST(request: Request) {
const dataMember = sent.member.map((v: any) => ({
- ..._.omit(v, ["idUser", "name"]),
+ ..._.omit(v, ["idUser", "name", "img"]),
idUser: v.idUser,
idDivision: data.id,
isAdmin: sent.admin.some((i: any) => i == v.idUser)
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 5f1665c..fe6ab8c 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -30,12 +30,14 @@ export default function RootLayout({
return (
+
diff --git a/src/module/_global/index.ts b/src/module/_global/index.ts
index bde645d..fc422a0 100644
--- a/src/module/_global/index.ts
+++ b/src/module/_global/index.ts
@@ -14,6 +14,7 @@ import LayoutLogin from "./layout/layout_login";
import LayoutModalViewFile from "./layout/layout_modal_view_file";
import LayoutNavbarHome from "./layout/layout_navbar_home";
import LayoutNavbarNew from "./layout/layout_navbar_new";
+import NoZoom from "./layout/no_zoom";
import ViewFilter from "./view/view_filter";
export { WARNA };
@@ -34,3 +35,4 @@ export { SkeletonDetailListTugasTask }
export { LayoutModalViewFile }
export { globalRole }
export { WrapLayout }
+export { NoZoom }
diff --git a/src/module/_global/layout/layout_modal_view_file.tsx b/src/module/_global/layout/layout_modal_view_file.tsx
index 0462b15..a895d3c 100644
--- a/src/module/_global/layout/layout_modal_view_file.tsx
+++ b/src/module/_global/layout/layout_modal_view_file.tsx
@@ -1,12 +1,22 @@
'use client'
-import { Image, Modal } from '@mantine/core';
+import { Box, Button, Flex, Image, Modal, rem } from '@mantine/core';
import dynamic from 'next/dynamic';
import React, { useState } from 'react';
const PdfToImage = dynamic(() => import('./../components/pdf_viewer').then((mod) => mod.default), { ssr: false });
export default function LayoutModal({ opened, onClose, extension, fitur, file }: { opened: boolean, onClose: () => void, extension: string, fitur: string, file: string }) {
const [isValModal, setValModal] = useState(opened)
+ const [zoom, setZoom] = useState(1)
const filePdf = '/file/' + fitur + '/' + file
+
+ const handleZoomIn = () => {
+ setZoom(zoom + 0.1)
+ }
+
+ const handleZoomOut = () => {
+ setZoom(zoom - 0.1)
+ }
+
return (
+ :
-
- }
+ style={{
+ background: 'white',
+ zIndex: 999,
+ }}
+ >
+
+
+
+
+
+
+
+ {
+ extension === 'pdf' ?
:
+
+ }
+
+
);
}
diff --git a/src/module/_global/layout/no_zoom.tsx b/src/module/_global/layout/no_zoom.tsx
new file mode 100644
index 0000000..88fcfd3
--- /dev/null
+++ b/src/module/_global/layout/no_zoom.tsx
@@ -0,0 +1,10 @@
+// components/NoZoom.js
+import Head from 'next/head';
+
+export default function NoZoom() {
+ return (
+
+
+
+ );
+}
diff --git a/src/module/auth/varification/view/view_verification.tsx b/src/module/auth/varification/view/view_verification.tsx
index dea2ef2..374c099 100644
--- a/src/module/auth/varification/view/view_verification.tsx
+++ b/src/module/auth/varification/view/view_verification.tsx
@@ -74,6 +74,7 @@ JANGAN BERIKAN KODE RAHASIA ini kepada siapa pun TERMASUK PIHAK DARMASABA. Masuk
{
if (val) {
member.set([])
- setBody({
- ...body,
- idGroup: "",
- name: "",
- desc: "",
- })
+ // setBody({
+ // ...body,
+ // idGroup: "",
+ // name: "",
+ // desc: "",
+ // })
}
setChooseAdmin(false)
@@ -187,24 +189,32 @@ export default function CreateDivision() {
Belum ada anggota
) : member.get().map((v: any, i: any) => {
return (
-
-
-
-
-
- {v.name}
+
+
+
+
+
+
+
+ {v.name}
+
+
+
+
+
+
+ Anggota
-
-
-
- Anggota
-
-
+
+
+
+
+
+
);
})}
diff --git a/src/module/division_new/ui/feature_detail_division.tsx b/src/module/division_new/ui/feature_detail_division.tsx
index 18a90da..73be8d6 100644
--- a/src/module/division_new/ui/feature_detail_division.tsx
+++ b/src/module/division_new/ui/feature_detail_division.tsx
@@ -53,7 +53,7 @@ export default function FeatureDetailDivision() {
border: `1px solid ${WARNA.bgHijauMuda}`,
borderRadius: 10,
padding: 10
- }} onClick={() => router.push(param.id + '/task')}>
+ }} onClick={() => router.push(param.id + '/task?status=0')}>
- router.push(`/document`)}>
+ router.push(`/division/${param.id}/document`)}>
diff --git a/src/module/division_new/ui/navbar_admin_division.tsx b/src/module/division_new/ui/navbar_admin_division.tsx
index 345fe11..8395788 100644
--- a/src/module/division_new/ui/navbar_admin_division.tsx
+++ b/src/module/division_new/ui/navbar_admin_division.tsx
@@ -1,10 +1,10 @@
"use client"
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 { ActionIcon, Avatar, Box, Button, Checkbox, Divider, Flex, Grid, Group, rem, Stack, Text, TextInput } from '@mantine/core';
import { useRouter } from 'next/navigation';
import React, { useState } from 'react';
-import { HiMagnifyingGlass } from 'react-icons/hi2';
+import { HiChevronLeft, HiMagnifyingGlass } from 'react-icons/hi2';
import toast from 'react-hot-toast';
import { globalMemberDivision } from '../lib/val_division';
import { funCreateDivision } from '../lib/api_division';
@@ -26,6 +26,7 @@ export default function NavbarAdminDivision({ data, onSuccess }: { data: any, on
if (response.success) {
toast.success(response.message);
+ router.push("/division")
onSuccess(true)
} else {
toast.error(response.message)
@@ -41,7 +42,10 @@ export default function NavbarAdminDivision({ data, onSuccess }: { data: any, on
return (
-
+
+
+ } />
{
return (
-
-
-
-
-
- {v.name}
-
-
-
-
-
-
+
+
+
+
+
+ {v.name}
+
+
+
+
+
+
+
+
+
+
+
+
+
);
})
}
-
-
-
+
+
+
);
diff --git a/src/module/division_new/ui/navbar_create_users.tsx b/src/module/division_new/ui/navbar_create_users.tsx
index 550105d..67ff24a 100644
--- a/src/module/division_new/ui/navbar_create_users.tsx
+++ b/src/module/division_new/ui/navbar_create_users.tsx
@@ -1,15 +1,18 @@
"use client"
-import { LayoutNavbarNew, WARNA } from '@/module/_global';
+import { LayoutNavbarNew, SkeletonSingle, WARNA } from '@/module/_global';
import { useHookstate } from '@hookstate/core';
-import { Avatar, Box, Button, Center, Input, rem, SimpleGrid, Skeleton, Stack, Text, TextInput } from '@mantine/core';
+import { ActionIcon, Avatar, Box, Button, Center, Divider, Flex, Grid, Indicator, Input, rem, SimpleGrid, Skeleton, 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 { HiChevronLeft, HiMagnifyingGlass } from 'react-icons/hi2';
import { funGetAllmember, TypeUser } from '@/module/user';
import { funGetUserByCookies } from '@/module/auth';
import toast from 'react-hot-toast';
import { globalMemberDivision } from '../lib/val_division';
+import { IoArrowBackOutline, IoClose } from 'react-icons/io5';
+import { Carousel } from '@mantine/carousel';
+import { FaCheck } from 'react-icons/fa6';
export default function NavbarCreateUsers({ grup, onClose }: { grup?: string, onClose: (val: any) => void }) {
@@ -18,12 +21,13 @@ export default function NavbarCreateUsers({ grup, onClose }: { grup?: string, on
const [selectedFiles, setSelectedFiles] = useState([]);
const [dataMember, setDataMember] = useState([])
const [loading, setLoading] = useState(true)
+ const [onClickSearch, setOnClickSearch] = useState(false)
const handleFileClick = (index: number) => {
if (selectedFiles.some((i: any) => i.idUser == dataMember[index].id)) {
setSelectedFiles(selectedFiles.filter((i: any) => i.idUser != dataMember[index].id))
} else {
- setSelectedFiles([...selectedFiles, { idUser: dataMember[index].id, name: dataMember[index].name }])
+ setSelectedFiles([...selectedFiles, { idUser: dataMember[index].id, name: dataMember[index].name, img: dataMember[index].img }])
}
};
@@ -59,72 +63,147 @@ export default function NavbarCreateUsers({ grup, onClose }: { grup?: string, on
loadData("")
}, []);
+ const handleSearchClick = () => {
+ setOnClickSearch(true);
+ };
+
+ const handleClose = () => {
+ setOnClickSearch(false);
+ };
+
+ function handleXMember(id: number) {
+ setSelectedFiles(selectedFiles.filter((i: any) => i.idUser != id))
+ }
+
return (
-
+
+ { onClose(true) }} bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Settings">
+
+
+
+ } title="Pilih Anggota"
+ menu={
+
+ } />
+ {/* SEARCH */}
+ {onClickSearch
+ ? (
+
+
+
+
+
+
+
+
+ loadData(e.target.value)}
+ />
+
+
+
+ )
+ : null
+ }
+ {/* Close User */}
+
+ {selectedFiles.length > 0 ? (
+
+ {selectedFiles.map((v: any, i: any) => {
+ return (
+
+ { handleXMember(v.idUser) }}
+ >
+
+ }>
+
+
+
+ {v.name}
+
+
+ )
+ })}
+
+ ) : (
+
+
+ Tidak ada anggota yang dipilih
+
+
+ )}
+
- }
- placeholder="Pencarian"
- onChange={(e) => loadData(e.target.value)}
- />
-
+
{loading ?
-
- {Array(6)
- .fill(null)
- .map((_, i) => (
-
-
+ Array(6)
+ .fill(null)
+ .map((_, i) => (
+
+
+
+ ))
+ : dataMember.map((v, index) => {
+ const isSelected = selectedFiles.some((i: any) => i.idUser == dataMember[index].id);
+ return (
+ handleFileClick(index)}>
+
+
+
+
+
+
+
+ {v.name}
+
+ {isSelected ? : null}
+
+
+
+
+
- ))}
-
- :
-
-
- {dataMember.map((v, index) => {
- const isSelected = selectedFiles.some((i: any) => i.idUser == dataMember[index].id);
- return (
-
- handleFileClick(index)}
- >
-
-
-
-
- {v.name}
-
-
-
- );
- })}
-
-
+
+ );
+ })
}
diff --git a/src/module/home/ui/features.tsx b/src/module/home/ui/features.tsx
index 5e04cf7..8a489d5 100644
--- a/src/module/home/ui/features.tsx
+++ b/src/module/home/ui/features.tsx
@@ -28,7 +28,7 @@ export default function Features() {
Divisi
- router.push('/project')}>
+ router.push('/project?status=0&group=null')}>
Divisi
- router.push('/project')}>
+ router.push('/project?status=0&group=null')}>
},
{
id: "1",
- title: "Segera",
+ title: "Dikerjakan",
icon:
},
{
id: "2",
- title: "Dikerjakan",
+ title: "Selesai",
icon:
},
{
id: "3",
- title: "Selesai",
+ title: "Batal",
icon:
}
]
diff --git a/src/module/task/ui/tabs_division_task.tsx b/src/module/task/ui/tabs_division_task.tsx
index ac2151c..1519ae6 100644
--- a/src/module/task/ui/tabs_division_task.tsx
+++ b/src/module/task/ui/tabs_division_task.tsx
@@ -1,11 +1,13 @@
'use client'
-import { Box, rem, Tabs } from "@mantine/core";
+import { Box, Button, rem, Tabs } from "@mantine/core";
import { IoIosCheckmarkCircleOutline } from "react-icons/io";
import { IoCloseCircleOutline } from "react-icons/io5";
import { RiProgress3Line } from "react-icons/ri";
import { TbClockPause } from "react-icons/tb";
import ListDivisionTask from "./list_division_task";
import { useRouter, useSearchParams } from "next/navigation";
+import { Carousel } from "@mantine/carousel";
+import { WARNA } from "@/module/_global";
export default function TabsDivisionTask() {
const iconStyle = { width: rem(20), height: rem(20) };
@@ -13,9 +15,32 @@ export default function TabsDivisionTask() {
const searchParams = useSearchParams()
const status = searchParams.get('status')
+ const dataStatus = [
+ {
+ id: "0",
+ title: "Segera",
+ icon:
+ },
+ {
+ id: "1",
+ title: "Dikerjakan",
+ icon:
+ },
+ {
+ id: "2",
+ title: "Selesai",
+ icon:
+ },
+ {
+ id: "3",
+ title: "Batal",
+ icon:
+ }
+ ]
+
return (
-
+ {/*
-
+ */}
+
+ {dataStatus.map((item, index) => (
+
+
+
+ ))}
+
+
)
}
\ No newline at end of file