From cceee5ca0b9e128b576dab396a00ca32bf550c53 Mon Sep 17 00:00:00 2001 From: a-elkhiraooui-ciscode Date: Thu, 12 Feb 2026 15:49:28 +0100 Subject: [PATCH 1/4] data tables done --- dist/index.d.ts | 34 +- dist/index.js | 250 ++++++- examples/App.tsx | 6 +- package-lock.json | 404 ++++++++++++ package.json | 8 + src/common/Loader/TableLoader.tsx | 2 +- src/common/Loader/index.tsx | 2 +- .../Breadcrumbs/Breadcrumb.test.tsx | 5 +- src/components/Dashboard/ClickOutside.tsx | 11 +- src/components/Dashboard/Header/index.tsx | 2 +- .../Dashboard/Sidebar/SidebarLinkGroup.tsx | 2 +- src/components/Dashboard/Sidebar/index.tsx | 9 +- src/components/Form/ZodDynamicForm.tsx | 55 +- src/components/Table/TableDataCustom.test.tsx | 5 +- src/components/Table/TableDataCustom.tsx | 2 +- src/components/Table/TableDataCustomBase.tsx | 613 +++++++++++++----- src/components/Table/test.tsx | 3 +- src/exceptions/TableErrorBoundary.tsx | 8 +- src/hooks/__tests__/useColorMode.test.tsx | 2 +- src/hooks/useA11y.ts | 15 +- src/hooks/useColorMode.tsx | 4 +- src/hooks/useKeyboardNavigation.ts | 6 +- src/hooks/useLogin.ts | 23 +- src/hooks/useLogin.tsx | 23 +- src/hooks/usePasswordReset.ts | 23 +- src/hooks/usePasswordReset.tsx | 23 +- src/hooks/useRegister.ts | 23 +- src/index.ts | 2 +- src/main/dashboard.tsx | 10 +- src/models/ColumnConfigTable.ts | 22 + src/models/FieldConfigDynamicForm.ts | 10 +- src/pages/Dashboard/Home.tsx | 4 +- 32 files changed, 1306 insertions(+), 305 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index 25c3bb6..a625ebe 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -231,6 +231,24 @@ interface ColumnConfigTable { anchor: HTMLElement | null; content: React.ReactNode; }) => void) => React.ReactNode; + /** Sorting configuration */ + sortable?: boolean; + sortComparator?: (a: unknown, b: unknown, rowA: T, rowB: T) => number; + /** Filtering configuration */ + filterable?: boolean; + filterPredicate?: (value: unknown, row: T, query: string) => boolean; + /** Inline editing configuration */ + editable?: boolean; + editor?: (args: { + value: unknown; + row: T; + rowIndex: number; + onChange: (next: unknown) => void; + onCommit: () => void; + onCancel: () => void; + }) => React.ReactNode; + /** Optional className for the cell */ + cellClassName?: string; } /** @@ -253,6 +271,18 @@ interface TableDataCustomProps { pagination?: PaginationProps; errorMessage?: string | null; toolbarItems?: ToolbarItem[]; + /** Feature toggles */ + enableSelection?: boolean; + enableSorting?: boolean; + enableFilter?: boolean; + enableInlineEdit?: boolean; + /** Filtering (controlled/uncontrolled) */ + filterQuery?: string; + onFilterQueryChange?: (query: string) => void; + /** Selection callback */ + onSelectionChange?: (selectedRows: T[], selectedIndices: number[]) => void; + /** Inline cell edit callback */ + onCellEdit?: (rowIndex: number, columnKey: keyof T, nextValue: unknown, row: T) => void; } /** @@ -386,6 +416,4 @@ declare function useFocusTrap(active: boolean): { ref: React$1.MutableRefObject; }; -var undefined$1 = undefined; - -export { Breadcrumb, type BreadcrumbProps, type ColumnConfigTable, ControlledZodDynamicForm, type ControlledZodDynamicFormProps, type DashboardProps, type FieldConfigDynamicForm, type LoginCredentials, type LoginResult, type PaginationProps, type PasswordResetInput, type RegisterPayload, type SidebarActionItem, type SidebarExternalLink, type SidebarInternalLink, type SidebarItem$1 as SidebarItem, type SidebarSection, TableDataCustom, type TableDataCustomProps, Template, type TemplateFooterConfig, type TemplateLayoutConfig, type TemplateNavbarBrandConfig, type TemplateNavbarConfig, type TemplateSidebarConfig, type SidebarItem as TemplateSidebarItem, type ToolbarItem, type UseLoginOptions, type UsePasswordResetOptions, type UseRegisterOptions, type VisibilityRule, generatePageNumbers, useColorMode, useFocusTrap, undefined$1 as useKeyboardNavigation, useLiveRegion, useLocalStorage, useLogin, usePasswordReset, useRegister }; +export { Breadcrumb, type BreadcrumbProps, type ColumnConfigTable, ControlledZodDynamicForm, type ControlledZodDynamicFormProps, type DashboardProps, type FieldConfigDynamicForm, type LoginCredentials, type LoginResult, type PaginationProps, type PasswordResetInput, type RegisterPayload, type SidebarActionItem, type SidebarExternalLink, type SidebarInternalLink, type SidebarItem$1 as SidebarItem, type SidebarSection, TableDataCustom, type TableDataCustomProps, Template, type TemplateFooterConfig, type TemplateLayoutConfig, type TemplateNavbarBrandConfig, type TemplateNavbarConfig, type TemplateSidebarConfig, type SidebarItem as TemplateSidebarItem, type ToolbarItem, type UseLoginOptions, type UsePasswordResetOptions, type UseRegisterOptions, type VisibilityRule, generatePageNumbers, useColorMode, useFocusTrap, useLiveRegion, useLocalStorage, useLogin, usePasswordReset, useRegister }; diff --git a/dist/index.js b/dist/index.js index db4a312..67beb7a 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,4 +1,4 @@ -import React10, { useState, useEffect, useRef, useCallback } from 'react'; +import React10, { useState, useEffect, useRef, useCallback, useMemo } from 'react'; import { useLocation, NavLink, Link as Link$1 } from 'react-router'; import { jsx, jsxs, Fragment } from 'react/jsx-runtime'; import { useT } from '@ciscode/ui-translate-core'; @@ -1067,15 +1067,68 @@ var TablePopover = ({ anchor, children, onClose }) => { document.body ); }; +function InlineEditableCell(props) { + const { value, row, rowIndex, onCommit, editor, children } = props; + const [editing, setEditing] = useState(false); + const [draft, setDraft] = useState(value != null ? value : ""); + const startEdit = useCallback(() => { + setDraft(value != null ? value : ""); + setEditing(true); + }, [value]); + const commit = useCallback(() => { + setEditing(false); + onCommit(draft); + }, [draft, onCommit]); + const cancel = useCallback(() => { + setEditing(false); + setDraft(value != null ? value : ""); + }, [value]); + if (!editing) { + return /* @__PURE__ */ jsx("div", { onDoubleClick: startEdit, className: "cursor-text", children }); + } + if (editor) { + return /* @__PURE__ */ jsx("div", { className: "flex items-center", children: editor({ + value: draft, + row, + rowIndex, + onChange: setDraft, + onCommit: commit, + onCancel: cancel + }) }); + } + return /* @__PURE__ */ jsx( + "input", + { + autoFocus: true, + type: "text", + value: String(draft != null ? draft : ""), + onChange: (e) => setDraft(e.target.value), + onBlur: commit, + onKeyDown: (e) => { + if (e.key === "Enter") commit(); + if (e.key === "Escape") cancel(); + }, + className: "px-2 py-1 text-sm border rounded-md dark:bg-gray-700 dark:text-white" + } + ); +} function TableDataCustomBase({ columns, data, errorMessage, pagination, loading, - toolbarItems + toolbarItems, + enableSelection, + enableSorting, + enableFilter, + enableInlineEdit, + filterQuery, + onFilterQueryChange, + onSelectionChange, + onCellEdit }) { - var _a, _b; + var _a, _b, _c; const t = useT("templateFe"); const leftItems = (toolbarItems != null ? toolbarItems : []).filter( (it) => { @@ -1088,29 +1141,182 @@ function TableDataCustomBase({ ); const [popover, setPopover] = useState(null); const closePopover = useCallback(() => setPopover(null), []); + const [selected, setSelected] = useState(/* @__PURE__ */ new Set()); + const toggleSelectAll = useCallback( + (checked, count) => { + const next = /* @__PURE__ */ new Set(); + if (checked) { + for (let i = 0; i < count; i++) next.add(i); + } + setSelected(next); + }, + [] + ); + const toggleRowSelection = useCallback((index) => { + setSelected((prev) => { + const next = new Set(prev); + if (next.has(index)) next.delete(index); + else next.add(index); + return next; + }); + }, []); + const [sortBy, setSortBy] = useState(null); + const [sortDir, setSortDir] = useState("asc"); + const onHeaderClick = useCallback( + (colIndex, col) => { + if (!enableSorting || col.sortable === false) return; + setSortBy((prev) => prev === colIndex ? colIndex : colIndex); + setSortDir((prev) => sortBy === colIndex ? prev === "asc" ? "desc" : "asc" : "asc"); + }, + [enableSorting, sortBy] + ); + const [internalQuery, setInternalQuery] = useState(""); + const activeQuery = (filterQuery != null ? filterQuery : internalQuery).trim(); + const visibleData = useMemo(() => { + let rows = [...data]; + if (enableFilter && activeQuery.length > 0) { + const q = activeQuery.toLowerCase(); + rows = rows.filter((row) => { + return columns.some((col) => { + const keys = Array.isArray(col.key) ? col.key : [col.key]; + const val = keys.map((k) => { + var _a2; + return String((_a2 = row[k]) != null ? _a2 : ""); + }).join(" ").toLowerCase(); + if (col.filterPredicate) { + return col.filterPredicate(val, row, q); + } + return val.includes(q); + }); + }); + } + if (enableSorting && sortBy != null) { + const col = columns[sortBy]; + rows.sort((a, b) => { + const keys = Array.isArray(col.key) ? col.key : [col.key]; + const va = keys.map((k) => a[k]); + const vb = keys.map((k) => b[k]); + const left = va.length > 1 ? va.join(" ") : va[0]; + const right = vb.length > 1 ? vb.join(" ") : vb[0]; + let cmp = 0; + if (typeof col.sortComparator === "function") { + cmp = col.sortComparator(left, right, a, b); + } else { + const la = left != null ? left : ""; + const lb = right != null ? right : ""; + const sa = String(la).toLowerCase(); + const sb = String(lb).toLowerCase(); + if (sa < sb) cmp = -1; + else if (sa > sb) cmp = 1; + else cmp = 0; + } + return sortDir === "asc" ? cmp : -cmp; + }); + } + return rows; + }, [data, columns, enableFilter, activeQuery, enableSorting, sortBy, sortDir]); + React10.useEffect(() => { + if (!onSelectionChange) return; + const indices = Array.from(selected.values()).sort((a, b) => a - b); + const rows = indices.map((i) => visibleData[i]).filter(Boolean); + onSelectionChange(rows, indices); + }, [selected, visibleData, onSelectionChange]); return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("section", { children: [ popover && /* @__PURE__ */ jsx(TablePopover, { anchor: popover.anchor, onClose: closePopover, children: popover.content }), /* @__PURE__ */ jsx("div", { className: "mx-auto", children: /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden bg-white shadow-md dark:bg-gray-800 sm:rounded-lg", children: [ - (leftItems.length > 0 || rightItems.length > 0) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col px-4 py-3 space-y-3 lg:flex-row lg:items-center lg:justify-between lg:space-y-0 ltr:lg:space-x-4 rtl:lg:space-x-reverse", children: [ - /* @__PURE__ */ jsx("div", { className: "flex items-center flex-wrap gap-3", children: leftItems.map((it, i) => /* @__PURE__ */ jsx(React10.Fragment, { children: it.node }, i)) }), + (leftItems.length > 0 || rightItems.length > 0 || enableFilter) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col px-4 py-3 space-y-3 lg:flex-row lg:items-center lg:justify-between lg:space-y-0 ltr:lg:space-x-4 rtl:lg:space-x-reverse", children: [ + /* @__PURE__ */ jsxs("div", { className: "flex items-center flex-wrap gap-3", children: [ + leftItems.map((it, i) => /* @__PURE__ */ jsx(React10.Fragment, { children: it.node }, i)), + enableFilter && /* @__PURE__ */ jsx( + "input", + { + type: "text", + value: filterQuery != null ? filterQuery : internalQuery, + onChange: (e) => onFilterQueryChange ? onFilterQueryChange(e.target.value) : setInternalQuery(e.target.value), + placeholder: (_a = t("table.filter")) != null ? _a : "Filter\u2026", + className: "px-3 py-2 text-sm border rounded-md dark:bg-gray-700 dark:text-white" + } + ) + ] }), /* @__PURE__ */ jsx("div", { className: "flex items-center flex-wrap gap-3", children: rightItems.map((it, i) => /* @__PURE__ */ jsx(React10.Fragment, { children: it.node }, i)) }) ] }), /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-sm text-gray-500 dark:text-gray-400 ltr:text-left rtl:text-right", children: [ - /* @__PURE__ */ jsx("thead", { className: "text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400", children: /* @__PURE__ */ jsx("tr", { children: columns.map((col, i) => /* @__PURE__ */ jsx("th", { className: "px-4 py-3", children: col.title }, i)) }) }), - /* @__PURE__ */ jsx("tbody", { children: loading ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: columns.length, className: "py-4 text-center", children: /* @__PURE__ */ jsx(TableLoader, {}) }) }) : errorMessage ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: columns.length, className: "py-4 text-center text-red-600", children: errorMessage }) }) : data.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: columns.length, className: "py-4 text-center", children: t("table.noData") }) }) : data.map((row, r) => /* @__PURE__ */ jsx("tr", { className: "border-b", children: columns.map((col, c) => { - let content; - if (Array.isArray(col.key)) { - const vals = col.key.map((k) => { - var _a2; - return (_a2 = row[k]) != null ? _a2 : ""; - }); - content = col.render ? col.render(vals, row, setPopover) : vals.join(" - "); - } else { - const val = row[col.key]; - content = col.render ? col.render(val, row, setPopover) : String(val != null ? val : ""); - } - return /* @__PURE__ */ jsx("td", { className: "px-4 py-3 ltr:text-left rtl:text-right", children: content }, c); - }) }, r)) }) + /* @__PURE__ */ jsx("thead", { className: "text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400", children: /* @__PURE__ */ jsxs("tr", { children: [ + enableSelection && /* @__PURE__ */ jsx("th", { className: "px-4 py-3", children: /* @__PURE__ */ jsx( + "input", + { + type: "checkbox", + "aria-label": "Select all", + checked: selected.size > 0 && selected.size === visibleData.length, + onChange: (e) => toggleSelectAll(e.target.checked, visibleData.length) + } + ) }), + columns.map((col, i) => /* @__PURE__ */ jsx( + "th", + { + className: "px-4 py-3 select-none cursor-pointer", + onClick: () => onHeaderClick(i, col), + title: enableSorting && col.sortable !== false ? "Sort" : void 0, + children: /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [ + col.title, + enableSorting && sortBy === i && /* @__PURE__ */ jsx( + "svg", + { + className: "w-3 h-3", + fill: "currentColor", + viewBox: "0 0 20 20", + children: sortDir === "asc" ? /* @__PURE__ */ jsx("path", { d: "M10 5l-5 6h10L10 5z" }) : /* @__PURE__ */ jsx("path", { d: "M10 15l5-6H5l5 6z" }) + } + ) + ] }) + }, + i + )) + ] }) }), + /* @__PURE__ */ jsx("tbody", { children: loading ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: (enableSelection ? 1 : 0) + columns.length, className: "py-4 text-center", children: /* @__PURE__ */ jsx(TableLoader, {}) }) }) : errorMessage ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: (enableSelection ? 1 : 0) + columns.length, className: "py-4 text-center text-red-600", children: errorMessage }) }) : visibleData.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: (enableSelection ? 1 : 0) + columns.length, className: "py-4 text-center", children: t("table.noData") }) }) : visibleData.map((row, r) => /* @__PURE__ */ jsxs("tr", { className: "border-b", children: [ + enableSelection && /* @__PURE__ */ jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx( + "input", + { + type: "checkbox", + "aria-label": `Select row ${r + 1}`, + checked: selected.has(r), + onChange: () => toggleRowSelection(r) + } + ) }), + columns.map((col, c) => { + var _a2; + let content; + if (Array.isArray(col.key)) { + const vals = col.key.map((k) => { + var _a3; + return (_a3 = row[k]) != null ? _a3 : ""; + }); + const display = vals.join(" - "); + content = col.render ? col.render(vals, row, setPopover) : display; + } else { + const val = row[col.key]; + const display = String(val != null ? val : ""); + if (enableInlineEdit && col.editable) { + content = /* @__PURE__ */ jsx( + InlineEditableCell, + { + value: val, + row, + rowIndex: r, + columnKey: col.key, + onCommit: (next) => onCellEdit == null ? void 0 : onCellEdit(r, col.key, next, row), + editor: col.editor, + className: col.cellClassName, + children: col.render ? col.render(val, row, setPopover) : display + } + ); + } else { + content = col.render ? col.render(val, row, setPopover) : display; + } + } + return /* @__PURE__ */ jsx("td", { className: `px-4 py-3 ltr:text-left rtl:text-right ${(_a2 = col.cellClassName) != null ? _a2 : ""}`, children: content }, c); + }) + ] }, r)) }) ] }) }), pagination && /* @__PURE__ */ jsxs( "nav", @@ -1119,9 +1325,9 @@ function TableDataCustomBase({ "aria-label": "Table navigation", children: [ /* @__PURE__ */ jsx("span", { className: "text-sm font-normal text-gray-500 dark:text-gray-400", children: t("table.pagination.showing", { - from: (pagination.currentPage - 1) * ((_a = pagination.pageSize) != null ? _a : 10) + 1, + from: (pagination.currentPage - 1) * ((_b = pagination.pageSize) != null ? _b : 10) + 1, to: Math.min( - pagination.currentPage * ((_b = pagination.pageSize) != null ? _b : 10), + pagination.currentPage * ((_c = pagination.pageSize) != null ? _c : 10), pagination.totalItems ), total: pagination.totalItems diff --git a/examples/App.tsx b/examples/App.tsx index 8aa8f3c..9c10afe 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -9,7 +9,7 @@ import { } from '@ciscode/template-fe'; import { z } from 'zod'; -export default function App() { +export default function App(): JSX.Element { type Row = { id: number; name: string }; // form schema and state must be declared at component scope for hooks compliance const schema = z.object({ @@ -17,8 +17,8 @@ export default function App() { email: z.string().email('Invalid email'), }); const fields: FieldConfigDynamicForm[] = [ - { key: 'name', label: 'Name', type: 'text' }, - { key: 'email', label: 'Email', type: 'email' }, + { name: 'name', label: 'Name', type: 'text' }, + { name: 'email', label: 'Email', type: 'text' }, ]; const [formValues, setFormValues] = useState<{ name: string; email: string }>({ name: '', diff --git a/package-lock.json b/package-lock.json index 45f3aa9..6edb411 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "jsdom": "^28.0.0", + "lint-staged": "^16.2.7", "msw": "^1.3.2", "playwright": "^1.40.0", "postcss": "^8.5.2", @@ -3630,6 +3631,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz", + "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -3760,6 +3795,13 @@ "dev": true, "license": "MIT" }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, "node_modules/combined-stream": { "version": "1.0.8", "dev": true, @@ -4242,6 +4284,19 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/error-ex": { "version": "1.3.2", "dev": true, @@ -5164,6 +5219,13 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -5551,6 +5613,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -6949,6 +7024,118 @@ "dev": true, "license": "MIT" }, + "node_modules/lint-staged": { + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", + "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.2", + "listr2": "^9.0.5", + "micromatch": "^4.0.8", + "nano-spawn": "^2.0.0", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/load-tsconfig": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", @@ -7019,6 +7206,134 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "dev": true, @@ -7177,6 +7492,19 @@ "node": ">=6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -7318,6 +7646,19 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nano-spawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + } + }, "node_modules/nanoid": { "version": "3.3.11", "dev": true, @@ -7839,6 +8180,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pify": { "version": "2.3.0", "dev": true, @@ -8520,6 +8874,13 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rollup": { "version": "3.29.5", "dev": true, @@ -8873,6 +9234,39 @@ "node": ">= 10" } }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map": { "version": "0.5.7", "dev": true, @@ -8934,6 +9328,16 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "5.1.2", "dev": true, diff --git a/package.json b/package.json index 9511aca..11dd7f4 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "jsdom": "^28.0.0", + "lint-staged": "^16.2.7", "msw": "^1.3.2", "playwright": "^1.40.0", "postcss": "^8.5.2", @@ -93,5 +94,12 @@ }, "dependencies": { "husky": "^9.1.7" + }, + "lint-staged": { + "*.{ts,tsx,js,jsx}": [ + "eslint -c eslint.config.mjs --fix", + "prettier --write" + ], + "*.{json,md,css}": "prettier --write" } } diff --git a/src/common/Loader/TableLoader.tsx b/src/common/Loader/TableLoader.tsx index 96fdeef..1057333 100644 --- a/src/common/Loader/TableLoader.tsx +++ b/src/common/Loader/TableLoader.tsx @@ -1,6 +1,6 @@ import React from 'react'; -export const TableLoader = () => { +export const TableLoader = (): JSX.Element => { return (
diff --git a/src/common/Loader/index.tsx b/src/common/Loader/index.tsx index 7096ef7..cf114dc 100644 --- a/src/common/Loader/index.tsx +++ b/src/common/Loader/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -const Loader = () => { +const Loader = (): JSX.Element => { return (
diff --git a/src/components/Breadcrumbs/Breadcrumb.test.tsx b/src/components/Breadcrumbs/Breadcrumb.test.tsx index ea81e9a..88d372e 100644 --- a/src/components/Breadcrumbs/Breadcrumb.test.tsx +++ b/src/components/Breadcrumbs/Breadcrumb.test.tsx @@ -1,13 +1,14 @@ import { describe, it, expect, vi } from 'vitest'; import { render, screen } from '@testing-library/react'; import Breadcrumb from './Breadcrumb'; +import type { ReactNode } from 'react'; vi.mock('@ciscode/ui-translate-core', () => ({ - useT: () => (key: string, vars?: any) => (typeof key === 'string' ? key : 't'), + useT: () => (key: string) => (typeof key === 'string' ? key : 't'), })); vi.mock('react-router', () => ({ - Link: ({ children }: any) => {children}, + Link: ({ children }: { children: ReactNode }) => {children}, })); describe('Breadcrumb', () => { diff --git a/src/components/Dashboard/ClickOutside.tsx b/src/components/Dashboard/ClickOutside.tsx index bf3c93d..88adbcf 100644 --- a/src/components/Dashboard/ClickOutside.tsx +++ b/src/components/Dashboard/ClickOutside.tsx @@ -1,13 +1,14 @@ -import React, { useRef, useEffect } from 'react'; +import { useRef, useEffect } from 'react'; +import type { ReactNode, RefObject } from 'react'; interface Props { - children: React.ReactNode; - exceptionRef?: React.RefObject; + children: ReactNode; + exceptionRef?: RefObject; onClick: () => void; className?: string; } -const ClickOutside: React.FC = ({ children, exceptionRef, onClick, className }) => { +function ClickOutside({ children, exceptionRef, onClick, className }: Props): JSX.Element { const wrapperRef = useRef(null); useEffect(() => { @@ -37,6 +38,6 @@ const ClickOutside: React.FC = ({ children, exceptionRef, onClick, classN {children}
); -}; +} export default ClickOutside; diff --git a/src/components/Dashboard/Header/index.tsx b/src/components/Dashboard/Header/index.tsx index 32b4376..dfe01c4 100644 --- a/src/components/Dashboard/Header/index.tsx +++ b/src/components/Dashboard/Header/index.tsx @@ -10,7 +10,7 @@ const Header = (props: { sidebarOpen: string | boolean | undefined; setSidebarOpen: (arg0: boolean) => void; onLogout?: () => void; -}) => { +}): JSX.Element => { const t = useT('templateFe'); console.log('HEADER onLogout prop =', props.onLogout); diff --git a/src/components/Dashboard/Sidebar/SidebarLinkGroup.tsx b/src/components/Dashboard/Sidebar/SidebarLinkGroup.tsx index 35853a3..b9cd467 100644 --- a/src/components/Dashboard/Sidebar/SidebarLinkGroup.tsx +++ b/src/components/Dashboard/Sidebar/SidebarLinkGroup.tsx @@ -6,7 +6,7 @@ interface SidebarLinkGroupProps { activeCondition: boolean; } -const SidebarLinkGroup = ({ children, activeCondition }: SidebarLinkGroupProps) => { +const SidebarLinkGroup = ({ children, activeCondition }: SidebarLinkGroupProps): JSX.Element => { const [open, setOpen] = useState(activeCondition); const handleClick = () => { diff --git a/src/components/Dashboard/Sidebar/index.tsx b/src/components/Dashboard/Sidebar/index.tsx index 9abbe52..d6f6779 100644 --- a/src/components/Dashboard/Sidebar/index.tsx +++ b/src/components/Dashboard/Sidebar/index.tsx @@ -1,8 +1,6 @@ import React, { useEffect, useRef, useState, ReactNode } from 'react'; import { useLocation, NavLink } from 'react-router'; -import SidebarLinkGroup from './SidebarLinkGroup'; import { SidebarSection } from '../../../models/SidebarItemModel'; -import { useT } from '@ciscode/ui-translate-core'; interface SidebarProps { sidebarOpen: boolean; @@ -11,16 +9,15 @@ interface SidebarProps { logo?: ReactNode; } -const Sidebar = ({ sidebarOpen, setSidebarOpen, sections, logo }: SidebarProps) => { +const Sidebar = ({ sidebarOpen, setSidebarOpen, sections, logo }: SidebarProps): JSX.Element => { const location = useLocation(); const { pathname } = location; - const t = useT('templateFe'); const trigger = useRef(null); const sidebar = useRef(null); const storedSidebarExpanded = localStorage.getItem('sidebar-expanded'); - const [sidebarExpanded, setSidebarExpanded] = useState(storedSidebarExpanded === 'true'); + const [sidebarExpanded] = useState(storedSidebarExpanded === 'true'); useEffect(() => { const handleClickOutside = (e: MouseEvent) => { @@ -72,7 +69,7 @@ const Sidebar = ({ sidebarOpen, setSidebarOpen, sections, logo }: SidebarProps)
{logo ? ( - <>{logo} + {logo} ) : (
APP-LOGO diff --git a/src/components/Form/ZodDynamicForm.tsx b/src/components/Form/ZodDynamicForm.tsx index 8131421..a78ab34 100644 --- a/src/components/Form/ZodDynamicForm.tsx +++ b/src/components/Form/ZodDynamicForm.tsx @@ -1,17 +1,18 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; +import type { ReactNode, ChangeEvent, FormEvent } from 'react'; import { ZodSchema, ZodError } from 'zod'; import { MultiValue } from 'react-select'; import Select from 'react-select'; import { FieldConfigDynamicForm } from '../../models/FieldConfigDynamicForm'; export interface ControlledZodDynamicFormProps { - schema: ZodSchema; + schema: ZodSchema>; fields: FieldConfigDynamicForm[]; - values: Record; - onChangeField: (fieldName: string, newValue: any) => void; - onSubmit: (parsedValues: Record) => void; + values: Record; + onChangeField: (fieldName: string, newValue: unknown) => void; + onSubmit: (parsedValues: Record) => void; submitLabel?: string; - header?: React.ReactNode; + header?: ReactNode; /** Optional override for the ZodError class (for dependency injection) */ } @@ -23,7 +24,7 @@ export default function ControlledZodDynamicForm({ onSubmit, submitLabel = 'Submit', header, -}: ControlledZodDynamicFormProps) { +}: ControlledZodDynamicFormProps): JSX.Element { const [errors, setErrors] = useState>({}); /** @@ -31,10 +32,10 @@ export default function ControlledZodDynamicForm({ * Uses a type guard so we can safely read e.target.checked if it's a checkbox. */ function handleInputChange( - e: React.ChangeEvent, - ) { + e: ChangeEvent, + ): void { const { name, value, type } = e.target; - let newValue: any = value; + let newValue: unknown = value; // type guard for checkbox if (type === 'checkbox' && e.target instanceof HTMLInputElement) { @@ -49,7 +50,7 @@ export default function ControlledZodDynamicForm({ * On form submit => parse the entire `values` with Zod. * If it fails, store the error messages in local state to display. */ - function handleSubmit(e: React.FormEvent) { + function handleSubmit(e: FormEvent): void { e.preventDefault(); try { // Attempt to parse the entire form data with Zod @@ -108,7 +109,7 @@ export default function ControlledZodDynamicForm({ id={field.name} name={field.name} placeholder={field.placeholder} - value={fieldValue} + value={typeof fieldValue === 'string' ? fieldValue : String(fieldValue ?? '')} onChange={handleInputChange} className="border border-gray-300 rounded-lg px-3 py-2 w-full ltr:text-left rtl:text-right" /> @@ -119,7 +120,11 @@ export default function ControlledZodDynamicForm({ setDraft(e.target.value)} + onBlur={commit} + onKeyDown={(e) => { + if (e.key === 'Enter') commit(); + if (e.key === 'Escape') cancel(); + }} + className="px-2 py-1 text-sm border rounded-md dark:bg-gray-700 dark:text-white" + /> + ); +} + /** * Pagination configuration for table navigation. */ @@ -27,6 +104,22 @@ export interface TableDataCustomProps { pagination?: PaginationProps; errorMessage?: string | null; toolbarItems?: ToolbarItem[]; + + /** Feature toggles */ + enableSelection?: boolean; + enableSorting?: boolean; + enableFilter?: boolean; + enableInlineEdit?: boolean; + + /** Filtering (controlled/uncontrolled) */ + filterQuery?: string; + onFilterQueryChange?: (query: string) => void; + + /** Selection callback */ + onSelectionChange?: (selectedRows: T[], selectedIndices: number[]) => void; + + /** Inline cell edit callback */ + onCellEdit?: (rowIndex: number, columnKey: keyof T, nextValue: unknown, row: T) => void; } /** @@ -40,7 +133,15 @@ function TableDataCustomBase({ pagination, loading, toolbarItems, -}: TableDataCustomProps) { + enableSelection, + enableSorting, + enableFilter, + enableInlineEdit, + filterQuery, + onFilterQueryChange, + onSelectionChange, + onCellEdit, +}: TableDataCustomProps): JSX.Element { const t = useT('templateFe'); // split toolbar items @@ -56,192 +157,350 @@ function TableDataCustomBase({ } | null>(null); const closePopover = useCallback(() => setPopover(null), []); + // Selection state (indices within visible data) + const [selected, setSelected] = useState>(new Set()); + const toggleSelectAll = useCallback((checked: boolean, count: number) => { + const next = new Set(); + if (checked) { + for (let i = 0; i < count; i++) next.add(i); + } + setSelected(next); + }, []); + + const toggleRowSelection = useCallback((index: number) => { + setSelected((prev) => { + const next = new Set(prev); + if (next.has(index)) next.delete(index); + else next.add(index); + return next; + }); + }, []); + + // Sorting state + const [sortBy, setSortBy] = useState(null); + const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc'); + const onHeaderClick = useCallback( + (colIndex: number, col: ColumnConfigTable) => { + if (!enableSorting || col.sortable === false) return; + setSortBy((prev) => (prev === colIndex ? colIndex : colIndex)); + setSortDir((prev) => (sortBy === colIndex ? (prev === 'asc' ? 'desc' : 'asc') : 'asc')); + }, + [enableSorting, sortBy], + ); + + // Filtering state (uncontrolled fallback) + const [internalQuery, setInternalQuery] = useState(''); + const activeQuery = (filterQuery ?? internalQuery).trim(); + + // Build visible rows: filter then sort + const visibleData = useMemo(() => { + let rows = [...data]; + if (enableFilter && activeQuery.length > 0) { + const q = activeQuery.toLowerCase(); + rows = rows.filter((row) => { + return columns.some((col) => { + const keys = Array.isArray(col.key) ? col.key : [col.key]; + const val = keys + .map((k) => String((row[k as keyof T] as unknown) ?? '')) + .join(' ') // combine multi-key cells + .toLowerCase(); + if (col.filterPredicate) { + return col.filterPredicate(val, row, q); + } + return val.includes(q); + }); + }); + } + if (enableSorting && sortBy != null) { + const col = columns[sortBy]; + rows.sort((a, b) => { + const keys = Array.isArray(col.key) ? col.key : [col.key]; + const va = keys.map((k) => a[k as keyof T] as unknown); + const vb = keys.map((k) => b[k as keyof T] as unknown); + const left = va.length > 1 ? va.join(' ') : va[0]; + const right = vb.length > 1 ? vb.join(' ') : vb[0]; + let cmp = 0; + if (typeof col.sortComparator === 'function') { + cmp = col.sortComparator(left, right, a, b); + } else { + const la = left ?? ''; + const lb = right ?? ''; + const sa = String(la).toLowerCase(); + const sb = String(lb).toLowerCase(); + if (sa < sb) cmp = -1; + else if (sa > sb) cmp = 1; + else cmp = 0; + } + return sortDir === 'asc' ? cmp : -cmp; + }); + } + return rows; + }, [data, columns, enableFilter, activeQuery, enableSorting, sortBy, sortDir]); + + // Notify selection changes + React.useEffect(() => { + if (!onSelectionChange) return; + const indices = Array.from(selected.values()).sort((a, b) => a - b); + const rows = indices.map((i) => visibleData[i]).filter(Boolean); + onSelectionChange(rows, indices); + }, [selected, visibleData, onSelectionChange]); + return ( - <> -
- {popover && ( - - {popover.content} - - )} -
-
- {/* Toolbar */} - {(leftItems.length > 0 || rightItems.length > 0) && ( -
-
- {leftItems.map((it, i) => ( - {it.node} - ))} -
-
- {rightItems.map((it, i) => ( - {it.node} - ))} -
+
+ {popover && ( + + {popover.content} + + )} +
+
+ {/* Toolbar */} + {(leftItems.length > 0 || rightItems.length > 0 || enableFilter) && ( +
+
+ {leftItems.map((it, i) => ( + + {it.node} + + ))} + {enableFilter && ( + + onFilterQueryChange + ? onFilterQueryChange(e.target.value) + : setInternalQuery(e.target.value) + } + placeholder={t('table.filter') ?? 'Filter…'} + className="px-3 py-2 text-sm border rounded-md dark:bg-gray-700 dark:text-white" + /> + )} +
+
+ {rightItems.map((it, i) => ( + + {it.node} + + ))}
- )} +
+ )} - {/* Table */} -
- - - - {columns.map((col, i) => ( - + ); + })} + + )) + )} + +
+ {/* Table */} +
+ + + + {enableSelection && ( + + )} + {columns.map((col, i) => ( + - ))} + {enableSorting && sortBy === i && ( + + {sortDir === 'asc' ? ( + + ) : ( + + )} + + )} + + + ))} + + + + {loading ? ( + + - - - {loading ? ( - - - - ) : errorMessage ? ( - - - - ) : data.length === 0 ? ( - - - - ) : ( - data.map((row, r) => ( - - {columns.map((col, c) => { - let content: React.ReactNode; - if (Array.isArray(col.key)) { - const vals = col.key.map((k) => row[k] ?? ''); - content = col.render - ? col.render(vals, row, setPopover) - : vals.join(' - '); + ) : errorMessage ? ( + + + + ) : visibleData.length === 0 ? ( + + + + ) : ( + visibleData.map((row, r) => ( + + {enableSelection && ( + + )} + {columns.map((col, c) => { + let content: React.ReactNode; + if (Array.isArray(col.key)) { + const vals = col.key.map((k) => row[k] ?? ''); + const display = vals.join(' - '); + content = col.render ? col.render(vals, row, setPopover) : display; + } else { + const val = row[col.key]; + const display = String(val ?? ''); + // Inline editing: per-cell editing on double-click + if (enableInlineEdit && col.editable) { + content = ( + onCellEdit?.(r, col.key as keyof T, next, row)} + editor={col.editor} + className={col.cellClassName} + > + {col.render ? col.render(val, row, setPopover) : display} + + ); } else { - const val = row[col.key]; - content = col.render - ? col.render(val, row, setPopover) - : String(val ?? ''); + content = col.render ? col.render(val, row, setPopover) : display; } - return ( - - ); - })} - - )) - )} - -
+ 0 && selected.size === visibleData.length} + onChange={(e) => toggleSelectAll(e.target.checked, visibleData.length)} + /> + onHeaderClick(i, col)} + title={enableSorting && col.sortable !== false ? 'Sort' : undefined} + > + {col.title} -
+ +
- -
- {errorMessage} -
- {t('table.noData')} -
+ {errorMessage} +
+ {t('table.noData')} +
+ toggleRowSelection(r)} + /> + - {content} -
-
+ } + return ( +
+ {content} +
+
- {/* Pagination */} - {pagination && ( - - )} -
+ {p} + + + ), + )} + + {/* Next */} +
  • + +
  • + + + )}
    -
    - +
    +
    ); } diff --git a/src/components/Table/test.tsx b/src/components/Table/test.tsx index a598a6b..23ae9a8 100644 --- a/src/components/Table/test.tsx +++ b/src/components/Table/test.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { Trans } from '@ciscode/ui-translate-core'; export interface PaginationProps { @@ -9,7 +8,7 @@ export interface PaginationProps { onPageChange?: (page: number) => void; } -function PaginationInfo({ pagination }: { pagination: PaginationProps }) { +function PaginationInfo({ pagination }: { pagination: PaginationProps }): JSX.Element { const from = (pagination.currentPage - 1) * (pagination.pageSize ?? 10) + 1; const to = Math.min(pagination.currentPage * (pagination.pageSize ?? 10), pagination.totalItems); const total = pagination.totalItems; diff --git a/src/exceptions/TableErrorBoundary.tsx b/src/exceptions/TableErrorBoundary.tsx index 929c8c9..851646b 100644 --- a/src/exceptions/TableErrorBoundary.tsx +++ b/src/exceptions/TableErrorBoundary.tsx @@ -14,15 +14,15 @@ class TableErrorBoundary extends React.Component< this.state = { hasError: false }; } - static getDerivedStateFromError(_: any) { + static getDerivedStateFromError(): TableErrorBoundaryState { return { hasError: true }; } - componentDidCatch(error: any, errorInfo: any) { + componentDidCatch(error: unknown, errorInfo: unknown): void { console.error('TableErrorBoundary caught an error:', error, errorInfo); } - render() { + render(): React.ReactNode { if (this.state.hasError) { // You can't use hooks like useT inside a class component, // so we wrap it in a functional HOC instead. @@ -33,7 +33,7 @@ class TableErrorBoundary extends React.Component< } } -const TranslatedErrorMessage = () => { +const TranslatedErrorMessage = (): JSX.Element => { const t = useT('template-fe'); return (
    diff --git a/src/hooks/__tests__/useColorMode.test.tsx b/src/hooks/__tests__/useColorMode.test.tsx index 3a98928..a5a224e 100644 --- a/src/hooks/__tests__/useColorMode.test.tsx +++ b/src/hooks/__tests__/useColorMode.test.tsx @@ -11,7 +11,7 @@ describe('useColorMode', () => { // default from useLocalStorage is 'light' expect(document.body.classList.contains('dark')).toBe(false); - const [, setMode] = result.current as any; + const [, setMode] = result.current as [string, (value: string) => void]; act(() => setMode('dark')); expect(document.body.classList.contains('dark')).toBe(true); diff --git a/src/hooks/useA11y.ts b/src/hooks/useA11y.ts index ce8ce1a..bd90aff 100644 --- a/src/hooks/useA11y.ts +++ b/src/hooks/useA11y.ts @@ -5,9 +5,14 @@ import { useEffect, useRef } from 'react'; * Returns a ref to attach to an element with `aria-live="polite"` or `assertive`. * Use `announce()` to set text content. */ -export function useLiveRegion() { +export type LiveRegionReturn = { + ref: React.MutableRefObject; + announce: (message: string) => void; +}; + +export function useLiveRegion(): LiveRegionReturn { const ref = useRef(null); - function announce(message: string) { + function announce(message: string): void { if (ref.current) { ref.current.textContent = message; } @@ -19,7 +24,9 @@ export function useLiveRegion() { * Trap focus within a container element (e.g., modal) while `active`. * Adds keydown handlers to cycle focus. */ -export function useFocusTrap(active: boolean) { +export type FocusTrapReturn = { ref: React.MutableRefObject }; + +export function useFocusTrap(active: boolean): FocusTrapReturn { const ref = useRef(null); useEffect(() => { @@ -63,5 +70,3 @@ export function useFocusTrap(active: boolean) { return { ref }; } - -export default undefined; diff --git a/src/hooks/useColorMode.tsx b/src/hooks/useColorMode.tsx index 6ef39f3..03e9ae2 100644 --- a/src/hooks/useColorMode.tsx +++ b/src/hooks/useColorMode.tsx @@ -6,8 +6,8 @@ import useLocalStorage from './useLocalStorage'; * Toggles `dark` class on `` when mode is 'dark'. * Returns `[colorMode, setColorMode]`. */ -const useColorMode = () => { - const [colorMode, setColorMode] = useLocalStorage('color-theme', 'light'); +const useColorMode = (): [string, (value: string | ((val: string) => string)) => void] => { + const [colorMode, setColorMode] = useLocalStorage('color-theme', 'light'); useEffect(() => { const className = 'dark'; diff --git a/src/hooks/useKeyboardNavigation.ts b/src/hooks/useKeyboardNavigation.ts index 37b50bd..3826e86 100644 --- a/src/hooks/useKeyboardNavigation.ts +++ b/src/hooks/useKeyboardNavigation.ts @@ -14,7 +14,7 @@ export type RovingConfig = { export function useKeyboardNavigation( container: HTMLElement | null, { selector, initialIndex = 0 }: RovingConfig, -) { +): void { useEffect(() => { if (!container) return; const items = Array.from(container.querySelectorAll(selector)); @@ -23,7 +23,7 @@ export function useKeyboardNavigation( // Initialize tabindex items.forEach((el, i) => el.setAttribute('tabindex', i === initialIndex ? '0' : '-1')); - function onKeyDown(e: KeyboardEvent) { + function onKeyDown(e: KeyboardEvent): void { const currentIndex = items.findIndex((el) => el === document.activeElement); if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { const next = items[(currentIndex + 1 + items.length) % items.length]; @@ -44,5 +44,3 @@ export function useKeyboardNavigation( return () => container.removeEventListener('keydown', onKeyDown); }, [container, selector, initialIndex]); } - -export default undefined; diff --git a/src/hooks/useLogin.ts b/src/hooks/useLogin.ts index a7989cf..5ded468 100644 --- a/src/hooks/useLogin.ts +++ b/src/hooks/useLogin.ts @@ -26,20 +26,32 @@ export type UseLoginOptions = { schema?: ZodSchema; }; +export type UseLoginReturn = { + values: LoginCredentials; + update: (key: K, value: LoginCredentials[K]) => void; + submit: () => Promise>; + loading: boolean; + error: string | null; + result: LoginResult | null; +}; + /** * A composable login hook: manages form state, validation, submit, and loading/errors. */ -export function useLogin({ login, schema }: UseLoginOptions) { +export function useLogin({ + login, + schema, +}: UseLoginOptions): UseLoginReturn { const [values, setValues] = useState({ username: '', password: '' }); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [result, setResult] = useState | null>(null); - function update(key: K, value: LoginCredentials[K]) { + function update(key: K, value: LoginCredentials[K]): void { setValues((v) => ({ ...v, [key]: value })); } - async function submit() { + async function submit(): Promise> { setError(null); setLoading(true); try { @@ -47,8 +59,9 @@ export function useLogin({ login, schema }: UseLoginOptions = { schema?: ParseSchema; }; +export type UseLoginReturn = { + values: LoginCredentials; + update: (key: K, value: LoginCredentials[K]) => void; + submit: () => Promise>; + loading: boolean; + error: string | null; + result: LoginResult | null; +}; + /** * A composable login hook: manages form state, validation, submit, and loading/errors. */ -export function useLogin({ login, schema }: UseLoginOptions) { +export function useLogin({ + login, + schema, +}: UseLoginOptions): UseLoginReturn { const [values, setValues] = useState({ username: '', password: '' }); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [result, setResult] = useState | null>(null); - function update(key: K, value: LoginCredentials[K]) { + function update(key: K, value: LoginCredentials[K]): void { setValues((v: LoginCredentials) => ({ ...v, [key]: value })); } - async function submit() { + async function submit(): Promise> { setError(null); setLoading(true); try { @@ -48,8 +60,9 @@ export function useLogin({ login, schema }: UseLoginOptions; }; +export type UsePasswordResetReturn = { + values: PasswordResetInput; + update: (key: K, value: PasswordResetInput[K]) => void; + submit: () => Promise; + loading: boolean; + error: string | null; + success: boolean; +}; + /** * A composable password reset hook: manages form state, validation, submit, and loading/errors. */ -export function usePasswordReset({ reset, schema }: UsePasswordResetOptions) { +export function usePasswordReset({ + reset, + schema, +}: UsePasswordResetOptions): UsePasswordResetReturn { const [values, setValues] = useState({ email: '' }); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); - function update(key: K, value: PasswordResetInput[K]) { + function update(key: K, value: PasswordResetInput[K]): void { setValues((v) => ({ ...v, [key]: value })); } - async function submit() { + async function submit(): Promise { setError(null); setSuccess(false); setLoading(true); @@ -38,8 +50,9 @@ export function usePasswordReset({ reset, schema }: UsePasswordResetOptions) { const input = schema ? schema.parse(values) : values; await reset(input); setSuccess(true); - } catch (e: any) { - setError(e?.message ?? 'Password reset failed'); + } catch (e: unknown) { + const message = e instanceof Error ? e.message : 'Password reset failed'; + setError(message); throw e; } finally { setLoading(false); diff --git a/src/hooks/usePasswordReset.tsx b/src/hooks/usePasswordReset.tsx index 5c8fa2e..f1caafc 100644 --- a/src/hooks/usePasswordReset.tsx +++ b/src/hooks/usePasswordReset.tsx @@ -18,20 +18,32 @@ export type UsePasswordResetOptions = { schema?: ParseSchema; }; +export type UsePasswordResetReturn = { + values: PasswordResetInput; + update: (key: K, value: PasswordResetInput[K]) => void; + submit: () => Promise; + loading: boolean; + error: string | null; + success: boolean; +}; + /** * A composable password reset hook: manages form state, validation, submit, and loading/errors. */ -export function usePasswordReset({ reset, schema }: UsePasswordResetOptions) { +export function usePasswordReset({ + reset, + schema, +}: UsePasswordResetOptions): UsePasswordResetReturn { const [values, setValues] = useState({ email: '' }); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); - function update(key: K, value: PasswordResetInput[K]) { + function update(key: K, value: PasswordResetInput[K]): void { setValues((v: PasswordResetInput) => ({ ...v, [key]: value })); } - async function submit() { + async function submit(): Promise { setError(null); setSuccess(false); setLoading(true); @@ -39,8 +51,9 @@ export function usePasswordReset({ reset, schema }: UsePasswordResetOptions) { const input = schema ? schema.parse(values) : values; await reset(input); setSuccess(true); - } catch (e: any) { - setError(e?.message ?? 'Password reset failed'); + } catch (e: unknown) { + const message = e instanceof Error ? e.message : 'Password reset failed'; + setError(message); throw e; } finally { setLoading(false); diff --git a/src/hooks/useRegister.ts b/src/hooks/useRegister.ts index 6f9eaac..ea31ffe 100644 --- a/src/hooks/useRegister.ts +++ b/src/hooks/useRegister.ts @@ -14,20 +14,32 @@ export type UseRegisterOptions = { schema?: ZodSchema; }; +export type UseRegisterReturn = { + values: RegisterPayload; + update: (key: K, value: unknown) => void; + submit: () => Promise; + loading: boolean; + error: string | null; + user: TUser | null; +}; + /** * A composable registration hook: manages form state, validation, submit, and loading/errors. */ -export function useRegister({ register, schema }: UseRegisterOptions) { +export function useRegister({ + register, + schema, +}: UseRegisterOptions): UseRegisterReturn { const [values, setValues] = useState({}); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [user, setUser] = useState(null); - function update(key: K, value: unknown) { + function update(key: K, value: unknown): void { setValues((v) => ({ ...v, [key]: value })); } - async function submit() { + async function submit(): Promise { setError(null); setLoading(true); try { @@ -35,8 +47,9 @@ export function useRegister({ register, schema }: UseRegisterOp const res = await register(payload); setUser(res); return res; - } catch (e: any) { - setError(e?.message ?? 'Registration failed'); + } catch (e: unknown) { + const message = e instanceof Error ? e.message : 'Registration failed'; + setError(message); throw e; } finally { setLoading(false); diff --git a/src/index.ts b/src/index.ts index 085e0a9..fd6d230 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,7 +14,7 @@ export { default as useLogin } from './hooks/useLogin'; export { default as useRegister } from './hooks/useRegister'; export { default as usePasswordReset } from './hooks/usePasswordReset'; export { useLiveRegion, useFocusTrap } from './hooks/useA11y'; -export { default as useKeyboardNavigation } from './hooks/useKeyboardNavigation'; +export { useKeyboardNavigation } from './hooks/useKeyboardNavigation'; // Types (layout public) export type { diff --git a/src/main/dashboard.tsx b/src/main/dashboard.tsx index 2b1f612..0034e7c 100644 --- a/src/main/dashboard.tsx +++ b/src/main/dashboard.tsx @@ -1,4 +1,5 @@ -import React, { useState, useEffect, ReactNode } from 'react'; +import { useState, useEffect } from 'react'; +import type { ReactNode } from 'react'; import { useLocation } from 'react-router'; import DashboardLayout from '../layout/DashboardLayout'; import Loader from '../common/Loader'; @@ -48,15 +49,14 @@ export interface DashboardProps { * Preferred: * - New apps should use: sidebar + navbar (+ footer when needed) */ -const Template: React.FC = ({ +function Template({ children, sidebarContent = [], logo, onLogout, - sidebar, navbar, footer, -}) => { +}: DashboardProps): JSX.Element { const [loading, setLoading] = useState(true); const { pathname } = useLocation(); @@ -110,6 +110,6 @@ const Template: React.FC = ({ {children} ); -}; +} export default Template; diff --git a/src/models/ColumnConfigTable.ts b/src/models/ColumnConfigTable.ts index 75ffaf1..3bd6b9e 100644 --- a/src/models/ColumnConfigTable.ts +++ b/src/models/ColumnConfigTable.ts @@ -11,4 +11,26 @@ export interface ColumnConfigTable { row: T, setPopover: (popover: { anchor: HTMLElement | null; content: React.ReactNode }) => void, ) => React.ReactNode; + + /** Sorting configuration */ + sortable?: boolean; + sortComparator?: (a: unknown, b: unknown, rowA: T, rowB: T) => number; + + /** Filtering configuration */ + filterable?: boolean; + filterPredicate?: (value: unknown, row: T, query: string) => boolean; + + /** Inline editing configuration */ + editable?: boolean; + editor?: (args: { + value: unknown; + row: T; + rowIndex: number; + onChange: (next: unknown) => void; + onCommit: () => void; + onCancel: () => void; + }) => React.ReactNode; + + /** Optional className for the cell */ + cellClassName?: string; } diff --git a/src/models/FieldConfigDynamicForm.ts b/src/models/FieldConfigDynamicForm.ts index c4452d5..29f231b 100644 --- a/src/models/FieldConfigDynamicForm.ts +++ b/src/models/FieldConfigDynamicForm.ts @@ -1,4 +1,4 @@ -import React from 'react'; +import type { ComponentType } from 'react'; /** The list of supported field types. */ type FieldType = 'text' | 'number' | 'textarea' | 'select' | 'checkbox' | 'multiSelect' | 'custom'; @@ -27,14 +27,14 @@ export interface FieldConfigDynamicForm { /** For select or multiSelect, an array of label/value pairs. */ options?: FieldOption[]; /** Default initial value (e.g. '', 0, [], etc.). */ - defaultValue?: any; + defaultValue?: unknown; /** For multiSelect or custom logic, an optional URL for searching. */ /** * If `type` is 'custom', you can specify a React component * that the form will render. This component should accept - * props like { value: any, onChange: (val: any) => void } at minimum. + * props like { value: unknown, onChange: (val: unknown) => void } at minimum. */ - component?: React.ComponentType; + component?: ComponentType>; // Add a `step` property for numeric fields step?: string; /** @@ -49,5 +49,5 @@ export interface FieldConfigDynamicForm { labelClassName?: string; inputClassName?: string; // add an optional props property: - props?: Record; + props?: Record; } diff --git a/src/pages/Dashboard/Home.tsx b/src/pages/Dashboard/Home.tsx index 6695c35..fb97b39 100644 --- a/src/pages/Dashboard/Home.tsx +++ b/src/pages/Dashboard/Home.tsx @@ -1,6 +1,4 @@ -import React from 'react'; - -const Home = () => { +const Home = (): JSX.Element => { return (

    Home Page Dashboard

    From 28a2762c6a55e6e53d51b9805fb577b10924cea6 Mon Sep 17 00:00:00 2001 From: a-elkhiraooui-ciscode Date: Thu, 12 Feb 2026 15:49:42 +0100 Subject: [PATCH 2/4] 1.0.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6edb411..acc2faa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ciscode/template-fe", - "version": "1.0.2", + "version": "1.0.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ciscode/template-fe", - "version": "1.0.2", + "version": "1.0.3", "license": "ISC", "dependencies": { "husky": "^9.1.7" diff --git a/package.json b/package.json index 11dd7f4..ec31a84 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ciscode/template-fe", - "version": "1.0.2", + "version": "1.0.3", "description": "", "main": "dist/index.cjs", "module": "dist/index.js", From c3b41d443390330b7224e4e6c0b36074b9f03f38 Mon Sep 17 00:00:00 2001 From: a-elkhiraooui-ciscode Date: Fri, 13 Feb 2026 10:10:48 +0100 Subject: [PATCH 3/4] dashboard widgets, resizable, drag and drop, with actions done --- dist/index.d.ts | 125 ++-- dist/index.js | 565 +++++++++++++++--- dist/index.js.map | 2 +- .../Dashboard/Widgets/ChartAdapters.tsx | 96 +++ .../Dashboard/Widgets/DashboardGrid.tsx | 284 +++++++++ .../Dashboard/Widgets/WidgetContainer.tsx | 122 ++++ .../Dashboard/Widgets/layoutUtils.ts | 33 + src/index.ts | 11 + src/models/DashboardWidget.ts | 39 ++ src/pages/Dashboard/Home.tsx | 56 +- .../DashboardWidgets/layoutUtils.test.ts | 30 + 11 files changed, 1244 insertions(+), 119 deletions(-) create mode 100644 src/components/Dashboard/Widgets/ChartAdapters.tsx create mode 100644 src/components/Dashboard/Widgets/DashboardGrid.tsx create mode 100644 src/components/Dashboard/Widgets/WidgetContainer.tsx create mode 100644 src/components/Dashboard/Widgets/layoutUtils.ts create mode 100644 src/models/DashboardWidget.ts create mode 100644 tests/unit/components/DashboardWidgets/layoutUtils.test.ts diff --git a/dist/index.d.ts b/dist/index.d.ts index a625ebe..d3ce8dd 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,6 +1,4 @@ -import * as React$1 from 'react'; -import React__default, { ReactNode } from 'react'; -import * as react_jsx_runtime from 'react/jsx-runtime'; +import React$1, { ReactNode, ComponentType } from 'react'; import { ZodSchema } from 'zod'; /** Each item within a section */ @@ -135,7 +133,7 @@ interface DashboardProps { * Preferred: * - New apps should use: sidebar + navbar (+ footer when needed) */ -declare const Template: React__default.FC; +declare function Template({ children, sidebarContent, logo, onLogout, navbar, footer, }: DashboardProps): JSX.Element; /** * Props for `Breadcrumb` component. @@ -148,7 +146,7 @@ interface BreadcrumbProps { * Accessible breadcrumb navigation. * Renders a current page label and a link to home. */ -declare const Breadcrumb: React__default.FC; +declare const Breadcrumb: React$1.FC; /** The list of supported field types. */ type FieldType = 'text' | 'number' | 'textarea' | 'select' | 'checkbox' | 'multiSelect' | 'custom'; @@ -175,14 +173,14 @@ interface FieldConfigDynamicForm { /** For select or multiSelect, an array of label/value pairs. */ options?: FieldOption[]; /** Default initial value (e.g. '', 0, [], etc.). */ - defaultValue?: any; + defaultValue?: unknown; /** For multiSelect or custom logic, an optional URL for searching. */ /** * If `type` is 'custom', you can specify a React component * that the form will render. This component should accept - * props like { value: any, onChange: (val: any) => void } at minimum. + * props like { value: unknown, onChange: (val: unknown) => void } at minimum. */ - component?: React__default.ComponentType; + component?: ComponentType>; step?: string; /** * Tailwind classes for the field wrapper (the
    ). @@ -194,19 +192,19 @@ interface FieldConfigDynamicForm { */ labelClassName?: string; inputClassName?: string; - props?: Record; + props?: Record; } interface ControlledZodDynamicFormProps { - schema: ZodSchema; + schema: ZodSchema>; fields: FieldConfigDynamicForm[]; - values: Record; - onChangeField: (fieldName: string, newValue: any) => void; - onSubmit: (parsedValues: Record) => void; + values: Record; + onChangeField: (fieldName: string, newValue: unknown) => void; + onSubmit: (parsedValues: Record) => void; submitLabel?: string; - header?: React__default.ReactNode; + header?: ReactNode; } -declare function ControlledZodDynamicForm({ schema, fields, values, onChangeField, onSubmit, submitLabel, header, }: ControlledZodDynamicFormProps): react_jsx_runtime.JSX.Element; +declare function ControlledZodDynamicForm({ schema, fields, values, onChangeField, onSubmit, submitLabel, header, }: ControlledZodDynamicFormProps): JSX.Element; interface ToolbarItem { /** Whether to show/hide the item. Default is true. */ @@ -217,7 +215,7 @@ interface ToolbarItem { */ position?: 'left' | 'right'; /** The React node to render. e.g. a search input, a button, etc. */ - node: React__default.ReactNode; + node: React$1.ReactNode; } interface ColumnConfigTable { @@ -290,7 +288,47 @@ interface TableDataCustomProps { * Wraps `TableDataCustomBase` in `TableErrorBoundary` to provide a safe fallback. * Consumers should import `TableDataCustom` from the package root. */ -declare function TableDataCustom(props: TableDataCustomProps): react_jsx_runtime.JSX.Element; +declare function TableDataCustom(props: TableDataCustomProps): JSX.Element; + +type WidgetType = 'card' | 'stat' | 'progress' | 'activity' | 'chart' | 'custom'; +type WidgetId = string; +type WidgetPosition = { + x: number; + y: number; + w: number; + h: number; +}; +type BaseWidgetConfig = { + id: WidgetId; + type: WidgetType; + title?: string; + position: WidgetPosition; + props?: Record; +}; +type DashboardLayout = BaseWidgetConfig[]; +type GridConfig = { + cols: number; + rowHeight: number; + gap: number; +}; +type ChartKind = 'line' | 'bar' | 'pie'; +type ChartAdapter = { + render: (kind: ChartKind, props: Record) => JSX.Element; +}; + +type Props = { + grid: GridConfig; + widgets: DashboardLayout; + onLayoutChange?: (next: DashboardLayout) => void; + renderWidget?: (w: BaseWidgetConfig) => JSX.Element; + chartAdapter?: ChartAdapter; + enableDrag?: boolean; + enableResize?: boolean; + showActions?: boolean; +}; +declare function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapter, enableDrag, enableResize, showActions }: Props): JSX.Element; + +declare const DefaultChartAdapter: ChartAdapter; /** * Setter type used by `useLocalStorage`. @@ -308,7 +346,7 @@ declare function useLocalStorage(key: string, initialValue: T): [T, (value: S * Toggles `dark` class on `` when mode is 'dark'. * Returns `[colorMode, setColorMode]`. */ -declare const useColorMode: () => (string | ((value: SetValue) => void))[]; +declare const useColorMode: () => [string, (value: string | ((val: string) => string)) => void]; /** * Generate a compact page list for pagination controls. @@ -338,10 +376,7 @@ type UseLoginOptions = { login: (credentials: LoginCredentials) => Promise>; schema?: ZodSchema; }; -/** - * A composable login hook: manages form state, validation, submit, and loading/errors. - */ -declare function useLogin({ login, schema }: UseLoginOptions): { +type UseLoginReturn = { values: LoginCredentials; update: (key: K, value: LoginCredentials[K]) => void; submit: () => Promise>; @@ -349,6 +384,10 @@ declare function useLogin({ login, schema }: UseLoginOptions | null; }; +/** + * A composable login hook: manages form state, validation, submit, and loading/errors. + */ +declare function useLogin({ login, schema, }: UseLoginOptions): UseLoginReturn; /** * Generic registration payload. @@ -361,10 +400,7 @@ type UseRegisterOptions = { register: (payload: RegisterPayload) => Promise; schema?: ZodSchema; }; -/** - * A composable registration hook: manages form state, validation, submit, and loading/errors. - */ -declare function useRegister({ register, schema }: UseRegisterOptions): { +type UseRegisterReturn = { values: RegisterPayload; update: (key: K, value: unknown) => void; submit: () => Promise; @@ -372,6 +408,10 @@ declare function useRegister({ register, schema }: UseRegisterO error: string | null; user: TUser | null; }; +/** + * A composable registration hook: manages form state, validation, submit, and loading/errors. + */ +declare function useRegister({ register, schema, }: UseRegisterOptions): UseRegisterReturn; /** * Password reset input: allow email or username. @@ -387,10 +427,7 @@ type UsePasswordResetOptions = { reset: (input: PasswordResetInput) => Promise; schema?: ZodSchema; }; -/** - * A composable password reset hook: manages form state, validation, submit, and loading/errors. - */ -declare function usePasswordReset({ reset, schema }: UsePasswordResetOptions): { +type UsePasswordResetReturn = { values: PasswordResetInput; update: (key: K, value: PasswordResetInput[K]) => void; submit: () => Promise; @@ -398,22 +435,40 @@ declare function usePasswordReset({ reset, schema }: UsePasswordResetOptions): { error: string | null; success: boolean; }; +/** + * A composable password reset hook: manages form state, validation, submit, and loading/errors. + */ +declare function usePasswordReset({ reset, schema, }: UsePasswordResetOptions): UsePasswordResetReturn; /** * Manage ARIA live region announcements. * Returns a ref to attach to an element with `aria-live="polite"` or `assertive`. * Use `announce()` to set text content. */ -declare function useLiveRegion(): { - ref: React$1.MutableRefObject; +type LiveRegionReturn = { + ref: React.MutableRefObject; announce: (message: string) => void; }; +declare function useLiveRegion(): LiveRegionReturn; /** * Trap focus within a container element (e.g., modal) while `active`. * Adds keydown handlers to cycle focus. */ -declare function useFocusTrap(active: boolean): { - ref: React$1.MutableRefObject; +type FocusTrapReturn = { + ref: React.MutableRefObject; }; +declare function useFocusTrap(active: boolean): FocusTrapReturn; + +type RovingConfig = { + /** CSS selector for focusable items inside the container */ + selector: string; + /** Optional: initial index to focus when mounted */ + initialIndex?: number; +}; +/** + * Roving tabindex keyboard navigation for lists/menus. + * Attach to a container element; items should be focusable via `tabindex`. + */ +declare function useKeyboardNavigation(container: HTMLElement | null, { selector, initialIndex }: RovingConfig): void; -export { Breadcrumb, type BreadcrumbProps, type ColumnConfigTable, ControlledZodDynamicForm, type ControlledZodDynamicFormProps, type DashboardProps, type FieldConfigDynamicForm, type LoginCredentials, type LoginResult, type PaginationProps, type PasswordResetInput, type RegisterPayload, type SidebarActionItem, type SidebarExternalLink, type SidebarInternalLink, type SidebarItem$1 as SidebarItem, type SidebarSection, TableDataCustom, type TableDataCustomProps, Template, type TemplateFooterConfig, type TemplateLayoutConfig, type TemplateNavbarBrandConfig, type TemplateNavbarConfig, type TemplateSidebarConfig, type SidebarItem as TemplateSidebarItem, type ToolbarItem, type UseLoginOptions, type UsePasswordResetOptions, type UseRegisterOptions, type VisibilityRule, generatePageNumbers, useColorMode, useFocusTrap, useLiveRegion, useLocalStorage, useLogin, usePasswordReset, useRegister }; +export { type BaseWidgetConfig, Breadcrumb, type BreadcrumbProps, type ChartAdapter, type ChartKind, type ColumnConfigTable, ControlledZodDynamicForm, type ControlledZodDynamicFormProps, DashboardGrid, type DashboardLayout, type DashboardProps, DefaultChartAdapter, type FieldConfigDynamicForm, type GridConfig, type LoginCredentials, type LoginResult, type PaginationProps, type PasswordResetInput, type RegisterPayload, type SidebarActionItem, type SidebarExternalLink, type SidebarInternalLink, type SidebarItem$1 as SidebarItem, type SidebarSection, TableDataCustom, type TableDataCustomProps, Template, type TemplateFooterConfig, type TemplateLayoutConfig, type TemplateNavbarBrandConfig, type TemplateNavbarConfig, type TemplateSidebarConfig, type SidebarItem as TemplateSidebarItem, type ToolbarItem, type UseLoginOptions, type UsePasswordResetOptions, type UseRegisterOptions, type VisibilityRule, type WidgetPosition, type WidgetType, generatePageNumbers, useColorMode, useFocusTrap, useKeyboardNavigation, useLiveRegion, useLocalStorage, useLogin, usePasswordReset, useRegister }; diff --git a/dist/index.js b/dist/index.js index 67beb7a..bc4e598 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,4 +1,4 @@ -import React10, { useState, useEffect, useRef, useCallback, useMemo } from 'react'; +import React4, { useState, useEffect, useRef, useCallback, useMemo } from 'react'; import { useLocation, NavLink, Link as Link$1 } from 'react-router'; import { jsx, jsxs, Fragment } from 'react/jsx-runtime'; import { useT } from '@ciscode/ui-translate-core'; @@ -46,7 +46,7 @@ var __async = (__this, __arguments, generator) => { step((generator = generator.apply(__this, __arguments)).next()); }); }; -var ClickOutside = ({ children, exceptionRef, onClick, className }) => { +function ClickOutside({ children, exceptionRef, onClick, className }) { const wrapperRef = useRef(null); useEffect(() => { const handleClickListener = (event) => { @@ -64,7 +64,7 @@ var ClickOutside = ({ children, exceptionRef, onClick, className }) => { }; }, [exceptionRef, onClick]); return /* @__PURE__ */ jsx("div", { ref: wrapperRef, className: `${className || ""}`, children }); -}; +} var ClickOutside_default = ClickOutside; var DropdownMessage = () => { const [dropdownOpen, setDropdownOpen] = useState(false); @@ -570,11 +570,10 @@ var Header_default = Header; var Sidebar = ({ sidebarOpen, setSidebarOpen, sections, logo }) => { const location = useLocation(); const { pathname } = location; - useT("templateFe"); const trigger = useRef(null); const sidebar = useRef(null); const storedSidebarExpanded = localStorage.getItem("sidebar-expanded"); - const [sidebarExpanded, setSidebarExpanded] = useState(storedSidebarExpanded === "true"); + const [sidebarExpanded] = useState(storedSidebarExpanded === "true"); useEffect(() => { const handleClickOutside = (e) => { if (!sidebar.current || !trigger.current) return; @@ -618,7 +617,7 @@ var Sidebar = ({ sidebarOpen, setSidebarOpen, sections, logo }) => { `, children: [ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center px-6 py-6", children: [ - /* @__PURE__ */ jsx(NavLink, { to: "/", children: logo ? /* @__PURE__ */ jsx(Fragment, { children: logo }) : /* @__PURE__ */ jsx("div", { className: "flex h-20 w-20 items-center justify-center rounded-full bg-gray-800 text-white text-xs font-semibold tracking-wide", children: "APP-LOGO" }) }), + /* @__PURE__ */ jsx(NavLink, { to: "/", children: logo ? /* @__PURE__ */ jsx("span", { className: "contents", children: logo }) : /* @__PURE__ */ jsx("div", { className: "flex h-20 w-20 items-center justify-center rounded-full bg-gray-800 text-white text-xs font-semibold tracking-wide", children: "APP-LOGO" }) }), /* @__PURE__ */ jsx( "button", { @@ -708,7 +707,7 @@ var DashboardLayout = ({ }) }) : null, ((_e = footer == null ? void 0 : footer.preset) == null ? void 0 : _e.version) ? /* @__PURE__ */ jsx("span", { className: "ciscod-footer__version", children: footer.preset.version }) : null ] }) - ] }) }) }) : hasBlocks ? /* @__PURE__ */ jsx("footer", { className: ["ciscod-footer", (_f = footer == null ? void 0 : footer.className) != null ? _f : ""].join(" "), children: /* @__PURE__ */ jsx("div", { className: "ciscod-footer__inner", children: /* @__PURE__ */ jsx("div", { className: "ciscod-footer__content", children: footer.blocks.map((block, idx) => /* @__PURE__ */ jsx(React10.Fragment, { children: block }, idx)) }) }) }) : null + ] }) }) }) : hasBlocks ? /* @__PURE__ */ jsx("footer", { className: ["ciscod-footer", (_f = footer == null ? void 0 : footer.className) != null ? _f : ""].join(" "), children: /* @__PURE__ */ jsx("div", { className: "ciscod-footer__inner", children: /* @__PURE__ */ jsx("div", { className: "ciscod-footer__content", children: footer.blocks.map((block, idx) => /* @__PURE__ */ jsx(React4.Fragment, { children: block }, idx)) }) }) }) : null ] }) ] }) ] }) }); @@ -718,15 +717,14 @@ var Loader = () => { return /* @__PURE__ */ jsx("div", { className: "flex h-screen items-center justify-center bg-white", children: /* @__PURE__ */ jsx("div", { className: "h-16 w-16 animate-spin rounded-full border-4 border-solid border-blue-700 border-t-transparent" }) }); }; var Loader_default = Loader; -var Template = ({ +function Template({ children, sidebarContent = [], logo, onLogout, - sidebar, navbar, footer -}) => { +}) { var _a, _b, _c, _d, _e, _f; const [loading, setLoading] = useState(true); const { pathname } = useLocation(); @@ -755,7 +753,7 @@ var Template = ({ children } ); -}; +} var dashboard_default = Template; var Breadcrumb = ({ pageName }) => { const t = useT("templateFe"); @@ -832,7 +830,7 @@ function ControlledZodDynamicForm({ id: field.name, name: field.name, placeholder: field.placeholder, - value: fieldValue, + value: typeof fieldValue === "string" ? fieldValue : String(fieldValue != null ? fieldValue : ""), onChange: handleInputChange, className: "border border-gray-300 rounded-lg px-3 py-2 w-full ltr:text-left rtl:text-right" } @@ -843,7 +841,7 @@ function ControlledZodDynamicForm({ { id: field.name, name: field.name, - value: fieldValue, + value: typeof fieldValue === "string" || typeof fieldValue === "number" ? fieldValue : "", onChange: handleInputChange, className: "border border-gray-300 rounded-lg px-3 py-2 w-full ltr:text-left rtl:text-right", children: [ @@ -916,7 +914,7 @@ function ControlledZodDynamicForm({ type: field.type === "number" ? "number" : "text", step: field.step || "1", placeholder: field.placeholder, - value: fieldValue, + value: field.type === "number" ? typeof fieldValue === "number" ? fieldValue : Number(fieldValue) || 0 : typeof fieldValue === "string" ? fieldValue : String(fieldValue != null ? fieldValue : ""), onChange: handleInputChange, className: "border border-gray-300 rounded-lg px-3 py-2 w-full ltr:text-left rtl:text-right" } @@ -953,12 +951,12 @@ function findNestedErrors(allErrors, rootField) { } return nested; } -var TableErrorBoundary = class extends React10.Component { +var TableErrorBoundary = class extends React4.Component { constructor(props) { super(props); this.state = { hasError: false }; } - static getDerivedStateFromError(_) { + static getDerivedStateFromError() { return { hasError: true }; } componentDidCatch(error, errorInfo) { @@ -1142,16 +1140,13 @@ function TableDataCustomBase({ const [popover, setPopover] = useState(null); const closePopover = useCallback(() => setPopover(null), []); const [selected, setSelected] = useState(/* @__PURE__ */ new Set()); - const toggleSelectAll = useCallback( - (checked, count) => { - const next = /* @__PURE__ */ new Set(); - if (checked) { - for (let i = 0; i < count; i++) next.add(i); - } - setSelected(next); - }, - [] - ); + const toggleSelectAll = useCallback((checked, count) => { + const next = /* @__PURE__ */ new Set(); + if (checked) { + for (let i = 0; i < count; i++) next.add(i); + } + setSelected(next); + }, []); const toggleRowSelection = useCallback((index) => { setSelected((prev) => { const next = new Set(prev); @@ -1215,18 +1210,18 @@ function TableDataCustomBase({ } return rows; }, [data, columns, enableFilter, activeQuery, enableSorting, sortBy, sortDir]); - React10.useEffect(() => { + React4.useEffect(() => { if (!onSelectionChange) return; const indices = Array.from(selected.values()).sort((a, b) => a - b); const rows = indices.map((i) => visibleData[i]).filter(Boolean); onSelectionChange(rows, indices); }, [selected, visibleData, onSelectionChange]); - return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("section", { children: [ + return /* @__PURE__ */ jsxs("section", { children: [ popover && /* @__PURE__ */ jsx(TablePopover, { anchor: popover.anchor, onClose: closePopover, children: popover.content }), /* @__PURE__ */ jsx("div", { className: "mx-auto", children: /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden bg-white shadow-md dark:bg-gray-800 sm:rounded-lg", children: [ (leftItems.length > 0 || rightItems.length > 0 || enableFilter) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col px-4 py-3 space-y-3 lg:flex-row lg:items-center lg:justify-between lg:space-y-0 ltr:lg:space-x-4 rtl:lg:space-x-reverse", children: [ /* @__PURE__ */ jsxs("div", { className: "flex items-center flex-wrap gap-3", children: [ - leftItems.map((it, i) => /* @__PURE__ */ jsx(React10.Fragment, { children: it.node }, i)), + leftItems.map((it, i) => /* @__PURE__ */ jsx("span", { className: "contents", children: it.node }, i)), enableFilter && /* @__PURE__ */ jsx( "input", { @@ -1238,7 +1233,7 @@ function TableDataCustomBase({ } ) ] }), - /* @__PURE__ */ jsx("div", { className: "flex items-center flex-wrap gap-3", children: rightItems.map((it, i) => /* @__PURE__ */ jsx(React10.Fragment, { children: it.node }, i)) }) + /* @__PURE__ */ jsx("div", { className: "flex items-center flex-wrap gap-3", children: rightItems.map((it, i) => /* @__PURE__ */ jsx("span", { className: "contents", children: it.node }, i)) }) ] }), /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-sm text-gray-500 dark:text-gray-400 ltr:text-left rtl:text-right", children: [ /* @__PURE__ */ jsx("thead", { className: "text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400", children: /* @__PURE__ */ jsxs("tr", { children: [ @@ -1259,21 +1254,34 @@ function TableDataCustomBase({ title: enableSorting && col.sortable !== false ? "Sort" : void 0, children: /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [ col.title, - enableSorting && sortBy === i && /* @__PURE__ */ jsx( - "svg", - { - className: "w-3 h-3", - fill: "currentColor", - viewBox: "0 0 20 20", - children: sortDir === "asc" ? /* @__PURE__ */ jsx("path", { d: "M10 5l-5 6h10L10 5z" }) : /* @__PURE__ */ jsx("path", { d: "M10 15l5-6H5l5 6z" }) - } - ) + enableSorting && sortBy === i && /* @__PURE__ */ jsx("svg", { className: "w-3 h-3", fill: "currentColor", viewBox: "0 0 20 20", children: sortDir === "asc" ? /* @__PURE__ */ jsx("path", { d: "M10 5l-5 6h10L10 5z" }) : /* @__PURE__ */ jsx("path", { d: "M10 15l5-6H5l5 6z" }) }) ] }) }, i )) ] }) }), - /* @__PURE__ */ jsx("tbody", { children: loading ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: (enableSelection ? 1 : 0) + columns.length, className: "py-4 text-center", children: /* @__PURE__ */ jsx(TableLoader, {}) }) }) : errorMessage ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: (enableSelection ? 1 : 0) + columns.length, className: "py-4 text-center text-red-600", children: errorMessage }) }) : visibleData.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: (enableSelection ? 1 : 0) + columns.length, className: "py-4 text-center", children: t("table.noData") }) }) : visibleData.map((row, r) => /* @__PURE__ */ jsxs("tr", { className: "border-b", children: [ + /* @__PURE__ */ jsx("tbody", { children: loading ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx( + "td", + { + colSpan: (enableSelection ? 1 : 0) + columns.length, + className: "py-4 text-center", + children: /* @__PURE__ */ jsx(TableLoader, {}) + } + ) }) : errorMessage ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx( + "td", + { + colSpan: (enableSelection ? 1 : 0) + columns.length, + className: "py-4 text-center text-red-600", + children: errorMessage + } + ) }) : visibleData.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx( + "td", + { + colSpan: (enableSelection ? 1 : 0) + columns.length, + className: "py-4 text-center", + children: t("table.noData") + } + ) }) : visibleData.map((row, r) => /* @__PURE__ */ jsxs("tr", { className: "border-b", children: [ enableSelection && /* @__PURE__ */ jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx( "input", { @@ -1314,7 +1322,14 @@ function TableDataCustomBase({ content = col.render ? col.render(val, row, setPopover) : display; } } - return /* @__PURE__ */ jsx("td", { className: `px-4 py-3 ltr:text-left rtl:text-right ${(_a2 = col.cellClassName) != null ? _a2 : ""}`, children: content }, c); + return /* @__PURE__ */ jsx( + "td", + { + className: `px-4 py-3 ltr:text-left rtl:text-right ${(_a2 = col.cellClassName) != null ? _a2 : ""}`, + children: content + }, + c + ); }) ] }, r)) }) ] }) }), @@ -1344,22 +1359,14 @@ function TableDataCustomBase({ className: "flex items-center justify-center h-full py-1.5 px-3 ml-0 text-gray-500 bg-white rounded-l-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white", children: [ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("table.pagination.previous") }), - /* @__PURE__ */ jsx( - "svg", + /* @__PURE__ */ jsx("svg", { className: "w-5 h-5 rtl:rotate-180", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ jsx( + "path", { - className: "w-5 h-5 rtl:rotate-180", - fill: "currentColor", - viewBox: "0 0 20 20", - children: /* @__PURE__ */ jsx( - "path", - { - fillRule: "evenodd", - clipRule: "evenodd", - d: document.dir === "rtl" ? "M7.293 14.707a1 1 0 010-1.414L10.586 10l-3.293-3.293a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" : "M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" - } - ) + fillRule: "evenodd", + clipRule: "evenodd", + d: document.dir === "rtl" ? "M7.293 14.707a1 1 0 010-1.414L10.586 10l-3.293-3.293a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" : "M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" } - ) + ) }) ] } ) }), @@ -1387,22 +1394,14 @@ function TableDataCustomBase({ className: "flex items-center justify-center h-full py-1.5 px-3 leading-tight text-gray-500 bg-white rounded-r-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white", children: [ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("table.pagination.next") }), - /* @__PURE__ */ jsx( - "svg", + /* @__PURE__ */ jsx("svg", { className: "w-5 h-5 rtl:rotate-180", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ jsx( + "path", { - className: "w-5 h-5 rtl:rotate-180", - fill: "currentColor", - viewBox: "0 0 20 20", - children: /* @__PURE__ */ jsx( - "path", - { - fillRule: "evenodd", - clipRule: "evenodd", - d: document.dir === "rtl" ? "M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" : "M7.293 14.707a1 1 0 010-1.414L10.586 10l-3.293-3.293a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" - } - ) + fillRule: "evenodd", + clipRule: "evenodd", + d: document.dir === "rtl" ? "M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" : "M7.293 14.707a1 1 0 010-1.414L10.586 10l-3.293-3.293a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" } - ) + ) }) ] } ) }) @@ -1411,14 +1410,387 @@ function TableDataCustomBase({ } ) ] }) }) - ] }) }); + ] }); } var TableDataCustomBase_default = TableDataCustomBase; function TableDataCustom(props) { return /* @__PURE__ */ jsx(TableErrorBoundary_default, { children: /* @__PURE__ */ jsx(TableDataCustomBase_default, __spreadValues({}, props)) }); } var TableDataCustom_default = TableDataCustom; -function useLogin({ login, schema }) { +function WidgetContainer({ title, children, onStartDrag, onStartResize, onStartResizeEast, onStartResizeSouth, onStartResizeSouthEast, draggable = true, resizable = true, onRemove, onDuplicate }) { + const headerRef = useRef(null); + return /* @__PURE__ */ jsxs("div", { className: "relative rounded-lg border border-gray-200 bg-white dark:bg-gray-800 shadow-sm overflow-hidden", children: [ + /* @__PURE__ */ jsxs( + "div", + { + ref: headerRef, + className: "flex items-center justify-between px-3 py-2 border-b border-gray-100 dark:border-gray-700 select-none " + (draggable ? "cursor-grab" : "cursor-default"), + style: { touchAction: "none" }, + onPointerDown: (e) => { + if (e.shiftKey && resizable && onStartResize) return onStartResize(e); + if (draggable) onStartDrag == null ? void 0 : onStartDrag(e); + }, + children: [ + /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-200", children: title }), + /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [ + typeof onDuplicate === "function" ? /* @__PURE__ */ jsx( + "button", + { + type: "button", + className: "inline-flex items-center justify-center w-6 h-6 text-xs rounded bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600 text-gray-700 dark:text-gray-200", + onClick: onDuplicate, + onPointerDown: (e) => e.stopPropagation(), + "aria-label": "Duplicate widget", + title: "Duplicate", + children: "\u29C9" + } + ) : null, + typeof onRemove === "function" ? /* @__PURE__ */ jsx( + "button", + { + type: "button", + className: "inline-flex items-center justify-center w-6 h-6 text-xs rounded bg-red-100 hover:bg-red-200 dark:bg-red-800/40 dark:hover:bg-red-700/50 text-red-700 dark:text-red-200", + onClick: onRemove, + onPointerDown: (e) => e.stopPropagation(), + "aria-label": "Remove widget", + title: "Remove", + children: "\xD7" + } + ) : null, + resizable ? /* @__PURE__ */ jsx( + "div", + { + className: "shrink-0 w-4 h-4 rounded bg-gray-300 dark:bg-gray-600 cursor-se-resize", + style: { touchAction: "none" }, + onPointerDown: onStartResize, + "aria-label": "Resize", + title: "Resize" + } + ) : null + ] }) + ] + } + ), + /* @__PURE__ */ jsx("div", { className: "p-3", children }), + resizable ? /* @__PURE__ */ jsxs(Fragment, { children: [ + /* @__PURE__ */ jsx( + "div", + { + className: "absolute top-0 right-0 h-full w-1 cursor-ew-resize", + style: { touchAction: "none" }, + onPointerDown: (e) => { + e.stopPropagation(); + onStartResizeEast == null ? void 0 : onStartResizeEast(e); + }, + "aria-label": "Resize east" + } + ), + /* @__PURE__ */ jsx( + "div", + { + className: "absolute bottom-0 left-0 w-full h-1 cursor-ns-resize", + style: { touchAction: "none" }, + onPointerDown: (e) => { + e.stopPropagation(); + onStartResizeSouth == null ? void 0 : onStartResizeSouth(e); + }, + "aria-label": "Resize south" + } + ), + /* @__PURE__ */ jsx( + "div", + { + className: "absolute bottom-0 right-0 w-3 h-3 cursor-se-resize", + style: { touchAction: "none" }, + onPointerDown: (e) => { + e.stopPropagation(); + onStartResizeSouthEast == null ? void 0 : onStartResizeSouthEast(e); + }, + "aria-label": "Resize south-east" + } + ) + ] }) : null + ] }); +} + +// src/components/Dashboard/Widgets/layoutUtils.ts +function clamp(value, min, max) { + return Math.max(min, Math.min(max, value)); +} +function roundToCell(px, cell) { + return Math.round(px / cell); +} +function positionToStyle(pos) { + return { + gridColumnStart: pos.x + 1, + gridColumnEnd: pos.x + 1 + pos.w, + gridRowStart: pos.y + 1, + gridRowEnd: pos.y + 1 + pos.h + }; +} +function intersects(a, b) { + const ax2 = a.x + a.w; + const ay2 = a.y + a.h; + const bx2 = b.x + b.w; + const by2 = b.y + b.h; + const noOverlap = ax2 <= b.x || bx2 <= a.x || ay2 <= b.y || by2 <= a.y; + return !noOverlap; +} +var DefaultChartAdapter = { + render(kind, props) { + switch (kind) { + case "bar": + return renderBar(props); + case "line": + return renderLine(props); + case "pie": + return renderPie(props); + default: + return /* @__PURE__ */ jsx("div", { className: "text-xs text-gray-500 dark:text-gray-400", children: "Unknown chart kind" }); + } + } +}; +function coerceNumbers(value) { + if (Array.isArray(value)) { + return value.map((v) => typeof v === "number" ? v : Number(v)).filter((v) => !Number.isNaN(v)); + } + return []; +} +function renderBar(props) { + const data = coerceNumbers(props.data); + const width = typeof props.width === "number" ? props.width : 300; + const height = typeof props.height === "number" ? props.height : 120; + const padding = 16; + const max = Math.max(1, ...data); + const barWidth = (width - padding * 2) / Math.max(1, data.length); + const color = typeof props.color === "string" ? props.color : "#4f46e5"; + return /* @__PURE__ */ jsx("svg", { width, height, role: "img", "aria-label": "Bar chart", children: data.map((v, i) => { + const h = (height - padding * 2) * v / max; + const x = padding + i * barWidth + barWidth * 0.1; + const y = height - padding - h; + return /* @__PURE__ */ jsx("rect", { x, y, width: barWidth * 0.8, height: h, fill: color, rx: 2 }, i); + }) }); +} +function renderLine(props) { + const data = coerceNumbers(props.data); + const width = typeof props.width === "number" ? props.width : 300; + const height = typeof props.height === "number" ? props.height : 120; + const padding = 16; + const max = Math.max(1, ...data); + const color = typeof props.color === "string" ? props.color : "#16a34a"; + const points = data.map((v, i) => { + const x = padding + i * ((width - padding * 2) / Math.max(1, data.length - 1)); + const y = height - padding - (height - padding * 2) * v / max; + return `${x},${y}`; + }); + return /* @__PURE__ */ jsx("svg", { width, height, role: "img", "aria-label": "Line chart", children: /* @__PURE__ */ jsx("polyline", { points: points.join(" "), fill: "none", stroke: color, strokeWidth: 2 }) }); +} +function renderPie(props) { + const data = coerceNumbers(props.data); + const size = typeof props.size === "number" ? props.size : 120; + const radius = size / 2; + const total = data.reduce((acc, v) => acc + v, 0) || 1; + const colors = Array.isArray(props.colors) ? props.colors : ["#f97316", "#22c55e", "#3b82f6", "#e11d48"]; + let startAngle = 0; + const slices = data.map((v, i) => { + const angle = v / total * Math.PI * 2; + const x1 = radius + radius * Math.cos(startAngle); + const y1 = radius + radius * Math.sin(startAngle); + const x2 = radius + radius * Math.cos(startAngle + angle); + const y2 = radius + radius * Math.sin(startAngle + angle); + const largeArc = angle > Math.PI ? 1 : 0; + const path = `M ${radius},${radius} L ${x1},${y1} A ${radius},${radius} 0 ${largeArc} 1 ${x2},${y2} z`; + startAngle += angle; + return /* @__PURE__ */ jsx("path", { d: path, fill: colors[i % colors.length] }, i); + }); + return /* @__PURE__ */ jsx("svg", { width: size, height: size, role: "img", "aria-label": "Pie chart", children: slices }); +} +function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapter, enableDrag = true, enableResize = true, showActions = true }) { + const containerRef = useRef(null); + const [layout, setLayout] = useState(widgets); + const [drag, setDrag] = useState(null); + function commitLayout(next) { + setLayout(next); + onLayoutChange == null ? void 0 : onLayoutChange(next); + } + function removeWidget(id) { + const next = layout.filter((w) => w.id !== id); + commitLayout(next); + } + function duplicateWidget(id) { + const idx = findById(id); + if (idx === -1) return; + const src = layout[idx]; + let copyIndex = 2; + let newId = `${src.id}-copy`; + while (layout.some((w) => w.id === newId)) { + newId = `${src.id}-copy-${copyIndex++}`; + } + const rectPos = __spreadValues({}, src.position); + let candidate = __spreadProps(__spreadValues({}, rectPos), { x: Math.min(rectPos.x + rectPos.w, grid.cols - rectPos.w) }); + if (layout.some((w, i) => i !== idx && intersects(candidate, w.position))) { + candidate = __spreadProps(__spreadValues({}, rectPos), { y: rectPos.y + rectPos.h }); + } + const isFree = (pos) => !layout.some((w) => intersects(pos, w.position)); + if (!isFree(candidate)) { + let found = false; + for (let y = 0; y < 100 && !found; y++) { + for (let x = 0; x <= grid.cols - rectPos.w && !found; x++) { + const pos = { x, y, w: rectPos.w, h: rectPos.h }; + if (isFree(pos)) { + candidate = pos; + found = true; + } + } + } + } + const copy = __spreadProps(__spreadValues({}, src), { id: newId, position: candidate }); + const next = [...layout, copy]; + commitLayout(next); + } + function findById(id) { + return layout.findIndex((w) => w.id === id); + } + function startDrag(id, mode, edge) { + return (e) => { + var _a, _b; + if (mode === "move" && !enableDrag) return; + if (mode === "resize" && !enableResize) return; + const rect = (_a = containerRef.current) == null ? void 0 : _a.getBoundingClientRect(); + if (!rect) return; + const idx = findById(id); + if (idx === -1) return; + const pos = layout[idx].position; + (_b = containerRef.current) == null ? void 0 : _b.setPointerCapture(e.pointerId); + setDrag({ id, startX: e.clientX - rect.left, startY: e.clientY - rect.top, origPos: __spreadValues({}, pos), mode, edge }); + }; + } + function onPointerMove(e) { + var _a, _b; + if (!drag) return; + const rect = (_a = containerRef.current) == null ? void 0 : _a.getBoundingClientRect(); + if (!rect) return; + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + const dx = x - drag.startX; + const dy = y - drag.startY; + const colWidth = (rect.width - (grid.cols - 1) * grid.gap) / grid.cols; + const deltaCols = roundToCell(dx, colWidth); + const deltaRows = roundToCell(dy, grid.rowHeight); + const idx = findById(drag.id); + if (idx === -1) return; + const current = layout[idx]; + let nextPos = __spreadValues({}, drag.origPos); + if (drag.mode === "move") { + nextPos.x = clamp(drag.origPos.x + deltaCols, 0, grid.cols - drag.origPos.w); + nextPos.y = Math.max(0, drag.origPos.y + deltaRows); + } else { + const edge = (_b = drag.edge) != null ? _b : "se"; + if (edge.includes("e")) { + nextPos.w = clamp(drag.origPos.w + deltaCols, 1, grid.cols - drag.origPos.x); + } + if (edge.includes("s")) { + nextPos.h = Math.max(1, drag.origPos.h + deltaRows); + } + if (edge.includes("w")) { + const newX = clamp(drag.origPos.x + deltaCols, 0, drag.origPos.x + drag.origPos.w - 1); + const deltaX = newX - drag.origPos.x; + nextPos.x = newX; + nextPos.w = Math.max(1, drag.origPos.w - deltaX); + } + if (edge.includes("n")) { + const newY = Math.max(0, drag.origPos.y + deltaRows); + const deltaY = newY - drag.origPos.y; + nextPos.y = newY; + nextPos.h = Math.max(1, drag.origPos.h - deltaY); + } + } + const collides = layout.some((w, i) => i !== idx && intersects(nextPos, w.position)); + if (collides) return; + const next = [...layout]; + next[idx] = __spreadProps(__spreadValues({}, current), { position: nextPos }); + setLayout(next); + } + function onPointerUp(e) { + var _a; + if (!drag) return; + (_a = containerRef.current) == null ? void 0 : _a.releasePointerCapture(e.pointerId); + commitLayout(layout); + setDrag(null); + } + return /* @__PURE__ */ jsx( + "div", + { + ref: containerRef, + className: "grid", + style: { + gridTemplateColumns: `repeat(${grid.cols}, minmax(0, 1fr))`, + gridAutoRows: `${grid.rowHeight}px`, + gap: `${grid.gap}px` + }, + onPointerMove, + onPointerUp, + children: layout.map((w) => /* @__PURE__ */ jsx("div", { style: positionToStyle(w.position), children: /* @__PURE__ */ jsx( + WidgetContainer, + { + title: w.title, + draggable: enableDrag, + resizable: enableResize, + onStartDrag: enableDrag ? startDrag(w.id, "move") : void 0, + onStartResize: enableResize ? startDrag(w.id, "resize", "se") : void 0, + onStartResizeEast: enableResize ? startDrag(w.id, "resize", "e") : void 0, + onStartResizeSouth: enableResize ? startDrag(w.id, "resize", "s") : void 0, + onStartResizeSouthEast: enableResize ? startDrag(w.id, "resize", "se") : void 0, + onRemove: showActions ? () => removeWidget(w.id) : void 0, + onDuplicate: showActions ? () => duplicateWidget(w.id) : void 0, + children: renderWidget ? renderWidget(w) : /* @__PURE__ */ jsx(DefaultWidgetRenderer, { widget: w, chartAdapter }) + } + ) }, w.id)) + } + ); +} +function DefaultWidgetRenderer({ widget, chartAdapter }) { + var _a, _b, _c, _d; + const { type, props } = widget; + switch (type) { + case "card": + return /* @__PURE__ */ jsx("div", { className: "text-sm text-gray-700 dark:text-gray-200", children: String((_a = props == null ? void 0 : props.content) != null ? _a : "Card") }); + case "stat": + return /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-2", children: [ + /* @__PURE__ */ jsx("span", { className: "text-2xl font-semibold text-gray-900 dark:text-white", children: String((_b = props == null ? void 0 : props.value) != null ? _b : "0") }), + /* @__PURE__ */ jsx("span", { className: "text-xs text-gray-500 dark:text-gray-400", children: String((_c = props == null ? void 0 : props.label) != null ? _c : "Stat") }) + ] }); + case "progress": { + const v = typeof (props == null ? void 0 : props.value) === "number" ? props.value : 0; + return /* @__PURE__ */ jsxs("div", { className: "w-full", children: [ + /* @__PURE__ */ jsx("div", { className: "h-2 bg-gray-200 dark:bg-gray-700 rounded", children: /* @__PURE__ */ jsx("div", { className: "h-2 bg-indigo-600 rounded", style: { width: `${clamp(v, 0, 100)}%` } }) }), + /* @__PURE__ */ jsxs("div", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400", children: [ + v, + "%" + ] }) + ] }); + } + case "activity": { + const items = Array.isArray(props == null ? void 0 : props.items) ? props.items : []; + return /* @__PURE__ */ jsxs("ul", { className: "space-y-1 text-sm text-gray-700 dark:text-gray-200", children: [ + items.length === 0 ? /* @__PURE__ */ jsx("li", { className: "text-gray-500 dark:text-gray-400", children: "No activity" }) : null, + items.map((it, i) => /* @__PURE__ */ jsx("li", { children: String(it) }, i)) + ] }); + } + case "chart": { + const kind = (_d = props == null ? void 0 : props.kind) != null ? _d : "line"; + const adapter = chartAdapter != null ? chartAdapter : DefaultChartAdapter; + return adapter.render(kind, props != null ? props : {}); + } + case "custom": + default: + return /* @__PURE__ */ jsx("div", { className: "text-sm text-gray-500 dark:text-gray-400", children: "Provide a custom renderer." }); + } +} +function useLogin({ + login, + schema +}) { const [values, setValues] = useState({ username: "", password: "" }); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -1428,7 +1800,6 @@ function useLogin({ login, schema }) { } function submit() { return __async(this, null, function* () { - var _a; setError(null); setLoading(true); try { @@ -1437,7 +1808,8 @@ function useLogin({ login, schema }) { setResult(res); return res; } catch (e) { - setError((_a = e == null ? void 0 : e.message) != null ? _a : "Login failed"); + const message = e instanceof Error ? e.message : "Login failed"; + setError(message); throw e; } finally { setLoading(false); @@ -1447,7 +1819,10 @@ function useLogin({ login, schema }) { return { values, update, submit, loading, error, result }; } var useLogin_default = useLogin; -function useRegister({ register, schema }) { +function useRegister({ + register, + schema +}) { const [values, setValues] = useState({}); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -1457,7 +1832,6 @@ function useRegister({ register, schema }) { } function submit() { return __async(this, null, function* () { - var _a; setError(null); setLoading(true); try { @@ -1466,7 +1840,8 @@ function useRegister({ register, schema }) { setUser(res); return res; } catch (e) { - setError((_a = e == null ? void 0 : e.message) != null ? _a : "Registration failed"); + const message = e instanceof Error ? e.message : "Registration failed"; + setError(message); throw e; } finally { setLoading(false); @@ -1476,7 +1851,10 @@ function useRegister({ register, schema }) { return { values, update, submit, loading, error, user }; } var useRegister_default = useRegister; -function usePasswordReset({ reset, schema }) { +function usePasswordReset({ + reset, + schema +}) { const [values, setValues] = useState({ email: "" }); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -1486,7 +1864,6 @@ function usePasswordReset({ reset, schema }) { } function submit() { return __async(this, null, function* () { - var _a; setError(null); setSuccess(false); setLoading(true); @@ -1495,7 +1872,8 @@ function usePasswordReset({ reset, schema }) { yield reset(input); setSuccess(true); } catch (e) { - setError((_a = e == null ? void 0 : e.message) != null ? _a : "Password reset failed"); + const message = e instanceof Error ? e.message : "Password reset failed"; + setError(message); throw e; } finally { setLoading(false); @@ -1551,8 +1929,33 @@ function useFocusTrap(active) { }, [active]); return { ref }; } -var useKeyboardNavigation_default = void 0; +function useKeyboardNavigation(container, { selector, initialIndex = 0 }) { + useEffect(() => { + if (!container) return; + const items = Array.from(container.querySelectorAll(selector)); + if (items.length === 0) return; + items.forEach((el, i) => el.setAttribute("tabindex", i === initialIndex ? "0" : "-1")); + function onKeyDown(e) { + const currentIndex = items.findIndex((el) => el === document.activeElement); + if (e.key === "ArrowRight" || e.key === "ArrowDown") { + const next = items[(currentIndex + 1 + items.length) % items.length]; + items.forEach((el) => el.setAttribute("tabindex", "-1")); + next.setAttribute("tabindex", "0"); + next.focus(); + e.preventDefault(); + } else if (e.key === "ArrowLeft" || e.key === "ArrowUp") { + const prev = items[(currentIndex - 1 + items.length) % items.length]; + items.forEach((el) => el.setAttribute("tabindex", "-1")); + prev.setAttribute("tabindex", "0"); + prev.focus(); + e.preventDefault(); + } + } + container.addEventListener("keydown", onKeyDown); + return () => container.removeEventListener("keydown", onKeyDown); + }, [container, selector, initialIndex]); +} -export { Breadcrumb_default as Breadcrumb, ControlledZodDynamicForm, TableDataCustom_default as TableDataCustom, dashboard_default as Template, generatePageNumbers, useColorMode_default as useColorMode, useFocusTrap, useKeyboardNavigation_default as useKeyboardNavigation, useLiveRegion, useLocalStorage_default as useLocalStorage, useLogin_default as useLogin, usePasswordReset_default as usePasswordReset, useRegister_default as useRegister }; +export { Breadcrumb_default as Breadcrumb, ControlledZodDynamicForm, DashboardGrid, DefaultChartAdapter, TableDataCustom_default as TableDataCustom, dashboard_default as Template, generatePageNumbers, useColorMode_default as useColorMode, useFocusTrap, useKeyboardNavigation, useLiveRegion, useLocalStorage_default as useLocalStorage, useLogin_default as useLogin, usePasswordReset_default as usePasswordReset, useRegister_default as useRegister }; //# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 9238a44..5ffdc1e 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/components/Dashboard/ClickOutside.tsx","../src/components/Dashboard/Header/DropdownMessage.tsx","../src/components/Dashboard/Header/DropdownNotification.tsx","../src/components/Dashboard/Header/DropdownUser.tsx","../src/hooks/useLocalStorage.tsx","../src/hooks/useColorMode.tsx","../src/components/Dashboard/Header/DarkModeSwitcher.tsx","../src/components/Dashboard/Header/index.tsx","../src/components/Dashboard/Sidebar/index.tsx","../src/layout/DashboardLayout.tsx","../src/common/Loader/index.tsx","../src/main/dashboard.tsx","../src/components/Breadcrumbs/Breadcrumb.tsx","../src/components/Form/ZodDynamicForm.tsx","../src/exceptions/TableErrorBoundary.tsx","../src/hooks/useGeneratePageNumbers.tsx","../src/common/Loader/TableLoader.tsx","../src/components/Table/TablePopover.tsx","../src/components/Table/TableDataCustomBase.tsx","../src/components/Table/TableDataCustom.tsx","../src/hooks/useLogin.tsx","../src/hooks/useRegister.ts","../src/hooks/usePasswordReset.tsx","../src/hooks/useA11y.ts","../src/hooks/useKeyboardNavigation.ts"],"names":["jsx","Link","useState","useT","jsxs","useEffect","useRef","_a","React","useLocation","Fragment","current"],"mappings":"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","file":"index.js","sourcesContent":["import React, { useRef, useEffect } from 'react';\n\ninterface Props {\n children: React.ReactNode;\n exceptionRef?: React.RefObject;\n onClick: () => void;\n className?: string;\n}\n\nconst ClickOutside: React.FC = ({ children, exceptionRef, onClick, className }) => {\n const wrapperRef = useRef(null);\n\n useEffect(() => {\n const handleClickListener = (event: MouseEvent) => {\n let clickedInside: null | boolean = false;\n if (exceptionRef) {\n clickedInside =\n (wrapperRef.current && wrapperRef.current.contains(event.target as Node)) ||\n (exceptionRef.current && exceptionRef.current === event.target) ||\n (exceptionRef.current && exceptionRef.current.contains(event.target as Node));\n } else {\n clickedInside = wrapperRef.current && wrapperRef.current.contains(event.target as Node);\n }\n\n if (!clickedInside) onClick();\n };\n\n document.addEventListener('mousedown', handleClickListener);\n\n return () => {\n document.removeEventListener('mousedown', handleClickListener);\n };\n }, [exceptionRef, onClick]);\n\n return (\n
    \n {children}\n
    \n );\n};\n\nexport default ClickOutside;\n","import React, { useState } from 'react';\nimport { Link } from 'react-router';\nimport ClickOutside from '../ClickOutside';\nimport { useT } from '@ciscode/ui-translate-core';\n\nconst DropdownMessage: React.FC = () => {\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [notifying, setNotifying] = useState(true);\n const t = useT('templateFe');\n\n // Example dynamic data; replace with your real data source\n const messages = [\n { id: 1, user: 'Mariya Desoja', text: 'I like your confidence 💪', time: '2min ago' },\n { id: 2, user: 'Robert Jhon', text: 'Can you share your offer?', time: '10min ago' },\n { id: 3, user: 'Henry Dholi', text: 'I came across your profile and...', time: '1day ago' },\n { id: 4, user: 'Cody Fisher', text: 'I’m waiting for your response!', time: '5days ago' },\n { id: 5, user: 'Mariya Desoja', text: 'I like your confidence 💪', time: '2min ago' },\n ];\n\n return (\n setDropdownOpen(false)} className=\"relative\">\n
  • \n {\n setNotifying(false);\n setDropdownOpen(!dropdownOpen);\n }}\n className=\"relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white\"\n to=\"#\"\n >\n \n \n \n\n \n \n \n \n \n \n \n\n {dropdownOpen && (\n
    \n
    \n
    {t('dropdown.messages')}
    \n
    \n\n
      \n {messages.map(({ id, user, text, time }) => (\n
    • \n \n
      \n {user}\n
      \n\n
      \n
      {user}
      \n

      {text}

      \n

      {time}

      \n
      \n \n
    • \n ))}\n
    \n
    \n )}\n
  • \n
    \n );\n};\n\nexport default DropdownMessage;\n","import React, { useState } from 'react';\nimport ClickOutside from '../ClickOutside';\nimport { Link } from 'react-router';\nimport { useT } from '@ciscode/ui-translate-core';\n\ninterface NotificationItem {\n id: number;\n title: string;\n description: string;\n time: string;\n}\n\nconst DropdownNotification: React.FC = () => {\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [notifying, setNotifying] = useState(true);\n const t = useT('templateFe');\n\n const notifications: NotificationItem[] = [\n {\n id: 1,\n title: 'Edit your information in a swipe',\n description:\n 'Sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim.',\n time: '12 May, 2025',\n },\n {\n id: 2,\n title: 'It is a long established fact',\n description: 'that a reader will be distracted by the readable.',\n time: '24 Feb, 2025',\n },\n {\n id: 3,\n title: 'There are many variations',\n description: 'of passages of Lorem Ipsum available, but the majority have suffered',\n time: '04 Jan, 2025',\n },\n {\n id: 4,\n title: 'There are many variations',\n description: 'of passages of Lorem Ipsum available, but the majority have suffered',\n time: '01 Dec, 2024',\n },\n ];\n\n return (\n setDropdownOpen(false)} className=\"relative\">\n
  • \n {\n setNotifying(false);\n setDropdownOpen(!dropdownOpen);\n }}\n to=\"#\"\n className=\"relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white\"\n >\n \n \n \n\n \n \n \n \n\n {dropdownOpen && (\n
    \n
    \n
    {t('dropdown.notifications')}
    \n
    \n\n
      \n {notifications.map(({ id, title, description, time }) => (\n
    • \n \n

      \n {title} {description}\n

      \n

      {time}

      \n \n
    • \n ))}\n
    \n
    \n )}\n
  • \n
    \n );\n};\n\nexport default DropdownNotification;\n","import { useState } from 'react';\nimport ClickOutside from '../ClickOutside';\nimport React from 'react';\nimport { Link } from 'react-router';\nimport { useT } from '@ciscode/ui-translate-core';\n\ntype DropdownUserProps = {\n onLogout?: () => void;\n};\n\nconst DropdownUser: React.FC = ({ onLogout }) => {\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const t = useT('templateFe');\n const role = 'superAdmin'; // or from user data\n const translatedRole = t(`roles.${role}`, { defaultValue: role });\n console.log('DROPDOWN RENDER onLogout =', onLogout);\n\n return (\n setDropdownOpen(false)} className=\"relative\">\n setDropdownOpen(!dropdownOpen)}\n className=\"flex items-center gap-4\"\n to=\"#\"\n >\n \n Thomas Anree\n {translatedRole}\n \n\n \n \n \n\n {/* Chevron (valid SVG) */}\n \n \n \n \n\n {dropdownOpen && (\n
    \n
      \n
    • \n setDropdownOpen(false)}\n >\n {/* placeholder icon to keep alignment */}\n \n {t('dropdown.profile')}\n \n
    • \n\n
    • \n \n \n {t('dropdown.contacts')}\n \n
    • \n\n
    • \n setDropdownOpen(false)}\n >\n \n {t('dropdown.settings')}\n \n
    • \n
    \n\n {\n console.log('DROPDOWN LOGOUT CLICKED, onLogout =', onLogout);\n setDropdownOpen(false);\n onLogout?.();\n }}\n className=\"flex items-center gap-3.5 px-6 py-4 text-sm font-medium duration-300 ease-in-out hover:text-primary lg:text-base\"\n >\n \n {t('dropdown.logout')}\n \n
    \n )}\n
    \n );\n};\n\nexport default DropdownUser;\n","import { useEffect, useState } from 'react';\n\n/**\n * Setter type used by `useLocalStorage`.\n * Accepts a direct value or an updater function.\n */\nexport type SetValue = T | ((val: T) => T);\n\n/**\n * A typed hook that syncs a stateful value with `window.localStorage`.\n * Returns a tuple `[value, setValue]` similar to `useState`.\n */\nfunction useLocalStorage(key: string, initialValue: T): [T, (value: SetValue) => void] {\n // State to store our value\n // Pass initial state function to useState so logic is only executed once\n const [storedValue, setStoredValue] = useState(() => {\n try {\n // Get from local storage by key\n const item = window.localStorage.getItem(key);\n // Parse stored json or if none return initialValue\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n // If error also return initialValue\n console.log(error);\n return initialValue;\n }\n });\n\n // useEffect to update local storage when the state changes\n useEffect(() => {\n try {\n // Persist the current value to localStorage\n window.localStorage.setItem(key, JSON.stringify(storedValue));\n } catch (error) {\n // A more advanced implementation would handle the error case\n console.log(error);\n }\n }, [key, storedValue]);\n\n return [storedValue, setStoredValue];\n}\n\nexport default useLocalStorage;\n","import { useEffect } from 'react';\nimport useLocalStorage from './useLocalStorage';\n\n/**\n * Persisted color mode hook.\n * Toggles `dark` class on `` when mode is 'dark'.\n * Returns `[colorMode, setColorMode]`.\n */\nconst useColorMode = () => {\n const [colorMode, setColorMode] = useLocalStorage('color-theme', 'light');\n\n useEffect(() => {\n const className = 'dark';\n const bodyClass = window.document.body.classList;\n\n if (colorMode === 'dark') {\n bodyClass.add(className);\n } else {\n bodyClass.remove(className);\n }\n }, [colorMode]);\n\n return [colorMode, setColorMode];\n};\n\nexport default useColorMode;\n","import React from 'react';\nimport useColorMode from '../../../hooks/useColorMode';\n\nconst DarkModeSwitcher: React.FC = () => {\n const [colorMode, setColorMode] = useColorMode();\n\n return (\n
  • \n \n \n typeof setColorMode === 'function' &&\n setColorMode(colorMode === 'light' ? 'dark' : 'light')\n }\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
  • \n );\n};\n\nexport default DarkModeSwitcher;\n","import DropdownMessage from './DropdownMessage';\nimport DropdownNotification from './DropdownNotification';\nimport DropdownUser from './DropdownUser';\n// import LogoIcon from '../../../assets/images/logo/logo-icon.svg';\nimport DarkModeSwitcher from './DarkModeSwitcher';\nimport React from 'react';\nimport { useT } from '@ciscode/ui-translate-core';\n\nconst Header = (props: {\n sidebarOpen: string | boolean | undefined;\n setSidebarOpen: (arg0: boolean) => void;\n onLogout?: () => void;\n}) => {\n const t = useT('templateFe');\n console.log('HEADER onLogout prop =', props.onLogout);\n\n return (\n
    \n
    \n
    \n {/* */}\n {\n e.stopPropagation();\n props.setSidebarOpen(!props.sidebarOpen);\n }}\n className=\"z-99999 block rounded-sm border border-stroke bg-white p-1.5 shadow-sm dark:border-strokedark dark:bg-boxdark lg:hidden\"\n >\n \n \n \n \n \n \n \n \n \n \n \n \n {/* */}\n
    \n\n
    \n
    \n
    \n \n\n \n
    \n
    \n
    \n\n
    \n
      \n {/* */}\n \n {/* */}\n\n {/* */}\n \n {/* */}\n\n {/* */}\n \n {/* */}\n
    \n\n {/* */}\n \n {/* */}\n
    \n
    \n
    \n );\n};\n\nexport default Header;\n","import React, { useEffect, useRef, useState, ReactNode } from 'react';\nimport { useLocation, NavLink } from 'react-router';\nimport SidebarLinkGroup from './SidebarLinkGroup';\nimport { SidebarSection } from '../../../models/SidebarItemModel';\nimport { useT } from '@ciscode/ui-translate-core';\n\ninterface SidebarProps {\n sidebarOpen: boolean;\n setSidebarOpen: (arg: boolean) => void;\n sections: SidebarSection[];\n logo?: ReactNode;\n}\n\nconst Sidebar = ({ sidebarOpen, setSidebarOpen, sections, logo }: SidebarProps) => {\n const location = useLocation();\n const { pathname } = location;\n const t = useT('templateFe');\n\n const trigger = useRef(null);\n const sidebar = useRef(null);\n\n const storedSidebarExpanded = localStorage.getItem('sidebar-expanded');\n const [sidebarExpanded, setSidebarExpanded] = useState(storedSidebarExpanded === 'true');\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (!sidebar.current || !trigger.current) return;\n if (\n !sidebarOpen ||\n sidebar.current.contains(e.target as Node) ||\n trigger.current.contains(e.target as Node)\n ) {\n return;\n }\n setSidebarOpen(false);\n };\n document.addEventListener('click', handleClickOutside);\n return () => document.removeEventListener('click', handleClickOutside);\n }, [sidebarOpen, setSidebarOpen]);\n\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (!sidebarOpen || e.key !== 'Escape') return;\n setSidebarOpen(false);\n };\n document.addEventListener('keydown', handleEsc);\n return () => document.removeEventListener('keydown', handleEsc);\n }, [sidebarOpen, setSidebarOpen]);\n\n useEffect(() => {\n localStorage.setItem('sidebar-expanded', sidebarExpanded.toString());\n if (sidebarExpanded) {\n document.body.classList.add('sidebar-expanded');\n } else {\n document.body.classList.remove('sidebar-expanded');\n }\n }, [sidebarExpanded]);\n\n const sortedSections = [...sections].sort((a, b) => (a.order ?? 9999) - (b.order ?? 9999));\n\n return (\n \n {/* SIDEBAR HEADER */}\n
    \n \n {logo ? (\n <>{logo}\n ) : (\n
    \n APP-LOGO\n
    \n )}\n
    \n\n setSidebarOpen(!sidebarOpen)}\n className=\"ml-3 block lg:hidden\"\n >\n \n \n \n \n
    \n {/* END SIDEBAR HEADER */}\n\n
    \n \n
    \n \n );\n};\n\nexport default Sidebar;\n","import React, { useState, ReactNode } from 'react';\nimport Header from '../components/Dashboard/Header/index';\nimport Sidebar from '../components/Dashboard/Sidebar/index';\nimport { SidebarSection } from '../models/SidebarItemModel';\n\ntype FooterLink = {\n label: string;\n href: string;\n newTab?: boolean;\n};\n\ninterface DashboardLayoutProps {\n children: ReactNode;\n sidebarContent: SidebarSection[];\n logo: ReactNode;\n onLogout?: () => void;\n\n footer?: {\n /**\n * Advanced: fully custom footer blocks (you control the JSX).\n */\n blocks?: ReactNode[];\n /**\n * Simple preset: provide data only, template renders a styled footer.\n */\n preset?: {\n leftText: string;\n links?: FooterLink[];\n version?: string;\n };\n /**\n * Optional className override on the
    wrapper.\n */\n className?: string;\n };\n}\n\nconst DashboardLayout: React.FC = ({\n children,\n sidebarContent,\n logo,\n onLogout,\n footer,\n}) => {\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n const hasPreset = Boolean(footer?.preset);\n const hasBlocks = Boolean(footer?.blocks && footer.blocks.length > 0);\n\n return (\n
    \n
    \n {/* Sidebar */}\n \n\n {/* Main content column */}\n
    \n
    \n\n
    \n {/* Content */}\n
    \n
    {children}
    \n
    \n\n {/* Sticky footer (preset has priority over blocks) */}\n {hasPreset ? (\n
    \n
    \n
    \n
    {footer?.preset?.leftText}
    \n\n
    \n {footer?.preset?.links?.length ? (\n
    \n {footer.preset.links.map((l) => {\n const newTab = l.newTab ?? true; // default: new tab\n return (\n \n {l.label}\n \n );\n })}\n
    \n ) : null}\n\n {footer?.preset?.version ? (\n {footer.preset.version}\n ) : null}\n
    \n
    \n
    \n
    \n ) : hasBlocks ? (\n
    \n
    \n
    \n {footer!.blocks!.map((block, idx) => (\n {block}\n ))}\n
    \n
    \n
    \n ) : null}\n
    \n
    \n
    \n
    \n );\n};\n\nexport default DashboardLayout;\n","import React from 'react';\n\nconst Loader = () => {\n return (\n
    \n
    \n
    \n );\n};\nexport default Loader;\n","import React, { useState, useEffect, ReactNode } from 'react';\nimport { useLocation } from 'react-router';\nimport DashboardLayout from '../layout/DashboardLayout';\nimport Loader from '../common/Loader';\n\n// Existing (legacy) sidebar model used by current Template implementation\nimport { SidebarSection } from '../models/SidebarItemModel';\n\n// New typed configs (non-breaking additions)\nimport type {\n TemplateSidebarConfig,\n TemplateNavbarConfig,\n TemplateFooterConfig,\n} from './layoutTypes';\n\n/**\n * Props for the `Template` (Dashboard Shell) component.\n * Backward compatible with legacy sidebar/logo/onLogout while\n * supporting modern `sidebar`, `navbar`, and optional `footer` configs.\n */\nexport interface DashboardProps {\n children: ReactNode;\n\n /**\n * Legacy props (backward compatible)\n */\n sidebarContent?: SidebarSection[];\n logo?: ReactNode;\n onLogout?: () => void;\n\n /**\n * New config props (preferred)\n */\n sidebar?: TemplateSidebarConfig;\n navbar?: TemplateNavbarConfig;\n\n /**\n * Optional footer (rendered inside DashboardLayout when provided)\n */\n footer?: TemplateFooterConfig;\n}\n\n/**\n * Template (Dashboard Shell)\n *\n * Backward compatible:\n * - Existing apps can keep using: sidebarContent + logo + onLogout\n * Preferred:\n * - New apps should use: sidebar + navbar (+ footer when needed)\n */\nconst Template: React.FC = ({\n children,\n sidebarContent = [],\n logo,\n onLogout,\n sidebar,\n navbar,\n footer,\n}) => {\n const [loading, setLoading] = useState(true);\n const { pathname } = useLocation();\n\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n useEffect(() => {\n setTimeout(() => setLoading(false), 1000);\n }, []);\n\n /**\n * Resolve \"brand\" area:\n * - Prefer navbar.brandSlot\n * - Else map legacy `logo` prop (deprecated) to brandSlot\n * - Else fall back to simple navbar.brand config if provided\n */\n const resolvedBrandNode: ReactNode | undefined =\n navbar?.brandSlot ??\n logo ??\n (navbar?.brand ? (\n \n {navbar.brand.logoSrc ? (\n \n ) : (\n {navbar.brand.title ?? ''}\n )}\n \n ) : undefined);\n\n /**\n * Resolve sidebar:\n * - For now, if `sidebar` is provided, we still pass legacy sidebarContent through,\n * because DashboardLayout currently expects SidebarSection[].\n */\n const resolvedLegacySidebarContent: SidebarSection[] = sidebarContent;\n\n return loading ? (\n \n ) : (\n \n {children}\n \n );\n};\n\nexport default Template;\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { useT } from '@ciscode/ui-translate-core';\n\n/**\n * Props for `Breadcrumb` component.\n * - `pageName`: current page label displayed in the trail.\n */\nexport interface BreadcrumbProps {\n pageName: string;\n}\n\n/**\n * Accessible breadcrumb navigation.\n * Renders a current page label and a link to home.\n */\nconst Breadcrumb: React.FC = ({ pageName }) => {\n const t = useT('templateFe');\n\n return (\n
    \n

    {pageName}

    \n \n
    \n );\n};\n\nexport default Breadcrumb;\n","import React, { useState } from 'react';\nimport { ZodSchema, ZodError } from 'zod';\nimport { MultiValue } from 'react-select';\nimport Select from 'react-select';\nimport { FieldConfigDynamicForm } from '../../models/FieldConfigDynamicForm';\n\nexport interface ControlledZodDynamicFormProps {\n schema: ZodSchema;\n fields: FieldConfigDynamicForm[];\n values: Record;\n onChangeField: (fieldName: string, newValue: any) => void;\n onSubmit: (parsedValues: Record) => void;\n submitLabel?: string;\n header?: React.ReactNode;\n /** Optional override for the ZodError class (for dependency injection) */\n}\n\nexport default function ControlledZodDynamicForm({\n schema,\n fields,\n values,\n onChangeField,\n onSubmit,\n submitLabel = 'Submit',\n header,\n}: ControlledZodDynamicFormProps) {\n const [errors, setErrors] = useState>({});\n\n /**\n * Handler for standard text/textarea/select/checkbox inputs.\n * Uses a type guard so we can safely read e.target.checked if it's a checkbox.\n */\n function handleInputChange(\n e: React.ChangeEvent,\n ) {\n const { name, value, type } = e.target;\n let newValue: any = value;\n\n // type guard for checkbox\n if (type === 'checkbox' && e.target instanceof HTMLInputElement) {\n newValue = e.target.checked;\n } else if (type === 'number') {\n newValue = parseFloat(value) || 0;\n }\n onChangeField(name, newValue);\n }\n\n /**\n * On form submit => parse the entire `values` with Zod.\n * If it fails, store the error messages in local state to display.\n */\n function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n try {\n // Attempt to parse the entire form data with Zod\n const parsed = schema.parse(values);\n // If success, call parent\n onSubmit(parsed);\n } catch (err) {\n if (err instanceof ZodError) {\n // Build a record of errors for simpler fields\n const newErrors: Record = {};\n\n // Check if any error is specifically for \"details\" path\n let detailsErrorFound = false;\n\n err.errors.forEach((issue) => {\n const pathKey = issue.path.join('.');\n newErrors[pathKey] = issue.message;\n\n // If the path starts with \"details\", we assume it's a problem with details\n if (issue.path[0] === 'details') {\n detailsErrorFound = true;\n }\n });\n\n // If there's an error in \"details\", show an alert\n if (detailsErrorFound) {\n alert('Please fill out all required fields in Details.');\n }\n\n setErrors(newErrors);\n }\n }\n }\n\n return (\n
    \n {/* header */}\n {header &&
    {header}
    }\n\n {/* form */}\n {fields.map((field) => {\n const fieldError = errors[field.name];\n const fieldValue = values[field.name] ?? '';\n\n return (\n
    \n \n\n {(() => {\n switch (field.type) {\n case 'textarea':\n return (\n \n );\n\n case 'select':\n return (\n \n \n {field.options?.map((opt) => (\n \n ))}\n \n );\n\n case 'checkbox':\n return (\n \n );\n\n case 'multiSelect': {\n // We assume `field.options` is an array of { label: string, value: string }.\n const multiOpts = field.options ?? [];\n // The user’s current selection is an array of IDs => find the matching option or fallback\n const selectedValues = Array.isArray(fieldValue)\n ? fieldValue.map((id: string) => {\n const found = multiOpts.find((o) => o.value === id);\n if (found) return found;\n // fallback => ensures a unique string value\n return {\n label: String(id) || '???',\n value: String(id),\n };\n })\n : [];\n\n return (\n {\n // selected: array of { label, value }\n const arrIds = (\n selected as MultiValue<{\n label: string;\n value: string;\n }>\n ).map((opt) => opt.value);\n onChangeField(field.name, arrIds);\n }}\n className=\"w-full\"\n />\n );\n }\n case 'custom': {\n const CustomComp = field.component; // e.g. DetailsManager\n if (!CustomComp) {\n return (\n

    \n Missing component for custom field: {field.name}\n

    \n );\n }\n\n // Get nested errors for field \"details\" or whatever the field's name is\n const subErrors = findNestedErrors(errors, field.name);\n // subErrors might look like { 0: { grams: \"Error message\" }, 1: { price: \"Error\" } }\n\n return (\n onChangeField(field.name, newVal)}\n errors={subErrors}\n {...field.props}\n // optionally pass more props if needed\n />\n );\n }\n\n default:\n // text or number\n return (\n \n );\n }\n })()}\n\n {fieldError &&

    {fieldError}

    }\n
    \n );\n })}\n\n
    \n \n {submitLabel}\n \n
    \n
    \n );\n}\n\n//Show erros validation\nexport function findNestedErrors(\n allErrors: Record,\n rootField: string,\n): Record> {\n const nested: Record> = {};\n\n // For each key => e.g. \"details.0.grams\"\n for (const key in allErrors) {\n if (key.startsWith(`${rootField}.`)) {\n // remove \"details.\" => \"0.grams\"\n const subPath = key.slice(rootField.length + 1); // e.g. \"0.grams\"\n const [indexStr, fieldName] = subPath.split('.');\n const index = parseInt(indexStr, 10);\n\n if (!isNaN(index)) {\n if (!nested[index]) {\n nested[index] = {};\n }\n nested[index][fieldName] = allErrors[key];\n }\n }\n }\n\n return nested;\n}\n","import React from 'react';\nimport { useT } from '@ciscode/ui-translate-core';\n\ninterface TableErrorBoundaryState {\n hasError: boolean;\n}\n\nclass TableErrorBoundary extends React.Component<\n React.PropsWithChildren,\n TableErrorBoundaryState\n> {\n constructor(props: React.PropsWithChildren) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(_: any) {\n return { hasError: true };\n }\n\n componentDidCatch(error: any, errorInfo: any) {\n console.error('TableErrorBoundary caught an error:', error, errorInfo);\n }\n\n render() {\n if (this.state.hasError) {\n // You can't use hooks like useT inside a class component,\n // so we wrap it in a functional HOC instead.\n return ;\n }\n\n return this.props.children;\n }\n}\n\nconst TranslatedErrorMessage = () => {\n const t = useT('template-fe');\n return (\n
    \n {t('table.errorBoundary.fallbackMessage')}\n
    \n );\n};\n\nexport default TableErrorBoundary;\n","/**\n * Generate a compact page list for pagination controls.\n * Includes first/last pages and ellipses around the current.\n */\nexport function generatePageNumbers(current: number, total: number): (number | string)[] {\n const maxPagesToShow = 5;\n const pages: (number | string)[] = [];\n\n // If total is small, just show them all\n if (total <= maxPagesToShow) {\n for (let i = 1; i <= total; i++) {\n pages.push(i);\n }\n return pages;\n }\n\n // Always show first page\n pages.push(1);\n\n // Determine start/end range near current\n const start = Math.max(2, current - 1);\n const end = Math.min(total - 1, current + 1);\n\n // Ellipses before start if needed\n if (start > 2) {\n pages.push('...');\n }\n\n // Range in the middle\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n\n // Ellipses after end if needed\n if (end < total - 1) {\n pages.push('...');\n }\n\n // Always show last page\n pages.push(total);\n\n return pages;\n}\n","import React from 'react';\n\nexport const TableLoader = () => {\n return (\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport ReactDOM from 'react-dom';\n\nexport interface TablePopoverProps {\n anchor: HTMLElement | null;\n children: React.ReactNode;\n onClose: () => void;\n}\n\nexport const TablePopover: React.FC = ({ anchor, children, onClose }) => {\n const popoverRef = useRef(null);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(e.target as Node) &&\n anchor &&\n !anchor.contains(e.target as Node)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [anchor, onClose]);\n\n if (!anchor) return null;\n\n const rect = anchor.getBoundingClientRect();\n const style: React.CSSProperties = {\n position: 'fixed',\n top: rect.bottom + 8,\n left: rect.left,\n zIndex: 9999,\n background: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: 12,\n boxShadow: '0 8px 32px 0 rgba(60,60,60,0.18)',\n padding: 0,\n minWidth: 200,\n animation: 'fadeIn 0.18s',\n };\n\n return ReactDOM.createPortal(\n
    \n
    \n
    \n
    \n {children}\n \n \n \n \n \n
    ,\n document.body,\n );\n};\n","import React, { useCallback, useState } from 'react';\nimport { generatePageNumbers } from '../../hooks/useGeneratePageNumbers';\nimport { TableLoader } from '../../common/Loader/TableLoader';\nimport { ToolbarItem } from '../../models/ToolbarItemModel';\nimport { ColumnConfigTable } from '../../models/ColumnConfigTable';\nimport { useT } from '@ciscode/ui-translate-core';\nimport { TablePopover } from './TablePopover';\n\n/**\n * Pagination configuration for table navigation.\n */\nexport type PaginationProps = {\n currentPage: number;\n totalPages: number;\n totalItems: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n};\n\n/**\n * Props for `TableDataCustom` and base component.\n */\nexport interface TableDataCustomProps {\n columns: ColumnConfigTable[];\n data: T[];\n loading?: boolean;\n pagination?: PaginationProps;\n errorMessage?: string | null;\n toolbarItems?: ToolbarItem[];\n}\n\n/**\n * Internal base table component that renders the table UI.\n * Consumers should use `TableDataCustom` which wraps this with an error boundary.\n */\nfunction TableDataCustomBase({\n columns,\n data,\n errorMessage,\n pagination,\n loading,\n toolbarItems,\n}: TableDataCustomProps) {\n const t = useT('templateFe');\n\n // split toolbar items\n const leftItems = (toolbarItems ?? []).filter(\n (it) => it.visible !== false && (it.position ?? 'left') === 'left',\n );\n const rightItems = (toolbarItems ?? []).filter(\n (it) => it.visible !== false && it.position === 'right',\n );\n const [popover, setPopover] = useState<{\n anchor: HTMLElement | null;\n content: React.ReactNode;\n } | null>(null);\n const closePopover = useCallback(() => setPopover(null), []);\n\n return (\n <>\n
    \n {popover && (\n \n {popover.content}\n \n )}\n
    \n
    \n {/* Toolbar */}\n {(leftItems.length > 0 || rightItems.length > 0) && (\n
    \n
    \n {leftItems.map((it, i) => (\n {it.node}\n ))}\n
    \n
    \n {rightItems.map((it, i) => (\n {it.node}\n ))}\n
    \n
    \n )}\n\n {/* Table */}\n
    \n \n \n \n {columns.map((col, i) => (\n \n ))}\n \n \n \n {loading ? (\n \n \n \n ) : errorMessage ? (\n \n \n \n ) : data.length === 0 ? (\n \n \n \n ) : (\n data.map((row, r) => (\n \n {columns.map((col, c) => {\n let content: React.ReactNode;\n if (Array.isArray(col.key)) {\n const vals = col.key.map((k) => row[k] ?? '');\n content = col.render\n ? col.render(vals, row, setPopover)\n : vals.join(' - ');\n } else {\n const val = row[col.key];\n content = col.render\n ? col.render(val, row, setPopover)\n : String(val ?? '');\n }\n return (\n \n );\n })}\n \n ))\n )}\n \n
    \n {col.title}\n
    \n \n
    \n {errorMessage}\n
    \n {t('table.noData')}\n
    \n {content}\n
    \n
    \n\n {/* Pagination */}\n {pagination && (\n \n \n {t('table.pagination.showing', {\n from: (pagination.currentPage - 1) * (pagination.pageSize ?? 10) + 1,\n to: Math.min(\n pagination.currentPage * (pagination.pageSize ?? 10),\n pagination.totalItems,\n ),\n total: pagination.totalItems,\n })}\n \n\n
      \n {/* Previous */}\n
    • \n pagination.onPageChange?.(pagination.currentPage - 1)}\n disabled={pagination.currentPage <= 1}\n className=\"flex items-center justify-center h-full py-1.5 px-3 ml-0 text-gray-500 bg-white rounded-l-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\"\n >\n {t('table.pagination.previous')}\n \n \n \n \n
    • \n\n {/* Pages */}\n {generatePageNumbers(pagination.currentPage, pagination.totalPages).map((p, i) =>\n typeof p === 'string' ? (\n
    • \n \n {p}\n \n
    • \n ) : (\n
    • \n pagination.onPageChange?.(p)}\n className={`flex items-center justify-center px-3 py-2 text-sm border ${\n p === pagination.currentPage\n ? 'z-10 text-primary-600 bg-primary-50 border-primary-300 hover:bg-primary-100 hover:text-primary-700 dark:bg-gray-700 dark:text-white dark:border-gray-700'\n : 'text-gray-500 bg-white border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-700 dark:hover:bg-gray-700'\n }`}\n >\n {p}\n \n
    • \n ),\n )}\n\n {/* Next */}\n
    • \n pagination.onPageChange?.(pagination.currentPage + 1)}\n disabled={pagination.currentPage >= pagination.totalPages}\n className=\"flex items-center justify-center h-full py-1.5 px-3 leading-tight text-gray-500 bg-white rounded-r-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\"\n >\n {t('table.pagination.next')}\n \n \n \n \n
    • \n
    \n \n )}\n
    \n
    \n
    \n \n );\n}\n\nexport default TableDataCustomBase;\n","import React from 'react';\nimport TableErrorBoundary from '../../exceptions/TableErrorBoundary';\nimport TableDataCustomBase, { TableDataCustomProps } from './TableDataCustomBase';\n\n/**\n * Public table component with built-in error boundary.\n * Wraps `TableDataCustomBase` in `TableErrorBoundary` to provide a safe fallback.\n * Consumers should import `TableDataCustom` from the package root.\n */\nfunction TableDataCustom(props: TableDataCustomProps) {\n return (\n \n \n \n );\n}\n\nexport default TableDataCustom;\n","import { useState } from 'react';\n// Optional schema interface to avoid hard dependency on zod\nexport type ParseSchema = { parse: (input: T) => T };\n\n/**\n * Credentials payload for login.\n */\nexport type LoginCredentials = {\n username: string;\n password: string;\n};\n\n/**\n * Result returned by a login service.\n */\nexport type LoginResult = {\n user: TUser;\n token?: string;\n};\n\n/**\n * Options for `useLogin`.\n * Provide a `login` function to integrate with your auth backend, and an optional Zod schema for validation.\n */\nexport type UseLoginOptions = {\n login: (credentials: LoginCredentials) => Promise>;\n schema?: ParseSchema;\n};\n\n/**\n * A composable login hook: manages form state, validation, submit, and loading/errors.\n */\nexport function useLogin({ login, schema }: UseLoginOptions) {\n const [values, setValues] = useState({ username: '', password: '' });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [result, setResult] = useState | null>(null);\n\n function update(key: K, value: LoginCredentials[K]) {\n setValues((v: LoginCredentials) => ({ ...v, [key]: value }));\n }\n\n async function submit() {\n setError(null);\n setLoading(true);\n try {\n const input = schema ? schema.parse(values) : values;\n const res = await login(input);\n setResult(res);\n return res;\n } catch (e: any) {\n setError(e?.message ?? 'Login failed');\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, result };\n}\n\nexport default useLogin;\n","import { useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\n/**\n * Generic registration payload.\n */\nexport type RegisterPayload = Record;\n\n/**\n * Options for `useRegister`.\n */\nexport type UseRegisterOptions = {\n register: (payload: RegisterPayload) => Promise;\n schema?: ZodSchema;\n};\n\n/**\n * A composable registration hook: manages form state, validation, submit, and loading/errors.\n */\nexport function useRegister({ register, schema }: UseRegisterOptions) {\n const [values, setValues] = useState({});\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [user, setUser] = useState(null);\n\n function update(key: K, value: unknown) {\n setValues((v) => ({ ...v, [key]: value }));\n }\n\n async function submit() {\n setError(null);\n setLoading(true);\n try {\n const payload = schema ? schema.parse(values) : values;\n const res = await register(payload);\n setUser(res);\n return res;\n } catch (e: any) {\n setError(e?.message ?? 'Registration failed');\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, user };\n}\n\nexport default useRegister;\n","import { useState } from 'react';\n// Optional schema interface to avoid hard dependency on zod\nexport type ParseSchema = { parse: (input: T) => T };\n\n/**\n * Password reset input: allow email or username.\n */\nexport type PasswordResetInput = {\n email?: string;\n username?: string;\n};\n\n/**\n * Options for `usePasswordReset`.\n */\nexport type UsePasswordResetOptions = {\n reset: (input: PasswordResetInput) => Promise;\n schema?: ParseSchema;\n};\n\n/**\n * A composable password reset hook: manages form state, validation, submit, and loading/errors.\n */\nexport function usePasswordReset({ reset, schema }: UsePasswordResetOptions) {\n const [values, setValues] = useState({ email: '' });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [success, setSuccess] = useState(false);\n\n function update(key: K, value: PasswordResetInput[K]) {\n setValues((v: PasswordResetInput) => ({ ...v, [key]: value }));\n }\n\n async function submit() {\n setError(null);\n setSuccess(false);\n setLoading(true);\n try {\n const input = schema ? schema.parse(values) : values;\n await reset(input);\n setSuccess(true);\n } catch (e: any) {\n setError(e?.message ?? 'Password reset failed');\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, success };\n}\n\nexport default usePasswordReset;\n","import { useEffect, useRef } from 'react';\n\n/**\n * Manage ARIA live region announcements.\n * Returns a ref to attach to an element with `aria-live=\"polite\"` or `assertive`.\n * Use `announce()` to set text content.\n */\nexport function useLiveRegion() {\n const ref = useRef(null);\n function announce(message: string) {\n if (ref.current) {\n ref.current.textContent = message;\n }\n }\n return { ref, announce };\n}\n\n/**\n * Trap focus within a container element (e.g., modal) while `active`.\n * Adds keydown handlers to cycle focus.\n */\nexport function useFocusTrap(active: boolean) {\n const ref = useRef(null);\n\n useEffect(() => {\n if (!active) return;\n const current = ref.current;\n if (!current) return;\n const el: HTMLElement = current;\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') return;\n const focusable = (\n Array.from(\n el.querySelectorAll(\n 'a[href], button, textarea, input, select, [tabindex]:not([tabindex=\"-1\"])',\n ),\n ) as HTMLElement[]\n ).filter((node: HTMLElement) => !node.hasAttribute('disabled'));\n if (focusable.length === 0) return;\n const first: HTMLElement = focusable[0] as HTMLElement;\n const last: HTMLElement = focusable[focusable.length - 1] as HTMLElement;\n const current = document.activeElement as HTMLElement | null;\n\n if (e.shiftKey) {\n if (!current || current === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (!current || current === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n\n el.addEventListener('keydown', onKeyDown);\n return () => {\n el.removeEventListener('keydown', onKeyDown);\n };\n }, [active]);\n\n return { ref };\n}\n\nexport default undefined;\n","import { useEffect } from 'react';\n\nexport type RovingConfig = {\n /** CSS selector for focusable items inside the container */\n selector: string;\n /** Optional: initial index to focus when mounted */\n initialIndex?: number;\n};\n\n/**\n * Roving tabindex keyboard navigation for lists/menus.\n * Attach to a container element; items should be focusable via `tabindex`.\n */\nexport function useKeyboardNavigation(\n container: HTMLElement | null,\n { selector, initialIndex = 0 }: RovingConfig,\n) {\n useEffect(() => {\n if (!container) return;\n const items = Array.from(container.querySelectorAll(selector));\n if (items.length === 0) return;\n\n // Initialize tabindex\n items.forEach((el, i) => el.setAttribute('tabindex', i === initialIndex ? '0' : '-1'));\n\n function onKeyDown(e: KeyboardEvent) {\n const currentIndex = items.findIndex((el) => el === document.activeElement);\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n const next = items[(currentIndex + 1 + items.length) % items.length];\n items.forEach((el) => el.setAttribute('tabindex', '-1'));\n next.setAttribute('tabindex', '0');\n next.focus();\n e.preventDefault();\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n const prev = items[(currentIndex - 1 + items.length) % items.length];\n items.forEach((el) => el.setAttribute('tabindex', '-1'));\n prev.setAttribute('tabindex', '0');\n prev.focus();\n e.preventDefault();\n }\n }\n\n container.addEventListener('keydown', onKeyDown);\n return () => container.removeEventListener('keydown', onKeyDown);\n }, [container, selector, initialIndex]);\n}\n\nexport default undefined;\n"]} \ No newline at end of file +{"version":3,"sources":["../src/components/Dashboard/ClickOutside.tsx","../src/components/Dashboard/Header/DropdownMessage.tsx","../src/components/Dashboard/Header/DropdownNotification.tsx","../src/components/Dashboard/Header/DropdownUser.tsx","../src/hooks/useLocalStorage.tsx","../src/hooks/useColorMode.tsx","../src/components/Dashboard/Header/DarkModeSwitcher.tsx","../src/components/Dashboard/Header/index.tsx","../src/components/Dashboard/Sidebar/index.tsx","../src/layout/DashboardLayout.tsx","../src/common/Loader/index.tsx","../src/main/dashboard.tsx","../src/components/Breadcrumbs/Breadcrumb.tsx","../src/components/Form/ZodDynamicForm.tsx","../src/exceptions/TableErrorBoundary.tsx","../src/hooks/useGeneratePageNumbers.tsx","../src/common/Loader/TableLoader.tsx","../src/components/Table/TablePopover.tsx","../src/components/Table/TableDataCustomBase.tsx","../src/components/Table/TableDataCustom.tsx","../src/components/Dashboard/Widgets/WidgetContainer.tsx","../src/components/Dashboard/Widgets/layoutUtils.ts","../src/components/Dashboard/Widgets/ChartAdapters.tsx","../src/components/Dashboard/Widgets/DashboardGrid.tsx","../src/hooks/useLogin.tsx","../src/hooks/useRegister.ts","../src/hooks/usePasswordReset.tsx","../src/hooks/useA11y.ts","../src/hooks/useKeyboardNavigation.ts"],"names":["jsx","Link","useState","useT","jsxs","useEffect","useRef","_a","React","useLocation","current"],"mappings":"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","file":"index.js","sourcesContent":["import { useRef, useEffect } from 'react';\nimport type { ReactNode, RefObject } from 'react';\n\ninterface Props {\n children: ReactNode;\n exceptionRef?: RefObject;\n onClick: () => void;\n className?: string;\n}\n\nfunction ClickOutside({ children, exceptionRef, onClick, className }: Props): JSX.Element {\n const wrapperRef = useRef(null);\n\n useEffect(() => {\n const handleClickListener = (event: MouseEvent) => {\n let clickedInside: null | boolean = false;\n if (exceptionRef) {\n clickedInside =\n (wrapperRef.current && wrapperRef.current.contains(event.target as Node)) ||\n (exceptionRef.current && exceptionRef.current === event.target) ||\n (exceptionRef.current && exceptionRef.current.contains(event.target as Node));\n } else {\n clickedInside = wrapperRef.current && wrapperRef.current.contains(event.target as Node);\n }\n\n if (!clickedInside) onClick();\n };\n\n document.addEventListener('mousedown', handleClickListener);\n\n return () => {\n document.removeEventListener('mousedown', handleClickListener);\n };\n }, [exceptionRef, onClick]);\n\n return (\n
    \n {children}\n
    \n );\n}\n\nexport default ClickOutside;\n","import React, { useState } from 'react';\r\nimport { Link } from 'react-router';\r\nimport ClickOutside from '../ClickOutside';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\nconst DropdownMessage: React.FC = () => {\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n const [notifying, setNotifying] = useState(true);\r\n const t = useT('templateFe');\r\n\r\n // Example dynamic data; replace with your real data source\r\n const messages = [\r\n { id: 1, user: 'Mariya Desoja', text: 'I like your confidence 💪', time: '2min ago' },\r\n { id: 2, user: 'Robert Jhon', text: 'Can you share your offer?', time: '10min ago' },\r\n { id: 3, user: 'Henry Dholi', text: 'I came across your profile and...', time: '1day ago' },\r\n { id: 4, user: 'Cody Fisher', text: 'I’m waiting for your response!', time: '5days ago' },\r\n { id: 5, user: 'Mariya Desoja', text: 'I like your confidence 💪', time: '2min ago' },\r\n ];\r\n\r\n return (\r\n setDropdownOpen(false)} className=\"relative\">\r\n
  • \r\n {\r\n setNotifying(false);\r\n setDropdownOpen(!dropdownOpen);\r\n }}\r\n className=\"relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white\"\r\n to=\"#\"\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {dropdownOpen && (\r\n
    \r\n
    \r\n
    {t('dropdown.messages')}
    \r\n
    \r\n\r\n
      \r\n {messages.map(({ id, user, text, time }) => (\r\n
    • \r\n \r\n
      \r\n {user}\r\n
      \r\n\r\n
      \r\n
      {user}
      \r\n

      {text}

      \r\n

      {time}

      \r\n
      \r\n \r\n
    • \r\n ))}\r\n
    \r\n
    \r\n )}\r\n
  • \r\n
    \r\n );\r\n};\r\n\r\nexport default DropdownMessage;\r\n","import React, { useState } from 'react';\r\nimport ClickOutside from '../ClickOutside';\r\nimport { Link } from 'react-router';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\ninterface NotificationItem {\r\n id: number;\r\n title: string;\r\n description: string;\r\n time: string;\r\n}\r\n\r\nconst DropdownNotification: React.FC = () => {\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n const [notifying, setNotifying] = useState(true);\r\n const t = useT('templateFe');\r\n\r\n const notifications: NotificationItem[] = [\r\n {\r\n id: 1,\r\n title: 'Edit your information in a swipe',\r\n description:\r\n 'Sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim.',\r\n time: '12 May, 2025',\r\n },\r\n {\r\n id: 2,\r\n title: 'It is a long established fact',\r\n description: 'that a reader will be distracted by the readable.',\r\n time: '24 Feb, 2025',\r\n },\r\n {\r\n id: 3,\r\n title: 'There are many variations',\r\n description: 'of passages of Lorem Ipsum available, but the majority have suffered',\r\n time: '04 Jan, 2025',\r\n },\r\n {\r\n id: 4,\r\n title: 'There are many variations',\r\n description: 'of passages of Lorem Ipsum available, but the majority have suffered',\r\n time: '01 Dec, 2024',\r\n },\r\n ];\r\n\r\n return (\r\n setDropdownOpen(false)} className=\"relative\">\r\n
  • \r\n {\r\n setNotifying(false);\r\n setDropdownOpen(!dropdownOpen);\r\n }}\r\n to=\"#\"\r\n className=\"relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white\"\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {dropdownOpen && (\r\n
    \r\n
    \r\n
    {t('dropdown.notifications')}
    \r\n
    \r\n\r\n
      \r\n {notifications.map(({ id, title, description, time }) => (\r\n
    • \r\n \r\n

      \r\n {title} {description}\r\n

      \r\n

      {time}

      \r\n \r\n
    • \r\n ))}\r\n
    \r\n
    \r\n )}\r\n
  • \r\n
    \r\n );\r\n};\r\n\r\nexport default DropdownNotification;\r\n","import { useState } from 'react';\r\nimport ClickOutside from '../ClickOutside';\r\nimport React from 'react';\r\nimport { Link } from 'react-router';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\ntype DropdownUserProps = {\r\n onLogout?: () => void;\r\n};\r\n\r\nconst DropdownUser: React.FC = ({ onLogout }) => {\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n const t = useT('templateFe');\r\n const role = 'superAdmin'; // or from user data\r\n const translatedRole = t(`roles.${role}`, { defaultValue: role });\r\n console.log('DROPDOWN RENDER onLogout =', onLogout);\r\n\r\n return (\r\n setDropdownOpen(false)} className=\"relative\">\r\n setDropdownOpen(!dropdownOpen)}\r\n className=\"flex items-center gap-4\"\r\n to=\"#\"\r\n >\r\n \r\n Thomas Anree\r\n {translatedRole}\r\n \r\n\r\n \r\n \r\n \r\n\r\n {/* Chevron (valid SVG) */}\r\n \r\n \r\n \r\n \r\n\r\n {dropdownOpen && (\r\n
    \r\n
      \r\n
    • \r\n setDropdownOpen(false)}\r\n >\r\n {/* placeholder icon to keep alignment */}\r\n \r\n {t('dropdown.profile')}\r\n \r\n
    • \r\n\r\n
    • \r\n \r\n \r\n {t('dropdown.contacts')}\r\n \r\n
    • \r\n\r\n
    • \r\n setDropdownOpen(false)}\r\n >\r\n \r\n {t('dropdown.settings')}\r\n \r\n
    • \r\n
    \r\n\r\n {\r\n console.log('DROPDOWN LOGOUT CLICKED, onLogout =', onLogout);\r\n setDropdownOpen(false);\r\n onLogout?.();\r\n }}\r\n className=\"flex items-center gap-3.5 px-6 py-4 text-sm font-medium duration-300 ease-in-out hover:text-primary lg:text-base\"\r\n >\r\n \r\n {t('dropdown.logout')}\r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default DropdownUser;\r\n","import { useEffect, useState } from 'react';\r\n\r\n/**\r\n * Setter type used by `useLocalStorage`.\r\n * Accepts a direct value or an updater function.\r\n */\r\nexport type SetValue = T | ((val: T) => T);\r\n\r\n/**\r\n * A typed hook that syncs a stateful value with `window.localStorage`.\r\n * Returns a tuple `[value, setValue]` similar to `useState`.\r\n */\r\nfunction useLocalStorage(key: string, initialValue: T): [T, (value: SetValue) => void] {\r\n // State to store our value\r\n // Pass initial state function to useState so logic is only executed once\r\n const [storedValue, setStoredValue] = useState(() => {\r\n try {\r\n // Get from local storage by key\r\n const item = window.localStorage.getItem(key);\r\n // Parse stored json or if none return initialValue\r\n return item ? JSON.parse(item) : initialValue;\r\n } catch (error) {\r\n // If error also return initialValue\r\n console.log(error);\r\n return initialValue;\r\n }\r\n });\r\n\r\n // useEffect to update local storage when the state changes\r\n useEffect(() => {\r\n try {\r\n // Persist the current value to localStorage\r\n window.localStorage.setItem(key, JSON.stringify(storedValue));\r\n } catch (error) {\r\n // A more advanced implementation would handle the error case\r\n console.log(error);\r\n }\r\n }, [key, storedValue]);\r\n\r\n return [storedValue, setStoredValue];\r\n}\r\n\r\nexport default useLocalStorage;\r\n","import { useEffect } from 'react';\nimport useLocalStorage from './useLocalStorage';\n\n/**\n * Persisted color mode hook.\n * Toggles `dark` class on `` when mode is 'dark'.\n * Returns `[colorMode, setColorMode]`.\n */\nconst useColorMode = (): [string, (value: string | ((val: string) => string)) => void] => {\n const [colorMode, setColorMode] = useLocalStorage('color-theme', 'light');\n\n useEffect(() => {\n const className = 'dark';\n const bodyClass = window.document.body.classList;\n\n if (colorMode === 'dark') {\n bodyClass.add(className);\n } else {\n bodyClass.remove(className);\n }\n }, [colorMode]);\n\n return [colorMode, setColorMode];\n};\n\nexport default useColorMode;\n","import React from 'react';\nimport useColorMode from '../../../hooks/useColorMode';\n\nconst DarkModeSwitcher: React.FC = () => {\n const [colorMode, setColorMode] = useColorMode();\n\n return (\n
  • \n \n \n typeof setColorMode === 'function' &&\n setColorMode(colorMode === 'light' ? 'dark' : 'light')\n }\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
  • \n );\n};\n\nexport default DarkModeSwitcher;\n","import DropdownMessage from './DropdownMessage';\nimport DropdownNotification from './DropdownNotification';\nimport DropdownUser from './DropdownUser';\n// import LogoIcon from '../../../assets/images/logo/logo-icon.svg';\nimport DarkModeSwitcher from './DarkModeSwitcher';\nimport React from 'react';\nimport { useT } from '@ciscode/ui-translate-core';\n\nconst Header = (props: {\n sidebarOpen: string | boolean | undefined;\n setSidebarOpen: (arg0: boolean) => void;\n onLogout?: () => void;\n}): JSX.Element => {\n const t = useT('templateFe');\n console.log('HEADER onLogout prop =', props.onLogout);\n\n return (\n
    \n
    \n
    \n {/* */}\n {\n e.stopPropagation();\n props.setSidebarOpen(!props.sidebarOpen);\n }}\n className=\"z-99999 block rounded-sm border border-stroke bg-white p-1.5 shadow-sm dark:border-strokedark dark:bg-boxdark lg:hidden\"\n >\n \n \n \n \n \n \n \n \n \n \n \n \n {/* */}\n
    \n\n
    \n
    \n
    \n \n\n \n
    \n
    \n
    \n\n
    \n
      \n {/* */}\n \n {/* */}\n\n {/* */}\n \n {/* */}\n\n {/* */}\n \n {/* */}\n
    \n\n {/* */}\n \n {/* */}\n
    \n
    \n
    \n );\n};\n\nexport default Header;\n","import React, { useEffect, useRef, useState, ReactNode } from 'react';\nimport { useLocation, NavLink } from 'react-router';\nimport { SidebarSection } from '../../../models/SidebarItemModel';\n\ninterface SidebarProps {\n sidebarOpen: boolean;\n setSidebarOpen: (arg: boolean) => void;\n sections: SidebarSection[];\n logo?: ReactNode;\n}\n\nconst Sidebar = ({ sidebarOpen, setSidebarOpen, sections, logo }: SidebarProps): JSX.Element => {\n const location = useLocation();\n const { pathname } = location;\n\n const trigger = useRef(null);\n const sidebar = useRef(null);\n\n const storedSidebarExpanded = localStorage.getItem('sidebar-expanded');\n const [sidebarExpanded] = useState(storedSidebarExpanded === 'true');\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (!sidebar.current || !trigger.current) return;\n if (\n !sidebarOpen ||\n sidebar.current.contains(e.target as Node) ||\n trigger.current.contains(e.target as Node)\n ) {\n return;\n }\n setSidebarOpen(false);\n };\n document.addEventListener('click', handleClickOutside);\n return () => document.removeEventListener('click', handleClickOutside);\n }, [sidebarOpen, setSidebarOpen]);\n\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (!sidebarOpen || e.key !== 'Escape') return;\n setSidebarOpen(false);\n };\n document.addEventListener('keydown', handleEsc);\n return () => document.removeEventListener('keydown', handleEsc);\n }, [sidebarOpen, setSidebarOpen]);\n\n useEffect(() => {\n localStorage.setItem('sidebar-expanded', sidebarExpanded.toString());\n if (sidebarExpanded) {\n document.body.classList.add('sidebar-expanded');\n } else {\n document.body.classList.remove('sidebar-expanded');\n }\n }, [sidebarExpanded]);\n\n const sortedSections = [...sections].sort((a, b) => (a.order ?? 9999) - (b.order ?? 9999));\n\n return (\n \n {/* SIDEBAR HEADER */}\n
    \n \n {logo ? (\n {logo}\n ) : (\n
    \n APP-LOGO\n
    \n )}\n
    \n\n setSidebarOpen(!sidebarOpen)}\n className=\"ml-3 block lg:hidden\"\n >\n \n \n \n \n
    \n {/* END SIDEBAR HEADER */}\n\n
    \n \n
    \n \n );\n};\n\nexport default Sidebar;\n","import React, { useState, ReactNode } from 'react';\r\nimport Header from '../components/Dashboard/Header/index';\r\nimport Sidebar from '../components/Dashboard/Sidebar/index';\r\nimport { SidebarSection } from '../models/SidebarItemModel';\r\n\r\ntype FooterLink = {\r\n label: string;\r\n href: string;\r\n newTab?: boolean;\r\n};\r\n\r\ninterface DashboardLayoutProps {\r\n children: ReactNode;\r\n sidebarContent: SidebarSection[];\r\n logo: ReactNode;\r\n onLogout?: () => void;\r\n\r\n footer?: {\r\n /**\r\n * Advanced: fully custom footer blocks (you control the JSX).\r\n */\r\n blocks?: ReactNode[];\r\n /**\r\n * Simple preset: provide data only, template renders a styled footer.\r\n */\r\n preset?: {\r\n leftText: string;\r\n links?: FooterLink[];\r\n version?: string;\r\n };\r\n /**\r\n * Optional className override on the
    wrapper.\r\n */\r\n className?: string;\r\n };\r\n}\r\n\r\nconst DashboardLayout: React.FC = ({\r\n children,\r\n sidebarContent,\r\n logo,\r\n onLogout,\r\n footer,\r\n}) => {\r\n const [sidebarOpen, setSidebarOpen] = useState(false);\r\n\r\n const hasPreset = Boolean(footer?.preset);\r\n const hasBlocks = Boolean(footer?.blocks && footer.blocks.length > 0);\r\n\r\n return (\r\n
    \r\n
    \r\n {/* Sidebar */}\r\n \r\n\r\n {/* Main content column */}\r\n
    \r\n
    \r\n\r\n
    \r\n {/* Content */}\r\n
    \r\n
    {children}
    \r\n
    \r\n\r\n {/* Sticky footer (preset has priority over blocks) */}\r\n {hasPreset ? (\r\n
    \r\n
    \r\n
    \r\n
    {footer?.preset?.leftText}
    \r\n\r\n
    \r\n {footer?.preset?.links?.length ? (\r\n
    \r\n {footer.preset.links.map((l) => {\r\n const newTab = l.newTab ?? true; // default: new tab\r\n return (\r\n \r\n {l.label}\r\n \r\n );\r\n })}\r\n
    \r\n ) : null}\r\n\r\n {footer?.preset?.version ? (\r\n {footer.preset.version}\r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n ) : hasBlocks ? (\r\n
    \r\n
    \r\n
    \r\n {footer!.blocks!.map((block, idx) => (\r\n {block}\r\n ))}\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default DashboardLayout;\r\n","import React from 'react';\n\nconst Loader = (): JSX.Element => {\n return (\n
    \n
    \n
    \n );\n};\nexport default Loader;\n","import { useState, useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLocation } from 'react-router';\nimport DashboardLayout from '../layout/DashboardLayout';\nimport Loader from '../common/Loader';\n\n// Existing (legacy) sidebar model used by current Template implementation\nimport { SidebarSection } from '../models/SidebarItemModel';\n\n// New typed configs (non-breaking additions)\nimport type {\n TemplateSidebarConfig,\n TemplateNavbarConfig,\n TemplateFooterConfig,\n} from './layoutTypes';\n\n/**\n * Props for the `Template` (Dashboard Shell) component.\n * Backward compatible with legacy sidebar/logo/onLogout while\n * supporting modern `sidebar`, `navbar`, and optional `footer` configs.\n */\nexport interface DashboardProps {\n children: ReactNode;\n\n /**\n * Legacy props (backward compatible)\n */\n sidebarContent?: SidebarSection[];\n logo?: ReactNode;\n onLogout?: () => void;\n\n /**\n * New config props (preferred)\n */\n sidebar?: TemplateSidebarConfig;\n navbar?: TemplateNavbarConfig;\n\n /**\n * Optional footer (rendered inside DashboardLayout when provided)\n */\n footer?: TemplateFooterConfig;\n}\n\n/**\n * Template (Dashboard Shell)\n *\n * Backward compatible:\n * - Existing apps can keep using: sidebarContent + logo + onLogout\n * Preferred:\n * - New apps should use: sidebar + navbar (+ footer when needed)\n */\nfunction Template({\n children,\n sidebarContent = [],\n logo,\n onLogout,\n navbar,\n footer,\n}: DashboardProps): JSX.Element {\n const [loading, setLoading] = useState(true);\n const { pathname } = useLocation();\n\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n useEffect(() => {\n setTimeout(() => setLoading(false), 1000);\n }, []);\n\n /**\n * Resolve \"brand\" area:\n * - Prefer navbar.brandSlot\n * - Else map legacy `logo` prop (deprecated) to brandSlot\n * - Else fall back to simple navbar.brand config if provided\n */\n const resolvedBrandNode: ReactNode | undefined =\n navbar?.brandSlot ??\n logo ??\n (navbar?.brand ? (\n \n {navbar.brand.logoSrc ? (\n \n ) : (\n {navbar.brand.title ?? ''}\n )}\n \n ) : undefined);\n\n /**\n * Resolve sidebar:\n * - For now, if `sidebar` is provided, we still pass legacy sidebarContent through,\n * because DashboardLayout currently expects SidebarSection[].\n */\n const resolvedLegacySidebarContent: SidebarSection[] = sidebarContent;\n\n return loading ? (\n \n ) : (\n \n {children}\n \n );\n}\n\nexport default Template;\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\n/**\r\n * Props for `Breadcrumb` component.\r\n * - `pageName`: current page label displayed in the trail.\r\n */\r\nexport interface BreadcrumbProps {\r\n pageName: string;\r\n}\r\n\r\n/**\r\n * Accessible breadcrumb navigation.\r\n * Renders a current page label and a link to home.\r\n */\r\nconst Breadcrumb: React.FC = ({ pageName }) => {\r\n const t = useT('templateFe');\r\n\r\n return (\r\n
    \r\n

    {pageName}

    \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default Breadcrumb;\r\n","import { useState } from 'react';\nimport type { ReactNode, ChangeEvent, FormEvent } from 'react';\nimport { ZodSchema, ZodError } from 'zod';\nimport { MultiValue } from 'react-select';\nimport Select from 'react-select';\nimport { FieldConfigDynamicForm } from '../../models/FieldConfigDynamicForm';\n\nexport interface ControlledZodDynamicFormProps {\n schema: ZodSchema>;\n fields: FieldConfigDynamicForm[];\n values: Record;\n onChangeField: (fieldName: string, newValue: unknown) => void;\n onSubmit: (parsedValues: Record) => void;\n submitLabel?: string;\n header?: ReactNode;\n /** Optional override for the ZodError class (for dependency injection) */\n}\n\nexport default function ControlledZodDynamicForm({\n schema,\n fields,\n values,\n onChangeField,\n onSubmit,\n submitLabel = 'Submit',\n header,\n}: ControlledZodDynamicFormProps): JSX.Element {\n const [errors, setErrors] = useState>({});\n\n /**\n * Handler for standard text/textarea/select/checkbox inputs.\n * Uses a type guard so we can safely read e.target.checked if it's a checkbox.\n */\n function handleInputChange(\n e: ChangeEvent,\n ): void {\n const { name, value, type } = e.target;\n let newValue: unknown = value;\n\n // type guard for checkbox\n if (type === 'checkbox' && e.target instanceof HTMLInputElement) {\n newValue = e.target.checked;\n } else if (type === 'number') {\n newValue = parseFloat(value) || 0;\n }\n onChangeField(name, newValue);\n }\n\n /**\n * On form submit => parse the entire `values` with Zod.\n * If it fails, store the error messages in local state to display.\n */\n function handleSubmit(e: FormEvent): void {\n e.preventDefault();\n try {\n // Attempt to parse the entire form data with Zod\n const parsed = schema.parse(values);\n // If success, call parent\n onSubmit(parsed);\n } catch (err) {\n if (err instanceof ZodError) {\n // Build a record of errors for simpler fields\n const newErrors: Record = {};\n\n // Check if any error is specifically for \"details\" path\n let detailsErrorFound = false;\n\n err.errors.forEach((issue) => {\n const pathKey = issue.path.join('.');\n newErrors[pathKey] = issue.message;\n\n // If the path starts with \"details\", we assume it's a problem with details\n if (issue.path[0] === 'details') {\n detailsErrorFound = true;\n }\n });\n\n // If there's an error in \"details\", show an alert\n if (detailsErrorFound) {\n alert('Please fill out all required fields in Details.');\n }\n\n setErrors(newErrors);\n }\n }\n }\n\n return (\n
    \n {/* header */}\n {header &&
    {header}
    }\n\n {/* form */}\n {fields.map((field) => {\n const fieldError = errors[field.name];\n const fieldValue = values[field.name] ?? '';\n\n return (\n
    \n \n\n {(() => {\n switch (field.type) {\n case 'textarea':\n return (\n \n );\n\n case 'select':\n return (\n \n \n {field.options?.map((opt) => (\n \n ))}\n \n );\n\n case 'checkbox':\n return (\n \n );\n\n case 'multiSelect': {\n // We assume `field.options` is an array of { label: string, value: string }.\n const multiOpts = field.options ?? [];\n // The user’s current selection is an array of IDs => find the matching option or fallback\n const selectedValues = Array.isArray(fieldValue)\n ? fieldValue.map((id: string) => {\n const found = multiOpts.find((o) => o.value === id);\n if (found) return found;\n // fallback => ensures a unique string value\n return {\n label: String(id) || '???',\n value: String(id),\n };\n })\n : [];\n\n return (\n ,\n ) => {\n const arrIds = selected.map((opt) => opt.value);\n onChangeField(field.name, arrIds);\n }}\n className=\"w-full\"\n />\n );\n }\n case 'custom': {\n const CustomComp = field.component; // e.g. DetailsManager\n if (!CustomComp) {\n return (\n

    \n Missing component for custom field: {field.name}\n

    \n );\n }\n\n // Get nested errors for field \"details\" or whatever the field's name is\n const subErrors = findNestedErrors(errors, field.name);\n // subErrors might look like { 0: { grams: \"Error message\" }, 1: { price: \"Error\" } }\n\n return (\n onChangeField(field.name, newVal)}\n errors={subErrors}\n {...field.props}\n // optionally pass more props if needed\n />\n );\n }\n\n default:\n // text or number\n return (\n \n );\n }\n })()}\n\n {fieldError &&

    {fieldError}

    }\n
    \n );\n })}\n\n
    \n \n {submitLabel}\n \n
    \n
    \n );\n}\n\n//Show erros validation\nexport function findNestedErrors(\n allErrors: Record,\n rootField: string,\n): Record> {\n const nested: Record> = {};\n\n // For each key => e.g. \"details.0.grams\"\n for (const key in allErrors) {\n if (key.startsWith(`${rootField}.`)) {\n // remove \"details.\" => \"0.grams\"\n const subPath = key.slice(rootField.length + 1); // e.g. \"0.grams\"\n const [indexStr, fieldName] = subPath.split('.');\n const index = parseInt(indexStr, 10);\n\n if (!isNaN(index)) {\n if (!nested[index]) {\n nested[index] = {};\n }\n nested[index][fieldName] = allErrors[key];\n }\n }\n }\n\n return nested;\n}\n","import React from 'react';\nimport { useT } from '@ciscode/ui-translate-core';\n\ninterface TableErrorBoundaryState {\n hasError: boolean;\n}\n\nclass TableErrorBoundary extends React.Component<\n React.PropsWithChildren,\n TableErrorBoundaryState\n> {\n constructor(props: React.PropsWithChildren) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): TableErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: unknown, errorInfo: unknown): void {\n console.error('TableErrorBoundary caught an error:', error, errorInfo);\n }\n\n render(): React.ReactNode {\n if (this.state.hasError) {\n // You can't use hooks like useT inside a class component,\n // so we wrap it in a functional HOC instead.\n return ;\n }\n\n return this.props.children;\n }\n}\n\nconst TranslatedErrorMessage = (): JSX.Element => {\n const t = useT('template-fe');\n return (\n
    \n {t('table.errorBoundary.fallbackMessage')}\n
    \n );\n};\n\nexport default TableErrorBoundary;\n","/**\r\n * Generate a compact page list for pagination controls.\r\n * Includes first/last pages and ellipses around the current.\r\n */\r\nexport function generatePageNumbers(current: number, total: number): (number | string)[] {\r\n const maxPagesToShow = 5;\r\n const pages: (number | string)[] = [];\r\n\r\n // If total is small, just show them all\r\n if (total <= maxPagesToShow) {\r\n for (let i = 1; i <= total; i++) {\r\n pages.push(i);\r\n }\r\n return pages;\r\n }\r\n\r\n // Always show first page\r\n pages.push(1);\r\n\r\n // Determine start/end range near current\r\n const start = Math.max(2, current - 1);\r\n const end = Math.min(total - 1, current + 1);\r\n\r\n // Ellipses before start if needed\r\n if (start > 2) {\r\n pages.push('...');\r\n }\r\n\r\n // Range in the middle\r\n for (let i = start; i <= end; i++) {\r\n pages.push(i);\r\n }\r\n\r\n // Ellipses after end if needed\r\n if (end < total - 1) {\r\n pages.push('...');\r\n }\r\n\r\n // Always show last page\r\n pages.push(total);\r\n\r\n return pages;\r\n}\r\n","import React from 'react';\n\nexport const TableLoader = (): JSX.Element => {\n return (\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n );\n};\n","import React, { useEffect, useRef } from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\nexport interface TablePopoverProps {\r\n anchor: HTMLElement | null;\r\n children: React.ReactNode;\r\n onClose: () => void;\r\n}\r\n\r\nexport const TablePopover: React.FC = ({ anchor, children, onClose }) => {\r\n const popoverRef = useRef(null);\r\n\r\n useEffect(() => {\r\n function handleClick(e: MouseEvent) {\r\n if (\r\n popoverRef.current &&\r\n !popoverRef.current.contains(e.target as Node) &&\r\n anchor &&\r\n !anchor.contains(e.target as Node)\r\n ) {\r\n onClose();\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClick);\r\n return () => document.removeEventListener('mousedown', handleClick);\r\n }, [anchor, onClose]);\r\n\r\n if (!anchor) return null;\r\n\r\n const rect = anchor.getBoundingClientRect();\r\n const style: React.CSSProperties = {\r\n position: 'fixed',\r\n top: rect.bottom + 8,\r\n left: rect.left,\r\n zIndex: 9999,\r\n background: 'white',\r\n border: '1px solid #e5e7eb',\r\n borderRadius: 12,\r\n boxShadow: '0 8px 32px 0 rgba(60,60,60,0.18)',\r\n padding: 0,\r\n minWidth: 200,\r\n animation: 'fadeIn 0.18s',\r\n };\r\n\r\n return ReactDOM.createPortal(\r\n
    \r\n
    \r\n
    \r\n
    \r\n {children}\r\n \r\n \r\n \r\n \r\n \r\n
    ,\r\n document.body,\r\n );\r\n};\r\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { generatePageNumbers } from '../../hooks/useGeneratePageNumbers';\nimport { TableLoader } from '../../common/Loader/TableLoader';\nimport { ToolbarItem } from '../../models/ToolbarItemModel';\nimport { ColumnConfigTable } from '../../models/ColumnConfigTable';\nimport { useT } from '@ciscode/ui-translate-core';\nimport { TablePopover } from './TablePopover';\n\ntype InlineEditableCellProps = {\n value: unknown;\n row: T;\n rowIndex: number;\n columnKey: keyof T;\n onCommit: (next: unknown) => void;\n editor?: (args: {\n value: unknown;\n row: T;\n rowIndex: number;\n onChange: (next: unknown) => void;\n onCommit: () => void;\n onCancel: () => void;\n }) => React.ReactNode;\n className?: string;\n children: React.ReactNode;\n};\n\nfunction InlineEditableCell(props: InlineEditableCellProps): JSX.Element {\n const { value, row, rowIndex, onCommit, editor, children } = props;\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(value ?? '');\n\n const startEdit = useCallback(() => {\n setDraft(value ?? '');\n setEditing(true);\n }, [value]);\n\n const commit = useCallback(() => {\n setEditing(false);\n onCommit(draft);\n }, [draft, onCommit]);\n\n const cancel = useCallback(() => {\n setEditing(false);\n setDraft(value ?? '');\n }, [value]);\n\n if (!editing) {\n return (\n
    \n {children}\n
    \n );\n }\n\n if (editor) {\n return (\n
    \n {editor({\n value: draft,\n row,\n rowIndex,\n onChange: setDraft,\n onCommit: commit,\n onCancel: cancel,\n })}\n
    \n );\n }\n\n return (\n setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit();\n if (e.key === 'Escape') cancel();\n }}\n className=\"px-2 py-1 text-sm border rounded-md dark:bg-gray-700 dark:text-white\"\n />\n );\n}\n\n/**\n * Pagination configuration for table navigation.\n */\nexport type PaginationProps = {\n currentPage: number;\n totalPages: number;\n totalItems: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n};\n\n/**\n * Props for `TableDataCustom` and base component.\n */\nexport interface TableDataCustomProps {\n columns: ColumnConfigTable[];\n data: T[];\n loading?: boolean;\n pagination?: PaginationProps;\n errorMessage?: string | null;\n toolbarItems?: ToolbarItem[];\n\n /** Feature toggles */\n enableSelection?: boolean;\n enableSorting?: boolean;\n enableFilter?: boolean;\n enableInlineEdit?: boolean;\n\n /** Filtering (controlled/uncontrolled) */\n filterQuery?: string;\n onFilterQueryChange?: (query: string) => void;\n\n /** Selection callback */\n onSelectionChange?: (selectedRows: T[], selectedIndices: number[]) => void;\n\n /** Inline cell edit callback */\n onCellEdit?: (rowIndex: number, columnKey: keyof T, nextValue: unknown, row: T) => void;\n}\n\n/**\n * Internal base table component that renders the table UI.\n * Consumers should use `TableDataCustom` which wraps this with an error boundary.\n */\nfunction TableDataCustomBase({\n columns,\n data,\n errorMessage,\n pagination,\n loading,\n toolbarItems,\n enableSelection,\n enableSorting,\n enableFilter,\n enableInlineEdit,\n filterQuery,\n onFilterQueryChange,\n onSelectionChange,\n onCellEdit,\n}: TableDataCustomProps): JSX.Element {\n const t = useT('templateFe');\n\n // split toolbar items\n const leftItems = (toolbarItems ?? []).filter(\n (it) => it.visible !== false && (it.position ?? 'left') === 'left',\n );\n const rightItems = (toolbarItems ?? []).filter(\n (it) => it.visible !== false && it.position === 'right',\n );\n const [popover, setPopover] = useState<{\n anchor: HTMLElement | null;\n content: React.ReactNode;\n } | null>(null);\n const closePopover = useCallback(() => setPopover(null), []);\n\n // Selection state (indices within visible data)\n const [selected, setSelected] = useState>(new Set());\n const toggleSelectAll = useCallback((checked: boolean, count: number) => {\n const next = new Set();\n if (checked) {\n for (let i = 0; i < count; i++) next.add(i);\n }\n setSelected(next);\n }, []);\n\n const toggleRowSelection = useCallback((index: number) => {\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n }, []);\n\n // Sorting state\n const [sortBy, setSortBy] = useState(null);\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc');\n const onHeaderClick = useCallback(\n (colIndex: number, col: ColumnConfigTable) => {\n if (!enableSorting || col.sortable === false) return;\n setSortBy((prev) => (prev === colIndex ? colIndex : colIndex));\n setSortDir((prev) => (sortBy === colIndex ? (prev === 'asc' ? 'desc' : 'asc') : 'asc'));\n },\n [enableSorting, sortBy],\n );\n\n // Filtering state (uncontrolled fallback)\n const [internalQuery, setInternalQuery] = useState('');\n const activeQuery = (filterQuery ?? internalQuery).trim();\n\n // Build visible rows: filter then sort\n const visibleData = useMemo(() => {\n let rows = [...data];\n if (enableFilter && activeQuery.length > 0) {\n const q = activeQuery.toLowerCase();\n rows = rows.filter((row) => {\n return columns.some((col) => {\n const keys = Array.isArray(col.key) ? col.key : [col.key];\n const val = keys\n .map((k) => String((row[k as keyof T] as unknown) ?? ''))\n .join(' ') // combine multi-key cells\n .toLowerCase();\n if (col.filterPredicate) {\n return col.filterPredicate(val, row, q);\n }\n return val.includes(q);\n });\n });\n }\n if (enableSorting && sortBy != null) {\n const col = columns[sortBy];\n rows.sort((a, b) => {\n const keys = Array.isArray(col.key) ? col.key : [col.key];\n const va = keys.map((k) => a[k as keyof T] as unknown);\n const vb = keys.map((k) => b[k as keyof T] as unknown);\n const left = va.length > 1 ? va.join(' ') : va[0];\n const right = vb.length > 1 ? vb.join(' ') : vb[0];\n let cmp = 0;\n if (typeof col.sortComparator === 'function') {\n cmp = col.sortComparator(left, right, a, b);\n } else {\n const la = left ?? '';\n const lb = right ?? '';\n const sa = String(la).toLowerCase();\n const sb = String(lb).toLowerCase();\n if (sa < sb) cmp = -1;\n else if (sa > sb) cmp = 1;\n else cmp = 0;\n }\n return sortDir === 'asc' ? cmp : -cmp;\n });\n }\n return rows;\n }, [data, columns, enableFilter, activeQuery, enableSorting, sortBy, sortDir]);\n\n // Notify selection changes\n React.useEffect(() => {\n if (!onSelectionChange) return;\n const indices = Array.from(selected.values()).sort((a, b) => a - b);\n const rows = indices.map((i) => visibleData[i]).filter(Boolean);\n onSelectionChange(rows, indices);\n }, [selected, visibleData, onSelectionChange]);\n\n return (\n
    \n {popover && (\n \n {popover.content}\n \n )}\n
    \n
    \n {/* Toolbar */}\n {(leftItems.length > 0 || rightItems.length > 0 || enableFilter) && (\n
    \n
    \n {leftItems.map((it, i) => (\n \n {it.node}\n \n ))}\n {enableFilter && (\n \n onFilterQueryChange\n ? onFilterQueryChange(e.target.value)\n : setInternalQuery(e.target.value)\n }\n placeholder={t('table.filter') ?? 'Filter…'}\n className=\"px-3 py-2 text-sm border rounded-md dark:bg-gray-700 dark:text-white\"\n />\n )}\n
    \n
    \n {rightItems.map((it, i) => (\n \n {it.node}\n \n ))}\n
    \n
    \n )}\n\n {/* Table */}\n
    \n \n \n \n {enableSelection && (\n \n )}\n {columns.map((col, i) => (\n onHeaderClick(i, col)}\n title={enableSorting && col.sortable !== false ? 'Sort' : undefined}\n >\n \n {col.title}\n {enableSorting && sortBy === i && (\n \n {sortDir === 'asc' ? (\n \n ) : (\n \n )}\n \n )}\n \n \n ))}\n \n \n \n {loading ? (\n \n \n \n \n \n ) : errorMessage ? (\n \n \n {errorMessage}\n \n \n ) : visibleData.length === 0 ? (\n \n \n {t('table.noData')}\n \n \n ) : (\n visibleData.map((row, r) => (\n \n {enableSelection && (\n \n )}\n {columns.map((col, c) => {\n let content: React.ReactNode;\n if (Array.isArray(col.key)) {\n const vals = col.key.map((k) => row[k] ?? '');\n const display = vals.join(' - ');\n content = col.render ? col.render(vals, row, setPopover) : display;\n } else {\n const val = row[col.key];\n const display = String(val ?? '');\n // Inline editing: per-cell editing on double-click\n if (enableInlineEdit && col.editable) {\n content = (\n onCellEdit?.(r, col.key as keyof T, next, row)}\n editor={col.editor}\n className={col.cellClassName}\n >\n {col.render ? col.render(val, row, setPopover) : display}\n \n );\n } else {\n content = col.render ? col.render(val, row, setPopover) : display;\n }\n }\n return (\n \n {content}\n \n );\n })}\n \n ))\n )}\n \n
    \n 0 && selected.size === visibleData.length}\n onChange={(e) => toggleSelectAll(e.target.checked, visibleData.length)}\n />\n
    \n toggleRowSelection(r)}\n />\n
    \n
    \n\n {/* Pagination */}\n {pagination && (\n \n \n {t('table.pagination.showing', {\n from: (pagination.currentPage - 1) * (pagination.pageSize ?? 10) + 1,\n to: Math.min(\n pagination.currentPage * (pagination.pageSize ?? 10),\n pagination.totalItems,\n ),\n total: pagination.totalItems,\n })}\n \n\n
      \n {/* Previous */}\n
    • \n pagination.onPageChange?.(pagination.currentPage - 1)}\n disabled={pagination.currentPage <= 1}\n className=\"flex items-center justify-center h-full py-1.5 px-3 ml-0 text-gray-500 bg-white rounded-l-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\"\n >\n {t('table.pagination.previous')}\n \n \n \n \n
    • \n\n {/* Pages */}\n {generatePageNumbers(pagination.currentPage, pagination.totalPages).map((p, i) =>\n typeof p === 'string' ? (\n
    • \n \n {p}\n \n
    • \n ) : (\n
    • \n pagination.onPageChange?.(p)}\n className={`flex items-center justify-center px-3 py-2 text-sm border ${\n p === pagination.currentPage\n ? 'z-10 text-primary-600 bg-primary-50 border-primary-300 hover:bg-primary-100 hover:text-primary-700 dark:bg-gray-700 dark:text-white dark:border-gray-700'\n : 'text-gray-500 bg-white border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-700 dark:hover:bg-gray-700'\n }`}\n >\n {p}\n \n
    • \n ),\n )}\n\n {/* Next */}\n
    • \n pagination.onPageChange?.(pagination.currentPage + 1)}\n disabled={pagination.currentPage >= pagination.totalPages}\n className=\"flex items-center justify-center h-full py-1.5 px-3 leading-tight text-gray-500 bg-white rounded-r-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\"\n >\n {t('table.pagination.next')}\n \n \n \n \n
    • \n
    \n \n )}\n
    \n
    \n
    \n );\n}\n\nexport default TableDataCustomBase;\n","import React from 'react';\nimport TableErrorBoundary from '../../exceptions/TableErrorBoundary';\nimport TableDataCustomBase, { TableDataCustomProps } from './TableDataCustomBase';\n\n/**\n * Public table component with built-in error boundary.\n * Wraps `TableDataCustomBase` in `TableErrorBoundary` to provide a safe fallback.\n * Consumers should import `TableDataCustom` from the package root.\n */\nfunction TableDataCustom(props: TableDataCustomProps): JSX.Element {\n return (\n \n \n \n );\n}\n\nexport default TableDataCustom;\n","import { useRef } from 'react';\r\nimport type { ReactNode, PointerEvent } from 'react';\r\n\r\ntype Props = {\r\n title?: string;\r\n children: ReactNode;\r\n onStartDrag?: (e: PointerEvent) => void;\r\n onStartResize?: (e: PointerEvent) => void; // legacy: header square\r\n onStartResizeEast?: (e: PointerEvent) => void;\r\n onStartResizeSouth?: (e: PointerEvent) => void;\r\n onStartResizeSouthEast?: (e: PointerEvent) => void;\r\n draggable?: boolean;\r\n resizable?: boolean;\r\n onRemove?: () => void;\r\n onDuplicate?: () => void;\r\n};\r\n\r\nexport default function WidgetContainer({ title, children, onStartDrag, onStartResize, onStartResizeEast, onStartResizeSouth, onStartResizeSouthEast, draggable = true, resizable = true, onRemove, onDuplicate }: Props): JSX.Element {\r\n const headerRef = useRef(null);\r\n\r\n return (\r\n
    \r\n {\r\n // Only attach interactions if enabled\r\n if (e.shiftKey && resizable && onStartResize) return onStartResize(e);\r\n if (draggable) onStartDrag?.(e);\r\n }}\r\n >\r\n {title}\r\n
    \r\n {typeof onDuplicate === 'function' ? (\r\n e.stopPropagation()}\r\n aria-label=\"Duplicate widget\"\r\n title=\"Duplicate\"\r\n >\r\n ⧉\r\n \r\n ) : null}\r\n {typeof onRemove === 'function' ? (\r\n e.stopPropagation()}\r\n aria-label=\"Remove widget\"\r\n title=\"Remove\"\r\n >\r\n ×\r\n \r\n ) : null}\r\n {resizable ? (\r\n \r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n {children}\r\n
    \r\n {resizable ? (\r\n <>\r\n {/* East (right) edge handle */}\r\n { e.stopPropagation(); onStartResizeEast?.(e); }}\r\n aria-label=\"Resize east\"\r\n />\r\n {/* South (bottom) edge handle */}\r\n { e.stopPropagation(); onStartResizeSouth?.(e); }}\r\n aria-label=\"Resize south\"\r\n />\r\n {/* South-East corner handle */}\r\n { e.stopPropagation(); onStartResizeSouthEast?.(e); }}\r\n aria-label=\"Resize south-east\"\r\n />\r\n \r\n ) : null}\r\n
    \r\n );\r\n}\r\n","import type { WidgetPosition } from '../../../models/DashboardWidget';\r\n\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n\r\nexport function roundToCell(px: number, cell: number): number {\r\n return Math.round(px / cell);\r\n}\r\n\r\nexport function positionToStyle(pos: WidgetPosition): {\r\n gridColumnStart: number;\r\n gridColumnEnd: number;\r\n gridRowStart: number;\r\n gridRowEnd: number;\r\n} {\r\n return {\r\n gridColumnStart: pos.x + 1,\r\n gridColumnEnd: pos.x + 1 + pos.w,\r\n gridRowStart: pos.y + 1,\r\n gridRowEnd: pos.y + 1 + pos.h,\r\n };\r\n}\r\n\r\nexport function intersects(a: WidgetPosition, b: WidgetPosition): boolean {\r\n const ax2 = a.x + a.w;\r\n const ay2 = a.y + a.h;\r\n const bx2 = b.x + b.w;\r\n const by2 = b.y + b.h;\r\n // no overlap if one rectangle is completely to one side of the other\r\n const noOverlap = ax2 <= b.x || bx2 <= a.x || ay2 <= b.y || by2 <= a.y;\r\n return !noOverlap;\r\n}\r\n","import type { ChartAdapter, ChartKind } from '../../../models/DashboardWidget';\r\n\r\n// Minimal default chart adapter using plain SVG.\r\nexport const DefaultChartAdapter: ChartAdapter = {\r\n render(kind: ChartKind, props: Record): JSX.Element {\r\n switch (kind) {\r\n case 'bar':\r\n return renderBar(props);\r\n case 'line':\r\n return renderLine(props);\r\n case 'pie':\r\n return renderPie(props);\r\n default:\r\n return
    Unknown chart kind
    ;\r\n }\r\n },\r\n};\r\n\r\nfunction coerceNumbers(value: unknown): number[] {\r\n if (Array.isArray(value)) {\r\n return value.map((v) => (typeof v === 'number' ? v : Number(v))).filter((v) => !Number.isNaN(v));\r\n }\r\n return [];\r\n}\r\n\r\nfunction renderBar(props: Record): JSX.Element {\r\n const data = coerceNumbers(props.data);\r\n const width = (typeof props.width === 'number' ? props.width : 300) as number;\r\n const height = (typeof props.height === 'number' ? props.height : 120) as number;\r\n const padding = 16;\r\n const max = Math.max(1, ...data);\r\n const barWidth = (width - padding * 2) / Math.max(1, data.length);\r\n const color = typeof props.color === 'string' ? (props.color as string) : '#4f46e5';\r\n\r\n return (\r\n \r\n {data.map((v, i) => {\r\n const h = ((height - padding * 2) * v) / max;\r\n const x = padding + i * barWidth + barWidth * 0.1;\r\n const y = height - padding - h;\r\n return ;\r\n })}\r\n \r\n );\r\n}\r\n\r\nfunction renderLine(props: Record): JSX.Element {\r\n const data = coerceNumbers(props.data);\r\n const width = (typeof props.width === 'number' ? props.width : 300) as number;\r\n const height = (typeof props.height === 'number' ? props.height : 120) as number;\r\n const padding = 16;\r\n const max = Math.max(1, ...data);\r\n const color = typeof props.color === 'string' ? (props.color as string) : '#16a34a';\r\n const points = data.map((v, i) => {\r\n const x = padding + i * ((width - padding * 2) / Math.max(1, data.length - 1));\r\n const y = height - padding - ((height - padding * 2) * v) / max;\r\n return `${x},${y}`;\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nfunction renderPie(props: Record): JSX.Element {\r\n const data = coerceNumbers(props.data);\r\n const size = (typeof props.size === 'number' ? props.size : 120) as number;\r\n const radius = size / 2;\r\n const total = data.reduce((acc, v) => acc + v, 0) || 1;\r\n const colors = Array.isArray(props.colors) ? (props.colors as string[]) : ['#f97316', '#22c55e', '#3b82f6', '#e11d48'];\r\n\r\n let startAngle = 0;\r\n const slices = data.map((v, i) => {\r\n const angle = (v / total) * Math.PI * 2;\r\n const x1 = radius + radius * Math.cos(startAngle);\r\n const y1 = radius + radius * Math.sin(startAngle);\r\n const x2 = radius + radius * Math.cos(startAngle + angle);\r\n const y2 = radius + radius * Math.sin(startAngle + angle);\r\n const largeArc = angle > Math.PI ? 1 : 0;\r\n const path = `M ${radius},${radius} L ${x1},${y1} A ${radius},${radius} 0 ${largeArc} 1 ${x2},${y2} z`;\r\n startAngle += angle;\r\n return ;\r\n });\r\n\r\n return (\r\n \r\n {slices}\r\n \r\n );\r\n}\r\n","import { useRef, useState } from 'react';\r\nimport type { PointerEvent } from 'react';\r\nimport type { BaseWidgetConfig, DashboardLayout, GridConfig, WidgetId, WidgetPosition, ChartAdapter, ChartKind } from '../../../models/DashboardWidget';\r\nimport WidgetContainer from './WidgetContainer';\r\nimport { positionToStyle, clamp, roundToCell, intersects } from './layoutUtils';\r\nimport { DefaultChartAdapter } from './ChartAdapters';\r\n\r\ntype Props = {\r\n grid: GridConfig;\r\n widgets: DashboardLayout;\r\n onLayoutChange?: (next: DashboardLayout) => void;\r\n renderWidget?: (w: BaseWidgetConfig) => JSX.Element; // host can fully render a custom widget\r\n chartAdapter?: ChartAdapter; // host can render charts using its preferred library\r\n enableDrag?: boolean; // allow moving widgets\r\n enableResize?: boolean; // allow resizing widgets\r\n showActions?: boolean; // show default remove/duplicate actions\r\n};\r\n\r\ntype DragState = {\r\n id: WidgetId;\r\n startX: number; // px\r\n startY: number; // px\r\n origPos: WidgetPosition;\r\n mode: 'move' | 'resize';\r\n edge?: 'e' | 's' | 'se' | 'w' | 'n' | 'sw' | 'ne' | 'nw';\r\n};\r\n\r\nexport default function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapter, enableDrag = true, enableResize = true, showActions = true }: Props): JSX.Element {\r\n const containerRef = useRef(null);\r\n const [layout, setLayout] = useState(widgets);\r\n const [drag, setDrag] = useState(null);\r\n\r\n function commitLayout(next: DashboardLayout): void {\r\n setLayout(next);\r\n onLayoutChange?.(next);\r\n }\r\n\r\n function removeWidget(id: WidgetId): void {\r\n const next = layout.filter((w) => w.id !== id);\r\n commitLayout(next);\r\n }\r\n\r\n function duplicateWidget(id: WidgetId): void {\r\n const idx = findById(id);\r\n if (idx === -1) return;\r\n const src = layout[idx];\r\n // new id\r\n let copyIndex = 2;\r\n let newId: WidgetId = `${src.id}-copy`;\r\n while (layout.some((w) => w.id === newId)) {\r\n newId = `${src.id}-copy-${copyIndex++}`;\r\n }\r\n // Attempt to place to the right, else below, else scan\r\n const rectPos = { ...src.position };\r\n let candidate = { ...rectPos, x: Math.min(rectPos.x + rectPos.w, grid.cols - rectPos.w) };\r\n if (layout.some((w, i) => i !== idx && intersects(candidate, w.position))) {\r\n candidate = { ...rectPos, y: rectPos.y + rectPos.h };\r\n }\r\n // If still collides, scan rows to find first free spot\r\n const isFree = (pos: WidgetPosition): boolean => !layout.some((w) => intersects(pos, w.position));\r\n if (!isFree(candidate)) {\r\n let found = false;\r\n for (let y = 0; y < 100 && !found; y++) {\r\n for (let x = 0; x <= grid.cols - rectPos.w && !found; x++) {\r\n const pos = { x, y, w: rectPos.w, h: rectPos.h };\r\n if (isFree(pos)) {\r\n candidate = pos;\r\n found = true;\r\n }\r\n }\r\n }\r\n }\r\n const copy: BaseWidgetConfig = { ...src, id: newId, position: candidate } as BaseWidgetConfig;\r\n const next = [...layout, copy];\r\n commitLayout(next);\r\n }\r\n\r\n function findById(id: WidgetId): number {\r\n return layout.findIndex((w) => w.id === id);\r\n }\r\n\r\n function startDrag(id: WidgetId, mode: 'move' | 'resize', edge?: DragState['edge']) {\r\n return (e: PointerEvent): void => {\r\n // Respect feature toggles\r\n if (mode === 'move' && !enableDrag) return;\r\n if (mode === 'resize' && !enableResize) return;\r\n const rect = containerRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n const idx = findById(id);\r\n if (idx === -1) return;\r\n const pos = layout[idx].position;\r\n // Capture pointer to the grid container so move/up handlers fire consistently\r\n containerRef.current?.setPointerCapture(e.pointerId);\r\n setDrag({ id, startX: e.clientX - rect.left, startY: e.clientY - rect.top, origPos: { ...pos }, mode, edge });\r\n };\r\n }\r\n\r\n function onPointerMove(e: PointerEvent): void {\r\n if (!drag) return;\r\n const rect = containerRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n const dx = x - drag.startX;\r\n const dy = y - drag.startY;\r\n\r\n const colWidth = (rect.width - (grid.cols - 1) * grid.gap) / grid.cols;\r\n const deltaCols = roundToCell(dx, colWidth);\r\n const deltaRows = roundToCell(dy, grid.rowHeight);\r\n\r\n const idx = findById(drag.id);\r\n if (idx === -1) return;\r\n\r\n const current = layout[idx];\r\n let nextPos: WidgetPosition = { ...drag.origPos };\r\n if (drag.mode === 'move') {\r\n nextPos.x = clamp(drag.origPos.x + deltaCols, 0, grid.cols - drag.origPos.w);\r\n nextPos.y = Math.max(0, drag.origPos.y + deltaRows);\r\n } else {\r\n // directional resize\r\n const edge = drag.edge ?? 'se';\r\n if (edge.includes('e')) {\r\n nextPos.w = clamp(drag.origPos.w + deltaCols, 1, grid.cols - drag.origPos.x);\r\n }\r\n if (edge.includes('s')) {\r\n nextPos.h = Math.max(1, drag.origPos.h + deltaRows);\r\n }\r\n if (edge.includes('w')) {\r\n // moving west edge affects x and w\r\n const newX = clamp(drag.origPos.x + deltaCols, 0, drag.origPos.x + drag.origPos.w - 1);\r\n const deltaX = newX - drag.origPos.x;\r\n nextPos.x = newX;\r\n nextPos.w = Math.max(1, drag.origPos.w - deltaX);\r\n }\r\n if (edge.includes('n')) {\r\n // moving north edge affects y and h\r\n const newY = Math.max(0, drag.origPos.y + deltaRows);\r\n const deltaY = newY - drag.origPos.y;\r\n nextPos.y = newY;\r\n nextPos.h = Math.max(1, drag.origPos.h - deltaY);\r\n }\r\n }\r\n\r\n // prevent overlap: simple check, if collision then skip update\r\n const collides = layout.some((w, i) => i !== idx && intersects(nextPos, w.position));\r\n if (collides) return;\r\n\r\n const next = [...layout];\r\n next[idx] = { ...current, position: nextPos };\r\n setLayout(next);\r\n }\r\n\r\n function onPointerUp(e: PointerEvent): void {\r\n if (!drag) return;\r\n containerRef.current?.releasePointerCapture(e.pointerId);\r\n commitLayout(layout);\r\n setDrag(null);\r\n }\r\n\r\n return (\r\n \r\n {layout.map((w) => (\r\n
    \r\n removeWidget(w.id) : undefined}\r\n onDuplicate={showActions ? () => duplicateWidget(w.id) : undefined}\r\n >\r\n {renderWidget ? renderWidget(w) : }\r\n \r\n
    \r\n ))}\r\n
    \r\n );\r\n}\r\n\r\nfunction DefaultWidgetRenderer({ widget, chartAdapter }: { widget: BaseWidgetConfig; chartAdapter?: ChartAdapter }): JSX.Element {\r\n const { type, props } = widget;\r\n switch (type) {\r\n case 'card':\r\n return
    {String(props?.content ?? 'Card')}
    ;\r\n case 'stat':\r\n return (\r\n
    \r\n {String(props?.value ?? '0')}\r\n {String(props?.label ?? 'Stat')}\r\n
    \r\n );\r\n case 'progress': {\r\n const v = typeof props?.value === 'number' ? props.value : 0;\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    {v}%
    \r\n
    \r\n );\r\n }\r\n case 'activity': {\r\n const items = Array.isArray(props?.items) ? (props!.items as unknown[]) : [];\r\n return (\r\n
      \r\n {items.length === 0 ?
    • No activity
    • : null}\r\n {items.map((it, i) => (\r\n
    • {String(it)}
    • \r\n ))}\r\n
    \r\n );\r\n }\r\n case 'chart': {\r\n const kind = (props?.kind as ChartKind) ?? 'line';\r\n const adapter = chartAdapter ?? DefaultChartAdapter;\r\n return adapter.render(kind, props ?? {});\r\n }\r\n case 'custom':\r\n default:\r\n return
    Provide a custom renderer.
    ;\r\n }\r\n}\r\n","import { useState } from 'react';\n// Optional schema interface to avoid hard dependency on zod\nexport type ParseSchema = { parse: (input: T) => T };\n\n/**\n * Credentials payload for login.\n */\nexport type LoginCredentials = {\n username: string;\n password: string;\n};\n\n/**\n * Result returned by a login service.\n */\nexport type LoginResult = {\n user: TUser;\n token?: string;\n};\n\n/**\n * Options for `useLogin`.\n * Provide a `login` function to integrate with your auth backend, and an optional Zod schema for validation.\n */\nexport type UseLoginOptions = {\n login: (credentials: LoginCredentials) => Promise>;\n schema?: ParseSchema;\n};\n\nexport type UseLoginReturn = {\n values: LoginCredentials;\n update: (key: K, value: LoginCredentials[K]) => void;\n submit: () => Promise>;\n loading: boolean;\n error: string | null;\n result: LoginResult | null;\n};\n\n/**\n * A composable login hook: manages form state, validation, submit, and loading/errors.\n */\nexport function useLogin({\n login,\n schema,\n}: UseLoginOptions): UseLoginReturn {\n const [values, setValues] = useState({ username: '', password: '' });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [result, setResult] = useState | null>(null);\n\n function update(key: K, value: LoginCredentials[K]): void {\n setValues((v: LoginCredentials) => ({ ...v, [key]: value }));\n }\n\n async function submit(): Promise> {\n setError(null);\n setLoading(true);\n try {\n const input = schema ? schema.parse(values) : values;\n const res = await login(input);\n setResult(res);\n return res;\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Login failed';\n setError(message);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, result };\n}\n\nexport default useLogin;\n","import { useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\n/**\n * Generic registration payload.\n */\nexport type RegisterPayload = Record;\n\n/**\n * Options for `useRegister`.\n */\nexport type UseRegisterOptions = {\n register: (payload: RegisterPayload) => Promise;\n schema?: ZodSchema;\n};\n\nexport type UseRegisterReturn = {\n values: RegisterPayload;\n update: (key: K, value: unknown) => void;\n submit: () => Promise;\n loading: boolean;\n error: string | null;\n user: TUser | null;\n};\n\n/**\n * A composable registration hook: manages form state, validation, submit, and loading/errors.\n */\nexport function useRegister({\n register,\n schema,\n}: UseRegisterOptions): UseRegisterReturn {\n const [values, setValues] = useState({});\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [user, setUser] = useState(null);\n\n function update(key: K, value: unknown): void {\n setValues((v) => ({ ...v, [key]: value }));\n }\n\n async function submit(): Promise {\n setError(null);\n setLoading(true);\n try {\n const payload = schema ? schema.parse(values) : values;\n const res = await register(payload);\n setUser(res);\n return res;\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Registration failed';\n setError(message);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, user };\n}\n\nexport default useRegister;\n","import { useState } from 'react';\n// Optional schema interface to avoid hard dependency on zod\nexport type ParseSchema = { parse: (input: T) => T };\n\n/**\n * Password reset input: allow email or username.\n */\nexport type PasswordResetInput = {\n email?: string;\n username?: string;\n};\n\n/**\n * Options for `usePasswordReset`.\n */\nexport type UsePasswordResetOptions = {\n reset: (input: PasswordResetInput) => Promise;\n schema?: ParseSchema;\n};\n\nexport type UsePasswordResetReturn = {\n values: PasswordResetInput;\n update: (key: K, value: PasswordResetInput[K]) => void;\n submit: () => Promise;\n loading: boolean;\n error: string | null;\n success: boolean;\n};\n\n/**\n * A composable password reset hook: manages form state, validation, submit, and loading/errors.\n */\nexport function usePasswordReset({\n reset,\n schema,\n}: UsePasswordResetOptions): UsePasswordResetReturn {\n const [values, setValues] = useState({ email: '' });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [success, setSuccess] = useState(false);\n\n function update(key: K, value: PasswordResetInput[K]): void {\n setValues((v: PasswordResetInput) => ({ ...v, [key]: value }));\n }\n\n async function submit(): Promise {\n setError(null);\n setSuccess(false);\n setLoading(true);\n try {\n const input = schema ? schema.parse(values) : values;\n await reset(input);\n setSuccess(true);\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Password reset failed';\n setError(message);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, success };\n}\n\nexport default usePasswordReset;\n","import { useEffect, useRef } from 'react';\n\n/**\n * Manage ARIA live region announcements.\n * Returns a ref to attach to an element with `aria-live=\"polite\"` or `assertive`.\n * Use `announce()` to set text content.\n */\nexport type LiveRegionReturn = {\n ref: React.MutableRefObject;\n announce: (message: string) => void;\n};\n\nexport function useLiveRegion(): LiveRegionReturn {\n const ref = useRef(null);\n function announce(message: string): void {\n if (ref.current) {\n ref.current.textContent = message;\n }\n }\n return { ref, announce };\n}\n\n/**\n * Trap focus within a container element (e.g., modal) while `active`.\n * Adds keydown handlers to cycle focus.\n */\nexport type FocusTrapReturn = { ref: React.MutableRefObject };\n\nexport function useFocusTrap(active: boolean): FocusTrapReturn {\n const ref = useRef(null);\n\n useEffect(() => {\n if (!active) return;\n const current = ref.current;\n if (!current) return;\n const el: HTMLElement = current;\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') return;\n const focusable = (\n Array.from(\n el.querySelectorAll(\n 'a[href], button, textarea, input, select, [tabindex]:not([tabindex=\"-1\"])',\n ),\n ) as HTMLElement[]\n ).filter((node: HTMLElement) => !node.hasAttribute('disabled'));\n if (focusable.length === 0) return;\n const first: HTMLElement = focusable[0] as HTMLElement;\n const last: HTMLElement = focusable[focusable.length - 1] as HTMLElement;\n const current = document.activeElement as HTMLElement | null;\n\n if (e.shiftKey) {\n if (!current || current === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (!current || current === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n\n el.addEventListener('keydown', onKeyDown);\n return () => {\n el.removeEventListener('keydown', onKeyDown);\n };\n }, [active]);\n\n return { ref };\n}\n","import { useEffect } from 'react';\n\nexport type RovingConfig = {\n /** CSS selector for focusable items inside the container */\n selector: string;\n /** Optional: initial index to focus when mounted */\n initialIndex?: number;\n};\n\n/**\n * Roving tabindex keyboard navigation for lists/menus.\n * Attach to a container element; items should be focusable via `tabindex`.\n */\nexport function useKeyboardNavigation(\n container: HTMLElement | null,\n { selector, initialIndex = 0 }: RovingConfig,\n): void {\n useEffect(() => {\n if (!container) return;\n const items = Array.from(container.querySelectorAll(selector));\n if (items.length === 0) return;\n\n // Initialize tabindex\n items.forEach((el, i) => el.setAttribute('tabindex', i === initialIndex ? '0' : '-1'));\n\n function onKeyDown(e: KeyboardEvent): void {\n const currentIndex = items.findIndex((el) => el === document.activeElement);\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n const next = items[(currentIndex + 1 + items.length) % items.length];\n items.forEach((el) => el.setAttribute('tabindex', '-1'));\n next.setAttribute('tabindex', '0');\n next.focus();\n e.preventDefault();\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n const prev = items[(currentIndex - 1 + items.length) % items.length];\n items.forEach((el) => el.setAttribute('tabindex', '-1'));\n prev.setAttribute('tabindex', '0');\n prev.focus();\n e.preventDefault();\n }\n }\n\n container.addEventListener('keydown', onKeyDown);\n return () => container.removeEventListener('keydown', onKeyDown);\n }, [container, selector, initialIndex]);\n}\n"]} \ No newline at end of file diff --git a/src/components/Dashboard/Widgets/ChartAdapters.tsx b/src/components/Dashboard/Widgets/ChartAdapters.tsx new file mode 100644 index 0000000..05a9c55 --- /dev/null +++ b/src/components/Dashboard/Widgets/ChartAdapters.tsx @@ -0,0 +1,96 @@ +import type { ChartAdapter, ChartKind } from '../../../models/DashboardWidget'; + +// Minimal default chart adapter using plain SVG. +export const DefaultChartAdapter: ChartAdapter = { + render(kind: ChartKind, props: Record): JSX.Element { + switch (kind) { + case 'bar': + return renderBar(props); + case 'line': + return renderLine(props); + case 'pie': + return renderPie(props); + default: + return
    Unknown chart kind
    ; + } + }, +}; + +function coerceNumbers(value: unknown): number[] { + if (Array.isArray(value)) { + return value + .map((v) => (typeof v === 'number' ? v : Number(v))) + .filter((v) => !Number.isNaN(v)); + } + return []; +} + +function renderBar(props: Record): JSX.Element { + const data = coerceNumbers(props.data); + const width = (typeof props.width === 'number' ? props.width : 300) as number; + const height = (typeof props.height === 'number' ? props.height : 120) as number; + const padding = 16; + const max = Math.max(1, ...data); + const barWidth = (width - padding * 2) / Math.max(1, data.length); + const color = typeof props.color === 'string' ? (props.color as string) : '#4f46e5'; + + return ( + + {data.map((v, i) => { + const h = ((height - padding * 2) * v) / max; + const x = padding + i * barWidth + barWidth * 0.1; + const y = height - padding - h; + return ; + })} + + ); +} + +function renderLine(props: Record): JSX.Element { + const data = coerceNumbers(props.data); + const width = (typeof props.width === 'number' ? props.width : 300) as number; + const height = (typeof props.height === 'number' ? props.height : 120) as number; + const padding = 16; + const max = Math.max(1, ...data); + const color = typeof props.color === 'string' ? (props.color as string) : '#16a34a'; + const points = data.map((v, i) => { + const x = padding + i * ((width - padding * 2) / Math.max(1, data.length - 1)); + const y = height - padding - ((height - padding * 2) * v) / max; + return `${x},${y}`; + }); + + return ( + + + + ); +} + +function renderPie(props: Record): JSX.Element { + const data = coerceNumbers(props.data); + const size = (typeof props.size === 'number' ? props.size : 120) as number; + const radius = size / 2; + const total = data.reduce((acc, v) => acc + v, 0) || 1; + const colors = Array.isArray(props.colors) + ? (props.colors as string[]) + : ['#f97316', '#22c55e', '#3b82f6', '#e11d48']; + + let startAngle = 0; + const slices = data.map((v, i) => { + const angle = (v / total) * Math.PI * 2; + const x1 = radius + radius * Math.cos(startAngle); + const y1 = radius + radius * Math.sin(startAngle); + const x2 = radius + radius * Math.cos(startAngle + angle); + const y2 = radius + radius * Math.sin(startAngle + angle); + const largeArc = angle > Math.PI ? 1 : 0; + const path = `M ${radius},${radius} L ${x1},${y1} A ${radius},${radius} 0 ${largeArc} 1 ${x2},${y2} z`; + startAngle += angle; + return ; + }); + + return ( + + {slices} + + ); +} diff --git a/src/components/Dashboard/Widgets/DashboardGrid.tsx b/src/components/Dashboard/Widgets/DashboardGrid.tsx new file mode 100644 index 0000000..1ad666d --- /dev/null +++ b/src/components/Dashboard/Widgets/DashboardGrid.tsx @@ -0,0 +1,284 @@ +import { useRef, useState } from 'react'; +import type { PointerEvent } from 'react'; +import type { + BaseWidgetConfig, + DashboardLayout, + GridConfig, + WidgetId, + WidgetPosition, + ChartAdapter, + ChartKind, +} from '../../../models/DashboardWidget'; +import WidgetContainer from './WidgetContainer'; +import { positionToStyle, clamp, roundToCell, intersects } from './layoutUtils'; +import { DefaultChartAdapter } from './ChartAdapters'; + +type Props = { + grid: GridConfig; + widgets: DashboardLayout; + onLayoutChange?: (next: DashboardLayout) => void; + renderWidget?: (w: BaseWidgetConfig) => JSX.Element; // host can fully render a custom widget + chartAdapter?: ChartAdapter; // host can render charts using its preferred library + enableDrag?: boolean; // allow moving widgets + enableResize?: boolean; // allow resizing widgets + showActions?: boolean; // show default remove/duplicate actions +}; + +type DragState = { + id: WidgetId; + startX: number; // px + startY: number; // px + origPos: WidgetPosition; + mode: 'move' | 'resize'; + edge?: 'e' | 's' | 'se' | 'w' | 'n' | 'sw' | 'ne' | 'nw'; +}; + +export default function DashboardGrid({ + grid, + widgets, + onLayoutChange, + renderWidget, + chartAdapter, + enableDrag = true, + enableResize = true, + showActions = true, +}: Props): JSX.Element { + const containerRef = useRef(null); + const [layout, setLayout] = useState(widgets); + const [drag, setDrag] = useState(null); + + function commitLayout(next: DashboardLayout): void { + setLayout(next); + onLayoutChange?.(next); + } + + function removeWidget(id: WidgetId): void { + const next = layout.filter((w) => w.id !== id); + commitLayout(next); + } + + function duplicateWidget(id: WidgetId): void { + const idx = findById(id); + if (idx === -1) return; + const src = layout[idx]; + // new id + let copyIndex = 2; + let newId: WidgetId = `${src.id}-copy`; + while (layout.some((w) => w.id === newId)) { + newId = `${src.id}-copy-${copyIndex++}`; + } + // Attempt to place to the right, else below, else scan + const rectPos = { ...src.position }; + let candidate = { ...rectPos, x: Math.min(rectPos.x + rectPos.w, grid.cols - rectPos.w) }; + if (layout.some((w, i) => i !== idx && intersects(candidate, w.position))) { + candidate = { ...rectPos, y: rectPos.y + rectPos.h }; + } + // If still collides, scan rows to find first free spot + const isFree = (pos: WidgetPosition): boolean => + !layout.some((w) => intersects(pos, w.position)); + if (!isFree(candidate)) { + let found = false; + for (let y = 0; y < 100 && !found; y++) { + for (let x = 0; x <= grid.cols - rectPos.w && !found; x++) { + const pos = { x, y, w: rectPos.w, h: rectPos.h }; + if (isFree(pos)) { + candidate = pos; + found = true; + } + } + } + } + const copy: BaseWidgetConfig = { ...src, id: newId, position: candidate } as BaseWidgetConfig; + const next = [...layout, copy]; + commitLayout(next); + } + + function findById(id: WidgetId): number { + return layout.findIndex((w) => w.id === id); + } + + function startDrag(id: WidgetId, mode: 'move' | 'resize', edge?: DragState['edge']) { + return (e: PointerEvent): void => { + // Respect feature toggles + if (mode === 'move' && !enableDrag) return; + if (mode === 'resize' && !enableResize) return; + const rect = containerRef.current?.getBoundingClientRect(); + if (!rect) return; + const idx = findById(id); + if (idx === -1) return; + const pos = layout[idx].position; + // Capture pointer to the grid container so move/up handlers fire consistently + containerRef.current?.setPointerCapture(e.pointerId); + setDrag({ + id, + startX: e.clientX - rect.left, + startY: e.clientY - rect.top, + origPos: { ...pos }, + mode, + edge, + }); + }; + } + + function onPointerMove(e: PointerEvent): void { + if (!drag) return; + const rect = containerRef.current?.getBoundingClientRect(); + if (!rect) return; + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + const dx = x - drag.startX; + const dy = y - drag.startY; + + const colWidth = (rect.width - (grid.cols - 1) * grid.gap) / grid.cols; + const deltaCols = roundToCell(dx, colWidth); + const deltaRows = roundToCell(dy, grid.rowHeight); + + const idx = findById(drag.id); + if (idx === -1) return; + + const current = layout[idx]; + const nextPos: WidgetPosition = { ...drag.origPos }; + if (drag.mode === 'move') { + nextPos.x = clamp(drag.origPos.x + deltaCols, 0, grid.cols - drag.origPos.w); + nextPos.y = Math.max(0, drag.origPos.y + deltaRows); + } else { + // directional resize + const edge = drag.edge ?? 'se'; + if (edge.includes('e')) { + nextPos.w = clamp(drag.origPos.w + deltaCols, 1, grid.cols - drag.origPos.x); + } + if (edge.includes('s')) { + nextPos.h = Math.max(1, drag.origPos.h + deltaRows); + } + if (edge.includes('w')) { + // moving west edge affects x and w + const newX = clamp(drag.origPos.x + deltaCols, 0, drag.origPos.x + drag.origPos.w - 1); + const deltaX = newX - drag.origPos.x; + nextPos.x = newX; + nextPos.w = Math.max(1, drag.origPos.w - deltaX); + } + if (edge.includes('n')) { + // moving north edge affects y and h + const newY = Math.max(0, drag.origPos.y + deltaRows); + const deltaY = newY - drag.origPos.y; + nextPos.y = newY; + nextPos.h = Math.max(1, drag.origPos.h - deltaY); + } + } + + // prevent overlap: simple check, if collision then skip update + const collides = layout.some((w, i) => i !== idx && intersects(nextPos, w.position)); + if (collides) return; + + const next = [...layout]; + next[idx] = { ...current, position: nextPos }; + setLayout(next); + } + + function onPointerUp(e: PointerEvent): void { + if (!drag) return; + containerRef.current?.releasePointerCapture(e.pointerId); + commitLayout(layout); + setDrag(null); + } + + return ( +
    + {layout.map((w) => ( +
    + removeWidget(w.id) : undefined} + onDuplicate={showActions ? () => duplicateWidget(w.id) : undefined} + > + {renderWidget ? ( + renderWidget(w) + ) : ( + + )} + +
    + ))} +
    + ); +} + +function DefaultWidgetRenderer({ + widget, + chartAdapter, +}: { + widget: BaseWidgetConfig; + chartAdapter?: ChartAdapter; +}): JSX.Element { + const { type, props } = widget; + switch (type) { + case 'card': + return ( +
    + {String(props?.content ?? 'Card')} +
    + ); + case 'stat': + return ( +
    + + {String(props?.value ?? '0')} + + + {String(props?.label ?? 'Stat')} + +
    + ); + case 'progress': { + const v = typeof props?.value === 'number' ? props.value : 0; + return ( +
    +
    +
    +
    +
    {v}%
    +
    + ); + } + case 'activity': { + const items = Array.isArray(props?.items) ? (props!.items as unknown[]) : []; + return ( +
      + {items.length === 0 ? ( +
    • No activity
    • + ) : null} + {items.map((it, i) => ( +
    • {String(it)}
    • + ))} +
    + ); + } + case 'chart': { + const kind = (props?.kind as ChartKind) ?? 'line'; + const adapter = chartAdapter ?? DefaultChartAdapter; + return adapter.render(kind, props ?? {}); + } + case 'custom': + default: + return ( +
    Provide a custom renderer.
    + ); + } +} diff --git a/src/components/Dashboard/Widgets/WidgetContainer.tsx b/src/components/Dashboard/Widgets/WidgetContainer.tsx new file mode 100644 index 0000000..f2f00fa --- /dev/null +++ b/src/components/Dashboard/Widgets/WidgetContainer.tsx @@ -0,0 +1,122 @@ +import { useRef } from 'react'; +import type { ReactNode, PointerEvent } from 'react'; + +type Props = { + title?: string; + children: ReactNode; + onStartDrag?: (e: PointerEvent) => void; + onStartResize?: (e: PointerEvent) => void; // legacy: header square + onStartResizeEast?: (e: PointerEvent) => void; + onStartResizeSouth?: (e: PointerEvent) => void; + onStartResizeSouthEast?: (e: PointerEvent) => void; + draggable?: boolean; + resizable?: boolean; + onRemove?: () => void; + onDuplicate?: () => void; +}; + +export default function WidgetContainer({ + title, + children, + onStartDrag, + onStartResize, + onStartResizeEast, + onStartResizeSouth, + onStartResizeSouthEast, + draggable = true, + resizable = true, + onRemove, + onDuplicate, +}: Props): JSX.Element { + const headerRef = useRef(null); + + return ( +
    +
    { + // Only attach interactions if enabled + if (e.shiftKey && resizable && onStartResize) return onStartResize(e); + if (draggable) onStartDrag?.(e); + }} + > + {title} +
    + {typeof onDuplicate === 'function' ? ( + + ) : null} + {typeof onRemove === 'function' ? ( + + ) : null} + {resizable ? ( +
    + ) : null} +
    +
    +
    {children}
    + {resizable ? ( + <> + {/* East (right) edge handle */} +
    { + e.stopPropagation(); + onStartResizeEast?.(e); + }} + aria-label="Resize east" + /> + {/* South (bottom) edge handle */} +
    { + e.stopPropagation(); + onStartResizeSouth?.(e); + }} + aria-label="Resize south" + /> + {/* South-East corner handle */} +
    { + e.stopPropagation(); + onStartResizeSouthEast?.(e); + }} + aria-label="Resize south-east" + /> + + ) : null} +
    + ); +} diff --git a/src/components/Dashboard/Widgets/layoutUtils.ts b/src/components/Dashboard/Widgets/layoutUtils.ts new file mode 100644 index 0000000..8fd0173 --- /dev/null +++ b/src/components/Dashboard/Widgets/layoutUtils.ts @@ -0,0 +1,33 @@ +import type { WidgetPosition } from '../../../models/DashboardWidget'; + +export function clamp(value: number, min: number, max: number): number { + return Math.max(min, Math.min(max, value)); +} + +export function roundToCell(px: number, cell: number): number { + return Math.round(px / cell); +} + +export function positionToStyle(pos: WidgetPosition): { + gridColumnStart: number; + gridColumnEnd: number; + gridRowStart: number; + gridRowEnd: number; +} { + return { + gridColumnStart: pos.x + 1, + gridColumnEnd: pos.x + 1 + pos.w, + gridRowStart: pos.y + 1, + gridRowEnd: pos.y + 1 + pos.h, + }; +} + +export function intersects(a: WidgetPosition, b: WidgetPosition): boolean { + const ax2 = a.x + a.w; + const ay2 = a.y + a.h; + const bx2 = b.x + b.w; + const by2 = b.y + b.h; + // no overlap if one rectangle is completely to one side of the other + const noOverlap = ax2 <= b.x || bx2 <= a.x || ay2 <= b.y || by2 <= a.y; + return !noOverlap; +} diff --git a/src/index.ts b/src/index.ts index fd6d230..3eb6c66 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,8 @@ export { default as Template } from './main/dashboard'; export { default as Breadcrumb } from './components/Breadcrumbs/Breadcrumb'; export { default as ControlledZodDynamicForm } from './components/Form/ZodDynamicForm'; export { default as TableDataCustom } from './components/Table/TableDataCustom'; +export { default as DashboardGrid } from './components/Dashboard/Widgets/DashboardGrid'; +export { DefaultChartAdapter } from './components/Dashboard/Widgets/ChartAdapters'; // Hooks (public) export { default as useLocalStorage } from './hooks/useLocalStorage'; @@ -35,6 +37,15 @@ export type { ColumnConfigTable } from './models/ColumnConfigTable'; export type { FieldConfigDynamicForm } from './models/FieldConfigDynamicForm'; export type { ToolbarItem } from './models/ToolbarItemModel'; export type { SidebarItem, SidebarSection } from './models/SidebarItemModel'; +export type { + DashboardLayout, + GridConfig, + WidgetPosition, + WidgetType, + BaseWidgetConfig, + ChartAdapter, + ChartKind, +} from './models/DashboardWidget'; // Types (component props) export type { BreadcrumbProps } from './components/Breadcrumbs/Breadcrumb'; diff --git a/src/models/DashboardWidget.ts b/src/models/DashboardWidget.ts new file mode 100644 index 0000000..d9f701d --- /dev/null +++ b/src/models/DashboardWidget.ts @@ -0,0 +1,39 @@ +export type WidgetType = 'card' | 'stat' | 'progress' | 'activity' | 'chart' | 'custom'; + +export type WidgetId = string; + +export type WidgetPosition = { + x: number; // column index (0-based) + y: number; // row index (0-based) + w: number; // width in columns + h: number; // height in rows +}; + +export type BaseWidgetConfig = { + id: WidgetId; + type: WidgetType; + title?: string; + position: WidgetPosition; + // Arbitrary props for the specific widget implementation + props?: Record; +}; + +export type DashboardLayout = BaseWidgetConfig[]; + +export type GridConfig = { + cols: number; // number of columns in the grid + rowHeight: number; // height of one grid row in pixels + gap: number; // gap between grid cells in pixels +}; + +export type LayoutChange = { + id: WidgetId; + position: WidgetPosition; +}; + +// Chart adapter types (host-selectable) +export type ChartKind = 'line' | 'bar' | 'pie'; + +export type ChartAdapter = { + render: (kind: ChartKind, props: Record) => JSX.Element; +}; diff --git a/src/pages/Dashboard/Home.tsx b/src/pages/Dashboard/Home.tsx index fb97b39..1c49783 100644 --- a/src/pages/Dashboard/Home.tsx +++ b/src/pages/Dashboard/Home.tsx @@ -1,7 +1,59 @@ +import { useState } from 'react'; +import type { DashboardLayout, GridConfig } from '../../models/DashboardWidget'; +import DashboardGrid from '../../components/Dashboard/Widgets/DashboardGrid'; + +const initialGrid: GridConfig = { cols: 12, rowHeight: 32, gap: 8 }; +const initialLayout: DashboardLayout = [ + { + id: 'card-1', + type: 'card', + title: 'Welcome', + position: { x: 0, y: 0, w: 4, h: 3 }, + props: { content: 'Welcome to your dashboard' }, + }, + { + id: 'stat-1', + type: 'stat', + title: 'Active Users', + position: { x: 4, y: 0, w: 3, h: 3 }, + props: { value: 1284, label: 'Users' }, + }, + { + id: 'progress-1', + type: 'progress', + title: 'Setup Progress', + position: { x: 7, y: 0, w: 3, h: 3 }, + props: { value: 76 }, + }, + { + id: 'activity-1', + type: 'activity', + title: 'Recent Activity', + position: { x: 0, y: 3, w: 10, h: 4 }, + props: { items: ['Created project “Alpha”', 'Invited user Jane', 'Updated settings'] }, + }, + { + id: 'chart-1', + type: 'chart', + title: 'Signups (Last 7 days)', + position: { x: 10, y: 0, w: 2, h: 3 }, + props: { kind: 'bar', data: [4, 7, 6, 10, 12, 9, 5], color: '#4f46e5' }, + }, +]; + const Home = (): JSX.Element => { + const [layout, setLayout] = useState(initialLayout); return ( -
    -

    Home Page Dashboard

    +
    +

    Home Page Dashboard

    +
    ); }; diff --git a/tests/unit/components/DashboardWidgets/layoutUtils.test.ts b/tests/unit/components/DashboardWidgets/layoutUtils.test.ts new file mode 100644 index 0000000..bc05537 --- /dev/null +++ b/tests/unit/components/DashboardWidgets/layoutUtils.test.ts @@ -0,0 +1,30 @@ +import { describe, it, expect } from 'vitest'; +import { + positionToStyle, + intersects, + roundToCell, +} from '../../../../src/components/Dashboard/Widgets/layoutUtils'; + +describe('layoutUtils', () => { + it('positionToStyle converts widget position to grid styles', () => { + const style = positionToStyle({ x: 1, y: 2, w: 3, h: 4 }); + expect(style.gridColumnStart).toBe(2); + expect(style.gridColumnEnd).toBe(5); + expect(style.gridRowStart).toBe(3); + expect(style.gridRowEnd).toBe(7); + }); + + it('intersects detects overlapping positions', () => { + const a = { x: 0, y: 0, w: 3, h: 2 }; + const b = { x: 2, y: 1, w: 2, h: 2 }; + const c = { x: 3, y: 2, w: 1, h: 1 }; + expect(intersects(a, b)).toBe(true); + expect(intersects(a, c)).toBe(false); + }); + + it('roundToCell rounds pixel values to nearest cell count', () => { + expect(roundToCell(50, 30)).toBe(2); + expect(roundToCell(29, 30)).toBe(1); + expect(roundToCell(-31, 30)).toBe(-1); + }); +}); From 55282a8d63516b0c232d455a7090ae59ace02b94 Mon Sep 17 00:00:00 2001 From: a-elkhiraooui-ciscode Date: Fri, 13 Feb 2026 11:58:22 +0100 Subject: [PATCH 4/4] persist layout to local storage done --- dist/index.d.ts | 3 +- dist/index.js | 83 +++++++++++++++++-- dist/index.js.map | 2 +- .../Dashboard/Widgets/DashboardGrid.tsx | 54 +++++++++++- src/pages/Dashboard/Home.tsx | 5 +- 5 files changed, 135 insertions(+), 12 deletions(-) diff --git a/dist/index.d.ts b/dist/index.d.ts index d3ce8dd..29d961b 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -325,8 +325,9 @@ type Props = { enableDrag?: boolean; enableResize?: boolean; showActions?: boolean; + persistKey?: string; }; -declare function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapter, enableDrag, enableResize, showActions }: Props): JSX.Element; +declare function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapter, enableDrag, enableResize, showActions, persistKey, }: Props): JSX.Element; declare const DefaultChartAdapter: ChartAdapter; diff --git a/dist/index.js b/dist/index.js index bc4e598..eb3048b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,4 +1,4 @@ -import React4, { useState, useEffect, useRef, useCallback, useMemo } from 'react'; +import React4, { useState, useEffect, useRef, useLayoutEffect, useCallback, useMemo } from 'react'; import { useLocation, NavLink, Link as Link$1 } from 'react-router'; import { jsx, jsxs, Fragment } from 'react/jsx-runtime'; import { useT } from '@ciscode/ui-translate-core'; @@ -1417,7 +1417,19 @@ function TableDataCustom(props) { return /* @__PURE__ */ jsx(TableErrorBoundary_default, { children: /* @__PURE__ */ jsx(TableDataCustomBase_default, __spreadValues({}, props)) }); } var TableDataCustom_default = TableDataCustom; -function WidgetContainer({ title, children, onStartDrag, onStartResize, onStartResizeEast, onStartResizeSouth, onStartResizeSouthEast, draggable = true, resizable = true, onRemove, onDuplicate }) { +function WidgetContainer({ + title, + children, + onStartDrag, + onStartResize, + onStartResizeEast, + onStartResizeSouth, + onStartResizeSouthEast, + draggable = true, + resizable = true, + onRemove, + onDuplicate +}) { const headerRef = useRef(null); return /* @__PURE__ */ jsxs("div", { className: "relative rounded-lg border border-gray-200 bg-white dark:bg-gray-800 shadow-sm overflow-hidden", children: [ /* @__PURE__ */ jsxs( @@ -1605,14 +1617,60 @@ function renderPie(props) { }); return /* @__PURE__ */ jsx("svg", { width: size, height: size, role: "img", "aria-label": "Pie chart", children: slices }); } -function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapter, enableDrag = true, enableResize = true, showActions = true }) { +function DashboardGrid({ + grid, + widgets, + onLayoutChange, + renderWidget, + chartAdapter, + enableDrag = true, + enableResize = true, + showActions = true, + persistKey +}) { const containerRef = useRef(null); const [layout, setLayout] = useState(widgets); const [drag, setDrag] = useState(null); + const latestLayoutRef = useRef(widgets); + const hydratedFromStorageRef = useRef(false); + useLayoutEffect(() => { + if (!persistKey || typeof window === "undefined") return; + try { + const raw = window.localStorage.getItem(persistKey); + if (raw) { + const incoming = JSON.stringify(widgets); + if (raw !== incoming) { + const saved = JSON.parse(raw); + if (Array.isArray(saved)) { + hydratedFromStorageRef.current = true; + latestLayoutRef.current = saved; + setLayout(saved); + onLayoutChange == null ? void 0 : onLayoutChange(saved); + } + } + } + } catch (e) { + } + }, []); function commitLayout(next) { setLayout(next); onLayoutChange == null ? void 0 : onLayoutChange(next); + latestLayoutRef.current = next; + if (persistKey && typeof window !== "undefined") { + try { + window.localStorage.setItem(persistKey, JSON.stringify(next)); + } catch (e) { + } + } } + useLayoutEffect(() => { + if (hydratedFromStorageRef.current) { + hydratedFromStorageRef.current = false; + return; + } + latestLayoutRef.current = widgets; + setLayout(widgets); + }, [widgets]); function removeWidget(id) { const next = layout.filter((w) => w.id !== id); commitLayout(next); @@ -1662,7 +1720,14 @@ function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapt if (idx === -1) return; const pos = layout[idx].position; (_b = containerRef.current) == null ? void 0 : _b.setPointerCapture(e.pointerId); - setDrag({ id, startX: e.clientX - rect.left, startY: e.clientY - rect.top, origPos: __spreadValues({}, pos), mode, edge }); + setDrag({ + id, + startX: e.clientX - rect.left, + startY: e.clientY - rect.top, + origPos: __spreadValues({}, pos), + mode, + edge + }); }; } function onPointerMove(e) { @@ -1680,7 +1745,7 @@ function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapt const idx = findById(drag.id); if (idx === -1) return; const current = layout[idx]; - let nextPos = __spreadValues({}, drag.origPos); + const nextPos = __spreadValues({}, drag.origPos); if (drag.mode === "move") { nextPos.x = clamp(drag.origPos.x + deltaCols, 0, grid.cols - drag.origPos.w); nextPos.y = Math.max(0, drag.origPos.y + deltaRows); @@ -1709,13 +1774,14 @@ function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapt if (collides) return; const next = [...layout]; next[idx] = __spreadProps(__spreadValues({}, current), { position: nextPos }); + latestLayoutRef.current = next; setLayout(next); } function onPointerUp(e) { var _a; if (!drag) return; (_a = containerRef.current) == null ? void 0 : _a.releasePointerCapture(e.pointerId); - commitLayout(layout); + commitLayout(latestLayoutRef.current); setDrag(null); } return /* @__PURE__ */ jsx( @@ -1749,7 +1815,10 @@ function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapt } ); } -function DefaultWidgetRenderer({ widget, chartAdapter }) { +function DefaultWidgetRenderer({ + widget, + chartAdapter +}) { var _a, _b, _c, _d; const { type, props } = widget; switch (type) { diff --git a/dist/index.js.map b/dist/index.js.map index 5ffdc1e..c5eecea 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/components/Dashboard/ClickOutside.tsx","../src/components/Dashboard/Header/DropdownMessage.tsx","../src/components/Dashboard/Header/DropdownNotification.tsx","../src/components/Dashboard/Header/DropdownUser.tsx","../src/hooks/useLocalStorage.tsx","../src/hooks/useColorMode.tsx","../src/components/Dashboard/Header/DarkModeSwitcher.tsx","../src/components/Dashboard/Header/index.tsx","../src/components/Dashboard/Sidebar/index.tsx","../src/layout/DashboardLayout.tsx","../src/common/Loader/index.tsx","../src/main/dashboard.tsx","../src/components/Breadcrumbs/Breadcrumb.tsx","../src/components/Form/ZodDynamicForm.tsx","../src/exceptions/TableErrorBoundary.tsx","../src/hooks/useGeneratePageNumbers.tsx","../src/common/Loader/TableLoader.tsx","../src/components/Table/TablePopover.tsx","../src/components/Table/TableDataCustomBase.tsx","../src/components/Table/TableDataCustom.tsx","../src/components/Dashboard/Widgets/WidgetContainer.tsx","../src/components/Dashboard/Widgets/layoutUtils.ts","../src/components/Dashboard/Widgets/ChartAdapters.tsx","../src/components/Dashboard/Widgets/DashboardGrid.tsx","../src/hooks/useLogin.tsx","../src/hooks/useRegister.ts","../src/hooks/usePasswordReset.tsx","../src/hooks/useA11y.ts","../src/hooks/useKeyboardNavigation.ts"],"names":["jsx","Link","useState","useT","jsxs","useEffect","useRef","_a","React","useLocation","current"],"mappings":"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","file":"index.js","sourcesContent":["import { useRef, useEffect } from 'react';\nimport type { ReactNode, RefObject } from 'react';\n\ninterface Props {\n children: ReactNode;\n exceptionRef?: RefObject;\n onClick: () => void;\n className?: string;\n}\n\nfunction ClickOutside({ children, exceptionRef, onClick, className }: Props): JSX.Element {\n const wrapperRef = useRef(null);\n\n useEffect(() => {\n const handleClickListener = (event: MouseEvent) => {\n let clickedInside: null | boolean = false;\n if (exceptionRef) {\n clickedInside =\n (wrapperRef.current && wrapperRef.current.contains(event.target as Node)) ||\n (exceptionRef.current && exceptionRef.current === event.target) ||\n (exceptionRef.current && exceptionRef.current.contains(event.target as Node));\n } else {\n clickedInside = wrapperRef.current && wrapperRef.current.contains(event.target as Node);\n }\n\n if (!clickedInside) onClick();\n };\n\n document.addEventListener('mousedown', handleClickListener);\n\n return () => {\n document.removeEventListener('mousedown', handleClickListener);\n };\n }, [exceptionRef, onClick]);\n\n return (\n
    \n {children}\n
    \n );\n}\n\nexport default ClickOutside;\n","import React, { useState } from 'react';\r\nimport { Link } from 'react-router';\r\nimport ClickOutside from '../ClickOutside';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\nconst DropdownMessage: React.FC = () => {\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n const [notifying, setNotifying] = useState(true);\r\n const t = useT('templateFe');\r\n\r\n // Example dynamic data; replace with your real data source\r\n const messages = [\r\n { id: 1, user: 'Mariya Desoja', text: 'I like your confidence 💪', time: '2min ago' },\r\n { id: 2, user: 'Robert Jhon', text: 'Can you share your offer?', time: '10min ago' },\r\n { id: 3, user: 'Henry Dholi', text: 'I came across your profile and...', time: '1day ago' },\r\n { id: 4, user: 'Cody Fisher', text: 'I’m waiting for your response!', time: '5days ago' },\r\n { id: 5, user: 'Mariya Desoja', text: 'I like your confidence 💪', time: '2min ago' },\r\n ];\r\n\r\n return (\r\n setDropdownOpen(false)} className=\"relative\">\r\n
  • \r\n {\r\n setNotifying(false);\r\n setDropdownOpen(!dropdownOpen);\r\n }}\r\n className=\"relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white\"\r\n to=\"#\"\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {dropdownOpen && (\r\n
    \r\n
    \r\n
    {t('dropdown.messages')}
    \r\n
    \r\n\r\n
      \r\n {messages.map(({ id, user, text, time }) => (\r\n
    • \r\n \r\n
      \r\n {user}\r\n
      \r\n\r\n
      \r\n
      {user}
      \r\n

      {text}

      \r\n

      {time}

      \r\n
      \r\n \r\n
    • \r\n ))}\r\n
    \r\n
    \r\n )}\r\n
  • \r\n
    \r\n );\r\n};\r\n\r\nexport default DropdownMessage;\r\n","import React, { useState } from 'react';\r\nimport ClickOutside from '../ClickOutside';\r\nimport { Link } from 'react-router';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\ninterface NotificationItem {\r\n id: number;\r\n title: string;\r\n description: string;\r\n time: string;\r\n}\r\n\r\nconst DropdownNotification: React.FC = () => {\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n const [notifying, setNotifying] = useState(true);\r\n const t = useT('templateFe');\r\n\r\n const notifications: NotificationItem[] = [\r\n {\r\n id: 1,\r\n title: 'Edit your information in a swipe',\r\n description:\r\n 'Sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim.',\r\n time: '12 May, 2025',\r\n },\r\n {\r\n id: 2,\r\n title: 'It is a long established fact',\r\n description: 'that a reader will be distracted by the readable.',\r\n time: '24 Feb, 2025',\r\n },\r\n {\r\n id: 3,\r\n title: 'There are many variations',\r\n description: 'of passages of Lorem Ipsum available, but the majority have suffered',\r\n time: '04 Jan, 2025',\r\n },\r\n {\r\n id: 4,\r\n title: 'There are many variations',\r\n description: 'of passages of Lorem Ipsum available, but the majority have suffered',\r\n time: '01 Dec, 2024',\r\n },\r\n ];\r\n\r\n return (\r\n setDropdownOpen(false)} className=\"relative\">\r\n
  • \r\n {\r\n setNotifying(false);\r\n setDropdownOpen(!dropdownOpen);\r\n }}\r\n to=\"#\"\r\n className=\"relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white\"\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {dropdownOpen && (\r\n
    \r\n
    \r\n
    {t('dropdown.notifications')}
    \r\n
    \r\n\r\n
      \r\n {notifications.map(({ id, title, description, time }) => (\r\n
    • \r\n \r\n

      \r\n {title} {description}\r\n

      \r\n

      {time}

      \r\n \r\n
    • \r\n ))}\r\n
    \r\n
    \r\n )}\r\n
  • \r\n
    \r\n );\r\n};\r\n\r\nexport default DropdownNotification;\r\n","import { useState } from 'react';\r\nimport ClickOutside from '../ClickOutside';\r\nimport React from 'react';\r\nimport { Link } from 'react-router';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\ntype DropdownUserProps = {\r\n onLogout?: () => void;\r\n};\r\n\r\nconst DropdownUser: React.FC = ({ onLogout }) => {\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n const t = useT('templateFe');\r\n const role = 'superAdmin'; // or from user data\r\n const translatedRole = t(`roles.${role}`, { defaultValue: role });\r\n console.log('DROPDOWN RENDER onLogout =', onLogout);\r\n\r\n return (\r\n setDropdownOpen(false)} className=\"relative\">\r\n setDropdownOpen(!dropdownOpen)}\r\n className=\"flex items-center gap-4\"\r\n to=\"#\"\r\n >\r\n \r\n Thomas Anree\r\n {translatedRole}\r\n \r\n\r\n \r\n \r\n \r\n\r\n {/* Chevron (valid SVG) */}\r\n \r\n \r\n \r\n \r\n\r\n {dropdownOpen && (\r\n
    \r\n
      \r\n
    • \r\n setDropdownOpen(false)}\r\n >\r\n {/* placeholder icon to keep alignment */}\r\n \r\n {t('dropdown.profile')}\r\n \r\n
    • \r\n\r\n
    • \r\n \r\n \r\n {t('dropdown.contacts')}\r\n \r\n
    • \r\n\r\n
    • \r\n setDropdownOpen(false)}\r\n >\r\n \r\n {t('dropdown.settings')}\r\n \r\n
    • \r\n
    \r\n\r\n {\r\n console.log('DROPDOWN LOGOUT CLICKED, onLogout =', onLogout);\r\n setDropdownOpen(false);\r\n onLogout?.();\r\n }}\r\n className=\"flex items-center gap-3.5 px-6 py-4 text-sm font-medium duration-300 ease-in-out hover:text-primary lg:text-base\"\r\n >\r\n \r\n {t('dropdown.logout')}\r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default DropdownUser;\r\n","import { useEffect, useState } from 'react';\r\n\r\n/**\r\n * Setter type used by `useLocalStorage`.\r\n * Accepts a direct value or an updater function.\r\n */\r\nexport type SetValue = T | ((val: T) => T);\r\n\r\n/**\r\n * A typed hook that syncs a stateful value with `window.localStorage`.\r\n * Returns a tuple `[value, setValue]` similar to `useState`.\r\n */\r\nfunction useLocalStorage(key: string, initialValue: T): [T, (value: SetValue) => void] {\r\n // State to store our value\r\n // Pass initial state function to useState so logic is only executed once\r\n const [storedValue, setStoredValue] = useState(() => {\r\n try {\r\n // Get from local storage by key\r\n const item = window.localStorage.getItem(key);\r\n // Parse stored json or if none return initialValue\r\n return item ? JSON.parse(item) : initialValue;\r\n } catch (error) {\r\n // If error also return initialValue\r\n console.log(error);\r\n return initialValue;\r\n }\r\n });\r\n\r\n // useEffect to update local storage when the state changes\r\n useEffect(() => {\r\n try {\r\n // Persist the current value to localStorage\r\n window.localStorage.setItem(key, JSON.stringify(storedValue));\r\n } catch (error) {\r\n // A more advanced implementation would handle the error case\r\n console.log(error);\r\n }\r\n }, [key, storedValue]);\r\n\r\n return [storedValue, setStoredValue];\r\n}\r\n\r\nexport default useLocalStorage;\r\n","import { useEffect } from 'react';\nimport useLocalStorage from './useLocalStorage';\n\n/**\n * Persisted color mode hook.\n * Toggles `dark` class on `` when mode is 'dark'.\n * Returns `[colorMode, setColorMode]`.\n */\nconst useColorMode = (): [string, (value: string | ((val: string) => string)) => void] => {\n const [colorMode, setColorMode] = useLocalStorage('color-theme', 'light');\n\n useEffect(() => {\n const className = 'dark';\n const bodyClass = window.document.body.classList;\n\n if (colorMode === 'dark') {\n bodyClass.add(className);\n } else {\n bodyClass.remove(className);\n }\n }, [colorMode]);\n\n return [colorMode, setColorMode];\n};\n\nexport default useColorMode;\n","import React from 'react';\nimport useColorMode from '../../../hooks/useColorMode';\n\nconst DarkModeSwitcher: React.FC = () => {\n const [colorMode, setColorMode] = useColorMode();\n\n return (\n
  • \n \n \n typeof setColorMode === 'function' &&\n setColorMode(colorMode === 'light' ? 'dark' : 'light')\n }\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
  • \n );\n};\n\nexport default DarkModeSwitcher;\n","import DropdownMessage from './DropdownMessage';\nimport DropdownNotification from './DropdownNotification';\nimport DropdownUser from './DropdownUser';\n// import LogoIcon from '../../../assets/images/logo/logo-icon.svg';\nimport DarkModeSwitcher from './DarkModeSwitcher';\nimport React from 'react';\nimport { useT } from '@ciscode/ui-translate-core';\n\nconst Header = (props: {\n sidebarOpen: string | boolean | undefined;\n setSidebarOpen: (arg0: boolean) => void;\n onLogout?: () => void;\n}): JSX.Element => {\n const t = useT('templateFe');\n console.log('HEADER onLogout prop =', props.onLogout);\n\n return (\n
    \n
    \n
    \n {/* */}\n {\n e.stopPropagation();\n props.setSidebarOpen(!props.sidebarOpen);\n }}\n className=\"z-99999 block rounded-sm border border-stroke bg-white p-1.5 shadow-sm dark:border-strokedark dark:bg-boxdark lg:hidden\"\n >\n \n \n \n \n \n \n \n \n \n \n \n \n {/* */}\n
    \n\n
    \n
    \n
    \n \n\n \n
    \n
    \n
    \n\n
    \n
      \n {/* */}\n \n {/* */}\n\n {/* */}\n \n {/* */}\n\n {/* */}\n \n {/* */}\n
    \n\n {/* */}\n \n {/* */}\n
    \n
    \n
    \n );\n};\n\nexport default Header;\n","import React, { useEffect, useRef, useState, ReactNode } from 'react';\nimport { useLocation, NavLink } from 'react-router';\nimport { SidebarSection } from '../../../models/SidebarItemModel';\n\ninterface SidebarProps {\n sidebarOpen: boolean;\n setSidebarOpen: (arg: boolean) => void;\n sections: SidebarSection[];\n logo?: ReactNode;\n}\n\nconst Sidebar = ({ sidebarOpen, setSidebarOpen, sections, logo }: SidebarProps): JSX.Element => {\n const location = useLocation();\n const { pathname } = location;\n\n const trigger = useRef(null);\n const sidebar = useRef(null);\n\n const storedSidebarExpanded = localStorage.getItem('sidebar-expanded');\n const [sidebarExpanded] = useState(storedSidebarExpanded === 'true');\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (!sidebar.current || !trigger.current) return;\n if (\n !sidebarOpen ||\n sidebar.current.contains(e.target as Node) ||\n trigger.current.contains(e.target as Node)\n ) {\n return;\n }\n setSidebarOpen(false);\n };\n document.addEventListener('click', handleClickOutside);\n return () => document.removeEventListener('click', handleClickOutside);\n }, [sidebarOpen, setSidebarOpen]);\n\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (!sidebarOpen || e.key !== 'Escape') return;\n setSidebarOpen(false);\n };\n document.addEventListener('keydown', handleEsc);\n return () => document.removeEventListener('keydown', handleEsc);\n }, [sidebarOpen, setSidebarOpen]);\n\n useEffect(() => {\n localStorage.setItem('sidebar-expanded', sidebarExpanded.toString());\n if (sidebarExpanded) {\n document.body.classList.add('sidebar-expanded');\n } else {\n document.body.classList.remove('sidebar-expanded');\n }\n }, [sidebarExpanded]);\n\n const sortedSections = [...sections].sort((a, b) => (a.order ?? 9999) - (b.order ?? 9999));\n\n return (\n \n {/* SIDEBAR HEADER */}\n
    \n \n {logo ? (\n {logo}\n ) : (\n
    \n APP-LOGO\n
    \n )}\n
    \n\n setSidebarOpen(!sidebarOpen)}\n className=\"ml-3 block lg:hidden\"\n >\n \n \n \n \n
    \n {/* END SIDEBAR HEADER */}\n\n
    \n \n
    \n \n );\n};\n\nexport default Sidebar;\n","import React, { useState, ReactNode } from 'react';\r\nimport Header from '../components/Dashboard/Header/index';\r\nimport Sidebar from '../components/Dashboard/Sidebar/index';\r\nimport { SidebarSection } from '../models/SidebarItemModel';\r\n\r\ntype FooterLink = {\r\n label: string;\r\n href: string;\r\n newTab?: boolean;\r\n};\r\n\r\ninterface DashboardLayoutProps {\r\n children: ReactNode;\r\n sidebarContent: SidebarSection[];\r\n logo: ReactNode;\r\n onLogout?: () => void;\r\n\r\n footer?: {\r\n /**\r\n * Advanced: fully custom footer blocks (you control the JSX).\r\n */\r\n blocks?: ReactNode[];\r\n /**\r\n * Simple preset: provide data only, template renders a styled footer.\r\n */\r\n preset?: {\r\n leftText: string;\r\n links?: FooterLink[];\r\n version?: string;\r\n };\r\n /**\r\n * Optional className override on the
    wrapper.\r\n */\r\n className?: string;\r\n };\r\n}\r\n\r\nconst DashboardLayout: React.FC = ({\r\n children,\r\n sidebarContent,\r\n logo,\r\n onLogout,\r\n footer,\r\n}) => {\r\n const [sidebarOpen, setSidebarOpen] = useState(false);\r\n\r\n const hasPreset = Boolean(footer?.preset);\r\n const hasBlocks = Boolean(footer?.blocks && footer.blocks.length > 0);\r\n\r\n return (\r\n
    \r\n
    \r\n {/* Sidebar */}\r\n \r\n\r\n {/* Main content column */}\r\n
    \r\n
    \r\n\r\n
    \r\n {/* Content */}\r\n
    \r\n
    {children}
    \r\n
    \r\n\r\n {/* Sticky footer (preset has priority over blocks) */}\r\n {hasPreset ? (\r\n
    \r\n
    \r\n
    \r\n
    {footer?.preset?.leftText}
    \r\n\r\n
    \r\n {footer?.preset?.links?.length ? (\r\n
    \r\n {footer.preset.links.map((l) => {\r\n const newTab = l.newTab ?? true; // default: new tab\r\n return (\r\n \r\n {l.label}\r\n \r\n );\r\n })}\r\n
    \r\n ) : null}\r\n\r\n {footer?.preset?.version ? (\r\n {footer.preset.version}\r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n ) : hasBlocks ? (\r\n
    \r\n
    \r\n
    \r\n {footer!.blocks!.map((block, idx) => (\r\n {block}\r\n ))}\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default DashboardLayout;\r\n","import React from 'react';\n\nconst Loader = (): JSX.Element => {\n return (\n
    \n
    \n
    \n );\n};\nexport default Loader;\n","import { useState, useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLocation } from 'react-router';\nimport DashboardLayout from '../layout/DashboardLayout';\nimport Loader from '../common/Loader';\n\n// Existing (legacy) sidebar model used by current Template implementation\nimport { SidebarSection } from '../models/SidebarItemModel';\n\n// New typed configs (non-breaking additions)\nimport type {\n TemplateSidebarConfig,\n TemplateNavbarConfig,\n TemplateFooterConfig,\n} from './layoutTypes';\n\n/**\n * Props for the `Template` (Dashboard Shell) component.\n * Backward compatible with legacy sidebar/logo/onLogout while\n * supporting modern `sidebar`, `navbar`, and optional `footer` configs.\n */\nexport interface DashboardProps {\n children: ReactNode;\n\n /**\n * Legacy props (backward compatible)\n */\n sidebarContent?: SidebarSection[];\n logo?: ReactNode;\n onLogout?: () => void;\n\n /**\n * New config props (preferred)\n */\n sidebar?: TemplateSidebarConfig;\n navbar?: TemplateNavbarConfig;\n\n /**\n * Optional footer (rendered inside DashboardLayout when provided)\n */\n footer?: TemplateFooterConfig;\n}\n\n/**\n * Template (Dashboard Shell)\n *\n * Backward compatible:\n * - Existing apps can keep using: sidebarContent + logo + onLogout\n * Preferred:\n * - New apps should use: sidebar + navbar (+ footer when needed)\n */\nfunction Template({\n children,\n sidebarContent = [],\n logo,\n onLogout,\n navbar,\n footer,\n}: DashboardProps): JSX.Element {\n const [loading, setLoading] = useState(true);\n const { pathname } = useLocation();\n\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n useEffect(() => {\n setTimeout(() => setLoading(false), 1000);\n }, []);\n\n /**\n * Resolve \"brand\" area:\n * - Prefer navbar.brandSlot\n * - Else map legacy `logo` prop (deprecated) to brandSlot\n * - Else fall back to simple navbar.brand config if provided\n */\n const resolvedBrandNode: ReactNode | undefined =\n navbar?.brandSlot ??\n logo ??\n (navbar?.brand ? (\n \n {navbar.brand.logoSrc ? (\n \n ) : (\n {navbar.brand.title ?? ''}\n )}\n \n ) : undefined);\n\n /**\n * Resolve sidebar:\n * - For now, if `sidebar` is provided, we still pass legacy sidebarContent through,\n * because DashboardLayout currently expects SidebarSection[].\n */\n const resolvedLegacySidebarContent: SidebarSection[] = sidebarContent;\n\n return loading ? (\n \n ) : (\n \n {children}\n \n );\n}\n\nexport default Template;\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\n/**\r\n * Props for `Breadcrumb` component.\r\n * - `pageName`: current page label displayed in the trail.\r\n */\r\nexport interface BreadcrumbProps {\r\n pageName: string;\r\n}\r\n\r\n/**\r\n * Accessible breadcrumb navigation.\r\n * Renders a current page label and a link to home.\r\n */\r\nconst Breadcrumb: React.FC = ({ pageName }) => {\r\n const t = useT('templateFe');\r\n\r\n return (\r\n
    \r\n

    {pageName}

    \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default Breadcrumb;\r\n","import { useState } from 'react';\nimport type { ReactNode, ChangeEvent, FormEvent } from 'react';\nimport { ZodSchema, ZodError } from 'zod';\nimport { MultiValue } from 'react-select';\nimport Select from 'react-select';\nimport { FieldConfigDynamicForm } from '../../models/FieldConfigDynamicForm';\n\nexport interface ControlledZodDynamicFormProps {\n schema: ZodSchema>;\n fields: FieldConfigDynamicForm[];\n values: Record;\n onChangeField: (fieldName: string, newValue: unknown) => void;\n onSubmit: (parsedValues: Record) => void;\n submitLabel?: string;\n header?: ReactNode;\n /** Optional override for the ZodError class (for dependency injection) */\n}\n\nexport default function ControlledZodDynamicForm({\n schema,\n fields,\n values,\n onChangeField,\n onSubmit,\n submitLabel = 'Submit',\n header,\n}: ControlledZodDynamicFormProps): JSX.Element {\n const [errors, setErrors] = useState>({});\n\n /**\n * Handler for standard text/textarea/select/checkbox inputs.\n * Uses a type guard so we can safely read e.target.checked if it's a checkbox.\n */\n function handleInputChange(\n e: ChangeEvent,\n ): void {\n const { name, value, type } = e.target;\n let newValue: unknown = value;\n\n // type guard for checkbox\n if (type === 'checkbox' && e.target instanceof HTMLInputElement) {\n newValue = e.target.checked;\n } else if (type === 'number') {\n newValue = parseFloat(value) || 0;\n }\n onChangeField(name, newValue);\n }\n\n /**\n * On form submit => parse the entire `values` with Zod.\n * If it fails, store the error messages in local state to display.\n */\n function handleSubmit(e: FormEvent): void {\n e.preventDefault();\n try {\n // Attempt to parse the entire form data with Zod\n const parsed = schema.parse(values);\n // If success, call parent\n onSubmit(parsed);\n } catch (err) {\n if (err instanceof ZodError) {\n // Build a record of errors for simpler fields\n const newErrors: Record = {};\n\n // Check if any error is specifically for \"details\" path\n let detailsErrorFound = false;\n\n err.errors.forEach((issue) => {\n const pathKey = issue.path.join('.');\n newErrors[pathKey] = issue.message;\n\n // If the path starts with \"details\", we assume it's a problem with details\n if (issue.path[0] === 'details') {\n detailsErrorFound = true;\n }\n });\n\n // If there's an error in \"details\", show an alert\n if (detailsErrorFound) {\n alert('Please fill out all required fields in Details.');\n }\n\n setErrors(newErrors);\n }\n }\n }\n\n return (\n
    \n {/* header */}\n {header &&
    {header}
    }\n\n {/* form */}\n {fields.map((field) => {\n const fieldError = errors[field.name];\n const fieldValue = values[field.name] ?? '';\n\n return (\n
    \n \n\n {(() => {\n switch (field.type) {\n case 'textarea':\n return (\n \n );\n\n case 'select':\n return (\n \n \n {field.options?.map((opt) => (\n \n ))}\n \n );\n\n case 'checkbox':\n return (\n \n );\n\n case 'multiSelect': {\n // We assume `field.options` is an array of { label: string, value: string }.\n const multiOpts = field.options ?? [];\n // The user’s current selection is an array of IDs => find the matching option or fallback\n const selectedValues = Array.isArray(fieldValue)\n ? fieldValue.map((id: string) => {\n const found = multiOpts.find((o) => o.value === id);\n if (found) return found;\n // fallback => ensures a unique string value\n return {\n label: String(id) || '???',\n value: String(id),\n };\n })\n : [];\n\n return (\n ,\n ) => {\n const arrIds = selected.map((opt) => opt.value);\n onChangeField(field.name, arrIds);\n }}\n className=\"w-full\"\n />\n );\n }\n case 'custom': {\n const CustomComp = field.component; // e.g. DetailsManager\n if (!CustomComp) {\n return (\n

    \n Missing component for custom field: {field.name}\n

    \n );\n }\n\n // Get nested errors for field \"details\" or whatever the field's name is\n const subErrors = findNestedErrors(errors, field.name);\n // subErrors might look like { 0: { grams: \"Error message\" }, 1: { price: \"Error\" } }\n\n return (\n onChangeField(field.name, newVal)}\n errors={subErrors}\n {...field.props}\n // optionally pass more props if needed\n />\n );\n }\n\n default:\n // text or number\n return (\n \n );\n }\n })()}\n\n {fieldError &&

    {fieldError}

    }\n
    \n );\n })}\n\n
    \n \n {submitLabel}\n \n
    \n
    \n );\n}\n\n//Show erros validation\nexport function findNestedErrors(\n allErrors: Record,\n rootField: string,\n): Record> {\n const nested: Record> = {};\n\n // For each key => e.g. \"details.0.grams\"\n for (const key in allErrors) {\n if (key.startsWith(`${rootField}.`)) {\n // remove \"details.\" => \"0.grams\"\n const subPath = key.slice(rootField.length + 1); // e.g. \"0.grams\"\n const [indexStr, fieldName] = subPath.split('.');\n const index = parseInt(indexStr, 10);\n\n if (!isNaN(index)) {\n if (!nested[index]) {\n nested[index] = {};\n }\n nested[index][fieldName] = allErrors[key];\n }\n }\n }\n\n return nested;\n}\n","import React from 'react';\nimport { useT } from '@ciscode/ui-translate-core';\n\ninterface TableErrorBoundaryState {\n hasError: boolean;\n}\n\nclass TableErrorBoundary extends React.Component<\n React.PropsWithChildren,\n TableErrorBoundaryState\n> {\n constructor(props: React.PropsWithChildren) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): TableErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: unknown, errorInfo: unknown): void {\n console.error('TableErrorBoundary caught an error:', error, errorInfo);\n }\n\n render(): React.ReactNode {\n if (this.state.hasError) {\n // You can't use hooks like useT inside a class component,\n // so we wrap it in a functional HOC instead.\n return ;\n }\n\n return this.props.children;\n }\n}\n\nconst TranslatedErrorMessage = (): JSX.Element => {\n const t = useT('template-fe');\n return (\n
    \n {t('table.errorBoundary.fallbackMessage')}\n
    \n );\n};\n\nexport default TableErrorBoundary;\n","/**\r\n * Generate a compact page list for pagination controls.\r\n * Includes first/last pages and ellipses around the current.\r\n */\r\nexport function generatePageNumbers(current: number, total: number): (number | string)[] {\r\n const maxPagesToShow = 5;\r\n const pages: (number | string)[] = [];\r\n\r\n // If total is small, just show them all\r\n if (total <= maxPagesToShow) {\r\n for (let i = 1; i <= total; i++) {\r\n pages.push(i);\r\n }\r\n return pages;\r\n }\r\n\r\n // Always show first page\r\n pages.push(1);\r\n\r\n // Determine start/end range near current\r\n const start = Math.max(2, current - 1);\r\n const end = Math.min(total - 1, current + 1);\r\n\r\n // Ellipses before start if needed\r\n if (start > 2) {\r\n pages.push('...');\r\n }\r\n\r\n // Range in the middle\r\n for (let i = start; i <= end; i++) {\r\n pages.push(i);\r\n }\r\n\r\n // Ellipses after end if needed\r\n if (end < total - 1) {\r\n pages.push('...');\r\n }\r\n\r\n // Always show last page\r\n pages.push(total);\r\n\r\n return pages;\r\n}\r\n","import React from 'react';\n\nexport const TableLoader = (): JSX.Element => {\n return (\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n );\n};\n","import React, { useEffect, useRef } from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\nexport interface TablePopoverProps {\r\n anchor: HTMLElement | null;\r\n children: React.ReactNode;\r\n onClose: () => void;\r\n}\r\n\r\nexport const TablePopover: React.FC = ({ anchor, children, onClose }) => {\r\n const popoverRef = useRef(null);\r\n\r\n useEffect(() => {\r\n function handleClick(e: MouseEvent) {\r\n if (\r\n popoverRef.current &&\r\n !popoverRef.current.contains(e.target as Node) &&\r\n anchor &&\r\n !anchor.contains(e.target as Node)\r\n ) {\r\n onClose();\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClick);\r\n return () => document.removeEventListener('mousedown', handleClick);\r\n }, [anchor, onClose]);\r\n\r\n if (!anchor) return null;\r\n\r\n const rect = anchor.getBoundingClientRect();\r\n const style: React.CSSProperties = {\r\n position: 'fixed',\r\n top: rect.bottom + 8,\r\n left: rect.left,\r\n zIndex: 9999,\r\n background: 'white',\r\n border: '1px solid #e5e7eb',\r\n borderRadius: 12,\r\n boxShadow: '0 8px 32px 0 rgba(60,60,60,0.18)',\r\n padding: 0,\r\n minWidth: 200,\r\n animation: 'fadeIn 0.18s',\r\n };\r\n\r\n return ReactDOM.createPortal(\r\n
    \r\n
    \r\n
    \r\n
    \r\n {children}\r\n \r\n \r\n \r\n \r\n \r\n
    ,\r\n document.body,\r\n );\r\n};\r\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { generatePageNumbers } from '../../hooks/useGeneratePageNumbers';\nimport { TableLoader } from '../../common/Loader/TableLoader';\nimport { ToolbarItem } from '../../models/ToolbarItemModel';\nimport { ColumnConfigTable } from '../../models/ColumnConfigTable';\nimport { useT } from '@ciscode/ui-translate-core';\nimport { TablePopover } from './TablePopover';\n\ntype InlineEditableCellProps = {\n value: unknown;\n row: T;\n rowIndex: number;\n columnKey: keyof T;\n onCommit: (next: unknown) => void;\n editor?: (args: {\n value: unknown;\n row: T;\n rowIndex: number;\n onChange: (next: unknown) => void;\n onCommit: () => void;\n onCancel: () => void;\n }) => React.ReactNode;\n className?: string;\n children: React.ReactNode;\n};\n\nfunction InlineEditableCell(props: InlineEditableCellProps): JSX.Element {\n const { value, row, rowIndex, onCommit, editor, children } = props;\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(value ?? '');\n\n const startEdit = useCallback(() => {\n setDraft(value ?? '');\n setEditing(true);\n }, [value]);\n\n const commit = useCallback(() => {\n setEditing(false);\n onCommit(draft);\n }, [draft, onCommit]);\n\n const cancel = useCallback(() => {\n setEditing(false);\n setDraft(value ?? '');\n }, [value]);\n\n if (!editing) {\n return (\n
    \n {children}\n
    \n );\n }\n\n if (editor) {\n return (\n
    \n {editor({\n value: draft,\n row,\n rowIndex,\n onChange: setDraft,\n onCommit: commit,\n onCancel: cancel,\n })}\n
    \n );\n }\n\n return (\n setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit();\n if (e.key === 'Escape') cancel();\n }}\n className=\"px-2 py-1 text-sm border rounded-md dark:bg-gray-700 dark:text-white\"\n />\n );\n}\n\n/**\n * Pagination configuration for table navigation.\n */\nexport type PaginationProps = {\n currentPage: number;\n totalPages: number;\n totalItems: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n};\n\n/**\n * Props for `TableDataCustom` and base component.\n */\nexport interface TableDataCustomProps {\n columns: ColumnConfigTable[];\n data: T[];\n loading?: boolean;\n pagination?: PaginationProps;\n errorMessage?: string | null;\n toolbarItems?: ToolbarItem[];\n\n /** Feature toggles */\n enableSelection?: boolean;\n enableSorting?: boolean;\n enableFilter?: boolean;\n enableInlineEdit?: boolean;\n\n /** Filtering (controlled/uncontrolled) */\n filterQuery?: string;\n onFilterQueryChange?: (query: string) => void;\n\n /** Selection callback */\n onSelectionChange?: (selectedRows: T[], selectedIndices: number[]) => void;\n\n /** Inline cell edit callback */\n onCellEdit?: (rowIndex: number, columnKey: keyof T, nextValue: unknown, row: T) => void;\n}\n\n/**\n * Internal base table component that renders the table UI.\n * Consumers should use `TableDataCustom` which wraps this with an error boundary.\n */\nfunction TableDataCustomBase({\n columns,\n data,\n errorMessage,\n pagination,\n loading,\n toolbarItems,\n enableSelection,\n enableSorting,\n enableFilter,\n enableInlineEdit,\n filterQuery,\n onFilterQueryChange,\n onSelectionChange,\n onCellEdit,\n}: TableDataCustomProps): JSX.Element {\n const t = useT('templateFe');\n\n // split toolbar items\n const leftItems = (toolbarItems ?? []).filter(\n (it) => it.visible !== false && (it.position ?? 'left') === 'left',\n );\n const rightItems = (toolbarItems ?? []).filter(\n (it) => it.visible !== false && it.position === 'right',\n );\n const [popover, setPopover] = useState<{\n anchor: HTMLElement | null;\n content: React.ReactNode;\n } | null>(null);\n const closePopover = useCallback(() => setPopover(null), []);\n\n // Selection state (indices within visible data)\n const [selected, setSelected] = useState>(new Set());\n const toggleSelectAll = useCallback((checked: boolean, count: number) => {\n const next = new Set();\n if (checked) {\n for (let i = 0; i < count; i++) next.add(i);\n }\n setSelected(next);\n }, []);\n\n const toggleRowSelection = useCallback((index: number) => {\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n }, []);\n\n // Sorting state\n const [sortBy, setSortBy] = useState(null);\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc');\n const onHeaderClick = useCallback(\n (colIndex: number, col: ColumnConfigTable) => {\n if (!enableSorting || col.sortable === false) return;\n setSortBy((prev) => (prev === colIndex ? colIndex : colIndex));\n setSortDir((prev) => (sortBy === colIndex ? (prev === 'asc' ? 'desc' : 'asc') : 'asc'));\n },\n [enableSorting, sortBy],\n );\n\n // Filtering state (uncontrolled fallback)\n const [internalQuery, setInternalQuery] = useState('');\n const activeQuery = (filterQuery ?? internalQuery).trim();\n\n // Build visible rows: filter then sort\n const visibleData = useMemo(() => {\n let rows = [...data];\n if (enableFilter && activeQuery.length > 0) {\n const q = activeQuery.toLowerCase();\n rows = rows.filter((row) => {\n return columns.some((col) => {\n const keys = Array.isArray(col.key) ? col.key : [col.key];\n const val = keys\n .map((k) => String((row[k as keyof T] as unknown) ?? ''))\n .join(' ') // combine multi-key cells\n .toLowerCase();\n if (col.filterPredicate) {\n return col.filterPredicate(val, row, q);\n }\n return val.includes(q);\n });\n });\n }\n if (enableSorting && sortBy != null) {\n const col = columns[sortBy];\n rows.sort((a, b) => {\n const keys = Array.isArray(col.key) ? col.key : [col.key];\n const va = keys.map((k) => a[k as keyof T] as unknown);\n const vb = keys.map((k) => b[k as keyof T] as unknown);\n const left = va.length > 1 ? va.join(' ') : va[0];\n const right = vb.length > 1 ? vb.join(' ') : vb[0];\n let cmp = 0;\n if (typeof col.sortComparator === 'function') {\n cmp = col.sortComparator(left, right, a, b);\n } else {\n const la = left ?? '';\n const lb = right ?? '';\n const sa = String(la).toLowerCase();\n const sb = String(lb).toLowerCase();\n if (sa < sb) cmp = -1;\n else if (sa > sb) cmp = 1;\n else cmp = 0;\n }\n return sortDir === 'asc' ? cmp : -cmp;\n });\n }\n return rows;\n }, [data, columns, enableFilter, activeQuery, enableSorting, sortBy, sortDir]);\n\n // Notify selection changes\n React.useEffect(() => {\n if (!onSelectionChange) return;\n const indices = Array.from(selected.values()).sort((a, b) => a - b);\n const rows = indices.map((i) => visibleData[i]).filter(Boolean);\n onSelectionChange(rows, indices);\n }, [selected, visibleData, onSelectionChange]);\n\n return (\n
    \n {popover && (\n \n {popover.content}\n \n )}\n
    \n
    \n {/* Toolbar */}\n {(leftItems.length > 0 || rightItems.length > 0 || enableFilter) && (\n
    \n
    \n {leftItems.map((it, i) => (\n \n {it.node}\n \n ))}\n {enableFilter && (\n \n onFilterQueryChange\n ? onFilterQueryChange(e.target.value)\n : setInternalQuery(e.target.value)\n }\n placeholder={t('table.filter') ?? 'Filter…'}\n className=\"px-3 py-2 text-sm border rounded-md dark:bg-gray-700 dark:text-white\"\n />\n )}\n
    \n
    \n {rightItems.map((it, i) => (\n \n {it.node}\n \n ))}\n
    \n
    \n )}\n\n {/* Table */}\n
    \n \n \n \n {enableSelection && (\n \n )}\n {columns.map((col, i) => (\n onHeaderClick(i, col)}\n title={enableSorting && col.sortable !== false ? 'Sort' : undefined}\n >\n \n {col.title}\n {enableSorting && sortBy === i && (\n \n {sortDir === 'asc' ? (\n \n ) : (\n \n )}\n \n )}\n \n \n ))}\n \n \n \n {loading ? (\n \n \n \n \n \n ) : errorMessage ? (\n \n \n {errorMessage}\n \n \n ) : visibleData.length === 0 ? (\n \n \n {t('table.noData')}\n \n \n ) : (\n visibleData.map((row, r) => (\n \n {enableSelection && (\n \n )}\n {columns.map((col, c) => {\n let content: React.ReactNode;\n if (Array.isArray(col.key)) {\n const vals = col.key.map((k) => row[k] ?? '');\n const display = vals.join(' - ');\n content = col.render ? col.render(vals, row, setPopover) : display;\n } else {\n const val = row[col.key];\n const display = String(val ?? '');\n // Inline editing: per-cell editing on double-click\n if (enableInlineEdit && col.editable) {\n content = (\n onCellEdit?.(r, col.key as keyof T, next, row)}\n editor={col.editor}\n className={col.cellClassName}\n >\n {col.render ? col.render(val, row, setPopover) : display}\n \n );\n } else {\n content = col.render ? col.render(val, row, setPopover) : display;\n }\n }\n return (\n \n {content}\n \n );\n })}\n \n ))\n )}\n \n
    \n 0 && selected.size === visibleData.length}\n onChange={(e) => toggleSelectAll(e.target.checked, visibleData.length)}\n />\n
    \n toggleRowSelection(r)}\n />\n
    \n
    \n\n {/* Pagination */}\n {pagination && (\n \n \n {t('table.pagination.showing', {\n from: (pagination.currentPage - 1) * (pagination.pageSize ?? 10) + 1,\n to: Math.min(\n pagination.currentPage * (pagination.pageSize ?? 10),\n pagination.totalItems,\n ),\n total: pagination.totalItems,\n })}\n \n\n
      \n {/* Previous */}\n
    • \n pagination.onPageChange?.(pagination.currentPage - 1)}\n disabled={pagination.currentPage <= 1}\n className=\"flex items-center justify-center h-full py-1.5 px-3 ml-0 text-gray-500 bg-white rounded-l-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\"\n >\n {t('table.pagination.previous')}\n \n \n \n \n
    • \n\n {/* Pages */}\n {generatePageNumbers(pagination.currentPage, pagination.totalPages).map((p, i) =>\n typeof p === 'string' ? (\n
    • \n \n {p}\n \n
    • \n ) : (\n
    • \n pagination.onPageChange?.(p)}\n className={`flex items-center justify-center px-3 py-2 text-sm border ${\n p === pagination.currentPage\n ? 'z-10 text-primary-600 bg-primary-50 border-primary-300 hover:bg-primary-100 hover:text-primary-700 dark:bg-gray-700 dark:text-white dark:border-gray-700'\n : 'text-gray-500 bg-white border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-700 dark:hover:bg-gray-700'\n }`}\n >\n {p}\n \n
    • \n ),\n )}\n\n {/* Next */}\n
    • \n pagination.onPageChange?.(pagination.currentPage + 1)}\n disabled={pagination.currentPage >= pagination.totalPages}\n className=\"flex items-center justify-center h-full py-1.5 px-3 leading-tight text-gray-500 bg-white rounded-r-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\"\n >\n {t('table.pagination.next')}\n \n \n \n \n
    • \n
    \n \n )}\n
    \n
    \n
    \n );\n}\n\nexport default TableDataCustomBase;\n","import React from 'react';\nimport TableErrorBoundary from '../../exceptions/TableErrorBoundary';\nimport TableDataCustomBase, { TableDataCustomProps } from './TableDataCustomBase';\n\n/**\n * Public table component with built-in error boundary.\n * Wraps `TableDataCustomBase` in `TableErrorBoundary` to provide a safe fallback.\n * Consumers should import `TableDataCustom` from the package root.\n */\nfunction TableDataCustom(props: TableDataCustomProps): JSX.Element {\n return (\n \n \n \n );\n}\n\nexport default TableDataCustom;\n","import { useRef } from 'react';\r\nimport type { ReactNode, PointerEvent } from 'react';\r\n\r\ntype Props = {\r\n title?: string;\r\n children: ReactNode;\r\n onStartDrag?: (e: PointerEvent) => void;\r\n onStartResize?: (e: PointerEvent) => void; // legacy: header square\r\n onStartResizeEast?: (e: PointerEvent) => void;\r\n onStartResizeSouth?: (e: PointerEvent) => void;\r\n onStartResizeSouthEast?: (e: PointerEvent) => void;\r\n draggable?: boolean;\r\n resizable?: boolean;\r\n onRemove?: () => void;\r\n onDuplicate?: () => void;\r\n};\r\n\r\nexport default function WidgetContainer({ title, children, onStartDrag, onStartResize, onStartResizeEast, onStartResizeSouth, onStartResizeSouthEast, draggable = true, resizable = true, onRemove, onDuplicate }: Props): JSX.Element {\r\n const headerRef = useRef(null);\r\n\r\n return (\r\n
    \r\n {\r\n // Only attach interactions if enabled\r\n if (e.shiftKey && resizable && onStartResize) return onStartResize(e);\r\n if (draggable) onStartDrag?.(e);\r\n }}\r\n >\r\n {title}\r\n
    \r\n {typeof onDuplicate === 'function' ? (\r\n e.stopPropagation()}\r\n aria-label=\"Duplicate widget\"\r\n title=\"Duplicate\"\r\n >\r\n ⧉\r\n \r\n ) : null}\r\n {typeof onRemove === 'function' ? (\r\n e.stopPropagation()}\r\n aria-label=\"Remove widget\"\r\n title=\"Remove\"\r\n >\r\n ×\r\n \r\n ) : null}\r\n {resizable ? (\r\n \r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n {children}\r\n
    \r\n {resizable ? (\r\n <>\r\n {/* East (right) edge handle */}\r\n { e.stopPropagation(); onStartResizeEast?.(e); }}\r\n aria-label=\"Resize east\"\r\n />\r\n {/* South (bottom) edge handle */}\r\n { e.stopPropagation(); onStartResizeSouth?.(e); }}\r\n aria-label=\"Resize south\"\r\n />\r\n {/* South-East corner handle */}\r\n { e.stopPropagation(); onStartResizeSouthEast?.(e); }}\r\n aria-label=\"Resize south-east\"\r\n />\r\n \r\n ) : null}\r\n
    \r\n );\r\n}\r\n","import type { WidgetPosition } from '../../../models/DashboardWidget';\r\n\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n\r\nexport function roundToCell(px: number, cell: number): number {\r\n return Math.round(px / cell);\r\n}\r\n\r\nexport function positionToStyle(pos: WidgetPosition): {\r\n gridColumnStart: number;\r\n gridColumnEnd: number;\r\n gridRowStart: number;\r\n gridRowEnd: number;\r\n} {\r\n return {\r\n gridColumnStart: pos.x + 1,\r\n gridColumnEnd: pos.x + 1 + pos.w,\r\n gridRowStart: pos.y + 1,\r\n gridRowEnd: pos.y + 1 + pos.h,\r\n };\r\n}\r\n\r\nexport function intersects(a: WidgetPosition, b: WidgetPosition): boolean {\r\n const ax2 = a.x + a.w;\r\n const ay2 = a.y + a.h;\r\n const bx2 = b.x + b.w;\r\n const by2 = b.y + b.h;\r\n // no overlap if one rectangle is completely to one side of the other\r\n const noOverlap = ax2 <= b.x || bx2 <= a.x || ay2 <= b.y || by2 <= a.y;\r\n return !noOverlap;\r\n}\r\n","import type { ChartAdapter, ChartKind } from '../../../models/DashboardWidget';\r\n\r\n// Minimal default chart adapter using plain SVG.\r\nexport const DefaultChartAdapter: ChartAdapter = {\r\n render(kind: ChartKind, props: Record): JSX.Element {\r\n switch (kind) {\r\n case 'bar':\r\n return renderBar(props);\r\n case 'line':\r\n return renderLine(props);\r\n case 'pie':\r\n return renderPie(props);\r\n default:\r\n return
    Unknown chart kind
    ;\r\n }\r\n },\r\n};\r\n\r\nfunction coerceNumbers(value: unknown): number[] {\r\n if (Array.isArray(value)) {\r\n return value.map((v) => (typeof v === 'number' ? v : Number(v))).filter((v) => !Number.isNaN(v));\r\n }\r\n return [];\r\n}\r\n\r\nfunction renderBar(props: Record): JSX.Element {\r\n const data = coerceNumbers(props.data);\r\n const width = (typeof props.width === 'number' ? props.width : 300) as number;\r\n const height = (typeof props.height === 'number' ? props.height : 120) as number;\r\n const padding = 16;\r\n const max = Math.max(1, ...data);\r\n const barWidth = (width - padding * 2) / Math.max(1, data.length);\r\n const color = typeof props.color === 'string' ? (props.color as string) : '#4f46e5';\r\n\r\n return (\r\n \r\n {data.map((v, i) => {\r\n const h = ((height - padding * 2) * v) / max;\r\n const x = padding + i * barWidth + barWidth * 0.1;\r\n const y = height - padding - h;\r\n return ;\r\n })}\r\n \r\n );\r\n}\r\n\r\nfunction renderLine(props: Record): JSX.Element {\r\n const data = coerceNumbers(props.data);\r\n const width = (typeof props.width === 'number' ? props.width : 300) as number;\r\n const height = (typeof props.height === 'number' ? props.height : 120) as number;\r\n const padding = 16;\r\n const max = Math.max(1, ...data);\r\n const color = typeof props.color === 'string' ? (props.color as string) : '#16a34a';\r\n const points = data.map((v, i) => {\r\n const x = padding + i * ((width - padding * 2) / Math.max(1, data.length - 1));\r\n const y = height - padding - ((height - padding * 2) * v) / max;\r\n return `${x},${y}`;\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nfunction renderPie(props: Record): JSX.Element {\r\n const data = coerceNumbers(props.data);\r\n const size = (typeof props.size === 'number' ? props.size : 120) as number;\r\n const radius = size / 2;\r\n const total = data.reduce((acc, v) => acc + v, 0) || 1;\r\n const colors = Array.isArray(props.colors) ? (props.colors as string[]) : ['#f97316', '#22c55e', '#3b82f6', '#e11d48'];\r\n\r\n let startAngle = 0;\r\n const slices = data.map((v, i) => {\r\n const angle = (v / total) * Math.PI * 2;\r\n const x1 = radius + radius * Math.cos(startAngle);\r\n const y1 = radius + radius * Math.sin(startAngle);\r\n const x2 = radius + radius * Math.cos(startAngle + angle);\r\n const y2 = radius + radius * Math.sin(startAngle + angle);\r\n const largeArc = angle > Math.PI ? 1 : 0;\r\n const path = `M ${radius},${radius} L ${x1},${y1} A ${radius},${radius} 0 ${largeArc} 1 ${x2},${y2} z`;\r\n startAngle += angle;\r\n return ;\r\n });\r\n\r\n return (\r\n \r\n {slices}\r\n \r\n );\r\n}\r\n","import { useRef, useState } from 'react';\r\nimport type { PointerEvent } from 'react';\r\nimport type { BaseWidgetConfig, DashboardLayout, GridConfig, WidgetId, WidgetPosition, ChartAdapter, ChartKind } from '../../../models/DashboardWidget';\r\nimport WidgetContainer from './WidgetContainer';\r\nimport { positionToStyle, clamp, roundToCell, intersects } from './layoutUtils';\r\nimport { DefaultChartAdapter } from './ChartAdapters';\r\n\r\ntype Props = {\r\n grid: GridConfig;\r\n widgets: DashboardLayout;\r\n onLayoutChange?: (next: DashboardLayout) => void;\r\n renderWidget?: (w: BaseWidgetConfig) => JSX.Element; // host can fully render a custom widget\r\n chartAdapter?: ChartAdapter; // host can render charts using its preferred library\r\n enableDrag?: boolean; // allow moving widgets\r\n enableResize?: boolean; // allow resizing widgets\r\n showActions?: boolean; // show default remove/duplicate actions\r\n};\r\n\r\ntype DragState = {\r\n id: WidgetId;\r\n startX: number; // px\r\n startY: number; // px\r\n origPos: WidgetPosition;\r\n mode: 'move' | 'resize';\r\n edge?: 'e' | 's' | 'se' | 'w' | 'n' | 'sw' | 'ne' | 'nw';\r\n};\r\n\r\nexport default function DashboardGrid({ grid, widgets, onLayoutChange, renderWidget, chartAdapter, enableDrag = true, enableResize = true, showActions = true }: Props): JSX.Element {\r\n const containerRef = useRef(null);\r\n const [layout, setLayout] = useState(widgets);\r\n const [drag, setDrag] = useState(null);\r\n\r\n function commitLayout(next: DashboardLayout): void {\r\n setLayout(next);\r\n onLayoutChange?.(next);\r\n }\r\n\r\n function removeWidget(id: WidgetId): void {\r\n const next = layout.filter((w) => w.id !== id);\r\n commitLayout(next);\r\n }\r\n\r\n function duplicateWidget(id: WidgetId): void {\r\n const idx = findById(id);\r\n if (idx === -1) return;\r\n const src = layout[idx];\r\n // new id\r\n let copyIndex = 2;\r\n let newId: WidgetId = `${src.id}-copy`;\r\n while (layout.some((w) => w.id === newId)) {\r\n newId = `${src.id}-copy-${copyIndex++}`;\r\n }\r\n // Attempt to place to the right, else below, else scan\r\n const rectPos = { ...src.position };\r\n let candidate = { ...rectPos, x: Math.min(rectPos.x + rectPos.w, grid.cols - rectPos.w) };\r\n if (layout.some((w, i) => i !== idx && intersects(candidate, w.position))) {\r\n candidate = { ...rectPos, y: rectPos.y + rectPos.h };\r\n }\r\n // If still collides, scan rows to find first free spot\r\n const isFree = (pos: WidgetPosition): boolean => !layout.some((w) => intersects(pos, w.position));\r\n if (!isFree(candidate)) {\r\n let found = false;\r\n for (let y = 0; y < 100 && !found; y++) {\r\n for (let x = 0; x <= grid.cols - rectPos.w && !found; x++) {\r\n const pos = { x, y, w: rectPos.w, h: rectPos.h };\r\n if (isFree(pos)) {\r\n candidate = pos;\r\n found = true;\r\n }\r\n }\r\n }\r\n }\r\n const copy: BaseWidgetConfig = { ...src, id: newId, position: candidate } as BaseWidgetConfig;\r\n const next = [...layout, copy];\r\n commitLayout(next);\r\n }\r\n\r\n function findById(id: WidgetId): number {\r\n return layout.findIndex((w) => w.id === id);\r\n }\r\n\r\n function startDrag(id: WidgetId, mode: 'move' | 'resize', edge?: DragState['edge']) {\r\n return (e: PointerEvent): void => {\r\n // Respect feature toggles\r\n if (mode === 'move' && !enableDrag) return;\r\n if (mode === 'resize' && !enableResize) return;\r\n const rect = containerRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n const idx = findById(id);\r\n if (idx === -1) return;\r\n const pos = layout[idx].position;\r\n // Capture pointer to the grid container so move/up handlers fire consistently\r\n containerRef.current?.setPointerCapture(e.pointerId);\r\n setDrag({ id, startX: e.clientX - rect.left, startY: e.clientY - rect.top, origPos: { ...pos }, mode, edge });\r\n };\r\n }\r\n\r\n function onPointerMove(e: PointerEvent): void {\r\n if (!drag) return;\r\n const rect = containerRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n const dx = x - drag.startX;\r\n const dy = y - drag.startY;\r\n\r\n const colWidth = (rect.width - (grid.cols - 1) * grid.gap) / grid.cols;\r\n const deltaCols = roundToCell(dx, colWidth);\r\n const deltaRows = roundToCell(dy, grid.rowHeight);\r\n\r\n const idx = findById(drag.id);\r\n if (idx === -1) return;\r\n\r\n const current = layout[idx];\r\n let nextPos: WidgetPosition = { ...drag.origPos };\r\n if (drag.mode === 'move') {\r\n nextPos.x = clamp(drag.origPos.x + deltaCols, 0, grid.cols - drag.origPos.w);\r\n nextPos.y = Math.max(0, drag.origPos.y + deltaRows);\r\n } else {\r\n // directional resize\r\n const edge = drag.edge ?? 'se';\r\n if (edge.includes('e')) {\r\n nextPos.w = clamp(drag.origPos.w + deltaCols, 1, grid.cols - drag.origPos.x);\r\n }\r\n if (edge.includes('s')) {\r\n nextPos.h = Math.max(1, drag.origPos.h + deltaRows);\r\n }\r\n if (edge.includes('w')) {\r\n // moving west edge affects x and w\r\n const newX = clamp(drag.origPos.x + deltaCols, 0, drag.origPos.x + drag.origPos.w - 1);\r\n const deltaX = newX - drag.origPos.x;\r\n nextPos.x = newX;\r\n nextPos.w = Math.max(1, drag.origPos.w - deltaX);\r\n }\r\n if (edge.includes('n')) {\r\n // moving north edge affects y and h\r\n const newY = Math.max(0, drag.origPos.y + deltaRows);\r\n const deltaY = newY - drag.origPos.y;\r\n nextPos.y = newY;\r\n nextPos.h = Math.max(1, drag.origPos.h - deltaY);\r\n }\r\n }\r\n\r\n // prevent overlap: simple check, if collision then skip update\r\n const collides = layout.some((w, i) => i !== idx && intersects(nextPos, w.position));\r\n if (collides) return;\r\n\r\n const next = [...layout];\r\n next[idx] = { ...current, position: nextPos };\r\n setLayout(next);\r\n }\r\n\r\n function onPointerUp(e: PointerEvent): void {\r\n if (!drag) return;\r\n containerRef.current?.releasePointerCapture(e.pointerId);\r\n commitLayout(layout);\r\n setDrag(null);\r\n }\r\n\r\n return (\r\n \r\n {layout.map((w) => (\r\n
    \r\n removeWidget(w.id) : undefined}\r\n onDuplicate={showActions ? () => duplicateWidget(w.id) : undefined}\r\n >\r\n {renderWidget ? renderWidget(w) : }\r\n \r\n
    \r\n ))}\r\n
    \r\n );\r\n}\r\n\r\nfunction DefaultWidgetRenderer({ widget, chartAdapter }: { widget: BaseWidgetConfig; chartAdapter?: ChartAdapter }): JSX.Element {\r\n const { type, props } = widget;\r\n switch (type) {\r\n case 'card':\r\n return
    {String(props?.content ?? 'Card')}
    ;\r\n case 'stat':\r\n return (\r\n
    \r\n {String(props?.value ?? '0')}\r\n {String(props?.label ?? 'Stat')}\r\n
    \r\n );\r\n case 'progress': {\r\n const v = typeof props?.value === 'number' ? props.value : 0;\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    {v}%
    \r\n
    \r\n );\r\n }\r\n case 'activity': {\r\n const items = Array.isArray(props?.items) ? (props!.items as unknown[]) : [];\r\n return (\r\n
      \r\n {items.length === 0 ?
    • No activity
    • : null}\r\n {items.map((it, i) => (\r\n
    • {String(it)}
    • \r\n ))}\r\n
    \r\n );\r\n }\r\n case 'chart': {\r\n const kind = (props?.kind as ChartKind) ?? 'line';\r\n const adapter = chartAdapter ?? DefaultChartAdapter;\r\n return adapter.render(kind, props ?? {});\r\n }\r\n case 'custom':\r\n default:\r\n return
    Provide a custom renderer.
    ;\r\n }\r\n}\r\n","import { useState } from 'react';\n// Optional schema interface to avoid hard dependency on zod\nexport type ParseSchema = { parse: (input: T) => T };\n\n/**\n * Credentials payload for login.\n */\nexport type LoginCredentials = {\n username: string;\n password: string;\n};\n\n/**\n * Result returned by a login service.\n */\nexport type LoginResult = {\n user: TUser;\n token?: string;\n};\n\n/**\n * Options for `useLogin`.\n * Provide a `login` function to integrate with your auth backend, and an optional Zod schema for validation.\n */\nexport type UseLoginOptions = {\n login: (credentials: LoginCredentials) => Promise>;\n schema?: ParseSchema;\n};\n\nexport type UseLoginReturn = {\n values: LoginCredentials;\n update: (key: K, value: LoginCredentials[K]) => void;\n submit: () => Promise>;\n loading: boolean;\n error: string | null;\n result: LoginResult | null;\n};\n\n/**\n * A composable login hook: manages form state, validation, submit, and loading/errors.\n */\nexport function useLogin({\n login,\n schema,\n}: UseLoginOptions): UseLoginReturn {\n const [values, setValues] = useState({ username: '', password: '' });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [result, setResult] = useState | null>(null);\n\n function update(key: K, value: LoginCredentials[K]): void {\n setValues((v: LoginCredentials) => ({ ...v, [key]: value }));\n }\n\n async function submit(): Promise> {\n setError(null);\n setLoading(true);\n try {\n const input = schema ? schema.parse(values) : values;\n const res = await login(input);\n setResult(res);\n return res;\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Login failed';\n setError(message);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, result };\n}\n\nexport default useLogin;\n","import { useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\n/**\n * Generic registration payload.\n */\nexport type RegisterPayload = Record;\n\n/**\n * Options for `useRegister`.\n */\nexport type UseRegisterOptions = {\n register: (payload: RegisterPayload) => Promise;\n schema?: ZodSchema;\n};\n\nexport type UseRegisterReturn = {\n values: RegisterPayload;\n update: (key: K, value: unknown) => void;\n submit: () => Promise;\n loading: boolean;\n error: string | null;\n user: TUser | null;\n};\n\n/**\n * A composable registration hook: manages form state, validation, submit, and loading/errors.\n */\nexport function useRegister({\n register,\n schema,\n}: UseRegisterOptions): UseRegisterReturn {\n const [values, setValues] = useState({});\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [user, setUser] = useState(null);\n\n function update(key: K, value: unknown): void {\n setValues((v) => ({ ...v, [key]: value }));\n }\n\n async function submit(): Promise {\n setError(null);\n setLoading(true);\n try {\n const payload = schema ? schema.parse(values) : values;\n const res = await register(payload);\n setUser(res);\n return res;\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Registration failed';\n setError(message);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, user };\n}\n\nexport default useRegister;\n","import { useState } from 'react';\n// Optional schema interface to avoid hard dependency on zod\nexport type ParseSchema = { parse: (input: T) => T };\n\n/**\n * Password reset input: allow email or username.\n */\nexport type PasswordResetInput = {\n email?: string;\n username?: string;\n};\n\n/**\n * Options for `usePasswordReset`.\n */\nexport type UsePasswordResetOptions = {\n reset: (input: PasswordResetInput) => Promise;\n schema?: ParseSchema;\n};\n\nexport type UsePasswordResetReturn = {\n values: PasswordResetInput;\n update: (key: K, value: PasswordResetInput[K]) => void;\n submit: () => Promise;\n loading: boolean;\n error: string | null;\n success: boolean;\n};\n\n/**\n * A composable password reset hook: manages form state, validation, submit, and loading/errors.\n */\nexport function usePasswordReset({\n reset,\n schema,\n}: UsePasswordResetOptions): UsePasswordResetReturn {\n const [values, setValues] = useState({ email: '' });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [success, setSuccess] = useState(false);\n\n function update(key: K, value: PasswordResetInput[K]): void {\n setValues((v: PasswordResetInput) => ({ ...v, [key]: value }));\n }\n\n async function submit(): Promise {\n setError(null);\n setSuccess(false);\n setLoading(true);\n try {\n const input = schema ? schema.parse(values) : values;\n await reset(input);\n setSuccess(true);\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Password reset failed';\n setError(message);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, success };\n}\n\nexport default usePasswordReset;\n","import { useEffect, useRef } from 'react';\n\n/**\n * Manage ARIA live region announcements.\n * Returns a ref to attach to an element with `aria-live=\"polite\"` or `assertive`.\n * Use `announce()` to set text content.\n */\nexport type LiveRegionReturn = {\n ref: React.MutableRefObject;\n announce: (message: string) => void;\n};\n\nexport function useLiveRegion(): LiveRegionReturn {\n const ref = useRef(null);\n function announce(message: string): void {\n if (ref.current) {\n ref.current.textContent = message;\n }\n }\n return { ref, announce };\n}\n\n/**\n * Trap focus within a container element (e.g., modal) while `active`.\n * Adds keydown handlers to cycle focus.\n */\nexport type FocusTrapReturn = { ref: React.MutableRefObject };\n\nexport function useFocusTrap(active: boolean): FocusTrapReturn {\n const ref = useRef(null);\n\n useEffect(() => {\n if (!active) return;\n const current = ref.current;\n if (!current) return;\n const el: HTMLElement = current;\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') return;\n const focusable = (\n Array.from(\n el.querySelectorAll(\n 'a[href], button, textarea, input, select, [tabindex]:not([tabindex=\"-1\"])',\n ),\n ) as HTMLElement[]\n ).filter((node: HTMLElement) => !node.hasAttribute('disabled'));\n if (focusable.length === 0) return;\n const first: HTMLElement = focusable[0] as HTMLElement;\n const last: HTMLElement = focusable[focusable.length - 1] as HTMLElement;\n const current = document.activeElement as HTMLElement | null;\n\n if (e.shiftKey) {\n if (!current || current === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (!current || current === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n\n el.addEventListener('keydown', onKeyDown);\n return () => {\n el.removeEventListener('keydown', onKeyDown);\n };\n }, [active]);\n\n return { ref };\n}\n","import { useEffect } from 'react';\n\nexport type RovingConfig = {\n /** CSS selector for focusable items inside the container */\n selector: string;\n /** Optional: initial index to focus when mounted */\n initialIndex?: number;\n};\n\n/**\n * Roving tabindex keyboard navigation for lists/menus.\n * Attach to a container element; items should be focusable via `tabindex`.\n */\nexport function useKeyboardNavigation(\n container: HTMLElement | null,\n { selector, initialIndex = 0 }: RovingConfig,\n): void {\n useEffect(() => {\n if (!container) return;\n const items = Array.from(container.querySelectorAll(selector));\n if (items.length === 0) return;\n\n // Initialize tabindex\n items.forEach((el, i) => el.setAttribute('tabindex', i === initialIndex ? '0' : '-1'));\n\n function onKeyDown(e: KeyboardEvent): void {\n const currentIndex = items.findIndex((el) => el === document.activeElement);\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n const next = items[(currentIndex + 1 + items.length) % items.length];\n items.forEach((el) => el.setAttribute('tabindex', '-1'));\n next.setAttribute('tabindex', '0');\n next.focus();\n e.preventDefault();\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n const prev = items[(currentIndex - 1 + items.length) % items.length];\n items.forEach((el) => el.setAttribute('tabindex', '-1'));\n prev.setAttribute('tabindex', '0');\n prev.focus();\n e.preventDefault();\n }\n }\n\n container.addEventListener('keydown', onKeyDown);\n return () => container.removeEventListener('keydown', onKeyDown);\n }, [container, selector, initialIndex]);\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/components/Dashboard/ClickOutside.tsx","../src/components/Dashboard/Header/DropdownMessage.tsx","../src/components/Dashboard/Header/DropdownNotification.tsx","../src/components/Dashboard/Header/DropdownUser.tsx","../src/hooks/useLocalStorage.tsx","../src/hooks/useColorMode.tsx","../src/components/Dashboard/Header/DarkModeSwitcher.tsx","../src/components/Dashboard/Header/index.tsx","../src/components/Dashboard/Sidebar/index.tsx","../src/layout/DashboardLayout.tsx","../src/common/Loader/index.tsx","../src/main/dashboard.tsx","../src/components/Breadcrumbs/Breadcrumb.tsx","../src/components/Form/ZodDynamicForm.tsx","../src/exceptions/TableErrorBoundary.tsx","../src/hooks/useGeneratePageNumbers.tsx","../src/common/Loader/TableLoader.tsx","../src/components/Table/TablePopover.tsx","../src/components/Table/TableDataCustomBase.tsx","../src/components/Table/TableDataCustom.tsx","../src/components/Dashboard/Widgets/WidgetContainer.tsx","../src/components/Dashboard/Widgets/layoutUtils.ts","../src/components/Dashboard/Widgets/ChartAdapters.tsx","../src/components/Dashboard/Widgets/DashboardGrid.tsx","../src/hooks/useLogin.tsx","../src/hooks/useRegister.ts","../src/hooks/usePasswordReset.tsx","../src/hooks/useA11y.ts","../src/hooks/useKeyboardNavigation.ts"],"names":["jsx","Link","useState","useT","jsxs","useEffect","useRef","_a","React","useLocation","current"],"mappings":"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","file":"index.js","sourcesContent":["import { useRef, useEffect } from 'react';\nimport type { ReactNode, RefObject } from 'react';\n\ninterface Props {\n children: ReactNode;\n exceptionRef?: RefObject;\n onClick: () => void;\n className?: string;\n}\n\nfunction ClickOutside({ children, exceptionRef, onClick, className }: Props): JSX.Element {\n const wrapperRef = useRef(null);\n\n useEffect(() => {\n const handleClickListener = (event: MouseEvent) => {\n let clickedInside: null | boolean = false;\n if (exceptionRef) {\n clickedInside =\n (wrapperRef.current && wrapperRef.current.contains(event.target as Node)) ||\n (exceptionRef.current && exceptionRef.current === event.target) ||\n (exceptionRef.current && exceptionRef.current.contains(event.target as Node));\n } else {\n clickedInside = wrapperRef.current && wrapperRef.current.contains(event.target as Node);\n }\n\n if (!clickedInside) onClick();\n };\n\n document.addEventListener('mousedown', handleClickListener);\n\n return () => {\n document.removeEventListener('mousedown', handleClickListener);\n };\n }, [exceptionRef, onClick]);\n\n return (\n
    \n {children}\n
    \n );\n}\n\nexport default ClickOutside;\n","import React, { useState } from 'react';\r\nimport { Link } from 'react-router';\r\nimport ClickOutside from '../ClickOutside';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\nconst DropdownMessage: React.FC = () => {\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n const [notifying, setNotifying] = useState(true);\r\n const t = useT('templateFe');\r\n\r\n // Example dynamic data; replace with your real data source\r\n const messages = [\r\n { id: 1, user: 'Mariya Desoja', text: 'I like your confidence 💪', time: '2min ago' },\r\n { id: 2, user: 'Robert Jhon', text: 'Can you share your offer?', time: '10min ago' },\r\n { id: 3, user: 'Henry Dholi', text: 'I came across your profile and...', time: '1day ago' },\r\n { id: 4, user: 'Cody Fisher', text: 'I’m waiting for your response!', time: '5days ago' },\r\n { id: 5, user: 'Mariya Desoja', text: 'I like your confidence 💪', time: '2min ago' },\r\n ];\r\n\r\n return (\r\n setDropdownOpen(false)} className=\"relative\">\r\n
  • \r\n {\r\n setNotifying(false);\r\n setDropdownOpen(!dropdownOpen);\r\n }}\r\n className=\"relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white\"\r\n to=\"#\"\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {dropdownOpen && (\r\n
    \r\n
    \r\n
    {t('dropdown.messages')}
    \r\n
    \r\n\r\n
      \r\n {messages.map(({ id, user, text, time }) => (\r\n
    • \r\n \r\n
      \r\n {user}\r\n
      \r\n\r\n
      \r\n
      {user}
      \r\n

      {text}

      \r\n

      {time}

      \r\n
      \r\n \r\n
    • \r\n ))}\r\n
    \r\n
    \r\n )}\r\n
  • \r\n
    \r\n );\r\n};\r\n\r\nexport default DropdownMessage;\r\n","import React, { useState } from 'react';\r\nimport ClickOutside from '../ClickOutside';\r\nimport { Link } from 'react-router';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\ninterface NotificationItem {\r\n id: number;\r\n title: string;\r\n description: string;\r\n time: string;\r\n}\r\n\r\nconst DropdownNotification: React.FC = () => {\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n const [notifying, setNotifying] = useState(true);\r\n const t = useT('templateFe');\r\n\r\n const notifications: NotificationItem[] = [\r\n {\r\n id: 1,\r\n title: 'Edit your information in a swipe',\r\n description:\r\n 'Sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim.',\r\n time: '12 May, 2025',\r\n },\r\n {\r\n id: 2,\r\n title: 'It is a long established fact',\r\n description: 'that a reader will be distracted by the readable.',\r\n time: '24 Feb, 2025',\r\n },\r\n {\r\n id: 3,\r\n title: 'There are many variations',\r\n description: 'of passages of Lorem Ipsum available, but the majority have suffered',\r\n time: '04 Jan, 2025',\r\n },\r\n {\r\n id: 4,\r\n title: 'There are many variations',\r\n description: 'of passages of Lorem Ipsum available, but the majority have suffered',\r\n time: '01 Dec, 2024',\r\n },\r\n ];\r\n\r\n return (\r\n setDropdownOpen(false)} className=\"relative\">\r\n
  • \r\n {\r\n setNotifying(false);\r\n setDropdownOpen(!dropdownOpen);\r\n }}\r\n to=\"#\"\r\n className=\"relative flex h-8.5 w-8.5 items-center justify-center rounded-full border-[0.5px] border-stroke bg-gray hover:text-primary dark:border-strokedark dark:bg-meta-4 dark:text-white\"\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n {dropdownOpen && (\r\n
    \r\n
    \r\n
    {t('dropdown.notifications')}
    \r\n
    \r\n\r\n
      \r\n {notifications.map(({ id, title, description, time }) => (\r\n
    • \r\n \r\n

      \r\n {title} {description}\r\n

      \r\n

      {time}

      \r\n \r\n
    • \r\n ))}\r\n
    \r\n
    \r\n )}\r\n
  • \r\n
    \r\n );\r\n};\r\n\r\nexport default DropdownNotification;\r\n","import { useState } from 'react';\r\nimport ClickOutside from '../ClickOutside';\r\nimport React from 'react';\r\nimport { Link } from 'react-router';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\ntype DropdownUserProps = {\r\n onLogout?: () => void;\r\n};\r\n\r\nconst DropdownUser: React.FC = ({ onLogout }) => {\r\n const [dropdownOpen, setDropdownOpen] = useState(false);\r\n const t = useT('templateFe');\r\n const role = 'superAdmin'; // or from user data\r\n const translatedRole = t(`roles.${role}`, { defaultValue: role });\r\n console.log('DROPDOWN RENDER onLogout =', onLogout);\r\n\r\n return (\r\n setDropdownOpen(false)} className=\"relative\">\r\n setDropdownOpen(!dropdownOpen)}\r\n className=\"flex items-center gap-4\"\r\n to=\"#\"\r\n >\r\n \r\n Thomas Anree\r\n {translatedRole}\r\n \r\n\r\n \r\n \r\n \r\n\r\n {/* Chevron (valid SVG) */}\r\n \r\n \r\n \r\n \r\n\r\n {dropdownOpen && (\r\n
    \r\n
      \r\n
    • \r\n setDropdownOpen(false)}\r\n >\r\n {/* placeholder icon to keep alignment */}\r\n \r\n {t('dropdown.profile')}\r\n \r\n
    • \r\n\r\n
    • \r\n \r\n \r\n {t('dropdown.contacts')}\r\n \r\n
    • \r\n\r\n
    • \r\n setDropdownOpen(false)}\r\n >\r\n \r\n {t('dropdown.settings')}\r\n \r\n
    • \r\n
    \r\n\r\n {\r\n console.log('DROPDOWN LOGOUT CLICKED, onLogout =', onLogout);\r\n setDropdownOpen(false);\r\n onLogout?.();\r\n }}\r\n className=\"flex items-center gap-3.5 px-6 py-4 text-sm font-medium duration-300 ease-in-out hover:text-primary lg:text-base\"\r\n >\r\n \r\n {t('dropdown.logout')}\r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default DropdownUser;\r\n","import { useEffect, useState } from 'react';\r\n\r\n/**\r\n * Setter type used by `useLocalStorage`.\r\n * Accepts a direct value or an updater function.\r\n */\r\nexport type SetValue = T | ((val: T) => T);\r\n\r\n/**\r\n * A typed hook that syncs a stateful value with `window.localStorage`.\r\n * Returns a tuple `[value, setValue]` similar to `useState`.\r\n */\r\nfunction useLocalStorage(key: string, initialValue: T): [T, (value: SetValue) => void] {\r\n // State to store our value\r\n // Pass initial state function to useState so logic is only executed once\r\n const [storedValue, setStoredValue] = useState(() => {\r\n try {\r\n // Get from local storage by key\r\n const item = window.localStorage.getItem(key);\r\n // Parse stored json or if none return initialValue\r\n return item ? JSON.parse(item) : initialValue;\r\n } catch (error) {\r\n // If error also return initialValue\r\n console.log(error);\r\n return initialValue;\r\n }\r\n });\r\n\r\n // useEffect to update local storage when the state changes\r\n useEffect(() => {\r\n try {\r\n // Persist the current value to localStorage\r\n window.localStorage.setItem(key, JSON.stringify(storedValue));\r\n } catch (error) {\r\n // A more advanced implementation would handle the error case\r\n console.log(error);\r\n }\r\n }, [key, storedValue]);\r\n\r\n return [storedValue, setStoredValue];\r\n}\r\n\r\nexport default useLocalStorage;\r\n","import { useEffect } from 'react';\nimport useLocalStorage from './useLocalStorage';\n\n/**\n * Persisted color mode hook.\n * Toggles `dark` class on `` when mode is 'dark'.\n * Returns `[colorMode, setColorMode]`.\n */\nconst useColorMode = (): [string, (value: string | ((val: string) => string)) => void] => {\n const [colorMode, setColorMode] = useLocalStorage('color-theme', 'light');\n\n useEffect(() => {\n const className = 'dark';\n const bodyClass = window.document.body.classList;\n\n if (colorMode === 'dark') {\n bodyClass.add(className);\n } else {\n bodyClass.remove(className);\n }\n }, [colorMode]);\n\n return [colorMode, setColorMode];\n};\n\nexport default useColorMode;\n","import React from 'react';\nimport useColorMode from '../../../hooks/useColorMode';\n\nconst DarkModeSwitcher: React.FC = () => {\n const [colorMode, setColorMode] = useColorMode();\n\n return (\n
  • \n \n \n typeof setColorMode === 'function' &&\n setColorMode(colorMode === 'light' ? 'dark' : 'light')\n }\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
  • \n );\n};\n\nexport default DarkModeSwitcher;\n","import DropdownMessage from './DropdownMessage';\nimport DropdownNotification from './DropdownNotification';\nimport DropdownUser from './DropdownUser';\n// import LogoIcon from '../../../assets/images/logo/logo-icon.svg';\nimport DarkModeSwitcher from './DarkModeSwitcher';\nimport React from 'react';\nimport { useT } from '@ciscode/ui-translate-core';\n\nconst Header = (props: {\n sidebarOpen: string | boolean | undefined;\n setSidebarOpen: (arg0: boolean) => void;\n onLogout?: () => void;\n}): JSX.Element => {\n const t = useT('templateFe');\n console.log('HEADER onLogout prop =', props.onLogout);\n\n return (\n
    \n
    \n
    \n {/* */}\n {\n e.stopPropagation();\n props.setSidebarOpen(!props.sidebarOpen);\n }}\n className=\"z-99999 block rounded-sm border border-stroke bg-white p-1.5 shadow-sm dark:border-strokedark dark:bg-boxdark lg:hidden\"\n >\n \n \n \n \n \n \n \n \n \n \n \n \n {/* */}\n
    \n\n
    \n
    \n
    \n \n\n \n
    \n
    \n
    \n\n
    \n
      \n {/* */}\n \n {/* */}\n\n {/* */}\n \n {/* */}\n\n {/* */}\n \n {/* */}\n
    \n\n {/* */}\n \n {/* */}\n
    \n
    \n
    \n );\n};\n\nexport default Header;\n","import React, { useEffect, useRef, useState, ReactNode } from 'react';\nimport { useLocation, NavLink } from 'react-router';\nimport { SidebarSection } from '../../../models/SidebarItemModel';\n\ninterface SidebarProps {\n sidebarOpen: boolean;\n setSidebarOpen: (arg: boolean) => void;\n sections: SidebarSection[];\n logo?: ReactNode;\n}\n\nconst Sidebar = ({ sidebarOpen, setSidebarOpen, sections, logo }: SidebarProps): JSX.Element => {\n const location = useLocation();\n const { pathname } = location;\n\n const trigger = useRef(null);\n const sidebar = useRef(null);\n\n const storedSidebarExpanded = localStorage.getItem('sidebar-expanded');\n const [sidebarExpanded] = useState(storedSidebarExpanded === 'true');\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (!sidebar.current || !trigger.current) return;\n if (\n !sidebarOpen ||\n sidebar.current.contains(e.target as Node) ||\n trigger.current.contains(e.target as Node)\n ) {\n return;\n }\n setSidebarOpen(false);\n };\n document.addEventListener('click', handleClickOutside);\n return () => document.removeEventListener('click', handleClickOutside);\n }, [sidebarOpen, setSidebarOpen]);\n\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (!sidebarOpen || e.key !== 'Escape') return;\n setSidebarOpen(false);\n };\n document.addEventListener('keydown', handleEsc);\n return () => document.removeEventListener('keydown', handleEsc);\n }, [sidebarOpen, setSidebarOpen]);\n\n useEffect(() => {\n localStorage.setItem('sidebar-expanded', sidebarExpanded.toString());\n if (sidebarExpanded) {\n document.body.classList.add('sidebar-expanded');\n } else {\n document.body.classList.remove('sidebar-expanded');\n }\n }, [sidebarExpanded]);\n\n const sortedSections = [...sections].sort((a, b) => (a.order ?? 9999) - (b.order ?? 9999));\n\n return (\n \n {/* SIDEBAR HEADER */}\n
    \n \n {logo ? (\n {logo}\n ) : (\n
    \n APP-LOGO\n
    \n )}\n
    \n\n setSidebarOpen(!sidebarOpen)}\n className=\"ml-3 block lg:hidden\"\n >\n \n \n \n \n
    \n {/* END SIDEBAR HEADER */}\n\n
    \n \n
    \n \n );\n};\n\nexport default Sidebar;\n","import React, { useState, ReactNode } from 'react';\r\nimport Header from '../components/Dashboard/Header/index';\r\nimport Sidebar from '../components/Dashboard/Sidebar/index';\r\nimport { SidebarSection } from '../models/SidebarItemModel';\r\n\r\ntype FooterLink = {\r\n label: string;\r\n href: string;\r\n newTab?: boolean;\r\n};\r\n\r\ninterface DashboardLayoutProps {\r\n children: ReactNode;\r\n sidebarContent: SidebarSection[];\r\n logo: ReactNode;\r\n onLogout?: () => void;\r\n\r\n footer?: {\r\n /**\r\n * Advanced: fully custom footer blocks (you control the JSX).\r\n */\r\n blocks?: ReactNode[];\r\n /**\r\n * Simple preset: provide data only, template renders a styled footer.\r\n */\r\n preset?: {\r\n leftText: string;\r\n links?: FooterLink[];\r\n version?: string;\r\n };\r\n /**\r\n * Optional className override on the
    wrapper.\r\n */\r\n className?: string;\r\n };\r\n}\r\n\r\nconst DashboardLayout: React.FC = ({\r\n children,\r\n sidebarContent,\r\n logo,\r\n onLogout,\r\n footer,\r\n}) => {\r\n const [sidebarOpen, setSidebarOpen] = useState(false);\r\n\r\n const hasPreset = Boolean(footer?.preset);\r\n const hasBlocks = Boolean(footer?.blocks && footer.blocks.length > 0);\r\n\r\n return (\r\n
    \r\n
    \r\n {/* Sidebar */}\r\n \r\n\r\n {/* Main content column */}\r\n
    \r\n
    \r\n\r\n
    \r\n {/* Content */}\r\n
    \r\n
    {children}
    \r\n
    \r\n\r\n {/* Sticky footer (preset has priority over blocks) */}\r\n {hasPreset ? (\r\n
    \r\n
    \r\n
    \r\n
    {footer?.preset?.leftText}
    \r\n\r\n
    \r\n {footer?.preset?.links?.length ? (\r\n
    \r\n {footer.preset.links.map((l) => {\r\n const newTab = l.newTab ?? true; // default: new tab\r\n return (\r\n \r\n {l.label}\r\n \r\n );\r\n })}\r\n
    \r\n ) : null}\r\n\r\n {footer?.preset?.version ? (\r\n {footer.preset.version}\r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n ) : hasBlocks ? (\r\n
    \r\n
    \r\n
    \r\n {footer!.blocks!.map((block, idx) => (\r\n {block}\r\n ))}\r\n
    \r\n
    \r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default DashboardLayout;\r\n","import React from 'react';\n\nconst Loader = (): JSX.Element => {\n return (\n
    \n
    \n
    \n );\n};\nexport default Loader;\n","import { useState, useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { useLocation } from 'react-router';\nimport DashboardLayout from '../layout/DashboardLayout';\nimport Loader from '../common/Loader';\n\n// Existing (legacy) sidebar model used by current Template implementation\nimport { SidebarSection } from '../models/SidebarItemModel';\n\n// New typed configs (non-breaking additions)\nimport type {\n TemplateSidebarConfig,\n TemplateNavbarConfig,\n TemplateFooterConfig,\n} from './layoutTypes';\n\n/**\n * Props for the `Template` (Dashboard Shell) component.\n * Backward compatible with legacy sidebar/logo/onLogout while\n * supporting modern `sidebar`, `navbar`, and optional `footer` configs.\n */\nexport interface DashboardProps {\n children: ReactNode;\n\n /**\n * Legacy props (backward compatible)\n */\n sidebarContent?: SidebarSection[];\n logo?: ReactNode;\n onLogout?: () => void;\n\n /**\n * New config props (preferred)\n */\n sidebar?: TemplateSidebarConfig;\n navbar?: TemplateNavbarConfig;\n\n /**\n * Optional footer (rendered inside DashboardLayout when provided)\n */\n footer?: TemplateFooterConfig;\n}\n\n/**\n * Template (Dashboard Shell)\n *\n * Backward compatible:\n * - Existing apps can keep using: sidebarContent + logo + onLogout\n * Preferred:\n * - New apps should use: sidebar + navbar (+ footer when needed)\n */\nfunction Template({\n children,\n sidebarContent = [],\n logo,\n onLogout,\n navbar,\n footer,\n}: DashboardProps): JSX.Element {\n const [loading, setLoading] = useState(true);\n const { pathname } = useLocation();\n\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n useEffect(() => {\n setTimeout(() => setLoading(false), 1000);\n }, []);\n\n /**\n * Resolve \"brand\" area:\n * - Prefer navbar.brandSlot\n * - Else map legacy `logo` prop (deprecated) to brandSlot\n * - Else fall back to simple navbar.brand config if provided\n */\n const resolvedBrandNode: ReactNode | undefined =\n navbar?.brandSlot ??\n logo ??\n (navbar?.brand ? (\n \n {navbar.brand.logoSrc ? (\n \n ) : (\n {navbar.brand.title ?? ''}\n )}\n \n ) : undefined);\n\n /**\n * Resolve sidebar:\n * - For now, if `sidebar` is provided, we still pass legacy sidebarContent through,\n * because DashboardLayout currently expects SidebarSection[].\n */\n const resolvedLegacySidebarContent: SidebarSection[] = sidebarContent;\n\n return loading ? (\n \n ) : (\n \n {children}\n \n );\n}\n\nexport default Template;\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { useT } from '@ciscode/ui-translate-core';\r\n\r\n/**\r\n * Props for `Breadcrumb` component.\r\n * - `pageName`: current page label displayed in the trail.\r\n */\r\nexport interface BreadcrumbProps {\r\n pageName: string;\r\n}\r\n\r\n/**\r\n * Accessible breadcrumb navigation.\r\n * Renders a current page label and a link to home.\r\n */\r\nconst Breadcrumb: React.FC = ({ pageName }) => {\r\n const t = useT('templateFe');\r\n\r\n return (\r\n
    \r\n

    {pageName}

    \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default Breadcrumb;\r\n","import { useState } from 'react';\nimport type { ReactNode, ChangeEvent, FormEvent } from 'react';\nimport { ZodSchema, ZodError } from 'zod';\nimport { MultiValue } from 'react-select';\nimport Select from 'react-select';\nimport { FieldConfigDynamicForm } from '../../models/FieldConfigDynamicForm';\n\nexport interface ControlledZodDynamicFormProps {\n schema: ZodSchema>;\n fields: FieldConfigDynamicForm[];\n values: Record;\n onChangeField: (fieldName: string, newValue: unknown) => void;\n onSubmit: (parsedValues: Record) => void;\n submitLabel?: string;\n header?: ReactNode;\n /** Optional override for the ZodError class (for dependency injection) */\n}\n\nexport default function ControlledZodDynamicForm({\n schema,\n fields,\n values,\n onChangeField,\n onSubmit,\n submitLabel = 'Submit',\n header,\n}: ControlledZodDynamicFormProps): JSX.Element {\n const [errors, setErrors] = useState>({});\n\n /**\n * Handler for standard text/textarea/select/checkbox inputs.\n * Uses a type guard so we can safely read e.target.checked if it's a checkbox.\n */\n function handleInputChange(\n e: ChangeEvent,\n ): void {\n const { name, value, type } = e.target;\n let newValue: unknown = value;\n\n // type guard for checkbox\n if (type === 'checkbox' && e.target instanceof HTMLInputElement) {\n newValue = e.target.checked;\n } else if (type === 'number') {\n newValue = parseFloat(value) || 0;\n }\n onChangeField(name, newValue);\n }\n\n /**\n * On form submit => parse the entire `values` with Zod.\n * If it fails, store the error messages in local state to display.\n */\n function handleSubmit(e: FormEvent): void {\n e.preventDefault();\n try {\n // Attempt to parse the entire form data with Zod\n const parsed = schema.parse(values);\n // If success, call parent\n onSubmit(parsed);\n } catch (err) {\n if (err instanceof ZodError) {\n // Build a record of errors for simpler fields\n const newErrors: Record = {};\n\n // Check if any error is specifically for \"details\" path\n let detailsErrorFound = false;\n\n err.errors.forEach((issue) => {\n const pathKey = issue.path.join('.');\n newErrors[pathKey] = issue.message;\n\n // If the path starts with \"details\", we assume it's a problem with details\n if (issue.path[0] === 'details') {\n detailsErrorFound = true;\n }\n });\n\n // If there's an error in \"details\", show an alert\n if (detailsErrorFound) {\n alert('Please fill out all required fields in Details.');\n }\n\n setErrors(newErrors);\n }\n }\n }\n\n return (\n
    \n {/* header */}\n {header &&
    {header}
    }\n\n {/* form */}\n {fields.map((field) => {\n const fieldError = errors[field.name];\n const fieldValue = values[field.name] ?? '';\n\n return (\n
    \n \n\n {(() => {\n switch (field.type) {\n case 'textarea':\n return (\n \n );\n\n case 'select':\n return (\n \n \n {field.options?.map((opt) => (\n \n ))}\n \n );\n\n case 'checkbox':\n return (\n \n );\n\n case 'multiSelect': {\n // We assume `field.options` is an array of { label: string, value: string }.\n const multiOpts = field.options ?? [];\n // The user’s current selection is an array of IDs => find the matching option or fallback\n const selectedValues = Array.isArray(fieldValue)\n ? fieldValue.map((id: string) => {\n const found = multiOpts.find((o) => o.value === id);\n if (found) return found;\n // fallback => ensures a unique string value\n return {\n label: String(id) || '???',\n value: String(id),\n };\n })\n : [];\n\n return (\n ,\n ) => {\n const arrIds = selected.map((opt) => opt.value);\n onChangeField(field.name, arrIds);\n }}\n className=\"w-full\"\n />\n );\n }\n case 'custom': {\n const CustomComp = field.component; // e.g. DetailsManager\n if (!CustomComp) {\n return (\n

    \n Missing component for custom field: {field.name}\n

    \n );\n }\n\n // Get nested errors for field \"details\" or whatever the field's name is\n const subErrors = findNestedErrors(errors, field.name);\n // subErrors might look like { 0: { grams: \"Error message\" }, 1: { price: \"Error\" } }\n\n return (\n onChangeField(field.name, newVal)}\n errors={subErrors}\n {...field.props}\n // optionally pass more props if needed\n />\n );\n }\n\n default:\n // text or number\n return (\n \n );\n }\n })()}\n\n {fieldError &&

    {fieldError}

    }\n
    \n );\n })}\n\n
    \n \n {submitLabel}\n \n
    \n
    \n );\n}\n\n//Show erros validation\nexport function findNestedErrors(\n allErrors: Record,\n rootField: string,\n): Record> {\n const nested: Record> = {};\n\n // For each key => e.g. \"details.0.grams\"\n for (const key in allErrors) {\n if (key.startsWith(`${rootField}.`)) {\n // remove \"details.\" => \"0.grams\"\n const subPath = key.slice(rootField.length + 1); // e.g. \"0.grams\"\n const [indexStr, fieldName] = subPath.split('.');\n const index = parseInt(indexStr, 10);\n\n if (!isNaN(index)) {\n if (!nested[index]) {\n nested[index] = {};\n }\n nested[index][fieldName] = allErrors[key];\n }\n }\n }\n\n return nested;\n}\n","import React from 'react';\nimport { useT } from '@ciscode/ui-translate-core';\n\ninterface TableErrorBoundaryState {\n hasError: boolean;\n}\n\nclass TableErrorBoundary extends React.Component<\n React.PropsWithChildren,\n TableErrorBoundaryState\n> {\n constructor(props: React.PropsWithChildren) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(): TableErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: unknown, errorInfo: unknown): void {\n console.error('TableErrorBoundary caught an error:', error, errorInfo);\n }\n\n render(): React.ReactNode {\n if (this.state.hasError) {\n // You can't use hooks like useT inside a class component,\n // so we wrap it in a functional HOC instead.\n return ;\n }\n\n return this.props.children;\n }\n}\n\nconst TranslatedErrorMessage = (): JSX.Element => {\n const t = useT('template-fe');\n return (\n
    \n {t('table.errorBoundary.fallbackMessage')}\n
    \n );\n};\n\nexport default TableErrorBoundary;\n","/**\r\n * Generate a compact page list for pagination controls.\r\n * Includes first/last pages and ellipses around the current.\r\n */\r\nexport function generatePageNumbers(current: number, total: number): (number | string)[] {\r\n const maxPagesToShow = 5;\r\n const pages: (number | string)[] = [];\r\n\r\n // If total is small, just show them all\r\n if (total <= maxPagesToShow) {\r\n for (let i = 1; i <= total; i++) {\r\n pages.push(i);\r\n }\r\n return pages;\r\n }\r\n\r\n // Always show first page\r\n pages.push(1);\r\n\r\n // Determine start/end range near current\r\n const start = Math.max(2, current - 1);\r\n const end = Math.min(total - 1, current + 1);\r\n\r\n // Ellipses before start if needed\r\n if (start > 2) {\r\n pages.push('...');\r\n }\r\n\r\n // Range in the middle\r\n for (let i = start; i <= end; i++) {\r\n pages.push(i);\r\n }\r\n\r\n // Ellipses after end if needed\r\n if (end < total - 1) {\r\n pages.push('...');\r\n }\r\n\r\n // Always show last page\r\n pages.push(total);\r\n\r\n return pages;\r\n}\r\n","import React from 'react';\n\nexport const TableLoader = (): JSX.Element => {\n return (\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n );\n};\n","import React, { useEffect, useRef } from 'react';\r\nimport ReactDOM from 'react-dom';\r\n\r\nexport interface TablePopoverProps {\r\n anchor: HTMLElement | null;\r\n children: React.ReactNode;\r\n onClose: () => void;\r\n}\r\n\r\nexport const TablePopover: React.FC = ({ anchor, children, onClose }) => {\r\n const popoverRef = useRef(null);\r\n\r\n useEffect(() => {\r\n function handleClick(e: MouseEvent) {\r\n if (\r\n popoverRef.current &&\r\n !popoverRef.current.contains(e.target as Node) &&\r\n anchor &&\r\n !anchor.contains(e.target as Node)\r\n ) {\r\n onClose();\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClick);\r\n return () => document.removeEventListener('mousedown', handleClick);\r\n }, [anchor, onClose]);\r\n\r\n if (!anchor) return null;\r\n\r\n const rect = anchor.getBoundingClientRect();\r\n const style: React.CSSProperties = {\r\n position: 'fixed',\r\n top: rect.bottom + 8,\r\n left: rect.left,\r\n zIndex: 9999,\r\n background: 'white',\r\n border: '1px solid #e5e7eb',\r\n borderRadius: 12,\r\n boxShadow: '0 8px 32px 0 rgba(60,60,60,0.18)',\r\n padding: 0,\r\n minWidth: 200,\r\n animation: 'fadeIn 0.18s',\r\n };\r\n\r\n return ReactDOM.createPortal(\r\n
    \r\n
    \r\n
    \r\n
    \r\n {children}\r\n \r\n \r\n \r\n \r\n \r\n
    ,\r\n document.body,\r\n );\r\n};\r\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { generatePageNumbers } from '../../hooks/useGeneratePageNumbers';\nimport { TableLoader } from '../../common/Loader/TableLoader';\nimport { ToolbarItem } from '../../models/ToolbarItemModel';\nimport { ColumnConfigTable } from '../../models/ColumnConfigTable';\nimport { useT } from '@ciscode/ui-translate-core';\nimport { TablePopover } from './TablePopover';\n\ntype InlineEditableCellProps = {\n value: unknown;\n row: T;\n rowIndex: number;\n columnKey: keyof T;\n onCommit: (next: unknown) => void;\n editor?: (args: {\n value: unknown;\n row: T;\n rowIndex: number;\n onChange: (next: unknown) => void;\n onCommit: () => void;\n onCancel: () => void;\n }) => React.ReactNode;\n className?: string;\n children: React.ReactNode;\n};\n\nfunction InlineEditableCell(props: InlineEditableCellProps): JSX.Element {\n const { value, row, rowIndex, onCommit, editor, children } = props;\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(value ?? '');\n\n const startEdit = useCallback(() => {\n setDraft(value ?? '');\n setEditing(true);\n }, [value]);\n\n const commit = useCallback(() => {\n setEditing(false);\n onCommit(draft);\n }, [draft, onCommit]);\n\n const cancel = useCallback(() => {\n setEditing(false);\n setDraft(value ?? '');\n }, [value]);\n\n if (!editing) {\n return (\n
    \n {children}\n
    \n );\n }\n\n if (editor) {\n return (\n
    \n {editor({\n value: draft,\n row,\n rowIndex,\n onChange: setDraft,\n onCommit: commit,\n onCancel: cancel,\n })}\n
    \n );\n }\n\n return (\n setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit();\n if (e.key === 'Escape') cancel();\n }}\n className=\"px-2 py-1 text-sm border rounded-md dark:bg-gray-700 dark:text-white\"\n />\n );\n}\n\n/**\n * Pagination configuration for table navigation.\n */\nexport type PaginationProps = {\n currentPage: number;\n totalPages: number;\n totalItems: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n};\n\n/**\n * Props for `TableDataCustom` and base component.\n */\nexport interface TableDataCustomProps {\n columns: ColumnConfigTable[];\n data: T[];\n loading?: boolean;\n pagination?: PaginationProps;\n errorMessage?: string | null;\n toolbarItems?: ToolbarItem[];\n\n /** Feature toggles */\n enableSelection?: boolean;\n enableSorting?: boolean;\n enableFilter?: boolean;\n enableInlineEdit?: boolean;\n\n /** Filtering (controlled/uncontrolled) */\n filterQuery?: string;\n onFilterQueryChange?: (query: string) => void;\n\n /** Selection callback */\n onSelectionChange?: (selectedRows: T[], selectedIndices: number[]) => void;\n\n /** Inline cell edit callback */\n onCellEdit?: (rowIndex: number, columnKey: keyof T, nextValue: unknown, row: T) => void;\n}\n\n/**\n * Internal base table component that renders the table UI.\n * Consumers should use `TableDataCustom` which wraps this with an error boundary.\n */\nfunction TableDataCustomBase({\n columns,\n data,\n errorMessage,\n pagination,\n loading,\n toolbarItems,\n enableSelection,\n enableSorting,\n enableFilter,\n enableInlineEdit,\n filterQuery,\n onFilterQueryChange,\n onSelectionChange,\n onCellEdit,\n}: TableDataCustomProps): JSX.Element {\n const t = useT('templateFe');\n\n // split toolbar items\n const leftItems = (toolbarItems ?? []).filter(\n (it) => it.visible !== false && (it.position ?? 'left') === 'left',\n );\n const rightItems = (toolbarItems ?? []).filter(\n (it) => it.visible !== false && it.position === 'right',\n );\n const [popover, setPopover] = useState<{\n anchor: HTMLElement | null;\n content: React.ReactNode;\n } | null>(null);\n const closePopover = useCallback(() => setPopover(null), []);\n\n // Selection state (indices within visible data)\n const [selected, setSelected] = useState>(new Set());\n const toggleSelectAll = useCallback((checked: boolean, count: number) => {\n const next = new Set();\n if (checked) {\n for (let i = 0; i < count; i++) next.add(i);\n }\n setSelected(next);\n }, []);\n\n const toggleRowSelection = useCallback((index: number) => {\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n }, []);\n\n // Sorting state\n const [sortBy, setSortBy] = useState(null);\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc');\n const onHeaderClick = useCallback(\n (colIndex: number, col: ColumnConfigTable) => {\n if (!enableSorting || col.sortable === false) return;\n setSortBy((prev) => (prev === colIndex ? colIndex : colIndex));\n setSortDir((prev) => (sortBy === colIndex ? (prev === 'asc' ? 'desc' : 'asc') : 'asc'));\n },\n [enableSorting, sortBy],\n );\n\n // Filtering state (uncontrolled fallback)\n const [internalQuery, setInternalQuery] = useState('');\n const activeQuery = (filterQuery ?? internalQuery).trim();\n\n // Build visible rows: filter then sort\n const visibleData = useMemo(() => {\n let rows = [...data];\n if (enableFilter && activeQuery.length > 0) {\n const q = activeQuery.toLowerCase();\n rows = rows.filter((row) => {\n return columns.some((col) => {\n const keys = Array.isArray(col.key) ? col.key : [col.key];\n const val = keys\n .map((k) => String((row[k as keyof T] as unknown) ?? ''))\n .join(' ') // combine multi-key cells\n .toLowerCase();\n if (col.filterPredicate) {\n return col.filterPredicate(val, row, q);\n }\n return val.includes(q);\n });\n });\n }\n if (enableSorting && sortBy != null) {\n const col = columns[sortBy];\n rows.sort((a, b) => {\n const keys = Array.isArray(col.key) ? col.key : [col.key];\n const va = keys.map((k) => a[k as keyof T] as unknown);\n const vb = keys.map((k) => b[k as keyof T] as unknown);\n const left = va.length > 1 ? va.join(' ') : va[0];\n const right = vb.length > 1 ? vb.join(' ') : vb[0];\n let cmp = 0;\n if (typeof col.sortComparator === 'function') {\n cmp = col.sortComparator(left, right, a, b);\n } else {\n const la = left ?? '';\n const lb = right ?? '';\n const sa = String(la).toLowerCase();\n const sb = String(lb).toLowerCase();\n if (sa < sb) cmp = -1;\n else if (sa > sb) cmp = 1;\n else cmp = 0;\n }\n return sortDir === 'asc' ? cmp : -cmp;\n });\n }\n return rows;\n }, [data, columns, enableFilter, activeQuery, enableSorting, sortBy, sortDir]);\n\n // Notify selection changes\n React.useEffect(() => {\n if (!onSelectionChange) return;\n const indices = Array.from(selected.values()).sort((a, b) => a - b);\n const rows = indices.map((i) => visibleData[i]).filter(Boolean);\n onSelectionChange(rows, indices);\n }, [selected, visibleData, onSelectionChange]);\n\n return (\n
    \n {popover && (\n \n {popover.content}\n \n )}\n
    \n
    \n {/* Toolbar */}\n {(leftItems.length > 0 || rightItems.length > 0 || enableFilter) && (\n
    \n
    \n {leftItems.map((it, i) => (\n \n {it.node}\n \n ))}\n {enableFilter && (\n \n onFilterQueryChange\n ? onFilterQueryChange(e.target.value)\n : setInternalQuery(e.target.value)\n }\n placeholder={t('table.filter') ?? 'Filter…'}\n className=\"px-3 py-2 text-sm border rounded-md dark:bg-gray-700 dark:text-white\"\n />\n )}\n
    \n
    \n {rightItems.map((it, i) => (\n \n {it.node}\n \n ))}\n
    \n
    \n )}\n\n {/* Table */}\n
    \n \n \n \n {enableSelection && (\n \n )}\n {columns.map((col, i) => (\n onHeaderClick(i, col)}\n title={enableSorting && col.sortable !== false ? 'Sort' : undefined}\n >\n \n {col.title}\n {enableSorting && sortBy === i && (\n \n {sortDir === 'asc' ? (\n \n ) : (\n \n )}\n \n )}\n \n \n ))}\n \n \n \n {loading ? (\n \n \n \n \n \n ) : errorMessage ? (\n \n \n {errorMessage}\n \n \n ) : visibleData.length === 0 ? (\n \n \n {t('table.noData')}\n \n \n ) : (\n visibleData.map((row, r) => (\n \n {enableSelection && (\n \n )}\n {columns.map((col, c) => {\n let content: React.ReactNode;\n if (Array.isArray(col.key)) {\n const vals = col.key.map((k) => row[k] ?? '');\n const display = vals.join(' - ');\n content = col.render ? col.render(vals, row, setPopover) : display;\n } else {\n const val = row[col.key];\n const display = String(val ?? '');\n // Inline editing: per-cell editing on double-click\n if (enableInlineEdit && col.editable) {\n content = (\n onCellEdit?.(r, col.key as keyof T, next, row)}\n editor={col.editor}\n className={col.cellClassName}\n >\n {col.render ? col.render(val, row, setPopover) : display}\n \n );\n } else {\n content = col.render ? col.render(val, row, setPopover) : display;\n }\n }\n return (\n \n {content}\n \n );\n })}\n \n ))\n )}\n \n
    \n 0 && selected.size === visibleData.length}\n onChange={(e) => toggleSelectAll(e.target.checked, visibleData.length)}\n />\n
    \n toggleRowSelection(r)}\n />\n
    \n
    \n\n {/* Pagination */}\n {pagination && (\n \n \n {t('table.pagination.showing', {\n from: (pagination.currentPage - 1) * (pagination.pageSize ?? 10) + 1,\n to: Math.min(\n pagination.currentPage * (pagination.pageSize ?? 10),\n pagination.totalItems,\n ),\n total: pagination.totalItems,\n })}\n \n\n
      \n {/* Previous */}\n
    • \n pagination.onPageChange?.(pagination.currentPage - 1)}\n disabled={pagination.currentPage <= 1}\n className=\"flex items-center justify-center h-full py-1.5 px-3 ml-0 text-gray-500 bg-white rounded-l-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\"\n >\n {t('table.pagination.previous')}\n \n \n \n \n
    • \n\n {/* Pages */}\n {generatePageNumbers(pagination.currentPage, pagination.totalPages).map((p, i) =>\n typeof p === 'string' ? (\n
    • \n \n {p}\n \n
    • \n ) : (\n
    • \n pagination.onPageChange?.(p)}\n className={`flex items-center justify-center px-3 py-2 text-sm border ${\n p === pagination.currentPage\n ? 'z-10 text-primary-600 bg-primary-50 border-primary-300 hover:bg-primary-100 hover:text-primary-700 dark:bg-gray-700 dark:text-white dark:border-gray-700'\n : 'text-gray-500 bg-white border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-700 dark:hover:bg-gray-700'\n }`}\n >\n {p}\n \n
    • \n ),\n )}\n\n {/* Next */}\n
    • \n pagination.onPageChange?.(pagination.currentPage + 1)}\n disabled={pagination.currentPage >= pagination.totalPages}\n className=\"flex items-center justify-center h-full py-1.5 px-3 leading-tight text-gray-500 bg-white rounded-r-lg border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\"\n >\n {t('table.pagination.next')}\n \n \n \n \n
    • \n
    \n \n )}\n
    \n
    \n
    \n );\n}\n\nexport default TableDataCustomBase;\n","import React from 'react';\nimport TableErrorBoundary from '../../exceptions/TableErrorBoundary';\nimport TableDataCustomBase, { TableDataCustomProps } from './TableDataCustomBase';\n\n/**\n * Public table component with built-in error boundary.\n * Wraps `TableDataCustomBase` in `TableErrorBoundary` to provide a safe fallback.\n * Consumers should import `TableDataCustom` from the package root.\n */\nfunction TableDataCustom(props: TableDataCustomProps): JSX.Element {\n return (\n \n \n \n );\n}\n\nexport default TableDataCustom;\n","import { useRef } from 'react';\nimport type { ReactNode, PointerEvent } from 'react';\n\ntype Props = {\n title?: string;\n children: ReactNode;\n onStartDrag?: (e: PointerEvent) => void;\n onStartResize?: (e: PointerEvent) => void; // legacy: header square\n onStartResizeEast?: (e: PointerEvent) => void;\n onStartResizeSouth?: (e: PointerEvent) => void;\n onStartResizeSouthEast?: (e: PointerEvent) => void;\n draggable?: boolean;\n resizable?: boolean;\n onRemove?: () => void;\n onDuplicate?: () => void;\n};\n\nexport default function WidgetContainer({\n title,\n children,\n onStartDrag,\n onStartResize,\n onStartResizeEast,\n onStartResizeSouth,\n onStartResizeSouthEast,\n draggable = true,\n resizable = true,\n onRemove,\n onDuplicate,\n}: Props): JSX.Element {\n const headerRef = useRef(null);\n\n return (\n
    \n {\n // Only attach interactions if enabled\n if (e.shiftKey && resizable && onStartResize) return onStartResize(e);\n if (draggable) onStartDrag?.(e);\n }}\n >\n {title}\n
    \n {typeof onDuplicate === 'function' ? (\n e.stopPropagation()}\n aria-label=\"Duplicate widget\"\n title=\"Duplicate\"\n >\n ⧉\n \n ) : null}\n {typeof onRemove === 'function' ? (\n e.stopPropagation()}\n aria-label=\"Remove widget\"\n title=\"Remove\"\n >\n ×\n \n ) : null}\n {resizable ? (\n \n ) : null}\n
    \n
    \n
    {children}
    \n {resizable ? (\n <>\n {/* East (right) edge handle */}\n {\n e.stopPropagation();\n onStartResizeEast?.(e);\n }}\n aria-label=\"Resize east\"\n />\n {/* South (bottom) edge handle */}\n {\n e.stopPropagation();\n onStartResizeSouth?.(e);\n }}\n aria-label=\"Resize south\"\n />\n {/* South-East corner handle */}\n {\n e.stopPropagation();\n onStartResizeSouthEast?.(e);\n }}\n aria-label=\"Resize south-east\"\n />\n \n ) : null}\n
    \n );\n}\n","import type { WidgetPosition } from '../../../models/DashboardWidget';\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function roundToCell(px: number, cell: number): number {\n return Math.round(px / cell);\n}\n\nexport function positionToStyle(pos: WidgetPosition): {\n gridColumnStart: number;\n gridColumnEnd: number;\n gridRowStart: number;\n gridRowEnd: number;\n} {\n return {\n gridColumnStart: pos.x + 1,\n gridColumnEnd: pos.x + 1 + pos.w,\n gridRowStart: pos.y + 1,\n gridRowEnd: pos.y + 1 + pos.h,\n };\n}\n\nexport function intersects(a: WidgetPosition, b: WidgetPosition): boolean {\n const ax2 = a.x + a.w;\n const ay2 = a.y + a.h;\n const bx2 = b.x + b.w;\n const by2 = b.y + b.h;\n // no overlap if one rectangle is completely to one side of the other\n const noOverlap = ax2 <= b.x || bx2 <= a.x || ay2 <= b.y || by2 <= a.y;\n return !noOverlap;\n}\n","import type { ChartAdapter, ChartKind } from '../../../models/DashboardWidget';\n\n// Minimal default chart adapter using plain SVG.\nexport const DefaultChartAdapter: ChartAdapter = {\n render(kind: ChartKind, props: Record): JSX.Element {\n switch (kind) {\n case 'bar':\n return renderBar(props);\n case 'line':\n return renderLine(props);\n case 'pie':\n return renderPie(props);\n default:\n return
    Unknown chart kind
    ;\n }\n },\n};\n\nfunction coerceNumbers(value: unknown): number[] {\n if (Array.isArray(value)) {\n return value\n .map((v) => (typeof v === 'number' ? v : Number(v)))\n .filter((v) => !Number.isNaN(v));\n }\n return [];\n}\n\nfunction renderBar(props: Record): JSX.Element {\n const data = coerceNumbers(props.data);\n const width = (typeof props.width === 'number' ? props.width : 300) as number;\n const height = (typeof props.height === 'number' ? props.height : 120) as number;\n const padding = 16;\n const max = Math.max(1, ...data);\n const barWidth = (width - padding * 2) / Math.max(1, data.length);\n const color = typeof props.color === 'string' ? (props.color as string) : '#4f46e5';\n\n return (\n \n {data.map((v, i) => {\n const h = ((height - padding * 2) * v) / max;\n const x = padding + i * barWidth + barWidth * 0.1;\n const y = height - padding - h;\n return ;\n })}\n \n );\n}\n\nfunction renderLine(props: Record): JSX.Element {\n const data = coerceNumbers(props.data);\n const width = (typeof props.width === 'number' ? props.width : 300) as number;\n const height = (typeof props.height === 'number' ? props.height : 120) as number;\n const padding = 16;\n const max = Math.max(1, ...data);\n const color = typeof props.color === 'string' ? (props.color as string) : '#16a34a';\n const points = data.map((v, i) => {\n const x = padding + i * ((width - padding * 2) / Math.max(1, data.length - 1));\n const y = height - padding - ((height - padding * 2) * v) / max;\n return `${x},${y}`;\n });\n\n return (\n \n \n \n );\n}\n\nfunction renderPie(props: Record): JSX.Element {\n const data = coerceNumbers(props.data);\n const size = (typeof props.size === 'number' ? props.size : 120) as number;\n const radius = size / 2;\n const total = data.reduce((acc, v) => acc + v, 0) || 1;\n const colors = Array.isArray(props.colors)\n ? (props.colors as string[])\n : ['#f97316', '#22c55e', '#3b82f6', '#e11d48'];\n\n let startAngle = 0;\n const slices = data.map((v, i) => {\n const angle = (v / total) * Math.PI * 2;\n const x1 = radius + radius * Math.cos(startAngle);\n const y1 = radius + radius * Math.sin(startAngle);\n const x2 = radius + radius * Math.cos(startAngle + angle);\n const y2 = radius + radius * Math.sin(startAngle + angle);\n const largeArc = angle > Math.PI ? 1 : 0;\n const path = `M ${radius},${radius} L ${x1},${y1} A ${radius},${radius} 0 ${largeArc} 1 ${x2},${y2} z`;\n startAngle += angle;\n return ;\n });\n\n return (\n \n {slices}\n \n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport type { PointerEvent } from 'react';\nimport type {\n BaseWidgetConfig,\n DashboardLayout,\n GridConfig,\n WidgetId,\n WidgetPosition,\n ChartAdapter,\n ChartKind,\n} from '../../../models/DashboardWidget';\nimport WidgetContainer from './WidgetContainer';\nimport { positionToStyle, clamp, roundToCell, intersects } from './layoutUtils';\nimport { DefaultChartAdapter } from './ChartAdapters';\n\ntype Props = {\n grid: GridConfig;\n widgets: DashboardLayout;\n onLayoutChange?: (next: DashboardLayout) => void;\n renderWidget?: (w: BaseWidgetConfig) => JSX.Element; // host can fully render a custom widget\n chartAdapter?: ChartAdapter; // host can render charts using its preferred library\n enableDrag?: boolean; // allow moving widgets\n enableResize?: boolean; // allow resizing widgets\n showActions?: boolean; // show default remove/duplicate actions\n persistKey?: string; // optional localStorage key to persist layout directly\n};\n\ntype DragState = {\n id: WidgetId;\n startX: number; // px\n startY: number; // px\n origPos: WidgetPosition;\n mode: 'move' | 'resize';\n edge?: 'e' | 's' | 'se' | 'w' | 'n' | 'sw' | 'ne' | 'nw';\n};\n\nexport default function DashboardGrid({\n grid,\n widgets,\n onLayoutChange,\n renderWidget,\n chartAdapter,\n enableDrag = true,\n enableResize = true,\n showActions = true,\n persistKey,\n}: Props): JSX.Element {\n const containerRef = useRef(null);\n const [layout, setLayout] = useState(widgets);\n const [drag, setDrag] = useState(null);\n\n const latestLayoutRef = useRef(widgets);\n const hydratedFromStorageRef = useRef(false);\n // Hydrate from localStorage on mount if persistKey is provided (host fallback)\n useLayoutEffect(() => {\n if (!persistKey || typeof window === 'undefined') return;\n try {\n const raw = window.localStorage.getItem(persistKey);\n if (raw) {\n // If the persisted layout differs from incoming widgets, prefer persisted\n const incoming = JSON.stringify(widgets);\n if (raw !== incoming) {\n const saved = JSON.parse(raw) as DashboardLayout;\n if (Array.isArray(saved)) {\n hydratedFromStorageRef.current = true;\n latestLayoutRef.current = saved;\n setLayout(saved);\n onLayoutChange?.(saved);\n }\n }\n }\n } catch {\n // ignore JSON/storage errors\n }\n // run once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n function commitLayout(next: DashboardLayout): void {\n setLayout(next);\n onLayoutChange?.(next);\n latestLayoutRef.current = next;\n if (persistKey && typeof window !== 'undefined') {\n try {\n window.localStorage.setItem(persistKey, JSON.stringify(next));\n } catch {\n // ignore storage errors\n }\n }\n }\n\n // Keep internal layout in sync with incoming widgets prop (for persistence/restores)\n // Use layout effect to apply before paint and avoid any visual jump\n useLayoutEffect(() => {\n if (hydratedFromStorageRef.current) {\n // Skip one cycle to avoid overriding persisted layout\n hydratedFromStorageRef.current = false;\n return;\n }\n latestLayoutRef.current = widgets;\n setLayout(widgets);\n }, [widgets]);\n\n function removeWidget(id: WidgetId): void {\n const next = layout.filter((w) => w.id !== id);\n commitLayout(next);\n }\n\n function duplicateWidget(id: WidgetId): void {\n const idx = findById(id);\n if (idx === -1) return;\n const src = layout[idx];\n // new id\n let copyIndex = 2;\n let newId: WidgetId = `${src.id}-copy`;\n while (layout.some((w) => w.id === newId)) {\n newId = `${src.id}-copy-${copyIndex++}`;\n }\n // Attempt to place to the right, else below, else scan\n const rectPos = { ...src.position };\n let candidate = { ...rectPos, x: Math.min(rectPos.x + rectPos.w, grid.cols - rectPos.w) };\n if (layout.some((w, i) => i !== idx && intersects(candidate, w.position))) {\n candidate = { ...rectPos, y: rectPos.y + rectPos.h };\n }\n // If still collides, scan rows to find first free spot\n const isFree = (pos: WidgetPosition): boolean =>\n !layout.some((w) => intersects(pos, w.position));\n if (!isFree(candidate)) {\n let found = false;\n for (let y = 0; y < 100 && !found; y++) {\n for (let x = 0; x <= grid.cols - rectPos.w && !found; x++) {\n const pos = { x, y, w: rectPos.w, h: rectPos.h };\n if (isFree(pos)) {\n candidate = pos;\n found = true;\n }\n }\n }\n }\n const copy: BaseWidgetConfig = { ...src, id: newId, position: candidate } as BaseWidgetConfig;\n const next = [...layout, copy];\n commitLayout(next);\n }\n\n function findById(id: WidgetId): number {\n return layout.findIndex((w) => w.id === id);\n }\n\n function startDrag(id: WidgetId, mode: 'move' | 'resize', edge?: DragState['edge']) {\n return (e: PointerEvent): void => {\n // Respect feature toggles\n if (mode === 'move' && !enableDrag) return;\n if (mode === 'resize' && !enableResize) return;\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n const idx = findById(id);\n if (idx === -1) return;\n const pos = layout[idx].position;\n // Capture pointer to the grid container so move/up handlers fire consistently\n containerRef.current?.setPointerCapture(e.pointerId);\n setDrag({\n id,\n startX: e.clientX - rect.left,\n startY: e.clientY - rect.top,\n origPos: { ...pos },\n mode,\n edge,\n });\n };\n }\n\n function onPointerMove(e: PointerEvent): void {\n if (!drag) return;\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const dx = x - drag.startX;\n const dy = y - drag.startY;\n\n const colWidth = (rect.width - (grid.cols - 1) * grid.gap) / grid.cols;\n const deltaCols = roundToCell(dx, colWidth);\n const deltaRows = roundToCell(dy, grid.rowHeight);\n\n const idx = findById(drag.id);\n if (idx === -1) return;\n\n const current = layout[idx];\n const nextPos: WidgetPosition = { ...drag.origPos };\n if (drag.mode === 'move') {\n nextPos.x = clamp(drag.origPos.x + deltaCols, 0, grid.cols - drag.origPos.w);\n nextPos.y = Math.max(0, drag.origPos.y + deltaRows);\n } else {\n // directional resize\n const edge = drag.edge ?? 'se';\n if (edge.includes('e')) {\n nextPos.w = clamp(drag.origPos.w + deltaCols, 1, grid.cols - drag.origPos.x);\n }\n if (edge.includes('s')) {\n nextPos.h = Math.max(1, drag.origPos.h + deltaRows);\n }\n if (edge.includes('w')) {\n // moving west edge affects x and w\n const newX = clamp(drag.origPos.x + deltaCols, 0, drag.origPos.x + drag.origPos.w - 1);\n const deltaX = newX - drag.origPos.x;\n nextPos.x = newX;\n nextPos.w = Math.max(1, drag.origPos.w - deltaX);\n }\n if (edge.includes('n')) {\n // moving north edge affects y and h\n const newY = Math.max(0, drag.origPos.y + deltaRows);\n const deltaY = newY - drag.origPos.y;\n nextPos.y = newY;\n nextPos.h = Math.max(1, drag.origPos.h - deltaY);\n }\n }\n\n // prevent overlap: simple check, if collision then skip update\n const collides = layout.some((w, i) => i !== idx && intersects(nextPos, w.position));\n if (collides) return;\n\n const next = [...layout];\n next[idx] = { ...current, position: nextPos };\n // Track latest computed layout to persist exact final position on pointer up\n latestLayoutRef.current = next;\n setLayout(next);\n }\n\n function onPointerUp(e: PointerEvent): void {\n if (!drag) return;\n containerRef.current?.releasePointerCapture(e.pointerId);\n commitLayout(latestLayoutRef.current);\n setDrag(null);\n }\n\n return (\n \n {layout.map((w) => (\n
    \n removeWidget(w.id) : undefined}\n onDuplicate={showActions ? () => duplicateWidget(w.id) : undefined}\n >\n {renderWidget ? (\n renderWidget(w)\n ) : (\n \n )}\n \n
    \n ))}\n
    \n );\n}\n\nfunction DefaultWidgetRenderer({\n widget,\n chartAdapter,\n}: {\n widget: BaseWidgetConfig;\n chartAdapter?: ChartAdapter;\n}): JSX.Element {\n const { type, props } = widget;\n switch (type) {\n case 'card':\n return (\n
    \n {String(props?.content ?? 'Card')}\n
    \n );\n case 'stat':\n return (\n
    \n \n {String(props?.value ?? '0')}\n \n \n {String(props?.label ?? 'Stat')}\n \n
    \n );\n case 'progress': {\n const v = typeof props?.value === 'number' ? props.value : 0;\n return (\n
    \n
    \n
    \n
    \n
    {v}%
    \n
    \n );\n }\n case 'activity': {\n const items = Array.isArray(props?.items) ? (props!.items as unknown[]) : [];\n return (\n
      \n {items.length === 0 ? (\n
    • No activity
    • \n ) : null}\n {items.map((it, i) => (\n
    • {String(it)}
    • \n ))}\n
    \n );\n }\n case 'chart': {\n const kind = (props?.kind as ChartKind) ?? 'line';\n const adapter = chartAdapter ?? DefaultChartAdapter;\n return adapter.render(kind, props ?? {});\n }\n case 'custom':\n default:\n return (\n
    Provide a custom renderer.
    \n );\n }\n}\n","import { useState } from 'react';\n// Optional schema interface to avoid hard dependency on zod\nexport type ParseSchema = { parse: (input: T) => T };\n\n/**\n * Credentials payload for login.\n */\nexport type LoginCredentials = {\n username: string;\n password: string;\n};\n\n/**\n * Result returned by a login service.\n */\nexport type LoginResult = {\n user: TUser;\n token?: string;\n};\n\n/**\n * Options for `useLogin`.\n * Provide a `login` function to integrate with your auth backend, and an optional Zod schema for validation.\n */\nexport type UseLoginOptions = {\n login: (credentials: LoginCredentials) => Promise>;\n schema?: ParseSchema;\n};\n\nexport type UseLoginReturn = {\n values: LoginCredentials;\n update: (key: K, value: LoginCredentials[K]) => void;\n submit: () => Promise>;\n loading: boolean;\n error: string | null;\n result: LoginResult | null;\n};\n\n/**\n * A composable login hook: manages form state, validation, submit, and loading/errors.\n */\nexport function useLogin({\n login,\n schema,\n}: UseLoginOptions): UseLoginReturn {\n const [values, setValues] = useState({ username: '', password: '' });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [result, setResult] = useState | null>(null);\n\n function update(key: K, value: LoginCredentials[K]): void {\n setValues((v: LoginCredentials) => ({ ...v, [key]: value }));\n }\n\n async function submit(): Promise> {\n setError(null);\n setLoading(true);\n try {\n const input = schema ? schema.parse(values) : values;\n const res = await login(input);\n setResult(res);\n return res;\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Login failed';\n setError(message);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, result };\n}\n\nexport default useLogin;\n","import { useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\n/**\n * Generic registration payload.\n */\nexport type RegisterPayload = Record;\n\n/**\n * Options for `useRegister`.\n */\nexport type UseRegisterOptions = {\n register: (payload: RegisterPayload) => Promise;\n schema?: ZodSchema;\n};\n\nexport type UseRegisterReturn = {\n values: RegisterPayload;\n update: (key: K, value: unknown) => void;\n submit: () => Promise;\n loading: boolean;\n error: string | null;\n user: TUser | null;\n};\n\n/**\n * A composable registration hook: manages form state, validation, submit, and loading/errors.\n */\nexport function useRegister({\n register,\n schema,\n}: UseRegisterOptions): UseRegisterReturn {\n const [values, setValues] = useState({});\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [user, setUser] = useState(null);\n\n function update(key: K, value: unknown): void {\n setValues((v) => ({ ...v, [key]: value }));\n }\n\n async function submit(): Promise {\n setError(null);\n setLoading(true);\n try {\n const payload = schema ? schema.parse(values) : values;\n const res = await register(payload);\n setUser(res);\n return res;\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Registration failed';\n setError(message);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, user };\n}\n\nexport default useRegister;\n","import { useState } from 'react';\n// Optional schema interface to avoid hard dependency on zod\nexport type ParseSchema = { parse: (input: T) => T };\n\n/**\n * Password reset input: allow email or username.\n */\nexport type PasswordResetInput = {\n email?: string;\n username?: string;\n};\n\n/**\n * Options for `usePasswordReset`.\n */\nexport type UsePasswordResetOptions = {\n reset: (input: PasswordResetInput) => Promise;\n schema?: ParseSchema;\n};\n\nexport type UsePasswordResetReturn = {\n values: PasswordResetInput;\n update: (key: K, value: PasswordResetInput[K]) => void;\n submit: () => Promise;\n loading: boolean;\n error: string | null;\n success: boolean;\n};\n\n/**\n * A composable password reset hook: manages form state, validation, submit, and loading/errors.\n */\nexport function usePasswordReset({\n reset,\n schema,\n}: UsePasswordResetOptions): UsePasswordResetReturn {\n const [values, setValues] = useState({ email: '' });\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [success, setSuccess] = useState(false);\n\n function update(key: K, value: PasswordResetInput[K]): void {\n setValues((v: PasswordResetInput) => ({ ...v, [key]: value }));\n }\n\n async function submit(): Promise {\n setError(null);\n setSuccess(false);\n setLoading(true);\n try {\n const input = schema ? schema.parse(values) : values;\n await reset(input);\n setSuccess(true);\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Password reset failed';\n setError(message);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n\n return { values, update, submit, loading, error, success };\n}\n\nexport default usePasswordReset;\n","import { useEffect, useRef } from 'react';\n\n/**\n * Manage ARIA live region announcements.\n * Returns a ref to attach to an element with `aria-live=\"polite\"` or `assertive`.\n * Use `announce()` to set text content.\n */\nexport type LiveRegionReturn = {\n ref: React.MutableRefObject;\n announce: (message: string) => void;\n};\n\nexport function useLiveRegion(): LiveRegionReturn {\n const ref = useRef(null);\n function announce(message: string): void {\n if (ref.current) {\n ref.current.textContent = message;\n }\n }\n return { ref, announce };\n}\n\n/**\n * Trap focus within a container element (e.g., modal) while `active`.\n * Adds keydown handlers to cycle focus.\n */\nexport type FocusTrapReturn = { ref: React.MutableRefObject };\n\nexport function useFocusTrap(active: boolean): FocusTrapReturn {\n const ref = useRef(null);\n\n useEffect(() => {\n if (!active) return;\n const current = ref.current;\n if (!current) return;\n const el: HTMLElement = current;\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') return;\n const focusable = (\n Array.from(\n el.querySelectorAll(\n 'a[href], button, textarea, input, select, [tabindex]:not([tabindex=\"-1\"])',\n ),\n ) as HTMLElement[]\n ).filter((node: HTMLElement) => !node.hasAttribute('disabled'));\n if (focusable.length === 0) return;\n const first: HTMLElement = focusable[0] as HTMLElement;\n const last: HTMLElement = focusable[focusable.length - 1] as HTMLElement;\n const current = document.activeElement as HTMLElement | null;\n\n if (e.shiftKey) {\n if (!current || current === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (!current || current === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n\n el.addEventListener('keydown', onKeyDown);\n return () => {\n el.removeEventListener('keydown', onKeyDown);\n };\n }, [active]);\n\n return { ref };\n}\n","import { useEffect } from 'react';\n\nexport type RovingConfig = {\n /** CSS selector for focusable items inside the container */\n selector: string;\n /** Optional: initial index to focus when mounted */\n initialIndex?: number;\n};\n\n/**\n * Roving tabindex keyboard navigation for lists/menus.\n * Attach to a container element; items should be focusable via `tabindex`.\n */\nexport function useKeyboardNavigation(\n container: HTMLElement | null,\n { selector, initialIndex = 0 }: RovingConfig,\n): void {\n useEffect(() => {\n if (!container) return;\n const items = Array.from(container.querySelectorAll(selector));\n if (items.length === 0) return;\n\n // Initialize tabindex\n items.forEach((el, i) => el.setAttribute('tabindex', i === initialIndex ? '0' : '-1'));\n\n function onKeyDown(e: KeyboardEvent): void {\n const currentIndex = items.findIndex((el) => el === document.activeElement);\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n const next = items[(currentIndex + 1 + items.length) % items.length];\n items.forEach((el) => el.setAttribute('tabindex', '-1'));\n next.setAttribute('tabindex', '0');\n next.focus();\n e.preventDefault();\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n const prev = items[(currentIndex - 1 + items.length) % items.length];\n items.forEach((el) => el.setAttribute('tabindex', '-1'));\n prev.setAttribute('tabindex', '0');\n prev.focus();\n e.preventDefault();\n }\n }\n\n container.addEventListener('keydown', onKeyDown);\n return () => container.removeEventListener('keydown', onKeyDown);\n }, [container, selector, initialIndex]);\n}\n"]} \ No newline at end of file diff --git a/src/components/Dashboard/Widgets/DashboardGrid.tsx b/src/components/Dashboard/Widgets/DashboardGrid.tsx index 1ad666d..9b24e25 100644 --- a/src/components/Dashboard/Widgets/DashboardGrid.tsx +++ b/src/components/Dashboard/Widgets/DashboardGrid.tsx @@ -1,4 +1,4 @@ -import { useRef, useState } from 'react'; +import { useEffect, useLayoutEffect, useRef, useState } from 'react'; import type { PointerEvent } from 'react'; import type { BaseWidgetConfig, @@ -22,6 +22,7 @@ type Props = { enableDrag?: boolean; // allow moving widgets enableResize?: boolean; // allow resizing widgets showActions?: boolean; // show default remove/duplicate actions + persistKey?: string; // optional localStorage key to persist layout directly }; type DragState = { @@ -42,16 +43,63 @@ export default function DashboardGrid({ enableDrag = true, enableResize = true, showActions = true, + persistKey, }: Props): JSX.Element { const containerRef = useRef(null); const [layout, setLayout] = useState(widgets); const [drag, setDrag] = useState(null); + const latestLayoutRef = useRef(widgets); + const hydratedFromStorageRef = useRef(false); + // Hydrate from localStorage on mount if persistKey is provided (host fallback) + useLayoutEffect(() => { + if (!persistKey || typeof window === 'undefined') return; + try { + const raw = window.localStorage.getItem(persistKey); + if (raw) { + // If the persisted layout differs from incoming widgets, prefer persisted + const incoming = JSON.stringify(widgets); + if (raw !== incoming) { + const saved = JSON.parse(raw) as DashboardLayout; + if (Array.isArray(saved)) { + hydratedFromStorageRef.current = true; + latestLayoutRef.current = saved; + setLayout(saved); + onLayoutChange?.(saved); + } + } + } + } catch { + // ignore JSON/storage errors + } + // run once on mount + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); function commitLayout(next: DashboardLayout): void { setLayout(next); onLayoutChange?.(next); + latestLayoutRef.current = next; + if (persistKey && typeof window !== 'undefined') { + try { + window.localStorage.setItem(persistKey, JSON.stringify(next)); + } catch { + // ignore storage errors + } + } } + // Keep internal layout in sync with incoming widgets prop (for persistence/restores) + // Use layout effect to apply before paint and avoid any visual jump + useLayoutEffect(() => { + if (hydratedFromStorageRef.current) { + // Skip one cycle to avoid overriding persisted layout + hydratedFromStorageRef.current = false; + return; + } + latestLayoutRef.current = widgets; + setLayout(widgets); + }, [widgets]); + function removeWidget(id: WidgetId): void { const next = layout.filter((w) => w.id !== id); commitLayout(next); @@ -172,13 +220,15 @@ export default function DashboardGrid({ const next = [...layout]; next[idx] = { ...current, position: nextPos }; + // Track latest computed layout to persist exact final position on pointer up + latestLayoutRef.current = next; setLayout(next); } function onPointerUp(e: PointerEvent): void { if (!drag) return; containerRef.current?.releasePointerCapture(e.pointerId); - commitLayout(layout); + commitLayout(latestLayoutRef.current); setDrag(null); } diff --git a/src/pages/Dashboard/Home.tsx b/src/pages/Dashboard/Home.tsx index 1c49783..2bcc601 100644 --- a/src/pages/Dashboard/Home.tsx +++ b/src/pages/Dashboard/Home.tsx @@ -1,4 +1,5 @@ import { useState } from 'react'; +import useLocalStorage from '../../hooks/useLocalStorage'; import type { DashboardLayout, GridConfig } from '../../models/DashboardWidget'; import DashboardGrid from '../../components/Dashboard/Widgets/DashboardGrid'; @@ -42,7 +43,8 @@ const initialLayout: DashboardLayout = [ ]; const Home = (): JSX.Element => { - const [layout, setLayout] = useState(initialLayout); + // Persist layout to localStorage so positions/sizes and actions survive reloads + const [layout, setLayout] = useLocalStorage('dashboard-layout', initialLayout); return (

    Home Page Dashboard

    @@ -53,6 +55,7 @@ const Home = (): JSX.Element => { enableDrag={true} enableResize={true} showActions={true} + persistKey={'dashboard-layout'} />
    );