laif-ds
Version:
Design System di Laif con componenti React basati su principi di Atomic Design
272 lines (271 loc) • 8.84 kB
JavaScript
"use client";
import { getListMultiSelectFilterOptions as v, getListSingleSelectFilterOptions as D, getDateTimeFilterOptions as b, getDateFilterOptions as A, getBooleanFilterOptions as F, getNumberFilterOptions as k, getStringFilterOptions as x } from "./data-table-constants.js";
import { defaultDataTableI18n as d } from "./data-table-i18n.js";
function C(e, a = "string") {
const t = (s) => {
switch (s) {
case "string":
return x(d)?.[0]?.value ?? "like";
case "number":
return k(d)?.[0]?.value ?? "eq";
case "boolean":
return F(d)?.[0]?.value ?? "eq";
case "date":
return A(d)?.[0]?.value ?? "eq";
case "datetime":
return b(d)?.[0]?.value ?? "date_time_before";
case "list_single_select":
return D(d)?.[0]?.value ?? "array_overlap";
case "list_multi_select":
return v(d)?.[0]?.value ?? "array_overlap";
default:
return "eq";
}
};
return {
id: crypto.randomUUID(),
columnId: e?.id || "",
columnLabel: e?.column.columnDef.meta?.headerLabel || (typeof e?.column.columnDef.header == "string" ? e.column.columnDef.header : "") || e?.id || "",
columnAccessorKey: (e?.column.columnDef && "accessorKey" in e.column.columnDef && typeof e.column.columnDef.accessorKey == "string" ? e.column.columnDef.accessorKey : e?.id) || "",
columnType: e?.column.columnDef.meta?.type || a,
operator: t(
e?.column.columnDef.meta?.type
),
listOptions: e?.column.columnDef.meta?.listOptions
};
}
function L() {
const e = () => crypto.randomUUID();
return {
id: e(),
rootGroup: {
id: e(),
logicalOperator: "AND",
conditions: [
{
id: e(),
columnId: "",
columnAccessorKey: "",
columnLabel: "",
columnType: "string",
operator: "eq",
value: void 0
}
],
groups: []
}
};
}
function I(e, a) {
const t = e.filter((n) => n.operator === "eq_null" || n.operator === "n_eq_null" || n.operator === "checked" || n.operator === "unchecked" ? !0 : n.value === void 0 || n.value === "" ? !1 : n.columnType === "list_multi_select" ? (Array.isArray(n.value) ? n.value.filter((i) => i !== void 0) : [n.value].filter((i) => i !== void 0)).length > 0 : !0), o = a ? ((n) => {
const p = (i) => {
const g = i.conditions.filter((u) => !u.columnId || !u.operator ? !1 : u.operator === "eq_null" || u.operator === "n_eq_null" || u.operator === "checked" || u.operator === "unchecked" ? !0 : u.value === void 0 ? !1 : u.columnType === "list_multi_select" ? (Array.isArray(u.value) ? u.value.filter((_) => _ !== void 0) : [u.value].filter((_) => _ !== void 0)).length > 0 : !0).map((u) => ({
[u.columnAccessorKey]: {
operator: u.operator,
value: u.operator === "eq_null" || u.operator === "n_eq_null" || u.operator === "checked" || u.operator === "unchecked" ? !0 : u.columnType === "list_single_select" ? Array.isArray(u.value) ? u.value.filter((f) => f !== void 0) : [u.value].filter((f) => f !== void 0) : u.value
}
})), y = i.groups?.map(p).filter(Boolean) || [], m = [
...g,
...y
];
return m.length === 0 ? null : m.length === 1 ? m[0] : i.logicalOperator === "AND" ? { _and: m } : { _or: m };
};
return p(n.rootGroup);
})(a) : null, c = t.map(
(n) => ({
[n.columnAccessorKey]: {
operator: n.operator,
value: n.operator === "eq_null" || n.operator === "n_eq_null" || n.operator === "checked" || n.operator === "unchecked" ? !0 : n.columnType === "list_single_select" ? Array.isArray(n.value) ? n.value.filter((p) => p !== void 0) : [n.value].filter((p) => p !== void 0) : n.value ?? ""
}
})
), r = [
...o ? [o] : [],
...c
];
return r.length > 0 ? r.length === 1 ? r[0] : { _and: r } : {};
}
function O(e, a) {
const {
rowHeight: t = 1,
headerHeight: s = 1,
containerHeight: o = 1,
onPageChange: c,
setPagination: r
} = a, l = e?.offsetHeight || o, n = Math.floor(
(l - s) / t
), p = n > 1 ? n : 1;
r((i) => {
if (i.pageSize !== p) {
if (c) {
const g = Math.max(
0,
Math.ceil(i.pageSize * (i.pageIndex + 1) / p) - 1
), y = Math.min(i.pageIndex, g);
c(y, p);
}
return { ...i, pageSize: p };
}
return i;
});
}
function T(e, a, t) {
if (e == null)
switch (a) {
case "eq_null":
return !0;
case "n_eq_null":
return !1;
default:
return !1;
}
const s = (r) => r == null || typeof r == "string" ? r : String(r), o = s(e), c = s(t);
switch (a) {
case "eq":
return o === c;
case "ne":
return o !== c;
case "lt":
return typeof e == "number" && typeof t == "number" ? e < t : o < c;
case "le":
return typeof e == "number" && typeof t == "number" ? e <= t : o <= c;
case "gt":
return typeof e == "number" && typeof t == "number" ? e > t : o > c;
case "ge":
return typeof e == "number" && typeof t == "number" ? e >= t : o >= c;
case "like":
return o?.toLowerCase().includes(c?.toLowerCase());
case "n_like":
return !o?.toLowerCase().includes(c?.toLowerCase());
case "starts_with":
return o?.toLowerCase().startsWith(c?.toLowerCase());
case "ends_with":
return o?.toLowerCase().endsWith(c?.toLowerCase());
case "eq_null":
return e == null || e === "";
case "n_eq_null":
return e != null && e !== "";
case "array_overlap":
return Array.isArray(e) && Array.isArray(t) ? t.length === 0 ? !0 : e.length === 0 ? !1 : t.some(
(r) => e.some(
(l) => s(l) === s(r)
)
) : !1;
case "n_array_overlap":
return Array.isArray(e) && Array.isArray(t) ? t.length === 0 || e.length === 0 ? !0 : !t.some(
(r) => e.some(
(l) => s(l) === s(r)
)
) : !0;
case "checked":
return e === !0;
case "unchecked":
return e === !1;
case "date_before":
try {
const r = new Date(e), l = new Date(t);
return r.setHours(0, 0, 0, 0), l.setHours(0, 0, 0, 0), r < l;
} catch {
return !1;
}
case "date_after":
try {
const r = new Date(e), l = new Date(t);
return r.setHours(0, 0, 0, 0), l.setHours(0, 0, 0, 0), r > l;
} catch {
return !1;
}
case "date_time_before":
try {
const r = new Date(e), l = new Date(t);
return r < l;
} catch {
return !1;
}
case "date_time_after":
try {
const r = new Date(e), l = new Date(t);
return r > l;
} catch {
return !1;
}
default:
return console.warn(`Unknown filter operator: ${a}`), !0;
}
}
function h(e, a) {
if (!a || Object.keys(a).length === 0)
return !0;
if ("_and" in a && Array.isArray(a._and))
return a._and.every(
(t) => h(e, t)
);
if ("_or" in a && Array.isArray(a._or))
return a._or.some(
(t) => h(e, t)
);
for (const [t, s] of Object.entries(a))
if (!t.startsWith("_") && typeof s == "object" && s !== null && "operator" in s) {
const o = e.getValue(t);
if (!T(
o,
s.operator,
s.value
)) return !1;
}
return !0;
}
function z(e, a) {
let t;
return function(...s) {
clearTimeout(t), t = setTimeout(() => {
e(...s);
}, a);
};
}
function H(e) {
switch (e) {
case "string":
return "CaseUpper";
case "number":
return "Binary";
case "boolean":
return "ToggleRight";
case "date":
return "Calendar1";
case "datetime":
return "CalendarClock";
case "list_single_select":
return "List";
case "list_multi_select":
return "ListTodo";
case "other":
return "FileQuestionMark";
default:
return "FileQuestionMark";
}
}
function K(e, a, t, s) {
const o = a[e];
if (!o || !t || o.side !== t) return;
const c = o.side === "left" ? `${o.offset}px` : void 0, r = o.side === "right" ? `${o.offset}px` : void 0;
return {
position: "sticky",
left: c,
right: r,
zIndex: s ? 49 : 48,
background: "var(--d-background)",
// Use separate shadow for pinned columns to avoid conflicts
boxShadow: t === "left" ? `inset -1px ${s ? "0" : "-1px"} 0 var(--d-border), 2px 0 4px -2px rgba(0,0,0,0.1)` : `inset 1px ${s ? "0" : "-1px"} 0 var(--d-border), -2px 0 4px -2px rgba(0,0,0,0.1)`
};
}
export {
T as applyClientSideFilter,
h as applySearchFilterToRow,
I as buildSearchFilter,
C as createBadgeFilterFromHeader,
L as createDefaultAdvancedFilter,
z as debounce,
H as getIconFromColumnType,
K as getPinnedStyle,
O as updatePageSizeFromContainer
};