diff --git a/assets/css/app.css b/assets/css/app.css
index e403b27..77042bb 100644
--- a/assets/css/app.css
+++ b/assets/css/app.css
@@ -19,7 +19,7 @@
}
}*/
-@import url('http://fonts.cdnfonts.com/css/noto-sans');
+@import url('https://fonts.cdnfonts.com/css/noto-sans');
* {
--hover-color: #f18902;
diff --git a/assets/images/favicon.ico b/assets/images/favicon.ico
new file mode 100644
index 0000000..e69de29
diff --git a/assets/templates/account.html b/assets/templates/account.html
index 470e9a9..a423956 100644
--- a/assets/templates/account.html
+++ b/assets/templates/account.html
@@ -6,6 +6,7 @@
+
diff --git a/client/dist/app.js b/client/dist/app.js
new file mode 100644
index 0000000..2031dcc
--- /dev/null
+++ b/client/dist/app.js
@@ -0,0 +1,1167 @@
+const S = Symbol();
+const FORM_STYLE = `
+form {
+ display: block;
+}
+form.inline {
+ display: flex;
+ justify-content: space-between;
+}
+form > div {
+ display: block;
+ margin-bottom: 1rem;
+}
+input, textarea {
+ font-size: 16px;
+
+ border: none;
+ border-bottom-style: none;
+ border-bottom-width: medium;
+ border-bottom: 1px solid rgba(0,0,0,.1);
+ border-radius: 2px;
+ padding: 0;
+
+ height: 36px;
+ background: #fff;
+ color: rgba(0,0,0,.8);
+ font-size: 14px;
+
+ box-shadow: none !important;
+
+ display: block;
+ width: 100%;
+ height: calc(1.5em + 0.75rem + 2px);
+ padding: .375rem .75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #495057;
+ background-clip: padding-box;
+ transition: border-color .15s ease-in-out , -webkit-box-shadow .15s ease-in-out;
+ transition: border-color .15s ease-in-out , box-shadow .15s ease-in-out;
+ transition: border-color .15s ease-in-out , box-shadow .15s ease-in-out , -webkit-box-shadow .15s ease-in-out;
+}
+input[type="text"],
+input[type="number"],
+input[type="email"],
+input[type="password"],
+textarea {
+ width: calc(100% - 1.5rem - 2px);
+}
+label {
+ color: #000;
+ text-transform: uppercase;
+ font-size: 12px;
+ font-weight: 600;
+
+ 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;
+}
+`;
+class PseudoForm extends HTMLElement {
+ reportValidity() {
+ return this[S].querySelector("form").reportValidity();
+ }
+ checkValidity() {
+ return this[S].querySelector("form").checkValidity();
+ }
+ get elements() {
+ return this[S].querySelector("form").elements;
+ }
+}
+const fireFbReady = ()=>{
+ for (let c of (b = !0, a))c();
+};
+const runFbReady = (c)=>{
+ b ? c() : a.push(c);
+};
+let a = [], b = !1;
+customElements.define("form-navigation", class extends HTMLElement {
+ static get observedAttributes() {
+ return [
+ "next",
+ "prev"
+ ];
+ }
+ constructor(){
+ super();
+ let c = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ c.innerHTML = `
+
+
+ `, c.querySelector("#prev").addEventListener("click", (a)=>{
+ a.stopPropagation(), a.preventDefault(), this.dispatchEvent(new CustomEvent("form:prev", {
+ bubbles: !0,
+ composed: !0,
+ detail: this.parentElement
+ }));
+ }), c.querySelector("#next").addEventListener("click", (a)=>{
+ a.stopPropagation(), a.preventDefault(), this.dispatchEvent(new CustomEvent("form:next", {
+ bubbles: !0,
+ composed: !0,
+ detail: this.parentElement
+ }));
+ });
+ }
+ attributeChangedCallback(b, c, d) {
+ if (c !== d) switch(b){
+ case "next":
+ this[S].querySelector("#next").className = "hidden" === d ? "hidden" : "";
+ break;
+ case "prev":
+ this[S].querySelector("#prev").className = "hidden" === d ? "hidden" : "";
+ }
+ }
+});
+customElements.define("local-service", class extends HTMLElement {
+ static get observedAttributes() {
+ return [
+ "name",
+ "service-id",
+ "state"
+ ];
+ }
+ constructor(){
+ super();
+ let b = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ b.innerHTML = `
+
+
+
+
+ `;
+ }
+ connectedCallback() {
+ this[S].querySelector("#name").textContent = this.getAttribute("name");
+ }
+ attributeChangedCallback(b, c, d) {
+ if (c !== d && "name" === b) return this[S].querySelector("#name").textContent = d;
+ }
+ get name() {
+ return this.getAttribute("name") || "";
+ }
+});
+customElements.define("local-service-item", class extends HTMLElement {
+ static get observedAttributes() {
+ return [
+ "name",
+ "price"
+ ];
+ }
+ constructor(){
+ super();
+ let b = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ b.innerHTML = `
+
+
+ `;
+ }
+ connectedCallback() {
+ this[S].querySelector("#name").textContent = this.getAttribute("name"), this[S].querySelector("#price").value = this.price();
+ }
+ attributeChangedCallback(b, c, d) {
+ if (c !== d) switch(b){
+ case "name":
+ return this[S].querySelector("#name").textContent = d;
+ case "price":
+ return this[S].querySelector("#price").value = d;
+ }
+ }
+ price(a) {
+ let b = parseInt(a || this.getAttribute("price"));
+ return isNaN(b) ? 0 : b;
+ }
+});
+customElements.define("local-services", class extends HTMLElement {
+ static get observedAttributes() {
+ return [
+ "filter"
+ ];
+ }
+ constructor(){
+ super();
+ let b = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ b.innerHTML = `
+
+
+
+ `;
+ {
+ let c = b.querySelector("#filter"), d = null;
+ c.addEventListener("change", (a)=>{
+ a.stopPropagation(), this.filter = a.target.value;
+ }), c.addEventListener("keyup", (a)=>{
+ a.stopPropagation();
+ let b = a.target.value;
+ d && clearTimeout(d), d = setTimeout(()=>{
+ this.filter = b, d = null;
+ }, 1000 / 3);
+ });
+ }
+ }
+ connectedCallback() {
+ this.filter = this.getAttribute("filter");
+ }
+ attributeChangedCallback(a, b, c) {
+ if (b !== c && "filter" === a) return this.filter = c;
+ }
+ get filter() {
+ return this.getAttribute("filter");
+ }
+ set filter(a) {
+ if (a && "" !== a) for (let b of (this.setAttribute("filter", a), this.querySelectorAll("local-service")))b.name && (b.name.includes(a) ? b.setAttribute("local-services-visible", "visible") : b.setAttribute("local-services-visible", "invisible"));
+ else for (let c of (this.removeAttribute("filter"), this.querySelectorAll("local-service")))c.removeAttribute("local-services-visible");
+ }
+});
+customElements.define("login-form", class extends HTMLElement {
+ static get observedAttributes() {
+ return [];
+ }
+ constructor(){
+ super();
+ let c = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ c.innerHTML = `
+
+
+ `;
+ }
+ connectedCallback() {}
+ attributeChangedCallback(a, b, c) {
+ if (b === c) return;
+ }
+});
+customElements.define("ow-account", class extends HTMLElement {
+ static get observedAttributes() {
+ return [
+ "mode"
+ ];
+ }
+ constructor(){
+ super();
+ let b = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ b.innerHTML = `
+
+
+
+
+
+
+
+ `, b.querySelector("#switch-login > a").addEventListener("click", (a)=>{
+ a.stopPropagation(), a.preventDefault(), this.mode = "login";
+ }), b.querySelector("#switch-register > a").addEventListener("click", (a)=>{
+ a.stopPropagation(), a.preventDefault(), this.mode = "register";
+ });
+ }
+ connectedCallback() {
+ this.mode = "login";
+ }
+ attributeChangedCallback(a, b, c) {
+ if (b === c) return;
+ }
+ get mode() {
+ return this.getAttribute("mode");
+ }
+ set mode(a) {
+ a = "login" === a || "register" === a ? a : "login", this.setAttribute("mode", a);
+ }
+});
+customElements.define("ow-nav", class extends HTMLElement {
+ constructor(){
+ super();
+ let b = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ b.innerHTML = `
+
+
+ `;
+ }
+});
+customElements.define("ow-path", class extends HTMLElement {
+ static get observedAttributes() {
+ return [
+ "selected",
+ "path"
+ ];
+ }
+ constructor(){
+ super();
+ let b = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ b.innerHTML = `
+
+
+ `;
+ }
+ connectedCallback() {
+ this.selected = this.getAttribute("selected");
+ }
+ attributeChangedCallback(a, b, c) {
+ if (b !== c) switch(a){
+ case "selected":
+ return this.selected = c;
+ case "path":
+ return this.path = c;
+ }
+ }
+ get selected() {
+ return "selected" === this.getAttribute("selected");
+ }
+ set selected(a) {
+ "selected" === a ? this.setAttribute("selected", "selected") : this.removeAttribute("selected");
+ }
+ get path() {
+ return this.getAttribute("path") || "";
+ }
+ set path(b) {
+ if (!b || "" === b) {
+ this.removeAttribute("path");
+ return;
+ }
+ this.setAttribute("path", b), this[S].querySelector("a").setAttribute("href", b);
+ }
+});
+customElements.define("price-view", class extends HTMLElement {
+ static get observedAttributes() {
+ return [
+ "value",
+ "currency"
+ ];
+ }
+ constructor(){
+ super();
+ let b = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ b.innerHTML = `
+
+
+ `;
+ }
+ connectedCallback() {
+ this[S].querySelector("#price").textContent = this.formatted;
+ }
+ attributeChangedCallback(a, b, c) {
+ b !== c && "price" === a && (this.value = c);
+ }
+ get formatted() {
+ let a = this.value, b = a % 100;
+ return `${Math.ceil(a / 100)},${b < 10 ? `0${b}` : b}${this.currency}`;
+ }
+ get value() {
+ let a = parseInt(this.getAttribute("value"));
+ return isNaN(a) ? 0 : a;
+ }
+ set value(b) {
+ this.setAttribute("value", b), this[S].querySelector("#price").textContent = this.formatted;
+ }
+ get currency() {
+ return this.getAttribute("currency") || "PLN";
+ }
+});
+customElements.define("price-input", class extends HTMLElement {
+ static get observedAttributes() {
+ return [
+ "value",
+ "currency",
+ "required",
+ "name"
+ ];
+ }
+ constructor(){
+ super();
+ let c = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ c.innerHTML = `
+
+
+
+
+
+ `;
+ }
+ connectedCallback() {
+ this[S].querySelector("#currency").textContent = this.currency;
+ }
+ attributeChangedCallback(b, c, d) {
+ if (c === d) return;
+ let e = this[S].querySelector("#price");
+ switch(b){
+ case "price":
+ this.value = d;
+ break;
+ case "currency":
+ this.currency = d;
+ break;
+ case "required":
+ d ? e.setAttribute("required", "required") : e.removeAttribute("required");
+ break;
+ case "readonly":
+ d ? e.setAttribute("readonly", "readonly") : e.removeAttribute("readonly");
+ }
+ }
+ get value() {
+ return 100 * this[S].querySelector("#price").value;
+ }
+ set value(b) {
+ this.setAttribute("value", b), this[S].querySelector("#price").value = b;
+ }
+ get currency() {
+ return this.getAttribute("currency") || "PLN";
+ }
+ set currency(b) {
+ this.setAttribute("currency", b), this[S].querySelector("#currency").textContent = this.currency;
+ }
+ reportValidity() {
+ return this[S].querySelector("input").reportValidity();
+ }
+ get name() {
+ return this.getAttribute("name");
+ }
+ set name(a) {
+ this.setAttribute("name", a);
+ }
+});
+customElements.define("register-basic-form", class extends PseudoForm {
+ constructor(){
+ super();
+ let c = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ c.innerHTML = `
+
+
+ `;
+ let d = c.querySelector("form");
+ d.addEventListener("submit", (a)=>{
+ a.preventDefault(), a.stopPropagation(), this.dispatchEvent(new CustomEvent("form:next", {
+ bubbles: !0,
+ composed: !0,
+ detail: d
+ }));
+ });
+ }
+});
+customElements.define("register-item-form-row", class extends PseudoForm {
+ static get observedAttributes() {
+ return [
+ "idx",
+ "name"
+ ];
+ }
+ constructor(){
+ super(), this[S] = this.attachShadow({
+ mode: "closed"
+ }), this.addEventListener("item:removed", ()=>{
+ this.setAttribute("removed", "removed");
+ let a = this.parentElement;
+ this.remove(), a.dispatchEvent(new CustomEvent("item:removed", {
+ bubbles: !0,
+ composed: !0
+ }));
+ });
+ }
+ connectedCallback() {
+ let c = this.getAttribute("idx");
+ this[S].innerHTML = `
+
+
+ `, this[S].querySelector("form").addEventListener("submit", (a)=>{
+ a.preventDefault(), a.stopPropagation(), this.reportValidity();
+ }), this[S].querySelector(".remove").addEventListener("click", (a)=>{
+ a.preventDefault(), a.stopPropagation(), this.dispatchEvent(new CustomEvent("item:removed", {
+ bubbles: !0,
+ composed: !1
+ }));
+ });
+ }
+ attributeChangedCallback(a, b, c) {
+ b !== c && "idx" === a && this.updateNames();
+ }
+ get inputs() {
+ return [
+ this[S].querySelector("input.item-name").cloneNode(!0),
+ this[S].querySelector("input.item-price").cloneNode(!0),
+ ];
+ }
+ 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}]`);
+ }
+ }
+ get idx() {
+ return this.getAttribute("idx");
+ }
+ set idx(a) {
+ this.setAttribute("idx", a);
+ }
+ reportValidity() {
+ return super.reportValidity() && this[S].querySelector("price-input").reportValidity();
+ }
+});
+let d = (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 {
+ static get observedAttributes() {
+ return [];
+ }
+ constructor(){
+ super();
+ let c = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ c.innerHTML = `
+
+
+ `, this.addEventListener("item:removed", (a)=>{
+ a.stopPropagation(), d(this);
+ }), this.addEventListener("form:next", (a)=>{
+ for (let b of this.querySelectorAll("item-form-row"))b.reportValidity() || (a.stopPropagation(), a.preventDefault());
+ }), c.querySelector("#add-item").addEventListener("click", (a)=>{
+ a.stopPropagation(), a.preventDefault(), this.appendChild(document.createElement("register-item-form-row")), d(this);
+ });
+ }
+ get inputs() {
+ return [
+ ...this.querySelectorAll("register-item-form-row")
+ ].map((a)=>a.inputs);
+ }
+});
+customElements.define("register-company-form", class extends PseudoForm {
+ constructor(){
+ super();
+ let c = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ c.innerHTML = `
+
+
+ `;
+ }
+});
+customElements.define("register-submit-form", class extends PseudoForm {
+ constructor(){
+ super();
+ let c = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ c.innerHTML = `
+
+
+ `;
+ }
+ updateField(a, c) {
+ this[S].querySelector(`[id="hidden-${a}"]`).value = c, this[S].querySelector(`[id="preview-${a}"]`).value = c;
+ }
+ setItems(a) {
+ let c = this[S].querySelector("#items");
+ for (let d of (c.innerHTML = "", a)){
+ let e = c.appendChild(document.createElement("div")), [f, g] = d;
+ f.setAttribute("readonly", "readonly"), e.appendChild(f), e.appendChild(document.createElement("price-view")).value = g.value, g.setAttribute("readonly", "readonly"), g.setAttribute("type", "hidden"), e.appendChild(g);
+ }
+ }
+});
+customElements.define("register-user-type", class extends HTMLElement {
+ constructor(){
+ super();
+ let a = this.attachShadow({
+ mode: "closed"
+ });
+ a.innerHTML = `
+
+
+
+
+ `;
+ let b = a.querySelector("#user");
+ b.addEventListener("click", (a)=>{
+ a.preventDefault(), a.stopPropagation(), this.dispatchEvent(new CustomEvent("account:type:user", {
+ bubbles: !0,
+ composed: !0
+ }));
+ });
+ let c = a.querySelector("#local-service");
+ c.addEventListener("click", (a)=>{
+ a.preventDefault(), a.stopPropagation(), this.dispatchEvent(new CustomEvent("account:type:local-service", {
+ bubbles: !0,
+ composed: !0
+ }));
+ });
+ }
+});
+customElements.define("register-oauth2", class extends HTMLElement {
+ static get observedAttributes() {
+ return [
+ "fb-connected"
+ ];
+ }
+ constructor(){
+ super();
+ let a = this.attachShadow({
+ mode: "closed"
+ });
+ a.innerHTML = `
+
+
+
+
+
+
+ `;
+ }
+ connectedCallback() {
+ runFbReady(()=>{
+ FB.getLoginStatus(({ status: a })=>{
+ "connected" !== a ? FB.login() : this.setAttribute("fb-connected", "1");
+ });
+ });
+ }
+});
+let c = (a, b)=>{
+ for (let c of (a.reportValidity(), a.elements))if ("" !== c.name && !c.reportValidity()) return !1;
+ let d = a.inputs;
+ if (d) b.setItems(d);
+ else for (let e of a.elements)"" !== e.name && b.updateField(e.name, e.value);
+ return !0;
+};
+customElements.define("register-form", class extends HTMLElement {
+ static get observedAttributes() {
+ return [
+ "step"
+ ];
+ }
+ constructor(){
+ super();
+ let d = this[S] = this.attachShadow({
+ mode: "closed"
+ });
+ d.innerHTML = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `;
+ let e = d.querySelector("#step-4");
+ this[S].addEventListener("account:type:user", (a)=>{
+ a.stopPropagation(), this.step = 1000;
+ }), this[S].addEventListener("account:type:local-service", (a)=>{
+ a.stopPropagation(), 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);
+ }), this[S].addEventListener("form:prev", (a)=>{
+ a.stopPropagation(), this.step = this.step - 1;
+ }), e.addEventListener("submit", (a)=>{
+ a.preventDefault(), a.stopPropagation();
+ });
+ }
+ connectedCallback() {
+ this.step = 0;
+ }
+ attributeChangedCallback(a, b, c) {
+ if (b === c) return;
+ }
+ get step() {
+ let a = parseInt(this.getAttribute("step"));
+ return isNaN(a) ? 1 : a;
+ }
+ set step(a) {
+ a < 0 || this.setAttribute("step", a);
+ }
+});
+if (window.fbAsyncInit = ()=>{
+ FB.init({
+ appId: "1293538251053124",
+ cookie: !0,
+ xfbml: !0,
+ version: "v14.0"
+ }), FB.AppEvents.logPageView(), fireFbReady();
+}, !document.querySelector("#facebook-jssdk")) {
+ let b1 = document.createElement("script");
+ b1.id = "facebook-jssdk", b1.src = "https://connect.facebook.net/en_US/sdk.js", document.head.appendChild(b1);
+}
diff --git a/client/dist/app.js.map b/client/dist/app.js.map
new file mode 100644
index 0000000..1bcef7c
--- /dev/null
+++ b/client/dist/app.js.map
@@ -0,0 +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-service.js","/home/eraden/code/eraden/oswilno/client/src/local-service-item.js","/home/eraden/code/eraden/oswilno/client/src/local-services.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/ow-nav.js","/home/eraden/code/eraden/oswilno/client/src/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-company-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-oauth2.js","/home/eraden/code/eraden/oswilno/client/src/register-form.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.inline {\n display: flex;\n justify-content: space-between;\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`;\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 shadow.querySelector('#prev').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.dispatchEvent(new CustomEvent('form:prev', {\n bubbles: true,\n composed: true,\n detail: this.parentElement\n }));\n });\n shadow.querySelector('#next').addEventListener('click', ev => {\n ev.stopPropagation();\n ev.preventDefault();\n this.dispatchEvent(new CustomEvent('form:next', {\n bubbles: true,\n composed: true,\n detail: this.parentElement\n }));\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","import { S } from \"./shared\";\n\ncustomElements.define('local-service', 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 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\ncustomElements.define('local-service-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 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-services', 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 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 connectedCallback() {\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n }\n }\n});\n","import { S } from \"./shared\";\n\ncustomElements.define('ow-account', class extends HTMLElement {\n static get observedAttributes() {\n return ['mode']\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 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 this.mode = 'login';\n }\n\n attributeChangedCallback(name, oldV, newV) {\n if (oldV === newV) return;\n switch (name) {\n }\n }\n\n get mode() {\n return this.getAttribute('mode');\n }\n\n set mode(value) {\n value = value === 'login' || value === 'register' ? value : 'login';\n this.setAttribute('mode', value);\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","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\n connectedCallback() {\n this[S].querySelector('#currency').textContent = this.currency;\n // this[S].querySelector('#price').textContent = this.formatted;\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 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 const form = shadow.querySelector('form');\n form.addEventListener('submit', ev => {\n ev.preventDefault();\n ev.stopPropagation();\n this.dispatchEvent(new CustomEvent('form:next', { bubbles: true, composed: true, detail: form }));\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 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\n get inputs() {\n return [\n this[S].querySelector('input.item-name').cloneNode(true),\n this[S].querySelector('input.item-price').cloneNode(true),\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","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 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-company-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","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 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 const [name, price] = row;\n\n name.setAttribute('readonly', 'readonly');\n el.appendChild(name);\n\n el.appendChild(document.createElement('price-view')).value = price.value;\n price.setAttribute('readonly', 'readonly');\n price.setAttribute('type', 'hidden');\n el.appendChild(price);\n }\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 `;\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 { runFbReady } from \"../shared\";\n\ncustomElements.define('register-oauth2', class extends HTMLElement {\n static get observedAttributes() {\n return ['fb-connected']\n }\n constructor() {\n super();\n\n const shadow = this.attachShadow({ mode: \"closed\" });\n shadow.innerHTML = `\n \n \n\n\n\n\n `;\n }\n\n connectedCallback() {\n runFbReady(() => {\n FB.getLoginStatus(({ status }) => {\n if (status !== 'connected')\n FB.login();\n else\n this.setAttribute('fb-connected', '1');\n });\n });\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-company-form\";\nimport \"./register-form/register-submit-form\";\nimport \"./register-form/register-user-type\";\nimport \"./register-form/register-oauth2\";\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 \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 this.step = 1000;\n });\n this[S].addEventListener('account:type:local-service', ev => {\n ev.stopPropagation();\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 const el = finalForm;\n el.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 \"./form-navigation.js\";\nimport \"./local-service.js\";\nimport \"./local-service-item.js\";\nimport \"./local-services.js\";\nimport \"./login-form.js\";\nimport \"./ow-account.js\";\nimport \"./ow-nav.js\";\nimport \"./ow-path.js\";\nimport \"./price/price-view\";\nimport \"./price/price-input\";\nimport \"./register-form.js\";\nimport { fireFbReady } from \"./shared.js\";\n\nwindow.fbAsyncInit = () => {\n FB.init({\n appId : '1293538251053124',\n cookie : true,\n xfbml : true,\n version : 'v14.0'\n });\n FB.AppEvents.logPageView();\n\tfireFbReady();\n};\n\n{\n if (!document.querySelector('#facebook-jssdk')) {\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}\n"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/client/src/app.js b/client/src/app.js
index 83aa458..084fc85 100644
--- a/client/src/app.js
+++ b/client/src/app.js
@@ -9,4 +9,24 @@ import "./ow-path.js";
import "./price/price-view";
import "./price/price-input";
import "./register-form.js";
-import "./shared.js";
+import { fireFbReady } from "./shared.js";
+
+window.fbAsyncInit = () => {
+ FB.init({
+ appId : '1293538251053124',
+ cookie : true,
+ xfbml : true,
+ version : 'v14.0'
+ });
+ FB.AppEvents.logPageView();
+ fireFbReady();
+};
+
+{
+ if (!document.querySelector('#facebook-jssdk')) {
+ const js = document.createElement('script');
+ js.id = 'facebook-jssdk';
+ js.src = "https://connect.facebook.net/en_US/sdk.js";
+ document.head.appendChild(js);
+ }
+}
diff --git a/client/src/register-form/register-oauth2.js b/client/src/register-form/register-oauth2.js
index b1bcc4f..6c7bf23 100644
--- a/client/src/register-form/register-oauth2.js
+++ b/client/src/register-form/register-oauth2.js
@@ -1,12 +1,101 @@
+import { runFbReady } from "../shared";
+
customElements.define('register-oauth2', class extends HTMLElement {
+ static get observedAttributes() {
+ return ['fb-connected']
+ }
constructor() {
super();
const shadow = this.attachShadow({ mode: "closed" });
shadow.innerHTML = `
-
- Sign in with Google
-
+
+
+
+
+
+
`;
}
+
+ connectedCallback() {
+ runFbReady(() => {
+ FB.getLoginStatus(({ status }) => {
+ if (status !== 'connected')
+ FB.login();
+ else
+ this.setAttribute('fb-connected', '1');
+ });
+ });
+ }
});
diff --git a/client/src/shared.js b/client/src/shared.js
index 49c5055..a032362 100644
--- a/client/src/shared.js
+++ b/client/src/shared.js
@@ -105,3 +105,14 @@ export class PseudoForm extends HTMLElement {
return this[S].querySelector('form').elements;
}
}
+
+export const fireFbReady = () => {
+ fbReady = true;
+ for (const fn of fbQueue) fn();
+};
+export const runFbReady = (fn) => {
+ if (!fbReady) fbQueue.push(fn);
+ else fn();
+};
+const fbQueue = [];
+let fbReady = false;