| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770 |
- (() => {
- // application/scripts/height_equaler.js
- var height_equaler = class {
- #to;
- #from;
- constructor(from, to) {
- this.#from = from;
- this.#to = to;
- this.#set_styles();
- new ResizeObserver(() => {
- this.#update();
- }).observe(from);
- setTimeout(() => {
- this.#update();
- }, 100);
- }
- get height() {
- return this.#from.offsetHeight;
- }
- #set_styles() {
- this.#to.style.height = "0px";
- this.#to.style.transition = "height 0.5s";
- }
- #update() {
- this.#to.style.height = this.height + "px";
- }
- };
- // application/scripts/product.js
- var product = class {
- name;
- description;
- author;
- image;
- stock_count;
- barcode;
- constructor(target) {
- this.name = null;
- this.description = null;
- this.author = null;
- this.image = null;
- this.stock_count = null;
- this.barcode = null;
- if ("name" in target) this.name = target["name"];
- if ("description" in target) this.description = target["description"];
- if ("author" in target) this.author = target["author"];
- if ("image" in target) this.image = target["image"];
- if ("stock_count" in target) this.stock_count = target["stock_count"];
- if ("barcode" in target) this.barcode = target["barcode"];
- }
- get dump() {
- return {
- "name": this.name,
- "description": this.description,
- "author": this.author,
- "image": this.image,
- "stock_count": this.stock_count,
- "barcode": this.barcode
- };
- }
- get ready() {
- if (this.name === null || this.description === null) return false;
- if (this.author === null || this.image === null) return false;
- if (this.stock_count === null || this.barcode === null) return false;
- return true;
- }
- };
- // application/scripts/products_loader.js
- var products_loader = class _products_loader {
- static async all() {
- const request = await fetch("/products/");
- const response = await request.json();
- return _products_loader.#response_to_collection(response);
- }
- static #response_to_collection(response) {
- const result = new Array();
- if (response.result !== "success") {
- return result;
- }
- response.collection.forEach((serialized) => {
- result.push(new product(serialized));
- });
- return result;
- }
- static async search_name(name) {
- return await _products_loader.#search(
- "/product/search/name",
- name
- );
- }
- static async search_author(author) {
- return await _products_loader.#search(
- "/product/search/author",
- author
- );
- }
- static async #search(path, parameter) {
- const coded = encodeURI(parameter);
- const request = await fetch(path + "/" + coded);
- const response = await request.json();
- return _products_loader.#response_to_collection(response);
- }
- };
- // application/scripts/fullscreen.js
- var fullscreen = class {
- #node;
- constructor() {
- this.#node = null;
- }
- get visible() {
- return this.#node !== null;
- }
- _build_node() {
- throw new TypeError("This is virtual method!");
- }
- get #opacity() {
- if (!this.visible) {
- throw new TypeError("Can not change opacity of not existed.");
- }
- return Number(this.#node.style.opacity);
- }
- get_query(selector) {
- if (!this.visible) {
- throw new TypeError("Can not get item from not visible.");
- }
- return this.#node.querySelector(selector);
- }
- get #close() {
- const close_button = document.createElement("button");
- close_button.classList.add("material-icons");
- close_button.classList.add("close");
- close_button.innerText = "close";
- close_button.addEventListener("click", () => {
- this.hide();
- });
- return close_button;
- }
- #prepare() {
- if (!this.visible) {
- throw new TypeError("Can not prepare not existed.");
- }
- this.#node.style.transition = "opacity 0.5s";
- this.#node.classList.add("fullscreen-viewer");
- this.#node.appendChild(this.#close);
- }
- set #opacity(target) {
- if (!this.visible) {
- throw new TypeError("Can not change opacity of not existed.");
- }
- this.#node.style.opacity = String(target);
- }
- hide() {
- if (!this.visible) {
- return;
- }
- this.#opacity = 0;
- setTimeout(() => {
- if (!this.visible) {
- return;
- }
- this.#node.remove();
- this.#node = null;
- }, 500);
- }
- show() {
- if (this.visible) {
- return;
- }
- this.#node = this._build_node();
- this.#prepare();
- this.#opacity = 0;
- document.querySelector("body").appendChild(this.#node);
- setTimeout(() => {
- this.#opacity = 1;
- }, 100);
- }
- };
- // application/scripts/product_fullscreen.js
- var product_fullscreen = class extends fullscreen {
- #target;
- constructor(target) {
- super();
- this.#target = target;
- }
- get target() {
- return this.#target;
- }
- _build_node() {
- const container = document.createElement("div");
- container.classList.add("product-fullscreen-viewer");
- const image = document.createElement("div");
- image.style.backgroundImage = 'url("' + this.target.image + '")';
- image.classList.add("image");
- container.appendChild(image);
- const title = document.createElement("div");
- title.classList.add("title");
- container.appendChild(title);
- const title_content = document.createElement("h1");
- title_content.innerText = this.target.name;
- title.appendChild(title_content);
- const bottom = document.createElement("div");
- bottom.classList.add("bottom-side");
- container.appendChild(bottom);
- const bottom_header = document.createElement("div");
- bottom_header.classList.add("bottom-header");
- bottom.appendChild(bottom_header);
- const barcode_icon = document.createElement("span");
- barcode_icon.classList.add("material-icons");
- barcode_icon.innerText = "qr_code_scanner";
- const barcode_content = document.createElement("span");
- barcode_content.innerText = this.target.barcode;
- barcode_content.classList.add("numbers");
- const barcode = document.createElement("p");
- barcode.appendChild(barcode_icon);
- barcode.appendChild(barcode_content);
- bottom_header.appendChild(barcode);
- const author_icon = document.createElement("span");
- author_icon.classList.add("material-icons");
- author_icon.innerText = "attribution";
- const author_content = document.createElement("span");
- author_content.innerText = this.target.author;
- const author = document.createElement("p");
- author.appendChild(author_icon);
- author.appendChild(author_content);
- bottom_header.appendChild(author);
- const description = document.createElement("div");
- description.classList.add("description");
- bottom.appendChild(description);
- const description_content = document.createElement("p");
- description_content.innerText = this.target.description;
- description.appendChild(description_content);
- return container;
- }
- };
- // application/scripts/user.js
- var user = class {
- #nick;
- #apikey;
- constructor(nick, apikey) {
- this.#nick = nick;
- this.#apikey = apikey;
- }
- get nick() {
- return this.#nick;
- }
- get apikey() {
- return this.#apikey;
- }
- };
- // application/scripts/login_manager.js
- var login_manager = class {
- get apikey() {
- return localStorage.getItem("apikey");
- }
- get logged_in() {
- return localStorage.getItem("apikey") !== null;
- }
- #create_request(data) {
- return {
- method: "POST",
- body: JSON.stringify(data),
- headers: {
- "Content-Type": "application/json"
- }
- };
- }
- async get_user() {
- if (!this.logged_in) {
- return null;
- }
- const request_data = this.#create_request({
- apikey: this.apikey
- });
- const request = await fetch("/user", request_data);
- const response = await request.json();
- if (response.result !== "success") {
- return null;
- }
- return new user(
- response.nick,
- response.apikey
- );
- }
- async login(nick, password) {
- const request_data = this.#create_request({
- nick,
- password
- });
- const request = await fetch("/user/login", request_data);
- const response = await request.json();
- if (response.result !== "success") {
- return false;
- }
- localStorage.setItem("apikey", response.apikey);
- return true;
- }
- logout() {
- localStorage.removeItem("apikey");
- }
- };
- // application/scripts/product_container.js
- var product_container = class {
- #target;
- #node;
- #login;
- constructor(target) {
- this.#target = new product(target.dump);
- this.#node = null;
- this.#login = new login_manager().logged_in;
- }
- get #header() {
- const header = document.createElement("div");
- header.classList.add("header");
- const title = document.createElement("h3");
- title.innerText = this.#target.name;
- header.appendChild(title);
- if (this.#login) {
- const manage = document.createElement("div");
- manage.classList.add("manage");
- header.appendChild(manage);
- manage.appendChild(this.#rent);
- manage.appendChild(this.#give_back);
- }
- return header;
- }
- get #rent() {
- const rent_button = document.createElement("button");
- rent_button.classList.add("material-icons");
- rent_button.classList.add("rent-button");
- rent_button.innerText = "backpack";
- return rent_button;
- }
- get #give_back() {
- const give_back_button = document.createElement("button");
- give_back_button.classList.add("material-icons");
- give_back_button.classList.add("rent-button");
- give_back_button.innerText = "save_alt";
- return give_back_button;
- }
- get #description() {
- const container = document.createElement("div");
- container.classList.add("description");
- const description = document.createElement("p");
- description.innerText = this.#target.description;
- description.classList.add("content");
- const author_container = document.createElement("div");
- author_container.classList.add("author");
- const author = document.createElement("span");
- author.innerText = this.#target.author;
- const author_icon = document.createElement("span");
- author_icon.classList.add("material-icons");
- author_icon.innerText = "attribution";
- author_container.appendChild(author_icon);
- author_container.appendChild(author);
- const stock_count = document.createElement("p");
- stock_count.classList.add("stock-count");
- stock_count.classList.add("material-icons");
- if (this.#target.stock_count > 0) {
- stock_count.innerText = "check_circle";
- stock_count.classList.add("avairable");
- } else {
- stock_count.innerText = "cancel";
- stock_count.classList.add("unavairable");
- }
- const barcode_container = document.createElement("p");
- barcode_container.classList.add("barcode");
- const barcode = document.createElement("span");
- barcode.innerText = this.#target.barcode;
- barcode.classList.add("numbers");
- const barcode_icon = document.createElement("span");
- barcode_icon.classList.add("material-icons");
- barcode_icon.innerText = "qr_code_scanner";
- barcode_container.appendChild(barcode_icon);
- barcode_container.appendChild(barcode);
- container.appendChild(description);
- container.appendChild(author_container);
- container.appendChild(barcode_container);
- container.appendChild(stock_count);
- return container;
- }
- get #image() {
- const image = document.createElement("img");
- image.classList.add("image");
- image.src = this.#target.image;
- image.alt = this.#target.name;
- image.addEventListener("click", () => {
- new product_fullscreen(this.#target).show();
- });
- return image;
- }
- get node() {
- if (this.#node !== null) {
- return this.#node;
- }
- const bottom_container = document.createElement("div");
- bottom_container.classList.add("bottom-container");
- bottom_container.appendChild(this.#description);
- bottom_container.appendChild(this.#image);
- const container = document.createElement("div");
- container.classList.add("product");
- container.appendChild(this.#header);
- container.appendChild(bottom_container);
- return this.#node = container;
- }
- add(target) {
- const node = this.node;
- node.style.opacity = "0";
- node.style.transition = "opacity 0.5s";
- target.appendChild(node);
- setTimeout(() => {
- node.style.opacity = "1";
- }, 50);
- }
- drop() {
- const container = this.#node;
- if (container === null) {
- throw new TypeError("It is not showed yet.");
- }
- container.style.opacity = "1";
- container.style.transition = "opacity 0.5s";
- setTimeout(() => {
- container.style.opacity = "0";
- }, 50);
- setTimeout(() => {
- this.#node = null;
- container.remove();
- }, 550);
- }
- };
- // application/scripts/product_containers.js
- var product_containers = class {
- #content;
- #where;
- #inserted;
- constructor(where) {
- this.#where = where;
- this.#content = new Array();
- this.#inserted = new Array();
- }
- add_list(target) {
- target.forEach((count) => {
- this.add(count);
- });
- return this;
- }
- add(target) {
- const current = new product_container(target);
- this.#content.push(current);
- return this;
- }
- clean() {
- this.#content = new Array();
- return this;
- }
- update() {
- this.#hide();
- setTimeout(() => {
- this.#content.forEach((count) => {
- this.#inserted.push(count);
- count.add(this.#where);
- });
- }, 500);
- return this;
- }
- #hide() {
- this.#inserted.forEach((count) => {
- if (!this.#content.includes(count)) {
- count.drop();
- }
- });
- this.#inserted = new Array();
- return this;
- }
- };
- // application/scripts/searcher.js
- var searcher = class {
- #input;
- #category;
- #manager;
- #result;
- constructor(search_form, manager, result) {
- this.#input = search_form.querySelector('input[type="text"]');
- this.#category = search_form.querySelector("select");
- this.#manager = manager;
- this.#result = result;
- this.#selector_complete();
- search_form.addEventListener("submit", (target) => {
- target.preventDefault();
- this.update();
- });
- }
- get categories() {
- return {
- "name": "Name",
- "author": "Author"
- };
- }
- #selector_complete() {
- const category = this.#category;
- const categories = this.categories;
- Object.keys(categories).forEach((name) => {
- const option = document.createElement("option");
- option.value = name;
- option.innerText = categories[name];
- category.appendChild(option);
- });
- }
- get #loader() {
- return {
- "name": products_loader.search_name,
- "author": products_loader.search_author
- }[this.category];
- }
- get category() {
- return this.#category.value;
- }
- get phrase() {
- return this.#input.value.trim();
- }
- get #result_title() {
- return this.#result.innerText;
- }
- set #result_title(target) {
- this.#result.innerText = target;
- }
- async update() {
- if (this.phrase.length === 0) {
- this.show_all();
- return;
- }
- this.#insert(await this.#loader(this.phrase));
- }
- #insert(list) {
- if (list.length === 0) {
- this.#result_title = "Not found anything.";
- } else {
- this.#result_title = "Browse our products!";
- }
- this.#manager.clean().add_list(list).update();
- }
- async show_all() {
- this.#insert(await products_loader.all());
- }
- };
- // application/scripts/login_prompt.js
- var login_prompt = class extends fullscreen {
- constructor(target) {
- super();
- target.addEventListener("click", () => {
- this.show();
- });
- }
- get _nick() {
- return this.get_query("#nick").value;
- }
- get _password() {
- return this.get_query("#password").value;
- }
- get _result() {
- return this.get_query("#result");
- }
- async _login() {
- const manager = new login_manager();
- const result = await manager.login(this._nick, this._password);
- if (result) {
- this._result.style.color = "green";
- this._result.innerText = "Login success!";
- setTimeout(() => {
- location.reload();
- }, 500);
- return;
- }
- this._result.style.color = "red";
- this._result.innerText = "Can not login! Check login and password.";
- }
- _build_node() {
- const container = document.createElement("div");
- container.classList.add("login-prompt");
- const center = document.createElement("form");
- center.classList.add("center");
- container.appendChild(center);
- const nick_label = document.createElement("label");
- nick_label.innerText = "Your nick:";
- nick_label.htmlFor = "nick";
- center.appendChild(nick_label);
- const nick = document.createElement("input");
- nick.type = "text";
- nick.name = "nick";
- nick.id = "nick";
- nick.placeholder = "Nick...";
- center.appendChild(nick);
- const password_label = document.createElement("label");
- password_label.innerText = "Your password:";
- password_label.htmlFor = "password";
- center.appendChild(password_label);
- const password = document.createElement("input");
- password.type = "password";
- password.name = "password";
- password.id = "password";
- password.placeholder = "Password...";
- center.appendChild(password);
- const submit = document.createElement("button");
- submit.type = "submit";
- submit.classList.add("material-icons");
- submit.innerText = "send";
- center.appendChild(submit);
- const result = document.createElement("p");
- result.id = "result";
- result.classList.add("result");
- center.appendChild(result);
- center.addEventListener("submit", (target) => {
- target.preventDefault();
- this._login();
- });
- return container;
- }
- };
- // application/scripts/product_adder.js
- var product_adder = class extends fullscreen {
- _build_node() {
- const container = document.createElement("div");
- container.classList.add("product-adder");
- const center = document.createElement("form");
- center.classList.add("center");
- container.appendChild(center);
- const label_name = document.createElement("label");
- label_name.setAttribute("for", "name");
- label_name.textContent = "Name:";
- center.appendChild(label_name);
- const name = document.createElement("input");
- name.type = "text";
- name.id = "name";
- name.name = "name";
- name.placeholder = "Sample...";
- center.appendChild(name);
- const label_description = document.createElement("label");
- label_description.setAttribute("for", "description");
- label_description.textContent = "Description:";
- center.appendChild(label_description);
- const description = document.createElement("input");
- description.type = "text";
- description.id = "description";
- description.name = "description";
- description.placeholder = "This is exa...";
- center.appendChild(description);
- const label_author = document.createElement("label");
- label_author.setAttribute("for", "author");
- label_author.textContent = "Author:";
- center.appendChild(label_author);
- const author = document.createElement("input");
- author.type = "text";
- author.id = "author";
- author.name = "author";
- author.placeholder = "John Snow...";
- center.appendChild(author);
- const label_barcode = document.createElement("label");
- label_barcode.setAttribute("for", "barcode");
- label_barcode.textContent = "Barcode:";
- center.appendChild(label_barcode);
- const barcode = document.createElement("input");
- barcode.type = "number";
- barcode.id = "barcode";
- barcode.name = "barcode";
- barcode.placeholder = "Enter EAN-12...";
- center.appendChild(barcode);
- const label_stock_count = document.createElement("label");
- label_stock_count.setAttribute("for", "stock-count");
- label_stock_count.textContent = "On stock:";
- center.appendChild(label_stock_count);
- const stock_count = document.createElement("input");
- stock_count.type = "number";
- stock_count.id = "stock-count";
- stock_count.name = "stock-count";
- stock_count.placeholder = "20...";
- center.appendChild(stock_count);
- const button = document.createElement("button");
- button.type = "submit";
- button.id = "add";
- button.name = "add";
- button.className = "material-icons";
- button.textContent = "add";
- center.appendChild(button);
- return container;
- }
- };
- // application/scripts/login_bar.js
- var login_bar = class {
- #manager;
- constructor(target) {
- this.#manager = new login_manager();
- if (!this.#manager.logged_in) {
- this.#not_logged(target);
- return;
- }
- this.#logged(target);
- }
- #not_login_propertly() {
- this.#manager.logout();
- location.reload();
- }
- async #logged(target) {
- const user2 = await this.#manager.get_user();
- if (user2 === null) {
- this.#not_login_propertly();
- }
- const info_icon = document.createElement("span");
- info_icon.classList.add("icon");
- info_icon.classList.add("material-icons");
- info_icon.innerText = "account_circle";
- const info_content = document.createElement("span");
- info_content.innerText = user2.nick;
- const info = document.createElement("p");
- info.classList.add("login-info");
- info.appendChild(info_icon);
- info.appendChild(info_content);
- target.appendChild(info);
- const logout_button = document.createElement("button");
- logout_button.innerText = "logout";
- logout_button.classList.add("logout-button");
- logout_button.classList.add("material-icons");
- target.appendChild(logout_button);
- const add_product_button = document.createElement("button");
- add_product_button.innerText = "add";
- add_product_button.classList.add("add-product-button");
- add_product_button.classList.add("material-icons");
- target.appendChild(add_product_button);
- add_product_button.addEventListener("click", () => {
- new product_adder().show();
- });
- logout_button.addEventListener("click", () => {
- this.#manager.logout();
- location.reload();
- });
- }
- #not_logged(target) {
- const login_button = document.createElement("button");
- login_button.innerText = "account_circle";
- login_button.classList.add("login-button");
- login_button.classList.add("material-icons");
- target.appendChild(login_button);
- new login_prompt(login_button);
- }
- };
- // application/scripts/core.js
- document.addEventListener("DOMContentLoaded", async () => {
- const top_bar_spacing = new height_equaler(
- document.querySelector(".top-bar"),
- document.querySelector(".top-bar-spacing")
- );
- const container = document.querySelector(".products");
- const search_bar = document.querySelector("form.search");
- const search_title = document.querySelector(".search-title");
- const login_space = document.querySelector(".top-bar .right");
- const manager = new product_containers(container);
- new login_bar(login_space);
- new searcher(search_bar, manager, search_title).show_all();
- });
- })();
|