This commit is contained in:
rizky 2024-08-20 04:24:53 -07:00
parent fcb73aaf43
commit 0db91b568f
7 changed files with 82 additions and 4 deletions

View File

@ -155,7 +155,8 @@ export const formInit = (fm: FMLocal, props: FMProps) => {
<> <>
<Loader2 className="c-h-4 c-w-4 c-animate-spin" /> <Loader2 className="c-h-4 c-w-4 c-animate-spin" />
Loading data... Loading data...
</> </>,
{ dismissible: true }
); );
} }

View File

@ -776,7 +776,8 @@ export const TableList: FC<TableListProp> = ({
<> <>
<Loader2 className="c-h-4 c-w-4 c-animate-spin" /> <Loader2 className="c-h-4 c-w-4 c-animate-spin" />
Loading Data ... Loading Data ...
</> </>,
{ dismissible: true }
); );
} else { } else {
toast.dismiss(); toast.dismiss();

54
comps/popup/NavLink.tsx Executable file
View File

@ -0,0 +1,54 @@
import { Spinner } from "lib/comps/ui/field-loading";
import { useLocal } from "lib/utils/use-local";
import { FC, HTMLProps } from "react";
navigate;
export const NavLink: FC<
HTMLProps<HTMLAnchorElement> & {
params?: {
name?: string;
where?: any;
create?: any;
update?: any;
breads?: { label: string; url?: string }[];
};
}
> = (props) => {
const local = useLocal({ loading: false });
let href = props.href || "";
if (href.startsWith("/")) {
href = baseurl(href);
}
return (
<a
{...props}
href={href}
onClick={async (e) => {
if (isEditor) {
e.stopPropagation();
e.preventDefault();
return;
}
if (props.href?.startsWith(`/`)) {
e.stopPropagation();
e.preventDefault();
if (props.params) {
local.loading = true;
local.render();
navigate(props.href, props.params);
setTimeout(() => {
local.loading = false;
}, 3000);
} else {
navigate(props.href);
}
}
}}
>
{local.loading ? <Spinner /> : props.children}
</a>
);
};

View File

@ -1,5 +1,4 @@
import { Skeleton } from "@/comps/ui/skeleton"; import { Skeleton } from "@/comps/ui/skeleton";
import { cn } from "lib/utils";
import { Loader2 } from "lucide-react"; import { Loader2 } from "lucide-react";
import { FC } from "react"; import { FC } from "react";

View File

@ -1,5 +1,6 @@
import { ReactElement } from "react"; import { ReactElement } from "react";
import { toast as sonner } from "sonner"; import { createPortal } from "react-dom";
import { toast as sonner, Toaster as SonnerToaster } from "sonner";
const timer = { const timer = {
timeout: null as any, timeout: null as any,
done: false, done: false,
@ -49,3 +50,22 @@ export const toast = {
}, timer.limit); }, timer.limit);
}, },
}; };
export const Toaster = () => {
if (document.getElementsByClassName("prasi-toaster").length === 0) {
const elemDiv = document.createElement("div");
elemDiv.className = "prasi-toaster";
document.body.appendChild(elemDiv);
}
const toaster_el = document.getElementsByClassName("prasi-toaster")[0];
return (
<>
{toaster_el &&
createPortal(
<SonnerToaster position={toast.position} cn={cx} />,
toaster_el
)}
</>
);
};

View File

@ -106,6 +106,8 @@ export { prasi_gen } from "./gen/prasi_gen";
export { guessLabel } from "./utils/guess-label"; export { guessLabel } from "./utils/guess-label";
import __get from "lodash.get"; import __get from "lodash.get";
import { sum } from "./utils/sum"; import { sum } from "./utils/sum";
export { toast, Toaster } from "./comps/ui/toast";
export { NavLink } from "./comps/popup/NavLink";
export { kvToJSON } from "./utils/kv-to-json"; export { kvToJSON } from "./utils/kv-to-json";
export { overrideNav } from "./utils/override-nav"; export { overrideNav } from "./utils/override-nav";

View File

@ -1,6 +1,7 @@
export const baseurl = (url: string) => { export const baseurl = (url: string) => {
if (location.hostname === "prasi.avolut.com") { if (location.hostname === "prasi.avolut.com") {
const id_site = location.pathname.split("/")[2]; const id_site = location.pathname.split("/")[2];
if (url.startsWith("/")) return `/prod/${id_site}${url}`; if (url.startsWith("/")) return `/prod/${id_site}${url}`;
else return `/prod/${id_site}/${url}`; else return `/prod/${id_site}/${url}`;
} }