From 6f57c46cc34b621d9c2639722cc563ba71b2a4af Mon Sep 17 00:00:00 2001 From: Gerald Raab Date: Tue, 15 May 2018 17:15:03 +0200 Subject: [PATCH 1/5] =?UTF-8?q?bei=20Anzeige=20der=20vergebenen=20Lehrauft?= =?UTF-8?q?r=C3=A4ge=20werden=20Lehrg=C3=A4nge=20exkludiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/zeitaufzeichnung.class.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/include/zeitaufzeichnung.class.php b/include/zeitaufzeichnung.class.php index 422cde18c..07c87cf50 100755 --- a/include/zeitaufzeichnung.class.php +++ b/include/zeitaufzeichnung.class.php @@ -634,24 +634,37 @@ or not exists FROM lehre.tbl_lehreinheitmitarbeiter m, lehre.tbl_lehreinheit l + JOIN + lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id) + JOIN + public.tbl_studiengang s using (studiengang_kz) WHERE $where AND $where_sem AND l.lehreinheit_id = m.lehreinheit_id AND - m.stundensatz * m.semesterstunden > 0 + m.stundensatz * m.semesterstunden > 0 AND + s.typ not in ('l') AND + lv.studiengang_kz > 0 UNION SELECT sum(pb.stunden) AS semstunden FROM lehre.tbl_projektarbeit pa, lehre.tbl_projektbetreuer pb, - lehre.tbl_lehreinheit l, - public.tbl_benutzer b + public.tbl_benutzer b, + lehre.tbl_lehreinheit l + JOIN + lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id) + JOIN + public.tbl_studiengang s using (studiengang_kz) + WHERE pa.lehreinheit_id = l.lehreinheit_id AND pb.projektarbeit_id = pa.projektarbeit_id AND pb.person_id = b.person_id AND b.uid = ".$this->db_add_param($user)." AND pb.stunden * pb.stundensatz > 0 AND + s.typ not in ('l') AND + lv.studiengang_kz > 0 AND $where_sem ) AS semstunden "; From a075cc26b379e388e25f18e7c7eb0e40805711b4 Mon Sep 17 00:00:00 2001 From: Paolo Date: Tue, 15 May 2018 18:33:01 +0200 Subject: [PATCH 2/5] - Removed place holders where not needed - Added public/js/AjaxLib.js to perform Ajax calls via JS - Added public/css/AjaxLib.css to configure the veil used in AjaxLib via CSS - Added public/images/loader.gif to be used with the veil in AjaxLib - Added to FHC-Header the possibility to include the AjaxLib (ajaxlib = true) --- application/views/templates/FHC-Header.php | 27 +- public/css/.placeholder | 0 public/css/AjaxLib.css | 14 + public/images/.placeholder | 0 public/images/loader.gif | Bin 0 -> 17490 bytes public/js/AjaxLib.js | 449 +++++++++++++++++++++ public/js/bootstrapper.js | 10 +- 7 files changed, 484 insertions(+), 16 deletions(-) delete mode 100644 public/css/.placeholder create mode 100644 public/css/AjaxLib.css delete mode 100644 public/images/.placeholder create mode 100644 public/images/loader.gif create mode 100644 public/js/AjaxLib.js diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index 52ed50dbd..853eb8de7 100755 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -2,7 +2,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); -// Retrives the URL path of the called controller + controller method +// Retrives the URL path of the called controller + called controller method // NOTE: placed here because it doesn't work inside functions $calledPath = $this->router->directory.$this->router->class; $calledMethod = $this->router->method; @@ -15,6 +15,7 @@ $customJSs = isset($customJSs) ? $customJSs : null; // By default set the parameters to false $jquery = isset($jquery) ? $jquery : false; $jqueryui = isset($jqueryui) ? $jqueryui : false; +$ajaxlib = isset($ajaxlib) ? $ajaxlib : false; $bootstrap = isset($bootstrap) ? $bootstrap : false; $fontawesome = isset($fontawesome) ? $fontawesome : false; $tablesorter = isset($tablesorter) ? $tablesorter : false; @@ -141,12 +142,15 @@ function _generateAddonsJSsInclude($calledFrom) // jQuery UI CSS if ($jqueryui === true) _generateCSSsInclude('vendor/components/jqueryui/themes/base/jquery-ui.min.css'); - // bootstrap CSS + // Bootstrap CSS if ($bootstrap === true) _generateCSSsInclude('vendor/twbs/bootstrap/dist/css/bootstrap.min.css'); - // font awesome CSS + // Font Awesome CSS if ($fontawesome === true) _generateCSSsInclude('vendor/components/font-awesome/css/font-awesome.min.css'); + // AjaxLib CSS + if ($ajaxlib === true) _generateCSSsInclude('public/css/AjaxLib.css'); + // Table sorter CSS if ($tablesorter === true) { @@ -154,7 +158,7 @@ function _generateAddonsJSsInclude($calledFrom) _generateCSSsInclude('vendor/mottie/tablesorter/dist/css/jquery.tablesorter.pager.min.css'); } - // sb admin template CSS + // SB Admin 2 template CSS if ($sbadmintemplate === true) { _generateCSSsInclude('vendor/BlackrockDigital/startbootstrap-sb-admin-2/vendor/metisMenu/metisMenu.min.css'); @@ -164,10 +168,11 @@ function _generateAddonsJSsInclude($calledFrom) // Eventually required CSS _generateCSSsInclude($customCSSs); // Eventually required CSS + // -------------------------------------------------------------------------------------------------------- // Javascripts - // Generates the global object to pass useful parms to the other javascripts + // Generates the global object to pass useful parameters to other javascripts // NOTE: must be called before any other JS include _generateJSDataStorageObject($calledPath, $calledMethod); @@ -178,11 +183,13 @@ function _generateAddonsJSsInclude($calledFrom) if ($jqueryui === true) { _generateJSsInclude('vendor/components/jqueryui/jquery-ui.min.js'); - //datepicker german language file - _generateJSsInclude('vendor/components/jqueryui/ui/i18n/datepicker-de.js'); + _generateJSsInclude('vendor/components/jqueryui/ui/i18n/datepicker-de.js'); // datepicker german language file } - // bootstrap JS + // AjaxLib JS + if ($ajaxlib === true) _generateJSsInclude('public/js/AjaxLib.js'); + + // Bootstrap JS if ($bootstrap === true) _generateJSsInclude('vendor/twbs/bootstrap/dist/js/bootstrap.min.js'); // Table sorter JS @@ -193,10 +200,10 @@ function _generateAddonsJSsInclude($calledFrom) _generateJSsInclude('vendor/mottie/tablesorter/dist/js/extras/jquery.tablesorter.pager.min.js'); } - //tinymce JS + // Tinymce JS if($tinymce === true) _generateJSsInclude('vendor/tinymce/tinymce/tinymce.min.js') ; - // sb admin template JS + // SB Admin 2 template JS if ($sbadmintemplate === true) { _generateJSsInclude('vendor/BlackrockDigital/startbootstrap-sb-admin-2/vendor/metisMenu/metisMenu.min.js'); diff --git a/public/css/.placeholder b/public/css/.placeholder deleted file mode 100644 index e69de29bb..000000000 diff --git a/public/css/AjaxLib.css b/public/css/AjaxLib.css new file mode 100644 index 000000000..d80ab95a6 --- /dev/null +++ b/public/css/AjaxLib.css @@ -0,0 +1,14 @@ +.veil { + position: absolute; + top: 0; + left: 0; + height: 98%; + width: 99%; + background-color: white; + border-width: 1px; + border-style: solid; + border-color: black; + background-image: url("/public/imgages/loader.gif"); + background-repeat: no-repeat; + background-position: center; +} diff --git a/public/images/.placeholder b/public/images/.placeholder deleted file mode 100644 index e69de29bb..000000000 diff --git a/public/images/loader.gif b/public/images/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..a718bd89be7fe9716a503b979ee99eb59c2e49cb GIT binary patch literal 17490 zcmb5VXHb(1yZwEqk_1pdx~QRtrgUjyK%|2x9RcYb1O%j$gcf@5E%YkADnh7I1W`na zbZJrq8=@lo*?T|dJ^P&V>CMN?B$Ju^X5H&r*Sb{Hl%=FCJ3ySEZvb$5db+u}IX*t# z)z#J5*qEK29UmW0AP~I0y&WALjg5`(-o2}!pm5{H4QXj<2?>c45E%IX^J4!Ag~HB0 zz}vo7~ge*FP}$VrY0|^yS$2tBKcdCf`oIo1U4Sdq2OhxU{^o z`eAK-V{_}{_Rj9!r~QM^U%r0(e)!|)=da(#e@;#T2#QU$p41bHxWI2ZRA1N^NyDk0 ztJ+XB5W_6yG(Xf({2~E;E1FHMv1B*}bD~>iI^0+~njvgGlB?EKHkKpxXnTIRsr*#| zHWYP9y}9D`br6`%m79zO!*pnAjQsg=pbDb~9vZB-9so7&Q@k`GL2uMx)seoZ1PGZx zooSI63({3ksZjn?1`Wwiq%s7UQdtK#fP3yheZ(NXOkREgKPbZBj9dr6tC7!>oJKt{cu?x@1C~w?D*k5MQ%rh^0>J6RIpqj{+8hChc(8KAVy-11wiho!~ zLzb`Jy#VrMTEe}YVp0Zjj89(Vp+F@OQ=pGYiDVr8RZ;=|!Myzf=vxOb0D@A{up^;* zMk|iYK9=T=oEyT0QIOuWRi>wDK0x#h1YjM0X`DC!Y+Ta8Cdj0=f4~X-^1Tg!#f_Cf zD(8sB$)Q*l?m*ppEW~(2LPkk?AasJ;*Fr{N?E*#Y&j(p5auf?0>h6B)SuTeY7G}PR zD)w}6(+-O~MWeJ$(ye>1H{(OVtWdL1I+O4;hWPR=8ZC*rt$a0c<^piIwmP&peS^=D zK@)|mESCwJb116##9mS5+c?MXQ9mdnfF|{3uRrnCGuf%^989V%Er#dhR1L5OxD*fb zU)%s-O0q!x_=$n@UdxPK^2p@P&=kl5HSmtG_V z`@6By?JG%go;yQ@^SQVZel58B@0ugUwqkBd2Ie|rrf z@3$@`&R5i%pS-Uny_pxOE%i~>VO(lk6Cp3NBb}N}zuP?R_Is~=v-bC=&L5wC?~^I6 z9Ut^FJv{zA#9Md#<>mGL3pPv+nfd_{aX~DL_R6C{)Q{)&m?ulLTfOBEw}4@HDX` zD6eV{%H)8+Ol5&MQ?CCgm|#6%1(*T%f&V2}!YovS9?VKK`+;@mh+*!Tn4@@ABm9si zo7ZrKmy(0z`ANZh7A>qTx*)tTu9eEHnq`-BX7M^mAhDHhrVC4b?zF7kTQk^KBp}fJ zaR^=$9wzG+8R^W8i%|@Xf0UGzDVlyODoY5Qlf+L^fb=X9N-T9x;er$x34p*52)IGF zwobB>vm&O4ql9v37(So^>8|GoDR@KpVZ$@Sg}R_ul5wpL28e15e0Ga6Pc5QuN@!dO z0ecDk_;G*!)$%pa$x9CKyhaAFe9pd(>Q}oY&4MH!;=ItKR1*7Bs0)}zSdYYZ8PE7y z`pXLx4wtxfLZ2?@NyjajCJ=!0iW0Odix#Jy@v=#<>ym~b=+X7gyp*}@-cM;vNR^WX z%394-m2WEb%g+~&pg!J(O;#H`bGoFkxp;vIM6SA&!*RJ03hzJBp)|Pqp6kI!$#DPc z(TmlAzd44huh&~#0iVc(`}xMNmc`wlXSFu$2L@ti!H(oCu~3K)GBPfgpuIVn=d7lm zV_c1WTYr&WNrcmIr-9Pyg@IOfBxvDj(_uQ5=?}t+EQ)^GjOAw(bkw@;Q9MDxYev1Y zsr}r=VjsqL9goLPZos@g=ay$&DP#)@-PnP&-|Pw=c=)+@Cu1lm@A@n$b%Alpd2~#9 zm>F?zlyS-L=}&u20!=T|tX;VXb{xs7fGEV(Mk%~K&#GLpM9J5;bSOP0oOggUmY^wMgU>FhF1WeneEIcW1y=Gdzrt!BG#tlD9{^RtXooiYbQ%OWQN209kN-tvo%VRMb*tx_Fq_>k}Wjr1wNsAOWr7p%Os6fG_TcgSWND! zqY*Q3gG~il26`$7@g4!Ousj#fSm3J5Nc8&++rLsJ_xVWa6R#-@2`-dSeD`z~6R% z?0c`Wi%!(#$n$NWFl-ZU>P>`kufl8uu-c?c&uiipAyQoKcQM3INgrJT#&e#mLxpD( zl>iXrX-SE~#A=TMlz!V(ObpIWykt!^p{8f~G@mp0jRw5BVlrJ!!~a$#N4aj1UQ)WM z?=lvord7u{B{LjrRHQQuX7M+$H)+wFdm8@x&L^#>>NWYW7$yT*Hv6VS?lcP!1WrkV zklab#T&{{ZuOZ)wHd8DLypkg<+|gvy16VyD7@ci$oXEDN5+2L$*?P-K-z@2RzBLYL z(z@oG_Y~_ksp49IJ$NtXw8BMXDhOoq`?8*rAWN})@z=`oq@j_@OW78et(K;0BkJd} zyKlOiy4I}BcktiVP1@aibmRbV(v53FE^b{RFIH)Fm~EpA50*l*Y_pgs1t?CY^WDMX zTUUGz)6fNBP#vQcN#?Hl6)IYvBa-VM%OiGbc1bA?PrhGmMUSqv&`iegzH|5xC$&-W zAztoqtN70DYvR1WDgDo4joUoK14$g1%96xv>B_YvCG|>6=^~_IY3fblMyaboCDCYZrskC=+KB+YLKdc)6i&Yu8V)b9f zao++h zZiv3@UDHEq`iWCG?6IGAK%l%Q?vW3lZ&*a6sAP0VqF$J^TM{uf1i}x_lp^Ga=Y_;# z;vb}!@|Sy6@|uM;HbIrVpWLgD5eAz-DB*`82VV^K-EV*H$Pa=UP!znP7@9^>JX5<> zKhh0_!JuakznK~M!5G?dou3$R-6;3ktzmv^2*>K17Il+*089e z!mdPa@ETim3NKZ`7aIh(`r9o^i;vpz?ZaLet#XCRbBXFj{JJ%f>HcF##-*7;+a=oO7Gx$#1K1}3p^|jIwLXcK@Ak7XRAdH_{$#FtFi57-(bD70X2H#NkM{&3?Ro7(LGUX-@sWd_`YUNF=IQ_vo+5-P zO6w8pG4eywym>jh?Q4&8cRTEIgrUp438t61Fa*^RA+tD$?_LF{Kq{GMVMj*6r=o`4;tRn%2c==ZdF{{7x$D|FR(ei1fd~ zSBK-b&%o~nS+e=EzYN^(gXHQMIsAzqVzC^OV~!oJNab>nq@1j2ws2K!c}>P)83Xn4 zZYe-I9qOR{T!kI$+;E$zysyyCEngM?08d%|5S$c29uyw#!ml4qVH7I|NeH*+xgH&q zp`INO$)|vOd^S0Gl=7K+*Ybh=p}EFkHI2OSPNZZCWN#nEvwPqg4^c?IQX4m{?@eEl z#W1W}{t@mF)w3DRpZqR!TzFi10crXI!r zy=>-+TAS#NYAvDrEX~U_?P?ky=W0<*TMIc@E1avqSQmqWXWh#4LpZO3d;4dCUUUMp z`|gp0jce*9f%br(*o~2l0L;<+kV_!EhWwt))edIRU zseu@JE`1a;T!+7SEeZP_BtD818_)F($L&l@+m8iEDHs7E4c627-m#|LtCJ}Sd0jzX zZ}%p4}YreS-&_{JpDeA#cV-llY2Y8=>MC(p&o!xNw#CX|IC)pxKkU9_ zqzc2?MB8x|+)@n2PM3Vz0fGy=j#X6RXC`vAK+%joNI1R1)Sds`kY&tQJ`!gn@_?6+ zaMOUfBoRq(yz)qqm1Gl2W5>=(1(q9LP8E>)p31Mp=vTsM;#4^T+#wiQWODfHt;IPM zX4zr1-!a=VyLA~)5iapt*q!&DV;KQrMJmXkC9T)I=^5YoxPlz6MrUWnEAxLWNsV9x z|7A2_Fn|USY&CV>9m;?4E<)Gq_Z{l#!K7E2FfZ+^6YT7~Vw3bMlGNS;Va<^s54 zvf2~Hu!&9bh%H^?grlMH1u7`W0|i8&1~oy2N(k}yucX=9Z_k>6eU<$KZan0>cU7C9 z6c#Q5#PbI6#l)s2XkClqe-ImzB^((Y9h+RppP620t5whq7dY|_cC|`1Y;oloMmq~)ur@M=3SB!4-E6`nUN|m5W$uO3>nqW zp>TF5aH<(bx*Sk&U3P`ZEZxOnw?4O@m6b$t2jr*48moO0FS&@zB@Y(SdWV7Ya-^S3%TS+~l@x^#ZU-fm77Nk62Yh+~Q>o}2LHzUWxH)Zwr+ zh&gDhCy)uUERwMjB6008rySUABPf0-R^SB|*KwdcmLPj70kGz5byKKE$_r&QZ`0=* z3mhHK_1n(IIYV%Q{+_N%HIGgsuMHHI8h(9|FC){GL?>6vRae zgwZ+R0tmDd7NNaqa2)soqc7SQY%^mK{7`L+9Zz($BNL%-Bb>!kUK))Jmz* zoIz+s0u6BeDhUYNSL?Tm5&s3)7&8|geemP(B3i{OM69iap|HsQBvb0y0<&MzHhmfh zB|NvErh&+YyS+)fqU%4J`d>WSobhP>FCI~#USR~D|15>?dpg*))bHo+E#>4D zjK%x=h{7I4ia(5Uj}MDUkVs1Q6a$6JNdhLpS=p(WJYGl{k06Yqj^c)^Mm97^R1hi) zgM^mX*7rcGRlzL^z_28|XN)4wP&&EG6*@j{cK40n+XtZO=>=8LAoN=QgLlhgkc>|p zz{{PU{Qbwk*D?6kq0Z6I`or%5T<0yG;|Qe}uH(QLf3eh0C^ItCxnergwP2J? z=rNmIc9I1)g6{-dC3l@JqX7(a`7H3-%62Hd*rhf%N=%hG4?Xam{@w+Ly25jDPqD08 zmHcG}(R1{u?=MtxII7EQp19KgmpqQ4KHC&l)!Im8tcv250}e7aaiTxZpu6b@A$BgVUM3E zBx3RUpC_gbefEw?%NEp&2j~YEk^u{SCXTImk(UP?eW2@zqX9MqT|EwhDVxC&dG(~0 zIOBe%t;X_QoiLV@n0egK?*?<{h{MXbbAq!Rw<5s`JW+J={7N?ANi_6{HpwVbA|#0$ zO?sE2axBH2NIOU|bQduuPR>vxNTo)=Ni1t%O?DzKN5LFXEGo{0P2;A=u&8^3}|A|-4vXJ89Dww#38=k*iH^i;K z)vpMF5PU6S7g~E8e=spVLmJGm#Oc=g?X|s+&z}7GSVYp_Uqr!63NP;$X5}G4gh8Tj z#Q7)iMLL}2t!|lo!M8}c*YXR*vZZf}f=uAfu=l>*@5;SSX?>sJ8$%@7P<3kJV6fBk-Fb>{Ai^{&w^{Ps?#*{A)_&%b_ies)OF z^Yaeq=#tcreN|Av5lS@19*2%%M8VRW9Vl~eN5WjWsu}uT@uig0pQDB!3iV+~k~_D?1aiNK(tKB;6 zghr7FgmP11F5iJERak~0*A#IfyB&|n5nQ4q>{ZzEW|ks6)o3;9X+;K>xCLDO9&PMbnn8jcET^e|g4v~5zmo*=x}PNCVkrBO*}#}WMP7kl(S`qE5&q)U>|c`1 z4|e%`zN^3z`)U5-6`!NF{EH=_-XfalBBKUaI{m1*Tv>&0;isX3;#V~QPGZ}QeT%Wd zcx(G_nq#%2L)V&)4fjK=-7xn8#Jz%@@w|7jVUCgBQM|r{v;6?^F~K8^KO!;-qt2!2 z4l;+9IDj&ob1*=eg*XTXZ*7B;RDhb4IB;7}E9|LCLRT25cNA8u4CD_Ow2bzec-Dg~ zb2&z)ddKGH$xFR&R<$APy+d0L+dFN0pA6PM!#BUZ`T<}06#)G-_WK7EXnE*wC&lT| zi|!5AsduqH0?#QxD$w!7)P$neD3q>4$7CcQ#n8qpAnV)EK$sZU5mEJGCI$KrmOci3o zGJKRRiKMRAxYOub4aONWJAAwseOLcs8}p+-W#p&#-1F)6sJ}`qH#5)YC?^r#RvsCz zkA4fY3KsDED)5RV;CT5nb6Ff1CR$d~naTvd5T%-d`t^*=WV|5RaodV-iXA4R{q?=h0*cU z>rf6z5P(R!%R_Vkm->v^ePkJeImAdHXW4kR6xgt?EGp3*|m@hU(=kq-Pj9^Qoy#DWDs|m0LjLtH#|IT|^5l|6? z<5?nhw|YjpYBih1&BzwKMphs@v(8opDn2@!ZEh$v2ivD7B`%41qmc+XQqki z-vqdA=hZmDR5iJNB;0Vu zD~D}y+*cJ)o=n#FTy_96k;4(fTKdt`A+}VePdW{hR`#}%uWGzA`g_>DCtAnJxrDJ&m4PKm?W zj3!9!V8}Cj`U4>oA)1MSVikMr{c+EYoV?%6WbD(&ABOLK8?2SCIS*Rs4l$fSi2sDv zL1+x?PO!x@GkX{Lu-&I34o6dZ363+M$lky|L4$^7NSNUAa_G5ihCc5$$4Di@HzATD zn8v3a2i{1sAiGk2iC_;ZaNjD7Jcxa4LXgA zk(4MMYjXRVQG)tg^Q0PsQP~gYh94C8?p0-ZZ+Qv5ygUhisAwu*UH5}m!&Ey^(knPj zR97!tJ~CJ`Mh1e5<0o3(5R`^QrAuVG78pTbWw$*OoQpZYWp#D=I#rF~we{_37S>N6 zfZEB>n&MJ&drP0;V9#*eXnXHi;H&!AZycd-%ao@b+ulB3z|OvUw`$lu>c3gJHnqZK zysNHTq;CA>Yvs|=FUR9Q$HpLLon=A7PbwaTBSlO4h;vuKu~PNuftYDlt3Zx^oC;(| z@&tX*Py%w}IB}*Ic6?*1&cJ1yt#s(A1Y`+PzU>T4;qHtR2?#DR7OT*KC_P|h$QCcf z6<-Ol>O|^qj?-({N{x79c_K`zRmr^NS=T;rx{%>&DL!l zi=C;Q0La%geo->0hd@m;=*#S3)edEoJsdR>wSu@ojC?w!VDS(XJs0+u8riNt?+(2Y znbhJ8N9l}+1j)E>`y$PE++4kVT;E&J?_Q42diC%*MKT-nxM^$S2O9+u`&ukg8muL8 z+9hQ5^V^CV40le;T;Urn#7S4V=hyE~s~A*jK^=gv{gysW;dxU|0rm6Sn0*1N8*KnQ zzITw&cHi3$#*7Zkp9)2rqqYZ0$Pdy|OJOQ{M<$*;2+~UE0%DUL@;nJxCVut4MUJA{ zwFF|mc_6}~P>QOG5#kYcAI?McDgdf-`*@`dAK>H707o_LqAA4gd0x?BSz>%^9h1e663MyBEWSh zR4G0gmq`Q4EiFyEL*lG(EUSgaISA1-xB+#wkfLWa;P%>@P8~>hS$J>6z~E5)Na>50 z5BtZ@q<0+pE@HBKYR*Ev8`82=*;NZ(6E@ynZw96AC2@cGq!Rc2@YipFWJDT!ifz%f>>`&pNcV!AUG=8 zab$~G)+o`Iq$odbv&s##w&)2hR$(&LB&u^oft8cggX%3R6mq7hG#C7v*Aze+1*?4I zmYONTc~0%)3nZ6W*v(N9@g%bAY`yUNx%H<2Zx|?GbdaG!;^1A=mGjJt+YGiV1F9Dj zxB%mAix7W-AM4j2E9(uxzrpw{$XL9GE&t8-W94Dc1q#d{7GSB909rN3(X?3n3iObx z0LvEMx-kD5+!^74{eXLQ@4^f{58G{T1t=ApFc#;11sJtvwvY~mDNW{64RBu*?;-p+ zU}8Qv*LchT-2Sj*DE!CVcVo8@R}c*Cnl7Ln%G-5cI1i;aB7wj4xG!T2pv$Dt!eR6< z0Inz8r;=58y&MiJqQioaB^76neP|*(>Vw(JG7?3nQ)O&nPn-JljN|T1R@mTG7j`9$eF5E!=oSv zR$l_(av8}Z`l>Js%L#p3`2l1*LgYyg`c=sR#w)Ve#`dvPt%l4Ygt}P3j6h#T~tjO{4={ecV zuz$t8|KR_BHq8eth-R98-`XbcYrAB$+eS4qK~=Bev4%`SKlh#*wb7G?iq!2+f6F;; zrjJ71y@>j)OaBoP(K`5DtrtZs=ZBZvD^n5hKjkW~*FdJN)9c?q3L&cc6 zHW*zXM`Ubmt{M>W*G!EYFiHZ23XSxz z+aiVX3w3m-pF6}a{%h?eCBS`ioOUfj1dv|4I^7_9b9qSCix<&f{h+gmCgxLT%!i6f zb2)>{FdD9z5Zu$X*^@mTlc3d)_g)1fILcJnC>w1D^JzZP63uKt%!$k4zlSNXcfuI3 zWFH}6-oi)cqji7?W~b>`A}7kQ2*4Con2MlVF!LsigG6?s9*u>yyLKUoGn$(~hxO$g zpP5Kxh9jaAg!m8C0ZsD?E@26EBd#=kj;#_t3UCc zFoGVp5n&h1XOOn0FAfIXI{dha0H^vD=2LjkpHC3}2i*VCZM*+(iTsaln}G2%RcE^0 z{44qKlYO~@AAdKxiU7%C&oFw4nC|s2(y{7kdPax*3%}Ye(yrT5hrY03n-jeM6>x7g zji*X|_UJv1tNr4Foo%q6DJXz9GVBo$#S4y3#6WOKilH>AY1oXc?1#cB`4$O|MW(UI zd1bN@JaN^A05}o?uByM`?$Q3g8(kuTKA^VIMkp6F_hshW_!*Hp?vi=l>6KcM7El?XB5`1FqdAzNaG@t56Cg3JF)dRL#4}RtBb|G+Y2)6)gum9)Oz=*=DC4vg;kO{w;K8jn%z0U8fgHeQY(xk<%&!e| z8v}>}kFRn^Up>Djaf?*9f)lg3WRb0d$2VioUop@Zz@hkTmbAKr&{hqiwo^|8l$dG zSL#DEkot)f=865Dk3B^zx*>!+U0k4KoRpuD`u?*-XkNTl&spXe^OSrjbfVgJAhTHTA#I{3io*`cDStj-GGR z*blt&UMhE7Meq|&A=hJAk2|HWEcGXqa`_lzj3I+n`P{n(fg|<4RkI&XJVldYC2eDY z5B4@twfO#fYAC_zb8v3UGAo84d+mY&VA!u+JVK zjauhBzNXWqauexpS1CK*E#u1D?nJiq1C_#+2A4b-oL@c>hWf4}4+mzjP!ux;o9?Jx z=>ldm!nS=PK~%t^Jw<(O>;F0b>!upn<@x^m+H% zjs8m_x+hf37wu?^)uttaWLmbLmEZOaevbCC1~-3nvi3=rL{hYVTO8V(-#=eHl96gq*0oQC9=qIv>WQV*YGmCV9>|@{U#K@m8)a zw!oVNeC9q}cx)PcjS9Djr&t~Nt^$BLR4mjH%EZMGC2?OiMtL>NN~j2y7acBwAQeW` zw7f<$!ec8|Lc&|VgG0Y~_!6R7%`;R%$Di%VA(!2LgcHS;jfy0t8U4rs+G`ULcm)nA z8xCdGjztVsGAkb?rEFXhYi#640`Z-VYe}m41YE{)sW3THxi+ORt;lAWC&X0J1D9qS zkKW8hZBLcN`F|OHaKp0_fiWb!p`!uW%lv#$q-$491pJ;z^JacKn=y0IiY@j@c?J^Z z@o=T=kBGzx+P?#{zst3PwZQ*|`|l=gJ2yT&y4G`>RPSE`xTUtlzE=xJnH8_^AET$l$Xd`a!`DaXO)H{^7SH zU85dAppf`zLU0NO1Vd5f<|1Ly+_BfdlzHX3DDOfb&F?C-qA|C+ur^Ex()6sQ)kY}i zStGJWx}moTGH@L^)I>2VIo?G1S{OXpl<|&dX13z}JQrwbc~xjV549f z`4`OC(!>v$p7EVyBdBn=rb4@w3!I9~{Q)Nop)gk9z$O(v_khu5njG*I^+%&QVV#Vk zYXeCtC+g`+d^)zO2_RTI6q)h>m&M?`_$(>~&|nm`&!WZIgEi=woYI>+Xxg`cdTq^Xc*b^9om zb#JtmWx3IaIAF6g-Wd)!sg1&S)BpIdxzEN*T*bo-#5Z*7KG!eOeScM}#bh zw#-d@Se#qk5&FNGzvCBl8VF3H z1(X1m4f&&_s?3N2i}tL&|Ixn?<9l6!mAE2aJ;9>3Zk*OIwS!3Dt;q_fdHdP~v18Z# zT$*X~ezVOY7%Th%t0&iG^Y*#)Vfd0U2%`+WuLlEn-unf+ppxB@*~`rL*X<(V7`f(6f2=1aMBVYvebPg^rGF}OcY(PFDcC2 zg*b&gmpydF--^Z_FbA~{U5S1`@2N;Qm>n`FKB5{(44I*|;7oW)wZ@UiJaxn#e;uX+ zglW>1(SnS+%9Z|=cGaC}qY3ceotfyfstlYq_pdDB#s&4_{jtw;WD*T=ndKstqA=Oz zTtRQYhY28AH?g}bym!vYu*S!f)$19hd#0LOOvz@YXRF<_7x=S3r26!ev7Nt)V~{1z z8WyS>;^jj$j*d}|OHAj2rYL9Ra)YyF!}E$MN!0qqm^8QK?CL~kBB(TlqB59R5QAz9 zt~1HQ73o=DBH46S}psP6HCFh_5KN5+6KX`v@K|+dhdxsJUURP|F zfbV|at~iivkboVYJo+h!JW!c1A@d>;znZ*hCa~crRFciF&llamU3j6?WOV+4vd~58 z+OJ2ns2fR~CmKA89p{SG9|=yW1tK}QR3PFlP#v_Vk+ucL@Sm58KoPj`maT&TEqUXq zlUf>z8S71!W#&UUc+=`TPSru|e8NG8J5vpJz^Q-u8TW{l&XxJzlw5989bV4lxR~qL zE5>6WY_OA60 z!4reEKb@d^q!tZ3+a7IITM@Z{*{4@TVX^GFr> zL)xyb%YyvEJ~-?5T&kpC5vt|oa6ui1aKak9A`pRga_9q4tnE-DdRsD@K&-)WM69qY zS_RA}y?z_RTs1=hx}T-0XyX~>+Z!om<)CF?!i`+fP-6VJEC#~xttWF!d@MOHrYT*T z=&I+#Z7qf=D@_*Zee@xXt4Fdd)il|XJN{M8@P@|KRUNT!_}@Us_mJTBf1S;|P$(3Z z%BMLi&~*23sJv~!4RO^A3o$Pt^j^)DD#R&OP|IUwrwH|-( zy1a3eO!}m^b_xUpDh12tTbTtJp^rQBshkM}*Mu5KvyeOG;>ZZhomV$jv^{ zuk?uv2>H+h_oUWE(-2kM+*05Pf>NN)CZ)Sc&$}{Whx6pgu-6c$QPJTWAb8*VKG@r- ztIuyhknXY_pZ;bvEuBX~C*-+={I-7*(pzOmi zqh?o#Ws3|BXV$7S#xDV)!Y_3rjt8h81ND} ziV~)P*}_Ebms=%)^t6DrkAb;bsf>vU#yrE2P*Q}4lBY^CbT<0Z9+@j!7b`n6&RU(7 z0ev?u_~iU-Yv}j14kf0D@pvkJyw1pfskY{#Zb#m?IF5 zbhoISih&pAW4?Nk-c%dXdQCZf;GAg!4a&HLeW-sbNQ?||S35zgbxr%E)f14k;!8Pu7aqQUuc*_7Oub)#BdiPW}K#Dcgs=#3+mQ2Y>L#1uElc9kX~V1agoddhkMv(*0?DhMik2jeRbJ_>q>{JD!G|_c&eJ287_D zz>w}FCtC#aANx7v5-u~{D)=MkUv73W$tSeb<5SvV@|MS3Z;?)iLIvU~W&=~6lpK0L z9zrxJ&Z-$#-zkh5H@J{{ZRTlOzWBf6hJVQar^4`Gal_wD-D+s>eC)lyT8lL;j*BRrT&b73yUc}2m$PG`%Pk|oN}?(n1)eE%jw1v?2duOopyvfz(+*B9ZR03W z5I%i>Eu$c@5IjDNS2I#8S`-==hw|lcPQINg4D!stKj4O+T{&J&FUF&IBPyh;uEsvW zIdX#>~I(OkjygRB1ikX-g?<7)EP|*Oi zXSa>NWC*E7#hL^N^h7ECSOmZiXCM%@nu^P%W1@j}{FQ!R%QW*&Ob?r9&u^X2zvXH! z{;L=JCZ{xW(AU4I;%%kg1C!^!6dm5Bm}UeDU661=fvhhai#roE4InO-q_HZ|tGJF^ z)^l;RWTDqj15^+gcam^6nbW8qJAbRedhmozAmUiD(Po5S@aABw;#Zq-Ub$=V=ZfMV zC$jGpckO}?rp6Qy7tPg8aQNPK>Syr+=(hb{XOB)m@nt6`j_R4J^yh8p8`1;8(={j#n;GdmWV({OCn`XE_zZXtjm0k&v|D3W_ zDuZzV3PT8iu2$Gv5MZdG<&c7U8j|$+xfc(dq0o{Q&mi;=i6hhz!x7Xa=euIeS>|gM zh~!VUir#&_x)Sy_H*RjfLC&w>L4AD_hl6D#QegV5Pot_TSS zhAYx-O^K*0LeI`}7l(}Agac{9v}_i$_XZL&h3(&+tw8NxM#x$p^{a_(A;7n+lf|=( zu=g^tSyfv<#clN}F}Vh}{TQmFK=T~-(VSB>R#W44q<2ARr0v~Gx zn*7*hvHMsU1)o=}Un%lAf04&U_p`-d7@Kt%o3W_vg=AV@pTOA{E8{9)Dva(jm4g$z zZj783ti)*w&hjkyiNC8kvDwktPDb{z(|eDg&9Ypbqn**g1l>@Phy>7M+)Zl968^e33xCiC-y z^M^k#3^JE+hhp-t{YiU#7l%x4MGH}%BlbGbDm$#4i@B6(89^TS{yLI%o0|;$NE7FX zDq-+m1%wCN3mF9(Rqs+>8?3Na5uGtowv>TKS*ggUM-(S2_~?CzyozR7i`BI_vb?Lk zjaa7-xUC9U>5mxc`afIW;tDqF%E)j~%|;d^I?*vMrSbiHweZ*V<$twt{#h;XgTZ&1 z2WTqJj>V4V!#v3N*oWkrb62)shXoAQ#Qo;P&Xr3LkW0ZDW1w7JLWU-FwLSYhr3E>phdhrE3?#RA`!{ zWisHv!H5uVBdd!++m3;mOh=9zt{;hMidgqixrFHxLg_`U`YU{_9#>K4yU|~Xn860Cyd!roc?68G@=ij1)#xmyLvQzN;M z*T7j^zP3V@ioh3IAR^^4qH+;1wDn6%(!$c_)$0yGW0es0t1SQQo#`7r4y5Qh^h85T<|QJ z!d&ixC_`S&5=1#)N~KpiZwbnY4-AV#Az)?L#wPm~9%xn_28^T{e>INik?((0jVTVD zgib8H%8`dp*)12jBG(~{J5=l9kPjmo&ui+Y*)j-A}6yF(2*&qW|72xhMgn8L6di)EC@&o9QBSw>WE z1AXZ1>Ahv&571%XmM4%wyScFsl0bWQZfx`3`e6Zgy=*VAP<>-Rorcs%2ErUq%^7mJ8?4F@EYt4C%+WS{ z8doU(UjQKi-u}MqqiSWboMi;?t9Wy08v-6jK21XaX~3&l*AU3G0BG4iV&mS;ySMM( zz=I1PPQ1AB_^Z3TR(Z~^_|BbaPWyYUvL4+poiZwDY>BC76TRs;e-pGFd>B% zj&R|H8H%tWh8cbcVTW3X7~u@d5p`k`CQ6hN0WcD9pb{d&@m!2J@^#9FHsa_b0XiZ_ z*pE1_xEql^9yp?GNaE-obIcj3QIjw>2PKqJit%ETw_SPVX+t(iLyBIic-odf>PBXn qGe&}DjLofCrfe+4INfAyGS^|AFLWp;lq3ScW}qHoNvKvK0028J#nnsz literal 0 HcmV?d00001 diff --git a/public/js/AjaxLib.js b/public/js/AjaxLib.js new file mode 100644 index 000000000..2ee8d458e --- /dev/null +++ b/public/js/AjaxLib.js @@ -0,0 +1,449 @@ +/** + * FH-Complete + * + * @package + * @author + * @copyright Copyright (c) 2016 fhcomplete.org + * @license GPLv3 + * @link https://fhcomplete.org + * @since Version 1.0.0 + */ + +//-------------------------------------------------------------------------------------------------------------------- +// Configs + +// To see debug messages into the browser console set this parameter as true +const DEBUG = false; + +// Default veil timeout (milliseconds) +const VEIL_TIMEOUT = 1000; + +//-------------------------------------------------------------------------------------------------------------------- +// Constants + +// Success +const SUCCESS = 0; + +// Properties present in a response +const CODE = "error"; +const RESPONSE = "retval"; + +// HTTP method parameters +const HTTP_GET_METHOD = "GET"; +const HTTP_POST_METHOD = "POST"; + +const REMOTE_CONTROLLER = "remoteController"; + +const FHC_CONTROLLER_ID = "fhc_controller_id"; + +/** + * Definition and initialization of object FHC_Ajax_Client + */ +var FHC_Ajax_Client = { + //------------------------------------------------------------------------------------------------------------------ + // Properties + + _veilCallersCounter: 0, // count the number of callers that want to activate the veil + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Performs a call using the HTTP GET method + * controllerParameters is an object + * ajaxCallParameters is an object + */ + ajaxCallGet: function(remoteController, controllerParameters, ajaxCallParameters) { + FHC_Ajax_Client._ajaxCall(remoteController, controllerParameters, HTTP_GET_METHOD, ajaxCallParameters); + }, + + /** + * Performs a call using the HTTP POST method + * controllerParameters is an object + * ajaxCallParameters is an object + */ + ajaxCallPost: function(remoteController, controllerParameters, ajaxCallParameters) { + FHC_Ajax_Client._ajaxCall(remoteController, controllerParameters, HTTP_POST_METHOD, ajaxCallParameters); + }, + + /** + * Checks if the response is a success + */ + isSuccess: function(response) { + var isSuccess = false; + + if (jQuery.type(response) == "object" && response.hasOwnProperty(CODE) && response.hasOwnProperty(RESPONSE)) + { + if (response.error == SUCCESS) + { + isSuccess = true; + } + } + + return isSuccess; + }, + + /** + * Checks if the response is an error + */ + isError: function(response) { + return !FHC_Ajax_Client.isSuccess(response); + }, + + /** + * Checks if the response has data + */ + hasData: function(response) { + var hasData = false; + + if (FHC_Ajax_Client.isSuccess(response)) + { + if ((jQuery.type(response.retval) == "object" && !jQuery.isEmptyObject(response.retval)) + || (jQuery.isArray(response.retval) && response.retval.length > 0) + || (jQuery.type(response.retval) == "string" && response.retval.trim() != "") + || jQuery.type(response.retval) == "number") + { + hasData = true; + } + } + + return hasData; + }, + + /** + * Retrives data from response object + */ + getData: function(response) { + var data = null; + + if (FHC_Ajax_Client.hasData(response)) + { + data = response.retval; + } + + return data; + }, + + /** + * Retrives code from response object + */ + getCode: function(response) { + var code = 1; // Generic error + + if (jQuery.type(response) == "object" && response.hasOwnProperty(CODE)) + { + if (response.error == SUCCESS) + { + isSuccess = true; + } + } + + return code; + }, + + /** + * Show a veil + */ + showVeil: function(veilTimeout) { + if (typeof veilTimeout == "number") + { + FHC_Ajax_Client._veilTimeout = veilTimeout; + } + else + { + FHC_Ajax_Client._veilTimeout = VEIL_TIMEOUT; + } + FHC_Ajax_Client._showVeil(); + }, + + /** + * Hide a veil that was shown before + */ + hideVeil: function() { + FHC_Ajax_Client._hideVeil(); + }, + + //------------------------------------------------------------------------------------------------------------------ + // Private methods + + /** + * Generate the router URI using the connection parameters + */ + _generateRouterURI: function(remoteController) { + var uri = null; + + // Checks if global JS object FHC_JS_DATA_STORAGE_OBJECT exists + if (typeof FHC_JS_DATA_STORAGE_OBJECT !== "undefined") + { + uri = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/" + remoteController; + } + + return uri; + }, + + /** + * Method to print debug info after a controller has been called + */ + _printDebug: function(parameters, response, errorThrown) { + + if (DEBUG === true) // If global const DEBUG is true, but really true! + { + // Print info about called controller + console.log("Called controller: " + parameters.remoteController); + console.log("Call parameters:"); // parameters given to this call + console.log(parameters); + + if (response != null) // if there is a response... + { + console.log("Controller Response:"); + console.log(response); // ...print it + } + if (errorThrown != null) // if there is a jQuery error... + { + console.log("jQuery error:"); + console.log(errorThrown); // ...print it + } + console.log("--------------------------------------------------------------------------------------------"); + } + }, + + /** + * Method to call if the ajax call has succeeded + */ + _onSuccess: function(response, textStatus, jqXHR) { + + FHC_Ajax_Client._printDebug(this._data, response); // debug time! + + // Call the success callback saved in _successCallback property + // NOTE: this is not referred to FHC_Ajax_Client but to the ajax object + this._successCallback(response); + }, + + /** + * Method to call if the ajax call has raised an error + */ + _onError: function(jqXHR, textStatus, errorThrown) { + + FHC_Ajax_Client._printDebug(this._data, null, errorThrown); // debug time! + + // Call the error callback saved in _errorCallback property + // NOTE: this is not referred to FHC_Ajax_Client but to the ajax object + this._errorCallback(jqXHR, textStatus, errorThrown); + }, + + /** + * Instantiate a new object and copy in it the properties from the parameter + */ + _cpObjProps: function(obj) { + var returnObj = {}; + + for (var prop in obj) + { + returnObj[prop] = obj[prop]; + } + + return returnObj; + }, + + /** + * Method to show the veil + */ + _showVeil: function() { + if (FHC_Ajax_Client._veilCallersCounter == 0) + { + $("
").appendTo('body'); + } + + FHC_Ajax_Client._veilCallersCounter++; + }, + + /** + * Method to hide the veil + */ + _hideVeil: function() { + window.setTimeout(function() { + if (FHC_Ajax_Client._veilCallersCounter >= 0) + { + if (FHC_Ajax_Client._veilCallersCounter > 0) + { + FHC_Ajax_Client._veilCallersCounter--; + } + + if (FHC_Ajax_Client._veilCallersCounter == 0) + { + $(".veil").remove(); + } + } + }, + this._veilTimeout); + }, + + /** + * Retrives parameters from URL query string (HTTP GET parameters) + */ + _getUrlParameter: function(sParam) { + var sPageURL = decodeURIComponent(window.location.search.substring(1)), + sURLVariables = sPageURL.split('&'), + sParameterName, + i; + + for (i = 0; i < sURLVariables.length; i++) + { + sParameterName = sURLVariables[i].split('='); + + if (sParameterName[0] === sParam) + { + return sParameterName[1]; + } + } + }, + + /** + * Checks call parameters, if they are present and are valid + * It generates and returns all the parameters needed to perform an ajax remote call + * NOTE: console.error is used here because those are not messages for the final user, + * but for the web interface developer + */ + _checkAndGenerateAjaxParams: function(remoteController, controllerParameters, type, ajaxCallParameters) { + + var valid = true; // by default they are ok (we want to trust you, please do not betray it) + + // Returned parameters + var ajaxParameters = { + cache: false, // data are never cached by the browser + dataType: "json", // always json! + type: type // set HTTP method, GET or POST + }; + + // remoteController must be a NON-empty string + if (typeof remoteController == "string" && remoteController.trim() != "") + { + // Is it possible to generate the URL + if ((url = FHC_Ajax_Client._generateRouterURI(remoteController)) != null) + { + ajaxParameters.url = url; + } + else // but it could fail + { + console.error("FHC_JS_DATA_STORAGE_OBJECT is not present"); + valid = false; + } + } + else // otherwise is NOT possible to generate the URL + { + console.error("Invalid remoteController parameter"); + valid = false; + } + + // controllerParameters must be an object + if (typeof controllerParameters == "object") + { + // Copy the properties of controllerParameters into a new object + var data = FHC_Ajax_Client._cpObjProps(controllerParameters); + // Remote controller + data[REMOTE_CONTROLLER] = remoteController; + // fhc_controller_id is given if present + data[FHC_CONTROLLER_ID] = FHC_Ajax_Client._getUrlParameter(FHC_CONTROLLER_ID); + + // Stores them into ajaxParameters + // NOTE: property data is not possible to get later, + // so the variable data is saved also in _data and it will be used later + ajaxParameters.data = data; + ajaxParameters._data = data; + } + else + { + console.error("Invalid controller parameters, must be an object"); + valid = false; + } + + + // Checks if ajaxCallParameters is an object + if (typeof ajaxCallParameters == "object") + { + // If present, errorCallback must be a function + if (ajaxCallParameters.hasOwnProperty("errorCallback")) + { + if (typeof ajaxCallParameters.errorCallback == "function") + { + ajaxParameters._errorCallback = ajaxCallParameters.errorCallback; // save as property the callback error + ajaxParameters.error = FHC_Ajax_Client._onError; // function to call if an error occurred + } + else + { + console.error("Invalid errorCallback, it must be a function"); + valid = false; + } + } + + // If present, successCallback must be a function + if (ajaxCallParameters.hasOwnProperty("successCallback")) + { + if (typeof ajaxCallParameters.successCallback == "function") + { + ajaxParameters._successCallback = ajaxCallParameters.successCallback; // save as property the callback success + ajaxParameters.success = FHC_Ajax_Client._onSuccess; // function to call if succeeded + } + else + { + console.error("Invalid successCallback, it must be a function"); + valid = false; + } + } + + // If present, veilTimeout must be a number and cannot be less then 0 or greater then 60000 + if (ajaxCallParameters.hasOwnProperty("veilTimeout") && typeof ajaxCallParameters.veilTimeout == "number") + { + if (ajaxCallParameters.veilTimeout > 0 && ajaxCallParameters.veilTimeout < 60000) + { + ajaxParameters._veilTimeout = ajaxCallParameters.veilTimeout; + ajaxParameters.beforeSend = FHC_Ajax_Client._showVeil; + ajaxParameters.complete = FHC_Ajax_Client._hideVeil; + } + else if(ajaxCallParameters.veilTimeout == 0) + { + // veil is disabled + } + else + { + console.error("Invalid veilTimeout parameter, must be a number >= 0 and <= 60000"); + valid = false; + } + } + else // is not present or the value is invalid + { + ajaxParameters._veilTimeout = VEIL_TIMEOUT; + ajaxParameters.beforeSend = FHC_Ajax_Client._showVeil; + ajaxParameters.complete = FHC_Ajax_Client._hideVeil; + } + } + + if (valid === false) + { + ajaxParameters = null; + } + + return ajaxParameters; + }, + + /** + * Performs a call to the server were the CI PHP layer is running + * - remoteController: alias of the core controller to call + * - controllerParameters: parameters to give to the called controller + * - type: POST or GET HTTP method + * - ajaxCallParameters is an object and could contains: + * - errorCallback: function to call after an error has been raised + * - successCallback: function to call after succeeded + * - veilTimeout: veil timeout + */ + _ajaxCall: function(remoteController, controllerParameters, type, ajaxCallParameters) { + // Retrives the parameters for the ajax call + var ajaxParameters = FHC_Ajax_Client._checkAndGenerateAjaxParams(remoteController, controllerParameters, type, ajaxCallParameters); + + // Checks the given parameters if they are present and are valid + if (ajaxParameters != null) + { + $.ajax(ajaxParameters); // ajax call + } + } +}; diff --git a/public/js/bootstrapper.js b/public/js/bootstrapper.js index 8697e17ad..290749c11 100644 --- a/public/js/bootstrapper.js +++ b/public/js/bootstrapper.js @@ -1,10 +1,8 @@ -/* -file for adding bootstrap classes, e.g. in case usage of non-bootstrap widgets in a bootstrap page -AVOID USING THIS IF POSSIBLE +/** + * To add bootstrap classes, e.g. in case usage of non-bootstrap widgets in a bootstrap page + * NOTE: avoid using this if possible */ -$(document).ready( - function() - { +$(document).ready(function() { $("input[type=text], select").addClass("form-control"); $("button, input[type=button]").addClass("btn btn-default"); $("table").addClass("table-condensed"); From 748ab6fac3205eebace69a0a433d6c13d9cd3bf2 Mon Sep 17 00:00:00 2001 From: Paolo Date: Tue, 15 May 2018 19:19:29 +0200 Subject: [PATCH 3/5] Unique ID for each call to a controller - Added constant FHC_CONTROLLER_ID to FHC_Controller - Added private property _controllerId to FHC_Controller - Added protected method setControllerId to FHC_Controller - Added protected method getControllerId to FHC_Controller --- application/core/FHC_Controller.php | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/application/core/FHC_Controller.php b/application/core/FHC_Controller.php index f6f138441..815c03da2 100644 --- a/application/core/FHC_Controller.php +++ b/application/core/FHC_Controller.php @@ -4,6 +4,10 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class FHC_Controller extends CI_Controller { + const FHC_CONTROLLER_ID = 'fhc_controller_id'; // name of the parameter used to identify uniquely a call to a controller + + private $_controllerId; // contains the unique identifier of a call to a controller + /** * Standard construct for all the controllers, loads the authentication system */ @@ -11,6 +15,8 @@ class FHC_Controller extends CI_Controller { parent::__construct(); + $this->_controllerId = null; // set _controllerId as null by default + $this->load->helper('fhcauth'); } @@ -23,4 +29,34 @@ class FHC_Controller extends CI_Controller { $this->load->library('PhrasesLib', array($categories, $language), 'p'); } + + /** + * Sets the unique id for the called controller + * NOTE: it is only working with HTTP GET request, not neeaded with POST + * because the first call to the controller is via HTTP GET, + * therefore a fhc_controller_id is already generated + */ + protected function setControllerId() + { + if ($_SERVER['REQUEST_METHOD'] === 'GET') + { + $this->_controllerId = $this->input->get(self::FHC_CONTROLLER_ID); + + if (!isset($this->_controllerId) || empty($this->_controllerId)) + { + $this->_controllerId = uniqid(); // generate a unique id + // Redirect to the same URL, but giving FHC_CONTROLLER_ID as HTTP GET parameter + header(sprintf('Location: %s?%s=%s', $_SERVER['REQUEST_URI'], self::FHC_CONTROLLER_ID, $this->_controllerId)); + exit; // terminate immediately the execution of this controller + } + } + } + + /** + * Return the value of the property _controllerId + */ + protected function getControllerId() + { + return $this->_controllerId; + } } From 087299cf8473b07a6872e8019e3f0b465187b4b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Wed, 16 May 2018 08:48:37 +0200 Subject: [PATCH 4/5] Added Unoconv 0.6 switch because converting text documents to pdf fails --- application/libraries/DocumentLib.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/application/libraries/DocumentLib.php b/application/libraries/DocumentLib.php index 6def51ab5..ed87a9f38 100644 --- a/application/libraries/DocumentLib.php +++ b/application/libraries/DocumentLib.php @@ -57,6 +57,10 @@ class DocumentLib case 'application/vnd.ms-word': case 'application/vnd.oasis.opendocument.text': case 'text/plain': + // Unoconv Version 0.6 seems to fail on converting TXT Files + if ($this->unoconv_version == '0.6') + return error(); + $ret = $this->convert($filename, $outFile, 'pdf'); if(isSuccess($ret)) { @@ -64,7 +68,7 @@ class DocumentLib } else { - return $ret; + return error($ret->retval); } case 'application/pdf': return success($filename); From 024bb06b0f2e2cd4c15211852641ad0500208e1d Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 16 May 2018 11:52:37 +0200 Subject: [PATCH 5/5] improved currgeschaeftsjahrquery --- application/models/organisation/Geschaeftsjahr_model.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/models/organisation/Geschaeftsjahr_model.php b/application/models/organisation/Geschaeftsjahr_model.php index e806058ae..9c856f40e 100644 --- a/application/models/organisation/Geschaeftsjahr_model.php +++ b/application/models/organisation/Geschaeftsjahr_model.php @@ -21,7 +21,9 @@ class Geschaeftsjahr_model extends DB_Model $query = 'SELECT * FROM public.tbl_geschaeftsjahr WHERE start <= now() - AND ende >= now()'; + AND ende >= now() + ORDER BY start DESC + LIMIT 1'; return $this->execQuery($query); }