blob: 3dd375475e7ee90962857e6d04afe083d8888c47 [file] [log] [blame]
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +01001// @flow
2
Matthias Andreas Benkard8075e592020-02-16 14:49:25 +01003import /*:: ProgressSpinner from */ "../web_modules/elix/define/ProgressSpinner.js";
Matthias Andreas Benkard8c29ae92020-02-15 21:04:58 +01004import { cast } from "../cms2/types.js";
Matthias Andreas Benkard69912572020-02-13 04:41:32 +01005
Matthias Andreas Benkardf550d242020-02-15 18:49:45 +01006const template = document.createElement('template');
7template.innerHTML = `
8 <link rel="stylesheet" type="text/css" href="/cms2/base.css" />
9 <link rel="stylesheet" type="text/css" href="/bookmarks/MlkBookmarkSubmissionForm.css" />
10
11 <form class="pure-form" method="post" action="/bookmarks">
12 <fieldset>
Matthias Andreas Benkard06e6c812020-04-13 17:01:35 +020013 <legend>Edit Bookmark</legend>
Matthias Andreas Benkardf550d242020-02-15 18:49:45 +010014
15 <label for="uri-input">URI:</label>
16 <input name="uri" id="uri-input" type="text" placeholder="URI" required />
17 <elix-progress-spinner id="uri-spinner" hidden></elix-progress-spinner>
18
19 <label for="title-input">Title:</label>
20 <input name="title" id="title-input" type="text" placeholder="Title" required />
21
22 <label for="description-input">Description:</label>
23 <textarea name="description" id="description-input" placeholder="Description"></textarea>
24
25 <label for="visibility-input">Visibility:</label>
26 <select id="visibility-input" name="visibility" required>
Matthias Andreas Benkard06e6c812020-04-13 17:01:35 +020027 <option value="PUBLIC" selected>Public</option>
28 <option value="SEMIPRIVATE">Semiprivate</option>
29 <option value="PRIVATE">Private</option>
Matthias Andreas Benkardf550d242020-02-15 18:49:45 +010030 </select>
31
32 <div class="controls">
33 <button type="submit" class="pure-button pure-button-primary">Submit Bookmark</button>
34 </div>
35 </fieldset>
36 </form>`;
37
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010038export class MlkBookmarkSubmissionForm extends HTMLElement {
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +010039 /*::
40 descriptionInput: HTMLTextAreaElement;
41 titleInput: HTMLInputElement;
42 uriInput: HTMLInputElement;
43 uriSpinner: ProgressSpinner;
44 */
45
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010046 constructor() {
47 super();
Matthias Andreas Benkard4eb71262020-02-15 14:40:37 +010048
Matthias Andreas Benkardf550d242020-02-15 18:49:45 +010049 let shadow = this.attachShadow({mode: "open"});
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +010050 shadow.appendChild(template.content.cloneNode(true));
Matthias Andreas Benkardf550d242020-02-15 18:49:45 +010051
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +010052 this.descriptionInput =
Matthias Andreas Benkard9e203aa2020-02-15 20:47:24 +010053 cast(shadow.getElementById('description-input'));
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +010054 this.titleInput =
Matthias Andreas Benkard9e203aa2020-02-15 20:47:24 +010055 cast(shadow.getElementById('title-input'));
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +010056 this.uriInput =
Matthias Andreas Benkard9e203aa2020-02-15 20:47:24 +010057 cast(shadow.getElementById('uri-input'));
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +010058 this.uriSpinner =
Matthias Andreas Benkard9e203aa2020-02-15 20:47:24 +010059 cast(shadow.getElementById('uri-spinner'));
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010060 }
61
62 static get observedAttributes() {
Matthias Andreas Benkardc5302972020-02-15 18:36:49 +010063 return [];
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010064 }
65
66 connectedCallback () {
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +010067 this.uriInput.addEventListener('blur', this.onUriBlur.bind(this));
Matthias Andreas Benkardf550d242020-02-15 18:49:45 +010068 this.uriInput.value = this.uri || "";
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +010069 this.titleInput.value = this.titleText || "";
Matthias Andreas Benkardf550d242020-02-15 18:49:45 +010070 this.descriptionInput.innerText = this.description || "";
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010071 }
72
Matthias Andreas Benkardedd7e5e2020-02-15 22:16:58 +010073 disconnectedCallback () {
74 this.uriInput.removeEventListener('blur', this.onUriBlur.bind(this));
75 }
76
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +010077 attributeChangedCallback(name /*:string*/, oldValue /*:string*/, newValue /*:string*/) {
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010078 }
79
Matthias Andreas Benkard4eb71262020-02-15 14:40:37 +010080 get uri() {
81 return this.getAttribute("uri");
82 }
83
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +010084 get titleText() {
Matthias Andreas Benkard4eb71262020-02-15 14:40:37 +010085 return this.getAttribute("title");
86 }
87
88 get description() {
89 return this.getAttribute("description");
90 }
91
Matthias Andreas Benkard69912572020-02-13 04:41:32 +010092 focus() {
Matthias Andreas Benkardc5302972020-02-15 18:36:49 +010093 if (!this.uriInput.value) {
94 this.uriInput.focus();
95 } else if (!this.titleInput.value) {
96 this.titleInput.focus();
Matthias Andreas Benkard8bd01962020-02-13 05:03:30 +010097 this.onUriBlur();
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010098 } else {
Matthias Andreas Benkardc5302972020-02-15 18:36:49 +010099 this.descriptionInput.focus();
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +0100100 }
Matthias Andreas Benkard69912572020-02-13 04:41:32 +0100101 }
102
103 async onUriBlur() {
Matthias Andreas Benkardc5302972020-02-15 18:36:49 +0100104 if (!this.uriInput.value) {
Matthias Andreas Benkard69912572020-02-13 04:41:32 +0100105 return;
106 }
107
Matthias Andreas Benkardc5302972020-02-15 18:36:49 +0100108 this.uriSpinner.hidden = false;
109 this.uriSpinner.playing = true;
110 let searchParams = new URLSearchParams({'uri': this.uriInput.value});
Matthias Andreas Benkardb3a2c482020-02-15 20:40:30 +0100111 console.log(`/bookmarks/page-info?${searchParams.toString()}`);
112 let fetchUrl = new URL(`/bookmarks/page-info?${searchParams.toString()}`, document.URL);
Matthias Andreas Benkard69912572020-02-13 04:41:32 +0100113 let r = await fetch(fetchUrl);
Matthias Andreas Benkardc5302972020-02-15 18:36:49 +0100114 this.uriSpinner.hidden = true;
115 this.uriSpinner.playing = false;
Matthias Andreas Benkard69912572020-02-13 04:41:32 +0100116
117 if (!r.ok) {
118 return;
119 }
120
121 let pageInfo = await r.json();
Matthias Andreas Benkardc5302972020-02-15 18:36:49 +0100122 this.titleInput.value = pageInfo.title;
Matthias Andreas Benkard69912572020-02-13 04:41:32 +0100123 }
Matthias Andreas Benkard69912572020-02-13 04:41:32 +0100124}
125
126customElements.define("mlk-bookmark-submission-form", MlkBookmarkSubmissionForm);