<>
{Array.isArray(data) && data.length > 0 ? (
= ({
) : (
-
+
No Data
{local.filtering && (
@@ -983,8 +961,8 @@ export const TableList: FC
= ({
)}
>
- )}
-
+
+ )}
);
} else {
diff --git a/comps/md/parts/MDHeader.tsx b/comps/md/parts/MDHeader.tsx
index 7926fd1..7c46d31 100755
--- a/comps/md/parts/MDHeader.tsx
+++ b/comps/md/parts/MDHeader.tsx
@@ -1,20 +1,51 @@
-import { FC, useState } from "react";
+import { FC, ReactNode, useEffect, useState } from "react";
import { breadcrumbPrefix } from "../utils/md-hash";
import { MDLocal, MDRef } from "../utils/typings";
+import { BreadItem } from "lib/comps/custom/Breadcrumb";
+import { useLocal } from "lib/utils/use-local";
export const MDHeader: FC<{ md: MDLocal; mdr: MDRef }> = ({ md, mdr }) => {
- const [_, set] = useState({});
+ const local = useLocal({ breads_length: 0 });
const head = mdr.item.edit.props?.header.value;
const PassProp = mdr.PassProp;
- md.header.render = () => set({});
+ md.header.render = local.render;
const prefix = breadcrumbPrefix(md);
+ let breads: (BreadItem & { url: string })[] = [];
if (md.selected && md.header.child.breadcrumb) {
- md.header.breadcrumb = [...prefix, ...md.header.child.breadcrumb()];
+ breads = [...prefix, ...md.header.child.breadcrumb()] as any;
} else if (!md.selected && md.header.master.breadcrumb) {
- md.header.breadcrumb = [...prefix, ...md.header.master.breadcrumb()];
+ breads = [...prefix, ...md.header.master.breadcrumb()] as any;
}
+ md.header.breadcrumb = [];
+ let overrideLabel = "" as ReactNode;
+ for (const v of breads) {
+ if (v.label === "--reset--") {
+ md.header.breadcrumb = [];
+ overrideLabel = "";
+ continue;
+ }
+
+ if (v.url === "--override--") {
+ overrideLabel = v.label;
+ continue;
+ }
+
+ if (overrideLabel) {
+ v.label = overrideLabel;
+ overrideLabel = "";
+ }
+ md.header.breadcrumb.push(v);
+ }
+
+ useEffect(() => {
+ if (local.breads_length !== md.header.breadcrumb.length) {
+ local.breads_length = md.header.breadcrumb.length;
+ if (!md.selected && md.master.reload) md.master.reload();
+ }
+ }, [md.header.breadcrumb.length]);
+
if (md.internal.reset_detail) return null;
return
{head};
};
diff --git a/comps/md/utils/md-hash.ts b/comps/md/utils/md-hash.ts
index fa2f525..518b36c 100755
--- a/comps/md/utils/md-hash.ts
+++ b/comps/md/utils/md-hash.ts
@@ -81,7 +81,7 @@ export const masterDetailApplyParams = (md: MDLocal) => {
};
export const breadcrumbPrefix = (md: MDLocal) => {
- const prefix: BreadItem[] = [];
+ let prefix: (BreadItem & { url: string })[] = [];
if (md.params.links && md.params.links.length > 0) {
const hashes: string[] = [];
for (const link of md.params.links) {
@@ -93,6 +93,7 @@ export const breadcrumbPrefix = (md: MDLocal) => {
for (const p of link.prefix) {
prefix.push({
label: p.label,
+ url: p.url || link.url,
onClick(ev) {
let url = "";
@@ -103,7 +104,7 @@ export const breadcrumbPrefix = (md: MDLocal) => {
if (p.md) {
url = `${p.url || link.url}#${p.md.name}=${p.md.value}${lnk}`;
} else {
- url = `${p.url || link.url}${lnk}`;
+ url = `${p.url || link.url}${lnk}`;
}
if (url) {
diff --git a/comps/ui/toast.tsx b/comps/ui/toast.tsx
index 8ee32a6..33e1d12 100755
--- a/comps/ui/toast.tsx
+++ b/comps/ui/toast.tsx
@@ -12,6 +12,7 @@ export const toast = {
sonner.dismiss();
} else {
clearTimeout(timer.timeout);
+ timer.timeout = null;
}
},
loading: (
@@ -41,6 +42,8 @@ export const toast = {
clearTimeout(timer.timeout);
timer.timeout = setTimeout(() => {
sonner.error(el, props);
+ clearTimeout(timer.timeout);
+
timer.timeout = null;
}, timer.limit);
},
diff --git a/exports.tsx b/exports.tsx
index 1fe162b..ebcadf2 100755
--- a/exports.tsx
+++ b/exports.tsx
@@ -26,6 +26,10 @@ export const Typeahead = lazify(
async () => (await import("@/comps/ui/typeahead")).Typeahead
);
+export const ImgThumb = lazify(
+ async () => (await import("@/comps/form/field/type/FilePreview")).ImgThumb
+);
+
/** Master - Detail - List - Form */
export const MasterDetail = lazify(
async () => (await import("@/comps/md/MasterDetail")).MasterDetail