Index: openacs-4/packages/xowiki/tcl/includelet-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/includelet-procs.tcl,v diff -u -r1.113 -r1.114 --- openacs-4/packages/xowiki/tcl/includelet-procs.tcl 15 May 2009 07:05:19 -0000 1.113 +++ openacs-4/packages/xowiki/tcl/includelet-procs.tcl 29 May 2009 13:37:48 -0000 1.114 @@ -101,6 +101,11 @@ string map [list \n \\n \" {\"} ' {\'}] $string } + ::xowiki::Includelet proc html_encode {string} { + return [string map [list & "&" < "<" > ">" \" """ ' "'"] $string] + } + + ::xowiki::Includelet proc html_id {name} { # Construct a valid HTML id or name. # For details, see http://www.w3.org/TR/html4/types.html @@ -623,7 +628,7 @@ } categories instproc include_head_entries {} { - ::xowiki::CatTree include_head_entries -style [my set style] + ::xowiki::Tree include_head_entries -renderer [my set style] } categories instproc category_tree_edit_button {-object_id:integer -locale {-allow_edit false} -tree_id:integer} { @@ -697,10 +702,13 @@ return [my category_tree_missing -name $tree_name -edit_html $edit_html] } + if {![my exists id]} {my set id [::xowiki::Includelet html_id [self]]} + foreach tree $trees { foreach {tree_id my_tree_name ...} $tree {break} - set edit_html [my category_tree_edit_button -object_id $package_id -allow_edit $allow_edit -tree_id $tree_id] + set edit_html [my category_tree_edit_button -object_id $package_id \ + -allow_edit $allow_edit -tree_id $tree_id] #append content "
$edit_html
\n" if {!$no_tree_name} { @@ -710,13 +718,14 @@ } set categories [list] set pos 0 - set cattree(0) [::xowiki::CatTree new -volatile -orderby pos -name $my_tree_name] - set category_infos [::xowiki::Category get_category_infos -locale $locale -tree_id $tree_id] + set cattree(0) [::xowiki::Tree new -volatile -orderby pos \ + -id [my id]-$my_tree_name -name $my_tree_name] + set category_infos [::xowiki::Category get_category_infos \ + -locale $locale -tree_id $tree_id] foreach category_info $category_infos { foreach {cid category_label deprecated_p level} $category_info {break} - - set c [::xowiki::Category new -orderby pos -category_id $cid -package_id $package_id \ + set c [::xowiki::TreeNode new -orderby pos \ -level $level -label $category_label -pos [incr pos]] set cattree($level) $c set plevel [expr {$level -1}] @@ -773,7 +782,7 @@ if {$category_ids ne ""} { foreach cid [split $category_ids ,] { append sql " and exists (select * from category_object_map \ - where object_id = ci.item_id and category_id = $cid)" + where object_id = ci.item_id and category_id = $cid)" } } append sql $locale_clause @@ -799,8 +808,8 @@ set prefix "" set suffix "" foreach var {name title prefix suffix page_order} {$itemobj set $var [set $var]} - - $cattree(0) add_to_category \ + $itemobj set href [::$package_id pretty_link $name] + $cattree(0) add_item \ -category $category($category_id) \ -itemobj $itemobj \ -orderby $orderby \ @@ -842,13 +851,14 @@ } categories-recent instproc include_head_entries {} { - ::xowiki::CatTree include_head_entries -style [my set style] + ::xowiki::Tree include_head_entries -renderer [my set style] } categories-recent instproc render {} { my get_parameters - set cattree [::xowiki::CatTree new -volatile -name "categories-recent"] + if {![my exists id]} {my set id [::xowiki::Includelet html_id [self]]} + set cattree [::xowiki::Tree new -volatile -id [my id]] foreach {locale locale_clause} \ [::xowiki::Includelet locale_clause -revisions r -items ci $package_id $locale] break @@ -877,14 +887,14 @@ set prefix "$formatted_date " set suffix "" foreach var {name title prefix suffix} {$itemobj set $var [set $var]} + $itemobj set href [::$package_id pretty_link $name] if {![info exists categories($category_id)]} { - set categories($category_id) [::xowiki::Category new \ - -package_id $package_id \ - -label [category::get_name $category_id $locale]\ + set categories($category_id) [::xowiki::TreeNode new \ + -label [category::get_name $category_id $locale] \ -level 1] $cattree add $categories($category_id) } - $cattree add_to_category -category $categories($category_id) -itemobj $itemobj + $cattree add_item -category $categories($category_id) -itemobj $itemobj } return [$cattree render -style [my set style]] } @@ -1707,7 +1717,7 @@ # includelets based on order # Class create PageReorderSupport - PageReorderSupport instproc page_reorder_check_allow {allow_reorder} { + PageReorderSupport instproc page_reorder_check_allow {{-with_head_entries true} allow_reorder} { if {$allow_reorder ne ""} { my instvar package_id set granted [$package_id check_permissions \ @@ -1716,10 +1726,12 @@ $package_id change-page-order] #my msg "granted=$granted" if {$granted} { - set ajaxhelper 0 - ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "utilities/utilities.js" - ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "selector/selector-min.js" - ::xo::Page requireJS "/resources/xowiki/yui-page-order-region.js" + if {$with_head_entries} { + set ajaxhelper 1 + ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "utilities/utilities.js" + ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "selector/selector-min.js" + ::xo::Page requireJS "/resources/xowiki/yui-page-order-region.js" + } } else { # the user has not enough permissions, so disallow set allow_reorder "" @@ -1872,48 +1884,115 @@ return $displayed_page_order } - toc instproc yui_tree {pages open_page package_id expand_all remove_levels} { - my instvar navigation page_name book_mode + toc instproc build_navigation {pages} { + # + # compute associative arrays open_node and navigation (position + # and current) + # + my get_parameters + my instvar navigation page_name + array set navigation {position 0 current ""} - set js "" - set node() root + # the top node is always open + my set open_node() true set node_cnt 0 - #my log "--book read [llength [$pages children]] pages" - #append js "$node().expand();\n" - foreach o [$pages children] { - $o instvar page_order title name + $o instvar page_order name + incr node_cnt + set page_name($node_cnt) $name + if {![regexp {^(.*)[.]([^.]+)} $page_order _ parent]} {set parent ""} + # + # If we are on the provided $open_page, we remember our position + # for the progress bar. + set on_current_node [expr {$open_page eq $name} ? "true" : "false"] + if {$on_current_node} { + set navigation(position) $node_cnt + set navigation(current) $page_order + } + if {$expand_all} { + my set open_node($page_order) true + } elseif {$on_current_node} { + my set open_node($page_order) true + # make sure to open all nodes to the root + for {set p $parent} {$p ne ""} {} { + my set open_node($p) true + if {![regexp {^(.*)[.]([^.]+)} $p _ p]} {set p ""} + } + } + } + set navigation(count) $node_cnt + #my log OPEN=[lsort [my array names open_node]] + } - set label "[my page_number $page_order $remove_levels] $title" - set id tmpNode[incr node_cnt] - set node($page_order) $id - set jsobj [my js_name].objs\[$node_cnt\] - set href [my href $package_id $book_mode $name] - set expand [expr {[my exists open_node($page_order)]}] + toc instproc render_list {{-full false} pages} { + my get_parameters + my instvar navigation page_name + # + # Build a reduced toc tree based on pure HTML (no javascript or + # ajax involved). If an open_page is specified, produce an as + # small as possible tree and omit all non-visible nodes. + # + if {$open_page ne ""} { + # TODO: can we allow open_page and reorder? + set allow_reorder "" + } else { + set allow_reorder [my page_reorder_check_allow $allow_reorder] + } + my page_reorder_init_vars -allow_reorder $allow_reorder js last_level ID min_level + + set css_class [expr {$min_level == 1 ? "page_order_region" : "page_order_region_no_target"}] +#my log allow_reorder=$allow_reorder,min_level=$min_level,css=$css_class + set html "\n"} + set level $new_level + } + set href [my href $package_id $book_mode $name] + set highlight [if {$open_page eq $name} {set _ "style = 'font-weight:bold;'"} {}] + set item_id [my page_reorder_item_id -ID $ID -prefix_js $prefix_js -page_order $page_order js] + append html \ + "
  • " \ + "$page_number $title\n" + } } - return $js + # close all levels + for {set l 0} {$l <= $level} {incr l} {append html "\n"} + if {$js ne ""} {append html "\n"} + + return $html } - toc instproc ajax_tree {js_tree_cmds} { - return "
    - -
    " +" } - toc instproc non_ajax_tree {js_tree_cmds} { - return "
    - -
    " + toc instproc yui_non_ajax {} { + return " + var [my js_name]; + YAHOO.util.Event.onDOMReady(function() { + [my js_name] = new YAHOO.widget.TreeView('[my id]'); + [my js_name].subscribe('clickEvent',function(oArgs) { + //console.info(oArgs); + var m = /href=\"(\[^\"\]+)\"/.exec(oArgs.node.html); + //console.info(m\[1\]); + //window.location.href = m\[1\]; + return false; + }); + [my js_name].render(); + }); + " } + toc instproc build_tree {{-full false} {-remove_levels 0} {-book_mode false} {-open_page ""} pages} { + my instvar package_id + set tree(-1) [::xowiki::Tree new -destroy_on_cleanup -orderby pos -id [my id]] + set pos 0 + foreach o [$pages children] { + $o instvar page_order title name + if {![regexp {^(.*)[.]([^.]+)} $page_order _ parent]} {set parent ""} + set page_number [my page_number $page_order $remove_levels] - toc instproc include_head_entries_yui_tree {ajax style} { - set ajaxhelper 1 - - ::xo::Page requireCSS "/resources/ajaxhelper/yui/treeview/assets/${style}tree.css" - if {$style eq ""} { - ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper \ - treeview/assets/skins/sam/treeview.css + set level [regsub -all {[.]} [$o set page_order] _ page_order_js] + if {$full || [my exists open_node($parent)] || [my exists open_node($page_order)]} { + set href [my href $package_id $book_mode $name] + set c [::xowiki::TreeNode new -orderby pos -pos [incr pos] -level $level \ + -object $o -owner [self] \ + -label $title -prefix $page_number -href $href \ + -highlight [expr {$open_page eq $name}] \ + -expanded true -open_requests 1] + set tree($level) $c + $tree([expr {$level -1}]) add $c + } } - ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "yahoo/yahoo-min.js" - ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "event/event-min.js" - - if {$ajax} { - ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "dom/dom-min.js" ;# ANIM - ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "connection/connection-min.js" - ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "animation/animation-min.js" ;# ANIM - } - ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "treeview/treeview.js" + return $tree(-1) } - - toc instproc render_yui_tree {pages style} { + toc instproc render_yui_list {{-full false} pages} { + my instvar js my get_parameters + my instvar navigation page_name + # # Render the tree with the yui widget (with or without ajax) # @@ -2087,57 +2165,23 @@ set ajax 0 } my set ajax $ajax - # do the hard work here.... - set js_tree_cmds [my yui_tree $pages $open_page $package_id $expand_all $remove_levels] + if {$ajax} { - return [my ajax_tree $js_tree_cmds] + set js [my yui_ajax] + } else { + set js [my yui_non_ajax] } - return [my non_ajax_tree $js_tree_cmds] - } - toc instproc build_navigation {pages} { - # - # compute associative arrays open_node and navigation (position - # and current) - # - my get_parameters - my instvar navigation page_name - array set navigation {position 0 current ""} + set tree [my build_tree -full $full -remove_levels $remove_levels \ + -book_mode $book_mode -open_page $open_page $pages] - # the top node is always open - my set open_node() true - set node_cnt 0 - foreach o [$pages children] { - $o instvar page_order name - incr node_cnt - set page_name($node_cnt) $name - if {![regexp {^(.*)[.]([^.]+)} $page_order _ parent]} {set parent ""} - # - # If we are on the provided $open_page, we remember our position - # for the progress bar. - set on_current_node [expr {$open_page eq $name} ? "true" : "false"] - if {$on_current_node} { - set navigation(position) $node_cnt - set navigation(current) $page_order - } - if {$expand_all} { - my set open_node($page_order) true - } elseif {$on_current_node} { - my set open_node($page_order) true - # make sure to open all nodes to the top - for {set p $parent} {$p ne ""} {} { - my set open_node($p) true - if {![regexp {^(.*)[.]([^.]+)} $p _ p]} {set p ""} - } - } - } - set navigation(count) $node_cnt - #my log OPEN=[lsort [my array names open_node]] + set HTML [$tree render -style yuitree -js $js] + return $HTML } - toc instproc render_list {pages} { + toc instproc render_list {{-full false} pages} { my get_parameters - my instvar navigation page_name + # # Build a reduced toc tree based on pure HTML (no javascript or # ajax involved). If an open_page is specified, produce an as @@ -2147,68 +2191,46 @@ # TODO: can we allow open_page and reorder? set allow_reorder "" } else { - set allow_reorder [my page_reorder_check_allow $allow_reorder] + set allow_reorder [my page_reorder_check_allow -with_head_entries false $allow_reorder] } + set tree [my build_tree -full $full -remove_levels $remove_levels \ + -book_mode $book_mode -open_page $open_page $pages] + my page_reorder_init_vars -allow_reorder $allow_reorder js last_level ID min_level + set js "\nYAHOO.xo_page_order_region.DDApp.package_url = '[$package_id package_url]';" + set HTML [$tree render -style listdnd -js $js -context {min_level $min_level}] + + return $HTML + } - set css_class [expr {$min_level == 1 ? "page_order_region" : "page_order_region_no_target"}] - set html "\n"} - set level $new_level - } - set href [my href $package_id $book_mode $name] - set highlight [if {$open_page eq $name} {set _ "style = 'font-weight:bold;'"} {}] - set item_id [my page_reorder_item_id -ID $ID -prefix_js $prefix_js -page_order $page_order js] - append html \ - "
  • " \ - "$page_number $title\n" - } - } - # close all levels - for {set l 0} {$l <= $level} {incr l} {append html "\n"} - if {$js ne ""} {append html "\n"} - - return $html + toc instproc include_head_entries {} { + my instvar style renderer + ::xowiki::Tree include_head_entries -renderer $renderer -style $style;# FIXME general } - toc instproc include_head_entries {} { + toc instproc initialize {} { my get_parameters - if {$style ne "list"} { - my include_head_entries_yui_tree $ajax $style + + set list_mode 0 + switch -- $style { + "menu" {set s "menu/"; set renderer yuitree} + "folders" {set s "folders/"; set renderer yuitree} + "list" {set s ""; set list_mode 1; set renderer list} + "default" {set s ""; set renderer yuitree} } + my set renderer $renderer + my set style $s + my set list_mode $list_mode } toc instproc render {} { my get_parameters - set list_mode 0 + if {![my exists id]} {my set id [::xowiki::Includelet html_id [self]]} if {[info exists category_id]} {my set category_id $category_id} - switch -- $style { - "menu" {set s "menu/"} - "folders" {set s "folders/"} - "list" {set s ""; set list_mode 1} - "default" {set s ""} - } # # Collect the pages # @@ -2220,10 +2242,11 @@ # # Call a render on the created structure # - if {$list_mode} { + if {[my set list_mode]} { +my log LIST return [my render_list $pages] } else { - return [my render_yui_tree $pages $s] + return [my render_yui_list -full true $pages] } } @@ -2349,8 +2372,7 @@ set base [$package_id pretty_link [$__including_page name]] #set id ID$item_id #$root setAttribute id $id - set as_att_value [string map [list & "&" < "<" > ">" \" """ ' "'"] $inner_html] - + set as_att_value [::xowiki::Includelet html_encode $inner_html] set save_form [subst {

    Create Form from Content