antd-crud-table 0.7.0 → 0.8.0

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.
package/README.md CHANGED
@@ -276,6 +276,8 @@ link.
276
276
  | `enableColumnSettings` | `boolean` | `true` | Column visibility and density |
277
277
  | `enableExport` | `boolean` | `true` | Export menu entries |
278
278
  | `exportScope` | `'all' \| 'page'` | `'all'` | Whole result set, or visible rows |
279
+ | `enableImport` | `boolean` | `false` | Import menu entry (CSV / `.xls` / `.xlsx`) |
280
+ | `importConcurrency` | `number` | `5` | Max simultaneous creates during import |
279
281
  | `customActions` | `(record, actions) => ReactNode[]` | — | Extra row controls |
280
282
  | `locale` | `PartialCrudTableLocale` | English | String overrides |
281
283
 
@@ -340,6 +342,41 @@ left alone.
340
342
  > format/extension mismatch prompt on open; the file is intact. Use CSV if you
341
343
  > need a prompt-free export.
342
344
 
345
+ ## Import
346
+
347
+ Set `enableImport` to add an **Import** entry to the toolbar menu. It opens a
348
+ dialog that walks a file in: pick it, map its headers onto columns (auto-matched
349
+ on header text, and editable), preview the parsed rows with **per-row validation**
350
+ using the same `formConfig.rules` the create form uses, then create the valid rows.
351
+
352
+ ```tsx
353
+ <CrudTable<User, 'id'>
354
+ title="Users"
355
+ rowKey="id"
356
+ columns={columns}
357
+ hookConfig={{ storageKey: 'users' }}
358
+ enableImport
359
+ />
360
+ ```
361
+
362
+ | Format | Read via |
363
+ |---|---|
364
+ | `.csv` | built-in RFC 4180 parser, no dependency |
365
+ | `.xls` | the Excel 2003 SpreadsheetML this library exports, parsed as plain XML |
366
+ | `.xlsx` | real OOXML, via [`to-spreadsheet`](https://github.com/maifeeulasad/to-spreadsheet)'s `readExcel` |
367
+
368
+ Behaviour worth knowing:
369
+
370
+ - **Values round-trip.** Export then import reproduces the original records. Enum
371
+ columns accept both the stored key and the exported label.
372
+ - **Partial success is honest.** Rows failing validation are skipped and reported
373
+ per row; a row that fails to create does not abort the rest.
374
+ - **Bounded concurrency.** A large file does not fire one request per row. A data
375
+ source may implement the optional `createMany(drafts)` to create server-side in
376
+ a batch; otherwise creates run through a small pool (`importConcurrency`, default
377
+ 5).
378
+ - **Passwords are never imported**, the same way they are never exported.
379
+
343
380
  ## Using the hook directly
344
381
 
345
382
  `useCrudTable` works without the table when you want your own UI:
@@ -0,0 +1,31 @@
1
+ import { CrudTableLocale } from './locale/types';
2
+ import { ImportColumn, ImportFormat, ImportSink } from './utils/importData';
3
+ /** Props for {@link CrudImportModal}. */
4
+ export interface CrudImportModalProps {
5
+ /** Whether the dialog is visible. */
6
+ open: boolean;
7
+ /** Columns available as import targets (password columns are filtered out). */
8
+ columns: ImportColumn[];
9
+ /** Formats the table accepts, in menu order (drives the file accept filter). */
10
+ formats: ImportFormat[];
11
+ /** Where valid rows are created. */
12
+ sink: ImportSink;
13
+ /** Max simultaneous single-row creates. */
14
+ concurrency?: number;
15
+ /** Resolved locale strings. */
16
+ locale: CrudTableLocale;
17
+ /** Called after a completed import so the caller can reload and report. */
18
+ onImported: (summary: {
19
+ created: number;
20
+ invalid: number;
21
+ failed: number;
22
+ }) => void;
23
+ /** Close the dialog. */
24
+ onClose: () => void;
25
+ }
26
+ /**
27
+ * The import dialog: pick a file, map its headers onto columns, preview parsed
28
+ * rows with per-row validation, then create the valid rows.
29
+ */
30
+ export declare const CrudImportModal: ({ open, columns, formats, sink, concurrency, locale, onImported, onClose, }: CrudImportModalProps) => import("react").JSX.Element;
31
+ export default CrudImportModal;
@@ -0,0 +1,3 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));const c=require("./useCrudTable-Ex2Imgll.cjs"),l=require("./en_US-Q8nDeJhg.cjs"),u=require("./exportData.cjs");let d=require("@ant-design/icons"),f=require("@ant-design/pro-components"),p=require("antd"),m=require("react"),h=require("dayjs");h=s(h,1);let g=require("react/jsx-runtime"),_=require("antd/locale/en_US");_=s(_,1);var v=(e,t)=>t[e.dataIndex],y=e=>e!=null&&e!==``,b=e=>y(e)?String(e):``,x=e=>{let t=Number(e);return Number.isFinite(t)?t:0},S=e=>String(e),C=e=>{let t=e.trim();if(t===``)return e;let n=Number(t);return Number.isFinite(n)?n:e},w=new Set([`yes`,`true`,`1`,`y`,`t`]),T=new Set([`no`,`false`,`0`,`n`,`f`]),E=e=>{let t=e.trim().toLowerCase();return w.has(t)?!0:!T.has(t)&&e},D=[`http`,`https`],O=[`http`,`https`,`mailto`],k=/^([a-z][a-z0-9+.-]*):/i,A=/^data:image\/(png|jpe?g|gif|webp|avif|bmp|x-icon)[;,]/i,j=(e,t)=>{let n=e.replace(/[\u0000-\u0020\u007F-\u009F]/g,``),r=k.exec(n);return!r||t.includes(r[1].toLowerCase())},M=e=>{let t=e.replace(/[\u0000-\u0020\u007F-\u009F]/g,``);return A.test(t)?!0:j(e,D)},N=`YYYY-MM-DD HH:mm`,P=`YYYY-MM-DD`,F=`HH:mm:ss`,I={string:{formControl:(e,t)=>(0,g.jsx)(p.Input,{disabled:t})},number:{column:e=>({valueType:`digit`,render:(t,n)=>{let r=v(e,n);return typeof r==`number`?r.toLocaleString():b(r)}}),formControl:(e,t)=>(0,g.jsx)(p.InputNumber,{style:{width:`100%`},disabled:t}),fromImportValue:C},date:{column:(e,t)=>({valueType:`dateTime`,render:(n,r)=>{let i=v(e,r);if(!i)return t.empty;let a=(0,h.default)(b(i));return(0,g.jsx)(`span`,{children:a.isValid()?a.format(N):b(i)})}}),formControl:(e,t)=>(0,g.jsx)(p.DatePicker,{style:{width:`100%`},showTime:!0,disabled:t}),toFormValue:e=>y(e)?(0,h.default)(b(e)):e,fromFormValue:e=>h.default.isDayjs(e)?e.toISOString():e,fromImportValue:e=>{let t=(0,h.default)(e);return t.isValid()?t.toISOString():e}},boolean:{column:(e,t)=>({valueType:`switch`,render:(n,r)=>(0,g.jsx)(p.Tag,{color:v(e,r)?`green`:`red`,children:v(e,r)?t.yes:t.no})}),formControl:(e,t)=>(0,g.jsx)(p.Switch,{disabled:t}),valuePropName:`checked`,fromImportValue:E},enum:{column:e=>({valueType:`select`,valueEnum:e.enumOptions,render:(t,n)=>{let r=v(e,n),i=e.enumOptions?.[S(r)];return i?(0,g.jsx)(p.Tag,{color:i.color,children:i.text}):b(r)}}),formControl:(e,t,n)=>(0,g.jsx)(p.Select,{disabled:t,placeholder:n.selectPlaceholder(e.title),options:Object.entries(e.enumOptions||{}).map(([e,t])=>({label:t.text,value:e}))})},custom:{column:e=>({render:(t,n)=>e.customRender?.(v(e,n),n)??null}),formControl:()=>null},textarea:{column:()=>({valueType:`textarea`,ellipsis:!0}),formControl:(e,t)=>(0,g.jsx)(p.Input.TextArea,{rows:3,disabled:t})},email:{column:(e,t)=>({render:(n,r)=>{let i=v(e,r);if(!y(i))return t.empty;let a=b(i);return j(a,O)?(0,g.jsx)(`a`,{href:`mailto:${encodeURIComponent(a)}`,children:a}):(0,g.jsx)(`span`,{children:a})}}),formControl:(e,t)=>(0,g.jsx)(p.Input,{type:`email`,disabled:t}),rules:(e,t)=>[{type:`email`,message:t.invalidEmail}]},url:{column:(e,t)=>({render:(n,r)=>{let i=v(e,r);if(!y(i))return t.empty;let a=b(i);return j(a,D)?(0,g.jsx)(`a`,{href:a,target:`_blank`,rel:`noopener noreferrer`,children:a}):(0,g.jsx)(`span`,{children:a})}}),formControl:(e,t)=>(0,g.jsx)(p.Input,{disabled:t}),rules:(e,t)=>[{type:`url`,message:t.invalidUrl}]},password:{column:(e,t)=>({search:!1,render:(n,r)=>y(v(e,r))?`••••••••`:t.empty}),formControl:(e,t)=>(0,g.jsx)(p.Input.Password,{disabled:t})},money:{column:()=>({valueType:`money`}),formControl:(e,t)=>(0,g.jsx)(p.InputNumber,{style:{width:`100%`},precision:2,min:0,disabled:t}),fromImportValue:C},percent:{column:()=>({valueType:`percent`}),formControl:(e,t)=>(0,g.jsx)(p.InputNumber,{style:{width:`100%`},min:0,max:100,addonAfter:`%`,disabled:t}),fromImportValue:C},rating:{column:e=>({search:!1,render:(t,n)=>(0,g.jsx)(p.Rate,{disabled:!0,allowHalf:!0,value:x(v(e,n))})}),formControl:(e,t)=>(0,g.jsx)(p.Rate,{allowHalf:!0,disabled:t}),fromImportValue:C},progress:{column:e=>({search:!1,render:(t,n)=>(0,g.jsx)(p.Progress,{percent:x(v(e,n)),size:`small`})}),formControl:(e,t)=>(0,g.jsx)(p.InputNumber,{style:{width:`100%`},min:0,max:100,disabled:t}),fromImportValue:C},time:{column:()=>({valueType:`time`}),formControl:(e,t)=>(0,g.jsx)(p.TimePicker,{style:{width:`100%`},disabled:t}),toFormValue:e=>y(e)?(0,h.default)(b(e),F):e,fromFormValue:e=>h.default.isDayjs(e)?e.format(F):e},dateRange:{column:(e,t)=>({valueType:`dateRange`,render:(n,r)=>{let i=v(e,r);if(!Array.isArray(i)||i.length!==2)return t.empty;let[a,o]=i.map(e=>(0,h.default)(b(e)));return!a.isValid()||!o.isValid()?b(i):`${a.format(P)} ~ ${o.format(P)}`}}),formControl:(e,t)=>(0,g.jsx)(p.DatePicker.RangePicker,{style:{width:`100%`},disabled:t}),toFormValue:e=>Array.isArray(e)?e.map(e=>y(e)?(0,h.default)(b(e)):e):e,fromFormValue:e=>Array.isArray(e)?e.map(e=>h.default.isDayjs(e)?e.toISOString():e):e,fromImportValue:e=>{let t=e.split(`,`).map(e=>e.trim()).filter(e=>e!==``);if(t.length!==2)return e;let n=t.map(e=>(0,h.default)(e));return n.every(e=>e.isValid())?n.map(e=>e.toISOString()):e}},tags:{column:(e,t)=>({render:(n,r)=>{let i=v(e,r);return!Array.isArray(i)||i.length===0?t.empty:(0,g.jsx)(g.Fragment,{children:i.map(e=>(0,g.jsx)(p.Tag,{children:b(e)},b(e)))})}}),formControl:(e,t,n)=>(0,g.jsx)(p.Select,{mode:`tags`,open:!1,suffixIcon:null,disabled:t,placeholder:n.tagsPlaceholder}),fromImportValue:e=>e.split(`,`).map(e=>e.trim()).filter(e=>e!==``)},image:{column:(e,t)=>({search:!1,render:(n,r)=>{let i=v(e,r);if(!y(i))return t.empty;let a=b(i);return M(a)?(0,g.jsx)(p.Image,{src:a,width:48,height:48,style:{objectFit:`cover`}}):(0,g.jsx)(`span`,{children:a})}}),formControl:(e,t)=>(0,g.jsx)(p.Input,{placeholder:`https://...`,disabled:t}),rules:(e,t)=>[{type:`url`,message:t.invalidImageUrl}]},color:{column:(e,t)=>({search:!1,render:(n,r)=>{let i=v(e,r);if(!y(i))return t.empty;let a=b(i);return(0,g.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:8},children:[(0,g.jsx)(`span`,{style:{display:`inline-block`,width:14,height:14,borderRadius:3,border:`1px solid rgba(0,0,0,0.15)`,backgroundColor:a}}),a]})}}),formControl:(e,t)=>(0,g.jsx)(p.ColorPicker,{showText:!0,disabled:t}),fromFormValue:e=>e&&typeof e==`object`&&`toHexString`in e?e.toHexString():e},json:{column:(e,t)=>({search:!1,ellipsis:!0,render:(n,r)=>{let i=v(e,r);return i==null?t.empty:(0,g.jsx)(p.Typography.Text,{code:!0,children:JSON.stringify(i)})}}),formControl:(e,t)=>(0,g.jsx)(p.Input.TextArea,{rows:4,style:{fontFamily:`monospace`},disabled:t}),toFormValue:e=>typeof e==`string`?e:JSON.stringify(e,null,2),fromFormValue:e=>typeof e==`string`&&e.trim()!==``?JSON.parse(e):e,fromImportValue:e=>e.trim()===``?e:JSON.parse(e),rules:(e,t)=>[{validator:async(e,n)=>{if(n!=null&&n!==``&&typeof n==`string`)try{JSON.parse(n)}catch{throw Error(t.invalidJson)}}}]}},L=e=>I[e??`string`]??I.string,R=l.t,ee=e=>{let t=(0,m.useContext)(p.ConfigProvider.ConfigContext).locale;return(0,m.useMemo)(()=>{let n=e?{...l.t,...e}:l.t,r=t?.locale?(0,f.findIntlKeyByAntdLocaleKey)(t.locale):void 0;return{strings:n,intl:r&&(e=>e in f.intlMap)(r)?f.intlMap[r]:f.enUSIntl,antdLocale:t?void 0:_.default,inherited:!!t}},[e,t])},z=(e,t=`,`)=>{let n=t.charAt(0);e.charCodeAt(0)===65279&&(e=e.slice(1));let r=[],i=[],a=``,o=!1,s=0,c=()=>{i.push(a),a=``},l=()=>{c(),r.push(i),i=[]};for(;s<e.length;){let t=e[s];if(o){if(t===`"`){if(e[s+1]===`"`){a+=`"`,s+=2;continue}o=!1,s++;continue}a+=t,s++;continue}t===`"`?(o=!0,s++):t===n?(c(),s++):t===`
2
+ `?(l(),s++):t===`\r`?(l(),s+=e[s+1]===`
3
+ `?2:1):(a+=t,s++)}return(a!==``||i.length>0)&&l(),r.length>0&&r[r.length-1].length===1&&r[r.length-1][0]===``&&r.pop(),r},B=e=>{if(e.length===0)return{headers:[],rows:[]};let[t,...n]=e;return{headers:t.map(e=>String(e??``)),rows:n}},V={csv:e=>B(z(typeof e==`string`?e:U(e)))},H=(e,t)=>{V[e]=t},U=e=>new TextDecoder(`utf-8`).decode(e),W=e=>{let t=e.toLowerCase().split(`.`).pop();if(t===`csv`)return`csv`;if(t===`xls`)return`xls`;if(t===`xlsx`)return`xlsx`},G=async(e,t)=>{let n=V[t];if(!n)throw Error(`No parser registered for "${t}" import`);return n(e)},K=e=>e.toLowerCase().replace(/[^a-z0-9]/g,``),q=(e,t)=>{let n=t.filter(e=>e.fieldType!==`password`),r=new Map,i=new Map;for(let e of n)r.set(K(e.title),e.dataIndex),i.set(K(e.dataIndex),e.dataIndex);let a=new Set;return e.map(e=>{let t=K(e),n=r.get(t)??i.get(t);return n&&!a.has(n)?(a.add(n),n):null})},J=(e,t)=>{if(!t||e in t)return e;let n=e.trim().toLowerCase();for(let[e,r]of Object.entries(t))if(r.text.toLowerCase()===n||e.toLowerCase()===n)return e;return e},Y=(e,t)=>{if(t.fieldType===`enum`)return J(e,t.enumOptions);let{fromImportValue:n}=L(t.fieldType);return n?n(e):e},te=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,X=e=>e==null||e===``||Array.isArray(e)&&e.length===0,Z=(e,t)=>{let n=e.message;return typeof n==`string`?n:t},Q=async(e,t,n)=>{if(!e||e.length===0)return null;for(let r of e){if(typeof r==`function`)continue;let e=r;if(e.required&&X(t))return Z(e,`${n} is required`);if(!X(t)){if(e.type===`email`&&typeof t==`string`&&!te.test(t))return Z(e,`${n} is not a valid email`);if(e.type===`url`&&typeof t==`string`)try{new URL(t)}catch{return Z(e,`${n} is not a valid URL`)}if(e.pattern instanceof RegExp&&typeof t==`string`&&!e.pattern.test(t))return Z(e,`${n} is invalid`);if(typeof e.len==`number`&&typeof t==`string`&&t.length!==e.len)return Z(e,`${n} must be ${e.len} characters`);if(typeof e.min==`number`&&(typeof t==`number`?t:String(t).length)<e.min)return Z(e,`${n} is too small`);if(typeof e.max==`number`&&(typeof t==`number`?t:String(t).length)>e.max)return Z(e,`${n} is too large`);if(typeof e.validator==`function`)try{await e.validator(e,t,()=>void 0)}catch(t){return t instanceof Error&&t.message?t.message:Z(e,`${n} is invalid`)}}}return null},ne=async(e,t,n)=>{let r=new Map(n.map(e=>[e.dataIndex,e])),i=[];for(let n=0;n<e.rows.length;n++){let a=e.rows[n],o={},s=[];for(let e=0;e<t.length;e++){let n=t[e];if(!n)continue;let i=r.get(n);if(!i||i.fieldType===`password`)continue;let c=a[e]??``,l;try{l=Y(c,i)}catch(e){s.push({field:n,message:e instanceof Error?e.message:`${i.title} is invalid`});continue}X(l)||(o[n]=l);let u=await Q(i.rules,o[n]??l,i.title);u&&s.push({field:n,message:u})}i.push({rowNumber:n+1,record:o,errors:s})}return i},re=async(e,t,n={})=>{let r=Math.max(1,n.concurrency??5),i=[],a=e.filter(e=>e.errors.length>0);for(let e of a)i.push({rowNumber:e.rowNumber,ok:!1,error:e.errors.map(e=>e.message).join(`; `)});let o=e.filter(e=>e.errors.length===0);if(t.createMany&&o.length>0)try{await t.createMany(o.map(e=>e.record));for(let e of o)i.push({rowNumber:e.rowNumber,ok:!0})}catch(e){let t=e instanceof Error?e.message:`Create failed`;for(let e of o)i.push({rowNumber:e.rowNumber,ok:!1,error:t})}else{let e=0;await Promise.all(Array.from({length:Math.min(r,o.length)},async()=>{for(;e<o.length;){let n=o[e++];try{await t.create(n.record),i.push({rowNumber:n.rowNumber,ok:!0})}catch(e){i.push({rowNumber:n.rowNumber,ok:!1,error:e instanceof Error?e.message:`Create failed`})}}}))}i.sort((e,t)=>e.rowNumber-t.rowNumber);let s=i.filter(e=>e.ok).length;return{created:s,invalid:a.length,failed:i.length-s-a.length,outcomes:i}},$=100,ie={csv:`.csv`,xls:`.xls`,xlsx:`.xlsx`},ae=({open:e,columns:t,formats:n,sink:r,concurrency:i,locale:a,onImported:o,onClose:s})=>{let c=(0,m.useMemo)(()=>t.filter(e=>e.fieldType!==`password`),[t]),[l,u]=(0,m.useState)(null),[f,h]=(0,m.useState)([]),[_,v]=(0,m.useState)([]),[y,b]=(0,m.useState)(!1),[x,S]=(0,m.useState)(!1),C=(0,m.useCallback)(()=>{u(null),h([]),v([]),b(!1),S(!1)},[]),w=(0,m.useCallback)(()=>{C(),s()},[C,s]),T=(0,m.useCallback)(async(e,n)=>{b(!0);try{v(await ne(e,n,t))}finally{b(!1)}},[t]),E=(0,m.useCallback)(async e=>{let r=W(e.name);if(!r||!n.includes(r))return p.message.error(a.importUnsupportedFormat(e.name)),!1;try{let n=await G(await e.arrayBuffer(),r),i=q(n.headers,t);u(n),h(i),await T(n,i)}catch(e){p.message.error(a.importParseFailed(e instanceof Error?e.message:String(e)))}return!1},[t,n,a,T]),D=(0,m.useCallback)((e,t)=>{if(!l)return;let n=f.slice();if(t)for(let e=0;e<n.length;e++)n[e]===t&&(n[e]=null);n[e]=t,h(n),T(l,n)},[l,f,T]),O=_.filter(e=>e.errors.length===0).length,k=_.length-O,A=(0,m.useCallback)(async()=>{if(O===0){p.message.warning(a.importNothingValid);return}S(!0);try{let e=await re(_,r,{concurrency:i});o({created:e.created,invalid:e.invalid,failed:e.failed}),w()}finally{S(!1)}},[O,_,r,i,a,o,w]),j=(0,m.useMemo)(()=>[{value:``,label:a.importIgnoreColumn},...c.map(e=>({value:e.dataIndex,label:e.title}))],[c,a.importIgnoreColumn]),M=(0,m.useMemo)(()=>_.slice(0,$),[_]),N=(0,m.useMemo)(()=>f.filter(e=>!!e),[f]),P=(0,m.useMemo)(()=>{let e=new Map(t.map(e=>[e.dataIndex,e])),n=[{title:a.importRowLabel,dataIndex:`__row`,key:`__row`,width:64,fixed:`left`},{title:a.importStatusLabel,dataIndex:`__status`,key:`__status`,width:200,fixed:`left`,render:(e,t)=>t.errors.length===0?(0,g.jsx)(p.Tag,{color:`green`,children:a.importRowValid}):(0,g.jsx)(p.Space,{direction:`vertical`,size:0,children:t.errors.map(e=>(0,g.jsx)(p.Typography.Text,{type:`danger`,style:{fontSize:12},children:e.message},e.field))})}],r=N.map(t=>({title:e.get(t)?.title??t,dataIndex:t,key:t,ellipsis:!0,render:(e,n)=>{let r=n.record[t];return r==null?a.empty:typeof r==`object`?JSON.stringify(r):String(r)}}));return[...n,...r]},[t,N,a]),F=n.map(e=>ie[e]).join(`,`),I=n.map(e=>e.toUpperCase()).join(`, `);return(0,g.jsx)(p.Modal,{title:a.importTitle,open:e,onCancel:w,width:880,okText:a.importRun,cancelText:l?a.importBack:a.cancel,onOk:()=>void A(),okButtonProps:{disabled:!l||O===0||y,loading:x},cancelButtonProps:l?{onClick:C}:void 0,destroyOnHidden:!0,children:l?(0,g.jsxs)(p.Space,{direction:`vertical`,size:`middle`,style:{width:`100%`},children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Typography.Title,{level:5,children:a.importMapColumns}),(0,g.jsx)(p.Space,{wrap:!0,size:[12,12],children:l.headers.map((e,t)=>(0,g.jsxs)(p.Space,{direction:`vertical`,size:2,children:[(0,g.jsx)(p.Typography.Text,{type:`secondary`,style:{fontSize:12},children:e||`#${t+1}`}),(0,g.jsx)(p.Select,{size:`small`,style:{width:200},value:f[t]??``,options:j,onChange:e=>D(t,e===``?null:e)})]},`${e}-${t}`))})]}),(0,g.jsx)(p.Alert,{type:k>0?`warning`:`success`,showIcon:!0,message:a.importSummary(O,k)}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(p.Typography.Title,{level:5,children:a.importPreview}),(0,g.jsx)(p.Table,{size:`small`,rowKey:`rowNumber`,loading:y,dataSource:M,columns:P,pagination:!1,scroll:{x:`max-content`,y:320}}),_.length>$&&(0,g.jsx)(p.Typography.Text,{type:`secondary`,children:a.importPreviewTruncated($,_.length)})]})]}):(0,g.jsxs)(p.Upload.Dragger,{accept:F,multiple:!1,showUploadList:!1,beforeUpload:e=>(E(e),!1),children:[(0,g.jsx)(`p`,{className:`ant-upload-drawing-icon`,children:(0,g.jsx)(d.InboxOutlined,{})}),(0,g.jsx)(`p`,{className:`ant-upload-text`,children:a.importSelectFile}),(0,g.jsx)(`p`,{className:`ant-upload-hint`,children:a.importAcceptHint(I)})]})})},oe=[`csv`,`xls`,`xlsx`],se=()=>oe.filter(e=>!!V[e]),ce=(e,t,n,r)=>{let{current:i=1,pageSize:a=10,...o}=e,s={};for(let[e,t]of Object.entries(o))r.has(e)&&t!==void 0&&t!==``&&(s[e]=t);for(let[e,t]of Object.entries(n))t&&t.length>0&&r.has(e)&&(s[e]=t[0]);return{page:i,pageSize:a,sort:Object.entries(t).filter(([,e])=>e===`ascend`||e===`descend`).map(([e,t])=>({field:e,direction:t})),filters:s}},le=e=>{let{columns:t,rowKey:n,title:r,defaultPageSize:i=10,hookConfig:a,enableBulkOperations:o=!1,enableColumnSettings:s=!0,enableExport:l=!0,enableImport:h=!1,importConcurrency:_,exportScope:v=`all`,customActions:y,locale:b}=e,{strings:x,intl:S,antdLocale:C}=ee(b),w=c.n(n,{defaultPageSize:i,...a,locale:x,refreshAfterMutation:!1}),[T,E]=(0,m.useState)(!1),[D,O]=(0,m.useState)(null),[k,A]=(0,m.useState)([]),[j]=p.Form.useForm(),M=(0,m.useRef)([]),N=(0,m.useRef)({page:1,pageSize:i}),[P,F]=(0,m.useState)(!1),I=(0,m.useMemo)(()=>new Set(t.map(e=>e.dataIndex)),[t]),R=(0,m.useCallback)(e=>({dataIndex:e.dataIndex,title:e.title,fieldType:e.fieldType,enumOptions:e.enumOptions,customRender:e.customRender}),[]),z=(0,m.useCallback)(e=>{if(O(e??null),!e){j.resetFields(),E(!0);return}let n={...e};for(let e of t){let t=e.dataIndex,{toFormValue:r}=L(e.fieldType);if(r&&n[t]!==void 0)try{n[t]=r(n[t])}catch{}}j.setFieldsValue(n),E(!0)},[t,j]),B=(0,m.useCallback)(e=>{p.Modal.confirm({title:x.confirmDeleteTitle,content:x.confirmDeleteContent,okText:x.confirmDeleteOk,okType:`danger`,cancelText:x.cancel,onOk:async()=>{await w.remove(e)&&w.actionRef.current?.reload()}})},[w,x]),V=(0,m.useMemo)(()=>{let e=t.map(e=>{let t=R(e),n=L(e.fieldType);return{...e,dataIndex:e.dataIndex,title:e.title,search:e.searchable!==!1,...n.column?.(t,x)}});return e.push({title:x.actions,valueType:`option`,width:200,render:(e,t)=>[(0,g.jsx)(p.Button,{type:`link`,size:`small`,onClick:()=>z(t),children:x.edit},`edit`),(0,g.jsx)(p.Button,{type:`link`,size:`small`,danger:!0,onClick:()=>B(t[n]),children:x.delete},`delete`),...y?.(t,w)??[]]}),e},[t,R,z,B,n,y,w,x]),H=async(e,t,n)=>{try{let r=ce(e,t,n,I);N.current=r;let i=await w.dataSource.list(r);return M.current=i.items,{data:[...i.items],success:!0,total:i.total}}catch(e){let t=c.t(e);return a.onError?.(`list`,t),p.message.error(t.message),{data:[],success:!1,total:0}}},U=async()=>{let e;try{e=await j.validateFields()}catch{return}let r={...e};for(let n of t){let t=n.dataIndex,{fromFormValue:i}=L(n.fieldType);if(i&&e[t]!==void 0)try{r[t]=i(e[t])}catch(e){a.onError?.(D?`update`:`create`,c.t(e));return}let o=n.formConfig?.transform;o&&(r[t]=o(r[t]))}(D?await w.update(D[n],r):await w.create(r))!==null&&(E(!1),w.actionRef.current?.reload())},W=()=>{if(k.length===0){p.message.warning(x.selectItemsToDelete);return}p.Modal.confirm({title:x.confirmBulkDeleteTitle(k.length),content:x.confirmDeleteContent,okText:x.confirmBulkDeleteOk,okType:`danger`,cancelText:x.cancel,onOk:async()=>{let e=await Promise.all(k.map(async e=>({key:e,ok:await w.remove(e)}))),t=e.filter(e=>!e.ok);A(t.map(e=>e.key)),t.length===0?p.message.success(x.bulkDeleteSuccess(e.length)):p.message.error(x.bulkDeletePartial(e.length-t.length,e.length,t.length)),w.actionRef.current?.reload()}})},G=v===`all`&&typeof w.dataSource.listAll==`function`,K=async e=>{F(!0);try{let n=G?await w.dataSource.listAll({sort:N.current.sort,filters:N.current.filters}):M.current;if(n.length===0){p.message.warning(x.nothingToExport);return}let i=t.filter(e=>e.fieldType!==`password`).map(e=>({title:e.title,dataIndex:String(e.dataIndex),fieldType:e.fieldType,enumOptions:e.enumOptions}));u.exportData({data:[...n],columns:i,filename:r?r.toLowerCase().replace(/\s+/g,`-`):`export`,format:e})}catch(e){let t=c.t(e);a.onError?.(`list`,t),p.message.error(x.exportFailed(t.message))}finally{F(!1)}},q=G?x.exportAll:x.exportPage,[J,Y]=(0,m.useState)(!1),te=(0,m.useMemo)(()=>t.map(e=>{let t=L(e.fieldType),n=R(e),r=e.formConfig?.rules??(e.formConfig?.required?[{required:!0,message:x.requiredField(e.title)}]:[]);return{title:e.title,dataIndex:String(e.dataIndex),fieldType:e.fieldType,enumOptions:e.enumOptions,rules:[...t.rules?.(n,x)??[],...r]}}),[t,R,x]),X=(0,m.useMemo)(()=>{let e=w.dataSource;return{create:t=>e.create(t),createMany:e.createMany?t=>e.createMany(t):void 0}},[w.dataSource]),Z=(0,m.useCallback)(e=>{e.failed===0&&e.invalid===0?p.message.success(x.importSuccess(e.created)):p.message.warning(x.importPartial(e.created,e.created+e.failed+e.invalid,e.failed+e.invalid)),w.actionRef.current?.reload()},[x,w]),Q=(0,g.jsxs)(f.ProConfigProvider,{needDeps:!0,intl:S,children:[(0,g.jsx)(f.ProTable,{headerTitle:r,rowKey:n,rowClassName:(e,t)=>t%2==0?`row-differentiator`:``,actionRef:w.actionRef,columns:V,request:H,search:{labelWidth:`auto`},pagination:{pageSize:i,showSizeChanger:!0,showQuickJumper:!0},rowSelection:o?{selectedRowKeys:k,onChange:A}:void 0,toolBarRender:()=>[(0,g.jsx)(p.Button,{type:`primary`,icon:(0,g.jsx)(d.PlusOutlined,{}),onClick:()=>z(),children:x.create},`add`),...o&&k.length>0?[(0,g.jsx)(p.Button,{danger:!0,onClick:W,children:x.deleteSelected(k.length)},`bulk-delete`)]:[],(0,g.jsx)(p.Dropdown,{menu:{items:[...h&&se().length>0?[{key:`import`,label:x.importMenu,onClick:()=>Y(!0)},{type:`divider`}]:[],...l?[{key:`export-csv`,label:q(`CSV`),disabled:P,onClick:()=>void K(`csv`)},{key:`export-json`,label:q(`JSON`),disabled:P,onClick:()=>void K(`json`)},{key:`export-excel`,label:q(`Excel`),disabled:P,onClick:()=>void K(`excel`)},{type:`divider`}]:[],{key:`refresh`,label:x.refresh,onClick:()=>w.actionRef.current?.reload()}]},children:(0,g.jsx)(p.Button,{children:(0,g.jsx)(d.EllipsisOutlined,{})})},`menu`)],options:{setting:s?{listsHeight:400}:!1,density:s,reload:!0},dateFormatter:`string`}),(0,g.jsx)(p.Modal,{title:D?x.editTitle:x.createTitle,open:T,onOk:U,onCancel:()=>E(!1),okText:x.ok,cancelText:x.cancel,destroyOnHidden:!0,width:600,children:(0,g.jsx)(p.Form,{form:j,layout:`vertical`,children:t.map(e=>{let t=e.dataIndex,n=!(e.fieldEditable??!0),r=L(e.fieldType),i=R(e),a=e.formConfig?.rules??(e.formConfig?.required?[{required:!0,message:x.requiredField(e.title)}]:[]),o=[...r.rules?.(i,x)??[],...a],s=e.formConfig?.component??r.formControl(i,n,x);return s?(0,g.jsx)(p.Form.Item,{name:t,label:e.title,rules:o,valuePropName:r.valuePropName,children:s},t):null})})}),h&&(0,g.jsx)(ae,{open:J,columns:te,formats:se(),sink:X,concurrency:_,locale:x,onImported:Z,onClose:()=>Y(!1)})]});return C?(0,g.jsx)(p.ConfigProvider,{locale:C,children:Q}):Q};Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return L}});