Skip to content

Commit 137873f

Browse files
committedApr 26, 2022
adds an on-page settings screen
- the old settings screen doesn't work now
1 parent 672058a commit 137873f

File tree

10 files changed

+133
-54
lines changed

10 files changed

+133
-54
lines changed
 

‎web_extension/assets/gear.svg

+7
Loading

‎web_extension/content/scripts/new_tab.js

+9-14
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,15 @@
33
import Builder from '../../shared/lib/builder.js'
44
import Storage from '../../shared/storage_manager.js'
55
import StartPage from '../../shared/start-page/start-page.js'
6-
import SettingsPage from '../../shared/settings_page/index.js'
6+
import SettingsPage from '../../shared/settings-page/settings-page.js'
77
import InfoBox from '../../shared/info-box/info-box.js'
88
import ImageChooser from '../../shared/image_chooser.js'
9+
import Version from '../../shared/version.js'
910

1011
// Setup the event listener for when local storage is changed
1112
const display_options = Storage.display
1213
const chooser = new ImageChooser()
1314

14-
let option_read_timeout = 0
15-
16-
browser.storage.onChanged.addListener(() => {
17-
clearTimeout(option_read_timeout)
18-
option_read_timeout = setTimeout(() => display_options.read(), 150)
19-
})
20-
2115
// Switches between images
2216
async function loadImage(historyOffset) {
2317
await chooser.sortHistory()
@@ -52,13 +46,14 @@ chooser.choose().then(image => {
5246
info_box.waitForReady(()=>{ info_box.image = image })
5347
})
5448

49+
document.querySelector('body').appendChild(
50+
Builder.tag('settings-page')
51+
).classList.add('hidden')
5552

56-
// document.querySelector('body').appendChild(
57-
// Builder.tag('settings-page')
58-
// )
59-
60-
// document.querySelector(selector).innerHTML = `<version>${Version.number}</version>`
53+
document.querySelector('body').appendChild(
54+
Builder.tag('version', Version.number)
55+
)
6156

6257
document.querySelector('#gear').addEventListener('click', () => {
63-
document.querySelector('#settings-page').classList.toggle('hidden')
58+
document.querySelector('settings-page').classList.toggle('hidden')
6459
})

‎web_extension/content/styles/main.css

+6-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ a#gear {
4343
right: 0.5em;
4444
color: rgba(250, 250, 250, 0.4);
4545
user-select: none;
46+
z-index: 1;
4647
}
4748

4849
a#gear img {
@@ -67,7 +68,11 @@ settings-page {
6768
height: 100%;
6869
margin: 0 auto;
6970

70-
background-color: rgba(250, 250, 250, 0.5);
71+
background-color: rgba(250, 250, 250, 0.7);
72+
}
73+
74+
settings-page.hidden {
75+
display: none;
7176
}
7277

7378
start-page {

‎web_extension/shared/info-box/info-box.css

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
:host { display: inline-block }
22
body { margin: 0 }
33

4+
.hidden { display: none }
5+
46
bezel {
57
padding: 0 1em;
68
display: flex;

‎web_extension/shared/info-box/info-box.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<bezel class="subtle">
1+
<bezel class="hidden subtle">
22
<clock>
33
<time></time>
44
<date></date>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
body {
2+
font-size: 0.8rem;
3+
}
4+
5+
#url {
6+
width: 32em;
7+
}

‎web_extension/shared/settings_page/settings_page.html ‎web_extension/shared/settings-page/settings-page.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,5 +84,5 @@ <h3>Options:</h3>
8484

8585
</form>
8686
<p>
87-
The icon for Photographic Start is from the <a href="https://thenounproject.com/vectorsmarket/collection/hunt-solid-icons/">Hunt Solid Collection</a> by <a href="https://thenounproject.com/vectorsmarket/">Vectors Market</a> on <a href="https://thenounproject.com">The Noun Project</a>.
87+
The icon for Start.Photos is from the <a href="https://thenounproject.com/vectorsmarket/collection/hunt-solid-icons/">Hunt Solid Collection</a> by <a href="https://thenounproject.com/vectorsmarket/">Vectors Market</a> on <a href="https://thenounproject.com">The Noun Project</a>.
8888
</p>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
"use strict";
2+
3+
import BaseComponent from '../lib/base-component.js'
4+
import Storage from '../../shared/storage_manager.js'
5+
6+
export default class SettingsPage extends BaseComponent {
7+
constructor() {
8+
super()
9+
this.attachCSS('../shared/settings-page/settings-page.css')
10+
this.attachHTML('../shared/settings-page/settings-page.html')
11+
}
12+
13+
readyCallback () {
14+
this.read()
15+
16+
const inputEvent = (event) => {
17+
this.write()
18+
this.hideAndShowThings()
19+
}
20+
21+
for (let input of this.shadowRoot.querySelectorAll("input,select")) {
22+
input.addEventListener('change', inputEvent)
23+
}
24+
}
25+
26+
hideAndShowThings() {
27+
const hideIfChecked = async (checkboxes, toggled_control) => {
28+
let visible = false
29+
checkboxes = [].concat(checkboxes)
30+
31+
for (let box_id of checkboxes)
32+
visible = visible || this.shadowRoot.querySelector(box_id).checked
33+
34+
for (let element of this.shadowRoot.querySelectorAll(toggled_control))
35+
element.style.display = visible ? "" : "none"
36+
}
37+
38+
hideIfChecked('#show_clock', '.hide_unless_clock')
39+
hideIfChecked('#show_date', '.hide_unless_date')
40+
hideIfChecked('#custom_feed', '.hide_unless_custom_feed')
41+
}
42+
43+
fillDateFormats() {
44+
const date_format = this.shadowRoot.querySelector("#date_format")
45+
date_format.querySelectorAll('option').forEach(o => o.remove())
46+
47+
let today = new Date()
48+
date_format.appendChild(Builder.option(terse_date(today), "good"))
49+
date_format.appendChild(Builder.option(verbose_date(today), "bad"))
50+
}
51+
52+
get checks () {
53+
return this.shadowRoot.querySelectorAll('input[type=checkbox]')
54+
}
55+
56+
get selects () {
57+
return this.shadowRoot.querySelectorAll('select')
58+
}
59+
60+
get texts () {
61+
return this.shadowRoot.querySelectorAll('input[type=text]')
62+
}
63+
64+
async read () {
65+
await Storage.ensureRead()
66+
67+
for (let check_box of this.checks)
68+
if (check_box.dataset.namespace) {
69+
check_box.checked = Storage[check_box.dataset.namespace][check_box.id]
70+
}
71+
72+
for (let select_box of this.selects)
73+
if (select_box.dataset.namespace)
74+
for (let option of select_box.options)
75+
option.selected = (
76+
option.value == Storage[select_box.dataset.namespace][select_box.id]
77+
)
78+
79+
for (let text_box of this.texts)
80+
text_box.value = Storage[text_box.dataset.namespace][text_box.id]
81+
}
82+
83+
async write () {
84+
for (let check_box of this.checks)
85+
if (check_box.dataset.namespace)
86+
Storage[check_box.dataset.namespace][check_box.id] = check_box.checked
87+
88+
for (let select_box of this.selects)
89+
if (select_box.dataset.namespace)
90+
Storage[select_box.dataset.namespace][select_box.id] = select_box.value
91+
92+
for (let text_box of this.texts)
93+
Storage[text_box.dataset.namespace][text_box.id] = text_box.value
94+
95+
return Promise.all([Storage.display.write(), Storage.feed.write()])
96+
}
97+
}
98+
99+
customElements.define('settings-page', SettingsPage)
100+

‎web_extension/shared/settings_page/index.js

-34
This file was deleted.

‎web_extension/shared/settings_page/styles.css

-3
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.