antd-crud-table 0.2.0 → 0.3.1

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.
@@ -1 +1 @@
1
- require(`./chunk-BZRuZbSa.cjs`);const e=require(`./jsx-runtime-D8R_Hd8N.cjs`);let t=require(`react`);var n=e.t(),r=(0,t.lazy)(()=>Promise.resolve().then(()=>require(`./CrudTable.cjs`))),i=e=>{let{columns:i,service:a,rowKey:o,title:s,defaultPageSize:c=5}=e;return(0,n.jsx)(t.Suspense,{fallback:(0,n.jsx)(`div`,{style:{textAlign:`center`,padding:`2rem`},children:`Loading curd table w antd`}),children:(0,n.jsx)(r,{columns:i,service:a,rowKey:o,title:s,defaultPageSize:c})})};module.exports=i;
1
+ require(`./chunk-BZRuZbSa.cjs`);const e=require(`./jsx-runtime-DqtSPh7s.cjs`);let t=require(`react`);var n=e.t(),r=(0,t.lazy)(()=>Promise.resolve().then(()=>require(`./CrudTable.cjs`))),i=e=>(0,n.jsx)(t.Suspense,{fallback:(0,n.jsx)(`div`,{style:{textAlign:`center`,padding:`2rem`},children:`Loading curd table w antd`}),children:(0,n.jsx)(r,{...e})});module.exports=i;
@@ -1,3 +1,4 @@
1
1
  import { CrudTableConfig, DataType } from './CrudTable';
2
2
  declare const CrudTableLazy: <T extends DataType>(props: CrudTableConfig<T>) => import("react/jsx-runtime").JSX.Element;
3
3
  export default CrudTableLazy;
4
+ export type { CrudTableConfig, DataType };
@@ -1,24 +1,15 @@
1
- import { t as e } from "./jsx-runtime-Blo4gjKb.js";
1
+ import { t as e } from "./jsx-runtime-CJ1o_wG3.js";
2
2
  import { Suspense as t, lazy as n } from "react";
3
3
  //#region lib/CrudTableLazy.tsx
4
- var r = e(), i = n(() => import("./CrudTable.js")), a = (e) => {
5
- let { columns: n, service: a, rowKey: o, title: s, defaultPageSize: c = 5 } = e;
6
- return /* @__PURE__ */ (0, r.jsx)(t, {
7
- fallback: /* @__PURE__ */ (0, r.jsx)("div", {
8
- style: {
9
- textAlign: "center",
10
- padding: "2rem"
11
- },
12
- children: "Loading curd table w antd"
13
- }),
14
- children: /* @__PURE__ */ (0, r.jsx)(i, {
15
- columns: n,
16
- service: a,
17
- rowKey: o,
18
- title: s,
19
- defaultPageSize: c
20
- })
21
- });
22
- };
4
+ var r = e(), i = n(() => import("./CrudTable.js")), a = (e) => /* @__PURE__ */ (0, r.jsx)(t, {
5
+ fallback: /* @__PURE__ */ (0, r.jsx)("div", {
6
+ style: {
7
+ textAlign: "center",
8
+ padding: "2rem"
9
+ },
10
+ children: "Loading curd table w antd"
11
+ }),
12
+ children: /* @__PURE__ */ (0, r.jsx)(i, { ...e })
13
+ });
23
14
  //#endregion
24
15
  export { a as default };
