From d262d02600db9c9631b6546d56493cea63d59e9a Mon Sep 17 00:00:00 2001 From: damien tassone Date: Mon, 27 Jul 2020 18:45:23 +0200 Subject: [PATCH] Release (#118) * Release v0.1.62 (#95) * v0.1.51 * fix demo app build * v0.1.52 * v0.1.53 * v0.1.54 * v0.1.55 * v0.1.56 * v0.1.57 * v0.1.58 * v0.1.59 * add missing export * v0.1.60 * v0.1.61 * hot fix for tsconfig conf * fix mistypes on the package.json * fix empty space with prettier * v0.1.62 * fix lerna.json whitespace * fix resize issue (#96) * Bump eslint-config-airbnb-typescript from 8.0.2 to 9.0.0 (#112) * Pagination refactoring (#100) * implemented server pagination * rename pagination options, doc, prettier * fix lint * Apply suggestions from code review Co-authored-by: Olivier Tassinari * change casing value in featureMode and remove apiref check * added missing dep in useEffect * fix broken suggestion code * fix doc comments * Apply suggestions from code review Co-authored-by: Olivier Tassinari * Fix FeatureMode enum and remove useCallback in demo * fix import order * added namespace to function call to remove import * remove useCallback and add react. to mdx code * add concurrency in server pagination demo * fix feature mode export Co-authored-by: Olivier Tassinari * [core] Use the classnames helper (#105) * [core] Batch small changes (#104) * [docs] Improve the JSDoc (#106) * rename events and add onHover event (#103) * rename events and added onHover event * rename events and added onHover event * fix onPageChange rename and merge * Js doc improvements Co-authored-by: Olivier Tassinari * added hover stories * small fix and cleanup * revert rename, back to onRowSelected * refactor hover and click handlers * refactor cellParams * prettier Co-authored-by: Olivier Tassinari * v0.1.63 * v0.1.64 * prettier lerna.json due to lerna Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> Co-authored-by: Olivier Tassinari --- CHANGELOG.md | 16 +++ lerna.json | 2 +- package.json | 2 +- packages/demo-app/CHANGELOG.md | 16 +++ packages/demo-app/package.json | 4 +- packages/demo-app/public/ag-logo.png | Bin 7577 -> 5645 bytes packages/demo-app/public/aggrid.png | Bin 14115 -> 10972 bytes .../demo-app/public/android-icon-144x144.png | Bin 4570 -> 2550 bytes .../demo-app/public/android-icon-192x192.png | Bin 5133 -> 3159 bytes .../demo-app/public/android-icon-36x36.png | Bin 1948 -> 707 bytes .../demo-app/public/android-icon-48x48.png | Bin 2309 -> 902 bytes .../demo-app/public/android-icon-72x72.png | Bin 2353 -> 1219 bytes .../demo-app/public/android-icon-96x96.png | Bin 3000 -> 1668 bytes .../demo-app/public/apple-icon-114x114.png | Bin 3502 -> 1932 bytes .../demo-app/public/apple-icon-120x120.png | Bin 3766 -> 2031 bytes .../demo-app/public/apple-icon-144x144.png | Bin 4570 -> 2550 bytes .../demo-app/public/apple-icon-152x152.png | Bin 4816 -> 2743 bytes .../demo-app/public/apple-icon-180x180.png | Bin 5785 -> 3454 bytes packages/demo-app/public/apple-icon-57x57.png | Bin 2080 -> 1072 bytes packages/demo-app/public/apple-icon-60x60.png | Bin 2064 -> 1044 bytes packages/demo-app/public/apple-icon-72x72.png | Bin 2353 -> 1219 bytes packages/demo-app/public/apple-icon-76x76.png | Bin 2465 -> 1324 bytes .../public/apple-icon-precomposed.png | Bin 5707 -> 3159 bytes packages/demo-app/public/apple-icon.png | Bin 5707 -> 3159 bytes packages/demo-app/public/favicon-16x16.png | Bin 1240 -> 350 bytes packages/demo-app/public/favicon-32x32.png | Bin 1784 -> 633 bytes packages/demo-app/public/favicon-96x96.png | Bin 3000 -> 1668 bytes packages/demo-app/public/logo192.png | Bin 5347 -> 5317 bytes packages/demo-app/public/logo512.png | Bin 9664 -> 9216 bytes packages/demo-app/public/ms-icon-144x144.png | Bin 4570 -> 2550 bytes packages/demo-app/public/ms-icon-150x150.png | Bin 4743 -> 2701 bytes packages/demo-app/public/ms-icon-310x310.png | Bin 12133 -> 8575 bytes packages/demo-app/public/ms-icon-70x70.png | Bin 2359 -> 1231 bytes packages/demo-app/public/storybook.png | Bin 10924 -> 8917 bytes .../demos/grid/components/settings-panel.tsx | 31 +++-- .../app/demos/grid/real-data-grid.demo.tsx | 14 +- .../demo-app/src/app/demos/theme/useTheme.ts | 8 +- packages/grid/data-grid/CHANGELOG.md | 16 +++ packages/grid/data-grid/package.json | 11 +- packages/grid/data-grid/rollup.config.js | 2 +- packages/grid/data-grid/src/data-grid.tsx | 4 +- packages/grid/data-grid/src/index.ts | 3 - packages/grid/x-grid-modules/CHANGELOG.md | 16 +++ .../x-grid-modules/lib/autosizer/index.js | 6 +- .../x-grid-modules/lib/autosizer/types.d.ts | 44 ++++--- packages/grid/x-grid-modules/package.json | 2 +- .../src/components/checkbox-renderer.tsx | 10 +- .../src/components/column-header-item.tsx | 7 +- .../src/components/default-footer.tsx | 2 +- .../src/components/row-cells.tsx | 61 +++------ .../styled-wrappers/columns-container.tsx | 3 +- .../styled-wrappers/data-container.tsx | 3 +- .../src/components/styled-wrappers/footer.tsx | 3 +- .../components/styled-wrappers/grid-root.tsx | 8 +- .../styled-wrappers/window-overlay.tsx | 3 +- .../src/components/styled-wrappers/window.tsx | 3 +- .../src/constants/eventsConstants.ts | 18 ++- .../grid/x-grid-modules/src/gridComponent.tsx | 17 ++- .../x-grid-modules/src/gridComponentProps.ts | 14 +- .../src/hooks/features/usePagination.ts | 110 ++++++++++------ .../src/hooks/features/useSelection.ts | 38 +++--- .../src/hooks/features/useSorting.ts | 16 +-- .../x-grid-modules/src/hooks/root/useApi.ts | 110 ++++++++++++---- .../src/hooks/root/useColumns.ts | 4 +- .../src/hooks/root/useContainerProps.ts | 8 +- .../src/hooks/root/useKeyboard.ts | 6 +- .../src/hooks/utils/useLogger.ts | 4 +- .../hooks/virtualization/useVirtualColumns.ts | 23 ++-- .../hooks/virtualization/useVirtualRows.ts | 76 +++++------ .../x-grid-modules/src/models/api/apiRef.ts | 1 + .../src/models/api/columnApi.ts | 32 +++-- .../x-grid-modules/src/models/api/gridApi.ts | 17 ++- .../src/models/api/paginationApi.ts | 14 +- .../x-grid-modules/src/models/api/rowApi.ts | 25 ++-- .../src/models/api/selectionApi.ts | 26 ++-- .../x-grid-modules/src/models/api/sortApi.ts | 12 +- .../src/models/api/virtualizationApi.ts | 18 ++- .../src/models/colDef/colDef.ts | 55 ++++---- .../src/models/containerProps.ts | 23 ++-- .../x-grid-modules/src/models/elementSize.ts | 8 +- .../x-grid-modules/src/models/featureMode.ts | 4 + .../src/models/gridComponentOverridesProp.tsx | 10 +- .../x-grid-modules/src/models/gridOptions.tsx | 123 +++++++++++++----- .../grid/x-grid-modules/src/models/index.ts | 1 + .../src/models/params/cellClickedParams.ts | 32 ----- .../src/models/params/cellParams.ts | 29 ++++- .../src/models/params/colParams.ts | 10 +- .../params/columnHeaderClickedParams.ts | 15 --- .../src/models/params/columnSortedParams.ts | 5 +- .../src/models/params/componentParams.ts | 12 +- .../x-grid-modules/src/models/params/index.ts | 7 +- .../src/models/params/pageChangeParams.ts | 24 ++++ .../src/models/params/pageChangedParams.ts | 21 --- .../src/models/params/rowClickedParams.ts | 28 ---- .../src/models/params/rowSelectedParams.ts | 6 +- .../models/params/selectionChangeParams.ts | 11 ++ .../models/params/selectionChangedParams.ts | 11 -- .../src/models/renderContextProps.ts | 14 +- .../grid/x-grid-modules/src/models/rows.ts | 11 +- .../x-grid-modules/src/models/sortModel.ts | 4 +- .../grid/x-grid-modules/src/utils/index.ts | 1 + .../x-grid-modules/src/utils/paramsUtils.ts | 57 ++++++++ packages/grid/x-grid/CHANGELOG.md | 16 +++ packages/grid/x-grid/package.json | 5 +- packages/storybook/CHANGELOG.md | 16 +++ packages/storybook/package.json | 6 +- .../src/documentation/pages/api.stories.mdx | 9 +- .../demos/pagination/autoPageSize.demo.tsx | 2 +- .../pagination/customPagination.demo.tsx | 4 +- .../pagination/serverPagination.demo.tsx | 76 +++++++++++ .../pages/demos/pagination/setPage.demo.tsx | 4 +- .../pagination/simplePagination.demo.tsx | 4 +- .../pages/pagination.stories.mdx | 94 ++++++++----- .../documentation/pages/selection.stories.mdx | 2 +- .../documentation/pages/sorting.stories.mdx | 3 +- .../src/stories/grid-events.stories.tsx | 46 +++++-- .../src/stories/grid-pagination.stories.tsx | 123 ++++++++++++++++-- .../src/stories/grid-selection.stories.tsx | 2 +- .../src/stories/grid-sorting.stories.tsx | 2 +- .../src/stories/grid-streaming.stories.tsx | 6 +- .../customize-components.stories.tsx | 6 +- .../playground/data-grid.options.stories.tsx | 36 ++--- .../stories/playground/options.stories.tsx | 38 +++--- .../playground/real-data-demo.stories.tsx | 24 ++-- yarn.lock | 58 ++------- 125 files changed, 1240 insertions(+), 753 deletions(-) create mode 100644 packages/grid/x-grid-modules/src/models/featureMode.ts delete mode 100644 packages/grid/x-grid-modules/src/models/params/cellClickedParams.ts delete mode 100644 packages/grid/x-grid-modules/src/models/params/columnHeaderClickedParams.ts create mode 100644 packages/grid/x-grid-modules/src/models/params/pageChangeParams.ts delete mode 100644 packages/grid/x-grid-modules/src/models/params/pageChangedParams.ts delete mode 100644 packages/grid/x-grid-modules/src/models/params/rowClickedParams.ts create mode 100644 packages/grid/x-grid-modules/src/models/params/selectionChangeParams.ts delete mode 100644 packages/grid/x-grid-modules/src/models/params/selectionChangedParams.ts create mode 100644 packages/grid/x-grid-modules/src/utils/paramsUtils.ts create mode 100644 packages/storybook/src/documentation/pages/demos/pagination/serverPagination.demo.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 3146ff8c83e5..b62402f390ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.64](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.64) (2020-07-27) + +**Note:** Version bump only for package material-ui-x + + + + + +## [0.1.63](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.63) (2020-07-27) + +**Note:** Version bump only for package material-ui-x + + + + + ## [0.1.62](https://github.com/mui-org/material-ui-x/compare/v0.1.61...v0.1.62) (2020-07-22) **Note:** Version bump only for package material-ui-x diff --git a/lerna.json b/lerna.json index 545d26456e3a..a63fda0bdef1 100644 --- a/lerna.json +++ b/lerna.json @@ -6,7 +6,7 @@ } }, "packages": ["!packages/grid", "packages/*", "packages/grid/*"], - "version": "0.1.62", + "version": "0.1.64", "npmClient": "yarn", "useWorkspaces": true } diff --git a/package.json b/package.json index 29ef66ffe37b..77eaaf23b5b7 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.2", "eslint": "^7.4.0", - "eslint-config-airbnb-typescript": "^8.0.2", + "eslint-config-airbnb-typescript": "^9.0.0", "eslint-config-prettier": "^6.11.0", "eslint-plugin-import": "^2.22.0", "eslint-plugin-jsx-a11y": "^6.3.1", diff --git a/packages/demo-app/CHANGELOG.md b/packages/demo-app/CHANGELOG.md index ec67b15720c7..8cb09c7798c1 100644 --- a/packages/demo-app/CHANGELOG.md +++ b/packages/demo-app/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.64](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.64) (2020-07-27) + +**Note:** Version bump only for package demo-app + + + + + +## [0.1.63](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.63) (2020-07-27) + +**Note:** Version bump only for package demo-app + + + + + ## [0.1.62](https://github.com/mui-org/material-ui-x/compare/v0.1.61...v0.1.62) (2020-07-22) **Note:** Version bump only for package demo-app diff --git a/packages/demo-app/package.json b/packages/demo-app/package.json index 692bd88667b0..60eb79d41b91 100644 --- a/packages/demo-app/package.json +++ b/packages/demo-app/package.json @@ -1,12 +1,12 @@ { "name": "demo-app", - "version": "0.1.62", + "version": "0.1.64", "private": true, "dependencies": { "@material-ui/core": "^4.9.12", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.54", - "@material-ui/x-grid": "^0.1.62", + "@material-ui/x-grid": "^0.1.64", "@material-ui/x-grid-data-generator": "^0.1.62", "@trendmicro/react-interpolate": "^0.5.5", "react": "^16.13.1", diff --git a/packages/demo-app/public/ag-logo.png b/packages/demo-app/public/ag-logo.png index 9a2df080f53ddf32661011eaebedeedc542acf7e..0369afd54cba8b5b4e34bcab1e1305147f5f9cc8 100644 GIT binary patch literal 5645 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 ccReRNU&s*u@MRdr20LfXm5dZ)H literal 7577 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 Rh>F0!fu0HMgDyPoe*rWHKurJu literal 14115 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 diff --git a/packages/demo-app/public/android-icon-144x144.png b/packages/demo-app/public/android-icon-144x144.png index ba9ec2131dccb0357092f219f331f41257d2ce20..7f81327d260d5cc7090b2cb981a394c376b913fc 100644 GIT binary patch literal 2550 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 Y3>EtLT>tRv(JKJvCTB1YjXW>?3-OirEdT%j diff --git a/packages/demo-app/public/android-icon-192x192.png b/packages/demo-app/public/android-icon-192x192.png index d8e64e3d8e9d1cf9b8cf475e15dbaf2b6c2a7056..62da11cb6e60b4af24a0626242152a812ad71805 100644 GIT binary patch literal 3159 zcmbVP`9D;D7ysNDX2i_c!Whep7F$N6$dqmDl(mOKeHr7MRHKIUrElA{jTy!glC;=b zJgP5RP{bIFq{Y6JEJM;$ij;m$PzpFc-ha~4i$ryPi zIX4VF(&E&<)s(l<*kH7EG@N`oX~wY4HY=&ah%I=Joc+_1tJg(93jd;3wxV{Q%~ zHZ^GdI-huf7J48LHJ!Y#^7*qLtc^g}8FA1EF<{D9H-S!2a!*?^w9>=OlqWyW zwe8nVeqTkvRBrq5cpNfG=4WGk5?467ukD>KT3wBz=7~VR!CPnA`3TT;TSTU-eBT-) zu@v+3xrg&N6vSLS1fuXjs9&Gfu6g{7uu&pmoaXA#U`$p#1OoVVT?Q{gzGKJq?j*12 z0pAZ;9-1HpIE@s0KNh3d4J@k@fn4Qxh>m72q5a~wIa=7X%H{1 z3(8g+>D>12pIXfhCWrw0W|hT`08beypHs|mPNY}NUzWr?cL4fM=rU2oAUT~vVn`xe ze-e=lWcixao0;UvVi^pKp($Q0v61Nn>>%9crM7ARb2Qzi!$d$58e3=RMc0hVR&n)S z?lwf&V{(Px@9VXkQA=#4A$aUQo$)K_ayX^mtYu%SEGSa38>jRpI!)s5hGsh0mNOm9 zVUWr(DR3yczKf#JKXF2k004ZYlM0`jaAYS#MbO%b9Wf~g2*yG1tf4J z@iBfyy=w47eQ=~fsih{)l8=f=>CYPMiG@2l)nZw?0;&vCPB_(4n0&j7a4|?;h{7{O z+=)o`vr5n}Ir;5gBf3Wy56UvpbDNBNtl{X>DNlS9OP~l~^{{ojAvY%+qCagjihv*l zZxR@M{d@q5Q`*%-0oZwt*53{QkF>cK>B0I)3(sc@vD}q`IFrfCl zEcuxUwh~Wf*2XCeXO-R93-IUFF1|QU0`L?avqH%q11Kp8TdFJrH=uFNmjg5hzBr>n zr;cSK8>=Dj0Ss!xP`Lt-Q(KL+D{eHU6{V^v^IMFT&RbUUMtr+L5(;ntEA{iw# z%(8rSP#hnDRu>)#It?G8sbOItCYYSfY}aH+rF%|uRqD(RgQ{+2jZz-aMoF!f1LpTAfh9sGIg=%;{btoU za1oeho%%h4uS!jskzCjy&s0g3{CpAtjNgpPv=sw;8;T?PsoeO(??ex0{xzji=ud*K zD7mfDBh#%LY{3>5PoSQ|=+#Pm$h_M`CpH$5Fsq#&Glkc=w1Y$r+k`7ZoR_Lzz7n(Y zoe&rJ8Fx+JE343uj3EA|P`(a}^r@J)vje={l1Igw-6e=8CU{f6R5n?g)`^s*s(mzd ze~G1b(o&WilAK;lOJ6|#ZfG*8db3B%T6Rj+C%Y>t)merSi1KhkWv&Set`p#g<`{{+ zNpcliQ&+@jpR1$rOQDt>GKvf00mEI7LEMSeW3Ex-BK!$m}|?& zpYeWPXfh%Sk^U}cnv{z}=rZYgd2dUgmScgF@xli0O@(;_mNJvYfokfn6oLh}JC#|1 z2Pc^~Fj)|9OqRGJ!A zXfO;9ahT>nEe(;PliVs4PZmQ=Ds&mx?NwKXp+%VAtwrWpqA5Z3Gm?Q36#{! z)-te6(Y^MQgSYhCvl?Gi*wDIRSpS0#j4X*h&dDzY)^1FGpm*1(nIuK77r>mY#3@?+U(`( zDCdM^{+DsG;>3o5T0P%7%b1>*lzM(7EsxsT7lDmm9eSR7#*A?MzpiGoO%jl|>RWTi zIgYDLVRI&3H=U9|!7Eb2 z)VQ(v>a@~N?$jJ$`Eq3|2|r3Qzt{DZv=*`A(|iTu;{k_ykGLQ^r7x{3+t zZ#N%N4kg=fOn4<|(;CcO2eI4ywB-~xP|eDm<}NMKL1WPtcXSz-Y``BFC1&>%{Yn-+ zwDu=BbCA(^p>~aqo@TuL(Ad_axFn5DRAh3zVm^pdc$+0?Dq?@t)L3Y89n2d;B%YcP ze#+I6r}J3Dt?G%UYbo%LB2aj&{Yl|jg4Uw!FImD(l@u@Nj#y_J(%A3_QC7`8^lWr;&xLX)EVbJ$T+i^j)5dxwTRo#pZtD4@fT{6y z50VW3K;2lXPW`7ATG7yhEoNEpfA>Pwrqv$?;O^|@^p68G;lDCIEZYD8 literal 5133 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 q1Y4cpR^g;RXY8B*!9#48rc2x^2B3$W z_MzU`gb4669Dl~9!1!b~&o%VIVRMkBL)}7doT-=-zc zfs-k0vdq|kXvA7Q4>dCfSv(m!&;(}?FM>9ik1}`9Lw^-;!*URt3iYra{?I}&hABp# zhb#w)s3MqyyC|>tntY+W2C@v8n zJ;PXJH?2u0x**IH^p)nI(N*n=N>D3b8*0W4gPr>oZ!is|VKePp4X_;n&?2bW*Sv4) ziUf7Y(0^)YWW3rKI8W_}$dJs%b|(Cwg*co-iLV|c&fbxH-h^^$=B@vDvp%>D16p{5 z!N~fx?<`ATCnBMRXKK-tlWf9pQ^<2nN11PVyZbNt;tmWD#3o$)R1@?uBpO>#9=7jw zA6^)<;3t9-3Al`&`2R;d95_&$qi>yB^6avjbT4rPA$imfpS>}Es}--ZsZpnF>L(oU cc*i?$0B36pq$)87=at*2^Bhrp>maAxqWT6mU&ZErC!T2Md0)Ywz*%wxg`9OGyw$hf8x zEE@qQx`5>3^i_e4;4fUM1$lo$!O6+V#NyMt;WcZJa)Ls1_ig%vnS&tWg)sKgm6V2PrN_#q`mSfMfFDrM* z?hT7qDaKm1RrL_IwLQsmUhNp)_PmgRH488EcFPDfw5zo$e)-D((ipMT=i8?uXZf%0 zi{yRd=Y0t{x*d8g#TFMf5I(Nec4e;o=)2zV@v&@+gQFMShD>&}|FO&3t#qif_QihV z$c_?sC)tE%tLfSzO_GD54W{hS5`TCGOjLkBQf1GU3{`bu7Uit=8;<>S z*~#8Hu7?-X?TpT?TtUN?8$H;gDrrS>o*BK2ZalIyCtLm~2@vMcTX9!Y(d_K1r00#+ z^N-;Qk2=WHvy7Q_hn*m`97g7OulpB3}0g1YAUnVGF#SC_w)yHz}>TGN!; z^nkl%ZYWNkJ0NE%9umq5);-8n%Bn7$sj*PXj(>mYw3SME_Pk$i)>+%%T@~kQhAncP zhg*nC6b_~ROBI^*vC&|g%b+nc>zLceg$(oV>c4tC1WP~sRFQdBmUOGvTJosnA#VM^ z=K+d5Q#;}nb$3(VRSX(%f`~Pk7_cQ2R<79cW4bw_zFiSv$?dAX?09H?t~%$WXRRYW zX`tigUiXN!s#O@n#+p9$@}U0T&hPXhE{o*1eKy>GXHSOlDF^(0#_nzev#j12fRL1u zXD-+f-K%$*)Gu5b!;|tE(PBQ_02v`8?g-T#rEpP%K|vWFbOM4f5ag%5w^QCKh!@2O z1!?auxOPu;9Tu$Db&!Yz(o~+957_a%SbiWcRv5h#?@9C`(%k8IGJ;ZGwjky2Ari9#I>7o>?IaqQg#eNYhC>lC?h$?;JP22&KB9M4aXG8mg6DgkKeWG!hH z^SUR45yuzC#z_H6CtCvXe#k7Cp)<{d31g&jI;6ea$p|6~XCQ&Xc)m0(kq=%^MM_MF z^**;bXqHYO7g7MF(&!W_nMS8O%Qxs=9F{Y5LWJpjfcX06m#poDsm(J|p&T|42zT+} z@k#Ls(p{ohl7N>Yj20zGNN@fa5)YwJ=mHv#ilDq`fhQI9qEV<6)XOu98pTIxoYSG_g~CA7ux^; diff --git a/packages/demo-app/public/android-icon-48x48.png b/packages/demo-app/public/android-icon-48x48.png index 919db060fdf7727d0795b0d2c1e044eb8861d0c5..cb1bc9709f35bc0616fe5646b54f214b4e6cf06c 100644 GIT binary patch delta 890 zcmV-=1BLvB5{3tm8Gi-<00374`G)`i15HUpK~#7F?bri!D_t0c;S>F~ZQHhaZQHhO z+qP}nwryL<%(-vfo;aO)_F7Ll_;xf9$ueflm@#9*AabixTpAm{>1F&#hRPC<+)a1OiRf>h`@D0-h5&JMRh zgH-6)kHdZn+=Z|3u!xLN1=iss)WcCoH@%O0dz8*w0~&H-6`a8z$U-a7E8YcoDd0Oy!WBpl7UF(G3MeH$$8_8Xx&W_z zyoN3~34iH<6D#pAtcDd(N<54_*o@Ty6=<;XF?LuPJAE9`_Mrlv_E7#|LkcJ_rc+ZM>0c|RN!ku0Q ze-Op639h6mFhN%0<5Z`JF8ZI*M9VE2J73SoYJbj{1DX;F;dji&bx03tCt3mMkl{w( zbczwzdWcEdQ(msn-bH_$h4kPi7T~kQDo{C20lA_V@79ICg7Y$dfRt{(Ya1zb&Dy)fpFX>)nz%n=?6}srS*Ts9n)8JPy5?{fQ z)N?n*o&Yl%-p%cz}D4=66%Hyfze2el<{D4UmxE@*H zEJJs|Td<~-d#w+O@mfyNX9ABX3Utm4KxfOBKlu4 Q{{R3007*qoM6N<$f`l%V4FCWD literal 2309 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 O00001n_|h-= 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 diff --git a/packages/demo-app/public/apple-icon-114x114.png b/packages/demo-app/public/apple-icon-114x114.png index 222bf4c1ff66d3d4be9e49c06c1178e527afe191..7d95a1fd09a40e9916607df005855650c82d2d1e 100644 GIT binary patch delta 1918 zcmV-^2Z8vm8;lQ-BYy`|Nklo1L=IsmCL2crPQXT-$$wOY3{1w39867HgzU_n z4COx7pr%3twr6RsWdI*AEujQ8tj@g*_a|Yp&^03T+I?xkEMWB%*~l}qeui&$bS|q@(sr^Yb!^bhW+_~1|k3{ zWCrSagWZ^ntf$pB@XLQcYyjO0-^ zWPAdYU&wkIh#Ba{x#9YL%lSEu;VX*75;Zb9`8X33n1IcA zmQigKvW~adohb+uI46Z{c1U1)4&oD<#$w1HIFZ>2{G>XCY)MF{W;_EeR5NMItiz|0)Q*A!b2vODK84+TOFL$+fPuB1PA(7CcgLOT}a3VJs)WG#2HBAp13yO6VR zEML(?tl*G94Quld!~P=VXr58T>L zP@xq=c4Q6iW(X0+$&kS8oEWa@{jQ(mVt*EVs?V?K|Js4s} zj^@j9+}D~y`lGTvFK4ih`F7Eyo8p1eyvF#}yWhk2pI_A(Ki>`~ zzq=EY6G~?OmbH0+p~MW_Mt@BT`B(0%s|$CHyxGfhWVDXCAQ#h{n1MRpWMc{`K|BHZ~ScN;OC1zkakFh?T2_;D(fp0m1S;9lHihtm0uMVc@IFD|` z4Ak=udoUG&04d}V6p1CO;|+EQS9F`l*WRCxX(VRgM^0mQst7-U6mkjfXBaU9gYA|5 z;-_h~4AgQ9E6|YuDdeBUoRnR7gF0d{HA7{`dgOE*p&C$$EfE03Uj-ShOD+5~?vNxBrDD4O-WZMOukj;6H z(aj7wl!sWG8Umz{c?dc^hw%wbe-W~QH`$fR36MhOar~U0b9d>^Pa%tZ%ZbcJfD|(C zK|8Wqc({0fxTxDpnWT^@WRgNADP)pD zrjSVrnWT_O3YnykDP)pDCMjf+LZ*;O3YnykNeY?#3+y+MYBJOSuK)l507*qoM6N<$ Ef+yu=ga7~l literal 3502 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 diff --git a/packages/demo-app/public/apple-icon-120x120.png b/packages/demo-app/public/apple-icon-120x120.png index 52899a415ec7594d7e1b11b240256db101b059bc..9998848e60153f32b535d9e6c2d057abed96613f 100644 GIT binary patch delta 2018 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 diff --git a/packages/demo-app/public/apple-icon-144x144.png b/packages/demo-app/public/apple-icon-144x144.png index ba9ec2131dccb0357092f219f331f41257d2ce20..7f81327d260d5cc7090b2cb981a394c376b913fc 100644 GIT binary patch literal 2550 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 Y3>EtLT>tRv(JKJvCTB1YjXW>?3-OirEdT%j diff --git a/packages/demo-app/public/apple-icon-152x152.png b/packages/demo-app/public/apple-icon-152x152.png index dcb8ab87a1c5a916ddb6109903e46bc9a2624eee..b12ad4aaef560e23477041fb41f6e5515a870843 100644 GIT binary patch literal 2743 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 O0OrQlM)era>;D24VwVd5 diff --git a/packages/demo-app/public/apple-icon-180x180.png b/packages/demo-app/public/apple-icon-180x180.png index 13c4c34bb4b03a4212184849e80c8fbab84b5985..e7a459ac7ac6a8a6f8a614751480cf252b6ea54f 100644 GIT binary patch literal 3454 zcmZ`+c{r3^8!rtrDKyA7_Cb*?`w*IJBU|=l&oZM#jnNpUFcZFPC6dWt`fP7_2~oyw z7)y+K^S0V!mY3`yOZlejyRPr*pYL41^PK0pult;Ho!@hx`*%P0FFD%@3Cai_I&?_L z9%1dq8(;qFAOYUfd_+KxXScDphI_;v{@R_)vmK&Q_S^%5554>K{{PyeS6J`0TVxJj zTBrY@EKDt7xwwKGj_%MQ~^B9$%@{#j1zOwCATbAqqb@9X0p$P0|J2mX+B# z_=k-ji5`cA@aba_Rcs3Oiv{~^s+F{JviPpye7rEbayUpY8plBsRzxK(aFF`=@<<~Y0gWvS5DfQd zoklC56n zsA6)uDIzi`qyVQ;2Z{(jLUP4HErU#NzDsxbwGFi^T$V1yc2~=w7&`)Uch2tV)!16e_Y{6N znnOW}enj~`B+1%L+M1bICn3)gzg<^ffSrGn8Kx!ep~6+GRV0F_uL3v{*};Wy`E@Tm z`TAu?fs-P;Xgy`F#oInVZ5GH@sNrGS+U>ja49p`NCea8*d3+RK(ylH{sKmFfjqX3= z#JP&W?U-F?`ME^{&xm2)RUi5Jy3k7rJmaPC!^Ug3WU5r=UGYiPxD-(zfE@h53DWre zC{PcdlzJ}j6Oj1&~fo4ECeSJ_6_ZB=AXvmp|*z%Lr0?uP)EdMP6L+1{++us@=&3 z$;8*I%>*$xHq-%11tDO>9ZxJ86HyaKv~2w4A`s6!FDbSou@|)}h0ez@$-|Z#zMp?N zMj@4vjg~f|C%n1oKK-Tm`~K?tmfox)6HcA|lHW7Y&vJY`{?|L#cZ*gFT~&4ZW|mSGxlp@vf5biSJhB1f|z zI?CKnlhgt9`=OGzVaK#xkWTwc(?*9pyN*{}stsZm-UO|1CuupLUA62v(ST=;`PB}R z7!XxdNoVGoMR!V`h7=~*)NRF@`J`URNw)7u%@B;M$)S8$H|ei8FI-)cB{1NCJFqO3 z)CRNZAmtlGO|Edj%=D+UXDYUPUEcEdH3qKz*bQz-b}H zbgK80V?|R5ad`&EKw2)?^JoPLf6)v_TbhZ%b9c`lS(!x#Jo{S&KFYDR7_LzH<2fbc zYq#-tt&w^XJomUK);s>gy%TGl#H_c!f?6&XgLx5@kAsX4shlxIBi>yb6B3ib)%(QPXje}Eah zURe>N)@k+wg{Mu+dvpFMzVo`H2mWAQrGn{pXWR~odR^(^DA{RxuE@ANI}d_&_?TXb zBV6p{ug*D}H&CU{1yR>^N~iB((OMbY%pXiJrl}+Ir_+7`Cq7Cmivr~?1UrX&cl5d& zxMvIf1Y9KmXSzB)2ML>7yh|6mjeI zQ=Rn_4ucv&>Q7ehHmkq^lM2DcXz^Ds&`iKmlBL3zD*@%!`Hh|vH2X-G9C7$|;@?&u zN$xx5Bc70#rDb2=z}n8A@nKw%?zgNrqajYfInrB*son<#RzOx2h`Og*NT!>-cT;=g zdP*loDLO=)mjEu>_y-xJ-GXKOBl`kw_I^-8b_A+f*A@3ypI#KZJ<>KAV9h)!(wc3X zJ$E|=v39`}DO0H()Y|J;%l?sB#f+;ro}TgfJfKLBpMYaaBk9YIAL>vpo#gRi z2I-5@)U@2@;sk9i(xECzEqgX9{}CME9|Dg_#D2uSj2-=;|2azuvObD|baF6TwamD) zZT;kPg*}pksvEJpeP6>{*NVYg zwd7V8YiZ@YSn|@hi(t*k-wcpLy?c(X;8px?6L` z!=*$`yRgqv{e#CdDAh33>BiJs_*}W?rOeTOU+i3~<5hqD3(G+gmNPdpRcx4^3Or4N zg}{n!7j|dku0u;^gS|Y1+PI+>-s|$V?mQ2o28xnv<40FAxWo+`;5V8>)UxX^UNdov zg7R|!qsnXm_}k2JnIVjBp~9N2ZB*zm6nBi{9qOFgYU9L^nv7i z3-wiA`56gTB8M-4OugSnq+hz-oN(=bG(c4=A}My;}iDI_zx&o%E~rI zJn4cYfZer@f}@ukrz%2d{#K<^i>Tl z7;tjf$T;|e1m(c)99~SI{?N^bWW8t7F^u36_^}~>!A6bF+asq-7Piz zLx+NGtblo8V2ldQ{)i1gE;zc+eq!*^CZN4w+$3Mi{)i_)Zo6)K#^A1l!zjh4e~jEy zD{lWzk&xZb1>Q=gAbH&H#cuX4|5Ai)BnPnsq{Mt!b-mZi~;?Ie^IP{2SDz^Z&2o*_#b{A YX{(tG-&XfS{Q76Iw{f`tLjC8zo001zW7#mz6 z`}#jdLq)!84^SzR9mET60SAEE4Ej@7O7a{Oas`P1ss{Q0CQpRjjjvb$K%^u9#3cg2 zF?lJD1OTB>09bJW0N7Ii;0n%bKxvT!RBmQS1K|A6g>Np)BCpT}8#{ym06qI30|B{t z+yKDAU}6Bby)(6z?|{2G8qpnluzxw1CxE7xCBa@?EDS14`&PqMiRFE!9v|cfj-zT( zq*uS-M|*afP0r_ptR`{Gyr(WTdW!g3D3x@DNFo;W*1ZO2pN1pCczukNhKCOp=V$H0 zBgO0c`?U|k4i4VrBCZ+_mj#`likf<*qn()$ z-$+JA>DGtI+g|_yIYm^IBr6K22OGKw7l$V5u|w_8Op@v;?~2#ZOaK)xI@ZAcA1t3o zIZ<)NG4))Vd)}7RW);ueTq$;humGxnbjoXh^UJ+QKJ*Pd1O|0>0*5^lW@!ExG=d(Q3R?GR�CkCY;P!J&Y*J5l|Nx@ys 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 diff --git a/packages/demo-app/public/apple-icon-60x60.png b/packages/demo-app/public/apple-icon-60x60.png index b01cd02dbe698bf385228deeacd85170e688829e..f494b2b7585e4e3cc51fde5c0fd86ae8ba8b9464 100644 GIT binary patch delta 1023 zcmVf^(XlF2ha`MA=4Ecvk`T12Ye}ry$SWO4ic~r=I=g~ zhXm3c449aMzi>fwAOoIvOBDi9vgJbq#7(U0T4nt4H`xu6OkU-MGV{l%&gJZU# zF&;rM&Qr(zXn%q&kU-MG`!E_GAei!Cg_S6a>)|`%2fP7gu~Z%DDtH$D#wEg9I)Y6_ zw27JcN7PwyH9yR6m!Lof;#q%BzSdA|`nnc%$y&)^67Rq>+0T`;!}+=JTK2#E<<2)4%m6MT)R zz5G*AWPj}SqSyqVBK8Wja}oS0mcxY1ez5b`)2HKo42O~YYiX|rbKk@B=!$KSHdf$< zOa-5b?kNrChsABEjSY|rqi{(^g01Kqt-uvY2lI9ie_$3&Md&J2z^(9QEZB+;;Q=(o zE>vU4sJ&iJc>}9TSDFg z6mW1j$i!k4!j)b*KUEAe4g-_$ji|fodVcVqFcte1v1?Hscg3z%uLR$N&e*Fw98_=B z0v^zID?<08JDx(wt7jq4#V?qK{WigpV0hKxpo#bn=LxTmC?Bpu0W5bJybyWS_fv0% z2k<0XVyhx}3)j$LQz tBlr%2za#h-;r;39>FMd|>FMd|9RTsro<=lHD8v8&002ovPDHLkV1n6O=fD5} literal 2064 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 O00001n_|h-= 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 QsQ>@~07*qoM6N<$f}%rZHvj+t literal 2465 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 literal 5707 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 literal 5707 zcmb_gcTkhx(tZ&ImEOA`UPU1gg7hLPO{GZ*y@b$fKoURFF3?o(Hc;6wyiA*jIo~lg1c1;h01)vQ z01jzO5kCO{B?|y6FaS`^1OPt&T!M)@&AfdIh7^;hVC z>|A~T;QDq~`<8jg#QM~ux?E_Q*zaje6ygH=kKzcisr?8GA9f*bk26l}=t6c6VQo(w z6p5~@ST`_Mt2ph~aXFd^RaRIOcS^hnq7=c#z)`Y(`Kgf3nN+%Gw@faa6TA5I$BmWG zqDK~-kjIZFZ5@YOj~Xp_-@;6A`2NZb_1*E|1CcjDaOCqMmHT8MR>ChZ{(o5SvC@nK(B z96WtJT{s$n-6(5osM{{XTh7fH)fZQ3A*w`UVVZW41GeV8uas2_7(|pX5NKJQaANR$ z{hXTD$PjN@`pIvZmJ7DCpN(43xKqIS{A5gr6Lw&hGodH%{Gywf0U`3D$JP9Db3~_Y zb?<(={rG0XWINwN$rLwfUSmJOsImA3-P=n0O_LUr00tQ)D+@7tC%Ifz?&vAFns6+p zGY|!5ZE9b5lMrT(*-TrgZxnE9n%PVZcl; zHlabjel4YH9=&F!Z`(aA0QlAt`L}KNxp$GSP9_ZR-2|*YkKSNDnzI|6W$jE%Zgi#0 z@dI0E^zGAgt6jm4<%F1XVeX;yYmSe+JOZgGOakEDDzAwi< z9lv}xcNFF{B|1nTTmvQ?B8=y?b0f<^ASs0fN@vVxA+M@gpC^{{E`#H$)Ko`ux^+k~ z|B`57GPFcukVUI-#}lj4sncY&0O(wb)iH)qI1lkxSoyZfs$gIgx}9EY8_MH=txBRk z%#v9}{Q7cA<8ORW|qihVKi%Fs9!k_h!2yAm3D2)xM47^Z!xTzqZkt^E(5D z(Kaq2(--<$9!n*UAWN(i?PHczH2L|9xUueYA?TZX$cE7w%*a$+(r|@Vp~N3FnvRJm zd7D~itC-|CK8{~eMl*_zYUCAsKQLKu?M_}L^;S!?B@9@bSL%7+!$IqU0}hPEU1y+~ zX2G?g_F#saM4R{ciIhr9zLSjPDriN#pU(op3JI4lmY5Zzr) zL@#aCY#C$AexJ4)H4u*ED+9fEN8=`aQu8xKnL#Dh*mQcH4c@X&^0%osWj^>bH_6E% z60DFpVUU0LJ8}ada2yFcTU<0@=)D^s()`P2JgcU}3#eOlOFWiR zjB3g#w6xOUTWdtD{-$d}k2Ln{Ag(ie`^=GP-sAQUyC{sZ{SPC%xE!@j_z>-P3F6Sl z>Rs#aD(vk!(KY;4vwXZMzW{e{5!k5TJqw#lY2tJj$kKR?;lZsbErV4>=nL21DGMQn z|Fp}aM_~fHV&4@zBiV=f8oCC>6+(>dvqh|$&W4e7rGIDMmI;lkALAuMo=BykOnZ(z`NYch_`#p6jn9q z*JY;mIB)`Wya<3EMwYhti|1SK<*bQgIxZ^@WIB3YH9E?%5qwVf8<(Gy0;?SE?+Rv4 zkL4E1aFl@FLb<;7Av z1SCiKL9c}Dq_J4WTIK;2yVHXSI*VRdpSFT|dAlciedUewjjn)twSf3e2-r^Mt7Q1D zyC=_9Mxv#n6k`$&+@i}|X1dSQ7KiXmoxaAi<%QQETo3?^e+h`Q9KbI16P4^N!dH{Y z))Z2VY5uE_-hE7MuUqTaZx1xvl4|P(mAsQt=%{8$s5F2*#9q}fHZKc#k)DzT+0ra^ zxRmTQV&;KYyOBY%l^)sBymtT@&WsFO^&8?^sR#D21aXzIpwP1{CZE>O#gi4O_E2aZ zG0z5W&}#lh9u?iIeSS}i+i1DX@dUMF1K3I3m}#8b(5bN%X(-*Sk59%hwf*Z}yeLlS zl$h56xV%{)r-+ZMDtvSH>le5iN8ZB}AcJ8MwfDMabUO&B zBX*lZto*oecp0uw?p2%%JdgV5#Z@+#izo4Ttl1VHM$RA!@W^St!e05oR$JpZ1%_#T z7Oo!U{TuR3P<`#&F|oj)RgH1%>Dk9=*p2w%A`Iudt5ZJlnWWsp2huTtxta$hBee3i zesIgKCLnoC_E3+5U2Sx#CE!duPh%tcTyQB8T4_KEga0(99z?%5vNo6kJZy!|HYU7! z>d1$yNxr|qqtQ!LraI#vFhRX-g3;oyb~&!=Tv^}PZ2lDfsZ8axO~E^!6PqT7HSq#j z%3cL)qYLvi*XjY{gQ4J1%N84GaeFm>CAffZkEns;0&DCP0IRAG`i5pWK<|xp#9GYU ze+?d{H5CWY{VLdXK7J89q2Vv#-1nmEJ@Hpbr$*QNB=X`t`id#y&@KyMCO?`vqQQCOHB|leEZo_z1H+;7MltBNg}+o=qCR)9 zcOqmXf-r60I%kPtgsz^3Y)bUJJk2BSf*Rwhn9^b8Wj_zN6Py z;&*M&B;i17ozUN$P`sdoy-jBinY1ooj!3Ew3imI7EO|8v#$K%u#b*acMV_dUOCm2q zvOU(tqpHILIOlJod3RDn$=U)y4%}CxP_3Ja{N9mmmnH4dde83Ol%aR|(a&f7#tb(R z@hgEW#2av*u*WhYwtHCS2nYWO&KSMfhuGkFh3ytw*eMqPSv!<2YvGY5vaR5lvgd@b zS1(&r5CEorCcZ4K8j-vXb-37l0M3{meca1dM`mV**h%8Uv{k#yU8<+`51{c|piPjC>%dcqF=)e7M|4)G8nptRwroX& z3hMr`qz<44s@5h1HTL3HJV&v$O%gC1A*ay+(pka%=qj|i0_FI5P^RHgTMRi>cnNW5 z@AOUbgdnw@z4u8pJY)MQA*Z3cW%XyyEl*!C{?mz6e${u^zJ;PwyAr7*D7!H zp)k5Hij8w*SA(H;sc><{FBkC5*504TR}d9e6qDi><`abm7xT%BilWryG@}ZqyMeHe z`(aZW^>Kr(bO5PRfLB8@{TIQx|IgY~R_*X+I#~1L*GIY)HagJW6lz}4;bgHN^&~84 zx_GNx4JYH*zUOY*sy8_}a-EUXpcn zi(|QhwJ|;o9x!9JPglI~LvSTYmsD^$sBs#cUL{eK=}&S63=(^CE8KEg7czNzW2cT{ zdwNK2nN4>Cn3NKBjyL8x!paYR_o^MqFvfK2bBt?&prTbIE}`qdm3y~d4c6@_veY&T z@BEG~2iZ>4c`YRN3G+_LeC3lFz8ZY(9%}eTm2O6)#fq+6SN+-;f8v_;F;|29@v~5$RmJ>=JTt$-aTjFWZUX3vK0}Ag zHOX4HzU?>dR~yLT#gC}6aN?!wX@6Yu+^t?;!x${s5KD*lexZ*>?OaR(>nkwCbmv$QR{p_$Id>+>ZAg)<=u^EA z$Cy#EJ40_+Zn={(!1jwdFCx57+%U9ZCi= zHd&$<{N5OH6`aMf>8#j68#rE&8xy7`Rn;gT_GQ|{San!(M>n(p>bOXlw>NI|${i zykLBK^7tk{Km4;#8ol=6d+*@_;vpAWkjdO4XY^ouojKx{S$to~iFP=38CzguWn=7V zB`?eU0ztW#YpZN=vQ)Y8Uc$c`4>FTPA;W3Z;cZVdHwR5ig(FXjaMO zdvF(ek(^3Oy@EpyHEP5#k`=TdJ8zoOiBZs(dm*4H4+ zu`PZ!+4FY~lLPVzH3!rLoR7D##FZXCK?enyvAc(d9Zch<#13?KzjmoO0IwU>9xF{@?{K6CO>xXp!qQs z$)c&}d($86*`vZZb%ZAlKy5{T;)>kwf!zR~XiWRZRMmj0f$Gx)Dt zc?IZG2KhSkABy0XEqC91GdR8+`GR`d3cKY`*JtaQ<{Fz^mr~VaJF}X~gS5->@6I9C9f^AU_UceuLCn%wwO|CG`V;6hhpKz`3tIfV=bB`CwqM(jN&SxaXa9uhsdhRLsYM;NXg2o%E~rHjRyT62VaDXr`yB--{I3VqKD?7`!_-$ z!VMYh^uQIk>+9t1YUt$d>Fh10D5E5!EUh9YCkv7PC#0O12}DuM1Bvuk1%rcwgJnGb zqG>`y%OD=OPsXg%2m$`TjOHFFU%0BOHo_U@>*|M8RlQGx1_BTqwHf>$n15obs(QG3 zx_cl2WjR?Esm;GceE-JtzZgqT7o^8u$Y5*{j0O?-H;AF9uPgGQzbo)hR$zZWcg-3L zqyOMBG^e2eh=Q_;yn>vvii$Y)UI-1s_HR69o}sRQ?CsmBMK{)Hrknp}f|}k1+&q0; zY1;=Qef`01PC=f|2){tEldQbFikq^Nf-Jn`8}uHqs-;L^#! zZREfoA5{*&fg8&37#1kNZPh>x6!gPNBB$T7WQI;C=)x1Yz<(AORReXXLZW0Us}eCa zCU&)JEM_1dJ$QoKxPo)4fd)k5DuI6zKABA5Ka1B9gg!jNH#p+f$-p&aBSH?xt?i=N z*1TiU2TLf$9fYF+w^hHy8~gyb#)MD&6_=K7?qZr{cf7_6l%O62bWPfpwZyF}5;N~9 z!6Q#NV1!mI!AAv`^!*#3c^73^me8^8gBMzeUpfz~MD7u=kkIiW0w$`rZP=u4o|CYN gYXo-2I5@Kr02;N;atg6JFaQ7m07*qoM6N<$f})(8nE(I) literal 1240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5)Mpyt z6XFU~z_8&zL*r?Nd9N7`|7YmG&9L@2NCYAX6o(^-AXX`e8n}YlFA%ygwQu~-FzY!( z!zpw%aP2?^GoN8mfM!d_Wrq5b=!O8*z|EQYl%ee+7IW79WtjJdVd_JuUZ8rQjX*U0 zF^b6aCm_9R|1ivW3St120S#aF<^TWxLVs7O1H&!3B*+gGBOt)4%&g48!pgU0qKbUS zKCzq~d?)YZDWqPzF5Xsu`q0Wxk3VnNev_T?>|BnJ)zMs2Zi`wp^Kx#U#iH2velP#b zv+`Dq?l)d^%1Q4zQ_(FRbIEkyhZ{Rx1ao#JGjcMDs3(F_0%MZ5yGxqRm7A(S4rhT! zWHAE+w=f7ZGR&GI0Tf)|>Eak7aXC3bLDpbX@djh2Of^5fJUP8MH8wZ9Iz~sgG&RLU z!9c@8&It`Eo2G2(SrgN>r)iN8zlTGlYp8FmbFg=`qm#S1%7W$j2^lFlNm*%miJ7b- z8@6psP1(4)yr870tdMo)!57co9enlj>D$MzpUX3dFfeaBaAm=R2?6e|aVr>-BPv{$ zxP_SX@Lv%ZmKN7Pc%@ure{UGPcw)0@a8knFCc5o|#gT0a9{#jUoq7i6oK|-^|?9lFEWq2C%F23-Z$K zH--73nd2J*RK;LuYGG+&YGh$)snq3F0aU_|WKM8qRVssllhc$%c5i@EVMtP;L7oh0 znK`LI@9XF0mE`27>!&4_WhUq673(7+MnBQO#KbbqBGJ^qFflpJ%+%1_!o<|X(A+G^ gG%3~4!b}gSLl5Y_=zn6?KpPl5UHx3vIVCg!0G#8xH2?qr diff --git a/packages/demo-app/public/favicon-32x32.png b/packages/demo-app/public/favicon-32x32.png index 57d1ec61cdb901557989814f187321ef06b56564..ef5ae72afcf8940a36e67c8d0411385c02c6b064 100644 GIT binary patch delta 619 zcmV-x0+jvu4fzC+8Gi-<0047(dh`GQ0zgSbK~#7F?bZW~9Ss!4@%x#zZCgPZ)V3Sc zh-%xmZQHhO+qRx=|C`K9CeKqZPV(D*zGplVm8eAJ=gJEG1?7=dJ~urNr$$};>+yOH zl*cc@3e3c1v_U)zgJYm6PGKLS8?VPgdtAeePzua|!hxNrfq%aP4E`NuumK;S*l#LO z2JfL(3%I?;0u;cn9>a5D5}ra0o&_qx4hMP)v0A|GE(Xa;O(i`JCE~}r;3^adSl}QU zAf}Z9c5J|HD1fDo6Vm@w*bh3PhR0Zpm+&l*1S!Rcl>#P3a}Z%)jm6d zrSWCahZZvUTwCdWAi2lV6~ha7Zi3X9jd!6Q1vAYBLOA~8qdhJL*a>Y=Ob=MVDA5Fu zgB9S1{y}Z*fdguIiSGE_d>C3O@EZza7D|d|w(2kZNPi*rfkpg(12x#N3dQlKsc2;@ z19V z&vS=Nk72kEH5nma917qx6fW$cP+eKA|4R3Ru^G||XQ3vy(H$wiMuC4Z1vaSREo)?@ z^f|W8y=2E5USTrw1YY&lOT<7u9D)lf3*M>pJ?gsP2-V&9ld;(rrdn_ZKKiL2P002ovPDHLk FV1f^>Ax8iJ literal 1784 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 diff --git a/packages/demo-app/public/logo192.png b/packages/demo-app/public/logo192.png index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..bd3dc81a983c9e0860d568489bab8935ce60e0c4 100644 GIT binary patch literal 5317 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 X@eDJUQo;Ye2mwlRsnmay{^xuk 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/packages/demo-app/public/ms-icon-144x144.png b/packages/demo-app/public/ms-icon-144x144.png index ba9ec2131dccb0357092f219f331f41257d2ce20..7f81327d260d5cc7090b2cb981a394c376b913fc 100644 GIT binary patch literal 2550 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 Y3>EtLT>tRv(JKJvCTB1YjXW>?3-OirEdT%j diff --git a/packages/demo-app/public/ms-icon-150x150.png b/packages/demo-app/public/ms-icon-150x150.png index e649d9bf984cd9731c8b51aabde2206252943797..ac12badedd3789dee654f0f64ed82663bf1beedb 100644 GIT binary patch literal 2701 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 literal 4743 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 diff --git a/packages/demo-app/public/ms-icon-310x310.png b/packages/demo-app/public/ms-icon-310x310.png index c77d0872ef5419011a9c6d7c02ae13b342737d6d..544e5aeb1f7bf0ef4c608525f3e1815fd0971353 100644 GIT binary patch literal 8575 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 aIT5s!ccDAmT&3|Lzq*Bc5_z@5!JD>ps>NNrmW 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 = ({ onApply, type, size }) => { const [sizeState, setSize] = React.useState(size); const [typeState, setType] = React.useState(type); - const currentTheme = useContext(ThemeContext); + const currentTheme = React.useContext(ThemeContext); const [selectedTheme, setSelectedTheme] = React.useState(currentTheme.theme); const [selectedPaginationValue, setSelectedPaginationValue] = React.useState(-1); @@ -61,17 +60,17 @@ export const SettingsPanel: React.FC = ({ onApply, type, siz return ( - {/* */} -
- - + {/* */} +
+ + Dataset - + Rows - + Page Size @@ -105,12 +104,12 @@ export const SettingsPanel: React.FC = ({ onApply, type, siz
diff --git a/packages/demo-app/src/app/demos/grid/real-data-grid.demo.tsx b/packages/demo-app/src/app/demos/grid/real-data-grid.demo.tsx index f5e4eeab18c0..74673a1c77ad 100644 --- a/packages/demo-app/src/app/demos/grid/real-data-grid.demo.tsx +++ b/packages/demo-app/src/app/demos/grid/real-data-grid.demo.tsx @@ -100,15 +100,15 @@ export const RealDataGridDemo: React.FC<{ toggleTheme: () => void; themeId: stri const newPagination: Partial = { pagination: settings.pagesize !== -1, - paginationAutoPageSize: settings.pagesize === 0, - paginationPageSize: settings.pagesize > 0 ? settings.pagesize : undefined, + autoPageSize: settings.pagesize === 0, + pageSize: settings.pagesize > 0 ? settings.pagesize : undefined, }; setPagination((p) => { if ( p.pagination === newPagination.pagination && - p.paginationAutoPageSize === newPagination.paginationAutoPageSize && - p.paginationPageSize === newPagination.paginationPageSize + p.autoPageSize === newPagination.autoPageSize && + p.pageSize === newPagination.pageSize ) { return p; } @@ -118,12 +118,12 @@ export const RealDataGridDemo: React.FC<{ toggleTheme: () => void; themeId: stri return ( - + -
-
+
+
{ + React.useEffect(() => { setIsDark(theme === darkTheme); }, [theme]); diff --git a/packages/grid/data-grid/CHANGELOG.md b/packages/grid/data-grid/CHANGELOG.md index 12a7df8e1914..0c4b298da693 100644 --- a/packages/grid/data-grid/CHANGELOG.md +++ b/packages/grid/data-grid/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.64](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.64) (2020-07-27) + +**Note:** Version bump only for package @material-ui/data-grid + + + + + +## [0.1.63](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.63) (2020-07-27) + +**Note:** Version bump only for package @material-ui/data-grid + + + + + ## [0.1.62](https://github.com/mui-org/material-ui-x/compare/v0.1.61...v0.1.62) (2020-07-22) **Note:** Version bump only for package @material-ui/data-grid diff --git a/packages/grid/data-grid/package.json b/packages/grid/data-grid/package.json index a0b9cbc007cc..6ae6418edbd2 100644 --- a/packages/grid/data-grid/package.json +++ b/packages/grid/data-grid/package.json @@ -1,6 +1,6 @@ { "name": "@material-ui/data-grid", - "version": "0.1.62", + "version": "0.1.64", "description": "The Material-UI community edition of the data grid component.", "author": "Material-UI Team", "main": "dist/index-cjs.js", @@ -13,16 +13,19 @@ "publishConfig": { "access": "public" }, + "dependencies": { + "tslib": "^2.0.0" + }, "devDependencies": { - "@material-ui/x-grid-modules": "^0.1.62", + "@material-ui/x-grid-modules": "^0.1.64", + "@rollup/plugin-node-resolve": "^8.0.1", "rollup": "^2.6.1", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-command": "^1.1.3", "rollup-plugin-dts": "^1.4.7", "rollup-plugin-sourcemaps": "^0.6.2", "rollup-plugin-terser": "^5.3.0", - "rollup-plugin-typescript2": "^0.27.1", - "tslib": "^2.0.0" + "rollup-plugin-typescript2": "^0.27.1" }, "peerDependencies": { "@material-ui/core": "^4.9.12", diff --git a/packages/grid/data-grid/rollup.config.js b/packages/grid/data-grid/rollup.config.js index ef74b80bb937..38e4e9e771a8 100644 --- a/packages/grid/data-grid/rollup.config.js +++ b/packages/grid/data-grid/rollup.config.js @@ -34,7 +34,7 @@ export default [ cleaner({ targets: ['./dist/'], }), - typescript(), + typescript({ build: true }), !production && sourceMaps(), production && terser(), ], diff --git a/packages/grid/data-grid/src/data-grid.tsx b/packages/grid/data-grid/src/data-grid.tsx index 8498c60a4bae..0e5324d910c1 100644 --- a/packages/grid/data-grid/src/data-grid.tsx +++ b/packages/grid/data-grid/src/data-grid.tsx @@ -26,9 +26,9 @@ export const DataGrid: React.FC = React.memo(function DataGrid( props: DataGridProps, ) { const validateOptions = React.useCallback((options: DataGridOptionsProp) => { - if (options && options.paginationPageSize && options.paginationPageSize > MAX_PAGE_SIZE) { + if (options && options.pageSize && options.pageSize > MAX_PAGE_SIZE) { throw new Error( - `Material-UI: Option 'paginationPageSize' cannot be above ${MAX_PAGE_SIZE}. Use the @material-ui/x-grid to unlock this feature`, + `Material-UI: Option 'pageSize' cannot be above ${MAX_PAGE_SIZE}. Use the @material-ui/x-grid to unlock this feature`, ); } return options; diff --git a/packages/grid/data-grid/src/index.ts b/packages/grid/data-grid/src/index.ts index 13b912ef1a7e..7134647a2cd5 100644 --- a/packages/grid/data-grid/src/index.ts +++ b/packages/grid/data-grid/src/index.ts @@ -1,5 +1,2 @@ -import { DataGrid } from './data-grid'; - export * from '@material-ui/x-grid-modules'; export * from './data-grid'; -export const Grid = DataGrid; diff --git a/packages/grid/x-grid-modules/CHANGELOG.md b/packages/grid/x-grid-modules/CHANGELOG.md index 24c61bb30e88..d8cb0540dea5 100644 --- a/packages/grid/x-grid-modules/CHANGELOG.md +++ b/packages/grid/x-grid-modules/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.64](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.64) (2020-07-27) + +**Note:** Version bump only for package @material-ui/x-grid-modules + + + + + +## [0.1.63](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.63) (2020-07-27) + +**Note:** Version bump only for package @material-ui/x-grid-modules + + + + + ## [0.1.62](https://github.com/mui-org/material-ui-x/compare/v0.1.61...v0.1.62) (2020-07-22) **Note:** Version bump only for package @material-ui/x-grid-modules diff --git a/packages/grid/x-grid-modules/lib/autosizer/index.js b/packages/grid/x-grid-modules/lib/autosizer/index.js index 8bc89632485f..6f14ea801452 100644 --- a/packages/grid/x-grid-modules/lib/autosizer/index.js +++ b/packages/grid/x-grid-modules/lib/autosizer/index.js @@ -1,4 +1,4 @@ -import { createElement, PureComponent } from 'react'; +import * as React from 'react'; /** * Detect Element Resize. @@ -378,7 +378,7 @@ var AutoSizer = function (_React$PureComponent) { childParams.width = width; } - return createElement( + return React.createElement( 'div', { className: className, @@ -389,7 +389,7 @@ var AutoSizer = function (_React$PureComponent) { } }]); return AutoSizer; -}(PureComponent); +}(React.PureComponent); AutoSizer.defaultProps = { onResize: function onResize() {}, diff --git a/packages/grid/x-grid-modules/lib/autosizer/types.d.ts b/packages/grid/x-grid-modules/lib/autosizer/types.d.ts index 80a923fa0770..faed519745eb 100644 --- a/packages/grid/x-grid-modules/lib/autosizer/types.d.ts +++ b/packages/grid/x-grid-modules/lib/autosizer/types.d.ts @@ -11,31 +11,41 @@ export interface Size { } export interface AutoSizerProps { - /** Function responsible for rendering children. */ + /** + * Function responsible for rendering children. + */ children: (size: Size) => React.ReactNode; - - /** Optional custom CSS class name to attach to root AutoSizer element. */ + /** + * Optional custom CSS class name to attach to root AutoSizer element. + */ className?: string; - - /** Default height to use for initial render; useful for SSR */ + /** + * Default height to use for initial render; useful for SSR. + */ defaultHeight?: number; - - /** Default width to use for initial render; useful for SSR */ + /** + * Default width to use for initial render; useful for SSR. + */ defaultWidth?: number; - - /** Disable dynamic :height property */ + /** + * Disable dynamic :height property. + */ disableHeight?: boolean; - - /** Disable dynamic :width property */ + /** + * Disable dynamic :width property. + */ disableWidth?: boolean; - - /** Nonce of the inlined stylesheet for Content Security Policy */ + /** + * Nonce of the inlined stylesheet for Content Security Policy. + */ nonce?: string; - - /** Callback to be invoked on-resize */ + /** + * Callback to be invoked on-resize. + */ onResize?: (size: Size) => void; - - /** Optional inline style */ + /** + * Optional inline style. + */ style?: React.CSSProperties; } diff --git a/packages/grid/x-grid-modules/package.json b/packages/grid/x-grid-modules/package.json index e55780157db7..7e186ecbc0b6 100644 --- a/packages/grid/x-grid-modules/package.json +++ b/packages/grid/x-grid-modules/package.json @@ -1,6 +1,6 @@ { "name": "@material-ui/x-grid-modules", - "version": "0.1.62", + "version": "0.1.64", "description": "Material-UI shared grid modules", "author": "Material-UI Team", "main": "dist/index-cjs.js", diff --git a/packages/grid/x-grid-modules/src/components/checkbox-renderer.tsx b/packages/grid/x-grid-modules/src/components/checkbox-renderer.tsx index 070af522eb5c..e9e1616cbbe9 100644 --- a/packages/grid/x-grid-modules/src/components/checkbox-renderer.tsx +++ b/packages/grid/x-grid-modules/src/components/checkbox-renderer.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import Checkbox from '@material-ui/core/Checkbox'; import styled from 'styled-components'; -import { SelectionChangedParams } from '../models/params/selectionChangedParams'; +import { SelectionChangeParams } from '../models/params/selectionChangeParams'; import { ColParams } from '../models/params/colParams'; import { CellParams } from '../models/params/cellParams'; @@ -17,8 +17,8 @@ export const HeaderCheckbox: React.FC = React.memo(({ api }) => { setChecked(checked); api.selectRows(api.getAllRowIds(), checked); }; - const selectionChanged = React.useCallback( - (event: SelectionChangedParams) => { + const selectionChange = React.useCallback( + (event: SelectionChangeParams) => { const isAllSelected = api.getAllRowIds().length === event.rows.length && event.rows.length > 0; const hasNoneSelected = event.rows.length === 0; @@ -29,8 +29,8 @@ export const HeaderCheckbox: React.FC = React.memo(({ api }) => { ); React.useEffect(() => { - return api.onSelectionChanged(selectionChanged); - }, [api, selectionChanged]); + return api.onSelectionChange(selectionChange); + }, [api, selectionChange]); return ( onResizeColumn(column) : undefined; diff --git a/packages/grid/x-grid-modules/src/components/default-footer.tsx b/packages/grid/x-grid-modules/src/components/default-footer.tsx index 6e6ee620660e..2a2062f4dc27 100644 --- a/packages/grid/x-grid-modules/src/components/default-footer.tsx +++ b/packages/grid/x-grid-modules/src/components/default-footer.tsx @@ -18,7 +18,7 @@ export const DefaultFooter = React.forwardRef { if (api && api.current) { - return api.current!.onSelectionChanged(({ rows }) => setSelectedCount(rows.length)); + return api.current!.onSelectionChange(({ rows }) => setSelectedCount(rows.length)); } return undefined; diff --git a/packages/grid/x-grid-modules/src/components/row-cells.tsx b/packages/grid/x-grid-modules/src/components/row-cells.tsx index ac584f7f896b..06ded208184e 100644 --- a/packages/grid/x-grid-modules/src/components/row-cells.tsx +++ b/packages/grid/x-grid-modules/src/components/row-cells.tsx @@ -1,37 +1,9 @@ import * as React from 'react'; -import { - CellClassParams, - CellValue, - ColDef, - CellParams, - Columns, - GridApi, - RowModel, - ValueFormatterParams, - ValueGetterParams, - CellClassRules, -} from '../models'; +import { CellClassParams, Columns, RowModel, CellClassRules, CellParams } from '../models'; import { Cell, GridCellProps } from './cell'; import { ApiContext } from './api-context'; import { classnames, isFunction } from '../utils'; - -function getCellParams( - rowModel: RowModel, - col: ColDef, - rowIndex: number, - value: CellValue, - api: GridApi, -): CellParams { - return { - value, - getValue: (field: string) => rowModel.data[field], - data: rowModel.data, - rowModel, - colDef: col, - rowIndex, - api, - }; -} +import { buildCellParams } from '../utils/paramsUtils'; function applyCssClassRules(cellClassRules: CellClassRules, params: CellClassParams) { return Object.entries(cellClassRules).reduce((appliedCss, entry) => { @@ -77,22 +49,22 @@ export const RowCells: React.FC = React.memo((props) => { : !removeLastBorderRight && !props.extendRowFullWidth; let value = row.data[column.field!]; + const cellParams: CellParams = buildCellParams({ + rowModel: row, + colDef: column, + rowIndex, + value, + api: api!.current!, + }); + if (column.valueGetter) { - const params: ValueGetterParams = getCellParams(row, column, rowIndex, value, api!.current!); // Value getter override the original value - value = column.valueGetter(params); + value = column.valueGetter(cellParams); } let formattedValueProp = {}; if (column.valueFormatter) { - const params: ValueFormatterParams = getCellParams( - row, - column, - rowIndex, - value, - api!.current!, - ); - formattedValueProp = { formattedValue: column.valueFormatter(params) }; + formattedValueProp = { formattedValue: column.valueFormatter(cellParams) }; } let cssClassProp = { cssClass: '' }; @@ -100,21 +72,18 @@ export const RowCells: React.FC = React.memo((props) => { if (!isFunction(column.cellClassName)) { cssClassProp = { cssClass: classnames(column.cellClassName) }; } else { - const params: CellClassParams = getCellParams(row, column, rowIndex, value, api!.current!); - cssClassProp = { cssClass: column.cellClassName(params) as string }; + cssClassProp = { cssClass: column.cellClassName(cellParams) as string }; } } if (column.cellClassRules) { - const params: CellClassParams = getCellParams(row, column, rowIndex, value, api!.current!); - const cssClass = applyCssClassRules(column.cellClassRules, params); + const cssClass = applyCssClassRules(column.cellClassRules, cellParams); cssClassProp = { cssClass: `${cssClassProp.cssClass} ${cssClass}` }; } let cellComponent: React.ReactElement | null = null; if (column.renderCell) { - const params: CellParams = getCellParams(row, column, rowIndex, value, api!.current!); - cellComponent = column.renderCell(params); + cellComponent = column.renderCell(cellParams); cssClassProp = { cssClass: `${cssClassProp.cssClass} with-renderer` }; } diff --git a/packages/grid/x-grid-modules/src/components/styled-wrappers/columns-container.tsx b/packages/grid/x-grid-modules/src/components/styled-wrappers/columns-container.tsx index 369cc32a5cbf..df4293688d0f 100644 --- a/packages/grid/x-grid-modules/src/components/styled-wrappers/columns-container.tsx +++ b/packages/grid/x-grid-modules/src/components/styled-wrappers/columns-container.tsx @@ -1,8 +1,9 @@ import * as React from 'react'; import { DivProps } from './grid-root'; +import { classnames } from '../../utils'; export const ColumnsContainer = React.forwardRef((props, ref) => { const { className, ...other } = props; - return
; + return
; }); ColumnsContainer.displayName = 'ColumnsContainer'; diff --git a/packages/grid/x-grid-modules/src/components/styled-wrappers/data-container.tsx b/packages/grid/x-grid-modules/src/components/styled-wrappers/data-container.tsx index 871d3efec22f..a390dba409b3 100644 --- a/packages/grid/x-grid-modules/src/components/styled-wrappers/data-container.tsx +++ b/packages/grid/x-grid-modules/src/components/styled-wrappers/data-container.tsx @@ -1,8 +1,9 @@ import * as React from 'react'; import { DivProps } from './grid-root'; +import { classnames } from '../../utils'; export const DataContainer = React.forwardRef((props, ref) => { const { className, ...other } = props; - return
; + return
; }); DataContainer.displayName = 'DataContainer'; diff --git a/packages/grid/x-grid-modules/src/components/styled-wrappers/footer.tsx b/packages/grid/x-grid-modules/src/components/styled-wrappers/footer.tsx index b77f0bc23684..be1c7e09bbaa 100644 --- a/packages/grid/x-grid-modules/src/components/styled-wrappers/footer.tsx +++ b/packages/grid/x-grid-modules/src/components/styled-wrappers/footer.tsx @@ -1,8 +1,9 @@ import * as React from 'react'; import { DivProps } from './grid-root'; +import { classnames } from '../../utils'; export const Footer = React.forwardRef((props, ref) => { const { className, ...other } = props; - return
; + return
; }); Footer.displayName = 'Footer'; diff --git a/packages/grid/x-grid-modules/src/components/styled-wrappers/grid-root.tsx b/packages/grid/x-grid-modules/src/components/styled-wrappers/grid-root.tsx index f21ee6de1816..04720a99c8c3 100644 --- a/packages/grid/x-grid-modules/src/components/styled-wrappers/grid-root.tsx +++ b/packages/grid/x-grid-modules/src/components/styled-wrappers/grid-root.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import styled from 'styled-components'; import { GridOptions } from '../../models'; +import { classnames } from '../../utils'; export type DivProps = React.HTMLAttributes; @@ -246,7 +247,12 @@ export const GridRoot = React.forwardRef + ); }); GridRoot.displayName = 'GridRoot'; diff --git a/packages/grid/x-grid-modules/src/components/styled-wrappers/window-overlay.tsx b/packages/grid/x-grid-modules/src/components/styled-wrappers/window-overlay.tsx index 465385b783ca..d0b14f3b7420 100644 --- a/packages/grid/x-grid-modules/src/components/styled-wrappers/window-overlay.tsx +++ b/packages/grid/x-grid-modules/src/components/styled-wrappers/window-overlay.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import styled from 'styled-components'; +import { classnames } from '../../utils'; import { DivProps } from './grid-root'; export const Overlay = styled.div` @@ -23,7 +24,7 @@ export const Overlay = styled.div` export function GridOverlay(props: DivProps) { const { className, children, ...other } = props; return ( - +
{children}
); diff --git a/packages/grid/x-grid-modules/src/components/styled-wrappers/window.tsx b/packages/grid/x-grid-modules/src/components/styled-wrappers/window.tsx index f35b4e9e2130..c86bb5ad1834 100644 --- a/packages/grid/x-grid-modules/src/components/styled-wrappers/window.tsx +++ b/packages/grid/x-grid-modules/src/components/styled-wrappers/window.tsx @@ -1,8 +1,9 @@ import * as React from 'react'; import { DivProps } from './grid-root'; +import { classnames } from '../../utils'; export const Window = React.forwardRef((props, ref) => { const { className, ...other } = props; - return
; + return
; }); Window.displayName = 'Window'; diff --git a/packages/grid/x-grid-modules/src/constants/eventsConstants.ts b/packages/grid/x-grid-modules/src/constants/eventsConstants.ts index a0dc5b28becb..039f09840fe2 100644 --- a/packages/grid/x-grid-modules/src/constants/eventsConstants.ts +++ b/packages/grid/x-grid-modules/src/constants/eventsConstants.ts @@ -1,16 +1,20 @@ export const RESIZE = 'resize'; export const UNMOUNT = 'unmount'; export const CLICK_EVENT = 'click'; +export const HOVER_EVENT = 'mouseover'; export const KEYDOWN_EVENT = 'keydown'; export const KEYUP_EVENT = 'keyup'; -export const CELL_CLICKED = 'cellClicked'; -export const ROW_CLICKED = 'rowClicked'; +export const CELL_CLICK = 'cellClick'; +export const CELL_HOVER = 'cellHover'; +export const ROW_CLICK = 'rowClick'; +export const ROW_HOVER = 'rowHover'; export const ROW_SELECTED_EVENT = 'rowSelected'; -export const SELECTION_CHANGED_EVENT = 'selectionChanged'; -export const COLUMN_HEADER_CLICKED = 'columnClicked'; -export const PAGE_CHANGED_EVENT = 'pageChanged'; -export const PAGESIZE_CHANGED_EVENT = 'pageSizeChanged'; +export const SELECTION_CHANGED_EVENT = 'selectionChange'; +export const COLUMN_HEADER_CLICK = 'columnClick'; +export const COLUMN_HEADER_HOVER = 'columnHeaderHover'; +export const PAGE_CHANGED_EVENT = 'pageChange'; +export const PAGESIZE_CHANGED_EVENT = 'pageSizeChange'; export const SCROLLING_START = 'scrolling:start'; export const SCROLLING = 'scrolling'; @@ -24,4 +28,4 @@ export const COLUMNS_UPDATED = 'columnsUpdated'; export const SORT_MODEL_UPDATED = 'sortModelUpdated'; export const POST_SORT = 'postSort'; // ag-grid compatible export const COLUMNS_SORTED = 'columnsSorted'; -export const MULTIPLE_KEY_PRESS_CHANGED = 'multipleKeyPressChanged'; +export const MULTIPLE_KEY_PRESS_CHANGED = 'multipleKeyPressChange'; diff --git a/packages/grid/x-grid-modules/src/gridComponent.tsx b/packages/grid/x-grid-modules/src/gridComponent.tsx index 5fc56c04597e..7ba286b54f55 100644 --- a/packages/grid/x-grid-modules/src/gridComponent.tsx +++ b/packages/grid/x-grid-modules/src/gridComponent.tsx @@ -35,8 +35,9 @@ import { debounce } from './utils'; import { mergeOptions } from './utils/mergeOptions'; /** - * Material-UI Grid React component implementing [[GridComponentProps]]. - * @return JSX.Element. + * Data Grid component implementing [[GridComponentProps]]. + * + * @returns JSX.Element */ export const GridComponent: React.FC = React.memo( ({ rows, columns, options, apiRef, loading, licenseStatus, className, components }) => { @@ -84,8 +85,8 @@ export const GridComponent: React.FC = React.memo( React.useEffect(() => { setInternalOptions((previousState) => { - if (previousState.paginationPageSize !== paginationProps.pageSize) { - return { ...previousState, paginationPageSize: paginationProps.pageSize }; + if (previousState.pageSize !== paginationProps.pageSize) { + return { ...previousState, pageSize: paginationProps.pageSize }; } return previousState; }); @@ -215,11 +216,15 @@ export const GridComponent: React.FC = React.memo( pageSize={paginationProps.pageSize} rowCount={paginationProps.rowCount} setPageSize={paginationProps.setPageSize} - rowsPerPageOptions={internalOptions.paginationRowsPerPageOptions} + rowsPerPageOptions={internalOptions.rowsPerPageOptions} /> )) } - rowCount={internalRows.length} + rowCount={ + internalOptions.rowCount == null + ? internalRows.length + : internalOptions.rowCount + } options={internalOptions} /> )} diff --git a/packages/grid/x-grid-modules/src/gridComponentProps.ts b/packages/grid/x-grid-modules/src/gridComponentProps.ts index 5525350f3ae6..f58697fa1814 100644 --- a/packages/grid/x-grid-modules/src/gridComponentProps.ts +++ b/packages/grid/x-grid-modules/src/gridComponentProps.ts @@ -10,31 +10,31 @@ export type GridOptionsProp = Partial; */ export interface GridComponentProps { /** - * Set of rows of type [[RowsProp]] + * Set of rows of type [[RowsProp]]. */ rows: RowsProp; /** - * Set of columns of type [[Columns]] + * Set of columns of type [[Columns]]. */ columns: Columns; /** - * Set of options of type [[GridOptionsProp]] + * Set of options of type [[GridOptionsProp]]. */ options?: GridOptionsProp; /** - * Overrideable components + * Overrideable components. */ components?: GridComponentOverridesProp; /** - * The ref object that allows grid manipulation. Can be instantiated with [[gridApiRef()]] + * The ref object that allows grid manipulation. Can be instantiated with [[gridApiRef()]]. */ apiRef?: ApiRef; /** - * Boolean prop that toggle the loading overlay + * Boolean prop that toggle the loading overlay. */ loading?: boolean; /** - * String prop that allows to pass extra Css class in the inner grid container. + * @ignore */ className?: string; /** diff --git a/packages/grid/x-grid-modules/src/hooks/features/usePagination.ts b/packages/grid/x-grid-modules/src/hooks/features/usePagination.ts index adc2e4d122de..b2fb0edd6fac 100644 --- a/packages/grid/x-grid-modules/src/hooks/features/usePagination.ts +++ b/packages/grid/x-grid-modules/src/hooks/features/usePagination.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useReducer, useRef } from 'react'; +import * as React from 'react'; import { useLogger } from '../utils'; import { PAGE_CHANGED_EVENT, @@ -7,12 +7,13 @@ import { } from '../../constants/eventsConstants'; import { useApiMethod } from '../root/useApiMethod'; import { useApiEventHandler } from '../root/useApiEventHandler'; -import { PageChangedParams } from '../../models/params/pageChangedParams'; +import { PageChangeParams } from '../../models/params/pageChangeParams'; import { Rows } from '../../models/rows'; import { InternalColumns } from '../../models/colDef/colDef'; import { GridOptions } from '../../models/gridOptions'; import { PaginationApi } from '../../models/api/paginationApi'; import { ApiRef } from '../../models/api'; +import { FeatureMode } from '../../models/featureMode'; export interface PaginationProps { page: number; @@ -22,7 +23,7 @@ export interface PaginationProps { setPage: (page: number) => void; setPageSize: (pageSize: number) => void; } -export type PaginationState = PageChangedParams; +export type PaginationState = PageChangeParams; const UPDATE_STATE_ACTION = 'updateState'; function updateStateAction( @@ -54,15 +55,19 @@ export const usePagination = ( const logger = useLogger('usePagination'); const initialState: PaginationState = { - pageSize: options.paginationPageSize || 0, - rowCount: rows.length, - page: 1, - pageCount: getPageCount(options.paginationPageSize, rows.length), + paginationMode: options.paginationMode!, + pageSize: options.pageSize || 0, + rowCount: options.rowCount == null ? rows.length : options.rowCount, + page: options.page || 1, + pageCount: getPageCount( + options.pageSize, + options.rowCount == null ? rows.length : options.rowCount, + ), }; - const stateRef = useRef(initialState); - const [state, dispatch] = useReducer(paginationReducer, initialState); + const stateRef = React.useRef(initialState); + const [state, dispatch] = React.useReducer(paginationReducer, initialState); - const updateState = useCallback( + const updateState = React.useCallback( (stateUpdate: Partial) => { const newState = { ...stateRef.current, ...stateUpdate }; stateRef.current = newState; @@ -71,11 +76,15 @@ export const usePagination = ( [dispatch], ); - const setPage = useCallback( + const setPage = React.useCallback( (page: number) => { if (apiRef && apiRef.current) { - apiRef.current!.renderPage(page); - const params: PageChangedParams = { + page = stateRef.current.pageCount >= page ? page : stateRef.current.pageCount; + apiRef.current!.renderPage( + stateRef.current.paginationMode === FeatureMode.client ? page : 1, + ); + + const params: PageChangeParams = { ...stateRef.current, page, }; @@ -89,7 +98,7 @@ export const usePagination = ( ); // We use stateRef in this method to avoid reattaching this method to the api every time the state changes - const setPageSize = useCallback( + const setPageSize = React.useCallback( (pageSize: number) => { if (stateRef.current.pageSize === pageSize) { return; @@ -102,7 +111,7 @@ export const usePagination = ( newPage = newPage > newPageCount ? newPageCount : newPage; newPage = newPage < 1 ? 1 : newPage; logger.info( - `PageSize changed to ${pageSize}, setting page to ${newPage}, total page count is ${newPageCount}`, + `PageSize change to ${pageSize}, setting page to ${newPage}, total page count is ${newPageCount}`, ); const newState: PaginationState = { ...stateRef.current, @@ -110,7 +119,7 @@ export const usePagination = ( pageCount: newPageCount, pageSize, }; - apiRef.current!.emit(PAGESIZE_CHANGED_EVENT, newState as PageChangedParams); + apiRef.current!.emit(PAGESIZE_CHANGED_EVENT, newState as PageChangeParams); updateState(newState); setPage(newPage); @@ -118,25 +127,25 @@ export const usePagination = ( [stateRef, apiRef, setPage, updateState, logger], ); - const onPageChanged = useCallback( - (handler: (param: PageChangedParams) => void): (() => void) => { + const onPageChange = React.useCallback( + (handler: (param: PageChangeParams) => void): (() => void) => { return apiRef!.current!.registerEvent(PAGE_CHANGED_EVENT, handler); }, [apiRef], ); - const onPageSizeChanged = useCallback( - (handler: (param: PageChangedParams) => void): (() => void) => { + const onPageSizeChange = React.useCallback( + (handler: (param: PageChangeParams) => void): (() => void) => { return apiRef!.current!.registerEvent(PAGESIZE_CHANGED_EVENT, handler); }, [apiRef], ); - const getAutoPageSize = useCallback(() => { + const getAutoPageSize = React.useCallback(() => { const containerProps = apiRef?.current?.getContainerPropsState(); return containerProps?.viewportPageSize; }, [apiRef]); - const resetAutopageSize = useCallback(() => { + const resetAutopageSize = React.useCallback(() => { const autoPagesize = getAutoPageSize(); if (autoPagesize) { logger.debug(`Setting autoPagesize to ${autoPagesize}`); @@ -144,14 +153,29 @@ export const usePagination = ( } }, [setPageSize, logger, getAutoPageSize]); - useEffect(() => { + React.useEffect(() => { stateRef.current = state; }, [state]); - useEffect(() => { - if (rows.length !== state.rowCount) { - logger.info(`Options or rows changed, recalculating pageCount and rowCount`); - const newPageCount = getPageCount(state.pageSize, rows.length); + React.useEffect(() => { + if (apiRef.current?.isInitialised) { + apiRef.current!.emit(PAGE_CHANGED_EVENT, stateRef.current); + } + }, [apiRef, stateRef, apiRef.current?.isInitialised]); + + React.useEffect(() => { + updateState({ paginationMode: options.paginationMode! }); + }, [options.paginationMode, updateState]); + + React.useEffect(() => { + setPage(options.page != null ? options.page : 1); + }, [options.page, setPage]); + + React.useEffect(() => { + const rowCount = options.rowCount == null ? rows.length : options.rowCount; + if (rowCount !== state.rowCount) { + logger.info(`Options or rows change, recalculating pageCount and rowCount`); + const newPageCount = getPageCount(state.pageSize, rowCount); updateState({ pageCount: newPageCount, rowCount: rows.length }); if (state.page > newPageCount) { @@ -160,38 +184,38 @@ export const usePagination = ( } }, [rows.length, logger, updateState, state.rowCount, state.pageSize, setPage, state.page]); - useEffect(() => { + React.useEffect(() => { if ( - !options.paginationAutoPageSize && - options.paginationPageSize && - options.paginationPageSize !== stateRef.current.pageSize + !options.autoPageSize && + options.pageSize && + options.pageSize !== stateRef.current.pageSize ) { - setPageSize(options.paginationPageSize); + setPageSize(options.pageSize); } - }, [options.paginationAutoPageSize, options.paginationPageSize, logger, setPageSize]); + }, [options.autoPageSize, options.pageSize, logger, setPageSize]); - useEffect(() => { - if (options.paginationAutoPageSize && columns.visible.length > 0) { + React.useEffect(() => { + if (options.autoPageSize && columns.visible.length > 0) { resetAutopageSize(); } - }, [options.paginationAutoPageSize, resetAutopageSize, columns.visible.length]); + }, [options.autoPageSize, resetAutopageSize, columns.visible.length]); - useApiEventHandler(apiRef, PAGE_CHANGED_EVENT, options.onPageChanged); - useApiEventHandler(apiRef, PAGESIZE_CHANGED_EVENT, options.onPageSizeChanged); + useApiEventHandler(apiRef, PAGE_CHANGED_EVENT, options.onPageChange); + useApiEventHandler(apiRef, PAGESIZE_CHANGED_EVENT, options.onPageSizeChange); - const onResize = useCallback(() => { - if (options.paginationAutoPageSize) { + const onResize = React.useCallback(() => { + if (options.autoPageSize) { resetAutopageSize(); } - }, [options.paginationAutoPageSize, resetAutopageSize]); + }, [options.autoPageSize, resetAutopageSize]); useApiEventHandler(apiRef, RESIZE, onResize); const paginationApi: PaginationApi = { setPageSize, setPage, - onPageChanged, - onPageSizeChanged, + onPageChange, + onPageSizeChange, }; useApiMethod(apiRef, paginationApi, 'paginationApi'); diff --git a/packages/grid/x-grid-modules/src/hooks/features/useSelection.ts b/packages/grid/x-grid-modules/src/hooks/features/useSelection.ts index 358b5cad2b71..904107109dcb 100644 --- a/packages/grid/x-grid-modules/src/hooks/features/useSelection.ts +++ b/packages/grid/x-grid-modules/src/hooks/features/useSelection.ts @@ -1,18 +1,18 @@ import * as React from 'react'; import { GridOptions, - RowClickedParam, RowId, RowModel, RowSelectedParams, RowsProp, - SelectionChangedParams, + SelectionChangeParams, ApiRef, + RowParams, } from '../../models'; import { useLogger } from '../utils/useLogger'; import { MULTIPLE_KEY_PRESS_CHANGED, - ROW_CLICKED, + ROW_CLICK, ROW_SELECTED_EVENT, SELECTION_CHANGED_EVENT, } from '../../constants/eventsConstants'; @@ -79,18 +79,18 @@ export const useSelection = ( if (apiRef && apiRef.current != null) { logger.info( - `Row at index ${rowIndex} has changed to ${isRowSelected ? 'selected' : 'unselected'} `, + `Row at index ${rowIndex} has change to ${isRowSelected ? 'selected' : 'unselected'} `, ); const rowSelectedParam: RowSelectedParams = { data: row.data, isSelected: isRowSelected, rowIndex, }; - const selectionChangedParam: SelectionChangedParams = { + const selectionChangeParam: SelectionChangeParams = { rows: getSelectedRows().map((r) => r.data), }; apiRef.current!.emit(ROW_SELECTED_EVENT, rowSelectedParam); - apiRef.current!.emit(SELECTION_CHANGED_EVENT, selectionChangedParam); + apiRef.current!.emit(SELECTION_CHANGED_EVENT, selectionChangeParam); } forceUpdate((p: any) => !p); @@ -137,17 +137,17 @@ export const useSelection = ( if (apiRef && apiRef.current != null) { // We don't emit ROW_SELECTED_EVENT on each row as it would be too consuming for large set of data. - const selectionChangedParam: SelectionChangedParams = { + const selectionChangeParam: SelectionChangeParams = { rows: getSelectedRows().map((r) => r.data), }; - apiRef.current!.emit(SELECTION_CHANGED_EVENT, selectionChangedParam); + apiRef.current!.emit(SELECTION_CHANGED_EVENT, selectionChangeParam); } }, [apiRef, selectedItemsRef, forceUpdate, options.enableMultipleSelection, getSelectedRows], ); - const rowClickedHandler = React.useCallback( - (params: RowClickedParam) => { + const rowClickHandler = React.useCallback( + (params: RowParams) => { if (!options.disableSelectionOnClick) { selectRowModel(params.rowModel); } @@ -162,29 +162,29 @@ export const useSelection = ( [options.enableMultipleSelection, allowMultipleSelectionKeyPressed], ); - const onSelectedRow = React.useCallback( + const onRowSelected = React.useCallback( (handler: (param: RowSelectedParams) => void): (() => void) => { return apiRef!.current!.registerEvent(ROW_SELECTED_EVENT, handler); }, [apiRef], ); - const onSelectionChanged = React.useCallback( - (handler: (param: SelectionChangedParams) => void): (() => void) => { + const onSelectionChange = React.useCallback( + (handler: (param: SelectionChangeParams) => void): (() => void) => { return apiRef!.current!.registerEvent(SELECTION_CHANGED_EVENT, handler); }, [apiRef], ); - useApiEventHandler(apiRef, ROW_CLICKED, rowClickedHandler); + useApiEventHandler(apiRef, ROW_CLICK, rowClickHandler); useApiEventHandler(apiRef, MULTIPLE_KEY_PRESS_CHANGED, onMultipleKeyPressed); - // TODO handle Cell Clicked/range selection? + // TODO handle Cell Click/range selection? const selectionApi: SelectionApi = { selectRow, getSelectedRows, selectRows, - onSelectedRow, - onSelectionChanged, + onRowSelected, + onSelectionChange, }; useApiMethod(apiRef, selectionApi, 'SelectionApi'); @@ -197,8 +197,8 @@ export const useSelection = ( React.useEffect(() => { selectedItemsRef.current = []; if (apiRef && apiRef.current != null) { - const selectionChangedParam: SelectionChangedParams = { rows: [] }; - apiRef.current!.emit(SELECTION_CHANGED_EVENT, selectionChangedParam); + const selectionChangeParam: SelectionChangeParams = { rows: [] }; + apiRef.current!.emit(SELECTION_CHANGED_EVENT, selectionChangeParam); } }, [rowsProp, apiRef]); }; diff --git a/packages/grid/x-grid-modules/src/hooks/features/useSorting.ts b/packages/grid/x-grid-modules/src/hooks/features/useSorting.ts index f8b224c29a54..eaf001fb4d46 100644 --- a/packages/grid/x-grid-modules/src/hooks/features/useSorting.ts +++ b/packages/grid/x-grid-modules/src/hooks/features/useSorting.ts @@ -2,7 +2,6 @@ import * as React from 'react'; import { CellValue, ColDef, - ColumnHeaderClickedParams, Columns, ColumnSortedParams, FieldComparatorList, @@ -12,9 +11,10 @@ import { RowsProp, SortApi, ApiRef, + ColParams, } from '../../models'; import { - COLUMN_HEADER_CLICKED, + COLUMN_HEADER_CLICK, COLUMNS_SORTED, MULTIPLE_KEY_PRESS_CHANGED, POST_SORT, @@ -151,9 +151,9 @@ export const useSorting = ( ); const headerClickHandler = React.useCallback( - ({ column }: ColumnHeaderClickedParams) => { - if (column.sortable) { - sortColumn(column); + ({ colDef }: ColParams) => { + if (colDef.sortable) { + sortColumn(colDef); } }, [sortColumn], @@ -182,7 +182,7 @@ export const useSorting = ( [allowMultipleSorting, options.enableMultipleColumnsSorting], ); - const onColumnsSorted = React.useCallback( + const onSortedColumns = React.useCallback( (handler: (param: ColumnSortedParams) => void): (() => void) => { return apiRef!.current!.registerEvent(COLUMNS_SORTED, handler); }, @@ -217,10 +217,10 @@ export const useSorting = ( } }, [colState, setSortModel, apiRef, colsProp]); - useApiEventHandler(apiRef, COLUMN_HEADER_CLICKED, headerClickHandler); + useApiEventHandler(apiRef, COLUMN_HEADER_CLICK, headerClickHandler); useApiEventHandler(apiRef, ROWS_UPDATED, onRowsUpdated); useApiEventHandler(apiRef, MULTIPLE_KEY_PRESS_CHANGED, onMultipleKeyPressed); - const sortApi: SortApi = { getSortModel, setSortModel, onColumnsSorted }; + const sortApi: SortApi = { getSortModel, setSortModel, onSortedColumns }; useApiMethod(apiRef, sortApi, 'SortApi'); }; diff --git a/packages/grid/x-grid-modules/src/hooks/root/useApi.ts b/packages/grid/x-grid-modules/src/hooks/root/useApi.ts index a6242fcdd316..67a85791cafa 100644 --- a/packages/grid/x-grid-modules/src/hooks/root/useApi.ts +++ b/packages/grid/x-grid-modules/src/hooks/root/useApi.ts @@ -1,21 +1,25 @@ import * as React from 'react'; import { useLogger } from '../utils/useLogger'; import { - CELL_CLICKED, + CELL_CLICK, CLICK_EVENT, COL_RESIZE_START, COL_RESIZE_STOP, - COLUMN_HEADER_CLICKED, + COLUMN_HEADER_CLICK, COLUMNS_SORTED, UNMOUNT, KEYDOWN_EVENT, KEYUP_EVENT, RESIZE, - ROW_CLICKED, + ROW_CLICK, ROW_SELECTED_EVENT, SELECTION_CHANGED_EVENT, + HOVER_EVENT, + CELL_HOVER, + ROW_HOVER, + COLUMN_HEADER_HOVER, } from '../../constants/eventsConstants'; -import { CellClickedParam, GridOptions, RowClickedParam, ApiRef } from '../../models'; +import { GridOptions, ApiRef, CellParams, ColParams, RowParams } from '../../models'; import { GridApi } from '../../models/api/gridApi'; import { CELL_CSS_CLASS, @@ -32,6 +36,7 @@ import { } from '../../utils/domUtils'; import { useApiMethod } from './useApiMethod'; import { useApiEventHandler } from './useApiEventHandler'; +import { buildCellParams, buildRowParams } from '../../utils/paramsUtils'; const EventEmitter = require('events').EventEmitter; @@ -77,16 +82,18 @@ export function useApi( const handleResizeStart = React.useCallback(() => { isResizingRef.current = true; }, [isResizingRef]); + const handleResizeStop = React.useCallback(() => { isResizingRef.current = false; }, [isResizingRef]); - const onClickHandler = React.useCallback( - (event: MouseEvent) => { + const getEventParams = React.useCallback( + (event: any) => { if (event.target == null) { - return; + return null; } const elem = event.target as HTMLElement; + const eventParams: { cell?: CellParams; row?: RowParams; header?: ColParams } = {}; if (isCell(elem)) { const cellEl = findParentElementFromClassName(elem, CELL_CSS_CLASS)! as HTMLElement; @@ -98,27 +105,78 @@ export function useApi( const value = getDataFromElem(cellEl, 'value'); const column = apiRef.current!.getColumnFromField(field); if (!column || !column.disableClickEventBubbling) { - const commonParams = { data: rowModel.data, rowIndex, colDef: column }; - const cellParams: CellClickedParam = { + const commonParams = { + data: rowModel.data, + rowIndex, + colDef: column, + rowModel, + api: apiRef.current!, + }; + eventParams.cell = buildCellParams({ + ...commonParams, element: cellEl, - field, value, + }); + eventParams.row = buildRowParams({ ...commonParams, - }; - const rowParams: RowClickedParam = { element: rowEl, - rowModel, - ...commonParams, - }; - emitEvent(CELL_CLICKED, cellParams); - emitEvent(ROW_CLICKED, rowParams); + }); } } else if (isHeaderCell(elem) && !isResizingRef.current) { const headerCell = findParentElementFromClassName(elem, HEADER_CELL_CSS_CLASS)!; const field = getFieldFromHeaderElem(headerCell); const column = apiRef.current!.getColumnFromField(field); - const colHeaderParams = { field, column }; - emitEvent(COLUMN_HEADER_CLICKED, colHeaderParams); + const colIndex = apiRef.current!.getColumnIndex(field); + const colHeaderParams: ColParams = { + field, + colDef: column, + colIndex, + api: apiRef.current!, + }; + eventParams.header = colHeaderParams; + } + return eventParams; + }, + [emitEvent, apiRef], + ); + + const onClickHandler = React.useCallback( + (event: MouseEvent) => { + const eventParams = getEventParams(event); + + if (!eventParams) { + return; + } + + if (eventParams.cell) { + emitEvent(CELL_CLICK, eventParams.cell); + } + if (eventParams.row) { + emitEvent(ROW_CLICK, eventParams.row); + } + if (eventParams.header) { + emitEvent(COLUMN_HEADER_CLICK, eventParams.header); + } + }, + [emitEvent, apiRef], + ); + + const onHoverHandler = React.useCallback( + (event: any) => { + const eventParams = getEventParams(event); + + if (!eventParams) { + return; + } + + if (eventParams.cell) { + emitEvent(CELL_HOVER, eventParams.cell); + } + if (eventParams.row) { + emitEvent(ROW_HOVER, eventParams.row); + } + if (eventParams.header) { + emitEvent(COLUMN_HEADER_HOVER, eventParams.header); } }, [emitEvent, apiRef], @@ -159,6 +217,7 @@ export function useApi( const gridRootElem = gridRootRef.current; gridRootRef.current.addEventListener(CLICK_EVENT, onClickHandler, { capture: true }); + gridRootRef.current.addEventListener(HOVER_EVENT, onHoverHandler, { capture: true }); document.addEventListener(KEYDOWN_EVENT, keyDownHandler); document.addEventListener(KEYUP_EVENT, keyUpHandler); @@ -170,6 +229,7 @@ export function useApi( logger.debug('Clearing all events listeners'); api.emit(UNMOUNT); gridRootElem.removeEventListener(CLICK_EVENT, onClickHandler, { capture: true }); + gridRootElem.removeEventListener(HOVER_EVENT, onHoverHandler, { capture: true }); document.removeEventListener(KEYDOWN_EVENT, keyDownHandler); document.removeEventListener(KEYUP_EVENT, keyUpHandler); api.removeAllListeners(); @@ -181,12 +241,14 @@ export function useApi( useApiEventHandler(apiRef, COL_RESIZE_START, handleResizeStart); useApiEventHandler(apiRef, COL_RESIZE_STOP, handleResizeStop); - useApiEventHandler(apiRef, CELL_CLICKED, options.onCellClicked); - useApiEventHandler(apiRef, ROW_CLICKED, options.onRowClicked); + useApiEventHandler(apiRef, CELL_CLICK, options.onCellClick); + useApiEventHandler(apiRef, ROW_CLICK, options.onRowClick); + useApiEventHandler(apiRef, CELL_HOVER, options.onCellHover); + useApiEventHandler(apiRef, ROW_HOVER, options.onRowHover); useApiEventHandler(apiRef, ROW_SELECTED_EVENT, options.onRowSelected); - useApiEventHandler(apiRef, SELECTION_CHANGED_EVENT, options.onSelectionChanged); - useApiEventHandler(apiRef, COLUMN_HEADER_CLICKED, options.onColumnHeaderClicked); - useApiEventHandler(apiRef, COLUMNS_SORTED, options.onColumnsSorted); + useApiEventHandler(apiRef, SELECTION_CHANGED_EVENT, options.onSelectionChange); + useApiEventHandler(apiRef, COLUMN_HEADER_CLICK, options.onColumnHeaderClick); + useApiEventHandler(apiRef, COLUMNS_SORTED, options.onSortedColumns); return initialised; } diff --git a/packages/grid/x-grid-modules/src/hooks/root/useColumns.ts b/packages/grid/x-grid-modules/src/hooks/root/useColumns.ts index 9344ef772d15..05393098c03b 100644 --- a/packages/grid/x-grid-modules/src/hooks/root/useColumns.ts +++ b/packages/grid/x-grid-modules/src/hooks/root/useColumns.ts @@ -166,7 +166,7 @@ export function useColumns( ); React.useEffect(() => { - logger.info(`Columns have changed, new length ${columns.length}`); + logger.info(`Columns have change, new length ${columns.length}`); const newState = resetState( columns, options.columnTypes, @@ -204,7 +204,7 @@ export function useColumns( const onSortedColumns = React.useCallback( (sortModel: SortModel) => { - logger.debug('Sort model changed to ', sortModel); + logger.debug('Sort model change to ', sortModel); const updatedCols: ColDef[] = []; const currentSortedCols = stateRef.current.all diff --git a/packages/grid/x-grid-modules/src/hooks/root/useContainerProps.ts b/packages/grid/x-grid-modules/src/hooks/root/useContainerProps.ts index 7ffbe7c61e2a..79447a4b953e 100644 --- a/packages/grid/x-grid-modules/src/hooks/root/useContainerProps.ts +++ b/packages/grid/x-grid-modules/src/hooks/root/useContainerProps.ts @@ -27,7 +27,7 @@ export const useContainerProps = (windowRef: React.RefObject): R const rowHeight = options.rowHeight; const hasScrollY = - options.paginationAutoPageSize || options.autoHeight + options.autoPageSize || options.autoHeight ? false : windowSizesRef.current.height < rowsCount * rowHeight; const hasScrollX = columnsTotalWidth > windowSizesRef.current.width; @@ -50,9 +50,7 @@ export const useContainerProps = (windowRef: React.RefObject): R // We multiply by 2 for virtualization // TODO allow buffer with fixed nb rows const rzPageSize = viewportPageSize * 2; - const viewportMaxPage = options.paginationAutoPageSize - ? 1 - : Math.ceil(rowsCount / viewportPageSize); + const viewportMaxPage = options.autoPageSize ? 1 : Math.ceil(rowsCount / viewportPageSize); logger.debug( `viewportPageSize: ${viewportPageSize}, rzPageSize: ${rzPageSize}, viewportMaxPage: ${viewportMaxPage}`, @@ -60,7 +58,7 @@ export const useContainerProps = (windowRef: React.RefObject): R const renderingZoneHeight = rzPageSize * rowHeight + rowHeight + scrollBarSize.x; const dataContainerWidth = columnsTotalWidth - scrollBarSize.y; let totalHeight = - (options.paginationAutoPageSize ? 1 : rowsCount / viewportPageSize) * viewportSize.height + + (options.autoPageSize ? 1 : rowsCount / viewportPageSize) * viewportSize.height + (hasScrollY ? scrollBarSize.x : 0); if (options.autoHeight) { diff --git a/packages/grid/x-grid-modules/src/hooks/root/useKeyboard.ts b/packages/grid/x-grid-modules/src/hooks/root/useKeyboard.ts index b7589b64ce4d..475ba24b7665 100644 --- a/packages/grid/x-grid-modules/src/hooks/root/useKeyboard.ts +++ b/packages/grid/x-grid-modules/src/hooks/root/useKeyboard.ts @@ -69,9 +69,7 @@ export const useKeyboard = (options: GridOptions, initialised: boolean, apiRef: const currentRowIndex = Number(getDataFromElem(cellEl, 'rowindex')); const autoPageSize = apiRef.current!.getContainerPropsState()!.viewportPageSize; const pageSize = - options.pagination && options.paginationPageSize != null - ? options.paginationPageSize - : autoPageSize; + options.pagination && options.pageSize != null ? options.pageSize : autoPageSize; const rowCount = options.pagination ? pageSize : apiRef.current!.getRowsCount(); const colCount = apiRef.current!.getVisibleColumns().length; @@ -120,7 +118,7 @@ export const useKeyboard = (options: GridOptions, initialised: boolean, apiRef: return nextCellIndexes; }, - [apiRef, options.pagination, options.paginationPageSize], + [apiRef, options.pagination, options.pageSize], ); const selectActiveRow = React.useCallback(() => { diff --git a/packages/grid/x-grid-modules/src/hooks/utils/useLogger.ts b/packages/grid/x-grid-modules/src/hooks/utils/useLogger.ts index 21cf9ade5a49..97a206fbd00a 100644 --- a/packages/grid/x-grid-modules/src/hooks/utils/useLogger.ts +++ b/packages/grid/x-grid-modules/src/hooks/utils/useLogger.ts @@ -13,7 +13,7 @@ export interface Logger { const noop = () => {}; -export const noopLogger: Logger = { +const noopLogger: Logger = { debug: noop, info: noop, warn: noop, @@ -57,7 +57,7 @@ export type LoggerFactoryFn = (name: string) => Logger; let factory: LoggerFactoryFn | null; export function useLoggerFactory( customLogger?: Logger | LoggerFactoryFn, - logLevel: string | boolean = 'info', + logLevel: string | boolean = 'debug', ) { if (forceDebug) { factory = defaultFactory('debug'); diff --git a/packages/grid/x-grid-modules/src/hooks/virtualization/useVirtualColumns.ts b/packages/grid/x-grid-modules/src/hooks/virtualization/useVirtualColumns.ts index ee1d2f881ac1..6ef19e214536 100644 --- a/packages/grid/x-grid-modules/src/hooks/virtualization/useVirtualColumns.ts +++ b/packages/grid/x-grid-modules/src/hooks/virtualization/useVirtualColumns.ts @@ -1,4 +1,4 @@ -import React, { useCallback, useRef } from 'react'; +import * as React from 'react'; import { ContainerProps, GridOptions, @@ -7,7 +7,7 @@ import { ApiRef, } from '../../models'; import { useLogger } from '../utils/useLogger'; -import { COLUMNS_UPDATED } from '../../constants/eventsConstants'; +import { COLUMNS_UPDATED, RESIZE } from '../../constants/eventsConstants'; import { useApiMethod } from '../root/useApiMethod'; import { useApiEventHandler } from '../root/useApiEventHandler'; @@ -25,11 +25,11 @@ export const useVirtualColumns = ( apiRef: ApiRef, ): UseVirtualColumnsReturnType => { const logger = useLogger('useVirtualColumns'); - const renderedColRef = useRef(null); - const containerPropsRef = useRef(null); - const lastScrollLeftRef = useRef(0); + const renderedColRef = React.useRef(null); + const containerPropsRef = React.useRef(null); + const lastScrollLeftRef = React.useRef(0); - const getColumnIdxFromScroll = useCallback( + const getColumnIdxFromScroll = React.useCallback( (left: number) => { const positions = apiRef.current!.getColumnsMeta().positions; const hasColumns = apiRef.current!.getVisibleColumns().length; @@ -44,7 +44,7 @@ export const useVirtualColumns = ( [apiRef], ); - const getColumnFromScroll = useCallback( + const getColumnFromScroll = React.useCallback( (left: number) => { const visibleColumns = apiRef.current!.getVisibleColumns(); if (!visibleColumns.length) { @@ -55,7 +55,7 @@ export const useVirtualColumns = ( [apiRef, getColumnIdxFromScroll], ); - const isColumnVisibleInWindow = useCallback( + const isColumnVisibleInWindow = React.useCallback( (colIndex: number): boolean => { if (!containerPropsRef.current) { return false; @@ -73,7 +73,7 @@ export const useVirtualColumns = ( [containerPropsRef, getColumnFromScroll, apiRef], ); - const updateRenderedCols: UpdateRenderedColsFnType = useCallback( + const updateRenderedCols: UpdateRenderedColsFnType = React.useCallback( (containerProps: ContainerProps | null, scrollLeft: number) => { if (!containerProps) { return false; @@ -147,12 +147,13 @@ export const useVirtualColumns = ( }; useApiMethod(apiRef, virtualApi, 'ColumnVirtualizationApi'); - const onColUpdated = useCallback(() => { + const resetRenderedColState = React.useCallback(() => { logger.debug('Clearing previous renderedColRef'); renderedColRef.current = null; }, [logger, renderedColRef]); - useApiEventHandler(apiRef, COLUMNS_UPDATED, onColUpdated); + useApiEventHandler(apiRef, COLUMNS_UPDATED, resetRenderedColState); + useApiEventHandler(apiRef, RESIZE, resetRenderedColState); return [renderedColRef, updateRenderedCols]; }; diff --git a/packages/grid/x-grid-modules/src/hooks/virtualization/useVirtualRows.ts b/packages/grid/x-grid-modules/src/hooks/virtualization/useVirtualRows.ts index 70c59915b2f9..bc917202d05b 100644 --- a/packages/grid/x-grid-modules/src/hooks/virtualization/useVirtualRows.ts +++ b/packages/grid/x-grid-modules/src/hooks/virtualization/useVirtualRows.ts @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'; +import * as React from 'react'; import { useVirtualColumns } from './useVirtualColumns'; import { CellIndexCoordinates, @@ -37,34 +37,34 @@ export const useVirtualRows = ( apiRef: ApiRef, ): UseVirtualRowsReturnType => { const logger = useLogger('useVirtualRows'); - const pageRef = useRef(0); - const rowsCount = useRef(rows.length); - const paginationCurrentPage = useRef(1); - const containerPropsRef = useRef(null); - const optionsRef = useRef(options); - const realScrollRef = useRef({ left: 0, top: 0 }); - const rzScrollRef = useRef({ left: 0, top: 0 }); - const columnTotalWidthRef = useRef(internalColumns.meta.totalWidth); - const renderCtxRef = useRef>(); + const pageRef = React.useRef(0); + const rowsCount = React.useRef(rows.length); + const paginationCurrentPage = React.useRef(1); + const containerPropsRef = React.useRef(null); + const optionsRef = React.useRef(options); + const realScrollRef = React.useRef({ left: 0, top: 0 }); + const rzScrollRef = React.useRef({ left: 0, top: 0 }); + const columnTotalWidthRef = React.useRef(internalColumns.meta.totalWidth); + const renderCtxRef = React.useRef>(); const [, scrollColHeaderTo] = useScrollFn(colRef); const onDataScroll = (v: ScrollParams) => scrollColHeaderTo({ left: v.left, top: 0 }); const [scrollTo] = useScrollFn(renderingZoneRef, onDataScroll); const getContainerProps = useContainerProps(windowRef); - const [renderCtx, setRenderCtx] = useState | null>(null); + const [renderCtx, setRenderCtx] = React.useState | null>(null); const [renderedColRef, updateRenderedCols] = useVirtualColumns(options, apiRef); - const getRenderRowProps = useCallback( + const getRenderRowProps = React.useCallback( (page: number) => { if (containerPropsRef.current == null) { return null; } const containerProps = containerPropsRef.current!; let minRowIdx = 0; - if (optionsRef.current.pagination && optionsRef.current.paginationPageSize != null) { + if (optionsRef.current.pagination && optionsRef.current.pageSize != null) { minRowIdx = - optionsRef.current.paginationPageSize * + optionsRef.current.pageSize * (paginationCurrentPage.current - 1 > 0 ? paginationCurrentPage.current - 1 : 0); } @@ -81,7 +81,7 @@ export const useVirtualRows = ( [containerPropsRef], ); - const getRenderCtxState = useCallback((): Partial | null => { + const getRenderCtxState = React.useCallback((): Partial | null => { const containerProps = containerPropsRef.current; const renderedCol = renderedColRef.current; const renderedRow = getRenderRowProps(pageRef.current); @@ -96,7 +96,7 @@ export const useVirtualRows = ( ...renderedRow, ...{ paginationCurrentPage: paginationCurrentPage.current, - paginationPageSize: optionsRef.current.paginationPageSize, + pageSize: optionsRef.current.pageSize, }, }; logger.debug(':: getRenderCtxState - returning state ', newRenderCtx); @@ -104,11 +104,11 @@ export const useVirtualRows = ( return newRenderCtx; }, [logger, renderCtxRef, containerPropsRef, renderedColRef, getRenderRowProps]); - const reRender = useCallback(() => setRenderCtx(getRenderCtxState()), [ + const reRender = React.useCallback(() => setRenderCtx(getRenderCtxState()), [ getRenderCtxState, setRenderCtx, ]); - const updateViewport = useCallback(() => { + const updateViewport = React.useCallback(() => { if (windowRef && windowRef.current && containerPropsRef && containerPropsRef.current) { const containerProps = containerPropsRef.current; const { scrollLeft, scrollTop } = windowRef.current; @@ -152,14 +152,14 @@ export const useVirtualRows = ( } }, [apiRef, logger, reRender, windowRef, updateRenderedCols, scrollTo]); - useLayoutEffect(() => { + React.useLayoutEffect(() => { if (renderingZoneRef && renderingZoneRef.current) { logger.debug('applying scrollTop ', rzScrollRef.current); scrollTo(rzScrollRef.current); } }); - const resetScroll = useCallback(() => { + const resetScroll = React.useCallback(() => { scrollTo({ left: 0, top: 0 }); pageRef.current = 1; @@ -169,13 +169,13 @@ export const useVirtualRows = ( rzScrollRef.current = { left: 0, top: 0 }; }, [windowRef, rzScrollRef, pageRef, scrollTo]); - const updateContainerSize = useCallback(() => { + const updateContainerSize = React.useCallback(() => { if (columnTotalWidthRef.current > 0) { const totalRowsCount = apiRef?.current?.getRowsCount() || 0; // we ensure we call with latest length const currentPage = paginationCurrentPage.current; let pageRowCount = - optionsRef.current.pagination && optionsRef.current.paginationPageSize - ? optionsRef.current.paginationPageSize + optionsRef.current.pagination && optionsRef.current.pageSize + ? optionsRef.current.pageSize : null; pageRowCount = @@ -190,7 +190,7 @@ export const useVirtualRows = ( columnTotalWidthRef.current, rowsCount.current, ); - if (optionsRef.current.paginationAutoPageSize && containerPropsRef.current) { + if (optionsRef.current.autoPageSize && containerPropsRef.current) { rowsCount.current = containerPropsRef.current.viewportPageSize; } updateViewport(); @@ -200,8 +200,8 @@ export const useVirtualRows = ( } }, [containerPropsRef, apiRef, getContainerProps, reRender, updateViewport]); - const scrollingTimeout = useRef(0); - const onScroll: any = useCallback( + const scrollingTimeout = React.useRef(0); + const onScroll: any = React.useCallback( (event: any) => { realScrollRef.current = { left: event.target.scrollLeft, top: event.target.scrollTop }; if (apiRef && apiRef.current && scrollingTimeout.current === 0) { @@ -219,7 +219,7 @@ export const useVirtualRows = ( [apiRef, updateViewport, scrollingTimeout, realScrollRef], ); - const scrollToIndexes = useCallback( + const scrollToIndexes = React.useCallback( (params: CellIndexCoordinates) => { logger.debug(`Scrolling to cell at row ${params.rowIndex}, col: ${params.colIndex} `); @@ -274,7 +274,7 @@ export const useVirtualRows = ( [apiRef, realScrollRef, logger], ); - const scroll = useCallback( + const scroll = React.useCallback( (params: Partial) => { logger.debug(`Scrolling to left: ${params.left} top: ${params.top}`); if (windowRef.current && params.left != null && colRef.current) { @@ -289,18 +289,18 @@ export const useVirtualRows = ( [logger, windowRef, updateViewport, colRef], ); - const getContainerPropsState = useCallback(() => { + const getContainerPropsState = React.useCallback(() => { if (!containerPropsRef.current) { updateContainerSize(); } return containerPropsRef.current; }, [updateContainerSize]); - const getRenderContextState = useCallback(() => { + const getRenderContextState = React.useCallback(() => { return renderCtxRef.current; }, []); - const renderPage = useCallback( + const renderPage = React.useCallback( (page: number) => { paginationCurrentPage.current = page; resetScroll(); @@ -308,12 +308,12 @@ export const useVirtualRows = ( }, [paginationCurrentPage, resetScroll, updateContainerSize], ); - const onResize = useCallback(() => { + const onResize = React.useCallback(() => { logger.debug('OnResize, recalculating container sizes.'); updateContainerSize(); }, [logger, updateContainerSize]); - const onViewportScroll = useCallback( + const onViewportScroll = React.useCallback( (event: any) => { logger.debug('Using keyboard to navigate cells, converting scroll events '); @@ -335,24 +335,24 @@ export const useVirtualRows = ( onViewportScroll, ); - useEffect(() => { + React.useEffect(() => { if (columnTotalWidthRef.current !== internalColumns.meta.totalWidth) { columnTotalWidthRef.current = internalColumns.meta.totalWidth; updateContainerSize(); } }, [internalColumns, updateContainerSize]); - useEffect(() => { + React.useEffect(() => { if (optionsRef.current !== options) { - logger.debug('Options changed, updating container sizes'); + logger.debug('Options change, updating container sizes'); optionsRef.current = options; updateContainerSize(); } }, [options, renderingZoneRef, resetScroll, updateContainerSize, logger]); - useEffect(() => { + React.useEffect(() => { if (rows.length !== rowsCount.current) { - logger.debug('Row length changed to ', rows.length); + logger.debug('Row length change to ', rows.length); updateContainerSize(); } }, [rows.length, logger, updateContainerSize]); diff --git a/packages/grid/x-grid-modules/src/models/api/apiRef.ts b/packages/grid/x-grid-modules/src/models/api/apiRef.ts index a0276fbcfdaf..e8f98b6e4330 100644 --- a/packages/grid/x-grid-modules/src/models/api/apiRef.ts +++ b/packages/grid/x-grid-modules/src/models/api/apiRef.ts @@ -1,5 +1,6 @@ import * as React from 'react'; import { GridApi } from './gridApi'; + /** * The apiRef component prop type. */ diff --git a/packages/grid/x-grid-modules/src/models/api/columnApi.ts b/packages/grid/x-grid-modules/src/models/api/columnApi.ts index 227e8117257e..a2d4e26ffd95 100644 --- a/packages/grid/x-grid-modules/src/models/api/columnApi.ts +++ b/packages/grid/x-grid-modules/src/models/api/columnApi.ts @@ -5,43 +5,51 @@ import { ColDef, Columns, ColumnsMeta } from '../colDef/colDef'; */ export interface ColumnApi { /** - * Retrieve a column from its field - * @return [[ColDef]] + * Retrieve a column from its field. + * * @param field + * @returns [[ColDef]] */ getColumnFromField: (field: string) => ColDef; /** - * Get all the [[Columns]] - * @return an array of [[ColDef]] + * Get all the [[Columns]]. + * + * @returns An array of [[ColDef]]. */ getAllColumns: () => Columns; /** - * Get the currently visible columns - * @returns an array of [[ColDef]] + * Get the currently visible columns. + * + * @returns An array of [[ColDef]]. */ getVisibleColumns: () => Columns; /** - * Get the columns meta data - * @return [[ColumnsMeta]] + * Get the columns meta data. + * + * @returns [[ColumnsMeta]] */ getColumnsMeta: () => ColumnsMeta; /** - * Get the index position of the column in the array of [[ColDef]] + * Get the index position of the column in the array of [[ColDef]]. + * * @param field */ getColumnIndex: (field: string) => number; /** - * Get the column left position in pixel relative to the left grid inner border + * Get the column left position in pixel relative to the left grid inner border. + * * @param field */ getColumnPosition: (field: string) => number; /** - * Allows to update a column [[ColDef]] model + * Allows to update a column [[ColDef]] model. + * * @param col [[ColDef]] */ updateColumn: (col: ColDef) => void; /** - * Allows to batch update multiple columns at the same time + * Allows to batch update multiple columns at the same time. + * * @param cols [[ColDef[]]] */ updateColumns: (cols: ColDef[]) => void; diff --git a/packages/grid/x-grid-modules/src/models/api/gridApi.ts b/packages/grid/x-grid-modules/src/models/api/gridApi.ts index de9fc9a9c2b9..c0e2681672a9 100644 --- a/packages/grid/x-grid-modules/src/models/api/gridApi.ts +++ b/packages/grid/x-grid-modules/src/models/api/gridApi.ts @@ -7,32 +7,35 @@ import { PaginationApi } from './paginationApi'; import { VirtualizationApi } from './virtualizationApi'; /** - * The Core API interface that is available in the grid [[apiRef]]. + * The core API interface that is available in the grid [[apiRef]]. */ export interface CoreApi extends EventEmitter { /** - * Property that comes true when the grid has its EventEmitter initialised + * Property that comes true when the grid has its EventEmitter initialised. */ isInitialised: boolean; /** - * Allows to register a handler for an event + * Allows to register a handler for an event. + * * @param event * @param handler */ registerEvent: (event: string, handler: (param: any) => void) => () => void; /** - * Add a handler that will be triggered when the component unmount + * Add a handler that will be triggered when the component unmount. + * * @param handler */ onUnmount: (handler: (param: any) => void) => void; - /** - * Add a handler that will be triggered when the component resize + * Add a handler that will be triggered when the component resize. + * * @param handler */ onResize: (handler: (param: any) => void) => void; /** - * Trigger a resize of the component, and recalculation of width and height + * Trigger a resize of the component, and recalculation of width and height. + * * @param handler */ resize: () => void; diff --git a/packages/grid/x-grid-modules/src/models/api/paginationApi.ts b/packages/grid/x-grid-modules/src/models/api/paginationApi.ts index dd2101446a02..e93d030b9eb6 100644 --- a/packages/grid/x-grid-modules/src/models/api/paginationApi.ts +++ b/packages/grid/x-grid-modules/src/models/api/paginationApi.ts @@ -1,16 +1,18 @@ -import { PageChangedParams } from '../params/pageChangedParams'; +import { PageChangeParams } from '../params/pageChangeParams'; /** * The pagination API interface that is available in the grid [[apiRef]]. */ export interface PaginationApi { /** - * Set the displayed page + * Set the displayed page. + * * @param page */ setPage: (page: number) => void; /** - * Set the number of rows in one page + * Set the number of rows in one page. + * * @param pageSize */ setPageSize: (pageSize: number) => void; @@ -18,10 +20,10 @@ export interface PaginationApi { * Handler that is triggered after a new page has been displayed * @param handler */ - onPageChanged: (handler: (param: PageChangedParams) => void) => () => void; + onPageChange: (handler: (param: PageChangeParams) => void) => () => void; /** - * Handler that is triggered after the page size was changed + * Handler that is triggered after the page size was change * @param handler */ - onPageSizeChanged: (handler: (param: PageChangedParams) => void) => () => void; + onPageSizeChange: (handler: (param: PageChangeParams) => void) => () => void; } diff --git a/packages/grid/x-grid-modules/src/models/api/rowApi.ts b/packages/grid/x-grid-modules/src/models/api/rowApi.ts index 82257d1c85e6..b3a398163f95 100644 --- a/packages/grid/x-grid-modules/src/models/api/rowApi.ts +++ b/packages/grid/x-grid-modules/src/models/api/rowApi.ts @@ -5,45 +5,52 @@ import { RowData, RowId, RowModel, Rows } from '../rows'; */ export interface RowApi { /** - * Get the full set of rows as [[Rows]] + * Get the full set of rows as [[Rows]]. + * * @returns [[Rows]] */ getRowModels: () => Rows; /** - * Get the total number of rows in the grid + * Get the total number of rows in the grid. */ getRowsCount: () => number; /** - * Return the list of row Ids + * Return the list of row Ids. */ getAllRowIds: () => RowId[]; /** - * Set a new set of Rows + * Set a new set of Rows. + * * @param rows */ setRowModels: (rows: Rows) => void; /** - * Update any properties of the current set of Rows + * Update any properties of the current set of Rows. + * * @param updates */ updateRowModels: (updates: Partial[]) => void; /** - * Update any properties of the current set of RowData[] + * Update any properties of the current set of RowData[]. + * * @param updates */ updateRowData: (updates: RowData[]) => void; /** - * Get the RowId of a row at a specific position + * Get the RowId of a row at a specific position. + * * @param index */ getRowIdFromRowIndex: (index: number) => RowId; /** - * Get the row index of a row with a given Id + * Get the row index of a row with a given Id. + * * @param id */ getRowIndexFromId: (id: RowId) => number; /** - * Get the [[RowModel]] of a given rowId + * Get the [[RowModel]] of a given rowId. + * * @param id */ getRowFromId: (id: RowId) => RowModel; diff --git a/packages/grid/x-grid-modules/src/models/api/selectionApi.ts b/packages/grid/x-grid-modules/src/models/api/selectionApi.ts index e929eae0c6dc..b0b35f2832b1 100644 --- a/packages/grid/x-grid-modules/src/models/api/selectionApi.ts +++ b/packages/grid/x-grid-modules/src/models/api/selectionApi.ts @@ -1,20 +1,21 @@ import { RowId, RowModel } from '../rows'; import { RowSelectedParams } from '../params/rowSelectedParams'; -import { SelectionChangedParams } from '../params/selectionChangedParams'; +import { SelectionChangeParams } from '../params/selectionChangeParams'; /** - * The Selection API interface that is available in the grid [[apiRef]]. + * The selection API interface that is available in the grid [[apiRef]]. */ export interface SelectionApi { /** - * Toggle the row selected state + * Toggle the row selected state. + * * @param id - * @param allowMultiple, default: false = deselect other rows if isSelected is true - * @param isSelected, default true + * @param allowMultiple Default: false = deselect other rows if isSelected is true + * @param isSelected Default true */ selectRow: (id: RowId, allowMultiple?: boolean, isSelected?: boolean) => void; /** - * Batch toggle rows selected state + * Batch toggle rows selected state. * * @param ids * @param isSelected default true @@ -22,19 +23,20 @@ export interface SelectionApi { */ selectRows: (ids: RowId[], isSelected?: boolean, deselectOtherRows?: boolean) => void; // TODO unify parameter between SelectRow and SelectRows - /** - * Get an array of selected rows + * Get an array of selected rows. */ getSelectedRows: () => RowModel[]; /** - * Handler triggered after a row is selected + * Handler triggered after a row is selected. + * * @param handler */ - onSelectedRow: (handler: (param: RowSelectedParams) => void) => () => void; + onRowSelected: (handler: (param: RowSelectedParams) => void) => () => void; /** - * Handler triggered after one or multiple rows had a selection state changed. + * Handler triggered after one or multiple rows had a selection state change. + * * @param handler */ - onSelectionChanged: (handler: (param: SelectionChangedParams) => void) => () => void; + onSelectionChange: (handler: (param: SelectionChangeParams) => void) => () => void; } diff --git a/packages/grid/x-grid-modules/src/models/api/sortApi.ts b/packages/grid/x-grid-modules/src/models/api/sortApi.ts index 0e29b93cb003..24953db42a14 100644 --- a/packages/grid/x-grid-modules/src/models/api/sortApi.ts +++ b/packages/grid/x-grid-modules/src/models/api/sortApi.ts @@ -2,21 +2,23 @@ import { SortModel } from '../sortModel'; import { ColumnSortedParams } from '../params/columnSortedParams'; /** - * The Sort API interface that is available in the grid [[apiRef]]. + * The sort API interface that is available in the grid [[apiRef]]. */ export interface SortApi { /** - * Get the sort model currently applied in the grid + * Get the sort model currently applied in the grid. */ getSortModel: () => SortModel; /** - * Set the sort model of the component and trigger a new sorting of rows + * Set the sort model of the component and trigger a new sorting of rows. + * * @param model */ setSortModel: (model: SortModel) => void; /** - * Handler triggered after the grid has sorted its rows + * Handler triggered after the grid has sorted its rows. + * * @param handler */ - onColumnsSorted: (handler: (param: ColumnSortedParams) => void) => () => void; + onSortedColumns: (handler: (param: ColumnSortedParams) => void) => () => void; } diff --git a/packages/grid/x-grid-modules/src/models/api/virtualizationApi.ts b/packages/grid/x-grid-modules/src/models/api/virtualizationApi.ts index d71437da8a0d..a701f48a361d 100644 --- a/packages/grid/x-grid-modules/src/models/api/virtualizationApi.ts +++ b/packages/grid/x-grid-modules/src/models/api/virtualizationApi.ts @@ -4,34 +4,38 @@ import { ContainerProps } from '../containerProps'; import { RenderContextProps } from '../renderContextProps'; /** - * The Virtualization API interface that is available in the grid [[apiRef]]. + * The virtualization API interface that is available in the grid [[apiRef]]. */ export interface VirtualizationApi { /** - * Trigger the grid viewport to scroll to the position in pixel + * Trigger the grid viewport to scroll to the position in pixel. + * * @param params */ scroll: (params: Partial) => void; /** - * Trigger the grid viewport to scroll to a row of x y indexes + * Trigger the grid viewport to scroll to a row of x y indexes. + * * @param params */ scrollToIndexes: (params: CellIndexCoordinates) => void; /** - * Check if a column at index is currently visible in the viewport + * Check if a column at index is currently visible in the viewport. + * * @param colIndex */ isColumnVisibleInWindow: (colIndex: number) => boolean; /** - * Get the current containerProps + * Get the current containerProps. */ getContainerPropsState: () => ContainerProps | null; /** - * Get the current renderContext + * Get the current renderContext. */ getRenderContextState: () => Partial | undefined; /** - * Force the rendering engine to render a particular page. Not for pagination + * Force the rendering engine to render a particular page. Not for pagination. + * * @param page */ renderPage: (page: number) => void; diff --git a/packages/grid/x-grid-modules/src/models/colDef/colDef.ts b/packages/grid/x-grid-modules/src/models/colDef/colDef.ts index d5c720053cb5..40ddab399b9f 100644 --- a/packages/grid/x-grid-modules/src/models/colDef/colDef.ts +++ b/packages/grid/x-grid-modules/src/models/colDef/colDef.ts @@ -16,107 +16,116 @@ export type Alignement = 'left' | 'right' | 'center'; */ export interface ColDef { /** - * String Column Identifier, used to map with [[RowData]] values + * String Column Identifier, used to map with [[RowData]] values. */ field: string; /** - * The title of the column rendered in the column header cell + * The title of the column rendered in the column header cell. */ headerName?: string; /** - * The description of the column rendered as tooltip if the column header name is not fully displayed + * The description of the column rendered as tooltip if the column header name is not fully displayed. */ description?: string; /** - * Set the width of the column + * Set the width of the column. + * * @default 100 */ width?: number; /** - * Toggle the visibility of a column + * Toggle the visibility of a column. */ hide?: boolean; /** - * Make the column sortable + * Make the column sortable. + * * @default true */ sortable?: boolean; /** - * Make the column resizable + * Make the column resizable. + * * @default true */ resizable?: boolean; /** - * A comparator function used to sort rows + * A comparator function used to sort rows. */ sortComparator?: ComparatorFn; /** - * Sort the rows in a specific direction + * Sort the rows in a specific direction. */ sortDirection?: SortDirection; /** - * If multiple columns are sorted, this setting allows to order the columns sorting sequence + * If multiple columns are sorted, this setting allows to order the columns sorting sequence. */ sortIndex?: number; /** - * Type allows to merge this object with a default definition [[ColDef]] + * Type allows to merge this object with a default definition [[ColDef]]. + * * @default string */ type?: ColType; /** - * Allows to align the column values in cells + * Allows to align the column values in cells. */ align?: Alignement; /** - * Function that allows to get a specific data instead of field to render in the cell + * Function that allows to get a specific data instead of field to render in the cell. + * * @param params */ valueGetter?: (params: ValueGetterParams) => CellValue; /** - * Function that allows to apply a formatter before rendering its value + * Function that allows to apply a formatter before rendering its value. + * * @param params */ valueFormatter?: (params: ValueFormatterParams) => CellValue; /** - * Css class that will be added in cells for that column + * Class name that will be added in cells for that column. */ cellClassName?: CellClassNamePropType; /** - * Set of css class rules that will be dynamically applied on cells + * Set of CSS class rules that will be dynamically applied on cells. */ cellClassRules?: CellClassRules; /** - * Allows to override the component rendered as cell for this column + * Allows to override the component rendered as cell for this column. + * * @param params */ renderCell?: (params: CellParams) => React.ReactElement; /** - * Css class that will be added in the column header cell + * Class name that will be added in the column header cell. */ headerClassName?: string | string[]; /** - * Allows to render a component in the column header cell + * Allows to render a component in the column header cell. + * * @param params */ renderHeader?: (params: ColParams) => React.ReactElement; /** - * Header cell element alignment + * Header cell element alignment. */ headerAlign?: Alignement; /** - * Toggle the visibility of the sort icons + * Toggle the visibility of the sort icons. */ hideSortIcons?: boolean; /** - * Allows to disable the click event in cells + * Allows to disable the click event in cells. */ disableClickEventBubbling?: boolean; } + export type Columns = ColDef[]; export type ColTypeDef = Omit & { extendType?: NativeColTypes }; /** - * Meta Info about Columns. + * Meta Info about columns. */ export interface ColumnsMeta { totalWidth: number; diff --git a/packages/grid/x-grid-modules/src/models/containerProps.ts b/packages/grid/x-grid-modules/src/models/containerProps.ts index 1669eced88ca..7f4602aa8b0b 100644 --- a/packages/grid/x-grid-modules/src/models/containerProps.ts +++ b/packages/grid/x-grid-modules/src/models/containerProps.ts @@ -5,48 +5,47 @@ import { ElementSize } from './elementSize'; */ export interface ContainerProps { /** - * Our rendering Zone constitute the maximum number of rows that will be rendered at any given time in the grid + * Our rendering zone constitute the maximum number of rows that will be rendered at any given time in the grid. */ renderingZonePageSize: number; /** - * The number of rows that fit in the viewport + * The number of rows that fit in the viewport. */ viewportPageSize: number; /** - * The last page number + * The last page number. */ lastPage: number; - /** - * Indicates if a vertical scrollbar is visible + * Indicates if a vertical scrollbar is visible. */ hasScrollY: boolean; /** - * Indicates if an horizontal scrollbar is visible + * Indicates if an horizontal scrollbar is visible. */ hasScrollX: boolean; /** - * The scrollbar size + * The scrollbar size. */ scrollBarSize: number; /** - * The total Element size required to render the set of rows including scrollbars + * The total element size required to render the set of rows including scrollbars. */ totalSizes: ElementSize; /** - * The viewport size including scrollbars + * The viewport size including scrollbars. */ windowSizes: ElementSize; /** - * The size of the container containing all the rendered rows + * The size of the container containing all the rendered rows. */ renderingZone: ElementSize; /** - * the size of the container holding the set of rows visible to the user + * the size of the container holding the set of rows visible to the user. */ viewportSize: ElementSize; /** - * The total Element size required to render the full set of rows minus the scrollbars + * The total Element size required to render the full set of rows minus the scrollbars. */ dataContainerSizes: ElementSize; } diff --git a/packages/grid/x-grid-modules/src/models/elementSize.ts b/packages/grid/x-grid-modules/src/models/elementSize.ts index cb9151e11d90..b551ab050abe 100644 --- a/packages/grid/x-grid-modules/src/models/elementSize.ts +++ b/packages/grid/x-grid-modules/src/models/elementSize.ts @@ -3,11 +3,11 @@ */ export interface ElementSize { /** - * The width of a container or HTMLElement + * The height of a container or HTMLElement. */ - width: number; + height: number; /** - * The height of a container or HTMLElement + * The width of a container or HTMLElement. */ - height: number; + width: number; } diff --git a/packages/grid/x-grid-modules/src/models/featureMode.ts b/packages/grid/x-grid-modules/src/models/featureMode.ts new file mode 100644 index 000000000000..024bf94186c9 --- /dev/null +++ b/packages/grid/x-grid-modules/src/models/featureMode.ts @@ -0,0 +1,4 @@ +export enum FeatureMode { + client = 'client', + server = 'server', +} diff --git a/packages/grid/x-grid-modules/src/models/gridComponentOverridesProp.tsx b/packages/grid/x-grid-modules/src/models/gridComponentOverridesProp.tsx index 1d43c93d46d2..27b2c0a45f3f 100644 --- a/packages/grid/x-grid-modules/src/models/gridComponentOverridesProp.tsx +++ b/packages/grid/x-grid-modules/src/models/gridComponentOverridesProp.tsx @@ -6,23 +6,23 @@ import { ComponentParams } from './params'; */ export interface GridComponentOverridesProp { /** - * pagination component rendered in the grid footer by default + * Pagination component rendered in the grid footer by default. */ pagination?: React.ElementType; /** - * loadingOverlay component rendered when the grid is in a loading state + * Loading overlay component rendered when the grid is in a loading state. */ loadingOverlay?: React.ElementType; /** - * noRowsOverlay component rendered when the grid has no rows + * No rows overlay component rendered when the grid has no rows. */ noRowsOverlay?: React.ElementType; /** - * footer component rendered at the bottom of the grid viewport + * Footer component rendered at the bottom of the grid viewport. */ footer?: React.ElementType; /** - * header component rendered above the grid column header bar + * Header component rendered above the grid column header bar. */ header?: React.ElementType; } diff --git a/packages/grid/x-grid-modules/src/models/gridOptions.tsx b/packages/grid/x-grid-modules/src/models/gridOptions.tsx index 849e334ed99d..4048bb76bf50 100644 --- a/packages/grid/x-grid-modules/src/models/gridOptions.tsx +++ b/packages/grid/x-grid-modules/src/models/gridOptions.tsx @@ -2,14 +2,14 @@ import * as React from 'react'; import { SortDirection } from './sortModel'; import { Logger } from '../hooks/utils'; import { ArrowDownward, ArrowUpward, SeparatorIcon } from '../components/icons'; -import { ColumnHeaderClickedParams } from './params/columnHeaderClickedParams'; import { ColumnSortedParams } from './params/columnSortedParams'; -import { RowClickedParam } from './params/rowClickedParams'; -import { CellClickedParam } from './params/cellClickedParams'; import { RowSelectedParams } from './params/rowSelectedParams'; -import { SelectionChangedParams } from './params/selectionChangedParams'; -import { PageChangedParams } from './params/pageChangedParams'; +import { SelectionChangeParams } from './params/selectionChangeParams'; +import { PageChangeParams } from './params/pageChangeParams'; import { ColumnTypesRecord, DEFAULT_COLUMN_TYPES } from './colDef'; +import { FeatureMode } from './featureMode'; +import { ColParams } from './params/colParams'; +import { CellParams, RowParams } from './params/cellParams'; /** * Set of icons used in the grid component UI. @@ -36,166 +36,224 @@ export interface IconsOptions { export interface GridOptions { /** * Turn grid height dynamic and follow the number of rows in the grid. + * * @default false */ autoHeight?: boolean; /** * Set the height in pixel of a row in the grid. + * * @default 52 */ rowHeight: number; /** * Set the height in pixel of the column headers in the grid. + * * @default 56 */ headerHeight: number; /** * Set the height/width of the grid inner scrollbar. + * * @default 15 */ scrollbarSize: number; /** * Number of columns rendered outside the grid viewport. + * * @default 2 */ columnBuffer: number; /** * Enable multiple selection using the CTRL or CMD key. + * * @default true */ enableMultipleSelection: boolean; /** * Enable sorting the grid rows with one or more columns. + * * @default true */ enableMultipleColumnsSorting: boolean; /** * Display the right border of the cells. + * * @default false */ showCellRightBorder?: boolean; /** * Display the column header right border. + * * @default false */ showColumnRightBorder?: boolean; /** * Extend rows to fill the grid container width. + * * @default true */ extendRowFullWidth?: boolean; /** * The order of the sorting sequence. + * * @default ['asc', 'desc', null] */ sortingOrder: SortDirection[]; /** * Activate pagination. + * * @default false */ pagination?: boolean; /** * Set the number of rows in one page. + * * @default 100 */ - paginationPageSize?: number; + pageSize?: number; /** * Auto-scale the pageSize with the container size to the max number of rows to avoid rendering a vertical scroll bar. + * * @default false */ - paginationAutoPageSize?: boolean; + autoPageSize?: boolean; /** - * Select the paginationPageSize dynamically using the component UI. + * Select the pageSize dynamically using the component UI. + * * @default [25, 50, 100] */ - paginationRowsPerPageOptions?: number[]; + rowsPerPageOptions?: number[]; + /** + * Pagination can be processed on the server or client-side. + * Set it to FeatureMode.client or `client` if you would like to handle the pagination on the client-side. + * Set it to FeatureMode.server or `server` if you would like to handle the pagination on the server-side. + */ + paginationMode?: FeatureMode; + /** + * Set the total number of rows, if it is different than the length of the value `rows` prop. + */ + rowCount?: number; + /** + * Set the current page. + * @default 1 + */ + page?: number; /** * Toggle footer component visibility. + * * @default false */ hideFooter?: boolean; /** * Toggle footer row count element visibility. + * * @default false */ hideFooterRowCount?: boolean; /** * Toggle footer selected row count element visibility. + * * @default false */ hideFooterSelectedRowCount?: boolean; /** * Toggle footer pagination component visibility. + * * @default false */ hideFooterPagination?: boolean; /** * Add a first column with checkbox that allows to select rows. + * * @default false */ checkboxSelection?: boolean; /** * Disable selection on click on a row or cell. + * * @default false */ disableSelectionOnClick?: boolean; /** * Pass a custom logger in the components that implements the [[Logger]] interface. + * * @default null */ logger?: Logger; /** * Allows to pass the logging level or false to turn off logging. + * * @default debug */ logLevel?: string | false; - /** * Handler triggered when the click event comes from a cell element. - * @param param with all properties from [[CellClickedParam]]. + * + * @param param With all properties from [[CellParams]]. */ - onCellClicked?: (param: CellClickedParam) => void; + onCellClick?: (param: CellParams) => void; + /** + * Handler triggered when the hover event comes from a cell element. + * + * @param param With all properties from [[CellParams]]. + */ + onCellHover?: (param: CellParams) => void; /** * Handler triggered when the click event comes from a row container element. - * @param param with all properties from [[RowClickedParam]]. + * + * @param param With all properties from [[RowParams]]. + */ + onRowClick?: (param: RowParams) => void; + /** + * Handler triggered when the hover event comes from a row container element. + * + * @param param With all properties from [[RowParams]]. */ - onRowClicked?: (param: RowClickedParam) => void; + onRowHover?: (param: RowParams) => void; /** * Handler triggered when one row get selected. - * @param param with all properties from [[RowSelectedParams]]. + * + * @param param With all properties from [[RowSelectedParams]]. */ onRowSelected?: (param: RowSelectedParams) => void; /** - * Handler triggered when one or multiple rows get their selection state changed. - * @param param with all properties from [[SelectionChangedParams]] + * Handler triggered when one or multiple rows get their selection state change. + * + * + * @param param With all properties from [[SelectionChangeParams]] */ - onSelectionChanged?: (param: SelectionChangedParams) => void; + onSelectionChange?: (param: SelectionChangeParams) => void; /** * Handler triggered when the click event comes from a column header element. - * @param param with all properties from [[ColumnHeaderClickedParams]]. + * + * @param param With all properties from [[ColParams]]. */ - onColumnHeaderClicked?: (param: ColumnHeaderClickedParams) => void; + onColumnHeaderClick?: (param: ColParams) => void; /** * Handler triggered when grid resorted its rows. - * @param param with all properties from [[ColumnSortedParams]]. + * + * @param param With all properties from [[ColumnSortedParams]]. */ - onColumnsSorted?: (params: ColumnSortedParams) => void; + onSortedColumns?: (params: ColumnSortedParams) => void; /** - * Handler triggered when the current page has changed. - * @param param with all properties from [[PageChangedParams]]. + * Handler triggered when the current page has change. + * + * + * @param param With all properties from [[PageChangeParams]]. */ - onPageChanged?: (param: PageChangedParams) => void; + onPageChange?: (param: PageChangeParams) => void; /** - * Handler triggered when the page size changed. - * @param param with all properties from [[PageChangedParams]]. + * Handler triggered when the page size change. + * + * + * @param param With all properties from [[PageChangeParams]]. */ - onPageSizeChanged?: (param: PageChangedParams) => void; - + onPageSizeChange?: (param: PageChangeParams) => void; /** * Set of icons used in the grid. */ icons: IconsOptions; - /** * Extend native column types with your new column types. */ @@ -213,8 +271,9 @@ export const DEFAULT_GRID_OPTIONS: GridOptions = { columnBuffer: 2, enableMultipleSelection: true, enableMultipleColumnsSorting: true, - paginationRowsPerPageOptions: [25, 50, 100], - paginationPageSize: 100, + rowsPerPageOptions: [25, 50, 100], + pageSize: 100, + paginationMode: FeatureMode.client, extendRowFullWidth: true, sortingOrder: ['asc', 'desc', null], columnTypes: DEFAULT_COLUMN_TYPES, diff --git a/packages/grid/x-grid-modules/src/models/index.ts b/packages/grid/x-grid-modules/src/models/index.ts index 67ec9c501345..700d2c3b0566 100644 --- a/packages/grid/x-grid-modules/src/models/index.ts +++ b/packages/grid/x-grid-modules/src/models/index.ts @@ -1,6 +1,7 @@ export * from './colDef'; export * from './containerProps'; export * from './elementSize'; +export * from './featureMode'; export * from './gridOptions'; export * from './rootContainerRef'; export * from './renderContextProps'; diff --git a/packages/grid/x-grid-modules/src/models/params/cellClickedParams.ts b/packages/grid/x-grid-modules/src/models/params/cellClickedParams.ts deleted file mode 100644 index 35092299b15c..000000000000 --- a/packages/grid/x-grid-modules/src/models/params/cellClickedParams.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { CellValue, RowData } from '../rows'; -import { ColDef } from '../colDef'; - -/** - * Object passed as parameter in the Cell Click event handler. - */ -export interface CellClickedParam { - /** - * The HTMLElement that triggered the event - */ - element: HTMLElement; - /** - * The value of the cell that triggered the event - */ - value: CellValue; - /** - * The column field of the cell that triggered the event - */ - field: string; - /** - * The other row data of the cell that triggered the event - */ - data: RowData; - /** - * The row index of the cell that triggered the event - */ - rowIndex: number; - /** - * The column of the cell that triggered the event - */ - colDef: ColDef; -} diff --git a/packages/grid/x-grid-modules/src/models/params/cellParams.ts b/packages/grid/x-grid-modules/src/models/params/cellParams.ts index 650b7e568949..2d48f50677ce 100644 --- a/packages/grid/x-grid-modules/src/models/params/cellParams.ts +++ b/packages/grid/x-grid-modules/src/models/params/cellParams.ts @@ -5,40 +5,55 @@ import { CellValue, RowData, RowModel } from '../rows'; */ export interface CellParams { /** - * the cell value + * The HTMLElement that triggered the event + */ + element?: HTMLElement; + /** + * The column field of the cell that triggered the event + */ + field: string; + /** + * The cell value. */ value: CellValue; /** - * A function that let you get data from other columns + * A function that let you get data from other columns. + * * @param field */ getValue: (field: string) => CellValue; /** - * The full set of data of the row that the current cell belongs to + * The full set of data of the row that the current cell belongs to. */ data: RowData; /** - * The row model of the row that the current cell belongs to + * The row model of the row that the current cell belongs to. */ rowModel: RowModel; /** - * The column of the row that the current cell belongs to + * The column of the row that the current cell belongs to. */ colDef: any; /** - * The row index of the row that the current cell belongs to + * The row index of the row that the current cell belongs to. */ rowIndex: number; /** - * ApiRef that let you manipulate the grid + * ApiRef that let you manipulate the grid. */ api: any; } +/** + * Alias of CellParams. + */ +export type RowParams = Omit; + /** * Alias of CellParams. */ export type ValueGetterParams = CellParams; + /** * Alias of CellParams. */ diff --git a/packages/grid/x-grid-modules/src/models/params/colParams.ts b/packages/grid/x-grid-modules/src/models/params/colParams.ts index a5416daba910..b750ace92432 100644 --- a/packages/grid/x-grid-modules/src/models/params/colParams.ts +++ b/packages/grid/x-grid-modules/src/models/params/colParams.ts @@ -3,15 +3,19 @@ */ export interface ColParams { /** - * The column of the current header component + * The column field of the column that triggered the event + */ + field: string; + /** + * The column of the current header component. */ colDef: any; /** - * The column index of the current header component + * The column index of the current header component. */ colIndex: number; /** - * ApiRef that let you manipulate the grid + * API ref that let you manipulate the grid. */ api: any; } diff --git a/packages/grid/x-grid-modules/src/models/params/columnHeaderClickedParams.ts b/packages/grid/x-grid-modules/src/models/params/columnHeaderClickedParams.ts deleted file mode 100644 index d4777a04670e..000000000000 --- a/packages/grid/x-grid-modules/src/models/params/columnHeaderClickedParams.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ColDef } from '../colDef'; - -/** - * Object passed as parameter of the column header click event. - */ -export interface ColumnHeaderClickedParams { - /** - * The column field of the column that triggered the event - */ - field: string; - /** - * The column [[ColDef]] of the column that triggered the event - */ - column: ColDef; -} diff --git a/packages/grid/x-grid-modules/src/models/params/columnSortedParams.ts b/packages/grid/x-grid-modules/src/models/params/columnSortedParams.ts index 68aa083b988b..22872c5b8ce5 100644 --- a/packages/grid/x-grid-modules/src/models/params/columnSortedParams.ts +++ b/packages/grid/x-grid-modules/src/models/params/columnSortedParams.ts @@ -6,11 +6,12 @@ import { SortModel } from '../sortModel'; */ export interface ColumnSortedParams { /** - * An array of column [[ColDef]] that the grid is sorted with. The array order corresponds to the order of sorting + * An array of column [[ColDef]] that the grid is sorted with. + * The array order corresponds to the order of sorting. */ sortedColumns: ColDef[]; /** - * The sort model used to sort the grid + * The sort model used to sort the grid. */ sortModel: SortModel; } diff --git a/packages/grid/x-grid-modules/src/models/params/componentParams.ts b/packages/grid/x-grid-modules/src/models/params/componentParams.ts index 6c16e3ca5a38..e57a9a8ce69a 100644 --- a/packages/grid/x-grid-modules/src/models/params/componentParams.ts +++ b/packages/grid/x-grid-modules/src/models/params/componentParams.ts @@ -10,27 +10,27 @@ import { ApiRef } from '../api'; */ export interface ComponentParams { /** - * The object containing all pagination details in [[PaginationProps]] + * The object containing all pagination details in [[PaginationProps]]. */ paginationProps: PaginationProps; /** - * The full set of rows + * The full set of rows. */ rows: Rows; /** - * The full set of columns + * The full set of columns. */ columns: Columns; /** - * The full set of options + * The full set of options. */ options: GridOptions; /** - * ApiRef that let you manipulate the grid + * ApiRef that let you manipulate the grid. */ api: ApiRef; /** - * The ref of the inner div Element of the grid + * The ref of the inner div Element of the grid. */ rootElement: RootContainerRef; } diff --git a/packages/grid/x-grid-modules/src/models/params/index.ts b/packages/grid/x-grid-modules/src/models/params/index.ts index 02e4c9472988..6be0573fbc78 100644 --- a/packages/grid/x-grid-modules/src/models/params/index.ts +++ b/packages/grid/x-grid-modules/src/models/params/index.ts @@ -1,10 +1,7 @@ -export * from './cellClickedParams'; export * from './cellParams'; export * from './colParams'; -export * from './columnHeaderClickedParams'; export * from './columnSortedParams'; export * from './componentParams'; -export * from './pageChangedParams'; -export * from './rowClickedParams'; +export * from './pageChangeParams'; export * from './rowSelectedParams'; -export * from './selectionChangedParams'; +export * from './selectionChangeParams'; diff --git a/packages/grid/x-grid-modules/src/models/params/pageChangeParams.ts b/packages/grid/x-grid-modules/src/models/params/pageChangeParams.ts new file mode 100644 index 000000000000..4bb0539c5bd9 --- /dev/null +++ b/packages/grid/x-grid-modules/src/models/params/pageChangeParams.ts @@ -0,0 +1,24 @@ +import { FeatureMode } from '../featureMode'; + +/** + * Object passed as parameter of the page change event handler. + */ +export interface PageChangeParams { + /** + * The new page. + */ + page: number; + /** + * The total number of pages. + */ + pageCount: number; + /** + * The number of rows in a page. + */ + pageSize: number; + /** + * The total number of rows. + */ + rowCount: number; + paginationMode: FeatureMode; +} diff --git a/packages/grid/x-grid-modules/src/models/params/pageChangedParams.ts b/packages/grid/x-grid-modules/src/models/params/pageChangedParams.ts deleted file mode 100644 index fe357a6d85df..000000000000 --- a/packages/grid/x-grid-modules/src/models/params/pageChangedParams.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Object passed as parameter of the page changed event handler. - */ -export interface PageChangedParams { - /** - * The new page - */ - page: number; - /** - * The total number of pages - */ - pageCount: number; - /** - * The number of rows in a page - */ - pageSize: number; - /** - * The total number of rows - */ - rowCount: number; -} diff --git a/packages/grid/x-grid-modules/src/models/params/rowClickedParams.ts b/packages/grid/x-grid-modules/src/models/params/rowClickedParams.ts deleted file mode 100644 index 2f92bab7a6cc..000000000000 --- a/packages/grid/x-grid-modules/src/models/params/rowClickedParams.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { RowData, RowModel } from '../rows'; -import { ColDef } from '../colDef/colDef'; - -/** - * The object passed as parameter of the Row click event handler. - */ -export interface RowClickedParam { - /** - * The row element that trigger the click - */ - element: HTMLElement; - /** - * The row model of the row that triggered the click - */ - rowModel: RowModel; - /** - * The row data of the row that triggered the click - */ - data: RowData; - /** - * The row index of the row that triggered the click - */ - rowIndex: number; - /** - * The column of the row that triggered the click - */ - colDef: ColDef; -} diff --git a/packages/grid/x-grid-modules/src/models/params/rowSelectedParams.ts b/packages/grid/x-grid-modules/src/models/params/rowSelectedParams.ts index 41a2f4eb5f8c..06820054c7de 100644 --- a/packages/grid/x-grid-modules/src/models/params/rowSelectedParams.ts +++ b/packages/grid/x-grid-modules/src/models/params/rowSelectedParams.ts @@ -5,15 +5,15 @@ import { RowData } from '../rows'; */ export interface RowSelectedParams { /** - * The row data of the row that triggers the event + * The row data of the row that triggers the event. */ data: RowData; /** - * The row index of the row that triggers the event + * The row index of the row that triggers the event. */ rowIndex: number; /** - * The selected state of the row that triggers the event + * The selected state of the row that triggers the event. */ isSelected: boolean; } diff --git a/packages/grid/x-grid-modules/src/models/params/selectionChangeParams.ts b/packages/grid/x-grid-modules/src/models/params/selectionChangeParams.ts new file mode 100644 index 000000000000..a6d42170f201 --- /dev/null +++ b/packages/grid/x-grid-modules/src/models/params/selectionChangeParams.ts @@ -0,0 +1,11 @@ +import { RowData } from '../rows'; + +/** + * Object passed as parameter as the selection change event handler. + */ +export interface SelectionChangeParams { + /** + * The set of rows that had their selection state change. + */ + rows: RowData[]; +} diff --git a/packages/grid/x-grid-modules/src/models/params/selectionChangedParams.ts b/packages/grid/x-grid-modules/src/models/params/selectionChangedParams.ts deleted file mode 100644 index 3c5cdfb12f31..000000000000 --- a/packages/grid/x-grid-modules/src/models/params/selectionChangedParams.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { RowData } from '../rows'; - -/** - * Object passed as parameter as the selection changed event handler. - */ -export interface SelectionChangedParams { - /** - * The set of rows that had their selection state changed. - */ - rows: RowData[]; -} diff --git a/packages/grid/x-grid-modules/src/models/renderContextProps.ts b/packages/grid/x-grid-modules/src/models/renderContextProps.ts index 2616b13a277f..f9b37a3cc0d7 100644 --- a/packages/grid/x-grid-modules/src/models/renderContextProps.ts +++ b/packages/grid/x-grid-modules/src/models/renderContextProps.ts @@ -5,19 +5,19 @@ import { ContainerProps } from './containerProps'; */ export interface RenderColumnsProps { /** - * The column index of the first rendered column + * The column index of the first rendered column. */ firstColIdx: number; /** - * The column index of the last rendered column + * The column index of the last rendered column. */ lastColIdx: number; /** - * The left empty width required to position the viewport at the beginning of the first rendered column + * The left empty width required to position the viewport at the beginning of the first rendered column. */ leftEmptyWidth: number; /** - * The right empty width limit the position the viewport to the end of the last rendered column + * The right empty width limit the position the viewport to the end of the last rendered column. */ rightEmptyWidth: number; } @@ -45,13 +45,13 @@ export interface RenderRowProps { */ export interface RenderPaginationProps { /** - * The current page if pagination is enabled + * The current page if pagination is enabled. */ paginationCurrentPage?: number; /** - * The current page size if pagination is enabled + * The current page size if pagination is enabled. */ - paginationPageSize?: number; + pageSize?: number; } /** diff --git a/packages/grid/x-grid-modules/src/models/rows.ts b/packages/grid/x-grid-modules/src/models/rows.ts index 65efc32e143a..3bf16610891c 100644 --- a/packages/grid/x-grid-modules/src/models/rows.ts +++ b/packages/grid/x-grid-modules/src/models/rows.ts @@ -40,13 +40,14 @@ export interface RowModel { /** * An helper function allowing to create [[RowModel]] from [[RowData]]. - * @param a row as [[RowData]]. - * @returns a row as [[RowModel]]. + * + * @param rowData Row as [[RowData]]. + * @returns A row as [[RowModel]]. */ -export function createRow(r: RowData): RowModel { +export function createRow(rowData: RowData): RowModel { const row: RowModel = { - id: r.id, - data: r, + id: rowData.id, + data: rowData, selected: false, }; return row; diff --git a/packages/grid/x-grid-modules/src/models/sortModel.ts b/packages/grid/x-grid-modules/src/models/sortModel.ts index 213374e23717..6f52124fde3d 100644 --- a/packages/grid/x-grid-modules/src/models/sortModel.ts +++ b/packages/grid/x-grid-modules/src/models/sortModel.ts @@ -14,11 +14,11 @@ export type ComparatorFn = (v1: CellValue, v2: CellValue, row1: RowModel, row2: */ export interface SortItem { /** - * The column field identifier + * The column field identifier. */ field: string; /** - * The direction of the column that the grid should sort + * The direction of the column that the grid should sort. */ sort: SortDirection; } diff --git a/packages/grid/x-grid-modules/src/utils/index.ts b/packages/grid/x-grid-modules/src/utils/index.ts index 4907a489e20b..6afd75dd3f41 100644 --- a/packages/grid/x-grid-modules/src/utils/index.ts +++ b/packages/grid/x-grid-modules/src/utils/index.ts @@ -4,3 +4,4 @@ export * from './domUtils'; export * from './classnames'; export * from './keyboardUtils'; export * from './mergeOptions'; +export * from './paramsUtils'; diff --git a/packages/grid/x-grid-modules/src/utils/paramsUtils.ts b/packages/grid/x-grid-modules/src/utils/paramsUtils.ts new file mode 100644 index 000000000000..4c10e9a64893 --- /dev/null +++ b/packages/grid/x-grid-modules/src/utils/paramsUtils.ts @@ -0,0 +1,57 @@ +import { RowModel, CellValue } from '../models/rows'; +import { ColDef } from '../models/colDef/colDef'; +import { GridApi } from '../models/api/gridApi'; +import { CellParams, RowParams } from '../models/params/cellParams'; + +export function buildCellParams({ + element, + value, + rowIndex, + rowModel, + colDef, + api, +}: { + rowModel: RowModel; + colDef: ColDef; + rowIndex: number; + value: CellValue; + api: GridApi; + element?: HTMLElement; +}): CellParams { + return { + element, + value, + field: colDef.field, + getValue: (field: string) => rowModel.data[field], + data: rowModel.data, + rowModel, + colDef, + rowIndex, + api, + }; +} + +export function buildRowParams({ + element, + rowIndex, + rowModel, + colDef, + api, +}: { + rowModel: RowModel; + colDef: ColDef; + rowIndex: number; + api: GridApi; + element?: HTMLElement; +}): RowParams { + return { + element, + field: colDef.field, + getValue: (field: string) => rowModel.data[field], + data: rowModel.data, + rowModel, + colDef, + rowIndex, + api, + }; +} diff --git a/packages/grid/x-grid/CHANGELOG.md b/packages/grid/x-grid/CHANGELOG.md index c3925e14c366..c3c1435a09e3 100644 --- a/packages/grid/x-grid/CHANGELOG.md +++ b/packages/grid/x-grid/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.64](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.64) (2020-07-27) + +**Note:** Version bump only for package @material-ui/x-grid + + + + + +## [0.1.63](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.63) (2020-07-27) + +**Note:** Version bump only for package @material-ui/x-grid + + + + + ## [0.1.62](https://github.com/mui-org/material-ui-x/compare/v0.1.61...v0.1.62) (2020-07-22) **Note:** Version bump only for package @material-ui/x-grid diff --git a/packages/grid/x-grid/package.json b/packages/grid/x-grid/package.json index 3597d3821bb0..422a3391b134 100644 --- a/packages/grid/x-grid/package.json +++ b/packages/grid/x-grid/package.json @@ -1,6 +1,6 @@ { "name": "@material-ui/x-grid", - "version": "0.1.62", + "version": "0.1.64", "description": "The Material-UI X edition of the data grid component.", "author": "Material-UI Team", "main": "dist/index-cjs.js", @@ -17,7 +17,7 @@ "tslib": "^2.0.0" }, "devDependencies": { - "@material-ui/x-grid-modules": "^0.1.62", + "@material-ui/x-grid-modules": "^0.1.64", "@material-ui/x-license": "^0.1.61", "@rollup/plugin-node-resolve": "^8.0.1", "@rollup/plugin-replace": "^2.3.3", @@ -25,7 +25,6 @@ "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-command": "^1.1.3", "rollup-plugin-dts": "^1.4.7", - "rollup-plugin-multi-entry": "^2.1.0", "rollup-plugin-sourcemaps": "^0.6.2", "rollup-plugin-terser": "^5.3.0", "rollup-plugin-typescript2": "^0.27.1" diff --git a/packages/storybook/CHANGELOG.md b/packages/storybook/CHANGELOG.md index 5eb32d12a70c..9aca67bfeacc 100644 --- a/packages/storybook/CHANGELOG.md +++ b/packages/storybook/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.64](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.64) (2020-07-27) + +**Note:** Version bump only for package @material-ui/x-storybook + + + + + +## [0.1.63](https://github.com/dtassone/material-ui-x/compare/v0.1.62...v0.1.63) (2020-07-27) + +**Note:** Version bump only for package @material-ui/x-storybook + + + + + ## [0.1.62](https://github.com/mui-org/material-ui-x/compare/v0.1.61...v0.1.62) (2020-07-22) **Note:** Version bump only for package @material-ui/x-storybook diff --git a/packages/storybook/package.json b/packages/storybook/package.json index 9a3c4b9538ae..51b3b36ad103 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -1,15 +1,15 @@ { "name": "@material-ui/x-storybook", - "version": "0.1.62", + "version": "0.1.64", "description": "Storybook components", "author": "Material-UI Team", "private": true, "dependencies": { "@material-ui/core": "^4.9.12", - "@material-ui/data-grid": "^0.1.62", + "@material-ui/data-grid": "^0.1.64", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.54", - "@material-ui/x-grid": "^0.1.62", + "@material-ui/x-grid": "^0.1.64", "@material-ui/x-grid-data-generator": "^0.1.62", "@material-ui/x-license": "^0.1.61", "faker": "^4.1.0", diff --git a/packages/storybook/src/documentation/pages/api.stories.mdx b/packages/storybook/src/documentation/pages/api.stories.mdx index 18e16e91f385..6293c75b4ed4 100644 --- a/packages/storybook/src/documentation/pages/api.stories.mdx +++ b/packages/storybook/src/documentation/pages/api.stories.mdx @@ -6,7 +6,7 @@ import { XGrid } from '@material-ui/x-grid'; ## How to use ApiRef? -The `ApiRef` allows you to manipulate the grid outside the React component context. This can be very handy in a streaming api to update rows with changes from the server. +The `ApiRef` allows you to manipulate the grid outside the React component scope. To enable ApiRef, you need to use the `useApiRef` hook and pass the ref to the component prop as below. ```tsx @@ -17,7 +17,12 @@ return ``` -Generated? +## Use cases + +If you would like to manipulate the grid outside the component rendering the XGrid, for example if you are building some custom filters. +You could pass the apiRef using the context or as a prop. + +This can also be very handy in a streaming api to update rows with changes from the server as we have exposed in our Rows section [here](). ## GridAPI diff --git a/packages/storybook/src/documentation/pages/demos/pagination/autoPageSize.demo.tsx b/packages/storybook/src/documentation/pages/demos/pagination/autoPageSize.demo.tsx index 1a3b6bac9e20..2a038200c07a 100644 --- a/packages/storybook/src/documentation/pages/demos/pagination/autoPageSize.demo.tsx +++ b/packages/storybook/src/documentation/pages/demos/pagination/autoPageSize.demo.tsx @@ -90,7 +90,7 @@ export default function AutoPageSizeDemo() {
diff --git a/packages/storybook/src/documentation/pages/demos/pagination/customPagination.demo.tsx b/packages/storybook/src/documentation/pages/demos/pagination/customPagination.demo.tsx index 2dd7d8da0f2b..8cd2bd7941af 100644 --- a/packages/storybook/src/documentation/pages/demos/pagination/customPagination.demo.tsx +++ b/packages/storybook/src/documentation/pages/demos/pagination/customPagination.demo.tsx @@ -103,8 +103,8 @@ export default function CustomPaginationDemo() { columns={columns} options={{ pagination: true, - paginationPageSize: 5, - paginationRowsPerPageOptions: [5, 10], + pageSize: 5, + rowsPerPageOptions: [5, 10], autoHeight: true, }} className="demo" diff --git a/packages/storybook/src/documentation/pages/demos/pagination/serverPagination.demo.tsx b/packages/storybook/src/documentation/pages/demos/pagination/serverPagination.demo.tsx new file mode 100644 index 000000000000..6a26093f0ce4 --- /dev/null +++ b/packages/storybook/src/documentation/pages/demos/pagination/serverPagination.demo.tsx @@ -0,0 +1,76 @@ +import * as React from 'react'; +import { Columns, FeatureMode, PageChangeParams, RowsProp, XGrid } from '@material-ui/x-grid'; +import { + randomCreatedDate, + randomEmail, + randomId, + randomInt, + randomTraderName, + randomUpdatedDate, +} from '@material-ui/x-grid-data-generator'; + +function newRow() { + return { + id: randomId(), + name: randomTraderName(), + email: randomEmail(), + age: randomInt(10, 100), + dateCreated: randomCreatedDate(), + lastLogin: randomUpdatedDate(), + }; +} + +const columns: Columns = [ + { field: 'id', hide: true }, + { field: 'name', type: 'string' }, + { field: 'email', type: 'string' }, + { field: 'age', type: 'number' }, + { field: 'dateCreated', type: 'date', width: 180 }, + { field: 'lastLogin', type: 'dateTime', width: 180 }, +]; + +function loadServerRows(params: PageChangeParams): Promise { + return new Promise((resolve) => { + const rows: any[] = []; + while (rows.length < params.pageSize) { + rows.push(newRow()); + } + + setTimeout(() => { + resolve({ response: { rows }, request: { params } }); + }, 800); + }); +} + +export default function ServerPaginationDemo() { + const [rows, setRows] = React.useState([]); + const [isLoading, setLoading] = React.useState(false); + const currentPage = React.useRef(1); + + const onPageChange = (params) => { + currentPage.current = params.page; + setLoading(true); + loadServerRows(params).then(({ response, request }) => { + if (currentPage.current === request.params.page) { + setRows(response.rows); + setLoading(false); + } + }); + }; + + return ( + + ); +} diff --git a/packages/storybook/src/documentation/pages/demos/pagination/setPage.demo.tsx b/packages/storybook/src/documentation/pages/demos/pagination/setPage.demo.tsx index 8ec1ec7598ab..6c8281b53df5 100644 --- a/packages/storybook/src/documentation/pages/demos/pagination/setPage.demo.tsx +++ b/packages/storybook/src/documentation/pages/demos/pagination/setPage.demo.tsx @@ -97,8 +97,8 @@ export default function SetPageDemo() { columns={columns} options={{ pagination: true, - paginationPageSize: 5, - paginationRowsPerPageOptions: [5, 10], + pageSize: 5, + rowsPerPageOptions: [5, 10], autoHeight: true, }} className="demo" diff --git a/packages/storybook/src/documentation/pages/demos/pagination/simplePagination.demo.tsx b/packages/storybook/src/documentation/pages/demos/pagination/simplePagination.demo.tsx index b664ce106c56..d33aa16c31ad 100644 --- a/packages/storybook/src/documentation/pages/demos/pagination/simplePagination.demo.tsx +++ b/packages/storybook/src/documentation/pages/demos/pagination/simplePagination.demo.tsx @@ -91,8 +91,8 @@ export default function SimplePaginationDemo() { columns={columns} options={{ pagination: true, - paginationPageSize: 5, - paginationRowsPerPageOptions: [5, 10], + pageSize: 5, + rowsPerPageOptions: [5, 10], autoHeight: true, }} className="demo" diff --git a/packages/storybook/src/documentation/pages/pagination.stories.mdx b/packages/storybook/src/documentation/pages/pagination.stories.mdx index cc52781a65ad..61fd3f2f5c22 100644 --- a/packages/storybook/src/documentation/pages/pagination.stories.mdx +++ b/packages/storybook/src/documentation/pages/pagination.stories.mdx @@ -3,6 +3,7 @@ import SimplePaginationDemo from './demos/pagination/simplePagination.demo'; import AutoPageSizeDemo from './demos/pagination/autoPageSize.demo'; import SetPageDemo from './demos/pagination/setPage.demo'; import CustomPaginationDemo from './demos/pagination/customPagination.demo'; +import ServerPaginationDemo from './demos/pagination/serverPagination.demo'; @@ -19,20 +20,20 @@ To turn it on, toggle the `pagination` boolean property of the `options` React p - **Set page size** -Our default `pageSize` is set to `100`. You can change this value by setting the `paginationPageSize` property of the `options` React prop as below. +Our default `pageSize` is set to `100`. You can change this value by setting the `pageSize` property of the `options` React prop as below. ```tsx ``` - **Set Rows per page options** -Along with the `paginationPageSize` property, we added the `paginationRowsPerPageOptions` that let you select the `paginationPageSize` dynamically using XGrid UI. -Our default `paginationRowsPerPageOptions` is set to `[25, 50, 100]`. You can change this value by setting the `paginationRowsPerPageOptions` property of the `options` React prop as below. +Along with the `pageSize` property, we added the `rowsPerPageOptions` that let you select the `pageSize` dynamically using XGrid UI. +The default `rowsPerPageOptions` is set to `[25, 50, 100]`. You can change this value by setting the `rowsPerPageOptions` property of the `options` prop as below. ```tsx ``` @@ -50,20 +51,36 @@ Please find below an example of a grid with pagination using the options prop de +- ** Set the current page** + +Finally, we exposed the `page` property, which let you select the current page rendered by XGrid. Default value is 1. +If you would like to render the second page, then you can set this property to `2` as below + +```tsx + +``` + ## Auto pagination -The property `paginationAutoPageSize` is available as an option to auto-scale the `pageSize` with the container size to the max number of rows to avoid rendering a vertical scroll bar. -By default, this feature is off and can be turned on, by toggling the `paginationAutoPageSize` boolean property of the `options` React prop as below. +The property `autoPageSize` is available as an option to auto-scale the `pageSize` with the container size to the max number of rows to avoid rendering a vertical scroll bar. +By default, this feature is off and can be turned on, by toggling the `autoPageSize` boolean property of the `options` React prop as below. ```tsx ``` -Please find below an example of grid with `paginationAutoPageSize` turned on as described above. +Please find below an example of grid with `autoPageSize` turned on as described above. @@ -80,7 +97,7 @@ To achieve this, just set the pagination property of the `components` react prop columns={columns} options={{ pagination: true, - paginationPageSize: 50, + pageSize: 50, }} components={{ pagination: PaginationComponent, @@ -90,10 +107,42 @@ To achieve this, just set the pagination property of the `components` react prop -## Pagination API +## Server-side pagination + +XGrid supports both client and server-side pagination. By default, pagination works on the client-side. To switch it to server-side, +set the property `paginationMode` to `server` as string or you can use our `FeatureMode` enum. +**Note**: You also need to set the `rowCount` property to override the number of rows in the grid so XGrid can calculate the total number of pages. + +Finally, you're going to need to handle the `onPageChange` event, to load the rows for the corresponding page. + +```tsx +const [rows, setRows] = React.useState([]); +const onPageChange = (params) => { + loadServerRows(params).then((newRows) => { + setRows(newRows); + }); +}; + +; +``` + + -Now that you understand how to implement the pagination feature of the grid. You might want to manipulate the page or set a listener when the current page change. -To achieve this, you should use our `apiRef` as below; +### Pagination API + +We exposed a set of methods that will let you achieve all the above features using the `ApiRef` object. More info on our API page [here](??). + +Below is an example on how you can reset the page using the `setPage` method of the API. ```tsx const apiRef = useApiRef(); @@ -102,30 +151,15 @@ React.useEffect(() => { apiRef.current?.setPage(2); }, [apiRef]); -// Set rows, columns ... - ; ``` - -### How to implement server pagination? - -How to set row count / page count? On pageChange...? -=> set pageCount then onPageChange((page)=> serverQuery(page).then(data=> setRows(data)) - -// TODO - -- expose pageCount in options, needed for server api -- expose page or currentPage in options, avoid using apiRef -- add setRows (RowData) method to replace rows on pageChange ?? You can just use useState - -// TODO implement example with react Query? diff --git a/packages/storybook/src/documentation/pages/selection.stories.mdx b/packages/storybook/src/documentation/pages/selection.stories.mdx index b4854f167558..0e3434e2c87e 100644 --- a/packages/storybook/src/documentation/pages/selection.stories.mdx +++ b/packages/storybook/src/documentation/pages/selection.stories.mdx @@ -60,7 +60,7 @@ In the example below the column `name` is not clickable To conveniently apply action on selected rows, we emit the following events based on user interaction. - `onRowSelected` - Event emitted when one row is selected. -- `onSelectionChanged` - Event emitted when one or multiple rows had a selection state changed. +- `onSelectionChange` - Event emitted when one or multiple rows had a selection state change. ## API diff --git a/packages/storybook/src/documentation/pages/sorting.stories.mdx b/packages/storybook/src/documentation/pages/sorting.stories.mdx index c1cd4542fec0..c2ff6e8a0014 100644 --- a/packages/storybook/src/documentation/pages/sorting.stories.mdx +++ b/packages/storybook/src/documentation/pages/sorting.stories.mdx @@ -116,7 +116,7 @@ const columns: Columns = [ ## Events -- `onColumnsSorted` - Event triggered after a column is sorted +- `onSortedColumns` - Event triggered after a column is sorted ## API @@ -129,4 +129,3 @@ TODO - Server side sorting? - Implement postSort? -- Talk about onColumnHeaderClicked?: (param: ColumnHeaderClickedParams) => void; ? => not good as API can trigger sort? diff --git a/packages/storybook/src/stories/grid-events.stories.tsx b/packages/storybook/src/stories/grid-events.stories.tsx index bd74c809fd25..53beaa1aabed 100644 --- a/packages/storybook/src/stories/grid-events.stories.tsx +++ b/packages/storybook/src/stories/grid-events.stories.tsx @@ -21,42 +21,62 @@ export function AllEvents() { const data = useData(2000, 200); const options: GridOptionsProp = { - onRowClicked: (params) => action('onRowClicked')(params), - onCellClicked: (params) => action('onCellClicked')(params), - onColumnHeaderClicked: (params) => action('onColumnHeaderClicked')(params), + onRowClick: (params) => action('onRowClick')(params), + onCellClick: (params) => action('onCellClick')(params), + onCellHover: (params) => action('onCellHover')(params), + onRowHover: (params) => action('onRowHover')(params), + onColumnHeaderClick: (params) => action('onColumnHeaderClick')(params), onRowSelected: (params) => action('onRowSelected')(params), - onSelectionChanged: (params) => action('onSelectionChanged', { depth: 1 })(params), - onColumnsSorted: (params) => action('onColumnsSorted')(params), - onPageChanged: (params) => action('onPageChanged')(params), - onPageSizeChanged: (params) => action('onPageSizeChanged')(params), + onSelectionChange: (params) => action('onSelectionChange', { depth: 1 })(params), + onSortedColumns: (params) => action('onSortedColumns')(params), + onPageChange: (params) => action('onPageChange')(params), + onPageSizeChange: (params) => action('onPageSizeChange')(params), }; return ; } -export const onRowClicked = () => { +export const onRowClick = () => { const data = useData(2000, 200); const options: GridOptionsProp = { - onRowClicked: (params) => action('row clicked')(params), + onRowClick: (params) => action('row click')(params), }; return ; }; -export const onCellClicked = () => { +export const onRowHover = () => { const data = useData(2000, 200); const options: GridOptionsProp = { - onCellClicked: (params) => action('cell clicked')(params), + onRowHover: (params) => action('Row Hover')(params), }; return ; }; -export const onColumnHeaderClicked = () => { +export const onCellClick = () => { const data = useData(2000, 200); const options: GridOptionsProp = { - onColumnHeaderClicked: (params) => action('Header clicked')(params), + onCellClick: (params) => action('cell click')(params), + }; + + return ; +}; + +export const onCellHover = () => { + const data = useData(2000, 200); + const options: GridOptionsProp = { + onCellHover: (params) => action('cell Hover')(params), + }; + + return ; +}; + +export const onColumnHeaderClick = () => { + const data = useData(2000, 200); + const options: GridOptionsProp = { + onColumnHeaderClick: (params) => action('Header click')(params), }; return ; }; diff --git a/packages/storybook/src/stories/grid-pagination.stories.tsx b/packages/storybook/src/stories/grid-pagination.stories.tsx index 15e3c8905c81..0bea8666e499 100644 --- a/packages/storybook/src/stories/grid-pagination.stories.tsx +++ b/packages/storybook/src/stories/grid-pagination.stories.tsx @@ -1,11 +1,19 @@ import * as React from 'react'; -import { XGrid, ApiRef, useApiRef } from '@material-ui/x-grid'; +import { + ApiRef, + FeatureMode, + useApiRef, + XGrid, + PageChangeParams, + RowsProp, +} from '@material-ui/x-grid'; import Button from '@material-ui/core/Button'; import Pagination from '@material-ui/lab/Pagination'; import { action } from '@storybook/addon-actions'; import { array, boolean, number, withKnobs } from '@storybook/addon-knobs'; import { withA11y } from '@storybook/addon-a11y'; import { useData } from '../hooks/useData'; +import { getData, GridData } from '../data/data-service'; export default { title: 'X-Grid Tests/Pagination', @@ -42,7 +50,7 @@ export function PageSize100() { columns={data.columns} options={{ pagination: true, - paginationPageSize: 100, + pageSize: 100, }} />
@@ -50,7 +58,7 @@ export function PageSize100() { } export function PaginationKnobs() { - const data = useData(2000, 200); + const data = useData(100, 200); const rowsPerPageOptions = array('Rows per page options', ['10', '20', '50', '100', '200'], ', '); return ( @@ -59,9 +67,11 @@ export function PaginationKnobs() { columns={data.columns} options={{ pagination: true, - paginationPageSize: number('PageSize', 100), - paginationAutoPageSize: boolean('Auto page size', false), - paginationRowsPerPageOptions: rowsPerPageOptions.map((value) => parseInt(value, 10)), + pageSize: number('PageSize', 100), + page: number('Page', 1), + rowCount: number('RowCount', 2000), + autoPageSize: boolean('Auto page size', false), + rowsPerPageOptions: rowsPerPageOptions.map((value) => parseInt(value, 10)), hideFooterRowCount: boolean('Hide row count', false), hideFooterPagination: boolean('Hide footer pagination', false), hideFooter: boolean('Hide footer', false), @@ -79,7 +89,7 @@ export function HiddenPagination() { columns={data.columns} options={{ pagination: true, - paginationPageSize: 100, + pageSize: 100, hideFooterPagination: true, }} /> @@ -95,7 +105,7 @@ export function PaginationApiTests() { React.useEffect(() => { let unsubscribe; if (apiRef && apiRef.current) { - unsubscribe = apiRef.current.onPageChanged(action('pageChanged')); + unsubscribe = apiRef.current.onPageChange(action('pageChange')); } return () => { if (unsubscribe) { @@ -150,8 +160,8 @@ export function PaginationApiTests() { apiRef={apiRef} options={{ pagination: true, - paginationPageSize: myPageSize, - paginationAutoPageSize: autosize, + pageSize: myPageSize, + autoPageSize: autosize, }} components={{ pagination: ({ paginationProps }) => ( @@ -199,10 +209,101 @@ export function AutoPagination() { columns={data.columns} options={{ pagination: true, - paginationAutoPageSize: true, + autoPageSize: true, }} />
); } + +function loadServerRows(params: PageChangeParams): Promise { + return new Promise((resolve) => { + getData(params.pageSize, 10).then((data) => { + setTimeout(() => { + const minId = (params.page - 1) * params.pageSize; + data.rows.forEach((row) => { + row.id = (Number(row.id) + minId).toString(); + }); + resolve(data); + }, 500); + }); + }); +} + +export function ServerPaginationWithApi() { + const apiRef: ApiRef = useApiRef(); + const data = useData(100, 10); + const [rows, setRows] = React.useState([]); + const [isLoading, setLoading] = React.useState(false); + + React.useEffect(() => { + const unsubscribe = apiRef.current!.onPageChange((params) => { + action('onPageChange')(params); + setLoading(true); + loadServerRows(params).then((newData) => { + setRows(newData.rows); + setLoading(false); + }); + }); + return () => { + if (unsubscribe) { + unsubscribe(); + } + }; + }, [apiRef, data]); + + return ( +
+ +
+ ); +} + +export function ServerPaginationWithEventHandler() { + const apiRef: ApiRef = useApiRef(); + const data = useData(100, 10); + const [rows, setRows] = React.useState([]); + const [isLoading, setLoading] = React.useState(false); + + const onPageChange = React.useCallback( + (params) => { + action('onPageChange')(params); + setLoading(true); + loadServerRows(params).then((newData) => { + setRows(newData.rows); + setLoading(false); + }); + }, + [setRows, setLoading], + ); + + return ( +
+ +
+ ); +} diff --git a/packages/storybook/src/stories/grid-selection.stories.tsx b/packages/storybook/src/stories/grid-selection.stories.tsx index 6938e37fd782..05291c18f236 100644 --- a/packages/storybook/src/stories/grid-selection.stories.tsx +++ b/packages/storybook/src/stories/grid-selection.stories.tsx @@ -45,7 +45,7 @@ export const EventsMapped = () => { const data = useData(200, 200); const options: GridOptionsProp = { - onSelectionChanged: (params) => action('onSelectionChanged', { depth: 1 })(params), + onSelectionChange: (params) => action('onSelectionChange', { depth: 1 })(params), onRowSelected: (params) => action('onRowSelected')(params), }; diff --git a/packages/storybook/src/stories/grid-sorting.stories.tsx b/packages/storybook/src/stories/grid-sorting.stories.tsx index 87845a237dce..9c17c2d322c2 100644 --- a/packages/storybook/src/stories/grid-sorting.stories.tsx +++ b/packages/storybook/src/stories/grid-sorting.stories.tsx @@ -293,7 +293,7 @@ export const SortedEventsApi = () => { React.useEffect(() => { if (apiRef && apiRef.current != null) { - apiRef.current.onColumnsSorted((params) => handleEvent('ColumnsSorted', params)); + apiRef.current.onSortedColumns((params) => handleEvent('ColumnsSorted', params)); apiRef.current.on('sortModelUpdated', (params) => handleEvent('sortModelUpdated', params)); apiRef.current.on('postSort', (params) => handleEvent('postSort', params)); diff --git a/packages/storybook/src/stories/grid-streaming.stories.tsx b/packages/storybook/src/stories/grid-streaming.stories.tsx index d6094d35dff4..396cd4b58ead 100644 --- a/packages/storybook/src/stories/grid-streaming.stories.tsx +++ b/packages/storybook/src/stories/grid-streaming.stories.tsx @@ -22,7 +22,7 @@ export default { export const SlowUpdateGrid = () => { const options: GridOptionsProp = { - onSelectionChanged: (params) => action('onSelectionChanged', { depth: 1 })(params), + onSelectionChange: (params) => action('onSelectionChange', { depth: 1 })(params), onRowSelected: (params) => action('onRowSelected')(params), }; const rate = { min: 1000, max: 5000 }; @@ -37,7 +37,7 @@ export const SlowUpdateGrid = () => { }; export const FastUpdateGrid = () => { const options: GridOptionsProp = { - onSelectionChanged: (params) => action('onSelectionChanged', { depth: 1 })(params), + onSelectionChange: (params) => action('onSelectionChange', { depth: 1 })(params), onRowSelected: (params) => action('onRowSelected')(params), }; const rate = { min: 100, max: 500 }; @@ -52,7 +52,7 @@ export const FastUpdateGrid = () => { }; export const SingleSubscriptionFast = () => { const options: GridOptionsProp = { - onSelectionChanged: (params) => action('onSelectionChanged', { depth: 1 })(params), + onSelectionChange: (params) => action('onSelectionChange', { depth: 1 })(params), onRowSelected: (params) => action('onRowSelected')(params), }; const rate = { min: 100, max: 500 }; diff --git a/packages/storybook/src/stories/playground/customize-components.stories.tsx b/packages/storybook/src/stories/playground/customize-components.stories.tsx index 847a51946141..595fe3fcaeb0 100644 --- a/packages/storybook/src/stories/playground/customize-components.stories.tsx +++ b/packages/storybook/src/stories/playground/customize-components.stories.tsx @@ -130,7 +130,7 @@ export function CustomPagination() { apiRef={apiRef} options={{ pagination: true, - paginationPageSize: 50, + pageSize: 50, }} components={{ pagination: PaginationComponent, @@ -167,7 +167,7 @@ export function CustomFooter() { columns={data.columns} options={{ pagination: true, - paginationPageSize: 33, + pageSize: 33, hideFooterPagination: true, hideFooter: true, }} @@ -205,7 +205,7 @@ export function HeaderAndFooter() { columns={data.columns} options={{ pagination: true, - paginationPageSize: 33, + pageSize: 33, hideFooterPagination: true, }} components={{ diff --git a/packages/storybook/src/stories/playground/data-grid.options.stories.tsx b/packages/storybook/src/stories/playground/data-grid.options.stories.tsx index 7d8c62595d08..382b6e507ee8 100644 --- a/packages/storybook/src/stories/playground/data-grid.options.stories.tsx +++ b/packages/storybook/src/stories/playground/data-grid.options.stories.tsx @@ -19,22 +19,22 @@ export default { export const Options = () => { const data = useData(2000, 200); - const rowsPerPageOptions = array('paginationRowsPerPageOptions', ['25', '50', '100'], ', '); + const rowsPerPageOptions = array('rowsPerPageOptions', ['25', '50', '100'], ', '); const sortingOrder = array('sortingOrder', ['asc', 'desc', 'null'], ', '); const dataGridOptionsProp: DataGridOptionsProp = { - onRowClicked: (params) => action('onRowClicked')(params), - onCellClicked: (params) => action('onCellClicked')(params), - onColumnHeaderClicked: (params) => action('onColumnHeaderClicked')(params), + onRowClick: (params) => action('onRowClick')(params), + onCellClick: (params) => action('onCellClick')(params), + onColumnHeaderClick: (params) => action('onColumnHeaderClick')(params), onRowSelected: (params) => action('onRowSelected')(params), - onSelectionChanged: (params) => action('onSelectionChanged', { depth: 1 })(params), - onColumnsSorted: (params) => action('onColumnsSorted')(params), - onPageChanged: (params) => action('onPageChanged')(params), - onPageSizeChanged: (params) => action('onPageSizeChanged')(params), + onSelectionChange: (params) => action('onSelectionChange', { depth: 1 })(params), + onSortedColumns: (params) => action('onSortedColumns')(params), + onPageChange: (params) => action('onPageChange')(params), + onPageSizeChange: (params) => action('onPageSizeChange')(params), - paginationPageSize: number('paginationPageSize', 100), - paginationAutoPageSize: boolean('paginationAutoPageSize', false), - paginationRowsPerPageOptions: rowsPerPageOptions.map((value) => parseInt(value, 10)), + pageSize: number('pageSize', 100), + autoPageSize: boolean('autoPageSize', false), + rowsPerPageOptions: rowsPerPageOptions.map((value) => parseInt(value, 10)), hideFooterRowCount: boolean('hideFooterRowCount', false), hideFooterPagination: boolean('hideFooterPagination', false), hideFooter: boolean('hideFooter', false), @@ -54,14 +54,14 @@ export const Events = () => { const data = useData(2000, 200); const options: DataGridOptionsProp = { - onRowClicked: (params) => action('onRowClicked')(params), - onCellClicked: (params) => action('onCellClicked')(params), - onColumnHeaderClicked: (params) => action('onColumnHeaderClicked')(params), + onRowClick: (params) => action('onRowClick')(params), + onCellClick: (params) => action('onCellClick')(params), + onColumnHeaderClick: (params) => action('onColumnHeaderClick')(params), onRowSelected: (params) => action('onRowSelected')(params), - onSelectionChanged: (params) => action('onSelectionChanged', { depth: 1 })(params), - onColumnsSorted: (params) => action('onColumnsSorted')(params), - onPageChanged: (params) => action('onPageChanged')(params), - onPageSizeChanged: (params) => action('onPageSizeChanged')(params), + onSelectionChange: (params) => action('onSelectionChange', { depth: 1 })(params), + onSortedColumns: (params) => action('onSortedColumns')(params), + onPageChange: (params) => action('onPageChange')(params), + onPageSizeChange: (params) => action('onPageSizeChange')(params), }; return ; diff --git a/packages/storybook/src/stories/playground/options.stories.tsx b/packages/storybook/src/stories/playground/options.stories.tsx index c183e3b18f43..c1be91b0a6cd 100644 --- a/packages/storybook/src/stories/playground/options.stories.tsx +++ b/packages/storybook/src/stories/playground/options.stories.tsx @@ -19,7 +19,7 @@ export default { export const Options = () => { const data = useData(2000, 200); - const rowsPerPageOptions = array('paginationRowsPerPageOptions', ['25', '50', '100'], ', '); + const rowsPerPageOptions = array('rowsPerPageOptions', ['25', '50', '100'], ', '); const sortingOrder = array('sortingOrder', ['asc', 'desc', 'null'], ', '); return ( @@ -27,20 +27,20 @@ export const Options = () => { rows={data.rows} columns={data.columns} options={{ - onRowClicked: (params) => action('onRowClicked')(params), - onCellClicked: (params) => action('onCellClicked')(params), - onColumnHeaderClicked: (params) => action('onColumnHeaderClicked')(params), + onRowClick: (params) => action('onRowClick')(params), + onCellClick: (params) => action('onCellClick')(params), + onColumnHeaderClick: (params) => action('onColumnHeaderClick')(params), onRowSelected: (params) => action('onRowSelected')(params), - onSelectionChanged: (params) => action('onSelectionChanged', { depth: 1 })(params), - onColumnsSorted: (params) => action('onColumnsSorted')(params), - onPageChanged: (params) => action('onPageChanged')(params), - onPageSizeChanged: (params) => action('onPageSizeChanged')(params), + onSelectionChange: (params) => action('onSelectionChange', { depth: 1 })(params), + onSortedColumns: (params) => action('onSortedColumns')(params), + onPageChange: (params) => action('onPageChange')(params), + onPageSizeChange: (params) => action('onPageSizeChange')(params), autoHeight: boolean('autoHeight', false), pagination: boolean('pagination', true), - paginationPageSize: number('paginationPageSize', 100), - paginationAutoPageSize: boolean('paginationAutoPageSize', false), - paginationRowsPerPageOptions: rowsPerPageOptions.map((value) => parseInt(value, 10)), + pageSize: number('pageSize', 100), + autoPageSize: boolean('autoPageSize', false), + rowsPerPageOptions: rowsPerPageOptions.map((value) => parseInt(value, 10)), hideFooterRowCount: boolean('hideFooterRowCount', false), hideFooterPagination: boolean('hideFooterPagination', false), hideFooter: boolean('hideFooter', false), @@ -64,14 +64,16 @@ export const Events = () => { const data = useData(2000, 200); const options: GridOptionsProp = { - onRowClicked: (params) => action('onRowClicked')(params), - onCellClicked: (params) => action('onCellClicked')(params), - onColumnHeaderClicked: (params) => action('onColumnHeaderClicked')(params), + onRowClick: (params) => action('onRowClick')(params), + onRowHover: (params) => action('onRowHover')(params), + onCellClick: (params) => action('onCellClick')(params), + onCellHover: (params) => action('onCellHover')(params), + onColumnHeaderClick: (params) => action('onColumnHeaderClick')(params), onRowSelected: (params) => action('onRowSelected')(params), - onSelectionChanged: (params) => action('onSelectionChanged', { depth: 1 })(params), - onColumnsSorted: (params) => action('onColumnsSorted')(params), - onPageChanged: (params) => action('onPageChanged')(params), - onPageSizeChanged: (params) => action('onPageSizeChanged')(params), + onSelectionChange: (params) => action('onSelectionChange', { depth: 1 })(params), + onSortedColumns: (params) => action('onSortedColumns')(params), + onPageChange: (params) => action('onPageChange')(params), + onPageSizeChange: (params) => action('onPageSizeChange')(params), }; return ; diff --git a/packages/storybook/src/stories/playground/real-data-demo.stories.tsx b/packages/storybook/src/stories/playground/real-data-demo.stories.tsx index d05667136ad5..93c9c36b074b 100644 --- a/packages/storybook/src/stories/playground/real-data-demo.stories.tsx +++ b/packages/storybook/src/stories/playground/real-data-demo.stories.tsx @@ -22,26 +22,26 @@ export default { }; const getGridOptions: () => GridOptionsProp = () => { - const rowsPerPageOptions = array('paginationRowsPerPageOptions', ['25', '50', '100'], ', '); + const rowsPerPageOptions = array('rowsPerPageOptions', ['25', '50', '100'], ', '); const sortingOrder = array('sortingOrder', ['asc', 'desc', 'null'], ', '); return { - onRowClicked: (params) => action('onRowClicked')(params), - onCellClicked: (params) => action('onCellClicked')(params), - onColumnHeaderClicked: (params) => action('onColumnHeaderClicked')(params), + onRowClick: (params) => action('onRowClick')(params), + onCellClick: (params) => action('onCellClick')(params), + onColumnHeaderClick: (params) => action('onColumnHeaderClick')(params), onRowSelected: (params) => action('onRowSelected')(params), - onSelectionChanged: (params) => - action('onSelectionChanged', { + onSelectionChange: (params) => + action('onSelectionChange', { depth: 1, })(params), - onColumnsSorted: (params) => action('onColumnsSorted')(params), - onPageChanged: (params) => action('onPageChanged')(params), - onPageSizeChanged: (params) => action('onPageSizeChanged')(params), + onSortedColumns: (params) => action('onSortedColumns')(params), + onPageChange: (params) => action('onPageChange')(params), + onPageSizeChange: (params) => action('onPageSizeChange')(params), pagination: boolean('pagination', false), - paginationPageSize: number('paginationPageSize', 100), - paginationAutoPageSize: boolean('paginationAutoPageSize', false), - paginationRowsPerPageOptions: rowsPerPageOptions.map((value) => parseInt(value, 10)), + pageSize: number('pageSize', 100), + autoPageSize: boolean('autoPageSize', false), + rowsPerPageOptions: rowsPerPageOptions.map((value) => parseInt(value, 10)), hideFooterRowCount: boolean('hideFooterRowCount', false), hideFooterPagination: boolean('hideFooterPagination', false), hideFooter: boolean('hideFooter', false), diff --git a/yarn.lock b/yarn.lock index 1aa422f56514..c8c70b31f4e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3892,7 +3892,7 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^3.1.0", "@typescript-eslint/parser@^3.6.1": +"@typescript-eslint/parser@^3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.6.1.tgz#216e8adf4ee9c629f77c985476a2ea07fb80e1dc" integrity sha512-SLihQU8RMe77YJ/jGTqOt0lMq7k3hlPVfp7v/cxMnXA9T0bQYoMDfTsNgHXpwSJM1Iq2aAJ8WqekxUwGv5F67Q== @@ -4630,11 +4630,6 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-array-reduce@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/async-array-reduce/-/async-array-reduce-0.2.1.tgz#c8be010a2b5cd00dea96c81116034693dfdd82d1" - integrity sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE= - async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -7768,7 +7763,7 @@ escodegen@^1.11.1, escodegen@^1.12.0, escodegen@^1.14.1: optionalDependencies: source-map "~0.6.1" -eslint-config-airbnb-base@^14.1.0, eslint-config-airbnb-base@^14.2.0: +eslint-config-airbnb-base@^14.2.0: version "14.2.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4" integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q== @@ -7777,16 +7772,16 @@ eslint-config-airbnb-base@^14.1.0, eslint-config-airbnb-base@^14.2.0: object.assign "^4.1.0" object.entries "^1.1.2" -eslint-config-airbnb-typescript@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-8.0.2.tgz#465b17b0b1facdcca4fe23a5426bc27ab7b2b2f2" - integrity sha512-TCOftyCoIogJzzLGSg0Qlxd27qvf+1a3MHyN/PqynTqINS4iFy+SlXy/CrAN+6xkleGMSrvmPbm3pyFEku2+IQ== +eslint-config-airbnb-typescript@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-9.0.0.tgz#2524f3fa6fceb3df4ae191d1e1114a04fe54c6e6" + integrity sha512-BxckAZU4rwfOidZVucAO120fTSGQAugimS8HFp7OoiordpyNkq5bxSlTPZ2XxSY8Q2NWDIygqtJKqupZld/TXA== dependencies: - "@typescript-eslint/parser" "^3.1.0" - eslint-config-airbnb "^18.1.0" - eslint-config-airbnb-base "^14.1.0" + "@typescript-eslint/parser" "^3.6.1" + eslint-config-airbnb "^18.2.0" + eslint-config-airbnb-base "^14.2.0" -eslint-config-airbnb@^18.1.0: +eslint-config-airbnb@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.0.tgz#8a82168713effce8fc08e10896a63f1235499dcd" integrity sha512-Fz4JIUKkrhO0du2cg5opdyPKQXOI2MvF8KUvN2710nJMT6jaRUpRE2swrJftAjVGL7T1otLM5ieo5RqS1v9Udg== @@ -9256,13 +9251,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207" - integrity sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc= - dependencies: - is-glob "^3.0.0" - has-symbols@^1.0.0, has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" @@ -10259,7 +10247,7 @@ is-glob@^2.0.0: dependencies: is-extglob "^1.0.0" -is-glob@^3.0.0, is-glob@^3.1.0: +is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= @@ -10475,11 +10463,6 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-valid-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" - integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= - is-whitespace-character@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" @@ -12449,18 +12432,6 @@ marksy@^8.0.0: he "^1.2.0" marked "^0.3.12" -matched@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/matched/-/matched-1.0.2.tgz#1d95d77dd5f1b5075a9e94acde5462ffd85f317a" - integrity sha512-7ivM1jFZVTOOS77QsR+TtYHH0ecdLclMkqbf5qiJdX2RorqfhsL65QHySPZgDE0ZjHoh+mQUNHTanNXIlzXd0Q== - dependencies: - arr-union "^3.1.0" - async-array-reduce "^0.2.1" - glob "^7.1.2" - has-glob "^1.0.0" - is-valid-glob "^1.0.0" - resolve-dir "^1.0.0" - material-colors@^1.2.1: version "1.2.6" resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" @@ -16172,13 +16143,6 @@ rollup-plugin-dts@^1.4.7: optionalDependencies: "@babel/code-frame" "^7.8.3" -rollup-plugin-multi-entry@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-multi-entry/-/rollup-plugin-multi-entry-2.1.0.tgz#64a7287adfd437cab33bf6364a8d8ab1e7a7725d" - integrity sha512-YVVsI15uvbxMKdeYS5NXQa5zbVr/DYdDBBwseC80+KAc7mqDUjM6Qe4wl+jFucVw1yvBDZFk0PPSBZqoLq8xUA== - dependencies: - matched "^1.0.2" - rollup-plugin-postcss@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/rollup-plugin-postcss/-/rollup-plugin-postcss-3.1.2.tgz#e862033b96fabb73390fd4ccbee0155385d30e46"