blob: 313268d0ad5595b6b9b651f3afbf1eef4c6fcf49 [file] [log] [blame]
Matthias Andreas Benkard69912572020-02-13 04:41:32 +01001import {html, render} from "../../web_modules/lit-html.js";
2import ProgressSpinner from "../web_modules/elix/define/ProgressSpinner.js";
3
4export class MlkBookmarkSubmissionForm extends HTMLElement {
5 constructor() {
6 super();
7 this.attachShadow({mode: "open"});
8 }
9
10 static get observedAttributes() {
11 return ["greetee"];
12 }
13
14 connectedCallback () {
15 this.render();
16 }
17
18 attributeChangedCallback(name, oldValue, newValue) {
19 this.render();
20 }
21
22 focus() {
23 let uriInput = this.shadowRoot.getElementById('uri-input');
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010024 let titleInput = this.shadowRoot.getElementById('title-input');
25 let descriptionInput = this.shadowRoot.getElementById('description-input');
26
27 if (!uriInput.value) {
28 uriInput.focus();
29 } else if (!titleInput.value) {
30 titleInput.focus();
31 } else {
32 descriptionInput.focus();
33 }
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010034 }
35
36 async onUriBlur() {
37 let titleInput = this.shadowRoot.getElementById('title-input');
38 let uriInput = this.shadowRoot.getElementById('uri-input');
39 let uriSpinner = this.shadowRoot.getElementById('uri-spinner');
40
41 if (!uriInput.value) {
42 return;
43 }
44
45 uriSpinner.hidden = false;
46 uriSpinner.playing = true;
47 let searchParams = new URLSearchParams({'uri': uriInput.value});
48 console.log(`/bookmarks/page-info?${searchParams}`);
49 let fetchUrl = new URL(`/bookmarks/page-info?${searchParams}`, document.URL);
50 let r = await fetch(fetchUrl);
51 uriSpinner.hidden = true;
52 uriSpinner.playing = false;
53
54 if (!r.ok) {
55 return;
56 }
57
58 let pageInfo = await r.json();
59 titleInput.value = pageInfo.title;
60 }
61
62 render() {
63 const template = html`
64 <link rel="stylesheet" type="text/css" href="/cms2/base.css" />
65
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010066 <form class="pure-form pure-form-aligned" method="post" action="/bookmarks">
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010067 <fieldset>
68 <legend>New Bookmark</legend>
69
70 <div class="pure-control-group">
71 <label for="uri-input">URI:</label>
72 <input name="uri" id="uri-input" type="text" placeholder="URI" required
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010073 value=${this.getAttribute("uri") || ""}
74 @blur=${this.onUriBlur.bind(this)} />
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010075 <elix-progress-spinner id="uri-spinner" hidden></elix-progress-spinner>
76 </div>
77
78 <div class="pure-control-group">
79 <label for="title-input">Title:</label>
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010080 <input name="title" id="title-input" type="text" placeholder="Title" required
81 value="${this.getAttribute("title") || ""}" />
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010082 </div>
83
84 <div class="pure-control-group">
85 <label for="description-input">Description:</label>
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010086 <textarea name="description" id="description-input" placeholder="Description"
87 >${this.getAttribute("description") || ""}</textarea>
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010088 </div>
89
90 <div class="pure-control-group">
91 <label for="visibility-input">Visibility:</label>
92 <select id="visibility-input" name="visibility" required>
93 <option value="public">Public</option>
94 <option value="semiprivate" selected>Semiprivate</option>
95 <option value="private">Private</option>
96 </select>
97 </div>
98
99 <div class="pure-controls">
100 <button type="submit" class="pure-button pure-button-primary">Submit Bookmark</button>
101 </div>
102 </fieldset>
103 </form>`;
104
105 render(template, this.shadowRoot);
106 }
107}
108
109customElements.define("mlk-bookmark-submission-form", MlkBookmarkSubmissionForm);