@@ -0,0 +1,13 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var e=(e,t)=>{let n=t.filter(e=>e.fieldType!==`option`&&e.dataIndex),r=n.map(e=>String(e.title||e.dataIndex)),i=e.map(e=>n.map(t=>{let n=e[t.dataIndex];return n==null?``:t.fieldType===`boolean`?n?`Yes`:`No`:t.fieldType===`date`?String(n):t.fieldType===`enum`&&t.enumOptions&&t.enumOptions[n]?.text||String(n)}));return[r.map(e=>`"${e}"`).join(`,`),...i.map(e=>e.map(e=>`"${String(e).replace(/"/g,`""`)}"`).join(`,`))].join(`
2
+ `)},t=(e,t,n)=>{let r=new Blob([e],{type:n}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)},n=n=>{let{data:r,columns:i,filename:a=`export`}=n;t(e(r,i),`${a}.csv`,`text/csv;charset=utf-8;`)},r=e=>{let{data:n,filename:r=`export`}=e;t(JSON.stringify(n,null,2),`${r}.json`,`application/json`)},i=e=>{let{data:n,columns:r,filename:i=`export`}=e,a=r.filter(e=>e.fieldType!==`option`&&e.dataIndex),o=a.map(e=>String(e.title||e.dataIndex)),s=n.map(e=>a.map(t=>{let n=e[t.dataIndex];return n==null?``:t.fieldType===`boolean`?n?`Yes`:`No`:t.fieldType===`enum`&&t.enumOptions&&t.enumOptions[n]?.text||String(n)}));t((()=>{let e=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&apos;`);return`<?xml version="1.0" encoding="UTF-8"?>
3
+ <?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
4
+ <workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet">
5
+ <sheets>
6
+ <sheet name="Export">
7
+ <table>
8
+ <row>${o.map(t=>`<c t="inlineStr"><is><t>${e(t)}</t></is></c>`).join(``)}</row>
9
+ ${s.map(t=>`<row>${t.map(t=>`<c t="inlineStr"><is><t>${e(String(t))}</t></is></c>`).join(``)}</row>`).join(``)}
10
+ </table>
11
+ </sheet>
12
+ </sheets>
13
+ </workbook>`})(),`${i}.xls`,`application/vnd.ms-excel`)},a=e=>{let{format:t=`csv`}=e;switch(t){case`csv`:n(e);break;case`json`:r(e);break;case`xlsx`:i(e);break;default:n(e)}},o=async(e,t,n=`export`,r=`csv`)=>{try{a({data:await e(),columns:t,filename:n,format:r})}catch(e){throw console.error(`Export failed:`,e),e}};exports.default=a,exports.exportData=a,exports.exportAllData=o,exports.exportToCSV=n,exports.exportToJSON=r,exports.exportToXLSX=i;
@@ -0,0 +1,64 @@
1
+ //#region lib/utils/exportData.ts
2
+ var e = (e, t) => {
3
+ let n = t.filter((e) => e.fieldType !== "option" && e.dataIndex), r = n.map((e) => String(e.title || e.dataIndex)), i = e.map((e) => n.map((t) => {
4
+ let n = e[t.dataIndex];
5
+ return n == null ? "" : t.fieldType === "boolean" ? n ? "Yes" : "No" : t.fieldType === "date" ? String(n) : t.fieldType === "enum" && t.enumOptions && t.enumOptions[n]?.text || String(n);
6
+ }));
7
+ return [r.map((e) => `"${e}"`).join(","), ...i.map((e) => e.map((e) => `"${String(e).replace(/"/g, "\"\"")}"`).join(","))].join("\n");
8
+ }, t = (e, t, n) => {
9
+ let r = new Blob([e], { type: n }), i = URL.createObjectURL(r), a = document.createElement("a");
10
+ a.href = i, a.download = t, document.body.appendChild(a), a.click(), document.body.removeChild(a), URL.revokeObjectURL(i);
11
+ }, n = (n) => {
12
+ let { data: r, columns: i, filename: a = "export" } = n;
13
+ t(e(r, i), `${a}.csv`, "text/csv;charset=utf-8;");
14
+ }, r = (e) => {
15
+ let { data: n, filename: r = "export" } = e;
16
+ t(JSON.stringify(n, null, 2), `${r}.json`, "application/json");
17
+ }, i = (e) => {
18
+ let { data: n, columns: r, filename: i = "export" } = e, a = r.filter((e) => e.fieldType !== "option" && e.dataIndex), o = a.map((e) => String(e.title || e.dataIndex)), s = n.map((e) => a.map((t) => {
19
+ let n = e[t.dataIndex];
20
+ return n == null ? "" : t.fieldType === "boolean" ? n ? "Yes" : "No" : t.fieldType === "enum" && t.enumOptions && t.enumOptions[n]?.text || String(n);
21
+ }));
22
+ t((() => {
23
+ let e = (e) => e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
24
+ return `<?xml version="1.0" encoding="UTF-8"?>
25
+ <?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
26
+ <workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet">
27
+ <sheets>
28
+ <sheet name="Export">
29
+ <table>
30
+ <row>${o.map((t) => `<c t="inlineStr"><is><t>${e(t)}</t></is></c>`).join("")}</row>
31
+ ${s.map((t) => `<row>${t.map((t) => `<c t="inlineStr"><is><t>${e(String(t))}</t></is></c>`).join("")}</row>`).join("")}
32
+ </table>
33
+ </sheet>
34
+ </sheets>
35
+ </workbook>`;
36
+ })(), `${i}.xls`, "application/vnd.ms-excel");
37
+ }, a = (e) => {
38
+ let { format: t = "csv" } = e;
39
+ switch (t) {
40
+ case "csv":
41
+ n(e);
42
+ break;
43
+ case "json":
44
+ r(e);
45
+ break;
46
+ case "xlsx":
47
+ i(e);
48
+ break;
49
+ default: n(e);
50
+ }
51
+ }, o = async (e, t, n = "export", r = "csv") => {
52
+ try {
53
+ a({
54
+ data: await e(),
55
+ columns: t,
56
+ filename: n,
57
+ format: r
58
+ });
59
+ } catch (e) {
60
+ throw console.error("Export failed:", e), e;
61
+ }
62
+ };
63
+ //#endregion
64
+ export { a as default, a as exportData, o as exportAllData, n as exportToCSV, r as exportToJSON, i as exportToXLSX };
package/dist/index.d.ts CHANGED
@@ -1,12 +1,9 @@
1
1
  export { default as CrudTable } from './CrudTable';
2
2
  export { default as CrudTableLazy } from './CrudTableLazy';
3
- export { default as CrudTableExperimental } from './CrudTableExperimental';
4
- export { default as CrudTableExperimentalLazy } from './CrudTableExperimentalLazy';
5
3
  export { useCrudTable } from './hooks/useCrudTable';
6
4
  export { useLocalStorageCrud } from './hooks/useLocalStorageCrud';
7
5
  export { exportData, exportToCSV, exportToJSON, exportToXLSX, exportAllData } from './utils/exportData';
8
6
  export type { CrudTableConfig, CrudColumn, DataType } from './CrudTable';
9
- export type { EnhancedCrudTableConfig } from './CrudTableExperimental';
10
7
  export type { UseCrudTableConfig, CrudTableActions, CrudOperation, CrudParams, CrudResponse, CrudState } from './hooks/useCrudTable';
11
8
  export type { UseLocalStorageCrudConfig } from './hooks/useLocalStorageCrud';
12
9
  export type { ExportFormat } from './utils/exportData';
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-BZRuZbSa.cjs`);const e=require(`./message-C5ORE39N.cjs`);let t=require(`react`);var n=e=>{let{baseUrl:t=``,endpoints:n={},headers:r={},transform:i}=e.api,a={list:`/list`,create:`/create`,update:`/update`,delete:`/delete`,...n},o=async(e,n={})=>{let i=await fetch(`${t}${e}`,{headers:{"Content-Type":`application/json`,...r},...n});if(!i.ok)throw Error(`HTTP error! status: ${i.status}`);return i.json()};return{getList:async e=>{let n=new URL(`${t}${a.list}`,window.location.origin);Object.entries(e).forEach(([e,t])=>{t!=null&&n.searchParams.append(e,String(t))});let r=await o(n.pathname+n.search);return i?.response?i.response(r):r},create:async e=>{let t=i?.request?i.request(e):e;return o(a.create,{method:`POST`,body:JSON.stringify(t)})},update:async(e,t)=>{let n=i?.request?i.request(t):t;return o(`${a.update}/${e}`,{method:`PUT`,body:JSON.stringify(n)})},delete:async e=>{await o(`${a.delete}/${e}`,{method:`DELETE`})}}},r=(e,t)=>{let n=[...e],r=Math.max(...n.map(e=>Number(e[t])||0))+1;return{getList:async e=>{let{current:t=1,pageSize:r=10,sortBy:i,sortOrder:a,...o}=e,s=[...n];Object.entries(o).forEach(([e,t])=>{t!=null&&t!==``&&(s=s.filter(n=>String(n[e]).toLowerCase().includes(String(t).toLowerCase())))}),i&&a&&s.sort((e,t)=>{let n=e[i],r=t[i],o=n>r?1:n<r?-1:0;return a===`ascend`?o:-o});let c=(t-1)*r;return{data:s.slice(c,c+r),total:s.length,success:!0}},create:async e=>{let i={[t]:r++,...e};return n.push(i),i},update:async(e,r)=>{let i=n.findIndex(n=>n[t]===e);if(i===-1)throw Error(`Item not found`);return n[i]={...n[i],...r},n[i]},delete:async e=>{let r=n.findIndex(n=>n[t]===e);if(r===-1)throw Error(`Item not found`);n.splice(r,1)}}},i=(i,a)=>{let o=(0,t.useRef)(null),[s,c]=(0,t.useState)({loading:!1,error:null,data:[],total:0,current:1,pageSize:a.defaultPageSize||10}),l=(()=>{if(`operations`in a)return a.operations;if(`staticData`in a)return r(a.staticData,i);if(`api`in a)return n(a);throw Error(`useCrudTable: Must provide either staticData, api config, or custom operations`)})(),u=(0,t.useCallback)(async()=>{c(e=>({...e,loading:!0,error:null}));try{let e={current:s.current,pageSize:s.pageSize},t=await l.getList(e);c(e=>({...e,data:t.data,total:t.total,loading:!1}))}catch(t){let n=t instanceof Error?t.message:`Failed to fetch data`;c(e=>({...e,loading:!1,error:n})),a.onError?.(`fetch`,t),e.t.error(n)}},[s.current,s.pageSize,l,a]);return{refresh:u,create:(0,t.useCallback)(async t=>{if(!l.create)return e.t.error(`Create operation not supported`),null;try{c(e=>({...e,loading:!0}));let n=await l.create(t);return a.optimisticUpdates?c(e=>({...e,data:[...e.data,n],total:e.total+1,loading:!1})):await u(),a.onSuccess?.(`create`,n),e.t.success(`Created successfully`),n}catch(t){c(e=>({...e,loading:!1}));let n=t instanceof Error?t.message:`Create failed`;return a.onError?.(`create`,t),e.t.error(n),null}},[l,a,u]),update:(0,t.useCallback)(async(t,n)=>{if(!l.update)return e.t.error(`Update operation not supported`),null;try{c(e=>({...e,loading:!0}));let r=await l.update(t,n);return a.optimisticUpdates?c(e=>({...e,data:e.data.map(e=>e[i]===t?{...e,...r}:e),loading:!1})):await u(),a.onSuccess?.(`update`,r),e.t.success(`Updated successfully`),r}catch(t){c(e=>({...e,loading:!1}));let n=t instanceof Error?t.message:`Update failed`;return a.onError?.(`update`,t),e.t.error(n),null}},[l,a,i,u]),delete:(0,t.useCallback)(async t=>{if(!l.delete)return e.t.error(`Delete operation not supported`),!1;try{return c(e=>({...e,loading:!0})),await l.delete(t),a.optimisticUpdates?c(e=>({...e,data:e.data.filter(e=>e[i]!==t),total:e.total-1,loading:!1})):await u(),a.onSuccess?.(`delete`,t),e.t.success(`Deleted successfully`),!0}catch(t){c(e=>({...e,loading:!1}));let n=t instanceof Error?t.message:`Delete failed`;return a.onError?.(`delete`,t),e.t.error(n),!1}},[l,a,i,u]),setPageSize:(0,t.useCallback)(e=>{c(t=>({...t,pageSize:e,current:1}))},[]),setCurrentPage:(0,t.useCallback)(e=>{c(t=>({...t,current:e}))},[]),state:s,actionRef:o}};exports.useCrudTable=i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-BZRuZbSa.cjs`);const e=require(`./message-C2MDOk5a.cjs`);let t=require(`react`);var n=e=>{let{baseUrl:t=``,endpoints:n={},headers:r={},transform:i}=e.api,a={list:`/list`,create:`/create`,update:`/update`,delete:`/delete`,...n},o=async(e,n={})=>{let i=await fetch(`${t}${e}`,{headers:{"Content-Type":`application/json`,...r},...n});if(!i.ok)throw Error(`HTTP error! status: ${i.status}`);return i.json()};return{getList:async e=>{let n=new URL(`${t}${a.list}`,window.location.origin);Object.entries(e).forEach(([e,t])=>{t!=null&&n.searchParams.append(e,String(t))});let r=await o(n.pathname+n.search);return i?.response?i.response(r):r},create:async e=>{let t=i?.request?i.request(e):e;return o(a.create,{method:`POST`,body:JSON.stringify(t)})},update:async(e,t)=>{let n=i?.request?i.request(t):t;return o(`${a.update}/${e}`,{method:`PUT`,body:JSON.stringify(n)})},delete:async e=>{await o(`${a.delete}/${e}`,{method:`DELETE`})}}},r=(e,t)=>{let n=[...e],r=Math.max(...n.map(e=>Number(e[t])||0))+1;return{getList:async e=>{let{current:t=1,pageSize:r=10,sortBy:i,sortOrder:a,...o}=e,s=[...n];Object.entries(o).forEach(([e,t])=>{t!=null&&t!==``&&(s=s.filter(n=>String(n[e]).toLowerCase().includes(String(t).toLowerCase())))}),i&&a&&s.sort((e,t)=>{let n=e[i],r=t[i],o=n>r?1:n<r?-1:0;return a===`ascend`?o:-o});let c=(t-1)*r;return{data:s.slice(c,c+r),total:s.length,success:!0}},create:async e=>{let i={[t]:r++,...e};return n.push(i),i},update:async(e,r)=>{let i=n.findIndex(n=>n[t]===e);if(i===-1)throw Error(`Item not found`);return n[i]={...n[i],...r},n[i]},delete:async e=>{let r=n.findIndex(n=>n[t]===e);if(r===-1)throw Error(`Item not found`);n.splice(r,1)}}},i=(i,a)=>{let o=(0,t.useRef)(null),[s,c]=(0,t.useState)({loading:!1,error:null,data:[],total:0,current:1,pageSize:a.defaultPageSize||10}),l=(()=>{if(`operations`in a)return a.operations;if(`staticData`in a)return r(a.staticData,i);if(`api`in a)return n(a);throw Error(`useCrudTable: Must provide either staticData, api config, or custom operations`)})(),u=(0,t.useCallback)(async()=>{c(e=>({...e,loading:!0,error:null}));try{let e={current:s.current,pageSize:s.pageSize},t=await l.getList(e);c(e=>({...e,data:t.data,total:t.total,loading:!1}))}catch(t){let n=t instanceof Error?t.message:`Failed to fetch data`;c(e=>({...e,loading:!1,error:n})),a.onError?.(`fetch`,t),e.t.error(n)}},[s.current,s.pageSize,l,a]);return{refresh:u,create:(0,t.useCallback)(async t=>{if(!l.create)return e.t.error(`Create operation not supported`),null;try{c(e=>({...e,loading:!0}));let n=await l.create(t);return a.optimisticUpdates?c(e=>({...e,data:[...e.data,n],total:e.total+1,loading:!1})):await u(),a.onSuccess?.(`create`,n),e.t.success(`Created successfully`),n}catch(t){c(e=>({...e,loading:!1}));let n=t instanceof Error?t.message:`Create failed`;return a.onError?.(`create`,t),e.t.error(n),null}},[l,a,u]),update:(0,t.useCallback)(async(t,n)=>{if(!l.update)return e.t.error(`Update operation not supported`),null;try{c(e=>({...e,loading:!0}));let r=await l.update(t,n);return a.optimisticUpdates?c(e=>({...e,data:e.data.map(e=>e[i]===t?{...e,...r}:e),loading:!1})):await u(),a.onSuccess?.(`update`,r),e.t.success(`Updated successfully`),r}catch(t){c(e=>({...e,loading:!1}));let n=t instanceof Error?t.message:`Update failed`;return a.onError?.(`update`,t),e.t.error(n),null}},[l,a,i,u]),delete:(0,t.useCallback)(async t=>{if(!l.delete)return e.t.error(`Delete operation not supported`),!1;try{return c(e=>({...e,loading:!0})),await l.delete(t),a.optimisticUpdates?c(e=>({...e,data:e.data.filter(e=>e[i]!==t),total:e.total-1,loading:!1})):await u(),a.onSuccess?.(`delete`,t),e.t.success(`Deleted successfully`),!0}catch(t){c(e=>({...e,loading:!1}));let n=t instanceof Error?t.message:`Delete failed`;return a.onError?.(`delete`,t),e.t.error(n),!1}},[l,a,i,u]),setPageSize:(0,t.useCallback)(e=>{c(t=>({...t,pageSize:e,current:1}))},[]),setCurrentPage:(0,t.useCallback)(e=>{c(t=>({...t,current:e}))},[]),state:s,actionRef:o}};exports.useCrudTable=i;
@@ -1,4 +1,4 @@
1
- import { t as e } from "./message-C9NNC2sM.js";
1
+ import { t as e } from "./message-DHT-U_MI.js";
2
2
  import { useCallback as t, useRef as n, useState as r } from "react";
