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.3.2.2 -r1.3.2.3 --- openacs-4/packages/xowiki/tcl/bootstrap-procs.tcl 21 Mar 2016 09:50:34 -0000 1.3.2.2 +++ openacs-4/packages/xowiki/tcl/bootstrap-procs.tcl 23 Mar 2016 11:57:25 -0000 1.3.2.3 @@ -33,16 +33,108 @@ BootstrapNavbar instproc init {} { ::xo::Page requireJS "/resources/xowiki/jquery/jquery.min.js" set css [parameter::get_global_value -package_key xowiki -parameter BootstrapCSS] - set js [parameter::get_global_value -package_key xowiki -parameter BootstrapJS] + set js [parameter::get_global_value -package_key xowiki -parameter BootstrapJS] foreach url $css {::xo::Page requireCSS $url} foreach url $js {::xo::Page requireJS $url} - #::xo::Page requireJS "/resources/xowiki/dropzone.js" next } - BootstrapNavbar instproc dropzoneJS {-uploadlink:required} { + + BootstrapNavbar ad_instproc render {} { + http://getbootstrap.com/components/#navbar + } { + html::nav -class [my navbarClass] -role "navigation" { + # + # Render the pull down menues + # + html::div -class [my containerClass] { + set rightMenuEntries {} + foreach entry [my children] { + if {[$entry istype ::xowiki::BootstrapNavbarDropdownMenu]} { + $entry render + } else { + lappend rightMenuEntries $entry + } + } + if {[llength $rightMenuEntries] > 0} { + html::ul -class "nav navbar-nav navbar-right" { + foreach entry $rightMenuEntries { + $entry render + } + } + } + } + } + } + + + # + # BootstrapNavbarDropdownMenu + # + ::xo::tdom::Class create BootstrapNavbarDropdownMenu \ + -superclass Menu \ + -parameter { + text + header + {brand false} + } + + BootstrapNavbarDropdownMenu ad_instproc render {} {doku} { + # TODO: Add support for group-headers + # get group header + set group 1 - ::html::script -type "text/javascript" { + html::ul -class "nav navbar-nav" { + html::li -class "dropdown" { + set class "dropdown-toggle" + if {[my brand]} {lappend class "navbar-brand"} + html::a -href "\#" -class $class -data-toggle "dropdown" { + html::t [my text] + html::b -class "caret" + } + html::ul -class "dropdown-menu" { + foreach dropdownmenuitem [my children] { + if {[$dropdownmenuitem set group] ne "" && [$dropdownmenuitem set group] ne $group } { + html::li -class "divider" + set group [$dropdownmenuitem set group] + } + $dropdownmenuitem render + } + } + } + } + } + # + # BootstrapNavbarDropdownMenuItem + # + ::xo::tdom::Class create BootstrapNavbarDropdownMenuItem \ + -superclass MenuItem \ + -parameter { + {href "#"} + helptext + } + + BootstrapNavbarDropdownMenuItem ad_instproc render {} {doku} { + html::li -class [expr {[my set href] eq "" ? "disabled": ""}] { + html::a [my get_attributes target href title] { + html::t [my text] + } + } + } + + # + # BootstrapNavbarDropzone + # + ::xo::tdom::Class create BootstrapNavbarDropzone \ + -superclass MenuComponent \ + -parameter { + {href "#"} + text + uploader + } + + BootstrapNavbarDropzone instproc js {-uploadlink:required} { + html::script -type "text/javascript" { html::t [subst -nocommands { + function($) { 'use strict'; @@ -116,18 +208,19 @@ } } - BootstrapNavbar instproc dropzone {-uploadlink:required} { - html::ul -class "nav navbar-nav navbar-right" { + + BootstrapNavbarDropzone ad_instproc render {} {doku} { + if {${:href} ni {"" "#"}} { html::li { - ::html::form -method "post" -enctype "multipart/form-data" \ + html::form -method "post" -enctype "multipart/form-data" \ -style "display: none;" \ -id "js-upload-form" { - ::html::div -class "form-inline" { - ::html::div -class "form-group" { - ::html::input -type "file" -name {files[]} -id "js-upload-files" -multiple multiple + html::div -class "form-inline" { + html::div -class "form-group" { + html::input -type "file" -name {files[]} -id "js-upload-files" -multiple multiple } - ::html::button -type "submit" -class "btn btn-sm btn-primary" -id "js-upload-submit" { - html::t "Upload files" + html::button -type "submit" -class "btn btn-sm btn-primary" -id "js-upload-submit" { + html::t ${:text} } } } @@ -142,132 +235,102 @@ } } } - my dropzoneJS -uploadlink $uploadlink + my js -uploadlink ${:href}&uploader=${:uploader} } } - - BootstrapNavbar ad_instproc render {} { - http://getbootstrap.com/components/#navbar - } { - html::nav -class [my navbarClass] -role "navigation" { - # - # Render the pull down menues - # - html::div -class [my containerClass] { - foreach dropdownmenu [my children] { - $dropdownmenu render - } - if {[[my menubar] dropzone]} { - # - # Dropzone is configured. Check, if we the user has rights to use it... - # - set current_folder_id [[my menubar] current_folder] - set url [[$current_folder_id package_id] make_link $current_folder_id file-upload] - #my log "BootstrapNavbar current_folder_id = $current_folder_id -> URL = $url" - - if {$url ne ""} { - # - # Do actually render the dropzone widget. - # - my dropzone -uploadlink $url - } - } - } - } - } - # - # BootstrapNavbarDropdownMenu + # BootstrapNavbarModeButton # - ::xo::tdom::Class create BootstrapNavbarDropdownMenu \ - -superclass Menu \ - -parameter { - text - header - {brand false} - } - - BootstrapNavbarDropdownMenu ad_instproc render {} {doku} { - # TODO: Add support for group-headers - # get group header - set group 1 - - html::ul -class "nav navbar-nav" { - html::li -class "dropdown" { - set class "dropdown-toggle" - if {[my brand]} {lappend class "navbar-brand"} - html::a -href "\#" -class $class -data-toggle "dropdown" { - html::t [my text] - html::b -class "caret" - } - html::ul -class "dropdown-menu" { - foreach dropdownmenuitem [my children] { - if {[$dropdownmenuitem set group] ne "" && [$dropdownmenuitem set group] ne $group } { - html::li -class "divider" - set group [$dropdownmenuitem set group] - } - $dropdownmenuitem render - } - } - } - } - } - # - # BootstrapNavbarDropdownMenuItem - # - ::xo::tdom::Class create BootstrapNavbarDropdownMenuItem \ + ::xo::tdom::Class create BootstrapNavbarModeButton \ -superclass MenuItem \ -parameter { {href "#"} - helptext + {on:boolean false} + {button} } + + BootstrapNavbarModeButton instproc js {} { + # + # In the current implementation, the page refreshes itself after + # successful mode change. This could be made configurable. + # + html::script -type "text/javascript" { + html::t { + function mode_button_ajax_submit(form) { + $.ajax({ + type: "POST", + url: $(form).attr('action'), + data: $(form).serialize(), + success: function(msg) { window.location = window.location; }, + error: function(){alert("failure");} + }); + }; + } + } + } - BootstrapNavbarDropdownMenuItem ad_instproc render {} {doku} { - - html::li -class [expr {[my set href] eq "" ? "disabled": ""}] { - html::a [my get_attributes target href title] { - html::t [my text] + BootstrapNavbarModeButton ad_instproc render {} {doku} { + html::li { + html::form -class "form" -method "POST" -action ${:href} { + html::div -class "checkbox checkbox-slider--b-flat" { + html::label -class "checkbox-inline" { + set checked [expr {${:on} ? {-checked true} : ""}] + html::input -class "debug form-control" -name "debug" -type "checkbox" {*}$checked \ + -onclick "mode_button_ajax_submit(this.form);" + html::span -style "padding-left: 6px; padding-right: 6px;" {html::t ${:text}} + html::input -name "modebutton" -type "hidden" -value "${:button}" + } + } } + my js } - } + } + # -------------------------------------------------------------------------- - # render it + # Render MenuBar in bootstap fashion # -------------------------------------------------------------------------- ::xowiki::MenuBar instproc render-bootstrap {} { - set M [my content] + set dict [my content] set mb [::xowiki::BootstrapNavbar \ - -id [my get_prop $M id] \ - -menubar [self] \ - { - foreach {menu_att menu} $M { - if {$menu_att eq "id"} continue - # - # set default properties and - # - set props {brand false} - if {[llength $menu_att] > 1} { - # we expect a dict as second list element - lassign $menu_att menu_att props1 - lappend props {*}$props1 - } - # currently we render erverthing as a dropdown - ::xowiki::BootstrapNavbarDropdownMenu \ - -brand [dict get $props brand] \ - -text [my get_prop $menu text] { - #ns_log notice "... dropdown menu_att $menu_att menu $menu" - 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] - ::xowiki::BootstrapNavbarDropdownMenuItem -text $text -href $url -group $group {} + -id [my get_prop $dict id] \ + -menubar [self] { + foreach {att value} $dict { + if {$att eq "id"} continue + switch [my get_prop $value kind] { + "DropZone" { + ::xowiki::BootstrapNavbarDropzone \ + -text [my get_prop $value label] \ + -href [my get_prop $value url] \ + -uploader [my get_prop $value uploader] {} } + "ModeButton" { + template::head::add_css -href "/resources/xotcl-core/titatoggle/titatoggle-dist.css" + + ::xowiki::BootstrapNavbarModeButton \ + -text [my get_prop $value label] \ + -href [my get_prop $value url] \ + -button [my get_prop $value button admin] \ + -on [my get_prop $value on] {} + } + "MenuButton" { + # render erverthing as a dropdown + ::xowiki::BootstrapNavbarDropdownMenu \ + -text [my get_prop $value label] { + #ns_log notice "... dropdown att $att menu $value" + foreach {item_att item} $value { + if {[string match {[a-z]*} $item_att]} continue + ::xowiki::BootstrapNavbarDropdownMenuItem \ + -text [my get_prop $item label] \ + -href [my get_prop $item url] \ + -group [my get_prop $item group] {} + } + } + } } - } - }] - #ns_log notice call-mb-asHTML + }}] + #ns_log notice "call menubar asHTML" return [$mb asHTML] } } 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.33.2.4 -r1.33.2.5 --- openacs-4/packages/xowiki/tcl/folder-procs.tcl 21 Mar 2016 09:50:34 -0000 1.33.2.4 +++ openacs-4/packages/xowiki/tcl/folder-procs.tcl 23 Mar 2016 11:57:25 -0000 1.33.2.5 @@ -299,20 +299,20 @@ set index_link [$package_id make_link -link $folder_link $current_folder list] $mb add_menu_item -name Package.Startpage \ - -item [list text #xowiki.index# url $index_link] + -item [list label #xowiki.index# url $index_link] $mb add_menu_item -name New.Page \ - -item [list text #xowiki.new# url $new_page_link] + -item [list label #xowiki.new# url $new_page_link] $mb add_menu_item -name New.File \ - -item [list text File url $new_file_link] + -item [list label File url $new_file_link] $mb add_menu_item -name New.Folder \ - -item [list text Folder url $new_folder_link] + -item [list label Folder url $new_folder_link] if {$with_links} { $mb add_menu_item -name New.SymLink \ - -item [list text SymLink url $new_sym_link] + -item [list label SymLink url $new_sym_link] } $mb add_menu_item -name New.Form \ - -item [list text Form url $new_form_link] + -item [list label Form url $new_form_link] $mb add_menu_item -name Package.ImportDump -item [list url $import_link] $mb add_menu_item -name Package.ImportArchive -item [list url $import_archive_link] @@ -340,7 +340,18 @@ $mb add_menu_item -name Clipboard.Use.Copy -item [list url $clipboard_copy_link] $mb add_menu_item -name Clipboard.Use.Export -item [list url $clipboard_export_link] - $mb update_items -package_id $package_id -parent_id $opt_parent_id \ + set uploader_link [$package_id make_link $current_folder file-upload] + $mb add_extra_item -name dropzone1 -type DropZone \ + -item [list url $uploader_link label DropZone uploader File] + + #set modestate [::xowiki::mode::admin get] + #set modebutton_link [$package_id make_link $current_folder toggle-modebutton] + #$mb add_extra_item -name admin -type ModeButton \ + # -item [list url $modebutton_link on $modestate label admin] + + $mb update_items \ + -package_id $package_id \ + -parent_id $opt_parent_id \ -return_url $return_url \ -nls_language $nls_language \ [concat \ Index: openacs-4/packages/xowiki/tcl/import-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/import-procs.tcl,v diff -u -N -r1.30 -r1.30.2.1 --- openacs-4/packages/xowiki/tcl/import-procs.tcl 15 Jun 2015 19:21:06 -0000 1.30 +++ openacs-4/packages/xowiki/tcl/import-procs.tcl 23 Mar 2016 11:57:25 -0000 1.30.2.1 @@ -471,7 +471,7 @@ -creation_user [::xo::cc user_id] \ -parent_id $parent_id \ -package_id $package_id \ - -instance_attributes [list image $file_name]] + -instance_attributes [list image [list name $file_name]]] $photo_object title $file_name $photo_object publish_status "ready" $photo_object save_new ;# to obtain item_id needed by the form-field 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.8.2.2 -r1.8.2.3 --- openacs-4/packages/xowiki/tcl/menu-procs.tcl 21 Mar 2016 09:50:35 -0000 1.8.2.2 +++ openacs-4/packages/xowiki/tcl/menu-procs.tcl 23 Mar 2016 11:57:25 -0000 1.8.2.3 @@ -108,7 +108,7 @@ # the menu "Package": # # $mb add_menu_item -name Package.Startpage \ - # -item [list text #xowiki.index# url $index_link] + # -item [list label t #xowiki.index# url $index_link] # # 4) After all updates are performed, use "render-preferred" to obtain # the HTML rendering of the menu. @@ -164,7 +164,7 @@ } my lappend Menues $name if {$label eq ""} {set label $name} - my set Menu($name) [list text $label] + my set Menu($name) [list label $label] #my log "menues: $Menues" } @@ -175,7 +175,7 @@ ::xowiki::MenuBar instproc clear_menu {-menu:required} { array set "" [my set Menu($menu)] - my set Menu($menu) [list text $(text)] + my set Menu($menu) [list label $(label)] } ::xowiki::MenuBar instproc current_folder {} { @@ -187,19 +187,22 @@ # current_folder; else use the parent of the current object. # set object [::xo::cc invoke_object] - if {[$object istype ::xowiki::Package]} { - return [$object folder_id] + if {[$object is_folder_page]} { + return $object } else { return [$object parent_id] } } } - ::xowiki::MenuBar instproc add_menu_item {-name:required -item:required} { + ::xowiki::MenuBar instproc add_menu_item { + -name:required + -item:required + } { # # The provided items are of the form of attribute-value pairs - # containing at least attributes "text" and "url" - # (e.g. "text .... url ...."). + # containing at least attributes "label" and "url" + # (e.g. "label .... url ...."). # my instvar Menues set full_name $name @@ -222,7 +225,7 @@ # provide a default label # regsub -all {[.]} $full_name - full_name - array set "" [list text "#xowiki.menu-$full_name#" group $group_name] + array set "" [list label "#xowiki.menu-$full_name#" group $group_name] array set "" $item set item [array get ""] @@ -247,6 +250,18 @@ } } + ::xowiki::MenuBar instproc add_extra_item { + -name:required + -type:required + -item:required + } { + if {$type ni {"DropZone" "ModeButton"}} { + error "unknown extra item type: $type" + } + my set ${type}($name) $item + } + + ::xowiki::MenuBar instproc update_items { -package_id:required -nls_language:required -parent_id:required -return_url -autoname -template_file items @@ -257,6 +272,11 @@ # # {clear_menu -menu New} # {entry -name New.Page -label #xowiki.new# -form en:page.form} + # {entry -name New.File -label File -object_type ::xowiki::File} + # {dropzone -name DropZone -label DropZone -uploader File} + # {modebutton -name Admin -label admin -button admin} + + my set parent_id $parent_id foreach me $items { @@ -266,6 +286,7 @@ set properties [lrange $me 1 end] switch $kind { + clear_menu { my clear_menu -menu [dict get $properties -menu] } @@ -291,20 +312,68 @@ set link "" } set item [list url $link] - if {[dict exists $properties -label]} {lappend item text [dict get $properties -label]} + if {[dict exists $properties -label]} { + lappend item label [dict get $properties -label] + } my add_menu_item -name [dict get $properties -name] -item $item } - default { error "unknown kind of menu entry: $kind" } + "dropzone" { + foreach {var default} { + name dropzone + uploader File + label DropZone + } { + set $var $default + if {[dict exists $properties -$var]} { + set $var [dict get $properties -$var] + } + } + + set link [$package_id make_link $parent_id file-upload] + my add_extra_item -name $name -type DropZone \ + -item [list url $link uploader $uploader label $label] + } + + "modebutton" { + foreach {var default} { + name modebutton + button admin + label "" + } { + set $var $default + if {[dict exists $properties -$var]} { + set $var [dict get $properties -$var] + } + } + if {$label eq ""} {set label $button} + set state [::xowiki::mode::$button get] + set link [$package_id make_link $parent_id toggle-modebutton] + my add_extra_item -name $name -type ModeButton \ + -item [list url $link on $state label $label] + } + + default { + error "unknown kind of menu entry: $kind" + } } } } ::xowiki::MenuBar instproc content {} { set result [list id [my id]] - foreach m [my set Menues] { - lappend result $m [my set Menu($m)] + foreach e [my set Menues] { + lappend result $e [concat kind MenuButton [my set Menu($e)]] } + + foreach e [my array name ModeButton] { + lappend result $e [concat kind ModeButton [my set ModeButton($e)]] + } + + foreach e [my array name DropZone] { + lappend result $e [concat kind DropZone [my set DropZone($e)]] + } + return $result } @@ -317,6 +386,41 @@ } + + # ::xo::tdom::Class create MenuDropZone \ + # -superclass MenuComponent \ + # -parameter { + # text + # href + # title + # {id "[my html_id]"} + # CSSclass + # } + + + # MenuDropZone instproc init args { + # next + # # Use computed default values when not specified + # if {![my exists title]} { + # # set the mouseover-title to the "MenuItem-Label" + # # TODO: Do we really want "text" to be required ? + # my title [my text] + # } + + # if {![my exists href] || [my href] eq ""} { + # my append CSSclass " " [string tolower [namespace tail [my info class]]]-disabled + # } + # } + + # MenuDropZone instproc render {} { + # html::li [my get_attributes id {CSSclass class}] { + # html::a [my get_attributes title href target] { + # html::t [my text] + # } + # } + # } + + namespace export Menu # end of namespace } Index: openacs-4/packages/xowiki/tcl/xowiki-mode-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-mode-procs.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/xowiki/tcl/xowiki-mode-procs.tcl 23 Mar 2016 11:57:25 -0000 1.1.2.1 @@ -0,0 +1,79 @@ +::xo::library doc { + + XoWiki - Mode procs + + @creation-date 2016-03-22 + @author Gustaf Neumann + @cvs-id $Id: xowiki-mode-procs.tcl,v 1.1.2.1 2016/03/23 11:57:25 gustafn Exp $ +} + +namespace eval ::xowiki { + + nx::Class create ::xowiki::Mode { + + # + # Mode handler to set for the current session some application + # specific mode (like e.g. admin-mode, developer-mode, + # student-mode, training-mode, ...) + # + # Interface: + # - method get: obtain the current value (maybe default) + # - method set: force the mode to the provided value + # - method toggle: toggle current value + + :method mode_name {} { + return "mode-[::xo::cc package_id]-[self]" + } + + :public method get {} { + # + # Get the current mode, which might be set by the user or which + # might be obtained from the default method. + # + set default [:default] + set mode_name [:mode_name] + if {![ns_conn isconnected]} { + return $default + } + if {[ad_get_client_property -cache_only t xowiki $mode_name] eq ""} { + ad_set_client_property -persistent f xowiki $mode_name $default + } + return [ad_get_client_property -cache_only t xowiki $mode_name] + } + + :public method toggle {} { + set oldState [:get] + :set [expr {!$oldState}] + } + + :public method set {value:boolean} { + # + # Set the mode to the specified value + # + set mode_name [:mode_name] + ad_set_client_property -persistent f xowiki $mode_name $value + } + } + + namespace eval ::xowiki::mode {} + # + # Create a sample "admin" mode handler. + # + ::xowiki::Mode create ::xowiki::mode::admin { + :public object method default {} { + # Admins are per default in admin-mode + return [::xo::cc permission -object_id [xo::cc package_id] -privilege admin -party_id [xo::cc user_id]] + } + } + # + # one might create more such mode handler e.g. in an -init.tcl file. + # +} + +::xo::library source_dependent +# +# Local variables: +# mode: tcl +# tcl-indent-level: 2 +# indent-tabs-mode: nil +# End: Index: openacs-4/packages/xowiki/tcl/xowiki-uploader-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-uploader-procs.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/xowiki/tcl/xowiki-uploader-procs.tcl 23 Mar 2016 11:57:25 -0000 1.1.2.1 @@ -0,0 +1,112 @@ +::xo::library doc { + + XoWiki - Uploader procs + + @creation-date 2016-03-21 + @author Gustaf Neumann + @cvs-id $Id: xowiki-uploader-procs.tcl,v 1.1.2.1 2016/03/23 11:57:25 gustafn Exp $ +} + +namespace eval ::xowiki { + nx::Class create ::xowiki::Upload { + # + # Abstract class for upload handlers. Subclasses define concreate + # behavior. The method "store_file" should either return 201 for + # successful uploads or 200 for ignored cases. + # + :property file_name + :property content_type + :property tmpfile + :property parent_object + + :public method store_file {} {error "not implemented"} + } + + nx::Class create ::xowiki::UploadFile -superclass ::xowiki::Upload { + # + # Class for storing files as xowiki::File instances. + # + :public method store_file {} { + set f [::xowiki::formfield::file new -name upload -object ${:parent_object}] + set file_object [$f store_file \ + -file_name ${:file_name} \ + -content_type ${:content_type} \ + -package_id [${:parent_object} package_id] \ + -parent_id [${:parent_object} item_id] \ + -object_name file:${:file_name} \ + -tmpfile ${:tmpfile} \ + -publish_date_cmd {;} \ + -save_flag ""] + $f destroy + return {status_code 201 message created} + } + } + + nx::Class create ::xowiki::UploadPhotoForm -superclass ::xowiki::Upload { + # + # Class for storing files as instances of photo.form. + # + :public method store_file {} { + # + # Ignore everything, which does not have an image/* mime type. + # + if {![string match image/* ${:content_type}]} { + ns_log notice "ignore store_file operation for ${:file_name} mimetype ${:content_type}" + return {status_code 200 message ok} + } + # + # Mime type is ok, save the file under the file name either as a + # new item or as a new revision. + # + set package_id [${:parent_object} package_id] + set parent_id [${:parent_object} item_id] + + set photo_object [$package_id get_page_from_name -name en:${:file_name} -parent_id $parent_id] + if {$photo_object ne ""} { + # + # The photo page instance exists already, create a new revision. + # + ns_log notice "Photo ${:file_name} exists already" + $photo_object set title ${:file_name} + set f [::xowiki::formfield::file new -object $photo_object -name "image" -destroy_on_cleanup] + $f set value ${:file_name} + $f content-type ${:content_type} + $f set tmpfile ${:tmpfile} + $f convert_to_internal + $photo_object save + } else { + # + # Create a new page instance of photo.form. + # + ns_log notice "new Photo ${:file_name}" + set photoFormObj [::xowiki::Weblog instantiate_forms \ + -parent_id $parent_id -forms en:photo.form -package_id $package_id] + set photo_object [$photoFormObj create_form_page_instance \ + -name en:${:file_name} \ + -nls_language en_US \ + -creation_user [::xo::cc user_id] \ + -parent_id $parent_id \ + -package_id $package_id \ + -instance_attributes [list image [list name ${:file_name}]]] + $photo_object title ${:file_name} + $photo_object publish_status "ready" + $photo_object save_new ;# to obtain item_id needed by the form-field + set f [::xowiki::formfield::file new -object $photo_object -name "image" -destroy_on_cleanup] + $f set value ${:file_name} + $f content-type ${:content_type} + $f set tmpfile ${:tmpfile} + $f convert_to_internal + } + + return {status_code 201 message created} + } + } +} + +::xo::library source_dependent +# +# Local variables: +# mode: tcl +# tcl-indent-level: 2 +# indent-tabs-mode: nil +# End: Index: openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl,v diff -u -N -r1.327.2.15 -r1.327.2.16 --- openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl 21 Mar 2016 09:50:35 -0000 1.327.2.15 +++ openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl 23 Mar 2016 11:57:25 -0000 1.327.2.16 @@ -1086,27 +1086,54 @@ if {[ns_conn method] ne "POST"} { error "method should be called via POST" } + set form [ns_getform] + # - # The following code saves the file as xowiki::File. - # TODO: we should support File.form instances as well (optionally). + # Get the uploader via query parameter. We have currently the + # following uploader classes defined (see + # xowiki-uploader-procs.tcl) # - set form [ns_getform] - set f [::xowiki::formfield::file new -name upload -object [self]] - set file_object [$f store_file \ - -file_name [ns_set get $form upload] \ - -content_type [ns_set get $form upload.content-type] \ - -package_id [my package_id] \ - -parent_id [my item_id] \ - -object_name file:[ns_set get $form upload] \ - -tmpfile [ns_set get $form upload.tmpfile] \ - -publish_date_cmd {;} \ - -save_flag ""] - $f destroy - ns_return 200 text/plain ok + # - ::xowiki::UploadFile + # - ::xowiki::UploadPhotoForm + # + set uploader [ns_set get $form uploader File] + set uploaderClass ::xowiki::UploadFile + if {[info command ::xowiki::Upload$uploader] ne ""} { + set uploaderClass ::xowiki::Upload$uploader + } + set uploaderObject [$uploaderClass new \ + -file_name [ns_set get $form upload] \ + -content_type [ns_set get $form upload.content-type] \ + -tmpfile [ns_set get $form upload.tmpfile] \ + -parent_object [self]] + set result [$uploaderObject store_file] + $uploaderObject destroy + ns_return [dict get $result status_code] text/plain [dict get $result message] } + # + # externally callable method: toggle-modebutton + # + FormPage instproc www-toggle-modebutton {} { + # + # This method is typically called via modebutton in a POST request via ajax; + # + if {[ns_conn method] ne "POST"} { + error "method should be called via POST" + } - + # + # Get the toggle name. Modebuttons are named like: + # + # ::xowiki::mode::admin + # + set form [ns_getform] + set button [ns_set get $form button admin] + ::xowiki::mode::$button toggle + #${:package_id} returnredirect [ns_set get $form return_url [::xo::cc url]] + ns_return 200 text/plain ok + } + # # externally callable method: list # 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 -r1.5 -r1.5.2.1 --- openacs-4/packages/xowiki/tcl/yui-procs.tcl 22 Jul 2015 08:41:21 -0000 1.5 +++ openacs-4/packages/xowiki/tcl/yui-procs.tcl 23 Mar 2016 11:57:25 -0000 1.5.2.1 @@ -234,27 +234,25 @@ ::xo::tdom::Class create YUIContextMenuItem \ -superclass YUIMenuItem - - ::xowiki::MenuBar instproc render-yui {} { - set M [my content] - set mb [::xowiki::YUIMenuBar -id [my get_prop $M id] -configuration { + set dict [my content] + set mb [::xowiki::YUIMenuBar -id [my get_prop $dict id] -configuration { {autosubmenudisplay: false, keepopen: true, lazyload: false} } { - foreach {menu_att menu} $M { + foreach {menu_att menu} $dict { 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] { + set kind [my get_prop $menu kind] + #ns_log notice "entry: kind $kind <$menu_att> <$menu>" + + if {$kind ne "MenuButton"} continue + ::xowiki::YUIMenuBarItem -text [my get_prop $menu label] { ::xowiki::YUIMenu { foreach {item_att item} $menu { if {[string match {[a-z]*} $item_att]} continue - set text [my get_prop $item text] + set text [my get_prop $item label] 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" + #my log "ia=$item_att group '$group' // t=$text item=$item" ::xowiki::YUIMenuItem -text $text -href $url -group $group {} } }