Index: openacs-4/packages/xowiki/tcl/tree-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/tree-procs.tcl,v diff -u -N -r1.23 -r1.23.2.1 --- openacs-4/packages/xowiki/tcl/tree-procs.tcl 11 Jul 2018 13:46:15 -0000 1.23 +++ openacs-4/packages/xowiki/tcl/tree-procs.tcl 12 May 2019 20:02:46 -0000 1.23.2.1 @@ -17,6 +17,7 @@ -superclass ::xo::OrderedComposite \ -parameter { {name ""} + {owner} {verbose 0} id } @@ -172,7 +173,9 @@ append content [:render_node -open true $cat_content] } - if {${:verbose}} {:log "TreeNode items [:isobject [self]::items] render open_requests ${:open_requests} -> $content"} + if {${:verbose}} { + :log "TreeNode items [:isobject [self]::items] render open_requests ${:open_requests} -> $content" + } return $content } @@ -259,8 +262,10 @@ set h_atts [lindex [$cl highlight_atts] [expr {${:highlight} ? 0 : 1}]] set u_atts "" - if {[info exists :li_id]} {append o_atts " id='${:li_id}'"} - if {[info exists :ul_id]} {append u_atts " id='${:ul_id}'"} + if {[info exists :li_id]} {append o_atts " id='${:li_id}'"} + if {[info exists :li_atts]} {append o_atts " ${:li_atts}"} + if {[info exists :ul_id]} {append u_atts " id='${:ul_id}'"} + if {[info exists :ul_atts]} {append u_atts " ${:ul_atts}"} if {[info exists :ul_class]} {append u_atts " class='${:ul_class}'"} set label [::xowiki::Includelet html_encode [:label]] @@ -281,7 +286,7 @@ } else { set content "" } - return "
  • ${:prefix} $entry$content" + return "
  • ${:prefix} $entry$content
  • " } #-------------------------------------------------------------------------------- @@ -419,42 +424,87 @@ #-------------------------------------------------------------------------------- - # list-specific render with YUI drag and drop functionality + # list-specific render with drag and drop functionality #-------------------------------------------------------------------------------- TreeRenderer create TreeRenderer=listdnd \ -superclass TreeRenderer=list \ -li_expanded_atts [list "" ""] TreeRenderer=listdnd proc include_head_entries {args} { - set ajaxhelper 0 - ::xo::Page requireJS urn:ad:js:yui2:utilities/utilities - ::xo::Page requireJS urn:ad:js:yui2:selector/selector-min - ::xo::Page requireJS "/resources/xowiki/yui-page-order-region.js" + ::xo::Page requireJS "/resources/xowiki/listdnd.js" } + TreeRenderer=listdnd proc min_level {} { + if {[dict exists ${:context} min_level]} { + return [dict get ${:context} min_level] + } + return "" + } + TreeRenderer=listdnd proc add_handler {-id -event} { + template::add_event_listener \ + -id $id \ + -event $event \ + -preventdefault=false \ + -script "listdnd_${event}_handler(event);" + } + TreeRenderer=listdnd proc render {tree} { - array set "" ${:context} - if {[info exists (min_level)] && $(min_level) == 1} { - set css_class "page_order_region" + #:log "=== TreeRenderer=listdnd render $tree" + # + # Do we allow reorder on the toplevel? + # + if {[:min_level] == 1} { + set css_class "page_order_region" + set id [$tree id]-topul + foreach event {drop dragover dragleave} { + :add:handler -id $id -event $event + } } else { set css_class "page_order_region_no_target" } - return "
    " + :log "=== TreeRenderer=listdnd render $tree min_level <[:min_level]>" + if {[$tree exists owner]} { + # + # assume, the "owner" is an includelet. + set owner [$tree set owner] + set page [$owner set __including_page] + set package_url [::[$page package_id] package_url] + set package_url_data " data-package_url='$package_url' data-folder_id='[$page parent_id]'" + } else { + set package_url_data "" + } + + return [subst {
    +
    + }] } TreeRenderer=listdnd instproc render_node {{-open:boolean false} cat_content} { + #:log "=== TreeRenderer=listdnd render_node $cat_content" #set open_state [expr {${:open_requests} > 0 ?"class='liOpen'" : "class='liClosed'"}] - #set cl [lindex [:info precedence] 0] - set obj ${:object} - set o [:owner] - $obj instvar page_order - set :li_id [::xowiki::Includelet js_name [$o set id]_$page_order] - set :ul_id [::xowiki::Includelet js_name [$o set id]__l${:level}_$page_order] + ${:object} instvar page_order - set cl [self class] - $cl append js "\nYAHOO.xo_page_order_region.DDApp.cd\['${:li_id}'\] = '$page_order';" + set :li_id [::xowiki::Includelet js_name [${:owner} set id]_$page_order] + set :ul_id [::xowiki::Includelet js_name [${:owner} set id]__l${:level}_$page_order] + + set min_level [[self class] min_level] + set reorder_child [expr {$min_level ne "" && ${:level} >= $min_level}] + set reorder_self [expr {$min_level ne "" && ${:level} > $min_level}] + :log "=== render_node $page_order min_level $min_level level ${:level} reorder_child $reorder_child reorder_self $reorder_self" - array set "" [$cl set context] - set :ul_class [expr {[info exists (min_level)] && ${:level} >= $(min_level) ? - "page_order_region" : "page_order_region_no_target"}] + if {$reorder_child} { + foreach event {drop dragover dragleave} { + [self class] add_handler -id ${:ul_id} -event $event + } + set :ul_class "page_order_region" + } else { + set :ul_class "page_order_region_no_target" + } + if {$reorder_self} { + set :li_atts [subst {data-value='$page_order' draggable='true'}] + [self class] add_handler -id ${:li_id} -event dragstart + } + set :ul_id [::xowiki::Includelet js_name [${:owner} set id]__l${:level}_$page_order] + return [next] }