dgz-ui-shared 1.2.17 → 1.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("react/jsx-runtime"),i=require("dgz-ui/button"),S=require("dgz-ui/form"),h=require("dgz-ui/popover"),g=require("./lodash-BjH0kD7j.cjs.js"),x=require("lucide-react"),a=require("react"),E=require("react-i18next"),D=require("./useFilter-CsOF1_hM.cjs.js"),$=require("./MyInput-C9PNyYby.cjs.js"),A=require("./MySelect-Ovb1pK5c.cjs.js"),C=require("./index-ClQFzqcq.cjs.js"),O=require("dgz-ui/utils"),N=require("./Keyboard-kyPAAQWP.cjs.js"),W=a.memo(function({filters:n,params:c,onFilter:r,onChange:o,onCancel:y,triggerProps:l,contentProps:u,title:t,resetText:k,applyText:I,...B}){const{t:p}=E.useTranslation(),[M,P]=a.useState(!1),[R,d]=a.useState(!1),{form:b}=D.useFilter({params:c}),{watch:T,handleSubmit:z,control:v,reset:q}=b;a.useEffect(()=>{let s=!1;n.map(w=>{const m=g.lodashExports.get(c,`${w.name}`);(Array.isArray(m)?m.length>0:m)&&(s=!0),P(s)})},[n,c]);const f=T();a.useEffect(()=>{o==null||o(f)},[f,o]);const F=a.useCallback((s={})=>{r==null||r(s),d(!1)},[r]),K=a.useCallback(()=>{q(),r&&r({...Object.fromEntries(n.map(s=>[s.name,void 0]))}),d(!1)},[r,q,n]);return e.jsxs(h.Popover,{open:R,onOpenChange:d,children:[e.jsx(h.PopoverTrigger,{...l,children:e.jsx(i.Button,{asChild:!0,size:"sm",variant:"secondary",className:"ml-auto px-3",...B,children:e.jsxs("div",{className:"flex items-center",children:[M?e.jsx(x.ListFilterPlusIcon,{className:"size-5"}):e.jsx(x.ListFilterIcon,{className:"size-5"})," ",e.jsx("span",{className:"hidden lg:inline!",children:t||p("Filter")}),e.jsx(x.ChevronDown,{})]})})}),e.jsx(h.PopoverContent,{side:"bottom",align:"end",...u,children:e.jsx(S.Form,{...b,children:e.jsxs("form",{onSubmit:z(F),className:"space-y-4",children:[e.jsx("div",{className:"h-full shrink space-y-6 p-1",children:n.map(s=>s.options?e.jsx(A.MySelect,{control:v,name:s.name,isSearchable:!!s.isSearchable,placeholder:s.placeholder,isMulti:s.isMulti,options:s.options,label:s.label},s.name):e.jsx($.MyInput,{control:v,placeholder:s.placeholder,name:s.name,label:s.label},s.name))}),e.jsxs("div",{className:"flex shrink-0 justify-end gap-2",children:[e.jsx(i.Button,{variant:"destructive",type:"reset",size:"sm",onClick:K,children:k||p("Reset")}),e.jsx(i.Button,{type:"submit",size:"sm",children:I||p("Apply")})]})]})})})]})}),L=({placeholder:j,onSearchChange:n,className:c,inputProps:r,...o})=>{const{t:y}=E.useTranslation(),[l,u]=a.useState("");return e.jsxs("div",{...o,className:O.cn("relative w-full",c),children:[e.jsx(S.Input,{...r,placeholder:j||y("Type text and press Enter"),onInput:t=>u(g.lodashExports.get(t,"target.value","")),onKeyUp:t=>{t.key===N.Keyboard.ENTER&&(n(l||void 0),t.stopPropagation(),t.preventDefault())},onKeyDown:t=>{t.key===N.Keyboard.ENTER&&(t.stopPropagation(),t.preventDefault())}}),e.jsx(i.Button,{type:"button",variant:"ghost",className:"text-foreground absolute top-0 right-0 cursor-pointer rounded-md bg-transparent!",onClick:()=>n(l),children:e.jsx(C.pv,{})})]})};exports.FilterWrapper=W;exports.Search=L;
2
+ //# sourceMappingURL=Search-BDXQ3bSp.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Search-BDXQ3bSp.cjs.js","sources":["../../src/components/filters/FilterWrapper.tsx","../../src/components/filters/Search.tsx"],"sourcesContent":["import { Button, type ButtonProps } from 'dgz-ui/button';\nimport { Form, type Option } from 'dgz-ui/form';\nimport {\n Popover,\n type PopoverContainerProps,\n PopoverContent,\n PopoverTrigger,\n} from 'dgz-ui/popover';\nimport { get } from 'lodash';\nimport { ChevronDown, ListFilterIcon, ListFilterPlusIcon } from 'lucide-react';\nimport { memo, type ReactNode, useCallback, useEffect, useState } from 'react';\nimport type { FieldValues } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useFilter } from '../../hooks';\nimport { MyInput, MySelect } from '../form';\n\n/**\n * Interface representing a filter configuration.\n */\nexport interface FilterInterface {\n /** Label for the filter field. */\n label?: ReactNode;\n /** Placeholder text for the input/select. */\n placeholder?: string;\n /** Default value for the filter. */\n value?: string | string[];\n /** Name of the filter field (used as key). */\n name: string;\n /** Whether the filter supports multiple values (for select inputs). */\n isMulti?: boolean;\n /** Whether the filter supports searchable inputs (for select inputs). */\n isSearchable?: boolean;\n /** Options for select inputs. */\n options?: Option[];\n}\n\n/**\n * Props for the FilterWrapper component.\n */\nexport interface FilterWrapperProps\n extends Omit<ButtonProps, 'title'>, PopoverContainerProps {\n /** Array of filter definitions to render. */\n filters: FilterInterface[];\n /** Current active parameters/filters. */\n params?: Record<string, unknown>;\n /** Callback fired when filters are applied. */\n onFilter?: (filters: Record<string, unknown>) => void;\n /** Callback fired when the filter popover is closed/cancelled. */\n onCancel?: () => void;\n /** Callback fired when filter form values change. */\n onChange?: (filters: FieldValues) => void;\n /** Title for the filter button. */\n title?: ReactNode;\n /** Text for the reset button. */\n resetText?: ReactNode;\n /** Text for the apply button. */\n applyText?: ReactNode;\n}\n\n/**\n * FilterWrapper shows a popover with a dynamic list of field filters and emits selected filter values.\n *\n * @param props.filters - Array of filter definitions to render.\n * @param props.params - Current params used to detect active filters.\n * @param props.onFilter - Callback fired when user applies filters.\n * @param props.onCancel - Callback fired on cancel.\n * @param props.onChange - Callback fired whenever filter form values change.\n */\nexport const FilterWrapper = memo(function FilterWrapper({\n filters,\n params,\n onFilter,\n onChange,\n onCancel,\n triggerProps,\n contentProps,\n title,\n resetText,\n applyText,\n ...btnProps\n}: FilterWrapperProps) {\n const { t } = useTranslation();\n const [isFiltered, setIsFiltered] = useState(false);\n const [open, setOpen] = useState(false);\n const { form } = useFilter({ params });\n\n const { watch, handleSubmit, control, reset } = form;\n\n useEffect(() => {\n let hasFilter = false;\n filters.map((filter) => {\n const value = get(params, `${filter.name}`);\n if (Array.isArray(value) ? value.length > 0 : Boolean(value)) {\n hasFilter = true;\n }\n\n setIsFiltered(hasFilter);\n });\n }, [filters, params]);\n\n const values = watch();\n\n useEffect(() => {\n onChange?.(values);\n }, [values, onChange]);\n\n const handleFilter = useCallback(\n (data = {}) => {\n onFilter?.(data);\n setOpen(false);\n },\n [onFilter]\n );\n\n const handleReset = useCallback(() => {\n reset();\n if (onFilter) {\n onFilter({\n ...Object.fromEntries(\n filters.map((filter) => [filter.name, undefined])\n ),\n });\n }\n setOpen(false);\n }, [onFilter, reset, filters]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger {...triggerProps}>\n <Button\n asChild\n size={'sm'}\n variant=\"secondary\"\n className={'ml-auto px-3'}\n {...btnProps}\n >\n <div className={'flex items-center'}>\n {isFiltered ? (\n <ListFilterPlusIcon className={'size-5'} />\n ) : (\n <ListFilterIcon className={'size-5'} />\n )}{' '}\n <span className={'hidden lg:inline!'}>{title || t('Filter')}</span>\n <ChevronDown />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent side={'bottom'} align={'end'} {...contentProps}>\n <Form {...form}>\n <form onSubmit={handleSubmit(handleFilter)} className={'space-y-4'}>\n <div className={'h-full shrink space-y-6 p-1'}>\n {filters.map((filter) =>\n filter.options ? (\n <MySelect\n key={filter.name}\n control={control}\n name={filter.name}\n isSearchable={Boolean(filter.isSearchable)}\n placeholder={filter.placeholder}\n isMulti={filter.isMulti}\n options={filter.options}\n label={filter.label}\n />\n ) : (\n <MyInput\n key={filter.name}\n control={control}\n placeholder={filter.placeholder}\n name={filter.name}\n label={filter.label}\n />\n )\n )}\n </div>\n <div className={'flex shrink-0 justify-end gap-2'}>\n <Button\n variant={'destructive'}\n type=\"reset\"\n size={'sm'}\n onClick={handleReset}\n >\n {resetText || t('Reset')}\n </Button>\n <Button type=\"submit\" size={'sm'}>\n {applyText || t('Apply')}\n </Button>\n </div>\n </form>\n </Form>\n </PopoverContent>\n </Popover>\n );\n});\n","import { RiSearchLine } from '@remixicon/react';\nimport { Button } from 'dgz-ui/button';\nimport type { CardProps } from 'dgz-ui/card';\nimport { Input, type InputProps } from 'dgz-ui/form';\nimport { cn } from 'dgz-ui/utils';\nimport { get } from 'lodash';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Keyboard } from '../../enums';\n\n/**\n * Props for the Search component.\n */\nexport type SearchProps = Omit<CardProps, 'title'> & {\n /** Custom placeholder text for the input. */\n placeholder?: string;\n /** Callback fired when the search is triggered. */\n onSearchChange: (search?: string) => void;\n inputProps?: InputProps;\n};\n\n/**\n * Search input with a submit button that triggers a search action.\n *\n * This component renders a search input field and a search button. The search\n * is triggered when the user presses Enter or clicks the button. The search\n * value is then passed to the `onSearchChange` callback.\n *\n * @param {SearchProps} props - The props for the component.\n * @param {string} [props.placeholder] - Optional placeholder text for the input field.\n * @param {Function} props.onSearchChange - Callback function that is called when a search is performed.\n * @param {string} [props.className] - Optional class name for the component.\n * @param {InputProps} [props.inputProps] - Optional props to pass to the underlying Input component.\n */\nexport const Search = ({\n placeholder,\n onSearchChange,\n className,\n inputProps,\n ...props\n}: SearchProps) => {\n const { t } = useTranslation();\n const [search, setSearch] = useState('');\n\n return (\n <div {...props} className={cn('relative w-full', className)}>\n <Input\n {...inputProps}\n placeholder={placeholder || t('Type text and press Enter')}\n onInput={(evt) => setSearch(get(evt, 'target.value', ''))}\n onKeyUp={(evt) => {\n if (evt.key === Keyboard.ENTER) {\n onSearchChange(search || undefined);\n evt.stopPropagation();\n evt.preventDefault();\n }\n }}\n onKeyDown={(event) => {\n if (event.key === Keyboard.ENTER) {\n event.stopPropagation();\n event.preventDefault();\n }\n }}\n />\n <Button\n type={'button'}\n variant={'ghost'}\n className={\n 'text-foreground absolute top-0 right-0 cursor-pointer rounded-md bg-transparent!'\n }\n onClick={() => onSearchChange(search)}\n >\n <RiSearchLine />\n </Button>\n </div>\n );\n};\n"],"names":["FilterWrapper","memo","filters","params","onFilter","onChange","onCancel","triggerProps","contentProps","title","resetText","applyText","btnProps","t","useTranslation","isFiltered","setIsFiltered","useState","open","setOpen","form","useFilter","watch","handleSubmit","control","reset","useEffect","hasFilter","filter","value","get","values","handleFilter","useCallback","data","handleReset","jsxs","Popover","jsx","PopoverTrigger","Button","ListFilterPlusIcon","ListFilterIcon","ChevronDown","PopoverContent","Form","MySelect","MyInput","Search","placeholder","onSearchChange","className","inputProps","props","search","setSearch","cn","Input","evt","Keyboard","event","RiSearchLine"],"mappings":"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"}
@@ -13,43 +13,42 @@ import { p as V } from "./index-E1NtSoNr.es.js";
13
13
  import { cn as X } from "dgz-ui/utils";
14
14
  import { K as S } from "./Keyboard-CJVAJWdO.es.js";
