Matthias Andreas Benkard | 6991257 | 2020-02-13 04:41:32 +0100 | [diff] [blame] | 1 | import {html, render} from "../../web_modules/lit-html.js"; |
| 2 | import ProgressSpinner from "../web_modules/elix/define/ProgressSpinner.js"; |
| 3 | |
| 4 | export 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 Benkard | fc427e2 | 2020-02-13 05:00:54 +0100 | [diff] [blame^] | 24 | 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 Benkard | 6991257 | 2020-02-13 04:41:32 +0100 | [diff] [blame] | 34 | } |
| 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 Benkard | fc427e2 | 2020-02-13 05:00:54 +0100 | [diff] [blame^] | 66 | <form class="pure-form pure-form-aligned" method="post" action="/bookmarks"> |
Matthias Andreas Benkard | 6991257 | 2020-02-13 04:41:32 +0100 | [diff] [blame] | 67 | <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 Benkard | fc427e2 | 2020-02-13 05:00:54 +0100 | [diff] [blame^] | 73 | value=${this.getAttribute("uri") || ""} |
| 74 | @blur=${this.onUriBlur.bind(this)} /> |
Matthias Andreas Benkard | 6991257 | 2020-02-13 04:41:32 +0100 | [diff] [blame] | 75 | <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 Benkard | fc427e2 | 2020-02-13 05:00:54 +0100 | [diff] [blame^] | 80 | <input name="title" id="title-input" type="text" placeholder="Title" required |
| 81 | value="${this.getAttribute("title") || ""}" /> |
Matthias Andreas Benkard | 6991257 | 2020-02-13 04:41:32 +0100 | [diff] [blame] | 82 | </div> |
| 83 | |
| 84 | <div class="pure-control-group"> |
| 85 | <label for="description-input">Description:</label> |
Matthias Andreas Benkard | fc427e2 | 2020-02-13 05:00:54 +0100 | [diff] [blame^] | 86 | <textarea name="description" id="description-input" placeholder="Description" |
| 87 | >${this.getAttribute("description") || ""}</textarea> |
Matthias Andreas Benkard | 6991257 | 2020-02-13 04:41:32 +0100 | [diff] [blame] | 88 | </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 | |
| 109 | customElements.define("mlk-bookmark-submission-form", MlkBookmarkSubmissionForm); |