Ticket #692: tahoe-style-1.dpatch

File tahoe-style-1.dpatch, 40.7 KB (added by kpreid, at 2009-05-03T20:41:52Z)
Line 
1Fri May  1 15:10:50 EDT 2009  Kevin Reid <kpreid@mac.com>
2  * Fix broken link from Provisioning to Reliability page.
3
4Sun May  3 16:25:33 EDT 2009  Kevin Reid <kpreid@mac.com>
5  * Link all Tahoe web pages to the /tahoe_css stylesheet which already exists.
6
7Sun May  3 16:28:02 EDT 2009  Kevin Reid <kpreid@mac.com>
8  * Modify markup of Tahoe web pages to be more amenable to styling; some minor changes of wording.
9
10Sun May  3 16:31:42 EDT 2009  Kevin Reid <kpreid@mac.com>
11  * Add CSS styles to spiff up the Tahoe WUI's appearance, particularly the welcome page and directories.
12
13Sun May  3 16:33:25 EDT 2009  Kevin Reid <kpreid@mac.com>
14  * Tweak wording in directory page: not-read-only is "modifiable", mention creating a directory _in this directory_.
15
16Sun May  3 16:34:42 EDT 2009  Kevin Reid <kpreid@mac.com>
17  * Comment on duplication of code/markup found during styling project.
18
19New patches:
20
21[Fix broken link from Provisioning to Reliability page.
22Kevin Reid <kpreid@mac.com>**20090501191050
23 Ignore-this: 56dc1a5e659b70cc02dc4df7b5d518cd
24] hunk ./src/allmydata/provisioning.py 714
25             from allmydata import reliability
26             # we import this just to test to see if the page is available
27             _hush_pyflakes = reliability
28-            f = [T.div[T.a(href="reliability.html")["Reliability Math"]], f]
29+            f = [T.div[T.a(href="../reliability")["Reliability Math"]], f]
30         except ImportError:
31             pass
32 
33[Link all Tahoe web pages to the /tahoe_css stylesheet which already exists.
34Kevin Reid <kpreid@mac.com>**20090503202533
35 Ignore-this: 2ea8d14d3168b9502cf39d5ea3f2f2a8
36] {
37hunk ./src/allmydata/web/check-and-repair-results.xhtml 4
38 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
39   <head>
40     <title>AllMyData - Tahoe - Check Results</title>
41-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
42-          rel="stylesheet" type="text/css"/> -->
43+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
44     <link href="/webform_css" rel="stylesheet" type="text/css"/>
45     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
46   </head>
47hunk ./src/allmydata/web/check-results.xhtml 4
48 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
49   <head>
50     <title>AllMyData - Tahoe - Check Results</title>
51-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
52-          rel="stylesheet" type="text/css"/> -->
53+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
54     <link href="/webform_css" rel="stylesheet" type="text/css"/>
55     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
56   </head>
57hunk ./src/allmydata/web/deep-check-and-repair-results.xhtml 4
58 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
59   <head>
60     <title>AllMyData - Tahoe - Deep Check Results</title>
61-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
62-          rel="stylesheet" type="text/css"/> -->
63+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
64     <link href="/webform_css" rel="stylesheet" type="text/css"/>
65     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
66     <meta n:render="refresh" />
67hunk ./src/allmydata/web/deep-check-results.xhtml 4
68 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
69   <head>
70     <title>AllMyData - Tahoe - Deep Check Results</title>
71-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
72-          rel="stylesheet" type="text/css"/> -->
73+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
74     <link href="/webform_css" rel="stylesheet" type="text/css"/>
75     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
76     <meta n:render="refresh" />
77hunk ./src/allmydata/web/directory.xhtml 1
78-<html xmlns:n="http://nevow.com/ns/nevow/0.1">
79-  <head>
80-    <title n:render="title"></title>
81-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
82-          rel="stylesheet" type="text/css"/> -->
83-    <link href="/webform_css" rel="stylesheet" type="text/css"/>
84-    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
85-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
86-  </head>
87-  <body>
88+<html xmlns:n="http://nevow.com/ns/nevow/0.1"><head>
89+  <title n:render="title"></title>
90+  <link href="/webform_css" rel="stylesheet" type="text/css"/>
91+  <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
92+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
93+</head><body class="tahoe-directory-page">
94 
95 <h2 n:render="header"></h2>
96 
97hunk ./src/allmydata/web/download-status.xhtml 4
98 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
99   <head>
100     <title>AllMyData - Tahoe - File Download Status</title>
101-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
102-          rel="stylesheet" type="text/css"/> -->
103+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
104     <link href="/webform_css" rel="stylesheet" type="text/css"/>
105     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
106   </head>
107hunk ./src/allmydata/web/helper.xhtml 4
108 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
109   <head>
110     <title>Helper Status - AllMyData Tahoe</title>
111-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
112-          rel="stylesheet" type="text/css"/> -->
113+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
114     <link href="/webform_css" rel="stylesheet" type="text/css"/>
115     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
116   </head>
117hunk ./src/allmydata/web/info.xhtml 1
118-<html xmlns:n="http://nevow.com/ns/nevow/0.1">
119-  <head>
120-    <title n:render="title"></title>
121-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
122-          rel="stylesheet" type="text/css"/> -->
123-    <link href="/webform_css" rel="stylesheet" type="text/css"/>
124-    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
125-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
126-  </head>
127-  <body>
128+<html xmlns:n="http://nevow.com/ns/nevow/0.1"><head>
129+  <title n:render="title"></title>
130+  <!-- <link href="http://www.allmydata.com/common/css/styles.css"
131+        rel="stylesheet" type="text/css"/> -->
132+  <link href="/webform_css" rel="stylesheet" type="text/css"/>
133+  <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
134+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
135 
136 <h2 n:render="header"></h2>
137 
138hunk ./src/allmydata/web/literal-check-results.xhtml 4
139 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
140   <head>
141     <title>AllMyData - Tahoe - Check Results</title>
142-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
143-          rel="stylesheet" type="text/css"/> -->
144+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
145     <link href="/webform_css" rel="stylesheet" type="text/css"/>
146     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
147   </head>
148hunk ./src/allmydata/web/manifest.xhtml 4
149 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
150   <head>
151     <title n:render="title"></title>
152-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
153-          rel="stylesheet" type="text/css"/> -->
154+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
155     <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
156     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
157     <meta n:render="refresh" />
158hunk ./src/allmydata/web/map-update-status.xhtml 4
159 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
160   <head>
161     <title>AllMyData - Tahoe - Mutable File Servermap Update Status</title>
162-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
163-          rel="stylesheet" type="text/css"/> -->
164+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
165     <link href="/webform_css" rel="stylesheet" type="text/css"/>
166     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
167   </head>
168hunk ./src/allmydata/web/provisioning.xhtml 4
169 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
170   <head>
171     <title>AllMyData - Tahoe - Provisioning Tool</title>
172-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
173-          rel="stylesheet" type="text/css"/> -->
174+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
175     <link href="/webform_css" rel="stylesheet" type="text/css"/>
176     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
177   </head>
178hunk ./src/allmydata/web/publish-status.xhtml 4
179 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
180   <head>
181     <title>AllMyData - Tahoe - Mutable File Publish Status</title>
182-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
183-          rel="stylesheet" type="text/css"/> -->
184+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
185     <link href="/webform_css" rel="stylesheet" type="text/css"/>
186     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
187   </head>
188hunk ./src/allmydata/web/reliability.xhtml 4
189 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
190   <head>
191     <title>AllMyData - Tahoe - Reliability Tool</title>
192-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
193-          rel="stylesheet" type="text/css"/> -->
194+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
195     <link href="/webform_css" rel="stylesheet" type="text/css"/>
196     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
197   </head>
198hunk ./src/allmydata/web/rename-form.xhtml 4
199 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
200   <head>
201     <title n:render="title"></title>
202-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
203-          rel="stylesheet" type="text/css"/> -->
204+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
205     <link href="/webform_css" rel="stylesheet" type="text/css"/>
206     <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
207     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
208hunk ./src/allmydata/web/retrieve-status.xhtml 4
209 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
210   <head>
211     <title>AllMyData - Tahoe - Mutable File Retrieve Status</title>
212-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
213-          rel="stylesheet" type="text/css"/> -->
214+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
215     <link href="/webform_css" rel="stylesheet" type="text/css"/>
216     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
217   </head>
218hunk ./src/allmydata/web/statistics.xhtml 4
219 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
220   <head>
221     <title>Stats - AllMyData Tahoe</title>
222-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
223-          rel="stylesheet" type="text/css"/> -->
224+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
225     <link href="/webform_css" rel="stylesheet" type="text/css"/>
226     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
227   </head>
228hunk ./src/allmydata/web/status.xhtml 4
229 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
230   <head>
231     <title>AllMyData - Tahoe - Current Uploads/Downloads</title>
232-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
233-          rel="stylesheet" type="text/css"/> -->
234     <link href="/webform_css" rel="stylesheet" type="text/css"/>
235hunk ./src/allmydata/web/status.xhtml 5
236+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
237     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
238   </head>
239   <body>
240hunk ./src/allmydata/web/upload-results.xhtml 4
241 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
242   <head>
243     <title>AllMyData - Tahoe - File Uploaded</title>
244-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
245-          rel="stylesheet" type="text/css"/> -->
246+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
247     <link href="/webform_css" rel="stylesheet" type="text/css"/>
248     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
249   </head>
250hunk ./src/allmydata/web/upload-status.xhtml 4
251 <html xmlns:n="http://nevow.com/ns/nevow/0.1">
252   <head>
253     <title>AllMyData - Tahoe - File Upload Status</title>
254-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
255-          rel="stylesheet" type="text/css"/> -->
256+    <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
257     <link href="/webform_css" rel="stylesheet" type="text/css"/>
258     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
259   </head>
260hunk ./src/allmydata/web/welcome.xhtml 1
261-<html xmlns:n="http://nevow.com/ns/nevow/0.1">
262-  <head>
263-    <title>AllMyData - Tahoe</title>
264-    <!-- <link href="http://www.allmydata.com/common/css/styles.css"
265-          rel="stylesheet" type="text/css"/> -->
266-    <link href="/webform_css" rel="stylesheet" type="text/css"/>
267-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
268-  </head>
269-  <body>
270+<html xmlns:n="http://nevow.com/ns/nevow/0.1"><head>
271+  <title>AllMyData - Tahoe - Welcome</title>
272+  <link href="/webform_css" rel="stylesheet" type="text/css"/>
273+  <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
274+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
275+</head><body>
276 
277 <h1>Welcome To AllMyData "Tahoe"!</h1>
278 
279}
280[Modify markup of Tahoe web pages to be more amenable to styling; some minor changes of wording.
281Kevin Reid <kpreid@mac.com>**20090503202802
282 Ignore-this: b7ab1b3c38553fd1f7cd9b351f3deda6
283] {
284hunk ./src/allmydata/web/check_results.py 100
285             for (serverid, si, shnum) in data["list-corrupt-shares"]:
286                 nickname = c.get_nickname_for_peerid(serverid)
287                 badsharemap.append(T.tr[T.td["sh#%d" % shnum],
288-                                        T.td[T.tt[base32.b2a(serverid)],
289-                                             " (", nickname, ")"],
290+                                        T.td[T.div(class_="nickname")[nickname],
291+                                              T.div(class_="nodeid")[T.tt[base32.b2a(serverid)]]],
292                                         ])
293hunk ./src/allmydata/web/check_results.py 103
294-            add("Corrupt shares", T.table(border="1")[badsharemap])
295+            add("Corrupt shares", T.table()[
296+                T.tr[T.th["Share ID"],
297+                     T.th(class_="nickname-and-peerid")[T.div["Nickname"], T.div(class_="nodeid")["Node ID"]]],
298+                badsharemap])
299         else:
300             add("Corrupt shares", "none")
301 
302hunk ./src/allmydata/web/check_results.py 126
303                     shareid_s = shareid
304                 nickname = c.get_nickname_for_peerid(serverid)
305                 sharemap.append(T.tr[T.td[shareid_s],
306-                                     T.td[T.tt[base32.b2a(serverid)],
307-                                          " (", nickname, ")"],
308+                                     T.td[T.div(class_="nickname")[nickname],
309+                                          T.div(class_="nodeid")[T.tt[base32.b2a(serverid)]]]
310                                      ])
311         add("Good Shares (sorted in share order)",
312hunk ./src/allmydata/web/check_results.py 130
313-            T.table(border="1")[sharemap])
314+            T.table()[T.tr[T.th["Share ID"], T.th(class_="nickname-and-peerid")[T.div["Nickname"], T.div(class_="nodeid")["Node ID"]]],
315+                      sharemap])
316 
317 
318         add("Recoverable Versions", data["count-recoverable-versions"])
319hunk ./src/allmydata/web/check_results.py 150
320             shareids = servers.get(serverid, [])
321             shareids.reverse()
322             shareids_s = [ T.tt[shareid, " "] for shareid in sorted(shareids) ]
323-            servermap.append(T.tr[T.td[T.tt[base32.b2a(serverid)],
324-                                       " (", nickname, ")"],
325-                                  T.td[shareids_s] ])
326+            servermap.append(T.tr[T.td[T.div(class_="nickname")[nickname],
327+                                       T.div(class_="nodeid")[T.tt[base32.b2a(serverid)]]],
328+                                  T.td[shareids_s],
329+                                  ])
330             num_shares_left -= len(shareids)
331             if not num_shares_left:
332                 break
333hunk ./src/allmydata/web/check_results.py 158
334         add("Share Balancing (servers in permuted order)",
335-            T.table(border="1")[servermap])
336+            T.table()[T.tr[T.th(class_="nickname-and-peerid")[T.div["Nickname"], T.div(class_="nodeid")["Node ID"]], T.th["Share IDs"]],
337+                      servermap])
338 
339         return T.ul[r]
340 
341hunk ./src/allmydata/web/deep-check-and-repair-results.xhtml 72
342 <div n:render="return" />
343 
344 <div>
345-<table n:render="sequence" n:data="all_objects" border="1">
346+<table n:render="sequence" n:data="all_objects">
347   <tr n:pattern="header">
348     <td>Relative Path</td>
349     <td>Healthy Pre-Repair</td>
350hunk ./src/allmydata/web/deep-check-results.xhtml 46
351 <div n:render="corrupt_shares_p">
352 <h2>Corrupt Shares</h2>
353 <p>If repair fails, these shares need to be manually inspected and removed.</p>
354-<table n:render="sequence" n:data="corrupt_shares" border="1">
355+<table n:render="sequence" n:data="corrupt_shares">
356   <tr n:pattern="header">
357     <td>Server</td>
358     <td>Server Nickname</td>
359hunk ./src/allmydata/web/deep-check-results.xhtml 66
360 
361 <div>
362 <h2>All Results</h2>
363-<table n:render="sequence" n:data="all_objects" border="1">
364+<table n:render="sequence" n:data="all_objects">
365   <tr n:pattern="header">
366     <td>Relative Path</td>
367     <td>Healthy</td>
368hunk ./src/allmydata/web/directory.py 532
369 
370     def render_header(self, ctx, data):
371         si_s = abbreviated_dirnode(self.node)
372-        header = ["Directory SI=%s" % si_s]
373+        header = ["Directory SI=", T.span(class_="data-chars")[si_s]]
374         if self.node.is_readonly():
375             header.append(" (readonly)")
376         return ctx.tag[header]
377hunk ./src/allmydata/web/directory.xhtml 8
378   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
379 </head><body class="tahoe-directory-page">
380 
381-<h2 n:render="header"></h2>
382+<h1 n:render="header"></h1>
383 
384hunk ./src/allmydata/web/directory.xhtml 10
385-<div><a href=".">Refresh this view</a></div>
386-<div n:render="welcome" />
387+<div class="toolbar">
388+  <div class="toolbar-item" n:render="welcome" />
389+  <div class="toolbar-item"><a href=".">Refresh</a></div>
390 
391hunk ./src/allmydata/web/directory.xhtml 14
392-<div><a href="?t=info">More info on this directory</a></div>
393-<div n:render="show_readonly" />
394+  <div class="toolbar-item"><a href="?t=info">More info on this directory</a></div>
395+  <div class="toolbar-item" n:render="show_readonly" />
396+</div>
397 
398 <div n:render="try_children">
399hunk ./src/allmydata/web/directory.xhtml 19
400-<table n:render="sequence" n:data="children" border="1">
401-  <tr n:pattern="header">
402-    <td>Filename</td>
403-    <td>Type</td>
404-    <td>Size</td>
405-    <td>Times</td>
406-    <td></td>
407-    <td></td>
408-    <td></td>
409-  </tr>
410-  <tr n:pattern="item" n:render="row">
411-    <td><n:slot name="filename"/></td>
412-    <td><n:slot name="type"/></td>
413-    <td><n:slot name="size"/></td>
414-    <td><n:slot name="times"/></td>
415-    <td><n:slot name="delete"/></td>
416-    <td><n:slot name="rename"/></td>
417-    <td><n:slot name="info"/></td>
418-  </tr>
419+  <table class="tahoe-directory" n:render="sequence" n:data="children">
420+    <tr n:pattern="header">
421+      <th>Type</th>
422+      <th>Filename</th>
423+      <th>Size</th>
424+      <th>Times</th>
425+      <th></th>
426+      <th></th>
427+      <th></th>
428+    </tr>
429+    <tr n:pattern="item" n:render="row">
430+      <td><n:slot name="type"/></td>
431+      <td><n:slot name="filename"/></td>
432+      <td><n:slot name="size"/></td>
433+      <td><n:slot name="times"/></td>
434+      <td><n:slot name="delete"/></td>
435+      <td><n:slot name="rename"/></td>
436+      <td><n:slot name="info"/></td>
437+    </tr>
438 
439hunk ./src/allmydata/web/directory.xhtml 39
440-  <tr n:pattern="empty"><td>directory is empty</td></tr>
441+    <tr n:pattern="empty"><td colspan="9" class="empty-marker">This directory is empty.</td></tr>
442 
443hunk ./src/allmydata/web/directory.xhtml 41
444-</table>
445+  </table>
446 </div>
447 
448hunk ./src/allmydata/web/directory.xhtml 44
449+<div class="tahoe-directory-footer">
450+  <div n:render="forms"/>
451 
452hunk ./src/allmydata/web/directory.xhtml 47
453-<div n:render="forms"/>
454-
455-<div class="results" n:render="results"/>
456+  <div class="results" n:render="results"/>
457+</div>
458 
459hunk ./src/allmydata/web/directory.xhtml 50
460-  </body>
461-</html>
462+</body></html>
463hunk ./src/allmydata/web/info.xhtml 9
464   <link href="/tahoe_css" rel="stylesheet" type="text/css"/>
465   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
466 
467-<h2 n:render="header"></h2>
468+</head><body>
469+
470+<h1 n:render="header"></h1>
471 
472 <ul>
473   <li>Object Type: <span n:render="type" /></li>
474hunk ./src/allmydata/web/info.xhtml 17
475   <li>Storage Index: <tt n:render="si" /></li>
476   <li>Object Size: <span n:render="size" /></li>
477-  <li>Access Caps (URIs):
478-  <table border="1">
479+  <li>Access Caps (Tahoe-URIs):
480+  <table class="table-headings-left">
481     <span n:render="is_directory">
482     <tr>
483hunk ./src/allmydata/web/info.xhtml 21
484-      <td>Directory writecap</td>
485-      <td><tt n:render="directory_writecap" /></td>
486+      <th>Directory writecap</th>
487+      <td><tt class="data-chars" n:render="directory_writecap" /></td>
488     </tr>
489     <tr>
490hunk ./src/allmydata/web/info.xhtml 25
491-      <td>Directory readcap</td>
492-      <td><tt n:render="directory_readcap" /></td>
493+      <th>Directory readcap</th>
494+      <td><tt class="data-chars" n:render="directory_readcap" /></td>
495     </tr>
496     <tr>
497hunk ./src/allmydata/web/info.xhtml 29
498-      <td>Directory verifycap</td>
499-      <td><tt n:render="directory_verifycap" /></td>
500+      <th>Directory verifycap</th>
501+      <td><tt class="data-chars" n:render="directory_verifycap" /></td>
502     </tr>
503     </span>
504 
505hunk ./src/allmydata/web/info.xhtml 35
506     <tr>
507-      <td>File writecap</td>
508-      <td><tt n:render="file_writecap" /></td>
509+      <th>File writecap</th>
510+      <td><tt class="data-chars" n:render="file_writecap" /></td>
511     </tr>
512     <tr>
513hunk ./src/allmydata/web/info.xhtml 39
514-      <td>File readcap</td>
515-      <td><tt n:render="file_readcap" /></td>
516+      <th>File readcap</th>
517+      <td><tt class="data-chars" n:render="file_readcap" /></td>
518     </tr>
519     <tr>
520hunk ./src/allmydata/web/info.xhtml 43
521-      <td>File verifycap</td>
522-      <td><tt n:render="file_verifycap" /></td>
523+      <th>File verifycap</th>
524+      <td><tt class="data-chars" n:render="file_verifycap" /></td>
525     </tr>
526   </table></li>
527   <li><a href="?t=json">JSON</a></li>
528hunk ./src/allmydata/web/info.xhtml 69
529   <div n:render="manifest_form" />
530 </div>
531 
532-
533-  </body>
534-</html>
535+</body></html>
536hunk ./src/allmydata/web/introducer.xhtml 24
537 <h2>Service Announcements</h2>
538 
539 <div>
540-<table n:render="sequence" n:data="services" border="1">
541+<table n:render="sequence" n:data="services">
542   <tr n:pattern="header">
543     <td>PeerID / Nickname</td>
544     <td>Advertised IPs</td>
545hunk ./src/allmydata/web/introducer.xhtml 46
546 <h2>Subscribed Clients</h2>
547 
548 <div>
549-<table n:render="sequence" n:data="subscribers" border="1">
550+<table n:render="sequence" n:data="subscribers">
551   <tr n:pattern="header">
552     <td>PeerID / Nickname</td>
553     <td>Advertised IPs</td>
554hunk ./src/allmydata/web/introweb.py 70
555     def data_version(self, ctx, data):
556         return get_package_versions_string()
557     def data_import_path(self, ctx, data):
558-        return str(allmydata)
559+        return str(allmydata).replace("/", "/ ") # XXX kludge for wrapping
560     def data_my_nodeid(self, ctx, data):
561         return idlib.nodeid_b2a(self.introducer_node.nodeid)
562 
563hunk ./src/allmydata/web/manifest.xhtml 15
564 
565 <h2 n:render="reload" />
566 
567-<table n:render="sequence" n:data="items" border="1">
568+<table n:render="sequence" n:data="items">
569   <tr n:pattern="header">
570     <td>Path</td>
571     <td>cap</td>
572hunk ./src/allmydata/web/reliability.xhtml 45
573 </ul>
574 
575 <div>
576-<table n:render="sequence" n:data="simulation_table" border="1">
577+<table n:render="sequence" n:data="simulation_table">
578   <tr n:pattern="header">
579     <td>t</td>
580     <td>P_repair</td>
581hunk ./src/allmydata/web/root.py 278
582 
583         TIME_FORMAT = "%H:%M:%S %d-%b-%Y"
584         ctx.fillSlots("connected", connected)
585+        ctx.fillSlots("connected-bool", not not rsc.rref)
586         ctx.fillSlots("since", time.strftime(TIME_FORMAT, time.localtime(since)))
587         ctx.fillSlots("announced", time.strftime(TIME_FORMAT,
588                                                  time.localtime(rsc.announcement_time)))
589hunk ./src/allmydata/web/root.py 293
590                       enctype="multipart/form-data")[
591             T.fieldset[
592             T.legend(class_="freeform-form-label")["Download a file"],
593-            "URI to download: ",
594-            T.input(type="text", name="uri"), " ",
595-            "Filename to download as: ",
596-            T.input(type="text", name="filename"), " ",
597+            T.div["Tahoe-URI to download: ",
598+                  T.input(type="text", name="uri")],
599+            T.div["Filename to download as: ",
600+                  T.input(type="text", name="filename")],
601             T.input(type="submit", value="Download!"),
602             ]]
603         return T.div[form]
604hunk ./src/allmydata/web/root.py 308
605                       enctype="multipart/form-data")[
606             T.fieldset[
607             T.legend(class_="freeform-form-label")["View a file or directory"],
608-            "URI to view: ",
609+            "Tahoe-URI to view: ",
610             T.input(type="text", name="uri"), " ",
611             T.input(type="submit", value="View!"),
612             ]]
613hunk ./src/allmydata/web/root.py 320
614                       enctype="multipart/form-data")[
615             T.fieldset[
616             T.legend(class_="freeform-form-label")["Upload a file"],
617-            "Choose a file: ",
618-            T.input(type="file", name="file", class_="freeform-input-file"),
619+            T.div["Choose a file: ",
620+                  T.input(type="file", name="file", class_="freeform-input-file")],
621             T.input(type="hidden", name="t", value="upload"),
622hunk ./src/allmydata/web/root.py 323
623-            " Mutable?:", T.input(type="checkbox", name="mutable"),
624-            T.input(type="submit", value="Upload!"),
625+            T.div[T.input(type="checkbox", name="mutable"), T.label(for_="mutable")["Create mutable file"],
626+                  " ", T.input(type="submit", value="Upload!")],
627             ]]
628         return T.div[form]
629 
630hunk ./src/allmydata/web/root.py 333
631         form = T.form(action="uri", method="post",
632                       enctype="multipart/form-data")[
633             T.fieldset[
634-            T.legend(class_="freeform-form-label")["Create a directory."],
635+            T.legend(class_="freeform-form-label")["Create a directory"],
636             T.input(type="hidden", name="t", value="mkdir"),
637             T.input(type="hidden", name="redirect_to_result", value="true"),
638hunk ./src/allmydata/web/root.py 336
639-            T.input(type="submit", value="create directory"),
640+            T.input(type="submit", value="Create a directory"),
641             ]]
642         return T.div[form]
643 
644hunk ./src/allmydata/web/status.xhtml 14
645 
646 
647 <h2>Active Operations:</h2>
648-<table n:render="sequence" n:data="active_operations" border="1">
649+<table class="table-headings-top" n:render="sequence" n:data="active_operations">
650   <tr n:pattern="header">
651hunk ./src/allmydata/web/status.xhtml 16
652-    <td>Type</td>
653-    <td>Storage Index</td>
654-    <td>Helper?</td>
655-    <td>Total Size</td>
656-    <td>Progress</td>
657-    <td>Status</td>
658+    <th>Type</th>
659+    <th>Storage Index</th>
660+    <th>Helper?</th>
661+    <th>Total Size</th>
662+    <th>Progress</th>
663+    <th>Status</th>
664   </tr>
665   <tr n:pattern="item" n:render="row">
666     <td><n:slot name="type"/></td>
667hunk ./src/allmydata/web/status.xhtml 36
668 
669 
670 <h2>Recent Operations:</h2>
671-<table n:render="sequence" n:data="recent_operations" border="1">
672+<table class="table-headings-top" n:render="sequence" n:data="recent_operations">
673   <tr n:pattern="header">
674hunk ./src/allmydata/web/status.xhtml 38
675-    <td>Started</td>
676-    <td>Type</td>
677-    <td>Storage Index</td>
678-    <td>Helper?</td>
679-    <td>Total Size</td>
680-    <td>Progress</td>
681-    <td>Status</td>
682+    <th>Started</th>
683+    <th>Type</th>
684+    <th>Storage Index</th>
685+    <th>Helper?</th>
686+    <th>Total Size</th>
687+    <th>Progress</th>
688+    <th>Status</th>
689   </tr>
690   <tr n:pattern="item" n:render="row">
691     <td><n:slot name="started"/></td>
692hunk ./src/allmydata/web/welcome.xhtml 10
693 
694 <h1>Welcome To AllMyData "Tahoe"!</h1>
695 
696-<h2>Status of this Client</h2>
697+<div class="section" id="this-client">
698+  <h2>This Client</h2>
699 
700hunk ./src/allmydata/web/welcome.xhtml 13
701-<div>My nodeid: <span n:render="string" n:data="my_nodeid" /></div>
702-<div>My nickname: <span n:render="string" n:data="my_nickname" /></div>
703-<div>My versions: <span n:render="string" n:data="version" /></div>
704-<div>Tahoe code imported from: <span n:render="string" n:data="import_path" /></div>
705-<div n:render="services">Services Running:</div>
706+  <p>
707+    <a href="status/">Recent Uploads and Downloads</a>,
708+    <a href="statistics">Operational Statistics</a>
709+  </p>
710 
711hunk ./src/allmydata/web/welcome.xhtml 18
712-<div>
713-  <a href="status/">Recent Uploads and Downloads</a>,
714-  <a href="statistics">Operational Statistics</a>
715-</div>
716-
717-<h2>The Controls</h2>
718+  <table class="node-info table-headings-left">
719+    <tr><th>My nickname:</th> <td class="nickname mine" n:render="string" n:data="my_nickname" /></tr>
720+    <tr><th>My nodeid:</th> <td class="nodeid mine data-chars" n:render="string" n:data="my_nodeid" /></tr>
721+    <tr><th>My versions:</th> <td n:render="string" n:data="version" /></tr>
722+    <tr><th>Tahoe code imported from:</th> <td n:render="string" n:data="import_path" /></tr>
723+    <tr><th>Services running:</th> <td n:render="services" /></tr>
724+  </table>
725
726 
727hunk ./src/allmydata/web/welcome.xhtml 27
728-<div>There are also controls for each directory on that directory's page.</div>
729+</div>
730 
731hunk ./src/allmydata/web/welcome.xhtml 29
732-<div n:render="mkdir_form" />
733-<div n:render="view_form" />
734-<div n:render="upload_form" />
735-<div n:render="download_form" />
736+<div class="section" id="controls">
737+<h2>Controls</h2>
738 
739hunk ./src/allmydata/web/welcome.xhtml 32
740+  <p>There are also controls for each directory on that directory's page.</p>
741 
742hunk ./src/allmydata/web/welcome.xhtml 34
743-<h2>Status of the Storage Grid</h2>
744+  <div n:render="mkdir_form" />
745+  <div n:render="view_form" />
746+  <div n:render="upload_form" />
747+  <div n:render="download_form" />
748+</div>
749 
750hunk ./src/allmydata/web/welcome.xhtml 40
751-<div>Introducer: <span n:render="string" n:data="introducer_furl" /></div>
752-<div>Connected to introducer?: <span n:render="string" n:data="connected_to_introducer" /></div>
753+<div class="section" id="grid">
754+  <h2>Status of the Storage Grid</h2>
755 
756hunk ./src/allmydata/web/welcome.xhtml 43
757-<div>Helper: <span n:render="string" n:data="helper_furl" /></div>
758-<div>Connected to helper?: <span n:render="string" n:data="connected_to_helper" /></div>
759+  <div>
760+    <n:attr name="class">connected-<n:invisible n:render="string" n:data="connected_to_introducer" /></n:attr>
761+    <div>Introducer: <span class="data-chars" n:render="string" n:data="introducer_furl" /></div>
762+    <div>Connected to introducer?: <span n:render="string" n:data="connected_to_introducer" /></div>
763+  </div>
764 
765hunk ./src/allmydata/web/welcome.xhtml 49
766-<br />
767+  <div>
768+    <n:attr name="class">connected-<n:invisible n:render="string" n:data="connected_to_helper" /></n:attr>
769+    <div>Helper: <span n:render="string" n:data="helper_furl" /></div>
770+    <div>Connected to helper?: <span n:render="string" n:data="connected_to_helper" /></div>
771+  </div>
772 
773hunk ./src/allmydata/web/welcome.xhtml 55
774-<div>Known Storage Servers: <span n:render="string" n:data="known_storage_servers" /></div>
775-<div>Connected Storage Servers: <span n:render="string" n:data="connected_storage_servers" /></div>
776+  <p>Connected to <span n:render="string" n:data="connected_storage_servers" />
777+     of <span n:render="string" n:data="known_storage_servers" /> known storage servers:</p>
778 
779hunk ./src/allmydata/web/welcome.xhtml 58
780-<div>
781-<table n:render="sequence" n:data="services" border="1">
782-  <tr n:pattern="header">
783-    <td>PeerID</td>
784-    <td>Nickname</td>
785-    <td>Connected?</td>
786-    <td>Since</td>
787-    <td>Announced</td>
788-    <td>Version</td>
789-    <td>Service Name</td>
790-  </tr>
791-  <tr n:pattern="item" n:render="service_row">
792-    <td><tt><n:slot name="peerid"/></tt></td>
793-    <td><b><n:slot name="nickname"/></b></td>
794-    <td><tt><n:slot name="connected"/></tt></td>
795-    <td><tt><n:slot name="since"/></tt></td>
796-    <td><tt><n:slot name="announced"/></tt></td>
797-    <td><tt><n:slot name="version"/></tt></td>
798-    <td><tt><n:slot name="service_name"/></tt></td>
799-  </tr>
800-  <tr n:pattern="empty"><td>no peers!</td></tr>
801-</table>
802+  <div>
803+    <table class="services table-headings-top" n:render="sequence" n:data="services">
804+      <tr n:pattern="header">
805+        <th>Service Name</th>
806+        <th class="nickname-and-peerid">
807+            <div class="service-nickname">Nickname</div>
808+            <div class="nodeid data-chars">PeerID</div></th>
809+        <th>Connected?</th>
810+        <th>since</th>
811+        <th>First Announced</th>
812+        <th>Version</th>
813+      </tr>
814+      <tr n:pattern="item" n:render="service_row">
815+        <td class="service-service-name"><n:slot name="service_name"/></td>
816+        <td class="nickname-and-peerid">
817+          <div class="nickname"><n:slot name="nickname"/></div>
818+          <div class="nodeid data-chars"><n:slot name="peerid"/></div></td>
819+        <td>   
820+          <n:attr name="class">service-connected connected-<n:slot name="connected-bool"/></n:attr>
821+          <n:slot name="connected"/>
822+        </td>
823+        <td class="service-since">       <n:slot name="since"/></td>
824+        <td class="service-announced">   <n:slot name="announced"/></td>
825+        <td class="service-version">     <n:slot name="version"/></td>
826+      </tr>
827+      <tr n:pattern="empty"><td>no peers!</td></tr>
828+    </table>
829+  </div>
830 </div>
831 
832hunk ./src/allmydata/web/welcome.xhtml 88
833-<h2>Other Resources</h2>
834+<div class="section" id="other-resources">
835+  <h2>Other Resources</h2>
836 
837hunk ./src/allmydata/web/welcome.xhtml 91
838-<div>Please visit the <a href="http://allmydata.org">Tahoe home page</a> for
839-code updates and bug reporting.</div>
840+  <div>Please visit the <a href="http://allmydata.org">Tahoe home page</a> for
841+  code updates and bug reporting.</div>
842 
843hunk ./src/allmydata/web/welcome.xhtml 94
844-<div>The <a href="provisioning">provisioning tool</a> and <a
845-href="reliability">reliability calculator</a> may also be useful.</div>
846+  <div>The <a href="provisioning">provisioning tool</a> and <a
847+  href="reliability">reliability calculator</a> may also be useful.</div>
848 
849hunk ./src/allmydata/web/welcome.xhtml 97
850-<div n:render="incident_button" />
851+  <div n:render="incident_button" />
852+</div>
853 
854hunk ./src/allmydata/web/welcome.xhtml 100
855-  </body>
856-</html>
857+</body></html>
858}
859[Add CSS styles to spiff up the Tahoe WUI's appearance, particularly the welcome page and directories.
860Kevin Reid <kpreid@mac.com>**20090503203142
861 Ignore-this: 5c50af241c1a958b5180ef2b6a49f626
862] hunk ./src/allmydata/web/tahoe.css 9
863                padding: .25em;
864                overflow: auto;
865                }
866+               
867+/* ----------------------------------------------------------------------- */
868+
869+/* colors borrowed from the Allmydata logo */
870+
871+/* general style */
872+h1 {
873+  text-align: center;
874+}
875+table {
876+  margin: 1em auto;
877+  border: .2em solid #3289b4;
878+  border-spacing: 1px;
879+}
880+th {
881+  color: white;
882+  background-color: #58a1c3;
883+}
884+td { padding: .3em .3em; }
885+th { padding: .3em .3em; }
886+.table-headings-top th { text-align: center; }
887+.table-headings-left th { text-align: right; vertical-align: top; }
888+legend {
889+  font-weight: bold;
890+}
891+
892+.connected-yes, .connected-True {
893+  border: 1px solid #75d24a;
894+  background-color: #EFE;
895+}
896+.connected-no, .connected-False {
897+  border: 1px solid #F00;
898+  background-color: #FBB;
899+}
900+
901+.encoded, .nodeid {
902+  font-family: monospace;
903+  font-size: 80%;
904+}
905+
906+.empty-marker {
907+  background-color: white;
908+  color: gray;
909+}
910+table td.empty-marker {
911+  padding: 6em 10em;
912+  text-align: center;
913+  vertical-align: center;
914+}
915+
916+/* styles for server listings in tables (nickname above nodeid) */
917+th.nickname-and-peerid {
918+  text-align: left;
919+}
920+.nickname {
921+  font: inherit;
922+  font-family: sans-serif;
923+  font-weight: bold;
924+}
925+
926+
927+/* just in case, make sure floats don't stomp on big tables etc. */
928+#section { clear: both; }
929+
930+/* section-specific styles - turn this client info into a sidebar */
931+#this-client {
932+  font-size: 60%;
933+  border: .2em solid #3289b4;
934+  float: right;
935+  width: 40%;
936+  margin: 0 0 .5em .5em;
937+  padding: 3px;
938+}
939+#this-client .nodeid { font-size: inherit; }
940+#this-client h2 {
941+  text-align: center;
942+  background: #3289b4;
943+  color: white;
944+  margin: -2px -2px 0 -2px; /* matches padding */
945+  padding: .3em;
946+}
947+#this-client table {
948+  font-size: inherit;
949+  margin: 0 -3px -3px -3px; /* matches padding */
950+}
951+#this-client td > ul {
952+  list-style-type: outside;
953+  margin: 0 0 0 2.3em;
954+  padding-left: 0;
955+}
956+
957+
958+/* services table */
959+.services {
960+}
961+
962+/* --- Directory page styles --- */
963+
964+body.tahoe-directory-page {
965+  color: black;
966+  background: #c0d9e6;
967+  margin: 1em 0; /* zero margin so the table can be flush */
968+}
969+table.tahoe-directory {
970+  color: black;
971+  background: white;
972+  width: 100%;
973+  /*border-left-color: #D7E0E5;
974+  border-right-color: #D7E0E5;*/
975+  border-left: 0;
976+  border-right: 0;
977+}
978+.tahoe-directory-footer {
979+  color: black;
980+  background: #c0d9e6;
981+  margin: 0 1em; /* compensate for page 0 margin */
982+}
983+
984+/* directory-screen toolbar */
985+.toolbar {
986+  display: table;
987+  margin: .2em auto;
988+  /*width: 100%;*/
989+}
990+.toolbar .toolbar-item {
991+  display: table-cell;
992+  text-align: center;
993+  padding: 0 1em;
994+}
995[Tweak wording in directory page: not-read-only is "modifiable", mention creating a directory _in this directory_.
996Kevin Reid <kpreid@mac.com>**20090503203325
997 Ignore-this: d92c5de55be7dc1a07c55f5dbeee5556
998] {
999hunk ./src/allmydata/web/directory.py 527
1000 
1001     def render_title(self, ctx, data):
1002         si_s = abbreviated_dirnode(self.node)
1003-        header = ["Directory SI=%s" % si_s]
1004+        header = ["AllMyData - Tahoe - Directory SI=%s" % si_s]
1005+        if self.node.is_readonly():
1006+            header.append(" (read-only)")
1007+        else:
1008+            header.append(" (modifiable)")
1009         return ctx.tag[header]
1010 
1011     def render_header(self, ctx, data):
1012hunk ./src/allmydata/web/directory.py 538
1013         si_s = abbreviated_dirnode(self.node)
1014         header = ["Directory SI=", T.span(class_="data-chars")[si_s]]
1015         if self.node.is_readonly():
1016-            header.append(" (readonly)")
1017+            header.append(" (read-only)")
1018         return ctx.tag[header]
1019 
1020     def render_welcome(self, ctx, data):
1021hunk ./src/allmydata/web/directory.py 681
1022             T.fieldset[
1023             T.input(type="hidden", name="t", value="mkdir"),
1024             T.input(type="hidden", name="when_done", value="."),
1025-            T.legend(class_="freeform-form-label")["Create a new directory"],
1026+            T.legend(class_="freeform-form-label")["Create a new directory in this directory"],
1027             "New directory name: ",
1028             T.input(type="text", name="name"), " ",
1029             T.input(type="submit", value="Create"),
1030}
1031[Comment on duplication of code/markup found during styling project.
1032Kevin Reid <kpreid@mac.com>**20090503203442
1033 Ignore-this: a4b7f9f0ab57d2c03be9ba761be8d854
1034] {
1035hunk ./src/allmydata/web/check_results.py 115
1036         sharemap = []
1037         servers = {}
1038 
1039+        # FIXME: The two tables below contain nickname-and-nodeid table column markup which is duplicated with each other, introducer.xhtml, and deep-check-results.xhtml. All of these (and any other presentations of nickname-and-nodeid) should be combined.
1040+
1041         for shareid in sorted(data["sharemap"].keys()):
1042             serverids = data["sharemap"][shareid]
1043             for i,serverid in enumerate(serverids):
1044hunk ./src/allmydata/web/introweb.py 67
1045 
1046         return simplejson.dumps(res, indent=1) + "\n"
1047 
1048+    # FIXME: This code is duplicated in root.py and introweb.py.
1049     def data_version(self, ctx, data):
1050         return get_package_versions_string()
1051     def data_import_path(self, ctx, data):
1052hunk ./src/allmydata/web/root.py 180
1053     child_report_incident = IncidentReporter()
1054     #child_server # let's reserve this for storage-server-over-HTTP
1055 
1056+    # FIXME: This code is duplicated in root.py and introweb.py.
1057     def data_version(self, ctx, data):
1058         return get_package_versions_string()
1059     def data_import_path(self, ctx, data):
1060}
1061
1062Context:
1063
1064[.darcs-boringfile: also ignore .gitignore
1065warner@allmydata.com**20090415210550
1066 Ignore-this: d29db314a1e506f6240859559436b4c3
1067] 
1068[.darcs-boringfile: ignore .git, I'm starting to play around with it
1069warner@allmydata.com**20090415205929
1070 Ignore-this: 89234453516483c9586cd6e1351e88b5
1071] 
1072[fix quicktest: stop using setuptools, add misc/run-with-pythonpath.py, to make it run faster
1073warner@lothar.com**20090414201400] 
1074[TAG allmydata-tahoe-1.4.1
1075zooko@zooko.com**20090414025636
1076 Ignore-this: de78fc32364c83e9f4e26b5abcfdea4a
1077] 
1078Patch bundle hash:
1079f2f9942315b8a20cb649d9eedaa0a6b6cf0c6bdb