Index: openacs-4/packages/xowiki/tcl/bootstrap-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/bootstrap-procs.tcl,v
diff -u -N -r1.1.2.1 -r1.1.2.2
--- openacs-4/packages/xowiki/tcl/bootstrap-procs.tcl 14 Apr 2014 21:33:09 -0000 1.1.2.1
+++ openacs-4/packages/xowiki/tcl/bootstrap-procs.tcl 15 Apr 2014 07:05:37 -0000 1.1.2.2
@@ -142,6 +142,9 @@
}
}
+###############################################################################
+# Bootstrap table
+###############################################################################
# TODO Allow renderers from other namespaces in 30-widget-procs
@@ -258,9 +261,8 @@
Class create BootstrapTableRenderer::BulkAction -superclass TABLE::BulkAction
}
+::xo::library source_dependent
-
-
#
# Local variables:
# mode: tcl
Index: openacs-4/packages/xowiki/tcl/folder-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/folder-procs.tcl,v
diff -u -N -r1.27.2.6 -r1.27.2.7
--- openacs-4/packages/xowiki/tcl/folder-procs.tcl 15 Apr 2014 06:47:00 -0000 1.27.2.6
+++ openacs-4/packages/xowiki/tcl/folder-procs.tcl 15 Apr 2014 07:05:37 -0000 1.27.2.7
@@ -630,315 +630,7 @@
}
}
-#####################
-# #
-# YUI stuff #
-# #
-#####################
-namespace eval ::YUI {
-
- Object loader -ad_doc {
- The YUI Library comes with a "Loader" module, that resolves YUI-module
- dependencies. Also, it combines numerous files into one single file to
- increase page loading performance.
- This works only for the "hosted" YUI library. This Loader module should
- basically do the same (in future). For two simple calls like e.g.
- "::YUI::loader require menu" and "::YUI::loader require datatable"
- it should take care of selecting all the files needed and assemble them
- into one single resource, that may be delivered.
- Note, that this is not implemented yet.
- }
-
- loader set ajaxhelper 1
-
- # TODO: Make "::YUI::loader require -module XYZ" work everywhere "out-of-the-box"
- # Now, as we use "::xo:Page require_JS" we have to include the generated
- # header_stuff "manually" (e.g. in tcl-adp pairs), whereas ::template::head...
- # includes it directly, which is nice.
-
- loader ad_proc require {
- -module
- {-version "2.7.0b"}
- } {
- This is the key function of the loader, that will be used by other packages.
- @param module
- The YUI Module to be loaded
- } {
- my instvar ajaxhelper
- switch -- [string tolower $module] {
-
- utilities {
- # utilities.js: The utilities.js aggregate combines the Yahoo Global Object,
- # Dom Collection, Event Utility, Element Utility, Connection Manager,
- # Drag & Drop Utility, Animation Utility, YUI Loader and the Get Utility.
- # Use this file to reduce HTTP requests whenever you are including more
- # than three of its constituent components.
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "yahoo-dom-event/yahoo-dom-event.js"
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "utilities/utilities.js"
- }
- menubar {
- #
- # We should not have two different versions of the YUI
- # library on one page, because YUI2 (afaik) doesnt support
- # "sandboxing". If we use e.g. the yui-hosted utilities.js file here
- # we may end up with two YAHOO object definitions, because e.g.
- # the tree-procs uses the local yahoo-dom-event.
-
- # In future, the YUI loader object should be capable of
- # resolving such conflicts. for now, the simple fix is to stick to
- # the local versions, because then the requireJS function takes care
- # of duplicates.
- #
- my require -module "utilities"
- # todo : this is more than necessary
- foreach jsFile {
- "container/container-min.js"
- "treeview/treeview-min.js"
- "button/button-min.js"
- "menu/menu-min.js"
- "datasource/datasource-min.js"
- "autocomplete/autocomplete-min.js"
- "datatable/datatable-min.js"
- "selector/selector-min.js"
- } {
- ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper $jsFile
- }
-
- my require -module "reset-fonts-grids"
- my require -module "base"
-
- foreach cssFile {
- "container/assets/container.css"
- "datatable/assets/skins/sam/datatable.css"
- "button/assets/skins/sam/button.css"
- "assets/skins/sam/skin.css"
- "menu/assets/skins/sam/menu.css"
- } {
- ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper $cssFile
- }
- ::xowiki::Includelet require_YUI_CSS -ajaxhelper 1 "treeview/assets/folders/tree.css"
- }
- datatable {
- # see comment above
- my require -module "utilities"
- # todo : this is more than necessary
- foreach jsFile {
- "container/container-min.js"
- "treeview/treeview-min.js"
- "button/button-min.js"
- "menu/menu-min.js"
- "datasource/datasource-min.js"
- "autocomplete/autocomplete-min.js"
- "datatable/datatable-min.js"
- "selector/selector-min.js"
- } {
- ::xowiki::Includelet require_YUI_JS -version "2.7.0b" -ajaxhelper $ajaxhelper $jsFile
- }
-
- my require -module "reset-fonts-grids"
- my require -module "base"
-
- foreach cssFile {
- "container/assets/container.css"
- "datatable/assets/skins/sam/datatable.css"
- "button/assets/skins/sam/button.css"
- "assets/skins/sam/skin.css"
- "menu/assets/skins/sam/menu.css"
- } {
- ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper $cssFile
- }
- #::xowiki::Includelet require_YUI_CSS -ajaxhelper 1 "treeview/assets/skins/sam/treeview.css"
- #::xowiki::Includelet require_YUI_CSS -ajaxhelper 1 "treeview/assets/folders/tree.css"
- }
- reset {
- ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper "reset/reset.css"
- }
- fonts {
- ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper "fonts/fonts.css"
- }
- grids {
- ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper "grids/grids.css"
- }
- base {
- ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper "base/base.css"
- }
- "reset-fonts-grids" {
- ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper "reset-fonts-grids/reset-fonts-grids.css"
- }
- }
- }
-
- Class ::xowiki::YUIDataTable \
- -superclass ::xo::Table \
- -parameter {
- {skin "yui-skin-sam"}
- }
-
- ::xowiki::YUIDataTable instproc init {} {
- set trn_mixin [expr {[lang::util::translator_mode_p] ?"::xo::TRN-Mode" : ""}]
- my render_with YUIDataTableRenderer $trn_mixin
- next
- }
-
- Class AnchorField \
- -superclass ::xo::Table::AnchorField \
- -ad_doc "
- In addition to the standard TableWidget's AnchorField, we also allow the attributes
-
-
onclick
-
target
-
- " \
- -instproc get-slots {} {
- set slots [list -[my name]]
- foreach subfield {href title CSSclass target onclick} {
- lappend slots [list -[my name].$subfield ""]
- }
- return $slots
- }
-}
-
-# TODO Allow renderers from other namespaces in 30-widget-procs
-
-namespace eval ::xo::Table {
-
- Class create YUIDataTableRenderer \
- -superclass TABLE3 \
- -instproc init_renderer {} {
- next
- my set css.table-class list-table
- my set css.tr.even-class even
- my set css.tr.odd-class odd
- my set id [::xowiki::Includelet js_name [::xowiki::Includelet html_id [self]]]
- }
-
- YUIDataTableRenderer ad_instproc -private render_yui_js {} {
- Generates the JavaScript fragment, that is put below and
- (progressively enhances) the HTML table.
- } {
- my instvar id
- set container ${id}_container
- set datasource ${id}_datasource
- set datatable ${id}_datatable
- set coldef ${id}_coldef
-
- set js "var $datasource = new YAHOO.util.DataSource(YAHOO.util.Dom.get('$id')); \n"
- append js "$datasource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE; \n"
- append js "$datasource.responseSchema = \{ \n"
- append js " fields: \[ \n"
- set js_fields [list]
- foreach field [[self]::__columns children] {
- if {[$field hide]} continue
- lappend js_fields " \{ key: \"[$field set name]\" \}"
- }
- append js [join $js_fields ", "] " \] \n\};\n"
- append js "var $coldef = \[\n"
- set js_fields [list]
- foreach field [[self]::__columns children] {
- if {[$field hide]} continue
- if {[$field istype HiddenField]} continue
- if {[$field istype BulkAction]} {
- set label ""
- set sortable false
- } else {
- set label [$field label]
- set sortable [expr {[$field exists sortable] ? [$field set sortable] : true}]
- }
- lappend js_fields " \{ key: \"[$field set name]\" , sortable: $sortable, label: \"$label\" \}"
- }
- append js [join $js_fields ", "] "\];\n"
- append js "var $datatable = new YAHOO.widget.DataTable('$container', $coldef, $datasource);\n"
- return $js
- }
-
- YUIDataTableRenderer instproc render-body {} {
- html::thead {
- html::tr -class list-header {
- foreach o [[self]::__columns children] {
- if {[$o hide]} continue
- $o render
- }
- }
- }
- set children [my children]
- html::tbody {
- foreach line [my children] {
- html::tr -class [expr {[my incr __rowcount]%2 ? [my set css.tr.odd-class] : [my set css.tr.even-class] }] {
- foreach field [[self]::__columns children] {
- if {[$field hide]} continue
- html::td [concat [list class list] [$field html]] {
- $field render-data $line
- }
- }
- }
- }
- }
- }
-
- YUIDataTableRenderer instproc render {} {
- ::YUI::loader require -module "datatable"
- if {![my isobject [self]::__actions]} {my actions {}}
- if {![my isobject [self]::__bulkactions]} {my __bulkactions {}}
- set bulkactions [[self]::__bulkactions children]
- if {[llength $bulkactions]>0} {
- set name [[self]::__bulkactions set __identifier]
- } else {
- set name [::xowiki::Includelet js_name [self]]
- }
- # TODO: maybe use skin everywhere? hen to use style/CSSclass or skin?
- set skin [expr {[my exists skin] ? [my set skin] : ""}]
- html::div -id [my set id]_wrapper -class $skin {
- html::form -name $name -id $name -method POST {
- html::div -id [my set id]_container {
- html::table -id [my set id] -class [my set css.table-class] {
- # TODO do i need that?
- my render-actions
- my render-body
- }
- if {[llength $bulkactions]>0} { my render-bulkactions }
- }
- }
- ::xo::Page requireJS "YAHOO.util.Event.onDOMReady(function () {\n[my render_yui_js]});"
- }
- }
-
-
- #Class create YUIDataTableRenderer::AnchorField -superclass TABLE::AnchorField
-
- Class create YUIDataTableRenderer::AnchorField \
- -superclass TABLE::Field \
- -ad_doc "
- In addition to the standard TableWidget's AnchorField, we also allow the attributes
-
-
onclick
-
target
-
- " \
- -instproc render-data {line} {
- set __name [my name]
- if {[$line exists $__name.href] &&
- [set href [$line set $__name.href]] ne ""} {
- # use the CSS class rather from the Field than not the line
- my instvar CSSclass
- $line instvar [list $__name.title title] \
- [list $__name.target target] \
- [list $__name.onclick onclick]
- html::a [my get_local_attributes href title {CSSclass class} target onclick] {
- return "[next]"
- }
- }
- next
- }
-
- Class create YUIDataTableRenderer::Action -superclass TABLE::Action
- Class create YUIDataTableRenderer::Field -superclass TABLE::Field
- Class create YUIDataTableRenderer::HiddenField -superclass TABLE::HiddenField
- Class create YUIDataTableRenderer::ImageField -superclass TABLE::ImageField
- Class create YUIDataTableRenderer::ImageAnchorField -superclass TABLE::ImageAnchorField
- Class create YUIDataTableRenderer::BulkAction -superclass TABLE::BulkAction
-}
-
::xo::library source_dependent
#
Index: openacs-4/packages/xowiki/tcl/menu-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/menu-procs.tcl,v
diff -u -N -r1.7.2.3 -r1.7.2.4
--- openacs-4/packages/xowiki/tcl/menu-procs.tcl 15 Apr 2014 06:47:00 -0000 1.7.2.3
+++ openacs-4/packages/xowiki/tcl/menu-procs.tcl 15 Apr 2014 07:05:38 -0000 1.7.2.4
@@ -91,231 +91,7 @@
}
- ::xo::tdom::Class YUIMenuItemList \
- -superclass Menu \
- -parameter {
- header
- }
-
- YUIMenuItemList ad_instproc render {} {} {
- if {[my exists header]} {
- html::h6 {
- html::t [my header]
- }
- }
- next
- }
-
- ###################################################
#
- # YUIMenu
- #
- ::xo::tdom::Class create YUIMenu \
- -superclass Menu \
- -parameter {
- header
- footer
- shadow
- {autorender false}
- {configuration {{}}}
- }
-
- YUIMenu instproc init {} {
- ::xowiki::Includelet require_YUI_CSS -ajaxhelper 1 "menu/assets/skins/sam/menu.css"
- ::xowiki::Includelet require_YUI_JS -ajaxhelper 1 "yahoo-dom-event/yahoo-dom-event.js"
- ::xowiki::Includelet require_YUI_JS -ajaxhelper 1 "container/container_core-min.js"
- ::xowiki::Includelet require_YUI_JS -ajaxhelper 1 "menu/menu-min.js"
- next
- }
-
- YUIMenu instproc split_menu_groups {list} {
- #
- # split the list of entries into groups, which will be separated
- # with lines in the rendering
- #
- set result [list]
- if {[llength $list] < 1} {return $result}
- set group_name [[lindex $list 0] group]
- set group_list [list]
- foreach e $list {
- set gn [$e group]
- if {$gn ne $group_name} {
- lappend result $group_list
- set group_name $gn
- set group_list [list]
- }
- lappend group_list $e
- }
- lappend result $group_list
- return $result
- }
-
- YUIMenu ad_instproc render {} {
- http://developer.yahoo.com/yui/menu/
- } {
- my append CSSclass " yuimenu"
-
- # I want the menu to show up when JS is disabled
- # This gets overridden by JS, so its only relevant for the non-JS version
- #my set style "visibility: visible; position: relative;"
-
- html::div [my get_attributes {CSSclass class} id style] {
- # Header
- html::t \n
- if {[my exists header]} {
- html::div -class "hd" {
- html::t [my header]
- }
- }
- # Body
- html::t \n
- html::div -class "bd" {
- foreach group [my split_menu_groups [my children]] {
- html::ul {
- foreach menuitemlist $group {$menuitemlist render}
- }
- }
- }
- # Footer
- if {[my exists footer]} {
- html::div -class "ft" {
- html::t [my footer]
- }
- }
- # Shadow
- if {[my exists shadow]} {
- html::div -class "yui-menu-shadow" {}
- }
- # JavaScript
- # only "root-level" menus need JS
- # TODO: is this parent-check sufficient / future-safe?
- if {![my exists __parent]} {
- html::script -type "text/javascript" {
- html::t "var [my js_name] = new YAHOO.widget.Menu(\"[my id]\", [my set configuration]);"
- html::t "
- [my js_name].render();
- [my js_name].show();
- "
- }
- }
- }
- }
-
- #
- # YUIMenuItem
- #
- ::xo::tdom::Class create YUIMenuItem \
- -superclass MenuItem \
- -parameter {
- {href "#"}
- helptext
- }
-
- YUIMenuItem ad_instproc render {} {doku} {
- html::li [my get_attributes id {CSSclass class} style] {
- # if we have no href, mark entry as disabled
- if {![my exists href] || [my href] eq ""} {my append linkclass " disabled"}
- html::a [my get_attributes target href {linkclass class} title] {
- html::t [my text]
- if {[my exists helptext]} {
- html::em {
- html::t [my helptext]
- }
- }
- }
- foreach menu [my children] {$menu render}
- }
- html::t \n
- }
-
-
- #
- # YUIMenuBar
- #
- ::xo::tdom::Class create YUIMenuBar \
- -superclass YUIMenu \
- -parameter {
- {navbar true}
- }
-
- YUIMenuBar ad_instproc render {} {
- http://developer.yahoo.com/yui/menu/#menubar
- MenuBar looks best without a header and with one MenuItemList only
- } {
- my append CSSclass " yuimenubar"
- if {[my navbar]} {my append CSSclass " yuimenubarnav"}
- html::div [my get_attributes id {CSSclass class}] {
- html::div -class "bd" {
- html::t \n
- html::ul -class "first-of-type" {
- foreach li [my children] {$li render}
- }
- html::t \n
- }
- html::t \n
- ::xo::Page set_property body class "yui-skin-sam"
- ::xo::Page requireJS "YAHOO.util.Event.onDOMReady(function () {
- var [my js_name] = new YAHOO.widget.MenuBar('[my id]', [my set configuration]);
- [my js_name].render();
- });"
- }
- }
-
- #
- # YUIMenuBarItem
- #
- ::xo::tdom::Class create YUIMenuBarItem \
- -superclass YUIMenuItem
-
- YUIMenuBarItem ad_instproc init {} {} {
- #goto YUIMenuItem and set all those nice defaults
- next
- my append CSSclass " first-of-type"
- if {![my exists href]} {
- # If not set to #, the title of the menubaritems wont expand the submenu (only the arrow)
- my set href "#"
- }
- }
-
-
- #
- # YUIContextMenu
- #
-
- # TODO: Support for Multiple Element IDs/Refs as Trigger
-
- ::xo::tdom::Class YUIContextMenu \
- -superclass YUIMenu \
- -parameter {
- {trigger "document"}
- {triggertype "reference"}
- }
-
- YUIContextMenu ad_instproc render {} {
- http://developer.yahoo.com/yui/menu/#contextmenu
- } {
- my append CSSclass " yuimenu"
- html::div [my get_attributes id {CSSclass class}] {
- html::div -class "bd" {
- html::ul {
- foreach li [my children] {$li render}
- }
- }
- html::script -type "text/javascript" {
- html::t "var [my js_name] = new YAHOO.widget.ContextMenu('[my id]', { trigger: '[my set trigger]' } );"
- html::t "[my js_name].render(document.body);"
- }
- }
- }
-
- #
- # YUIContextMenuItem
- #
- ::xo::tdom::Class YUIContextMenuItem \
- -superclass YUIMenuItem
-
-
- #
# Simple Generic MenuBar
#
# Class for creating and updating Menubars in an incremental
@@ -511,45 +287,15 @@
}
::xowiki::MenuBar instproc render-preferred {} {
- switch [$context_package_id get_parameter "PreferredCSSToolkit" yui] {
+ switch [[xo::cc package_id] get_parameter "PreferredCSSToolkit" yui] {
bootstrap {set menuBarRenderer render-bootstrap}
default {set menuBarRenderer render-yui}
}
my $menuBarRenderer
}
- ::xowiki::MenuBar instproc render-yui {} {
- set M [my content]
- set mb [::xowiki::YUIMenuBar -id [my get_prop $M id] -configuration {
- {autosubmenudisplay: false, keepopen: true, lazyload: false}
- } {
- foreach {menu_att menu} $M {
- if {$menu_att eq "id"} continue
- if {[llength $menu_att] > 1} {
- # We expect a dict as second list element.. but ignore here for the time being
- lassign $menu_att menu_att props
- }
- ::xowiki::YUIMenuBarItem -text [my get_prop $menu text] {
- ::xowiki::YUIMenu {
- foreach {item_att item} $menu {
- if {[string match {[a-z]*} $item_att]} continue
- set text [my get_prop $item text]
- set url [my get_prop $item url]
- set group [my get_prop $item group]
- #my msg "ia=$item_att group '$group' // t=$text item=$item"
- ::xowiki::YUIMenuItem -text $text -href $url -group $group {}
- }
- }
- }
- }
- }]
- return [$mb asHTML]
- }
namespace export Menu
- namespace export YUIMenuBar YUIMenuBarItem
- namespace export YUIMenu YUIMenuItem YUIMenuItemList
- namespace export YUIContextMenu YUIContextMenuItem
# end of namespace
}
::xo::library source_dependent
Index: openacs-4/packages/xowiki/tcl/yui-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/yui-procs.tcl,v
diff -u -N
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/xowiki/tcl/yui-procs.tcl 15 Apr 2014 07:05:38 -0000 1.1.2.1
@@ -0,0 +1,591 @@
+::xo::library doc {
+ yui procs: provide some support for yui library
+
+ @creation-date 2014-04-14
+ @author Gustaf Neumann
+ @cvs-id $Id: yui-procs.tcl,v 1.1.2.1 2014/04/15 07:05:38 gustafn Exp $
+}
+
+::xo::library require menu-procs
+
+namespace eval ::xowiki {
+
+ ::xo::tdom::Class YUIMenuItemList \
+ -superclass Menu \
+ -parameter {
+ header
+ }
+
+ YUIMenuItemList ad_instproc render {} {} {
+ if {[my exists header]} {
+ html::h6 {
+ html::t [my header]
+ }
+ }
+ next
+ }
+
+ ###################################################
+ #
+ # YUIMenu
+ #
+ ::xo::tdom::Class create YUIMenu \
+ -superclass Menu \
+ -parameter {
+ header
+ footer
+ shadow
+ {autorender false}
+ {configuration {{}}}
+ }
+
+ YUIMenu instproc init {} {
+ ::xowiki::Includelet require_YUI_CSS -ajaxhelper 1 "menu/assets/skins/sam/menu.css"
+ ::xowiki::Includelet require_YUI_JS -ajaxhelper 1 "yahoo-dom-event/yahoo-dom-event.js"
+ ::xowiki::Includelet require_YUI_JS -ajaxhelper 1 "container/container_core-min.js"
+ ::xowiki::Includelet require_YUI_JS -ajaxhelper 1 "menu/menu-min.js"
+ next
+ }
+
+ YUIMenu instproc split_menu_groups {list} {
+ #
+ # split the list of entries into groups, which will be separated
+ # with lines in the rendering
+ #
+ set result [list]
+ if {[llength $list] < 1} {return $result}
+ set group_name [[lindex $list 0] group]
+ set group_list [list]
+ foreach e $list {
+ set gn [$e group]
+ if {$gn ne $group_name} {
+ lappend result $group_list
+ set group_name $gn
+ set group_list [list]
+ }
+ lappend group_list $e
+ }
+ lappend result $group_list
+ return $result
+ }
+
+ YUIMenu ad_instproc render {} {
+ http://developer.yahoo.com/yui/menu/
+ } {
+ my append CSSclass " yuimenu"
+
+ # I want the menu to show up when JS is disabled
+ # This gets overridden by JS, so its only relevant for the non-JS version
+ #my set style "visibility: visible; position: relative;"
+
+ html::div [my get_attributes {CSSclass class} id style] {
+ # Header
+ html::t \n
+ if {[my exists header]} {
+ html::div -class "hd" {
+ html::t [my header]
+ }
+ }
+ # Body
+ html::t \n
+ html::div -class "bd" {
+ foreach group [my split_menu_groups [my children]] {
+ html::ul {
+ foreach menuitemlist $group {$menuitemlist render}
+ }
+ }
+ }
+ # Footer
+ if {[my exists footer]} {
+ html::div -class "ft" {
+ html::t [my footer]
+ }
+ }
+ # Shadow
+ if {[my exists shadow]} {
+ html::div -class "yui-menu-shadow" {}
+ }
+ # JavaScript
+ # only "root-level" menus need JS
+ # TODO: is this parent-check sufficient / future-safe?
+ if {![my exists __parent]} {
+ html::script -type "text/javascript" {
+ html::t "var [my js_name] = new YAHOO.widget.Menu(\"[my id]\", [my set configuration]);"
+ html::t "
+ [my js_name].render();
+ [my js_name].show();
+ "
+ }
+ }
+ }
+ }
+
+ #
+ # YUIMenuItem
+ #
+ ::xo::tdom::Class create YUIMenuItem \
+ -superclass MenuItem \
+ -parameter {
+ {href "#"}
+ helptext
+ }
+
+ YUIMenuItem ad_instproc render {} {doku} {
+ html::li [my get_attributes id {CSSclass class} style] {
+ # if we have no href, mark entry as disabled
+ if {![my exists href] || [my href] eq ""} {my append linkclass " disabled"}
+ html::a [my get_attributes target href {linkclass class} title] {
+ html::t [my text]
+ if {[my exists helptext]} {
+ html::em {
+ html::t [my helptext]
+ }
+ }
+ }
+ foreach menu [my children] {$menu render}
+ }
+ html::t \n
+ }
+
+
+ #
+ # YUIMenuBar
+ #
+ ::xo::tdom::Class create YUIMenuBar \
+ -superclass YUIMenu \
+ -parameter {
+ {navbar true}
+ }
+
+ YUIMenuBar ad_instproc render {} {
+ http://developer.yahoo.com/yui/menu/#menubar
+ MenuBar looks best without a header and with one MenuItemList only
+ } {
+ my append CSSclass " yuimenubar"
+ if {[my navbar]} {my append CSSclass " yuimenubarnav"}
+ html::div [my get_attributes id {CSSclass class}] {
+ html::div -class "bd" {
+ html::t \n
+ html::ul -class "first-of-type" {
+ foreach li [my children] {$li render}
+ }
+ html::t \n
+ }
+ html::t \n
+ ::xo::Page set_property body class "yui-skin-sam"
+ ::xo::Page requireJS "YAHOO.util.Event.onDOMReady(function () {
+ var [my js_name] = new YAHOO.widget.MenuBar('[my id]', [my set configuration]);
+ [my js_name].render();
+ });"
+ }
+ }
+
+ #
+ # YUIMenuBarItem
+ #
+ ::xo::tdom::Class create YUIMenuBarItem \
+ -superclass YUIMenuItem
+
+ YUIMenuBarItem ad_instproc init {} {} {
+ #goto YUIMenuItem and set all those nice defaults
+ next
+ my append CSSclass " first-of-type"
+ if {![my exists href]} {
+ # If not set to #, the title of the menubaritems wont expand the submenu (only the arrow)
+ my set href "#"
+ }
+ }
+
+
+ #
+ # YUIContextMenu
+ #
+
+ # TODO: Support for Multiple Element IDs/Refs as Trigger
+
+ ::xo::tdom::Class YUIContextMenu \
+ -superclass YUIMenu \
+ -parameter {
+ {trigger "document"}
+ {triggertype "reference"}
+ }
+
+ YUIContextMenu ad_instproc render {} {
+ http://developer.yahoo.com/yui/menu/#contextmenu
+ } {
+ my append CSSclass " yuimenu"
+ html::div [my get_attributes id {CSSclass class}] {
+ html::div -class "bd" {
+ html::ul {
+ foreach li [my children] {$li render}
+ }
+ }
+ html::script -type "text/javascript" {
+ html::t "var [my js_name] = new YAHOO.widget.ContextMenu('[my id]', { trigger: '[my set trigger]' } );"
+ html::t "[my js_name].render(document.body);"
+ }
+ }
+ }
+
+ #
+ # YUIContextMenuItem
+ #
+ ::xo::tdom::Class YUIContextMenuItem \
+ -superclass YUIMenuItem
+
+
+
+ ::xowiki::MenuBar instproc render-yui {} {
+ set M [my content]
+ set mb [::xowiki::YUIMenuBar -id [my get_prop $M id] -configuration {
+ {autosubmenudisplay: false, keepopen: true, lazyload: false}
+ } {
+ foreach {menu_att menu} $M {
+ if {$menu_att eq "id"} continue
+ if {[llength $menu_att] > 1} {
+ # We expect a dict as second list element.. but ignore here for the time being
+ lassign $menu_att menu_att props
+ }
+ ::xowiki::YUIMenuBarItem -text [my get_prop $menu text] {
+ ::xowiki::YUIMenu {
+ foreach {item_att item} $menu {
+ if {[string match {[a-z]*} $item_att]} continue
+ set text [my get_prop $item text]
+ set url [my get_prop $item url]
+ set group [my get_prop $item group]
+ #my msg "ia=$item_att group '$group' // t=$text item=$item"
+ ::xowiki::YUIMenuItem -text $text -href $url -group $group {}
+ }
+ }
+ }
+ }
+ }]
+ return [$mb asHTML]
+ }
+
+ namespace export YUIMenuBar YUIMenuBarItem
+ namespace export YUIMenu YUIMenuItem YUIMenuItemList
+ namespace export YUIContextMenu YUIContextMenuItem
+}
+
+
+###############################################################################
+# YUI loader
+###############################################################################
+
+namespace eval ::YUI {
+
+ Object loader -ad_doc {
+ The YUI Library comes with a "Loader" module, that resolves YUI-module
+ dependencies. Also, it combines numerous files into one single file to
+ increase page loading performance.
+ This works only for the "hosted" YUI library. This Loader module should
+ basically do the same (in future). For two simple calls like e.g.
+ "::YUI::loader require menu" and "::YUI::loader require datatable"
+ it should take care of selecting all the files needed and assemble them
+ into one single resource, that may be delivered.
+ Note, that this is not implemented yet.
+ }
+
+ loader set ajaxhelper 1
+
+ # TODO: Make "::YUI::loader require -module XYZ" work everywhere "out-of-the-box"
+ # Now, as we use "::xo:Page require_JS" we have to include the generated
+ # header_stuff "manually" (e.g. in tcl-adp pairs), whereas ::template::head...
+ # includes it directly, which is nice.
+
+ loader ad_proc require {
+ -module
+ {-version "2.7.0b"}
+ } {
+ This is the key function of the loader, that will be used by other packages.
+ @param module
+ The YUI Module to be loaded
+ } {
+ my instvar ajaxhelper
+ switch -- [string tolower $module] {
+
+ utilities {
+ # utilities.js: The utilities.js aggregate combines the Yahoo Global Object,
+ # Dom Collection, Event Utility, Element Utility, Connection Manager,
+ # Drag & Drop Utility, Animation Utility, YUI Loader and the Get Utility.
+ # Use this file to reduce HTTP requests whenever you are including more
+ # than three of its constituent components.
+ ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "yahoo-dom-event/yahoo-dom-event.js"
+ ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper "utilities/utilities.js"
+ }
+ menubar {
+ #
+ # We should not have two different versions of the YUI
+ # library on one page, because YUI2 (afaik) doesnt support
+ # "sandboxing". If we use e.g. the yui-hosted utilities.js file here
+ # we may end up with two YAHOO object definitions, because e.g.
+ # the tree-procs uses the local yahoo-dom-event.
+
+ # In future, the YUI loader object should be capable of
+ # resolving such conflicts. for now, the simple fix is to stick to
+ # the local versions, because then the requireJS function takes care
+ # of duplicates.
+ #
+ my require -module "utilities"
+ # todo : this is more than necessary
+ foreach jsFile {
+ "container/container-min.js"
+ "treeview/treeview-min.js"
+ "button/button-min.js"
+ "menu/menu-min.js"
+ "datasource/datasource-min.js"
+ "autocomplete/autocomplete-min.js"
+ "datatable/datatable-min.js"
+ "selector/selector-min.js"
+ } {
+ ::xowiki::Includelet require_YUI_JS -ajaxhelper $ajaxhelper $jsFile
+ }
+
+ my require -module "reset-fonts-grids"
+ my require -module "base"
+
+ foreach cssFile {
+ "container/assets/container.css"
+ "datatable/assets/skins/sam/datatable.css"
+ "button/assets/skins/sam/button.css"
+ "assets/skins/sam/skin.css"
+ "menu/assets/skins/sam/menu.css"
+ } {
+ ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper $cssFile
+ }
+ ::xowiki::Includelet require_YUI_CSS -ajaxhelper 1 "treeview/assets/folders/tree.css"
+ }
+ datatable {
+ # see comment above
+ my require -module "utilities"
+ # todo : this is more than necessary
+ foreach jsFile {
+ "container/container-min.js"
+ "treeview/treeview-min.js"
+ "button/button-min.js"
+ "menu/menu-min.js"
+ "datasource/datasource-min.js"
+ "autocomplete/autocomplete-min.js"
+ "datatable/datatable-min.js"
+ "selector/selector-min.js"
+ } {
+ ::xowiki::Includelet require_YUI_JS -version "2.7.0b" -ajaxhelper $ajaxhelper $jsFile
+ }
+
+ my require -module "reset-fonts-grids"
+ my require -module "base"
+
+ foreach cssFile {
+ "container/assets/container.css"
+ "datatable/assets/skins/sam/datatable.css"
+ "button/assets/skins/sam/button.css"
+ "assets/skins/sam/skin.css"
+ "menu/assets/skins/sam/menu.css"
+ } {
+ ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper $cssFile
+ }
+ #::xowiki::Includelet require_YUI_CSS -ajaxhelper 1 "treeview/assets/skins/sam/treeview.css"
+ #::xowiki::Includelet require_YUI_CSS -ajaxhelper 1 "treeview/assets/folders/tree.css"
+ }
+ reset {
+ ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper "reset/reset.css"
+ }
+ fonts {
+ ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper "fonts/fonts.css"
+ }
+ grids {
+ ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper "grids/grids.css"
+ }
+ base {
+ ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper "base/base.css"
+ }
+ "reset-fonts-grids" {
+ ::xowiki::Includelet require_YUI_CSS -ajaxhelper $ajaxhelper "reset-fonts-grids/reset-fonts-grids.css"
+ }
+ }
+ }
+
+
+ Class AnchorField \
+ -superclass ::xo::Table::AnchorField \
+ -ad_doc "
+ In addition to the standard TableWidget's AnchorField, we also allow the attributes
+
+
onclick
+
target
+
+ " \
+ -instproc get-slots {} {
+ set slots [list -[my name]]
+ foreach subfield {href title CSSclass target onclick} {
+ lappend slots [list -[my name].$subfield ""]
+ }
+ return $slots
+ }
+}
+
+###############################################################################
+# YUI table
+###############################################################################
+
+# TODO Allow renderers from other namespaces in 30-widget-procs
+
+namespace eval ::xo::Table {
+
+ Class ::xowiki::YUIDataTable \
+ -superclass ::xo::Table \
+ -parameter {
+ {skin "yui-skin-sam"}
+ }
+
+ ::xowiki::YUIDataTable instproc init {} {
+ set trn_mixin [expr {[lang::util::translator_mode_p] ?"::xo::TRN-Mode" : ""}]
+ my render_with YUIDataTableRenderer $trn_mixin
+ next
+ }
+
+ Class create YUIDataTableRenderer \
+ -superclass TABLE3 \
+ -instproc init_renderer {} {
+ next
+ my set css.table-class list-table
+ my set css.tr.even-class even
+ my set css.tr.odd-class odd
+ my set id [::xowiki::Includelet js_name [::xowiki::Includelet html_id [self]]]
+ }
+
+ YUIDataTableRenderer ad_instproc -private render_yui_js {} {
+ Generates the JavaScript fragment, that is put below and
+ (progressively enhances) the HTML table.
+ } {
+ my instvar id
+ set container ${id}_container
+ set datasource ${id}_datasource
+ set datatable ${id}_datatable
+ set coldef ${id}_coldef
+
+ set js "var $datasource = new YAHOO.util.DataSource(YAHOO.util.Dom.get('$id')); \n"
+ append js "$datasource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE; \n"
+ append js "$datasource.responseSchema = \{ \n"
+ append js " fields: \[ \n"
+ set js_fields [list]
+ foreach field [[self]::__columns children] {
+ if {[$field hide]} continue
+ lappend js_fields " \{ key: \"[$field set name]\" \}"
+ }
+ append js [join $js_fields ", "] " \] \n\};\n"
+ append js "var $coldef = \[\n"
+ set js_fields [list]
+ foreach field [[self]::__columns children] {
+ if {[$field hide]} continue
+ if {[$field istype HiddenField]} continue
+ if {[$field istype BulkAction]} {
+ set label ""
+ set sortable false
+ } else {
+ set label [$field label]
+ set sortable [expr {[$field exists sortable] ? [$field set sortable] : true}]
+ }
+ lappend js_fields " \{ key: \"[$field set name]\" , sortable: $sortable, label: \"$label\" \}"
+ }
+ append js [join $js_fields ", "] "\];\n"
+ append js "var $datatable = new YAHOO.widget.DataTable('$container', $coldef, $datasource);\n"
+ return $js
+ }
+
+ YUIDataTableRenderer instproc render-body {} {
+ html::thead {
+ html::tr -class list-header {
+ foreach o [[self]::__columns children] {
+ if {[$o hide]} continue
+ $o render
+ }
+ }
+ }
+ set children [my children]
+ html::tbody {
+ foreach line [my children] {
+ html::tr -class [expr {[my incr __rowcount]%2 ? [my set css.tr.odd-class] : [my set css.tr.even-class] }] {
+ foreach field [[self]::__columns children] {
+ if {[$field hide]} continue
+ html::td [concat [list class list] [$field html]] {
+ $field render-data $line
+ }
+ }
+ }
+ }
+ }
+ }
+
+ YUIDataTableRenderer instproc render {} {
+ ::YUI::loader require -module "datatable"
+ if {![my isobject [self]::__actions]} {my actions {}}
+ if {![my isobject [self]::__bulkactions]} {my __bulkactions {}}
+ set bulkactions [[self]::__bulkactions children]
+ if {[llength $bulkactions]>0} {
+ set name [[self]::__bulkactions set __identifier]
+ } else {
+ set name [::xowiki::Includelet js_name [self]]
+ }
+ # TODO: maybe use skin everywhere? hen to use style/CSSclass or skin?
+ set skin [expr {[my exists skin] ? [my set skin] : ""}]
+ html::div -id [my set id]_wrapper -class $skin {
+ html::form -name $name -id $name -method POST {
+ html::div -id [my set id]_container {
+ html::table -id [my set id] -class [my set css.table-class] {
+ # TODO do i need that?
+ my render-actions
+ my render-body
+ }
+ if {[llength $bulkactions]>0} { my render-bulkactions }
+ }
+ }
+ ::xo::Page requireJS "YAHOO.util.Event.onDOMReady(function () {\n[my render_yui_js]});"
+ }
+ }
+
+
+ #Class create YUIDataTableRenderer::AnchorField -superclass TABLE::AnchorField
+
+ Class create YUIDataTableRenderer::AnchorField \
+ -superclass TABLE::Field \
+ -ad_doc "
+ In addition to the standard TableWidget's AnchorField, we also allow the attributes
+
+
onclick
+
target
+
+ " \
+ -instproc render-data {line} {
+ set __name [my name]
+ if {[$line exists $__name.href] &&
+ [set href [$line set $__name.href]] ne ""} {
+ # use the CSS class rather from the Field than not the line
+ my instvar CSSclass
+ $line instvar [list $__name.title title] \
+ [list $__name.target target] \
+ [list $__name.onclick onclick]
+ html::a [my get_local_attributes href title {CSSclass class} target onclick] {
+ return "[next]"
+ }
+ }
+ next
+ }
+
+ Class create YUIDataTableRenderer::Action -superclass TABLE::Action
+ Class create YUIDataTableRenderer::Field -superclass TABLE::Field
+ Class create YUIDataTableRenderer::HiddenField -superclass TABLE::HiddenField
+ Class create YUIDataTableRenderer::ImageField -superclass TABLE::ImageField
+ Class create YUIDataTableRenderer::ImageAnchorField -superclass TABLE::ImageAnchorField
+ Class create YUIDataTableRenderer::BulkAction -superclass TABLE::BulkAction
+}
+
+::xo::library source_dependent
+
+#
+# Local variables:
+# mode: tcl
+# tcl-indent-level: 2
+# indent-tabs-mode: nil
+# End: