From 73076e573edce4a381562204f9cb326672729720 Mon Sep 17 00:00:00 2001 From: GotthardG <51994228+GotthardG@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:45:34 +0100 Subject: [PATCH] added contacts and addresses manager --- backend/test.db | Bin 77824 -> 77824 bytes frontend/src/pages/AddressManagerView.tsx | 45 +++++++++++++++++++-- frontend/src/pages/ContactsManagerView.tsx | 45 +++++++++++++++++++-- 3 files changed, 84 insertions(+), 6 deletions(-) diff --git a/backend/test.db b/backend/test.db index c44651d45462d3d085e800ed09a3f99c01160b5e..c14eef26300ded29c36fffc29ac5659779620af2 100644 GIT binary patch delta 5260 zcmZYCNswJ-8OHIxXCB{^bV$OKfi?+XK;HNJ&WHopG6WFCj>-@a(h^M|Ol?q^a&mj= zOlRT33484TopR~aTdNdXx0bP$oeOEj1uNgvLwKs}s#Ge!`YQc&?!D*x=iEi_+(qv@ zS8YEwF)^`2e{Fub@4R}09UXi1u|1>b-#9ytoioY#=aQR7>G>Zgw>eM8=SRtn=U+<> zoS#YdTzD&)IyjoR5b^Jd8xN0yiNm{h9~5KvA9-eW_SBhYp5A}-%+Zsl=1!=U)xD=4 zfBf``{kI>VJ9BdB*5JMi!MS($Exn%J=S~*y{$l&+pGB@4c8nhxervNM-wpSVp1W|( zwl~wB=68A%`$k8PKlSYC6Q*hQ()?uzwZaaBN?{VARM?JS6}BN5g#tkoXdU{^@5?GV z9H~2n453v>5r(M=LcNFPV}wc}LMRnN1ly|wC`Q3Y5Cso`6C%0K@?s@V1*X|%1+^{2z{&a6_iHd%Lv2P=Mjdf zXAp*|UqTqB&LNnqX#5<4C_JmsZ@u$MR(S@F*iPYTg!W1rKZVdJoJOb>o&@nd+TRCpA@ zDtr#XTrqs0|1$dXMDcd9TC5by#Zs|YEEMy_TrpeB6w`$%ri#hJp*32i6WNX=KwvsJpOW9(! zkj-av*=#nGO=l*X$|f@>T}xNfm2^2>N*B|GbUvL+XVaNYu(i_tZ0ZweW@TWO#pgM_7di!X2R# zyd7K&{t)~s_-XL{;OoJQ!KvVZ;Lf1#gM-0kf$OjNfAin;f9?Ow|AGGv|0Vwk|3UwV z-}s08oxbP&+gtVi=>5j~x%Wfwo8HUbliow#U0&;5>+SM<_do96-4*w@?(6Q4+;6$B zxToD??%i(ZUgz$11Lqy*AI_hgW#)t z(fAR3p+#T$hY?ue7=UyN4fT~41!hoG=fn$iXaLz z2(0ia0PYm-+k}3&b+}deBpzuLK7mm0rt!T9mBPmnN`-q6tis(0M&T|5*-icU2ny?w zJKqE8I)ytBT7}yY8im^shN&Mz7^Y4m3{yY40sV08N;ho16_1!*G`!Cpq=8xV}bVFc+_-jBix*8|j@!gUC(!nFvE!XboO;UGe# zZ~&oHc;5h<_rKJ`)+szPY`q3S6!s(V4jS(Rs5*tc2(7{%gl3Y)S0nVb%2gwi zN@*1~LUX+{r8ElAnbMcCjm8j~QnCVsrr1saLQ`z30HGOoh-CJ4}Vp6f;bP&=k`awBDH;nJK0z2r5%dUl#U@5Co#OQhL#aP?sXQ5aLp#CW5vUsfZvg zMM@$lOA$*ngym*eiWnluN)aJ~s_aFW2&z)JBZ8r8OdFh z(WQ#)PoLnf%m`|OJDU;226rYSXbtWpB}fhKI3*|zZo8BqG`MY3g3REyNolJxhWnq} zIwhzKZmX0aGPo^Mg2v$1rUZ$>tw{+AgIgWA6&UM(zYc`F;HFDxvo6-}UvAojpf0#+ zVuHBfrj7~Pf}1KPNDFStn4m1Uu`xkcaARVEtl&ms+Ng?+`;Qxr395qYE+&WyuG@&9 zDY$MTf~4TOj%c$ehM?fOiU@jw>oOw939fBK>ou`?|8Q+0f|}r3B7&IUnj?ai;HrxV zQi3ZT2qD3h4up>2styS*3P#mrGp;^}wYrgm~bx3<%nROB)cB1D7Ts2nQ}DAm|1z zIUvXewp~Dny#BqYGB(01ku2@4rsj@HlF2dE1#ek*p@y)FtD{gK`*d1K0z+9 z6`%IP<-nGGf?8nH`2?}Rru7L@flcERlmeUDCkO>LIuJU6jShrNU}HV%ArsgbkDwCR zh(|*tY(C4`ut$&xES*PC2rR8f5C|-dN6-f>wMUQ#ES1+2t<8 literal 77824 zcmeI54UijWd4MIY{&uDPKL5m4?6b~t%@O}_&bQz0YIhC6x!C86|L&Z-OGq5xkniL> z*>}=KC&#fNVa`BPTxe&YEmQZ0GNq6)ZE2?^w4OqtrBF;;{-%Yx6dIrf+;$2D`eP{c z{q(bWPv_VSGnom_tC`d4dtUACyN|w;-uG70joovw(kK^>)#`JlM!}A(h(x22I}3$K zB)&TmiL8d7_Cp`io|;&++&wm-u$>Zmi?je&)JU{ zHT{RF59*&uJ)At6IskW|3mG5-WPl7@%fO@$W%3Zibpyd`ZgfRhkL66Izn6ieEe3#_9Rx$1q!)EHx^% z>O`eFF;zZQs&_1?^qW8(COYyP9cE{pCCAx>odeyrcohY4b z)SBao=J8Ef&BcnnW-`~eF8YdQsPafF!v)BwwL#W4vu}9M;Qa+0FN_Qq&`w{!GLy=! zTNi!&(Wcv0q;;KLVz;x-GwN;LVVU1Xy)=2EQk|Zto}4>cu47*djZ)*}0w(oxY3lUE zR0+z7JunrO=!Kce{JdI!2`$y@m4{2SOJTj-I9abQyYEBw$=cMChgWTLu3T+&J$|kA zCrVROb@-*|n!}T|YNIsSn3ylu7u1{xeFszVav;YKb9r7WFzf- z%dJV&{kyd+?^Y>Y0NotfA>2i{Vq0JL@>D9fabxuH zRO^|uJ%bj)y`-1?vV>SYe|83H(p>9#DU5eNm4<;Ob3dfZe}5)xb823Pzf)VJ5Y5@N z^l|Q*z00N-exjSN*XC;r@T+#686ReJjk&vQ&o`WZ-7|PudP}x&{n?MQU$Rz*cV@hm zPUZ$TKGTfv9N)r(72ee0^);n>fx*b+-!!Rxp> zR;e#Ex}R2NOUv2(Os!hJ#%pwWu2h-DZkJm#;g`TL-yGqW_*?k>d_DUDdk1@fWzA0l zqzf4!17v^vR`=RbSNP7^TBE)L{($siJsDZIsc+ZdY`s>Uy1O)ctiL?_aJlMv zUcc}A{Q+Fc&Df3^2sUHk$_LWP$VR(wXs9$>nySOz55gaG)vgcL8Z)zh{s(}nj^p&Z zuG?RP%XH^{J7D)Svo#eDH?}vGjPz{p+jm#3UYo1b$7;=k*i){S8#A?f`xyFdxEyWW zV+Z_Ywss5-wt0teJ3$h*lkdA@s8pSTjK^ong`s-+G#tNLxgYXzrdy#MjhXT^gu+!{ zk^r53eY=J#bF-Cp0zl$rRiF|I@ml@Q@5lYW?gDUc9dJ8aLr;2)?C;3 z;<3`)smelms5CcSE(gBXUv!;*TUr86-KfBh>1HHc&xyj(_VfjN>$R!cU8U*iN_9c) z&vA?Wo*#%~itjku3WRGJFp~}b(Fp%O|1bVceuaOPf02Kle}?}RK)R3tGC&5%02v?y zWPl8i0Wv@a$N(821J5A?2`w5m40WyR>N=fP*Qu1cPA1iLBB8G1adoX}>N*zFG+kHc z{}X(b#y`uS;HUT=zUn!2SdfDDjXpWfbc(*ftK1H659rV5`ryR8dOJh8da72ND(tBrs?<-Yo0jc* z0bXG%yept@U9Jz#=C|GnQW%{YgguoOit6M(zUvlvBS2p+*9Ry6)hAOmJ;9+m|DWJrMd$yYHLfDGKk1`cWZW_Q!Z{-_=uyL;c^LxaQPaBdtvG~fJB zvjzC-{JFxRS{*)bFNJjaE%+x4Vo!M%z7e2ahX1lqRbK^g3O?swm@L)HF>NfSHn+)J zvN`*Do0I;&YGJ%ysxDL-yVXCdg)i?f!2dHSz(4jY)ZxG4CKBV(_C}*9M|s_iIycy8 zJQi2y|26*U2>&$y7Jup{eu(MN$N(8217v^->}a$(u<89Sa#C17v^fDDiUGC&5%02z2*8d!S1|Ay!P zO^}pe_eA(R`8fMNdpF#q3mG5-WPl8i0Wv@a$N(8217v^XPve(Pqm5eOMkU^;gExAgX685NH^VmZM(x%{$7ky0^7!b$ z?gN%|hii?3I(t5k_kg!+2guR^{rp&C!km+1~D{T6?SN)A@(%<@r**)Tq>| zcysdU&B<8oNK|dlYUio9{aCH-jZ`~X+N0&t)ak;pTD_Gkd}{zmu=_>OZwtJ23vIpi z{r?||@bB=i@yqqJM5@%_s*Sst{t{jxO?ADer-D}RoHH)rnOUZ@@v{*ONC`S9P5NP z+>%_mMrAGzFHhXwu(}ns0*H3!ZEslBj`|SoPTStFvK{px+MTt%VMRMyglKot_6FXL zx)ANo+3sN~s^={SqE`Ee+6QFk&DQZ+_F-L~aap~I zR@`mHyARCjjkn@XE8cx%R6|8P9{8i0`x3ak?u4pb?-ds4Wxvek|BeZ=Uv z$N(8217v^O~uV$}gFJ~`hFJ>=f&u7nN&t#8hk7V~}cV@R`*Jq8) z)y$R5<;Zzo=i(&+F&(Gx~A;h`wLnsc+NQ>qh!&`bzq8`cnF0`a=4A z`ds=<`grT9XLOZ`Ra4^zLHdP{0CHJ_SD4X5r%y(ra_GLrwB z{Ce_p$&V)AmwadPt;w^=hmx;KjwD~2>`!h;W)fEu-$;Bu@v+2{iQh{6LgICadZLs# zoY0zs3F`b}9D9u_t10i~V%$WNa!n7P~8E#R@SV{Xz8K zqhEjruXSOIuZ%}FM#oBX^Rs0sIBVfcr3T0Njg#4PYDt31AEZ3&1D_0>C{8hycK0415417}1C^JOD4mpa`H30~f#xFmM2D#=r*fQy549n=r5d6fh6~HX`5#j4k$J-~-5G z-~rfxK@mU?1}=d07&rjdVPFHe6$1$%hk*rPEe675i)#>Y0syyQ-~(8Vfd^m}21NiX zF>nE_z`y~(F|YwJ3?u*(0}DVF1C?n80b6BiV4yP9F;JPNF;JPNFi@E$F>tbMF@b>% zAdZ0qpkZJEh+!ZAL=lhyfCvVDmc15_y)1hSkBeFMC?306_8L5fEMJYsc7~n7W0_&6 z@z~0+NAOq}>=YVXfx#ZeW8YvW@z^t11CNUaTfk%2V0Aop4E7Kn+XkD*V`;D&9$N;h z;<3=#92$#2XR~+A#`dpbLg$3>l0@YvPa3?4f=o5o{XXUFhZ>a2{%R+>%Wu}HJY zr^g})((EW6`)O9fV=v8Kg~!D-o4{i?%}{kA0w>K-aUlXb%}{M20-0v0v=9O0hbjvZ zh!jJGh46zELv@Al{S-rGh48%;LsfZNmt?4d5XEAWp#nk_AwN_lDinlc#Tlv-gd^e%l?lQQ;tW*@!uI0~6$!%j z;tbUY!Y;-cDiMSY`JoCy*pMG85QGi+q51&6lRwT-c_3^{W2ib1w$Ki;WxDgy86{~~<*|DW*pz;vq#*{?wF zf11s(m$ALfWiMc>SCA^R@6G&r=FOScWKKZWzc1rwZp*CA zB#iGEUok#oeAxIsR;7AtN)q)`}%L_Kd(Qg&*?AM z4?xGiRlgMui7sS-43GgbKnBPF8MvMSb{2J8w)A@0S=4UXvIqe6TefropoYtq4gl0~ z+0q7pS}t2k0I27(r3C;rUGRUf0HChRwgLdC?XoQ&0P4GJOJ#~0FWXX?qRz{b-2s&a<001>$w(tR<4$KxF0Mvrnq6h%> zV772Ku(PNMvxNfybz!!!0iZU_77_sJ!)##zK#iC!L=QWQIx!gp08lF?10MkD#bn?C zK+Tv8iU3eICIc4$YR6>Y06_hi4B)fSXHi2Y0|@|iWHPV-pq5MqDpS;xNnd4(nlkCD zOi@=ReU&L{%cQR|MSYp{Ri>yhlfJW_okg9Q^lbpBHIu#sfO<3OTL4gVCVc?_b!XBG z0HF3vdOiTupGnUHfEqOE6#<|QO?oZ>)S^jGWr}(<>8VUnlO{ctDeBUsr!qxtn)Jjv zb{6$%vKRnBjhZa_x3aUSQV0IFFFfeS#jYaws|sD>>BHUQPKg+KyO zOo0IF>ZfdHTyw+?Uv0IGEhfyz`hZy`{bMlgU(7hj8kn`4WQVc-CG6ayQ;YcP-i zUX6hT;0y)=z-a`W0Kg*{_yA5}-~o6TgCc;F7^qAe7^qAaFi@G+F;JO4gn`O*9s{wK zE!GgQ0{~SFd;oJ8cmQTGC;~WvfeYX`1`dD<1~z~h3?zVQ3@iZ0Fi@G65s)g=DGXGm blNhK>k7A%QEn(oo$=X+8-~gDwz+UtJLtILo diff --git a/frontend/src/pages/AddressManagerView.tsx b/frontend/src/pages/AddressManagerView.tsx index 2bb5f1d..da472e1 100644 --- a/frontend/src/pages/AddressManagerView.tsx +++ b/frontend/src/pages/AddressManagerView.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import axios from 'axios'; import { - Container, Typography, List, ListItem, IconButton, TextField, Box, ListItemText, ListItemSecondaryAction + Container, Typography, List, ListItem, IconButton, TextField, Box, ListItemText, ListItemSecondaryAction, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Button } from '@mui/material'; import DeleteIcon from '@mui/icons-material/Delete'; import EditIcon from '@mui/icons-material/Edit'; @@ -19,7 +19,6 @@ interface Address { const AddressManager: React.FC = () => { const [addresses, setAddresses] = React.useState([]); const [newAddress, setNewAddress] = React.useState>({ - id: 0, street: '', city: '', zipcode: '', @@ -27,6 +26,8 @@ const AddressManager: React.FC = () => { }); const [editAddressId, setEditAddressId] = React.useState(null); const [errorMessage, setErrorMessage] = React.useState(null); + const [dialogOpen, setDialogOpen] = React.useState(false); + const [selectedAddress, setSelectedAddress] = React.useState
(null); React.useEffect(() => { const fetchAddresses = async () => { @@ -94,6 +95,23 @@ const AddressManager: React.FC = () => { setNewAddress(address); }; + const openDialog = (address: Address) => { + setSelectedAddress(address); + setDialogOpen(true); + }; + + const closeDialog = () => { + setDialogOpen(false); + setSelectedAddress(null); + }; + + const confirmDelete = async () => { + if (selectedAddress) { + await handleDeleteAddress(selectedAddress.id); + closeDialog(); + } + }; + return ( @@ -121,7 +139,7 @@ const AddressManager: React.FC = () => { handleEditAddress(address)}> - handleDeleteAddress(address.id)}> + openDialog(address)}> @@ -131,6 +149,27 @@ const AddressManager: React.FC = () => { No addresses found )} + + {"Confirm Delete"} + + + Are you sure you want to delete this address? + + + + + + + ); }; diff --git a/frontend/src/pages/ContactsManagerView.tsx b/frontend/src/pages/ContactsManagerView.tsx index 00f621d..d8143b7 100644 --- a/frontend/src/pages/ContactsManagerView.tsx +++ b/frontend/src/pages/ContactsManagerView.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import axios from 'axios'; import { - Container, Typography, List, ListItem, IconButton, TextField, Box, ListItemText, ListItemSecondaryAction + Container, Typography, List, ListItem, IconButton, TextField, Box, ListItemText, ListItemSecondaryAction, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Button } from '@mui/material'; import DeleteIcon from '@mui/icons-material/Delete'; import EditIcon from '@mui/icons-material/Edit'; @@ -19,7 +19,6 @@ interface Contact { const ContactsManager: React.FC = () => { const [contacts, setContacts] = React.useState([]); const [newContact, setNewContact] = React.useState>({ - id: 0, firstname: '', lastname: '', phone_number: '', @@ -27,6 +26,8 @@ const ContactsManager: React.FC = () => { }); const [editContactId, setEditContactId] = React.useState(null); const [errorMessage, setErrorMessage] = React.useState(null); + const [dialogOpen, setDialogOpen] = React.useState(false); + const [selectedContact, setSelectedContact] = React.useState(null); React.useEffect(() => { const fetchContacts = async () => { @@ -94,6 +95,23 @@ const ContactsManager: React.FC = () => { setNewContact(contact); }; + const openDialog = (contact: Contact) => { + setSelectedContact(contact); + setDialogOpen(true); + }; + + const closeDialog = () => { + setDialogOpen(false); + setSelectedContact(null); + }; + + const confirmDelete = async () => { + if (selectedContact) { + await handleDeleteContact(selectedContact.id); + closeDialog(); + } + }; + return ( @@ -121,7 +139,7 @@ const ContactsManager: React.FC = () => { handleEditContact(contact)}> - handleDeleteContact(contact.id)}> + openDialog(contact)}> @@ -131,6 +149,27 @@ const ContactsManager: React.FC = () => { No contacts found )} + + {"Confirm Delete"} + + + Are you sure you want to delete this contact? + + + + + + + ); };