From 18a05c2d3a4a55d5281a7aa5f09d9f1540de80f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Skr=C3=B8vseth?= Date: Mon, 11 Nov 2024 11:35:08 +0100 Subject: [PATCH] Status page --- frontend/bun.lockb | Bin 122384 -> 131091 bytes frontend/bunfig.toml | 2 + frontend/package.json | 11 ++- .../status-loading.tsx} | 2 +- .../status-page-loader.tsx} | 16 ++-- .../status-page.tsx} | 8 +- .../kvittering.tsx => status/status.tsx} | 2 +- .../innlogget/status/timeline-item.test.tsx | 12 +++ .../case/innlogget/status/timeline-item.tsx | 72 ++++++++++++++++++ frontend/src/routes/routes.tsx | 5 +- frontend/src/utils/bun-test-setup.ts | 3 + frontend/src/utils/test-utils.tsx | 8 ++ 12 files changed, 121 insertions(+), 20 deletions(-) create mode 100644 frontend/bunfig.toml rename frontend/src/components/case/innlogget/{kvittering/kvittering-loading.tsx => status/status-loading.tsx} (94%) rename frontend/src/components/case/innlogget/{kvittering/kvittering-page-loader.tsx => status/status-page-loader.tsx} (69%) rename frontend/src/components/case/innlogget/{kvittering/kvittering-page.tsx => status/status-page.tsx} (75%) rename frontend/src/components/case/innlogget/{kvittering/kvittering.tsx => status/status.tsx} (97%) create mode 100644 frontend/src/components/case/innlogget/status/timeline-item.test.tsx create mode 100644 frontend/src/components/case/innlogget/status/timeline-item.tsx create mode 100644 frontend/src/utils/bun-test-setup.ts create mode 100644 frontend/src/utils/test-utils.tsx diff --git a/frontend/bun.lockb b/frontend/bun.lockb index b089174cace1fc029da079b5668f78218e9fa4be..d97b225d4652b867773d30da683a8e8d01b0b5d6 100755 GIT binary patch delta 27490 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 delta 23037 zcmeHvcUV-{_V(FFMj4f+Qbhq3J4g|RA_Exv7`u!m7RrbyMFk?D$dFjDm#rQ!_L8Wv zm#C;wk{C56Mq@PgND>o`C2C?4iRF9ODPT-;@6Ek`{GR7~avt8Z%5H1zz4ktP&J3Gd zZRZ`RG0(q+zwhxb87EeSU39yUdB!~J{Ny=J%HwZFwx4uj(t-(_7L2uCVFF!&^UYq7 zcl;DV5JsoQrzb-_4hknhu(k))gO0PrCuTvPE($_z$WK5?Z<)W{)!kWDj>*W(O3cg@ z5^My)4v7Qim%9!WkysbP5uG5^1KkN)2Q)E0&61juXL*PgDDyXJizh){AZOJO1V_*W z$V6+~Di*~-CJRiwH*+n>hY@6F1yWr>FM~D&O^VO5_>D-h@MnHN?481R-5L9nD}rDUa8GSkOr#*ax6 zgi@q?qud5iYBraIILgFptBAf5VuGN?1?1W+<)2fDi^+P9{qq*?ru5`;BS zkcY3jDHg_O=B6i(PRSaJ0#wmRwICuSGb=aMq8Zo(dNN?Jhf@AyP;v+zot>4Eni&R} z$~)Ir>K&}om!U5}S!;W>z*bMC0-FZPn0lxU--K5bc^5#*6I3R5?OFs1$y%%=re@|K zN#M|vL3_cYx2^e*DI!mJEBTxGC=u-9gZ`(Cqmh9^T1&`^Pe_PQNVS|m1!Uj~Pzt(k zO$4Das6QxdwR%CIa$dfI0Gq8Y(4+IL-Jz$3e*vYStKLlMfz%9nZVJ_!D?OCc9Q{v0 z@*^^kCts`dj7krKQbk)q$ao+m@y971!tsF`L!?ronWMaa| z4L>$0Lsbrnc3N4FfuXV821*_jtF#c*74m3M3ZDK3F4iy>XiKCeGa)-AHA&cLRI)7u zrEHT_I#Q*5R2l_JcDDef4sup0Q|X;3HO5tXM5WtRx=f)3))`>P!SO0hQfY6MMuSpE z_^GtMO7$xJrJa&KE+aKHdyF9T?5uQ1Fet^eiz+|qr1Z;|pbeql584Ft#rg&qZz%HB zgh8MfG;0`WBT#ox3i^tU3cUaJF{cuon zXh=`=H0F!d4Gax=L@y=54U`&w0zFmO8I*=1P^C>ksev$5go$UZ0V*%JYRr$y%t%M{ z2+5XoTJePSeU*AkKpl`jIW;38J~dMq*dOavQz+VjX#na2N)66XGu8*CSvth51V5JX z)X}I|7*IKB{6?h4C*MXoc~}lghPVw>3`_>49uQD3&4t#e&k=M~rX@2G)r=m5{-;>= z9jr8L59$iJ-ynrHeMJefi703f{SZ(ZipU{KelJk!`gYJ$1M7z>kAmFz)YO#BEMX~R z>e;2klpaL0@u~4imbs9r2PX_e|C8kzP*BE6C_rPI3QA*C9Thu+?&_ngKXuU6)MHwg zYeT1Xt=4ne5NRI2=zwN$s*~CfDwP}j)WTn@*|cVxWW|xpm1`bPV*dB_*z@Hnqo<)xj3X~qF>U>{6?MT zw%_*3tM+pLl0Dq9uGO*I?q}DozH+Vqp|Q;_-7e@>kN;XLZ0EeX>lu5UhdW2JmOR%v zT9=0{QZUbVj%1tpBWSDhaF=Kn!*g+;!1v(}y-T!MUX4e%8krBzb&X~je4lHyZo7>j zwBz~i?U)UZa5J(tJl8E+Z_xn5bus9&A%*cL zuGI8C_h|7(bzb3aWG#5ON3?Eo4MB+JPuwHL_iOM{49A3;3?d#qS~&?Ay9=ehNx z^-kCh1ffP9XKn`e5`R=bn$6+ip3%B9NQvW7$k~bS^NiN7L3m<*!jf25gLtVXFKuEJ zyVc?qAd7182w$W4RV`lX9nEU<3h!uJ#7H!dMjk$NA@*iO)+t9=dPSSMc5+^9beWsH)!zCo`?Xm_iu zs4pZ+LmxDO#i}IG*oZgk@Q9X1y|Jz!v_}?si1b!S9puU=%LjFNMN6ajpe~PSWz+{? zHU%NAx@>U*B*jML)GvWV9VPHsbjEo|Z6Vd*g)pf$W|=w=UIwv)GcRpz)a61sl43z$ z4vs9Y!OM^w;==R%jQV6OimjnU515Q$2WIpi%z?b}i(yEr%WY##mjcfD$SxkjP>kFY`3$*FjQx6|tqi zStTJ3{IJNWX^_T3qBUD^1NW9-W3Zt%`l7`+_ykds%G8>{VGUUP}GjHZ72v> zeJQAX4C29tytJ)R{IwykXlvB>@zM-rfd>5yNEC3QTxThyB(0pjp|>E6sFWr{!gE&1 zDPHpCd7(yqIF{sSC^6ox3}TKCuLw1YyM1_s!6-iT;dut5zHK9=z3TExkP0cjvd&K+ z^?`)p2s4OjO?X7OQT(I{&kHx|Oum>V{7K75T@ko`JU={AcNttanQPh<5lx&pqA4$p zFzOwfX|cf&vG&b*M5IwPHs^UDlbiF>NTcouo}}$~lxw7pwNN>I6mhZz2rykPr1q3U zzaN}302Ex0NRsu2mdez_z#xA{wJ_-4heUmbvBd%v=FjtDjQThIm7$X3 zTCClMSHu{_E^T;3tWiI^jZz$@A?i*-B12`<^o|(&0kVYn6h{W|i1tSPmr&BgLKbI( z*esBjwnwlB@{0CG-M&B?m4oQRpTQ-_b`QX6FjD5q!M!4LQCI|f$>Vb&nCErC_`n0C zQU|p#=-NX{kh|myaNYQmj_qtil##$1o0Rh!S$9ow{YwsWiGjrdk5UhvaT9t zze(nLXq>(T98Ene3RvZShJ?!0^*17tmv%MkUyW48OrXdRH%0P@ZbtDYNSsmM2_Z%W z;5@o{Qahg4(NSy;_Qg@jfT*SPw-1~}<{Fv=VHiKyy`7EBP+OP5DFwpuq#Y(_D+Y%ELF#>QW|`~qvLHnA zgI1Qjn~kyaMF?o;<>A)OYWtJj}6qz&@uK z(g+^aFjDsv+yEXms2%IgE6hf5ZEqeiz^JQ^dEAa4^p4cE2RBa6dJpO zZFQQ4dR;$l{=`NaL_5rFZa;?6YD6hy| zAvl-mdD+Xf;8dPa~1A};I5YKzXsE-+3x%hh-^a~(i z5HY9dNqp(&0v3 z<9IRmCCE!Tnok5LkAZkPfkz}5MSUXAOEBtQN~GS;Plyy> zPvjL)yblF-)d_eufNL*vu}SpYAzcADcnj`JaOm8GNc~F|rAa&q3?5| zFHk@F8N_ZQc!b5MpMu9YExw3gZ-Z_RB-HO5sec5HdISq9LM$v9@h?kdNd|FZGS3?k z(c43iKNiu4J^@c(p&HN}U;v(qGR3n`zKD{(l_LHrt;QRS_2Q351aQw}+XBiB!{m#o z4FH4Wi>L@-;S_X06hIeI(qlc8FQQaWj4b`0Qhgl&vc4xk)?sso5x z`65acB537{C{={;p%3Xo7C;wKGUQd2=77>gl*;Flfa`fm`aFQ>1hsuIiee%tHDm?o zvI5k=YXDvUic*EI%ej6}Nk3WD|ACVK)WB4LGEM{NB1&=*KwYLYLa{IIh0V6kD3QFc40_gfPS{wQka;iefoljMnD9L94YUmt5 z4V?#UfolMjzYWlJn<9ifz9Wl&k5a`ysOA0@B|{znWZ2IDwf74^jy|RcsR2|Y?F*C& zR)?ObUQK_VlBy`*btOF^ajPB;6pc+ zlD;uy%GXrYKTj#WIrLPYKPY8sqvj(@Lt#+l0*(2vD0vu(im0x3N`=3pq>93g#=NVV zPLvGq4(dwdpQtAMpHLeA|E1wND4(r5@ZV5s|9`6BugcTdPf!gbN-<^yB~>AAGz62G zxO7e722hd_w|F39G523Nql3nn08?mVr`N z9#!SzDm?*8U3v->f5K_HsgxQ#3z_OWuj>Db7W`QPHGEMmNR;Hupw#8JK&j%pptNv3 zROMem@h3dOjSP4KO68t`lA$&bi0VnHQsgTT?4Tf>gG!x1siHb6t*g>{YPyRmQzafM zX#3#{kYRss^8}Y#p%7g}|JgnLvwQky_e2u`_-FS-yC%Ab607Z+H2Tl(>3`b1P}lx1 zn;&`i@V`{>&+dtapjeIaKcoNbo~VcZY?DO#|LfgT(BI!Z?R1}zRf}JlXX59l+VPP2 zCf1l2&NuU-X?A?bOcV3v8)lk$SdksSjLn@wb$2)QpYsKet zGw(9Pjz5It$72_o`LB@HEi~aP>-&(_&$Q$H7nxWfU$w~02h6hLy2U0I%zH03bKBW= zd^e;J&LlJ63&|pxn1OGHG;)p|cP=)ua2{W5=5BNC_z_5v+^NLOk3q^VF|jCK1}SHr z9rs;gV$po;5;Jc;-;SS!6w7_yF!S?}ro3Uom)EBu6)k|bOHHgJFI)=$IQ)aunFlU| ze~=a}GqJ9`98&Q@__y4|Onm-w__qlDL3)|Tu7H1#)~ztHp8P(f^^4)(N)ui>uUZNJ zB>1<=#QO5ytKeTT{Dah=v(@kql4Z4tnfZ1|BTL}l8WS7HgSUx`vDd$Z)?zi2<3V7~z`1h6_zXGX{x7Y#yAkE%k!mlbWKq^{q z$D?+d*c3i}C;Z!B$L~Oz#>02PKS;}Vnb>rG6H@U;JO1)+6Pw9PcEi87?f4T&vw7Ed z;2)&T@0i$J{s_|gO^EqDCN`gM*aQDI!@s>I#`(a#@NWzJgS3e2_rX6%Y5Pn};`<>nGq*c7dLHGx0 z_CXU{!!JN8+6n*OHL-Pk`n&LN7yN_t77srJ{~#?pWMUim%|m9kk;fi3v$uH(?wk01 z+&A;CWoEX8uflyRe}wxs-upc>+s-$<2fy~(bx-Vj!fnj-i8Xgyp1OI*w_b8Rx~=cS zyd~~OFW>8S@Mn+kUs5)ViOK4=b@9TI(ul3?JLlxKEEzSz-u_%4F77A!>CepKrvh(zCQdvh@Yg_2 z3;g1lI6mNgOtd2=c7~V1(9gO1hh}z`kH!5QKaTqs+~=s7o#(l@U*M;4zsOr0GqX#) z5ckXc0`6CM;Bhm%%BSQ0B`?SQ8V~=-%*y$E+`r;CasQgfo-m8w2t4TXIPto`XMlVw z@QAZ<;&%dH0CGd%--Fx~c>8m4y!ZsB;5ie!#pf59#oGdZa4t@~Bk*ot#EEwWz8d5Q zfmeXs6L_EVapHY}Zv=TDaPdN%_@lrFf&3)!9Uu<{Uh`s{__M$hKz zR%3kij5uEOITk)VI&^&OWrXfoEK-+EtOobFg3yID<%)^v`DsYS=deg!HL+T}@G7R} z7g(eq+3~t#9aBRuP`+)!IrO0%$@iC8i98ii!h}6oPC3-3CZ$}3BP#S4k_mf7UAnA=EdW$ zV`^T-A`HogJAI3(2`T$qdNh_nD*6(O@OSiR9Qz&oy9WOtHRC=v;2)$ZH|WuL8d7mN z{JTky#=@KM?<@ER$&Uwq5C0%7`ko$*<&f5Y4gYRQES+DuwO@A!Gsa$GjGd4itFhaE z=XRb4INL0`#%y)3`QaCNy!T^Iz4}94KY#B3=tEsTen_B~E9bo)B~fAQswNP(-7nvcG#!dLb3)mYWh2b+Ag zY!kICy+)j*>gf9nV(F`c0#(;c*5Q@09h77QUGzlga{3_GMU0Rp$sD zebY%-D^*9mk|=BNb39c?pG}ig9sMg0{^&>E!ZXbp8Wr-m9%WLxMhH-K&QQ^}Y;*;w zg{hm1WQ`yMt2$T6AAzTe+k(L zrK*m;c_G#lSf=WXs;&Wa>%dbT(W-7QS&wUPh?LizHI>{tvylb#`j@_E+z!yY<5~a( zLN@Zg3XBIR266#vkQ$&0V*s)~3UmXU7 z1EB!*1oa;E7WIxdK>v(Fzhf8Z8=v%axfgV6l zpcl{^=mYcxsC<8b{=>@*3;+g7r#rL81qoog0^I-;&<J_ycW#0D!(xJ`dwA02_hFfc%vQ2CX_!19%1@dy%#Pm`-_s#eU>&dqSPi@d z+@LiAR|liKE_I|yNP$GFatnZlg@%WQVF$1QpdMNcP~1>_Q4A#j@jy$UsdT?P+i%wd zY-6Ar&`5H6nYAe(l`Mk#0u*huE;I+40qVo|8R>=tw6?SYs7zmgBD6PP0=fZRfsQ~2 z;3Xgyhyjd16kq^o{h>$>rfCrbhCNDfe?W5v;#;-iy19yG=334 zG|(RC0(1g8t5lQGApIKy{q~c7XeYc(3tmq!nh_KXH0VQsSAaNxJSCkO7^Lz8K&hd@ z&*>;lOQ$q#L7=&v0?@c510w(nkOU;sw4es;fd(p1iL^M7UIbEs(JC@P(*debOJ5B> z3!pF`571PhIr#=K1IPhr+GPUc0LqiC@�o6qJDyHCf{|I{mqPMc^s4sghiP%DfIt z1*QO#f!BaSzzUF)lK@%_CIETBL;z**-&|lc1E`|s8zNaVh&<9f(DE&TZZR+ipw(v< zKxs7gi-5Vn0$@Hc58%K;padueBr=UMl7ftQu@TZO1GFwAk2QlxNBk;a1+WqznfP_U zT3`)8I?7AKG!}RZ(1N@g1>bsLJFpGd3Ty#31Dk-ifsMdBz;0kCK!taKQgnX?lmh#J zy@1ra5A(8rW(T%5PzyLM>H4t7QOCd@1wI6h03QJF1MdN4z+vDJ@Gfu=H~{Piz6SP6 zv-_}C1?Rzj0h|NQ0-pnC0D6Sdqx2s5?|^TCJ-|)i2jDJn2e<){?ly1>_+FK@d<{^? zeds(vAA`~}zzLv-6dqOua%I0E;b*nrLr@y)pMW2M2Y^;khe8#Q9|6AtWC%4x`F~M) zk_l9&W(1X|u6qJJ1$3%>i(*AYrL-w{2BiQ>4+0xNtB4-0^u(ek7d>d`=|hiN(h;vU zM8-J+4geWPy+NK+J(_bw>m%I*s0Y-cT@-m(7nF7@Zh$M`4A2gStfq{b5ifRU6Qnf* zngYH+W1tb>1JF~Adh;FN`QChfs0yfSs1mIp6`}&voy3!#@(@qZ458kjhDfJ*O&(Lj z6g$m0nh|U1lk}m0GI%tkYj{^>tvR+qd#jYo$t?f zvH)pT9CHI%7soOre=~Ebe*$?>mv!{IPK&zSDsmB-!9T=55ZVjUFf(%xp|Plk4F37C zMQ!cI3=mn6f1rO5v=ka%NO@S&yhWpU$6X=|MhX@6ls2QNI~nhS42`}FYx>&ZT{}b; z7~tR5;2$8>9l%0D+9O$yf{{61?A`4gBjFa*Q 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 wZ>%OA9_%+_98OE#GxH8}u#v_rXIXnvS1@l;ns { +export const StatusLoading = ({ informStillWorking, type }: Props) => { const { skjema, icons } = useTranslation(); return ( diff --git a/frontend/src/components/case/innlogget/kvittering/kvittering-page-loader.tsx b/frontend/src/components/case/innlogget/status/status-page-loader.tsx similarity index 69% rename from frontend/src/components/case/innlogget/kvittering/kvittering-page-loader.tsx rename to frontend/src/components/case/innlogget/status/status-page-loader.tsx index 0fbf4e15..937351c7 100644 --- a/frontend/src/components/case/innlogget/kvittering/kvittering-page-loader.tsx +++ b/frontend/src/components/case/innlogget/status/status-page-loader.tsx @@ -2,15 +2,15 @@ import { useGetCaseQuery } from '@app/redux-api/case/api'; import { CaseStatus, type CaseType } from '@app/redux-api/case/types'; import { API_PATH } from '@app/redux-api/common'; import { useEffect, useState } from 'react'; -import { Journalpost, Kvittering } from './kvittering'; -import { KvitteringLoading } from './kvittering-loading'; +import { Journalpost, Status } from './status'; +import { StatusLoading } from './status-loading'; interface Props { caseId: string; type: CaseType; } -export const KvitteringPageLoader = ({ type, caseId }: Props) => { +export const StatusPageLoader = ({ type, caseId }: Props) => { const [showStillWorking, setShowStillWorking] = useState(false); const [showKvittering, setShowKvittering] = useState(false); @@ -27,14 +27,14 @@ export const KvitteringPageLoader = ({ type, caseId }: Props) => { }, []); if (data === undefined) { - return ; + return ; } const isDone = data.status === CaseStatus.DONE; if (isDone) { return ( - + {data.journalpostId !== null ? ( { type={data.type} /> ) : null} - + ); } if (showKvittering) { - return ; + return ; } - return ; + return ; }; diff --git a/frontend/src/components/case/innlogget/kvittering/kvittering-page.tsx b/frontend/src/components/case/innlogget/status/status-page.tsx similarity index 75% rename from frontend/src/components/case/innlogget/kvittering/kvittering-page.tsx rename to frontend/src/components/case/innlogget/status/status-page.tsx index 68cd60ff..0a8f7935 100644 --- a/frontend/src/components/case/innlogget/kvittering/kvittering-page.tsx +++ b/frontend/src/components/case/innlogget/status/status-page.tsx @@ -1,18 +1,18 @@ import { DigitalFormContainer } from '@app/components/case/common/digital/digital-form-container'; -import { KvitteringPageLoader } from '@app/components/case/innlogget/kvittering/kvittering-page-loader'; import { CaseLoader } from '@app/components/case/innlogget/loader'; +import { StatusPageLoader } from '@app/components/case/innlogget/status/status-page-loader'; import { useLanguage } from '@app/language/use-language'; import { useTranslation } from '@app/language/use-translation'; import { type Case, CaseStatus } from '@app/redux-api/case/types'; import { Navigate } from 'react-router-dom'; -export const CaseKvitteringPage = () => ; +export const CaseStatusPage = () => ; interface Props { data: Case; } -const RenderCaseKvitteringPage = ({ data }: Props) => { +const RenderCaseStatusPage = ({ data }: Props) => { const language = useLanguage(); const { skjema } = useTranslation(); @@ -32,7 +32,7 @@ const RenderCaseKvitteringPage = ({ data }: Props) => { innsendingsytelse={data.innsendingsytelse} title_fragment={title_fragment[data.type]} > - + ); }; diff --git a/frontend/src/components/case/innlogget/kvittering/kvittering.tsx b/frontend/src/components/case/innlogget/status/status.tsx similarity index 97% rename from frontend/src/components/case/innlogget/kvittering/kvittering.tsx rename to frontend/src/components/case/innlogget/status/status.tsx index f2e8f729..9f279de5 100644 --- a/frontend/src/components/case/innlogget/kvittering/kvittering.tsx +++ b/frontend/src/components/case/innlogget/status/status.tsx @@ -18,7 +18,7 @@ interface Props { ytelse: Innsendingsytelse; } -export const Kvittering = ({ children, type, ytelse }: Props) => { +export const Status = ({ children, type, ytelse }: Props) => { const { skjema, icons } = useTranslation(); return ( diff --git a/frontend/src/components/case/innlogget/status/timeline-item.test.tsx b/frontend/src/components/case/innlogget/status/timeline-item.test.tsx new file mode 100644 index 00000000..edead416 --- /dev/null +++ b/frontend/src/components/case/innlogget/status/timeline-item.test.tsx @@ -0,0 +1,12 @@ +import { describe, expect, it } from 'bun:test'; +import { TimelineItem } from '@app/components/case/innlogget/status/timeline-item'; +import { render, screen } from '@app/utils/test-utils'; +import { FileIcon } from '@navikt/aksel-icons'; + +describe('TimelineItem', () => { + it('has heading, date and icon', () => { + render(} />); + expect(screen.getByText(/Heading/)).toBeDefined(); + expect(screen.getByText(/30.11.2024/)).toBeDefined(); + }); +}); diff --git a/frontend/src/components/case/innlogget/status/timeline-item.tsx b/frontend/src/components/case/innlogget/status/timeline-item.tsx new file mode 100644 index 00000000..c573ca72 --- /dev/null +++ b/frontend/src/components/case/innlogget/status/timeline-item.tsx @@ -0,0 +1,72 @@ +import { BodyShort, HStack, Heading, VStack } from '@navikt/ds-react'; +import { format, parse } from 'date-fns'; +import { styled } from 'styled-components'; + +interface TimelineItemProps { + title: string; + date: string; + icon: React.ReactNode; + text?: string; + children?: React.ReactNode; +} + +export const TimelineItem = ({ title, date, icon, text, children }: TimelineItemProps) => ( + + + {icon} + + + + + {title} + + + + + {text === undefined ? null : {text}} + + {children === undefined ? null : {children}} + + +); + +const Icon = styled.div` + position: relative; + z-index: 0; + + &::after { + content: ''; + height: 100%; + width: var(--a-spacing-05); + background-color: var(--a-bg-subtle); + position: absolute; + top: 0; + bottom: 0; + left: 50%; + transform: translateX(-50%); + z-index: -1; + } +`; + +const IconCircle = styled.div` + width: var(--a-spacing-10); + height: var(--a-spacing-10); + border-radius: 50%; + background-color: var(--a-bg-subtle); + display: flex; + justify-content: center; + align-items: center; +`; + +interface DateProps { + date: string; +} + +const DisplayDate = ({ date }: DateProps) => ( + {format(parse(date, 'yyyy-MM-dd', new Date()), 'dd.MM.yyyy')} +); + +const StyledTime = styled.time` + font-size: var(--a-font-size-small); + color: var(--a-text-subtle); +`; diff --git a/frontend/src/routes/routes.tsx b/frontend/src/routes/routes.tsx index 4707e61f..e46f2fe2 100644 --- a/frontend/src/routes/routes.tsx +++ b/frontend/src/routes/routes.tsx @@ -1,6 +1,6 @@ import { CaseBegrunnelsePage } from '@app/components/case/innlogget/begrunnelse/begrunnelse-page'; import { CaseInnsendingPage } from '@app/components/case/innlogget/innsending/innsending-page'; -import { CaseKvitteringPage } from '@app/components/case/innlogget/kvittering/kvittering-page'; +import { CaseStatusPage } from '@app/components/case/innlogget/status/status-page'; import { CaseOppsummeringPage } from '@app/components/case/innlogget/summary/oppsummering-page'; import { SessionCasebegrunnelsePage } from '@app/components/case/uinnlogget/begrunnelse/begrunnelse-page'; import { SessionCaseInnsendingPage } from '@app/components/case/uinnlogget/innsending/innsending-page'; @@ -30,7 +30,8 @@ export const Router = () => ( } /> } /> } /> - } /> + } /> + } /> diff --git a/frontend/src/utils/bun-test-setup.ts b/frontend/src/utils/bun-test-setup.ts new file mode 100644 index 00000000..1512a7e6 --- /dev/null +++ b/frontend/src/utils/bun-test-setup.ts @@ -0,0 +1,3 @@ +import { GlobalRegistrator } from '@happy-dom/global-registrator'; + +GlobalRegistrator.register(); diff --git a/frontend/src/utils/test-utils.tsx b/frontend/src/utils/test-utils.tsx new file mode 100644 index 00000000..a51fd1ea --- /dev/null +++ b/frontend/src/utils/test-utils.tsx @@ -0,0 +1,8 @@ +import { render } from '@testing-library/react'; +import type { ReactElement } from 'react'; + +const customRender = (ui: ReactElement, options = {}) => render(ui, options); + +export { default as userEvent } from '@testing-library/user-event'; +export * from '@testing-library/react'; +export { customRender as render };