Index: openacs-4/packages/xowiki/tcl/package-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/package-procs.tcl,v diff -u -N -r1.54 -r1.55 --- openacs-4/packages/xowiki/tcl/package-procs.tcl 9 May 2007 13:19:23 -0000 1.54 +++ openacs-4/packages/xowiki/tcl/package-procs.tcl 11 May 2007 11:17:59 -0000 1.55 @@ -802,6 +802,7 @@ delete {{package_id admin}} save-tags login popular-tags login + create-new {{item_id write}} } -set default_permission {{package_id write}} Class Object -array set require_permission { @@ -811,7 +812,7 @@ download none } Class Form -array set require_permission { - new {{item_id write}} + create-new {{item_id write}} list {{package_id admin}} } } Index: openacs-4/packages/xowiki/tcl/xowiki-form-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-form-procs.tcl,v diff -u -N -r1.43 -r1.44 --- openacs-4/packages/xowiki/tcl/xowiki-form-procs.tcl 10 May 2007 00:18:46 -0000 1.43 +++ openacs-4/packages/xowiki/tcl/xowiki-form-procs.tcl 11 May 2007 11:17:59 -0000 1.44 @@ -177,36 +177,16 @@ $data instvar package_id if {[$data istype ::xowiki::File] && [$data exists mime_type]} { #my log "--mime validate_name ot=$object_type data=[my exists data] MIME [$data set mime_type]" - set mime [$data set mime_type] - set fn [$data set upload_file] - switch -- $mime { - application/force-download { - set mime [::xowiki::guesstype $fn] - $data set mime_type $mime - } - } - switch -glob -- $mime { - image/* {set type image} - default {set type file} - } - if {$name ne ""} { - regexp {^(.*):(.*)$} $name _ _t stripped_name - if {![info exists stripped_name]} {set stripped_name $name} - } else { - set stripped_name $fn - } - set name ${type}:[::$package_id normalize_name $stripped_name] + set name [$data complete_name $name [$data set upload_file]] } else { if {![regexp {^..:} $name]} { - if {![info exists nls_language]} {set nls_language ""} - if {$nls_language eq ""} {set nls_language [lang::conn::locale]} - if {$name ne ""} { - # prepend the language prefix only, if the entry is not empty - set name [string range $nls_language 0 1]:$name + if {![info exists nls_language]} { + set nls_language [lang::conn::locale] } + set name [$data complete_name $name $nls_language] } - set name [::$package_id normalize_name $name] - } + } + set name [::$package_id normalize_name $name] # check, if we try to create a new item with an existing name if {[$data form_parameter __new_p] @@ -609,11 +589,45 @@ #my log "--fields = [my fields]" } + proc ::xowiki::validate_form_text {} { + upvar text text + dom parse -simple -html [lindex $text 0] doc + $doc documentElement root + return [expr {[$root nodeName] eq "form"}] + } + Class create FormForm -superclass ::xowiki::WikiForm \ -parameter { {field_list {item_id name title creator text form_constraints description nls_language}} {f.form_constraints {form_constraints:text,nospell,optional {label Constraints} {html {size 80}} }} + {validate + {{name {\[::xowiki::validate_name\]} {Another item with this name exists \ + already in this folder}}} + {{text {\[::xowiki::validate_form_text\]} {From must contain an HTML form}}} + } } + + FormForm instproc new_data {} { + my instvar data + set item_id [next] + + # provide unique ids and names + set text [$data set text] + dom parse -simple -html [lindex $text 0] doc + $doc documentElement root + set id ID$item_id + $root setAttribute id $id + set fields [$root selectNodes "//*\[@name != ''\]"] + foreach field $fields { + $field setAttribute name $id.[$field getAttribute name] + } + # updating is rather crude. we need the item_id in advance to fill it + # into the items, but it is returned from saving the file. + my log "item_id=$item_id form=[$root asHTML] [$data serialize]" + $data update_content [$data revision_id] [list [$root asHTML] [lindex $text 1] ] + return $item_id + } + } Index: openacs-4/packages/xowiki/tcl/xowiki-portlet-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/Attic/xowiki-portlet-procs.tcl,v diff -u -N -r1.47 -r1.48 --- openacs-4/packages/xowiki/tcl/xowiki-portlet-procs.tcl 10 May 2007 11:09:34 -0000 1.47 +++ openacs-4/packages/xowiki/tcl/xowiki-portlet-procs.tcl 11 May 2007 11:17:59 -0000 1.48 @@ -1293,6 +1293,7 @@ -parameter { {__decoration plain} {parameter_declaration { + {-edit_links:boolean true} {-pages ""} {-ordered_pages} }} @@ -1302,6 +1303,7 @@ my instvar page_order my get_parameters my set package_id $package_id + my set edit_links $edit_links # compute a list of ordered_pages from pages, if necessary if {[info exists ordered_pages]} { @@ -1325,24 +1327,24 @@ $pages mixin add ::xo::OrderedComposite::IndexCompare $pages orderby page_order - my render_children $pages + return [my render_children $pages] } selection instproc render_children {pages} { - my instvar package_id + my instvar package_id edit_links foreach o [$pages children] { $o instvar page_order title page_id name title - set level [expr {[regsub {[.]} $page_order . page_order] + 1}] + set level [expr {[regsub {[.]} $page_order . page_order] + 1}] + set edit_markup "" set p [::Generic::CrItem instantiate -item_id 0 -revision_id $page_id] $p destroy_on_cleanup - set p_link [$package_id pretty_link $name] - set edit_link [$package_id make_link -link $p_link $p edit return_url] - if {$edit_link ne ""} { - set edit_markup "
" - } else { - set edit_markup "" + if {$edit_links} { + set p_link [$package_id pretty_link $name] + set edit_link [$package_id make_link -link $p_link $p edit return_url] + if {$edit_link ne ""} { + set edit_markup "
" + } } - $p set unresolved_references 0 switch [$p info class] { ::xowiki::Form { @@ -1362,6 +1364,54 @@ return $output } + Class create composite-form \ + -superclass ::xowiki::portlet::selection \ + -parameter { + {parameter_declaration { + {-edit_links:boolean false} + {-pages ""} + {-ordered_pages} + }} + } + + composite-form instproc render {} { + my get_parameters + my instvar __including_page + set inner_html [next] + #my log "innerhtml=$inner_html" + regsub -nocase -all "
" $inner_html "
" inner_html + regsub -nocase -all "" $inner_html "
" inner_html + dom parse -simple -html
$inner_html
doc + $doc documentElement root + + set fields [$root selectNodes "//div\[@class = 'wiki-menu'\]"] + foreach field $fields {$field delete} + + set inner_html [$root asHTML] + set id ID[$__including_page item_id] + 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 save_form [subst { +

+ Create Form from Content +

+ + }] + + return $inner_html$save_form + } + ############################################################################# # book style # @@ -1788,7 +1838,7 @@ # todo return_url my instvar __including_page set base [$package_id pretty_link [$__including_page name]] - set new_link [$package_id make_link -link $base $__including_page new return_url] + set new_link [$package_id make_link -link $base $__including_page create-new return_url] set answer_link [$package_id make_link -link $base $__including_page list return_url] set sql [::xowiki::FormInstance instance_select_query \ -count true \ Index: openacs-4/packages/xowiki/tcl/xowiki-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-procs.tcl,v diff -u -N -r1.95 -r1.96 --- openacs-4/packages/xowiki/tcl/xowiki-procs.tcl 10 May 2007 10:08:42 -0000 1.95 +++ openacs-4/packages/xowiki/tcl/xowiki-procs.tcl 11 May 2007 11:17:59 -0000 1.96 @@ -363,6 +363,16 @@ return 0 } + Page instproc complete_name {name {nls_language ""}} { + if {![regexp {^..:} $name]} { + if {$name ne ""} { + # prepend the language prefix only, if the entry is not empty + if {$nls_language eq ""} {set nls_language [my set nls_language]} + set name [string range $nls_language 0 1]:$name + } + } + } + # Page instproc init {} { # my log "--W " # ::xo::show_stack @@ -763,6 +773,20 @@ File parameter { {render_adp 0} } + File instproc complete_name {name {fn ""}} { + my instvar mime_type + switch -glob -- $mime_type { + image/* {set type image} + default {set type file} + } + if {$name ne ""} { + set stripped_name $name + regexp {^(.*):(.*)$} $name _ _t stripped_name + } else { + set stripped_name $fn + } + return ${type}:[::$package_id normalize_name $stripped_name] + } File instproc full_file_name {} { if {![my exists full_file_name]} { if {[my exists item_id]} { @@ -840,7 +864,6 @@ # for a field with a specified name in a specified page template set spec $default_spec set given_template_name [expr {[my isobject $template] ? [$template set name] : $template}] - #ns_log notice "--w pid=[my set parent_id] name='$name' template[$given_template_name, specs=[[my set parent_id] get_payload widget_specs]" foreach {s widget} [[my set parent_id] get_payload widget_specs] { foreach {template_name var_name} [split $s ,] break #ns_log notice "--w T.title = '$given_template_name' var=$name" @@ -937,8 +960,37 @@ return [my include_portlet [list form-menu -form_item_id [my item_id]]] } - Form instproc new {} { + Page instproc create-new {} { my instvar package_id + set folder_id [my parent_id] + my log "--new [::xo::cc array get form_parameter]" + set name [::xo::cc form_parameter name] + set name [my complete_name $name] + set name [::$package_id normalize_name $name] + set suffix ""; set i 0 + while {[CrItem lookup -name $name$suffix -parent_id $folder_id] != 0} { + set suffix .[incr i] + } + set name $name$suffix + set class [::xo::cc form_parameter class ::xowiki::Page] + my log --class=$class + if {[::xotcl::Object isclass $class] && [$class info heritage ::xowiki::Page] ne ""} { + set class [::xo::cc form_parameter class ::xowiki::Page] + set f [$class create [self].$i \ + -name $name \ + -package_id $package_id \ + -parent_id [my parent_id] \ + -title [my title] \ + -text [list [::xo::cc form_parameter content ""] text/html]] + $f save_new + $f destroy + $package_id returnredirect \ + [my query_parameter "return_url" [$package_id pretty_link $name]?m=edit] + } + } + + Form instproc create-new {} { + my instvar package_id set f [FormInstance new -destroy_on_cleanup -page_template [my item_id] -instance_attributes [list]] $f parent_id [my parent_id] $f package_id $package_id @@ -958,9 +1010,9 @@ return [my include_portlet [list form-instance-menu]] } FormInstance instproc provide_value {att value} { - my instvar root + my instvar root item_id set fields [$root selectNodes "//*\[@name='$att'\]"] - # my msg "found field = $fields xp=//*\[@name='$att'\]" + #my msg "found field = $fields xp=//*\[@name='$att'\]" foreach field $fields { if {[$field nodeName] ne "input"} continue set type [expr {[$field hasAttribute type] ? [$field getAttribute type] : "text"}]