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