15
15
  const pe = G(function({
16
- filters: a,
17
- params: r,
18
- onFilter: t,
19
- onChange: n,
16
+ filters: t,
17
+ params: n,
18
+ onFilter: o,
19
+ onChange: r,
20
20
  onCancel: y,
21
21
  triggerProps: i,
22
22
  contentProps: m,
23
- title: o,
23
+ title: a,
24
24
  resetText: M,
25
25
  applyText: P,
26
26
  ...z
27
27
  }) {
28
- const { t: p } = I(), [T, j] = h(!1), [w, d] = h(!1), { form: v } = H({ params: r }), { watch: D, handleSubmit: F, control: b, reset: N } = v;
28
+ const { t: p } = I(), [T, j] = h(!1), [w, d] = h(!1), { form: v } = H({ params: n }), { watch: D, handleSubmit: F, control: b, reset: N } = v;
29
29
  x(() => {
30
30
  let e = !1;
31
- a.map((A) => {
32
- const u = k.get(r, `${A.name}`);
31
+ t.map((A) => {
32
+ const u = k.get(n, `${A.name}`);
33
33
  (Array.isArray(u) ? u.length > 0 : u) && (e = !0), j(e);
34
34
  });
35
- }, [a, r]);
35
+ }, [t, n]);
36
36
  const g = D();
37
37
  x(() => {
38
- n == null || n(g);
39
- }, [g, n]);
38
+ r == null || r(g);
39
+ }, [g, r]);
40
40
  const K = E(
41
41
  (e = {}) => {
42
- t == null || t(e), d(!1);
42
+ o == null || o(e), d(!1);
43
43
  },
44
- [t]
44
+ [o]
45
45
  ), R = E(() => {
46
- N(), t && r && t({
47
- ...r,
46
+ N(), o && o({
48
47
  ...Object.fromEntries(
49
- a.map((e) => [e.name, void 0])
48
+ t.map((e) => [e.name, void 0])
50
49
  )
51
50
  }), d(!1);
52
- }, [t, N, r, a]);
51
+ }, [o, N, t]);
53
52
  return /* @__PURE__ */ l(C, { open: w, onOpenChange: d, children: [
54
53
  /* @__PURE__ */ s(L, { ...i, children: /* @__PURE__ */ s(
55
54
  c,
@@ -62,13 +61,13 @@ const pe = G(function({
62
61
  children: /* @__PURE__ */ l("div", { className: "flex items-center", children: [
63
62
  T ? /* @__PURE__ */ s(U, { className: "size-5" }) : /* @__PURE__ */ s($, { className: "size-5" }),
64
63
  " ",
65
- /* @__PURE__ */ s("span", { className: "hidden lg:inline!", children: o || p("Filter") }),
64
+ /* @__PURE__ */ s("span", { className: "hidden lg:inline!", children: a || p("Filter") }),
66
65
  /* @__PURE__ */ s(q, {})
67
66
  ] })
68
67
  }
69
68
  ) }),
70
69
  /* @__PURE__ */ s(W, { side: "bottom", align: "end", ...m, children: /* @__PURE__ */ s(B, { ...v, children: /* @__PURE__ */ l("form", { onSubmit: F(K), className: "space-y-4", children: [
71
- /* @__PURE__ */ s("div", { className: "h-full shrink space-y-6 p-1", children: a.map(
70
+ /* @__PURE__ */ s("div", { className: "h-full shrink space-y-6 p-1", children: t.map(
72
71
  (e) => e.options ? /* @__PURE__ */ s(
73
72
  Q,
74
73
  {
@@ -109,24 +108,24 @@ const pe = G(function({
109
108
  ] });
110
109
  }), de = ({
111
110
  placeholder: f,
112
- onSearchChange: a,
113
- className: r,
114
- inputProps: t,
115
- ...n
111
+ onSearchChange: t,
112
+ className: n,
113
+ inputProps: o,
114
+ ...r
116
115
  }) => {
117
116
  const { t: y } = I(), [i, m] = h("");
118
- return /* @__PURE__ */ l("div", { ...n, className: X("relative w-full", r), children: [
117
+ return /* @__PURE__ */ l("div", { ...r, className: X("relative w-full", n), children: [
119
118
  /* @__PURE__ */ s(
120
119
  O,
121
120
  {
122
- ...t,
121
+ ...o,
123
122
  placeholder: f || y("Type text and press Enter"),
124
- onInput: (o) => m(k.get(o, "target.value", "")),
125
- onKeyUp: (o) => {
126
- o.key === S.ENTER && (a(i || void 0), o.stopPropagation(), o.preventDefault());
123
+ onInput: (a) => m(k.get(a, "target.value", "")),
124
+ onKeyUp: (a) => {
125
+ a.key === S.ENTER && (t(i || void 0), a.stopPropagation(), a.preventDefault());
127
126
  },
128
- onKeyDown: (o) => {
129
- o.key === S.ENTER && (o.stopPropagation(), o.preventDefault());
127
+ onKeyDown: (a) => {
128
+ a.key === S.ENTER && (a.stopPropagation(), a.preventDefault());
130
129
  }
131
130
  }
132
131
  ),
@@ -136,7 +135,7 @@ const pe = G(function({
136
135
  type: "button",
137
136
  variant: "ghost",
138
137
  className: "text-foreground absolute top-0 right-0 cursor-pointer rounded-md bg-transparent!",
139
- onClick: () => a(i),
138
+ onClick: () => t(i),
140
139
  children: /* @__PURE__ */ s(V, {})
141
140
  }
142
141
  )
@@ -146,4 +145,4 @@ export {
146
145
  pe as F,
147
146
  de as S
148
147
  };
149
- //# sourceMappingURL=Search-0PkBZIDP.es.js.map
148
+ //# sourceMappingURL=Search-I3lwE0J6.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Search-I3lwE0J6.es.js","sources":["../../src/components/filters/FilterWrapper.tsx","../../src/components/filters/Search.tsx"],"sourcesContent":["import { Button, type ButtonProps } from 'dgz-ui/button';\nimport { Form, type Option } from 'dgz-ui/form';\nimport {\n Popover,\n type PopoverContainerProps,\n PopoverContent,\n PopoverTrigger,\n} from 'dgz-ui/popover';\nimport { get } from 'lodash';\nimport { ChevronDown, ListFilterIcon, ListFilterPlusIcon } from 'lucide-react';\nimport { memo, type ReactNode, useCallback, useEffect, useState } from 'react';\nimport type { FieldValues } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useFilter } from '../../hooks';\nimport { MyInput, MySelect } from '../form';\n\n/**\n * Interface representing a filter configuration.\n */\nexport interface FilterInterface {\n /** Label for the filter field. */\n label?: ReactNode;\n /** Placeholder text for the input/select. */\n placeholder?: string;\n /** Default value for the filter. */\n value?: string | string[];\n /** Name of the filter field (used as key). */\n name: string;\n /** Whether the filter supports multiple values (for select inputs). */\n isMulti?: boolean;\n /** Whether the filter supports searchable inputs (for select inputs). */\n isSearchable?: boolean;\n /** Options for select inputs. */\n options?: Option[];\n}\n\n/**\n * Props for the FilterWrapper component.\n */\nexport interface FilterWrapperProps\n extends Omit<ButtonProps, 'title'>, PopoverContainerProps {\n /** Array of filter definitions to render. */\n filters: FilterInterface[];\n /** Current active parameters/filters. */\n params?: Record<string, unknown>;\n /** Callback fired when filters are applied. */\n onFilter?: (filters: Record<string, unknown>) => void;\n /** Callback fired when the filter popover is closed/cancelled. */\n onCancel?: () => void;\n /** Callback fired when filter form values change. */\n onChange?: (filters: FieldValues) => void;\n /** Title for the filter button. */\n title?: ReactNode;\n /** Text for the reset button. */\n resetText?: ReactNode;\n /** Text for the apply button. */\n applyText?: ReactNode;\n}\n\n/**\n * FilterWrapper shows a popover with a dynamic list of field filters and emits selected filter values.\n *\n * @param props.filters - Array of filter definitions to render.\n * @param props.params - Current params used to detect active filters.\n * @param props.onFilter - Callback fired when user applies filters.\n * @param props.onCancel - Callback fired on cancel.\n * @param props.onChange - Callback fired whenever filter form values change.\n */\nexport const FilterWrapper = memo(function FilterWrapper({\n filters,\n params,\n onFilter,\n onChange,\n onCancel,\n triggerProps,\n contentProps,\n title,\n resetText,\n applyText,\n ...btnProps\n}: FilterWrapperProps) {\n const { t } = useTranslation();\n const [isFiltered, setIsFiltered] = useState(false);\n const [open, setOpen] = useState(false);\n const { form } = useFilter({ params });\n\n const { watch, handleSubmit, control, reset } = form;\n\n useEffect(() => {\n let hasFilter = false;\n filters.map((filter) => {\n const value = get(params, `${filter.name}`);\n if (Array.isArray(value) ? value.length > 0 : Boolean(value)) {\n hasFilter = true;\n }\n\n setIsFiltered(hasFilter);\n });\n }, [filters, params]);\n\n const values = watch();\n\n useEffect(() => {\n onChange?.(values);\n }, [values, onChange]);\n\n const handleFilter = useCallback(\n (data = {}) => {\n onFilter?.(data);\n setOpen(false);\n },\n [onFilter]\n );\n\n const handleReset = useCallback(() => {\n reset();\n if (onFilter) {\n onFilter({\n ...Object.fromEntries(\n filters.map((filter) => [filter.name, undefined])\n ),\n });\n }\n setOpen(false);\n }, [onFilter, reset, filters]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger {...triggerProps}>\n <Button\n asChild\n size={'sm'}\n variant=\"secondary\"\n className={'ml-auto px-3'}\n {...btnProps}\n >\n <div className={'flex items-center'}>\n {isFiltered ? (\n <ListFilterPlusIcon className={'size-5'} />\n ) : (\n <ListFilterIcon className={'size-5'} />\n )}{' '}\n <span className={'hidden lg:inline!'}>{title || t('Filter')}</span>\n <ChevronDown />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent side={'bottom'} align={'end'} {...contentProps}>\n <Form {...form}>\n <form onSubmit={handleSubmit(handleFilter)} className={'space-y-4'}>\n <div className={'h-full shrink space-y-6 p-1'}>\n {filters.map((filter) =>\n filter.options ? (\n <MySelect\n key={filter.name}\n control={control}\n name={filter.name}\n isSearchable={Boolean(filter.isSearchable)}\n placeholder={filter.placeholder}\n isMulti={filter.isMulti}\n options={filter.options}\n label={filter.label}\n />\n ) : (\n <MyInput\n key={filter.name}\n control={control}\n placeholder={filter.placeholder}\n name={filter.name}\n label={filter.label}\n />\n )\n )}\n </div>\n <div className={'flex shrink-0 justify-end gap-2'}>\n <Button\n variant={'destructive'}\n type=\"reset\"\n size={'sm'}\n onClick={handleReset}\n >\n {resetText || t('Reset')}\n </Button>\n <Button type=\"submit\" size={'sm'}>\n {applyText || t('Apply')}\n </Button>\n </div>\n </form>\n </Form>\n </PopoverContent>\n </Popover>\n );\n});\n","import { RiSearchLine } from '@remixicon/react';\nimport { Button } from 'dgz-ui/button';\nimport type { CardProps } from 'dgz-ui/card';\nimport { Input, type InputProps } from 'dgz-ui/form';\nimport { cn } from 'dgz-ui/utils';\nimport { get } from 'lodash';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Keyboard } from '../../enums';\n\n/**\n * Props for the Search component.\n */\nexport type SearchProps = Omit<CardProps, 'title'> & {\n /** Custom placeholder text for the input. */\n placeholder?: string;\n /** Callback fired when the search is triggered. */\n onSearchChange: (search?: string) => void;\n inputProps?: InputProps;\n};\n\n/**\n * Search input with a submit button that triggers a search action.\n *\n * This component renders a search input field and a search button. The search\n * is triggered when the user presses Enter or clicks the button. The search\n * value is then passed to the `onSearchChange` callback.\n *\n * @param {SearchProps} props - The props for the component.\n * @param {string} [props.placeholder] - Optional placeholder text for the input field.\n * @param {Function} props.onSearchChange - Callback function that is called when a search is performed.\n * @param {string} [props.className] - Optional class name for the component.\n * @param {InputProps} [props.inputProps] - Optional props to pass to the underlying Input component.\n */\nexport const Search = ({\n placeholder,\n onSearchChange,\n className,\n inputProps,\n ...props\n}: SearchProps) => {\n const { t } = useTranslation();\n const [search, setSearch] = useState('');\n\n return (\n <div {...props} className={cn('relative w-full', className)}>\n <Input\n {...inputProps}\n placeholder={placeholder || t('Type text and press Enter')}\n onInput={(evt) => setSearch(get(evt, 'target.value', ''))}\n onKeyUp={(evt) => {\n if (evt.key === Keyboard.ENTER) {\n onSearchChange(search || undefined);\n evt.stopPropagation();\n evt.preventDefault();\n }\n }}\n onKeyDown={(event) => {\n if (event.key === Keyboard.ENTER) {\n event.stopPropagation();\n event.preventDefault();\n }\n }}\n />\n <Button\n type={'button'}\n variant={'ghost'}\n className={\n 'text-foreground absolute top-0 right-0 cursor-pointer rounded-md bg-transparent!'\n }\n onClick={() => onSearchChange(search)}\n >\n <RiSearchLine />\n </Button>\n </div>\n );\n};\n"],"names":["FilterWrapper","memo","filters","params","onFilter","onChange","onCancel","triggerProps","contentProps","title","resetText","applyText","btnProps","t","useTranslation","isFiltered","setIsFiltered","useState","open","setOpen","form","useFilter","watch","handleSubmit","control","reset","useEffect","hasFilter","filter","value","get","values","handleFilter","useCallback","data","handleReset","jsxs","Popover","jsx","PopoverTrigger","Button","ListFilterPlusIcon","ListFilterIcon","ChevronDown","PopoverContent","Form","MySelect","MyInput","Search","placeholder","onSearchChange","className","inputProps","props","search","setSearch","cn","Input","evt","Keyboard","event","RiSearchLine"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),a=require("../../chunks/index-ClQFzqcq.cjs.js"),m=require("dgz-ui/button"),M=require("dgz-ui/dropdown"),b=require("dgz-ui/utils"),A=require("../../chunks/lodash-BjH0kD7j.cjs.js"),o=require("lucide-react"),y=require("react"),P=require("react-i18next"),B=require("../../chunks/useSortable-B3LF1tg8.cjs.js"),ee=require("../../chunks/Actions-DQPuVKCk.cjs.js"),le=require("../../chunks/ExportData-C1Lrr1gH.cjs.js"),G=require("../../chunks/Search-CO1xBkv4.cjs.js"),se=require("../../chunks/Loader-D_jX_Wgx.cjs.js"),u=require("../../chunks/MyPagination-CnF3468f.cjs.js"),I=require("dgz-ui/form"),i=require("dgz-ui/table"),Q=require("../../chunks/SortOrder-81BrXp3i.cjs.js"),te=require("../../chunks/Empty-BYOOFAab.cjs.js"),X=({rows:s=[],columns:T,onRowClick:E,rowKey:N,params:c={page:1,limit:u.DEFAULT_LIMIT},hasNumbers:k=!1,hasCheckbox:w=!1,selectedItems:R,onSelectedItemsChange:v,onSortOrderChange:F,isStickyHeader:t,className:H,...O})=>{const{sortObject:r,handleSort:p}=B.useSortable({sortField:c==null?void 0:c.sortField,sortOrder:c==null?void 0:c.sortOrder,onSortOrderChange:F}),{selectedRows:g,isRowSelected:h,isAllRowsSelected:j,handleSelectAllRows:$,handleSelectRow:D}=B.useDataTable({rows:s,defaultSelectedRows:R});return y.useEffect(()=>{JSON.stringify(R)!==JSON.stringify(g)&&g&&(v==null||v(g))},[g,R,v]),e.jsxs(i.Table,{...O,className:b.cn("relative",H),children:[e.jsx(i.TableHeader,{className:b.cn("bg-bg",t&&"sticky top-0 z-1"),children:e.jsxs(i.TableRow,{children:[w&&e.jsx(i.TableHead,{className:"w-12 p-3",children:e.jsx(I.Checkbox,{className:"mt-1",checked:j(N),onCheckedChange:l=>$(N,!!l),"aria-label":"Select all"})}),k&&e.jsx(i.TableHead,{className:"w-12 p-2",children:"#"}),T.filter(l=>!l.hidden).map(l=>e.jsx(i.TableHead,{style:l.styles,className:b.cn("p-2",l.sortable&&"cursor-pointer"),onClick:()=>l.sortable&&p(l.dataIndex),children:e.jsxs("div",{className:"flex items-center gap-2",children:[l.name," ",l.sortable&&((r==null?void 0:r.sortField)===l.key?e.jsxs(e.Fragment,{children:[(r==null?void 0:r.sortOrder)===Q.SortOrder.DESC&&e.jsx(o.ArrowDownWideNarrow,{size:15}),(r==null?void 0:r.sortOrder)===Q.SortOrder.ASC&&e.jsx(o.ArrowUpWideNarrow,{size:15})]}):e.jsx(o.ArrowUpDown,{size:15}))]})},l.key))]})}),e.jsx(i.TableBody,{className:"[&>tr:nth-child(even)]:bg-bg-secondary",children:s.length?s.map((l,q)=>e.jsxs(i.TableRow,{onClick:()=>E==null?void 0:E(l),className:b.cn(E&&"cursor-pointer"),"data-state":h(l[N])&&"selected",children:[w&&e.jsx(i.TableCell,{className:"w-12 p-3",onClick:x=>x.stopPropagation(),children:e.jsx(I.Checkbox,{className:"mt-1",checked:h(l[N]),onCheckedChange:x=>D(l[N],!!x),"aria-label":"Select row"})}),k&&e.jsx(i.TableCell,{className:"w-12 p-2",children:(c.page-1)*(c.limit||u.DEFAULT_LIMIT)+q+1}),T.filter(x=>!x.hidden).map(x=>e.jsx(i.TableCell,{className:"text-body-xs-medium max-w-xs p-2",style:x.styles,children:x.render?x.render(A.lodashExports.get(l,x.dataIndex),l):A.lodashExports.get(l,x.dataIndex,"")},`${q}-${x.key}`))]},`${l[N]}`)):e.jsx(i.TableRow,{children:e.jsx(i.TableCell,{colSpan:k?w?T.length+2:T.length+1:T.length,children:e.jsx(te.Empty,{})})})})]})},de=({dataSource:s,columns:T,onRowClick:E,rowKey:N,hasNumbers:c,hasSearch:k,exportOptions:w,hasCheckbox:R,hasPagination:v,isStickyHeader:F,onParamChange:t,dataKey:H="docs",loading:O,tableKey:r,filters:p,actions:g,handleFilterChange:h,params:j,exportLoading:$=!1,onColumnsUpdate:D,hasColumnsVisibilityDropdown:l,onSelectedItemsChange:q,actionProps:x,filterWrapperProps:Y,exportOptionsProps:Z,columnsVisibilityProps:n,paginationProps:U,searchProps:f,...K})=>{var J;const{t:W}=P.useTranslation(),[z,S]=y.useState([]),{formattedColumns:L,handleColumnsChange:C,resetColumns:V}=B.useColumns({key:r,columns:T});return y.useEffect(()=>{D==null||D(L)},[L,D]),y.useEffect(()=>{q==null||q(z)},[z,q]),e.jsxs("div",{className:"border-border-alpha-light flex grow flex-col overflow-auto rounded-xl border shadow-xs",children:[(k||l&&r||!A.lodashExports.isEmpty(w)||!A.lodashExports.isEmpty(p))&&e.jsxs("div",{className:"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row",children:[e.jsx("div",{className:"w-full shrink",children:k&&e.jsx(G.Search,{...f,inputProps:{...f==null?void 0:f.inputProps,className:b.cn("h-8",(J=f==null?void 0:f.inputProps)==null?void 0:J.className)},className:b.cn("max-w-78 [&_button]:-top-1",f==null?void 0:f.className),defaultValue:A.lodashExports.get(j,"search",""),onSearchChange:d=>t==null?void 0:t({...j,search:d,page:1})})}),e.jsxs("div",{className:"flex shrink-0 items-center justify-end gap-3",children:[w&&e.jsx(le.ExportData,{...Z,options:w,loading:$}),l&&r&&e.jsxs(M.DropdownMenu,{children:[e.jsx(M.DropdownMenuTrigger,{asChild:!0,...n==null?void 0:n.triggerProps,children:e.jsx(m.Button,{variant:"secondary",size:"sm",className:"ml-auto rounded-lg px-3",children:(n==null?void 0:n.title)||e.jsxs(e.Fragment,{children:[e.jsx(a.yn,{})," ",e.jsx("span",{className:"hidden lg:inline!",children:W("Customize columns")}),e.jsx(a.f1,{})]})})}),e.jsxs(M.DropdownMenuContent,{align:"end",...n==null?void 0:n.contentProps,children:[e.jsxs(M.DropdownMenuItem,{className:"capitalize",onClick:V,children:[e.jsx(o.RefreshCw,{})," ",(n==null?void 0:n.resetText)||W("Reset columns")]}),e.jsx(M.DropdownMenuSeparator,{}),L.map(d=>e.jsx(M.DropdownMenuCheckboxItem,{className:"capitalize",checked:!d.hidden,onCheckedChange:_=>C(d,!_),children:d.name},d.key))]})]}),g&&e.jsx(ee.Actions,{...x,actions:g}),p&&e.jsx(G.FilterWrapper,{...Y,filters:p,params:j,onChange:h,onFilter:d=>{t==null||t({...j,...d,page:1}),h==null||h(d)}})]})]}),e.jsx("div",{className:"flex flex-col overflow-auto border-y",children:O?e.jsx(se.Loader,{}):e.jsx(X,{...K,params:{page:(s==null?void 0:s.page)||1,limit:s==null?void 0:s.limit,...j},rows:A.lodashExports.get(s,H,[]),rowKey:N,selectedItems:z,isStickyHeader:F,columns:L,hasCheckbox:R,hasNumbers:c,onRowClick:E,onSelectedItemsChange:S,onSortOrderChange:({sortField:d,sortOrder:_})=>{t==null||t({...j,sortField:d,sortOrder:_})}})}),v&&e.jsxs("div",{className:"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row",children:[e.jsx("div",{className:"text-sm",children:e.jsx(u.MyLimitSelect,{onLimitChange:d=>t==null?void 0:t({...j,limit:d,page:1}),defaultValue:s==null?void 0:s.limit})}),e.jsx("div",{className:"text-muted-foreground text-sm",children:W("{{selectedCount}} of {{total}} row(s) selected",{selectedCount:z.length,total:(s==null?void 0:s.total)||0})}),e.jsx("div",{children:e.jsx(u.MyPagination,{...U,onPageChange:d=>t==null?void 0:t({...j,page:d}),currentPage:s==null?void 0:s.page,totalPages:s==null?void 0:s.totalPages})})]})]})};exports.DataTable=de;exports.MyTable=X;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),J=require("../../chunks/index-ClQFzqcq.cjs.js"),m=require("dgz-ui/button"),M=require("dgz-ui/dropdown"),b=require("dgz-ui/utils"),p=require("../../chunks/lodash-BjH0kD7j.cjs.js"),o=require("lucide-react"),y=require("react"),P=require("react-i18next"),_=require("../../chunks/useSortable-B3LF1tg8.cjs.js"),ee=require("../../chunks/Actions-DQPuVKCk.cjs.js"),le=require("../../chunks/ExportData-C1Lrr1gH.cjs.js"),G=require("../../chunks/Search-BDXQ3bSp.cjs.js"),se=require("../../chunks/Loader-D_jX_Wgx.cjs.js"),u=require("../../chunks/MyPagination-CnF3468f.cjs.js"),I=require("dgz-ui/form"),i=require("dgz-ui/table"),Q=require("../../chunks/SortOrder-81BrXp3i.cjs.js"),te=require("../../chunks/Empty-BYOOFAab.cjs.js"),X=({rows:s=[],columns:T,onRowClick:E,rowKey:N,params:c={page:1,limit:u.DEFAULT_LIMIT},hasNumbers:k=!1,hasCheckbox:w=!1,selectedItems:A,onSelectedItemsChange:v,onSortOrderChange:F,isStickyHeader:t,className:H,...O})=>{const{sortObject:r,handleSort:R}=_.useSortable({sortField:c==null?void 0:c.sortField,sortOrder:c==null?void 0:c.sortOrder,onSortOrderChange:F}),{selectedRows:g,isRowSelected:h,isAllRowsSelected:f,handleSelectAllRows:$,handleSelectRow:D}=_.useDataTable({rows:s,defaultSelectedRows:A});return y.useEffect(()=>{JSON.stringify(A)!==JSON.stringify(g)&&g&&(v==null||v(g))},[g,A,v]),e.jsxs(i.Table,{...O,className:b.cn("relative",H),children:[e.jsx(i.TableHeader,{className:b.cn("bg-bg",t&&"sticky top-0 z-1"),children:e.jsxs(i.TableRow,{children:[w&&e.jsx(i.TableHead,{className:"w-12 p-3",children:e.jsx(I.Checkbox,{className:"mt-1",checked:f(N),onCheckedChange:l=>$(N,!!l),"aria-label":"Select all"})}),k&&e.jsx(i.TableHead,{className:"w-12 p-2",children:"#"}),T.filter(l=>!l.hidden).map(l=>e.jsx(i.TableHead,{style:l.styles,className:b.cn("p-2",l.sortable&&"cursor-pointer"),onClick:()=>l.sortable&&R(l.dataIndex),children:e.jsxs("div",{className:"flex items-center gap-2",children:[l.name," ",l.sortable&&((r==null?void 0:r.sortField)===l.key?e.jsxs(e.Fragment,{children:[(r==null?void 0:r.sortOrder)===Q.SortOrder.DESC&&e.jsx(o.ArrowDownWideNarrow,{size:15}),(r==null?void 0:r.sortOrder)===Q.SortOrder.ASC&&e.jsx(o.ArrowUpWideNarrow,{size:15})]}):e.jsx(o.ArrowUpDown,{size:15}))]})},l.key))]})}),e.jsx(i.TableBody,{className:"[&>tr:nth-child(even)]:bg-bg-secondary",children:s.length?s.map((l,q)=>e.jsxs(i.TableRow,{onClick:()=>E==null?void 0:E(l),className:b.cn(E&&"cursor-pointer"),"data-state":h(l[N])&&"selected",children:[w&&e.jsx(i.TableCell,{className:"w-12 p-3",onClick:x=>x.stopPropagation(),children:e.jsx(I.Checkbox,{className:"mt-1",checked:h(l[N]),onCheckedChange:x=>D(l[N],!!x),"aria-label":"Select row"})}),k&&e.jsx(i.TableCell,{className:"w-12 p-2",children:(c.page-1)*(c.limit||u.DEFAULT_LIMIT)+q+1}),T.filter(x=>!x.hidden).map(x=>e.jsx(i.TableCell,{className:"text-body-xs-medium max-w-xs p-2",style:x.styles,children:x.render?x.render(p.lodashExports.get(l,x.dataIndex),l):p.lodashExports.get(l,x.dataIndex,"")},`${q}-${x.key}`))]},`${l[N]}`)):e.jsx(i.TableRow,{children:e.jsx(i.TableCell,{colSpan:k?w?T.length+2:T.length+1:T.length,children:e.jsx(te.Empty,{})})})})]})},de=({dataSource:s,columns:T,onRowClick:E,rowKey:N,hasNumbers:c,hasSearch:k,exportOptions:w,hasCheckbox:A,hasPagination:v,isStickyHeader:F,onParamChange:t,dataKey:H="docs",loading:O,tableKey:r,filters:R,actions:g,handleFilterChange:h,params:f,exportLoading:$=!1,onColumnsUpdate:D,hasColumnsVisibilityDropdown:l,onSelectedItemsChange:q,actionProps:x,filterWrapperProps:Y,exportOptionsProps:Z,columnsVisibilityProps:n,paginationProps:U,searchProps:j,...K})=>{var B;const{t:a}=P.useTranslation(),[z,S]=y.useState([]),{formattedColumns:L,handleColumnsChange:C,resetColumns:V}=_.useColumns({key:r,columns:T});return y.useEffect(()=>{D==null||D(L)},[L,D]),y.useEffect(()=>{q==null||q(z)},[z,q]),e.jsxs("div",{className:"border-border-alpha-light flex grow flex-col overflow-auto rounded-xl border shadow-xs",children:[(k||l&&r||!p.lodashExports.isEmpty(w)||!p.lodashExports.isEmpty(R))&&e.jsxs("div",{className:"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row",children:[e.jsx("div",{className:"w-full shrink",children:k&&e.jsx(G.Search,{...j,inputProps:{...j==null?void 0:j.inputProps,className:b.cn("h-8",(B=j==null?void 0:j.inputProps)==null?void 0:B.className)},className:b.cn("max-w-78 [&_button]:-top-1",j==null?void 0:j.className),defaultValue:p.lodashExports.get(f,"search",""),onSearchChange:d=>t==null?void 0:t({...f,search:d,page:1})})}),e.jsxs("div",{className:"flex shrink-0 items-center justify-end gap-3",children:[w&&e.jsx(le.ExportData,{...Z,options:w,loading:$}),l&&r&&e.jsxs(M.DropdownMenu,{children:[e.jsx(M.DropdownMenuTrigger,{asChild:!0,...n==null?void 0:n.triggerProps,children:e.jsx(m.Button,{variant:"secondary",size:"sm",className:"ml-auto rounded-lg px-3",children:(n==null?void 0:n.title)||e.jsxs(e.Fragment,{children:[e.jsx(J.yn,{})," ",e.jsx("span",{className:"hidden lg:inline!",children:a("Customize columns")}),e.jsx(J.f1,{})]})})}),e.jsxs(M.DropdownMenuContent,{align:"end",...n==null?void 0:n.contentProps,children:[e.jsxs(M.DropdownMenuItem,{className:"capitalize",onClick:V,children:[e.jsx(o.RefreshCw,{})," ",(n==null?void 0:n.resetText)||a("Reset columns")]}),e.jsx(M.DropdownMenuSeparator,{}),L.map(d=>e.jsx(M.DropdownMenuCheckboxItem,{className:"capitalize",checked:!d.hidden,onCheckedChange:W=>C(d,!W),children:d.name},d.key))]})]}),g&&e.jsx(ee.Actions,{...x,actions:g}),R&&e.jsx(G.FilterWrapper,{...Y,filters:R,params:f,onChange:h,onFilter:d=>{t==null||t({...d,page:1}),h==null||h(d)}})]})]}),e.jsx("div",{className:"flex flex-col overflow-auto border-y",children:O?e.jsx(se.Loader,{}):e.jsx(X,{...K,params:{page:(s==null?void 0:s.page)||1,limit:s==null?void 0:s.limit,...f},rows:p.lodashExports.get(s,H,[]),rowKey:N,selectedItems:z,isStickyHeader:F,columns:L,hasCheckbox:A,hasNumbers:c,onRowClick:E,onSelectedItemsChange:S,onSortOrderChange:({sortField:d,sortOrder:W})=>{t==null||t({...f,sortField:d,sortOrder:W})}})}),v&&e.jsxs("div",{className:"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row",children:[e.jsx("div",{className:"text-sm",children:e.jsx(u.MyLimitSelect,{onLimitChange:d=>t==null?void 0:t({...f,limit:d,page:1}),defaultValue:s==null?void 0:s.limit})}),e.jsx("div",{className:"text-muted-foreground text-sm",children:a("{{selectedCount}} of {{total}} row(s) selected",{selectedCount:z.length,total:(s==null?void 0:s.total)||0})}),e.jsx("div",{children:e.jsx(u.MyPagination,{...U,onPageChange:d=>t==null?void 0:t({...f,page:d}),currentPage:s==null?void 0:s.page,totalPages:s==null?void 0:s.totalPages})})]})]})};exports.DataTable=de;exports.MyTable=X;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/components/datatable/MyTable.tsx","../../../src/components/datatable/DataTable.tsx"],"sourcesContent":["import { Checkbox } from 'dgz-ui/form';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from 'dgz-ui/table';\nimport { cn } from 'dgz-ui/utils';\nimport { get } from 'lodash';\nimport {\n ArrowDownWideNarrow,\n ArrowUpDown,\n ArrowUpWideNarrow,\n} from 'lucide-react';\nimport { type ComponentProps, useEffect } from 'react';\nimport { SortOrder } from '../../enums';\nimport { useDataTable, useSortable, type UseSortableProps } from '../../hooks';\nimport type { ColumnType } from '../../types';\nimport { Empty } from '../empty';\nimport { DEFAULT_LIMIT } from '../pagination/MyLimitSelect';\n\n/**\n * Props for the MyTable component.\n * @template TData - The type of data in the table.\n */\nexport interface MyTableProps<TData> extends ComponentProps<'table'> {\n /** Array of data rows to display. */\n rows?: TData[];\n /** Column definitions. */\n columns: ColumnType<TData>[];\n /** Callback when a row is clicked. */\n onRowClick?: (row: TData) => void;\n /** Whether to show row numbers. */\n hasNumbers?: boolean;\n /** Whether to show selection checkboxes. */\n hasCheckbox?: boolean;\n /** Unique key for each row. */\n rowKey: keyof TData;\n /** Current table parameters (page, limit, sort). */\n params?: Record<string, unknown>;\n /** Total number of items (optional, often used with pagination context). */\n total?: number;\n /** Array of currently selected item keys. */\n selectedItems?: TData[keyof TData][];\n /** Callback when selected items change. */\n onSelectedItemsChange?: (selectedItems: TData[keyof TData][]) => void;\n /** Callback when sort order changes. */\n onSortOrderChange?: (\n params: Omit<UseSortableProps<TData>, 'onSortOrderChange'>\n ) => void;\n /** Whether the header should stick to the top. */\n isStickyHeader?: true;\n}\n\n/**\n * MyTable renders a generic data table with optional numbering, selection checkboxes,\n * sortable columns and sticky header. It is a presentational component and delegates\n * sorting/selection state via hooks and callbacks.\n *\n * @template TData - The row data type.\n * @param props - Component props.\n * @returns React element containing the table.\n */\nexport const MyTable = <TData,>({\n rows = [],\n columns,\n onRowClick,\n rowKey,\n params = {\n page: 1,\n limit: DEFAULT_LIMIT,\n },\n hasNumbers = false,\n hasCheckbox = false,\n selectedItems,\n onSelectedItemsChange,\n onSortOrderChange,\n isStickyHeader,\n className,\n ...props\n}: MyTableProps<TData>) => {\n const { sortObject, handleSort } = useSortable<TData>({\n sortField: params?.sortField as keyof TData | undefined,\n sortOrder: params?.sortOrder as SortOrder | undefined,\n onSortOrderChange,\n });\n const {\n selectedRows,\n isRowSelected,\n isAllRowsSelected,\n handleSelectAllRows,\n handleSelectRow,\n } = useDataTable<TData>({ rows, defaultSelectedRows: selectedItems });\n\n useEffect(() => {\n if (\n JSON.stringify(selectedItems) !== JSON.stringify(selectedRows) &&\n selectedRows\n ) {\n onSelectedItemsChange?.(selectedRows);\n }\n }, [selectedRows, selectedItems, onSelectedItemsChange]);\n\n return (\n <Table {...props} className={cn('relative', className)}>\n <TableHeader\n className={cn('bg-bg', isStickyHeader && 'sticky top-0 z-1')}\n >\n <TableRow>\n {hasCheckbox && (\n <TableHead className={'w-12 p-3'}>\n <Checkbox\n className={'mt-1'}\n checked={isAllRowsSelected(rowKey)}\n onCheckedChange={(value) =>\n handleSelectAllRows(rowKey, !!value)\n }\n aria-label=\"Select all\"\n />\n </TableHead>\n )}\n {hasNumbers && <TableHead className={'w-12 p-2'}>#</TableHead>}\n {columns\n .filter((column) => !column.hidden)\n .map((column) => (\n <TableHead\n key={column.key}\n style={column.styles}\n className={cn('p-2', column.sortable && 'cursor-pointer')}\n onClick={() => column.sortable && handleSort(column.dataIndex)}\n >\n <div className={'flex items-center gap-2'}>\n {column.name}{' '}\n {column.sortable &&\n (sortObject?.sortField === column.key ? (\n <>\n {sortObject?.sortOrder === SortOrder.DESC && (\n <ArrowDownWideNarrow size={15} />\n )}\n {sortObject?.sortOrder === SortOrder.ASC && (\n <ArrowUpWideNarrow size={15} />\n )}\n </>\n ) : (\n <ArrowUpDown size={15} />\n ))}\n </div>\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody className={'[&>tr:nth-child(even)]:bg-bg-secondary'}>\n {rows.length ? (\n rows.map((row, index) => (\n <TableRow\n key={`${row[rowKey]}`}\n onClick={() => onRowClick?.(row)}\n className={cn(onRowClick && 'cursor-pointer')}\n data-state={isRowSelected(row[rowKey]) && 'selected'}\n >\n {hasCheckbox && (\n <TableCell\n className={'w-12 p-3'}\n onClick={(evt) => evt.stopPropagation()}\n >\n <Checkbox\n className={'mt-1'}\n checked={isRowSelected(row[rowKey])}\n onCheckedChange={(value) =>\n handleSelectRow(row[rowKey], !!value)\n }\n aria-label=\"Select row\"\n />\n </TableCell>\n )}\n {hasNumbers && (\n <TableCell className={'w-12 p-2'}>\n {((params.page as number) - 1) *\n ((params.limit || DEFAULT_LIMIT) as number) +\n index +\n 1}\n </TableCell>\n )}\n {columns\n .filter((column) => !column.hidden)\n .map((column) => (\n <TableCell\n className={'text-body-xs-medium max-w-xs p-2'}\n style={column.styles}\n key={`${index}-${column.key}`}\n >\n {column.render\n ? column.render(get(row, column.dataIndex), row)\n : get(row, column.dataIndex, '')}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell\n colSpan={\n hasNumbers\n ? hasCheckbox\n ? columns.length + 2\n : columns.length + 1\n : columns.length\n }\n >\n <Empty />\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n );\n};\n","import { RiArrowDownSLine, RiLayoutColumnLine } from '@remixicon/react';\nimport { Button } from 'dgz-ui/button';\nimport {\n type DropdownContainerProps,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'dgz-ui/dropdown';\nimport { cn } from 'dgz-ui/utils';\nimport { get, isEmpty } from 'lodash';\nimport { RefreshCw } from 'lucide-react';\nimport { type ReactNode, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useColumns } from '../../hooks';\nimport type { ColumnType } from '../../types';\nimport { type ActionInterface, Actions, type ActionsProps } from '../actions';\nimport {\n ExportData,\n type ExportDataInterface,\n type ExportDataProps,\n} from '../export';\nimport {\n type FilterInterface,\n FilterWrapper,\n type FilterWrapperProps,\n Search,\n type SearchProps,\n} from '../filters';\nimport { Loader } from '../loader';\nimport { MyLimitSelect, MyPagination } from '../pagination';\nimport type { MyPaginationProps } from '../pagination/MyPagination.tsx';\nimport { MyTable, type MyTableProps } from './MyTable';\n\n/**\n * Minimal pagination wrapper contract used by `DataTable`.\n *\n * Notes\n * - Only `page`, `limit`, and `totalPages` are required. Other fields are optional and\n * may be provided by your API for convenience.\n * - The actual rows array can be stored in any key, controlled via `dataKey` prop\n * (defaults to `\"docs\"`).\n */\nexport interface PaginationInterface<TData> {\n /** Array of rows for the current page. Used when `dataKey` is set to `\"docs\"`. */\n docs?: TData[];\n /** Zero-based index of the first item on the current page (if provided by API). */\n offset?: number;\n /** Page size (items per page). */\n limit: number;\n /** Total number of pages available. */\n totalPages: number;\n /** Total number of items across all pages (if available). */\n total?: number;\n /** Current page number (1-based). */\n page: number;\n /** Convenience counter for the first item index on the page (if provided). */\n pagingCounter?: number;\n /** Whether a previous page exists. */\n hasPrevPage?: boolean;\n /** Whether a next page exists. */\n hasNextPage?: boolean;\n /** Previous page number, if available. */\n prevPage?: number;\n /** Next page number, if available. */\n nextPage?: number;\n}\n\n/**\n * Props for the DataTable component.\n *\n * @template TData - Row data type.\n * @template TPaginationData - Pagination wrapper type.\n */\nexport interface DataTableProps<\n TData,\n TPaginationData extends PaginationInterface<TData>,\n> extends Omit<MyTableProps<TData>, 'rows'> {\n /** Pagination data source. */\n dataSource?: TPaginationData;\n /** Callback for parameter changes (pagination, sorting, filtering). */\n onParamChange?: (param: Record<string, unknown>) => void;\n /** Whether to enable pagination. */\n hasPagination?: true;\n /** Options for the export data dropdown. */\n exportOptions?: ExportDataInterface[];\n /** Whether to enable search functionality. */\n hasSearch?: true;\n /** Whether the table data is loading. */\n loading?: boolean;\n /** Array of filters to display. */\n filters?: FilterInterface[];\n /** Array of actions to display. */\n actions?: ActionInterface[];\n /** Callback for filter changes. */\n handleFilterChange?: (filters: Record<string, unknown>) => void;\n /** Unique key for the table, used for column persistence. */\n tableKey: string;\n /** The key in dataSource where the data array is located. Defaults to \"docs\". */\n dataKey?: keyof TPaginationData;\n /** Whether to show the columns visibility dropdown. */\n hasColumnsVisibilityDropdown?: true;\n /** Callback when columns are updated (e.g., visibility toggled). */\n onColumnsUpdate?: (columns: ColumnType<TData>[]) => void;\n /** Whether the export action is loading. */\n exportLoading?: boolean;\n /** Props for the Actions component. */\n actionProps?: Partial<ActionsProps>;\n /** Props for the FilterWrapper component. */\n filterWrapperProps?: Partial<FilterWrapperProps>;\n /** Props for the ExportData component. */\n exportOptionsProps?: Partial<ExportDataProps>;\n searchProps?: Partial<SearchProps>;\n paginationProps?: Partial<MyPaginationProps>;\n /** Props for the columns visibility dropdown. */\n columnsVisibilityProps?: DropdownContainerProps & {\n title?: ReactNode;\n resetText?: ReactNode;\n };\n}\n\n/**\n * DataTable is a composable, high-level table that brings together search, filters,\n * column visibility management, header actions, exporting, and pagination.\n * It renders `MyTable` for rows and, when enabled, shows header controls and a footer with pagination.\n *\n * Generic Types\n * - `TData` — Row data shape (type of each item in the rows array).\n * - `TPaginationData` — Pagination wrapper type containing rows and pagination meta; defaults to\n * `PaginationInterface<TData>`.\n *\n * Key Behaviors\n * - Emits `onParamChange` when search text, filters, page, limit, or sort order change.\n * - Persists column visibility per `tableKey` via `useColumns` and informs parent with `onColumnsUpdate`.\n * - Renders header controls only when the related feature is enabled/has content.\n *\n * Props Overview\n * - `dataSource` — Paginated data source object that contains rows (see `dataKey`) and pagination metadata.\n * - `columns` — Column definitions passed to `MyTable`.\n * - `onRowClick` — Callback when a row is clicked.\n * - `rowKey` — Property name used as a unique row key.\n * - `hasNumbers` — Whether to show the row numbers column.\n * - `hasSearch` — Set to `true` to display the search input in the header.\n * - `exportOptions` — Export menu options shown by `ExportData` (see `ExportDataInterface[]`).\n * - `exportLoading` — When `true`, shows a spinner in the Export button to indicate an export action is in progress.\n * - `hasCheckbox` — Whether to show the selection checkbox column.\n * - `hasPagination` — Set to `true` to render the pagination footer.\n * - `isStickyHeader` — Whether to keep the table header sticky.\n * - `onParamChange` — Emits parameter changes for pagination/sorting/search/filters.\n * - `dataKey` — Key within `dataSource` that contains the row array. Defaults to `\"docs\"`.\n * - `loading` — If `true`, shows a loading state instead of the table rows.\n * - `tableKey` — Unique key for persisting column visibility state.\n * - `filters` — Filter configurations to render in the header.\n * - `actions` — Header actions independent of selected rows.\n * - `handleFilterChange` — Callback executed when filter values change.\n * - `params` — Current list parameters (pagination, sort, search, filters).\n * - `hasColumnsVisibilityDropdown` — Set to `true` to show the columns customize dropdown.\n * - `onColumnsUpdate` — Notifies parent whenever the internal columns state changes (after formatting/visibility).\n * - `actionProps` — Props passed to the `Actions` component.\n * - `filterWrapperProps` — Props passed to the `FilterWrapper` component.\n * - `exportOptionsProps` — Props passed to the `ExportData` component.\n * - `columnsVisibilityProps` — Props passed to the columns visibility dropdown.\n * - `onSelectedItemsChange` — Callback when selected rows change (requires `hasCheckbox`).\n *\n * Accessibility\n * - Header controls and dropdowns reuse shared primitives that include keyboard and ARIA support.\n *\n * Internationalization\n * - Text such as \"Export\", \"Customize columns\", and \"Reset columns\" are resolved via `react-i18next`.\n *\n * Usage Examples\n * 1) Minimal paginated table (uses default `dataKey = \"docs\"`)\n * ```tsx\n * type User = { id: string; name: string };\n * const data = { docs: [{ id: '1', name: 'Ada' }], page: 1, limit: 10, totalPages: 1 };\n *\n * <DataTable<User>\n * tableKey=\"users-table\"\n * columns={[{ key: 'name', name: 'Name' }]}\n * rowKey=\"id\"\n * dataSource={data}\n * hasPagination\n * />\n * ```\n *\n * 2) Custom `dataKey` and column visibility persistence\n * ```tsx\n * type Row = { id: number; title: string };\n * const payload = { items: [{ id: 1, title: 'Hello' }], page: 1, limit: 20, totalPages: 1 };\n *\n * <DataTable<Row>\n * tableKey=\"posts\"\n * columns={[{ key: 'title', name: 'Title' }]}\n * rowKey=\"id\"\n * dataSource={payload}\n * dataKey=\"items\"\n * hasColumnsVisibilityDropdown\n * />\n * ```\n *\n * 3) Responding to user interactions via `onParamChange`\n * ```tsx\n * const [params, setParams] = useState({ page: 1, limit: 10 });\n *\n * <DataTable\n * tableKey=\"logs\"\n * columns={[{ key: 'message', name: 'Message' }]}\n * rowKey=\"id\"\n * params={params}\n * onParamChange={setParams}\n * hasSearch\n * hasPagination\n * />\n * ```\n *\n * Notes and Best Practices\n * - Ensure `rowKey` points to a stable unique field in `TData` to avoid key collisions.\n * - When arrays like `exportOptions`, `filters`, or `actions` are empty, their sections are not rendered.\n * - Sorting emits `{ sortField, sortOrder }` through `onParamChange` when the user toggles a column sort.\n *\n * Returns\n * - React element that renders a complete data table experience.\n */\nexport const DataTable = <\n TData,\n TPaginationData extends PaginationInterface<TData> =\n PaginationInterface<TData>,\n>({\n dataSource,\n columns,\n onRowClick,\n rowKey,\n hasNumbers,\n hasSearch,\n exportOptions,\n hasCheckbox,\n hasPagination,\n isStickyHeader,\n onParamChange,\n dataKey = 'docs',\n loading,\n tableKey,\n filters,\n actions,\n handleFilterChange,\n params,\n exportLoading = false,\n onColumnsUpdate,\n hasColumnsVisibilityDropdown,\n onSelectedItemsChange,\n actionProps,\n filterWrapperProps,\n exportOptionsProps,\n columnsVisibilityProps,\n paginationProps,\n searchProps,\n ...props\n}: DataTableProps<TData, TPaginationData>) => {\n const { t } = useTranslation();\n const [selectedRows, setSelectedRows] = useState<TData[keyof TData][]>([]);\n const { formattedColumns, handleColumnsChange, resetColumns } =\n useColumns<TData>({ key: tableKey, columns });\n\n useEffect(() => {\n onColumnsUpdate?.(formattedColumns);\n }, [formattedColumns, onColumnsUpdate]);\n\n useEffect(() => {\n onSelectedItemsChange?.(selectedRows);\n }, [selectedRows, onSelectedItemsChange]);\n\n return (\n <div\n className={\n 'border-border-alpha-light flex grow flex-col overflow-auto rounded-xl border shadow-xs'\n }\n >\n {(hasSearch ||\n (hasColumnsVisibilityDropdown && tableKey) ||\n !isEmpty(exportOptions) ||\n !isEmpty(filters)) && (\n <div className=\"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row\">\n <div className={'w-full shrink'}>\n {hasSearch && (\n <Search\n {...searchProps}\n inputProps={{\n ...searchProps?.inputProps,\n className: cn('h-8', searchProps?.inputProps?.className),\n }}\n className={cn(\n 'max-w-78 [&_button]:-top-1',\n searchProps?.className\n )}\n defaultValue={get(params, 'search', '') as string}\n onSearchChange={(search) =>\n onParamChange?.({ ...params, search, page: 1 })\n }\n />\n )}\n </div>\n <div className={'flex shrink-0 items-center justify-end gap-3'}>\n {exportOptions && (\n <ExportData\n {...exportOptionsProps}\n options={exportOptions}\n loading={exportLoading}\n />\n )}\n {hasColumnsVisibilityDropdown && tableKey && (\n <DropdownMenu>\n <DropdownMenuTrigger\n asChild\n {...columnsVisibilityProps?.triggerProps}\n >\n <Button\n variant=\"secondary\"\n size={'sm'}\n className={'ml-auto rounded-lg px-3'}\n >\n {columnsVisibilityProps?.title || (\n <>\n <RiLayoutColumnLine />{' '}\n <span className={'hidden lg:inline!'}>\n {t('Customize columns')}\n </span>\n <RiArrowDownSLine />\n </>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n {...columnsVisibilityProps?.contentProps}\n >\n <DropdownMenuItem\n className=\"capitalize\"\n onClick={resetColumns}\n >\n <RefreshCw />{' '}\n {columnsVisibilityProps?.resetText || t('Reset columns')}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n {formattedColumns.map((column) => {\n return (\n <DropdownMenuCheckboxItem\n key={column.key}\n className=\"capitalize\"\n checked={!column.hidden}\n onCheckedChange={(value) =>\n handleColumnsChange(column, !value)\n }\n >\n {column.name}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {actions && <Actions {...actionProps} actions={actions} />}\n {filters && (\n <FilterWrapper\n {...filterWrapperProps}\n filters={filters}\n params={params}\n onChange={handleFilterChange}\n onFilter={(filter) => {\n onParamChange?.({ ...params, ...filter, page: 1 });\n handleFilterChange?.(filter);\n }}\n />\n )}\n </div>\n </div>\n )}\n <div className={'flex flex-col overflow-auto border-y'}>\n {!loading ? (\n <MyTable<TData>\n {...props}\n params={{\n page: dataSource?.page || 1,\n limit: dataSource?.limit,\n ...params,\n }}\n rows={get(dataSource, dataKey, []) as TData[]}\n rowKey={rowKey}\n selectedItems={selectedRows}\n isStickyHeader={isStickyHeader}\n columns={formattedColumns}\n hasCheckbox={hasCheckbox}\n hasNumbers={hasNumbers}\n onRowClick={onRowClick}\n onSelectedItemsChange={setSelectedRows}\n onSortOrderChange={({ sortField, sortOrder }) => {\n onParamChange?.({ ...params, sortField, sortOrder });\n }}\n />\n ) : (\n <Loader />\n )}\n </div>\n {hasPagination && (\n <div className=\"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row\">\n <div className=\"text-sm\">\n <MyLimitSelect\n onLimitChange={(limit) =>\n onParamChange?.({ ...params, limit, page: 1 })\n }\n defaultValue={dataSource?.limit}\n />\n </div>\n <div className=\"text-muted-foreground text-sm\">\n {t('{{selectedCount}} of {{total}} row(s) selected', {\n selectedCount: selectedRows.length,\n total: dataSource?.total || 0,\n })}\n </div>\n <div>\n <MyPagination\n {...paginationProps}\n onPageChange={(page) => onParamChange?.({ ...params, page })}\n currentPage={dataSource?.page}\n totalPages={dataSource?.totalPages}\n />\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":["MyTable","rows","columns","onRowClick","rowKey","params","DEFAULT_LIMIT","hasNumbers","hasCheckbox","selectedItems","onSelectedItemsChange","onSortOrderChange","isStickyHeader","className","props","sortObject","handleSort","useSortable","selectedRows","isRowSelected","isAllRowsSelected","handleSelectAllRows","handleSelectRow","useDataTable","useEffect","jsxs","Table","cn","jsx","TableHeader","TableRow","TableHead","Checkbox","value","column","Fragment","SortOrder","ArrowDownWideNarrow","ArrowUpWideNarrow","ArrowUpDown","TableBody","row","index","TableCell","evt","get","Empty","DataTable","dataSource","hasSearch","exportOptions","hasPagination","onParamChange","dataKey","loading","tableKey","filters","actions","handleFilterChange","exportLoading","onColumnsUpdate","hasColumnsVisibilityDropdown","actionProps","filterWrapperProps","exportOptionsProps","columnsVisibilityProps","paginationProps","searchProps","t","useTranslation","setSelectedRows","useState","formattedColumns","handleColumnsChange","resetColumns","useColumns","isEmpty","Search","_a","search","ExportData","DropdownMenu","DropdownMenuTrigger","Button","RiLayoutColumnLine","RiArrowDownSLine","DropdownMenuContent","DropdownMenuItem","RefreshCw","DropdownMenuSeparator","DropdownMenuCheckboxItem","Actions","FilterWrapper","filter","Loader","sortField","sortOrder","MyLimitSelect","limit","MyPagination","page"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/components/datatable/MyTable.tsx","../../../src/components/datatable/DataTable.tsx"],"sourcesContent":["import { Checkbox } from 'dgz-ui/form';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from 'dgz-ui/table';\nimport { cn } from 'dgz-ui/utils';\nimport { get } from 'lodash';\nimport {\n ArrowDownWideNarrow,\n ArrowUpDown,\n ArrowUpWideNarrow,\n} from 'lucide-react';\nimport { type ComponentProps, useEffect } from 'react';\nimport { SortOrder } from '../../enums';\nimport { useDataTable, useSortable, type UseSortableProps } from '../../hooks';\nimport type { ColumnType } from '../../types';\nimport { Empty } from '../empty';\nimport { DEFAULT_LIMIT } from '../pagination/MyLimitSelect';\n\n/**\n * Props for the MyTable component.\n * @template TData - The type of data in the table.\n */\nexport interface MyTableProps<TData> extends ComponentProps<'table'> {\n /** Array of data rows to display. */\n rows?: TData[];\n /** Column definitions. */\n columns: ColumnType<TData>[];\n /** Callback when a row is clicked. */\n onRowClick?: (row: TData) => void;\n /** Whether to show row numbers. */\n hasNumbers?: boolean;\n /** Whether to show selection checkboxes. */\n hasCheckbox?: boolean;\n /** Unique key for each row. */\n rowKey: keyof TData;\n /** Current table parameters (page, limit, sort). */\n params?: Record<string, unknown>;\n /** Total number of items (optional, often used with pagination context). */\n total?: number;\n /** Array of currently selected item keys. */\n selectedItems?: TData[keyof TData][];\n /** Callback when selected items change. */\n onSelectedItemsChange?: (selectedItems: TData[keyof TData][]) => void;\n /** Callback when sort order changes. */\n onSortOrderChange?: (\n params: Omit<UseSortableProps<TData>, 'onSortOrderChange'>\n ) => void;\n /** Whether the header should stick to the top. */\n isStickyHeader?: true;\n}\n\n/**\n * MyTable renders a generic data table with optional numbering, selection checkboxes,\n * sortable columns and sticky header. It is a presentational component and delegates\n * sorting/selection state via hooks and callbacks.\n *\n * @template TData - The row data type.\n * @param props - Component props.\n * @returns React element containing the table.\n */\nexport const MyTable = <TData,>({\n rows = [],\n columns,\n onRowClick,\n rowKey,\n params = {\n page: 1,\n limit: DEFAULT_LIMIT,\n },\n hasNumbers = false,\n hasCheckbox = false,\n selectedItems,\n onSelectedItemsChange,\n onSortOrderChange,\n isStickyHeader,\n className,\n ...props\n}: MyTableProps<TData>) => {\n const { sortObject, handleSort } = useSortable<TData>({\n sortField: params?.sortField as keyof TData | undefined,\n sortOrder: params?.sortOrder as SortOrder | undefined,\n onSortOrderChange,\n });\n const {\n selectedRows,\n isRowSelected,\n isAllRowsSelected,\n handleSelectAllRows,\n handleSelectRow,\n } = useDataTable<TData>({ rows, defaultSelectedRows: selectedItems });\n\n useEffect(() => {\n if (\n JSON.stringify(selectedItems) !== JSON.stringify(selectedRows) &&\n selectedRows\n ) {\n onSelectedItemsChange?.(selectedRows);\n }\n }, [selectedRows, selectedItems, onSelectedItemsChange]);\n\n return (\n <Table {...props} className={cn('relative', className)}>\n <TableHeader\n className={cn('bg-bg', isStickyHeader && 'sticky top-0 z-1')}\n >\n <TableRow>\n {hasCheckbox && (\n <TableHead className={'w-12 p-3'}>\n <Checkbox\n className={'mt-1'}\n checked={isAllRowsSelected(rowKey)}\n onCheckedChange={(value) =>\n handleSelectAllRows(rowKey, !!value)\n }\n aria-label=\"Select all\"\n />\n </TableHead>\n )}\n {hasNumbers && <TableHead className={'w-12 p-2'}>#</TableHead>}\n {columns\n .filter((column) => !column.hidden)\n .map((column) => (\n <TableHead\n key={column.key}\n style={column.styles}\n className={cn('p-2', column.sortable && 'cursor-pointer')}\n onClick={() => column.sortable && handleSort(column.dataIndex)}\n >\n <div className={'flex items-center gap-2'}>\n {column.name}{' '}\n {column.sortable &&\n (sortObject?.sortField === column.key ? (\n <>\n {sortObject?.sortOrder === SortOrder.DESC && (\n <ArrowDownWideNarrow size={15} />\n )}\n {sortObject?.sortOrder === SortOrder.ASC && (\n <ArrowUpWideNarrow size={15} />\n )}\n </>\n ) : (\n <ArrowUpDown size={15} />\n ))}\n </div>\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody className={'[&>tr:nth-child(even)]:bg-bg-secondary'}>\n {rows.length ? (\n rows.map((row, index) => (\n <TableRow\n key={`${row[rowKey]}`}\n onClick={() => onRowClick?.(row)}\n className={cn(onRowClick && 'cursor-pointer')}\n data-state={isRowSelected(row[rowKey]) && 'selected'}\n >\n {hasCheckbox && (\n <TableCell\n className={'w-12 p-3'}\n onClick={(evt) => evt.stopPropagation()}\n >\n <Checkbox\n className={'mt-1'}\n checked={isRowSelected(row[rowKey])}\n onCheckedChange={(value) =>\n handleSelectRow(row[rowKey], !!value)\n }\n aria-label=\"Select row\"\n />\n </TableCell>\n )}\n {hasNumbers && (\n <TableCell className={'w-12 p-2'}>\n {((params.page as number) - 1) *\n ((params.limit || DEFAULT_LIMIT) as number) +\n index +\n 1}\n </TableCell>\n )}\n {columns\n .filter((column) => !column.hidden)\n .map((column) => (\n <TableCell\n className={'text-body-xs-medium max-w-xs p-2'}\n style={column.styles}\n key={`${index}-${column.key}`}\n >\n {column.render\n ? column.render(get(row, column.dataIndex), row)\n : get(row, column.dataIndex, '')}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell\n colSpan={\n hasNumbers\n ? hasCheckbox\n ? columns.length + 2\n : columns.length + 1\n : columns.length\n }\n >\n <Empty />\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n );\n};\n","import { RiArrowDownSLine, RiLayoutColumnLine } from '@remixicon/react';\nimport { Button } from 'dgz-ui/button';\nimport {\n type DropdownContainerProps,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'dgz-ui/dropdown';\nimport { cn } from 'dgz-ui/utils';\nimport { get, isEmpty } from 'lodash';\nimport { RefreshCw } from 'lucide-react';\nimport { type ReactNode, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useColumns } from '../../hooks';\nimport type { ColumnType } from '../../types';\nimport { type ActionInterface, Actions, type ActionsProps } from '../actions';\nimport {\n ExportData,\n type ExportDataInterface,\n type ExportDataProps,\n} from '../export';\nimport {\n type FilterInterface,\n FilterWrapper,\n type FilterWrapperProps,\n Search,\n type SearchProps,\n} from '../filters';\nimport { Loader } from '../loader';\nimport { MyLimitSelect, MyPagination } from '../pagination';\nimport type { MyPaginationProps } from '../pagination/MyPagination.tsx';\nimport { MyTable, type MyTableProps } from './MyTable';\n\n/**\n * Minimal pagination wrapper contract used by `DataTable`.\n *\n * Notes\n * - Only `page`, `limit`, and `totalPages` are required. Other fields are optional and\n * may be provided by your API for convenience.\n * - The actual rows array can be stored in any key, controlled via `dataKey` prop\n * (defaults to `\"docs\"`).\n */\nexport interface PaginationInterface<TData> {\n /** Array of rows for the current page. Used when `dataKey` is set to `\"docs\"`. */\n docs?: TData[];\n /** Zero-based index of the first item on the current page (if provided by API). */\n offset?: number;\n /** Page size (items per page). */\n limit: number;\n /** Total number of pages available. */\n totalPages: number;\n /** Total number of items across all pages (if available). */\n total?: number;\n /** Current page number (1-based). */\n page: number;\n /** Convenience counter for the first item index on the page (if provided). */\n pagingCounter?: number;\n /** Whether a previous page exists. */\n hasPrevPage?: boolean;\n /** Whether a next page exists. */\n hasNextPage?: boolean;\n /** Previous page number, if available. */\n prevPage?: number;\n /** Next page number, if available. */\n nextPage?: number;\n}\n\n/**\n * Props for the DataTable component.\n *\n * @template TData - Row data type.\n * @template TPaginationData - Pagination wrapper type.\n */\nexport interface DataTableProps<\n TData,\n TPaginationData extends PaginationInterface<TData>,\n> extends Omit<MyTableProps<TData>, 'rows'> {\n /** Pagination data source. */\n dataSource?: TPaginationData;\n /** Callback for parameter changes (pagination, sorting, filtering). */\n onParamChange?: (param: Record<string, unknown>) => void;\n /** Whether to enable pagination. */\n hasPagination?: true;\n /** Options for the export data dropdown. */\n exportOptions?: ExportDataInterface[];\n /** Whether to enable search functionality. */\n hasSearch?: true;\n /** Whether the table data is loading. */\n loading?: boolean;\n /** Array of filters to display. */\n filters?: FilterInterface[];\n /** Array of actions to display. */\n actions?: ActionInterface[];\n /** Callback for filter changes. */\n handleFilterChange?: (filters: Record<string, unknown>) => void;\n /** Unique key for the table, used for column persistence. */\n tableKey: string;\n /** The key in dataSource where the data array is located. Defaults to \"docs\". */\n dataKey?: keyof TPaginationData;\n /** Whether to show the columns visibility dropdown. */\n hasColumnsVisibilityDropdown?: true;\n /** Callback when columns are updated (e.g., visibility toggled). */\n onColumnsUpdate?: (columns: ColumnType<TData>[]) => void;\n /** Whether the export action is loading. */\n exportLoading?: boolean;\n /** Props for the Actions component. */\n actionProps?: Partial<ActionsProps>;\n /** Props for the FilterWrapper component. */\n filterWrapperProps?: Partial<FilterWrapperProps>;\n /** Props for the ExportData component. */\n exportOptionsProps?: Partial<ExportDataProps>;\n searchProps?: Partial<SearchProps>;\n paginationProps?: Partial<MyPaginationProps>;\n /** Props for the columns visibility dropdown. */\n columnsVisibilityProps?: DropdownContainerProps & {\n title?: ReactNode;\n resetText?: ReactNode;\n };\n}\n\n/**\n * DataTable is a composable, high-level table that brings together search, filters,\n * column visibility management, header actions, exporting, and pagination.\n * It renders `MyTable` for rows and, when enabled, shows header controls and a footer with pagination.\n *\n * Generic Types\n * - `TData` — Row data shape (type of each item in the rows array).\n * - `TPaginationData` — Pagination wrapper type containing rows and pagination meta; defaults to\n * `PaginationInterface<TData>`.\n *\n * Key Behaviors\n * - Emits `onParamChange` when search text, filters, page, limit, or sort order change.\n * - Persists column visibility per `tableKey` via `useColumns` and informs parent with `onColumnsUpdate`.\n * - Renders header controls only when the related feature is enabled/has content.\n *\n * Props Overview\n * - `dataSource` — Paginated data source object that contains rows (see `dataKey`) and pagination metadata.\n * - `columns` — Column definitions passed to `MyTable`.\n * - `onRowClick` — Callback when a row is clicked.\n * - `rowKey` — Property name used as a unique row key.\n * - `hasNumbers` — Whether to show the row numbers column.\n * - `hasSearch` — Set to `true` to display the search input in the header.\n * - `exportOptions` — Export menu options shown by `ExportData` (see `ExportDataInterface[]`).\n * - `exportLoading` — When `true`, shows a spinner in the Export button to indicate an export action is in progress.\n * - `hasCheckbox` — Whether to show the selection checkbox column.\n * - `hasPagination` — Set to `true` to render the pagination footer.\n * - `isStickyHeader` — Whether to keep the table header sticky.\n * - `onParamChange` — Emits parameter changes for pagination/sorting/search/filters.\n * - `dataKey` — Key within `dataSource` that contains the row array. Defaults to `\"docs\"`.\n * - `loading` — If `true`, shows a loading state instead of the table rows.\n * - `tableKey` — Unique key for persisting column visibility state.\n * - `filters` — Filter configurations to render in the header.\n * - `actions` — Header actions independent of selected rows.\n * - `handleFilterChange` — Callback executed when filter values change.\n * - `params` — Current list parameters (pagination, sort, search, filters).\n * - `hasColumnsVisibilityDropdown` — Set to `true` to show the columns customize dropdown.\n * - `onColumnsUpdate` — Notifies parent whenever the internal columns state changes (after formatting/visibility).\n * - `actionProps` — Props passed to the `Actions` component.\n * - `filterWrapperProps` — Props passed to the `FilterWrapper` component.\n * - `exportOptionsProps` — Props passed to the `ExportData` component.\n * - `columnsVisibilityProps` — Props passed to the columns visibility dropdown.\n * - `onSelectedItemsChange` — Callback when selected rows change (requires `hasCheckbox`).\n *\n * Accessibility\n * - Header controls and dropdowns reuse shared primitives that include keyboard and ARIA support.\n *\n * Internationalization\n * - Text such as \"Export\", \"Customize columns\", and \"Reset columns\" are resolved via `react-i18next`.\n *\n * Usage Examples\n * 1) Minimal paginated table (uses default `dataKey = \"docs\"`)\n * ```tsx\n * type User = { id: string; name: string };\n * const data = { docs: [{ id: '1', name: 'Ada' }], page: 1, limit: 10, totalPages: 1 };\n *\n * <DataTable<User>\n * tableKey=\"users-table\"\n * columns={[{ key: 'name', name: 'Name' }]}\n * rowKey=\"id\"\n * dataSource={data}\n * hasPagination\n * />\n * ```\n *\n * 2) Custom `dataKey` and column visibility persistence\n * ```tsx\n * type Row = { id: number; title: string };\n * const payload = { items: [{ id: 1, title: 'Hello' }], page: 1, limit: 20, totalPages: 1 };\n *\n * <DataTable<Row>\n * tableKey=\"posts\"\n * columns={[{ key: 'title', name: 'Title' }]}\n * rowKey=\"id\"\n * dataSource={payload}\n * dataKey=\"items\"\n * hasColumnsVisibilityDropdown\n * />\n * ```\n *\n * 3) Responding to user interactions via `onParamChange`\n * ```tsx\n * const [params, setParams] = useState({ page: 1, limit: 10 });\n *\n * <DataTable\n * tableKey=\"logs\"\n * columns={[{ key: 'message', name: 'Message' }]}\n * rowKey=\"id\"\n * params={params}\n * onParamChange={setParams}\n * hasSearch\n * hasPagination\n * />\n * ```\n *\n * Notes and Best Practices\n * - Ensure `rowKey` points to a stable unique field in `TData` to avoid key collisions.\n * - When arrays like `exportOptions`, `filters`, or `actions` are empty, their sections are not rendered.\n * - Sorting emits `{ sortField, sortOrder }` through `onParamChange` when the user toggles a column sort.\n *\n * Returns\n * - React element that renders a complete data table experience.\n */\nexport const DataTable = <\n TData,\n TPaginationData extends PaginationInterface<TData> =\n PaginationInterface<TData>,\n>({\n dataSource,\n columns,\n onRowClick,\n rowKey,\n hasNumbers,\n hasSearch,\n exportOptions,\n hasCheckbox,\n hasPagination,\n isStickyHeader,\n onParamChange,\n dataKey = 'docs',\n loading,\n tableKey,\n filters,\n actions,\n handleFilterChange,\n params,\n exportLoading = false,\n onColumnsUpdate,\n hasColumnsVisibilityDropdown,\n onSelectedItemsChange,\n actionProps,\n filterWrapperProps,\n exportOptionsProps,\n columnsVisibilityProps,\n paginationProps,\n searchProps,\n ...props\n}: DataTableProps<TData, TPaginationData>) => {\n const { t } = useTranslation();\n const [selectedRows, setSelectedRows] = useState<TData[keyof TData][]>([]);\n const { formattedColumns, handleColumnsChange, resetColumns } =\n useColumns<TData>({ key: tableKey, columns });\n\n useEffect(() => {\n onColumnsUpdate?.(formattedColumns);\n }, [formattedColumns, onColumnsUpdate]);\n\n useEffect(() => {\n onSelectedItemsChange?.(selectedRows);\n }, [selectedRows, onSelectedItemsChange]);\n\n return (\n <div\n className={\n 'border-border-alpha-light flex grow flex-col overflow-auto rounded-xl border shadow-xs'\n }\n >\n {(hasSearch ||\n (hasColumnsVisibilityDropdown && tableKey) ||\n !isEmpty(exportOptions) ||\n !isEmpty(filters)) && (\n <div className=\"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row\">\n <div className={'w-full shrink'}>\n {hasSearch && (\n <Search\n {...searchProps}\n inputProps={{\n ...searchProps?.inputProps,\n className: cn('h-8', searchProps?.inputProps?.className),\n }}\n className={cn(\n 'max-w-78 [&_button]:-top-1',\n searchProps?.className\n )}\n defaultValue={get(params, 'search', '') as string}\n onSearchChange={(search) =>\n onParamChange?.({ ...params, search, page: 1 })\n }\n />\n )}\n </div>\n <div className={'flex shrink-0 items-center justify-end gap-3'}>\n {exportOptions && (\n <ExportData\n {...exportOptionsProps}\n options={exportOptions}\n loading={exportLoading}\n />\n )}\n {hasColumnsVisibilityDropdown && tableKey && (\n <DropdownMenu>\n <DropdownMenuTrigger\n asChild\n {...columnsVisibilityProps?.triggerProps}\n >\n <Button\n variant=\"secondary\"\n size={'sm'}\n className={'ml-auto rounded-lg px-3'}\n >\n {columnsVisibilityProps?.title || (\n <>\n <RiLayoutColumnLine />{' '}\n <span className={'hidden lg:inline!'}>\n {t('Customize columns')}\n </span>\n <RiArrowDownSLine />\n </>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n {...columnsVisibilityProps?.contentProps}\n >\n <DropdownMenuItem\n className=\"capitalize\"\n onClick={resetColumns}\n >\n <RefreshCw />{' '}\n {columnsVisibilityProps?.resetText || t('Reset columns')}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n {formattedColumns.map((column) => {\n return (\n <DropdownMenuCheckboxItem\n key={column.key}\n className=\"capitalize\"\n checked={!column.hidden}\n onCheckedChange={(value) =>\n handleColumnsChange(column, !value)\n }\n >\n {column.name}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {actions && <Actions {...actionProps} actions={actions} />}\n {filters && (\n <FilterWrapper\n {...filterWrapperProps}\n filters={filters}\n params={params}\n onChange={handleFilterChange}\n onFilter={(filter) => {\n onParamChange?.({ ...filter, page: 1 });\n handleFilterChange?.(filter);\n }}\n />\n )}\n </div>\n </div>\n )}\n <div className={'flex flex-col overflow-auto border-y'}>\n {!loading ? (\n <MyTable<TData>\n {...props}\n params={{\n page: dataSource?.page || 1,\n limit: dataSource?.limit,\n ...params,\n }}\n rows={get(dataSource, dataKey, []) as TData[]}\n rowKey={rowKey}\n selectedItems={selectedRows}\n isStickyHeader={isStickyHeader}\n columns={formattedColumns}\n hasCheckbox={hasCheckbox}\n hasNumbers={hasNumbers}\n onRowClick={onRowClick}\n onSelectedItemsChange={setSelectedRows}\n onSortOrderChange={({ sortField, sortOrder }) => {\n onParamChange?.({ ...params, sortField, sortOrder });\n }}\n />\n ) : (\n <Loader />\n )}\n </div>\n {hasPagination && (\n <div className=\"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row\">\n <div className=\"text-sm\">\n <MyLimitSelect\n onLimitChange={(limit) =>\n onParamChange?.({ ...params, limit, page: 1 })\n }\n defaultValue={dataSource?.limit}\n />\n </div>\n <div className=\"text-muted-foreground text-sm\">\n {t('{{selectedCount}} of {{total}} row(s) selected', {\n selectedCount: selectedRows.length,\n total: dataSource?.total || 0,\n })}\n </div>\n <div>\n <MyPagination\n {...paginationProps}\n onPageChange={(page) => onParamChange?.({ ...params, page })}\n currentPage={dataSource?.page}\n totalPages={dataSource?.totalPages}\n />\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":["MyTable","rows","columns","onRowClick","rowKey","params","DEFAULT_LIMIT","hasNumbers","hasCheckbox","selectedItems","onSelectedItemsChange","onSortOrderChange","isStickyHeader","className","props","sortObject","handleSort","useSortable","selectedRows","isRowSelected","isAllRowsSelected","handleSelectAllRows","handleSelectRow","useDataTable","useEffect","jsxs","Table","cn","jsx","TableHeader","TableRow","TableHead","Checkbox","value","column","Fragment","SortOrder","ArrowDownWideNarrow","ArrowUpWideNarrow","ArrowUpDown","TableBody","row","index","TableCell","evt","get","Empty","DataTable","dataSource","hasSearch","exportOptions","hasPagination","onParamChange","dataKey","loading","tableKey","filters","actions","handleFilterChange","exportLoading","onColumnsUpdate","hasColumnsVisibilityDropdown","actionProps","filterWrapperProps","exportOptionsProps","columnsVisibilityProps","paginationProps","searchProps","t","useTranslation","setSelectedRows","useState","formattedColumns","handleColumnsChange","resetColumns","useColumns","isEmpty","Search","_a","search","ExportData","DropdownMenu","DropdownMenuTrigger","Button","RiLayoutColumnLine","RiArrowDownSLine","DropdownMenuContent","DropdownMenuItem","RefreshCw","DropdownMenuSeparator","DropdownMenuCheckboxItem","Actions","FilterWrapper","filter","Loader","sortField","sortOrder","MyLimitSelect","limit","MyPagination","page"],"mappings":"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"}
@@ -7,11 +7,11 @@ import { l as A } from "../../chunks/lodash-CRDOWzbs.es.js";
7
7
  import { ArrowDownWideNarrow as ie, ArrowUpWideNarrow as re, ArrowUpDown as se, RefreshCw as Ne } from "lucide-react";
8
8
  import { useEffect as q, useState as xe } from "react";
9
9
  import { useTranslation as ne } from "react-i18next";
10
- import { u as we, a as ce, b as pe } from "../../chunks/useSortable-BXNk8Wth.es.js";
10
+ import { u as pe, a as we, b as ce } from "../../chunks/useSortable-BXNk8Wth.es.js";
11
11
  import { A as ge } from "../../chunks/Actions-25X7c3Kg.es.js";
12
12
  import { E as ke } from "../../chunks/ExportData-Cuy6BvoM.es.js";
13
- import { S as ve, F as Te } from "../../chunks/Search-0PkBZIDP.es.js";
14
- import { L as me } from "../../chunks/Loader-zvzAi0F6.es.js";
13
+ import { S as ve, F as me } from "../../chunks/Search-I3lwE0J6.es.js";
14
+ import { L as Te } from "../../chunks/Loader-zvzAi0F6.es.js";
15
15
  import { D as Q, M as De, a as he } from "../../chunks/MyPagination-B0czoGZK.es.js";
16
16
  import { Checkbox as X } from "dgz-ui/form";
17
17
  import { Table as Me, TableHeader as Ee, TableRow as O, TableHead as j, TableBody as Ae, TableCell as W } from "dgz-ui/table";
@@ -19,9 +19,9 @@ import { S as Y } from "../../chunks/SortOrder-CwuehjY1.es.js";
19
19
  import { E as ze } from "../../chunks/Empty-BReVQKje.es.js";
20
20
  const Le = ({
21
21
  rows: t = [],
22
- columns: p,
23
- onRowClick: m,
24
- rowKey: c,
22
+ columns: c,
23
+ onRowClick: T,
24
+ rowKey: w,
25
25
  params: x = {
26
26
  page: 1,
27
27
  limit: Q
@@ -35,17 +35,17 @@ const Le = ({
35
35
  className: B,
36
36
  ...H
37
37
  }) => {
38
- const { sortObject: r, handleSort: L } = we({
38
+ const { sortObject: r, handleSort: L } = pe({
39
39
  sortField: x == null ? void 0 : x.sortField,
40
40
  sortOrder: x == null ? void 0 : x.sortOrder,
41
41
  onSortOrderChange: $
42
42
  }), {
43
43
  selectedRows: k,
44
44
  isRowSelected: v,
45
- isAllRowsSelected: n,
45
+ isAllRowsSelected: p,
46
46
  handleSelectAllRows: J,
47
47
  handleSelectRow: M
48
- } = ce({ rows: t, defaultSelectedRows: z });
48
+ } = we({ rows: t, defaultSelectedRows: z });
49
49
  return q(() => {
50
50
  JSON.stringify(z) !== JSON.stringify(k) && k && (h == null || h(k));
51
51
  }, [k, z, h]), /* @__PURE__ */ s(Me, { ...H, className: E("relative", B), children: [
@@ -58,13 +58,13 @@ const Le = ({
58
58
  X,
59
59
  {
60
60
  className: "mt-1",
61
- checked: n(c),
62
- onCheckedChange: (l) => J(c, !!l),
61
+ checked: p(w),
62
+ onCheckedChange: (l) => J(w, !!l),
63
63
  "aria-label": "Select all"
64
64
  }
65
65
  ) }),
66
66
  D && /* @__PURE__ */ e(j, { className: "w-12 p-2", children: "#" }),
67
- p.filter((l) => !l.hidden).map((l) => /* @__PURE__ */ e(
67
+ c.filter((l) => !l.hidden).map((l) => /* @__PURE__ */ e(
68
68
  j,
69
69
  {
70
70
  style: l.styles,
@@ -84,12 +84,12 @@ const Le = ({
84
84
  ] })
85
85
  }
86
86
  ),
87
- /* @__PURE__ */ e(Ae, { className: "[&>tr:nth-child(even)]:bg-bg-secondary", children: t.length ? t.map((l, T) => /* @__PURE__ */ s(
87
+ /* @__PURE__ */ e(Ae, { className: "[&>tr:nth-child(even)]:bg-bg-secondary", children: t.length ? t.map((l, m) => /* @__PURE__ */ s(
88
88
  O,
89
89
  {
90
- onClick: () => m == null ? void 0 : m(l),
91
- className: E(m && "cursor-pointer"),
92
- "data-state": v(l[c]) && "selected",
90
+ onClick: () => T == null ? void 0 : T(l),
91
+ className: E(T && "cursor-pointer"),
92
+ "data-state": v(l[w]) && "selected",
93
93
  children: [
94
94
  g && /* @__PURE__ */ e(
95
95
  W,
@@ -100,39 +100,39 @@ const Le = ({
100
100
  X,
101
101
  {
102
102
  className: "mt-1",
103
- checked: v(l[c]),
104
- onCheckedChange: (i) => M(l[c], !!i),
103
+ checked: v(l[w]),
104
+ onCheckedChange: (i) => M(l[w], !!i),
105
105
  "aria-label": "Select row"
106
106
  }
107
107
  )
108
108
  }
109
109
  ),
110
- D && /* @__PURE__ */ e(W, { className: "w-12 p-2", children: (x.page - 1) * (x.limit || Q) + T + 1 }),
111
- p.filter((i) => !i.hidden).map((i) => /* @__PURE__ */ e(
110
+ D && /* @__PURE__ */ e(W, { className: "w-12 p-2", children: (x.page - 1) * (x.limit || Q) + m + 1 }),
111
+ c.filter((i) => !i.hidden).map((i) => /* @__PURE__ */ e(
112
112
  W,
113
113
  {
114
114
  className: "text-body-xs-medium max-w-xs p-2",
115
115
  style: i.styles,
116
116
  children: i.render ? i.render(A.get(l, i.dataIndex), l) : A.get(l, i.dataIndex, "")
117
117
  },
118
- `${T}-${i.key}`
118
+ `${m}-${i.key}`
119
119
  ))
120
120
  ]
121
121
  },
122
- `${l[c]}`
122
+ `${l[w]}`
123
123
  )) : /* @__PURE__ */ e(O, { children: /* @__PURE__ */ e(
124
124
  W,
125
125
  {
126
- colSpan: D ? g ? p.length + 2 : p.length + 1 : p.length,
126
+ colSpan: D ? g ? c.length + 2 : c.length + 1 : c.length,
127
127
  children: /* @__PURE__ */ e(ze, {})
128
128
  }
129
129
  ) }) })
130
130
  ] });
131
131
  }, oe = ({
132
132
  dataSource: t,
133
- columns: p,
134
- onRowClick: m,
135
- rowKey: c,
133
+ columns: c,
134
+ onRowClick: T,
135
+ rowKey: w,
136
136
  hasNumbers: x,
137
137
  hasSearch: D,
138
138
  exportOptions: g,
@@ -146,26 +146,26 @@ const Le = ({
146
146
  filters: L,
147
147
  actions: k,
148
148
  handleFilterChange: v,
149
- params: n,
149
+ params: p,
150
150
  exportLoading: J = !1,
151
151
  onColumnsUpdate: M,
152
152
  hasColumnsVisibilityDropdown: l,
153
- onSelectedItemsChange: T,
153
+ onSelectedItemsChange: m,
154
154
  actionProps: i,
155
155
  filterWrapperProps: b,
156
156
  exportOptionsProps: U,
157
157
  columnsVisibilityProps: N,
158
158
  paginationProps: o,
159
- searchProps: w,
159
+ searchProps: n,
160
160
  ...I
161
161
  }) => {
162
162
  var G;
163
- const { t: _ } = ne(), [R, K] = xe([]), { formattedColumns: F, handleColumnsChange: a, resetColumns: S } = pe({ key: r, columns: p });
163
+ const { t: _ } = ne(), [R, K] = xe([]), { formattedColumns: F, handleColumnsChange: a, resetColumns: S } = ce({ key: r, columns: c });
164
164
  return q(() => {
165
165
  M == null || M(F);
166
166
  }, [F, M]), q(() => {
167
- T == null || T(R);
168
- }, [R, T]), /* @__PURE__ */ s(
167
+ m == null || m(R);
168
+ }, [R, m]), /* @__PURE__ */ s(
169
169
  "div",
170
170
  {
171
171
  className: "border-border-alpha-light flex grow flex-col overflow-auto rounded-xl border shadow-xs",
@@ -174,17 +174,17 @@ const Le = ({
174
174
  /* @__PURE__ */ e("div", { className: "w-full shrink", children: D && /* @__PURE__ */ e(
175
175
  ve,
176
176
  {
177
- ...w,
177
+ ...n,
178
178
  inputProps: {
179
- ...w == null ? void 0 : w.inputProps,
180
- className: E("h-8", (G = w == null ? void 0 : w.inputProps) == null ? void 0 : G.className)
179
+ ...n == null ? void 0 : n.inputProps,
180
+ className: E("h-8", (G = n == null ? void 0 : n.inputProps) == null ? void 0 : G.className)
181
181
  },
182
182
  className: E(
183
183
  "max-w-78 [&_button]:-top-1",
184
- w == null ? void 0 : w.className
184
+ n == null ? void 0 : n.className
185
185
  ),
186
- defaultValue: A.get(n, "search", ""),
187
- onSearchChange: (f) => d == null ? void 0 : d({ ...n, search: f, page: 1 })
186
+ defaultValue: A.get(p, "search", ""),
187
+ onSearchChange: (f) => d == null ? void 0 : d({ ...p, search: f, page: 1 })
188
188
  }
189
189
  ) }),
190
190
  /* @__PURE__ */ s("div", { className: "flex shrink-0 items-center justify-end gap-3", children: [
@@ -253,39 +253,39 @@ const Le = ({
253
253
  ] }),
254
254
  k && /* @__PURE__ */ e(ge, { ...i, actions: k }),
255
255
  L && /* @__PURE__ */ e(
256
- Te,
256
+ me,
257
257
  {
258
258
  ...b,
259
259
  filters: L,
260
- params: n,
260
+ params: p,
261
261
  onChange: v,
262
262
  onFilter: (f) => {
263
- d == null || d({ ...n, ...f, page: 1 }), v == null || v(f);
263
+ d == null || d({ ...f, page: 1 }), v == null || v(f);
264
264
  }
265
265
  }
266
266
  )
267
267
  ] })
268
268
  ] }),
269
- /* @__PURE__ */ e("div", { className: "flex flex-col overflow-auto border-y", children: H ? /* @__PURE__ */ e(me, {}) : /* @__PURE__ */ e(
269
+ /* @__PURE__ */ e("div", { className: "flex flex-col overflow-auto border-y", children: H ? /* @__PURE__ */ e(Te, {}) : /* @__PURE__ */ e(
270
270
  Le,
271
271
  {
272
272
  ...I,
273
273
  params: {
274
274
  page: (t == null ? void 0 : t.page) || 1,
275
275
  limit: t == null ? void 0 : t.limit,
276
- ...n
276
+ ...p
277
277
  },
278
278
  rows: A.get(t, B, []),
279
- rowKey: c,
279
+ rowKey: w,
280
280
  selectedItems: R,
281
281
  isStickyHeader: $,
282
282
  columns: F,
283
283
  hasCheckbox: z,
284
284
  hasNumbers: x,
285
- onRowClick: m,
285
+ onRowClick: T,
286
286
  onSelectedItemsChange: K,
287
287
  onSortOrderChange: ({ sortField: f, sortOrder: y }) => {
288
- d == null || d({ ...n, sortField: f, sortOrder: y });
288
+ d == null || d({ ...p, sortField: f, sortOrder: y });
289
289
  }
290
290
  }
291
291
  ) }),
@@ -293,7 +293,7 @@ const Le = ({
293
293
  /* @__PURE__ */ e("div", { className: "text-sm", children: /* @__PURE__ */ e(
294
294
  De,
295
295
  {
296
- onLimitChange: (f) => d == null ? void 0 : d({ ...n, limit: f, page: 1 }),
296
+ onLimitChange: (f) => d == null ? void 0 : d({ ...p, limit: f, page: 1 }),
297
297
  defaultValue: t == null ? void 0 : t.limit
298
298
  }
299
299
  ) }),
@@ -305,7 +305,7 @@ const Le = ({
305
305
  he,
306
306
  {
307
307
  ...o,
308
- onPageChange: (f) => d == null ? void 0 : d({ ...n, page: f }),
308
+ onPageChange: (f) => d == null ? void 0 : d({ ...p, page: f }),
309
309
  currentPage: t == null ? void 0 : t.page,
310
310
  totalPages: t == null ? void 0 : t.totalPages
311
311
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../../../src/components/datatable/MyTable.tsx","../../../src/components/datatable/DataTable.tsx"],"sourcesContent":["import { Checkbox } from 'dgz-ui/form';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from 'dgz-ui/table';\nimport { cn } from 'dgz-ui/utils';\nimport { get } from 'lodash';\nimport {\n ArrowDownWideNarrow,\n ArrowUpDown,\n ArrowUpWideNarrow,\n} from 'lucide-react';\nimport { type ComponentProps, useEffect } from 'react';\nimport { SortOrder } from '../../enums';\nimport { useDataTable, useSortable, type UseSortableProps } from '../../hooks';\nimport type { ColumnType } from '../../types';\nimport { Empty } from '../empty';\nimport { DEFAULT_LIMIT } from '../pagination/MyLimitSelect';\n\n/**\n * Props for the MyTable component.\n * @template TData - The type of data in the table.\n */\nexport interface MyTableProps<TData> extends ComponentProps<'table'> {\n /** Array of data rows to display. */\n rows?: TData[];\n /** Column definitions. */\n columns: ColumnType<TData>[];\n /** Callback when a row is clicked. */\n onRowClick?: (row: TData) => void;\n /** Whether to show row numbers. */\n hasNumbers?: boolean;\n /** Whether to show selection checkboxes. */\n hasCheckbox?: boolean;\n /** Unique key for each row. */\n rowKey: keyof TData;\n /** Current table parameters (page, limit, sort). */\n params?: Record<string, unknown>;\n /** Total number of items (optional, often used with pagination context). */\n total?: number;\n /** Array of currently selected item keys. */\n selectedItems?: TData[keyof TData][];\n /** Callback when selected items change. */\n onSelectedItemsChange?: (selectedItems: TData[keyof TData][]) => void;\n /** Callback when sort order changes. */\n onSortOrderChange?: (\n params: Omit<UseSortableProps<TData>, 'onSortOrderChange'>\n ) => void;\n /** Whether the header should stick to the top. */\n isStickyHeader?: true;\n}\n\n/**\n * MyTable renders a generic data table with optional numbering, selection checkboxes,\n * sortable columns and sticky header. It is a presentational component and delegates\n * sorting/selection state via hooks and callbacks.\n *\n * @template TData - The row data type.\n * @param props - Component props.\n * @returns React element containing the table.\n */\nexport const MyTable = <TData,>({\n rows = [],\n columns,\n onRowClick,\n rowKey,\n params = {\n page: 1,\n limit: DEFAULT_LIMIT,\n },\n hasNumbers = false,\n hasCheckbox = false,\n selectedItems,\n onSelectedItemsChange,\n onSortOrderChange,\n isStickyHeader,\n className,\n ...props\n}: MyTableProps<TData>) => {\n const { sortObject, handleSort } = useSortable<TData>({\n sortField: params?.sortField as keyof TData | undefined,\n sortOrder: params?.sortOrder as SortOrder | undefined,\n onSortOrderChange,\n });\n const {\n selectedRows,\n isRowSelected,\n isAllRowsSelected,\n handleSelectAllRows,\n handleSelectRow,\n } = useDataTable<TData>({ rows, defaultSelectedRows: selectedItems });\n\n useEffect(() => {\n if (\n JSON.stringify(selectedItems) !== JSON.stringify(selectedRows) &&\n selectedRows\n ) {\n onSelectedItemsChange?.(selectedRows);\n }\n }, [selectedRows, selectedItems, onSelectedItemsChange]);\n\n return (\n <Table {...props} className={cn('relative', className)}>\n <TableHeader\n className={cn('bg-bg', isStickyHeader && 'sticky top-0 z-1')}\n >\n <TableRow>\n {hasCheckbox && (\n <TableHead className={'w-12 p-3'}>\n <Checkbox\n className={'mt-1'}\n checked={isAllRowsSelected(rowKey)}\n onCheckedChange={(value) =>\n handleSelectAllRows(rowKey, !!value)\n }\n aria-label=\"Select all\"\n />\n </TableHead>\n )}\n {hasNumbers && <TableHead className={'w-12 p-2'}>#</TableHead>}\n {columns\n .filter((column) => !column.hidden)\n .map((column) => (\n <TableHead\n key={column.key}\n style={column.styles}\n className={cn('p-2', column.sortable && 'cursor-pointer')}\n onClick={() => column.sortable && handleSort(column.dataIndex)}\n >\n <div className={'flex items-center gap-2'}>\n {column.name}{' '}\n {column.sortable &&\n (sortObject?.sortField === column.key ? (\n <>\n {sortObject?.sortOrder === SortOrder.DESC && (\n <ArrowDownWideNarrow size={15} />\n )}\n {sortObject?.sortOrder === SortOrder.ASC && (\n <ArrowUpWideNarrow size={15} />\n )}\n </>\n ) : (\n <ArrowUpDown size={15} />\n ))}\n </div>\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody className={'[&>tr:nth-child(even)]:bg-bg-secondary'}>\n {rows.length ? (\n rows.map((row, index) => (\n <TableRow\n key={`${row[rowKey]}`}\n onClick={() => onRowClick?.(row)}\n className={cn(onRowClick && 'cursor-pointer')}\n data-state={isRowSelected(row[rowKey]) && 'selected'}\n >\n {hasCheckbox && (\n <TableCell\n className={'w-12 p-3'}\n onClick={(evt) => evt.stopPropagation()}\n >\n <Checkbox\n className={'mt-1'}\n checked={isRowSelected(row[rowKey])}\n onCheckedChange={(value) =>\n handleSelectRow(row[rowKey], !!value)\n }\n aria-label=\"Select row\"\n />\n </TableCell>\n )}\n {hasNumbers && (\n <TableCell className={'w-12 p-2'}>\n {((params.page as number) - 1) *\n ((params.limit || DEFAULT_LIMIT) as number) +\n index +\n 1}\n </TableCell>\n )}\n {columns\n .filter((column) => !column.hidden)\n .map((column) => (\n <TableCell\n className={'text-body-xs-medium max-w-xs p-2'}\n style={column.styles}\n key={`${index}-${column.key}`}\n >\n {column.render\n ? column.render(get(row, column.dataIndex), row)\n : get(row, column.dataIndex, '')}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell\n colSpan={\n hasNumbers\n ? hasCheckbox\n ? columns.length + 2\n : columns.length + 1\n : columns.length\n }\n >\n <Empty />\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n );\n};\n","import { RiArrowDownSLine, RiLayoutColumnLine } from '@remixicon/react';\nimport { Button } from 'dgz-ui/button';\nimport {\n type DropdownContainerProps,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'dgz-ui/dropdown';\nimport { cn } from 'dgz-ui/utils';\nimport { get, isEmpty } from 'lodash';\nimport { RefreshCw } from 'lucide-react';\nimport { type ReactNode, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useColumns } from '../../hooks';\nimport type { ColumnType } from '../../types';\nimport { type ActionInterface, Actions, type ActionsProps } from '../actions';\nimport {\n ExportData,\n type ExportDataInterface,\n type ExportDataProps,\n} from '../export';\nimport {\n type FilterInterface,\n FilterWrapper,\n type FilterWrapperProps,\n Search,\n type SearchProps,\n} from '../filters';\nimport { Loader } from '../loader';\nimport { MyLimitSelect, MyPagination } from '../pagination';\nimport type { MyPaginationProps } from '../pagination/MyPagination.tsx';\nimport { MyTable, type MyTableProps } from './MyTable';\n\n/**\n * Minimal pagination wrapper contract used by `DataTable`.\n *\n * Notes\n * - Only `page`, `limit`, and `totalPages` are required. Other fields are optional and\n * may be provided by your API for convenience.\n * - The actual rows array can be stored in any key, controlled via `dataKey` prop\n * (defaults to `\"docs\"`).\n */\nexport interface PaginationInterface<TData> {\n /** Array of rows for the current page. Used when `dataKey` is set to `\"docs\"`. */\n docs?: TData[];\n /** Zero-based index of the first item on the current page (if provided by API). */\n offset?: number;\n /** Page size (items per page). */\n limit: number;\n /** Total number of pages available. */\n totalPages: number;\n /** Total number of items across all pages (if available). */\n total?: number;\n /** Current page number (1-based). */\n page: number;\n /** Convenience counter for the first item index on the page (if provided). */\n pagingCounter?: number;\n /** Whether a previous page exists. */\n hasPrevPage?: boolean;\n /** Whether a next page exists. */\n hasNextPage?: boolean;\n /** Previous page number, if available. */\n prevPage?: number;\n /** Next page number, if available. */\n nextPage?: number;\n}\n\n/**\n * Props for the DataTable component.\n *\n * @template TData - Row data type.\n * @template TPaginationData - Pagination wrapper type.\n */\nexport interface DataTableProps<\n TData,\n TPaginationData extends PaginationInterface<TData>,\n> extends Omit<MyTableProps<TData>, 'rows'> {\n /** Pagination data source. */\n dataSource?: TPaginationData;\n /** Callback for parameter changes (pagination, sorting, filtering). */\n onParamChange?: (param: Record<string, unknown>) => void;\n /** Whether to enable pagination. */\n hasPagination?: true;\n /** Options for the export data dropdown. */\n exportOptions?: ExportDataInterface[];\n /** Whether to enable search functionality. */\n hasSearch?: true;\n /** Whether the table data is loading. */\n loading?: boolean;\n /** Array of filters to display. */\n filters?: FilterInterface[];\n /** Array of actions to display. */\n actions?: ActionInterface[];\n /** Callback for filter changes. */\n handleFilterChange?: (filters: Record<string, unknown>) => void;\n /** Unique key for the table, used for column persistence. */\n tableKey: string;\n /** The key in dataSource where the data array is located. Defaults to \"docs\". */\n dataKey?: keyof TPaginationData;\n /** Whether to show the columns visibility dropdown. */\n hasColumnsVisibilityDropdown?: true;\n /** Callback when columns are updated (e.g., visibility toggled). */\n onColumnsUpdate?: (columns: ColumnType<TData>[]) => void;\n /** Whether the export action is loading. */\n exportLoading?: boolean;\n /** Props for the Actions component. */\n actionProps?: Partial<ActionsProps>;\n /** Props for the FilterWrapper component. */\n filterWrapperProps?: Partial<FilterWrapperProps>;\n /** Props for the ExportData component. */\n exportOptionsProps?: Partial<ExportDataProps>;\n searchProps?: Partial<SearchProps>;\n paginationProps?: Partial<MyPaginationProps>;\n /** Props for the columns visibility dropdown. */\n columnsVisibilityProps?: DropdownContainerProps & {\n title?: ReactNode;\n resetText?: ReactNode;\n };\n}\n\n/**\n * DataTable is a composable, high-level table that brings together search, filters,\n * column visibility management, header actions, exporting, and pagination.\n * It renders `MyTable` for rows and, when enabled, shows header controls and a footer with pagination.\n *\n * Generic Types\n * - `TData` — Row data shape (type of each item in the rows array).\n * - `TPaginationData` — Pagination wrapper type containing rows and pagination meta; defaults to\n * `PaginationInterface<TData>`.\n *\n * Key Behaviors\n * - Emits `onParamChange` when search text, filters, page, limit, or sort order change.\n * - Persists column visibility per `tableKey` via `useColumns` and informs parent with `onColumnsUpdate`.\n * - Renders header controls only when the related feature is enabled/has content.\n *\n * Props Overview\n * - `dataSource` — Paginated data source object that contains rows (see `dataKey`) and pagination metadata.\n * - `columns` — Column definitions passed to `MyTable`.\n * - `onRowClick` — Callback when a row is clicked.\n * - `rowKey` — Property name used as a unique row key.\n * - `hasNumbers` — Whether to show the row numbers column.\n * - `hasSearch` — Set to `true` to display the search input in the header.\n * - `exportOptions` — Export menu options shown by `ExportData` (see `ExportDataInterface[]`).\n * - `exportLoading` — When `true`, shows a spinner in the Export button to indicate an export action is in progress.\n * - `hasCheckbox` — Whether to show the selection checkbox column.\n * - `hasPagination` — Set to `true` to render the pagination footer.\n * - `isStickyHeader` — Whether to keep the table header sticky.\n * - `onParamChange` — Emits parameter changes for pagination/sorting/search/filters.\n * - `dataKey` — Key within `dataSource` that contains the row array. Defaults to `\"docs\"`.\n * - `loading` — If `true`, shows a loading state instead of the table rows.\n * - `tableKey` — Unique key for persisting column visibility state.\n * - `filters` — Filter configurations to render in the header.\n * - `actions` — Header actions independent of selected rows.\n * - `handleFilterChange` — Callback executed when filter values change.\n * - `params` — Current list parameters (pagination, sort, search, filters).\n * - `hasColumnsVisibilityDropdown` — Set to `true` to show the columns customize dropdown.\n * - `onColumnsUpdate` — Notifies parent whenever the internal columns state changes (after formatting/visibility).\n * - `actionProps` — Props passed to the `Actions` component.\n * - `filterWrapperProps` — Props passed to the `FilterWrapper` component.\n * - `exportOptionsProps` — Props passed to the `ExportData` component.\n * - `columnsVisibilityProps` — Props passed to the columns visibility dropdown.\n * - `onSelectedItemsChange` — Callback when selected rows change (requires `hasCheckbox`).\n *\n * Accessibility\n * - Header controls and dropdowns reuse shared primitives that include keyboard and ARIA support.\n *\n * Internationalization\n * - Text such as \"Export\", \"Customize columns\", and \"Reset columns\" are resolved via `react-i18next`.\n *\n * Usage Examples\n * 1) Minimal paginated table (uses default `dataKey = \"docs\"`)\n * ```tsx\n * type User = { id: string; name: string };\n * const data = { docs: [{ id: '1', name: 'Ada' }], page: 1, limit: 10, totalPages: 1 };\n *\n * <DataTable<User>\n * tableKey=\"users-table\"\n * columns={[{ key: 'name', name: 'Name' }]}\n * rowKey=\"id\"\n * dataSource={data}\n * hasPagination\n * />\n * ```\n *\n * 2) Custom `dataKey` and column visibility persistence\n * ```tsx\n * type Row = { id: number; title: string };\n * const payload = { items: [{ id: 1, title: 'Hello' }], page: 1, limit: 20, totalPages: 1 };\n *\n * <DataTable<Row>\n * tableKey=\"posts\"\n * columns={[{ key: 'title', name: 'Title' }]}\n * rowKey=\"id\"\n * dataSource={payload}\n * dataKey=\"items\"\n * hasColumnsVisibilityDropdown\n * />\n * ```\n *\n * 3) Responding to user interactions via `onParamChange`\n * ```tsx\n * const [params, setParams] = useState({ page: 1, limit: 10 });\n *\n * <DataTable\n * tableKey=\"logs\"\n * columns={[{ key: 'message', name: 'Message' }]}\n * rowKey=\"id\"\n * params={params}\n * onParamChange={setParams}\n * hasSearch\n * hasPagination\n * />\n * ```\n *\n * Notes and Best Practices\n * - Ensure `rowKey` points to a stable unique field in `TData` to avoid key collisions.\n * - When arrays like `exportOptions`, `filters`, or `actions` are empty, their sections are not rendered.\n * - Sorting emits `{ sortField, sortOrder }` through `onParamChange` when the user toggles a column sort.\n *\n * Returns\n * - React element that renders a complete data table experience.\n */\nexport const DataTable = <\n TData,\n TPaginationData extends PaginationInterface<TData> =\n PaginationInterface<TData>,\n>({\n dataSource,\n columns,\n onRowClick,\n rowKey,\n hasNumbers,\n hasSearch,\n exportOptions,\n hasCheckbox,\n hasPagination,\n isStickyHeader,\n onParamChange,\n dataKey = 'docs',\n loading,\n tableKey,\n filters,\n actions,\n handleFilterChange,\n params,\n exportLoading = false,\n onColumnsUpdate,\n hasColumnsVisibilityDropdown,\n onSelectedItemsChange,\n actionProps,\n filterWrapperProps,\n exportOptionsProps,\n columnsVisibilityProps,\n paginationProps,\n searchProps,\n ...props\n}: DataTableProps<TData, TPaginationData>) => {\n const { t } = useTranslation();\n const [selectedRows, setSelectedRows] = useState<TData[keyof TData][]>([]);\n const { formattedColumns, handleColumnsChange, resetColumns } =\n useColumns<TData>({ key: tableKey, columns });\n\n useEffect(() => {\n onColumnsUpdate?.(formattedColumns);\n }, [formattedColumns, onColumnsUpdate]);\n\n useEffect(() => {\n onSelectedItemsChange?.(selectedRows);\n }, [selectedRows, onSelectedItemsChange]);\n\n return (\n <div\n className={\n 'border-border-alpha-light flex grow flex-col overflow-auto rounded-xl border shadow-xs'\n }\n >\n {(hasSearch ||\n (hasColumnsVisibilityDropdown && tableKey) ||\n !isEmpty(exportOptions) ||\n !isEmpty(filters)) && (\n <div className=\"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row\">\n <div className={'w-full shrink'}>\n {hasSearch && (\n <Search\n {...searchProps}\n inputProps={{\n ...searchProps?.inputProps,\n className: cn('h-8', searchProps?.inputProps?.className),\n }}\n className={cn(\n 'max-w-78 [&_button]:-top-1',\n searchProps?.className\n )}\n defaultValue={get(params, 'search', '') as string}\n onSearchChange={(search) =>\n onParamChange?.({ ...params, search, page: 1 })\n }\n />\n )}\n </div>\n <div className={'flex shrink-0 items-center justify-end gap-3'}>\n {exportOptions && (\n <ExportData\n {...exportOptionsProps}\n options={exportOptions}\n loading={exportLoading}\n />\n )}\n {hasColumnsVisibilityDropdown && tableKey && (\n <DropdownMenu>\n <DropdownMenuTrigger\n asChild\n {...columnsVisibilityProps?.triggerProps}\n >\n <Button\n variant=\"secondary\"\n size={'sm'}\n className={'ml-auto rounded-lg px-3'}\n >\n {columnsVisibilityProps?.title || (\n <>\n <RiLayoutColumnLine />{' '}\n <span className={'hidden lg:inline!'}>\n {t('Customize columns')}\n </span>\n <RiArrowDownSLine />\n </>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n {...columnsVisibilityProps?.contentProps}\n >\n <DropdownMenuItem\n className=\"capitalize\"\n onClick={resetColumns}\n >\n <RefreshCw />{' '}\n {columnsVisibilityProps?.resetText || t('Reset columns')}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n {formattedColumns.map((column) => {\n return (\n <DropdownMenuCheckboxItem\n key={column.key}\n className=\"capitalize\"\n checked={!column.hidden}\n onCheckedChange={(value) =>\n handleColumnsChange(column, !value)\n }\n >\n {column.name}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {actions && <Actions {...actionProps} actions={actions} />}\n {filters && (\n <FilterWrapper\n {...filterWrapperProps}\n filters={filters}\n params={params}\n onChange={handleFilterChange}\n onFilter={(filter) => {\n onParamChange?.({ ...params, ...filter, page: 1 });\n handleFilterChange?.(filter);\n }}\n />\n )}\n </div>\n </div>\n )}\n <div className={'flex flex-col overflow-auto border-y'}>\n {!loading ? (\n <MyTable<TData>\n {...props}\n params={{\n page: dataSource?.page || 1,\n limit: dataSource?.limit,\n ...params,\n }}\n rows={get(dataSource, dataKey, []) as TData[]}\n rowKey={rowKey}\n selectedItems={selectedRows}\n isStickyHeader={isStickyHeader}\n columns={formattedColumns}\n hasCheckbox={hasCheckbox}\n hasNumbers={hasNumbers}\n onRowClick={onRowClick}\n onSelectedItemsChange={setSelectedRows}\n onSortOrderChange={({ sortField, sortOrder }) => {\n onParamChange?.({ ...params, sortField, sortOrder });\n }}\n />\n ) : (\n <Loader />\n )}\n </div>\n {hasPagination && (\n <div className=\"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row\">\n <div className=\"text-sm\">\n <MyLimitSelect\n onLimitChange={(limit) =>\n onParamChange?.({ ...params, limit, page: 1 })\n }\n defaultValue={dataSource?.limit}\n />\n </div>\n <div className=\"text-muted-foreground text-sm\">\n {t('{{selectedCount}} of {{total}} row(s) selected', {\n selectedCount: selectedRows.length,\n total: dataSource?.total || 0,\n })}\n </div>\n <div>\n <MyPagination\n {...paginationProps}\n onPageChange={(page) => onParamChange?.({ ...params, page })}\n currentPage={dataSource?.page}\n totalPages={dataSource?.totalPages}\n />\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":["MyTable","rows","columns","onRowClick","rowKey","params","DEFAULT_LIMIT","hasNumbers","hasCheckbox","selectedItems","onSelectedItemsChange","onSortOrderChange","isStickyHeader","className","props","sortObject","handleSort","useSortable","selectedRows","isRowSelected","isAllRowsSelected","handleSelectAllRows","handleSelectRow","useDataTable","useEffect","jsxs","Table","cn","jsx","TableHeader","TableRow","TableHead","Checkbox","value","column","Fragment","SortOrder","ArrowDownWideNarrow","ArrowUpWideNarrow","ArrowUpDown","TableBody","row","index","TableCell","evt","get","Empty","DataTable","dataSource","hasSearch","exportOptions","hasPagination","onParamChange","dataKey","loading","tableKey","filters","actions","handleFilterChange","exportLoading","onColumnsUpdate","hasColumnsVisibilityDropdown","actionProps","filterWrapperProps","exportOptionsProps","columnsVisibilityProps","paginationProps","searchProps","t","useTranslation","setSelectedRows","useState","formattedColumns","handleColumnsChange","resetColumns","useColumns","isEmpty","Search","_a","search","ExportData","DropdownMenu","DropdownMenuTrigger","Button","RiLayoutColumnLine","RiArrowDownSLine","DropdownMenuContent","DropdownMenuItem","RefreshCw","DropdownMenuSeparator","DropdownMenuCheckboxItem","Actions","FilterWrapper","filter","Loader","sortField","sortOrder","MyLimitSelect","limit","MyPagination","page"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../../../src/components/datatable/MyTable.tsx","../../../src/components/datatable/DataTable.tsx"],"sourcesContent":["import { Checkbox } from 'dgz-ui/form';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from 'dgz-ui/table';\nimport { cn } from 'dgz-ui/utils';\nimport { get } from 'lodash';\nimport {\n ArrowDownWideNarrow,\n ArrowUpDown,\n ArrowUpWideNarrow,\n} from 'lucide-react';\nimport { type ComponentProps, useEffect } from 'react';\nimport { SortOrder } from '../../enums';\nimport { useDataTable, useSortable, type UseSortableProps } from '../../hooks';\nimport type { ColumnType } from '../../types';\nimport { Empty } from '../empty';\nimport { DEFAULT_LIMIT } from '../pagination/MyLimitSelect';\n\n/**\n * Props for the MyTable component.\n * @template TData - The type of data in the table.\n */\nexport interface MyTableProps<TData> extends ComponentProps<'table'> {\n /** Array of data rows to display. */\n rows?: TData[];\n /** Column definitions. */\n columns: ColumnType<TData>[];\n /** Callback when a row is clicked. */\n onRowClick?: (row: TData) => void;\n /** Whether to show row numbers. */\n hasNumbers?: boolean;\n /** Whether to show selection checkboxes. */\n hasCheckbox?: boolean;\n /** Unique key for each row. */\n rowKey: keyof TData;\n /** Current table parameters (page, limit, sort). */\n params?: Record<string, unknown>;\n /** Total number of items (optional, often used with pagination context). */\n total?: number;\n /** Array of currently selected item keys. */\n selectedItems?: TData[keyof TData][];\n /** Callback when selected items change. */\n onSelectedItemsChange?: (selectedItems: TData[keyof TData][]) => void;\n /** Callback when sort order changes. */\n onSortOrderChange?: (\n params: Omit<UseSortableProps<TData>, 'onSortOrderChange'>\n ) => void;\n /** Whether the header should stick to the top. */\n isStickyHeader?: true;\n}\n\n/**\n * MyTable renders a generic data table with optional numbering, selection checkboxes,\n * sortable columns and sticky header. It is a presentational component and delegates\n * sorting/selection state via hooks and callbacks.\n *\n * @template TData - The row data type.\n * @param props - Component props.\n * @returns React element containing the table.\n */\nexport const MyTable = <TData,>({\n rows = [],\n columns,\n onRowClick,\n rowKey,\n params = {\n page: 1,\n limit: DEFAULT_LIMIT,\n },\n hasNumbers = false,\n hasCheckbox = false,\n selectedItems,\n onSelectedItemsChange,\n onSortOrderChange,\n isStickyHeader,\n className,\n ...props\n}: MyTableProps<TData>) => {\n const { sortObject, handleSort } = useSortable<TData>({\n sortField: params?.sortField as keyof TData | undefined,\n sortOrder: params?.sortOrder as SortOrder | undefined,\n onSortOrderChange,\n });\n const {\n selectedRows,\n isRowSelected,\n isAllRowsSelected,\n handleSelectAllRows,\n handleSelectRow,\n } = useDataTable<TData>({ rows, defaultSelectedRows: selectedItems });\n\n useEffect(() => {\n if (\n JSON.stringify(selectedItems) !== JSON.stringify(selectedRows) &&\n selectedRows\n ) {\n onSelectedItemsChange?.(selectedRows);\n }\n }, [selectedRows, selectedItems, onSelectedItemsChange]);\n\n return (\n <Table {...props} className={cn('relative', className)}>\n <TableHeader\n className={cn('bg-bg', isStickyHeader && 'sticky top-0 z-1')}\n >\n <TableRow>\n {hasCheckbox && (\n <TableHead className={'w-12 p-3'}>\n <Checkbox\n className={'mt-1'}\n checked={isAllRowsSelected(rowKey)}\n onCheckedChange={(value) =>\n handleSelectAllRows(rowKey, !!value)\n }\n aria-label=\"Select all\"\n />\n </TableHead>\n )}\n {hasNumbers && <TableHead className={'w-12 p-2'}>#</TableHead>}\n {columns\n .filter((column) => !column.hidden)\n .map((column) => (\n <TableHead\n key={column.key}\n style={column.styles}\n className={cn('p-2', column.sortable && 'cursor-pointer')}\n onClick={() => column.sortable && handleSort(column.dataIndex)}\n >\n <div className={'flex items-center gap-2'}>\n {column.name}{' '}\n {column.sortable &&\n (sortObject?.sortField === column.key ? (\n <>\n {sortObject?.sortOrder === SortOrder.DESC && (\n <ArrowDownWideNarrow size={15} />\n )}\n {sortObject?.sortOrder === SortOrder.ASC && (\n <ArrowUpWideNarrow size={15} />\n )}\n </>\n ) : (\n <ArrowUpDown size={15} />\n ))}\n </div>\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody className={'[&>tr:nth-child(even)]:bg-bg-secondary'}>\n {rows.length ? (\n rows.map((row, index) => (\n <TableRow\n key={`${row[rowKey]}`}\n onClick={() => onRowClick?.(row)}\n className={cn(onRowClick && 'cursor-pointer')}\n data-state={isRowSelected(row[rowKey]) && 'selected'}\n >\n {hasCheckbox && (\n <TableCell\n className={'w-12 p-3'}\n onClick={(evt) => evt.stopPropagation()}\n >\n <Checkbox\n className={'mt-1'}\n checked={isRowSelected(row[rowKey])}\n onCheckedChange={(value) =>\n handleSelectRow(row[rowKey], !!value)\n }\n aria-label=\"Select row\"\n />\n </TableCell>\n )}\n {hasNumbers && (\n <TableCell className={'w-12 p-2'}>\n {((params.page as number) - 1) *\n ((params.limit || DEFAULT_LIMIT) as number) +\n index +\n 1}\n </TableCell>\n )}\n {columns\n .filter((column) => !column.hidden)\n .map((column) => (\n <TableCell\n className={'text-body-xs-medium max-w-xs p-2'}\n style={column.styles}\n key={`${index}-${column.key}`}\n >\n {column.render\n ? column.render(get(row, column.dataIndex), row)\n : get(row, column.dataIndex, '')}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell\n colSpan={\n hasNumbers\n ? hasCheckbox\n ? columns.length + 2\n : columns.length + 1\n : columns.length\n }\n >\n <Empty />\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n );\n};\n","import { RiArrowDownSLine, RiLayoutColumnLine } from '@remixicon/react';\nimport { Button } from 'dgz-ui/button';\nimport {\n type DropdownContainerProps,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from 'dgz-ui/dropdown';\nimport { cn } from 'dgz-ui/utils';\nimport { get, isEmpty } from 'lodash';\nimport { RefreshCw } from 'lucide-react';\nimport { type ReactNode, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useColumns } from '../../hooks';\nimport type { ColumnType } from '../../types';\nimport { type ActionInterface, Actions, type ActionsProps } from '../actions';\nimport {\n ExportData,\n type ExportDataInterface,\n type ExportDataProps,\n} from '../export';\nimport {\n type FilterInterface,\n FilterWrapper,\n type FilterWrapperProps,\n Search,\n type SearchProps,\n} from '../filters';\nimport { Loader } from '../loader';\nimport { MyLimitSelect, MyPagination } from '../pagination';\nimport type { MyPaginationProps } from '../pagination/MyPagination.tsx';\nimport { MyTable, type MyTableProps } from './MyTable';\n\n/**\n * Minimal pagination wrapper contract used by `DataTable`.\n *\n * Notes\n * - Only `page`, `limit`, and `totalPages` are required. Other fields are optional and\n * may be provided by your API for convenience.\n * - The actual rows array can be stored in any key, controlled via `dataKey` prop\n * (defaults to `\"docs\"`).\n */\nexport interface PaginationInterface<TData> {\n /** Array of rows for the current page. Used when `dataKey` is set to `\"docs\"`. */\n docs?: TData[];\n /** Zero-based index of the first item on the current page (if provided by API). */\n offset?: number;\n /** Page size (items per page). */\n limit: number;\n /** Total number of pages available. */\n totalPages: number;\n /** Total number of items across all pages (if available). */\n total?: number;\n /** Current page number (1-based). */\n page: number;\n /** Convenience counter for the first item index on the page (if provided). */\n pagingCounter?: number;\n /** Whether a previous page exists. */\n hasPrevPage?: boolean;\n /** Whether a next page exists. */\n hasNextPage?: boolean;\n /** Previous page number, if available. */\n prevPage?: number;\n /** Next page number, if available. */\n nextPage?: number;\n}\n\n/**\n * Props for the DataTable component.\n *\n * @template TData - Row data type.\n * @template TPaginationData - Pagination wrapper type.\n */\nexport interface DataTableProps<\n TData,\n TPaginationData extends PaginationInterface<TData>,\n> extends Omit<MyTableProps<TData>, 'rows'> {\n /** Pagination data source. */\n dataSource?: TPaginationData;\n /** Callback for parameter changes (pagination, sorting, filtering). */\n onParamChange?: (param: Record<string, unknown>) => void;\n /** Whether to enable pagination. */\n hasPagination?: true;\n /** Options for the export data dropdown. */\n exportOptions?: ExportDataInterface[];\n /** Whether to enable search functionality. */\n hasSearch?: true;\n /** Whether the table data is loading. */\n loading?: boolean;\n /** Array of filters to display. */\n filters?: FilterInterface[];\n /** Array of actions to display. */\n actions?: ActionInterface[];\n /** Callback for filter changes. */\n handleFilterChange?: (filters: Record<string, unknown>) => void;\n /** Unique key for the table, used for column persistence. */\n tableKey: string;\n /** The key in dataSource where the data array is located. Defaults to \"docs\". */\n dataKey?: keyof TPaginationData;\n /** Whether to show the columns visibility dropdown. */\n hasColumnsVisibilityDropdown?: true;\n /** Callback when columns are updated (e.g., visibility toggled). */\n onColumnsUpdate?: (columns: ColumnType<TData>[]) => void;\n /** Whether the export action is loading. */\n exportLoading?: boolean;\n /** Props for the Actions component. */\n actionProps?: Partial<ActionsProps>;\n /** Props for the FilterWrapper component. */\n filterWrapperProps?: Partial<FilterWrapperProps>;\n /** Props for the ExportData component. */\n exportOptionsProps?: Partial<ExportDataProps>;\n searchProps?: Partial<SearchProps>;\n paginationProps?: Partial<MyPaginationProps>;\n /** Props for the columns visibility dropdown. */\n columnsVisibilityProps?: DropdownContainerProps & {\n title?: ReactNode;\n resetText?: ReactNode;\n };\n}\n\n/**\n * DataTable is a composable, high-level table that brings together search, filters,\n * column visibility management, header actions, exporting, and pagination.\n * It renders `MyTable` for rows and, when enabled, shows header controls and a footer with pagination.\n *\n * Generic Types\n * - `TData` — Row data shape (type of each item in the rows array).\n * - `TPaginationData` — Pagination wrapper type containing rows and pagination meta; defaults to\n * `PaginationInterface<TData>`.\n *\n * Key Behaviors\n * - Emits `onParamChange` when search text, filters, page, limit, or sort order change.\n * - Persists column visibility per `tableKey` via `useColumns` and informs parent with `onColumnsUpdate`.\n * - Renders header controls only when the related feature is enabled/has content.\n *\n * Props Overview\n * - `dataSource` — Paginated data source object that contains rows (see `dataKey`) and pagination metadata.\n * - `columns` — Column definitions passed to `MyTable`.\n * - `onRowClick` — Callback when a row is clicked.\n * - `rowKey` — Property name used as a unique row key.\n * - `hasNumbers` — Whether to show the row numbers column.\n * - `hasSearch` — Set to `true` to display the search input in the header.\n * - `exportOptions` — Export menu options shown by `ExportData` (see `ExportDataInterface[]`).\n * - `exportLoading` — When `true`, shows a spinner in the Export button to indicate an export action is in progress.\n * - `hasCheckbox` — Whether to show the selection checkbox column.\n * - `hasPagination` — Set to `true` to render the pagination footer.\n * - `isStickyHeader` — Whether to keep the table header sticky.\n * - `onParamChange` — Emits parameter changes for pagination/sorting/search/filters.\n * - `dataKey` — Key within `dataSource` that contains the row array. Defaults to `\"docs\"`.\n * - `loading` — If `true`, shows a loading state instead of the table rows.\n * - `tableKey` — Unique key for persisting column visibility state.\n * - `filters` — Filter configurations to render in the header.\n * - `actions` — Header actions independent of selected rows.\n * - `handleFilterChange` — Callback executed when filter values change.\n * - `params` — Current list parameters (pagination, sort, search, filters).\n * - `hasColumnsVisibilityDropdown` — Set to `true` to show the columns customize dropdown.\n * - `onColumnsUpdate` — Notifies parent whenever the internal columns state changes (after formatting/visibility).\n * - `actionProps` — Props passed to the `Actions` component.\n * - `filterWrapperProps` — Props passed to the `FilterWrapper` component.\n * - `exportOptionsProps` — Props passed to the `ExportData` component.\n * - `columnsVisibilityProps` — Props passed to the columns visibility dropdown.\n * - `onSelectedItemsChange` — Callback when selected rows change (requires `hasCheckbox`).\n *\n * Accessibility\n * - Header controls and dropdowns reuse shared primitives that include keyboard and ARIA support.\n *\n * Internationalization\n * - Text such as \"Export\", \"Customize columns\", and \"Reset columns\" are resolved via `react-i18next`.\n *\n * Usage Examples\n * 1) Minimal paginated table (uses default `dataKey = \"docs\"`)\n * ```tsx\n * type User = { id: string; name: string };\n * const data = { docs: [{ id: '1', name: 'Ada' }], page: 1, limit: 10, totalPages: 1 };\n *\n * <DataTable<User>\n * tableKey=\"users-table\"\n * columns={[{ key: 'name', name: 'Name' }]}\n * rowKey=\"id\"\n * dataSource={data}\n * hasPagination\n * />\n * ```\n *\n * 2) Custom `dataKey` and column visibility persistence\n * ```tsx\n * type Row = { id: number; title: string };\n * const payload = { items: [{ id: 1, title: 'Hello' }], page: 1, limit: 20, totalPages: 1 };\n *\n * <DataTable<Row>\n * tableKey=\"posts\"\n * columns={[{ key: 'title', name: 'Title' }]}\n * rowKey=\"id\"\n * dataSource={payload}\n * dataKey=\"items\"\n * hasColumnsVisibilityDropdown\n * />\n * ```\n *\n * 3) Responding to user interactions via `onParamChange`\n * ```tsx\n * const [params, setParams] = useState({ page: 1, limit: 10 });\n *\n * <DataTable\n * tableKey=\"logs\"\n * columns={[{ key: 'message', name: 'Message' }]}\n * rowKey=\"id\"\n * params={params}\n * onParamChange={setParams}\n * hasSearch\n * hasPagination\n * />\n * ```\n *\n * Notes and Best Practices\n * - Ensure `rowKey` points to a stable unique field in `TData` to avoid key collisions.\n * - When arrays like `exportOptions`, `filters`, or `actions` are empty, their sections are not rendered.\n * - Sorting emits `{ sortField, sortOrder }` through `onParamChange` when the user toggles a column sort.\n *\n * Returns\n * - React element that renders a complete data table experience.\n */\nexport const DataTable = <\n TData,\n TPaginationData extends PaginationInterface<TData> =\n PaginationInterface<TData>,\n>({\n dataSource,\n columns,\n onRowClick,\n rowKey,\n hasNumbers,\n hasSearch,\n exportOptions,\n hasCheckbox,\n hasPagination,\n isStickyHeader,\n onParamChange,\n dataKey = 'docs',\n loading,\n tableKey,\n filters,\n actions,\n handleFilterChange,\n params,\n exportLoading = false,\n onColumnsUpdate,\n hasColumnsVisibilityDropdown,\n onSelectedItemsChange,\n actionProps,\n filterWrapperProps,\n exportOptionsProps,\n columnsVisibilityProps,\n paginationProps,\n searchProps,\n ...props\n}: DataTableProps<TData, TPaginationData>) => {\n const { t } = useTranslation();\n const [selectedRows, setSelectedRows] = useState<TData[keyof TData][]>([]);\n const { formattedColumns, handleColumnsChange, resetColumns } =\n useColumns<TData>({ key: tableKey, columns });\n\n useEffect(() => {\n onColumnsUpdate?.(formattedColumns);\n }, [formattedColumns, onColumnsUpdate]);\n\n useEffect(() => {\n onSelectedItemsChange?.(selectedRows);\n }, [selectedRows, onSelectedItemsChange]);\n\n return (\n <div\n className={\n 'border-border-alpha-light flex grow flex-col overflow-auto rounded-xl border shadow-xs'\n }\n >\n {(hasSearch ||\n (hasColumnsVisibilityDropdown && tableKey) ||\n !isEmpty(exportOptions) ||\n !isEmpty(filters)) && (\n <div className=\"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row\">\n <div className={'w-full shrink'}>\n {hasSearch && (\n <Search\n {...searchProps}\n inputProps={{\n ...searchProps?.inputProps,\n className: cn('h-8', searchProps?.inputProps?.className),\n }}\n className={cn(\n 'max-w-78 [&_button]:-top-1',\n searchProps?.className\n )}\n defaultValue={get(params, 'search', '') as string}\n onSearchChange={(search) =>\n onParamChange?.({ ...params, search, page: 1 })\n }\n />\n )}\n </div>\n <div className={'flex shrink-0 items-center justify-end gap-3'}>\n {exportOptions && (\n <ExportData\n {...exportOptionsProps}\n options={exportOptions}\n loading={exportLoading}\n />\n )}\n {hasColumnsVisibilityDropdown && tableKey && (\n <DropdownMenu>\n <DropdownMenuTrigger\n asChild\n {...columnsVisibilityProps?.triggerProps}\n >\n <Button\n variant=\"secondary\"\n size={'sm'}\n className={'ml-auto rounded-lg px-3'}\n >\n {columnsVisibilityProps?.title || (\n <>\n <RiLayoutColumnLine />{' '}\n <span className={'hidden lg:inline!'}>\n {t('Customize columns')}\n </span>\n <RiArrowDownSLine />\n </>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n {...columnsVisibilityProps?.contentProps}\n >\n <DropdownMenuItem\n className=\"capitalize\"\n onClick={resetColumns}\n >\n <RefreshCw />{' '}\n {columnsVisibilityProps?.resetText || t('Reset columns')}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n {formattedColumns.map((column) => {\n return (\n <DropdownMenuCheckboxItem\n key={column.key}\n className=\"capitalize\"\n checked={!column.hidden}\n onCheckedChange={(value) =>\n handleColumnsChange(column, !value)\n }\n >\n {column.name}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {actions && <Actions {...actionProps} actions={actions} />}\n {filters && (\n <FilterWrapper\n {...filterWrapperProps}\n filters={filters}\n params={params}\n onChange={handleFilterChange}\n onFilter={(filter) => {\n onParamChange?.({ ...filter, page: 1 });\n handleFilterChange?.(filter);\n }}\n />\n )}\n </div>\n </div>\n )}\n <div className={'flex flex-col overflow-auto border-y'}>\n {!loading ? (\n <MyTable<TData>\n {...props}\n params={{\n page: dataSource?.page || 1,\n limit: dataSource?.limit,\n ...params,\n }}\n rows={get(dataSource, dataKey, []) as TData[]}\n rowKey={rowKey}\n selectedItems={selectedRows}\n isStickyHeader={isStickyHeader}\n columns={formattedColumns}\n hasCheckbox={hasCheckbox}\n hasNumbers={hasNumbers}\n onRowClick={onRowClick}\n onSelectedItemsChange={setSelectedRows}\n onSortOrderChange={({ sortField, sortOrder }) => {\n onParamChange?.({ ...params, sortField, sortOrder });\n }}\n />\n ) : (\n <Loader />\n )}\n </div>\n {hasPagination && (\n <div className=\"flex shrink-0 flex-col items-center justify-between gap-3 p-4 lg:flex-row\">\n <div className=\"text-sm\">\n <MyLimitSelect\n onLimitChange={(limit) =>\n onParamChange?.({ ...params, limit, page: 1 })\n }\n defaultValue={dataSource?.limit}\n />\n </div>\n <div className=\"text-muted-foreground text-sm\">\n {t('{{selectedCount}} of {{total}} row(s) selected', {\n selectedCount: selectedRows.length,\n total: dataSource?.total || 0,\n })}\n </div>\n <div>\n <MyPagination\n {...paginationProps}\n onPageChange={(page) => onParamChange?.({ ...params, page })}\n currentPage={dataSource?.page}\n totalPages={dataSource?.totalPages}\n />\n </div>\n </div>\n )}\n </div>\n );\n};\n"],"names":["MyTable","rows","columns","onRowClick","rowKey","params","DEFAULT_LIMIT","hasNumbers","hasCheckbox","selectedItems","onSelectedItemsChange","onSortOrderChange","isStickyHeader","className","props","sortObject","handleSort","useSortable","selectedRows","isRowSelected","isAllRowsSelected","handleSelectAllRows","handleSelectRow","useDataTable","useEffect","jsxs","Table","cn","jsx","TableHeader","TableRow","TableHead","Checkbox","value","column","Fragment","SortOrder","ArrowDownWideNarrow","ArrowUpWideNarrow","ArrowUpDown","TableBody","row","index","TableCell","evt","get","Empty","DataTable","dataSource","hasSearch","exportOptions","hasPagination","onParamChange","dataKey","loading","tableKey","filters","actions","handleFilterChange","exportLoading","onColumnsUpdate","hasColumnsVisibilityDropdown","actionProps","filterWrapperProps","exportOptionsProps","columnsVisibilityProps","paginationProps","searchProps","t","useTranslation","setSelectedRows","useState","formattedColumns","handleColumnsChange","resetColumns","useColumns","isEmpty","Search","_a","search","ExportData","DropdownMenu","DropdownMenuTrigger","Button","RiLayoutColumnLine","RiArrowDownSLine","DropdownMenuContent","DropdownMenuItem","RefreshCw","DropdownMenuSeparator","DropdownMenuCheckboxItem","Actions","FilterWrapper","filter","Loader","sortField","sortOrder","MyLimitSelect","limit","MyPagination","page"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../../chunks/Search-CO1xBkv4.cjs.js"),r=require("react/jsx-runtime"),p=require("../../chunks/index-ClQFzqcq.cjs.js"),d=require("dgz-ui/button"),h=require("dgz-ui/form"),q=require("dgz-ui/utils"),x=require("../../chunks/lodash-BjH0kD7j.cjs.js"),y=require("react"),b=require("react-i18next"),g=require("../../chunks/Keyboard-kyPAAQWP.cjs.js"),S=({placeholder:n,onSearchChange:t,className:a,inputProps:i,...c})=>{const{t:u}=b.useTranslation(),[o,l]=y.useState("");return r.jsxs("div",{...c,className:q.cn("relative w-full",a),children:[r.jsx(h.Input,{...i,placeholder:n||u("Type text and press CTRL + Enter"),onInput:e=>l(x.lodashExports.get(e,"target.value","")),onKeyUp:e=>{e.key===g.Keyboard.ENTER&&(e.ctrlKey&&t(o||void 0),e.stopPropagation(),e.preventDefault())}}),r.jsx(d.Button,{type:"button",variant:"ghost",className:"text-foreground absolute top-0 right-0 cursor-pointer rounded-md bg-transparent!",onClick:()=>t(o),children:r.jsx(p.pv,{})})]})};exports.FilterWrapper=s.FilterWrapper;exports.Search=s.Search;exports.SearchWithCtrl=S;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../../chunks/Search-BDXQ3bSp.cjs.js"),r=require("react/jsx-runtime"),p=require("../../chunks/index-ClQFzqcq.cjs.js"),d=require("dgz-ui/button"),h=require("dgz-ui/form"),q=require("dgz-ui/utils"),x=require("../../chunks/lodash-BjH0kD7j.cjs.js"),y=require("react"),b=require("react-i18next"),g=require("../../chunks/Keyboard-kyPAAQWP.cjs.js"),S=({placeholder:n,onSearchChange:t,className:a,inputProps:i,...c})=>{const{t:u}=b.useTranslation(),[o,l]=y.useState("");return r.jsxs("div",{...c,className:q.cn("relative w-full",a),children:[r.jsx(h.Input,{...i,placeholder:n||u("Type text and press CTRL + Enter"),onInput:e=>l(x.lodashExports.get(e,"target.value","")),onKeyUp:e=>{e.key===g.Keyboard.ENTER&&(e.ctrlKey&&t(o||void 0),e.stopPropagation(),e.preventDefault())}}),r.jsx(d.Button,{type:"button",variant:"ghost",className:"text-foreground absolute top-0 right-0 cursor-pointer rounded-md bg-transparent!",onClick:()=>t(o),children:r.jsx(p.pv,{})})]})};exports.FilterWrapper=s.FilterWrapper;exports.Search=s.Search;exports.SearchWithCtrl=S;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1,4 +1,4 @@
1
- import { F as R, S as W } from "../../chunks/Search-0PkBZIDP.es.js";
1
+ import { F as R, S as W } from "../../chunks/Search-I3lwE0J6.es.js";
2
2
  import { jsxs as l, jsx as t } from "react/jsx-runtime";
3
3
  import { p as c } from "../../chunks/index-E1NtSoNr.es.js";
4
4
  import { Button as f } from "dgz-ui/button";
@@ -1 +1 @@
1
- {"version":3,"file":"FilterWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/filters/FilterWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAEL,KAAK,qBAAqB,EAG3B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAQ,KAAK,SAAS,EAAoC,MAAM,OAAO,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAKnD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,qBAAqB;IACzD,6CAA6C;IAC7C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACtD,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAC1C,mCAAmC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iCAAiC;IACjC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,iCAAiC;IACjC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,0DA6HxB,CAAC"}
1
+ {"version":3,"file":"FilterWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/filters/FilterWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAEL,KAAK,qBAAqB,EAG3B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAQ,KAAK,SAAS,EAAoC,MAAM,OAAO,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAKnD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,qBAAqB;IACzD,6CAA6C;IAC7C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACtD,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAC1C,mCAAmC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iCAAiC;IACjC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,iCAAiC;IACjC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,0DA4HxB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dgz-ui-shared",
3
- "version": "1.2.17",
3
+ "version": "1.2.18",
4
4
  "description": "Custom ui library using React.js, Shadcn/ui, TailwindCSS, Typescript, dgz-ui library",
5
5
  "keywords": [
6
6
  "dgz-ui",
@@ -177,7 +177,7 @@
177
177
  "dependencies": {
178
178
  "@hookform/resolvers": "^5.0.1",
179
179
  "dayjs": "^1.11.19",
180
- "dgz-ui": "^1.4.9",
180
+ "dgz-ui": "^1.4.11",
181
181
  "file-saver": "^2.0.5",
182
182
  "lodash": "^4.17.21",
183
183
  "lucide-react": "^0.563.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"Search-0PkBZIDP.es.js","sources":["../../src/components/filters/FilterWrapper.tsx","../../src/components/filters/Search.tsx"],"sourcesContent":["import { Button, type ButtonProps } from 'dgz-ui/button';\nimport { Form, type Option } from 'dgz-ui/form';\nimport {\n Popover,\n type PopoverContainerProps,\n PopoverContent,\n PopoverTrigger,\n} from 'dgz-ui/popover';\nimport { get } from 'lodash';\nimport { ChevronDown, ListFilterIcon, ListFilterPlusIcon } from 'lucide-react';\nimport { memo, type ReactNode, useCallback, useEffect, useState } from 'react';\nimport type { FieldValues } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useFilter } from '../../hooks';\nimport { MyInput, MySelect } from '../form';\n\n/**\n * Interface representing a filter configuration.\n */\nexport interface FilterInterface {\n /** Label for the filter field. */\n label?: ReactNode;\n /** Placeholder text for the input/select. */\n placeholder?: string;\n /** Default value for the filter. */\n value?: string | string[];\n /** Name of the filter field (used as key). */\n name: string;\n /** Whether the filter supports multiple values (for select inputs). */\n isMulti?: boolean;\n /** Whether the filter supports searchable inputs (for select inputs). */\n isSearchable?: boolean;\n /** Options for select inputs. */\n options?: Option[];\n}\n\n/**\n * Props for the FilterWrapper component.\n */\nexport interface FilterWrapperProps\n extends Omit<ButtonProps, 'title'>, PopoverContainerProps {\n /** Array of filter definitions to render. */\n filters: FilterInterface[];\n /** Current active parameters/filters. */\n params?: Record<string, unknown>;\n /** Callback fired when filters are applied. */\n onFilter?: (filters: Record<string, unknown>) => void;\n /** Callback fired when the filter popover is closed/cancelled. */\n onCancel?: () => void;\n /** Callback fired when filter form values change. */\n onChange?: (filters: FieldValues) => void;\n /** Title for the filter button. */\n title?: ReactNode;\n /** Text for the reset button. */\n resetText?: ReactNode;\n /** Text for the apply button. */\n applyText?: ReactNode;\n}\n\n/**\n * FilterWrapper shows a popover with a dynamic list of field filters and emits selected filter values.\n *\n * @param props.filters - Array of filter definitions to render.\n * @param props.params - Current params used to detect active filters.\n * @param props.onFilter - Callback fired when user applies filters.\n * @param props.onCancel - Callback fired on cancel.\n * @param props.onChange - Callback fired whenever filter form values change.\n */\nexport const FilterWrapper = memo(function FilterWrapper({\n filters,\n params,\n onFilter,\n onChange,\n onCancel,\n triggerProps,\n contentProps,\n title,\n resetText,\n applyText,\n ...btnProps\n}: FilterWrapperProps) {\n const { t } = useTranslation();\n const [isFiltered, setIsFiltered] = useState(false);\n const [open, setOpen] = useState(false);\n const { form } = useFilter({ params });\n\n const { watch, handleSubmit, control, reset } = form;\n\n useEffect(() => {\n let hasFilter = false;\n filters.map((filter) => {\n const value = get(params, `${filter.name}`);\n if (Array.isArray(value) ? value.length > 0 : Boolean(value)) {\n hasFilter = true;\n }\n\n setIsFiltered(hasFilter);\n });\n }, [filters, params]);\n\n const values = watch();\n\n useEffect(() => {\n onChange?.(values);\n }, [values, onChange]);\n\n const handleFilter = useCallback(\n (data = {}) => {\n onFilter?.(data);\n setOpen(false);\n },\n [onFilter]\n );\n\n const handleReset = useCallback(() => {\n reset();\n if (onFilter && params) {\n onFilter({\n ...params,\n ...Object.fromEntries(\n filters.map((filter) => [filter.name, undefined])\n ),\n });\n }\n setOpen(false);\n }, [onFilter, reset, params, filters]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger {...triggerProps}>\n <Button\n asChild\n size={'sm'}\n variant=\"secondary\"\n className={'ml-auto px-3'}\n {...btnProps}\n >\n <div className={'flex items-center'}>\n {isFiltered ? (\n <ListFilterPlusIcon className={'size-5'} />\n ) : (\n <ListFilterIcon className={'size-5'} />\n )}{' '}\n <span className={'hidden lg:inline!'}>{title || t('Filter')}</span>\n <ChevronDown />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent side={'bottom'} align={'end'} {...contentProps}>\n <Form {...form}>\n <form onSubmit={handleSubmit(handleFilter)} className={'space-y-4'}>\n <div className={'h-full shrink space-y-6 p-1'}>\n {filters.map((filter) =>\n filter.options ? (\n <MySelect\n key={filter.name}\n control={control}\n name={filter.name}\n isSearchable={Boolean(filter.isSearchable)}\n placeholder={filter.placeholder}\n isMulti={filter.isMulti}\n options={filter.options}\n label={filter.label}\n />\n ) : (\n <MyInput\n key={filter.name}\n control={control}\n placeholder={filter.placeholder}\n name={filter.name}\n label={filter.label}\n />\n )\n )}\n </div>\n <div className={'flex shrink-0 justify-end gap-2'}>\n <Button\n variant={'destructive'}\n type=\"reset\"\n size={'sm'}\n onClick={handleReset}\n >\n {resetText || t('Reset')}\n </Button>\n <Button type=\"submit\" size={'sm'}>\n {applyText || t('Apply')}\n </Button>\n </div>\n </form>\n </Form>\n </PopoverContent>\n </Popover>\n );\n});\n","import { RiSearchLine } from '@remixicon/react';\nimport { Button } from 'dgz-ui/button';\nimport type { CardProps } from 'dgz-ui/card';\nimport { Input, type InputProps } from 'dgz-ui/form';\nimport { cn } from 'dgz-ui/utils';\nimport { get } from 'lodash';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Keyboard } from '../../enums';\n\n/**\n * Props for the Search component.\n */\nexport type SearchProps = Omit<CardProps, 'title'> & {\n /** Custom placeholder text for the input. */\n placeholder?: string;\n /** Callback fired when the search is triggered. */\n onSearchChange: (search?: string) => void;\n inputProps?: InputProps;\n};\n\n/**\n * Search input with a submit button that triggers a search action.\n *\n * This component renders a search input field and a search button. The search\n * is triggered when the user presses Enter or clicks the button. The search\n * value is then passed to the `onSearchChange` callback.\n *\n * @param {SearchProps} props - The props for the component.\n * @param {string} [props.placeholder] - Optional placeholder text for the input field.\n * @param {Function} props.onSearchChange - Callback function that is called when a search is performed.\n * @param {string} [props.className] - Optional class name for the component.\n * @param {InputProps} [props.inputProps] - Optional props to pass to the underlying Input component.\n */\nexport const Search = ({\n placeholder,\n onSearchChange,\n className,\n inputProps,\n ...props\n}: SearchProps) => {\n const { t } = useTranslation();\n const [search, setSearch] = useState('');\n\n return (\n <div {...props} className={cn('relative w-full', className)}>\n <Input\n {...inputProps}\n placeholder={placeholder || t('Type text and press Enter')}\n onInput={(evt) => setSearch(get(evt, 'target.value', ''))}\n onKeyUp={(evt) => {\n if (evt.key === Keyboard.ENTER) {\n onSearchChange(search || undefined);\n evt.stopPropagation();\n evt.preventDefault();\n }\n }}\n onKeyDown={(event) => {\n if (event.key === Keyboard.ENTER) {\n event.stopPropagation();\n event.preventDefault();\n }\n }}\n />\n <Button\n type={'button'}\n variant={'ghost'}\n className={\n 'text-foreground absolute top-0 right-0 cursor-pointer rounded-md bg-transparent!'\n }\n onClick={() => onSearchChange(search)}\n >\n <RiSearchLine />\n </Button>\n </div>\n );\n};\n"],"names":["FilterWrapper","memo","filters","params","onFilter","onChange","onCancel","triggerProps","contentProps","title","resetText","applyText","btnProps","t","useTranslation","isFiltered","setIsFiltered","useState","open","setOpen","form","useFilter","watch","handleSubmit","control","reset","useEffect","hasFilter","filter","value","get","values","handleFilter","useCallback","data","handleReset","jsxs","Popover","jsx","PopoverTrigger","Button","ListFilterPlusIcon","ListFilterIcon","ChevronDown","PopoverContent","Form","MySelect","MyInput","Search","placeholder","onSearchChange","className","inputProps","props","search","setSearch","cn","Input","evt","Keyboard","event","RiSearchLine"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";const e=require("react/jsx-runtime"),i=require("dgz-ui/button"),S=require("dgz-ui/form"),m=require("dgz-ui/popover"),g=require("./lodash-BjH0kD7j.cjs.js"),x=require("lucide-react"),o=require("react"),E=require("react-i18next"),D=require("./useFilter-CsOF1_hM.cjs.js"),$=require("./MyInput-C9PNyYby.cjs.js"),A=require("./MySelect-Ovb1pK5c.cjs.js"),C=require("./index-ClQFzqcq.cjs.js"),O=require("dgz-ui/utils"),N=require("./Keyboard-kyPAAQWP.cjs.js"),W=o.memo(function({filters:r,params:a,onFilter:n,onChange:c,onCancel:y,triggerProps:l,contentProps:u,title:t,resetText:k,applyText:I,...B}){const{t:d}=E.useTranslation(),[M,P]=o.useState(!1),[R,p]=o.useState(!1),{form:b}=D.useFilter({params:a}),{watch:T,handleSubmit:z,control:v,reset:q}=b;o.useEffect(()=>{let s=!1;r.map(w=>{const h=g.lodashExports.get(a,`${w.name}`);(Array.isArray(h)?h.length>0:h)&&(s=!0),P(s)})},[r,a]);const f=T();o.useEffect(()=>{c==null||c(f)},[f,c]);const F=o.useCallback((s={})=>{n==null||n(s),p(!1)},[n]),K=o.useCallback(()=>{q(),n&&a&&n({...a,...Object.fromEntries(r.map(s=>[s.name,void 0]))}),p(!1)},[n,q,a,r]);return e.jsxs(m.Popover,{open:R,onOpenChange:p,children:[e.jsx(m.PopoverTrigger,{...l,children:e.jsx(i.Button,{asChild:!0,size:"sm",variant:"secondary",className:"ml-auto px-3",...B,children:e.jsxs("div",{className:"flex items-center",children:[M?e.jsx(x.ListFilterPlusIcon,{className:"size-5"}):e.jsx(x.ListFilterIcon,{className:"size-5"})," ",e.jsx("span",{className:"hidden lg:inline!",children:t||d("Filter")}),e.jsx(x.ChevronDown,{})]})})}),e.jsx(m.PopoverContent,{side:"bottom",align:"end",...u,children:e.jsx(S.Form,{...b,children:e.jsxs("form",{onSubmit:z(F),className:"space-y-4",children:[e.jsx("div",{className:"h-full shrink space-y-6 p-1",children:r.map(s=>s.options?e.jsx(A.MySelect,{control:v,name:s.name,isSearchable:!!s.isSearchable,placeholder:s.placeholder,isMulti:s.isMulti,options:s.options,label:s.label},s.name):e.jsx($.MyInput,{control:v,placeholder:s.placeholder,name:s.name,label:s.label},s.name))}),e.jsxs("div",{className:"flex shrink-0 justify-end gap-2",children:[e.jsx(i.Button,{variant:"destructive",type:"reset",size:"sm",onClick:K,children:k||d("Reset")}),e.jsx(i.Button,{type:"submit",size:"sm",children:I||d("Apply")})]})]})})})]})}),L=({placeholder:j,onSearchChange:r,className:a,inputProps:n,...c})=>{const{t:y}=E.useTranslation(),[l,u]=o.useState("");return e.jsxs("div",{...c,className:O.cn("relative w-full",a),children:[e.jsx(S.Input,{...n,placeholder:j||y("Type text and press Enter"),onInput:t=>u(g.lodashExports.get(t,"target.value","")),onKeyUp:t=>{t.key===N.Keyboard.ENTER&&(r(l||void 0),t.stopPropagation(),t.preventDefault())},onKeyDown:t=>{t.key===N.Keyboard.ENTER&&(t.stopPropagation(),t.preventDefault())}}),e.jsx(i.Button,{type:"button",variant:"ghost",className:"text-foreground absolute top-0 right-0 cursor-pointer rounded-md bg-transparent!",onClick:()=>r(l),children:e.jsx(C.pv,{})})]})};exports.FilterWrapper=W;exports.Search=L;
2
- //# sourceMappingURL=Search-CO1xBkv4.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Search-CO1xBkv4.cjs.js","sources":["../../src/components/filters/FilterWrapper.tsx","../../src/components/filters/Search.tsx"],"sourcesContent":["import { Button, type ButtonProps } from 'dgz-ui/button';\nimport { Form, type Option } from 'dgz-ui/form';\nimport {\n Popover,\n type PopoverContainerProps,\n PopoverContent,\n PopoverTrigger,\n} from 'dgz-ui/popover';\nimport { get } from 'lodash';\nimport { ChevronDown, ListFilterIcon, ListFilterPlusIcon } from 'lucide-react';\nimport { memo, type ReactNode, useCallback, useEffect, useState } from 'react';\nimport type { FieldValues } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useFilter } from '../../hooks';\nimport { MyInput, MySelect } from '../form';\n\n/**\n * Interface representing a filter configuration.\n */\nexport interface FilterInterface {\n /** Label for the filter field. */\n label?: ReactNode;\n /** Placeholder text for the input/select. */\n placeholder?: string;\n /** Default value for the filter. */\n value?: string | string[];\n /** Name of the filter field (used as key). */\n name: string;\n /** Whether the filter supports multiple values (for select inputs). */\n isMulti?: boolean;\n /** Whether the filter supports searchable inputs (for select inputs). */\n isSearchable?: boolean;\n /** Options for select inputs. */\n options?: Option[];\n}\n\n/**\n * Props for the FilterWrapper component.\n */\nexport interface FilterWrapperProps\n extends Omit<ButtonProps, 'title'>, PopoverContainerProps {\n /** Array of filter definitions to render. */\n filters: FilterInterface[];\n /** Current active parameters/filters. */\n params?: Record<string, unknown>;\n /** Callback fired when filters are applied. */\n onFilter?: (filters: Record<string, unknown>) => void;\n /** Callback fired when the filter popover is closed/cancelled. */\n onCancel?: () => void;\n /** Callback fired when filter form values change. */\n onChange?: (filters: FieldValues) => void;\n /** Title for the filter button. */\n title?: ReactNode;\n /** Text for the reset button. */\n resetText?: ReactNode;\n /** Text for the apply button. */\n applyText?: ReactNode;\n}\n\n/**\n * FilterWrapper shows a popover with a dynamic list of field filters and emits selected filter values.\n *\n * @param props.filters - Array of filter definitions to render.\n * @param props.params - Current params used to detect active filters.\n * @param props.onFilter - Callback fired when user applies filters.\n * @param props.onCancel - Callback fired on cancel.\n * @param props.onChange - Callback fired whenever filter form values change.\n */\nexport const FilterWrapper = memo(function FilterWrapper({\n filters,\n params,\n onFilter,\n onChange,\n onCancel,\n triggerProps,\n contentProps,\n title,\n resetText,\n applyText,\n ...btnProps\n}: FilterWrapperProps) {\n const { t } = useTranslation();\n const [isFiltered, setIsFiltered] = useState(false);\n const [open, setOpen] = useState(false);\n const { form } = useFilter({ params });\n\n const { watch, handleSubmit, control, reset } = form;\n\n useEffect(() => {\n let hasFilter = false;\n filters.map((filter) => {\n const value = get(params, `${filter.name}`);\n if (Array.isArray(value) ? value.length > 0 : Boolean(value)) {\n hasFilter = true;\n }\n\n setIsFiltered(hasFilter);\n });\n }, [filters, params]);\n\n const values = watch();\n\n useEffect(() => {\n onChange?.(values);\n }, [values, onChange]);\n\n const handleFilter = useCallback(\n (data = {}) => {\n onFilter?.(data);\n setOpen(false);\n },\n [onFilter]\n );\n\n const handleReset = useCallback(() => {\n reset();\n if (onFilter && params) {\n onFilter({\n ...params,\n ...Object.fromEntries(\n filters.map((filter) => [filter.name, undefined])\n ),\n });\n }\n setOpen(false);\n }, [onFilter, reset, params, filters]);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger {...triggerProps}>\n <Button\n asChild\n size={'sm'}\n variant=\"secondary\"\n className={'ml-auto px-3'}\n {...btnProps}\n >\n <div className={'flex items-center'}>\n {isFiltered ? (\n <ListFilterPlusIcon className={'size-5'} />\n ) : (\n <ListFilterIcon className={'size-5'} />\n )}{' '}\n <span className={'hidden lg:inline!'}>{title || t('Filter')}</span>\n <ChevronDown />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent side={'bottom'} align={'end'} {...contentProps}>\n <Form {...form}>\n <form onSubmit={handleSubmit(handleFilter)} className={'space-y-4'}>\n <div className={'h-full shrink space-y-6 p-1'}>\n {filters.map((filter) =>\n filter.options ? (\n <MySelect\n key={filter.name}\n control={control}\n name={filter.name}\n isSearchable={Boolean(filter.isSearchable)}\n placeholder={filter.placeholder}\n isMulti={filter.isMulti}\n options={filter.options}\n label={filter.label}\n />\n ) : (\n <MyInput\n key={filter.name}\n control={control}\n placeholder={filter.placeholder}\n name={filter.name}\n label={filter.label}\n />\n )\n )}\n </div>\n <div className={'flex shrink-0 justify-end gap-2'}>\n <Button\n variant={'destructive'}\n type=\"reset\"\n size={'sm'}\n onClick={handleReset}\n >\n {resetText || t('Reset')}\n </Button>\n <Button type=\"submit\" size={'sm'}>\n {applyText || t('Apply')}\n </Button>\n </div>\n </form>\n </Form>\n </PopoverContent>\n </Popover>\n );\n});\n","import { RiSearchLine } from '@remixicon/react';\nimport { Button } from 'dgz-ui/button';\nimport type { CardProps } from 'dgz-ui/card';\nimport { Input, type InputProps } from 'dgz-ui/form';\nimport { cn } from 'dgz-ui/utils';\nimport { get } from 'lodash';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Keyboard } from '../../enums';\n\n/**\n * Props for the Search component.\n */\nexport type SearchProps = Omit<CardProps, 'title'> & {\n /** Custom placeholder text for the input. */\n placeholder?: string;\n /** Callback fired when the search is triggered. */\n onSearchChange: (search?: string) => void;\n inputProps?: InputProps;\n};\n\n/**\n * Search input with a submit button that triggers a search action.\n *\n * This component renders a search input field and a search button. The search\n * is triggered when the user presses Enter or clicks the button. The search\n * value is then passed to the `onSearchChange` callback.\n *\n * @param {SearchProps} props - The props for the component.\n * @param {string} [props.placeholder] - Optional placeholder text for the input field.\n * @param {Function} props.onSearchChange - Callback function that is called when a search is performed.\n * @param {string} [props.className] - Optional class name for the component.\n * @param {InputProps} [props.inputProps] - Optional props to pass to the underlying Input component.\n */\nexport const Search = ({\n placeholder,\n onSearchChange,\n className,\n inputProps,\n ...props\n}: SearchProps) => {\n const { t } = useTranslation();\n const [search, setSearch] = useState('');\n\n return (\n <div {...props} className={cn('relative w-full', className)}>\n <Input\n {...inputProps}\n placeholder={placeholder || t('Type text and press Enter')}\n onInput={(evt) => setSearch(get(evt, 'target.value', ''))}\n onKeyUp={(evt) => {\n if (evt.key === Keyboard.ENTER) {\n onSearchChange(search || undefined);\n evt.stopPropagation();\n evt.preventDefault();\n }\n }}\n onKeyDown={(event) => {\n if (event.key === Keyboard.ENTER) {\n event.stopPropagation();\n event.preventDefault();\n }\n }}\n />\n <Button\n type={'button'}\n variant={'ghost'}\n className={\n 'text-foreground absolute top-0 right-0 cursor-pointer rounded-md bg-transparent!'\n }\n onClick={() => onSearchChange(search)}\n >\n <RiSearchLine />\n </Button>\n </div>\n );\n};\n"],"names":["FilterWrapper","memo","filters","params","onFilter","onChange","onCancel","triggerProps","contentProps","title","resetText","applyText","btnProps","t","useTranslation","isFiltered","setIsFiltered","useState","open","setOpen","form","useFilter","watch","handleSubmit","control","reset","useEffect","hasFilter","filter","value","get","values","handleFilter","useCallback","data","handleReset","jsxs","Popover","jsx","PopoverTrigger","Button","ListFilterPlusIcon","ListFilterIcon","ChevronDown","PopoverContent","Form","MySelect","MyInput","Search","placeholder","onSearchChange","className","inputProps","props","search","setSearch","cn","Input","evt","Keyboard","event","RiSearchLine"],"mappings":"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"}