Commit 83811f3eeab7f9cae46ca83ffe34c19b2974a4ac
styled network page, NOW WITH LABELS!
mix irving committed on 1/11/2017, 3:14:40 AMParent: 7d510f40ceb47f6b4863bc121426ce7492a1bbbc
Files changed
modules_basic/avatar.js | changed |
modules_extra/network.js | changed |
modules_extra/network.mcss | added |
modules_basic/avatar.js | ||
---|---|---|
@@ -9,29 +9,37 @@ | ||
9 | 9 … | |
10 | 10 … | exports.gives = { |
11 | 11 … | avatar: true, |
12 | 12 … | avatar_image_name_link: true, |
13 | - avatar_image_link: true | |
13 … | + avatar_image_link: true, | |
14 … | + avatar_name_link: true | |
14 | 15 … | } |
15 | 16 … | |
16 | 17 … | exports.create = function (api) { |
18 … | + return { | |
19 … | + avatar, | |
20 … | + avatar_image_name_link, | |
21 … | + avatar_image_link, | |
22 … | + avatar_name_link | |
23 … | + } | |
17 | 24 … | |
18 | - var exports = {} | |
19 | - exports.avatar = function (author, classes) { | |
25 … | + function avatar (author, classes) { | |
20 | 26 … | return exports.avatar_image_name_link(author, classes) |
21 | 27 … | } |
22 | 28 … | |
23 | - exports.avatar_image_name_link = function (author, classes) { | |
29 … | + function avatar_image_name_link (author, classes) { | |
24 | 30 … | return api.avatar_link(author, [ |
25 | 31 … | api.avatar_image(author, classes), |
26 | 32 … | api.avatar_name(author) |
27 | 33 … | ]) |
28 | 34 … | } |
29 | 35 … | |
30 | - exports.avatar_image_link = function (author, classes) { | |
36 … | + function avatar_image_link (author, classes) { | |
31 | 37 … | return api.avatar_link(author, api.avatar_image(author, classes)) |
32 | 38 … | } |
33 | 39 … | |
34 | - return exports | |
40 … | + function avatar_name_link (author, classes) { | |
41 … | + return api.avatar_link(author, api.avatar_name(author)) | |
42 … | + } | |
35 | 43 … | } |
36 | 44 … | |
37 | 45 … |
modules_extra/network.js | |||
---|---|---|---|
@@ -1,29 +1,33 @@ | |||
1 … | +const fs = require('fs') | ||
1 | 2 … | const isVisible = require('is-visible').isVisible | |
2 | 3 … | const h = require('../h') | |
4 … | +const human = require('human-time') | ||
5 … | + | ||
3 | 6 … | const mutantMap = require('@mmckegg/mutant/map') | |
4 | -const mutantDict = require('@mmckegg/mutant/dict') | ||
7 … | +const dict = require('@mmckegg/mutant/dict') | ||
5 | 8 … | const Struct = require('@mmckegg/mutant/struct') | |
6 | 9 … | const Value = require('@mmckegg/mutant/value') | |
7 | 10 … | const toCollection = require('@mmckegg/mutant/dict-to-collection') | |
8 | 11 … | const when = require('@mmckegg/mutant/when') | |
9 | 12 … | const computed = require('@mmckegg/mutant/computed') | |
10 | -const human = require('human-time') | ||
11 | 13 … | ||
12 | 14 … | //var avatar = plugs.first(exports.avatar = []) | |
13 | 15 … | //var sbot_gossip_peers = plugs.first(exports.sbot_gossip_peers = []) | |
14 | 16 … | //var sbot_gossip_connect = plugs.first(exports.sbot_gossip_connect = []) | |
15 | 17 … | ||
16 | 18 … | exports.needs = { | |
17 | - avatar: 'first', | ||
19 … | + avatar_image_link: 'first', | ||
20 … | + avatar_name_link: 'first', | ||
18 | 21 … | sbot_gossip_peers: 'first', | |
19 | 22 … | sbot_gossip_connect: 'first' | |
20 | 23 … | } | |
21 | 24 … | ||
22 | 25 … | exports.gives = { | |
23 | 26 … | menu_items: true, | |
24 | 27 … | builtin_tabs: true, | |
25 | - screen_view: true | ||
28 … | + screen_view: true, | ||
29 … | + mcss: true | ||
26 | 30 … | } | |
27 | 31 … | ||
28 | 32 … | //sbot_gossip_connect | |
29 | 33 … | //sbot_gossip_add | |
@@ -121,17 +125,18 @@ | |||
121 | 125 … | return new Date(time).toString() | |
122 | 126 … | } | |
123 | 127 … | ||
124 | 128 … | function humanDate (time) { | |
125 | - return human(new Date(time)) | ||
129 … | + return human(new Date(time)).replace(/minute/, 'min').replace(/second/, 'sec') | ||
126 | 130 … | } | |
127 | 131 … | ||
128 | 132 … | exports.create = function (api) { | |
129 | 133 … | ||
130 | 134 … | return { | |
131 | 135 … | menu_items: () => h('a', {href: '#/network'}, '/network'), | |
132 | 136 … | builtin_tabs: () => ['/network'], | |
133 | - screen_view | ||
137 … | + screen_view, | ||
138 … | + mcss: () => fs.readFileSync(__filename.replace(/js$/, 'mcss'), 'utf8') | ||
134 | 139 … | } | |
135 | 140 … | ||
136 | 141 … | function screen_view (path) { | |
137 | 142 … | if (path !== '/network') return | |
@@ -142,39 +147,56 @@ | |||
142 | 147 … | h('Network', [ | |
143 | 148 … | mutantMap(peers, peer => { | |
144 | 149 … | var { key, ping, source, state, stateChange } = peer | |
145 | 150 … | ||
146 | - console.log('ping', ping()) | ||
147 | - | ||
148 | 151 … | return h('NetworkConnection', [ | |
149 | - api.avatar(key(), 'thumbnail'), | ||
150 | - h('div', [ | ||
151 | - when(state, state, 'not connected'), | ||
152 | - ' ', | ||
152 … | + h('section.avatar', [ | ||
153 … | + api.avatar_image_link(key()), | ||
154 … | + ]), | ||
155 … | + h('section.name', [ | ||
156 … | + api.avatar_name_link(key()), | ||
157 … | + ]), | ||
158 … | + h('section.type', [ | ||
153 | 159 … | computed(peer, getType), | |
154 | - ' ', | ||
155 | - // //TODO: show nicer details, with labels. etc. | ||
156 | - computed(ping.rtt.mean, duration), | ||
157 | - ' ', | ||
158 | - computed(ping.skew.mean, duration), | ||
159 | - ' ', | ||
160 | - h('label', | ||
160 … | + ]), | ||
161 … | + h('section.source', [ | ||
162 … | + 'source: ', | ||
163 … | + h('code', source) | ||
164 … | + ]), | ||
165 … | + h('section.state', [ | ||
166 … | + 'state: ', | ||
167 … | + h('code', when(state, state, 'not connected')) | ||
168 … | + ]), | ||
169 … | + h('section.actions', [ | ||
170 … | + h('button', { | ||
171 … | + 'ev-click': () => { | ||
172 … | + api.sbot_gossip_connect(peer(), (err) => { | ||
173 … | + if(err) console.error(err) | ||
174 … | + else console.log('connected to', peer()) | ||
175 … | + }) | ||
176 … | + }}, | ||
177 … | + 'connect' | ||
178 … | + ) | ||
179 … | + ]), | ||
180 … | + h('section.time-ago', [ | ||
181 … | + h('div', | ||
161 | 182 … | { title: computed(stateChange, formatDate) }, | |
162 | 183 … | [ computed(stateChange, humanDate) ] | |
163 | 184 … | ) | |
164 | 185 … | ]), | |
165 | - 'source: ', | ||
166 | - source, | ||
167 | - h('pre', computed(peer, legacyToMultiServer)), | ||
168 | - h('button', { | ||
169 | - 'ev-click': () => { | ||
170 | - api.sbot_gossip_connect(peer(), (err) => { | ||
171 | - if(err) console.error(err) | ||
172 | - else console.log('connected to', peer()) | ||
173 | - }) | ||
174 | - }}, | ||
175 | - 'connect' | ||
176 | - ) | ||
186 … | + h('section.ping', [ | ||
187 … | + h('div.rtt', [ | ||
188 … | + 'rtt: ', | ||
189 … | + h('code', computed(ping.rtt.mean, duration)) | ||
190 … | + ]), | ||
191 … | + h('div.skew', [ | ||
192 … | + 'skew: ', | ||
193 … | + h('code', computed(ping.skew.mean, duration)) | ||
194 … | + ]), | ||
195 … | + ]), | ||
196 … | + h('section.address', [ | ||
197 … | + h('code', computed(peer, legacyToMultiServer)) | ||
198 … | + ]) | ||
177 | 199 … | ]) | |
178 | 200 … | }) | |
179 | 201 … | ]) | |
180 | 202 … | ]) | |
@@ -182,9 +204,9 @@ | |||
182 | 204 … | } | |
183 | 205 … | ||
184 | 206 … | function obs_gossip_peers (api) { | |
185 | 207 … | var timer = null | |
186 | - var state = mutantDict({}, { | ||
208 … | + var state = dict({}, { | ||
187 | 209 … | onListen: () => { | |
188 | 210 … | timer = setInterval(refresh, 5e3) | |
189 | 211 … | }, | |
190 | 212 … | onUnlisten: () => { |
modules_extra/network.mcss | ||
---|---|---|
@@ -1,0 +1,91 @@ | ||
1 … | +Network { | |
2 … | + div { | |
3 … | + margin: .8rem | |
4 … | + border-bottom: 1px solid gainsboro | |
5 … | + } | |
6 … | + | |
7 … | +} | |
8 … | + | |
9 … | +NetworkConnection { | |
10 … | + padding-left: 6rem | |
11 … | + padding-bottom: .8rem | |
12 … | + position: relative | |
13 … | + | |
14 … | + display: flex | |
15 … | + flex-direction: row | |
16 … | + flex-wrap: wrap | |
17 … | + align-items: center | |
18 … | + | |
19 … | + section.avatar { | |
20 … | + position: absolute | |
21 … | + left: 0 | |
22 … | + top: 0 | |
23 … | + | |
24 … | + a img { | |
25 … | + height: 3rem | |
26 … | + width: 3rem | |
27 … | + } | |
28 … | + } | |
29 … | + | |
30 … | + section.time-ago { | |
31 … | + position: absolute | |
32 … | + left: 0 | |
33 … | + top: 3.5rem | |
34 … | + | |
35 … | + font-size: .8rem | |
36 … | + $textSubtle | |
37 … | + } | |
38 … | + | |
39 … | + section.name { | |
40 … | + flex-basis: 100% | |
41 … | + | |
42 … | + margin-right: 1rem | |
43 … | + } | |
44 … | + | |
45 … | + section.type { | |
46 … | + flex-basis: 100% | |
47 … | + | |
48 … | + font-size: .8rem | |
49 … | + $textSubtle | |
50 … | + } | |
51 … | + | |
52 … | + section.source { | |
53 … | + flex-basis: 100% | |
54 … | + } | |
55 … | + | |
56 … | + section.state { | |
57 … | + margin-right: 2rem | |
58 … | + } | |
59 … | + | |
60 … | + section.actions { | |
61 … | + button { | |
62 … | + padding: .2rem | |
63 … | + font-size: .7rem | |
64 … | + } | |
65 … | + } | |
66 … | + | |
67 … | + | |
68 … | + section.ping { | |
69 … | + flex-basis: 100% | |
70 … | + display: flex | |
71 … | + | |
72 … | + font-size: .8rem | |
73 … | + $textSubtle | |
74 … | + | |
75 … | + div.rtt { | |
76 … | + flex-basis: 8rem | |
77 … | + } | |
78 … | + | |
79 … | + div.skew { | |
80 … | + flex-basis: 8rem | |
81 … | + } | |
82 … | + } | |
83 … | + | |
84 … | + section.address{ | |
85 … | + flex-basis: 100% | |
86 … | + | |
87 … | + font-size: .8rem | |
88 … | + $textSubtle | |
89 … | + } | |
90 … | +} | |
91 … | + |
Built with git-ssb-web