Skip to content

Commit e9a0c65

Browse files
committed
feat: calc country days in last year
1 parent caf5d89 commit e9a0c65

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed

src/days.html

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>days</title>
5+
<meta name=viewport content="width=device-width, initial-scale=1">
6+
<meta name=viewport content="width=device-width, initial-scale=1">
7+
<link rel=stylesheet href=//cdn.jsdelivr.net/npm/[email protected]/build/web/hack.css>
8+
<link rel=stylesheet media=print href=/css/print.css>
9+
<link rel=stylesheet media=screen href=/css/screen.css>
10+
<link rel=stylesheet href=/css/readable.css>
11+
<link rel=stylesheet href=//cdn.jsdelivr.net/highlight.js/9.1.0/styles/github.min.css>
12+
<script type=module src=/js/dark-toggle.js></script>
13+
<script type=module src=/js/sw-register.js></script>
14+
</head>
15+
<body>
16+
<header>
17+
<nav>
18+
<a href=/ >home</a>
19+
<a href=https://github.com/qwelias/qwelias.github.io>source</a>
20+
</nav>
21+
<nav>
22+
<a href=https://github.com/qwelias>github</a>
23+
</nav>
24+
</header>
25+
<form>
26+
<section id="inputs">
27+
</section>
28+
<button id="newInput" type="button">+</button>
29+
<pre id="outputs">
30+
</pre>
31+
</form>
32+
<script>
33+
'use strict'
34+
35+
const oneDay = 24*60*60*1000
36+
const now = Date.now()
37+
const year = Number(new Date().setFullYear(new Date().getFullYear() - 1))
38+
39+
const update = () => {
40+
try {
41+
const dates = [...document.querySelectorAll('input[type=date]')]
42+
const ccs = [...document.querySelectorAll('input[type=text]')]
43+
44+
const ds = []
45+
const cs = []
46+
const sums = {}
47+
let pd = null
48+
let pc = null
49+
dates.map((dd, i) => {
50+
const cc = ccs[i].value
51+
cs.push(cc)
52+
53+
const ts = Date.parse(dd.value)
54+
ds.push(dd.value)
55+
56+
if (pd) {
57+
sums[pc] = sums[pc] || 0
58+
const diff = Math.max(0, Math.min(ts - pd, ts - year))
59+
sums[pc] += diff/oneDay
60+
}
61+
62+
pd = ts
63+
pc = cc
64+
})
65+
66+
if (pd) {
67+
sums[pc] = sums[pc] || 0
68+
sums[pc] += (now - pd)/oneDay
69+
}
70+
71+
outputs.textContent = Object.entries(sums).map(([cc, dd]) => cc + ': ' + (dd|0)).join('\n')
72+
73+
localStorage.ds = ds.join()
74+
localStorage.cs = cs.join()
75+
} catch (err) {
76+
const { message, stack, name } = err
77+
outputs.textContent = [name, message, stack].join('\n')
78+
}
79+
}
80+
81+
const addInput = (date, code) => {
82+
const div = document.createElement('div')
83+
const dd = document.createElement('input')
84+
dd.type = 'date'
85+
dd.addEventListener('input', update)
86+
if (date && code) dd.value = date
87+
div.append(dd)
88+
89+
const cc = document.createElement('input')
90+
cc.type = 'text'
91+
cc.size = 2
92+
cc.addEventListener('input', update)
93+
if (date && code) cc.value = code
94+
div.append(cc)
95+
96+
const rm = document.createElement('button')
97+
rm.textContent = '-'
98+
rm.type = 'button'
99+
rm.addEventListener('click', () => { div.remove(); update() })
100+
div.append(rm)
101+
102+
inputs.append(div)
103+
}
104+
105+
const ds = localStorage.ds?.split(',')
106+
const cs = localStorage.cs?.split(',')
107+
if (ds && cs) {
108+
ds.map((dd, i) => addInput(dd, cs[i]))
109+
update()
110+
}
111+
112+
newInput.addEventListener('click', addInput)
113+
</script>
114+
</body>
115+
</html>

0 commit comments

Comments
 (0)