fix:article create button mobile, user table search

This commit is contained in:
Rama Priyanto 2025-05-27 15:19:51 +07:00
commit 59fc8a248b
5 changed files with 100 additions and 7 deletions

View File

@ -856,7 +856,7 @@ export default function CreateArticleForm() {
</div> */}
</div>
<div className="flex flex-row justify-end gap-3">
<div className="flex flex-row justify-end gap-3 mb-10">
<Button
color="primary"
type="submit"

View File

@ -916,7 +916,7 @@ export default function EditArticleForm(props: { isDetail: boolean }) {
)}
</div>
<div className="flex flex-row justify-end gap-3">
<div className="flex flex-row justify-end gap-3 mb-10">
{isDetail &&
username === "admin-mabes" &&
(detailData?.statusId === 1 || detailData?.statusId === null) && (

View File

@ -68,7 +68,7 @@ export default function Login() {
if (!username || !password) {
error("Username & Password Wajib Diisi !");
} else {
loading();
// login dengan otp
const response = await emailValidation(data);
if (response?.error) {
error("Username / Password Tidak Sesuai");
@ -82,6 +82,7 @@ export default function Login() {
setNeedOtp(true);
}
// login tanpa otp
// loading();
// const response = await postSignIn(data);
// if (response?.error) {
@ -154,7 +155,6 @@ export default function Login() {
// close();
// }
}
// }
};
const checkUsername = async () => {

View File

@ -4,12 +4,14 @@ import {
DeleteIcon,
DotsYIcon,
EyeIconMdi,
SearchIcon,
} from "@/components/icons";
import { error, success } from "@/config/swal";
import { deleteArticle, getListArticle } from "@/services/article";
import { deleteMasterUser, listMasterUsers } from "@/services/master-user";
import { Article, MasterUser } from "@/types/globals";
import { Button } from "@heroui/button";
import { Input } from "@heroui/input";
import {
Chip,
ChipProps,
@ -18,6 +20,8 @@ import {
DropdownMenu,
DropdownTrigger,
Pagination,
Select,
SelectItem,
Spinner,
Table,
TableBody,
@ -48,13 +52,22 @@ export default function MasterUserTable() {
const [user, setUser] = useState<MasterUser[]>([]);
const [page, setPage] = useState(1);
const [totalPage, setTotalPage] = useState(1);
const [showData, setShowData] = useState("10");
const [search, setSearch] = useState("");
const [searchType, setSearchType] = useState("username");
useEffect(() => {
initState();
}, [page]);
}, [page, showData]);
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);
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 (
<>
<div className="mx-3 my-5">
<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
// selectionMode="multiple"
aria-label="micro issue table"

View File

@ -15,7 +15,12 @@ export async function listMasterUsers(data: any) {
const headers = {
"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) {