From: Kilian Saffran Date: Mon, 18 Jan 2021 15:16:19 +0000 (+0100) Subject: v20210118 pwa added X-Git-Tag: 1.1.2~1 X-Git-Url: http://cloud.dks.lu/git/?a=commitdiff_plain;h=640e8ad8194f10d3215dc70baebfd5cf1444d692;p=pot_lu.git v20210118 pwa added --- diff --git a/app/db.cgi b/app/db.cgi index f277700d..e24935fd 100644 --- a/app/db.cgi +++ b/app/db.cgi @@ -64,7 +64,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ if (exists($p->{schemata})){ $schema = $db->securetext($p->{schemata}); } - if ($p->{get} =~ /periods$|periodweeksums$|perioddays$|perioddata$|staffperiods$|staffperiodsgrouped$|staffperiodsplitted$|defaultdaylimits$/){ + if ($p->{get} =~ /periods$|periodweeksums$|perioddays$|perioddata$|staffperiods$|staffperiodsgrouped$|staffperiodsplitted$|defaultdaylimits$|lastperioddates$/){ my $period = POT::Period->new({db => $db}); if ($p->{get} eq 'periods'){ $hres = $period->getPeriods($schema); @@ -94,6 +94,9 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ elsif ($p->{get} eq "defaultdaylimits"){ $hres = $period->getDefaultDayLimits($schema); } + elsif ($p->{get} eq "lastperioddates"){ + $hres = $period->getLastPeriodDates($schema); + } } elsif ($p->{get} =~ /company$|companiesdata$|staffgroups$|staffgroup$|sectors$|allschemalist$|companysize$|vacancydays$|gvacancytypes$|sectordata$/){ my $cp = POT::Company->new({db => $db}); if ($p->{get} eq 'companiesdata'){ @@ -188,7 +191,7 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){ } } - if ($p->{get} !~ /periodweeksums$|staffperiodsgrouped$|company$|workplan$|workplanday$|worktime$|staffcontract$|staff$|staffgroup$|defaultdaylimits$|termsstatus$|user$/ ){ + if ($p->{get} !~ /periodweeksums$|staffperiodsgrouped$|company$|workplan$|workplanday$|worktime$|staffcontract$|staff$|staffgroup$|defaultdaylimits$|termsstatus$|user$|lastperioddates$/ ){ foreach my $r (sort {$a <=> $b} keys(%{$hres})){ push(@retdata,$hres->{$r}); } diff --git a/app/index.cgi b/app/index.cgi index adc7b837..1d6283a5 100644 --- a/app/index.cgi +++ b/app/index.cgi @@ -25,10 +25,10 @@ my $sess = (); my $se = session->new({db => $db}); $vars->{ua} = $ENV{HTTP_USER_AGENT}; -if (($vars->{ua} !~ /^POT/) && ($vars->{ua} !~ /iPad/)){ - print "Location: https://www.plandutravail.lu\n\n"; - exit(0); -} +# if (($vars->{ua} !~ /^POT/) && ($vars->{ua} !~ /iPad/)){ +# print "Location: https://www.plandutravail.lu\n\n"; +# exit(0); +# } $vars->{realpath} = $cgi->url({-absolute=>1}); $vars->{filepath} = substr($cgi->url({-absolute=>1}),length($vars->{basepath})+1); $vars->{baseurl} = $cgi->url({-base=>1}).'/'.$vars->{basepath}; @@ -48,7 +48,7 @@ $vars->{abspath} = ""; $p->{sid} = $cgi->cookie($vars->{cookiename}); -print STDERR "cookie: ".$vars->{cookiename}." : ".$p->{sid}."\n--\n"; +#print STDERR "cookie: ".$vars->{cookiename}." : ".$p->{sid}."\n--\n"; if ($cgi->request_method() eq "GET"){ my @params = $cgi->param(); foreach my $pp (@params){ @@ -95,7 +95,7 @@ if (($cgi->request_method() eq "POST") || ($cgi->request_method() eq "GET")){ } if ($p->{sid} ne ""){ $sess = $se->getsession($p->{sid}); - print STDERR "after sessioncheck:".Dumper($sess); + #print STDERR "after sessioncheck:".Dumper($sess); if ($sess == undef){ $p->{sid} = ""; $skl = "login.tt"; diff --git a/app/lib/POT/Period.pm b/app/lib/POT/Period.pm index cb8e8b20..dbb0c8fa 100644 --- a/app/lib/POT/Period.pm +++ b/app/lib/POT/Period.pm @@ -754,4 +754,11 @@ sub invalidatePeriod(){ return 1; } +sub getLastPeriodDates(){ + my $self = shift; + my $schema = shift; + my $sql = "select max(startdate) as startdate,max(enddate) as enddate,case when date(max(startdate) - interval '1 year') < current_date then null else date(max(startdate) - interval '1 year') end as alloweddate from ".$schema.".reportperiod;"; + return $self->{db}->query($sql); +} + 1; \ No newline at end of file diff --git a/app/lib/session.pm b/app/lib/session.pm index 0cca33e9..5823ade8 100644 --- a/app/lib/session.pm +++ b/app/lib/session.pm @@ -98,7 +98,7 @@ sub getsession($){ my $sql = "select se.id as idsession,us.lang,us.id,us.username,ugrp.id as usergroup,us.id_staffgroups as staffgroups,se.sessiondata from sessions se join users us on (us.id=se.id_user) left join usergroups ugrp on (ugrp.id=us.id_usergroup) -where se.id= '".$self->{db}->securetext($sid)."' and se.remote_addr= '".$ENV{REMOTE_ADDR}."' and (se.user_agent LIKE '".'%POT%'."' OR se.user_agent LIKE ''".'%iPad%'."'') and +where se.id= '".$self->{db}->securetext($sid)."' and se.remote_addr= '".$ENV{REMOTE_ADDR}."' and (se.user_agent LIKE '".'%POT%'."' OR se.user_agent LIKE '".'%iPad%'."') and us.isblocked is null group by se.id,us.id,ugrp.id;"; #and se.user_agent LIKE 'POT/%/%/%' my $res= $self->{db}->querysorted($sql); diff --git a/app/manifest.json b/app/manifest.json new file mode 100644 index 00000000..8e1a4ea4 --- /dev/null +++ b/app/manifest.json @@ -0,0 +1,47 @@ +{ + "name": "POT", + "short_name": "POT", + "icons": [ + { + "src": "/img/favicon/android-icon-36x36.png", + "sizes": "36x36", + "type": "image/png", + "density": "0.75" + }, + { + "src": "/img/favicon/android-icon-48x48.png", + "sizes": "48x48", + "type": "image/png", + "density": "1.0" + }, + { + "src": "/img/favicon/android-icon-72x72.png", + "sizes": "72x72", + "type": "image/png", + "density": "1.5" + }, + { + "src": "/img/favicon/android-icon-96x96.png", + "sizes": "96x96", + "type": "image/png", + "density": "2.0" + }, + { + "src": "/img/favicon/android-icon-144x144.png", + "sizes": "144x144", + "type": "image/png", + "density": "3.0" + }, + { + "src": "/img/favicon/android-icon-192x192.png", + "sizes": "192x192", + "type": "image/png", + "density": "4.0" + } + ], + "start_url":"/index.html", + "background_color":"#52638e", + "theme_color":"#52638e", + "display":"standalone", + "orientation":"portrait" +} \ No newline at end of file diff --git a/app/static/img/favicon/manifest.json b/app/static/img/favicon/manifest.json index 013d4a6a..bf7254f1 100644 --- a/app/static/img/favicon/manifest.json +++ b/app/static/img/favicon/manifest.json @@ -1,41 +1,47 @@ { - "name": "App", + "name": "POT", + "short_name": "POT", "icons": [ { - "src": "\/android-icon-36x36.png", + "src": "/img/favicon/android-icon-36x36.png", "sizes": "36x36", - "type": "image\/png", + "type": "image/png", "density": "0.75" }, { - "src": "\/android-icon-48x48.png", + "src": "/img/favicon/android-icon-48x48.png", "sizes": "48x48", "type": "image\/png", "density": "1.0" }, { - "src": "\/android-icon-72x72.png", + "src": "/img/favicon/android-icon-72x72.png", "sizes": "72x72", "type": "image\/png", "density": "1.5" }, { - "src": "\/android-icon-96x96.png", + "src": "/img/favicon/android-icon-96x96.png", "sizes": "96x96", "type": "image\/png", "density": "2.0" }, { - "src": "\/android-icon-144x144.png", + "src": "/img/favicon/android-icon-144x144.png", "sizes": "144x144", "type": "image\/png", "density": "3.0" }, { - "src": "\/android-icon-192x192.png", + "src": "/img/favicon/android-icon-192x192.png", "sizes": "192x192", "type": "image\/png", "density": "4.0" } - ] + ], + "start_url":"/index.html", + "background_color":"#52638e", + "theme_color":"#52638e", + "display":"standalone", + "orientation":"portrait" } \ No newline at end of file diff --git a/app/static/js/app.js b/app/static/js/app.js index 04b663d2..d789c71c 100644 --- a/app/static/js/app.js +++ b/app/static/js/app.js @@ -68,3 +68,12 @@ document.addEventListener("DOMContentLoaded", function() { moment.locale('fr'); initpage(); }); + +if ("serviceWorker" in navigator) { + window.addEventListener("load", function() { + navigator.serviceWorker + .register("/static/js/sw.js") + .then(res => console.log("service worker registered")) + .catch(err => console.log("service worker not registered", err)) + }) +} diff --git a/app/static/js/app.min.js b/app/static/js/app.min.js index 08ec3261..b21a4787 100644 --- a/app/static/js/app.min.js +++ b/app/static/js/app.min.js @@ -1 +1,8 @@ -let app={loadpage:function(modulepage,modulename){location.href=modulepage},logout:function(){postData(location.href,{logout:"1"}).then(data=>{location.href="login.html"})},reloadpage(){},changedataset:function(){},getCurrentSchemata:function(){return schemata},changedataset:function(){let csel=document.getElementById("current_schemata").value;schemata=csel,postData("db.cgi",{fn:"setsessiondata",params:{schemata:csel}}).then(data=>{document.getElementById("current_schemata").dataset.selected=csel})},setschemata(data){},reload_page:function(){location.href=location.href},viewpanel:function(pnlname){let panels=document.getElementsByClassName("panel"),toolbars=document.getElementsByClassName("paneltoolbar");currentview=pnlname;for(let p=0;p{location.href="login.html"})},reloadpage(){},changedataset:function(){},getCurrentSchemata:function(){return schemata},changedataset:function(){let e=document.getElementById("current_schemata").value +schemata=e,postData("db.cgi",{fn:"setsessiondata",params:{schemata:e}}).then(t=>{document.getElementById("current_schemata").dataset.selected=e})},setschemata(e){},reload_page:function(){location.href=location.href},viewpanel:function(e){let t=document.getElementsByClassName("panel"),n=document.getElementsByClassName("paneltoolbar") +currentview=e +for(let e=0;evoid 0).catch(e=>void 0)}) diff --git a/app/static/js/request.js b/app/static/js/request.js index 2eba8bbb..0724d1c0 100644 --- a/app/static/js/request.js +++ b/app/static/js/request.js @@ -17,7 +17,10 @@ async function postData(url = '', data = {}) { body: JSON.stringify(data) }); - return response.json(); + //console.log(response.text()); + var x = response.json(); + if (x) { return x;} + return {}; } var report ={ diff --git a/app/static/js/sw.js b/app/static/js/sw.js new file mode 100644 index 00000000..e3e5d96b --- /dev/null +++ b/app/static/js/sw.js @@ -0,0 +1,21 @@ +const staticpot = "pot" +const assets = [ + "/", + "/index.html" +] + +self.addEventListener("install", installEvent => { + installEvent.waitUntil( + caches.open(staticpot).then(cache => { + cache.addAll(assets) + }) + ) +}) + +self.addEventListener("fetch", fetchEvent => { + fetchEvent.respondWith( + caches.match(fetchEvent.request).then(res => { + return res || fetch(fetchEvent.request) + }) + ) +}) \ No newline at end of file diff --git a/app/tmpl/index.tt b/app/tmpl/index.tt index cd18c851..cea6cf4d 100644 --- a/app/tmpl/index.tt +++ b/app/tmpl/index.tt @@ -1,4 +1,4 @@ -[% appversion='1.0.28' %] +[% appversion='1.0.28dev2' %] [% minify = '' %] [% PROCESS "lang/${lang}.tt" %] diff --git a/app/tmpl/lang/de.tt b/app/tmpl/lang/de.tt index aa78a896..b75f96b4 100644 --- a/app/tmpl/lang/de.tt +++ b/app/tmpl/lang/de.tt @@ -184,5 +184,8 @@ "pwdcondition" => "Passwörter müssen mindstens 10 Zeichen lang seien und mindestens 1 Grossbuchstabe, 1 Klein-Buchstabe und 1 Zahl enthalten", "genpwd" => "Passwort vorschlagen", "usergroup" => "Berechtigungen", - "language" => "Sprache" + "language" => "Sprache", + "msgdeldefworkplan" => "Der Standard Wochenplan kann nicht gelöscht werden!", + "msgdelusedworkplan" => "Solange ein Plan für einen Mitarbeiter eingetragen ist, kann er nicht gelöscht werden!", + "msgaddperiod" => "Sie können keine Periode mehr vor folgendem Datum hinzufügen: " } %] \ No newline at end of file diff --git a/app/tmpl/lang/fr.tt b/app/tmpl/lang/fr.tt index 09429772..1c6f9e34 100644 --- a/app/tmpl/lang/fr.tt +++ b/app/tmpl/lang/fr.tt @@ -184,5 +184,8 @@ "pwdcondition" => "les mots de passes doivent contenir au moins 10 lettres , au moins une lettre majuscule, une lettre minuscule et un nombre", "genpwd" => "Passwort vorschlagen", "usergroup" => "Droits d'accès", - "language" => "Langue" + "language" => "Langue", + "msgdeldefworkplan" => "Le plan Standard ne peut pas être supprimé!", + "msgdelusedworkplan" => "Le plan ne peut pas être supprimé dès qu'il est utilisé par un salarié", + "msgaddperiod" => "vous ne pouvez plus ajouter des périodes avant le: " } %] \ No newline at end of file diff --git a/app/tmpl/module/periods.tt b/app/tmpl/module/periods.tt index 13bff824..d00c2541 100644 --- a/app/tmpl/module/periods.tt +++ b/app/tmpl/module/periods.tt @@ -5,14 +5,14 @@ [% lbl.back %]
[% lbl.refperiods %]
- - - + + + [% IF session.usergroup == 'admin' %] - + [% END %] [% IF session.usergroup != 'teamleader' %] - + [% END %] diff --git a/app/tmpl/module/periods/reportperiod.js b/app/tmpl/module/periods/reportperiod.js index fc0ea136..38fe2dd0 100644 --- a/app/tmpl/module/periods/reportperiod.js +++ b/app/tmpl/module/periods/reportperiod.js @@ -128,7 +128,7 @@ let reportperiod ={ reportperiod.tbl.setData(data.result.sqldata); } }); - + //return false; } else { reportperiod.tbl.setData([]); reportperiod.tblsplitted.setData([]); @@ -147,16 +147,22 @@ let reportperiod ={ app.viewpanel('tbl_reportperiod'); }, add: function(){ - let act = {}; - act["fn"] = "add_reportperiod"; - act["schemata"] = schemata; - showinfodlg("Ajouter Période de référence","Ajouter prochaine periode?",reportperiod.afteraddconfirm,act,"[% lbl.add %]","[% lbl.cancel %]"); - return false; + postData("db.cgi",{"get":"lastperioddates","schemata":schemata}).then(data => { + console.log("data",data); + if (data.result.data.alloweddate != null){ + showmessagedlg("Info","[% lbl.msgaddperiod %] "+ moment(data.result.data.alloweddate).format('DD.MM.YYYY')); + } else { + postData("db.cgi",{"fn":"add_reportperiod","schemata":schemata}).then(nrepid => { + console.log(nrepid); + reportperiod.gettbldata(); + }).catch(err => { console.log(err)}); + + } + + }).catch(err => { console.log(err)}); }, - afteraddconfirm(data){ - postData("db.cgi",data).then(data => { - reportperiod.gettbldata(); - }); + afteraddconfirm(){ + }, generatereport: function(){ diff --git a/app/tmpl/module/workplans/workplans.js b/app/tmpl/module/workplans/workplans.js index eb0a7a7b..f7653675 100644 --- a/app/tmpl/module/workplans/workplans.js +++ b/app/tmpl/module/workplans/workplans.js @@ -143,11 +143,13 @@ let workplans ={ remove: function(){ let udata = workplans.tblfilter.getSelectedData(); if (udata[0].isdefault){ - showmessagedlg("Info","Le plan Standard ne peut pas être supprimé!"); + + + showmessagedlg("Info","[% lbl.msgdeldefworkplan %]"); return false; } if (parseInt(udata[0].staffcount) > 0){ - showmessagedlg("Info","Le plan ne peut pas être supprimé dès qu'il est utilisé par un salarié"); + showmessagedlg("Info","[% lbl.msgdelusedworkplan %]"); return false; } if (udata[0]) {