Skip to content
This repository has been archived by the owner on Jan 1, 2023. It is now read-only.

Commit

Permalink
Added less work file, added big badge icon, changed wiki page element…
Browse files Browse the repository at this point in the history
… injection.
  • Loading branch information
Ivan Choo committed Mar 11, 2012
1 parent a9c2b34 commit 2201c7d
Show file tree
Hide file tree
Showing 11 changed files with 227 additions and 95 deletions.
Binary file added wikisync/htdocs/images/status-conflict-big.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wikisync/htdocs/images/status-ignored-big.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wikisync/htdocs/images/status-missing-big.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wikisync/htdocs/images/status-modified-big.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wikisync/htdocs/images/status-new-big.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wikisync/htdocs/images/status-outdated-big.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wikisync/htdocs/images/status-synced-big.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wikisync/htdocs/images/status-unknown-big.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
107 changes: 32 additions & 75 deletions wikisync/htdocs/wikisync.css
Original file line number Diff line number Diff line change
@@ -1,75 +1,32 @@
.wikisync .conflict {
background-image: url('images/status-conflict.png');
}
.wikisync .ignored {
background-image: url('images/status-ignored.png');
}
.wikisync .missing {
background-image: url('images/status-missing.png');
}
.wikisync .modified {
background-image: url('images/status-modified.png');
}
.wikisync .new {
background-image: url('images/status-new.png');
}
.wikisync .outdated {
background-image: url('images/status-outdated.png');
}
.wikisync .synced {
background-image: url('images/status-synced.png');
}
.wikisync .unknown {
background-image: url('images/status-unknown.png');
}
.wikisync li {
list-style: none;
padding-left: 68px;
background-repeat: no-repeat;
background-position: left center;
line-height: 1.4em;
overflow: hidden;
}
.wikisync i {
color: #999;
}
.wikisync .nested {
margin-left: -80px;
}
.wikisync .controls {
display: none;
float: right;
padding-right: 12px;
}
.wikisync .hover {
background-color: #FFFFBF;
}
.wikisync .hover > .item-wrapper > .controls {
display: inline;
}
.wikisync .unignore-item {
display: none;
}
.wikisync .ignored .unignore-item {
display: inline;
}
.wikisync .ignored .ignore-item {
display: none;
}
.wikisync label.modified {
background-image: none;
color: #000EC4;
}
.wikisync label.outdated {
background-image: none;
color: #5000C4;
}
.wikisync .progress {
display: none;
}
.wikisync-progress .action {
display: none;
}
.wikisync-progress .progress {
display: block;
}
.wikisync{}.wikisync i{color:#999;}
.wikisync .center{text-align:center;}
.wikisync .ignore{display:inline;}
.wikisync .unignore{display:none;}
.wikisync .ignored .unignore{display:inline;}
.wikisync .ignored .ignore{display:none;}
.wikisync .progress{display:none;}
.wikisync .action{display:inline;}
.wikisync .progressing .progress{display:inline;}
.wikisync .progressing .action{display:none;}
.wikisync .conflict{background-image:url('images/status-conflict.png');}
.wikisync .ignored{background-image:url('images/status-ignored.png');}
.wikisync .missing{background-image:url('images/status-missing.png');}
.wikisync .modified{background-image:url('images/status-modified.png');}
.wikisync .new{background-image:url('images/status-new.png');}
.wikisync .outdated{background-image:url('images/status-outdated.png');}
.wikisync .synced{background-image:url('images/status-synced.png');}
.wikisync .unknown{background-image:url('images/status-unknown.png');}
.wikisync h5{background-repeat:no-repeat;background-position:center center;height:22px;text-indent:-1000px;overflow:hidden;margin:0;padding:0;}
.wikisync h5.conflict{background-image:url('images/status-conflict-big.png');}
.wikisync h5.ignored{background-image:url('images/status-ignored-big.png');}
.wikisync h5.missing{background-image:url('images/status-missing-big.png');}
.wikisync h5.modified{background-image:url('images/status-modified-big.png');}
.wikisync h5.new{background-image:url('images/status-new-big.png');}
.wikisync h5.outdated{background-image:url('images/status-outdated-big.png');}
.wikisync h5.synced{background-image:url('images/status-synced-big.png');}
.wikisync h5.unknown{background-image:url('images/status-unknown-big.png');}
.wikisync a.status{padding-left:64px;background-repeat:no-repeat;background-position:left center;}
.wikisync-list li{list-style:none;padding-left:68px;background-repeat:no-repeat;background-position:left center;line-height:1.4em;overflow:hidden;}
.wikisync-list ul.nested{margin-left:-80px;}
.wikisync-list .hover{background-color:#FFFFBF;}
.wikisync-modal{position:absolute;background-color:#F7F7F0;border:1px outset #998;padding:12px;width:260px;}.wikisync-modal .close{position:absolute;top:4px;right:4px;}
133 changes: 133 additions & 0 deletions wikisync/htdocs/wikisync.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
.status-image(@name) {
background-image: url('images/status-@{name}.png');
}

.wikisync {
i {
color: #999;
}
/* controls */
.center {
text-align: center;
}
.ignore {
display: inline;
}
.unignore {
display: none;
}
.ignored {
.unignore {
display: inline;
}
.ignore {
display: none;
}
}
.progress {
display: none;
}
.action {
display: inline;
}
.progressing {
.progress {
display: inline;
}
.action {
display: none;
}
}
/* sync status */
.conflict {
.status-image('conflict');
}
.ignored {
.status-image('ignored');
}
.missing {
.status-image('missing');
}
.modified {
.status-image('modified');
}
.new {
.status-image('new');
}
.outdated {
.status-image('outdated');
}
.synced {
.status-image('synced');
}
.unknown {
.status-image('unknown');
}
h5 {
background-repeat: no-repeat;
background-position: center center;
height: 22px;
text-indent: -1000px;
overflow: hidden;
margin: 0; padding: 0;
}
h5.conflict {
.status-image('conflict-big');
}
h5.ignored {
.status-image('ignored-big');
}
h5.missing {
.status-image('missing-big');
}
h5.modified {
.status-image('modified-big');
}
h5.new {
.status-image('new-big');
}
h5.outdated {
.status-image('outdated-big');
}
h5.synced {
.status-image('synced-big');
}
h5.unknown {
.status-image('unknown-big');
}
a.status {
padding-left: 64px;
background-repeat: no-repeat;
background-position: left center;
}
}

.wikisync-list {
li {
list-style: none;
padding-left: 68px;
background-repeat: no-repeat;
background-position: left center;
line-height: 1.4em;
overflow: hidden;
}
ul.nested {
margin-left: -80px;
}
.hover {
background-color: #FFFFBF;
}
}

.wikisync-modal {
position: absolute;
background-color: #F7F7F0;
border: 1px outset #998;
padding: 12px;
width: 260px;
.close {
position: absolute;
top: 4px; right: 4px;
}

}
82 changes: 62 additions & 20 deletions wikisync/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
from wikisync.util import str_mask, str_unmask, safe_str, jsonify, \
WikiSyncRpc, WikiSyncIgnoreFilter
from genshi.builder import tag
from genshi.core import Markup
from genshi.filters import Transformer
from trac.core import *
from trac.util import get_reporter_id
from trac.env import IEnvironmentSetupParticipant
Expand Down Expand Up @@ -77,6 +79,12 @@ def _render_json(self, req, data):
req.send_header('Content-Length', str(len(payload)))
req.end_headers()
req.write(payload)

def _render_assets(self, req):
add_stylesheet(req, "wikisync/wikisync.css")
add_script(req, "wikisync/underscore.js")
add_script(req, "wikisync/backbone.js")
add_script(req, "wikisync/wikisync.js")

class WikiSyncEnvironment(Component, WikiSyncMixin):
"""WikiSync environment setup"""
Expand Down Expand Up @@ -198,13 +206,50 @@ def render_admin_panel(self, req, cat, page, path_info):

def _get_config(self, key, default=""):
return self.env.config.get(CONFIG_SECTION, key, default)

class WikiSyncPagePlugin(Component, WikiSyncMixin):
"""Provides additional controls in the context menu
of individual wiki page"""
implements(ITemplateStreamFilter)

# ITemplateStreamFilter
def filter_stream(self, req, method, filename, stream, data):
if "WIKI_ADMIN" in req.perm and filename == "wiki_view.html":
pagename = req.args.get("page", "WikiStart")
remote_url = self._get_config("url", "")
dao = self._get_dao()
item = dao.find(pagename)
if not item:
item = dao.factory(name=pagename)
params = {
"model": item,
"remote_url": remote_url,
"endpoint": req.href.wikisync()
}
add_ctxtnav(req,
tag.span(
tag.a(
Markup("↓"),
href="#",
class_="status %s" % item.status,
id_="wikisync-page-link"
),
class_="wikisync"
)
)
self._render_assets(req)
stream |= Transformer('.//body').prepend(
Chrome(self.env).load_template(
"wikisync_page.html"
).generate(**params)
)
return stream

class WikiSyncPlugin(Component, WikiSyncMixin):
"""Central interface to manage wiki syncronization"""
"""Central interface for managing wiki syncronization"""

implements(INavigationContributor, IRequestHandler, ITemplateProvider,
ITemplateStreamFilter)

implements(INavigationContributor, IRequestHandler, ITemplateProvider)

# INavigationContributor methods
def get_active_navigation_item(self, req):
return "wikisync"
Expand All @@ -226,11 +271,11 @@ def get_htdocs_dirs(self):
return [("wikisync", resource_filename(__name__, "htdocs"))]

# ITemplateStreamFilter
def filter_stream(self, req, method, filename, stream, data):
if "WIKI_ADMIN" in req.perm:
# TODO: Render individual page controls via add_ctxtnav
pass
return stream
#def filter_stream(self, req, method, filename, stream, data):
# if "WIKI_ADMIN" in req.perm:
# # TODO: Render individual page controls via add_ctxtnav
# pass
# return stream

def process_request(self, req):
req.perm.require("WIKI_ADMIN")
Expand Down Expand Up @@ -263,7 +308,7 @@ def process_request(self, req):
if action == "refresh" and item:
info = rpc.get_remote_version(item.name)
if info:
item = item.merge(sync_time=time.time(), **info[0])
item = item.replace(sync_time=time.time(), **info[0])
dao.update(item)
elif action == "pull":
author = get_reporter_id(req)
Expand All @@ -276,14 +321,14 @@ def process_request(self, req):
except TracError, e:
if wiki.text != wiki.old_text:
raise e
item = item.merge(
item = item.replace(
local_version=wiki.version
).synchronized()
dao.update(item)
elif action == "push":
wiki = WikiPage(self.env, item.name)
assert wiki.version > 0, "Cannot find wiki '%s'" % item.name
item = item.merge(
item = item.replace(
**rpc.post_wiki(
item.name,
wiki.text,
Expand All @@ -294,15 +339,15 @@ def process_request(self, req):
elif action == "resolve":
status = req.args.get("status")
if status == "ignore":
item = item.merge(ignore=1)
item = item.replace(ignore=1)
elif status == "unignore":
item = item.merge(ignore=None)
item = item.replace(ignore=None)
elif status == "local":
item = item.merge(
item = item.replace(
sync_remote_version=item.remote_version
)
elif status == "remote":
item = item.merge(
item = item.replace(
sync_local_version=item.local_version
)
else:
Expand All @@ -317,10 +362,7 @@ def process_request(self, req):
elif redirect:
req.redirect(req.href.wikisync())
else:
add_stylesheet(req, "wikisync/wikisync.css")
add_script(req, "wikisync/underscore.js")
add_script(req, "wikisync/backbone.js")
add_script(req, "wikisync/wikisync.js")
self._render_assets(req)
return "wikisync.html", {
"collection": [o for o in dao.all()],
"local_url": req.href.wiki(),
Expand Down

0 comments on commit 2201c7d

Please sign in to comment.