From: Kilian Saffran Date: Tue, 22 Dec 2020 17:45:39 +0000 (+0100) Subject: v20201222 X-Git-Url: http://cloud.dks.lu/git/?a=commitdiff_plain;h=612fc1adb6c2365ea54d3e9cbc24db07e259ff2f;p=invoicejournal.git v20201222 --- diff --git a/desktopapp/css/app.css b/desktopapp/css/app.css deleted file mode 100644 index 3d24221..0000000 --- a/desktopapp/css/app.css +++ /dev/null @@ -1,6 +0,0 @@ -@import "../js/vendor/tabulator/css/tabulator_site.css"; -@import "../js/vendor/slimselect/slimselect.css"; -@import "../js/vendor/flatpickr/flatpickr.min.css"; -@import "../js/vendor/flatpickr/themes/airbnb.css"; -@import "icons.css"; -@import "theme.css"; \ No newline at end of file diff --git a/desktopapp/css/theme.css b/desktopapp/css/theme.css index e433f36..cf7b1c4 100644 --- a/desktopapp/css/theme.css +++ b/desktopapp/css/theme.css @@ -1059,4 +1059,9 @@ span[class^="icon-inline"]::after { @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } -} \ No newline at end of file +} + +.tlbicon { + font-size: 16px; +} + diff --git a/desktopapp/dialogs/InvoiceBooking.html b/desktopapp/dialogs/InvoiceBooking.html index 20924ce..172b068 100644 --- a/desktopapp/dialogs/InvoiceBooking.html +++ b/desktopapp/dialogs/InvoiceBooking.html @@ -108,8 +108,12 @@
+
+ +
+
diff --git a/desktopapp/dialogs/MailTemplate.html b/desktopapp/dialogs/MailTemplate.html deleted file mode 100644 index 8b4225d..0000000 --- a/desktopapp/dialogs/MailTemplate.html +++ /dev/null @@ -1,54 +0,0 @@ - \ No newline at end of file diff --git a/desktopapp/dialogs/hiddenfileupload.html b/desktopapp/dialogs/hiddenfileupload.html deleted file mode 100644 index 0dc785b..0000000 --- a/desktopapp/dialogs/hiddenfileupload.html +++ /dev/null @@ -1,6 +0,0 @@ -
-
- - -
-
\ No newline at end of file diff --git a/desktopapp/index.html b/desktopapp/index.html index bb2f445..5515260 100644 --- a/desktopapp/index.html +++ b/desktopapp/index.html @@ -3,64 +3,67 @@ - - - Invoice Journal - + + + + + + + Invoice Journal -
+ -
-
- - - - - - - - - - - - +
+
+
+ +
Invoice Journal
+
+
+
+
+

Module

+
+
+ +
+
+
+
+

Konfiguration

