From b46109dc9019d5d5914e4698639795f99a5b1fb9 Mon Sep 17 00:00:00 2001 From: JeffDaniels Date: Tue, 10 Dec 2024 22:48:25 -0600 Subject: [PATCH] DB now CouchDB + PouchDB TODO : Remove toast messages TODO remove persistence from score dropdowns --- .wappler/project.json | 31 +- .../wappler-compose/docker-compose.yml | 1 + .../Development/databases/dbCouch.json | 60 +++- app/api/test.json | 3 + public/dmxAppConnect/config.js | 213 ++++-------- .../dmxBootstrap5Alert/dmxBootstrap5Alert.js | 8 + .../dmxBootstrap5Alert.js.map | 1 + .../dmxAppConnect/dmxLazyLoad/dmxLazyLoad.js | 10 + .../dmxLazyLoad/lazysizes.min.js | 2 + public/dmxAppConnect/dmxPouchDB/dmxPouchDB.js | 8 + .../dmxPouchDB/dmxPouchDB.js.map | 1 + public/js/blah.js | 2 + views/Scrollable-sections.ejs | 4 +- views/index0.ejs | 320 +++++++++++++----- views/layouts/main.ejs | 8 + views/observationPage.ejs | 127 +++++-- views/success.ejs | 8 +- 17 files changed, 528 insertions(+), 279 deletions(-) create mode 100644 .wappler/providers/digitalocean/servers/MatrixDeveloper/wappler-compose/docker-compose.yml create mode 100644 app/api/test.json create mode 100644 public/dmxAppConnect/dmxBootstrap5Alert/dmxBootstrap5Alert.js create mode 100644 public/dmxAppConnect/dmxBootstrap5Alert/dmxBootstrap5Alert.js.map create mode 100644 public/dmxAppConnect/dmxLazyLoad/dmxLazyLoad.js create mode 100644 public/dmxAppConnect/dmxLazyLoad/lazysizes.min.js create mode 100644 public/dmxAppConnect/dmxPouchDB/dmxPouchDB.js create mode 100644 public/dmxAppConnect/dmxPouchDB/dmxPouchDB.js.map create mode 100644 public/js/blah.js diff --git a/.wappler/project.json b/.wappler/project.json index 8f2070b..e7642c6 100644 --- a/.wappler/project.json +++ b/.wappler/project.json @@ -97,7 +97,8 @@ "id": 44250508, "ssh-key-file": "/.wappler/.ssh/ertfastfiller_ed25519.pub", "fingerprint": "64:50:e4:41:ed:26:78:df:fb:27:4a:cf:a7:58:02:2a", - "type": "ed25519" + "type": "ed25519", + "name": "ertfastfiller_ed25519" }, "ertfastfiller_rsa": { "id": 44250710, @@ -198,6 +199,34 @@ } } ] + }, + "MatrixDeveloper": { + "id": 461116055, + "status": "running", + "access": true, + "ip_address": "147.182.250.146", + "region": "San Francisco 3", + "price": 4, + "vcpus": 1, + "memory": 512, + "disk": 10, + "transfer": "0.5", + "ssh_keys": [ + { + "id": 44250460, + "public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGsEr/uTng6hsmeec9KZNZ/G5QMqynZ3bOpGm6r/FyXz jndan@DESKTOP-N026HO3", + "name": "DO_Developer_12_2024", + "fingerprint": "f2:60:83:0a:b3:4e:c7:7b:51:d1:a8:28:88:10:1b:07" + }, + { + "id": 44250508, + "ssh-key-file": "/.wappler/.ssh/ertfastfiller_ed25519.pub", + "fingerprint": "64:50:e4:41:ed:26:78:df:fb:27:4a:cf:a7:58:02:2a", + "type": "ed25519", + "name": "ertfastfiller_ed25519" + } + ], + "services": {} } } } diff --git a/.wappler/providers/digitalocean/servers/MatrixDeveloper/wappler-compose/docker-compose.yml b/.wappler/providers/digitalocean/servers/MatrixDeveloper/wappler-compose/docker-compose.yml new file mode 100644 index 0000000..ad189dd --- /dev/null +++ b/.wappler/providers/digitalocean/servers/MatrixDeveloper/wappler-compose/docker-compose.yml @@ -0,0 +1 @@ +services: {} diff --git a/.wappler/targets/Development/databases/dbCouch.json b/.wappler/targets/Development/databases/dbCouch.json index 4455a11..dde080e 100644 --- a/.wappler/targets/Development/databases/dbCouch.json +++ b/.wappler/targets/Development/databases/dbCouch.json @@ -30,6 +30,25 @@ { "name": "db_employeeID", "type": "text" + }, + { + "name": "db_signatureData", + "type": "text" + }, + { + "name": "db_trainerSelected", + "type": "text" + }, + { + "name": "db_stateName", + "type": "text" + }, + { + "name": "dummy1", + "type": "text", + "ui": { + "label": "dummy" + } } ] }, @@ -41,15 +60,48 @@ }, { "name": "docPDF", - "type": "file" + "type": "text" } ], - "status": { - "modified": true - }, "db_edits": { "name": "daData" } + }, + "driver": { + "meta": [ + { + "name": "_id", + "type": "objectId" + }, + { + "name": "db_fullName", + "type": "text" + }, + { + "name": "db_licenseNumber", + "type": "text" + }, + { + "name": "db_employeeID", + "type": "text" + }, + { + "name": "db_signatureData", + "type": "text" + }, + { + "name": "db_trainerSelected", + "type": "text" + }, + { + "name": "db_stateName", + "type": "text" + }, + { + "name": "dummy1", + "type": "text" + } + ] } }, "views": {} diff --git a/app/api/test.json b/app/api/test.json new file mode 100644 index 0000000..18cca0a --- /dev/null +++ b/app/api/test.json @@ -0,0 +1,3 @@ +{ + "exec": {} +} \ No newline at end of file diff --git a/public/dmxAppConnect/config.js b/public/dmxAppConnect/config.js index 701cb83..2859d47 100644 --- a/public/dmxAppConnect/config.js +++ b/public/dmxAppConnect/config.js @@ -1,171 +1,84 @@ dmx.config({ - "start": { - "repeat1": { - "meta": null, - "outputType": "text" - }, - "tableRepeat1": { - "meta": [ - { - "name": "isSection", - "type": "text" - }, - { - "name": "numSection", - "type": "text" - }, - { - "name": "txtSection", - "type": "text" - }, - { - "name": "wNumSection", - "type": "number" - } - ], - "outputType": "text" - } - }, "observationPage": { - "flowClearPoints": { + "tableRepeat4": { "meta": [ { - "name": "zzmyTestFunction", - "type": "text" - } - ], - "local": {} - }, - "processPDF": { - "meta": [ + "name": "_id", + "type": "objectId" + }, { - "name": "PDFprocess", + "name": "db_fullName", "type": "text" + }, + { + "name": "db_licenseNumber", + "type": "text" + }, + { + "name": "db_employeeID", + "type": "text" + }, + { + "name": "db_signatureData", + "type": "text" + }, + { + "name": "db_trainerSelected", + "type": "text" + }, + { + "name": "db_stateName", + "type": "text" + }, + { + "name": "dummy1", + "type": "text", + "ui": { + "label": "dummy" + } } ], - "local": {} + "outputType": "array" }, - "datastore1": [ - { - "type": "text", - "name": "numSection" - }, - { - "type": "text", - "name": "description" - }, - { - "type": "text", - "name": "Points" - }, - { - "type": "text", - "name": "section" - } - ], "data_view1": { "meta": [ { - "type": "number", - "name": "ID" + "name": "_id", + "type": "objectId" }, { + "name": "db_fullName", + "type": "text" + }, + { + "name": "db_licenseNumber", + "type": "text" + }, + { + "name": "db_employeeID", + "type": "text" + }, + { + "name": "db_signatureData", + "type": "text" + }, + { + "name": "db_trainerSelected", + "type": "text" + }, + { + "name": "db_stateName", + "type": "text" + }, + { + "name": "dummy1", "type": "text", - "name": "db_fullName" - }, - { - "type": "text", - "name": "db_licenseNumber" - }, - { - "type": "text", - "name": "db_stateIssue" - }, - { - "type": "number", - "name": "db_employeeID" - }, - { - "type": "text", - "name": "owner" - }, - { - "type": "text", - "sub": [], - "name": "db_SignatureData" + "ui": { + "label": "dummy" + } } ], "outputType": "array" } - }, - "index": { - "flowRunPageId": { - "meta": [ - { - "name": "setRunPageId", - "type": "text" - } - ], - "local": {} - }, - "flowrunPageId": { - "meta": [ - { - "name": "setRunPageId", - "type": "text" - } - ], - "local": {} - }, - "runPageId": { - "outputType": "text" - }, - "flow1": { - "meta": [ - { - "name": "saveSignatureFlow", - "type": "text" - } - ], - "local": [ - { - "name": "", - "type": "object", - "metaData": { - "alertMessage": { - "meta": null, - "outputType": "text" - } - } - } - ] - }, - "signatureEncodeFlow": { - "meta": [ - { - "name": "signatureEncoded", - "type": "text" - }, - { - "name": "submitServerConnect", - "type": "text" - } - ], - "local": {} - }, - "cookies": [ - { - "type": "text", - "name": "userIdentifier" - } - ] - }, - "success": { - "cookies": [ - { - "type": "text", - "name": "userIdentifier" - } - ] } }); diff --git a/public/dmxAppConnect/dmxBootstrap5Alert/dmxBootstrap5Alert.js b/public/dmxAppConnect/dmxBootstrap5Alert/dmxBootstrap5Alert.js new file mode 100644 index 0000000..58f7424 --- /dev/null +++ b/public/dmxAppConnect/dmxBootstrap5Alert/dmxBootstrap5Alert.js @@ -0,0 +1,8 @@ +/*! + App Connect Bootstrap 5 Alert + Version: 2.0.1 + (c) 2024 Wappler.io + @build 2024-06-19 11:47:06 + */ +dmx.Component("bs5-alert",{initialData:{visible:!1},attributes:{show:{type:Boolean,default:!1},type:{type:String,default:"primary",enum:["primary","secondary","success","danger","warning","info","light","dark"]},closable:{type:Boolean,default:!1}},methods:{toggle(){this._toggle()},show(){this._show()},hide(){this._hide()},setType(t){this._setType(t)},setTextContent(t){this._setTextContent(t)}},init(t){this._transitionendHandler=this._transitionendHandler.bind(this),this._closeButton=document.createElement("button"),this._closeButton.setAttribute("type","button"),this._closeButton.setAttribute("aria-label","Close"),this._closeButton.className="btn-close",this._closeButton.addEventListener("click",this._hide.bind(this)),t.setAttribute("role","alert"),t.classList.add("alert"),this.props.closable&&(t.appendChild(this._closeButton),t.classList.add("alert-dismissible")),this.props.show?(t.classList.add("show"),this.set("visible",!0)):t.style.setProperty("display","none"),this._setType(this.props.type)},performUpdate(t){t.has("type")&&this._setType(this.props.type),t.has("show")&&this[this.props.show?"_show":"_hide"](),t.has("closable")&&(this.props.closable?(this.$node.appendChild(this._closeButton),this.$node.classList.add("alert-dismissible")):(this.$closeButton.remove(),this.$node.classList.remove("alert-dismissible")))},_show:function(){this.$node.removeEventListener("transitionend",this._transitionendHandler),this.$node.style.removeProperty("display"),this.$node.offsetWidth,this.$node.classList.add("show"),this.set("visible",!0)},_hide:function(){this.$node.removeEventListener("transitionend",this._transitionendHandler),this.$node.classList.contains("fade")?this.$node.addEventListener("transitionend",this._transitionendHandler,{once:!0}):this.$node.style.setProperty("display","none"),this.$node.classList.remove("show"),this.set("visible",!1)},_transitionendHandler:function(){this.$node.style.setProperty("display","none")},_setType:function(t){var s=["primary","secondary","success","danger","warning","info","light","dark"].map((function(t){return"alert-"+t}));this.$node.classList.remove.apply(this.$node.classList,s),this.$node.classList.add("alert-"+t)},_setTextContent:function(t){this._closeButton.remove(),this.$node.textContent=t,this.props.closable&&this.$node.appendChild(this._closeButton)}}); +//# sourceMappingURL=dmxBootstrap5Alert.js.map diff --git a/public/dmxAppConnect/dmxBootstrap5Alert/dmxBootstrap5Alert.js.map b/public/dmxAppConnect/dmxBootstrap5Alert/dmxBootstrap5Alert.js.map new file mode 100644 index 0000000..1f05cf4 --- /dev/null +++ b/public/dmxAppConnect/dmxBootstrap5Alert/dmxBootstrap5Alert.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["components/alert.js"],"names":["dmx","Component","initialData","visible","attributes","show","type","Boolean","default","String","enum","closable","methods","toggle","this","_toggle","_show","hide","_hide","setType","style","_setType","setTextContent","text","_setTextContent","init","node","_transitionendHandler","bind","_closeButton","document","createElement","setAttribute","className","addEventListener","classList","add","props","appendChild","set","setProperty","performUpdate","updatedProps","has","$node","$closeButton","remove","removeEventListener","removeProperty","offsetWidth","contains","once","types","map","apply","textContent"],"mappings":";;;;;;AAAAA,IAAAC,UAAA,YAAA,CAEAC,YAAA,CACAC,SAAA,GAGAC,WAAA,CACAC,KAAA,CACAC,KAAAC,QACAC,SAAA,GAGAF,KAAA,CACAA,KAAAG,OACAD,QAAA,UACAE,KAAA,CAAA,UAAA,YAAA,UAAA,SAAA,UAAA,OAAA,QAAA,SAGAC,SAAA,CACAL,KAAAC,QACAC,SAAA,IAIAI,QAAA,CACAC,SACAC,KAAAC,SACA,EAEAV,OACAS,KAAAE,OACA,EAEAC,OACAH,KAAAI,OACA,EAEAC,QAAAC,GACAN,KAAAO,SAAAD,EACA,EAEAE,eAAAC,GACAT,KAAAU,gBAAAD,EACA,GAGAE,KAAAC,GACAZ,KAAAa,sBAAAb,KAAAa,sBAAAC,KAAAd,MAEAA,KAAAe,aAAAC,SAAAC,cAAA,UACAjB,KAAAe,aAAAG,aAAA,OAAA,UACAlB,KAAAe,aAAAG,aAAA,aAAA,SACAlB,KAAAe,aAAAI,UAAA,YACAnB,KAAAe,aAAAK,iBAAA,QAAApB,KAAAI,MAAAU,KAAAd,OAEAY,EAAAM,aAAA,OAAA,SACAN,EAAAS,UAAAC,IAAA,SAEAtB,KAAAuB,MAAA1B,WACAe,EAAAY,YAAAxB,KAAAe,cACAH,EAAAS,UAAAC,IAAA,sBAGAtB,KAAAuB,MAAAhC,MACAqB,EAAAS,UAAAC,IAAA,QACAtB,KAAAyB,IAAA,WAAA,IAEAb,EAAAN,MAAAoB,YAAA,UAAA,QAGA1B,KAAAO,SAAAP,KAAAuB,MAAA/B,KACA,EAEAmC,cAAAC,GACAA,EAAAC,IAAA,SACA7B,KAAAO,SAAAP,KAAAuB,MAAA/B,MAGAoC,EAAAC,IAAA,SACA7B,KAAAA,KAAAuB,MAAAhC,KAAA,QAAA,WAGAqC,EAAAC,IAAA,cACA7B,KAAAuB,MAAA1B,UACAG,KAAA8B,MAAAN,YAAAxB,KAAAe,cACAf,KAAA8B,MAAAT,UAAAC,IAAA,uBAEAtB,KAAA+B,aAAAC,SACAhC,KAAA8B,MAAAT,UAAAW,OAAA,sBAGA,EAEA9B,MAAA,WACAF,KAAA8B,MAAAG,oBAAA,gBAAAjC,KAAAa,uBACAb,KAAA8B,MAAAxB,MAAA4B,eAAA,WACAlC,KAAA8B,MAAAK,YACAnC,KAAA8B,MAAAT,UAAAC,IAAA,QACAtB,KAAAyB,IAAA,WAAA,EACA,EAEArB,MAAA,WACAJ,KAAA8B,MAAAG,oBAAA,gBAAAjC,KAAAa,uBACAb,KAAA8B,MAAAT,UAAAe,SAAA,QACApC,KAAA8B,MAAAV,iBAAA,gBAAApB,KAAAa,sBAAA,CAAAwB,MAAA,IAEArC,KAAA8B,MAAAxB,MAAAoB,YAAA,UAAA,QAEA1B,KAAA8B,MAAAT,UAAAW,OAAA,QACAhC,KAAAyB,IAAA,WAAA,EACA,EAEAZ,sBAAA,WACAb,KAAA8B,MAAAxB,MAAAoB,YAAA,UAAA,OACA,EAEAnB,SAAA,SAAAf,GACA,IAAA8C,EAAA,CAAA,UAAA,YAAA,UAAA,SAAA,UAAA,OAAA,QAAA,QAAAC,KAAA,SAAA/C,GAAA,MAAA,SAAAA,CAAA,IACAQ,KAAA8B,MAAAT,UAAAW,OAAAQ,MAAAxC,KAAA8B,MAAAT,UAAAiB,GACAtC,KAAA8B,MAAAT,UAAAC,IAAA,SAAA9B,EACA,EAEAkB,gBAAA,SAAAD,GACAT,KAAAe,aAAAiB,SACAhC,KAAA8B,MAAAW,YAAAhC,EACAT,KAAAuB,MAAA1B,UACAG,KAAA8B,MAAAN,YAAAxB,KAAAe,aAEA","file":"dmxBootstrap5Alert.js","sourcesContent":["dmx.Component('bs5-alert', {\r\n\r\n initialData: {\r\n visible: false,\r\n },\r\n\r\n attributes: {\r\n show: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n\r\n type: {\r\n type: String,\r\n default: 'primary',\r\n enum: ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark']\r\n },\r\n\r\n closable: {\r\n type: Boolean,\r\n default: false,\r\n }\r\n },\r\n\r\n methods: {\r\n toggle () {\r\n this._toggle();\r\n },\r\n\r\n show () {\r\n this._show();\r\n },\r\n\r\n hide () {\r\n this._hide();\r\n },\r\n\r\n setType (style) {\r\n this._setType(style);\r\n },\r\n\r\n setTextContent (text) {\r\n this._setTextContent(text)\r\n }\r\n },\r\n\r\n init (node) {\r\n this._transitionendHandler = this._transitionendHandler.bind(this);\r\n\r\n this._closeButton = document.createElement('button');\r\n this._closeButton.setAttribute('type', 'button');\r\n this._closeButton.setAttribute('aria-label', 'Close');\r\n this._closeButton.className = 'btn-close';\r\n this._closeButton.addEventListener('click', this._hide.bind(this));\r\n \r\n node.setAttribute('role', 'alert');\r\n node.classList.add('alert');\r\n\r\n if (this.props.closable) {\r\n node.appendChild(this._closeButton);\r\n node.classList.add('alert-dismissible');\r\n }\r\n\r\n if (this.props.show) {\r\n node.classList.add('show');\r\n this.set('visible', true);\r\n } else {\r\n node.style.setProperty('display', 'none');\r\n }\r\n\r\n this._setType(this.props.type);\r\n },\r\n\r\n performUpdate (updatedProps) {\r\n if (updatedProps.has('type')) {\r\n this._setType(this.props.type);\r\n }\r\n\r\n if (updatedProps.has('show')) {\r\n this[this.props.show ? '_show' : '_hide']();\r\n }\r\n\r\n if (updatedProps.has('closable')) {\r\n if (this.props.closable) {\r\n this.$node.appendChild(this._closeButton);\r\n this.$node.classList.add('alert-dismissible');\r\n } else {\r\n this.$closeButton.remove();\r\n this.$node.classList.remove('alert-dismissible');\r\n }\r\n }\r\n },\r\n\r\n _show: function () {\r\n this.$node.removeEventListener('transitionend', this._transitionendHandler);\r\n this.$node.style.removeProperty('display');\r\n this.$node.offsetWidth;\r\n this.$node.classList.add('show');\r\n this.set('visible', true);\r\n },\r\n\r\n _hide: function () {\r\n this.$node.removeEventListener('transitionend', this._transitionendHandler);\r\n if (this.$node.classList.contains('fade')) {\r\n this.$node.addEventListener('transitionend', this._transitionendHandler, { once: true });\r\n } else {\r\n this.$node.style.setProperty('display', 'none');\r\n }\r\n this.$node.classList.remove('show');\r\n this.set('visible', false);\r\n },\r\n\r\n _transitionendHandler: function () {\r\n this.$node.style.setProperty('display', 'none');\r\n },\r\n\r\n _setType: function (type) {\r\n var types = ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark'].map(function (type) { return 'alert-' + type });\r\n this.$node.classList.remove.apply(this.$node.classList, types);\r\n this.$node.classList.add('alert-' + type);\r\n },\r\n\r\n _setTextContent: function (text) {\r\n this._closeButton.remove();\r\n this.$node.textContent = text;\r\n if (this.props.closable) {\r\n this.$node.appendChild(this._closeButton);\r\n }\r\n }\r\n\r\n});\r\n"]} \ No newline at end of file diff --git a/public/dmxAppConnect/dmxLazyLoad/dmxLazyLoad.js b/public/dmxAppConnect/dmxLazyLoad/dmxLazyLoad.js new file mode 100644 index 0000000..7124cd3 --- /dev/null +++ b/public/dmxAppConnect/dmxLazyLoad/dmxLazyLoad.js @@ -0,0 +1,10 @@ +dmx.Attribute('lazyload', 'mounted', function(node, attr) { + this.$addBinding(attr.value, function(value) { + node.classList.add('lazyload'); + }) +}); +dmx.Attribute('lazyload-dynamic', 'mounted', function(node, attr) { + this.$addBinding(attr.value, function(value) { + node.classList.add('lazyload'); + }) +}); \ No newline at end of file diff --git a/public/dmxAppConnect/dmxLazyLoad/lazysizes.min.js b/public/dmxAppConnect/dmxLazyLoad/lazysizes.min.js new file mode 100644 index 0000000..00aac58 --- /dev/null +++ b/public/dmxAppConnect/dmxLazyLoad/lazysizes.min.js @@ -0,0 +1,2 @@ +/*! lazysizes - v4.1.5 */ +!function(a,b){var c=b(a,a.document);a.lazySizes=c,"object"==typeof module&&module.exports&&(module.exports=c)}(window,function(a,b){"use strict";if(b.getElementsByClassName){var c,d,e=b.documentElement,f=a.Date,g=a.HTMLPictureElement,h="addEventListener",i="getAttribute",j=a[h],k=a.setTimeout,l=a.requestAnimationFrame||k,m=a.requestIdleCallback,n=/^picture$/i,o=["load","error","lazyincluded","_lazyloaded"],p={},q=Array.prototype.forEach,r=function(a,b){return p[b]||(p[b]=new RegExp("(\\s|^)"+b+"(\\s|$)")),p[b].test(a[i]("class")||"")&&p[b]},s=function(a,b){r(a,b)||a.setAttribute("class",(a[i]("class")||"").trim()+" "+b)},t=function(a,b){var c;(c=r(a,b))&&a.setAttribute("class",(a[i]("class")||"").replace(c," "))},u=function(a,b,c){var d=c?h:"removeEventListener";c&&u(a,b),o.forEach(function(c){a[d](c,b)})},v=function(a,d,e,f,g){var h=b.createEvent("Event");return e||(e={}),e.instance=c,h.initEvent(d,!f,!g),h.detail=e,a.dispatchEvent(h),h},w=function(b,c){var e;!g&&(e=a.picturefill||d.pf)?(c&&c.src&&!b[i]("srcset")&&b.setAttribute("srcset",c.src),e({reevaluate:!0,elements:[b]})):c&&c.src&&(b.src=c.src)},x=function(a,b){return(getComputedStyle(a,null)||{})[b]},y=function(a,b,c){for(c=c||a.offsetWidth;c49?function(){m(h,{timeout:g}),g!==d.ricTimeout&&(g=d.ricTimeout)}:A(function(){k(h)},!0);return function(a){var d;(a=!0===a)&&(g=33),b||(b=!0,d=e-(f.now()-c),d<0&&(d=0),a||d<9?i():k(i,d))}},C=function(a){var b,c,d=99,e=function(){b=null,a()},g=function(){var a=f.now()-c;a0)&&"visible"!=x(f,"overflow")&&(d=f.getBoundingClientRect(),g=H>d.left&&Gd.top-1&&F500&&e.clientWidth>500?500:370),J=d.expand,K=J*d.expFactor),Q2&&o>2&&!b.hidden?(Q=K,S=0):Q=o>1&&S>1&&R<6?J:P;for(;f=n&&(F=h.top)<=D&&(H=h.right)>=n*L&&(G=h.left)<=y&&(I||H||G||F)&&(d.loadHidden||"hidden"!=x(r[f],"visibility"))&&(l&&R<3&&!p&&(o<3||S<4)||U(r[f],m))){if(ba(r[f]),k=!0,R>9)break}else!k&&l&&!j&&R<4&&S<4&&o>2&&(g[0]||d.preloadAfterLoad)&&(g[0]||!p&&(I||H||G||F||"auto"!=r[f][i](d.sizesAttr)))&&(j=g[0]||r[f]);else ba(r[f]);j&&!k&&ba(j)}},W=B(V),X=function(a){s(a.target,d.loadedClass),t(a.target,d.loadingClass),u(a.target,Z),v(a.target,"lazyloaded")},Y=A(X),Z=function(a){Y({target:a.target})},$=function(a,b){try{a.contentWindow.location.replace(b)}catch(c){a.src=b}},_=function(a){var b,c=a[i](d.srcsetAttr);(b=d.customMedia[a[i]("data-media")||a[i]("media")])&&a.setAttribute("media",b),c&&a.setAttribute("srcset",c)},aa=A(function(a,b,c,e,f){var g,h,j,l,o,p;(o=v(a,"lazybeforeunveil",b)).defaultPrevented||(e&&(c?s(a,d.autosizesClass):a.setAttribute("sizes",e)),h=a[i](d.srcsetAttr),g=a[i](d.srcAttr),f&&(j=a.parentNode,l=j&&n.test(j.nodeName||"")),p=b.firesLoad||"src"in a&&(h||g||l),o={target:a},p&&(u(a,T,!0),clearTimeout(m),m=k(T,2500),s(a,d.loadingClass),u(a,Z,!0)),l&&q.call(j.getElementsByTagName("source"),_),h?a.setAttribute("srcset",h):g&&!l&&(N.test(a.nodeName)?$(a,g):a.src=g),f&&(h||l)&&w(a,{src:g})),a._lazyRace&&delete a._lazyRace,t(a,d.lazyClass),z(function(){(!p||a.complete&&a.naturalWidth>1)&&(p?T(o):R--,X(o))},!0)}),ba=function(a){var b,c=M.test(a.nodeName),e=c&&(a[i](d.sizesAttr)||a[i]("sizes")),f="auto"==e;(!f&&l||!c||!a[i]("src")&&!a.srcset||a.complete||r(a,d.errorClass)||!r(a,d.lazyClass))&&(b=v(a,"lazyunveilread").detail,f&&E.updateElem(a,!0,a.offsetWidth),a._lazyRace=!0,R++,aa(a,b,f,e,c))},ca=function(){if(!l){if(f.now()-p<999)return void k(ca,999);var a=C(function(){d.loadMode=3,W()});l=!0,d.loadMode=3,W(),j("scroll",function(){3==d.loadMode&&(d.loadMode=2),a()},!0)}};return{_:function(){p=f.now(),c.elements=b.getElementsByClassName(d.lazyClass),g=b.getElementsByClassName(d.lazyClass+" "+d.preloadClass),L=d.hFac,j("scroll",W,!0),j("resize",W,!0),a.MutationObserver?new MutationObserver(W).observe(e,{childList:!0,subtree:!0,attributes:!0}):(e[h]("DOMNodeInserted",W,!0),e[h]("DOMAttrModified",W,!0),setInterval(W,999)),j("hashchange",W,!0),["focus","mouseover","click","load","transitionend","animationend","webkitAnimationEnd"].forEach(function(a){b[h](a,W,!0)}),/d$|^c/.test(b.readyState)?ca():(j("load",ca),b[h]("DOMContentLoaded",W),k(ca,2e4)),c.elements.length?(V(),z._lsFlush()):W()},checkElems:W,unveil:ba}}(),E=function(){var a,c=A(function(a,b,c,d){var e,f,g;if(a._lazysizesWidth=d,d+="px",a.setAttribute("sizes",d),n.test(b.nodeName||""))for(e=b.getElementsByTagName("source"),f=0,g=e.length;f{console.log(`PouchDB: ${t}`,e)})),s}return this.databases.get(t)},get(t){return this.setup(t)}},dmx.Startup(new Promise(((t,e)=>{document.addEventListener("DOMContentLoaded",t)})).then((()=>{if(dmx.databases&&Object.keys(dmx.databases).length)return dmx.debug&&console.log("dmx.databases:",dmx.databases),Promise.all(Object.keys(dmx.databases).filter((t=>"pouchdb"===dmx.databases[t].type)).map((t=>{const{version:e,upgrade:s,remote:n,options:a}=dmx.databases[t],i=dmx.pouchdb.setup(t,{options:a});return n?(dmx.debug&&console.log(`${t} replicate from ${n}`),i.replicate.from(n).then((()=>{dmx.debug&&console.log(`${t} replication done, init sync`),i.sync(n,{live:!0,retry:!0}).on("change",(e=>{document.dispatchEvent(new CustomEvent("pouchdb:sync",{detail:{database:t,change:e}})),dmx.debug&&console.log(`${t} sync change`,e)})).on("error",(e=>{document.dispatchEvent(new CustomEvent("pouchdb:error",{detail:{database:t,err:e}})),dmx.debug&&console.log(`${t} sync error`,e)}))})).catch((e=>{console.warn(`Replication error for ${t}:`,e)}))):(dmx.debug&&console.log(`upgrade ${t} to version ${e}`),i.get("_local/version").then((t=>t.version)).catch((t=>0)).then((e=>(dmx.debug&&console.log(`${t} current version ${e}`),Promise.all(s.map((s=>{if(!(e>=s.toVersion))return dmx.debug&&console.log(`Upgrade ${t} to ${s.toVersion}`),i.bulkDocs(s.updates.concat([{_id:"_local/version",version:s.toVersion}])).then((e=>(dmx.debug&&console.log(`Upgrade result for ${t}:`,e),Promise.all(e.filter((t=>409==t.status)).map((t=>(dmx.debug&&console.log("Conflict",t),i.get(t.id).then((t=>(dmx.debug&&(console.log("Conflict doc",t),console.log("Conflict update",s.updates.find((e=>e._id==t._id)))),i.put({...t,...s.updates.find((e=>e._id==t._id)),version:s.toVersion}))))))))))).catch((e=>{console.error(`Upgrade error for ${t}:`,e)}));dmx.debug&&console.log(`Skipping upgrade for ${t}:`,s)})))))))})))}))),function(){const t=t=>t.rows.map((t=>t.doc)),e=t=>e=>{if(t){const s=(t,e)=>{if(e.operator){const s=t[e.data.column],n=e.value;switch(e.operator){case"equal":return s==n;case"not_equal":return s!=n;case"in":return n.includes(s);case"not_in":return!n.includes(s);case"less":return sn;case"greater_or_equal":return s>=n;case"between":return n[0]<=s<=n[1];case"not_between":return!(n[0]<=s<=n[1]);case"begins_with":return String(s).startsWith(String(n));case"not_begins_with":return!String(s).startsWith(String(n));case"contains":return String(s).includes(String(n));case"not_contains":return!String(s).includes(String(n));case"ends_with":return String(s).endsWith(String(n));case"not_ends_with":return!String(s).endsWith(String(n));case"is_empty":return null==s||""==s;case"is_not_empty":return null!=s&&""!=s;case"is_null":return null==s;case"is_not_null":return null!=s}}if(e.condition&&e.rules.length){for(let n of e.rules){const a=s(t,n);if(!a&&"AND"==e.condition)return!1;if(a&&"OR"==e.condition)return!0}return"OR"!=e.condition}return!0};return e.filter((e=>s(e,t)))}return e},s=t=>e=>e.sort(((e,s)=>{for(let n of t){if(e[n.column]==s[n.column])continue;let t=n.direction&&"desc"==n.direction.toLowerCase();return e[n.column]e=>!Array.isArray(t)||1==t.length&&"*"==t[0].column?e:e.map((e=>{const s={};for(let n of t)"*"==n.column?Object.assign(s,e):s[n.alias||n.column||n]=e[n.column||n];return s})),a=t=>e=>t?[...new Set(e)]:e,i=(t,e,s)=>n=>{const a=n.length;return t=Number(t||0),e=Number(e||0),n=n.slice(t,e?t+e:void 0),s?{offset:t,limit:e,total:a,page:{offset:{first:0,prev:t-e>0?t-e:0,next:t+et[0]))},"pouchdb.paged":function(o){const r=this.parse(o),d=dmx.pouchdb.get(r.connection),c=r.sql,h=c.table.name||c.table;return d.allDocs({startkey:h+"/",endkey:h+"/￿",include_docs:!0}).then(t).then(e(c.wheres)).then(s(c.orders)).then(n(c.columns)).then(a(c.distinct)).then(i(c.offset,c.limit,!0))},"pouchdb.insert":function(t){const e=this.parse(t),s=dmx.pouchdb.get(e.connection),n=e.sql,a={};for(let t of n.values)a[t.column]=t.value;return a._id=n.table+"/"+Date.now(),s.put(a).then((t=>({affected:t.ok?1:0,identity:t.id})))},"pouchdb.update":function(s){const n=this.parse(s),a=dmx.pouchdb.get(n.connection),i=n.sql;return a.allDocs({startkey:i.table+"/",endkey:i.table+"/￿",include_docs:!0}).then(t).then(e(i.wheres)).then((t=>a.bulkDocs(t.map((t=>{for(let e of i.values)t[e.column]=e.value;return t}))))).then((t=>({affected:t.filter((t=>t.ok)).length})))},"pouchdb.delete":function(s){const n=this.parse(s),a=dmx.pouchdb.get(n.connection),i=n.sql;return a.allDocs({startkey:i.table+"/",endkey:i.table+"/￿",include_docs:!0}).then(t).then(e(i.wheres)).then((t=>a.bulkDocs(t.map((t=>({_deleted:!0,_id:t._id,_rev:t._rev})))))).then((t=>({affected:t.filter((t=>t.ok)).length})))},"pouchdb.get":function(t){const{connection:e,docId:s,attachments:n}=this.parse(t);return dmx.pouchdb.get(e).get(s,{attachments:n})},"pouchdb.getAttachment":function(t){const{connection:e,docId:s,name:n}=this.parse(t);return dmx.pouchdb.get(e).getAttachment(s,n).then((t=>dmx.fileUtils.blobToDataURL(t)))},"pouchdb.putAttachment":function(t){const{connection:e,docId:s,name:n,dataURL:a}=this.parse(t),{data:i,type:o}=dmx.fileUtils.parseDataURL(a),r=dmx.pouchdb.get(e),d=r.get(s);return r.putAttachment(d._id,n,d._rev,i,o)},"pouchdb.removeAttachment":function(t){const{connection:e,docId:s,name:n}=this.parse(t),a=dmx.pouchdb.get(e),i=a.get(s);return a.removeAttachment(i._id,n,i._rev)}})}(),dmx.Component("pouchdb",{attributes:{db:{type:String,default:null}},methods:{replicateFrom(t){return this._db.replicate.from(dmx.pouchdb.get(t))},replicateTo(t){return this._db.replicate.to(dmx.pouchdb.get(t))}},events:{change:Event,error:Event,sync:Event},init(){document.addEventListener("pouchdb:sync",(t=>{t.detail.database===this.props.db&&this.dispatchEvent("sync",null,t.detail.change)})),document.addEventListener("pouchdb:error",(t=>{t.detail.database===this.props.db&&this.dispatchEvent("error",null,t.detail.change)})),this._initDatabase()},performUpdate(t){t.has("db")&&this._initDatabase()},destroy(){this._changes&&(this._changes.cancel(),this._changes=null)},_initDatabase(){this._changes&&this._changes.cancel(),this.props.db&&(this._db=dmx.pouchdb.get(this.props.db),this._changes=this._db.changes({live:!0,include_docs:!0,since:"now"}).on("change",(t=>{dmx.debug&&console.debug(`${this.name}:changes:change`,t),this.dispatchEvent("change",null,t)})).on("error",(t=>{dmx.debug&&console.debug(`${this.name}:changes:error`,t),this.dispatchEvent("error",null,t)})))}}),dmx.Component("pouchdb-view",{initialData:{data:[],page:1,pages:1,items:0,sort:{on:"",dir:"asc"},has:{first:!1,prev:!1,next:!1,last:!1}},attributes:{db:{type:String,default:""},collection:{type:String,default:""},filter:{type:String,default:""},page:{type:Number,default:1},pagesize:{type:Number,default:0},sorton:{type:String,default:""},sortdir:{type:String,default:"asc",enum:["asc","desc"]}},methods:{select(t){this._updatePage(+t)},first(){this._updatePage(1)},prev(){this._updatePage(this.data.page-1)},next(){this._updatePage(this.data.page+1)},last(){this._updatePage(this.data.pages)},sort(t,e){this.props.sorton=t,this.props.sortdir=e&&"desc"==e.toLowerCase()?"desc":"asc"}},events:{change:Event,updated:Event,error:Event},init(){this._docs=[],this._items=[],this._initDatabase(),this.props.filter&&this._updateFilter()},performUpdate(t){t.has("db")?this._initDatabase():t.has("collection")?this._updateDocs():t.has("filter")?this._updateFilter():t.has("sorton")||t.has("sortdir")?this._updateData():(t.has("page")||t.has("pagesize"))&&this._updatePage(this.props.page)},destroy(){this._changes&&(this._changes.cancel(),this._changes=null),this._filterEffect&&(this._filterEffect(),this._filterEffect=null)},_initDatabase(){this._db=null,this._changes&&this._changes.cancel(),this.props.db&&(this._db=dmx.pouchdb.get(this.props.db),this._changes=this._db.changes({live:!0,include_docs:!0,since:"now",filter:t=>t._id.startsWith(this.props.collection+"/")}).on("change",(t=>{dmx.debug&&console.debug(`${this.name}:changes:change`,t),this._updateDocs(),this.dispatchEvent("change",null,t)})).on("error",(t=>{dmx.debug&&console.debug(`${this.name}:changes:error`,t),this.dispatchEvent("error",null,t)})),this.props.page>1&&this.set("page",this.props.page),this._updateDocs())},_updateDocs(){if(!this._db)return;const{collection:t}=this.props;t?this._db.allDocs({startkey:t+"/",endkey:t+"/￿",include_docs:!0}).then((t=>t.rows.map((t=>t.doc)))).then((t=>{dmx.debug&&console.debug(`${this.name}:query:result`,t),this._docs=t,this._updateData(),dmx.nextTick((()=>this.dispatchEvent("updated")))})).catch((t=>{dmx.debug&&console.debug(`${this.name}:query:error`,t),this.dispatchEvent("error",null,t)})):(this._docs=[],this._updateData(),dmx.nextTick((()=>this.dispatchEvent("updated"))))},_updateFilter(){this._filterEffect&&(this._filterEffect(),this._filterEffect=null),this.props.filter&&(this._filterEffect=dmx.effect((()=>{dmx.parse(this.props.filter,this),this._updateData()})))},_updateData(){this._items=this._docs,this.props.filter&&(this._items=this._docs.filter((t=>dmx.parse(this.props.filter,dmx.DataScope(t,this)))));let{sorton:t,sortdir:e,pagesize:s}=this.props,n=this._items.length,a=s?Math.max(1,Math.ceil(n/s)):1;if(t){const s="desc"===e;this._items.sort(((e,n)=>s?e[t]>n[t]?-1:e[t]n[t]?1:0))}this.set({pages:a,items:n}),this._updatePage(this.data.page||this.props.page)},_updatePage(t){const e=this.props.pagesize,s=this.data.pages,n=((t=t<1?1:t>s?s:t)-1)*e;this.set({page:t,data:e?this._items.slice(n,n+e):this._items,has:{first:t>1,prev:t>1,next:t{this.set({data:t,stale:!1})})),this._changes=this._db.changes({live:!0,include_docs:!0,attachments:this.props.attachments,since:"now",doc_ids:[this.props.docid]}).on("change",(t=>{dmx.debug&&console.debug(`${this.name}:changes:change`,t),this.props.autoupdate?this.set({data:t.doc,stale:!1}):this.set("stale",!0),this.dispatchEvent("change",null,t)})).on("error",(t=>{dmx.debug&&console.debug(`${this.name}:changes:error`,t),this.set({data:{},stale:!0}),this.dispatchEvent("error",null,t)}))):this.set({data:{},stale:!1}))},_cancelChanges(){this._changes&&(dmx.debug&&console.log("cancel changes",this._changes),this._changes.cancel(),this._changes=null)}}); +//# sourceMappingURL=dmxPouchDB.js.map diff --git a/public/dmxAppConnect/dmxPouchDB/dmxPouchDB.js.map b/public/dmxAppConnect/dmxPouchDB/dmxPouchDB.js.map new file mode 100644 index 0000000..a5f033c --- /dev/null +++ b/public/dmxAppConnect/dmxPouchDB/dmxPouchDB.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["core/pouchdb.js","actions/pouchdb.js","components/pouchdb.js","components/pouchdbView.js","components/pouchdbDetail.js"],"names":["dmx","databases","pouchdb","Map","setup","name","options","this","has","db","PouchDB","adapter","setMaxListeners","set","info","then","console","log","get","Startup","Promise","resolve","reject","document","addEventListener","Object","keys","length","debug","all","filter","database","type","map","version","upgrade","remote","replicate","from","sync","live","retry","on","change","dispatchEvent","CustomEvent","detail","err","catch","warn","doc","dbVersion","toVersion","bulkDocs","updates","concat","_id","result","res","status","id","find","update","put","error","normalize","rows","row","wheres","validate","rule","operator","a","data","column","b","value","includes","String","startsWith","endsWith","condition","rules","_rule","valid","orders","sort","order","desc","direction","toLowerCase","columns","Array","isArray","assign","alias","distinct","Set","paged","offset","limit","includePageInfo","total","Number","slice","undefined","page","first","prev","next","last","Math","ceil","current","floor","Actions","parsed","parse","connection","sql","table","allDocs","startkey","endkey","include_docs","values","Date","now","affected","ok","identity","docs","results","_deleted","_rev","docId","attachments","getAttachment","blob","fileUtils","blobToDataURL","dataURL","parseDataURL","putAttachment","removeAttachment","Component","attributes","default","methods","replicateFrom","_db","replicateTo","to","events","Event","init","event","props","_initDatabase","performUpdate","updatedProps","destroy","_changes","cancel","changes","since","initialData","pages","items","dir","collection","pagesize","sorton","sortdir","enum","select","_updatePage","prop","updated","_docs","_items","_updateFilter","_updateDocs","_updateData","_filterEffect","nextTick","effect","DataScope","max","rev","size","stale","docid","Boolean","autoupdate","refresh","_getDoc","_cancelChanges","doc_ids"],"mappings":"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","file":"dmxPouchDB.js","sourcesContent":["dmx.databases = dmx.databases || {};\r\n\r\ndmx.pouchdb = {\r\n \r\n databases: new Map(),\r\n\r\n setup (name, options = {}) {\r\n if (!this.databases.has(name)) {\r\n const db = new PouchDB(name, {\r\n ...options,\r\n adapter: 'indexeddb',\r\n });\r\n db.setMaxListeners(0);\r\n this.databases.set(name, db);\r\n db.info().then((info) => {\r\n console.log(`PouchDB: ${name}`, info);\r\n });\r\n return db;\r\n }\r\n\r\n return this.databases.get(name);\r\n },\r\n\r\n get (name) {\r\n return this.setup(name);\r\n },\r\n\r\n};\r\n\r\ndmx.Startup(new Promise((resolve, reject) => {\r\n // wait for DomContentLoaded, will trigger after all scripts are loaded (including defered scripts)\r\n document.addEventListener('DOMContentLoaded', resolve);\r\n}).then(() => {\r\n if (dmx.databases && Object.keys(dmx.databases).length) {\r\n if (dmx.debug) {\r\n console.log('dmx.databases:', dmx.databases);\r\n }\r\n\r\n return Promise.all(Object.keys(dmx.databases).filter(database => {\r\n return dmx.databases[database].type === 'pouchdb';\r\n }).map(database => {\r\n const { version, upgrade, remote, options } = dmx.databases[database];\r\n const db = dmx.pouchdb.setup(database, { options });\r\n\r\n if (remote) {\r\n if (dmx.debug) {\r\n console.log(`${database} replicate from ${remote}`);\r\n }\r\n\r\n return db.replicate.from(remote).then(() => {\r\n if (dmx.debug) {\r\n console.log(`${database} replication done, init sync`);\r\n }\r\n\r\n db.sync(remote, {\r\n live: true,\r\n retry: true,\r\n }).on('change', (change) => {\r\n document.dispatchEvent(new CustomEvent('pouchdb:sync', { detail: {database, change }}));\r\n if (dmx.debug) {\r\n console.log(`${database} sync change`, change);\r\n }\r\n }).on('error', (err) => {\r\n document.dispatchEvent(new CustomEvent('pouchdb:error', { detail: {database, err }}));\r\n if (dmx.debug) {\r\n console.log(`${database} sync error`, err);\r\n }\r\n });\r\n }).catch((err) => {\r\n console.warn(`Replication error for ${database}:`, err);\r\n });\r\n } else {\r\n if (dmx.debug) {\r\n console.log(`upgrade ${database} to version ${version}`);\r\n }\r\n\r\n return db.get('_local/version').then(doc => doc.version).catch(err => 0).then(dbVersion => {\r\n if (dmx.debug) {\r\n console.log(`${database} current version ${dbVersion}`);\r\n }\r\n\r\n return Promise.all(upgrade.map(upgrade => {\r\n if (dbVersion >= upgrade.toVersion) {\r\n if (dmx.debug) {\r\n console.log(`Skipping upgrade for ${database}:`, upgrade);\r\n }\r\n return;\r\n }\r\n\r\n if (dmx.debug) {\r\n console.log(`Upgrade ${database} to ${upgrade.toVersion}`);\r\n }\r\n\r\n return db.bulkDocs(upgrade.updates.concat([{\r\n _id: '_local/version',\r\n version: upgrade.toVersion,\r\n }])).then(result => {\r\n if (dmx.debug) {\r\n console.log(`Upgrade result for ${database}:`, result);\r\n }\r\n return Promise.all(result.filter(res => res.status == 409).map(res => {\r\n if (dmx.debug) console.log('Conflict', res);\r\n return db.get(res.id).then(doc => {\r\n if (dmx.debug) {\r\n console.log('Conflict doc', doc);\r\n console.log('Conflict update', upgrade.updates.find(update => update._id == doc._id));\r\n }\r\n return db.put({\r\n ...doc,\r\n ...upgrade.updates.find(update => update._id == doc._id),\r\n version: upgrade.toVersion,\r\n });\r\n });\r\n }));\r\n }).catch(err => {\r\n console.error(`Upgrade error for ${database}:`, err);\r\n });\r\n }));\r\n });\r\n }\r\n }));\r\n }\r\n}));","(function () {\r\n const normalize = (result) => result.rows.map((row) => row.doc);\r\n const wheres = (wheres) => (rows) => {\r\n if (wheres) {\r\n const validate = (row, rule) => {\r\n if (rule.operator) {\r\n const a = row[rule.data.column];\r\n const b = rule.value;\r\n\r\n switch (rule.operator) {\r\n case \"equal\":\r\n return a == b;\r\n case \"not_equal\":\r\n return a != b;\r\n case \"in\":\r\n return b.includes(a);\r\n case \"not_in\":\r\n return !b.includes(a);\r\n case \"less\":\r\n return a < b;\r\n case \"less_or_equal\":\r\n return a <= b;\r\n case \"greater\":\r\n return a > b;\r\n case \"greater_or_equal\":\r\n return a >= b;\r\n case \"between\":\r\n return b[0] <= a <= b[1];\r\n case \"not_between\":\r\n return !(b[0] <= a <= b[1]);\r\n case \"begins_with\":\r\n return String(a).startsWith(String(b));\r\n case \"not_begins_with\":\r\n return !String(a).startsWith(String(b));\r\n case \"contains\":\r\n return String(a).includes(String(b));\r\n case \"not_contains\":\r\n return !String(a).includes(String(b));\r\n case \"ends_with\":\r\n return String(a).endsWith(String(b));\r\n case \"not_ends_with\":\r\n return !String(a).endsWith(String(b));\r\n case \"is_empty\":\r\n return a == null || a == \"\";\r\n case \"is_not_empty\":\r\n return a != null && a != \"\";\r\n case \"is_null\":\r\n return a == null;\r\n case \"is_not_null\":\r\n return a != null;\r\n }\r\n }\r\n\r\n if (rule.condition && rule.rules.length) {\r\n for (let _rule of rule.rules) {\r\n const valid = validate(row, _rule);\r\n if (!valid && rule.condition == \"AND\") return false;\r\n if (valid && rule.condition == \"OR\") return true;\r\n }\r\n\r\n return rule.condition == \"OR\" ? false : true;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n return rows.filter((row) => validate(row, wheres));\r\n }\r\n\r\n return rows;\r\n };\r\n const orders = (orders) => (rows) => {\r\n return rows.sort((a, b) => {\r\n for (let order of orders) {\r\n if (a[order.column] == b[order.column]) continue;\r\n let desc = order.direction && order.direction.toLowerCase() == \"desc\";\r\n if (a[order.column] < b[order.column]) {\r\n return desc ? 1 : -1;\r\n } else {\r\n return desc ? -1 : 1;\r\n }\r\n }\r\n\r\n return 0;\r\n });\r\n };\r\n const columns = (columns) => (rows) => {\r\n if (\r\n Array.isArray(columns) &&\r\n !(columns.length == 1 && columns[0].column == \"*\")\r\n ) {\r\n return rows.map((doc) => {\r\n const row = {};\r\n\r\n for (let column of columns) {\r\n if (column.column == \"*\") {\r\n Object.assign(row, doc);\r\n } else {\r\n row[column.alias || column.column || column] =\r\n doc[column.column || column];\r\n }\r\n }\r\n\r\n return row;\r\n });\r\n }\r\n\r\n return rows;\r\n };\r\n const distinct = (distinct) => (rows) => distinct ? [...new Set(rows)] : rows;\r\n const paged = (offset, limit, includePageInfo) => (rows) => {\r\n const total = rows.length;\r\n offset = Number(offset || 0);\r\n limit = Number(limit || 0);\r\n rows = rows.slice(offset, limit ? offset + limit : undefined);\r\n\r\n if (includePageInfo) {\r\n return {\r\n offset,\r\n limit,\r\n total,\r\n page: {\r\n offset: {\r\n first: 0,\r\n prev: offset - limit > 0 ? offset - limit : 0,\r\n next: offset + limit < total ? offset + limit : offset,\r\n last: (Math.ceil(total / limit) - 1) * limit,\r\n },\r\n current: Math.floor(offset / limit) + 1,\r\n total: Math.ceil(total / limit),\r\n },\r\n data: rows,\r\n };\r\n }\r\n\r\n return rows;\r\n };\r\n\r\n dmx.Actions({\r\n \"pouchdb.select\" (options) {\r\n const parsed = this.parse(options);\r\n const db = dmx.pouchdb.get(parsed.connection);\r\n const sql = parsed.sql;\r\n const table = sql.table.name || sql.table;\r\n\r\n return db\r\n .allDocs({\r\n startkey: table + \"/\",\r\n endkey: table + \"/\\uffff\",\r\n include_docs: true,\r\n })\r\n .then(normalize)\r\n .then(wheres(sql.wheres))\r\n .then(orders(sql.orders))\r\n .then(columns(sql.columns))\r\n .then(distinct(sql.distinct))\r\n .then(paged(sql.offset, sql.limit, false));\r\n },\r\n\r\n \"pouchdb.single\": function (options) {\r\n const parsed = this.parse(options);\r\n const db = dmx.pouchdb.get(parsed.connection);\r\n const sql = parsed.sql;\r\n const table = sql.table.name || sql.table;\r\n\r\n return db\r\n .allDocs({\r\n startkey: table + \"/\",\r\n endkey: table + \"/\\uffff\",\r\n include_docs: true,\r\n })\r\n .then(normalize)\r\n .then(wheres(sql.wheres))\r\n .then(orders(sql.orders))\r\n .then(columns(sql.columns))\r\n .then(distinct(sql.distinct))\r\n .then((rows) => rows[0]);\r\n },\r\n\r\n \"pouchdb.paged\": function (options) {\r\n const parsed = this.parse(options);\r\n const db = dmx.pouchdb.get(parsed.connection);\r\n const sql = parsed.sql;\r\n const table = sql.table.name || sql.table;\r\n\r\n return db\r\n .allDocs({\r\n startkey: table + \"/\",\r\n endkey: table + \"/\\uffff\",\r\n include_docs: true,\r\n })\r\n .then(normalize)\r\n .then(wheres(sql.wheres))\r\n .then(orders(sql.orders))\r\n .then(columns(sql.columns))\r\n .then(distinct(sql.distinct))\r\n .then(paged(sql.offset, sql.limit, true));\r\n },\r\n\r\n \"pouchdb.insert\": function (options) {\r\n const parsed = this.parse(options);\r\n const db = dmx.pouchdb.get(parsed.connection);\r\n const sql = parsed.sql;\r\n const doc = {};\r\n\r\n for (let value of sql.values) {\r\n doc[value.column] = value.value;\r\n }\r\n\r\n doc._id = sql.table + \"/\" + Date.now();\r\n\r\n return db\r\n .put(doc)\r\n .then((result) => ({\r\n affected: result.ok ? 1 : 0,\r\n identity: result.id,\r\n }));\r\n },\r\n\r\n \"pouchdb.update\": function (options) {\r\n const parsed = this.parse(options);\r\n const db = dmx.pouchdb.get(parsed.connection);\r\n const sql = parsed.sql;\r\n\r\n return db\r\n .allDocs({\r\n startkey: sql.table + \"/\",\r\n endkey: sql.table + \"/\\uffff\",\r\n include_docs: true,\r\n })\r\n .then(normalize)\r\n .then(wheres(sql.wheres))\r\n .then((docs) =>\r\n db.bulkDocs(\r\n docs.map((doc) => {\r\n for (let value of sql.values) {\r\n doc[value.column] = value.value;\r\n }\r\n\r\n return doc;\r\n })\r\n )\r\n )\r\n .then((results) => ({\r\n affected: results.filter((result) => result.ok).length,\r\n }));\r\n },\r\n\r\n \"pouchdb.delete\": function (options) {\r\n const parsed = this.parse(options);\r\n const db = dmx.pouchdb.get(parsed.connection);\r\n const sql = parsed.sql;\r\n\r\n return db\r\n .allDocs({\r\n startkey: sql.table + \"/\",\r\n endkey: sql.table + \"/\\uffff\",\r\n include_docs: true,\r\n })\r\n .then(normalize)\r\n .then(wheres(sql.wheres))\r\n .then((docs) =>\r\n db.bulkDocs(\r\n docs.map((doc) => {\r\n return { _deleted: true, _id: doc._id, _rev: doc._rev };\r\n })\r\n )\r\n )\r\n .then((results) => ({\r\n affected: results.filter((result) => result.ok).length,\r\n }));\r\n },\r\n\r\n \"pouchdb.get\": function (options) {\r\n const { connection, docId, attachments } = this.parse(options);\r\n const db = dmx.pouchdb.get(connection);\r\n\r\n return db.get(docId, { attachments });\r\n },\r\n\r\n \"pouchdb.getAttachment\": function (options) {\r\n const { connection, docId, name } = this.parse(options);\r\n const db = dmx.pouchdb.get(connection);\r\n\r\n return db.getAttachment(docId, name).then((blob) => {\r\n return dmx.fileUtils.blobToDataURL(blob);\r\n });\r\n },\r\n\r\n \"pouchdb.putAttachment\": function (options) {\r\n const { connection, docId, name, dataURL } = this.parse(options);\r\n const { data, type } = dmx.fileUtils.parseDataURL(dataURL);\r\n const db = dmx.pouchdb.get(connection);\r\n const doc = db.get(docId);\r\n\r\n return db.putAttachment(doc._id, name, doc._rev, data, type);\r\n },\r\n\r\n \"pouchdb.removeAttachment\": function (options) {\r\n const { connection, docId, name } = this.parse(options);\r\n const db = dmx.pouchdb.get(connection);\r\n const doc = db.get(docId);\r\n\r\n return db.removeAttachment(doc._id, name, doc._rev);\r\n },\r\n\r\n });\r\n})();\r\n","dmx.Component('pouchdb', {\r\n\r\n attributes: {\r\n db: {\r\n type: String,\r\n default: null,\r\n },\r\n },\r\n\r\n methods: {\r\n replicateFrom (remote) {\r\n return this._db.replicate.from(dmx.pouchdb.get(remote));\r\n },\r\n\r\n replicateTo (remote) {\r\n return this._db.replicate.to(dmx.pouchdb.get(remote));\r\n },\r\n },\r\n\r\n events: {\r\n change: Event,\r\n error: Event,\r\n sync: Event,\r\n },\r\n\r\n init () {\r\n document.addEventListener('pouchdb:sync', (event) => {\r\n if (event.detail.database === this.props.db) {\r\n this.dispatchEvent('sync', null, event.detail.change);\r\n }\r\n });\r\n\r\n document.addEventListener('pouchdb:error', (event) => {\r\n if (event.detail.database === this.props.db) {\r\n this.dispatchEvent('error', null, event.detail.change);\r\n }\r\n });\r\n\r\n this._initDatabase();\r\n },\r\n\r\n performUpdate (updatedProps) {\r\n if (updatedProps.has('db')) {\r\n this._initDatabase();\r\n }\r\n },\r\n\r\n destroy () {\r\n if (this._changes) {\r\n this._changes.cancel();\r\n this._changes = null;\r\n }\r\n },\r\n\r\n _initDatabase () {\r\n if (this._changes) this._changes.cancel();\r\n\r\n if (this.props.db) {\r\n this._db = dmx.pouchdb.get(this.props.db);\r\n this._changes = this._db.changes({\r\n live: true,\r\n include_docs: true,\r\n since: 'now',\r\n }).on('change', (change) => {\r\n if (dmx.debug) console.debug(`${this.name}:changes:change`, change);\r\n this.dispatchEvent('change', null, change);\r\n }).on('error', (err) => {\r\n if (dmx.debug) console.debug(`${this.name}:changes:error`, err);\r\n this.dispatchEvent('error', null, err);\r\n });\r\n }\r\n }\r\n \r\n});","dmx.Component('pouchdb-view', {\r\n\r\n initialData: {\r\n data: [],\r\n page: 1,\r\n pages: 1,\r\n items: 0,\r\n sort: { on: '', dir: 'asc' },\r\n has: { first: false, prev: false, next: false, last: false },\r\n },\r\n\r\n attributes: {\r\n db: {\r\n type: String,\r\n default: '',\r\n },\r\n\r\n collection: {\r\n type: String,\r\n default: '',\r\n },\r\n\r\n filter: {\r\n type: String,\r\n default: '',\r\n },\r\n\r\n page: {\r\n type: Number,\r\n default: 1,\r\n },\r\n\r\n pagesize: {\r\n type: Number,\r\n default: 0,\r\n },\r\n\r\n sorton: {\r\n type: String,\r\n default: '',\r\n },\r\n\r\n sortdir: {\r\n type: String,\r\n default: 'asc',\r\n enum: ['asc', 'desc'],\r\n },\r\n },\r\n\r\n methods: {\r\n select (page) {\r\n this._updatePage(+page);\r\n },\r\n\r\n first () {\r\n this._updatePage(1);\r\n },\r\n\r\n prev () {\r\n this._updatePage(this.data.page - 1);\r\n },\r\n\r\n next () {\r\n this._updatePage(this.data.page + 1);\r\n },\r\n\r\n last () {\r\n this._updatePage(this.data.pages);\r\n },\r\n\r\n sort (prop, dir) {\r\n this.props.sorton = prop;\r\n this.props.sortdir = (dir && dir.toLowerCase() == 'desc' ? 'desc' : 'asc');\r\n },\r\n },\r\n\r\n events: {\r\n change: Event,\r\n updated: Event,\r\n error: Event,\r\n },\r\n\r\n init () {\r\n this._docs = [];\r\n this._items = [];\r\n this._initDatabase();\r\n\r\n if (this.props.filter) {\r\n this._updateFilter();\r\n }\r\n },\r\n\r\n performUpdate (updatedProps) {\r\n if (updatedProps.has('db')) {\r\n this._initDatabase();\r\n } else if (updatedProps.has('collection')) {\r\n this._updateDocs();\r\n } else if (updatedProps.has('filter')) {\r\n this._updateFilter();\r\n } else if (updatedProps.has('sorton') || updatedProps.has('sortdir')) {\r\n this._updateData();\r\n } else if (updatedProps.has('page') || updatedProps.has('pagesize')) {\r\n this._updatePage(this.props.page);\r\n }\r\n },\r\n\r\n destroy () {\r\n if (this._changes) {\r\n this._changes.cancel();\r\n this._changes = null;\r\n }\r\n\r\n if (this._filterEffect) {\r\n this._filterEffect();\r\n this._filterEffect = null;\r\n }\r\n },\r\n\r\n _initDatabase () {\r\n this._db = null;\r\n\r\n if (this._changes) {\r\n this._changes.cancel();\r\n }\r\n\r\n if (this.props.db) {\r\n this._db = dmx.pouchdb.get(this.props.db);\r\n\r\n this._changes = this._db.changes({\r\n live: true,\r\n include_docs: true,\r\n since: 'now',\r\n filter: (doc) => doc._id.startsWith(this.props.collection + '/'),\r\n }).on('change', (change) => {\r\n if (dmx.debug) console.debug(`${this.name}:changes:change`, change);\r\n this._updateDocs();\r\n this.dispatchEvent('change', null, change);\r\n }).on('error', (err) => {\r\n if (dmx.debug) console.debug(`${this.name}:changes:error`, err);\r\n this.dispatchEvent('error', null, err);\r\n });\r\n\r\n if (this.props.page > 1) {\r\n this.set('page', this.props.page);\r\n }\r\n \r\n this._updateDocs();\r\n }\r\n },\r\n\r\n _updateDocs () {\r\n if (!this._db) return;\r\n\r\n const { collection } = this.props;\r\n\r\n if (collection) {\r\n this._db.allDocs({\r\n startkey: collection + \"/\",\r\n endkey: collection + \"/\\uffff\",\r\n include_docs: true,\r\n }).then(result => result.rows.map(row => row.doc)).then(docs => {\r\n if (dmx.debug) console.debug(`${this.name}:query:result`, docs);\r\n this._docs = docs;\r\n this._updateData();\r\n dmx.nextTick(() => this.dispatchEvent(\"updated\"));\r\n }).catch(err => {\r\n if (dmx.debug) console.debug(`${this.name}:query:error`, err);\r\n this.dispatchEvent('error', null, err);\r\n });\r\n } else {\r\n this._docs = [];\r\n this._updateData();\r\n dmx.nextTick(() => this.dispatchEvent(\"updated\"));\r\n }\r\n },\r\n\r\n _updateFilter () {\r\n if (this._filterEffect) {\r\n this._filterEffect();\r\n this._filterEffect = null;\r\n }\r\n\r\n if (this.props.filter) {\r\n this._filterEffect = dmx.effect(() => {\r\n dmx.parse(this.props.filter, this);\r\n this._updateData();\r\n });\r\n }\r\n },\r\n\r\n _updateData () {\r\n this._items = this._docs;\r\n \r\n if (this.props.filter) {\r\n this._items = this._docs.filter(doc => {\r\n return dmx.parse(this.props.filter, dmx.DataScope(doc, this));\r\n });\r\n }\r\n\r\n let { sorton, sortdir, pagesize } = this.props;\r\n let items = this._items.length;\r\n let pages = pagesize ? Math.max(1, Math.ceil(items / pagesize)) : 1;\r\n \r\n if (sorton) {\r\n const rev = sortdir === 'desc';\r\n \r\n this._items.sort((a, b) => {\r\n if (rev) {\r\n return a[sorton] > b[sorton] ? -1 : a[sorton] < b[sorton] ? 1 : 0;\r\n } else {\r\n return a[sorton] < b[sorton] ? -1 : a[sorton] > b[sorton] ? 1 : 0;\r\n }\r\n });\r\n }\r\n\r\n this.set({\r\n pages, items,\r\n });\r\n\r\n this._updatePage(this.data.page || this.props.page);\r\n },\r\n\r\n _updatePage (page) {\r\n const size = this.props.pagesize;\r\n const pages = this.data.pages;\r\n\r\n page = page < 1 ? 1 : page > pages ? pages : page;\r\n\r\n const offset = (page - 1) * size;\r\n\r\n this.set({\r\n page: page,\r\n data: size ? this._items.slice(offset, offset + size) : this._items,\r\n has: {\r\n first: page > 1,\r\n prev: page > 1,\r\n next: page < pages,\r\n last: page < pages,\r\n },\r\n });\r\n }\r\n\r\n});","dmx.Component('pouchdb-detail', {\r\n\r\n initialData: {\r\n data: {},\r\n stale: false,\r\n },\r\n\r\n attributes: {\r\n db: {\r\n type: String,\r\n default: null,\r\n },\r\n\r\n docid: {\r\n type: String,\r\n default: null,\r\n },\r\n\r\n attachments: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n\r\n autoupdate: {\r\n type: Boolean,\r\n default: false,\r\n }\r\n },\r\n\r\n methods: {\r\n select (docid) {\r\n this.props.docid = docid;\r\n },\r\n\r\n refresh () {\r\n this._getDoc(this.props.docid);\r\n },\r\n },\r\n\r\n events: {\r\n change: Event,\r\n error: Event,\r\n },\r\n\r\n init () {\r\n if (this.props.db) {\r\n this._initDatabase();\r\n }\r\n },\r\n\r\n performUpdate (updatedProps) {\r\n if (updatedProps.has('db')) {\r\n this._initDatabase();\r\n } else {\r\n this._getDoc();\r\n }\r\n },\r\n\r\n destroy () {\r\n this._cancelChanges();\r\n },\r\n\r\n _initDatabase () {\r\n this._cancelChanges();\r\n\r\n if (!this.props.db) {\r\n this._db = null;\r\n return;\r\n }\r\n\r\n this._db = dmx.pouchdb.get(this.props.db);\r\n\r\n if (this.props.docid) {\r\n this._getDoc();\r\n }\r\n },\r\n\r\n _getDoc () {\r\n this._cancelChanges();\r\n\r\n if (!this._db) return;\r\n\r\n if (this.props.docid) {\r\n this._db.get(this.props.docid, { attachments: this.props.attachments }).then((doc) => {\r\n this.set({\r\n data: doc,\r\n stale: false,\r\n });\r\n }); \r\n\r\n this._changes = this._db.changes({\r\n live: true,\r\n include_docs: true,\r\n attachments: this.props.attachments,\r\n since: 'now',\r\n doc_ids: [this.props.docid],\r\n }).on('change', (change) => {\r\n if (dmx.debug) console.debug(`${this.name}:changes:change`, change);\r\n if (this.props.autoupdate) {\r\n this.set({\r\n data: change.doc,\r\n stale: false,\r\n });\r\n } else {\r\n this.set('stale', true);\r\n }\r\n this.dispatchEvent('change', null, change);\r\n }).on('error', (err) => {\r\n if (dmx.debug) console.debug(`${this.name}:changes:error`, err);\r\n this.set({\r\n data: {},\r\n stale: true,\r\n });\r\n this.dispatchEvent('error', null, err);\r\n });\r\n } else {\r\n this.set({\r\n data: {},\r\n stale: false,\r\n });\r\n }\r\n },\r\n\r\n _cancelChanges () {\r\n if (this._changes) {\r\n if (dmx.debug) {\r\n console.log('cancel changes', this._changes);\r\n }\r\n \r\n this._changes.cancel();\r\n this._changes = null;\r\n }\r\n },\r\n\r\n});"]} \ No newline at end of file diff --git a/public/js/blah.js b/public/js/blah.js new file mode 100644 index 0000000..12ecc2c --- /dev/null +++ b/public/js/blah.js @@ -0,0 +1,2 @@ +let text = "hello world"; +text.length; diff --git a/views/Scrollable-sections.ejs b/views/Scrollable-sections.ejs index 6c177fc..d72ee20 100644 --- a/views/Scrollable-sections.ejs +++ b/views/Scrollable-sections.ejs @@ -2,7 +2,7 @@
- +
-
+

{{txtSection}}

diff --git a/views/index0.ejs b/views/index0.ejs index 2f390a9..6f77a52 100644 --- a/views/index0.ejs +++ b/views/index0.ejs @@ -1,10 +1,151 @@ - + + + + +
+
+ +
+ + + + + + + diff --git a/views/observationPage.ejs b/views/observationPage.ejs index e67676c..43b3bf8 100644 --- a/views/observationPage.ejs +++ b/views/observationPage.ejs @@ -1,4 +1,39 @@ - + + +
+
+