import * as api from 'api'; import * as sfw from 'sfw'; import Month from '../../month.js'; const { Div, Img, A: Link } = sfw.element.native; const css = await sfw.css(import.meta.url, './index.css') export default class Image extends sfw.element.Container { #container #image #menu #id #month #date #id_element constructor() { super ({ css }) this.body.append( this.#container = Div.new({ id: 'container', children: [ this.#image = Img.new({ onload: () => this.#container.classList.add('loaded'), }), Div.new({ id: 'loading' }), this.#menu = Div.new({ id: 'menu', children: [ Div.new({ id: 'label', children: [ Div.new({ id: 'title', innerText: 'Id' }), this.#id_element = Div.new({ className: 'element id' }), ], }), Div.new({ id: 'label', children: [ Div.new({ id: 'title', innerText: 'Date' }), this.#date = Div.new({ className: 'element' }), ], }), Div.new({ id: 'download', innerText: 'Download', onclick: () => { const a = Link.new({ href: `/api/image/load/${this.#id}`, download: `${this.#id}.jpeg` }) a.click() } }), Div.new({ id: 'delete', innerText: 'Delete', onclick: () => { api.images.remove(this.#id); this.parentNode.removeChild(this); } }), ], ondblclick: (e) => { if (e.target != this.#menu) { e.stopPropagation(); } } }) ], ondblclick: (e) => { this.#menu.classList.toggle('open'); e.preventDefault(); } }) ); } set metadata(image) { const date = new Date(image.timestamp * 1000); this.#id = image.id; this.#month = Month.from_unix(image.timestamp); this.#container.classList.remove('loaded'); this.#date.innerText = date.toLocaleString(); this.#id_element.innerText = image.id; } load() { this.#image.src = `/api/image/load/${this.#id}`; } get month() { return this.#month; } }