Completed recent notes list:
* displaying list of links * adding links * removing links * updating links * controller.Notebooks.contents() changes to return recent notes
This commit is contained in:
parent
7a26f96535
commit
431bf6ace7
|
@ -128,6 +128,11 @@ class Notebooks( object ):
|
||||||
if revision:
|
if revision:
|
||||||
result[ "note_read_write" ] = False
|
result[ "note_read_write" ] = False
|
||||||
|
|
||||||
|
notebook = self.__database.load( Notebook, notebook_id )
|
||||||
|
if not notebook:
|
||||||
|
raise Access_error()
|
||||||
|
result[ "recent_notes" ] = self.__database.select_many( Note, notebook.sql_load_recent_notes( start = 0, count = 10 ) )
|
||||||
|
|
||||||
# if the user doesn't have any storage bytes yet, they're a new user, so see what type of
|
# if the user doesn't have any storage bytes yet, they're a new user, so see what type of
|
||||||
# conversion this is (demo or signup)
|
# conversion this is (demo or signup)
|
||||||
if result[ "user" ].storage_bytes == 0:
|
if result[ "user" ].storage_bytes == 0:
|
||||||
|
|
|
@ -270,6 +270,11 @@ img {
|
||||||
font-size: 90%;
|
font-size: 90%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#recent_notes_table {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
font-size: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
.note_tree_table {
|
.note_tree_table {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
}
|
}
|
||||||
|
@ -299,6 +304,11 @@ img {
|
||||||
padding-left: 19px;
|
padding-left: 19px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.recent_note_link {
|
||||||
|
background: url(/static/images/note_icon.png) left center no-repeat;
|
||||||
|
padding-left: 19px;
|
||||||
|
}
|
||||||
|
|
||||||
.note_tree_loading {
|
.note_tree_loading {
|
||||||
background: url(/static/images/loading.gif) left center no-repeat;
|
background: url(/static/images/loading.gif) left center no-repeat;
|
||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
|
@ -582,6 +592,10 @@ img {
|
||||||
padding: 0.25em 0.25em 0.25em 0;
|
padding: 0.25em 0.25em 0.25em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.recent_note_item {
|
||||||
|
padding: 0.25em 0.25em 0.25em 0;
|
||||||
|
}
|
||||||
|
|
||||||
.tree_expander {
|
.tree_expander {
|
||||||
float: left;
|
float: left;
|
||||||
width: 11px;
|
width: 11px;
|
||||||
|
|
|
@ -19,6 +19,7 @@ function Wiki( invoker ) {
|
||||||
this.signup_plan = getElement( "signup_plan" ).value;
|
this.signup_plan = getElement( "signup_plan" ).value;
|
||||||
this.font_size = null;
|
this.font_size = null;
|
||||||
this.note_tree = new Note_tree( this, this.notebook_id, this.invoker );
|
this.note_tree = new Note_tree( this, this.notebook_id, this.invoker );
|
||||||
|
this.recent_notes = new Recent_notes( this, this.notebook_id );
|
||||||
|
|
||||||
var total_notes_count_node = getElement( "total_notes_count" );
|
var total_notes_count_node = getElement( "total_notes_count" );
|
||||||
if ( total_notes_count_node )
|
if ( total_notes_count_node )
|
||||||
|
@ -2578,7 +2579,7 @@ function Note_tree( wiki, notebook_id, invoker ) {
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
function connect_expander( note_id ) {
|
function connect_expander( note_id ) {
|
||||||
connect( "note_tree_expander_" + note_id, "onclick", function ( event ) { self.expand_link( event, note_id ); } );
|
connect( "note_tree_expander_" + note_id, "onclick", function ( event ) { self.expand_collapse_link( event, note_id ); } );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( var i in links ) {
|
for ( var i in links ) {
|
||||||
|
@ -2643,7 +2644,7 @@ Note_tree.prototype.add_root_link = function ( editor ) {
|
||||||
) );
|
) );
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
connect( expander, "onclick", function ( event ) { self.expand_link( event, editor.id ); } );
|
connect( expander, "onclick", function ( event ) { self.expand_collapse_link( event, editor.id ); } );
|
||||||
connect( link, "onclick", function ( event ) { self.link_clicked( event ); } );
|
connect( link, "onclick", function ( event ) { self.link_clicked( event ); } );
|
||||||
|
|
||||||
var instructions = getElement( "note_tree_instructions" );
|
var instructions = getElement( "note_tree_instructions" );
|
||||||
|
@ -2667,11 +2668,8 @@ Note_tree.prototype.remove_link = function ( note_id ) {
|
||||||
|
|
||||||
Note_tree.prototype.rename_link = function ( editor, new_title ) {
|
Note_tree.prototype.rename_link = function ( editor, new_title ) {
|
||||||
var link = getElement( "note_tree_link_" + editor.id );
|
var link = getElement( "note_tree_link_" + editor.id );
|
||||||
|
if ( link )
|
||||||
if ( !link )
|
replaceChildNodes( link, new_title || "untitled note" );
|
||||||
return;
|
|
||||||
|
|
||||||
replaceChildNodes( link, new_title || "untitled note" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Note_tree.prototype.update_link = function ( editor ) {
|
Note_tree.prototype.update_link = function ( editor ) {
|
||||||
|
@ -2711,7 +2709,7 @@ Note_tree.prototype.update_link = function ( editor ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Note_tree.prototype.expand_link = function ( event, note_id ) {
|
Note_tree.prototype.expand_collapse_link = function ( event, note_id ) {
|
||||||
var expander = event.target();
|
var expander = event.target();
|
||||||
|
|
||||||
if ( !expander || hasElementClass( expander, "tree_expander_empty" ) )
|
if ( !expander || hasElementClass( expander, "tree_expander_empty" ) )
|
||||||
|
@ -2765,14 +2763,11 @@ Note_tree.prototype.expand_link = function ( event, note_id ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Note_tree.prototype.collapse_link = function ( event, note_id ) {
|
|
||||||
}
|
|
||||||
|
|
||||||
Note_tree.prototype.display_child_links = function ( result, link, children_area ) {
|
Note_tree.prototype.display_child_links = function ( result, link, children_area ) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
function connect_expander( expander, note_id ) {
|
function connect_expander( expander, note_id ) {
|
||||||
connect( expander, "onclick", function ( event ) { self.expand_link( event, note_id ); } );
|
connect( expander, "onclick", function ( event ) { self.expand_collapse_link( event, note_id ); } );
|
||||||
}
|
}
|
||||||
|
|
||||||
var span = createDOM( "span" );
|
var span = createDOM( "span" );
|
||||||
|
@ -2827,3 +2822,99 @@ Note_tree.prototype.display_child_links = function ( result, link, children_area
|
||||||
var note_id = parse_query( link )[ "note_id" ];
|
var note_id = parse_query( link )[ "note_id" ];
|
||||||
connect_expander( expander, note_id );
|
connect_expander( expander, note_id );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Recent_notes( wiki, notebook_id ) {
|
||||||
|
this.wiki = wiki;
|
||||||
|
this.notebook_id = notebook_id;
|
||||||
|
|
||||||
|
// if there's no recent notes table, there's nothing to do with recent notes!
|
||||||
|
if ( !getElement( "recent_notes_table" ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// add onclick handlers to the recent note links as well
|
||||||
|
var self = this;
|
||||||
|
var recent_links = getElementsByTagAndClassName( "a", "recent_note_link", "note_tree_area" );
|
||||||
|
|
||||||
|
for ( var i in recent_links ) {
|
||||||
|
var link = recent_links[ i ];
|
||||||
|
var query = parse_query( link );
|
||||||
|
var note_id = query[ "note_id" ];
|
||||||
|
|
||||||
|
connect( link, "onclick", function ( event ) { self.link_clicked( event ); } );
|
||||||
|
}
|
||||||
|
|
||||||
|
// connect to the wiki note events
|
||||||
|
connect( wiki, "note_added", function ( editor ) { self.add_link( editor ); } );
|
||||||
|
connect( wiki, "note_removed", function ( id ) { self.remove_link( id ); } );
|
||||||
|
connect( wiki, "note_saved", function ( editor ) { self.update_link( editor ); } );
|
||||||
|
}
|
||||||
|
|
||||||
|
Recent_notes.prototype.link_clicked = function ( event ) {
|
||||||
|
var link = event.target();
|
||||||
|
var query = parse_query( link );
|
||||||
|
var note_id = query[ "note_id" ];
|
||||||
|
var title = query[ "title" ];
|
||||||
|
|
||||||
|
if ( !note_id )
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.wiki.load_editor( title, note_id );
|
||||||
|
event.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
Recent_notes.prototype.add_link = function ( editor ) {
|
||||||
|
// if the link is already present in the recent notes list, bail
|
||||||
|
var item = getElement( "recent_note_item_" + editor.id )
|
||||||
|
if ( item ) return;
|
||||||
|
|
||||||
|
MAX_RECENT_NOTES_COUNT = 10;
|
||||||
|
|
||||||
|
// if there will be too many recent notes listed once another is added, then remove the last one
|
||||||
|
var recent_items = getElementsByTagAndClassName( "tr", "recent_note_item", "recent_notes_table" );
|
||||||
|
if ( recent_items && recent_items.length >= MAX_RECENT_NOTES_COUNT ) {
|
||||||
|
var last_item = recent_items[ recent_items.length - 1 ];
|
||||||
|
removeElement( last_item );
|
||||||
|
}
|
||||||
|
|
||||||
|
// add a new recent note link at the top of the list
|
||||||
|
var expander = createDOM( "td", { "class": "tree_expander_empty", "id": "recent_note_expander_" + editor.id } );
|
||||||
|
|
||||||
|
var link = createDOM( "a", {
|
||||||
|
"href": "/notebooks/" + this.notebook_id + "?note_id=" + editor.id,
|
||||||
|
"id": "recent_note_link_" + editor.id,
|
||||||
|
"class": "recent_note_link"
|
||||||
|
}, editor.title || "untitled note" );
|
||||||
|
|
||||||
|
insertSiblingNodesAfter( "recent_notes_top", createDOM(
|
||||||
|
"tr",
|
||||||
|
{ "id": "recent_note_item_" + editor.id, "class": "recent_note_item" },
|
||||||
|
expander,
|
||||||
|
createDOM( "td", {}, link )
|
||||||
|
) );
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
connect( link, "onclick", function ( event ) { self.link_clicked( event ); } );
|
||||||
|
}
|
||||||
|
|
||||||
|
Recent_notes.prototype.remove_link = function ( note_id ) {
|
||||||
|
var item = getElement( "recent_note_item_" + note_id );
|
||||||
|
if ( !item ) return;
|
||||||
|
|
||||||
|
removeElement( item );
|
||||||
|
}
|
||||||
|
|
||||||
|
Recent_notes.prototype.update_link = function ( editor ) {
|
||||||
|
var item = getElement( "recent_note_item_" + editor.id );
|
||||||
|
var link = getElement( "recent_note_link_" + editor.id );
|
||||||
|
|
||||||
|
// the link isn't in the recent notes list, so add it
|
||||||
|
if ( !item || !link ) {
|
||||||
|
this.add_link( editor );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the link is already in the recent notes list, so just move it to the top of the list
|
||||||
|
removeElement( item );
|
||||||
|
replaceChildNodes( link, editor.title );
|
||||||
|
insertSiblingNodesAfter( "recent_notes_top", item );
|
||||||
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ class Main_page( Page ):
|
||||||
invite_id = None,
|
invite_id = None,
|
||||||
after_login = None,
|
after_login = None,
|
||||||
signup_plan = None,
|
signup_plan = None,
|
||||||
|
recent_notes = None,
|
||||||
):
|
):
|
||||||
startup_note_ids = [ startup_note.object_id for startup_note in startup_notes ]
|
startup_note_ids = [ startup_note.object_id for startup_note in startup_notes ]
|
||||||
|
|
||||||
|
@ -141,6 +142,7 @@ class Main_page( Page ):
|
||||||
),
|
),
|
||||||
notebook,
|
notebook,
|
||||||
startup_notes + ( notes and notes or [] ),
|
startup_notes + ( notes and notes or [] ),
|
||||||
|
recent_notes,
|
||||||
total_notes_count,
|
total_notes_count,
|
||||||
),
|
),
|
||||||
id = u"left_area",
|
id = u"left_area",
|
||||||
|
|
|
@ -5,7 +5,7 @@ from Tags import Div, Span, H4, A, Table, Tr, Td
|
||||||
class Note_tree_area( Div ):
|
class Note_tree_area( Div ):
|
||||||
LINK_PATTERN = re.compile( u'<a\s+(?:[^>]+\s)?href="[^"]+"[^>]*>', re.IGNORECASE )
|
LINK_PATTERN = re.compile( u'<a\s+(?:[^>]+\s)?href="[^"]+"[^>]*>', re.IGNORECASE )
|
||||||
|
|
||||||
def __init__( self, toolbar, notebook, root_notes, total_notes_count ):
|
def __init__( self, toolbar, notebook, root_notes, recent_notes, total_notes_count ):
|
||||||
Div.__init__(
|
Div.__init__(
|
||||||
self,
|
self,
|
||||||
toolbar,
|
toolbar,
|
||||||
|
@ -32,20 +32,24 @@ class Note_tree_area( Div ):
|
||||||
) or None,
|
) or None,
|
||||||
tree_id = "note_tree_root_table",
|
tree_id = "note_tree_root_table",
|
||||||
),
|
),
|
||||||
( notebook.name != u"trash" ) and Span(
|
( recent_notes and notebook.name != u"trash" ) and Span(
|
||||||
H4( u"recent notes",
|
H4( u"recent notes",
|
||||||
id = u"recent_notes_area_title",
|
id = u"recent_notes_area_title",
|
||||||
),
|
),
|
||||||
|
self.make_tree(
|
||||||
|
Tr( id = "recent_notes_top" ),
|
||||||
|
[ self.make_item(
|
||||||
|
title = note.title,
|
||||||
|
link_attributes = u'href="/notebooks/%s?note_id=%s"' % ( notebook.object_id, note.object_id ),
|
||||||
|
link_class = u"recent_note_link",
|
||||||
|
has_children = False,
|
||||||
|
root_note_id = note.object_id,
|
||||||
|
base_name = u"recent_note",
|
||||||
|
) for note in recent_notes ],
|
||||||
|
tree_id = "recent_notes_table",
|
||||||
|
),
|
||||||
) or None,
|
) or None,
|
||||||
self.make_tree(
|
id = u"note_tree_area_holder",
|
||||||
[ self.make_item(
|
|
||||||
title = note.title,
|
|
||||||
link_attributes = u'href="/notebooks/%s?note_id=%s"' % ( notebook.object_id, note.object_id ),
|
|
||||||
link_class = u"note_tree_link",
|
|
||||||
has_children = False,
|
|
||||||
) for note in []],#recent_notes ],
|
|
||||||
),
|
|
||||||
id = u"recent_notes_area_holder",
|
|
||||||
),
|
),
|
||||||
Span( id = "tree_arrow_hover_preload" ),
|
Span( id = "tree_arrow_hover_preload" ),
|
||||||
Span( id = "tree_arrow_down_preload" ),
|
Span( id = "tree_arrow_down_preload" ),
|
||||||
|
@ -54,22 +58,25 @@ class Note_tree_area( Div ):
|
||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def make_item( title, link_attributes, link_class, has_children = False, root_note_id = None, target = None ):
|
def make_item( title, link_attributes, link_class, has_children = False, root_note_id = None, target = None, base_name = None ):
|
||||||
|
if base_name is None:
|
||||||
|
base_name = u"note_tree"
|
||||||
|
|
||||||
return Tr(
|
return Tr(
|
||||||
has_children and \
|
has_children and \
|
||||||
Td( id = root_note_id and u"note_tree_expander_" + root_note_id or None, class_ = u"tree_expander" ) or
|
Td( id = root_note_id and u"%s_expander_%s" % ( base_name, root_note_id ) or None, class_ = u"tree_expander" ) or
|
||||||
Td( id = root_note_id and u"note_tree_expander_" + root_note_id or None, class_ = u"tree_expander_empty" ),
|
Td( id = root_note_id and u"%s_expander_%s" % ( base_name, root_note_id ) or None, class_ = u"tree_expander_empty" ),
|
||||||
Td(
|
Td(
|
||||||
u"<a %s%s%s class=%s>%s</a>" % (
|
u"<a %s%s%s class=%s>%s</a>" % (
|
||||||
link_attributes,
|
link_attributes,
|
||||||
root_note_id and u' id="note_tree_link_%s"' % root_note_id or "",
|
root_note_id and u' id="%s_link_%s"' % ( base_name, root_note_id ) or "",
|
||||||
target and u' target="%s"' % target or "",
|
target and u' target="%s"' % target or "",
|
||||||
link_class,
|
link_class,
|
||||||
title or u"untitled note",
|
title or u"untitled note",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
id = root_note_id and u"note_tree_item_" + root_note_id or None,
|
id = root_note_id and u"%s_item_%s" % ( base_name, root_note_id ) or None,
|
||||||
class_ = u"note_tree_item",
|
class_ = u"%s_item" % base_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
Reference in New Issue