[Checkins] SVN: Sandbox/ulif/grokadmin/trunk/src/grokadmin/
Application overview for grokadmin.
Uli Fouquet
uli at gnufix.de
Sun Oct 7 14:03:05 EDT 2007
Log message for revision 80696:
Application overview for grokadmin.
Changed:
U Sandbox/ulif/grokadmin/trunk/src/grokadmin/app.py
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/applications.pt
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/grokadminmacros.pt
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/ftests/application/apps.py
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/GROK_Ornament3.jpg
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/banner-shadow.jpg
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-admin.jpg
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax.png
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax4.png
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax5.gif
A Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok.css
-=-
Modified: Sandbox/ulif/grokadmin/trunk/src/grokadmin/app.py
===================================================================
--- Sandbox/ulif/grokadmin/trunk/src/grokadmin/app.py 2007-10-07 13:32:29 UTC (rev 80695)
+++ Sandbox/ulif/grokadmin/trunk/src/grokadmin/app.py 2007-10-07 18:03:05 UTC (rev 80696)
@@ -13,8 +13,16 @@
##############################################################################
"""The Grok Administration and Development UI"""
+import zope.component
+
+from zope.app.broken.broken import IBroken
+from zope.interface import Interface
+from ZODB.broken import Broken
+
import grok
+grok.define_permission('grok.ManageApplications')
+
class GrokAdmin(grok.Application, grok.Container):
"""The Grok Administrators and Developers UI.
@@ -26,3 +34,129 @@
<grokadmin.app.GrokAdmin object at 0x...>
"""
+
+
+class Index(grok.View):
+ """A redirector to the real frontpage.
+ """
+ grok.name('index')
+ grok.require('grok.ManageApplications')
+
+ def render(self):
+ # Go to the first page immediately.
+ self.redirect(self.url('applications'))
+
+
+class GrokAdminMacros(grok.View):
+ """Provides the o-wrap layout."""
+ grok.context(Interface)
+
+
+class Applications(grok.View):
+ """View for application management.
+
+ """
+ grok.name('applications')
+ grok.require('grok.ManageApplications')
+
+ def getDocOfApp(self, apppath, headonly = True):
+ return ""
+ # XXX Reactivate docfinder...
+ doctor = docgrok.docgrok_handle(apppath)
+ result = doctor.getDoc(headonly)
+ if result is None:
+ result = ""
+ return result
+
+ def update(self):
+ # Available apps...
+ apps = zope.component.getAllUtilitiesRegisteredFor(
+ grok.interfaces.IApplication)
+ apps_folder = get_apps_folder(self.context)
+ self.applications = (
+ {'name': "%s.%s" % (x.__module__, x.__name__),
+ 'docurl':("%s.%s" % (x.__module__, x.__name__)).replace('.', '/')}
+ for x in apps)
+
+ # Installed apps...
+ inst_apps = [x for x in apps_folder.values()
+ if hasattr(x, '__class__') and x.__class__ in apps
+ and not issubclass(x.__class__, Broken)]
+ inst_apps.sort(lambda x, y: cmp(x.__name__, y.__name__))
+ self.installed_applications = inst_apps
+
+ # Broken apps...
+ broken_apps = [{'obj':y, 'name':x} for x,y in apps_folder.items()
+ if isinstance(y, Broken)]
+ broken_apps.sort(lambda x, y: cmp(x['name'], y['name']))
+ self.broken_applications = broken_apps
+
+
+class Add(grok.View):
+ """Add an application.
+ """
+ grok.require('grok.ManageApplications')
+
+ def update(self, inspectapp=None, application=None):
+ if inspectapp is not None:
+ self.redirect(self.url("docgrok") + "/%s/index"%(
+ application.replace('.','/'),))
+ return
+
+ def render(self, application, name, inspectapp=None):
+ if name is None or name == "":
+ self.redirect(self.url(self.context))
+ return
+ if name is None or name == "":
+ self.redirect(self.url(self.context))
+ return
+ app = zope.component.getUtility(grok.interfaces.IApplication,
+ name=application)
+ try:
+ apps_folder = get_apps_folder(self.context)
+ apps_folder[name] = app()
+ self.flash(u'Added %s `%s`.' % (application, name))
+ except DuplicationError:
+ self.flash(
+ u'Name `%s` already in use. Please choose another name.' % (
+ name,))
+ self.redirect(self.url(self.context))
+
+
+def get_apps_folder(context):
+ """Return a folder where apps can be added for a context.
+
+ For contexts, that have no parent, we return the context itself::
+
+ >>> from grokadmin.app import get_apps_folder
+ >>> from grokadmin.app import GrokAdmin
+ >>> admin = GrokAdmin()
+ >>> first_folder = get_apps_folder(admin)
+ >>> first_folder
+ <grokadmin.app.GrokAdmin object at 0x...>
+
+ >>> first_folder is admin
+ True
+
+ For contexts, that _have_ a parent, that parent is returned::
+
+ >>> admin2 = GrokAdmin()
+ >>> admin['subadmin'] = admin2
+ >>> second_folder = get_apps_folder(admin2)
+ >>> second_folder is first_folder
+ True
+
+ We only 'go up' one level::
+
+ >>> admin3 = GrokAdmin()
+ >>> admin2['subsubadmin'] = admin3
+ >>> third_folder = get_apps_folder(admin3)
+ >>> third_folder is admin2
+ True
+
+
+ """
+ if getattr(context, '__parent__', None) is None:
+ return context
+ return context.__parent__
+
Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/applications.pt
===================================================================
--- Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/applications.pt (rev 0)
+++ Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/applications.pt 2007-10-07 18:03:05 UTC (rev 80696)
@@ -0,0 +1,79 @@
+<html metal:use-macro="context/@@grokadminmacros/gaia-page">
+ <div metal:fill-slot="content">
+
+ <form tal:define="apps context/values"
+ tal:attributes="action string:${context/@@absolute_url}/delete">
+
+ <fieldset>
+ <legend>Installed applications</legend>
+
+ <div tal:condition="not: python: len(view.installed_applications)">
+ <p class="menu-description1">Currently no working applications are
+ installed.</p>
+ </div>
+
+ <div tal:condition="python: len(view.installed_applications) or True"
+ tal:repeat="app view/installed_applications">
+ <input type="checkbox"
+ class="checkbox"
+ tal:attributes="value app/__name__;
+ name string:items" />
+ <a tal:attributes="href string:${app/@@absolute_url}">
+ <span tal:replace="app/__name__"/>
+ (<span tal:replace="app/__class__/__name__"/>)
+ </a>
+
+ [<a href=""
+ tal:attributes="href string:${context/@@absolute_url}/${app/__name__}/@@inspect.html"
+ >object browser</a>]
+ </div>
+
+ <div tal:condition="view/broken_applications">
+ <br/><div class="emph">Broken applications:</div>
+ </div>
+ <div tal:repeat="app view/broken_applications">
+ <input type="checkbox"
+ class="checkbox"
+ tal:attributes="value app/name;
+ name string:items" />
+ <span tal:content="app/name" />
+ (broken type: <span tal:replace="string:${app/obj/__class__/__module__}.${app/obj/__class__/__name__}"/>). This application is broken!
+ </div>
+
+ <p>
+ <input tal:condition="python:len(view.installed_applications)+len(view.broken_applications) > 0"
+ class="button" type="submit" value="Delete Selected"/></p>
+ </fieldset>
+ </form>
+
+ <fieldset>
+ <legend>Add application</legend>
+
+ <div class="menu-box1"
+ tal:repeat="app view/applications">
+ <form action="" tal:attributes="action string:${context/@@absolute_url}/add;
+ name python: app['name'].split('.')[-1]">
+ <div class="menu-box2">
+ <div class="menu-head1"><a href=""
+ tal:attributes="href string:${context/@@absolute_url}/docgrok/${app/docurl}"
+ tal:content="app/name">Application Name</a></div>
+ <div class="menu-description1">
+ <span tal:replace="structure python: view.getDocOfApp(app['name']) or ''">
+ Application description here.
+ </span>
+ </div>
+ <div class="menu-box3">
+ <label>Name your new app: <input type="text" name="name"/></label>
+ <input type="hidden" name="application" value=""
+ tal:attributes="value app/name" />
+ <input class="button" type="submit" name="Add" value="Create"/>
+ </div>
+ </div>
+ </form>
+ </div>
+
+ </fieldset>
+
+ </div>
+
+</html>
Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/grokadminmacros.pt
===================================================================
--- Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/grokadminmacros.pt (rev 0)
+++ Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/grokadminmacros.pt 2007-10-07 18:03:05 UTC (rev 80696)
@@ -0,0 +1,128 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+ i18n:domain="zope"
+ metal:define-macro="gaia-page">
+ <head>
+ <title
+ metal:define-slot="title"
+ >grok administration interface</title>
+ <link metal:define-slot="header"
+ rel="stylesheet" type="text/css" href="static/grok.css"
+ tal:on-error="nothing"
+ tal:attributes="href view/static/grok.css" />
+ <metal:block define-slot="extrahead">
+ </metal:block>
+ </head>
+
+ <body>
+<!--
+ <div tal:condition="not:exists: view/root_url">
+ This template (grokadminmacros.pt in grok.admin) must be called
+ from a view with defined root_url.
+ </div>
+
+ <div tal:condition="exists: view/root_url">
+-->
+ <div>
+ <div id="banner">
+ <a href="/" id="logo">
+ <img alt="Grok" src="images/grok-admin.jpg" height="40"
+ tal:attributes="src view/static/grok-admin.jpg" />
+ </a>
+ </div>
+
+ <div id="logout" metal:define-macro="logged_user">
+<!--
+ <span tal:condition="view/is_authenticated">
+-->
+ <span tal:condition="request/principal/title">
+ <span i18n:translate="">User:
+ <span tal:replace="request/principal/title"
+ i18n:name="user_title">User</span>
+ </span>
+ </span>
+ </div>
+
+ <div id="breadcrumbs">
+ <div id="banner-shadow">
+
+ </div>
+ </div>
+ <div id="fireplace">
+ <img alt="grok_relax_image" src="images/grok-relax5.gif"
+ tal:attributes="src view/static/grok-relax5.gif" />
+ </div>
+ <div id="menu-links"
+ metal:define-slot="menu-links"
+ tal:define="currview python:view.url()">
+<!--
+ <span class="menu-link-inactive"
+ tal:define="target string:${view/root_url}/applications">
+-->
+ <span class="menu-link-inactive"
+ tal:define="target python:view.url('applications')">
+ <a href="applications"
+ tal:condition="python: target != currview"
+ tal:attributes="href target"
+ >Applications</a>
+ <span class="emph"
+ tal:condition="python: target == currview">
+ Applications
+ </span>
+ </span>
+
+<!--
+ <span class="menu-link-inactive"
+ tal:define="target string:${view/root_url}/server"
+ >
+-->
+ <span class="menu-link-inactive"
+ tal:define="target python:view.url('server')"
+ >
+ <a href="z3index"
+ tal:condition="python: target != currview"
+ tal:attributes="href target"
+ >Server Control</a>
+ <span class="emph"
+ tal:condition="python: target == currview">
+ Server Control
+ </span>
+ </span>
+<!--
+
+ <a href=""
+ tal:attributes="href view/root_url">Debug</a>
+-->
+
+<!--
+ <a href=""
+ tal:attributes="href string:${view/root_url}/docgrok/">
+-->
+ <a href=""
+ tal:attributes="href python:view.url('docgrok')">
+
+ <span tal:attributes="class python:getattr(view, 'in_docgrok', False) and 'emph'"
+ >Documentation</span>
+ </a>
+ </div>
+
+ <div id="content">
+
+ <div id="messages" tal:content="structure context/@@messages" />
+
+ <div metal:define-slot="content">
+
+ <h1>Welcome to Grok!</h1>
+
+ <div>
+ Your friendly and easy way to Zope 3.
+ </div>
+
+ </div>
+ <div>
+ <p id="footer-copyright">© Copyright 2007, The Zope Foundation<br />Design inspired by Sebastian Ware</p>
+ </div>
+ </div>
+
+ </div>
+ </body>
+</html>
Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/ftests/application/apps.py
===================================================================
--- Sandbox/ulif/grokadmin/trunk/src/grokadmin/ftests/application/apps.py (rev 0)
+++ Sandbox/ulif/grokadmin/trunk/src/grokadmin/ftests/application/apps.py 2007-10-07 18:03:05 UTC (rev 80696)
@@ -0,0 +1,121 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+===============================================
+Add and remove applications using ``GrokAdmin``
+===============================================
+
+Setup a testing environment::
+
+ >>> from zope.testbrowser.testing import Browser
+ >>> browser = Browser()
+ >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+ >>> root = getRootFolder()
+
+Now we install an instance of ``GrokAdmin`` named `admin`::
+
+ >>> from grokadmin.app import GrokAdmin
+ >>> root['admin'] = GrokAdmin()
+ >>> list(root.keys())
+ [u'admin']
+
+We fetch the standard page, which should provide us a menu to get all
+installable grok applications/components::
+
+ >>> browser.open("http://localhost/admin")
+ >>> print browser.contents
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ ...
+ ... <legend>Add application</legend>
+ ...
+
+The opening screen should inform us, that there is our GrokAdmin
+installed::
+
+ >>> print browser.contents
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ ...
+ ...<legend>Installed applications</legend>
+ ...
+ ...<a href="http://localhost/admin">
+ ...
+
+We are able to add a mammoth manager...
+
+ >>> subform = browser.getForm(name='MammothManager')
+ >>> subform.getControl('Name your new app:').value = 'my-mammoth-manager'
+ >>> subform.getControl('Create').click()
+
+ >>> print browser.contents
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ ...
+ ...<legend>Installed applications</legend>
+ ...
+ ...<a href="http://localhost/my-mammoth-manager">
+ ...
+
+Launch the added mammoth manager
+
+ >>> mylink = browser.getLink('my-mammoth-manager (MammothManager)').click()
+ >>> print browser.contents
+ Let's manage some mammoths!
+
+ >>> print browser.url
+ http://localhost/my-mammoth-manager
+
+"""
+"""
+
+We can go to the object browser for every installed application:
+
+ >>> browser.open("http://localhost/applications")
+ >>> browser.getLink('object browser').click()
+ >>> print browser.contents
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ ...
+ ...<span ...>...<a href=...>MammothManager</a> object at ...></span>
+ ...
+
+We are able to delete installed mammoth-managers
+
+ >>> browser.open("http://localhost/applications")
+ >>> print browser.contents
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ ...
+ ... <legend>Installed applications</legend>
+ ...
+ >>> ctrl = browser.getControl(name='items')
+ >>> ctrl.getControl(value='my-mammoth-manager').selected = True
+ >>> browser.getControl('Delete Selected').click()
+ >>> print browser.contents
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ ...
+ ... <p ...>Currently no working applications...are installed.</p>
+ ...
+ ...<legend>Add application</legend>
+ ...
+
+"""
+
+import grok
+
+class MammothManager(grok.Application, grok.Container):
+ """A mammoth manager"""
+ pass
+
+class Index(grok.View):#
+
+ def render(self):
+ return u"Let's manage some mammoths!"
Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/GROK_Ornament3.jpg
===================================================================
(Binary files differ)
Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/GROK_Ornament3.jpg
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/banner-shadow.jpg
===================================================================
(Binary files differ)
Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/banner-shadow.jpg
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-admin.jpg
===================================================================
(Binary files differ)
Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-admin.jpg
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax.png
===================================================================
(Binary files differ)
Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax4.png
===================================================================
(Binary files differ)
Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax4.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax5.gif
===================================================================
(Binary files differ)
Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax5.gif
___________________________________________________________________
Name: svn:executable
+ *
Name: svn:mime-type
+ application/octet-stream
Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok.css
===================================================================
--- Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok.css (rev 0)
+++ Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok.css 2007-10-07 18:03:05 UTC (rev 80696)
@@ -0,0 +1,327 @@
+/* @override http://www.urbantalk.se/DEVELOPER/grok_2/grok.css */
+
+/* ---- general styling elements ---- */
+body {
+background:#fff;
+color:#555;
+font-family:verdana;
+font-size:0.8em;
+margin:0;
+}
+
+h1 {
+border-bottom:1px solid #C90;
+color:#C90;
+font-family:verdana;
+font-size:1.5em;
+text-align:left;
+width:100%;
+}
+
+h2 {
+border-bottom:1px dotted #ccc;
+color:#C90;
+font-family:verdana;
+font-size:1.3em;
+width:100%;
+}
+
+h3 {
+color:#555;
+font-family:verdana;
+font-size:1.2em;
+width:100%;
+}
+
+p {
+color:#555;
+font-family:verdana;
+font-size:1em;
+}
+
+a:link,a:visited {
+border-bottom-style:dotted;
+border-bottom-width:1px;
+color:#555;
+text-decoration:none;
+}
+
+a:hover {
+background-color:#fff;
+border-bottom-style:dotted;
+border-width:0.1em;
+color:#C90;
+}
+
+img {
+ border:none;
+}
+
+pre {
+background:#eee;
+border-bottom:1px solid #ddd;
+border-top:1px solid #ccc;
+color:#A90101;
+font-family:courier;
+font-size:1.1em;
+margin:0.8em auto;
+padding:1.6em 0.8em;
+}
+
+ul {
+color:#555;
+font-family:verdana;
+font-size:1.1em;
+list-style-type:none;
+margin:1.6em auto;
+}
+
+li {
+left:0;
+margin:0 5em 0 0;
+padding:0;
+}
+
+div#banner {
+background:#cc9900 url("GROK_Ornament3.jpg") repeat-x;
+height:40px;
+}
+
+div#banner-shadow {
+margin-left:1.3em;
+}
+
+div#banner a,div#banner a:hover,div#banner a:visited, div#banner a:link {
+border:none;
+}
+
+div#logo {
+border:none;
+}
+
+div#fireplace {
+position: absolute;
+right: 0px;
+top: 5px;
+width: 160px;
+height: 75px;
+}
+
+div#breadcrumbs {
+}
+
+div#content {
+margin-left:5%;
+margin-right:5%;
+text-align:left;
+}
+
+#footer-copyright {
+font-size:0.9em;
+text-align:center;
+}
+
+/* ---- form and form-like elements ----- */
+form {
+clear:both;
+}
+
+input, select {
+border:1px solid #C90;
+margin:0;
+padding:0;
+}
+
+.button {
+background-color:#ccc;
+font-size:1em;
+padding:0;
+margin:0;
+}
+
+fieldset {
+position: relative;
+margin-top:1em;
+padding:0.75em;
+border:1px solid #c90;
+text-align:left;
+background-color:#f9f9D4;
+}
+
+legend {
+position:absolute;
+top:-0.8em;
+left:0.5em;
+color:#C90;
+font-family:verdana;
+font-size:1.2em;
+font-weight:700;
+background-color:#fff;
+}
+
+a.button {
+border-bottom:groove #C90 2px;
+color:#000;
+padding:0 0.2em 0.2em;
+}
+
+a:hover.button {
+background-color:#ccc;
+border:groove #C90 2px;
+border-bottom:groove #C90 2px;
+color:#000;
+padding:0 0.2em 0.2em;
+}
+
+.checkbox {
+border:groove #C90 2px;
+}
+
+/* ----- menu elements ----- */
+#menu {
+color:#A90101;
+font-family:verdana;
+font-size:1.1em;
+}
+
+div#menu-links {
+margin-left:5%;
+margin-right:5%;
+text-align:center;
+}
+
+.menu-box1 {
+padding:0.5em;
+}
+
+.menu-box2 {
+background-color:#fff4be;
+border:1px solid #fc9;
+padding:0.5em;
+}
+
+.menu-description1 {
+margin-left:1.5em;
+}
+
+.menu-label1 {
+width: 40em;
+}
+
+/* ---- docgrok related ---- */
+.docgrok-entry {
+margin-bottom:0.5em;
+}
+
+.docgrok-value {
+margin-left:2em;
+}
+
+.docgrok-pathvalue {
+font-family:courier;
+}
+
+.docgrok-annotation1 {
+margin-left:2em;
+}
+
+.docgrok-annotation2 {
+margin-left:5em;
+}
+
+.docgrok-pycode1 {
+color:#00f;
+font-family:courier;
+}
+
+.docgrok-sourcetext {
+background-color:#f8f8f8;
+border:2px groove #eee;
+margin:1em;
+padding:1.5em;
+}
+
+.docgrok-sourceheader {
+background-color:#fff;
+}
+
+.docgrok-table {
+font-size:1.0em;
+empty-cells:show;
+border-collapse:separate;
+}
+.docgrok-table th {
+padding-left:3px;
+padding-right:3px;
+border:1px solid #eee;
+}
+.docgrok-table td {
+min-height:1.0em;
+padding-left:5px;
+padding-right:5px;
+
+}
+
+/* --- system proces related --- */
+div#server-processes {
+background-color:#f9f9D4;
+border:1px solid #cc9900;
+padding:0.75em;
+}
+
+div#server-processes dl {
+margin-top:-0.5em;
+padding-top:0;
+}
+
+div#server-processes dt.emph {
+background:url(banner-shadow.jpg) top left repeat-x;
+border:1px solid grey;
+margin-left:0;
+margin-top:0.5em;
+padding-left:0.75em;
+}
+
+div#server-processes dd {
+border:1px solid grey;
+border-top:none;
+margin-left:0;
+padding-left:0.75em;
+}
+
+div#server-processes ul {
+margin:0;
+padding:0;
+}
+
+/* ----- misc elements ----- */
+.huge {
+font-size:1.6em;
+text-align:center;
+}
+
+.rightalign {
+text-align:right;
+}
+
+.emph,.menu-head1,.docgrok-description1 {
+font-weight:700;
+}
+
+.header {
+color:#C90;
+clear:both;
+display:block;
+font-family:verdana;
+font-size:1.2em;
+font-weight:700;
+padding-top:1em;
+padding-left:0.8em;
+}
+
+#logout {
+padding:1px;
+padding-right:150px;
+background-color:#ddd;
+text-align:right;
+}
\ No newline at end of file
More information about the Checkins
mailing list