+
+
+ +
+
+
+
+
- - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - -
+ + + +
+ +
+ + diff --git a/desktopapp/js/app.js b/desktopapp/js/app.js deleted file mode 100644 index e33d04c..0000000 --- a/desktopapp/js/app.js +++ /dev/null @@ -1,30 +0,0 @@ -//let version=new Date().toISOString().substring(0,10); -// require(__dirname + '/js/vendor/tabulator/js/tabulator.js'); -// require(__dirname + '/js/vendor/moment/moment-with-locales.min.js'); -// require(__dirname + '/js/vendor/slimselect/slimselect.min.js'); -// require(__dirname + '/js/vendor/flatpickr/flatpickr.min.js'); -// require(__dirname + '/js/vendor/flatpickr/l10n/de.js'); -// require(__dirname + '/js/vendor/tinymce/js/tinymce/tinymce.min.js'); -// require(__dirname + '/js/vendor/mustache/mustache.min.js'); -// require(__dirname + '/js/global/request.js'); -// require(__dirname + '/js/global/myapp.js'); -// require(__dirname + '/js/dataform.js'); -// require(__dirname + '/js/timecalc.js'); -// require(__dirname + '/js/global/renderer.js'); -// require(__dirname + '/js/global/sqlite.js'); -// require(__dirname + '/js/global/report.js'); -// require(__dirname + '/js/modules/addresses.js'); -// require(__dirname + '/js/modules/bookings.js'); -// require(__dirname + '/js/modules/booking.js'); -// require(__dirname + '/js/modules/index.js'); -// require(__dirname + '/js/modules/invoice.js'); -// require(__dirname + '/js/modules/invoices.js'); -// require(__dirname + '/js/modules/offer.js'); -// require(__dirname + '/js/modules/offers.js'); -// require(__dirname + '/js/modules/product.js'); -// require(__dirname + '/js/modules/products.js'); -// require(__dirname + '/js/modules/transaction.js'); -// require(__dirname + '/js/modules/transactions.js'); -// require(__dirname + '/js/modules/settings.js'); -// require(__dirname + '/js/modules/datasets.js'); -// require(__dirname + '/js/modules/templates.js'); \ No newline at end of file diff --git a/desktopapp/js/dataform.js b/desktopapp/js/dataform.js index 3f4f264..4def5c5 100644 --- a/desktopapp/js/dataform.js +++ b/desktopapp/js/dataform.js @@ -36,7 +36,7 @@ let dataform = { // } if (field.tagName == "TEXTAREA" ){ if (field.classList.contains("richeditarea")){ - flds[field.dataset.table][field.dataset.column] = tinymce.get(field.id).getContent().replace(/'/g,"''"); + flds[field.dataset.table][field.dataset.column] = tinymce.get(field.id).getContent(); } else { flds[field.dataset.table][field.dataset.column] = field.innerHTML; } @@ -104,16 +104,52 @@ let dataform = { } return false; }, - + // cleanform2: function(frmname,choices){ + // var frm = document.getElementById("frm_" + frmname); + // for (var f in frm){ + // if (frm[f] && frm[f].id){ + // if (frm[f].tagName == 'INPUT'){ + // if (frm[f].type == "checkbox"){ + // frm[f].checked = false; + // } else if (frm[f].classList.contains("datefield")){ + // if (frm[f]._flatpickr){ frm[f]._flatpickr.clear(); } + // } else if (frm[f].classList.contains("choices__input")){ + // if (choices[frm[f].id]){ + // choices[frm[f].id].removeActiveItems(); + // } + // } else { + // frm[f].value = ""; + // } + // } + // if (frm[f].tagName == 'SELECT'){ + // if (frm[f].multiple == true){ + // if (frm[f].classList.contains("choices__input")){ + // choices[frm[f].id].removeActiveItems(); + // } + // } else { + // frm[f].value = ""; + // } + + // } + // if (frm[f].tagName == 'TEXTAREA'){ + // if (frm[f].classList.contains("richeditarea")){ + // tinymce.get(frm[f].id).setContent(""); + // } else { + // frm[f].innerHTML = ""; + // } + // } + // } + // } + // return false; + // }, fillform: function(dataclass,choices,data){ var frm = document.querySelectorAll('.data_'+ dataclass); //console.log("frmdata",frm); if (data){ - for (var f in frm){ var tblid = null; - console.log("ID",frm[f].id); + //console.log("ID",frm[f].id); if (frm[f].id){ tblid = frm[f].id.replace(dataclass + "_",""); frm[f].dataset.id=data['id']; @@ -197,7 +233,7 @@ let dataform = { sellist.push({value:listdata[i][vidcol],text:listdata[i][vvalcol]}); } } - //console.log("Select data",sellist); + console.log("Select data",obj,sellist); obj.setData(sellist); if (obj.select.element.dataset.selected && obj.select.element.dataset.selected != ""){ obj.set(obj.select.element.dataset.selected); diff --git a/desktopapp/js/email.js b/desktopapp/js/email.js new file mode 100644 index 0000000..30df56f --- /dev/null +++ b/desktopapp/js/email.js @@ -0,0 +1,63 @@ +let email = { + openthunderbird: function(maildata){ + let args =[]; + let mailcfg =[]; + mailcfg.push("to='"+ maildata.to+"'"); + mailcfg.push("from='"+ maildata.from +"'"); + mailcfg.push("subject='"+ maildata.subject +"'"); + mailcfg.push("format=1"); // format => 1=HTML, 2=text + mailcfg.push("body='"+ maildata.body+"'"); + mailcfg.push("attachment='"+ maildata.attachments.join(',').replace(/\//g,"\\")+"'"); + args.push("-compose",mailcfg.join(",")) + + const mailappout = spawn(preferences.global.mailapp, args); + mailappout.stdout.on('data', (data) => { + + console.log(`mailappout stdout: ${data}`); + }); + + mailappout.stderr.on('data', (data) => { + console.error(`mailappout stderr: ${data}`); + }); + + mailappout.on('close', (code) => { + console.log(`mailappout: child process exited with code ${code}`); + }); + }, + openOutlook: function(){ + //outlook.exe /c ipm.note /m "someone@microsoft.com&subject=test%20subject&body=test%20body" /a test.txt + }, + sendWithSMTP: function(maildata){ + const transporter = nodemailer.createTransport({ + host: preferences.global.mailserver, + port: preferences.global.mailport, + auth: { + user: preferences.global.mailuser, + pass: preferences.global.mailpassword + } + }); + let afiles = []; + for (var a=0;a 0){ + await transporter.sendMail({ + from: maildata.from, + to: maildata.to, + subject: maildata.subject, + html: maildata.body, + attachments: afiles + }); + } else { + await transporter.sendMail({ + from: maildata.from, + to: maildata.to, + subject: maildata.subject, + html: maildata.body + }); + } + // send email + + //console.log("Message sent: %s", info.messageId); + } +} \ No newline at end of file diff --git a/desktopapp/js/global/email.js b/desktopapp/js/global/email.js deleted file mode 100644 index adc342e..0000000 --- a/desktopapp/js/global/email.js +++ /dev/null @@ -1,37 +0,0 @@ -let email = { - openthunderbird: function(maildata){ - let args =[]; - let mailcfg =[] - mailcfg.push("to='"+ maildata.to+"'"); - mailcfg.push("from='"+ maildata.from +"'"); - mailcfg.push("subject='"+ maildata.subject +"'"); - mailcfg.push("format=1"); // format => 1=HTML, 2=text - mailcfg.push("body='"+ maildata.body+"'"); - mailcfg.push("attachment='"+ maildata.attachments.join(',').replace(/\//g,"\\")+"'"); - args.push("-compose",mailcfg.join(",")) - //); - //process.stderr.write("Email:\n-----\n"+preferences.global.mailapp + " " + args.join(" ")+"\n-----\n"); - const mailappout = spawn(preferences.global.mailapp, args); - mailappout.stdout.on('data', (data) => { - - console.log(`pdfout stdout: ${data}`); - }); - - mailappout.stderr.on('data', (data) => { - console.error(`pdfout stderr: ${data}`); - }); - - mailappout.on('close', (code) => { - console.log(`pdfout: child process exited with code ${code}`); - // if (code == 0){ - // console.log("Copy",report.tmpoutput,"to",report.output); - // if (fs.existsSync(report.output)){ - // fs.unlinkSync(report.output); - // } - // fs.copyFileSync(report.tmpoutput,report.output); - // report.callback({"file":report.reportfile}); - // } - - }); - } -} \ No newline at end of file diff --git a/desktopapp/js/global/request.js b/desktopapp/js/global/request.js deleted file mode 100644 index 6e26cac..0000000 --- a/desktopapp/js/global/request.js +++ /dev/null @@ -1,245 +0,0 @@ -var api = 'http://localhost:6060/'; - -async function postData(module,schema,fn,data = {}) { - // Default options are marked with * - const response = await fetch(api + '/'+ module+'/'+ schema+'/'+fn, { - method: 'POST', - mode: 'same-origin', - cache: 'no-cache', - credentials: 'same-origin', - headers: { - 'Content-Type': 'application/json' - - }, - redirect: 'follow', - referrerPolicy: 'strict-origin', - body: JSON.stringify(data) - }); - return response.json(); - } -// if (location.pathname.indexOf('modules') > 0){ -// api = location.origin + location.pathname.substring(0, location.pathname.indexOf('module')) + 'api/'; -// } -//console.log(api); -var req = { - multipartform: function(url, frmname, callback) { - var ret = null; - var frm = document.getElementById(frmname); - var frmdata = new FormData(); - for (var i = 0; i < frm.elements.length; i++) { - var field = frm.elements[i]; - if ( field.tagName == "INPUT" && field.type == "file"){ - frmdata.append("file",field.files[0]); - } else if (field.tagName == "INPUT"){ - frmdata.append("folder",field.value); - } - } - if (!callback) { - callback = req.asyncNoEvent; - } - var request = new XMLHttpRequest(); - var sendurl = api + url; - console.log("Multipartsending URL: POST => " + sendurl + '?' + frmdata); - //console.log("Multipart sending URL: " + "POST" + " => " + sendurl); - request.open("POST", sendurl, true); - request.onload = function() { - if (request.status >= 200 && request.status <= 400) { - if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0) { - var xparse = JSON.parse(request.responseText); - ret = xparse.result; - } else { - ret = request.responseText; - } - callback(ret); - } else { - alert("ServerERROR:" + request.status + "\n" + request.responseText); - } - }; - request.onerror = function() { - alert("Connection ERROR!\n" + url); - }; - request.setRequestHeader('Content-Type', 'multipart/form-data'); - request.send(frmdata); - return ret; - }, - reqdata: function( data, callback) { - - var ret = null; - var rdata = null; - - if (!callback) { - callback = req.asyncNoEvent; - } - - var request = new XMLHttpRequest(); - if (typeof data == 'object') { - var xdata = []; - for (var i in data) { - var value = ''; - if (typeof(data[i]) == 'object') { - value = encodeURIComponent(JSON.stringify(data[i])); - } else { - value = encodeURIComponent(data[i]); - } - xdata.push(i + "=" + value); - } - rdata = xdata.join("&"); - } else { - rdata = data; - } - var sendurl = api + "db.cgi"; - console.log("sending URL => " + sendurl + '?' + rdata); - request.open("POST", sendurl, true); - request.onload = function() { - if (request.status >= 200 && request.status <= 400) { - if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0) { - console.log(xparse); - var xparse = JSON.parse(request.responseText); - ret = xparse.result; - console.log(ret); - } - - else { - ret = request.responseText; - //console.log("TEXT returned:" + ret); - } - callback(ret); - - - } else { - //console.log("ServerERROR: " + request.status + "\n" + request.responseText); - alert("ServerERROR:" + request.status + "\n" + request.responseText); - } - }; - request.onerror = function() { - //console.log("ERROR: connection ERROR\n" + url); - alert("Connection ERROR!\n" + url); - }; - request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); - request.send(rdata); - - return ret; - }, - reqfile: function(data, callback) { - - var ret = null; - var rdata = null; - - if (!callback) { - callback = req.asyncNoEvent; - } - - var request = new XMLHttpRequest(); - if (typeof data == 'object') { - var xdata = []; - for (var i in data) { - var value = ''; - if (typeof(data[i]) == 'object') { - value = encodeURIComponent(JSON.stringify(data[i])); - } else { - value = encodeURIComponent(data[i]); - } - xdata.push(i + "=" + value); - } - rdata = xdata.join("&"); - } else { - rdata = data; - } - var sendurl = api + "filesystem.cgi"; - console.log("sending URL => " + sendurl + '?' + rdata); - request.open("POST", sendurl, true); - request.onload = function() { - if (request.status >= 200 && request.status <= 400) { - if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0) { - console.log(xparse); - var xparse = JSON.parse(request.responseText); - ret = xparse.result; - //console.log(ret); - } - - else { - ret = request.responseText; - //console.log("TEXT returned:" + ret); - } - callback(ret); - - - } else { - //console.log("ServerERROR: " + request.status + "\n" + request.responseText); - alert("ServerERROR:" + request.status + "\n" + request.responseText); - } - }; - request.onerror = function() { - //console.log("ERROR: connection ERROR\n" + url); - alert("Connection ERROR!\n" + url); - }; - request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); - request.send(rdata); - - return ret; - }, - reqreport: function( data, callback) { - - var ret = null; - var rdata = null; - - if (!callback) { - callback = req.asyncNoEvent; - } - - var request = new XMLHttpRequest(); - if (typeof data == 'object') { - var xdata = []; - for (var i in data) { - var value = ''; - if (typeof(data[i]) == 'object') { - value = encodeURIComponent(JSON.stringify(data[i])); - } else { - value = encodeURIComponent(data[i]); - } - xdata.push(i + "=" + value); - } - rdata = xdata.join("&"); - } else { - rdata = data; - } - var sendurl = api + "report.cgi"; - console.log("sending URL => " + sendurl + '?' + rdata); - request.open("POST", sendurl, true); - request.onload = function() { - if (request.status >= 200 && request.status <= 400) { - if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0) { - console.log(xparse); - var xparse = JSON.parse(request.responseText); - ret = xparse.result; - - } - - else { - ret = request.responseText; - //console.log("TEXT returned:" + ret); - } - callback(ret); - - - } else { - //console.log("ServerERROR: " + request.status + "\n" + request.responseText); - alert("ServerERROR:" + request.status + "\n" + request.responseText); - } - }; - request.onerror = function() { - //console.log("ERROR: connection ERROR\n" + url); - alert("Connection ERROR!\n" + url); - }; - request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); - request.send(rdata); - - return ret; - }, - asyncNoEvent: function(data) { - //console.log("query done"); - //console.log(data); - //console.log("done"); - } - -} \ No newline at end of file diff --git a/desktopapp/js/modules/index.js b/desktopapp/js/modules/index.js deleted file mode 100644 index 5711e30..0000000 --- a/desktopapp/js/modules/index.js +++ /dev/null @@ -1,29 +0,0 @@ -let index={ - selects: {"bussinessyear":null}, - viewpanel: function(){ - myapp.viewpanel('index'); - }, - init(){ - // db.queryarray("select id,pref from defaultdata;").then(res => { - // console.log(res); - // for (var i=0;i { - console.log("result loadpanel",result); - if (result){ - let panels = document.getElementsByClassName("panel"); - for (let i=0;i { - document.getElementById("dlg" + dlgname).style.display = 'block'; - //}); - - }, - closeDialog: function(dlgname){ - document.getElementById("dlg" + dlgname).style.display = 'none'; - }, - confirm(title,message,strbtnok,strbtncancel,action){ - document.getElementById("dlgconfirm_title").innerHTML = title; - document.getElementById("dlgconfirm_text").innerHTML = message; - document.getElementById("dlgconfirm_btnok").innerHTML = strbtnok; - document.getElementById("dlgconfirm_btncancel").innerHTML = strbtncancel; - document.getElementById("dlgconfirm_btnok").setAttribute("onclick","document.getElementById('dlgconfirm').style.display='none';" + action); - document.getElementById("dlgconfirm").style.display = 'block'; - }, - message: function(title,message){ - document.getElementById('dlgmessage_title').innerHTML=title; - document.getElementById('dlgmessage_text').innerHTML=message; - document.getElementById('dlgmessage').style.display='block'; - return false; - }, - setpref: function(key,value){ - db.execAsync("REPLACE INTO defaultdata (id,pref) VALUES ('"+key+"','"+value+"');").then(res => { - myapp.loadpreferences(); - }); - return false; - }, - loadpreferences: function(){ - db.queryarray("select id,pref from defaultdata;").then(res => { - for (var i=0;i {console.log(data);}); - myapp.viewpanel("index"); - //index.init(); - //addresses.init(); - //files.inittable(); - //invoice.init(); - //invoices.init(); - //offers.init(); - //offer.init(); - //offerdetails.inittable(); - //transactions.inittable(); - //transaction.initform(); - //mpref.cfg = usersystem.getPreference(mpref.global.dataset); - - //admin.setident(); - // document.trigger('moduledataloaded'); - // document.bind('moduledataloaded', myapp.execmodulescript()); - // if (basedb && basedb != "") { - // //console.log("INFO basedb:" + basedb); - //app.getdatasets(); - - // } -}); \ No newline at end of file +const { fstat } = require("fs"); + +let preferences = { + global: null, + page: null, + defaultdata: {} +} + +let myapp = { + modules: [], + panels: {}, + gotoHome: function(){ + myapp.viewpanel('index'); + }, + loadpanel: function(module,idpanel){ + return new Promise( + function(resolve, reject){ + if (document.getElementById("pnl_" + idpanel).innerHTML == ''){ + var pnldoc = usersystem.readAppFile('modules/'+ module + '/' + idpanel + '.html'); + if (pnldoc == ""){ + reject('modules/'+ module + '/' + idpanel + '.html' + " data is empty"); + }else { + document.getElementById("pnl_" + idpanel).insertAdjacentHTML('afterbegin', pnldoc); + // console.log("obj type",eval("typeof "+ idpanel)); + if (eval("typeof "+ idpanel) == "object"){ + console.log("init now " + idpanel); + //console.log(eval(`${idpanel}`)); + eval(`${idpanel}.init();`); + } else { + console.log(idpanel + "not init"); + } + resolve(true); + } + } else { + resolve(true); + } + }); + }, + viewpanel: function(idpanel){ + myapp.loadpanel(myapp.panels[idpanel],idpanel).then(result => { + console.log("atfer load!"); + if (result){ + let panels = document.getElementsByClassName("panel"); + for (let i=0;i { + document.getElementById("dlg" + dlgname).style.display = 'block'; + //}); + + }, + closeDialog: function(dlgname){ + document.getElementById("dlg" + dlgname).style.display = 'none'; + }, + confirm(title,message,strbtnok,strbtncancel,action){ + document.getElementById("dlgconfirm_title").innerHTML = title; + document.getElementById("dlgconfirm_text").innerHTML = message; + document.getElementById("dlgconfirm_btnok").innerHTML = strbtnok; + document.getElementById("dlgconfirm_btncancel").innerHTML = strbtncancel; + document.getElementById("dlgconfirm_btnok").setAttribute("onclick","document.getElementById('dlgconfirm').style.display='none';" + action); + document.getElementById("dlgconfirm").style.display = 'block'; + }, + message: function(title,message){ + document.getElementById('dlgmessage_title').innerHTML=title; + document.getElementById('dlgmessage_text').innerHTML=message; + document.getElementById('dlgmessage').style.display='block'; + return false; + }, + setpref: function(key,value){ + db.execAsync("REPLACE INTO defaultdata (id,pref) VALUES ('"+key+"','"+value+"');").then(res => { + myapp.loadpreferences(); + }); + return false; + }, + loadpreferences: function(){ + db.queryarray("select id,pref from defaultdata;").then(res => { + for (var i=0;i
'); + // myapp.loadpanel(mods[m],pnlname).then( d => { + // if (eval("typeof "+ pnlname) == "object"){ + // eval(`${pnlname}.init();`); + // } + // } + + // ); + } + } + + + } + } + let modlinks = usersystem.readjson(usersystem.getSourcePath() + '/modules/modules.json'); + for (var lc in modlinks){ + if (document.getElementById("idxbar_" + lc)){ + for (c in modlinks[lc]){ + + document.getElementById("idxbar_" + lc).insertAdjacentHTML('beforeEnd',' '); + } + + } + } + } + // getCookie: function(cname) { + // var name = cname + "="; + // var decodedCookie = decodeURIComponent(document.cookie); + // var ca = decodedCookie.split(';'); + // for (var i = 0; i < ca.length; i++) { + // var c = ca[i]; + // while (c.charAt(0) == ' ') { + // c = c.substring(1); + // } + // if (c.indexOf(name) == 0) { + // return c.substring(name.length, c.length); + // } + // } + // return ""; + // }, + // setCookie: function(cname, cvalue) { + // document.cookie = cname + "=" + cvalue + ";path=/"; + // }, + // setident: function() { + // if (admin.getCookie("dksident") == "") { + // var dksident = prompt("Bitte Name eingeben, damit wir deine Einstellungen speichern können!"); + // if ((dksident != null) && (dksident != "")) { + // admin.setCookie("dksident", dksident); + // } + // } + // } +} + + +String.prototype.replaceAt = function(index, replacement) { + return this.substr(0, index) + replacement + this.substr(index + replacement.length); +} + +document.addEventListener("DOMContentLoaded", function() { + myapp.loadmodules(); + // for (var m in myapp.modules){ + // eval(`${myapp.modules[m]}.init();`); + // } + //addresses.init(); + preferences.global = usersystem.getPreference('invoicejournal'); + if(preferences.global.dataset){ + preferences.global["currentdataset"] = usersystem.getPreference(preferences.global.dataset); + } else { + usersystem.setPreference('invoicejournal',{"dataset":"default"}); + usersystem.setPreference('default',{"datapath":usersystem.profilepath() + "default","database":"default.sqlite"}); + preferences.global = usersystem.getPreference('invoicejournal'); + preferences.global["currentdataset"] = usersystem.getPreference(preferences.global.dataset); + } + + console.log("Content loaded",preferences); + db.connect(preferences.global.currentdataset.datapath + "/" + preferences.global.currentdataset.database); + myapp.loadpreferences(); + +}); diff --git a/desktopapp/js/global/renderer.js b/desktopapp/js/renderer.js similarity index 50% rename from desktopapp/js/global/renderer.js rename to desktopapp/js/renderer.js index 5d51550..cd63400 100644 --- a/desktopapp/js/global/renderer.js +++ b/desktopapp/js/renderer.js @@ -14,33 +14,34 @@ let usersystem = { } return ppath; }, - selectfile: function(dlgtitle,lastpath,filefilters=null,multiselect=false){ - let props = ['openFile']; - if (multiselect == true){ - props.push('multiSelections'); - } - console.log(dialog); - //dialog.send('open-file-dialog'); - return dialog.showOpenDialog({title: dlgtitle,defaultPath: lastpath, filters: filefilters, properties: props }); - }, - selectdir: function(dlgtitle,lastpath){ - return dialog.showOpenDialog({title: dlgtitle,defaultPath: lastpath, filters: filefilters, properties: ['openDirectory'] }); - }, - showMessage: function(msgTitle,msg,msgdetail,msgtype,msgButtons=["OK"],defautlbtnid=0,cancelbtnid){ - return dialog.showMessageBox({type: msgtype, // - title: msgTitle, - buttons:msgButtons, - message: msg, - detail: msgdetail, - defaultId: defautlbtnid, - cancelId: cancelbtnid}); - }, - showError: function(errtitle,errmsg){ - dialog.showErrorBox(errtitle, errmsg); + // selectfile: function(dlgtitle,lastpath,filefilters=null,multiselect=false){ + // let props = ['openFile']; + // if (multiselect == true){ + // props.push('multiSelections'); + // } + // return dialog.showOpenDialog({title: dlgtitle,defaultPath: lastpath, filters: filefilters, properties: props }); + // }, + // selectdir: function(dlgtitle,lastpath){ + // return dialog.showOpenDialog({title: dlgtitle,defaultPath: lastpath, filters: filefilters, properties: ['openDirectory'] }); + // }, + // showMessage: function(msgTitle,msg,msgdetail,msgtype,msgButtons=["OK"],defautlbtnid=0,cancelbtnid){ + // return dialog.showMessageBox({type: msgtype, // + // title: msgTitle, + // buttons:msgButtons, + // message: msg, + // detail: msgdetail, + // defaultId: defautlbtnid, + // cancelId: cancelbtnid}); + // }, + // showError: function(errtitle,errmsg){ + // dialog.showErrorBox(errtitle, errmsg); + // }, + readDir: function(dir){ + return fs.readdirSync(dir); }, setPreference: function(key,data){ - console.log("set preference to: " + this.profilepath() + key + ".json"); - console.log(data); + //console.log("set preference to: " + this.profilepath() + key + ".json"); + //console.log(data); if ((typeof data == 'object') || (typeof data == 'array')){ data = JSON.stringify(data); } @@ -48,10 +49,10 @@ let usersystem = { return result; }, getPreference: function(key){ - console.log("getPreference:" + this.profilepath() + key + ".json"); + //console.log("getPreference:" + this.profilepath() + key + ".json"); let data = null; if (fs.existsSync(this.profilepath() + key + ".json")){ - console.log("Read Key:" + key); + //console.log("Read Key:" + key); let data = fs.readFileSync(this.profilepath() + key + ".json", 'utf-8'); if (data.startsWith("{") || data.startsWith("[")){ data = JSON.parse(data); @@ -66,23 +67,18 @@ let usersystem = { } return ""; }, - writeDataset: function(folder,fileid,filedata){ - - }, - getDataSet: function(folder){ - let dataset =[]; - let files = fs.readdirSync(folder); - files.forEach(function(file) { - if (file.match('.*\.json')){ - let fdata = fs.readFileSync(folder + '/' + file, 'utf-8'); - if (fdata.startsWith("{") || fdata.startsWith("[")){ - data = JSON.parse(fdata); - data["id"] = file.replace('.json',''); - dataset.push(data); - } + readjson: function(filepath){ + //console.log("get JSON file:" + filepath); + let data = null; + if (fs.existsSync(filepath)){ + //console.log("Read Key:" + filepath); + let data = fs.readFileSync(filepath, 'utf-8'); + if (data.startsWith("{") || data.startsWith("[")){ + data = JSON.parse(data); + } + return data; } - }); - return dataset; + return data; }, getDataSets: function(){ let datasets =[]; @@ -109,14 +105,10 @@ let usersystem = { } }, getApplicationPath: function(){ - console.log(__dirname); let apath = path.dirname(__dirname); return apath; }, - backupfile: function(backupfile,backuppath){ - let bname = path.basename(backupfile); - let ext = path.extname(backupfile); - let fname = bname.substring(0,bname.length - ext.length); - fs.copyFileSync(backupfile,backuppath + '/' + fname + '_' +moment().format('YYYYMMDDhhmm') + ext); + getSourcePath: function(){ + return __dirname; } } \ No newline at end of file diff --git a/desktopapp/js/global/report.js b/desktopapp/js/report.js similarity index 100% rename from desktopapp/js/global/report.js rename to desktopapp/js/report.js diff --git a/desktopapp/js/request.js b/desktopapp/js/request.js new file mode 100644 index 0000000..7daf41d --- /dev/null +++ b/desktopapp/js/request.js @@ -0,0 +1,245 @@ +var api = 'http://localhost:6060/'; + +async function postData(module,schema,fn,data = {}) { + // Default options are marked with * + const response = await fetch(api + '/'+ module+'/'+ schema+'/'+fn, { + method: 'POST', + mode: 'same-origin', + cache: 'no-cache', + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/json' + + }, + redirect: 'follow', + referrerPolicy: 'strict-origin', + body: JSON.stringify(data) + }); + return response.json(); + } +// if (location.pathname.indexOf('modules') > 0){ +// api = location.origin + location.pathname.substring(0, location.pathname.indexOf('module')) + 'api/'; +// } +//console.log(api); +// var req = { +// multipartform: function(url, frmname, callback) { +// var ret = null; +// var frm = document.getElementById(frmname); +// var frmdata = new FormData(); +// for (var i = 0; i < frm.elements.length; i++) { +// var field = frm.elements[i]; +// if ( field.tagName == "INPUT" && field.type == "file"){ +// frmdata.append("file",field.files[0]); +// } else if (field.tagName == "INPUT"){ +// frmdata.append("folder",field.value); +// } +// } +// if (!callback) { +// callback = req.asyncNoEvent; +// } +// var request = new XMLHttpRequest(); +// var sendurl = api + url; +// console.log("Multipartsending URL: POST => " + sendurl + '?' + frmdata); +// //console.log("Multipart sending URL: " + "POST" + " => " + sendurl); +// request.open("POST", sendurl, true); +// request.onload = function() { +// if (request.status >= 200 && request.status <= 400) { +// if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0) { +// var xparse = JSON.parse(request.responseText); +// ret = xparse.result; +// } else { +// ret = request.responseText; +// } +// callback(ret); +// } else { +// alert("ServerERROR:" + request.status + "\n" + request.responseText); +// } +// }; +// request.onerror = function() { +// alert("Connection ERROR!\n" + url); +// }; +// request.setRequestHeader('Content-Type', 'multipart/form-data'); +// request.send(frmdata); +// return ret; +// }, +// reqdata: function( data, callback) { + +// var ret = null; +// var rdata = null; + +// if (!callback) { +// callback = req.asyncNoEvent; +// } + +// var request = new XMLHttpRequest(); +// if (typeof data == 'object') { +// var xdata = []; +// for (var i in data) { +// var value = ''; +// if (typeof(data[i]) == 'object') { +// value = encodeURIComponent(JSON.stringify(data[i])); +// } else { +// value = encodeURIComponent(data[i]); +// } +// xdata.push(i + "=" + value); +// } +// rdata = xdata.join("&"); +// } else { +// rdata = data; +// } +// var sendurl = api + "db.cgi"; +// console.log("sending URL => " + sendurl + '?' + rdata); +// request.open("POST", sendurl, true); +// request.onload = function() { +// if (request.status >= 200 && request.status <= 400) { +// if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0) { +// console.log(xparse); +// var xparse = JSON.parse(request.responseText); +// ret = xparse.result; +// console.log(ret); +// } + +// else { +// ret = request.responseText; +// //console.log("TEXT returned:" + ret); +// } +// callback(ret); + + +// } else { +// //console.log("ServerERROR: " + request.status + "\n" + request.responseText); +// alert("ServerERROR:" + request.status + "\n" + request.responseText); +// } +// }; +// request.onerror = function() { +// //console.log("ERROR: connection ERROR\n" + url); +// alert("Connection ERROR!\n" + url); +// }; +// request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); +// request.send(rdata); + +// return ret; +// }, +// reqfile: function(data, callback) { + +// var ret = null; +// var rdata = null; + +// if (!callback) { +// callback = req.asyncNoEvent; +// } + +// var request = new XMLHttpRequest(); +// if (typeof data == 'object') { +// var xdata = []; +// for (var i in data) { +// var value = ''; +// if (typeof(data[i]) == 'object') { +// value = encodeURIComponent(JSON.stringify(data[i])); +// } else { +// value = encodeURIComponent(data[i]); +// } +// xdata.push(i + "=" + value); +// } +// rdata = xdata.join("&"); +// } else { +// rdata = data; +// } +// var sendurl = api + "filesystem.cgi"; +// console.log("sending URL => " + sendurl + '?' + rdata); +// request.open("POST", sendurl, true); +// request.onload = function() { +// if (request.status >= 200 && request.status <= 400) { +// if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0) { +// console.log(xparse); +// var xparse = JSON.parse(request.responseText); +// ret = xparse.result; +// //console.log(ret); +// } + +// else { +// ret = request.responseText; +// //console.log("TEXT returned:" + ret); +// } +// callback(ret); + + +// } else { +// //console.log("ServerERROR: " + request.status + "\n" + request.responseText); +// alert("ServerERROR:" + request.status + "\n" + request.responseText); +// } +// }; +// request.onerror = function() { +// //console.log("ERROR: connection ERROR\n" + url); +// alert("Connection ERROR!\n" + url); +// }; +// request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); +// request.send(rdata); + +// return ret; +// }, +// reqreport: function( data, callback) { + +// var ret = null; +// var rdata = null; + +// if (!callback) { +// callback = req.asyncNoEvent; +// } + +// var request = new XMLHttpRequest(); +// if (typeof data == 'object') { +// var xdata = []; +// for (var i in data) { +// var value = ''; +// if (typeof(data[i]) == 'object') { +// value = encodeURIComponent(JSON.stringify(data[i])); +// } else { +// value = encodeURIComponent(data[i]); +// } +// xdata.push(i + "=" + value); +// } +// rdata = xdata.join("&"); +// } else { +// rdata = data; +// } +// var sendurl = api + "report.cgi"; +// console.log("sending URL => " + sendurl + '?' + rdata); +// request.open("POST", sendurl, true); +// request.onload = function() { +// if (request.status >= 200 && request.status <= 400) { +// if (request.getResponseHeader("Content-Type").indexOf('application/json') == 0) { +// console.log(xparse); +// var xparse = JSON.parse(request.responseText); +// ret = xparse.result; + +// } + +// else { +// ret = request.responseText; +// //console.log("TEXT returned:" + ret); +// } +// callback(ret); + + +// } else { +// //console.log("ServerERROR: " + request.status + "\n" + request.responseText); +// alert("ServerERROR:" + request.status + "\n" + request.responseText); +// } +// }; +// request.onerror = function() { +// //console.log("ERROR: connection ERROR\n" + url); +// alert("Connection ERROR!\n" + url); +// }; +// request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); +// request.send(rdata); + +// return ret; +// }, +// asyncNoEvent: function(data) { +// //console.log("query done"); +// //console.log(data); +// //console.log("done"); +// } + +// } \ No newline at end of file diff --git a/desktopapp/js/global/sqlite.js b/desktopapp/js/sqlite.js similarity index 96% rename from desktopapp/js/global/sqlite.js rename to desktopapp/js/sqlite.js index 5499a5d..ab5f130 100644 --- a/desktopapp/js/global/sqlite.js +++ b/desktopapp/js/sqlite.js @@ -3,9 +3,6 @@ const sqlite3 = require('sqlite3').verbose(); let db = { dbh: null, connect: function(dbfile){ - if (fs.existsSync(dbfile)){ - usersystem.backupfile(dbfile,path.dirname(dbfile) + '/backup') - } if (db.dbh != null){ db.disconnect(); } diff --git a/desktopapp/main.js b/desktopapp/main.js index 599fe89..0d6e14a 100644 --- a/desktopapp/main.js +++ b/desktopapp/main.js @@ -11,7 +11,6 @@ let mainWindow let appcfg function createWindow () { - makeSingleInstance() //appcfg = localcfg(); let ua = app.getName() + '/' + app.getVersion() + '-' + os.type() + '/' + os.release() + '/' + os.arch mainWindow = new BrowserWindow({ @@ -19,13 +18,13 @@ function createWindow () { icon: __dirname + '/img/invoicejournal.png', minWidth: 1260, minHeight: 720, - title: "Invoice Jounral", + title: "POT", backgroundColor: "#fff", webPreferences: { nodeIntegration: true, worldSafeExecuteJavaScript: true, defaultEncoding: 'UTF-8', - //enableRemoteModule: true, + enableRemoteModule: true, webviewTag: true } }) @@ -35,13 +34,12 @@ function createWindow () { }) - //mainWindow.loadFile(__dirname + "/index.html") - mainWindow.loadURL(path.join('file://', __dirname, '/index.html')) + mainWindow.loadFile(__dirname + "/index.html"); mainWindow.setMenu(null) mainWindow.maximize() mainWindow.webContents.session.on('will-download', (event, item, webContents) => { - console.log("Download-URL:",url.parse(item.getURL())) + //console.log("Download-URL:",url.parse(item.getURL())) let query = url.parse(item.getURL()).query; let filename @@ -102,19 +100,6 @@ function createWindow () { } - -function makeSingleInstance () { - if (process.mas) return - - app.requestSingleInstanceLock() - - app.on('second-instance', () => { - if (mainWindow) { - if (mainWindow.isMinimized()) mainWindow.restore() - mainWindow.focus() - } - }) -} // function localcfg(){ // var data = null; // if (os.platform() == "darwin"){ diff --git a/desktopapp/panels/addresses.html b/desktopapp/modules/addresses/addresses.html similarity index 97% rename from desktopapp/panels/addresses.html rename to desktopapp/modules/addresses/addresses.html index 5482930..b9aba3c 100644 --- a/desktopapp/panels/addresses.html +++ b/desktopapp/modules/addresses/addresses.html @@ -1,5 +1,5 @@
- +
Adressen
@@ -137,7 +137,7 @@
-
Mail Vorlagen
+
Mail Vorlagen
diff --git a/desktopapp/js/modules/addresses.js b/desktopapp/modules/addresses/addresses.js similarity index 100% rename from desktopapp/js/modules/addresses.js rename to desktopapp/modules/addresses/addresses.js diff --git a/desktopapp/js/modules/booking.js b/desktopapp/modules/bookings/booking.js similarity index 96% rename from desktopapp/js/modules/booking.js rename to desktopapp/modules/bookings/booking.js index fc35876..21c1340 100644 --- a/desktopapp/js/modules/booking.js +++ b/desktopapp/modules/bookings/booking.js @@ -1,5 +1,7 @@ let booking = { + editors:{"invoicebooking_description":null}, initDialog: function(){ + tinymce.init({ selector: '#invoicebooking_description', plugins: 'paste importcss searchreplace autolink directionality visualblocks visualchars template charmap nonbreaking advlist lists textpattern noneditable charmap autoresize ', diff --git a/desktopapp/panels/bookings.html b/desktopapp/modules/bookings/bookings.html similarity index 75% rename from desktopapp/panels/bookings.html rename to desktopapp/modules/bookings/bookings.html index f231489..01c84d9 100644 --- a/desktopapp/panels/bookings.html +++ b/desktopapp/modules/bookings/bookings.html @@ -1,5 +1,5 @@ -
- +
+
Buchungen
+
Datensätze
diff --git a/desktopapp/js/modules/datasets.js b/desktopapp/modules/datasets/datasets.js similarity index 100% rename from desktopapp/js/modules/datasets.js rename to desktopapp/modules/datasets/datasets.js diff --git a/desktopapp/panels/invoice.html b/desktopapp/modules/invoices/invoice.html similarity index 93% rename from desktopapp/panels/invoice.html rename to desktopapp/modules/invoices/invoice.html index a3cdf9a..d58090e 100644 --- a/desktopapp/panels/invoice.html +++ b/desktopapp/modules/invoices/invoice.html @@ -1,4 +1,4 @@ -
+
Rechnung @@ -26,9 +26,8 @@
- +
- +
- -
@@ -169,4 +167,4 @@
-
\ No newline at end of file +
\ No newline at end of file diff --git a/desktopapp/js/modules/invoice.js b/desktopapp/modules/invoices/invoice.js similarity index 95% rename from desktopapp/js/modules/invoice.js rename to desktopapp/modules/invoices/invoice.js index 8598d88..5477b9b 100644 --- a/desktopapp/js/modules/invoice.js +++ b/desktopapp/modules/invoices/invoice.js @@ -2,10 +2,11 @@ let invoice = { current_id: null, bookingtbl: null, + documents: null, //addresstbl: null, selects:{"invoices_invoicetype":null,"invoices_status":null,"invoices_id_template":null}, viewpanel: function(id){ - myapp.loadpanel('invoice').then(result => { + myapp.loadpanel('invoices','invoice').then(result => { dataform.cleanform('invoice'); if (id != null){ invoice.current_id = id; @@ -51,7 +52,6 @@ let invoice = { select: "#invoices_invoicetype", showSearch: false, afterClose: function () { invoice.changedType();} - }); invoice.selects["invoices_status"] = new SlimSelect({ select: "#invoices_status", @@ -73,6 +73,8 @@ let invoice = { //invoice.getAccountsList(); invoice.getReportList(); + invoice.getStatusList(); + invoice.getDocumentList(); invoice.initbookings(); myapp.loaddialog("SelectAddress").then(result => { addresses.initSelector(); @@ -117,10 +119,34 @@ let invoice = { }, getReportList: function(){ db.queryarray("SELECT id as value,reportname as text FROM newreports where reporttype ='invoice' ORDER BY reportname;").then(data => { + //console.log("ReportList",data); dataform.fillselectlist(invoice.selects["invoices_id_template"],data,'value','text'); }); return false; }, + getStatusList: function(){ + db.queryarray("SELECT id, status,color FROM statustypes where reporttypes LIKE '\"invoice\"' ORDER BY pos;").then(data => { + let stypes = []; + console.log("StatusList",data); + for (var d in data){ + console.log("status",d,data[d]); + stypes.push({"value":data[d].id,"text":''+data[d].statustype+''}); + } + console.log("before add status",stypes); + dataform.fillselectlist(invoice.selects["invoices_status"],stypes,'value','text'); + }); + return false; + }, + getDocumentList: function(){ + db.queryarray("SELECT id, document,reportcategory FROM documenttypes where category='invoice' ORDER BY pos;").then(data => { + console.log("DocumentList",data); + for (var d in data){ + invoice.documents[data[d].id] = data[d]; + } + dataform.fillselectlist(invoice.selects["invoices_invoicetype"],data,'id','document'); + }); + return false; + }, getUnits: function(){ db.queryarray("select unit from bookings where unit is not null and unit != '' group by unit order by unit;").then(units => { console.log(units); diff --git a/desktopapp/panels/invoices.html b/desktopapp/modules/invoices/invoices.html similarity index 77% rename from desktopapp/panels/invoices.html rename to desktopapp/modules/invoices/invoices.html index ffb2a6e..0c0539c 100644 --- a/desktopapp/panels/invoices.html +++ b/desktopapp/modules/invoices/invoices.html @@ -1,6 +1,6 @@
-
- +
+
Rechnungen
diff --git a/desktopapp/js/modules/invoices.js b/desktopapp/modules/invoices/invoices.js similarity index 54% rename from desktopapp/js/modules/invoices.js rename to desktopapp/modules/invoices/invoices.js index 61db3d5..49ac0c8 100644 --- a/desktopapp/js/modules/invoices.js +++ b/desktopapp/modules/invoices/invoices.js @@ -1,88 +1,64 @@ -let statustypes = { - "preparation":{"value":"preparation", "text": "Vorbereitung", "class": "text-black"}, - "planned":{"value":"planned","text" : "geplant", "class": "text-blue"}, - "received":{"value":"received","text" : "erhalten", "class": "text-purple"}, - "sended":{"value":"sended","text" : "verschickt", "class": "text-orange"}, - "overdue":{"value":"overdue","text" : "überfällig", "class": "text-red"}, - "payed":{"value":"payed","text" : 'bezahlt', "class": "text-green"}, - "canceled":{"value":"canceled","text" : "storniert", "class": "text-grey"}, - "reminder1":{"value":"reminder1","text" : "Mahnung 1", "class": "text-red"}, - "reminder2":{"value":"reminder2","text" : 'Mahnung 2', "class": "text-red"}, - "reminder3":{"value":"reminder3","text" : "Mahnung 3", "class": "text-red"} -} - -let headerstatustypes = { - "":"", - "preparation":"Vorbereitung", - "planned":"geplant", - "received":"erhalten", - "sended":"verschickt", - "overdue":"überfällig", - "payed":"bezahlt", - "canceled":"storniert", - "reminder1":"Mahnung 1", - "reminder2":"Mahnung 2", - "reminder3":"Mahnung 3" -}; - - - -let invtypes = { - "invoice":{"value":"invoice", "text": "Rechnung", "class": "text-black"}, - "invoice-in":{"value":"invoice-in", "text": "Eingangs-Rechnung", "class": "text-black"}, - "invoice-out":{"value":"invoice-out", "text": "Ausgangs-Rechnung", "class": "text-black"}, - "payroll":{"value":"payroll","text" : "Lohnsteuer", "class": "text-black"}, - "salary":{"value":"salary","text" : "Gehalt", "class": "text-black"}, - "taxes":{"value":"taxes","text" : "Steuernt", "class": "text-black"}, - "creditnote":{"value":"creditnote","text" : "Gutschrift", "class": "text-black"}, - "creditnote-in":{"value":"creditnote-in","text" : "Eingangs-Gutschrift", "class": "text-black"}, - "creditnote-out":{"value":"creditnote-out","text" : "Ausgangs-Gutschrift", "class": "text-black"}, -} - -let headerinvtypes = { - "invoice": "Rechnung", - "invoice-in":"Eingangs-Rechnung", - "invoice-out":"Ausgangs-Rechnung", - "payroll":"Lohnsteuer", - "salary":"Gehalt", - "taxes":"Steuern", - "creditnote":"Gutschrift", - "creditnote-in":"Eingangs-Gutschrift", - "creditnote-out":"Ausgangs-Gutschrift" -} - let invoices = { tbl: null, + filters:{ + doctypes:{"":""}, + statustypes:{"":""} + }, + doctypes: {}, + statustypes: {}, //selectedfilter: '2020', viewpanel: function(){ - myapp.viewpanel('invoices'); - this.gettbldata(); + myapp.loadpanel('invoices','invoices').then(result => { + myapp.viewpanel('invoices'); + }); + myapp.loadpanel('invoices','invoice'); + // + }, init: function(){ let cyear = moment(new Date()).format('YYYY'); - invoices.tbl = new Tabulator("#tbl_invoices",{ - initialHeaderFilter:[ - {field:"invoicedate", value: cyear}, - {field:"businessyear", value: cyear} - ], - headerFilterPlaceholder: "filter...", - height: "calc(100vh - 60px)", - layout: "fitColumns", - selectable: 1, - rowContext:function(e, row){ e.preventDefault(); }, - columns: [ - {title:"GJahr", field:"businessyear",headerFilter:"input",width: 80}, - {title:"Datum", field:"invoicedate",headerFilter:"input",width: 100,formatter:"datetime",headerSort:true,formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""}}, - {title: "Typ", field: "invoicetype",headerFilter:"select",width: 180, headerFilterParams:{values:headerinvtypes},formatter:function(cell, formatterParams){ var value = cell.getValue(); if (value){ return "" + invtypes[value].text + "" } return ""; } }, - {title: "Konto", field: "accountname",headerFilter:"input",width: 300}, - {title: "Referenz",field: "reference",headerFilter:"input"}, - {title: "Status", field: "status",headerFilter:"select",width: 125, headerFilterParams:{values:headerstatustypes},formatter:function(cell, formatterParams){ var value = cell.getValue(); return "" + statustypes[value].text + "" } }, - {title: "Netto", field: "netamount",hozAlign:"right",width: 125,formatter:"money", headerSort: false, formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, },bottomCalc:"sum",bottomCalcFormatter:"money",bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }}, - {title: "MwSt.", field: "vatamount",hozAlign:"right",width: 125,formatter:"money", headerSort: false, formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }, bottomCalc:"sum", bottomCalcFormatter:"money", bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }}, - {title: "Brutto", field: "grossamount",hozAlign:"right",width: 125,headerSort: false,formatter:"money", formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }, bottomCalc:"sum", bottomCalcFormatter:"money", bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }}, - - ] + db.queryarray("select * from documenttypes where category='invoice' order by pos;").then(docdata => { + console.log("docdata",docdata); + for (var dd in docdata){ + //console.log("rowdata",dd); + invoices.doctypes[docdata[dd].id] = docdata[dd]; + invoices.filters.doctypes[docdata[dd].id] = docdata[dd].document; + } + db.queryarray("select * from statustypes where reporttypes LIKE '%\"invoice\"%' or reporttypes LIKE '%\"creditnote\"%' ORDER BY pos;").then(statusdata => { + console.log("statusdata",statusdata); + for (var st in statusdata){ + invoices.statustypes[statusdata[st].id] = statusdata[st]; + invoices.filters.statustypes[statusdata[st].id] = statusdata[st].status; + } + console.log("load invoice tabulator"); + invoices.tbl = new Tabulator("#tbl_invoices",{ + initialHeaderFilter:[ + {field:"invoicedate", value: cyear}, + {field:"businessyear", value: cyear} + ], + headerFilterPlaceholder: "filter...", + height: "calc(100vh - 60px)", + layout: "fitColumns", + selectable: 1, + rowContext:function(e, row){ e.preventDefault(); }, + columns: [ + {title:"GJahr", field:"businessyear",headerFilter:"input",width: 80}, + {title:"Datum", field:"invoicedate",headerFilter:"input",width: 100,formatter:"datetime",headerSort:true,formatterParams:{inputFormat:"YYYY-MM-DD",outputFormat:"DD.MM.YYYY",invalidPlaceholder:""}}, + {title: "Typ", field: "invoicetype",headerFilter:"select",width: 180, headerFilterParams:{values:invoices.filters.doctypes},formatter:invoices.docTypeFormatter }, + {title: "Konto", field: "accountname",headerFilter:"input",width: 300}, + {title: "Referenz",field: "reference",headerFilter:"input"}, + {title: "Status", field: "status",headerFilter:"select",width: 125, headerFilterParams:{values:invoices.filters.statustypes},formatter:invoices.statusTypeFormatter}, + {title: "Netto", field: "netamount",hozAlign:"right",width: 125,formatter:"money", headerSort: false, formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, },bottomCalc:"sum",bottomCalcFormatter:"money",bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }}, + {title: "MwSt.", field: "vatamount",hozAlign:"right",width: 125,formatter:"money", headerSort: false, formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }, bottomCalc:"sum", bottomCalcFormatter:"money", bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }}, + {title: "Brutto", field: "grossamount",hozAlign:"right",width: 125,headerSort: false,formatter:"money", formatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }, bottomCalc:"sum", bottomCalcFormatter:"money", bottomCalcFormatterParams:{ decimal:",", thousand:".", symbol:"€", symbolAfter:"p", precision:2, }}, + + ] + }); + this.gettbldata(); + + }); }); + myapp.loaddialog("confirm").then(result => { }); @@ -92,6 +68,7 @@ let invoices = { // console.log(preferences.global); //let newdata = usersystem.getDataSet('C:/Users/ksaff/AppData/Roaming/invoicejournal/dks/data/invoices/2020'); //console.log(newdata); + if (invoices.tbl){} let sel= invoices.tbl.getSelectedData(); /*--(to_char(inv.invoicedate::timestamp with time zone, 'YYYY'::text) || '-Q'::text) || to_char(inv.invoicedate::timestamp with time zone, 'Q'::text) AS quarter, --to_char(inv.invoicedate::timestamp with time zone, 'YYYY-MM'::text) AS month,*/ db.queryarray("SELECT inv.invoicedate, inv.id, inv.accountname, inv.reference, inv.status, sum(COALESCE(bk.netamount, 0.0)) AS netamount, sum(COALESCE(bk.taxamount, 0.0)) AS vatamount, sum(COALESCE(bk.netamount, 0.0) + COALESCE(bk.taxamount, 0.0)) AS grossamount, inv.businessyear, inv.id_accounts, inv.invoicetype FROM invoices inv LEFT JOIN bookings bk ON inv.id = bk.id_invoices GROUP BY inv.id ORDER BY inv.invoicedate DESC;") .then(data => { @@ -108,6 +85,21 @@ let invoices = { }); return false; }, + docTypeFormatter: function(cell, formatterParams){ + var value = cell.getValue(); + if (value){ + return invoices.doctypes[value].document; + } + return ""; + }, + statusTypeFormatter: function(cell, formatterParams){ + var value = cell.getValue(); + if (value){ + cell.getElement().style.color=invoices.statustypes[value].color; + return invoices.statustypes[value].status; + } + return ""; + }, loadfilterdata: function(data){ if (data && data.sqldata) { invoices.tblfilter.setData(data.sqldata);} }, diff --git a/desktopapp/modules/modules.json b/desktopapp/modules/modules.json new file mode 100644 index 0000000..5e889cf --- /dev/null +++ b/desktopapp/modules/modules.json @@ -0,0 +1,15 @@ +{ + "modules":[ + {"module":"invoices","icon":"icon-bill","name":"Rechnungen"}, + {"module":"addresses","icon":"icon-contacts","name":"Adressen"}, + {"module":"products","icon":"icon-product","name":"Produkte"}, + {"module":"offers","icon":"icon-box","name":"Angebote"} + ], + "config":[ + {"module":"settings","icon":"icon-settings","name":"Einstellungen"}, + {"module":"templates","icon":"icon-template","name":"Vorlagen"}, + {"module":"datasets","icon":"icon-datasets","name":"Datensätze"}, + {"module":"backup","icon":"icon-backup","name":"Backup"} + ] + +} \ No newline at end of file diff --git a/desktopapp/panels/offer.html b/desktopapp/modules/offers/offer.html similarity index 99% rename from desktopapp/panels/offer.html rename to desktopapp/modules/offers/offer.html index 502db64..29493db 100644 --- a/desktopapp/panels/offer.html +++ b/desktopapp/modules/offers/offer.html @@ -1,4 +1,4 @@ -
+
Angebot diff --git a/desktopapp/js/modules/offer.js b/desktopapp/modules/offers/offer.js similarity index 100% rename from desktopapp/js/modules/offer.js rename to desktopapp/modules/offers/offer.js diff --git a/desktopapp/panels/offers.html b/desktopapp/modules/offers/offers.html similarity index 80% rename from desktopapp/panels/offers.html rename to desktopapp/modules/offers/offers.html index 7af4cc8..799815c 100644 --- a/desktopapp/panels/offers.html +++ b/desktopapp/modules/offers/offers.html @@ -1,5 +1,5 @@
- +
Angebote
diff --git a/desktopapp/js/modules/offers.js b/desktopapp/modules/offers/offers.js similarity index 100% rename from desktopapp/js/modules/offers.js rename to desktopapp/modules/offers/offers.js diff --git a/desktopapp/panels/product.html b/desktopapp/modules/products/product.html similarity index 99% rename from desktopapp/panels/product.html rename to desktopapp/modules/products/product.html index f015e9e..37af33b 100644 --- a/desktopapp/panels/product.html +++ b/desktopapp/modules/products/product.html @@ -1,4 +1,4 @@ -
+
Produkt @@ -20,7 +20,7 @@
-
+
diff --git a/desktopapp/js/modules/product.js b/desktopapp/modules/products/product.js similarity index 98% rename from desktopapp/js/modules/product.js rename to desktopapp/modules/products/product.js index dc187a0..859158b 100644 --- a/desktopapp/js/modules/product.js +++ b/desktopapp/modules/products/product.js @@ -1,4 +1,4 @@ -var product = { +let product = { current_id: null, selects: {"products_producttype":null}, tblstock: null, @@ -62,7 +62,7 @@ var product = { }); }, viewpanel: function(id){ - myapp.loadpanel('product').then(result => { + // myapp.loadpanel('product').then(result => { dataform.cleanform('product'); if (id != null){ product.current_id = id; @@ -76,7 +76,7 @@ var product = { }else { myapp.viewpanel('product'); } - }); + // }); }, calculate: function(){ var pid = document.getElementById("products_id").value; diff --git a/desktopapp/panels/products.html b/desktopapp/modules/products/products.html similarity index 80% rename from desktopapp/panels/products.html rename to desktopapp/modules/products/products.html index 520c83c..1fbfea4 100644 --- a/desktopapp/panels/products.html +++ b/desktopapp/modules/products/products.html @@ -1,6 +1,5 @@ -
- +
Produkte
diff --git a/desktopapp/js/modules/products.js b/desktopapp/modules/products/products.js similarity index 96% rename from desktopapp/js/modules/products.js rename to desktopapp/modules/products/products.js index 472d508..981f556 100644 --- a/desktopapp/js/modules/products.js +++ b/desktopapp/modules/products/products.js @@ -12,8 +12,8 @@ let products = { init: function(){ products.tbl = new Tabulator("#tbl_products",{ headerFilterPlaceholder: "filter...", - //groupBy:["producttype", "productgroup"], - //groupStartOpen:[true, true], + groupBy:["producttype", "productgroup"], + groupStartOpen:[true, true], height: "calc(100vh - 60px)", layout: "fitColumns", selectable: 1, @@ -29,9 +29,6 @@ let products = { ] }); products.gettbldata(); - myapp.loaddialog("confirm").then(result => { - - }); }, initSelector: function(){ diff --git a/desktopapp/js/modules/files.js b/desktopapp/modules/settings/files.js similarity index 100% rename from desktopapp/js/modules/files.js rename to desktopapp/modules/settings/files.js diff --git a/desktopapp/modules/settings/settings.html b/desktopapp/modules/settings/settings.html new file mode 100644 index 0000000..0e57aab --- /dev/null +++ b/desktopapp/modules/settings/settings.html @@ -0,0 +1,150 @@ +
+ +
+ Einstellungen +
+
+
+
+
+ +
+ Unternehmens-Daten + +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ Standard-Werte +
+ +
+
+ + +
+
+ +
+
+
+ + +
+
+ + +
+ +
+
+
+ Mail-Einstellungen + +
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+
+
Status
+ + + + +
+
+
+
+
+
Documente
+ + + + +
+
+
+
+
+ +
\ No newline at end of file diff --git a/desktopapp/modules/settings/settings.js b/desktopapp/modules/settings/settings.js new file mode 100644 index 0000000..36afc90 --- /dev/null +++ b/desktopapp/modules/settings/settings.js @@ -0,0 +1,71 @@ +let settings = { + tblstatus: null, + tbldocuments: null, + selects:{"mailapp":null,"invoicetemplate":null,"creditnotetemplate":null}, + viewpanel: function(){ + myapp.loadpanel('settings','settings').then(result => { + myapp.viewpanel('settings'); + }); + }, + init: function(){ + settings.selects["mailapp"] = new SlimSelect({ + select: "#defaultdata_mailapp", + showSearch: false, + afterClose: function () { dataform.savefield(document.getElementById("dedata_mailapp"));} + }); + settings.selects["invoicetemplate"] = new SlimSelect({ + select: "#defaultdata_invoicetemplate", + showSearch: false, + afterClose: function () { dataform.savefield(document.getElementById("defaultdata_invoicetemplate"));} + }); + settings.selects["creditnotetemplate"] = new SlimSelect({ + select: "#defaultdata_creditnotetemplate", + showSearch: false, + afterClose: function () { dataform.savefield(document.getElementById("defaultdata_creditnotetemplate"));} + }); + settings.tblstatus = new Tabulator("#tbl_status",{ + //headerFilterPlaceholder: "filter...", + height: "calc(50vh - 180px)", + layout: "fitColumns", + selectable: 1, + rowContext:function(e, row){ e.preventDefault(); }, + columns: [ + {title: "Position", field: "pos"}, + {title: "Id", field: "id"}, + {title: "Status", field: "status"}, + {title: "Farbe", field: "color"}, + {title: "Kategorie", field: "reporttypes"} + ] + }); + settings.tbldocuments = new Tabulator("#tbl_documents",{ + //headerFilterPlaceholder: "filter...", + height: "calc(50vh - 180px)", + layout: "fitColumns", + selectable: 1, + rowContext:function(e, row){ e.preventDefault(); }, + columns: [ + {title: "Position", field: "pos"}, + {title: "Id", field: "id"}, + {title: "name", field: "document"}, + {title: "Kategorie", field: "category"}, + {title: "Vorlage", field: "reportcategory"} + ] + }); + settings.getstatusdata(); + settings.getdocumentdata(); + }, + getstatusdata: function(){ + if (settings.tblstatus){ + db.queryarray("select * from statustypes order by pos;").then(data => { + settings.tblstatus.setData(data); + }); + } + }, + getdocumentdata: function(){ + if (settings.tbldocuments){ + db.queryarray("select * from documenttypes order by pos;").then(data => { + settings.tbldocuments.setData(data); + }); + } + } +} \ No newline at end of file diff --git a/desktopapp/modules/templates/templates.html b/desktopapp/modules/templates/templates.html new file mode 100644 index 0000000..15cbfe0 --- /dev/null +++ b/desktopapp/modules/templates/templates.html @@ -0,0 +1,101 @@ +
+ +
+ Vorlagen +
+ + + +
+ +
+
+
+
+
+
+ +
+
+ +
+
+ + +
+
+
+
+ +
+
+
+
+ + + + +
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ + +
+
+
+ + + +
+
+
+
+ diff --git a/desktopapp/modules/templates/templates.js b/desktopapp/modules/templates/templates.js new file mode 100644 index 0000000..2ec7476 --- /dev/null +++ b/desktopapp/modules/templates/templates.js @@ -0,0 +1,121 @@ +let templates = { + tbl:null, + editors: {"templates_headerhtml": null,"templates_contenthtml":null,"templates_footerhtml":null}, + current_id: null, + viewpanel: function(){ + myapp.loadpanel('templates','templates').then(result => { + myapp.viewpanel('templates'); + }); + }, + + init: function(){ + tinymce.init({ + selector: '#templates_headerhtml, #templates_contenthtml, #templates_footerhtml', + plugins: 'paste importcss searchreplace autolink directionality visualblocks visualchars template charmap nonbreaking advlist lists textpattern noneditable charmap autoresize table code fullpage visualblocks', + menubar: false, + entity_encoding : 'raw', + toolbar: 'undo redo | bold italic underline strikethrough | fontsizeselect | outdent indent | forecolor removeformat | charmap | table tabledelete | tableprops tablerowprops tablecellprops | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol | code fullpage', + toolbar_sticky: true, + extended_valid_elements: 'script,style', + fullpage_hide_in_source_view: false, + // content_css: [ + // '../../css/theme.css' + // ], + element_format : 'html', + statusbar: false, + forced_root_block : '', + min_height: 150, + branding: false, + importcss_append: true, + noneditable_noneditable_class: "mceNonEditable", + contextmenu: "link image imagetools table", + setup: function(editor) { + editor.on('blur', function(e) { + console.log("tmce blur:",e.target.id); + }); + }, + visualblocks_default_state: true, + end_container_on_empty_block: true, + image_advtab: true, + image_title: true, + automatic_uploads: true, + file_picker_types: 'image', + file_picker_callback: function (cb, value, meta) { + var input = document.createElement('input'); + input.setAttribute('type', 'file'); + input.setAttribute('accept', 'image/*'); + input.onchange = function () { + var file = this.files[0]; + + var reader = new FileReader(); + reader.onload = function () { + var id = 'blobid' + (new Date()).getTime(); + var blobCache = tinymce.activeEditor.editorUpload.blobCache; + var base64 = reader.result.split(',')[1]; + var blobInfo = blobCache.create(id, file, base64); + blobCache.add(blobInfo); + cb(blobInfo.blobUri(), { title: file.name }); + }; + reader.readAsDataURL(file); + }; + + input.click(); + + }, + image_caption: true + }); + templates.tbl = new Tabulator("#tbl_templates",{ + headerFilterPlaceholder: "filter...", + height: "calc(100vh - 60px)", + layout: "fitDataStretch", + selectable: 1, + rowClick:function(e, row){ + console.log("Filter selected"); + let fsel = templates.tbl.getSelectedData(); + console.log(fsel); + templates.current_id = fsel[0].id; + templates.edit(fsel[0].id); + //invoices.getsums(fsel); + }, + rowContext:function(e, row){ e.preventDefault(); }, + columns: [ + {title: "Name", field: "reportname"}, + {title: "Typ", field: "reporttype"}, + ] + }); + templates.gettbldata(); + }, + gettbldata: function(){ + if (templates.tbl){ + db.queryarray("select * from newreports order by reportname,reporttype;").then(data => { + console.log(data); + templates.tbl.setData(data); + }); + } + }, + edit: function(id){ + if (id){ + db.query("select * from newreports where id='"+ id+"';").then(data => { + + tinymce.get("templates_headerhtml").setContent(data.headerhtml); + tinymce.get("templates_footerhtml").setContent(data.footerhtml); + tinymce.get("templates_contenthtml").setContent(data.contenthtml); + }); + } + }, + add: function(){ + + }, + confirmRemove: function(){ + + }, + remove: function(){ + + }, + duplicate: function(){ + + }, + preview: function(){ + + } +} \ No newline at end of file diff --git a/desktopapp/js/modules/transaction.js b/desktopapp/modules/transactions/transaction.js similarity index 100% rename from desktopapp/js/modules/transaction.js rename to desktopapp/modules/transactions/transaction.js diff --git a/desktopapp/panels/transactions.html b/desktopapp/modules/transactions/transactions.html similarity index 82% rename from desktopapp/panels/transactions.html rename to desktopapp/modules/transactions/transactions.html index 2d43cfa..fa58661 100644 --- a/desktopapp/panels/transactions.html +++ b/desktopapp/modules/transactions/transactions.html @@ -1,5 +1,5 @@ -
- +
+
Transaktionen
-
- Invoice Journal -
-
-
-
-
-

- Module -

-
-
- - - - - - -
-
-
-
-

- Konfiguration -

-
-
- - - - - - -
-
-
\ No newline at end of file diff --git a/desktopapp/panels/settings.html b/desktopapp/panels/settings.html deleted file mode 100644 index 61d6ae4..0000000 --- a/desktopapp/panels/settings.html +++ /dev/null @@ -1,119 +0,0 @@ -
- -
- Einstellungen -
-
-
-
-
- -
-
- -
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
- -
-
-
-
-
\ No newline at end of file diff --git a/desktopapp/panels/templates.html b/desktopapp/panels/templates.html deleted file mode 100644 index c729f42..0000000 --- a/desktopapp/panels/templates.html +++ /dev/null @@ -1,77 +0,0 @@ -
- -
- Vorlagen -
- - - -
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
- -
-
-
diff --git a/desktopapp/js/vendor/flatpickr/flatpickr.css b/desktopapp/vendor/flatpickr/flatpickr.css similarity index 100% rename from desktopapp/js/vendor/flatpickr/flatpickr.css rename to desktopapp/vendor/flatpickr/flatpickr.css diff --git a/desktopapp/js/vendor/flatpickr/flatpickr.js b/desktopapp/vendor/flatpickr/flatpickr.js similarity index 99% rename from desktopapp/js/vendor/flatpickr/flatpickr.js rename to desktopapp/vendor/flatpickr/flatpickr.js index 59bb267..a94e6ac 100644 --- a/desktopapp/js/vendor/flatpickr/flatpickr.js +++ b/desktopapp/vendor/flatpickr/flatpickr.js @@ -5,38 +5,38 @@ (global = global || self, global.flatpickr = factory()); }(this, (function () { 'use strict'; - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - - function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; } var HOOKS = [ diff --git a/desktopapp/js/vendor/flatpickr/flatpickr.min.css b/desktopapp/vendor/flatpickr/flatpickr.min.css similarity index 100% rename from desktopapp/js/vendor/flatpickr/flatpickr.min.css rename to desktopapp/vendor/flatpickr/flatpickr.min.css diff --git a/desktopapp/js/vendor/flatpickr/flatpickr.min.js b/desktopapp/vendor/flatpickr/flatpickr.min.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/flatpickr.min.js rename to desktopapp/vendor/flatpickr/flatpickr.min.js diff --git a/desktopapp/js/vendor/flatpickr/ie.css b/desktopapp/vendor/flatpickr/ie.css similarity index 100% rename from desktopapp/js/vendor/flatpickr/ie.css rename to desktopapp/vendor/flatpickr/ie.css diff --git a/desktopapp/js/vendor/flatpickr/index.d.ts b/desktopapp/vendor/flatpickr/index.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/index.d.ts rename to desktopapp/vendor/flatpickr/index.d.ts diff --git a/desktopapp/js/vendor/flatpickr/l10n/de.d.ts b/desktopapp/vendor/flatpickr/l10n/de.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/l10n/de.d.ts rename to desktopapp/vendor/flatpickr/l10n/de.d.ts diff --git a/desktopapp/js/vendor/flatpickr/l10n/de.js b/desktopapp/vendor/flatpickr/l10n/de.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/l10n/de.js rename to desktopapp/vendor/flatpickr/l10n/de.js diff --git a/desktopapp/js/vendor/flatpickr/l10n/default.d.ts b/desktopapp/vendor/flatpickr/l10n/default.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/l10n/default.d.ts rename to desktopapp/vendor/flatpickr/l10n/default.d.ts diff --git a/desktopapp/js/vendor/flatpickr/l10n/default.js b/desktopapp/vendor/flatpickr/l10n/default.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/l10n/default.js rename to desktopapp/vendor/flatpickr/l10n/default.js diff --git a/desktopapp/js/vendor/flatpickr/l10n/fr.d.ts b/desktopapp/vendor/flatpickr/l10n/fr.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/l10n/fr.d.ts rename to desktopapp/vendor/flatpickr/l10n/fr.d.ts diff --git a/desktopapp/js/vendor/flatpickr/l10n/fr.js b/desktopapp/vendor/flatpickr/l10n/fr.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/l10n/fr.js rename to desktopapp/vendor/flatpickr/l10n/fr.js diff --git a/desktopapp/js/vendor/flatpickr/l10n/index.d.ts b/desktopapp/vendor/flatpickr/l10n/index.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/l10n/index.d.ts rename to desktopapp/vendor/flatpickr/l10n/index.d.ts diff --git a/desktopapp/js/vendor/flatpickr/l10n/index.js b/desktopapp/vendor/flatpickr/l10n/index.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/l10n/index.js rename to desktopapp/vendor/flatpickr/l10n/index.js diff --git a/desktopapp/js/vendor/flatpickr/plugins/confirmDate/confirmDate.css b/desktopapp/vendor/flatpickr/plugins/confirmDate/confirmDate.css similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/confirmDate/confirmDate.css rename to desktopapp/vendor/flatpickr/plugins/confirmDate/confirmDate.css diff --git a/desktopapp/js/vendor/flatpickr/plugins/confirmDate/confirmDate.d.ts b/desktopapp/vendor/flatpickr/plugins/confirmDate/confirmDate.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/confirmDate/confirmDate.d.ts rename to desktopapp/vendor/flatpickr/plugins/confirmDate/confirmDate.d.ts diff --git a/desktopapp/js/vendor/flatpickr/plugins/confirmDate/confirmDate.js b/desktopapp/vendor/flatpickr/plugins/confirmDate/confirmDate.js similarity index 99% rename from desktopapp/js/vendor/flatpickr/plugins/confirmDate/confirmDate.js rename to desktopapp/vendor/flatpickr/plugins/confirmDate/confirmDate.js index 9f8379e..8c55a4e 100644 --- a/desktopapp/js/vendor/flatpickr/plugins/confirmDate/confirmDate.js +++ b/desktopapp/vendor/flatpickr/plugins/confirmDate/confirmDate.js @@ -4,30 +4,30 @@ (global = global || self, global.confirmDatePlugin = factory()); }(this, (function () { 'use strict'; - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); }; function getEventTarget(event) { diff --git a/desktopapp/js/vendor/flatpickr/plugins/labelPlugin/labelPlugin.d.ts b/desktopapp/vendor/flatpickr/plugins/labelPlugin/labelPlugin.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/labelPlugin/labelPlugin.d.ts rename to desktopapp/vendor/flatpickr/plugins/labelPlugin/labelPlugin.d.ts diff --git a/desktopapp/js/vendor/flatpickr/plugins/labelPlugin/labelPlugin.js b/desktopapp/vendor/flatpickr/plugins/labelPlugin/labelPlugin.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/labelPlugin/labelPlugin.js rename to desktopapp/vendor/flatpickr/plugins/labelPlugin/labelPlugin.js diff --git a/desktopapp/js/vendor/flatpickr/plugins/minMaxTimePlugin.d.ts b/desktopapp/vendor/flatpickr/plugins/minMaxTimePlugin.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/minMaxTimePlugin.d.ts rename to desktopapp/vendor/flatpickr/plugins/minMaxTimePlugin.d.ts diff --git a/desktopapp/js/vendor/flatpickr/plugins/minMaxTimePlugin.js b/desktopapp/vendor/flatpickr/plugins/minMaxTimePlugin.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/minMaxTimePlugin.js rename to desktopapp/vendor/flatpickr/plugins/minMaxTimePlugin.js diff --git a/desktopapp/js/vendor/flatpickr/plugins/momentPlugin.d.ts b/desktopapp/vendor/flatpickr/plugins/momentPlugin.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/momentPlugin.d.ts rename to desktopapp/vendor/flatpickr/plugins/momentPlugin.d.ts diff --git a/desktopapp/js/vendor/flatpickr/plugins/momentPlugin.js b/desktopapp/vendor/flatpickr/plugins/momentPlugin.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/momentPlugin.js rename to desktopapp/vendor/flatpickr/plugins/momentPlugin.js diff --git a/desktopapp/js/vendor/flatpickr/plugins/monthSelect/index.d.ts b/desktopapp/vendor/flatpickr/plugins/monthSelect/index.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/monthSelect/index.d.ts rename to desktopapp/vendor/flatpickr/plugins/monthSelect/index.d.ts diff --git a/desktopapp/js/vendor/flatpickr/plugins/monthSelect/index.js b/desktopapp/vendor/flatpickr/plugins/monthSelect/index.js similarity index 99% rename from desktopapp/js/vendor/flatpickr/plugins/monthSelect/index.js rename to desktopapp/vendor/flatpickr/plugins/monthSelect/index.js index 3e140a4..87f7629 100644 --- a/desktopapp/js/vendor/flatpickr/plugins/monthSelect/index.js +++ b/desktopapp/vendor/flatpickr/plugins/monthSelect/index.js @@ -4,30 +4,30 @@ (global = global || self, global.monthSelectPlugin = factory()); }(this, (function () { 'use strict'; - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); }; var monthToStr = function (monthNumber, shorthand, locale) { return locale.months[shorthand ? "shorthand" : "longhand"][monthNumber]; }; diff --git a/desktopapp/js/vendor/flatpickr/plugins/monthSelect/style.css b/desktopapp/vendor/flatpickr/plugins/monthSelect/style.css similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/monthSelect/style.css rename to desktopapp/vendor/flatpickr/plugins/monthSelect/style.css diff --git a/desktopapp/js/vendor/flatpickr/plugins/monthSelect/tests.spec.d.ts b/desktopapp/vendor/flatpickr/plugins/monthSelect/tests.spec.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/monthSelect/tests.spec.d.ts rename to desktopapp/vendor/flatpickr/plugins/monthSelect/tests.spec.d.ts diff --git a/desktopapp/js/vendor/flatpickr/plugins/rangePlugin.d.ts b/desktopapp/vendor/flatpickr/plugins/rangePlugin.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/rangePlugin.d.ts rename to desktopapp/vendor/flatpickr/plugins/rangePlugin.d.ts diff --git a/desktopapp/js/vendor/flatpickr/plugins/rangePlugin.js b/desktopapp/vendor/flatpickr/plugins/rangePlugin.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/rangePlugin.js rename to desktopapp/vendor/flatpickr/plugins/rangePlugin.js diff --git a/desktopapp/js/vendor/flatpickr/plugins/scrollPlugin.d.ts b/desktopapp/vendor/flatpickr/plugins/scrollPlugin.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/scrollPlugin.d.ts rename to desktopapp/vendor/flatpickr/plugins/scrollPlugin.d.ts diff --git a/desktopapp/js/vendor/flatpickr/plugins/scrollPlugin.js b/desktopapp/vendor/flatpickr/plugins/scrollPlugin.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/scrollPlugin.js rename to desktopapp/vendor/flatpickr/plugins/scrollPlugin.js diff --git a/desktopapp/js/vendor/flatpickr/plugins/weekSelect/weekSelect.d.ts b/desktopapp/vendor/flatpickr/plugins/weekSelect/weekSelect.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/weekSelect/weekSelect.d.ts rename to desktopapp/vendor/flatpickr/plugins/weekSelect/weekSelect.d.ts diff --git a/desktopapp/js/vendor/flatpickr/plugins/weekSelect/weekSelect.js b/desktopapp/vendor/flatpickr/plugins/weekSelect/weekSelect.js similarity index 100% rename from desktopapp/js/vendor/flatpickr/plugins/weekSelect/weekSelect.js rename to desktopapp/vendor/flatpickr/plugins/weekSelect/weekSelect.js diff --git a/desktopapp/js/vendor/flatpickr/themes/airbnb.css b/desktopapp/vendor/flatpickr/themes/airbnb.css similarity index 100% rename from desktopapp/js/vendor/flatpickr/themes/airbnb.css rename to desktopapp/vendor/flatpickr/themes/airbnb.css diff --git a/desktopapp/js/vendor/flatpickr/types/globals.d.ts b/desktopapp/vendor/flatpickr/types/globals.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/types/globals.d.ts rename to desktopapp/vendor/flatpickr/types/globals.d.ts diff --git a/desktopapp/js/vendor/flatpickr/types/instance.d.ts b/desktopapp/vendor/flatpickr/types/instance.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/types/instance.d.ts rename to desktopapp/vendor/flatpickr/types/instance.d.ts diff --git a/desktopapp/js/vendor/flatpickr/types/locale.d.ts b/desktopapp/vendor/flatpickr/types/locale.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/types/locale.d.ts rename to desktopapp/vendor/flatpickr/types/locale.d.ts diff --git a/desktopapp/js/vendor/flatpickr/types/options.d.ts b/desktopapp/vendor/flatpickr/types/options.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/types/options.d.ts rename to desktopapp/vendor/flatpickr/types/options.d.ts diff --git a/desktopapp/js/vendor/flatpickr/typings.d.ts b/desktopapp/vendor/flatpickr/typings.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/typings.d.ts rename to desktopapp/vendor/flatpickr/typings.d.ts diff --git a/desktopapp/js/vendor/flatpickr/utils/dates.d.ts b/desktopapp/vendor/flatpickr/utils/dates.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/utils/dates.d.ts rename to desktopapp/vendor/flatpickr/utils/dates.d.ts diff --git a/desktopapp/js/vendor/flatpickr/utils/dom.d.ts b/desktopapp/vendor/flatpickr/utils/dom.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/utils/dom.d.ts rename to desktopapp/vendor/flatpickr/utils/dom.d.ts diff --git a/desktopapp/js/vendor/flatpickr/utils/formatting.d.ts b/desktopapp/vendor/flatpickr/utils/formatting.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/utils/formatting.d.ts rename to desktopapp/vendor/flatpickr/utils/formatting.d.ts diff --git a/desktopapp/js/vendor/flatpickr/utils/index.d.ts b/desktopapp/vendor/flatpickr/utils/index.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/utils/index.d.ts rename to desktopapp/vendor/flatpickr/utils/index.d.ts diff --git a/desktopapp/js/vendor/flatpickr/utils/polyfills.d.ts b/desktopapp/vendor/flatpickr/utils/polyfills.d.ts similarity index 100% rename from desktopapp/js/vendor/flatpickr/utils/polyfills.d.ts rename to desktopapp/vendor/flatpickr/utils/polyfills.d.ts diff --git a/desktopapp/vendor/jquery/jquery.min.js b/desktopapp/vendor/jquery/jquery.min.js new file mode 100644 index 0000000..c39d8fd --- /dev/null +++ b/desktopapp/vendor/jquery/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(g,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,v=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),m={},b=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},w=g.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function C(e,t,n){var r,i,o=(n=n||w).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function T(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector",E=function(e,t){return new E.fn.init(e,t)};function d(e){var t=!!e&&"length"in e&&e.length,n=T(e);return!b(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+R+")"+R+"*"),U=new RegExp(R+"|>"),V=new RegExp(W),X=new RegExp("^"+B+"$"),Q={ID:new RegExp("^#("+B+")"),CLASS:new RegExp("^\\.("+B+")"),TAG:new RegExp("^("+B+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),bool:new RegExp("^(?:"+I+")$","i"),needsContext:new RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,G=/^(?:input|select|textarea|button)$/i,K=/^h\d$/i,J=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+R+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){C()},ae=xe(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{O.apply(t=P.call(d.childNodes),d.childNodes),t[d.childNodes.length].nodeType}catch(e){O={apply:t.length?function(e,t){q.apply(e,P.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(C(e),e=e||T,E)){if(11!==d&&(u=Z.exec(t)))if(i=u[1]){if(9===d){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return O.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&p.getElementsByClassName&&e.getElementsByClassName)return O.apply(n,e.getElementsByClassName(i)),n}if(p.qsa&&!k[t+" "]&&(!v||!v.test(t))&&(1!==d||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===d&&(U.test(t)||_.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&p.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=A)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+be(l[o]);c=l.join(",")}try{return O.apply(n,f.querySelectorAll(c)),n}catch(e){k(t,!0)}finally{s===A&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>x.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[A]=!0,e}function ce(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)x.attrHandle[n[r]]=t}function de(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pe(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in p=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},C=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:d;return r!=T&&9===r.nodeType&&r.documentElement&&(a=(T=r).documentElement,E=!i(T),d!=T&&(n=T.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),p.scope=ce(function(e){return a.appendChild(e).appendChild(T.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),p.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),p.getElementsByTagName=ce(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),p.getElementsByClassName=J.test(T.getElementsByClassName),p.getById=ce(function(e){return a.appendChild(e).id=A,!T.getElementsByName||!T.getElementsByName(A).length}),p.getById?(x.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(x.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),x.find.TAG=p.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):p.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},x.find.CLASS=p.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(p.qsa=J.test(T.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+R+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+R+"*(?:value|"+I+")"),e.querySelectorAll("[id~="+A+"-]").length||v.push("~="),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+R+"*name"+R+"*="+R+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+A+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+R+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(p.matchesSelector=J.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){p.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",W)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=J.test(a.compareDocumentPosition),y=t||J.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!p.sortDetached&&t.compareDocumentPosition(e)===n?e==T||e.ownerDocument==d&&y(d,e)?-1:t==T||t.ownerDocument==d&&y(d,t)?1:u?H(u,e)-H(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==T?-1:t==T?1:i?-1:o?1:u?H(u,e)-H(u,t):0;if(i===o)return de(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?de(a[r],s[r]):a[r]==d?-1:s[r]==d?1:0}),T},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(C(e),p.matchesSelector&&E&&!k[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||p.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){k(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&V.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+R+")"+e+"("+R+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return b(n)?E.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?E.grep(e,function(e){return e===n!==r}):"string"!=typeof n?E.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(E.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||L,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:j.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof E?t[0]:t,E.merge(this,E.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:w,!0)),k.test(r[1])&&E.isPlainObject(t))for(r in t)b(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=w.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):b(e)?void 0!==n.ready?n.ready(e):e(E):E.makeArray(e,this)}).prototype=E.fn,L=E(w);var q=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}E.fn.extend({has:function(e){var t=E(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i;le=w.createDocumentFragment().appendChild(w.createElement("div")),(ce=w.createElement("input")).setAttribute("type","radio"),ce.setAttribute("checked","checked"),ce.setAttribute("name","t"),le.appendChild(ce),m.checkClone=le.cloneNode(!0).cloneNode(!0).lastChild.checked,le.innerHTML="",m.noCloneChecked=!!le.cloneNode(!0).lastChild.defaultValue,le.innerHTML="",m.option=!!le.lastChild;var he={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ge(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&S(e,t)?E.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var ye=/<|&#?\w+;/;function me(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p\s*$/g;function Le(e,t){return S(e,"table")&&S(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function je(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n
",2===ft.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(m.createHTMLDocument?((r=(t=w.implementation.createHTMLDocument("")).createElement("base")).href=w.location.href,t.head.appendChild(r)):t=w),o=!n&&[],(i=k.exec(e))?[t.createElement(i[1])]:(i=me([e],t,o),o&&o.length&&E(o).remove(),E.merge([],i.childNodes)));var r,i,o},E.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=E.css(e,"position"),c=E(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=E.css(e,"top"),u=E.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),b(t)&&(t=t.call(e,n,E.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),i.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-E.css(r,"marginTop",!0),left:t.left-i.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===E.css(e,"position"))e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;E.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=Fe(m.pixelPosition,function(e,t){if(t)return t=We(e,n),Ie.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){E.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,i):E.style(e,t,n,i)},s,n?e:void 0,n)}})}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){E.fn[n]=function(e,t){return 0