@object-ui/plugin-aggrid 0.4.0 → 0.5.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/.turbo/turbo-build.log +21 -0
- package/CHANGELOG.md +11 -0
- package/OBJECT_AGGRID_CN.md +483 -0
- package/QUICKSTART.md +186 -0
- package/README.md +221 -1
- package/dist/{AgGridImpl-DKkq6v1B.js → AgGridImpl-BQ6tBvrq.js} +61 -57
- package/dist/ObjectAgGridImpl-CGFeGvOH.js +372 -0
- package/dist/{index-B6NPAFZx.js → index-CLKYMco3.js} +273 -139
- package/dist/index.css +1 -1
- package/dist/index.js +4 -3
- package/dist/index.umd.cjs +5 -2
- package/dist/src/ObjectAgGridImpl.d.ts +6 -0
- package/dist/src/VirtualScrolling.d.ts +72 -0
- package/dist/src/index.d.ts +42 -0
- package/dist/src/object-aggrid.types.d.ts +74 -0
- package/package.json +10 -9
- package/src/AgGridImpl.tsx +5 -1
- package/src/ObjectAgGridImpl.tsx +603 -0
- package/src/VirtualScrolling.ts +74 -0
- package/src/index.test.ts +1 -1
- package/src/index.tsx +182 -0
- package/src/object-aggrid.test.ts +99 -0
- package/src/object-aggrid.types.ts +123 -0
- package/vite.config.ts +13 -0
package/dist/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { A as
|
|
1
|
+
import { A as a, O as d, a as m } from "./index-CLKYMco3.js";
|
|
2
2
|
import "react";
|
|
3
3
|
import "@object-ui/core";
|
|
4
4
|
import "@object-ui/components";
|
|
5
5
|
export {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
a as AgGridRenderer,
|
|
7
|
+
d as ObjectAgGridRenderer,
|
|
8
|
+
m as aggridComponents
|
|
8
9
|
};
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(w,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("react"),require("@object-ui/core"),require("@object-ui/components"),require("ag-grid-react")):typeof define=="function"&&define.amd?define(["exports","react","@object-ui/core","@object-ui/components","ag-grid-react"],l):(w=typeof globalThis<"u"?globalThis:w||self,l(w.ObjectUIPluginAgGrid={},w.React,w.ObjectUICore,w.ObjectUIComponents,w.AgGridReact))})(this,(function(w,l,oe,ie,se){"use strict";var re={exports:{}},Z={};var ue;function fe(){if(ue)return Z;ue=1;var t=Symbol.for("react.transitional.element"),c=Symbol.for("react.fragment");function r(a,d,v){var k=null;if(v!==void 0&&(k=""+v),d.key!==void 0&&(k=""+d.key),"key"in d){v={};for(var P in d)P!=="key"&&(v[P]=d[P])}else v=d;return d=v.ref,{$$typeof:t,type:a,key:k,ref:d!==void 0?d:null,props:v}}return Z.Fragment=c,Z.jsx=r,Z.jsxs=r,Z}var K={};var ce;function me(){return ce||(ce=1,process.env.NODE_ENV!=="production"&&(function(){function t(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===O?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case R:return"Fragment";case h:return"Profiler";case C:return"StrictMode";case x:return"Suspense";case D:return"SuspenseList";case H:return"Activity"}if(typeof e=="object")switch(typeof e.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),e.$$typeof){case T:return"Portal";case f:return e.displayName||"Context";case I:return(e._context.displayName||"Context")+".Consumer";case y:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case A:return n=e.displayName||null,n!==null?n:t(e.type)||"Memo";case S:n=e._payload,e=e._init;try{return t(e(n))}catch{}}return null}function c(e){return""+e}function r(e){try{c(e);var n=!1}catch{n=!0}if(n){n=console;var o=n.error,m=typeof Symbol=="function"&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||"Object";return o.call(n,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",m),c(e)}}function a(e){if(e===R)return"<>";if(typeof e=="object"&&e!==null&&e.$$typeof===S)return"<...>";try{var n=t(e);return n?"<"+n+">":"<...>"}catch{return"<...>"}}function d(){var e=M.A;return e===null?null:e.getOwner()}function v(){return Error("react-stack-top-frame")}function k(e){if(_.call(e,"key")){var n=Object.getOwnPropertyDescriptor(e,"key").get;if(n&&n.isReactWarning)return!1}return e.key!==void 0}function P(e,n){function o(){L||(L=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",n))}o.isReactWarning=!0,Object.defineProperty(e,"key",{get:o,configurable:!0})}function W(){var e=t(this.type);return B[e]||(B[e]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),e=this.props.ref,e!==void 0?e:null}function V(e,n,o,m,U,Q){var p=o.ref;return e={$$typeof:N,type:e,key:n,props:o,_owner:m},(p!==void 0?p:null)!==null?Object.defineProperty(e,"ref",{enumerable:!1,get:W}):Object.defineProperty(e,"ref",{enumerable:!1,value:null}),e._store={},Object.defineProperty(e._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(e,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(e,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:U}),Object.defineProperty(e,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:Q}),Object.freeze&&(Object.freeze(e.props),Object.freeze(e)),e}function q(e,n,o,m,U,Q){var p=n.children;if(p!==void 0)if(m)if(F(p)){for(m=0;m<p.length;m++)z(p[m]);Object.freeze&&Object.freeze(p)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else z(p);if(_.call(n,"key")){p=t(e);var G=Object.keys(n).filter(function(te){return te!=="key"});m=0<G.length?"{key: someKey, "+G.join(": ..., ")+": ...}":"{key: someKey}",u[p+m]||(G=0<G.length?"{"+G.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
|
|
2
2
|
let props = %s;
|
|
3
3
|
<%s {...props} />
|
|
4
4
|
React keys must be passed directly to JSX without using spread:
|
|
5
5
|
let props = %s;
|
|
6
|
-
<%s key={someKey} {...props} />`,o,i,x,i),n[i+o]=!0)}if(i=null,r!==void 0&&(E(r),i=""+r),R(a)&&(E(a.key),i=""+a.key),"key"in a){r={};for(var K in a)K!=="key"&&(r[K]=a[K])}else r=a;return i&&y(r,typeof e=="function"?e.displayName||e.name||"Unknown":e),k(e,i,r,u(),B,Z)}function S(e){w(e)?e._store&&(e._store.validated=1):typeof e=="object"&&e!==null&&e.$$typeof===A&&(e._payload.status==="fulfilled"?w(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function w(e){return typeof e=="object"&&e!==null&&e.$$typeof===j}var h=l,j=Symbol.for("react.transitional.element"),p=Symbol.for("react.portal"),_=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),m=Symbol.for("react.profiler"),D=Symbol.for("react.consumer"),I=Symbol.for("react.context"),b=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),N=Symbol.for("react.suspense_list"),V=Symbol.for("react.memo"),A=Symbol.for("react.lazy"),Y=Symbol.for("react.activity"),L=Symbol.for("react.client.reference"),T=h.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,z=Object.prototype.hasOwnProperty,J=Array.isArray,M=console.createTask?console.createTask:function(){return null};h={react_stack_bottom_frame:function(e){return e()}};var U,W={},Q=h.react_stack_bottom_frame.bind(h,c)(),H=M(C(c)),n={};O.Fragment=_,O.jsx=function(e,a,r){var o=1e4>T.recentlyCreatedOwnerStacks++;return G(e,a,r,!1,o?Error("react-stack-top-frame"):Q,o?M(C(e)):H)},O.jsxs=function(e,a,r){var o=1e4>T.recentlyCreatedOwnerStacks++;return G(e,a,r,!0,o?Error("react-stack-top-frame"):Q,o?M(C(e)):H)}})()),O}var te;function ie(){return te||(te=1,process.env.NODE_ENV==="production"?F.exports=le():F.exports=oe()),F.exports}var g=ie();const se=l.lazy(()=>Promise.resolve().then(()=>de)),X=({schema:t})=>g.jsx(l.Suspense,{fallback:g.jsx(re.Skeleton,{className:"w-full h-[500px]"}),children:g.jsx(se,{rowData:t.rowData,columnDefs:t.columnDefs,gridOptions:t.gridOptions,pagination:t.pagination,paginationPageSize:t.paginationPageSize,domLayout:t.domLayout,animateRows:t.animateRows,rowSelection:t.rowSelection,theme:t.theme,height:t.height,className:t.className,editable:t.editable,editType:t.editType,singleClickEdit:t.singleClickEdit,stopEditingWhenCellsLoseFocus:t.stopEditingWhenCellsLoseFocus,exportConfig:t.exportConfig,statusBar:t.statusBar,callbacks:t.callbacks,columnConfig:t.columnConfig,enableRangeSelection:t.enableRangeSelection,enableCharts:t.enableCharts,contextMenu:t.contextMenu})});ae.ComponentRegistry.register("aggrid",X,{label:"AG Grid",icon:"Table",category:"plugin",inputs:[{name:"rowData",type:"array",label:"Row Data",description:"Array of objects to display in the grid",required:!0},{name:"columnDefs",type:"array",label:"Column Definitions",description:"Array of column definitions",required:!0},{name:"pagination",type:"boolean",label:"Enable Pagination",defaultValue:!1},{name:"paginationPageSize",type:"number",label:"Page Size",defaultValue:10,description:"Number of rows per page when pagination is enabled"},{name:"theme",type:"enum",label:"Theme",enum:[{label:"Quartz",value:"quartz"},{label:"Alpine",value:"alpine"},{label:"Balham",value:"balham"},{label:"Material",value:"material"}],defaultValue:"quartz"},{name:"rowSelection",type:"enum",label:"Row Selection",enum:[{label:"None",value:void 0},{label:"Single",value:"single"},{label:"Multiple",value:"multiple"}],defaultValue:void 0,advanced:!0},{name:"domLayout",type:"enum",label:"DOM Layout",enum:[{label:"Normal",value:"normal"},{label:"Auto Height",value:"autoHeight"},{label:"Print",value:"print"}],defaultValue:"normal",advanced:!0},{name:"animateRows",type:"boolean",label:"Animate Rows",defaultValue:!0,advanced:!0},{name:"height",type:"number",label:"Height (px)",defaultValue:500},{name:"editable",type:"boolean",label:"Enable Editing",defaultValue:!1,description:"Allow cells to be edited inline",advanced:!0},{name:"singleClickEdit",type:"boolean",label:"Single Click Edit",defaultValue:!1,description:"Start editing on single click instead of double click",advanced:!0},{name:"exportConfig",type:"code",label:"Export Config (JSON)",description:'Configure CSV export: { enabled: true, fileName: "data.csv" }',advanced:!0},{name:"statusBar",type:"code",label:"Status Bar Config (JSON)",description:'Configure status bar: { enabled: true, aggregations: ["count", "sum", "avg"] }',advanced:!0},{name:"callbacks",type:"code",label:"Event Callbacks (JSON)",description:"Event handlers for cell clicks, selection changes, etc.",advanced:!0},{name:"columnConfig",type:"code",label:"Column Config (JSON)",description:"Global column settings: { resizable: true, sortable: true, filterable: true }",advanced:!0},{name:"enableRangeSelection",type:"boolean",label:"Enable Range Selection",defaultValue:!1,description:"Allow selecting ranges of cells (like Excel)",advanced:!0},{name:"enableCharts",type:"boolean",label:"Enable Charts",defaultValue:!1,description:"Enable integrated charting (requires AG Grid Enterprise)",advanced:!0},{name:"contextMenu",type:"code",label:"Context Menu Config (JSON)",description:'Configure right-click menu: { enabled: true, items: ["copy", "export"] }',advanced:!0},{name:"gridOptions",type:"code",label:"Grid Options (JSON)",description:"Advanced AG Grid options",advanced:!0},{name:"className",type:"string",label:"CSS Class"}],defaultProps:{rowData:[{make:"Tesla",model:"Model Y",price:64950,electric:!0},{make:"Ford",model:"F-Series",price:33850,electric:!1},{make:"Toyota",model:"Corolla",price:29600,electric:!1},{make:"Mercedes",model:"EQA",price:48890,electric:!0},{make:"Fiat",model:"500",price:15774,electric:!1},{make:"Nissan",model:"Juke",price:20675,electric:!1},{make:"Vauxhall",model:"Corsa",price:18460,electric:!1},{make:"Volvo",model:"XC90",price:72835,electric:!1},{make:"Mercedes",model:"GLA",price:47825,electric:!1},{make:"Ford",model:"Puma",price:27420,electric:!1},{make:"Volkswagen",model:"Golf",price:28850,electric:!1},{make:"Kia",model:"Sportage",price:31095,electric:!1}],columnDefs:[{field:"make",headerName:"Make",sortable:!0,filter:!0},{field:"model",headerName:"Model",sortable:!0,filter:!0},{field:"price",headerName:"Price",sortable:!0,filter:"number",valueFormatter:t=>t.value!=null?"$"+t.value.toLocaleString():""},{field:"electric",headerName:"Electric",sortable:!0,filter:!0,cellRenderer:t=>t.value===!0?"⚡ Yes":"No"}],pagination:!0,paginationPageSize:10,theme:"quartz",height:500,animateRows:!0,domLayout:"normal"}});const ue={aggrid:X};function ce({rowData:t=[],columnDefs:v=[],gridOptions:E={},pagination:C=!1,paginationPageSize:u=10,domLayout:c="normal",animateRows:R=!0,rowSelection:y,theme:q="quartz",height:k=500,className:G="",editable:S=!1,editType:w,singleClickEdit:h=!1,stopEditingWhenCellsLoseFocus:j=!0,exportConfig:p,statusBar:_,callbacks:s,columnConfig:m,enableRangeSelection:D=!1,enableCharts:I=!1,contextMenu:b}){const f=l.useRef(null),N=l.useMemo(()=>{if(!_?.enabled)return;const n=_.aggregations||["count","sum","avg"],e=[];return n.includes("count")&&e.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["count"]}}),n.includes("sum")&&e.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["sum"]}}),n.includes("avg")&&e.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["avg"]}}),n.includes("min")&&e.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["min"]}}),n.includes("max")&&e.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["max"]}}),e},[_]),V=l.useCallback(()=>{if(!f.current?.api)return;const n={fileName:p?.fileName||"export.csv",skipColumnHeaders:p?.skipColumnHeaders||!1,allColumns:p?.allColumns||!1,onlySelected:p?.onlySelected||!1};if(f.current.api.exportDataAsCsv(n),s?.onExport){const e=p?.onlySelected?f.current.api.getSelectedRows():t;s.onExport(e||[],"csv")}},[p,s,t]),A=l.useCallback(n=>{if(!b?.enabled)return[];const e=[];return(b.items||["copy","copyWithHeaders","separator","export"]).forEach(r=>{r==="export"?e.push({name:"Export CSV",icon:"<span>📥</span>",action:()=>V()}):r==="autoSizeAll"?e.push({name:"Auto-size All Columns",action:()=>{f.current?.api&&f.current.api.autoSizeAllColumns()}}):r==="resetColumns"?e.push({name:"Reset Columns",action:()=>{f.current?.api&&f.current.api.resetColumnState()}}):e.push(r)}),b.customItems&&(e.length>0&&e.push("separator"),b.customItems.forEach(r=>{e.push({name:r.name,disabled:r.disabled,action:()=>{s?.onContextMenuAction&&s.onContextMenuAction(r.action,n.node?.data)}})})),e},[b,V,s]),Y=l.useCallback(n=>{s?.onCellClicked?.(n)},[s]),L=l.useCallback(n=>{s?.onRowClicked?.(n)},[s]),T=l.useCallback(n=>{s?.onSelectionChanged?.(n)},[s]),z=l.useCallback(n=>{s?.onCellValueChanged?.(n)},[s]),J=l.useCallback(n=>{f.current=n},[]),M=l.useMemo(()=>v?v.map(n=>{const e={...n};return S&&n.editable!==!1&&(e.editable=!0),m&&(m.resizable!==void 0&&n.resizable===void 0&&(e.resizable=m.resizable),m.sortable!==void 0&&n.sortable===void 0&&(e.sortable=m.sortable),m.filterable!==void 0&&n.filter===void 0&&(e.filter=m.filterable)),e}):[],[v,S,m]),U=l.useMemo(()=>({...E,pagination:C,paginationPageSize:u,domLayout:c,animateRows:R,rowSelection:y,editType:w,singleClickEdit:h,stopEditingWhenCellsLoseFocus:j,statusBar:N?{statusPanels:N}:void 0,enableRangeSelection:D,enableCharts:I,getContextMenuItems:b?.enabled?A:void 0,suppressCellFocus:!S,enableCellTextSelection:!0,ensureDomOrder:!0,onCellClicked:Y,onRowClicked:L,onSelectionChanged:T,onCellValueChanged:z,onGridReady:J}),[E,C,u,c,R,y,w,h,j,N,D,I,b,A,S,Y,L,T,z,J]),W=l.useMemo(()=>({height:typeof k=="number"?`${k}px`:k,width:"100%"}),[k]),H=[`ag-theme-${q}`,"rounded-xl","border","border-border","overflow-hidden","shadow-lg",G].filter(Boolean).join(" ");return g.jsxs("div",{className:"ag-grid-container",children:[p?.enabled&&g.jsx("div",{className:"mb-2 flex gap-2",children:g.jsx("button",{onClick:V,className:"px-3 py-1.5 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-md transition-colors",children:"Export CSV"})}),g.jsx("div",{className:H,style:W,children:g.jsx(ne.AgGridReact,{ref:f,rowData:t,columnDefs:M,gridOptions:U})})]})}const de=Object.freeze(Object.defineProperty({__proto__:null,default:ce},Symbol.toStringTag,{value:"Module"}));d.AgGridRenderer=X,d.aggridComponents=ue,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
|
|
6
|
+
<%s key={someKey} {...props} />`,m,p,G,p),u[p+m]=!0)}if(p=null,o!==void 0&&(r(o),p=""+o),k(n)&&(r(n.key),p=""+n.key),"key"in n){o={};for(var ee in n)ee!=="key"&&(o[ee]=n[ee])}else o=n;return p&&P(o,typeof e=="function"?e.displayName||e.name||"Unknown":e),V(e,p,o,d(),U,Q)}function z(e){j(e)?e._store&&(e._store.validated=1):typeof e=="object"&&e!==null&&e.$$typeof===S&&(e._payload.status==="fulfilled"?j(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function j(e){return typeof e=="object"&&e!==null&&e.$$typeof===N}var $=l,N=Symbol.for("react.transitional.element"),T=Symbol.for("react.portal"),R=Symbol.for("react.fragment"),C=Symbol.for("react.strict_mode"),h=Symbol.for("react.profiler"),I=Symbol.for("react.consumer"),f=Symbol.for("react.context"),y=Symbol.for("react.forward_ref"),x=Symbol.for("react.suspense"),D=Symbol.for("react.suspense_list"),A=Symbol.for("react.memo"),S=Symbol.for("react.lazy"),H=Symbol.for("react.activity"),O=Symbol.for("react.client.reference"),M=$.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,_=Object.prototype.hasOwnProperty,F=Array.isArray,Y=console.createTask?console.createTask:function(){return null};$={react_stack_bottom_frame:function(e){return e()}};var L,B={},ae=$.react_stack_bottom_frame.bind($,v)(),X=Y(a(v)),u={};K.Fragment=R,K.jsx=function(e,n,o){var m=1e4>M.recentlyCreatedOwnerStacks++;return q(e,n,o,!1,m?Error("react-stack-top-frame"):ae,m?Y(a(e)):X)},K.jsxs=function(e,n,o){var m=1e4>M.recentlyCreatedOwnerStacks++;return q(e,n,o,!0,m?Error("react-stack-top-frame"):ae,m?Y(a(e)):X)}})()),K}var de;function pe(){return de||(de=1,process.env.NODE_ENV==="production"?re.exports=fe():re.exports=me()),re.exports}var g=pe();const ge=l.lazy(()=>Promise.resolve().then(()=>he)),be=l.lazy(()=>Promise.resolve().then(()=>ke)),ne=({schema:t})=>g.jsx(l.Suspense,{fallback:g.jsx(ie.Skeleton,{className:"w-full h-[500px]"}),children:g.jsx(ge,{rowData:t.rowData,columnDefs:t.columnDefs,gridOptions:t.gridOptions,pagination:t.pagination,paginationPageSize:t.paginationPageSize,domLayout:t.domLayout,animateRows:t.animateRows,rowSelection:t.rowSelection,theme:t.theme,height:t.height,className:t.className,editable:t.editable,editType:t.editType,singleClickEdit:t.singleClickEdit,stopEditingWhenCellsLoseFocus:t.stopEditingWhenCellsLoseFocus,exportConfig:t.exportConfig,statusBar:t.statusBar,callbacks:t.callbacks,columnConfig:t.columnConfig,enableRangeSelection:t.enableRangeSelection,enableCharts:t.enableCharts,contextMenu:t.contextMenu})});oe.ComponentRegistry.register("aggrid",ne,{namespace:"plugin-aggrid",label:"AG Grid",icon:"Table",category:"plugin",inputs:[{name:"rowData",type:"array",label:"Row Data",description:"Array of objects to display in the grid",required:!0},{name:"columnDefs",type:"array",label:"Column Definitions",description:"Array of column definitions",required:!0},{name:"pagination",type:"boolean",label:"Enable Pagination",defaultValue:!1},{name:"paginationPageSize",type:"number",label:"Page Size",defaultValue:10,description:"Number of rows per page when pagination is enabled"},{name:"theme",type:"enum",label:"Theme",enum:[{label:"Quartz",value:"quartz"},{label:"Alpine",value:"alpine"},{label:"Balham",value:"balham"},{label:"Material",value:"material"}],defaultValue:"quartz"},{name:"rowSelection",type:"enum",label:"Row Selection",enum:[{label:"None",value:void 0},{label:"Single",value:"single"},{label:"Multiple",value:"multiple"}],defaultValue:void 0,advanced:!0},{name:"domLayout",type:"enum",label:"DOM Layout",enum:[{label:"Normal",value:"normal"},{label:"Auto Height",value:"autoHeight"},{label:"Print",value:"print"}],defaultValue:"normal",advanced:!0},{name:"animateRows",type:"boolean",label:"Animate Rows",defaultValue:!0,advanced:!0},{name:"height",type:"number",label:"Height (px)",defaultValue:500},{name:"editable",type:"boolean",label:"Enable Editing",defaultValue:!1,description:"Allow cells to be edited inline",advanced:!0},{name:"singleClickEdit",type:"boolean",label:"Single Click Edit",defaultValue:!1,description:"Start editing on single click instead of double click",advanced:!0},{name:"exportConfig",type:"code",label:"Export Config (JSON)",description:'Configure CSV export: { enabled: true, fileName: "data.csv" }',advanced:!0},{name:"statusBar",type:"code",label:"Status Bar Config (JSON)",description:'Configure status bar: { enabled: true, aggregations: ["count", "sum", "avg"] }',advanced:!0},{name:"callbacks",type:"code",label:"Event Callbacks (JSON)",description:"Event handlers for cell clicks, selection changes, etc.",advanced:!0},{name:"columnConfig",type:"code",label:"Column Config (JSON)",description:"Global column settings: { resizable: true, sortable: true, filterable: true }",advanced:!0},{name:"enableRangeSelection",type:"boolean",label:"Enable Range Selection",defaultValue:!1,description:"Allow selecting ranges of cells (like Excel)",advanced:!0},{name:"enableCharts",type:"boolean",label:"Enable Charts",defaultValue:!1,description:"Enable integrated charting (requires AG Grid Enterprise)",advanced:!0},{name:"contextMenu",type:"code",label:"Context Menu Config (JSON)",description:'Configure right-click menu: { enabled: true, items: ["copy", "export"] }',advanced:!0},{name:"gridOptions",type:"code",label:"Grid Options (JSON)",description:"Advanced AG Grid options",advanced:!0},{name:"className",type:"string",label:"CSS Class"}],defaultProps:{rowData:[{make:"Tesla",model:"Model Y",price:64950,electric:!0},{make:"Ford",model:"F-Series",price:33850,electric:!1},{make:"Toyota",model:"Corolla",price:29600,electric:!1},{make:"Mercedes",model:"EQA",price:48890,electric:!0},{make:"Fiat",model:"500",price:15774,electric:!1},{make:"Nissan",model:"Juke",price:20675,electric:!1},{make:"Vauxhall",model:"Corsa",price:18460,electric:!1},{make:"Volvo",model:"XC90",price:72835,electric:!1},{make:"Mercedes",model:"GLA",price:47825,electric:!1},{make:"Ford",model:"Puma",price:27420,electric:!1},{make:"Volkswagen",model:"Golf",price:28850,electric:!1},{make:"Kia",model:"Sportage",price:31095,electric:!1}],columnDefs:[{field:"make",headerName:"Make",sortable:!0,filter:!0},{field:"model",headerName:"Model",sortable:!0,filter:!0},{field:"price",headerName:"Price",sortable:!0,filter:"number",valueFormatter:t=>t.value!=null?"$"+t.value.toLocaleString():""},{field:"electric",headerName:"Electric",sortable:!0,filter:!0,cellRenderer:t=>t.value===!0?"⚡ Yes":"No"}],pagination:!0,paginationPageSize:10,theme:"quartz",height:500,animateRows:!0,domLayout:"normal"}});const le=({schema:t})=>g.jsx(l.Suspense,{fallback:g.jsx(ie.Skeleton,{className:"w-full h-[500px]"}),children:g.jsx(be,{objectName:t.objectName,dataSource:t.dataSource,fields:t.fields,fieldNames:t.fieldNames,filters:t.filters,sort:t.sort,pageSize:t.pageSize,pagination:t.pagination,domLayout:t.domLayout,animateRows:t.animateRows,rowSelection:t.rowSelection,theme:t.theme,height:t.height,className:t.className,editable:t.editable,editType:t.editType,singleClickEdit:t.singleClickEdit,stopEditingWhenCellsLoseFocus:t.stopEditingWhenCellsLoseFocus,exportConfig:t.exportConfig,statusBar:t.statusBar,callbacks:t.callbacks,columnConfig:t.columnConfig,enableRangeSelection:t.enableRangeSelection,enableCharts:t.enableCharts,contextMenu:t.contextMenu})}),ve={aggrid:ne,"object-aggrid":le};oe.ComponentRegistry.register("object-aggrid",le,{namespace:"plugin-aggrid",label:"Object AG Grid",icon:"Table",category:"plugin",inputs:[{name:"objectName",type:"string",label:"Object Name",description:"Name of the object to fetch metadata and data from",required:!0},{name:"dataSource",type:"object",label:"Data Source",description:"ObjectStack data source adapter instance",required:!0},{name:"fieldNames",type:"array",label:"Field Names",description:"Optional: Specify which fields to show (defaults to all fields)"},{name:"filters",type:"object",label:"Filters",description:"Query filters to apply to the data"},{name:"sort",type:"object",label:"Sort",description:'Sorting configuration: { fieldName: "asc" | "desc" }'},{name:"pagination",type:"boolean",label:"Enable Pagination",defaultValue:!0},{name:"pageSize",type:"number",label:"Page Size",defaultValue:10,description:"Number of rows per page"},{name:"theme",type:"enum",label:"Theme",enum:[{label:"Quartz",value:"quartz"},{label:"Alpine",value:"alpine"},{label:"Balham",value:"balham"},{label:"Material",value:"material"}],defaultValue:"quartz"},{name:"height",type:"number",label:"Height (px)",defaultValue:500},{name:"editable",type:"boolean",label:"Enable Editing",defaultValue:!1,description:"Allow cells to be edited inline",advanced:!0},{name:"exportConfig",type:"code",label:"Export Config (JSON)",description:'Configure CSV export: { enabled: true, fileName: "data.csv" }',advanced:!0},{name:"columnConfig",type:"code",label:"Column Config (JSON)",description:"Global column settings: { resizable: true, sortable: true, filterable: true }",advanced:!0},{name:"className",type:"string",label:"CSS Class"}]});function Ce({rowData:t=[],columnDefs:c=[],gridOptions:r={},pagination:a=!1,paginationPageSize:d=10,domLayout:v="normal",animateRows:k=!0,rowSelection:P,theme:W="quartz",height:V=500,className:q="",editable:z=!1,editType:j,singleClickEdit:$=!1,stopEditingWhenCellsLoseFocus:N=!0,exportConfig:T,statusBar:R,callbacks:C,columnConfig:h,enableRangeSelection:I=!1,enableCharts:f=!1,contextMenu:y}){const x=l.useRef(null),D=l.useMemo(()=>{if(!R?.enabled)return;const u=R.aggregations||["count","sum","avg"],e=[];return u.includes("count")&&e.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["count"]}}),u.includes("sum")&&e.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["sum"]}}),u.includes("avg")&&e.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["avg"]}}),u.includes("min")&&e.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["min"]}}),u.includes("max")&&e.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["max"]}}),e},[R]),A=l.useCallback(()=>{if(!x.current?.api)return;const u={fileName:T?.fileName||"export.csv",skipColumnHeaders:T?.skipColumnHeaders||!1,allColumns:T?.allColumns||!1,onlySelected:T?.onlySelected||!1};if(x.current.api.exportDataAsCsv(u),C?.onExport){const e=T?.onlySelected?x.current.api.getSelectedRows():t;C.onExport(e||[],"csv")}},[T,C,t]),S=l.useCallback(u=>{if(!y?.enabled)return[];const e=[];return(y.items||["copy","copyWithHeaders","separator","export"]).forEach(o=>{o==="export"?e.push({name:"Export CSV",icon:"<span>📥</span>",action:()=>A()}):o==="autoSizeAll"?e.push({name:"Auto-size All Columns",action:()=>{x.current?.api&&x.current.api.autoSizeAllColumns()}}):o==="resetColumns"?e.push({name:"Reset Columns",action:()=>{x.current?.api&&x.current.api.resetColumnState()}}):e.push(o)}),y.customItems&&(e.length>0&&e.push("separator"),y.customItems.forEach(o=>{e.push({name:o.name,disabled:o.disabled,action:()=>{C?.onContextMenuAction&&C.onContextMenuAction(o.action,u.node?.data)}})})),e},[y,A,C]),H=l.useCallback(u=>{C?.onCellClicked?.(u)},[C]),O=l.useCallback(u=>{C?.onRowClicked?.(u)},[C]),M=l.useCallback(u=>{C?.onSelectionChanged?.(u)},[C]),_=l.useCallback(u=>{C?.onCellValueChanged?.(u)},[C]),F=l.useCallback(u=>{x.current=u},[]),Y=l.useMemo(()=>c?c.map(u=>{const e={...u};return z&&u.editable!==!1&&(e.editable=!0),h&&(h.resizable!==void 0&&u.resizable===void 0&&(e.resizable=h.resizable),h.sortable!==void 0&&u.sortable===void 0&&(e.sortable=h.sortable),h.filterable!==void 0&&u.filter===void 0&&(e.filter=h.filterable)),e}):[],[c,z,h]),L=l.useMemo(()=>({...r,pagination:a,paginationPageSize:d,domLayout:v,animateRows:k,rowSelection:P,editType:j,singleClickEdit:$,stopEditingWhenCellsLoseFocus:N,statusBar:D?{statusPanels:D}:void 0,enableRangeSelection:I,enableCharts:f,getContextMenuItems:y?.enabled?S:void 0,suppressCellFocus:!z,enableCellTextSelection:!0,ensureDomOrder:!0,rowBuffer:r.rowBuffer??10,debounceVerticalScrollbar:r.debounceVerticalScrollbar??t.length>1e3,onCellClicked:H,onRowClicked:O,onSelectionChanged:M,onCellValueChanged:_,onGridReady:F}),[r,a,d,v,k,P,j,$,N,D,I,f,y,S,z,t.length,H,O,M,_,F]),B=l.useMemo(()=>({height:typeof V=="number"?`${V}px`:V,width:"100%"}),[V]),X=[`ag-theme-${W}`,"rounded-xl","border","border-border","overflow-hidden","shadow-lg",q].filter(Boolean).join(" ");return g.jsxs("div",{className:"ag-grid-container",children:[T?.enabled&&g.jsx("div",{className:"mb-2 flex gap-2",children:g.jsx("button",{onClick:A,className:"px-3 py-1.5 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-md transition-colors",children:"Export CSV"})}),g.jsx("div",{className:X,style:B,children:g.jsx(se.AgGridReact,{ref:x,rowData:t,columnDefs:Y,gridOptions:L})})]})}const he=Object.freeze(Object.defineProperty({__proto__:null,default:Ce},Symbol.toStringTag,{value:"Module"})),ye={text:"agTextColumnFilter",textarea:"agTextColumnFilter",number:"agNumberColumnFilter",currency:"agNumberColumnFilter",percent:"agNumberColumnFilter",boolean:"agSetColumnFilter",date:"agDateColumnFilter",datetime:"agDateColumnFilter",time:"agTextColumnFilter",email:"agTextColumnFilter",phone:"agTextColumnFilter",url:"agTextColumnFilter",select:"agSetColumnFilter"};function Se({objectName:t,dataSource:c,fields:r,fieldNames:a,filters:d,sort:v,pageSize:k=10,pagination:P=!0,domLayout:W="normal",animateRows:V=!0,rowSelection:q,theme:z="quartz",height:j=500,className:$="",editable:N=!1,editType:T,singleClickEdit:R=!1,stopEditingWhenCellsLoseFocus:C=!0,exportConfig:h,statusBar:I,callbacks:f,columnConfig:y,enableRangeSelection:x=!1,enableCharts:D=!1,contextMenu:A}){const S=l.useRef(null),[H,O]=l.useState(!0),[M,_]=l.useState(null),[F,Y]=l.useState(null),[L,B]=l.useState([]),[ae,X]=l.useState(0);l.useEffect(()=>{if(!c){_(new Error("DataSource is required")),O(!1);return}(async()=>{try{O(!0),_(null);const i=await c.getObjectSchema(t);Y(i)}catch(i){const b=i instanceof Error?i:new Error(String(i));_(b),f?.onDataError?.(b)}finally{O(!1)}})()},[t,c,f]),l.useEffect(()=>{if(!c||!F)return;(async()=>{try{O(!0),_(null);const i={$top:k,$skip:0};d&&(i.$filter=d),v&&(i.$orderby=v);const b=await c.find(t,i);B(b.data||[]),X(b.total||0),f?.onDataLoaded?.(b.data||[])}catch(i){const b=i instanceof Error?i:new Error(String(i));_(b),f?.onDataError?.(b)}finally{O(!1)}})()},[t,c,F,d,v,k,f]);const u=l.useMemo(()=>{if(!F?.fields)return[];const s=r||Object.values(F.fields);return(a?s.filter(b=>a.includes(b.name)):s).map(b=>{const E={field:b.name,headerName:b.label||b.name,sortable:b.sortable!==!1,filter:xe(b),editable:N&&!b.readonly};return y&&(y.resizable!==void 0&&(E.resizable=y.resizable),y.sortable!==void 0&&E.sortable===void 0&&(E.sortable=y.sortable)),Ee(E,b),E})},[F,r,a,N,y]),e=l.useMemo(()=>{if(!I?.enabled)return;const s=I.aggregations||["count","sum","avg"],i=[];return s.includes("count")&&i.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["count"]}}),s.includes("sum")&&i.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["sum"]}}),s.includes("avg")&&i.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["avg"]}}),s.includes("min")&&i.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["min"]}}),s.includes("max")&&i.push({statusPanel:"agAggregationComponent",statusPanelParams:{aggFuncs:["max"]}}),i},[I]),n=l.useCallback(()=>{if(!S.current?.api)return;const s={fileName:h?.fileName||`${t}-export.csv`,skipColumnHeaders:h?.skipColumnHeaders||!1,allColumns:h?.allColumns||!1,onlySelected:h?.onlySelected||!1};if(S.current.api.exportDataAsCsv(s),f?.onExport){const i=h?.onlySelected?S.current.api.getSelectedRows():L;f.onExport(i||[],"csv")}},[h,f,L,t]),o=l.useCallback(s=>{if(!A?.enabled)return[];const i=[];return(A.items||["copy","copyWithHeaders","separator","export"]).forEach(E=>{E==="export"?i.push({name:"Export CSV",icon:"<span>📥</span>",action:()=>n()}):E==="autoSizeAll"?i.push({name:"Auto-size All Columns",action:()=>{S.current?.api&&S.current.api.autoSizeAllColumns()}}):E==="resetColumns"?i.push({name:"Reset Columns",action:()=>{S.current?.api&&S.current.api.resetColumnState()}}):i.push(E)}),A.customItems&&(i.length>0&&i.push("separator"),A.customItems.forEach(E=>{i.push({name:E.name,disabled:E.disabled,action:()=>{f?.onContextMenuAction&&f.onContextMenuAction(E.action,s.node?.data)}})})),i},[A,n,f]),m=l.useCallback(s=>{f?.onCellClicked?.(s)},[f]),U=l.useCallback(s=>{f?.onRowClicked?.(s)},[f]),Q=l.useCallback(s=>{f?.onSelectionChanged?.(s)},[f]),p=l.useCallback(async s=>{if(f?.onCellValueChanged?.(s),c&&s.data&&s.data.id)try{await c.update(t,s.data.id,{[s.colDef.field]:s.newValue})}catch(i){console.error("Failed to update record:",i),s.node.setDataValue(s.colDef.field,s.oldValue)}},[f,c,t]),G=l.useCallback(s=>{S.current=s},[]),ee=l.useMemo(()=>({pagination:P,paginationPageSize:k,domLayout:W,animateRows:V,rowSelection:q,editType:T,singleClickEdit:R,stopEditingWhenCellsLoseFocus:C,statusBar:e?{statusPanels:e}:void 0,enableRangeSelection:x,enableCharts:D,getContextMenuItems:A?.enabled?o:void 0,suppressCellFocus:!N,enableCellTextSelection:!0,ensureDomOrder:!0,onCellClicked:m,onRowClicked:U,onSelectionChanged:Q,onCellValueChanged:p,onGridReady:G}),[P,k,W,V,q,T,R,C,e,x,D,A,o,N,m,U,Q,p,G]),te=l.useMemo(()=>({height:typeof j=="number"?`${j}px`:j,width:"100%"}),[j]),Ae=[`ag-theme-${z}`,"rounded-xl","border","border-border","overflow-hidden","shadow-lg",$].filter(Boolean).join(" ");return H?g.jsx("div",{className:"flex items-center justify-center",style:te,children:g.jsxs("div",{className:"text-muted-foreground",children:["Loading ",t,"..."]})}):M?g.jsx("div",{className:"flex items-center justify-center",style:te,children:g.jsxs("div",{className:"text-destructive",children:["Error loading data: ",M.message]})}):g.jsxs("div",{className:"object-aggrid-container",children:[h?.enabled&&g.jsx("div",{className:"mb-2 flex gap-2",children:g.jsx("button",{onClick:n,className:"px-3 py-1.5 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-md transition-colors",children:"Export CSV"})}),g.jsx("div",{className:Ae,style:te,children:g.jsx(se.AgGridReact,{ref:S,rowData:L,columnDefs:u,gridOptions:ee})})]})}function J(t){const c=document.createElement("div");return c.textContent=t,c.innerHTML}function xe(t){return t.filterable===!1?!1:ye[t.type]||"agTextColumnFilter"}function Ee(t,c){switch(c.type){case"boolean":t.cellRenderer=r=>r.value===!0?"✓ Yes":r.value===!1?"✗ No":"";break;case"currency":t.valueFormatter=r=>{if(r.value==null)return"";const a=c.currency||"USD",d=c.precision||2;return new Intl.NumberFormat("en-US",{style:"currency",currency:a,minimumFractionDigits:d,maximumFractionDigits:d}).format(r.value)};break;case"percent":t.valueFormatter=r=>{if(r.value==null)return"";const a=c.precision||2;return`${(r.value*100).toFixed(a)}%`};break;case"date":t.valueFormatter=r=>{if(!r.value)return"";try{const a=new Date(r.value);return isNaN(a.getTime())?"":a.toLocaleDateString()}catch{return""}};break;case"datetime":t.valueFormatter=r=>{if(!r.value)return"";try{const a=new Date(r.value);return isNaN(a.getTime())?"":a.toLocaleString()}catch{return""}};break;case"time":t.valueFormatter=r=>r.value?r.value:"";break;case"email":t.cellRenderer=r=>{if(!r.value)return"";const a=J(r.value);return`<a href="mailto:${a}" class="text-blue-600 hover:underline">${a}</a>`};break;case"url":t.cellRenderer=r=>{if(!r.value)return"";const a=J(r.value);return`<a href="${a}" target="_blank" rel="noopener noreferrer" class="text-blue-600 hover:underline">${a}</a>`};break;case"phone":t.cellRenderer=r=>{if(!r.value)return"";const a=J(r.value);return`<a href="tel:${a}" class="text-blue-600 hover:underline">${a}</a>`};break;case"select":t.valueFormatter=r=>r.value?(c.options||[]).find(v=>v.value===r.value)?.label||r.value:"";break;case"lookup":case"master_detail":t.valueFormatter=r=>r.value?typeof r.value=="object"?r.value.name||r.value.label||r.value.id||"":String(r.value):"";break;case"number":{const r=c.precision;r!==void 0&&(t.valueFormatter=a=>a.value==null?"":Number(a.value).toFixed(r));break}case"color":t.cellRenderer=r=>{if(!r.value)return"";const a=J(r.value);return`<div class="flex items-center gap-2">
|
|
7
|
+
<div style="width: 16px; height: 16px; background-color: ${a}; border: 1px solid #ccc; border-radius: 2px;"></div>
|
|
8
|
+
<span>${a}</span>
|
|
9
|
+
</div>`};break;case"rating":t.cellRenderer=r=>{if(r.value==null)return"";const a=c.max||5;return"⭐".repeat(Math.min(r.value,a))};break;case"image":t.cellRenderer=r=>{if(!r.value)return"";const a=typeof r.value=="string"?r.value:r.value.url;return a?`<img src="${J(a)}" alt="" style="width: 40px; height: 40px; object-fit: cover; border-radius: 4px;" />`:""};break;case"avatar":t.cellRenderer=r=>{if(!r.value)return"";const a=typeof r.value=="string"?r.value:r.value.url;return a?`<img src="${J(a)}" alt="" style="width: 32px; height: 32px; object-fit: cover; border-radius: 50%;" />`:""};break}}const ke=Object.freeze(Object.defineProperty({__proto__:null,default:Se},Symbol.toStringTag,{value:"Module"}));w.AgGridRenderer=ne,w.ObjectAgGridRenderer=le,w.aggridComponents=ve,Object.defineProperty(w,Symbol.toStringTag,{value:"Module"})}));
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ObjectAgGridImplProps } from './object-aggrid.types';
|
|
2
|
+
/**
|
|
3
|
+
* ObjectAgGridImpl - Metadata-driven AG Grid implementation
|
|
4
|
+
* Fetches object metadata and data from ObjectStack and renders the grid
|
|
5
|
+
*/
|
|
6
|
+
export default function ObjectAgGridImpl({ objectName, dataSource, fields: providedFields, fieldNames, filters, sort, pageSize, pagination, domLayout, animateRows, rowSelection, theme, height, className, editable, editType, singleClickEdit, stopEditingWhenCellsLoseFocus, exportConfig, statusBar, callbacks, columnConfig, enableRangeSelection, enableCharts, contextMenu, }: ObjectAgGridImplProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Virtual Scrolling in AG Grid
|
|
10
|
+
*
|
|
11
|
+
* AG Grid provides built-in virtual scrolling by default, which renders only
|
|
12
|
+
* the visible rows in the viewport. This is a core feature of AG Grid and
|
|
13
|
+
* requires no additional configuration.
|
|
14
|
+
*
|
|
15
|
+
* ## How It Works
|
|
16
|
+
*
|
|
17
|
+
* - AG Grid automatically virtualizes rows by rendering only visible rows
|
|
18
|
+
* - As you scroll, rows are recycled and reused for new data
|
|
19
|
+
* - This provides excellent performance even with datasets of 100,000+ rows
|
|
20
|
+
*
|
|
21
|
+
* ## Performance Tips
|
|
22
|
+
*
|
|
23
|
+
* 1. **Row Buffer**: Adjust `rowBuffer` to control how many extra rows are rendered
|
|
24
|
+
* ```ts
|
|
25
|
+
* gridOptions: { rowBuffer: 10 } // Render 10 extra rows above/below viewport
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* 2. **Suppress Animations**: Disable animations for very large datasets
|
|
29
|
+
* ```ts
|
|
30
|
+
* animateRows: false
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* 3. **Debounce Vertical Scroll**: Add delay to vertical scroll updates
|
|
34
|
+
* ```ts
|
|
35
|
+
* gridOptions: { debounceVerticalScrollbar: true }
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* 4. **Row Height**: Use fixed row heights for better performance
|
|
39
|
+
* ```ts
|
|
40
|
+
* gridOptions: { rowHeight: 40 }
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* ## Example Usage
|
|
44
|
+
*
|
|
45
|
+
* ```tsx
|
|
46
|
+
* <AgGrid
|
|
47
|
+
* rowData={largeDataset} // 10,000+ items
|
|
48
|
+
* columnDefs={columns}
|
|
49
|
+
* gridOptions={{
|
|
50
|
+
* rowBuffer: 10,
|
|
51
|
+
* rowHeight: 40,
|
|
52
|
+
* debounceVerticalScrollbar: true,
|
|
53
|
+
* }}
|
|
54
|
+
* animateRows={false}
|
|
55
|
+
* />
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* ## References
|
|
59
|
+
*
|
|
60
|
+
* - [AG Grid Row Virtualisation](https://www.ag-grid.com/javascript-data-grid/dom-virtualisation/)
|
|
61
|
+
* - [Performance Best Practices](https://www.ag-grid.com/javascript-data-grid/performance/)
|
|
62
|
+
*/
|
|
63
|
+
export declare const VIRTUAL_SCROLLING_DOCS: {
|
|
64
|
+
enabled: boolean;
|
|
65
|
+
automatic: boolean;
|
|
66
|
+
recommendedSettings: {
|
|
67
|
+
rowBuffer: number;
|
|
68
|
+
rowHeight: number;
|
|
69
|
+
debounceVerticalScrollbar: boolean;
|
|
70
|
+
animateRows: boolean;
|
|
71
|
+
};
|
|
72
|
+
};
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { AgGridCallbacks, ExportConfig, StatusBarConfig, ColumnConfig, ContextMenuConfig } from './types';
|
|
3
|
+
import { DataSource } from '../../types/src';
|
|
3
4
|
export type { AgGridSchema, SimpleColumnDef, AgGridCallbacks, ExportConfig, StatusBarConfig, ColumnConfig, ContextMenuConfig } from './types';
|
|
5
|
+
export type { ObjectAgGridSchema } from './object-aggrid.types';
|
|
4
6
|
export interface AgGridRendererProps {
|
|
5
7
|
schema: {
|
|
6
8
|
type: string;
|
|
@@ -34,6 +36,46 @@ export interface AgGridRendererProps {
|
|
|
34
36
|
* This wrapper handles lazy loading internally using React.Suspense
|
|
35
37
|
*/
|
|
36
38
|
export declare const AgGridRenderer: React.FC<AgGridRendererProps>;
|
|
39
|
+
/**
|
|
40
|
+
* ObjectAgGridRenderer - The public API for the metadata-driven AG Grid component
|
|
41
|
+
* This wrapper handles lazy loading internally using React.Suspense
|
|
42
|
+
*/
|
|
43
|
+
export interface ObjectAgGridRendererProps {
|
|
44
|
+
schema: {
|
|
45
|
+
type: string;
|
|
46
|
+
id?: string;
|
|
47
|
+
className?: string;
|
|
48
|
+
objectName: string;
|
|
49
|
+
dataSource?: DataSource;
|
|
50
|
+
fields?: any[];
|
|
51
|
+
fieldNames?: string[];
|
|
52
|
+
filters?: Record<string, any>;
|
|
53
|
+
sort?: Record<string, 'asc' | 'desc'>;
|
|
54
|
+
pageSize?: number;
|
|
55
|
+
pagination?: boolean;
|
|
56
|
+
domLayout?: 'normal' | 'autoHeight' | 'print';
|
|
57
|
+
animateRows?: boolean;
|
|
58
|
+
rowSelection?: 'single' | 'multiple';
|
|
59
|
+
theme?: 'alpine' | 'balham' | 'material' | 'quartz';
|
|
60
|
+
height?: number | string;
|
|
61
|
+
editable?: boolean;
|
|
62
|
+
editType?: 'fullRow';
|
|
63
|
+
singleClickEdit?: boolean;
|
|
64
|
+
stopEditingWhenCellsLoseFocus?: boolean;
|
|
65
|
+
exportConfig?: ExportConfig;
|
|
66
|
+
statusBar?: StatusBarConfig;
|
|
67
|
+
callbacks?: AgGridCallbacks & {
|
|
68
|
+
onDataLoaded?: (data: any[]) => void;
|
|
69
|
+
onDataError?: (error: Error) => void;
|
|
70
|
+
};
|
|
71
|
+
columnConfig?: ColumnConfig;
|
|
72
|
+
enableRangeSelection?: boolean;
|
|
73
|
+
enableCharts?: boolean;
|
|
74
|
+
contextMenu?: ContextMenuConfig;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export declare const ObjectAgGridRenderer: React.FC<ObjectAgGridRendererProps>;
|
|
37
78
|
export declare const aggridComponents: {
|
|
38
79
|
aggrid: React.FC<AgGridRendererProps>;
|
|
80
|
+
'object-aggrid': React.FC<ObjectAgGridRendererProps>;
|
|
39
81
|
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { DataSource, FieldMetadata } from '../../types/src';
|
|
2
|
+
import { AgGridCallbacks, ExportConfig, StatusBarConfig, ColumnConfig, ContextMenuConfig } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Object AgGrid schema for metadata-driven grid
|
|
5
|
+
*/
|
|
6
|
+
export interface ObjectAgGridSchema {
|
|
7
|
+
type: 'object-aggrid';
|
|
8
|
+
id?: string;
|
|
9
|
+
className?: string;
|
|
10
|
+
objectName: string;
|
|
11
|
+
dataSource: DataSource;
|
|
12
|
+
fields?: FieldMetadata[];
|
|
13
|
+
fieldNames?: string[];
|
|
14
|
+
filters?: Record<string, any>;
|
|
15
|
+
sort?: Record<string, 'asc' | 'desc'>;
|
|
16
|
+
pageSize?: number;
|
|
17
|
+
pagination?: boolean;
|
|
18
|
+
domLayout?: 'normal' | 'autoHeight' | 'print';
|
|
19
|
+
animateRows?: boolean;
|
|
20
|
+
rowSelection?: 'single' | 'multiple';
|
|
21
|
+
editable?: boolean;
|
|
22
|
+
editType?: 'fullRow';
|
|
23
|
+
singleClickEdit?: boolean;
|
|
24
|
+
stopEditingWhenCellsLoseFocus?: boolean;
|
|
25
|
+
exportConfig?: ExportConfig;
|
|
26
|
+
statusBar?: StatusBarConfig;
|
|
27
|
+
columnConfig?: ColumnConfig;
|
|
28
|
+
enableRangeSelection?: boolean;
|
|
29
|
+
enableCharts?: boolean;
|
|
30
|
+
contextMenu?: ContextMenuConfig;
|
|
31
|
+
callbacks?: AgGridCallbacks & {
|
|
32
|
+
onDataLoaded?: (data: any[]) => void;
|
|
33
|
+
onDataError?: (error: Error) => void;
|
|
34
|
+
};
|
|
35
|
+
theme?: 'alpine' | 'balham' | 'material' | 'quartz';
|
|
36
|
+
height?: number | string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Props for ObjectAgGridImpl component
|
|
40
|
+
*/
|
|
41
|
+
export interface ObjectAgGridImplProps {
|
|
42
|
+
objectName: string;
|
|
43
|
+
dataSource?: DataSource;
|
|
44
|
+
fields?: FieldMetadata[];
|
|
45
|
+
fieldNames?: string[];
|
|
46
|
+
filters?: Record<string, any>;
|
|
47
|
+
sort?: Record<string, 'asc' | 'desc'>;
|
|
48
|
+
pageSize?: number;
|
|
49
|
+
pagination?: boolean;
|
|
50
|
+
domLayout?: 'normal' | 'autoHeight' | 'print';
|
|
51
|
+
animateRows?: boolean;
|
|
52
|
+
rowSelection?: 'single' | 'multiple';
|
|
53
|
+
theme?: 'alpine' | 'balham' | 'material' | 'quartz';
|
|
54
|
+
height?: number | string;
|
|
55
|
+
className?: string;
|
|
56
|
+
editable?: boolean;
|
|
57
|
+
editType?: 'fullRow';
|
|
58
|
+
singleClickEdit?: boolean;
|
|
59
|
+
stopEditingWhenCellsLoseFocus?: boolean;
|
|
60
|
+
exportConfig?: ExportConfig;
|
|
61
|
+
statusBar?: StatusBarConfig;
|
|
62
|
+
callbacks?: AgGridCallbacks & {
|
|
63
|
+
onDataLoaded?: (data: any[]) => void;
|
|
64
|
+
onDataError?: (error: Error) => void;
|
|
65
|
+
};
|
|
66
|
+
columnConfig?: ColumnConfig;
|
|
67
|
+
enableRangeSelection?: boolean;
|
|
68
|
+
enableCharts?: boolean;
|
|
69
|
+
contextMenu?: ContextMenuConfig;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Field type to AG Grid filter type mapping
|
|
73
|
+
*/
|
|
74
|
+
export declare const FIELD_TYPE_TO_FILTER_TYPE: Record<string, string | boolean>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@object-ui/plugin-aggrid",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "AG Grid data grid plugin for Object UI, powered by AG Grid Community",
|
|
@@ -25,10 +25,11 @@
|
|
|
25
25
|
"./style.css": "./dist/index.css"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@object-ui/components": "0.
|
|
29
|
-
"@object-ui/core": "0.
|
|
30
|
-
"@object-ui/react": "0.
|
|
31
|
-
"@object-ui/types": "0.
|
|
28
|
+
"@object-ui/components": "0.5.0",
|
|
29
|
+
"@object-ui/core": "0.5.0",
|
|
30
|
+
"@object-ui/react": "0.5.0",
|
|
31
|
+
"@object-ui/types": "0.5.0",
|
|
32
|
+
"@object-ui/data-objectstack": "0.5.0"
|
|
32
33
|
},
|
|
33
34
|
"peerDependencies": {
|
|
34
35
|
"react": "^18.0.0 || ^19.0.0",
|
|
@@ -37,11 +38,11 @@
|
|
|
37
38
|
"ag-grid-react": "^32.0.0"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
40
|
-
"@types/react": "^19.2.
|
|
41
|
+
"@types/react": "^19.2.10",
|
|
41
42
|
"@types/react-dom": "^19.2.3",
|
|
42
|
-
"@vitejs/plugin-react": "^
|
|
43
|
-
"ag-grid-community": "^
|
|
44
|
-
"ag-grid-react": "^32.3.
|
|
43
|
+
"@vitejs/plugin-react": "^5.1.3",
|
|
44
|
+
"ag-grid-community": "^32.3.9",
|
|
45
|
+
"ag-grid-react": "^32.3.9",
|
|
45
46
|
"typescript": "^5.9.3",
|
|
46
47
|
"vite": "^7.3.1",
|
|
47
48
|
"vite-plugin-dts": "^4.5.4"
|
package/src/AgGridImpl.tsx
CHANGED
|
@@ -223,7 +223,7 @@ export default function AgGridImpl({
|
|
|
223
223
|
}, [columnDefs, editable, columnConfig]);
|
|
224
224
|
|
|
225
225
|
// Merge grid options with props
|
|
226
|
-
const mergedGridOptions
|
|
226
|
+
const mergedGridOptions = useMemo(() => ({
|
|
227
227
|
...gridOptions,
|
|
228
228
|
pagination,
|
|
229
229
|
paginationPageSize,
|
|
@@ -241,6 +241,9 @@ export default function AgGridImpl({
|
|
|
241
241
|
suppressCellFocus: !editable,
|
|
242
242
|
enableCellTextSelection: true,
|
|
243
243
|
ensureDomOrder: true,
|
|
244
|
+
// Virtual scrolling optimizations for large datasets
|
|
245
|
+
rowBuffer: gridOptions.rowBuffer ?? 10,
|
|
246
|
+
debounceVerticalScrollbar: gridOptions.debounceVerticalScrollbar ?? (rowData.length > 1000),
|
|
244
247
|
// Event handlers
|
|
245
248
|
onCellClicked: handleCellClicked,
|
|
246
249
|
onRowClicked: handleRowClicked,
|
|
@@ -263,6 +266,7 @@ export default function AgGridImpl({
|
|
|
263
266
|
contextMenu,
|
|
264
267
|
getContextMenuItems,
|
|
265
268
|
editable,
|
|
269
|
+
rowData.length,
|
|
266
270
|
handleCellClicked,
|
|
267
271
|
handleRowClicked,
|
|
268
272
|
handleSelectionChanged,
|