|  | @@ -0,0 +1,214 @@
 | 
	
		
			
				|  |  | +import { product } from "./product.js";
 | 
	
		
			
				|  |  | +import { product_fullscreen } from "./product_fullscreen.js";
 | 
	
		
			
				|  |  | +import { login_manager } from "./login_manager.js";
 | 
	
		
			
				|  |  | +import { delete_product_window } from "./delete_product_window.js";
 | 
	
		
			
				|  |  | +import { product_editor } from "./product_editor.js";
 | 
	
		
			
				|  |  | +import { product_rent } from "./product_rent.js";
 | 
	
		
			
				|  |  | +import { product_give_back } from "./product_give_back.js";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export class product_container {
 | 
	
		
			
				|  |  | +    #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) {
 | 
	
		
			
				|  |  | +            header.appendChild(this.#manage);
 | 
	
		
			
				|  |  | +        }   
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return header;
 | 
	
		
			
				|  |  | +    }   
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    get #manage() {
 | 
	
		
			
				|  |  | +        const manage = document.createElement("div");
 | 
	
		
			
				|  |  | +        manage.classList.add("manage");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const all_rents_button = document.createElement("button");
 | 
	
		
			
				|  |  | +        all_rents_button.classList.add("material-icons");
 | 
	
		
			
				|  |  | +        all_rents_button.classList.add("all-rents-button");
 | 
	
		
			
				|  |  | +        all_rents_button.innerText = "list";
 | 
	
		
			
				|  |  | +        manage.appendChild(all_rents_button);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const rent_button = document.createElement("button");
 | 
	
		
			
				|  |  | +        rent_button.classList.add("material-icons");
 | 
	
		
			
				|  |  | +        rent_button.classList.add("rent-button");
 | 
	
		
			
				|  |  | +        rent_button.innerText = "backpack";
 | 
	
		
			
				|  |  | +        manage.appendChild(rent_button);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const give_back_button = document.createElement("button");
 | 
	
		
			
				|  |  | +        give_back_button.classList.add("material-icons");
 | 
	
		
			
				|  |  | +        give_back_button.classList.add("give-back-button");
 | 
	
		
			
				|  |  | +        give_back_button.innerText = "save_alt";
 | 
	
		
			
				|  |  | +        manage.appendChild(give_back_button);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const edit_button = document.createElement("button");
 | 
	
		
			
				|  |  | +        edit_button.classList.add("material-icons");
 | 
	
		
			
				|  |  | +        edit_button.classList.add("edit-button");
 | 
	
		
			
				|  |  | +        edit_button.innerText = "edit";
 | 
	
		
			
				|  |  | +        manage.appendChild(edit_button);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        const delete_button = document.createElement("button");
 | 
	
		
			
				|  |  | +        delete_button.classList.add("material-icons");
 | 
	
		
			
				|  |  | +        delete_button.classList.add("delete-button");
 | 
	
		
			
				|  |  | +        delete_button.innerText = "remove_circle_outline";
 | 
	
		
			
				|  |  | +        manage.appendChild(delete_button);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        all_rents_button.addEventListener("click", () => {
 | 
	
		
			
				|  |  | +            new product_all_rents(this.#target).show();
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        rent_button.addEventListener("click", () => {
 | 
	
		
			
				|  |  | +            new product_rent(this.#target).show();
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        give_back_button.addEventListener("click", () => {
 | 
	
		
			
				|  |  | +            new product_give_back(this.#target).show();
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        edit_button.addEventListener("click", () => {
 | 
	
		
			
				|  |  | +            new product_editor(this.#target).show();
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        delete_button.addEventListener("click", () => {
 | 
	
		
			
				|  |  | +            new delete_product_window(this.#target).show();
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return manage;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    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.on_stock > 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 #cache_bypass() {
 | 
	
		
			
				|  |  | +        return "?cache=" + new String(Math.floor(Math.random() * 100));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    get #image() {
 | 
	
		
			
				|  |  | +        const image = document.createElement("img");
 | 
	
		
			
				|  |  | +        image.classList.add("image");
 | 
	
		
			
				|  |  | +        image.src = this.#target.thumbnail + this.#cache_bypass;
 | 
	
		
			
				|  |  | +        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);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |