fix:article create button mobile, user table search
This commit is contained in:
commit
59fc8a248b
|
|
@ -856,7 +856,7 @@ export default function CreateArticleForm() {
|
||||||
</div> */}
|
</div> */}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-row justify-end gap-3">
|
<div className="flex flex-row justify-end gap-3 mb-10">
|
||||||
<Button
|
<Button
|
||||||
color="primary"
|
color="primary"
|
||||||
type="submit"
|
type="submit"
|
||||||
|
|
|
||||||
|
|
@ -916,7 +916,7 @@ export default function EditArticleForm(props: { isDetail: boolean }) {
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-row justify-end gap-3">
|
<div className="flex flex-row justify-end gap-3 mb-10">
|
||||||
{isDetail &&
|
{isDetail &&
|
||||||
username === "admin-mabes" &&
|
username === "admin-mabes" &&
|
||||||
(detailData?.statusId === 1 || detailData?.statusId === null) && (
|
(detailData?.statusId === 1 || detailData?.statusId === null) && (
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ export default function Login() {
|
||||||
if (!username || !password) {
|
if (!username || !password) {
|
||||||
error("Username & Password Wajib Diisi !");
|
error("Username & Password Wajib Diisi !");
|
||||||
} else {
|
} else {
|
||||||
loading();
|
// login dengan otp
|
||||||
const response = await emailValidation(data);
|
const response = await emailValidation(data);
|
||||||
if (response?.error) {
|
if (response?.error) {
|
||||||
error("Username / Password Tidak Sesuai");
|
error("Username / Password Tidak Sesuai");
|
||||||
|
|
@ -82,6 +82,7 @@ export default function Login() {
|
||||||
setNeedOtp(true);
|
setNeedOtp(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// login tanpa otp
|
||||||
// loading();
|
// loading();
|
||||||
// const response = await postSignIn(data);
|
// const response = await postSignIn(data);
|
||||||
// if (response?.error) {
|
// if (response?.error) {
|
||||||
|
|
@ -154,7 +155,6 @@ export default function Login() {
|
||||||
// close();
|
// close();
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
// }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const checkUsername = async () => {
|
const checkUsername = async () => {
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,14 @@ import {
|
||||||
DeleteIcon,
|
DeleteIcon,
|
||||||
DotsYIcon,
|
DotsYIcon,
|
||||||
EyeIconMdi,
|
EyeIconMdi,
|
||||||
|
SearchIcon,
|
||||||
} from "@/components/icons";
|
} from "@/components/icons";
|
||||||
import { error, success } from "@/config/swal";
|
import { error, success } from "@/config/swal";
|
||||||
import { deleteArticle, getListArticle } from "@/services/article";
|
import { deleteArticle, getListArticle } from "@/services/article";
|
||||||
import { deleteMasterUser, listMasterUsers } from "@/services/master-user";
|
import { deleteMasterUser, listMasterUsers } from "@/services/master-user";
|
||||||
import { Article, MasterUser } from "@/types/globals";
|
import { Article, MasterUser } from "@/types/globals";
|
||||||
import { Button } from "@heroui/button";
|
import { Button } from "@heroui/button";
|
||||||
|
import { Input } from "@heroui/input";
|
||||||
import {
|
import {
|
||||||
Chip,
|
Chip,
|
||||||
ChipProps,
|
ChipProps,
|
||||||
|
|
@ -18,6 +20,8 @@ import {
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
DropdownTrigger,
|
DropdownTrigger,
|
||||||
Pagination,
|
Pagination,
|
||||||
|
Select,
|
||||||
|
SelectItem,
|
||||||
Spinner,
|
Spinner,
|
||||||
Table,
|
Table,
|
||||||
TableBody,
|
TableBody,
|
||||||
|
|
@ -48,13 +52,22 @@ export default function MasterUserTable() {
|
||||||
const [user, setUser] = useState<MasterUser[]>([]);
|
const [user, setUser] = useState<MasterUser[]>([]);
|
||||||
const [page, setPage] = useState(1);
|
const [page, setPage] = useState(1);
|
||||||
const [totalPage, setTotalPage] = useState(1);
|
const [totalPage, setTotalPage] = useState(1);
|
||||||
|
const [showData, setShowData] = useState("10");
|
||||||
|
const [search, setSearch] = useState("");
|
||||||
|
const [searchType, setSearchType] = useState("username");
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
initState();
|
initState();
|
||||||
}, [page]);
|
}, [page, showData]);
|
||||||
|
|
||||||
async function initState() {
|
async function initState() {
|
||||||
const res = await listMasterUsers({ page: page, limit: 10 });
|
const res = await listMasterUsers({
|
||||||
|
page: page,
|
||||||
|
limit: Number(showData),
|
||||||
|
fullname: searchType === "fullname" ? search : "",
|
||||||
|
username: searchType === "username" ? search : "",
|
||||||
|
email: searchType === "email" ? search : "",
|
||||||
|
});
|
||||||
getTableNumber(10, res?.data?.data);
|
getTableNumber(10, res?.data?.data);
|
||||||
setTotalPage(res?.data?.meta?.totalPage);
|
setTotalPage(res?.data?.meta?.totalPage);
|
||||||
}
|
}
|
||||||
|
|
@ -175,10 +188,85 @@ export default function MasterUserTable() {
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
let typingTimer: NodeJS.Timeout;
|
||||||
|
const doneTypingInterval = 1500;
|
||||||
|
|
||||||
|
const handleKeyUp = () => {
|
||||||
|
clearTimeout(typingTimer);
|
||||||
|
typingTimer = setTimeout(doneTyping, doneTypingInterval);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleKeyDown = () => {
|
||||||
|
clearTimeout(typingTimer);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function doneTyping() {
|
||||||
|
initState();
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="mx-3 my-5">
|
<div className="mx-3 my-5">
|
||||||
<div className="flex flex-col items-center rounded-2xl">
|
<div className="flex flex-col items-center rounded-2xl">
|
||||||
|
<div className="flex flex-col md:flex-row gap-3 w-full mb-2">
|
||||||
|
<div className="flex flex-col gap-1 w-full lg:w-1/3">
|
||||||
|
<p className="font-semibold text-sm">Pencarian</p>
|
||||||
|
<Input
|
||||||
|
aria-label="Search"
|
||||||
|
classNames={{
|
||||||
|
inputWrapper: "bg-default-100",
|
||||||
|
input: "text-sm",
|
||||||
|
}}
|
||||||
|
labelPlacement="outside"
|
||||||
|
startContent={
|
||||||
|
<SearchIcon className="text-base text-default-400 pointer-events-none flex-shrink-0" />
|
||||||
|
}
|
||||||
|
type="text"
|
||||||
|
onChange={(e) => setSearch(e.target.value)}
|
||||||
|
onKeyUp={handleKeyUp}
|
||||||
|
onKeyDown={handleKeyDown}
|
||||||
|
endContent={
|
||||||
|
<Select
|
||||||
|
label=""
|
||||||
|
size="sm"
|
||||||
|
variant="flat"
|
||||||
|
labelPlacement="outside"
|
||||||
|
placeholder="Select"
|
||||||
|
selectedKeys={[searchType]}
|
||||||
|
className="w-[160px]"
|
||||||
|
classNames={{ trigger: "border-1" }}
|
||||||
|
onChange={(e) =>
|
||||||
|
e.target.value === "" ? "" : setSearchType(e.target.value)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<SelectItem key="username">Username</SelectItem>
|
||||||
|
<SelectItem key="fullnamme">Fullname</SelectItem>
|
||||||
|
<SelectItem key="email">Email</SelectItem>
|
||||||
|
</Select>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col gap-1 w-full lg:w-[72px]">
|
||||||
|
<p className="font-semibold text-sm">Data</p>
|
||||||
|
<Select
|
||||||
|
label=""
|
||||||
|
variant="bordered"
|
||||||
|
labelPlacement="outside"
|
||||||
|
placeholder="Select"
|
||||||
|
selectedKeys={[showData]}
|
||||||
|
className="w-full"
|
||||||
|
classNames={{ trigger: "border-1" }}
|
||||||
|
onChange={(e) =>
|
||||||
|
e.target.value === "" ? "" : setShowData(e.target.value)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<SelectItem key="5">5</SelectItem>
|
||||||
|
<SelectItem key="10">10</SelectItem>
|
||||||
|
<SelectItem key="25">25</SelectItem>
|
||||||
|
<SelectItem key="50">50</SelectItem>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<Table
|
<Table
|
||||||
// selectionMode="multiple"
|
// selectionMode="multiple"
|
||||||
aria-label="micro issue table"
|
aria-label="micro issue table"
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,12 @@ export async function listMasterUsers(data: any) {
|
||||||
const headers = {
|
const headers = {
|
||||||
"content-type": "application/json",
|
"content-type": "application/json",
|
||||||
};
|
};
|
||||||
return await httpGet(`/users?page=${data.page}&limit=${data.limit}`, headers);
|
return await httpGet(
|
||||||
|
`/users?page=${data.page}&limit=${data.limit}&username=${
|
||||||
|
data.username || ""
|
||||||
|
}&fullname=${data.fullname || ""}&email=${data.email || ""}`,
|
||||||
|
headers
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function createMasterUser(data: any) {
|
export async function createMasterUser(data: any) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue