-
Notifications
You must be signed in to change notification settings - Fork 211
/
Copy pathwarnings.js
120 lines (106 loc) · 4.53 KB
/
warnings.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
(function() {
function load(key, def = null) {
const value = window.localStorage.getItem(key)
if (value) {
try {
return JSON.parse(value)
} catch (ex) {
console.error(`Failed loading ${key} from local storage`, ex)
return def
}
} else {
return def
}
}
function store(key, value) {
window.localStorage.setItem(key, JSON.stringify(value))
}
function create(tagName, attrs = {}, children = [], listeners = {}) {
const el = document.createElement(tagName)
for (const key of Object.keys(attrs)) {
if (typeof attrs[key] === 'object') {
for (const subkey of Object.keys(attrs[key])) {
el[key].setProperty(subkey, attrs[key][subkey])
}
} else {
el.setAttribute(key, attrs[key])
}
}
el.append(...children)
for (const key of Object.keys(listeners)) {
el.addEventListener(key, listeners[key])
}
return el
}
if (!load('docs-rs-warnings-enabled', false)) {
return
}
const parentEl = document.getElementById('warnings-menu-parent')
parentEl.removeAttribute('hidden')
const current = JSON.parse(document.getElementById("crate-metadata")?.innerText || null)
const menuEl = document.getElementById('warnings-menu')
const followed = load('docs-rs-warnings-followed', [])
function update() {
const children = []
if (followed.length > 0) {
children.push(
create('div', { class: 'pure-g' }, [
create('div', { class: 'pure-u-1' }, [
create('ul', { class: 'pure-menu-list', style: { width: '100%' } }, [
create('li', { class: 'pure-menu-heading' }, [
create('b', {}, ['Followed crates']),
]),
...followed.map(name => (
create('li', { class: 'pure-menu-item followed' }, [
create('a', { class: 'pure-menu-link', href: `/${name}` }, [
name,
]),
create('a', { class: 'pure-menu-link remove', href: '#' }, ['🗙'], {
click: (ev) => {
const index = followed.indexOf(name)
followed.splice(index, 1)
store('docs-rs-warnings-followed', followed)
update()
},
}),
])
)),
]),
]),
]),
)
}
if (current && !followed.includes(current.name)) {
children.push(
create('div', { class: 'pure-g' }, [
create('div', { class: 'pure-u-1' }, [
create('ul', { class: 'pure-menu-list', style: { width: '100%' } }, [
create('li', { class: 'pure-menu-item' }, [
create('a', { class: 'pure-menu-link', href: '#' }, [
"Follow ",
create('b', {}, [current.name]),
], {
click: () => {
const index = followed.findIndex((name) => name > current.name)
if (index >= 0) {
followed.splice(index, 0, current.name)
} else {
followed.push(current.name)
}
store('docs-rs-warnings-followed', followed)
update()
}
}),
]),
]),
]),
]),
)
}
for (const child of children.slice(0, -1)) {
child.classList.add('menu-item-divided')
}
menuEl.replaceChildren(...children)
}
update()
})()