From b38afd2b44ec9727689ab1d6ab50b7529651595b Mon Sep 17 00:00:00 2001 From: Muhamad Rijal Date: Wed, 20 Aug 2025 21:58:28 +0700 Subject: [PATCH] Feat/backoffice dimentorin (#53) * feat(backoffice): slicing backoffice dimentorin * feat(backoffice): slicing backoffice dimentorin - user management * feat(backoffice): slicing backoffice dimentorin - modal detail user management * feat(backoffice): slicing backoffice dimentorin - session management * feat(backoffice): slicing backoffice dimentorin - modal detail session * feat(backoffice): slicing backoffice dimentorin - modal detail session * feat(backoffice): slicing backoffice dimentorin - setting page * feat(backoffice): slicing backoffice dimentorin - content & roadmap * feat(backoffice): slicing backoffice dimentorin - feedback & review --- .../public/images/asd687hwq6nds4dfjj2983.webp | Bin 0 -> 11540 bytes .../_components/chart/session-status.tsx | 52 +++ .../_components/chart/user-growth.tsx | 36 ++ .../(protected)/dashboard-dimentorin/page.tsx | 115 ++++++ .../feedback-review-dimentorin/page.tsx | 181 +++++++++ .../backoffice/src/app/(protected)/layout.tsx | 2 +- .../modal/create-roadmap/index.tsx | 85 +++++ .../(protected)/roadmap-dimentorin/page.tsx | 174 +++++++++ .../_components/modal/detail/index.tsx | 114 ++++++ .../(protected)/session-dimentorin/page.tsx | 168 ++++++++ .../_components/general.tsx | 61 +++ .../_components/notification.tsx | 34 ++ .../_components/payment.tsx | 50 +++ .../_components/security.tsx | 35 ++ .../_components/user-roles-permission.tsx | 118 ++++++ .../(protected)/settings-dimentorin/page.tsx | 53 +++ .../_components/modal/delete/index.tsx | 55 +++ .../modal/detail/account-profile.tsx | 86 +++++ .../_components/modal/detail/activity-log.tsx | 110 ++++++ .../modal/detail/detail-profile.tsx | 89 +++++ .../_components/modal/detail/index.tsx | 68 ++++ .../_components/modal/detail/type.d.ts | 5 + .../modal/suspend-or-ban/index.tsx | 42 ++ .../_components/modal/type.d.ts | 4 + .../app/(protected)/users-dimentorin/page.tsx | 187 +++++++++ libs/ui/src/atoms/index.ts | 3 +- libs/ui/src/atoms/toggle/index.ts | 1 + libs/ui/src/atoms/toggle/toggle.tsx | 27 ++ .../backoffice-sidebar/backoffice-sidebar.tsx | 129 ++----- .../backoffice-wrapper/backoffice-wrapper.tsx | 51 +++ .../src/organisms/backoffice-wrapper/index.ts | 1 + libs/ui/src/organisms/datatable/datatable.tsx | 8 +- libs/ui/src/organisms/datatable/index.ts | 1 + libs/ui/src/organisms/datatable/type.d.ts | 8 + libs/ui/src/organisms/index.ts | 1 + package-lock.json | 361 +++++++++++++++++- package.json | 2 + 37 files changed, 2422 insertions(+), 95 deletions(-) create mode 100644 apps/backoffice/public/images/asd687hwq6nds4dfjj2983.webp create mode 100644 apps/backoffice/src/app/(protected)/dashboard-dimentorin/_components/chart/session-status.tsx create mode 100644 apps/backoffice/src/app/(protected)/dashboard-dimentorin/_components/chart/user-growth.tsx create mode 100644 apps/backoffice/src/app/(protected)/dashboard-dimentorin/page.tsx create mode 100644 apps/backoffice/src/app/(protected)/feedback-review-dimentorin/page.tsx create mode 100644 apps/backoffice/src/app/(protected)/roadmap-dimentorin/_components/modal/create-roadmap/index.tsx create mode 100644 apps/backoffice/src/app/(protected)/roadmap-dimentorin/page.tsx create mode 100644 apps/backoffice/src/app/(protected)/session-dimentorin/_components/modal/detail/index.tsx create mode 100644 apps/backoffice/src/app/(protected)/session-dimentorin/page.tsx create mode 100644 apps/backoffice/src/app/(protected)/settings-dimentorin/_components/general.tsx create mode 100644 apps/backoffice/src/app/(protected)/settings-dimentorin/_components/notification.tsx create mode 100644 apps/backoffice/src/app/(protected)/settings-dimentorin/_components/payment.tsx create mode 100644 apps/backoffice/src/app/(protected)/settings-dimentorin/_components/security.tsx create mode 100644 apps/backoffice/src/app/(protected)/settings-dimentorin/_components/user-roles-permission.tsx create mode 100644 apps/backoffice/src/app/(protected)/settings-dimentorin/page.tsx create mode 100644 apps/backoffice/src/app/(protected)/users-dimentorin/_components/modal/delete/index.tsx create mode 100644 apps/backoffice/src/app/(protected)/users-dimentorin/_components/modal/detail/account-profile.tsx create mode 100644 apps/backoffice/src/app/(protected)/users-dimentorin/_components/modal/detail/activity-log.tsx create mode 100644 apps/backoffice/src/app/(protected)/users-dimentorin/_components/modal/detail/detail-profile.tsx create mode 100644 apps/backoffice/src/app/(protected)/users-dimentorin/_components/modal/detail/index.tsx create mode 100644 apps/backoffice/src/app/(protected)/users-dimentorin/_components/modal/detail/type.d.ts create mode 100644 apps/backoffice/src/app/(protected)/users-dimentorin/_components/modal/suspend-or-ban/index.tsx create mode 100644 apps/backoffice/src/app/(protected)/users-dimentorin/_components/modal/type.d.ts create mode 100644 apps/backoffice/src/app/(protected)/users-dimentorin/page.tsx create mode 100644 libs/ui/src/atoms/toggle/index.ts create mode 100644 libs/ui/src/atoms/toggle/toggle.tsx create mode 100644 libs/ui/src/organisms/backoffice-wrapper/backoffice-wrapper.tsx create mode 100644 libs/ui/src/organisms/backoffice-wrapper/index.ts create mode 100644 libs/ui/src/organisms/datatable/type.d.ts diff --git a/apps/backoffice/public/images/asd687hwq6nds4dfjj2983.webp b/apps/backoffice/public/images/asd687hwq6nds4dfjj2983.webp new file mode 100644 index 0000000000000000000000000000000000000000..b4555c9b1ec624bc85073a0c8c167d6133a92044 GIT binary patch literal 11540 zcmV+vE$h-!Nk&EtEdT&lMM6+kP&gm}EdT(}00Er=DnJ3?0X~sJn@Odkq9&&GYoO2) z31x0&oJ>&OQ$@D6&$?Z09eM{#ZyWgQ(SPV@^GW8f8cZz?P7V{Ql3u)-{>xLdYqBs?HFIKhgq_G>v0pZLp5g1BCyqU&4A< zn_`I!UCX8;@|teKX@^s5A00M4nBUjoHZ&JSw^YE6J+-_6-vA4glLNUnx@0fH-&|^X&Y_Rof=YNGI8pM__7<`&A1^MU_6z}35&Mc`719yh zEi~7sw=IzdAeINn9WB&v$joSo?tGsL3JN7Ub)u9gCanpX|2wJ%1jZr%+c8^J-DEi3 z3*nzrVkIQP#NC`ssE)l$J_}C1>9l2A!u&9jR)AbPo816@Qhr`mj*z+#I$kY{UYJQJ zQjzV(6z}*U+iSVV7cCictYRCjCO~_CAOErI(1AFTp51sM!ZWGTbE*KJtWu5XI^6T@oO~BS8;FnknLiXj*?2_6(-TrH_%!)w6?A#XK4|8j$Olb~K z5L_o+L@Ydg(8=JpTbEslbj*MMisWhAIa9+%=CNCbP5k%CCm5%fxrNu_tIRIyf;stH zEQO8%B_BmRi(lIZ6HF`HAZn#tA9c=x=#wepo5LJW6Me|V5U4RI(t6t(s62)!y-^R0 zojMQBI+$(`f9YY`~%ne7JvkZkzai z>$-K;SrT5%U|$Uq+GpQV#8sfZXXtx0c)a%(5lauW!l_~Dx+JOY%J1HYAo+h516RRxuy%fDWTDyCG10J zgI$$!!bySOEt->Y<&WC~BIYxFiGh_S^JXha*q>Ok{#lF_FLtovs+4Sc$s~T51A6eX z$q9@ZIHGKuC276~Fng~D*9ajOpt31QWK{GIYAzv{eexO$`Z8NOSn~XsNr^-;SuKQA zZrsAt(264mWt|Bh0GpYN4D7S^y#>Q#6dJyrc-U1UngQEMnT)j{D2u6q2m#+fKf2)6 zp|UBI7T}Jrr$##RYbg|XHd#qZhv;yZ1<#${SisS=dRlhF=?}z~tf2QmrFN+Cl+vE2 z8m7bIH}>kfzCK9k3wu+8qEMoeO_fM6AW4D-*De2c{1KmcaKT90F1L?8p5uZh$4LP^tYCkH{0z)oP(!1(eun*j60 zAGeStF^~Mi$)@X_ZXNf@6_BhnBa;4)QcAs+QUz~t{s(bRBu4st+IG3k*Abig8h^+wpI0K53&nWVRSkd$2V|&6at=T{U>MBC!X@cm zmKf4s-0$y873D`ni@PH<%u;qCuHBbS5x?Ff`8$L(HS!k7Ym&h#P{zh2QE@=UvKg1R z7L^}~{8>5wiu6hoSp*^P$nt){^3eBpIZGi0yagezvL9Fa07_7ZIx5lbzkr|7-+WW8 zWGoO)zBe~+-~8@HlpT1Ggb4TBWJ3=VE`jX2`aN+=U8`6d7gJEq5v}4AKir zcu*;I2E_^PE(gXq?2i{m3=jkGVNt+%^^#084TIS*$;6l0kn;GoobPXc$lHX`H&2$Xs^>}itoBrrh#k?2^ zEZ+k@4v@`h0azJYk01tdv1F7+6~Kc+8vHNuWcGkIpd~u;F}(L`aQYb192PRMmooqM z@)Hmx9f2aR!HU^1DzBL~kogxl!1^aRfYY^F>l^qcn!*TWbs84T! z{)Ed*q))Ozk{#K@W)lFRSUDRjIhOV;6$ve!nh^V=!Wkf^lGfjn@+e~Kd< z3gRAWG zqP(ar$hM;NEG~fXE1D(CjKyrJ`#h*#oztuu%gJ>DSVvkBb=;`h40GdP5V;PdglLFh z5~zPQIcTHY=^juQ&~^Tuq$9sSz>)M1Y9drsalF~g90izZpT7+cxg3JW{%A{!X^ek4 z37E1LXazI}%%U;T(WH{F8y_I@jH-N0`ffG!N^3lv0$Fn{t8pVO-(hclGUx=>}6qA!hL+HzAab*Hp8~P1 zu$=F2*2zTWn9R;5XWuAL8Ks7DD@eYmhkm9YGam291{rnhekRqDgbWpjHG@ff{IUo4 zes~uVNP5~83^OHjP?MOG(+^_xpQv)7v;dEZCu86bPu3j;t_Z+RPZsL4Lz`^-IEYyS zD!nhYs8M ztw@=32FEQ`7LzP+%}^BXp$n@EwOAO8TO7aeH?he$uLU=L%~MJM0wkTuB`H!#KGL5*E{@4KZXPxL21XBS+m^i2 zp&(|V(0)+@eqErSVeIyr?d7BK2u#+00_j2d1o$2S>}+d|*r;o>e|VY=ofYM78{DSA zY?8=W6(4761}MX%Ez`M^qWS&UlA1)5E~_^8BzhNjjV-4Dsj26tHxxOHy0x|wg>Upw zBghA#Ck>K{NSZm|3GyzzV~;F--4At==^tf7p@wH`8?G;6;``}&$<949tS}0zi z3Vqe4ZwD7oTsjT<9)FPm%qtq|(+JUB!7&fup_=XiEPFXvBCYj2V6G_aO^9Wpc|Hdg zA!)ir=vV^Z11;W!L12#8bVI65cjwgzEz;vP$&!j=L)u^#nFk+?XXEelcjyIeV3SMx zG6j=1`sZz&)Z9zc5b8GZSG>)OvR|VD-ZHF%T^-VQVW8H;)x|bIl9SLc?a^Tl3+L1gzaY z?eM8y%`;<_=EzLwpUx2eD#Hc`{ard$FB(QG6Ibh#|8?-T9H3e&UBH~NAMj6X`aS5j zl8#vuU~UjYYR#L~m!#H&QPKR7nE2ucLzF<2UvJkkipezLPSo(~# zEY?yBQUX-(>R&CFF{I#Jp#wu+0_i}rE(Vhl3;q>2hfeh=kV3m5_;#-n+58XBe45WQ z#k9fXwg?!7P;_24;BzV;7k?)g+3C&_>;i$(x3( zt%bw!=E$lPX$}B`E?Y^?>aOF4RLM)aF#R%SI3&a;((=i|;%lEw4ky%gkG}4nIuAx- zW<1??uJm#+TVa`iD)Uanc4hUNereA|ljkX?l$ixhO2wM8PDdE~9coK4EArYsQ1VCV z=3Om8{^UX>CF)R{$L0pEPM0ul6zA^lQ%*khQ3m8Y_B+P6e1oBo0^^Asi#`$NJQ$x| zXBdu+ml`P2aVr60d4bzRtkY9l6Ed~6vTIm_-k z^th!5D9bO<5Th!VVw&tdeAtZC{ge2UbZv$k`@!rWI=@3Yk0^9VqXk1Q6`2m$NR>Ps zSVP;cM*iqKx(+lyVyN6`W?VJ;u(_^CZ~bhyi{BZomF=w6mNoGbLfkq6bd5HPAcp4v z5x#5Kghw+TI|< zV{;nYZd0_u^R8~E?cc@j>5k+p6?}a2YTM@+Qe5>22TC>YDNOIC|HYb%;7>h(jIwhQ z2Vh>-O~)x$<}}tfV&kOto`N}9=XnB}w_03trw1)6wAdY-4P0dwFemJ0xdwS^GHJbI zC5BSO=DIMZBb)+Z6eW`*=5+?nC4XJHC)E5O6S)X4Q-9jyUivD!85+~ zU6K)ceY&+?DLqIEeL#T7n9qE+jsRJ9d{m|P=%W!XC|Os5`ZBSdmsm>?oCljtoQsjs25Aw5HBp>Q|{H^ZEB&$V_ZWbm1$bnsBi6FaL5R` zH;I~^1Xb-&+#Im*o^J+19a@mgsA#qBsioE&K;XnGFpI z=3lYI#OdvBs?tN)QQPLd*!x+T!;7E+mDdx4d3ms8%5(lZ00;#Ap(25gJCWG(8e~zm zuC_E&$bz zlggK|J>3i=65y?3JZn+#ub+wu;l}S{BI#CQ_S0k(aPTTyV{!;)B#B0E7vGeR?3lYB zsB-RQ1{us?7xkVLWt5K#p8S+^bssP~F(*2ef>}hvM_5cGuU!S5^u!o$x#1tiEhu27^ zH(4+)>ZI;+~QnYsNh&Y zfJrigAvIk0b>Y1Es0|B`=Hvfde8^ZOr(fioR6~B~@5jXGx@r%vs!ZK)qm)R)pWkHY zW+r1YJvACL`+v?Jy~e4Nh+M$ifI%&Zvpq8e=|A;Ozh6Z&8;uPXB3|+WSS!7KjvU9~ zH7!QQZsyO^FoNfYn@|)byp$WRG>{yO8x)@H#NZyuzc#|iI@?L((1KObdXq}>%z}__ zG7%|qo`=Rzbm@dp;pwA_)r7Q}8+PKn4GED0+OdD1YMqaSUQvu0(c4L+KRRwpZ`b}P zXEZ(A(tE!yv^@v=;_=l_`qP6YYZ;H~I{z-f94)`pCL%I-kQ@ z6U+4%1qEyVNcbRmEgNQ0g)EcIFX*bZR-l45@a)zBGeH=JtSwlu7n>+Jk1FPL9Aa~b z?8*o~uhbKan*E%~>ydQoXYBg|=W!25*q)?Xm<)PIBK{UWgwFpz_qqhFw21zzR`O=U z3_Ku$C%t_;Xbz-|w`SA48>b~2z%XVH#m!7bXu15oX+;PGhVqBeP;}?mlimRYWid>- z!6ori8p2Del+yohN7}r^jIR?;kuA5WXM@1}lY9#K$-)slw@~KuNroZqrZYP zrjLAK$-1%5+4!y|+eMqb`iPda*iO{J^209N44W6>#4Ez+8_a1ft;cuj>0$x#qC#iz z>LJ@kx(S~Nqa+25L+DKg6E*A z5Xlcr<_3$p#lfItx1&&asgtjpqKvQ+OyRxz&=)|(N4Rll@d_1Pa13(B;>ZV?$wkr; zuSRs)zN-JE;1K5iDX0Y;|ET572eb*Wh@J9m?xfN}3kB07H|o>14tsn#5WAFcm_H)0 zmy2?7`G2r}P3oi3(ykU}pk12voF=_>+g4Xm(eZY2#fnS10_iJi9VxVsM`Z z?=2^^P+3Z{M~*a$^`Qvptt=R?f|pmx|FSsj@N7umq1-GXndq$jbnc61f$zEO+F^dc%rs^S8CWer9_F zxUhG`GN*OM7$6HW>$t@=x#O`SzH1}tBMI>Gv& zbexZyKJcQ_5MJ_waDHd$`Lb0_OjfHCPyyZg#_M!thK30!;ZC3$_~6h;kxtuW*reo8 z!3{PWip!)?vQBSr52b4>ijQEHo}^mtyLN_&a~j^oL$u{MTSRTNkn|&_YxMU?+AVDX z*euxiXhGZB*lZT8P%@zRU}7u36OE{m!%WgQf*0qJ)!u$an+m?9RO2jq4j(GziKPHk z{__5(J#(BWNh{|2N&=FNvM*9t^|{PJn*(+% z)G*#;L+iNsZLZ4*iEHQ%g;QNb>%v~7Oer`#QO%yX&}0k@(*8Ll_{Q|3pm6}`8-olr z_8honuVkPxq5XAh2v^8LS`a*S9*t+2+nKjT&_>I!zcWtjfMSxQm+oX zUO*b%tMY^+Hf{S+5KFh$aj-I%X#iRLYT0gqku_i8JJzvZR)_;^V2Vr0N9V^t`da$1 z1H;-~QL(|i+m8yhGrwZAh1teCB*ezhr?^WdDSNWXi#2#-v1w$RY(DIz*g*AuY+2eN z?8m+@TMq47#bnu4SE$h*wnH_$E@~8nr$y)6Y_$GNu76eFpajgAg?4VgxuS3kB-GIK zEfQ1>vYqqxWK-1k_$CmqfPg0VjC2lIu4LQSeDi1m$yXf~v-+p>%vZ$_ zAI=EgC{#+_alPov!ewJS{>r4S)ItHP;nv1nyjGJD^F~CuN7ZjUgL(aA>1QYfDft+UQzk@PNW;4%x`bM1TbkMOkv@!dLt~ zmfLFz$s^ui0yPqA2OET`zxegSLqYX#fQ$k&Exyo+onP-UB%Frg>O0f0fO*EpW}~3n zpS02ulXI$*t9!eKI&_D*-&16)G#?K$F{i28&TIRmZk@pKwA?ts1$bV66d#5wkL4Ky z*FM@us*7$;WHB1L|3UX4s5=qnn3HONA;?+%mE+~OgAJG7IYoNAO}+C?BHn2}^9i;w z{t79*)@@+8wj8U{g{&#%GhX1s6n?}66_dV&oKU+ewbCw;h&?@x9eO_@^D-rPBqgVb z+S+AwNEb~HV!gxSq{zAif1YE#wYSlal`Y&DSt)1TEpt-v35CrQ-oeo+Pd0DyI|8mX zy=50v*DYo|uar&!CD(8U-R=}XAxPgA0D#=P(5KPDZffoIJulFw7`ZV$Eb|bkX$HuC z(CGdCWI49DMfA)pK8KOG(Y9*&7Hpf;MAh4Z_aasaKmU;(tpLrb?M_xEn}3CPU4%7X zn~1`2kKrw)qK~mr)`oU?a@?9>rx+jYZE`hrSaV$tmW8-fjM~;RVq;U(#K8Hq`2z|M zN3!9Q@d{|R&BWVqNC7N%5OPyyyODwFyIu)sk)z)qAURCQh9BwgL}{7p5kFd!H}KbcA{on`m(R<$WOBRRrFYFp5J>6K#fYHF z*Pvh2ue@EkT47I1O<0sjsE(fN=dRf;f71;f&MI8NDCI_HIm-Z~3qf6-&jCHRu^oYD z%6)Ix2IEy;)PqNK_LSi={2>|15M|Bu3YGAx2DR<{jk;ODOdHWj%zLm0IPMA=0{8U) zB~U$7>)TApQPX!dy5@05MqvP8^2&Q=afAZtl}=t69^9MYIq*ZX!l9eh0N+%_DDVz4 zg0z^P^UJjt3@=Ml!dqw`=UFTnWYJICsvRV7M9D-j==fS%MykoX9_M$8W)k#J#NgQB zJMmR~4}UdT)AjwOWYT}=8flw{bm8kMY^MA#K?!$ z!$_TdCYKGM9@2l;geUKFC-BGomG)KL$wj_&p7VH zHBiXmzgPtuwPzYYK@Ulm=To5JsN!Lh8jR4h>g3D9zH2|rZCmup51Rm;Kr$i&Klah& zqeqt^Zd!Vd{8z$xA**)icaCgjg8BH0V%>-`kqu4Lbz^{1ltA;BA4l`iM1BUVJmP@p zRk-FMQA6!K-VlRGdpruZOe3$G55_n+uj37l48wt8BSFGLRVB@c3LF8byQ)uz3o4(k zeEuMe_aIng<~f@fjN*~f!~D=jz)I)ZmGs#2Bd_@h@l=>H2S_OgTv)~%v28IP1D$q9 zaj4VV2O8`P(4k|j!)*;R;6c4QK{sIAz;d&_`V;5}nJo}5y z+UItn?8CeXzot0UA>pWBi97ASPuRD$gP?##_;7S=%+=D{R}ynSN8ww9k&voRWgcFz z1HH&12VhF*-Rm-yww=hbSYHxbEe9#7$xe@cDdpv48NCWiLffEa3LFR8{36DlI4aK< z;BAvLpd7Gy4BVbs$#r7^mHlnwfRLS#O(1P(-u+lHGezT^TQ}BtvF6kYue1g)F8t7H z7x<-nlO@l$%}E2=b_%*un9SsnB@;@Xv$ohF%D>-%-p&)G+0|#H??dA;|G+FzR{ZHM z6q#I}5XDC)+*pBySP4oAQ3Bo#<#NtuH&Nok987J`n?D;=NHid)5&-kcsY!l8R!Di^ z*w>NiBmb*?*RCbOe##eky1{;ls{GuHu<@`lF#8*UHq zef?w_D_p5nBx*cU9tE^19cNskEo9v@*RETtxPc`-n-y|agC{vVR9kig@*oZVL2XCx ziN$pSwQv-#A_ky{f(0B58B2}SUWGr=rXB96OLDo99=&AbZ|v*PkmR9V$d|XX@oLtR zdc7G(_&D67YBoQpfW4{UlZyQLxB?ZX>H=n@B`VW=Qiuo?cNuReO!6nt{R}C&r7Ipx zmy62qx$NTMDfcdUGwxV^5H_geRd~ptmE%4=JItuO2=djc6a3!V^PY11>6Zk&p4u*K zd;iT-T4-l-Ao_YHLvGu`mGgd%G>JtQ=5%M}QT3TwJ#3`1oW=&_R7Anke1J%GQjTh2 zmdD-79h!!3**ijA4CK5!a>3n}l|*(N;3WN?s8e%_#y zuWVjAx&ui;%)_o_n~5qT)wiL#-T#rw{D@t$bB!BrF$O+B3&R}I2Gku}Xp+I8c2LYM zLzQRg4S6ntLU{WKn*!FDz?hFvsMA>Y3MFx3Y;F5*xEqmmPMPX#<_FPBlR?gEgk6y6 z=eda}Hk@CMbmE!Tn9L>WDa_9>^NheH+j2iF;5E)h>g)ifo&FubTrT^q)Ug*%WQ4U` zkDl>B`|vq>nx0A`8fZ1Y8i7^-OMMwSJM+J^vd2$vuJ!*7xjr+!**JWSPesa<${$&a;{@1RxtJ+7FOzf z7trsm5MeEX(*SboxaW>LEv#~by>-FDi%Ef)jZen zPg2W(*^ASm{OZNKw!%=A7aeIZ=RkG?Ig#}y?wmG9Y;~p><{tLuQ;%rVXn!z8U&%bj zFGyK2-4QMx+4$+lg#cIKYOgPuEmvtSqZ(#xRJG^|R84780C8NLrIu0nEaU-xi0#P| z*EVHHNX@jt8oZ6?MPnX)hYWascJ(&^&&LFkY~8s^1+Hoj^wOHZ518S%o3~JFlychV zIxJnhI?;BBm+^}J{Cve<$_TJ+1f#wiwf1g3dAlrjgZuSm570%_S!I$_J8ZOnZlt2X zirWhaW8!1Hxx~n#=Fe3NrbUx(UOo1dnRtJ#rNf=XMWJ^QT1FxXCkaW|jR0)V+1&ES?h6?w& z4amnq!s0A~F=XYNIOsZtKR^H$>NpD{XUD|bzv7a~^sySJM^)y_z%X4@?H^$^fPeE= zVk@g)pSwPH_cRh|bn%c?_vOF@_bWsIMKB2@o{_ygwY8xPdp_pOWV)D#(k&Ov59^rI zJCD?;ovryM)jA`WzFOaV!04uD>t->|kW9+H2M7_(pMwW+0NNOULY%?T_y+`2sJgbJ z0|$A0K$hw-Q_?m-e2p4oz%1GsG49SF3`zd3q!H}lU3CNVZUU9rW$ezuva%tJ`DkS~ zjLTY9y>vz%P0%#v;U$Bs_rJiH$UFDG)1~MVS46uLnle1fkK^+hF3sT*W{z7eCa;-<5xI`mI*B#nRWVyI}>{Zfo7Ec)pM$@?Dm9uqUl_k zY5BoqSH$PY-0&q1Y!#Q!=(toJf!S}Huj2-bqccb=fhbczmK%dK6TQ<-vnr*Lv!jFg zviv}zXvf9Dw&9vxS{GK1P8cnme?&eEtSR8|qapVxRNi;K`ylFE&XX*IQHMF9Wm*>0 zzgZ0rI1Mc6sw*{y^cEdjARZzOVtG>lDl;-{JNB7yQ>$Ds7F=5X%L((G9fw+0evzZN z$Z^@zYE#!4=K&+L4?q1@ivzQ&=6N*9JpxHk^7_(y$?u480;NAKgHm5}L5Bu(BI)Wi zedp%fIjOb9+Rmi)KR%vtF5dOuPo^}XI(x7;-|Y60xpUx$`g;zFMCib%%{a@1NvT_= zkd5b|_?lGT6xYv05X1oikZCc?@p^e3)0jW^cW(uaT1NAg&H+fG0X*nFH!g;y(Y%quZkWO_tB5MjAbUV1 zHjD%7ml%~0JW~h1@5&Bt_&Q^JP-Fa*Tjm_R+(O|R!SpIusOGg+E~4Kxg%G6W;g(%I z?k4n1z{stD{z{UJjXx@I|AykydYYUegZfGzXe=>1mpA3Mz$%9FHSSy(R>9CqdnSN6h)73J zh%CJ-o}2&xHDo$$JFr9IU09oIJkpQ==ce3JKhzMs#0pb?AzYDl*X;>h!Cx}dY?dzn zdSJ=p-+-@@vyGvcf_{5uzq>i=bi-WYT1^oW7>4^OUK{?VcaAteY$^L!Fhs6Wt*Z2)ru zE$%XZ9&*cV1~DYaU8@TKYA(Fbz5_E{Jgg`ULp4&{+YnaB1RvqUv9CQ7V@ { + const radius = innerRadius + (outerRadius - innerRadius) * 0.5; + const x = cx + radius * Math.cos(-(midAngle ?? 0) * RADIAN); + const y = cy + radius * Math.sin(-(midAngle ?? 0) * RADIAN); + + return ( + cx ? 'start' : 'end'} dominantBaseline="central"> + {`${((percent ?? 1) * 100).toFixed(0)}%`} + + ); +}; + +export const SessionStatusChart = () => { + return ( + + + + {chartData.map((entry, index) => ( + + ))} + + + + + ) +} diff --git a/apps/backoffice/src/app/(protected)/dashboard-dimentorin/_components/chart/user-growth.tsx b/apps/backoffice/src/app/(protected)/dashboard-dimentorin/_components/chart/user-growth.tsx new file mode 100644 index 0000000..2f6dd71 --- /dev/null +++ b/apps/backoffice/src/app/(protected)/dashboard-dimentorin/_components/chart/user-growth.tsx @@ -0,0 +1,36 @@ +import { CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts" + +type ChartProps = { + name: string + activeUser: number + activeSession: number +} + +const chartData: ChartProps[] = [ + { name: "2014", activeUser: 0, activeSession: 0 }, + { name: "2015", activeUser: 15, activeSession: 25 }, + { name: "2016", activeUser: 30, activeSession: 40 }, + { name: "2017", activeUser: 45, activeSession: 55 }, + { name: "2018", activeUser: 60, activeSession: 70 }, + { name: "2019", activeUser: 75, activeSession: 85 }, + { name: "2020", activeUser: 90, activeSession: 95 }, + { name: "2021", activeUser: 85, activeSession: 80 }, + { name: "2022", activeUser: 95, activeSession: 90 }, + { name: "2023", activeUser: 100, activeSession: 100 }, +] + +export const UserGrowthChart = () => { + return ( + + + + + + + + + + + + ) +} \ No newline at end of file diff --git a/apps/backoffice/src/app/(protected)/dashboard-dimentorin/page.tsx b/apps/backoffice/src/app/(protected)/dashboard-dimentorin/page.tsx new file mode 100644 index 0000000..e22b1d4 --- /dev/null +++ b/apps/backoffice/src/app/(protected)/dashboard-dimentorin/page.tsx @@ -0,0 +1,115 @@ +import { Button } from "@imphnen-frontend-service/ui/atoms"; +import { BackofficeWrapper } from "@imphnen-frontend-service/ui/organisms"; +import { For } from "@imphnen-frontend-service/utils"; +import { ReactElement } from "react"; +import { UserGrowthChart } from "./_components/chart/user-growth"; +import { SessionStatusChart } from "./_components/chart/session-status"; + +const Overview = () => { + return ( +
+

0

+

Total Users

+
+ ) +} + +export default function Components(): ReactElement { + return ( + +

Overview

+ +
+
+ + +
+ + {(_, index) => } + +
+
+ +
+ + +
+
+
+

User Growth

+
+
+ +
+
+

Session Status

+ +
+
+
+ +
+
+

Top 5 Mentors

+ +
+ + + + + + + + + + + + {(_, index) => ( + + + + + + )} + + +
No.Nama LengkapAvg Rating
{index + 1}Mursid Al-Catraz4.9
+
+
+ +
+

Top Booked Mentoring Topics

+ +
+ + + + + + + + + + + + {(_, index) => ( + + + + + + )} + + +
No.Nama LengkapTotal Sesi
{index + 1}Mursid Al-Catraz1000
+
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/apps/backoffice/src/app/(protected)/feedback-review-dimentorin/page.tsx b/apps/backoffice/src/app/(protected)/feedback-review-dimentorin/page.tsx new file mode 100644 index 0000000..6fc556a --- /dev/null +++ b/apps/backoffice/src/app/(protected)/feedback-review-dimentorin/page.tsx @@ -0,0 +1,181 @@ +import { SearchOutlined } from "@ant-design/icons"; +import { Button, Input, Select } from "@imphnen-frontend-service/ui/atoms"; +import { BackofficeWrapper, DataTable } from "@imphnen-frontend-service/ui/organisms"; +import { cn, For } from "@imphnen-frontend-service/utils"; +import { ColumnDef, getCoreRowModel, getPaginationRowModel, PaginationState, RowSelectionState, useReactTable } from "@tanstack/react-table"; +import { ReactElement, useState } from "react" + +const TABS = { + MENTORING: 'Mentoring', + PLATFORM: 'Platform' +} as const +type Tabs = typeof TABS[keyof typeof TABS] + +type FeedbackStatus = 'done' | 'todo'; + +interface FeedbackType { + id: number + name: string + email: string + rating: number + status: FeedbackStatus +} + +const mockData: FeedbackType[] = Array.from({ length: 90 }, (_, i) => ({ + id: i + 1, + name: i % 3 === 0 ? 'Ahmad Wijuana' : 'Sofia Wijuana', + email: 'fullname23@gmail.com', + rating: 4.5, + status: i % 2 === 0 ? 'done' : 'todo', +})) + +export default function Components(): ReactElement { + const [activeTab, setActiveTab] = useState(TABS.MENTORING) + + const [rowSelection, setRowSelection] = useState({}) + const [pagination, setPagination] = useState({ + pageIndex: 0, + pageSize: 9, + }); + + const columns: ColumnDef[] = [ + { + id: 'select', + meta: { cellClassName: cn("w-20") }, + header: ({ table }) => ( + + ), + cell: ({ row }) => ( + + ), + }, + { + id: 'name', + header: 'Name', + accessorKey: 'name', + }, + { + id: 'email', + header: 'Email', + accessorKey: 'email', + }, + { + id: 'rating', + header: 'Rating', + accessorKey: 'rating', + }, + { + id: 'status', + header: 'Status', + accessorKey: 'status', + cell: ({ row }) => { + const status = row.original.status; + const statusColors: Record = { + done: 'bg-success-200 text-success-500', + todo: 'bg-primary-200 text-primary-500', + }; + const statusText: Record = { + done: 'Done', + todo: 'To Do', + }; + return ( +
+ {statusText[status]} +
+ ); + }, + }, + { + header: 'Action', + meta: { cellClassName: cn("w-72") }, + cell: ({ row }) => ( + + ), + }, + ] + + const table = useReactTable({ + data: mockData, + columns, + state: { + pagination, + rowSelection, + }, + enableRowSelection: true, + onRowSelectionChange: setRowSelection, + getCoreRowModel: getCoreRowModel(), + getPaginationRowModel: getPaginationRowModel(), + onPaginationChange: setPagination, + pageCount: Math.ceil(mockData.length / pagination.pageSize), + manualPagination: false, + }); + + return ( + +
+

Feedback

+
+ + {(tab) => ( + + )} + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ + +
+
+ ); +} diff --git a/apps/backoffice/src/app/(protected)/layout.tsx b/apps/backoffice/src/app/(protected)/layout.tsx index a770c99..bc53fd2 100644 --- a/apps/backoffice/src/app/(protected)/layout.tsx +++ b/apps/backoffice/src/app/(protected)/layout.tsx @@ -7,7 +7,7 @@ export const AppLayout: FC = (): ReactElement => {
-
+
diff --git a/apps/backoffice/src/app/(protected)/roadmap-dimentorin/_components/modal/create-roadmap/index.tsx b/apps/backoffice/src/app/(protected)/roadmap-dimentorin/_components/modal/create-roadmap/index.tsx new file mode 100644 index 0000000..0c4e3f1 --- /dev/null +++ b/apps/backoffice/src/app/(protected)/roadmap-dimentorin/_components/modal/create-roadmap/index.tsx @@ -0,0 +1,85 @@ +import { ArrowRightOutlined } from "@ant-design/icons"; +import { Button, Input, Select, Textarea } from "@imphnen-frontend-service/ui/atoms"; +import { Accordion, Modal, ModalProps } from "@imphnen-frontend-service/ui/molecules"; +import { cn, For } from "@imphnen-frontend-service/utils"; +import { FC } from "react"; + +const labelClass = cn('text-neutral-800 text-[10px] font-medium mb-1.5 inline-block md:text-xs md:mb-2 xl:text-p3') + +export const ModalCreateRoadmap: FC> = ({ isOpen, onClose }) => { + return ( + +
+

+ Create Roadmaps +

+ +
+
+ +