From daae909068f6b914643bad02e06f0ca0be884433 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Wed, 15 Jul 2020 18:43:57 -0600 Subject: [PATCH] Allow components to be "floating" and not assigned to a machine --- action.php | 12 +++--- database.mwb | Bin 19395 -> 19326 bytes langs/en/actions.json | 4 +- langs/en/labels.json | 4 +- pages.php | 13 ++++++ pages/components.php | 90 ++++++++++++++++++++++++++++++++++++++++ pages/editcomponent.php | 27 +++++++----- pages/viewmachine.php | 10 ++++- static/js/components.js | 34 +++++++++++++++ update.sql | 32 ++++++++++++++ 10 files changed, 207 insertions(+), 19 deletions(-) create mode 100644 pages/components.php create mode 100644 static/js/components.js diff --git a/action.php b/action.php index d90214e..0b4d549 100644 --- a/action.php +++ b/action.php @@ -72,13 +72,15 @@ switch ($VARS['action']) { die(); } - if (!Machine::exists($VARS['machine'])) { - returnToSender("invalid_parameters"); - } - $component = new Component($VARS['id']); - $component->setMachineID($VARS['machine']); + if (!empty($VARS["machine"])) { + if (!Machine::exists($VARS['machine'])) { + returnToSender("invalid_parameters"); + } + $component->setMachineID($VARS['machine']); + } + $component->setSerial($VARS['serial']); $component->setTypeID($VARS['type']); if (!empty($VARS['date'])) { diff --git a/database.mwb b/database.mwb index 5e7e03b538dab677b00559799468f24d8004ed02..4553fc8ced52e03bd5f1e1003817cffab4db2206 100644 GIT binary patch delta 16194 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 delta 16225 zcmZv@b97`+)HU3(ZQI7gwlx#mw%M^KwlfpkHap40*2EJ}Y`vM^^Spn&-}-K^TV1!- z?dny1yUsp)pL5>Rzy{O7a8=|XATa^p09b%~#=44}_3}%S5CAY5n}|yb2AL>|4V1x> zq;h_H29q35vyXxVlOZqPY+ka~hUa!(UD<*$GJL-U1}Kh53u|%3%{NT(^c%2^2_;A83aT79@4M-POTFsB|75M#ncQd;+e@12m*Dd^<6mI9& zMgNPhId1D?bapmBAmJ*9C^f#gA1I7B86R)q%~kp&D@Oe~kuOhIdblVb7r%QsJz8Q3 z11h$OK5Nn2~SedNp%%!2-i!5fh<*hMS{_7L&n+wuBEcupUSFb+8$T4k+ znV-&`Wig)Usf7gg2*~YeTd;0am_+l3{FwPf-kJyZWMk(p-a2*Ku-`5u7!X)vcg>S` z1wGF>_B4~zbvAOn9{x9H)GQ@Yb}^~$)z;%x*PjD?OML1p$3UCcju;?!`r6H93aeNa z@&a!7S}+qc#QizU427}sx1jbb*^Ec$f`F!laLNN}$*oMi&X9#*%te~^-sX;hmTBzNQ*!^I5h19AyGmHV8G9J<}o z5jSo%x(WGnIVl@fSJkey7)gukIy{0DWEP`WcTpTNHMX{F!qay1Xkc44(PP24e&F`n zNKLAs$`7jOmEH&_87RoNTrXBympdvK)C#g>&y`?-EftcU8M->aq)le116yn&;%3{l z{rIP~w2UmT_8TOXfx;WtEbC1%HhB4?l#0aZw?-Q8ixpTs;TjuBMqPvnU5^63jb1v{ zdvXT#u}sTuNc)XT6Dtiw69drN^GSSvL;_-K=JWHl*~c%oSR=oa@9sw#sVnjX#AlHN za1h0n4-VuP?>$j!b6H)D+MTmDh4jkVurajkn9?+?6D$XM0f`5pH)nFb56b=V_Q{-y zW#YnXHq{mGJzM59Z8WL;%HR1#5sz&OUUo_>)j|NSeQZ89R;zQQ3sv$$R?2FsfgsJW zdarw690yl!+*9M%4W8wZx0C@(WGl98f$6cA0{r+^iKgv-XzFm!;}@b)&Z*wSVQe{3 z(io6m&PVm5K2Re@!(4Bw=FeVz9ba{3n@{D{kE_{?Sc%fT_V%kY`pF3md>0~OO=>KP z_QR)!V&`@TWy);Uy%$*OYp;2!M1~hdfy}s7TlTug22$|R3v0e|L`!VwWbHfe@|aR# z84bpbMSs)IW;Qye!Y1@|-F>*ihn(f%!loQILW5=uDquSjjxo6Vp!PbWETJ33s5vek zO^{`VWHtz{p6~@y)uufZ72_*7&k6-$6H@3CBsg-*sOaDt3p#Vj)X1Btm^Ll}F8Z~` zIRR7*$pV;)#CTvG3p*1bw3lO%0|?siwV;6kkUx8Xz5wuoEegOw-5p2jb}hmY&UKFh$ZP9pbdfSP2CF14 zaNq}YXmDf}S7WebwwOqNP=OI7?TS3+?Tm3@!OzfOTotFN;CaRp{3(&JAw<|W@X=Pp z&|D1eeI(tcu~u@DncC^2L*BrEHwj@JWYHZU>NjM-d?w%XmkHdtt5SJAn!XHil74`{ zcwi4`021Q%4&^yI>IUo?@LW{jIMR?|)ds*!<|t}ZhT%5|)CLQp7TIPco#E_zYfMMA z!bcM!6)7+ylwgksktcA>qrsCg+sp8at+#@&5779jvmlGVB?ER)e~|egMTCMA-lGGN zAxedvtibR+V3Ce_{+PHyLPg8rqr&t3iWS5Bk<2QFU9ionGSi?S(l7L*z&s4*0F?t0 z^Ve!^7sNZOa2t}`T+U=u+c2y=0V?LTM%#)zoP-P_9K1NV%8ER#8MX+Sh_Nqi4ve4Z zk(ijXF$B06%1fd(>mlW(7`V4dI3N@lip#8rDF+~1bIroVga(x+P+N@3Jo=9`X!7tJ z8ZH(ZUAREL5g%DrwjSA49msCr)KNCH0=;(7`%|3~+2jK6rX+`A zXt%=3aFbf;A~>+?t7H&}(zbe9{ipBz(igv|fD*d0m{C^4b$a%(%e}c{M|~4>LXdKk z6>9!G|Dd88V#{spASE7s`U%g^`2G5>E90fIR+?nWfu+~Ly02=2(yTWvu;;Oh(EqD; zvqAiDC?(jh-xkR>Kbwx! zDUt}awh&aJPHpRiBXPpw%$DmSGx~AkoHG}Z{kWwN_63{0huJ2YZhKDIA*mNeOq1t7u?we4L3)6%YBMSj^-=7!t2GIa&^whHH)B1* zle$Yl`NXfej@)F|ZEzx-i3LMHR;Iq*((b&yRJCog!-d>(B1LYQd`u*57)JFfK_SVh zv5YlOPvsgCNIHLtL*-hxDJ`cF*Nl>aNSnz+g`rg-G8UL*Ut|W{s%8FoeiO?~B-6(V z`TGsOsmMa=qCC@7rNH8?z@qw_Cjz13{@(&!!bvVvHnB^Bc8^NW%*&^Po=gIxN z&-Q@WsVU@-Rl4RO4)84ZhkegjN6esMgkRdo)i1X?xX@~nP({&1_m}$araU!r>iuQ+ zXIJVM&IzeA_8lNLhi2lXpf&r(7w}z)LI}8*R3Po<92J!UoIkDL+FIv{qHG$A97j&^ z4R!qE_w<{VID~!2iL{(XS|#j!gVw93bfmaZchhfUZK$prj`++%ze)01QDt0y(;HLC z$c<-A29#(EzMy%M=-nk`q_yd`anl>*I5-4I?OvV*5W=1(e~{-T9ll`wgO#ZNTe>= z!#~kVUDSceh-focP5DW)!d#UEm-gC#v+Bk%;^_2FBZMQS_ zfUII@t|p6g@QPyMOBwXd#%_Tw*TlC#@)&3(Um!{(?O!_^q;xSGq^QW*;DU@)P9d8PpHdo(aXnjk9fej=m`a$5Z_AV10L(aw z93A?i6&SM2PCx9xV%`Jg$jtG@{g7c{;9O|Mga|{C;b5K+!IAILV4|W(CjzFO>SWy0 zM=?Bb&iy$+7CH?GF=KeBu;EL7)L>9qWCj>m!8xggG%~L- zwa56$de7k=hDoNz5eLLe91LKE8(;@_LSmTHGbe8r3IKI#5N|d`^Pk| zULis^wylY*ztENsjSNx16dE$3&<0K^aPY0qxGl*GL%{SoD4h4D`2i4hEU=A0E_<^U zEBb@~6N1FyQwxTQQ)WJ)O~acWA4rP$G7tb^90-8*g$o4(BZVYQ;l+IGw@+ZEv?Htb zRiVucVv+TtXjl84VmMK}TWQy?O(6dJ6J>lHnp8~HDB0e9u@4p4pY$QbapVIY=q9xU z=-FqO6<6kQ@RPQyyWmv2n|*7gwl^K^E<`V@op8(_H~=BNL3 zw5iyuOFBxWBz&4%!tyheQSs6;B|;Q(shs$V!M;daQtYhSQ&Yd-;q3#Wu?SpgNk2S= z^K*E>kyZ4mFZwf2E>?Pw1YF}IiXr|RUF2&$5H^`7oQ5UWgejbeS$hh(gS3zaha+QI zsG+N$-CCKI;Txe7jegDsC&4kQ6qt#Oaj7+2 zXr=?-0t$bD64HPjx}Nma+SlwqFS=s)(!si_NV*jC99#RQBnXu{MyC+>?-O#>P3^(> z*LQ+48~E4rRx>-KaqAjGEG+-m;O8tp3vCYX)Itc$G^!2-*4>5Fl^anwe1(xE zJf(_a807;;hiT2*rBqs7MwKB2R&7?a`qZvdLpLXs9&sL^3P2ui}~MVrl~^GZF03&Hi40Q_Q^e`WChM z9Oa_wXEj$4Ii0ruKlo4%b23tv<{?oec(F^GHTYz-TyD~KOl9mo=%Jq_Ian~g+ z5NEw;?5jiWfM!{Ibk)-Sgcmi~_~QM;L^#jv7bYaFf@s?NYl;O1xh>Fwcg!*js?8!L zwmdq;kum!UYDMCOi>ifIVk3e4X^5MhUhgh3G{KwH`0J9pm1M%&5B=04)6JUkuQSvImCb zM)e(wZDWT)DSvOINuEx!WrX}Do{Y1;IJlg^{SoU!QY=+l zgESyZ2Pzr+u#8;x+fv?7ofcE=71Gi34!MBXMUfCj5dFCiwAobOSA*7s&GJnWCOJZmn!{#dt-<$vkx3f4mzdk)LMI7 zmr`azZ3pMFA@7pixjU>66&7)p5Z5Fd6w#Mp3=>|K+b(JZ3mGo*uURlemO{m4zwJX+ zmSU5sJMT+qvET48k}*vcj6}AML$=11m?R@lSs}ioga>op>g>pQGlOy&O@V@-c@-ibTrj>bOm-Q%w@POGLrOBz3`H7=v{pV@A~L%7cR0fl)miEfN)a9b(G(qKvZ0|A!22EI zhhHq%$8#i5sDyt=xF{T$hV-~x=m!@2d%Ai57a9g9DIy}%pY0j(Iv7H9XlNlLBNjF% zs!NRfz_&h;_n?ET&`rsg@ctiEC%Cla<}&F)X{TO@ynsLma1j#<0I*L8oU~pR$Q1+# zL;!s9s_y(?rN&2?R#DlkWgj>MF(U$Nh+wh#;uaDp%qj5*$gpU49WeL@s4%2VG8L(~gIliCeM^;{thmLJrkV4JzaZb0To4e>$eU z_u1!m=j{IaG!^>QClxLOXb{&^)6v5~mPfhMmfoWD@+cNOFo=)w`!Z2iKQAkxT#4-q z^Z4@E{2KE#t4SJ`l-K&i%^jpr>q|@#b+?wJ;hHS=}HpCR91Ptk&DOh$7L#AmYNJ)_Ovak0)N4 zBzmzMA4D?{1g`!|q`G7gr@BWQP+hZpa? zT0E788XPAdxl7nDIoPP!Qe-NP0V<6e6`fFV)VqAZMbWsCXV7d#J#-xOsKqX!;$|xv z&zh)f(?sP>jPSkEEZ5`pKXefnmN6x(YtF0tqRsRh+!@1p{FK-^#)>3L_sbGBDtFs3 z4zsAxb2<{Ho*3j#1=!-m^KrcYTi9v!IL&5>3EPiv*ynMG}U~e z86Pl3AtLGcj?_eS>^3M}p|xlwET+YPeN$NU9j+w~@g~>)tlI2(_Y8}^Sl&Jye?-YO z$Stu*ID{_YFX_p{50MTTK1|w#-?fw(amFI(3T#1}a=~LXaiXG-iJNek!>7io0*g&R zT{?JMp{_p_qd(p->{B7rixe4Kmo969lsakyyC+H=LQS>An9gAzR1 zH^H=PIPhW_AZ(SHTT+FFbXu!tDWD3fc#2HK4~dE@N4`K6t%X3R890G>X!C6HzJBBF zf-uFtexcohutB0-Qnf+R324GIWaK}emdm~1^B_BiQUp?5!XX>6@K7QmlK1r)m>7xw zVB$eLCx*U8VT`9aV_tjdw^C~8vWg3LRaI5}v_zq>2y9|BzdZB;2aH7u?FSExSPEx6 z&fe`{z~K3z!x-W20EM4Z_ZL_`Gd9unZ6_G92Cw%U3>1VQ@?eF1RmDThX<$?u+_iMa z#Z3P~3Z&%xH4{Y(MM;Q`&L^~ia*qM`hRPMX%|ss&+<|(T-~e6jXcA}Y#KA*)>&mu) zc#r<3hv5MI5+3mB-FrU9B-5(H2&2)3big&iNu~sv9wijS4=5Hu-WDPo8G30s2Y>2l zJl|_70*4ZufHSV!^mXaFBGX^C0hld;=gK1g*ZTfJ zK^KIvC$kq(iL|$qU>*R3eJ-D*U;p2NrJZnKRcOJ&ZUR|g^<`+8t9(UZi?Lc&bkKB{ zTI3n%le5&18O8$F3~xFjz0eMbG}!1_uBm$}Lev6Ye!D34TwP_lG`zLa?gA@|)9iJD zhv!~hII_bFGrY2pR4r-r$j_(1OLvfqhak(J_mk7vh{pAaT21`RQ}r;F_jW>mog|;J z*{y`fPv`$(Zs}m#K*lS@f|&2r=>N68lBsLV%IlZ)7^~m z_a#%L;hX)KLpU>^zaE07K~NQ10?PH2X0myx|KqTC{&U!q5>$!_D%=nzYkb&bf@k}2 zLKd2_h%Hk8j_+o_tyw`j%xrxRhe|=@!nX&~Wy1Z_WH6~tWm5khsu8P{bq=s1Zd8$M zROSA42r7=+2z8Gyo((5--ZZmb)XMIg+ul~lC@wcthmhyDO7rk`54alrExWchvD(S= z>V5=cy-*^u^enox@8*S2G#Ra8W~56_ZJb}k)bxWmi7OkWBrNCN6sbrtuL*8}`WVP* zjiFs2vKH9np3{Ui72+AALBuDIzyzbEBdnEGFy|1IwyH5CMsb42WNJa8&v2eF&ycTL zVBY!DoP4#OPjNy5n|6l1z?`VmTp2GaFgq0hU1KG4|tF|3XV;A{L-uDs0)H z+-Nt%jNyRciUqfoOg*nhL8^qwmjJ9Ye2QS_k17hKD?~BpbbVnxryIL&3oLGQ`<;So zZW_5XZrmxb{MKSO#v8M1c6IDdkPlo<2>js?OOJBDljT=_#|zYIv+-@V;V@}zhCJ{{&dN77;3%LmRU}diU7vVnJZ^*kG2&UX)nae z{)(}mZ*&S`-6AuTVvAL=pdjyo({7p-p@AjAo8n)$61E8@KvzxI#iFcTpU%i5!bOxX zF;v-@C?k?-a(dpNHNQdGr72PW8@F4<=_1I07`+Yx_1RC!F|F4#+5r>xJcy`-rTo(C z1*lWC*3>cfc>qwAWZ4M$=u?PPAMnzR)IF%N`dEz29VnLgU ze+~&;36I_*s^Bqr)dUiOOBNx*z9;NtW8YiNQe$j8;$B*2K=&Dv>`b$Uynn;41HAEt z2F$;3&H{j9CZF)h<%q$Iegt?&g88t5{fDFooA28sb{~9Dfp%iM^?U&MC_Hok`Y4L{ z2>^f$3#f1&20OVbD`CTQV3tDCEw$EEuE*#_JqWdob&VNVuyc{KMl-<3i_*( zyU)fZhe;OxVhGJKZXbEjkKFeYdcvwzqLL)jn z%`$#}jalXXjQeHgkb34_9|DauSfhTpb1!WsQ1K;0stey1X6upRf?F)1SS(4olEw4vqb=u33(Tnj@vkF2dE(pF+6ng2A_R65qzSJhmkm*& z6QuoSyob&`OXz;$f;RPuo$I+A=;FP`_AC>m^a3zA*VVC|qn(EQLh?}8TVnbtX@Y>J z$eb~4rxM024Uu1W@t6^uPPKy=cQ@VR+#w*R>iyk5-@&zqeE$%xe-8U)&cP7L4naZ5 z{`QSx4b+E;2&MiYvAFNKLN1E&TnZWc)(vzm5|#%<896ZZUqH(Wnep` zNO&&d2oT7h8et|3&x$-@EGuwf4nUf6GcG5NG&c0#KT%L)Sm|4`9a!1E168*@WTE{RCyT$P+5?`Dh6#mPUR>l(RID+Pxc zP#f$$?zp8}bBqtNbRouepO-{zM*V0JHFF%@>jrI#i68C*FOyLU(_|puL>d2on8u|~ z>Yw0$OrwI`v|ILR#pUkE6u>iIXDINwM@)&`JG8{sn-dr zVLWd9Wl74qHIbbx)stGMYIeuR7Ticp9~&#%R&DG&QSrAZ!{Crz1Z?_7-Y`opccg|)?}sGJ`Mqet^j+^;K=)bD%8Kw0~h{oih@xPI2DB4 z(p}M4?|T3qurzOb0#auQMTfeoMR(hRoZEPF&mx6aaNlB43xYdjkKNg!BtRW$+{kg&B`r&4ZXNvkH@^XrWw&HSt2>A*UyrslpGcQa*0tosb!nMZ8CuB2Zrj$^Y zZ)wM%>?N^`eaTE%j1~8j4A8diG%FD(hl`XjmXO4$E}jRsow_LQm;lv-(p{l1yO7E| z>yv-~4I-tCTNT^Ijk{V`BD~SN=RJzB*df`d_XKuBdAi}!)*Afy(Qwn&X2!KMCdPHN#O zU~%z$`Xb2+agA}$IE^4Ln2h$L#>JZ=*EFmw3&~+S<90X}I^qmT#3cn{-wZ;dzcmII zcI-OonF$iAIVGMK##BWRpjV2P!G=cP3V)Lbg*)T>R%DY5!NWsJ$O+U(`S;6M`Lqf1 zM51jQd6G+3_&M<G z881E@@u{o;dOR%qmx2GW>#t>v-PXA;4$^(gtAdZuh<&a2{wRH|;@k2Ye*tfax}QM_lFKB4K&{-*6o1vb<-+>1bf8cC!bTare4XipG@X5qQ!g5G+;rW3F>!so-{EIEB#1=}Zi5MAw z?KugTPcEbeVgAWbOjI}j9%1qiv)po~buV~Wbqn4GUNF{{09Gz0`ffov>1WAfz3jX6 zIVh3i?XxzfVhWMtz&WJkx$4JnVC4*TlhA6*zG}--yZsK);S!nu%n z#%Y{UT5*CyjLwPHFhb{&X*@9A#LfbxcU4y7ai$_3gp;ezEn8uwJGnJDP6HzcGbOj8P5E|!p}7j{9yj`gXeXWeWLk9kr-5d7ENI^XlBg?E9M5ZEw(M&P!= ze>!}Bqv2Yk;XZWveBRrqY9a8_-$-(8>9*y(#f3<4<3At7|F`mUe;rPjF$T;~$YHO> zLKy?;@cz>ZnWzx{_aXgHFxBK@HjPDq?lYL$Tx2OVeT)Y$h5#XW3L|J+-GeF$hnC_) zLF+%-&n%&W%nuA!JBLIjrzHzU|JO7?OJqz4L>3U*K~j0dA%5f(+N75qHPY4lYf;kVz8yPf+OfCcYs!1`He`QA>w^QB(a?(9@Nv=$BRi{?N~6z6}F4P+6%odah3xN&~X$!&gOn9~o1Yd5Q{=si7HKgwwS~UV+4F*bjr0O-UrC{?q%@u> zN=IyLkh^xK>Scj5?|KLJPLWo4)|p|u?hJVpaH@_g$B9t!d5Rdq{(P4)hTZ;0L(2RY z|GwxiHWii5bolt@y!htUC#I-0l)ejQ4qAK@;`U|}-1S_qPls;o^OjE3LB)z0J60IY z4qaeQ4Ylfo&83JdssrajYHs5G}^^XMH2B`MU_wDn7s-8VVjuO^k`hO`?} zfU1wu8vYz7&n-*Bb45)us&Vndaf#&99QOKeB@b6TT?TIN+*ivS2g|^TU6QMe?<+S{ zE>90=@h$Q?LIIW&kVQ)7;L-%oFQ_XnU1VHqw^9H-u2 zb|+w>Zj%fGheP6R4^6)Q+yXwnYPZg-0DpQ`RB2X#)HdDP3!O67f;g;d;4@mfX};bs zt^bC*G!fg`*4*FLye-qje*AR~ksm)M6g15}X#kf01$Vpi?egj-4D#>O&?eX4O+CLJ zp3ZZE+sp`9e<3btNdK6avadq;#^VP7Xb&)m^K( zI0UzVr?Iuyvg6{S7M_#DFpg5nHo z-v{RN%8`(G-@)thrS%4-73Vyk|B$H4za|;=f|z^=h8CA_$W_!Cvhzeqq^s9IvJ|vM zGxQbW0e*MPi1hvW^kIF10WYBxnAd2Z(EGTzd*=HgG9xU3S_F#(3)$$FHwwpZ-iw=i zi0Gt3gWTeb$w5SAR5lja^QtBkxKF3drDym4bPF% zXxO0%+c7&lGmm?K446??2nAXlZYH-Lo`P9^{u|09D zG0POUsQDzVPj@NiE$CuACSBMwPtr=O8!6J1v}z`wmA?9$g$wt~#Z^~3?~Nw5q;?Rt z|9Di_wv3zU>k7jT$K+YkD3033-wBYwpmEGPpZ*L|%>F8N!;6QIdRVdQv2?yXv1@bw z@btRLz)Q2WWnl2OcYSg%{QZN@d*u4+ba@&chJkPT+dj%^@nY1c{>W*AfbV{_bHbWR z9}TRp^QBjJwWx@hjNxG7baYoAQLU8)QaFxR5n+ogNm- z|57`_Ji85M&L4^a3kjjZ24E^xEFLf`?wP${@b3OrnM|aHSS}gh-x*^n zseH9gei@pAT^OA<6qd7DKCIR3C3!m^yc?aUoV<%h5g&sGw${~DtWa;2r z+XHNG>k;5r=-!=&;VU*QZHpaTC@pOe-kh&cB%|h6DG#=o=v2T`27YeOYj1Ieh!U4e{OHc2A3ElZ zlL;rwTq;QWdYV&L$fnhYT`4c$ZA~Dvo{fTodU^W?_Klw@)F0}D+CMgLjr{7b8VB$v zV(!@;dRUZJcl%!h9VZ8EelAv!4rDJcfB%-00tT-Mv{sVym2JE|WR#otOU_x=2y2s> ztWc0je!V>_r*mApANXZw6N*7s1bWQ0Kmn6KdON;-cgFt8E+iN~MoW=wZWDQ3n@)T; zd0(UCVEhrC=9@CNbdQpqVKUJ)#7In3%7M+L6|{_p;J28v{S_-HE_ zbHj)2&uG)TM!#OnWLCn~LZ!(Gq^+CCYb?=F&atX1qNh0^oZy{oK6sk7(3!z?eRk$N>qQnbYwfodnT zSXr;Yj6@8Rbq_YweM+Za`URM+!nZ*m5>Jf%=a?eu=>-)!SQ?uZfHJ;1B&-3n8{ThY zN01_^eBa2<_`;{LF}BYzE8v%<2WIKAH#d_lt8|`-jS!4%KkC%0QGYrB!vJ>Yge@7i z;f3~Dx)O1db?V2EsdI3FO!jrd9T2*8%iuF7gjTBno&S2UR_#H1?6GIbeH_1Bz#|V< z_yN_+v`|xl0CoMK3LEu;4s|eL&A9~o;SPSRe%~ir3 z!U`##-i!~ctB4XH=#TC|gdbf18Y6Roif!RCB4UgxJ|TiKkK*W!EPLnU7b;mTi8uoL z^oK@wy~MdSnIT!+uO;L`DE*;kSG}v=0@-n6dn1teKX~dg(#(0Eh7S+qEb%o7moH`` zFQ#=LUa`7yOE<`0QMO(lk6*>t3r+1Ufl$Rvuo97+;(pynENgB$`S5kBS8*ZQxTU9$`*AF+e42HRKt zU~?|~^&x@_1oF)2)6i*tC}~|;xOMxdjNTWB?XD*evk5m`1lJxLLahAnIUpmFG(Adx z7_DnTt!o>g31Qv7BV+rlu>9ZLthdH}i)^V{j)SSftn0NVYu)BU@_tpL=?A0f$|zBz z>8%x4zv!Ib+HPIT;@Fh7vx{x*2Sgc?hGzDwF=RMn5MbecDB+*qjTrv=o$LW8cKRrj z2!}gLpKVX;F7kkM^6_1!U51f%<=TJc+Qp>IW&0k8D%oxx3<%$el!(O31v zjsOx;@ZR^)z+L$xi;IV=;O(j4{e`W~!323J#S~>q)5EoAw{q15gJdo7iRbq+T#U>L zf5x>xVQM;tc&h6+#H*9}lR})BMPYe|TyQ!^bC4mW;93MPPLw2!YY&X8fg&Qbt576_ zt7|P#DJtpDhAP#cG7uG-I#&br$9*ll{E_s|6sV~Em;v48FpRHA0`B$!Z z^MR*2>5+k5hYTyn%B|qat&K^B%jE~^v@Rk_&ZMX50@j`|(;+K_$a-fpXDN+VC%OX4 z6PM4s@I;H=#25R0@3;f4@SUd?TY?^Y{5DwNF8g{hdtaIjeF%4qoyTjo6>_+X3=4Bj zJUx=t>f?6#)y6Ih4R3B**sfu#m;zQW=7)cIb8aJut+iJ z3}qdO#nuMV)y24{A|jz#O}{GYorR)~>vQ)PwJH%hFlvu#gep4sTmJ?Nb;utbGXoDU z4Td6$79Wo%x2pLoEC1$r!fPk4Wr4+cMq6w@Fy<;VFtE}K^@@gUiaKIAR!xR9d&ib3 zZRAacOxqTA1_?zs`Ez*Q>UXhsz?wP)DULQXO$<>>wK%rt*}l}6^55-s;v~_@vlXiu zH1A24u$RB+yd|sgue6OHXi1;tMF5S2kYuNXmM-i(iioleZYnjrxdrcN?-qLJ-PDGa zYke;#H643b%Gjxf+vQx<*lTFSo(QBB*+~ww&AQd_^V^`)G_$rEU#XQju&>h?S2YKO zd+KP&4=IypDTTX{L&ogJ^l|cIaJS~i_Rb9V=7(_(4wp||T$lZxYObU<8G*RxE^LhN zUaR$r7YFcN7C?4ig`-x+@4HtF4r^V8T5&Uzjgc;uf#nC%)CP~nS@wix5X;{c@(U{L z4Wpgkdi@TPuKf8Xwlb+*es@>icVQ$Y%x3EkQAai`Jp?FNJQ<=p_)iNPTnSC;oXMg# ze8vbdV_DZ0#w2+jGY%N-?14Zuaz@5EXZCex?r}?5t&GvJK?DOSB#i%M^m3{Te( zhvlB<%*ep8p1dO!`F7|PKi4R6jo!9)sPCia=KL#H;J=hM5;CYH?|{`Hpf}=e4-ax2 z>?AJ{XsvgE!ykLC>G!qbQvF)p-kzI+;Oi z2R;^G;YpLV9tgdx82xn2hGUD>8zaJbs2l4KXb!g@CN$)%Fy~>q(4%>MwIm;6f>?)-&Iv|;DPN;d0>}#@BL^xf3a3Zr1r@-F5$zJGMJm+XbW`x26y}LmmO^K ztNe#g)_OzPqQ&QJ#r6_pwGk7~+9r>AxMNDw_VB@WDkn?UXDJ!P5`)g673tgd^>ae2 z1dmq2<8wjS*%ojrwfo!(L5u_q)sbORp-`(`XSlqPtBHe$tH2?pC+w{o-moSGhJ6X_ zmpGajxE2CP$SW*Tu6NJ>(Gz~W*+LRRL0(XC_Y8{WNfS<^`AA=Nh4QIiT%K%^RVt<4 z7D%F)(G2xdBFfCLk`0Fp*K~J#1=%%_!!dIAl8PisLX1Smnwu!=}wT$pk^oe!$f5d;kyL~8N*u2dCUT_CM9=;6W7Rh$EyV8Uw|)K!m_aR zVFXtEBV&UBX82WFYh7hZ0qKLqfr*Ek8%Orj-;A-84-;2R5v9Cvmb{x39v^gOn+Jq)kW z*Lo7>kzAcT+$z^Yvra}AiSRFH%9a(VqQ<>iIC)jtc2?PqP-rG+l_T7ObMYvOx`MQe z6CihP-r1w5<*ZE8AZGT*=L$Uh#E`VRPyV>X>ZUloK%_;#@HH=c3zcmGo+6PO^h=D+ zU*4j{YXjj2G}Z2@H!m7|OSzBcw-09T^`->niPM@i|3r3qL}_MVE)C~J!^s3t;a>s- zewwVRhx#~x9ih_#lQl?5<~&)_#WQjre&rSXBzxrspOZ)F$2T#z&up?Uj*1LueOMZq$o7?7W!p%L^4-A;;OD3eVNQ{4=`+{}<< z%yf7Vo$8R_(Y0&#*cP1PO5K3>sH;6#D;goHEXjcJvILR2=@G(^FLO~7=sY2!t@qpQ%6s{rLG&~F(tfXl>^amJ#VW%q#9KhPD zBqd|Z|6qX3;kjep>G=U%uzMr_+?)3TYF}|hs#K8^UMow{=1arNB=W8e>-pZ^ z^@kZ08$g${gpf}B2D*6^>a%s|$jMK)eoVt^C#Rq|w}o`gxpbw9#e+H{{87^<28Z!^>?zh@#vaRf_3fLR5x9qNnOPUi=dv;8^8Qj z!+_xDPP3P+ctE$VPQDRYuXrG9YYl?H=P3w+SYsxf;oBynZpGQin@>v+S9eeFa0(FY zbnXI6N4pF=+V_8Nxme$s(%G5H3QNK7F)XW<=gu3~xHa6RUy6+d)t?kkoaNGwDRrA2 zPc(HKlF9!ja=g=iUi|KN!ZbyAO7r#E#d-aq)5%-glxl60_4%)Z11{19WIGLrXW%H; zzK7%d?{C(njl#1xi`nL!Kt4ZK!RbneTJUg0BJP;Kot_I;o~^j5ZMp(Eox{Z*eaUG2 zu*iYlJ*I3o*C_c(`@bk!YIERxST5{MM*pETvea z;u?3bf14&?`?pMgr_TNE?MPtaF(%DW4(oY+K^quRjTBen>M%~d!HSxAVx+WRsd4-w z)(}yOAD28#ViGoniq4p`u|`jOQb{8u$YStz9pAi(?6>YtP;xGN|2z|ta~s$9!sxBC`ka|XP0xI>fn ziWDGvXvID4-SJB-o!le;7<$cc15&%3@Y})HEWz(FMX0~y?e0I?c0UV{{>h6OT~)#3 zegqiff9IXGv;e%KhBVH@*wJC6RJ(u3@&cYG#5{{%8WR#N7>TKXJN$f5bj!yAhesVo z-eFOySVePb>x{(Tvkw1+h56HkF`o?(l>);&yLjil12o$#s+$MIs`1rNcWTfH8MJa} zw2fQJ;HxMp3>cYYV{RzTTV~9dkg_&Qg)agsGQZOpyIMn}6?qD;Om~()%PBv}86wa0 z{xQ=#=PiQv8%cd(re8kY40#RK2W3t#x!DjkEngzA=jP>=x(V&%95*=8>XF??HUX*c zMMd;bpbQp|aG0aNcv9ZH3LS|1++6Zdug;q1(Kz}&pD;6&n19(~xW74?$l}P!+FJ=0 z-AFe3hG`Ixt5=$v5~dBCuB*p9{9n~gq`a|t^@gNoXnvN3wYFo=N+WUctZKk?Tm?&5 z*z2}WlUKDfy@R8??(=tDLh1Y>g|NYsJr$DSg|J z-(4phF>OD1O7%ugK6uj(Os3iDjURbpf<%z+Dl6mDN{|_t05{>`> diff --git a/langs/en/actions.json b/langs/en/actions.json index 5007c91..0bc9f01 100644 --- a/langs/en/actions.json +++ b/langs/en/actions.json @@ -8,5 +8,7 @@ "Add Client": "Add Client", "Print": "Print", "Print Labels": "Print Labels", - "Go to machine": "Go to machine" + "Go to machine": "Go to machine", + "Attach": "Attach", + "Attach Existing": "Attach Existing" } diff --git a/langs/en/labels.json b/langs/en/labels.json index 04fb2c3..1742298 100644 --- a/langs/en/labels.json +++ b/langs/en/labels.json @@ -2,5 +2,7 @@ "Public Notes": "Public Notes", "Private Notes": "Private Notes", "Machine ID": "Machine ID", - "Back": "Back" + "Back": "Back", + "Components": "Components" + } \ No newline at end of file diff --git a/pages.php b/pages.php index a7c7280..cea53cd 100644 --- a/pages.php +++ b/pages.php @@ -25,6 +25,19 @@ define("PAGES", [ "static/js/machines.js" ] ], + "components" => [ + "title" => "Components", + "navbar" => true, + "icon" => "fas fa-memory", + "styles" => [ + "static/css/datatables.min.css", + "static/css/tables.css" + ], + "scripts" => [ + "static/js/datatables.min.js", + "static/js/components.js" + ] + ], "clients" => [ "title" => "Clients", "navbar" => (empty($SETTINGS['apis']['invoiceninja']['token']) ? true : false), diff --git a/pages/components.php b/pages/components.php new file mode 100644 index 0000000..20b91fe --- /dev/null +++ b/pages/components.php @@ -0,0 +1,90 @@ +hasPermission("MACHINEMANAGER_VIEW")) { + header("Location: ./app.php?msg=no_permission"); + die(); +} + +$writeaccess = $user->hasPermission("MACHINEMANAGER_EDIT"); + +$components = $database->select("components", ["compid", "serial", "machineid", "model", "manufacturer", "capacity"]); + +$attachto = false; +if (!empty($VARS["attachto"]) && Machine::exists($VARS["attachto"])) { + $attachto = $VARS["attachto"]; +} +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
get('Actions'); ?> get('ID'); ?> get('Machine ID'); ?> get('Model'); ?> get('Serial'); ?> get('Capacity'); ?>
+ + get("Attach"); ?> + + get("Edit"); ?> + + + +
get('Actions'); ?> get('ID'); ?> get('Client'); ?> get('OS/Software'); ?> get('Model'); ?> get('Last Event'); ?> get('Serial'); ?>
\ No newline at end of file diff --git a/pages/editcomponent.php b/pages/editcomponent.php index 81762da..13e4516 100644 --- a/pages/editcomponent.php +++ b/pages/editcomponent.php @@ -24,15 +24,12 @@ if (!empty($VARS["arg"]) && Component::exists($VARS["arg"])) { $component = new Component($VARS["id"]); $machine = new Machine($component->getMachineID()); } else { - if (!empty($VARS['machine']) && Machine::exists($VARS['machine'])) { - $machine = new Machine($VARS['machine']); - } else { - header("Location: ./app.php?msg=invalid_parameters"); - die(); - } - - $editing = false; $component = Component::create(); + $editing = false; +} + +if (!empty($VARS['machine']) && Machine::exists($VARS['machine'])) { + $machine = new Machine($VARS['machine']); $component->setMachineID($machine->getID()); } @@ -45,7 +42,6 @@ if ($editing) { $form->setID("editmachine"); $form->addHiddenInput("action", "editcomponent"); -$form->addHiddenInput("source", "viewmachine"); $types = [ "" => "" @@ -60,7 +56,11 @@ if ($editing) { $form->addInput("id", $component->getID(), "text", true, null, null, "Component ID", "fas fa-memory", 4, 1, 20); } -$form->addHiddenInput("machine", $machine->getID()); +if (!is_null($machine)) { + $form->addHiddenInput("source", "viewmachine"); +} else { + $form->addHiddenInput("source", "components"); +} $date = date('Y-m-d'); $time = date('H:i'); @@ -68,6 +68,7 @@ if (!empty($component->getTestedDate())) { $date = date("Y-m-d", strtotime($component->getTestedDate())); $time = date("H:i:s", strtotime($component->getTestedDate())); } +$form->addInput("machine", (is_null($machine) ? "" : $machine->getID()), "text", false, null, null, "Machine ID", "fas fa-desktop", 4, 0, 200); $form->addInput("serial", $component->getSerial(), "text", false, null, null, "Serial", "fas fa-barcode", 4, 0, 200); $form->addInput("type", $component->getTypeID(), "select", false, null, $types, "Type", "fas fa-list"); $form->addInput("date", $date, "date", false, null, null, "Tested Date", "fas fa-calendar"); @@ -80,6 +81,10 @@ $form->addInput("privatenotes", $component->getPrivateNotes(), "textarea", false $form->addInput("publicnotes", $component->getPublicNotes(), "textarea", false, null, null, "Public Notes", "far fa-comment-dots", 6, 0, 10000); $form->addButton("Save", "fas fa-save", null, "submit", "savebtn"); -$form->addButton("Back", "fas fa-arrow-left", "./app.php?page=viewmachine&id=" . $machine->getID(), "", null, null, "", "btn btn-info ml-2"); +if (!is_null($machine)) { + $form->addButton("Back", "fas fa-arrow-left", "./app.php?page=viewmachine&id=" . $machine->getID(), "", null, null, "", "btn btn-info ml-2"); +} else { + $form->addButton("Back", "fas fa-arrow-left", "./app.php?page=components", "", null, null, "", "btn btn-info ml-2"); +} $form->generate(); diff --git a/pages/viewmachine.php b/pages/viewmachine.php index 5177422..219aa36 100644 --- a/pages/viewmachine.php +++ b/pages/viewmachine.php @@ -33,7 +33,15 @@ $machine = new Machine($machineid); diff --git a/static/js/components.js b/static/js/components.js new file mode 100644 index 0000000..9d56774 --- /dev/null +++ b/static/js/components.js @@ -0,0 +1,34 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +$('#componenttable').DataTable({ + responsive: { + details: { + display: $.fn.dataTable.Responsive.display.modal({ + header: function (row) { + var data = row.data(); + return " " + data[2]; + } + }), + renderer: $.fn.dataTable.Responsive.renderer.tableAll({ + tableClass: 'table' + }), + type: "column" + } + }, + columnDefs: [ + { + targets: 0, + className: 'control', + orderable: false + }, + { + targets: 1, + orderable: false + } + ], + order: [ + [6, 'desc'] + ] +}); \ No newline at end of file diff --git a/update.sql b/update.sql index 001adcc..d4f173f 100644 --- a/update.sql +++ b/update.sql @@ -195,3 +195,35 @@ ADD COLUMN `deleted` TINYINT(1) NOT NULL DEFAULT 0 AFTER `publicnotes`; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; + + +-- MySQL Workbench Synchronization +-- Generated: 2020-07-15 18:11 +-- Model: New Model +-- Version: 1.0 +-- Project: Name of the project +-- Author: Skylar Ittner + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; + +ALTER TABLE `machinemanager`.`components` +DROP FOREIGN KEY `fk_components_machines1`; + +ALTER TABLE `machinemanager`.`components` +CHANGE COLUMN `machineid` `machineid` VARCHAR(20) NULL DEFAULT NULL , +DROP PRIMARY KEY, +ADD PRIMARY KEY (`compid`); + +ALTER TABLE `machinemanager`.`components` +ADD CONSTRAINT `fk_components_machines1` + FOREIGN KEY (`machineid`) + REFERENCES `machinemanager`.`machines` (`machineid`) + ON DELETE NO ACTION + ON UPDATE NO ACTION; + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;