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 +37 -0
- package/dist/CrudImportModal.d.ts +31 -0
- package/dist/CrudTable-BfVtTGYV.cjs +3 -0
- package/dist/CrudTable-jy8Db0uQ.js +1072 -0
- package/dist/CrudTable.cjs +1 -1
- package/dist/CrudTable.d.ts +10 -0
- package/dist/CrudTable.js +1 -1
- package/dist/CrudTableLazy.cjs +1 -1
- package/dist/CrudTableLazy.js +1 -1
- package/dist/core/RestDataSource.d.ts +97 -8
- package/dist/core/index.d.ts +1 -1
- package/dist/core/types.d.ts +8 -0
- package/dist/{en_US-DGCMDOdX.js → en_US-DghHhwRq.js} +19 -0
- package/dist/en_US-Q8nDeJhg.cjs +1 -0
- package/dist/fields/registry.d.ts +12 -0
- package/dist/hooks/useCrudTable.d.ts +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +50 -7
- package/dist/locale/types.d.ts +38 -0
- package/dist/{useCrudTable-DxjnXVlQ.js → useCrudTable-BVXxakfl.js} +84 -47
- package/dist/useCrudTable-Ex2Imgll.cjs +1 -0
- package/dist/useCrudTable.cjs +1 -1
- package/dist/useCrudTable.js +1 -1
- package/dist/useLocalStorageCrud.cjs +1 -1
- package/dist/useLocalStorageCrud.js +1 -1
- package/dist/utils/importData.d.ts +130 -0
- package/dist/utils/importSpreadsheetML.d.ts +8 -0
- package/dist/utils/importXlsx.d.ts +7 -0
- package/package.json +6 -1
- package/dist/CrudTable-Btf58zof.js +0 -610
- package/dist/CrudTable-DRN70sET.cjs +0 -1
- package/dist/en_US-D3Kl6g3n.cjs +0 -1
- package/dist/useCrudTable-40jpmCkr.cjs +0 -1
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}});
|