From 85e9ff379947b23aa727b5860a40139df74cd729 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Wed, 18 Jan 2023 10:07:47 +0100 Subject: [PATCH 1/6] [doc] Add illustration to list and edit tutorials --- docs/EditTutorial.md | 2 ++ docs/ListTutorial.md | 24 ++++++++++++------- docs/img/edit-from-react-to-react-admin.webp | Bin 0 -> 45152 bytes docs/img/list-from-react-to-react-admin.webp | Bin 0 -> 43440 bytes 4 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 docs/img/edit-from-react-to-react-admin.webp create mode 100644 docs/img/list-from-react-to-react-admin.webp diff --git a/docs/EditTutorial.md b/docs/EditTutorial.md index 446fe4fe205..52414758037 100644 --- a/docs/EditTutorial.md +++ b/docs/EditTutorial.md @@ -13,6 +13,8 @@ React-admin provides many hooks and components to let you build custom user expe Edition views are very common in single-page apps. The most usual way to allow a user to update a record is to fetch the record from an API based on the URL parameters, initialize a form with the record, update the inputs as the user changes the values, and call the API to update the record with the new values upon submission. +[![From Pure React To React-Admin](./img/edit-from-react-to-react-admin.webp)](./img/edit-from-react-to-react-admin.webp) + To better understand how to use the various react-admin hooks and components dedicated to editing and creating, let's start by building such an edition view by hand. ### An Edition View Built By Hand diff --git a/docs/ListTutorial.md b/docs/ListTutorial.md index 0d19614635d..34da6a57a11 100644 --- a/docs/ListTutorial.md +++ b/docs/ListTutorial.md @@ -11,9 +11,17 @@ The List view displays a list of records, and lets users search for specific rec This tutorial explains the List view from first principles, and shows how react-admin allows you to reduce the amount of boilerplate code to focus on the business logic. -## Building A List View By Hand +## From Pure React To React-Admin -The List view fetches a list of records and renders them, together with UI controls for filter, sort and pagination. You've probably developed it a dozen times, and in fact you don't need react-admin to build, say, a book List view: +The List view fetches a list of records and renders them, together with UI controls for filter, sort and pagination. + +[![From Pure React To React-Admin](./img/list-from-react-to-react-admin.webp)](./img/list-from-react-to-react-admin.webp) + +To better understand how to use the various react-admin hooks and components dedicated to editing and creating, let's start by building such an edition view by hand. + +### A List View Build By Hand + +You've probably developed it a dozen times, and in fact you don't need react-admin to build, say, a book List view: {% raw %} ```jsx @@ -92,7 +100,7 @@ This example uses the `useGetList` hook instead of `fetch` because `useGetList` This list is a bit rough in the edges (for instance, typing in the search input makes one call to the dataProvider per character), but it's good enough for the purpose of this chapter. -## `` Displays Fields In A Table +### `` Displays Fields In A Table Table layouts usually require a lot of code to define the table head, row, columns, etc. React-admin `` component, together with Field components, can help remove that boilerplate: @@ -150,7 +158,7 @@ const BookList = () => { `` does more than the previous table: it renders table headers depending on the current sort, and allows you to change the sort order by clicking a column header. Also, for each row, `` creates a `RecordContext`, which lets you use react-admin Field and Buttons without explicitly passing the row data. -## `ListContext` Exposes List Data To Descendants +### `ListContext` Exposes List Data To Descendants `` requires a `data` prop to render, but it can grab it from a `ListContext` instead. Creating such a context with `` also allows to use other react-admin components specialized in filtering (``) and pagination (``), and to reduce the boilerplate code even further: @@ -206,7 +214,7 @@ const BookList = () => { ``` {% endraw %} -## `useListController` Handles Controller Logic +### `useListController` Handles Controller Logic The initial logic that grabs the records from the API, handles the filter and pagination state, and creates callbacks to change them is also common, and react-admin exposes [the `useListController` hook](./useListController.md) to do it. It returns an object that fits perfectly the format expected by ``: @@ -262,7 +270,7 @@ React-admin's List controller does much, much more than the code it replaces abo - it changes the current page if it's empty, - it translates the title -## ``: Component Version Of The Controller +### ``: Component Version Of The Controller As calling the List controller and putting its result into a context is also common, react-admin provides [the `` component](./ListBase.md) to do it. So the example can be further simplified to the following: @@ -301,7 +309,7 @@ const BookList = () => ( Notice that we're not handling the loading state manually anymore. In fact, the `` component can render a skeleton while the data is being fetched. -## `useListContext` Accesses The List Context +### `useListContext` Accesses The List Context Using the `` component has one drawback: you can no longer access the list context (`data`, `total`, etc.) in the component. Instead, you have to access it from the `ListContext` using [the `useListContext` hook](./useListContext.md). @@ -322,7 +330,7 @@ const Pagination = () => { } ``` -## `` Renders Title, Filters, And Pagination +### `` Renders Title, Filters, And Pagination `` is a headless component: it renders only its children. But almost every List view needs a wrapping `
`, a title, filters, pagination, a MUI ``, etc. That's why react-admin provides [the `` component](./List.md), which includes the `` component and a "classic" layout to reduce the boilerplate even further: diff --git a/docs/img/edit-from-react-to-react-admin.webp b/docs/img/edit-from-react-to-react-admin.webp new file mode 100644 index 0000000000000000000000000000000000000000..a241ded7078fb45e0988811ac71a3a675c4eda9a GIT binary patch literal 45152 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 `&-`TLWRCpNqcS z>JB=?JUvV4hR`NkPmJ)bNg^k9-O*~r@w7(*0PYEHV@6C+?FR+J3}OZK6IV4`@#d*$ z!o+E?7hXok0GHcT@x!6;hQS~tY>Fs*KDBh#8YEhXkwW%1?AMZbv}M+&AgyjwN2HW; z1?H=2ibJZyKB^3it5P4oKW4n%)`KR4_N5lSVz2&q{N^LCg zPz^kH)rik{s64!{0d|Bps}@lH{_h&nnLJRx=h&5mqo4o;7v^8Upa1{>0AqpX6;Qfa zQ3j~_Lu@+iK+(KG&_WsiC#?sVC;Her#<6G?C^pD2QFY`=NU3F)Z~y@0vxPta6DKY; zoML^@+sEkTGuLZk({VXwQjj<@slM+?XV(Gr2+3B8B9>^4r-KdorLNk>0a!@#RafXUH!s=!$SBob)@Hul^&URZzv zy44RZ!Bm*pA%W2g7op|Mb@BB5f{+TnGkS$B2Ju42oGWikXQoWV5!OBau!bDpZ@oTv zGJU^mcN7xiPV?Ffc=w&@)eL-VgSDFhPrejik3ga-?zfj?oHJ=oq@-zU1=7Ot?`Ta( z2myrPepI5m_PZi+^?5SOff4%<^Kai=DY1{1EoR(o{BkUSj#Nto1CS0mJ8_!e+u=~rv?1! zG)PHt3}&p9Rp|mH?!Hh_Q1=a&_M zxwY+f_GTntrYvS;H>UWre1gJ9az~>7dt-@37PWzkY%mHW6?&t3ogB`4h8w=j>ztLA z9d|j>Nbj(h`k9p_Xf;Z$-#63^F^8Fa;dFN9P}#)6Zu$W%mwl+ZY@Bh?lNpq#0Lzv) zex(rngVA~rFPGd!CmxpbvV*JGU@azuEdz$Q@K4p}{uj~~NjP)mgRQJqL><2b?SGa~ zG#nLj_ASl^Q-y=$w~BzxS2dJxTRfyT>W*|g2Xf8T0qhs-t9@z`kGxE#O{qHq7Z)C7 zhRq`DR5Lnx8KYuV6i3*gGjEJpyc!59U zuqcw)HDId}?L_Dz5aB6+@yHejm-Eym%YRd<`AzFfF~*{_560|zxmqTqD>-8dt=q-|0%u%sb!A%6=N8N z=21xi@v!wF-H-l$Y!VA(cU1!h3X`e0y6c;Ln-&-9mX7CZLY zzfK=+u3ngvuO5#6G)^KEE}26uu=9UDgfGktn$mQ18xx#Q8>!L{qKMlrl=y*qVH5=r z{(?5!CZ4a2)P3ebNqi6#DbH%C^5U3u8OWex*>??>ziknT1u86IjAbs$OKI*?llVIx zW>;NEAj@%59lNrHr$7+!*-Z*WJF#SP<%|Yg3j${^=9x9fUrd zwdi|3RbM$?>ULJ~`;l(d?lHP2j@)ggOaigW^r`zC>zIJn4>7iEQmOdJ$VIuBI#>gv zEMW|*uA6dW@5&lY{pO-zdvk9P=1oy{6eu<_qiv2!xt8T>9{!>RWVP0R6dep1WMTwV zuLTYi3g)>x%0zCY%a3jMvFn}fxyu`PN#9vH!q-n`>|mfUx+6KVpp}5tU*w4RnMF-i zJ*xgFd0YNt#+}7zxQZO5{Mq_(QEa_2jliLe9qGymuJ)n`5EGB{<0airQ^_UNg$ZN- zmb^wg?e}MB@eA5M(9sM z8ot)onU_7|c05I~_fNQp0mtA>1JsV3E0RB}_+rx)r>YNn;qPCEMnjV~=@|P}rN
0WMmRoR}eW95s&m;cZn+^M0FH=fO49s5LE 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
K5U!bDh%LlZ zSxD_F>JwO8nSqB;EKC5B{O&o_2c8SusRSO7bgl#HjbXput=oN>LRs4AOx{Hym38!# z+Cu!T=a@Fy77T#){?4a5L)CF$sdOk*tldYHVROq|v&F|_Gbnbfe zt(ClfjSw1S<4OcRYf|q{+Htxw+|0*Z<|F_B0}Dnc)~r&bX6~iMy1tR`9v?i{#FkX* z3()|>TTYX&E-bZwc-y;{Y8D?YJe9U1X_Qh8zf^N0rTq8KU8M9LkOSlVW06V9%mvdo z|MJ&*{buE9bse`6*ot|q#PgRX;FGaRUm@RX-*8C{opFhX-0E?-k~_;ANFpt91b6ox)qMGv4u(4#(UhVVGv<`J*9tA)s zBPCA$&GvNGg8Y!(HO5gSp0-7$>3XmVDu1mAISAz`p?nmD-&d@dz}RjUZRrK%aDp3o z5)=o@F0@9VRHt_hp(At8IM89_((fKtX_$B1J!e>(xshwL3bQ-egguU9Tp4qs4J3-`#|gCx1eYL!bVrdk#hxY_OR=(WAA=U;1Y+559C3p9CWaxeRLr{v|#vF4Y zHhZ6+=F+}Bfp{fVhP&8e1S=dto6FPptzRv~EUjlza72XHBp)Tvj^k#+K$W+dL|*P) zHGKNZRZ`{iRQ(g~KvO`ZV)XEH>t}&#VZN?E+fT`705Cvwjxdvtlqjbe+U4}(6d=bp z`LNm|ieV5v(emV-O1kq!>w+_29%4gO?(?&CR=&^{FO*Fd%LR#rNj5&J9Wm*2lc^Ry zW!BJMRvQ4jS2KU|)mcWJXJzH zR;fyBRB}70g`#Ad7$)|2R-JbpK^@nX-YW~`5GRDf@dY1*bMJ* z$P3r43EoIJ!U|Nu3~=T958$%8?;0 z*%>~w(lxRr7KPefCbDi^X6YZgp#t$ZOx)W}T3Mh|~=kcR3UR1n$JK*`6D zV~p`1V7|%oEl{Ff{0Ik0uGp7&+T(>4rR$?HoEMYX)y~=?C%&p-1?=cxHoob<^piaWhmPHULUFNgrC*I)Na0NkUHU zQ@})PNoE7s-mvPi;Qj@{1Y&=*&!ddausu<}c8MikX8kN}i+h2alHnB4SNmViAD#VA zWnys5vFp=U?3u2#Jj(X@IDVpBJa_-+8Q!5q_F9QDWmztSw~^3t?zJO>8lIj zSO^r4rvc(q4$)lt5E=jkKZTp=uP9^lykx}A*aw?=3|%6Uw2NCRpX!wwFf?0R zHsJY;qi<)m^hopUwbqmFgF~kpwBA(hwspA%PKl_nZ>W!A+Y#qm8&n~eVICP%S=dX# z=Gt7@6D~Zs%{FFgT%fxZ)L%9?`P)uyuAuD3iOg9nHJ%jvsg8wp^e5Y~p#7jI_H%pL zH$1VhG@EZ|ydsFaS2U43uyi1;M$V6UcFgH2yxgr>n@O?Q@h|0hvU69JyIBPi7bZdA;2hVu2mivxNlA{!-W8uTs zI^A_}6$Or+Cv42fwVC8%rrVCmdJFW596=!5IljIyn!2#C*%=iSZ?!S`|I8-7)~mG& zVC^p@m!uN(^S&^}KgbRZn;(5g=MbDBhHVjoZx8eqxJLGDEnzv_j*z32m{mWXO^3wZ zHeij*d8gZIJ`d4*V4Az#^y*cB$ALdU3hS!WFM%WO8YEI@rfNl&VOQkh#h;(Ahhk>5 zdNA4==f^wNHCS6Vt>AxO@_XEcv%wIGNn?BZL&Y)%70pfK8%mra|J|ioy04=;tI_l9 zRRV$De7qT{oezTzZR|h+3B9KNvX>zU_pCrtLEukbk2CdjJWDYByTO6d83Ituzt&`y zTg*u)005`61Y2l)BE~;(#?aryM1OK_C}F~6!&1uWGI@i^Rk@}O3lcr?a5N4spk*p7%ACnmQW4|m+$0kZMp(xoN9Ln|VVoQ$`=_}y zIJ0+P+_p}@!gFpSu)ZPcijxt9@C0-5$3J&T^?B)*&ep?+Ml)1D@-KRZg4Ci5=emTY zj7f6fo24;mZ5Lk_hfD)Y`I(HV;^(a@Z4sfd*NM(?3tpX=Gjl#>a|XNOQh z6$@$D>YIqQ_s2h2ORTzbmxA8)Hg-^+8D1fVJ;Oy3P2?;@`-ShYqX-xO$B5A;V|=K( zCv0xe4DUMT8Q`s?+7>_ z6U-|@M71Ziox@!18^hRDxy$B@JJtz+kmxtyI?U>HU-Z;Cd=c6&N)f>|**__;H^mzj zA?zdQHj0`2J1SA7Ai{|A5!|QNz2rcBRV|naav;SIfC6_}-LHPoWD8t+0{xC}mMF&S zOw%&@mvU$g`TM8s zD2Fv!A7LFpxBj@|jqZu^7=pw!y4Vu;y$Og=sZKOGgu@c3w z=Gz0~@Po)WKW1{nHIM`Wc5`>-dGQdy@v1JNl1uW4CTGc;OzeD|<^qB}y2>~sCV>`= z#bxFaPjlj|007L-G4IPmKZmpGJ5L*SH{h>Sn!^9^z57ya{)Dbg~5CF zU!uhohi%{X7?ehX{T&fF)Ol!1klRo9ZY=^^W+AA)ROLW}kuScdos zNpuUDjN5pyt<;d?F3}dhZiB!e8)0VE$+}WSwJ_$_b0?i7g@?3{!{uG0jW+B{l9in! zhLnE?wIkZGB&ff0>Z(e%t#%YBy`7NjzXwkvNQ@%T_C1Rv*UWegynHOBlot_jn+k(E zLH#@VNR{_>_rkn9jeBQNpLE9AFLX}0^vw*M6@X12i@%tuSp>n((c%(N4-i*s&z&z$ z(4`oiyh+WlG&3nwg@SX94gYD_uVl7Y)VCb@v!^_Iy^~+g1IbCT$cVRjRFYcBvtECd zz5>NbeZTM$OLEwnGp}o?OK>y%(PXS{m*2eAISY-DLyS#5kT88~w8Ff5Y_6xb{p=YT zQ&it5;p?Xby?0kaW7=?hrqxi#FQSbkp+hcui@yYvkda_$g^YOlGCFprR+Ho;RC&K2 z5FhcV?w{+A>vQIx@ACqcwC?rT1JyIu2r38+(+zjr$Ij|PhJ1Z7h3LwA5U<)tBtU)| zH*MbJWEavQHU{?uH!+ROEIqZ9Ixx!%-kDgwU#`-gIklZGnmxNSdrOfgv$ zv?a`ZI0kR^w6?e@jvQrr*Bg}B?yl#O2$6j_Y=Hz0WL9@y9c8>=69Sg4cZ2a){cu4;50ldA#tqs4egog9$r^}di23Ubsqm8 zuEEm9!CwFXb$3Me3@rcp;Lzox#s#;~gjp$xY+E7kDKm9WCxA`es_w>5pEWFx-nfsA zun;4bXFIfbVI_lKXJd8G==GkN$=7mLT{u^prFp!~kES5=?mbC`Ba%KM81wjlrBS$$ zvb~~k@k<_$=O7C*Uc_XRo05-HHQNTBR%^pdK#>e_G%VY25k?vYcH#ho0TV&3Qs^vzg%f`dHZO8wIb?dgwxgqQGRJoXQ(b z$xT^YCsG3+$t1Ux@0d<%jwN!3dl=S^-(Sj-y3q>@vYsibg}qF+UGF_<;p^^iqO9^@ z%VDnpJ5I{20bXJy)!7S0$NC{Hm7x03b--xaC3raiDydw>OyiNG5{^WI-j#=3m|Z*G z0l$2>%<<$YExL~A&bw*Lk))nd`=HOvK~A0sKvhq5~gM8DWr+nf6Off zr$1b=WD~iXjq|OT;nIlLfe0!JmHpl*5dPQgL^F$AsWjbbHOcv*wXE?ztUz&hfi6{H zF+o}nhf|aZJ0_!^;hJ=XVu4uG6~#&IL;#0IOH(>wE@KT7FeoHSjDxFs{&Z0+iT)45 z_F$dwd-4i9)JtDiqv)#x+5L(~D(5Ib01Pbi7Ah2N6DaWmINge3(I@ukhAe;Sf?x*# zoNaTYZt17`LuLuR!NQPq5L9s~=aHZ)R#Lt>v3`t{US*QNaE>i`V=~R-!4j6Xb71s^ zk1Z31biAIZIS51V>XuewM-iZ6w7e{YKB@9`vtv{3MEd1+db#finY1_EGbY-<&lJ8J zoKjF_7nXRL-E3)Kz9>9QBQA+)#=3}9cBaJWe{Oq)4g8K79fB*;>hf+`g0o~mdl7}SV7$CaH+fPsn4x|O8-c%|JI8;FAwffByJWJ6%{QA1z zH#AnE7j6dyx6fvK+rZ$UfPbH~f%r_n3A0FeX-ut=;ch$n!i zU5!=7R;2>dFaF4Y01~ofeXq5)mC&`>=0_B_`?h_yi1Qtt!2##!Wvgtg$8N2SgI6}5 zn3@DCzAs?*X#=C8W5H7>}pIX2%`lE<`SQ-bdwfOMi@m> zYBErtVOd@V=zuWfLDlFRNAU6E#4u$Cl_ z-lnl8-^M$?u~)*~i*Ea~ZLOGjk-Z#_S#{S6!GKh(r_uW^T86+@xEBRQ3mvfSJF}Q(uxeJh5RhjTA6K}1buQb4vt>1Ne$-7 z3}eBu^`u~B!PmGaHMMnSAGygDlf}PGy;>WJ>ohthe|RkcVIJMDm#3>zPU{J1vfz1R z(ex_*HQNeHM*gb1Lf}l4l!mK>B19aJ980**G({`H0z$Ol)W3M;+O?vo?sJ0(EF?vk zPII#Av|}Gog!yZ`_tWjVac8yz(5 z{^p#RXR#_062U>xijp@74L{h3^0*5(nPQgq%E^XTbD&{SCD8KY*n4{QR@!tYI^vtn zY@SAdSOs<4hh6|yasp}j0MN9SoQdEiwEV6;xO<#Q{(GNZnK}mnE1)PWcxpfK1j}DR zD0l;Ctsj8PoaH=<1tML7&#=*pKf9`?z6ZYFCU+ngr>=G8Nedi3CXLo-H(-eNaS->R zLof?11PFMd7{d!-eW6SN_%T_(MhmNt(>EG`m`$!_FJIX}9R~^|UxB>Hkx&2uPhw{S z7Sx7at`3^%30nBp<3WUCLVndXF%E6!%;LspFvIaSlm$up@YQ;O3Jn9IN|k*gxE5r$ z1F4bm^|7ZJ{}gK3@8kk^!8zrnLNi6d_qLWKUoLZu`y@Qy4`_wtjGZ7kE#s!ED%{nB zo41-KlunrBoPPUIW=_K}&~h>OGb%1YFFhNU^AJ9|BCc%}3?{>a|Y z90As~88pIqW1l}`<0Zu}ft58E5`Z8oSVhqiEac|+aL??pO)z&65E>} z2=s;#?@#NJq^WkemHGwtjiX$D6Ka;9`gSNlF5$=zO3o$ESH32B#u-LEBf7}H<8-nC z{ZJQ+RCs+{6tW=_5bNYvV(V5fD*?a*Wy?`KPqJ2-&oq~aG>5~V&XT}r)31`f)z*@V z3lhkPxoR9xP}Q)iR*LV*C7o&+G*Vu}2ic9jmY5Qc(`&pu9mX7JGdtl()z0#3bD>Op zg3s7+l7hi~zgOC~C;ve%mUB;N$)HDGkj(=3frUvKSz%auzQBM^0Ils%&@a^=XDK0^ z%`gSTe^hiFb%ROo%WBWQnf-RZUY76_$LJ8A+I19t!m?2y@?_PqyCG(`v3-9s{b3Uzo4wSOVw3QG^0dC%byTkP-;r}aQj_~>qy1sF`iIJEmGt5?;`9%#;|T`-pWty=ARFMt&|KBS z9I|V`F({^iGfF4m%yG_unrQluRqW;IL@K(>;I~UV`d5jqngFQIk;jRkMBOrGN4&1; z{dd@F>*wu1u>e10v4;gJ`yNI%En$tOLCJv)A|8?^ckc}?pi&GqzeY9`TD4xtavoW( zJ(>z_EkQK?EIGe-uT~?kDdi!HrkF1U9HWNVwYcXjJps!8WFz?)_k`6gZ06drdCfs3RU7$rAwkhRSpS>jso0Hm1qFU|IU{^L8wIcU=#IN_@6*S8;s7ou!>$z3;3xu#??f-5 zCq0gJT;GkSFht3lK!8%9M&j%`ShySj01mFhQj_8i&U>ugjUUOd5fk)Mr*qw7pzy}W z1RD3e-KQ>NX_d%`-Ipf+`F54EacCm$a$Pd2KrEao$Xw ztvq|?kst#~UR*MU^lFZ-v!rbL)Usim%8Dhxv!89q8vZ*udzFBb_Y^Y= zlOqL~bx0OY4=GY@chTvlJ(qNhbpg_X?U0a-w`;$JK}jfJUXvdvD5BTS-TWmcvQq9b zgtD90=RXUxLS(h%gfzqJlO%5HfsV_-z=bRNPR5+*9FJkbeYx@r*~1xgn2-Pk)tHF6 zI7b&ptNt3?2+r7Mz?KR#Ih%n47>FE(x!<;tTAAkTr|;xOb^sH^*y>fa7P}Bfcl7Xq ztiHQuPyrJ&tCj!&LdloRfKI*aB^BZUQM0Yy7Vv9NhE*Xd$U6S>cP~az#SWv_>Gb@X z)FVk6i%ma{`!emNy7R9RMiAzEiY;fed)QrJNp=>?+yD*vuze-Tv4O1XtLKcHAuzTv zg~qMjV3KC{;x`p3#hRYnggs^*DcJfIM97^4n z6I-md?*b0_$~vciqbPbTz&Y|v3Cz}#wW`V84bUewkNDqe>V_F_t@*U$2 zAu*0Bz?uZN}fok zPEG6TSPrC-J}0M-68I}@7e^nJXA$>f?`jXExUbX*IPSLgk^8zxwXLKSx}kqAGoVJJ znNO@X<7+VJE0s%w#x&V>o9`3ZU_^?7d9m`;at{JC{WdG$01mF{REP4LG5`SW5I6&V zDRIwC&5gAyW2Eu}ivUKmc-O`=^ZK-qx|~rrXOi*Ci_{81UHBLLg9|frXJvZ)L1J*3 zJ{gaB)vWmISnlNJ1({Siq}0QaP_^vnQHv&)IOVrJ&&ZXWU%nkWxGZt#X=eWx>9yUA zx_#1R%{3*hqmH;LULg>Y8Xpa!&DGIhByntLEw5%&OFI>DX~aSn^v+Cg?orJv!bd%n z%Ri9oDnS}{fh-cNq|c^5Fx{mO@_VWdZ3#w?W0@rZ_e!@DIr4RS@UkaTA-Kz=6mG=k zGs=p+jtgfDRe79%5()|pNvsuL4}+3V*m&PT19(xx0=IIx0zM}3y*Yn8J$r?o-k*;Yo+sfQ6Mzbqm;Ai~O9i!iR@IpDDi z3PKP44Zn}h$O3b`29i4-zpK0RYWbJb9Sk5XrrrbC|$c0_>#OH+_P~Ej?1KC1UAALlGbh*Qi7nb;zka_V!5&NsU z+(E|6Jlv&DIZ3Z0;5-49srWc81~wO7cH->zXCilx6EVHDs{ki6Cw87yrRLZUrO7Lf z@k_)|iw;y7eA|o&xL|?v5Np=Bt8gIy!O}E>Cj!5EIb(p}o?y0Ff#~$JU_odBcw!+I6rgp2 zT`BS;NarR*gYraG_PyYhb6^O{xBaV zOD%%H+W1LXCp2_KGdC_`R->hRuBE5|0h69!xg1G34eC+_08jt` zHtl5n{5NXQB;wm3?T6&(;Jm3z0zp&ca3jUtti%c8z-=OJvQu{Es~?ra?R!C|8UfRaAT|FR$e1gx2lxQ33s zH_bbwm3Gr^FqRpiCUdMM@uwvn^C{US001GO%+|mF8u~R@h69^u15br&MA>w@-&U~w zQF2_IIei_?IlK=%RKs@?`w9`hYNsi^P@l@gejx6Nz||NZD@6hJ_P=!kW5N-@K6HK? zy#XTdBsc_~Yc>FFj=*BGeFkNIg8}WP#GvMi^#2770vWMO%SqcD7z0ZoU z00T2U@h#KLzP_9+K?7YjhgsVNGOdF8Tc%tll>2S9yeU&9&1N023B~i;al!mJR&*uz z$;=x7;bRuPu%hBUH0e+Og`(btgVr20siqYvGibZ+sxva!dgF3!z?o!1fvsKm~LRg)u^{w^GAl~_O}pO^ME|=ZWq=1>gRdWlG(BWYg%TwDO<*?v3HhmQ22FKH@IrtSf|DSttj!Z-5kpDn%00YZRxnj>KpcQo z)VZm1Qs$-2OPZH8E^1uVxv6tu{}R*d_%W+gge_OQkFb)L4xGw|d;kC&*kqFs6!NE; z(4+akRS>073RMuLQ3_QMTv9fos;C?s9gM>2CYycO0005SdtCkVB?0W?(E&TGw=4CP z{eeIL3oRa+w{Ney9Isaw`ZT$zb+1VYa_6UdHH}gyxw+`Lf4({r%G<+KKmY&$0H=GP AzW@LL literal 0 HcmV?d00001 From 72e38eab21950be362eba94f2ff428168a69d669 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Wed, 18 Jan 2023 11:02:35 +0100 Subject: [PATCH 2/6] Use diff to emphasize changes --- docs/ListTutorial.md | 138 ++++++++++++++++++++++++++++++------------- 1 file changed, 96 insertions(+), 42 deletions(-) diff --git a/docs/ListTutorial.md b/docs/ListTutorial.md index 34da6a57a11..bdd6dff1780 100644 --- a/docs/ListTutorial.md +++ b/docs/ListTutorial.md @@ -104,26 +104,30 @@ This list is a bit rough in the edges (for instance, typing in the search input Table layouts usually require a lot of code to define the table head, row, columns, etc. React-admin `` component, together with Field components, can help remove that boilerplate: -```jsx +```diff import { useState } from 'react'; -import { Title, useGetList, Datagrid, TextField } from 'react-admin'; +-import { Title, useGetList } from 'react-admin'; ++import { Title, useGetList, Datagrid, TextField } from 'react-admin'; import { Card, TextField, Button, Toolbar, +- Table, +- TableHead, +- TableRow, +- TableBody, +- TableCell, } from '@mui/material'; - const BookList = () => { const [filter, setFilter] = useState(''); const [page, setPage] = useState(1); const perPage = 10; - const sort = { field: 'id', order: 'ASC' }; const { data, total, isLoading } = useGetList('books', { filter: { q: filter }, pagination: { page, perPage }, - sort, + sort: { field: 'id', order: 'ASC' } }); if (isLoading) { return
Loading...
; @@ -140,12 +144,32 @@ const BookList = () => { margin="dense" /> - - - - - - +- +- +- +- Id +- Title +- Author +- Year +- +- +- +- {data.map(book => ( +- +- {book.id} +- {book.title} +- {book.author} +- {book.year} +- +- ))} +- +-
++ ++ ++ ++ ++ ++
{page > 1 && } @@ -163,19 +187,20 @@ const BookList = () => { `` requires a `data` prop to render, but it can grab it from a `ListContext` instead. Creating such a context with `` also allows to use other react-admin components specialized in filtering (``) and pagination (``), and to reduce the boilerplate code even further: {% raw %} -```jsx +```diff import { useState } from 'react'; import { Title, useGetList, Datagrid, TextField, - ListContextProvider, - FilterForm, - Pagination, - TextInput ++ ListContextProvider, ++ FilterForm, ++ Pagination, ++ TextInput } from 'react-admin'; -import { Card } from '@mui/material'; +-import { Card, TextField, Button, Toolbar } from '@mui/material'; ++import { Card } from '@mui/material'; const BookList = () => { const [filter, setFilter] = useState(''); @@ -190,25 +215,37 @@ const BookList = () => { if (isLoading) { return
Loading...
; } - const filters = []; - const filterValues = { q: filter }; - const setFilters = filters => setFilter(filters.q); ++ const filters = []; ++ const filterValues = { q: filter }; ++ const setFilters = filters => setFilter(filters.q); return ( - -
- - <FilterForm filters={filters} /> - <Card> - <Datagrid> - <TextField source="id" /> - <TextField source="title" /> - <TextField source="author" /> - <TextField source="year" /> - </Datagrid> - </Card> - <Pagination /> - </div> - </ListContextProvider> ++ <ListContextProvider value={{ data, total, page, perPage, setPage, filterValues, setFilters, sort }}> + <div> + <Title title="Book list" /> +- <TextField +- label="Search" +- value={filter} +- onChange={e => setFilter(e.target.value)} +- variant="filled" +- size="small" +- margin="dense" +- /> ++ <FilterForm filters={filters} /> + <Card> + <Datagrid data={data} sort={sort}> + <TextField source="id" /> + <TextField source="title" /> + <TextField source="author" /> + <TextField source="year" /> + </Datagrid> + </Card> +- <Toolbar> +- {page > 1 && <Button onClick={() => setPage(page - 1)}>Previous page</Button>} +- {page < total / perPage && <Button onClick={() => setPage(page + 1)}>Next page</Button>} +- </Toolbar> ++ <Pagination /> + </div> ++ </ListContextProvider> ); }; ``` @@ -218,10 +255,12 @@ const BookList = () => { The initial logic that grabs the records from the API, handles the filter and pagination state, and creates callbacks to change them is also common, and react-admin exposes [the `useListController` hook](./useListController.md) to do it. It returns an object that fits perfectly the format expected by `<ListContextProvider>`: -```jsx +```diff +-import { useState } from 'react'; import { Title, - useListController, +- useGetList, ++ useListController, Datagrid, TextField, ListContextProvider, @@ -232,13 +271,28 @@ import { import { Card } from '@mui/material'; const BookList = () => { - const listContext = useListController(); - if (listContext.isLoading) { - return <div>Loading...</div>; - } +- const [filter, setFilter] = useState(''); +- const [page, setPage] = useState(1); +- const perPage = 10; +- const sort = { field: 'id', order: 'ASC' }; +- const { data, total, isLoading } = useGetList('books', { +- filter: { q: filter }, +- pagination: { page, perPage }, +- sort, +- }); +- if (isLoading) { +- return <div>Loading...</div>; +- } ++ const listContext = useListController(); ++ if (listContext.isLoading) { ++ return <div>Loading...</div>; ++ } const filters = [<TextInput label="Search" source="q" size="small" alwaysOn />]; +- const filterValues = { q: filter }; +- const setFilters = filters => setFilter(filters.q); return ( - <ListContextProvider value={listContext}> +- <ListContextProvider value={{ data, total, page, perPage, setPage, filterValues, setFilters, sort }}> ++ <ListContextProvider value={listContext}> <div> <Title title="Book list" /> <FilterForm filters={filters} /> From 24ce54b9852495afe547f82f9187c376df72c360 Mon Sep 17 00:00:00 2001 From: fzaninotto <fzaninotto@gmail.com> Date: Wed, 18 Jan 2023 12:41:43 +0100 Subject: [PATCH 3/6] Use diff for list tutorial --- docs/ListTutorial.md | 97 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 76 insertions(+), 21 deletions(-) diff --git a/docs/ListTutorial.md b/docs/ListTutorial.md index bdd6dff1780..972809a4826 100644 --- a/docs/ListTutorial.md +++ b/docs/ListTutorial.md @@ -104,6 +104,7 @@ This list is a bit rough in the edges (for instance, typing in the search input Table layouts usually require a lot of code to define the table head, row, columns, etc. React-admin `<Datagrid>` component, together with Field components, can help remove that boilerplate: +{% raw %} ```diff import { useState } from 'react'; -import { Title, useGetList } from 'react-admin'; @@ -179,6 +180,7 @@ const BookList = () => { ); }; ``` +{% endraw %} `<Datagrid>` does more than the previous table: it renders table headers depending on the current sort, and allows you to change the sort order by clicking a column header. Also, for each row, `<Datagrid>` creates a `RecordContext`, which lets you use react-admin Field and Buttons without explicitly passing the row data. @@ -255,6 +257,7 @@ const BookList = () => { The initial logic that grabs the records from the API, handles the filter and pagination state, and creates callbacks to change them is also common, and react-admin exposes [the `useListController` hook](./useListController.md) to do it. It returns an object that fits perfectly the format expected by `<ListContextProvider>`: +{% raw %} ```diff -import { useState } from 'react'; import { @@ -310,6 +313,7 @@ const BookList = () => { ); }; ``` +{% endraw %} Notice that `useListController` doesn't need the 'books' resource name - it relies on the `ResourceContext`, set by the `<Resource>` component, to guess it. @@ -328,37 +332,48 @@ React-admin's List controller does much, much more than the code it replaces abo As calling the List controller and putting its result into a context is also common, react-admin provides [the `<ListBase>` component](./ListBase.md) to do it. So the example can be further simplified to the following: -```jsx +```diff import { Title, - ListBase, + useListController, Datagrid, TextField, +- ListContextProvider, ++ ListBase, FilterForm, Pagination, TextInput } from 'react-admin'; import { Card } from '@mui/material'; -const filters = [<TextInput label="Search" source="q" size="small" alwaysOn />]; ++const filters = [<TextInput label="Search" source="q" size="small" alwaysOn />]; -const BookList = () => ( - <ListBase> - <div> - <Title title="Book list" /> - <FilterForm filters={filters} /> - <Card> - <Datagrid> - <TextField source="id" /> - <TextField source="title" /> - <TextField source="author" /> - <TextField source="year" /> - </Datagrid> - </Card> - <Pagination /> - </div> - </ListBase> -); +const BookList = () => { +- const listContext = useListController(); +- if (listContext.isLoading) { +- return <div>Loading...</div>; +- } +- const filters = [<TextInput label="Search" source="q" size="small" alwaysOn />]; + return ( +- <ListContextProvider value={listContext}> ++ <ListBase> + <div> + <Title title="Book list" /> + <FilterForm filters={filters} /> + <Card> + <Datagrid> + <TextField source="id" /> + <TextField source="title" /> + <TextField source="author" /> + <TextField source="year" /> + </Datagrid> + </Card> + <Pagination /> + </div> +- </ListContextProvider> ++ </ListBase> + ); +}; ``` Notice that we're not handling the loading state manually anymore. In fact, the `<Datagrid>` component can render a skeleton while the data is being fetched. @@ -388,6 +403,46 @@ const Pagination = () => { `<ListBase>` is a headless component: it renders only its children. But almost every List view needs a wrapping `<div>`, a title, filters, pagination, a MUI `<Card>`, etc. That's why react-admin provides [the `<List>` component](./List.md), which includes the `<ListBase>` component and a "classic" layout to reduce the boilerplate even further: +```diff +import { +- Title, +- ListBase, ++ List, + Datagrid, + TextField, +- FilterForm, +- Pagination, + TextInput +} from 'react-admin'; +-import { Card } from '@mui/material'; + +const filters = [<TextInput label="Search" source="q" size="small" alwaysOn />]; + +const BookList = () => ( +- <ListBase> +- <div> +- <Title title="Book list" /> +- <FilterForm filters={filters} /> +- <Card> ++ <List filters={filters}> + <Datagrid> + <TextField source="id" /> + <TextField source="title" /> + <TextField source="author" /> + <TextField source="year" /> + </Datagrid> +- </Card> +- <Pagination /> +- </div> +- </ListBase> ++ </List> +); +``` + +## A Typical React-Admin List View + +Remember the first snippet in this page? The react-admin version is much shorter, and more expressive: + ```jsx import { List, @@ -411,7 +466,7 @@ const BookList = () => ( ); ``` -Now compare this code snippet with the first snippet in this page: it's much shorter, and more expressive! By encapsulating common CRUD logic, react-admin reduces the amount of code you need to write, and lets you focus on the business logic. As you've seen with the List controller and context, there is no magic: it's just standard React hooks and components designed for B2B apps and web developers with deadlines. +By encapsulating common CRUD logic, react-admin reduces the amount of code you need to write, and lets you focus on the business logic. As you've seen with the List controller and context, there is no magic: it's just standard React hooks and components designed for B2B apps and web developers with deadlines. ## `<ListGuesser>`: Zero-Configuration List From d68f9eab5fe6aa44696d03e6d42b5545227249fb Mon Sep 17 00:00:00 2001 From: fzaninotto <fzaninotto@gmail.com> Date: Wed, 18 Jan 2023 12:45:03 +0100 Subject: [PATCH 4/6] Fix typo --- docs/ListTutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ListTutorial.md b/docs/ListTutorial.md index 972809a4826..8972041c119 100644 --- a/docs/ListTutorial.md +++ b/docs/ListTutorial.md @@ -19,7 +19,7 @@ The List view fetches a list of records and renders them, together with UI contr To better understand how to use the various react-admin hooks and components dedicated to editing and creating, let's start by building such an edition view by hand. -### A List View Build By Hand +### A List View Built By Hand You've probably developed it a dozen times, and in fact you don't need react-admin to build, say, a book List view: From 6a0d0ace01618d3ffd03fd400dd78707cfcc7c45 Mon Sep 17 00:00:00 2001 From: Francois Zaninotto <francois@marmelab.com> Date: Mon, 23 Jan 2023 18:12:17 +0100 Subject: [PATCH 5/6] Update docs/ListTutorial.md Co-authored-by: Jean-Baptiste Kaiser <jb@marmelab.com> --- docs/ListTutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ListTutorial.md b/docs/ListTutorial.md index 8972041c119..b77f768b31b 100644 --- a/docs/ListTutorial.md +++ b/docs/ListTutorial.md @@ -335,7 +335,7 @@ As calling the List controller and putting its result into a context is also com ```diff import { Title, - useListController, +- useListController, Datagrid, TextField, - ListContextProvider, From ce3e45475424e511cc6730bceb17e14274307cb1 Mon Sep 17 00:00:00 2001 From: fzaninotto <fzaninotto@gmail.com> Date: Mon, 23 Jan 2023 18:15:23 +0100 Subject: [PATCH 6/6] Review --- docs/ListTutorial.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/ListTutorial.md b/docs/ListTutorial.md index b77f768b31b..e7d688d77a7 100644 --- a/docs/ListTutorial.md +++ b/docs/ListTutorial.md @@ -111,7 +111,7 @@ import { useState } from 'react'; +import { Title, useGetList, Datagrid, TextField } from 'react-admin'; import { Card, - TextField, + TextField as MuiTextField, Button, Toolbar, - Table, @@ -136,7 +136,7 @@ const BookList = () => { return ( <div> <Title title="Book list" /> - <TextField + <MuiTextField label="Search" value={filter} onChange={e => setFilter(e.target.value)} @@ -201,7 +201,7 @@ import { + Pagination, + TextInput } from 'react-admin'; --import { Card, TextField, Button, Toolbar } from '@mui/material'; +-import { Card, TextField as MuiTextField, Button, Toolbar } from '@mui/material'; +import { Card } from '@mui/material'; const BookList = () => { @@ -224,7 +224,7 @@ const BookList = () => { + <ListContextProvider value={{ data, total, page, perPage, setPage, filterValues, setFilters, sort }}> <div> <Title title="Book list" /> -- <TextField +- <MuiTextField - label="Search" - value={filter} - onChange={e => setFilter(e.target.value)}