UNPKG

@shridey/intelligentable

Version:

Intelligentable is a highly customizable, fully-types, performant, and feature-rich React component library built on top of handpicked industry-level production-grade UI Components for modern web applications.

4 lines (3 loc) 13.9 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),T=require("react"),h=require("antd"),R=require("write-excel-file"),V=require("jspdf"),q=require("jspdf-autotable"),C=require("file-saver"),w=require("@ant-design/icons"),P=a=>{const e=new Map,s=n=>"min"in n||"max"in n,t=n=>"str"in n||"regEx"in n,r=n=>{Array.isArray(n.colorConfig)&&n.colorConfig.forEach(o=>{const l=o.color;let u="",c="";if(s(o)){const{min:i,max:d,inclusiveMin:b=!0,inclusiveMax:p=!1}=o;u=`threshold-${i??"-∞"}-${d??"∞"}-${b}-${p}-${l}`;const m=b?"≥":">",y=p?"≤":"<";i!=null&&d!=null&&i===d?c=`= ${i}`:i!=null&&d!=null?c=`${m} ${i} & ${y} ${d}`:i!=null?c=`${m} ${i}`:d!=null?c=`${y} ${d}`:c="All values",e.set(u,{label:c,color:l})}t(o)&&(o.str?(u=`str-${o.str}-${o.exactMatch}-${l}`,c=o.exactMatch?`= "${o.str}"`:`~ "${o.str}"`):o.regEx&&(u=`regex-${o.regEx}-${l}`,c=`= RegEx /${o.regEx}/`),u&&e.set(u,{label:c,color:l}))}),Array.isArray(n.children)&&n.children.forEach(r)};return a?.forEach(r),Array.from(e.values())},W=({columns:a=[],legendStyle:e={}})=>{const s=P(a);return s.length>0&&f.jsx("div",{style:{display:"flex",gap:18,padding:6,border:e?.border||"1px solid #d9d9d9",borderRadius:6,backgroundColor:e?.backgroundColor},children:s.map((t,r)=>f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[f.jsx("svg",{width:e?.circle?.radius*2||12,height:e?.circle?.radius*2||12,children:f.jsx("circle",{cx:e?.circle?.radius||6,cy:e?.circle?.radius||6,r:e?.circle?.radius||6,fill:t.color})}),f.jsx("span",{style:{fontSize:e?.label?.fontSize||14,fontWeight:e?.label?.fontWeight,fontFamily:e?.label?.fontFamily,color:e?.label?.color},children:t.label})]},r))})},k=(a,e)=>{const s=new Date,t=o=>o.toString().padStart(2,"0"),r=`${s.getFullYear()}-${t(s.getMonth()+1)}-${t(s.getDate())}`,n=`${t(s.getHours())}-${t(s.getMinutes())}`;return`${a}-${r}_${n}.${e}`},I=(a,e,s)=>{const t=e.filter(l=>l.title),r=t.map(l=>l.title),n=t.map(l=>l.dataIndex),o=a.map(l=>n.map(u=>{const c=l[u];if(c==null)return"";const i=String(c);return typeof c=="string"&&(i.includes(s)||i.includes(` `))?`"${i.replace(/"/g,'""')}"`:i}).join(s));return[r.join(s),...o].join(` `)},z=async(a,e={})=>{const{fontUrl:s,fontFileName:t="",fontName:r="",fontStyles:n=[],fallbackFont:o="helvetica"}=e;if(!s){a.setFont(o);return}try{const u=await(await fetch(s)).blob(),c=await new Promise(i=>{const d=new FileReader;d.onload=()=>i(d.result),d.readAsDataURL(u)}).then(i=>i.split(",")[1]);a.addFileToVFS(t,c),n.forEach(i=>{a.addFont(t,r,i)}),a.setFont(r)}catch(l){console.error(`Failed to load custom font (${t}):`,l),a.setFont(o)}},U=async(a,e,s,t,r)=>{const n=e.filter(u=>u.title),o=n.map(u=>u.title),l=n.map(u=>u.dataIndex);switch(s){case"csv":{const u=I(a,e,","),c=new Blob(["\uFEFF"+u],{type:"text/csv;charset=utf-8;"});C.saveAs(c,k(t||"table-export","csv"));break}case"tsv":{const u=I(a,e," "),c=new Blob(["\uFEFF"+u],{type:"text/tab-separated-values;charset=utf-8;"});C.saveAs(c,k(t||"table-export","tsv"));break}case"xlsx":{const u=a.map(i=>{const d={};return l.forEach((b,p)=>{d[o[p]]=i[b]??""}),d}),c=o.map(i=>({column:i,type:String,value:d=>String(d[i]??"")}));await R(u,{schema:c,fileName:k(t||"table-export","xlsx")});break}case"json":{const u=a.map(i=>{const d={};return l.forEach((b,p)=>{d[o[p]]=i[b]}),d}),c=new Blob([JSON.stringify(u,null,2)],{type:"application/json"});C.saveAs(c,k(t||"table-export","json"));break}case"pdf":{const u=e.filter(p=>p.title),c=u.map(p=>p.title),i=u.map(p=>p.dataIndex),d=a.map(p=>i.map(m=>{const y=p[m];return y!=null?String(y):""})),b=new V.jsPDF({orientation:"landscape"});await z(b,r),q(b,{head:[c],body:d,styles:{font:r?.fontName,fontSize:8,cellPadding:2,overflow:"linebreak"},headStyles:{fillColor:[70,130,180],textColor:255,fontStyle:"bold"},margin:{top:10}}),b.save(k(t||"table-export","pdf"));break}}},G=({data:a=[],columns:e=[],exportFileName:s="",pdfFontOptions:t={fontUrl:"",fontFileName:"",fontName:"",fontStyles:[],fallbackFont:"helvetica"}})=>{const r=o=>{U(a,e,o,s,t)},n=[{key:"pdf",label:"PDF",icon:f.jsx(w.FilePdfOutlined,{}),onClick:()=>r("pdf")},{key:"xlsx",label:"Excel (XLSX)",icon:f.jsx(w.FileExcelOutlined,{}),onClick:()=>r("xlsx")},{key:"json",label:"JSON",icon:f.jsx(w.FileTextOutlined,{}),onClick:()=>r("json")},{key:"tsv",label:"TSV",icon:f.jsx(w.FileTextOutlined,{}),onClick:()=>r("tsv")},{key:"csv",label:"CSV",icon:f.jsx(w.FileTextOutlined,{}),onClick:()=>r("csv")}].filter(Boolean);return f.jsx(h.Dropdown,{menu:{items:n},trigger:["hover"],children:f.jsx(h.Button,{size:"middle",icon:f.jsx(w.DownloadOutlined,{}),iconPosition:"end",children:"Export"})})},J=({columns:a=[],data:e=[],legends:s={enable:!1,style:{}},search:t={enable:!1,searchText:"",setSearchText:n=>n,placeholder:"Search table..."},exportButton:r={enable:!1,exportFileName:"",pdfFontOptions:{fontUrl:"",fontFileName:"",fontName:"",fontStyles:[],fallbackFont:""}}})=>(s.enable||t.enable||r.enable)&&f.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",flexWrap:"wrap",rowGap:12,columnGap:12},children:[s.enable&&f.jsx(W,{columns:a,legendStyle:s.style}),t.enable&&t.searchText!==void 0&&t.setSearchText&&f.jsx("div",{style:{flex:1,minWidth:300},children:f.jsx(h.Input,{style:{width:"100%"},placeholder:t.placeholder||"Search table...",value:t.searchText,onChange:n=>t.setSearchText(n.target.value),size:"middle",suffix:f.jsx(w.SearchOutlined,{})})}),r.enable&&f.jsx(G,{data:e,columns:a,exportFileName:r.exportFileName,pdfFontOptions:r.pdfFontOptions})]}),A=(a,e)=>{if(!Array.isArray(a)||e==null)return;const s=F(e);for(const t of a)if(t.color!==void 0){if(s==="string"||s==="date"||s==="dayOfWeek"){if(t.regEx)try{if(new RegExp(t.regEx,"i").test(String(e)))return t.color}catch(r){console.warn("Invalid regex pattern:",t.regEx),console.error(r);continue}else if(t.str!==void 0){const r=String(e).toLowerCase(),n=t.str.toLowerCase();if(t.exactMatch){if(r===n)return t.color}else if(r.includes(n))return t.color}continue}if(s==="number"||s==="currency"||s==="id"||s==="percentage"){if(t.min===void 0&&t.max===void 0)continue;const n=j(e).number;if(n==null)continue;const o=t.min??-1/0,l=t.max??1/0;if(o===l){if(n===o)return t.color;continue}const u=t.inclusiveMin!==!1?n>=o:n>o,c=t.inclusiveMax===!0?n<=l:n<l;if(u&&c)return t.color}}},K=(a,e)=>{const s=A(e,a);return f.jsx("span",{style:{color:s},children:a})},X=["sun","mon","tue","wed","thu","fri","sat"],O=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"],H={sun:"sunday",mon:"monday",tue:"tuesday",wed:"wednesday",thu:"thursday",fri:"friday",sat:"saturday"},E=a=>{const e=String(a).trim();if(/^\d{1,2}[/-]\d{1,2}[/-]\d{2,4}$/.test(e)){const[t,r,n]=e.split(/[/-]/).map(Number),o=n<100?n>50?1900+n:2e3+n:n;return new Date(o,r-1,t).getTime()}return new Date(e).getTime()},Y=a=>{if(typeof a.sorter=="function"||typeof a.sorter=="boolean")return a.sorter;const e=a.dataIndex;return typeof e!="string"&&typeof e!="number"?!1:(s,t)=>{const r=s[e],n=t[e],o=F(r);if(r==null)return-1;if(n==null)return 1;switch(o){case"number":return Number(r)-Number(n);case"percentage":case"currency":case"id":{const l=j(r),u=j(n),c=l.number,i=u.number;return c===null?i===null?0:-1:i===null?1:c-i}case"date":return E(String(r))-E(String(n));case"dayOfWeek":{const l=i=>{const d=String(i).toLowerCase();return H[d]||d},u=l(r),c=l(n);return O.indexOf(u)-O.indexOf(c)}case"string":return String(r).localeCompare(String(n));default:return 0}}},F=a=>{if(typeof a=="number")return"number";if(a==null)return"string";const e=String(a).trim().toLowerCase();if(/^\s*[+-]?\d+(\.\d+)?\s*%$/.test(e))return"percentage";if(/^[$€£¥₹]\s*-?\s*\d+(\.\d+)?$/.test(e)||/^-?\s*\d+(\.\d+)?\s*[$€£¥₹]$/.test(e)||/^[$€£¥₹]\s*-?\s*\d{1,3}(,\d{3})+(\.\d+)?$/.test(e)||/^[$€£¥₹]\s*-?\s*\d{1,3}(,\d{2})+(,\d{3})*(\.\d+)?$/.test(e)||/^[$€£¥₹]\s*-?\s*\d{1,3}(,\d{2})+(\.\d+)?$/.test(e)||/^-?\s*\d{1,3}(,\d{3})+(\.\d+)?\s*[$€£¥₹]$/.test(e)||/^-?\s*\d{1,3}(,\d{2})+(,\d{3})*(\.\d+)?\s*[$€£¥₹]$/.test(e)||/^-?\s*\d{1,3}(,\d{2})+(\.\d+)?\s*[$€£¥₹]$/.test(e))return"currency";if(/^#\d+$|^id-\d+$/i.test(e))return"id";if(O.includes(e)||X.includes(e))return"dayOfWeek";const s=/^\s*(\d{1,2})[/-](\d{1,2})[/-](\d{2}|\d{4})\s*$/,t=/^\d{4}-\d{2}-\d{2}(T.*)?$/,r=/^[A-Za-z]{3,9} \d{1,2},? \d{4}$/,n=e.match(s);if(n){const o=Number(n[1]),l=Number(n[2]),u=Number(n[3]),c=u<100?u>50?1900+u:2e3+u:u,i=new Date(c,l-1,o);if(i.getDate()===o&&i.getMonth()===l-1&&i.getFullYear()===c)return"date"}else if(t.test(e)||r.test(e)){const o=new Date(e);if(!isNaN(o.getTime()))return"date"}return/^\s*[+-]?(\d+(\.\d+)?|\.\d+)\s*$/.test(e)?"number":"string"},D=(a,e)=>{const s=Math.pow(10,e);return(Math.round((a+Number.EPSILON)*s)/s).toFixed(e)},L=a=>a.map(e=>{const s=Array.isArray(e.children)&&e.children.length>0,t={...e,children:s?L(e.children):void 0};return s||(t.sorter=Y(e),e.render||(t.render=r=>{let n=r;const o=F(n);if(e.roundOff!==void 0&&["number","percentage","currency"].includes(o)){const l=j(n);l.number!==null&&(n=`${o==="currency"?l.symbol:""}${D(l.number,e.roundOff)}${o!=="currency"?l.symbol:""}`)}return e.colorConfig&&(n=K(n,e.colorConfig)),n}),e.filters&&!e.onFilter&&(t.onFilter=(r,n)=>{const o=j(n[e.dataIndex]).number;if(["id","number","percentage","currency"].includes(F(o))){if(o==null)return!1;if(typeof r=="string"&&r.includes("-")){const[l,u]=r.split("-").map(Number);return o>=l&&o<=u}return o===Number(r)}return!1})),t}),Z=a=>{const e={};for(const t of a)e[t]=(e[t]||0)+1;return Object.entries(e).sort((t,r)=>r[1]-t[1])[0]?.[0]||""},j=a=>{if(a==null)return{number:null,symbol:""};const e=String(a).trim().replace(/,/g,""),s=F(e);let t=null,r="";switch(s){case"number":t=Number(e);break;case"percentage":t=parseFloat(e.replace("%","")),r="%";break;case"currency":{r=e.match(/([^0-9.-]*)-?[\d,.]+/)?.[1]||"",t=parseFloat(e.replace(/[^0-9.-]/g,""));break}case"id":{r=e.match(/([^0-9]*)\d+/)?.[1]||"",t=parseInt(e.replace(/[^0-9]/g,""),10);break}default:t=null;break}return{number:isNaN(t)?null:t,symbol:r}},B=a=>a.flatMap(e=>e.children?B(e.children):[e]);function _(a,e){return Array.isArray(e)?e.reduce((s,t)=>{if(s&&t in s)return s[t]},a):a?.[e]}const Q=(a,e)=>{const s={};return e.forEach(t=>{const r=t.summaryOperation,n=t.dataIndex;if(!r)return;const o=a.map(c=>c[n]),l=F(o.find(c=>c!=null));if(r==="count"){s[n]=o.length;return}if(["number","percentage","currency","id"].includes(l)){const c=[],i=o.map(m=>{const{number:y,symbol:g}=j(m);return y!=null&&c.push(g),y}).filter(m=>typeof m=="number"),d=Z(c),b=m=>t.roundOff!==void 0?D(m,t.roundOff):m,p=m=>`${l==="currency"||l==="id"?d:""}${m}${l!=="currency"&&l!=="id"?d:""}`;switch(r){case"sum":{const m=i.reduce((y,g)=>y+g,0);s[n]=p(b(m));break}case"average":{const m=i.reduce((y,g)=>y+g,0)/(i.length||1);s[n]=p(b(m));break}case"max":{const m=Math.max(...i);s[n]=p(b(m));break}case"min":{const m=Math.min(...i);s[n]=p(b(m));break}}}if(l==="date"){const c=o.map(i=>new Date(String(i))).filter(i=>!isNaN(i.getTime()));if(c.length===0)return;switch(r){case"max":s[n]=c.reduce((i,d)=>i>d?i:d).toLocaleDateString();break;case"min":s[n]=c.reduce((i,d)=>i<d?i:d).toLocaleDateString();break}}}),s},ee=({data:a=[],columns:e=[],defaultSummaryRowStyle:s={}})=>{const t=Q(a,e);return f.jsx(h.Table.Summary.Row,{style:s,children:e.map((r,n)=>{const o=String(r.dataIndex),l=n===0?`Summary ${t[o]||""}`:t[o]||"-",u=A(r.colorConfig,l);return f.jsx(h.Table.Summary.Cell,{index:n,align:r.align,children:f.jsxs("span",{style:{textOverflow:r.ellipsis?"ellipsis":void 0,whiteSpace:r.ellipsis?"nowrap":void 0,overflow:r.ellipsis?"hidden":void 0,maxWidth:r.ellipsis?r.width:void 0,display:r.ellipsis?"block":void 0,color:u},title:String(l),children:[l," ",r.displaySummaryOperationInSummary&&f.jsxs("sub",{children:["(",r.summaryOperation,")"]})]})},n)})})};function te(a,e){return e.reduce((s,t)=>t(s),a)}const ne=({columns:a=[],dataSource:e=[],dataTransform:s=({pipeline:c})=>c([]),tableThemeConfig:t={defaultSummaryRow:{},legends:{},searchBox:{},exportButton:{},exportButtonDropdown:{}},defaultSummary:r={enable:!1,fixed:!1},enableLegends:n=!1,search:o={enable:!1,placeholder:"Search table...",onSearch:()=>!1},tableExport:l={enable:!1,exportFileName:"",pdfFontOptions:{fontUrl:"",fontFileName:"",fontName:"",fontStyles:[],fallbackFont:""}},...u})=>{const c=L(a),i=B(c),[d,b]=T.useState(""),p=T.useMemo(()=>{const y=e??[];return s?s({pipeline:g=>te([...y],g)}):y},[e,s]),m=T.useMemo(()=>{const y=d.trim().toLowerCase();return y?p?.filter(g=>o.onSearch?o.onSearch(y,g,i):i.some(N=>{const M=N.dataIndex;if(M===void 0)return!1;const x=_(g,M);if(x==null)return!1;let S=null;const $=F(x);if($==="string"||typeof x=="boolean")S=String(x);else if($==="number"||$==="currency"||$==="id"||$==="percentage"||typeof x=="number"){const v=j(x);v.number!==null&&(S=`${$==="currency"?v.symbol:""}${N.roundOff?D(v.number,N.roundOff):v.number}${$!=="currency"?v.symbol:""}`)}else if(Array.isArray(x))S=x.map(v=>String(v)).join(", ");else if(x instanceof Date)S=x.toLocaleString();else if(typeof x=="object"&&x!==null)try{S=JSON.stringify(x)}catch{S=null}return S?.toLowerCase().includes(y)??!1})):p},[o,d,p,i]);return f.jsx(h.ConfigProvider,{theme:{components:{Table:t,Input:t?.searchBox,Button:t?.exportButton,Dropdown:t?.exportButtonDropdown}},children:f.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:12},children:[f.jsx(J,{columns:i,data:m,legends:{enable:n,style:t?.legends||{}},search:{enable:o.enable,searchText:d,setSearchText:b,placeholder:o.placeholder||"Search table..."},exportButton:{enable:l.enable,exportFileName:l.exportFileName,pdfFontOptions:l.pdfFontOptions}}),f.jsx(h.Table,{columns:c,dataSource:m,summary:u.summary?u.summary:r.enable?y=>f.jsx(h.Table.Summary,{fixed:r.fixed,children:f.jsx(ee,{data:y,columns:i,defaultSummaryRowStyle:t?.defaultSummaryRow||{}})}):void 0,...u})]})})};exports.IntelligentTable=ne;