3
3
  //#region lib/hooks/useCrudTable.ts
4
4
  var i = (e) => {
@@ -0,0 +1 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}}),require(`./chunk-BZRuZbSa.cjs`);const e=require(`./message-C2MDOk5a.cjs`);let t=require(`react`);var n=(e,t=[])=>{try{let n=localStorage.getItem(e);return n?JSON.parse(n):t}catch{return t}},r=(e,t)=>{try{localStorage.setItem(e,JSON.stringify(t))}catch(e){console.error(`Failed to save to localStorage:`,e)}},i=(e,t,i=[])=>({getList:async t=>{let{current:r=1,pageSize:a=10,sortBy:o,sortOrder:s,...c}=t,l=n(e,i);Object.entries(c).forEach(([e,t])=>{t!=null&&t!==``&&e!==`current`&&e!==`pageSize`&&(l=l.filter(n=>{let r=n[e];return r==null?!1:String(r).toLowerCase().includes(String(t).toLowerCase())}))}),o&&s&&l.sort((e,t)=>{let n=e[o],r=t[o];if(n==null)return 1;if(r==null)return-1;let i=n>r?1:n<r?-1:0;return s===`ascend`?i:-i});let u=(r-1)*a;return{data:l.slice(u,u+a),total:l.length,success:!0}},create:async a=>{let o=n(e,i),s=o.length>0?Math.max(...o.map(e=>Number(e[t])||0),0):0,c={[t]:s+1,...a,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return o.push(c),r(e,o),c},update:async(a,o)=>{let s=n(e,i),c=s.findIndex(e=>e[t]===a);if(c===-1)throw Error(`Item not found`);return s[c]={...s[c],...o,updatedAt:new Date().toISOString()},r(e,s),s[c]},delete:async a=>{r(e,n(e,i).filter(e=>e[t]!==a))}}),a=(n,r,a=[],o)=>{let s=(0,t.useRef)(null),[c,l]=(0,t.useState)({loading:!1,error:null,data:[],total:0,current:1,pageSize:o?.defaultPageSize||10}),u=i(r,n,a),d=(0,t.useCallback)(async()=>{l(e=>({...e,loading:!0,error:null}));try{let e={current:c.current,pageSize:c.pageSize},t=await u.getList(e);l(e=>({...e,data:t.data,total:t.total,loading:!1}))}catch(t){let n=t instanceof Error?t.message:`Failed to fetch data`;l(e=>({...e,loading:!1,error:n})),o?.onError?.(`fetch`,t),e.t.error(n)}},[c.current,c.pageSize,u,o]);return(0,t.useEffect)(()=>{d()},[]),{refresh:d,create:(0,t.useCallback)(async t=>{try{l(e=>({...e,loading:!0}));let n=await u.create(t);return o?.optimisticUpdates?l(e=>({...e,data:[...e.data,n],total:e.total+1,loading:!1})):await d(),o?.onSuccess?.(`create`,n),e.t.success(`Created successfully`),s.current?.reload(),n}catch(t){l(e=>({...e,loading:!1}));let n=t instanceof Error?t.message:`Create failed`;return o?.onError?.(`create`,t),e.t.error(n),null}},[u,o,d]),update:(0,t.useCallback)(async(t,r)=>{try{l(e=>({...e,loading:!0}));let i=await u.update(t,r);return o?.optimisticUpdates?l(e=>({...e,data:e.data.map(e=>e[n]===t?{...e,...i}:e),loading:!1})):await d(),o?.onSuccess?.(`update`,i),e.t.success(`Updated successfully`),s.current?.reload(),i}catch(t){l(e=>({...e,loading:!1}));let n=t instanceof Error?t.message:`Update failed`;return o?.onError?.(`update`,t),e.t.error(n),null}},[u,o,n,d]),delete:(0,t.useCallback)(async t=>{try{return l(e=>({...e,loading:!0})),await u.delete(t),o?.optimisticUpdates?l(e=>({...e,data:e.data.filter(e=>e[n]!==t),total:e.total-1,loading:!1})):await d(),o?.onSuccess?.(`delete`,t),e.t.success(`Deleted successfully`),s.current?.reload(),!0}catch(t){l(e=>({...e,loading:!1}));let n=t instanceof Error?t.message:`Delete failed`;return o?.onError?.(`delete`,t),e.t.error(n),!1}},[u,o,n,d]),setPageSize:(0,t.useCallback)(e=>{l(t=>({...t,pageSize:e,current:1}))},[]),setCurrentPage:(0,t.useCallback)(e=>{l(t=>({...t,current:e}))},[]),state:c,actionRef:s}};exports.default=a,exports.useLocalStorageCrud=a;
@@ -0,0 +1,201 @@
1
+ import { t as e } from "./message-DHT-U_MI.js";
2
+ import { useCallback as t, useEffect as n, useRef as r, useState as i } from "react";
3
+ //#region lib/hooks/useLocalStorageCrud.ts
4
+ var a = (e, t = []) => {
5
+ try {
6
+ let n = localStorage.getItem(e);
7
+ return n ? JSON.parse(n) : t;
8
+ } catch {
9
+ return t;
10
+ }
11
+ }, o = (e, t) => {
12
+ try {
13
+ localStorage.setItem(e, JSON.stringify(t));
14
+ } catch (e) {
15
+ console.error("Failed to save to localStorage:", e);
16
+ }
17
+ }, s = (e, t, n = []) => ({
18
+ getList: async (t) => {
19
+ let { current: r = 1, pageSize: i = 10, sortBy: o, sortOrder: s, ...c } = t, l = a(e, n);
20
+ Object.entries(c).forEach(([e, t]) => {
21
+ t != null && t !== "" && e !== "current" && e !== "pageSize" && (l = l.filter((n) => {
22
+ let r = n[e];
23
+ return r == null ? !1 : String(r).toLowerCase().includes(String(t).toLowerCase());
24
+ }));
25
+ }), o && s && l.sort((e, t) => {
26
+ let n = e[o], r = t[o];
27
+ if (n == null) return 1;
28
+ if (r == null) return -1;
29
+ let i = n > r ? 1 : n < r ? -1 : 0;
30
+ return s === "ascend" ? i : -i;
31
+ });
32
+ let u = (r - 1) * i;
33
+ return {
34
+ data: l.slice(u, u + i),
35
+ total: l.length,
36
+ success: !0
37
+ };
38
+ },
39
+ create: async (r) => {
40
+ let i = a(e, n), s = i.length > 0 ? Math.max(...i.map((e) => Number(e[t]) || 0), 0) : 0, c = {
41
+ [t]: s + 1,
42
+ ...r,
43
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
44
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
45
+ };
46
+ return i.push(c), o(e, i), c;
47
+ },
48
+ update: async (r, i) => {
49
+ let s = a(e, n), c = s.findIndex((e) => e[t] === r);
50
+ if (c === -1) throw Error("Item not found");
51
+ return s[c] = {
52
+ ...s[c],
53
+ ...i,
54
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
55
+ }, o(e, s), s[c];
56
+ },
57
+ delete: async (r) => {
58
+ o(e, a(e, n).filter((e) => e[t] !== r));
59
+ }
60
+ }), c = (a, o, c = [], l) => {
61
+ let u = r(null), [d, f] = i({
62
+ loading: !1,
63
+ error: null,
64
+ data: [],
65
+ total: 0,
66
+ current: 1,
67
+ pageSize: l?.defaultPageSize || 10
68
+ }), p = s(o, a, c), m = t(async () => {
69
+ f((e) => ({
70
+ ...e,
71
+ loading: !0,
72
+ error: null
73
+ }));
74
+ try {
75
+ let e = {
76
+ current: d.current,
77
+ pageSize: d.pageSize
78
+ }, t = await p.getList(e);
79
+ f((e) => ({
80
+ ...e,
81
+ data: t.data,
82
+ total: t.total,
83
+ loading: !1
84
+ }));
85
+ } catch (t) {
86
+ let n = t instanceof Error ? t.message : "Failed to fetch data";
87
+ f((e) => ({
88
+ ...e,
89
+ loading: !1,
90
+ error: n
91
+ })), l?.onError?.("fetch", t), e.error(n);
92
+ }
93
+ }, [
94
+ d.current,
95
+ d.pageSize,
96
+ p,
97
+ l
98
+ ]);
99
+ return n(() => {
100
+ m();
101
+ }, []), {
102
+ refresh: m,
103
+ create: t(async (t) => {
104
+ try {
105
+ f((e) => ({
106
+ ...e,
107
+ loading: !0
108
+ }));
109
+ let n = await p.create(t);
110
+ return l?.optimisticUpdates ? f((e) => ({
111
+ ...e,
112
+ data: [...e.data, n],
113
+ total: e.total + 1,
114
+ loading: !1
115
+ })) : await m(), l?.onSuccess?.("create", n), e.success("Created successfully"), u.current?.reload(), n;
116
+ } catch (t) {
117
+ f((e) => ({
118
+ ...e,
119
+ loading: !1
120
+ }));
121
+ let n = t instanceof Error ? t.message : "Create failed";
122
+ return l?.onError?.("create", t), e.error(n), null;
123
+ }
124
+ }, [
125
+ p,
126
+ l,
127
+ m
128
+ ]),
129
+ update: t(async (t, n) => {
130
+ try {
131
+ f((e) => ({
132
+ ...e,
133
+ loading: !0
134
+ }));
135
+ let r = await p.update(t, n);
136
+ return l?.optimisticUpdates ? f((e) => ({
137
+ ...e,
138
+ data: e.data.map((e) => e[a] === t ? {
139
+ ...e,
140
+ ...r
141
+ } : e),
142
+ loading: !1
143
+ })) : await m(), l?.onSuccess?.("update", r), e.success("Updated successfully"), u.current?.reload(), r;
144
+ } catch (t) {
145
+ f((e) => ({
146
+ ...e,
147
+ loading: !1
148
+ }));
149
+ let n = t instanceof Error ? t.message : "Update failed";
150
+ return l?.onError?.("update", t), e.error(n), null;
151
+ }
152
+ }, [
153
+ p,
154
+ l,
155
+ a,
156
+ m
157
+ ]),
158
+ delete: t(async (t) => {
159
+ try {
160
+ return f((e) => ({
161
+ ...e,
162
+ loading: !0
163
+ })), await p.delete(t), l?.optimisticUpdates ? f((e) => ({
164
+ ...e,
165
+ data: e.data.filter((e) => e[a] !== t),
166
+ total: e.total - 1,
167
+ loading: !1
168
+ })) : await m(), l?.onSuccess?.("delete", t), e.success("Deleted successfully"), u.current?.reload(), !0;
169
+ } catch (t) {
170
+ f((e) => ({
171
+ ...e,
172
+ loading: !1
173
+ }));
174
+ let n = t instanceof Error ? t.message : "Delete failed";
175
+ return l?.onError?.("delete", t), e.error(n), !1;
176
+ }
177
+ }, [
178
+ p,
179
+ l,
180
+ a,
181
+ m
182
+ ]),
183
+ setPageSize: t((e) => {
184
+ f((t) => ({
185
+ ...t,
186
+ pageSize: e,
187
+ current: 1
188
+ }));
189
+ }, []),
190
+ setCurrentPage: t((e) => {
191
+ f((t) => ({
192
+ ...t,
193
+ current: e
194
+ }));
195
+ }, []),
196
+ state: d,
197
+ actionRef: u
198
+ };
199
+ };
200
+ //#endregion
201
+ export { c as default, c as useLocalStorageCrud };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "antd-crud-table",
3
3
  "private": false,
4
- "version": "0.2.0",
4
+ "version": "0.3.1",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/maifeeulasad/antd-crud-table",
7
7
  "repository": {
@@ -56,6 +56,17 @@
56
56
  "types": "./dist/CrudTableLazy.d.ts",
57
57
  "import": "./dist/CrudTableLazy.js",
58
58
  "require": "./dist/CrudTableLazy.cjs"
59
+ },
60
+ "./hooks/useCrudTable": {
61
+ "types": "./dist/hooks/useCrudTable.d.ts",
62
+ "import": "./dist/useCrudTable.js",
63
+ "require": "./dist/useCrudTable.cjs"
64
+ },
65
+ "./hooks/useLocalStorageCrud": {
66
+ "types": "./dist/hooks/useLocalStorageCrud.d.ts"
67
+ },
68
+ "./utils/exportData": {
69
+ "types": "./dist/utils/exportData.d.ts"
59
70
  }
60
71
  },
61
72
  "files": [
@@ -66,6 +77,7 @@
66
77
  "build:static": "tsc -b && vite build",
67
78
  "build:lib": "tsc --p ./tsconfig.build.json && vite build --config vite.config.lib.ts",
68
79
  "lint": "eslint .",
80
+ "lint:fix": "eslint . --fix",
69
81
  "preview": "vite preview"
70
82
  }
71
83
  }