From be70ed2b46c933ef6d10a834637b7e416836ddd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Wo=C5=BAniak?= Date: Fri, 8 Jul 2022 15:28:30 +0200 Subject: [PATCH] Upload image --- assets/templates/business-items.html | 4 +- client/.swcrc | 11 +- client/dist/app.js | 542 +++++++++++------- client/dist/app.js.map | 2 +- client/src/business-items.js | 6 +- client/src/business-items/business-item.js | 73 ++- client/src/form-navigation.js | 10 +- client/src/local-businesses.js | 6 +- .../local-businesses/local-business-item.js | 14 +- client/src/local-businesses/local-business.js | 8 +- client/src/login-form.js | 4 +- client/src/nav/ow-nav.js | 6 +- client/src/nav/ow-path.js | 8 +- client/src/ow-account.js | 12 +- client/src/price/price-input.js | 20 +- client/src/price/price-view.js | 10 +- client/src/register-form.js | 56 +- .../src/register-form/register-basic-form.js | 6 +- .../register-form/register-business-form.js | 6 +- .../register-form/register-item-form-row.js | 86 ++- .../src/register-form/register-items-form.js | 6 +- .../src/register-form/register-submit-form.js | 14 +- .../src/register-form/register-user-form.js | 6 +- .../src/register-form/register-user-type.js | 11 +- client/src/shared.js | 76 +-- client/src/shared/image-input.js | 35 +- migrations/20220707203500_add_picture_url.sql | 2 +- rustfmt.toml | 7 + src/main.rs | 6 +- src/model/db.rs | 3 +- src/model/view.rs | 22 +- src/routes/mod.rs | 130 ++++- src/routes/restricted.rs | 125 +++- src/routes/unrestricted.rs | 155 +++-- src/utils.rs | 3 +- 35 files changed, 998 insertions(+), 493 deletions(-) create mode 100644 rustfmt.toml diff --git a/assets/templates/business-items.html b/assets/templates/business-items.html index 05505a8..9e76d3e 100644 --- a/assets/templates/business-items.html +++ b/assets/templates/business-items.html @@ -3,9 +3,11 @@ {% for item in items %} {% endfor %} diff --git a/client/.swcrc b/client/.swcrc index 58c9fb9..9782104 100644 --- a/client/.swcrc +++ b/client/.swcrc @@ -9,7 +9,16 @@ }, "jsc": { "parser": { - "syntax": "ecmascript" + "syntax": "ecmascript", + "dynamicImport": true, + "privateMethod": true, + "functionBind": true, + "exportDefaultFrom": true, + "exportNamespaceFrom": true, + "decorators": true, + "decoratorsBeforeExport": true, + "topLevelAwait": true, + "importMeta": true }, "minify": { "compress": true, diff --git a/client/dist/app.js b/client/dist/app.js index ab59f04..165bfce 100644 --- a/client/dist/app.js +++ b/client/dist/app.js @@ -1,4 +1,42 @@ const S = Symbol(); +const BUTTON_STYLE = ` +input[type="button"], input[type="submit"] { + padding: 12px 16px; + cursor: pointer; + border: none; + border-width: 1px; + border-radius: 5px; + font-size: 14px; + font-weight: 400; + box-shadow: 0 10px 20px -6px rgba(0,0,0,.12); + position: relative; + margin-bottom: 20px; + transition: .3s; + + background: #46b5d1; + color: #fff; + + display: inline-block; + font-weight: 400; + text-align: center; + vertical-align: middle; + user-select: none; + padding: .375rem .75rem; + font-size: 1rem; + line-height: 1.5; + transition: color .15s ease-in-out, + background-color .15s ease-in-out, + border-color .15s ease-in-out, + box-shadow .15s ease-in-out, + width: auto; + height: calc(1.5em + 0.75rem + 2px); + padding: .375rem .75rem; + + border: 1px solid #495057; + color: #495057; + background: white; +} +`; const FORM_STYLE = ` form { display: block; @@ -61,42 +99,7 @@ label { display: inline-block; margin-bottom: .5rem; } -input[type="button"], input[type="submit"] { - padding: 12px 16px; - cursor: pointer; - border: none; - border-width: 1px; - border-radius: 5px; - font-size: 14px; - font-weight: 400; - box-shadow: 0 10px 20px -6px rgba(0,0,0,.12); - position: relative; - margin-bottom: 20px; - transition: .3s; - - background: #46b5d1; - color: #fff; - - display: inline-block; - font-weight: 400; - text-align: center; - vertical-align: middle; - user-select: none; - padding: .375rem .75rem; - font-size: 1rem; - line-height: 1.5; - transition: color .15s ease-in-out, - background-color .15s ease-in-out, - border-color .15s ease-in-out, - box-shadow .15s ease-in-out, - width: auto; - height: calc(1.5em + 0.75rem + 2px); - padding: .375rem .75rem; - - border: 1px solid #495057; - color: #495057; - background: white; -} +${BUTTON_STYLE} `; class PseudoForm extends HTMLElement { reportValidity() { @@ -114,6 +117,7 @@ const fireFbReady = ()=>{ }; let a = []; customElements.define("form-navigation", class extends HTMLElement { + #a; static get observedAttributes() { return [ "next", @@ -122,10 +126,10 @@ customElements.define("form-navigation", class extends HTMLElement { } constructor(){ super(); - let c = this[S] = this.attachShadow({ + let b = this.#a = this.attachShadow({ mode: "closed" }); - c.innerHTML = ` + b.innerHTML = `
-
- - -
-
- - - +
+ + +
+ + +
+
+ + + +
- `, this[S].querySelector("form").addEventListener("submit", (a)=>{ + `; + let c = this.#a.querySelector("image-input"); + this.addEventListener("image-input:uploaded", (a)=>{ + a.preventDefault(), a.stopPropagation(), this.picture_url = c.url; + }), this.#a.querySelector("form").addEventListener("submit", (a)=>{ a.preventDefault(), a.stopPropagation(), this.reportValidity(); - }), this[S].querySelector(".remove").addEventListener("click", (a)=>{ + }), this.#a.querySelector(".remove").addEventListener("click", (a)=>{ a.preventDefault(), a.stopPropagation(), this.dispatchEvent(new CustomEvent("item:removed", { bubbles: !0, composed: !1 @@ -827,19 +859,24 @@ customElements.define("register-item-form-row", class extends PseudoForm { }); } attributeChangedCallback(a, b, c) { - b !== c && "idx" === a && this.updateNames(); + if (b !== c) switch(a){ + case "idx": + return this.updateNames(); + case "picture-url": + return this.picture_url = c; + } } get inputs() { return [ - d(this[S].querySelector(".item-name")), - d(this[S].querySelector(".item-price")), + c(this.#a.querySelector(".item-name")), + c(this.#a.querySelector(".item-price")), ]; } updateNames() { - let b = this.getAttribute("idx"); - for (let c of this[S].querySelectorAll(".field")){ - let d = c.id; - c.querySelector("input, price-input").setAttribute("name", `items[${b}][${d}]`); + let a = this.getAttribute("idx"); + for (let b of this.#a.querySelectorAll(".field")){ + let c = b.id; + b.querySelector("input, price-input").setAttribute("name", `items[${a}][${c}]`); } } get idx() { @@ -848,29 +885,36 @@ customElements.define("register-item-form-row", class extends PseudoForm { set idx(a) { this.setAttribute("idx", a); } + get picture_url() { + return this.getAttribute("picture-url"); + } + set picture_url(a) { + this.setAttribute("picture-url", a), this.#a.querySelector("image-input").url = a, this.#a.querySelector("#picture_url").value = a; + } reportValidity() { - return super.reportValidity() && this[S].querySelector("price-input").reportValidity(); + return super.reportValidity() && this.#a.querySelector("price-input").reportValidity(); } }); -let d = ({ name: a , value: b })=>({ +let c = ({ name: a , value: b })=>({ name: a, value: b }); -let d1 = (a)=>{ +let c1 = (a)=>{ let b = 0; for (let c of a.querySelectorAll("register-item-form-row"))c.idx = b++; return b; }; customElements.define("register-items-form", class extends PseudoForm { + #a; static get observedAttributes() { return []; } constructor(){ super(); - let c = this[S] = this.attachShadow({ + let b = this.#a = this.attachShadow({ mode: "closed" }); - c.innerHTML = ` + b.innerHTML = `
@@ -1236,18 +1280,18 @@ customElements.define("register-form", class extends HTMLElement { `; - let e = d.querySelector("#step-4"); + let d = c.querySelector("#step-4"); this[S].addEventListener("account:type:user", (a)=>{ - a.stopPropagation(), e.accountType = "User", this.step = 40; + a.stopPropagation(), d.accountType = "User", this.step = 40; }), this[S].addEventListener("account:type:local-service", (a)=>{ - a.stopPropagation(), e.accountType = "Business", this.step = 1; + a.stopPropagation(), d.accountType = "Business", this.step = 1; }), this[S].addEventListener("form:next", (a)=>{ a.stopPropagation(); - let b = d.querySelector(`#step-${this.step}`); - c(b, e) && (this.step = this.step + 1); + let b = c.querySelector(`#step-${this.step}`); + this.#a(b, d) && (this.step = this.step + 1); }), this[S].addEventListener("form:prev", (a)=>{ a.stopPropagation(), this.step = this.step - 1; - }), e.addEventListener("submit", (a)=>{ + }), d.addEventListener("submit", (a)=>{ a.preventDefault(), a.stopPropagation(); }); } @@ -1264,8 +1308,16 @@ customElements.define("register-form", class extends HTMLElement { set step(a) { a < 0 || this.setAttribute("step", a); } + #a(c, d) { + for (let e of (c.reportValidity(), c.elements))if ("" !== e.name && !e.reportValidity()) return !1; + let f = c.inputs; + if (f) d.setItems(f); + else for (let g of c.elements)"" !== g.name && d.updateField(g.name, g.value); + return !0; + } }); customElements.define("image-input", class extends HTMLElement { + #a; static get observedAttributes() { return [ "width", @@ -1276,16 +1328,29 @@ customElements.define("image-input", class extends HTMLElement { } constructor(){ super(); - let b = this[S] = this.attachShadow({ + let b = this.#a = this.attachShadow({ mode: "closed" }); b.innerHTML = `
@@ -1301,17 +1366,24 @@ customElements.define("image-input", class extends HTMLElement {
`, b.querySelector("#save").addEventListener("click", (a)=>{ a.preventDefault(), a.stopPropagation(); - let b = atob(g.toDataURL("image/webp", 1.0).split(",")[1]), c = []; - for(let d = 0; d < b.length; d++)c.push(b.charCodeAt(d)); - let e = new Blob([ - new Uint8Array(c) + let b = document.createElement("canvas"); + b.width = this.width, b.height = this.height, b.getContext("2d").putImageData(h.getImageData(0, 0, this.width, this.height), 0, 0); + let c = atob(b.toDataURL("image/webp", 1.0).split(",")[1]), d = []; + for(let e = 0; e < c.length; e++)d.push(c.charCodeAt(e)); + let f = new Blob([ + new Uint8Array(d) ], { type: "image/webp" - }), f = new FormData; - f.append(`${crypto.randomUUID()}.webp`, e), fetch("/upload", { + }), g = new FormData; + g.append(`${crypto.randomUUID()}.webp`, f), fetch("/upload", { method: "POST", - body: f - }).then((a)=>a.json()).then(({ path: a })=>this.url = a); + body: g + }).then((a)=>a.json()).then(({ path: a })=>{ + this.url = a, this.dispatchEvent(new CustomEvent("image-input:uploaded", { + bubbles: !0, + composed: !0 + })); + }); }); let c = new FileReader(), d = b.querySelector("#file"), e = b.querySelector("#view"), f = b.querySelector("img"), g = b.querySelector("canvas"), h = g.getContext("2d"); f.addEventListener("load", ()=>{ @@ -1353,40 +1425,63 @@ customElements.define("image-input", class extends HTMLElement { get url() { return this.getAttribute("url"); } - set url(b) { - this.setAttribute("url", b), this[S].querySelector("img").src = b; + set url(a) { + this.setAttribute("url", a), this.#a.querySelector("img").src = a; } }); customElements.define("business-item", class extends HTMLElement { + #a; static get observedAttributes() { return [ + "item-id", "name", "price", - "picture-url" + "picture-url", + "item-order" ]; } constructor(){ super(); - let b = this[S] = this.attachShadow({ + let a = this.#a = this.attachShadow({ mode: "closed" }); - b.innerHTML = ` + a.innerHTML = `
+
- +
+
+
+ + + + + +
`; + let b = a.querySelector("image-input"); + this.addEventListener("image-input:uploaded", (c)=>{ + c.preventDefault(), c.stopPropagation(), this.picture_url = b.url; + let d = a.querySelector("form"); + d.querySelector("#id").value = this.item_id, d.querySelector("#name").value = this.name, d.querySelector("#price").value = this.price, d.querySelector("#picture_url").value = this.picture_url, d.querySelector("#item_order").value = this.item_order, d.submit(); + }); } connectedCallback() { - this.name = this.name, this.price = this.price, this.picture_url = this.picture_url; + this.item_id = this.item_id, this.name = this.name, this.price = this.price, this.picture_url = this.picture_url; } attributeChangedCallback(a, b, c) { if (b !== c) switch(a){ + case "item-id": + return this.item_id = c; case "name": return this.name = c; case "price": @@ -1395,32 +1490,45 @@ customElements.define("business-item", class extends HTMLElement { return this.picture_url = c; } } + get item_id() { + return this.getAttribute("item-id"); + } + set item_id(a) { + this.setAttribute("item-id", a); + } + get item_order() { + return this.getAttribute("item-order"); + } + set item_order(a) { + this.setAttribute("item-order", a); + } get name() { return this.getAttribute("name"); } - set name(b) { - this.setAttribute("name", b), this[S].querySelector("#name").textContent = b; + set name(a) { + this.setAttribute("name", a), this.#a.querySelector("#name").textContent = a; } get price() { - return this.getAttribute("price"); + return this.#a.querySelector("price-input").value; } - set price(b) { - this.setAttribute("price", b), this[S].querySelector("price-input").value = b; + set price(a) { + this.setAttribute("price", a), this.#a.querySelector("price-input").value = a; } get picture_url() { return this.getAttribute("picture-url"); } - set picture_url(b) { - this.setAttribute("picture-url", b), this[S].querySelector("image-input").src = b; + set picture_url(a) { + this.setAttribute("picture-url", a), this.#a.querySelector("image-input").url = a; } }); customElements.define("business-items", class extends HTMLElement { + #a; constructor(){ super(); - let b = this[S] = this.attachShadow({ + let a = this.#a = this.attachShadow({ mode: "closed" }); - b.innerHTML = ` + a.innerHTML = ` diff --git a/client/dist/app.js.map b/client/dist/app.js.map index 3e38bf9..30842ed 100644 --- a/client/dist/app.js.map +++ b/client/dist/app.js.map @@ -1 +1 @@ -{"version":3,"sources":["/home/eraden/code/eraden/oswilno/client/src/shared.js","/home/eraden/code/eraden/oswilno/client/src/form-navigation.js","/home/eraden/code/eraden/oswilno/client/src/local-businesses/local-business-item.js","/home/eraden/code/eraden/oswilno/client/src/local-businesses/local-business.js","/home/eraden/code/eraden/oswilno/client/src/local-businesses.js","/home/eraden/code/eraden/oswilno/client/src/login-form.js","/home/eraden/code/eraden/oswilno/client/src/ow-account.js","/home/eraden/code/eraden/oswilno/client/src/nav/ow-nav.js","/home/eraden/code/eraden/oswilno/client/src/nav/ow-path.js","/home/eraden/code/eraden/oswilno/client/src/price/price-view.js","/home/eraden/code/eraden/oswilno/client/src/price/price-input.js","/home/eraden/code/eraden/oswilno/client/src/register-form/register-basic-form.js","/home/eraden/code/eraden/oswilno/client/src/register-form/register-item-form-row.js","/home/eraden/code/eraden/oswilno/client/src/register-form/register-items-form.js","/home/eraden/code/eraden/oswilno/client/src/register-form/register-business-form.js","/home/eraden/code/eraden/oswilno/client/src/register-form/register-submit-form.js","/home/eraden/code/eraden/oswilno/client/src/register-form/register-user-type.js","/home/eraden/code/eraden/oswilno/client/src/register-form/register-user-form.js","/home/eraden/code/eraden/oswilno/client/src/register-form.js","/home/eraden/code/eraden/oswilno/client/src/shared/image-input.js","/home/eraden/code/eraden/oswilno/client/src/business-items/business-item.js","/home/eraden/code/eraden/oswilno/client/src/business-items.js","/home/eraden/code/eraden/oswilno/client/src/app.js"],"sourcesContent":["export const S = Symbol();\n\nexport const FORM_STYLE = `\nform {\n display: block;\n}\nform legend {\n margin: 16px 0;\n font-weight: bold;\n font-size: 20px;\n}\nform.inline div {\n display: flex;\n}\nform > div {\n display: block;\n margin-bottom: 1rem;\n}\ninput, textarea {\n font-size: 16px;\n\n border: none;\n border-bottom-style: none;\n border-bottom-width: medium;\n border-bottom: 1px solid rgba(0,0,0,.1);\n border-radius: 2px;\n padding: 0;\n \n height: 36px;\n background: #fff;\n color: rgba(0,0,0,.8);\n font-size: 14px;\n \n box-shadow: none !important;\n\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: .375rem .75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-clip: padding-box;\n transition: border-color .15s ease-in-out , -webkit-box-shadow .15s ease-in-out;\n transition: border-color .15s ease-in-out , box-shadow .15s ease-in-out;\n transition: border-color .15s ease-in-out , box-shadow .15s ease-in-out , -webkit-box-shadow .15s ease-in-out;\n}\ninput[type=\"text\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"password\"],\ntextarea {\n width: calc(100% - 1.5rem - 2px);\n}\nlabel {\n color: #000;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 600;\n \n display: inline-block;\n margin-bottom: .5rem;\n}\ninput[type=\"button\"], input[type=\"submit\"] {\n padding: 12px 16px;\n cursor: pointer;\n border: none;\n border-width: 1px;\n border-radius: 5px;\n font-size: 14px;\n font-weight: 400;\n box-shadow: 0 10px 20px -6px rgba(0,0,0,.12);\n position: relative;\n margin-bottom: 20px;\n transition: .3s;\n \n background: #46b5d1;\n color: #fff;\n \n display: inline-block;\n font-weight: 400;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n padding: .375rem .75rem;\n font-size: 1rem;\n line-height: 1.5;\n transition: color .15s ease-in-out,\n background-color .15s ease-in-out,\n border-color .15s ease-in-out,\n box-shadow .15s ease-in-out,\n width: auto;\n height: calc(1.5em + 0.75rem + 2px);\n padding: .375rem .75rem;\n \n border: 1px solid #495057;\n color: #495057;\n background: white;\n}\n`;\n\nexport class PseudoForm extends HTMLElement {\n reportValidity() {\n return this[S].querySelector('form').reportValidity();\n }\n\n checkValidity() {\n return this[S].querySelector('form').checkValidity();\n }\n\n get elements() {\n return this[S].querySelector('form').elements;\n }\n}\n\nexport const fireFbReady = () => {\n fbReady = true;\n for (const fn of fbQueue) fn();\n};\nexport const runFbReady = (fn) => {\n if (!fbReady) fbQueue.push(fn);\n else fn();\n};\nconst fbQueue = [];\nlet fbReady = false;\n","import { S, FORM_STYLE } from \"./shared\";\n\ncustomElements.define('form-navigation', class extends HTMLElement {\n static get observedAttributes() {\n return ['next', 'prev']\n }\n\n constructor() {\n super();\n\n const shadow = this[S] = this.attachShadow({ mode: \"closed\" });\n shadow.innerHTML = `\n \n
\n
\n \n \n
\n
\n `;\n shadow.querySelector('#prev').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.prev();\n });\n shadow.querySelector('#next').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.next();\n });\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'next': {\n this[S].querySelector('#next').className = newV === 'hidden' ? 'hidden' : '';\n break;\n }\n case 'prev': {\n this[S].querySelector('#prev').className = newV === 'hidden' ? 'hidden' : '';\n break;\n }\n }\n }\n\n next() {\n this.dispatchEvent(new CustomEvent('form:next', {\n bubbles: true,\n composed: true,\n detail: this.parentElement\n }));\n }\n\n prev() {\n this.dispatchEvent(new CustomEvent('form:prev', {\n bubbles: true,\n composed: true,\n detail: this.parentElement\n }));\n }\n});\n","import { S } from \"../shared\";\n\ncustomElements.define('local-business-item', class extends HTMLElement {\n static get observedAttributes() {\n return ['name', 'price']\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n

\n \n
\n `;\n }\n\n connectedCallback() {\n this[S].querySelector('#name').textContent = this.getAttribute('name');\n this[S].querySelector('#price').value = this.price();\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'name':\n return this[S].querySelector('#name').textContent = newV;\n case 'price':\n return this[S].querySelector('#price').value = newV;\n }\n }\n\n price(s) {\n const n = parseInt(s || this.getAttribute('price'));\n return isNaN(n) ? 0 : n;\n }\n});\n","import { S } from \"../shared\";\n\ncustomElements.define('local-business', class extends HTMLElement {\n static get observedAttributes() {\n return ['name', 'service-id', 'state']\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n

\n \n
\n \n
\n `;\n }\n\n connectedCallback() {\n this[S].querySelector('#name').textContent = this.getAttribute('name');\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'name':\n return this[S].querySelector('#name').textContent = newV;\n }\n }\n\n get name() {\n return this.getAttribute('name') || ''\n }\n});\n","import { S } from \"./shared\";\n\nimport \"./local-businesses/local-business-item\";\nimport \"./local-businesses/local-business\";\n\ncustomElements.define('local-businesses', class extends HTMLElement {\n static get observedAttributes() {\n return ['filter']\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n \n
\n
\n \n
\n `;\n {\n const filter = shadow.querySelector('#filter');\n let t = null;\n filter.addEventListener('change', ev => {\n ev.stopPropagation();\n this.filter = ev.target.value;\n });\n filter.addEventListener('keyup', ev => {\n ev.stopPropagation();\n const value = ev.target.value;\n\n if (t) clearTimeout(t);\n t = setTimeout(() => {\n this.filter = value;\n t = null;\n }, 1000 / 3);\n });\n }\n }\n\n connectedCallback() {\n this.filter = this.getAttribute('filter');\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'filter':\n return this.filter = newV;\n }\n }\n\n get filter() {\n return this.getAttribute('filter');\n }\n\n set filter(value) {\n if (!value || value === '') {\n this.removeAttribute('filter');\n for (const el of this.querySelectorAll('local-service')) {\n el.removeAttribute('local-services-visible');\n }\n } else {\n this.setAttribute('filter', value);\n for (const el of this.querySelectorAll('local-service')) {\n if (!el.name) continue;\n if (el.name.includes(value)) {\n el.setAttribute('local-services-visible', 'visible');\n } else {\n el.setAttribute('local-services-visible', 'invisible');\n }\n }\n }\n }\n});\n","import { FORM_STYLE, S } from \"./shared\";\n\ncustomElements.define('login-form', class extends HTMLElement {\n static get observedAttributes() {\n return []\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n `;\n }\n\n connectedCallback() {\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n }\n }\n});\n","import { S, FORM_STYLE } from \"./shared\";\n\ncustomElements.define('ow-account', class extends HTMLElement {\n static get observedAttributes() {\n return ['mode', \"id\", \"name\", 'email', \"facebook-id\"]\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n \n \n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n `;\n shadow.querySelector('#switch-login > a').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.mode = 'login';\n });\n shadow.querySelector('#switch-register > a').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.mode = 'register';\n });\n }\n\n connectedCallback() {\n if (this.mode === '') this.mode = 'login';\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'mode': {\n this.mode = newV;\n break;\n }\n case 'id': {\n this.id = newV;\n break;\n }\n case 'name': {\n this.name = newV;\n break;\n }\n case 'email': {\n this.email = newV;\n break;\n }\n case 'facebook-id': {\n this.facebook_id = newV;\n break;\n }\n }\n }\n\n get mode() {\n return this.getAttribute('mode') || '';\n }\n\n set mode(value) {\n value = ['login', 'register', 'display'].includes(value) ? value : 'login';\n this.setAttribute('mode', value);\n }\n\n get name() {\n return this.getAttribute('name') || '';\n }\n\n set name(v) {\n this.setAttribute('name', v);\n this[S].querySelector('#display #name').value = v;\n }\n\n get email() {\n return this.getAttribute('email') || '';\n }\n\n set email(v) {\n this.setAttribute('email', v);\n this[S].querySelector('#display #email').value = v;\n }\n\n get facebook_id() {\n return this.getAttribute('facebook-id');\n }\n\n set facebook_id(v) {\n this.setAttribute('facebook-id', v);\n this[S].querySelector('#display #facebook_id').value = v;\n }\n});\n","import { S } from \"../shared\";\n\ncustomElements.define('ow-nav', class extends HTMLElement {\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n \n
\n `;\n }\n});\n","import { S } from \"../shared\";\n\ncustomElements.define('ow-path', class extends HTMLElement {\n static get observedAttributes() {\n return ['selected', 'path'];\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n \n `;\n }\n\n connectedCallback() {\n this.selected = this.getAttribute('selected');\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'selected':\n return this.selected = newV;\n case 'path':\n return this.path = newV;\n }\n }\n\n get selected() {\n return this.getAttribute('selected') === 'selected';\n }\n\n set selected(value) {\n if (value === 'selected') this.setAttribute('selected', 'selected');\n else this.removeAttribute('selected');\n }\n\n get path() {\n return this.getAttribute('path') || ''\n }\n\n set path(value) {\n if (!value || value === '') {\n this.removeAttribute('path');\n return;\n }\n this.setAttribute('path', value);\n this[S].querySelector('a').setAttribute('href', value);\n }\n});\n","import { S } from \"../shared\";\n\ncustomElements.define('price-view', class extends HTMLElement {\n static get observedAttributes() {\n return ['value', 'currency']\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n \n `;\n }\n\n connectedCallback() {\n this[S].querySelector('#price').textContent = this.formatted;\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'price': {\n this.value = newV;\n break;\n }\n }\n }\n\n get formatted() {\n let v = this.value;\n let major = Math.ceil(v / 100);\n let minor = v % 100;\n let formatted = `${ major },${ minor < 10 ? `0${ minor }` : minor }`;\n return `${ formatted }${ this.currency }`\n }\n\n get value() {\n const n = parseInt(this.getAttribute('value'));\n return isNaN(n) ? 0 : n;\n }\n\n set value(v) {\n this.setAttribute('value', v);\n this[S].querySelector('#price').textContent = this.formatted;\n }\n\n get currency() {\n return this.getAttribute('currency') || 'PLN';\n }\n});\n","import { S, FORM_STYLE } from \"../shared\";\n\ncustomElements.define('price-input', class extends HTMLElement {\n static get observedAttributes() {\n return ['value', 'currency', 'required', 'name']\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n \n \n
\n `;\n\n const price = shadow.querySelector('#price');\n price.addEventListener('change', ev => {\n ev.stopPropagation();\n this.value = price.value;\n });\n }\n\n connectedCallback() {\n this[S].querySelector('#currency').textContent = this.currency;\n this[S].querySelector('#price').value = this.value;\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n const price = this[S].querySelector('#price');\n switch (name) {\n case 'price': {\n this.value = newV;\n break;\n }\n case 'currency': {\n this.currency = newV;\n break;\n }\n case 'required': {\n newV\n ? price.setAttribute('required', 'required')\n : price.removeAttribute('required');\n break;\n }\n case 'readonly': {\n newV\n ? price.setAttribute('readonly', 'readonly')\n : price.removeAttribute('readonly');\n break;\n }\n case 'name': {\n this.setAttribute('name', newV);\n break;\n }\n }\n }\n\n get value() {\n return this[S].querySelector('#price').value * 100;\n }\n\n set value(v) {\n this.setAttribute('value', v);\n this[S].querySelector('#price').value = v;\n }\n\n get currency() {\n return this.getAttribute('currency') || 'PLN';\n }\n\n set currency(value) {\n this.setAttribute('currency', value);\n this[S].querySelector('#currency').textContent = this.currency;\n }\n\n reportValidity() {\n return this[S].querySelector('input').reportValidity();\n }\n\n get name() {\n return this.getAttribute('name');\n }\n\n set name(value) {\n this.setAttribute('name', value);\n }\n});\n","import { FORM_STYLE, S, PseudoForm } from \"../shared\";\n\ncustomElements.define('register-basic-form', class extends PseudoForm {\n constructor() {\n super();\n\n const shadow = this[S] = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n
\n `;\n\n const form = shadow.querySelector('form');\n form.addEventListener('submit', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n shadow.querySelector('form-navigation').next();\n })\n }\n});\n","import { S, FORM_STYLE, PseudoForm } from \"../shared\";\n\ncustomElements.define('register-item-form-row', class extends PseudoForm {\n static get observedAttributes() {\n return ['idx', 'name']\n }\n\n constructor() {\n super();\n this[S] = this.attachShadow({ mode: 'closed' });\n\n this.addEventListener('item:removed', () => {\n this.setAttribute('removed', 'removed');\n const parent = this.parentElement;\n this.remove();\n parent.dispatchEvent(new CustomEvent('item:removed', { bubbles: true, composed: true }));\n });\n }\n\n connectedCallback() {\n const idx = this.getAttribute('idx');\n this[S].innerHTML = `\n \n
\n
\n \n \n
\n
\n \n \n \n
\n
\n
\n `;\n this[S].querySelector('form').addEventListener('submit', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n this.reportValidity();\n });\n this[S].querySelector('.remove').addEventListener('click', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n\n this.dispatchEvent(new CustomEvent('item:removed', { bubbles: true, composed: false }));\n });\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'idx': {\n this.updateNames();\n break;\n }\n }\n }\n\n get inputs() {\n return [\n extract(this[S].querySelector('.item-name')),\n extract(this[S].querySelector('.item-price')),\n ];\n }\n\n updateNames() {\n const idx = this.getAttribute('idx');\n for (const el of this[S].querySelectorAll('.field')) {\n const id = el.id;\n el.querySelector('input, price-input').setAttribute('name', `items[${ idx }][${ id }]`);\n }\n }\n\n get idx() {\n return this.getAttribute('idx');\n }\n\n set idx(idx) {\n this.setAttribute('idx', idx);\n }\n\n reportValidity() {\n return super.reportValidity() && this[S].querySelector('price-input').reportValidity();\n }\n});\n\nconst extract = ({ name, value }) => ({ name, value })\n","import { FORM_STYLE, S, PseudoForm } from \"../shared\";\n\nimport \"./register-item-form-row\"\n\nconst updateItems = (form) => {\n let idx = 0;\n for (const el of form.querySelectorAll('register-item-form-row')) {\n el.idx = idx++;\n }\n return idx;\n}\n\ncustomElements.define('register-items-form', class extends PseudoForm {\n static get observedAttributes() {\n return []\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n
\n \n
\n
\n \n
\n \n
\n `;\n this.addEventListener('item:removed', ev => {\n ev.stopPropagation();\n updateItems(this)\n });\n this.addEventListener('form:next', ev => {\n for (const el of this.querySelectorAll('item-form-row')) {\n if (!el.reportValidity()) {\n ev.stopPropagation();\n ev.preventDefault();\n }\n }\n });\n shadow.querySelector('#add-item').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.appendChild(document.createElement('register-item-form-row'));\n updateItems(this)\n });\n }\n\n get inputs() {\n return [...this.querySelectorAll(\"register-item-form-row\")].map(form => form.inputs)\n }\n});\n","import { FORM_STYLE, S, PseudoForm } from \"../shared\";\n\ncustomElements.define('register-business-form', class extends PseudoForm {\n constructor() {\n super();\n\n const shadow = this[S] = this.attachShadow({mode: \"closed\"});\n\n shadow.innerHTML = `\n \n
\n
\n \n
\n
\n \n \n
\n \n
\n `;\n\n shadow.querySelector('form').addEventListener('submit', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n shadow.querySelector('form-navigation').next();\n });\n }\n})\n","import { FORM_STYLE, S, PseudoForm } from \"../shared\";\n\ncustomElements.define('register-submit-form', class extends PseudoForm {\n constructor() {\n super();\n\n const shadow = this[S] = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n
\n
\n \n \n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n
\n
\n \n
\n \n \n
\n
\n `;\n }\n\n updateField(name, value) {\n this[S].querySelector(`[id=\"hidden-${ name }\"]`).value = value;\n this[S].querySelector(`[id=\"preview-${ name }\"]`).value = value;\n }\n\n setItems(items) {\n const host = this[S].querySelector('#items');\n host.innerHTML = ``;\n for (const row of items) {\n const el = host.appendChild(document.createElement('div'));\n el.className = 'item-view';\n const [name, price] = row;\n\n el.innerHTML = `\n \n \n \n `;\n }\n }\n\n set accountType(v) {\n this[S].querySelector('#account_type').value = v;\n }\n});\n","customElements.define('register-user-type', class extends HTMLElement {\n constructor() {\n super();\n\n const shadow = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n \n `;\n\n const user = shadow.querySelector('#user');\n user.addEventListener('click', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n this.dispatchEvent(new CustomEvent('account:type:user', { bubbles: true, composed: true }));\n });\n const service = shadow.querySelector('#local-service');\n service.addEventListener('click', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n this.dispatchEvent(new CustomEvent('account:type:local-service', { bubbles: true, composed: true }));\n });\n }\n});\n","import { S, FORM_STYLE } from \"../shared\";\n\ncustomElements.define('register-user-form', class extends HTMLElement {\n static get observedAttributes() {\n return ['mode']\n }\n\n constructor() {\n super();\n\n const shadow = this[S] = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n
\n
\n \n \n \n \n
\n \n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n
\n \n \n \n
\n
\n `;\n\n const form = shadow.querySelector('form');\n\n shadow.querySelector('#fb-icon').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.mode = 'facebook';\n FB.login((res) => {\n if (res.status === 'connected') {\n FB.api(\"/me?fields=id,name,email\", ({ id, name, email, ...rest }) => {\n console.log(id, name, email, rest);\n form.querySelector('#email').value = email;\n form.querySelector('#login').value = name;\n form.querySelector('#password').value = crypto.randomUUID();\n form.querySelector('#facebook_id').value = id;\n form.submit();\n });\n }\n }, { scope: 'public_profile,email', return_scopes: true });\n });\n\n shadow.querySelector('#email-icon').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n\n this.mode = 'email';\n });\n }\n\n connectedCallback() {\n this.mode = '';\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'mode': {\n if (newV !== 'email' && newV !== 'facebook' && newV !== '')\n return;\n this.mode = newV;\n break;\n }\n }\n }\n\n get mode() {\n return this.getAttribute('mode') || ''\n }\n\n set mode(v) {\n this.setAttribute('mode', v);\n }\n});\n","import { S, FORM_STYLE } from \"./shared\";\n\nimport \"./register-form/register-basic-form\";\nimport \"./register-form/register-item-form-row.js\";\nimport \"./register-form/register-items-form.js\";\nimport \"./register-form/register-business-form\";\nimport \"./register-form/register-submit-form\";\nimport \"./register-form/register-user-type\";\nimport \"./register-form/register-user-form\";\n\nconst copyForm = (form, finalForm) => {\n form.reportValidity();\n\n for (const el of form.elements) {\n if (el.name === '') continue;\n if (!el.reportValidity()) {\n return false;\n }\n }\n const inputs = form.inputs;\n if (inputs)\n finalForm.setItems(inputs);\n else\n for (const el of form.elements) {\n if (el.name === '') continue;\n finalForm.updateField(el.name, el.value);\n }\n return true;\n};\n\ncustomElements.define('register-form', class extends HTMLElement {\n static get observedAttributes() {\n return ['step']\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n
\n
\n \n \n \n \n \n \n
\n `;\n\n const finalForm = shadow.querySelector('#step-4');\n this[S].addEventListener('account:type:user', ev => {\n ev.stopPropagation();\n finalForm.accountType = 'User';\n this.step = 40;\n });\n this[S].addEventListener('account:type:local-service', ev => {\n ev.stopPropagation();\n finalForm.accountType = 'Business';\n this.step = 1;\n });\n this[S].addEventListener('form:next', ev => {\n ev.stopPropagation();\n const form = shadow.querySelector(`#step-${ this.step }`);\n if (copyForm(form, finalForm)) {\n this.step = this.step + 1;\n }\n });\n this[S].addEventListener('form:prev', ev => {\n ev.stopPropagation();\n this.step = this.step - 1;\n });\n {\n finalForm.addEventListener('submit', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n });\n }\n }\n\n connectedCallback() {\n this.step = 0;\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n }\n }\n\n get step() {\n const step = parseInt(this.getAttribute('step'));\n return isNaN(step) ? 1 : step;\n }\n\n set step(n) {\n if (n < 0) return;\n this.setAttribute('step', n);\n }\n});\n","import { S } from \"../shared.js\";\n\ncustomElements.define('image-input', class extends HTMLElement {\n static get observedAttributes() {\n return ['width', 'height', \"account-id\", \"url\"]\n }\n\n constructor() {\n super();\n\n const shadow = this[S] = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n
\n
\n \n \"\"\n
\n
\n \n
\n
\n \n
\n
\n `;\n\n shadow.querySelector('#save').addEventListener('click', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n const blobBin = atob(canvas.toDataURL(\"image/webp\", 1.0).split(',')[1]);\n const array = [];\n for (let i = 0; i < blobBin.length; i++) {\n array.push(blobBin.charCodeAt(i));\n }\n const file = new Blob([new Uint8Array(array)], { type: 'image/webp' });\n const form = new FormData;\n form.append(`${ crypto.randomUUID() }.webp`, file);\n fetch(\"/upload\", {\n method: \"POST\",\n body: form,\n }).then(res => res.json()).then(({ path }) => this.url = path);\n });\n\n const f = new FileReader();\n const input = shadow.querySelector('#file');\n const view = shadow.querySelector('#view');\n const img = shadow.querySelector('img');\n const canvas = shadow.querySelector('canvas');\n const ctx = canvas.getContext('2d');\n\n img.addEventListener('load', () => {\n let width, height;\n if (img.width > img.height) {\n width = 200;\n height = (img.height * 200) / img.width;\n } else {\n width = (img.width * 200) / img.height;\n height = 200;\n }\n this.setAttribute('width', width);\n this.setAttribute('height', height);\n\n img.width = width;\n img.height = height;\n ctx.clearRect(0, 0, 200, 200);\n ctx.drawImage(img, 0, 0, width, height);\n });\n input.addEventListener('change', ev => {\n ev.stopPropagation();\n\n f.addEventListener('loadend', (readerEvent) => {\n if (readerEvent.total !== readerEvent.loaded)\n return;\n img.src = readerEvent.target.result || '';\n });\n f.readAsDataURL(ev.target.files[0]);\n });\n\n view.addEventListener('click', ev => {\n ev.stopPropagation();\n input.click();\n });\n }\n\n connectedCallback() {\n this.account_id = this.account_id;\n this.url = this.url;\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'account-id':\n return this.account_id = newV;\n case 'url':\n return this.url = newV;\n }\n }\n\n get account_id() {\n return this.getAttribute('account-id');\n }\n\n set account_id(v) {\n this.setAttribute('account-id', v);\n }\n\n get width() {\n const v = parseInt(this.getAttribute('width'));\n return isNaN(v) ? 0 : v;\n }\n\n get height() {\n const v = parseInt(this.getAttribute('height'));\n return isNaN(v) ? 0 : v;\n }\n\n get url() {\n return this.getAttribute('url');\n }\n\n set url(v) {\n this.setAttribute('url', v);\n this[S].querySelector('img').src = v;\n }\n});\n","import { S } from \"../shared.js\";\nimport \"../shared/image-input\";\n\ncustomElements.define('business-item', class extends HTMLElement {\n static get observedAttributes() {\n return ['name', 'price', 'picture-url']\n }\n\n constructor() {\n super();\n\n const shadow = this[S] = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n
\n
\n \n \n
\n `;\n }\n\n connectedCallback() {\n this.name = this.name;\n this.price = this.price;\n this.picture_url = this.picture_url;\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'name': return this.name = newV;\n case 'price': return this.price = newV / 100.0;\n case 'picture-url': return this.picture_url = newV;\n }\n }\n\n get name() {\n return this.getAttribute('name');\n }\n set name(v) {\n this.setAttribute('name', v);\n this[S].querySelector('#name').textContent = v;\n }\n\n\n get price() {\n return this.getAttribute('price');\n }\n set price(v) {\n this.setAttribute('price', v);\n this[S].querySelector('price-input').value = v;\n }\n\n\n get picture_url() {\n return this.getAttribute('picture-url');\n }\n set picture_url(v) {\n this.setAttribute('picture-url', v);\n this[S].querySelector('image-input').src = v;\n }\n});\n","import { S } from \"./shared\"\n\nimport \"./business-items/business-item\";\n\ncustomElements.define('business-items', class extends HTMLElement {\n constructor() {\n super();\n\n const shadow = this[S] = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n \n `;\n }\n});\n","import \"./form-navigation.js\";\nimport \"./local-businesses.js\";\nimport \"./login-form.js\";\nimport \"./ow-account.js\";\nimport \"./nav/ow-nav.js\";\nimport \"./nav/ow-path.js\";\nimport \"./price/price-view\";\nimport \"./price/price-input\";\nimport \"./register-form.js\";\nimport \"./business-items\";\n\nimport { fireFbReady } from \"./shared.js\";\n\nif (!document.querySelector('#facebook-jssdk')) {\n window.fbAsyncInit = () => {\n FB.init({\n appId: '1293538251053124',\n cookie: true,\n xfbml: true,\n version: 'v14.0'\n });\n FB.AppEvents.logPageView();\n fireFbReady();\n };\n\n const js = document.createElement('script');\n js.id = 'facebook-jssdk';\n js.src = \"https://connect.facebook.net/en_US/sdk.js\";\n document.head.appendChild(js);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["/home/eraden/code/eraden/oswilno-light/client/src/shared.js","/home/eraden/code/eraden/oswilno-light/client/src/form-navigation.js","/home/eraden/code/eraden/oswilno-light/client/src/local-businesses/local-business-item.js","/home/eraden/code/eraden/oswilno-light/client/src/local-businesses/local-business.js","/home/eraden/code/eraden/oswilno-light/client/src/local-businesses.js","/home/eraden/code/eraden/oswilno-light/client/src/login-form.js","/home/eraden/code/eraden/oswilno-light/client/src/ow-account.js","/home/eraden/code/eraden/oswilno-light/client/src/nav/ow-nav.js","/home/eraden/code/eraden/oswilno-light/client/src/nav/ow-path.js","/home/eraden/code/eraden/oswilno-light/client/src/price/price-view.js","/home/eraden/code/eraden/oswilno-light/client/src/price/price-input.js","/home/eraden/code/eraden/oswilno-light/client/src/register-form/register-basic-form.js","/home/eraden/code/eraden/oswilno-light/client/src/register-form/register-item-form-row.js","/home/eraden/code/eraden/oswilno-light/client/src/register-form/register-items-form.js","/home/eraden/code/eraden/oswilno-light/client/src/register-form/register-business-form.js","/home/eraden/code/eraden/oswilno-light/client/src/register-form/register-submit-form.js","/home/eraden/code/eraden/oswilno-light/client/src/register-form/register-user-type.js","/home/eraden/code/eraden/oswilno-light/client/src/register-form/register-user-form.js","/home/eraden/code/eraden/oswilno-light/client/src/register-form.js","/home/eraden/code/eraden/oswilno-light/client/src/shared/image-input.js","/home/eraden/code/eraden/oswilno-light/client/src/business-items/business-item.js","/home/eraden/code/eraden/oswilno-light/client/src/business-items.js","/home/eraden/code/eraden/oswilno-light/client/src/app.js"],"sourcesContent":["export const S = Symbol();\n\nexport const BUTTON_STYLE = `\ninput[type=\"button\"], input[type=\"submit\"] {\n padding: 12px 16px;\n cursor: pointer;\n border: none;\n border-width: 1px;\n border-radius: 5px;\n font-size: 14px;\n font-weight: 400;\n box-shadow: 0 10px 20px -6px rgba(0,0,0,.12);\n position: relative;\n margin-bottom: 20px;\n transition: .3s;\n \n background: #46b5d1;\n color: #fff;\n \n display: inline-block;\n font-weight: 400;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n padding: .375rem .75rem;\n font-size: 1rem;\n line-height: 1.5;\n transition: color .15s ease-in-out,\n background-color .15s ease-in-out,\n border-color .15s ease-in-out,\n box-shadow .15s ease-in-out,\n width: auto;\n height: calc(1.5em + 0.75rem + 2px);\n padding: .375rem .75rem;\n \n border: 1px solid #495057;\n color: #495057;\n background: white;\n}\n`;\n\nexport const FORM_STYLE = `\nform {\n display: block;\n}\nform legend {\n margin: 16px 0;\n font-weight: bold;\n font-size: 20px;\n}\nform.inline div {\n display: flex;\n}\nform > div {\n display: block;\n margin-bottom: 1rem;\n}\ninput, textarea {\n font-size: 16px;\n\n border: none;\n border-bottom-style: none;\n border-bottom-width: medium;\n border-bottom: 1px solid rgba(0,0,0,.1);\n border-radius: 2px;\n padding: 0;\n \n height: 36px;\n background: #fff;\n color: rgba(0,0,0,.8);\n font-size: 14px;\n \n box-shadow: none !important;\n\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: .375rem .75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-clip: padding-box;\n transition: border-color .15s ease-in-out , -webkit-box-shadow .15s ease-in-out;\n transition: border-color .15s ease-in-out , box-shadow .15s ease-in-out;\n transition: border-color .15s ease-in-out , box-shadow .15s ease-in-out , -webkit-box-shadow .15s ease-in-out;\n}\ninput[type=\"text\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"password\"],\ntextarea {\n width: calc(100% - 1.5rem - 2px);\n}\nlabel {\n color: #000;\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 600;\n \n display: inline-block;\n margin-bottom: .5rem;\n}\n${BUTTON_STYLE}\n`;\n\nexport class PseudoForm extends HTMLElement {\n reportValidity() {\n return this[S].querySelector('form').reportValidity();\n }\n\n checkValidity() {\n return this[S].querySelector('form').checkValidity();\n }\n\n get elements() {\n return this[S].querySelector('form').elements;\n }\n}\n\nexport const fireFbReady = () => {\n fbReady = true;\n for (const fn of fbQueue) fn();\n};\nexport const runFbReady = (fn) => {\n if (!fbReady) fbQueue.push(fn);\n else fn();\n};\nconst fbQueue = [];\nlet fbReady = false;\n","import { FORM_STYLE } from \"./shared\";\n\ncustomElements.define('form-navigation', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['next', 'prev']\n }\n\n constructor() {\n super();\n\n const shadow = this.#form = this.attachShadow({ mode: \"closed\" });\n shadow.innerHTML = `\n \n
\n
\n \n \n
\n
\n `;\n shadow.querySelector('#prev').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.prev();\n });\n shadow.querySelector('#next').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.next();\n });\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'next': {\n this.#form.querySelector('#next').className = newV === 'hidden' ? 'hidden' : '';\n break;\n }\n case 'prev': {\n this.#form.querySelector('#prev').className = newV === 'hidden' ? 'hidden' : '';\n break;\n }\n }\n }\n\n next() {\n this.dispatchEvent(new CustomEvent('form:next', {\n bubbles: true,\n composed: true,\n detail: this.parentElement\n }));\n }\n\n prev() {\n this.dispatchEvent(new CustomEvent('form:prev', {\n bubbles: true,\n composed: true,\n detail: this.parentElement\n }));\n }\n});\n","customElements.define('local-business-item', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['name', 'price']\n }\n\n constructor() {\n super();\n const shadow = this.#form = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n

\n \n
\n `;\n }\n\n connectedCallback() {\n this.#form.querySelector('#name').textContent = this.getAttribute('name');\n this.#form.querySelector('#price').value = this.price();\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'name':\n return this.#form.querySelector('#name').textContent = newV;\n case 'price':\n return this.#form.querySelector('#price').value = newV;\n }\n }\n\n price(s) {\n const n = parseInt(s || this.getAttribute('price'));\n return isNaN(n) ? 0 : n;\n }\n});\n","import { S } from \"../shared\";\n\ncustomElements.define('local-business', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['name', 'service-id', 'state']\n }\n\n constructor() {\n super();\n const shadow = this.#form = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n

\n \n
\n \n
\n `;\n }\n\n connectedCallback() {\n this.#form.querySelector('#name').textContent = this.getAttribute('name');\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'name':\n return this.#form.querySelector('#name').textContent = newV;\n }\n }\n\n get name() {\n return this.getAttribute('name') || ''\n }\n});\n","import \"./local-businesses/local-business-item\";\nimport \"./local-businesses/local-business\";\n\ncustomElements.define('local-businesses', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['filter']\n }\n\n constructor() {\n super();\n const shadow = this.#form = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n \n
\n
\n \n
\n `;\n {\n const filter = shadow.querySelector('#filter');\n let t = null;\n filter.addEventListener('change', ev => {\n ev.stopPropagation();\n this.filter = ev.target.value;\n });\n filter.addEventListener('keyup', ev => {\n ev.stopPropagation();\n const value = ev.target.value;\n\n if (t) clearTimeout(t);\n t = setTimeout(() => {\n this.filter = value;\n t = null;\n }, 1000 / 3);\n });\n }\n }\n\n connectedCallback() {\n this.filter = this.getAttribute('filter');\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'filter':\n return this.filter = newV;\n }\n }\n\n get filter() {\n return this.getAttribute('filter');\n }\n\n set filter(value) {\n if (!value || value === '') {\n this.removeAttribute('filter');\n for (const el of this.querySelectorAll('local-service')) {\n el.removeAttribute('local-services-visible');\n }\n } else {\n this.setAttribute('filter', value);\n for (const el of this.querySelectorAll('local-service')) {\n if (!el.name) continue;\n if (el.name.includes(value)) {\n el.setAttribute('local-services-visible', 'visible');\n } else {\n el.setAttribute('local-services-visible', 'invisible');\n }\n }\n }\n }\n});\n","import { FORM_STYLE, S } from \"./shared\";\n\ncustomElements.define('login-form', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return []\n }\n\n constructor() {\n super();\n const shadow = this.#form = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n `;\n }\n\n connectedCallback() {\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n }\n }\n});\n","import { FORM_STYLE } from \"./shared\";\n\ncustomElements.define('ow-account', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['mode', \"id\", \"name\", 'email', \"facebook-id\"]\n }\n\n constructor() {\n super();\n const shadow = this.#form = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n \n \n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n `;\n shadow.querySelector('#switch-login > a').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.mode = 'login';\n });\n shadow.querySelector('#switch-register > a').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.mode = 'register';\n });\n }\n\n connectedCallback() {\n if (this.mode === '') this.mode = 'login';\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'mode': {\n this.mode = newV;\n break;\n }\n case 'id': {\n this.id = newV;\n break;\n }\n case 'name': {\n this.name = newV;\n break;\n }\n case 'email': {\n this.email = newV;\n break;\n }\n case 'facebook-id': {\n this.facebook_id = newV;\n break;\n }\n }\n }\n\n get mode() {\n return this.getAttribute('mode') || '';\n }\n\n set mode(value) {\n value = ['login', 'register', 'display'].includes(value) ? value : 'login';\n this.setAttribute('mode', value);\n }\n\n get name() {\n return this.getAttribute('name') || '';\n }\n\n set name(v) {\n this.setAttribute('name', v);\n this.#form.querySelector('#display #name').value = v;\n }\n\n get email() {\n return this.getAttribute('email') || '';\n }\n\n set email(v) {\n this.setAttribute('email', v);\n this.#form.querySelector('#display #email').value = v;\n }\n\n get facebook_id() {\n return this.getAttribute('facebook-id');\n }\n\n set facebook_id(v) {\n this.setAttribute('facebook-id', v);\n this.#form.querySelector('#display #facebook_id').value = v;\n }\n});\n","customElements.define('ow-nav', class extends HTMLElement {\n #form;\n\n constructor() {\n super();\n const shadow = this.#form = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n \n
\n `;\n }\n});\n","customElements.define('ow-path', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['selected', 'path'];\n }\n\n constructor() {\n super();\n const shadow = this.#form = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n \n `;\n }\n\n connectedCallback() {\n this.selected = this.getAttribute('selected');\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'selected':\n return this.selected = newV;\n case 'path':\n return this.path = newV;\n }\n }\n\n get selected() {\n return this.getAttribute('selected') === 'selected';\n }\n\n set selected(value) {\n if (value === 'selected') this.setAttribute('selected', 'selected');\n else this.removeAttribute('selected');\n }\n\n get path() {\n return this.getAttribute('path') || ''\n }\n\n set path(value) {\n if (!value || value === '') {\n this.removeAttribute('path');\n return;\n }\n this.setAttribute('path', value);\n this.#form.querySelector('a').setAttribute('href', value);\n }\n});\n","customElements.define('price-view', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['value', 'currency']\n }\n\n constructor() {\n super();\n const shadow = this.#form = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n \n `;\n }\n\n connectedCallback() {\n this.#form.querySelector('#price').textContent = this.formatted;\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'price': {\n this.value = newV;\n break;\n }\n }\n }\n\n get formatted() {\n let v = this.value;\n let major = Math.ceil(v / 100);\n let minor = v % 100;\n let formatted = `${ major },${ minor < 10 ? `0${ minor }` : minor }`;\n return `${ formatted }${ this.currency }`\n }\n\n get value() {\n const n = parseInt(this.getAttribute('value'));\n return isNaN(n) ? 0 : n;\n }\n\n set value(v) {\n this.setAttribute('value', v);\n this.#form.querySelector('#price').textContent = this.formatted;\n }\n\n get currency() {\n return this.getAttribute('currency') || 'PLN';\n }\n});\n","import { FORM_STYLE } from \"../shared\";\n\ncustomElements.define('price-input', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['value', 'currency', 'required', 'name']\n }\n\n constructor() {\n super();\n const shadow = this.#form = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n \n \n
\n `;\n\n const price = shadow.querySelector('#price');\n price.addEventListener('change', ev => {\n ev.stopPropagation();\n this.value = price.value;\n });\n }\n\n connectedCallback() {\n this.#form.querySelector('#currency').textContent = this.currency;\n this.#form.querySelector('#price').value = this.value;\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n const price = this.#form.querySelector('#price');\n switch (name) {\n case 'price': {\n this.value = newV;\n break;\n }\n case 'currency': {\n this.currency = newV;\n break;\n }\n case 'required': {\n newV\n ? price.setAttribute('required', 'required')\n : price.removeAttribute('required');\n break;\n }\n case 'readonly': {\n newV\n ? price.setAttribute('readonly', 'readonly')\n : price.removeAttribute('readonly');\n break;\n }\n case 'name': {\n this.setAttribute('name', newV);\n break;\n }\n }\n }\n\n get value() {\n return Math.floor(parseFloat(this.#form.querySelector('#price').value) * 100);\n }\n\n set value(v) {\n this.setAttribute('value', v);\n this.#form.querySelector('#price').value = v;\n }\n\n get currency() {\n return this.getAttribute('currency') || 'PLN';\n }\n\n set currency(value) {\n this.setAttribute('currency', value);\n this.#form.querySelector('#currency').textContent = this.currency;\n }\n\n reportValidity() {\n return this.#form.querySelector('input').reportValidity();\n }\n\n get name() {\n return this.getAttribute('name');\n }\n\n set name(value) {\n this.setAttribute('name', value);\n }\n});\n","import { FORM_STYLE, PseudoForm } from \"../shared\";\n\ncustomElements.define('register-basic-form', class extends PseudoForm {\n #form;\n\n constructor() {\n super();\n\n const shadow = this.#form = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n
\n `;\n\n const form = shadow.querySelector('form');\n form.addEventListener('submit', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n shadow.querySelector('form-navigation').next();\n })\n }\n});\n","import { FORM_STYLE, PseudoForm } from \"../shared\";\n\ncustomElements.define('register-item-form-row', class extends PseudoForm {\n #form;\n\n static get observedAttributes() {\n return ['idx', 'name']\n }\n\n constructor() {\n super();\n this.#form = this.attachShadow({ mode: 'closed' });\n\n this.addEventListener('item:removed', () => {\n this.setAttribute('removed', 'removed');\n const parent = this.parentElement;\n this.remove();\n parent.dispatchEvent(new CustomEvent('item:removed', { bubbles: true, composed: true }));\n });\n }\n\n connectedCallback() {\n const idx = this.idx;\n\n this.#form.innerHTML = `\n \n
\n
\n \n \n
\n \n \n
\n
\n \n \n \n
\n
\n
\n
\n `;\n const imageInput = this.#form.querySelector('image-input');\n\n this.addEventListener('image-input:uploaded', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n this.picture_url = imageInput.url;\n });\n this.#form.querySelector('form').addEventListener('submit', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n this.reportValidity();\n });\n this.#form.querySelector('.remove').addEventListener('click', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n this.dispatchEvent(new CustomEvent('item:removed', { bubbles: true, composed: false }));\n });\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'idx':return this.updateNames();\n case 'picture-url': return this.picture_url = newV;\n }\n }\n\n get inputs() {\n return [\n extract(this.#form.querySelector('.item-name')),\n extract(this.#form.querySelector('.item-price')),\n ];\n }\n\n updateNames() {\n const idx = this.getAttribute('idx');\n for (const el of this.#form.querySelectorAll('.field')) {\n const id = el.id;\n el.querySelector('input, price-input').setAttribute('name', `items[${ idx }][${ id }]`);\n }\n }\n\n get idx() {\n return this.getAttribute('idx');\n }\n\n set idx(idx) {\n this.setAttribute('idx', idx);\n }\n\n get picture_url() {\n return this.getAttribute('picture-url');\n }\n\n set picture_url(v) {\n this.setAttribute('picture-url', v);\n this.#form.querySelector('image-input').url = v;\n this.#form.querySelector('#picture_url').value = v;\n }\n\n reportValidity() {\n return super.reportValidity() && this.#form.querySelector('price-input').reportValidity();\n }\n});\n\nconst extract = ({ name, value }) => ({ name, value })\n","import { FORM_STYLE, PseudoForm } from \"../shared\";\n\nimport \"./register-item-form-row\"\n\nconst updateItems = (form) => {\n let idx = 0;\n for (const el of form.querySelectorAll('register-item-form-row')) {\n el.idx = idx++;\n }\n return idx;\n}\n\ncustomElements.define('register-items-form', class extends PseudoForm {\n #form;\n\n static get observedAttributes() {\n return []\n }\n\n constructor() {\n super();\n const shadow = this.#form = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n
\n \n
\n
\n \n
\n \n
\n `;\n this.addEventListener('item:removed', ev => {\n ev.stopPropagation();\n updateItems(this)\n });\n this.addEventListener('form:next', ev => {\n for (const el of this.querySelectorAll('item-form-row')) {\n if (!el.reportValidity()) {\n ev.stopPropagation();\n ev.preventDefault();\n }\n }\n });\n shadow.querySelector('#add-item').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.appendChild(document.createElement('register-item-form-row'));\n updateItems(this)\n });\n }\n\n get inputs() {\n return [...this.querySelectorAll(\"register-item-form-row\")].map(form => form.inputs)\n }\n});\n","import { FORM_STYLE, PseudoForm } from \"../shared\";\n\ncustomElements.define('register-business-form', class extends PseudoForm {\n #form;\n\n constructor() {\n super();\n\n const shadow = this.#form = this.attachShadow({mode: \"closed\"});\n\n shadow.innerHTML = `\n \n
\n
\n \n
\n
\n \n \n
\n \n
\n `;\n\n shadow.querySelector('form').addEventListener('submit', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n shadow.querySelector('form-navigation').next();\n });\n }\n})\n","import { FORM_STYLE, PseudoForm } from \"../shared\";\n\ncustomElements.define('register-submit-form', class extends PseudoForm {\n #form;\n\n constructor() {\n super();\n\n const shadow = this.#form = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n
\n
\n \n \n \n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n
\n
\n \n
\n \n \n
\n
\n `;\n }\n\n updateField(name, value) {\n this.#form.querySelector(`[id=\"hidden-${ name }\"]`).value = value;\n this.#form.querySelector(`[id=\"preview-${ name }\"]`).value = value;\n }\n\n setItems(items) {\n const host = this.#form.querySelector('#items');\n host.innerHTML = ``;\n for (const row of items) {\n const el = host.appendChild(document.createElement('div'));\n el.className = 'item-view';\n const [name, price] = row;\n\n el.innerHTML = `\n \n \n \n `;\n }\n }\n\n set accountType(v) {\n this.#form.querySelector('#account_type').value = v;\n }\n});\n","customElements.define('register-user-type', class extends HTMLElement {\n #form;\n\n constructor() {\n super();\n\n const shadow = this.#form = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n \n `;\n\n const user = shadow.querySelector('#user');\n user.addEventListener('click', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n this.dispatchEvent(new CustomEvent('account:type:user', { bubbles: true, composed: true }));\n });\n const service = shadow.querySelector('#local-service');\n service.addEventListener('click', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n this.dispatchEvent(new CustomEvent('account:type:local-service', { bubbles: true, composed: true }));\n });\n }\n});\n","import { FORM_STYLE } from \"../shared\";\n\ncustomElements.define('register-user-form', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['mode']\n }\n\n constructor() {\n super();\n\n const shadow = this.#form = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n
\n
\n \n \n \n \n
\n \n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n
\n \n \n \n
\n
\n `;\n\n const form = shadow.querySelector('form');\n\n shadow.querySelector('#fb-icon').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.mode = 'facebook';\n FB.login((res) => {\n if (res.status === 'connected') {\n FB.api(\"/me?fields=id,name,email\", ({ id, name, email, ...rest }) => {\n console.log(id, name, email, rest);\n form.querySelector('#email').value = email;\n form.querySelector('#login').value = name;\n form.querySelector('#password').value = crypto.randomUUID();\n form.querySelector('#facebook_id').value = id;\n form.submit();\n });\n }\n }, { scope: 'public_profile,email', return_scopes: true });\n });\n\n shadow.querySelector('#email-icon').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n\n this.mode = 'email';\n });\n }\n\n connectedCallback() {\n this.mode = '';\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'mode': {\n if (newV !== 'email' && newV !== 'facebook' && newV !== '')\n return;\n this.mode = newV;\n break;\n }\n }\n }\n\n get mode() {\n return this.getAttribute('mode') || ''\n }\n\n set mode(v) {\n this.setAttribute('mode', v);\n }\n});\n","import { S, FORM_STYLE } from \"./shared\";\n\nimport \"./register-form/register-basic-form\";\nimport \"./register-form/register-item-form-row.js\";\nimport \"./register-form/register-items-form.js\";\nimport \"./register-form/register-business-form\";\nimport \"./register-form/register-submit-form\";\nimport \"./register-form/register-user-type\";\nimport \"./register-form/register-user-form\";\n\ncustomElements.define('register-form', class extends HTMLElement {\n static get observedAttributes() {\n return ['step']\n }\n\n constructor() {\n super();\n const shadow = this[S] = this.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n \n
\n
\n
\n \n \n \n \n \n \n
\n `;\n\n const finalForm = shadow.querySelector('#step-4');\n this[S].addEventListener('account:type:user', ev => {\n ev.stopPropagation();\n finalForm.accountType = 'User';\n this.step = 40;\n });\n this[S].addEventListener('account:type:local-service', ev => {\n ev.stopPropagation();\n finalForm.accountType = 'Business';\n this.step = 1;\n });\n this[S].addEventListener('form:next', ev => {\n ev.stopPropagation();\n const form = shadow.querySelector(`#step-${ this.step }`);\n if (this.#copyForm(form, finalForm)) {\n this.step = this.step + 1;\n }\n });\n this[S].addEventListener('form:prev', ev => {\n ev.stopPropagation();\n this.step = this.step - 1;\n });\n finalForm.addEventListener('submit', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n });\n }\n\n connectedCallback() {\n this.step = 0;\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n }\n }\n\n get step() {\n const step = parseInt(this.getAttribute('step'));\n return isNaN(step) ? 1 : step;\n }\n\n set step(n) {\n if (n < 0) return;\n this.setAttribute('step', n);\n }\n\n #copyForm(form, finalForm) {\n form.reportValidity();\n\n for (const el of form.elements) {\n if (el.name === '') continue;\n if (!el.reportValidity()) {\n return false;\n }\n }\n const inputs = form.inputs;\n if (inputs)\n finalForm.setItems(inputs);\n else\n for (const el of form.elements) {\n if (el.name === '') continue;\n finalForm.updateField(el.name, el.value);\n }\n return true;\n }\n});\n","import { BUTTON_STYLE, S } from \"../shared.js\";\n\ncustomElements.define('image-input', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['width', 'height', \"account-id\", \"url\"]\n }\n\n constructor() {\n super();\n\n const shadow = this.#form = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n
\n
\n \n \"\"\n
\n
\n \n
\n
\n \n
\n
\n `;\n\n shadow.querySelector('#save').addEventListener('click', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n const c = document.createElement('canvas');\n c.width = this.width;\n c.height = this.height;\n c.getContext('2d').putImageData(ctx.getImageData(0, 0, this.width, this.height), 0, 0);\n\n const blobBin = atob(c.toDataURL(\"image/webp\", 1.0).split(',')[1]);\n const array = [];\n for (let i = 0; i < blobBin.length; i++) {\n array.push(blobBin.charCodeAt(i));\n }\n const file = new Blob([new Uint8Array(array)], { type: 'image/webp' });\n const form = new FormData;\n form.append(`${ crypto.randomUUID() }.webp`, file);\n fetch(\"/upload\", {\n method: \"POST\",\n body: form,\n }).then(res => res.json()).then(({ path }) => {\n this.url = path;\n this.dispatchEvent(new CustomEvent('image-input:uploaded', { bubbles: true, composed: true }));\n });\n });\n\n const f = new FileReader();\n const input = shadow.querySelector('#file');\n const view = shadow.querySelector('#view');\n const img = shadow.querySelector('img');\n const canvas = shadow.querySelector('canvas');\n const ctx = canvas.getContext('2d');\n\n img.addEventListener('load', () => {\n let width, height;\n if (img.width > img.height) {\n width = 200;\n height = (img.height * 200) / img.width;\n } else {\n width = (img.width * 200) / img.height;\n height = 200;\n }\n this.setAttribute('width', width);\n this.setAttribute('height', height);\n\n img.width = width;\n img.height = height;\n ctx.clearRect(0, 0, 200, 200);\n ctx.drawImage(img, 0, 0, width, height);\n });\n input.addEventListener('change', ev => {\n ev.stopPropagation();\n\n f.addEventListener('loadend', (readerEvent) => {\n if (readerEvent.total !== readerEvent.loaded)\n return;\n img.src = readerEvent.target.result || '';\n });\n f.readAsDataURL(ev.target.files[0]);\n });\n\n view.addEventListener('click', ev => {\n ev.stopPropagation();\n input.click();\n });\n }\n\n connectedCallback() {\n this.account_id = this.account_id;\n this.url = this.url;\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'account-id':\n return this.account_id = newV;\n case 'url':\n return this.url = newV;\n }\n }\n\n get account_id() {\n return this.getAttribute('account-id');\n }\n\n set account_id(v) {\n this.setAttribute('account-id', v);\n }\n\n get width() {\n const v = parseInt(this.getAttribute('width'));\n return isNaN(v) ? 0 : v;\n }\n\n get height() {\n const v = parseInt(this.getAttribute('height'));\n return isNaN(v) ? 0 : v;\n }\n\n get url() {\n return this.getAttribute('url');\n }\n\n set url(v) {\n this.setAttribute('url', v);\n this.#form.querySelector('img').src = v;\n }\n});\n","import \"../shared/image-input\";\n\ncustomElements.define('business-item', class extends HTMLElement {\n #form;\n\n static get observedAttributes() {\n return ['item-id', 'name', 'price', 'picture-url', 'item-order']\n }\n\n constructor() {\n super();\n\n const shadow = this.#form = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n
\n \n
\n \n
\n
\n
\n \n \n \n \n \n
\n
\n `;\n\n const imageInput = shadow.querySelector('image-input');\n\n this.addEventListener('image-input:uploaded', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n\n this.picture_url = imageInput.url;\n\n const form = shadow.querySelector('form');\n form.querySelector('#id').value = this.item_id;\n form.querySelector('#name').value = this.name;\n form.querySelector('#price').value = this.price;\n form.querySelector('#picture_url').value = this.picture_url;\n form.querySelector('#item_order').value = this.item_order;\n form.submit();\n });\n }\n\n connectedCallback() {\n this.item_id = this.item_id;\n this.name = this.name;\n this.price = this.price;\n this.picture_url = this.picture_url;\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n case 'item-id': return this.item_id = newV;\n case 'name': return this.name = newV;\n case 'price': return this.price = newV / 100.0;\n case 'picture-url': return this.picture_url = newV;\n }\n }\n\n get item_id() {\n return this.getAttribute('item-id');\n }\n\n set item_id(v) {\n this.setAttribute('item-id', v);\n }\n\n get item_order() {\n return this.getAttribute('item-order');\n }\n\n set item_order(v) {\n this.setAttribute('item-order', v);\n }\n\n get name() {\n return this.getAttribute('name');\n }\n\n set name(v) {\n this.setAttribute('name', v);\n this.#form.querySelector('#name').textContent = v;\n }\n\n get price() {\n return this.#form.querySelector('price-input').value;\n }\n\n set price(v) {\n this.setAttribute('price', v);\n this.#form.querySelector('price-input').value = v;\n }\n\n get picture_url() {\n return this.getAttribute('picture-url');\n }\n\n set picture_url(v) {\n this.setAttribute('picture-url', v);\n this.#form.querySelector('image-input').url = v;\n }\n});\n","import \"./business-items/business-item\";\n\ncustomElements.define('business-items', class extends HTMLElement {\n #form;\n\n constructor() {\n super();\n\n const shadow = this.#form = this.attachShadow({ mode: \"closed\" });\n\n shadow.innerHTML = `\n \n \n `;\n }\n});\n","import \"./form-navigation.js\";\nimport \"./local-businesses.js\";\nimport \"./login-form.js\";\nimport \"./ow-account.js\";\nimport \"./nav/ow-nav.js\";\nimport \"./nav/ow-path.js\";\nimport \"./price/price-view\";\nimport \"./price/price-input\";\nimport \"./register-form.js\";\nimport \"./business-items\";\n\nimport { fireFbReady } from \"./shared.js\";\n\nif (!document.querySelector('#facebook-jssdk')) {\n window.fbAsyncInit = () => {\n FB.init({\n appId: '1293538251053124',\n cookie: true,\n xfbml: true,\n version: 'v14.0'\n });\n FB.AppEvents.logPageView();\n fireFbReady();\n };\n\n const js = document.createElement('script');\n js.id = 'facebook-jssdk';\n js.src = \"https://connect.facebook.net/en_US/sdk.js\";\n document.head.appendChild(js);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/client/src/business-items.js b/client/src/business-items.js index dd1d4b3..6b3786d 100644 --- a/client/src/business-items.js +++ b/client/src/business-items.js @@ -1,12 +1,12 @@ -import { S } from "./shared" - import "./business-items/business-item"; customElements.define('business-items', class extends HTMLElement { + #form; + constructor() { super(); - const shadow = this[S] = this.attachShadow({ mode: "closed" }); + const shadow = this.#form = this.attachShadow({ mode: "closed" }); shadow.innerHTML = `
+
- +
+
+
+ + + + + +
`; + + const imageInput = shadow.querySelector('image-input'); + + this.addEventListener('image-input:uploaded', ev => { + ev.preventDefault(); + ev.stopPropagation(); + + this.picture_url = imageInput.url; + + const form = shadow.querySelector('form'); + form.querySelector('#id').value = this.item_id; + form.querySelector('#name').value = this.name; + form.querySelector('#price').value = this.price; + form.querySelector('#picture_url').value = this.picture_url; + form.querySelector('#item_order').value = this.item_order; + form.submit(); + }); } connectedCallback() { + this.item_id = this.item_id; this.name = this.name; this.price = this.price; this.picture_url = this.picture_url; @@ -33,35 +64,53 @@ customElements.define('business-item', class extends HTMLElement { attributeChangedCallback(name, oldV, newV) { if (oldV === newV) return; switch (name) { + case 'item-id': return this.item_id = newV; case 'name': return this.name = newV; case 'price': return this.price = newV / 100.0; case 'picture-url': return this.picture_url = newV; } } + get item_id() { + return this.getAttribute('item-id'); + } + + set item_id(v) { + this.setAttribute('item-id', v); + } + + get item_order() { + return this.getAttribute('item-order'); + } + + set item_order(v) { + this.setAttribute('item-order', v); + } + get name() { return this.getAttribute('name'); } + set name(v) { this.setAttribute('name', v); - this[S].querySelector('#name').textContent = v; + this.#form.querySelector('#name').textContent = v; } - get price() { - return this.getAttribute('price'); - } - set price(v) { - this.setAttribute('price', v); - this[S].querySelector('price-input').value = v; + return this.#form.querySelector('price-input').value; } + set price(v) { + this.setAttribute('price', v); + this.#form.querySelector('price-input').value = v; + } get picture_url() { return this.getAttribute('picture-url'); } + set picture_url(v) { this.setAttribute('picture-url', v); - this[S].querySelector('image-input').src = v; + this.#form.querySelector('image-input').url = v; } }); diff --git a/client/src/form-navigation.js b/client/src/form-navigation.js index 2a7dd81..4e1844d 100644 --- a/client/src/form-navigation.js +++ b/client/src/form-navigation.js @@ -1,6 +1,8 @@ -import { S, FORM_STYLE } from "./shared"; +import { FORM_STYLE } from "./shared"; customElements.define('form-navigation', class extends HTMLElement { + #form; + static get observedAttributes() { return ['next', 'prev'] } @@ -8,7 +10,7 @@ customElements.define('form-navigation', class extends HTMLElement { constructor() { super(); - const shadow = this[S] = this.attachShadow({ mode: "closed" }); + const shadow = this.#form = this.attachShadow({ mode: "closed" }); shadow.innerHTML = `
@@ -90,7 +70,7 @@ customElements.define('register-form', class extends HTMLElement { this[S].addEventListener('form:next', ev => { ev.stopPropagation(); const form = shadow.querySelector(`#step-${ this.step }`); - if (copyForm(form, finalForm)) { + if (this.#copyForm(form, finalForm)) { this.step = this.step + 1; } }); @@ -98,12 +78,10 @@ customElements.define('register-form', class extends HTMLElement { ev.stopPropagation(); this.step = this.step - 1; }); - { - finalForm.addEventListener('submit', ev => { - ev.preventDefault(); - ev.stopPropagation(); - }); - } + finalForm.addEventListener('submit', ev => { + ev.preventDefault(); + ev.stopPropagation(); + }); } connectedCallback() { @@ -125,4 +103,24 @@ customElements.define('register-form', class extends HTMLElement { if (n < 0) return; this.setAttribute('step', n); } + + #copyForm(form, finalForm) { + form.reportValidity(); + + for (const el of form.elements) { + if (el.name === '') continue; + if (!el.reportValidity()) { + return false; + } + } + const inputs = form.inputs; + if (inputs) + finalForm.setItems(inputs); + else + for (const el of form.elements) { + if (el.name === '') continue; + finalForm.updateField(el.name, el.value); + } + return true; + } }); diff --git a/client/src/register-form/register-basic-form.js b/client/src/register-form/register-basic-form.js index c8a38f1..8fa661e 100644 --- a/client/src/register-form/register-basic-form.js +++ b/client/src/register-form/register-basic-form.js @@ -1,10 +1,12 @@ -import { FORM_STYLE, S, PseudoForm } from "../shared"; +import { FORM_STYLE, PseudoForm } from "../shared"; customElements.define('register-basic-form', class extends PseudoForm { + #form; + constructor() { super(); - const shadow = this[S] = this.attachShadow({ mode: "closed" }); + const shadow = this.#form = this.attachShadow({ mode: "closed" }); shadow.innerHTML = `
-
- - -
-
- - - +
+ + +
+ + +
+
+ + + +
`; - this[S].querySelector('form').addEventListener('submit', ev => { + const imageInput = this.#form.querySelector('image-input'); + + this.addEventListener('image-input:uploaded', ev => { + ev.preventDefault(); + ev.stopPropagation(); + this.picture_url = imageInput.url; + }); + this.#form.querySelector('form').addEventListener('submit', ev => { ev.preventDefault(); ev.stopPropagation(); this.reportValidity(); }); - this[S].querySelector('.remove').addEventListener('click', ev => { + this.#form.querySelector('.remove').addEventListener('click', ev => { ev.preventDefault(); ev.stopPropagation(); - this.dispatchEvent(new CustomEvent('item:removed', { bubbles: true, composed: false })); }); } @@ -63,23 +85,21 @@ customElements.define('register-item-form-row', class extends PseudoForm { attributeChangedCallback(name, oldV, newV) { if (oldV === newV) return; switch (name) { - case 'idx': { - this.updateNames(); - break; - } + case 'idx':return this.updateNames(); + case 'picture-url': return this.picture_url = newV; } } get inputs() { return [ - extract(this[S].querySelector('.item-name')), - extract(this[S].querySelector('.item-price')), + extract(this.#form.querySelector('.item-name')), + extract(this.#form.querySelector('.item-price')), ]; } updateNames() { const idx = this.getAttribute('idx'); - for (const el of this[S].querySelectorAll('.field')) { + for (const el of this.#form.querySelectorAll('.field')) { const id = el.id; el.querySelector('input, price-input').setAttribute('name', `items[${ idx }][${ id }]`); } @@ -93,8 +113,18 @@ customElements.define('register-item-form-row', class extends PseudoForm { this.setAttribute('idx', idx); } + get picture_url() { + return this.getAttribute('picture-url'); + } + + set picture_url(v) { + this.setAttribute('picture-url', v); + this.#form.querySelector('image-input').url = v; + this.#form.querySelector('#picture_url').value = v; + } + reportValidity() { - return super.reportValidity() && this[S].querySelector('price-input').reportValidity(); + return super.reportValidity() && this.#form.querySelector('price-input').reportValidity(); } }); diff --git a/client/src/register-form/register-items-form.js b/client/src/register-form/register-items-form.js index e05a6d7..976bc56 100644 --- a/client/src/register-form/register-items-form.js +++ b/client/src/register-form/register-items-form.js @@ -1,4 +1,4 @@ -import { FORM_STYLE, S, PseudoForm } from "../shared"; +import { FORM_STYLE, PseudoForm } from "../shared"; import "./register-item-form-row" @@ -11,13 +11,15 @@ const updateItems = (form) => { } customElements.define('register-items-form', class extends PseudoForm { + #form; + static get observedAttributes() { return [] } constructor() { super(); - const shadow = this[S] = this.attachShadow({ mode: 'closed' }); + const shadow = this.#form = this.attachShadow({ mode: 'closed' }); shadow.innerHTML = `
@@ -35,7 +50,12 @@ customElements.define('image-input', class extends HTMLElement { shadow.querySelector('#save').addEventListener('click', ev => { ev.preventDefault(); ev.stopPropagation(); - const blobBin = atob(canvas.toDataURL("image/webp", 1.0).split(',')[1]); + const c = document.createElement('canvas'); + c.width = this.width; + c.height = this.height; + c.getContext('2d').putImageData(ctx.getImageData(0, 0, this.width, this.height), 0, 0); + + const blobBin = atob(c.toDataURL("image/webp", 1.0).split(',')[1]); const array = []; for (let i = 0; i < blobBin.length; i++) { array.push(blobBin.charCodeAt(i)); @@ -46,7 +66,10 @@ customElements.define('image-input', class extends HTMLElement { fetch("/upload", { method: "POST", body: form, - }).then(res => res.json()).then(({ path }) => this.url = path); + }).then(res => res.json()).then(({ path }) => { + this.url = path; + this.dispatchEvent(new CustomEvent('image-input:uploaded', { bubbles: true, composed: true })); + }); }); const f = new FileReader(); @@ -129,6 +152,6 @@ customElements.define('image-input', class extends HTMLElement { set url(v) { this.setAttribute('url', v); - this[S].querySelector('img').src = v; + this.#form.querySelector('img').src = v; } }); diff --git a/migrations/20220707203500_add_picture_url.sql b/migrations/20220707203500_add_picture_url.sql index 90cc24b..e6a7b3b 100644 --- a/migrations/20220707203500_add_picture_url.sql +++ b/migrations/20220707203500_add_picture_url.sql @@ -1,2 +1,2 @@ ALTER TABLE local_business_items - ADD COLUMN picture_url TEXT NOT NULL UNIQUE; + ADD COLUMN picture_url TEXT NOT NULL UNIQUE DEFAULT ''; diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..9413ba7 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,7 @@ +imports_granularity = "Module" +group_imports = "StdExternalCrate" +reorder_modules = true +reorder_imports = true +use_field_init_shorthand = true +wrap_comments = true +edition = "2021" diff --git a/src/main.rs b/src/main.rs index d24deeb..51f3412 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,11 @@ #![feature(drain_filter)] #![feature(option_get_or_insert_default)] -use crate::routes::render_index; use actix_identity::{CookieIdentityPolicy, IdentityService}; -use actix_web::{web, web::Data, App, HttpServer}; +use actix_web::web::Data; +use actix_web::{web, App, HttpServer}; + +use crate::routes::render_index; mod auth; mod model; diff --git a/src/model/db.rs b/src/model/db.rs index 26697b9..f743149 100644 --- a/src/model/db.rs +++ b/src/model/db.rs @@ -1,7 +1,8 @@ +use std::collections::HashMap; + use chrono::NaiveDateTime; use serde::{Deserialize, Serialize}; use sqlx::{FromRow, Type}; -use std::collections::HashMap; use uuid::Uuid; #[derive(Debug, PartialOrd, PartialEq, Copy, Clone, Serialize, Deserialize, Type)] diff --git a/src/model/view.rs b/src/model/view.rs index 04962ec..04972af 100644 --- a/src/model/view.rs +++ b/src/model/view.rs @@ -1,6 +1,7 @@ -use crate::model::db; use serde::{Deserialize, Serialize}; +use crate::model::db; + #[derive(Debug)] pub enum Page { LocalBusinesses, @@ -52,16 +53,6 @@ pub struct BusinessItemInput { pub picture_url: String, } -impl BusinessItemInput { - pub fn new, P: Into>(name: S, price: u32, picture_url: P) -> Self { - Self { - name: name.into(), - price, - picture_url: picture_url.into(), - } - } -} - #[derive(Debug, Serialize, Deserialize)] pub struct LocalBusiness { pub id: i32, @@ -86,3 +77,12 @@ impl<'v> From<(db::LocalBusiness, &'v mut Vec)> for Local } } } + +#[derive(Debug, serde::Deserialize)] +pub struct UpdateBusinessItemInput { + pub id: i32, + pub name: String, + pub price: i32, + pub picture_url: String, + pub item_order: i32, +} diff --git a/src/routes/mod.rs b/src/routes/mod.rs index 112cb5d..51c2840 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,11 +1,14 @@ -use actix_web::web::ServiceConfig; -use actix_web::{FromRequest, HttpRequest}; -use serde::Serializer; -use std::fmt::{Debug, Formatter}; +use std::fmt::{Debug, Display, Formatter}; use std::future::Future; use std::ops::Deref; use std::pin::Pin; +use actix_http::body::BoxBody; +use actix_http::StatusCode; +use actix_web::web::ServiceConfig; +use actix_web::{FromRequest, HttpRequest, HttpResponse, Responder, ResponseError}; +use serde::Serializer; + mod restricted; mod unrestricted; @@ -35,7 +38,7 @@ impl Deref for Identity { impl FromRequest for Identity { type Error = actix_web::Error; - type Future = Pin>>>; + type Future = Pin>>>; #[inline] fn from_request(req: &HttpRequest, p: &mut actix_http::Payload) -> Self::Future { @@ -48,3 +51,120 @@ impl FromRequest for Identity { ) } } + +pub type Result = std::result::Result; +pub type JsonResult = std::result::Result; + +pub enum Error { + Unauthorized, + UploadFailed, + OwnedBusinessNotFound { account_id: i32 }, + OwnedBusinessItemNotFound { account_id: i32, business_id: i32 }, +} + +impl Error { + pub fn to_json(self) -> JsonError { + JsonError(self) + } +} + +impl Debug for Error { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_fmt(format_args!("{}", self)) + } +} + +impl Display for Error { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + Error::Unauthorized => f.write_str("Brak uprawnień"), + Error::OwnedBusinessNotFound { account_id } => f.write_fmt(format_args!( + "Nie znaleziono usługi dla użytkownika {}", + account_id + )), + Error::OwnedBusinessItemNotFound { + account_id, + business_id, + } => f.write_fmt(format_args!( + "Nie znaleziono przedmiotu usługi {} dla użytkownika {}", + business_id, account_id + )), + Error::UploadFailed => f.write_str("Nie można zapisać pliku"), + } + } +} + +impl ResponseError for Error { + fn status_code(&self) -> StatusCode { + match self { + Error::Unauthorized => StatusCode::SEE_OTHER, + Error::OwnedBusinessNotFound { .. } => StatusCode::BAD_REQUEST, + Error::OwnedBusinessItemNotFound { .. } => StatusCode::BAD_REQUEST, + Error::UploadFailed => StatusCode::BAD_REQUEST, + } + } +} + +impl Responder for Error { + type Body = BoxBody; + + fn respond_to(self, _req: &HttpRequest) -> HttpResponse { + HttpResponse::build(self.status_code()) + .append_header(if matches!(self, Self::Unauthorized) { + ("Location", "/") + } else { + ("X-Error", "1") + }) + .content_type("text/html") + .body(format!("{}", self)) + } +} + +pub struct JsonError(Error); + +#[derive(serde::Serialize)] +struct JsonErrorRepr { + error: String, +} +impl Display for JsonError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str( + &serde_json::to_string(&JsonErrorRepr { + error: format!("{}", self.0), + }) + .unwrap(), + ) + } +} + +impl Debug for JsonError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_fmt(format_args!("{}", self.0)) + } +} + +impl ResponseError for JsonError { + fn status_code(&self) -> StatusCode { + match self.0 { + Error::Unauthorized => StatusCode::UNAUTHORIZED, + Error::OwnedBusinessNotFound { .. } => StatusCode::BAD_REQUEST, + Error::OwnedBusinessItemNotFound { .. } => StatusCode::BAD_REQUEST, + Error::UploadFailed => StatusCode::BAD_REQUEST, + } + } +} + +impl Responder for JsonError { + type Body = BoxBody; + + fn respond_to(self, _req: &HttpRequest) -> HttpResponse { + HttpResponse::build(self.status_code()) + .append_header(if matches!(self.0, Error::Unauthorized) { + ("Location", "/") + } else { + ("X-Error", "1") + }) + .content_type("application/json") + .body(format!("{}", self)) + } +} diff --git a/src/routes/restricted.rs b/src/routes/restricted.rs index b0071ec..0cbe916 100644 --- a/src/routes/restricted.rs +++ b/src/routes/restricted.rs @@ -1,44 +1,46 @@ -use crate::model::db; -use crate::model::view::Page; -use crate::routes::Identity; -use crate::utils; -use actix_web::web::{Data, ServiceConfig}; -use actix_web::{get, HttpResponse}; +use std::sync::Arc; + +use actix_web::web::{Data, Form, ServiceConfig}; +use actix_web::{get, post, HttpResponse}; use askama::*; use sqlx::PgPool; +use tracing::info; +use tracing::log::error; + +use crate::model::{db, view}; +use crate::routes::{Error, Identity, Result}; #[derive(Debug, Template)] #[template(path = "business-items.html")] struct BusinessItemsTemplate { - page: Page, + page: view::Page, error: Option, account: Option, items: Vec, } -fn render_unauthorized() -> HttpResponse { - HttpResponse::Unauthorized() - .append_header(("Location", "/")) - .body("") -} - macro_rules! authorize { ($id: expr, $pool: expr) => {{ let account = match $id.identity() { - None => return render_unauthorized(), - Some(id) => utils::user_by_id(id, &*$pool).await, + None => return Err(crate::routes::Error::Unauthorized), + Some(id) => crate::utils::user_by_id(id, &*$pool).await, }; match account { Some(account) => account, - _ => return render_unauthorized(), + _ => return Err(crate::routes::Error::Unauthorized), } }}; } #[get("/account/business-items")] -async fn business_items_page(db: Data, id: Identity) -> HttpResponse { - let pool = db.into_inner(); +#[tracing::instrument] +async fn business_items_page(db: Data, id: Identity) -> Result { + handle_business_items_page(db.into_inner(), id).await +} + +async fn handle_business_items_page(pool: Arc, id: Identity) -> Result { let account = authorize!(id, pool); + let items: Vec = sqlx::query_as( r#" SELECT @@ -46,7 +48,8 @@ SELECT local_business_id, name, price, - item_order + item_order, + picture_url FROM local_business_items ORDER BY item_order DESC "#, @@ -61,14 +64,92 @@ ORDER BY item_order DESC }) .unwrap_or_default(); let page = BusinessItemsTemplate { - page: Page::BusinessItems, + page: view::Page::BusinessItems, error: None, account: Some(account), items, }; - HttpResponse::Ok().body(page.render().unwrap()) + Ok(HttpResponse::Ok() + .append_header(("Content-Type", "text/html")) + .body(page.render().unwrap())) +} + +#[post("/business-item/update")] +#[tracing::instrument] +async fn update_business_item( + form: Form, + db: Data, + id: Identity, +) -> Result { + let form = form.into_inner(); + dbg!(&form); + let pool = db.into_inner(); + let account = authorize!(id, pool); + + { + let business: db::LocalBusiness = sqlx::query_as( + r#" +SELECT id, owner_id, name, description, state +FROM local_businesses +WHERE state != 'Banned' AND owner_id = $1 +GROUP BY id, state +ORDER BY id DESC + "#, + ) + .bind(account.id) + .fetch_one(&*pool) + .await + .map_err(|e| { + error!("{e}"); + dbg!(e); + Error::OwnedBusinessNotFound { + account_id: account.id, + } + })?; + + let item: db::LocalBusinessItem = sqlx::query_as( + r#" +UPDATE local_business_items +SET + name = $3, + price = $4, + picture_url = $5, + item_order = $6 +WHERE + local_business_id = $1 AND + id = $2 +RETURNING + id, + local_business_id, + name, + price, + item_order, + picture_url + "#, + ) + .bind(business.id) + .bind(form.id) + .bind(form.name) + .bind(form.price) + .bind(form.picture_url) + .bind(form.item_order) + .fetch_one(&*pool) + .await + .map_err(|e| { + error!("{e}"); + dbg!(&e); + Error::OwnedBusinessItemNotFound { + account_id: account.id, + business_id: business.id, + } + })?; + info!("{:?}", item); + } + handle_business_items_page(pool, id).await } pub fn configure(config: &mut ServiceConfig) { - config.service(business_items_page); + config + .service(business_items_page) + .service(update_business_item); } diff --git a/src/routes/unrestricted.rs b/src/routes/unrestricted.rs index 902ffae..91509eb 100644 --- a/src/routes/unrestricted.rs +++ b/src/routes/unrestricted.rs @@ -1,18 +1,19 @@ -use crate::model::db; -use crate::model::view::{self, Page}; -use crate::routes::Identity; -use crate::utils; +use std::collections::HashMap; +use std::path::PathBuf; + use actix_files::Files; use actix_web::web::{Data, ServiceConfig}; use actix_web::*; use askama::Template; use futures_util::stream::StreamExt as _; -use serde::Deserialize; -use serde::Serialize; -use std::collections::HashMap; -use std::path::PathBuf; +use serde::{Deserialize, Serialize}; use tracing::*; +use crate::model::db; +use crate::model::view::{self, Page}; +use crate::routes::{Error, Identity, JsonResult, Result}; +use crate::utils; + #[derive(Template)] #[template(path = "index.html")] pub struct IndexTemplate { @@ -24,21 +25,23 @@ pub struct IndexTemplate { #[tracing::instrument] pub async fn render_index() -> HttpResponse { - HttpResponse::NotFound().body( - IndexTemplate { - services: vec![], - account: None, - error: None, - page: Page::LocalBusinesses, - } - .render() - .unwrap(), - ) + HttpResponse::NotFound() + .append_header(("Content-Type", "text/html")) + .body( + IndexTemplate { + services: vec![], + account: None, + error: None, + page: Page::LocalBusinesses, + } + .render() + .unwrap(), + ) } #[get("/")] #[tracing::instrument] -pub async fn index(db: Data, id: Identity) -> HttpResponse { +pub async fn index(db: Data, id: Identity) -> Result { let pool = db.into_inner(); let record = match id.identity() { Some(id) => utils::user_by_id(id, &pool).await, @@ -104,7 +107,9 @@ ORDER BY item_order DESC } .render() .unwrap(); - HttpResponse::Ok().body(body) + Ok(HttpResponse::Ok() + .append_header(("Content-Type", "text/html")) + .body(body)) } #[derive(Template)] @@ -117,7 +122,7 @@ struct AccountTemplate { #[get("/account")] #[tracing::instrument] -async fn account_page(id: Identity, db: Data) -> HttpResponse { +async fn account_page(id: Identity, db: Data) -> Result { let pool = db.into_inner(); let record = match id.identity() { Some(id) => utils::user_by_id(id, &pool).await, @@ -126,7 +131,7 @@ async fn account_page(id: Identity, db: Data) -> HttpResponse { None } }; - HttpResponse::Ok().body( + Ok(HttpResponse::Ok().body( AccountTemplate { account: record, error: None, @@ -134,7 +139,7 @@ async fn account_page(id: Identity, db: Data) -> HttpResponse { } .render() .unwrap(), - ) + )) } #[derive(Debug, Deserialize)] @@ -320,7 +325,7 @@ RETURNING id, local_business_id, name, price, item_order, picture_url .bind(&item.name) .bind(item.price as i32) .bind(idx as i32) - .bind(item.picture_url) + .bind(&item.picture_url) .fetch_one(&mut t) .await; match res { @@ -329,15 +334,17 @@ RETURNING id, local_business_id, name, price, item_order, picture_url tracing::error!("{e}"); dbg!(e); t.rollback().await.unwrap(); - return HttpResponse::BadRequest().body( - AccountTemplate { - account: None, - error: Some("Problem z utworzeniem konta".into()), - page: Page::Register, - } - .render() - .unwrap(), - ); + return HttpResponse::BadRequest() + .append_header(("Content-Type", "text/html")) + .body( + AccountTemplate { + account: None, + error: Some("Problem z utworzeniem konta".into()), + page: Page::Register, + } + .render() + .unwrap(), + ); } } } @@ -424,15 +431,17 @@ WHERE email = $1 ); } id.remember(format!("{}", record.id)); - HttpResponse::Ok().body( - AccountTemplate { - account: Some(record), - error: None, - page: Page::Login, - } - .render() - .unwrap(), - ) + HttpResponse::Ok() + .append_header(("Content-Type", "text/html")) + .body( + AccountTemplate { + account: Some(record), + error: None, + page: Page::Login, + } + .render() + .unwrap(), + ) } #[derive(Serialize)] @@ -441,30 +450,54 @@ struct UploadResponse { } #[post("/upload")] -async fn upload( - mut payload: actix_multipart::Multipart, - id: Identity, -) -> Result { +async fn upload(mut payload: actix_multipart::Multipart, id: Identity) -> JsonResult { let path = PathBuf::new().join( id.identity() .map(|id| format!("./uploads/{id}")) .unwrap_or_else(|| "./uploads/tmp".into()), ); - std::fs::create_dir_all(&path)?; + std::fs::create_dir_all(&path).map_err(|e| { + error!("Cannot create upload directory {:?}", path); + dbg!(e); + Error::UploadFailed.to_json() + })?; if let Some(item) = payload.next().await { - let mut field = item?; + let mut field = item.map_err(|e| { + warn!("Malformed upload file",); + dbg!(e); + Error::UploadFailed.to_json() + })?; let name = field.name(); - tracing::info!("Writing file {:?}", name); + info!("Writing file {:?}", name); let path = path.join(name); while let Some(chunk) = field.next().await { - let chunk = chunk?; - std::fs::write(&path, chunk)?; + let chunk = chunk.map_err(|e| { + warn!( + "Failed to read uploaded file bytes for {:?}/{:?}", + path, + field.name() + ); + dbg!(e); + Error::UploadFailed.to_json() + })?; + std::fs::write(&path, chunk).map_err(|e| { + warn!( + "Failed to write uploaded file bytes for {:?}/{:?}", + path, + field.name() + ); + dbg!(e); + Error::UploadFailed.to_json() + })?; } Ok(HttpResponse::Ok().json(UploadResponse { - path: path.to_str().unwrap_or_default().into(), + path: String::from(path.to_str().unwrap_or_default()) + .strip_prefix('.') + .unwrap() + .to_string(), })) } else { Ok(HttpResponse::BadRequest().finish()) @@ -494,9 +527,21 @@ pub fn configure(config: &mut ServiceConfig) { #[cfg(test)] mod tests { - use crate::model::view; use std::collections::HashMap; + use crate::model::view; + use crate::model::view::BusinessItemInput; + + impl BusinessItemInput { + pub fn new, P: Into>(name: S, price: u32, picture_url: P) -> Self { + Self { + name: name.into(), + price, + picture_url: picture_url.into(), + } + } + } + #[test] fn parse_items() { let mut items = Vec::with_capacity(0); @@ -507,8 +552,8 @@ mod tests { names.insert("items[1][price]".into(), "20".into()); super::process_items(&mut items, names); let expected = vec![ - view::BusinessItemInput::new("a", 10), - view::BusinessItemInput::new("b", 20), + view::BusinessItemInput::new("a", 10, "/a"), + view::BusinessItemInput::new("b", 20, "/b"), ]; assert_eq!(items, expected); } diff --git a/src/utils.rs b/src/utils.rs index b08edd7..3902909 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,7 +1,8 @@ -use crate::model::db; use argon2::{Algorithm, Argon2, Params, Version}; use password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString}; +use crate::model::db; + #[tracing::instrument] pub fn encrypt(pass: &str) -> password_hash::Result { tracing::debug!("Hashing password {:?}", pass);