From: <de...@de...> - 2007-03-12 19:47:49
|
Author: CrawfordCurrie Date: 2007-03-12 14:46:15 -0500 (Mon, 12 Mar 2007) New Revision: 13127 Added: twiki/branches/MAIN/twikiplugins/EditRowPlugin/ twiki/branches/MAIN/twikiplugins/EditRowPlugin/data/ twiki/branches/MAIN/twikiplugins/EditRowPlugin/data/TWiki/ twiki/branches/MAIN/twikiplugins/EditRowPlugin/data/TWiki/EditRowPlugin.txt twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin.pm twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/DEPENDENCIES twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/MANIFEST twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/Table.pm twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/TableCell.pm twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/TableRow.pm twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/build.pl twiki/branches/MAIN/twikiplugins/EditRowPlugin/pub/ twiki/branches/MAIN/twikiplugins/EditRowPlugin/pub/TWiki/ twiki/branches/MAIN/twikiplugins/EditRowPlugin/pub/TWiki/EditRowPlugin/ twiki/branches/MAIN/twikiplugins/EditRowPlugin/pub/TWiki/EditRowPlugin/screenshot.gif Log: Item3754: An in-place editor for individual table rows Added: twiki/branches/MAIN/twikiplugins/EditRowPlugin/data/TWiki/EditRowPlugin.txt =================================================================== --- twiki/branches/MAIN/twikiplugins/EditRowPlugin/data/TWiki/EditRowPlugin.txt (rev 0) +++ twiki/branches/MAIN/twikiplugins/EditRowPlugin/data/TWiki/EditRowPlugin.txt 2007-03-12 19:46:15 UTC (rev 13127) @@ -0,0 +1,59 @@ + +---+!! !EditRowPlugin +<!-- +One line description, required for extensions repository catalog. + * Set SHORTDESCRIPTION = Single table row inline edit +--> +%SHORTDESCRIPTION% + +%TOC% + +<img src="%ATTACHURLPATH%/screenshot.gif" alt="screenshot.gif" width='415' height='100' style="float:right" /> +Supports editing a single row in a table at a time, in-place in the table. +Multiple tables in a topic are supported, but only once table at a time +can be edited. + +Works like the !EditTablePlugin (it uses exactly the same =%EDITTABLE= tags) +except that it only opens one row at a time. Closed rows are shown with +an edit button. + +This solves the problem with the long page rendering times required to show all +the HTML for a full table edit. At this time most, but possibly not all, +features of !EditTablePlugin are supported; it's hard to tell exactly, +because there are no tests for EditTablePlugin, the documentation is +incomplete and the code is rather hard to read. + +The plugin doesn't use !JavaScript (except for the +calendar) so it should work with all browsers. + +See also: !EditTablePlugin, !EditTableRowPlugin. + +---++ Usage + +See EditTablePlugin for information on the =%EDITTABLE= tag and its parameters. + +The plugin needs to be put on the INSTALLEDPLUGINS list before +!EditTablePlugin if both are required. It is enabled by setting + * <nop>Set ENABLE_TABLE_ROW_EDIT = on +in a topic or !WebPreferences. Where this variable is set, then row editing +will be used instead of table editing. + +---++ Installation Instructions + +%$INSTALL_INSTRUCTIONS% + +---++ Plugin Info + +| Plugin Author(s): | Crawford Currie | +| Plugin Version: | %$VERSION% | +| Copyright: | © 2007 Wind<nop>River Inc. | +| License: | [[http://www.gnu.org/licenses/gpl.html][GPL (Gnu General Public License)]] | +| Change History: | <!-- versions below in reverse order --> | +| Dependencies: | %$DEPENDENCIES% | +| Plugin Home: | http://twiki.org/cgi-bin/view/Plugins/EditRowPlugin | +| Feedback: | http://twiki.org/cgi-bin/view/Plugins/EditRowPluginDev | +| Appraisal: | http://twiki.org/cgi-bin/view/Plugins/EditRowPluginAppraisal | + +<!-- Do _not_ attempt to edit this topic; it is auto-generated. Please add comments/questions/remarks to the Dev topic instead. --> + +%META:FILEATTACHMENT{name="screenshot.gif" attr="h" comment=""cversion="1"}% Property changes on: twiki/branches/MAIN/twikiplugins/EditRowPlugin/data/TWiki/EditRowPlugin.txt ___________________________________________________________________ Name: svn:executable + * Added: twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/DEPENDENCIES =================================================================== --- twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/DEPENDENCIES (rev 0) +++ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/DEPENDENCIES 2007-03-12 19:46:15 UTC (rev 13127) @@ -0,0 +1,6 @@ + +# Dependencies for EditRowPlugin +# Example: +# Time::ParseDate,>=2003.0211,cpan,Required. +# TWiki::Plugins,>=1.15,perl,TWiki 4.1 release. + Added: twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/MANIFEST =================================================================== --- twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/MANIFEST (rev 0) +++ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/MANIFEST 2007-03-12 19:46:15 UTC (rev 13127) @@ -0,0 +1,8 @@ + +# Release manifest for EditRowPlugin +data/TWiki/EditRowPlugin.txt 0644 Documentation +lib/TWiki/Plugins/EditRowPlugin.pm 0644 Perl module +lib/TWiki/Plugins/EditRowPlugin/Table.pm 0644 Perl module +lib/TWiki/Plugins/EditRowPlugin/TableRow.pm 0644 Perl module +lib/TWiki/Plugins/EditRowPlugin/TableCell.pm 0644 Perl module +pub/TWiki/EditRowPlugin/screenshot.gif 0444 Image \ No newline at end of file Added: twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/Table.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/Table.pm (rev 0) +++ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/Table.pm 2007-03-12 19:46:15 UTC (rev 13127) @@ -0,0 +1,191 @@ +package TWiki::Plugins::EditRowPlugin::Table; + +use strict; + +use TWiki::Func; +use TWiki::Plugins::EditRowPlugin::TableRow; +use TWiki::Plugins::EditRowPlugin::TableCell; + +# Extract a topic into a list of lines and embedded table definitions. +# Each table definition is an object of type EditTable, and contains +# a set of attrs (read from the %EDITTABLE) and a list of rows. +sub parseTables { + #my $text, $topic, $web = @_ + my $active_table = undef; + my @tables; + my $nTables = 0; + + foreach my $line (split(/\r?\n/, $_[0])) { + if ($line =~ /%EDITTABLE{(.*?)}%/) { + my $attrs = new TWiki::Attrs($1); + + if ($attrs->{include}) { + my( $iw, $it ) = TWiki::Func::normalizeWebTopicName( + $_[2], $attrs->{include}); + # This check is missing from EditTablePlugin + unless( TWiki::Func::topicExists($iw, $it)) { + $line = CGI::span( + {class=>'twikiAlert'}, + "Could not find format topic $attrs->{include}"); + } + my ($meta, $text) = TWiki::Func::readTopic($iw, $it); + $text =~ m/%EDITTABLE{([^\n]*)}%/s; + $attrs = new TWiki::Attrs($1); + } + $active_table = + new TWiki::Plugins::EditRowPlugin::Table( + ++$nTables, $attrs, $_[2], $_[1]); + push(@tables, $active_table); + next; + } + + if ($active_table && $line =~ s/^\s*\|//) { + my $row = new TWiki::Plugins::EditRowPlugin::TableRow( + $active_table, scalar(@{$active_table->{rows}}) + 1); + my $n = 1; + $line =~ s/\|\s*$//; + push(@{$row->{cols}}, map { + new TWiki::Plugins::EditRowPlugin::TableCell($row, $_, $n++); } + split(/\s*\|\s*/, $line)); + push(@{$active_table->{rows}}, $row); + next; + } + + $active_table = undef; + push(@tables, $line); + } + return \@tables; +} + +sub new { + my ($class, $tno, $attrs, $web, $topic) = @_; + + my $this = bless({}, $class); + $this->{number} = $tno; + $this->{rows} = []; + $this->{attrs} = $attrs; + if ($attrs->{format}) { + $this->{colTypes} = _parseFormat($attrs->{format}); + } else { + $this->{colTypes} = []; + } + $this->{topic} = $topic; + $this->{web} = $web; + + return $this; +} + +sub finish { + my $this = shift; + foreach my $row (@{$this->{rows}}) { + $row->finish(); + } +} + +sub stringify { + my $this = shift; + my $s = '%EDITTABLE{'.$this->{attrs}->stringify()."}%\n"; + foreach my $row (@{$this->{rows}}) { + $s .= $row->stringify()."\n"; + } + return $s; +} + +sub renderForEdit { + my ($this, $activeRow) = @_; + my @out; + my $n = 1; + foreach my $row (@{$this->{rows}}) { + if ($n++ == $activeRow) { + push(@out, $row->renderForEdit()); + } else { + push(@out, $row->renderForDisplay($this)); + } + } + return join("\n", @out); +} + +sub renderForDisplay { + my $this = shift; + my @out; + foreach my $row (@{$this->{rows}}) { + push(@out, $row->renderForDisplay()); + } + return join("\n", @out); +} + +sub changeRow { + my ($this, $urps) = @_; + my $arow = $this->{rows}->[$urps->{active_row} - 1]; + foreach my $c (@{$arow->{cols}}) { + my $cellName = "cell_$this->{number}_$arow->{number}_$c->{number}"; + my $cv = $urps->{$cellName} || ''; + $c->{text} = $cv; + } + return $this->stringify(); +} + +# add a row after the active row containing the data just entered +# in the active row. +sub addRow { + my ($this, $urps) = @_; + my $arow = $this->{rows}->[$urps->{active_row} - 1]; + my $newRow = new TWiki::Plugins::EditRowPlugin::TableRow( + $this, $urps->{active_row}); + splice(@{$this->{rows}}, $urps->{active_row}, 0, $newRow); + foreach my $c (@{$arow->{cols}}) { + my $cellName = "cell_$this->{number}_$arow->{number}_$c->{number}"; + my $cv = $urps->{$cellName} || ''; + push(@{$newRow->{cols}}, + new TWiki::Plugins::EditRowPlugin::TableCell( + $newRow, $cv, $c->{number})); + } + return $this->stringify(); +} + +# delete the current row +sub deleteRow { + my ($this, $urps) = @_; + splice(@{$this->{rows}}, $urps->{active_row} - 1, 1); + return $this->stringify(); +} + +sub _parseFormat { + my $format = shift; + my @cols; + + $format =~ s/^\s*\|//; + $format =~ s/\|\s*$//; + + foreach my $column (split ( /\|/, $format )) { + my ($type, $size, @values) = + map { s/^\s*(.*?)\s*$/$1/; $_; } split(/,/, $column); + + $type ||= 'text'; + $type = lc $type; + + $size ||= 0; + $size =~ s/[^\w.]//g; + + unless( $size ) { + if( $type eq 'text' ) { + $size = 20; + } elsif( $type eq 'textarea' ) { + $size = '40x5'; + } else { + $size = 1; + } + } + + push(@cols, + { + type => $type, + size => $size, + values => \@values, + }); + } + + return \@cols; +} + +1; Added: twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/TableCell.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/TableCell.pm (rev 0) +++ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/TableCell.pm 2007-03-12 19:46:15 UTC (rev 13127) @@ -0,0 +1,159 @@ +package TWiki::Plugins::EditRowPlugin::TableCell; + +use strict; + +use TWiki::Func; + +sub new { + my ($class, $row, $text, $number) = @_; + my $this = bless({}, $class); + $this->{row} = $row; + $this->{number} = $number; + $text =~ s/^\s*//; + $text =~ s/\s*$//; + $this->{text} = $text; + return $this; +} + +sub finish { + my $this = shift; + $this->{row} = undef; +} + +sub stringify { + my $this = shift; + + return $this->{text}; +} + +sub renderForDisplay { + my ($this, $colDef) = @_; + + if ($colDef->{type} eq 'row') { + my $attrs = $this->{row}->{table}->{attrs}; + if ($this->{number} == 1 && + (!defined($attrs->{headerislabel}) || + TWiki::isTrue($attrs->{headerislabel}))) { + return $this->{row}->{number} - 1; + } else { + return $this->{row}->{number}; + } + } + return $this->{text}; +} + +sub renderForEdit { + my ($this, $colDef) = @_; + + my $expandedValue = TWiki::Func::expandCommonVariables( + $this->{text} || ''); + $expandedValue =~ s/^\s*(.*?)\s*$/$1/; + + my $text = ''; + my $cellName = 'cell_'.$this->{row}->{table}->{number}.'_'. + $this->{row}->{number}.'_'.$this->{number}; + + if( $colDef->{type} eq 'select' ) { + + $text = "<select name='$cellName' size='$colDef->{size}'>"; + foreach my $option ( @{$colDef->{values}} ) { + my $expandedOption = + TWiki::Func::expandCommonVariables($option); + $expandedOption =~ s/^\s*(.*?)\s*$/$1/; + my %opts; + if ($expandedOption eq $expandedValue) { + $opts{selected} = 'selected'; + } + $text .= CGI::option(\%opts, $option); + } + $text .= "</select>"; + + } elsif( $colDef->{type} =~ /^(radio|checkbox)$/ ) { + + $expandedValue = ",$expandedValue,"; + my $i = 0; + foreach my $option ( @{$colDef->{values}} ) { + my $expandedOption = + TWiki::Func::expandCommonVariables($option); + $expandedOption =~ s/^\s*(.*?)\s*$/$1/; + $expandedOption =~ s/(\W)/\\$1/g; + my %opts = ( + type => $colDef->{type}, + name => $cellName, + value => $this->{text}, + ); + $opts{checked} = 'checked' + if ($expandedValue =~ /,$expandedOption,/); + $text .= CGI::input(\%opts); + $text .= " $option "; + if( $colDef->{size} > 1 ) { + if ($i % $colDef->{size}) { + $text .= '<br />'; + } + } + $i++; + } + + } elsif( $colDef->{type} eq 'row' ) { + + my $attrs = $this->{row}->{table}->{attrs}; + if ($this->{number} == 1 && + (!defined($attrs->{headerislabel}) || + TWiki::isTrue($attrs->{headerislabel}))) { + $text = $this->{row}->{number} - 1; + } else { + $text = $this->{row}->{number}; + } + + } elsif( $colDef->{type} eq 'textarea' ) { + + my ($rows, $cols) = split( /x/, $colDef->{size} ); + $rows = 3 if $rows < 1; + $cols = 30 if $cols < 1; + + $text .= CGI::textarea({ + rows => $rows, + cols => $cols, + name => $cellName }, $this->{text}); + + } elsif( $colDef->{type} eq 'date' ) { + + require TWiki::Contrib::JSCalendarContrib; + unless( $@ ) { + TWiki::Contrib::JSCalendarContrib::addHEAD( 'twiki' ); + } + + my $ifFormat = $colDef->{values}->[0] || + $TWiki::cfg{JSCalendarContrib}{format} || '%e %B %Y'; + + $text .= CGI::textfield({ + name => $cellName, + id => 'id'.$cellName, + size=> $colDef->{size}, + value => $this->{text} }); + + eval 'use TWiki::Contrib::JSCalendarContrib'; + unless ( $@ ) { + $text .= CGI::image_button( + -name => 'calendar', + -onclick => + "return showCalendar('id$cellName','$ifFormat')", + -src=> TWiki::Func::getPubUrlPath() . '/' . + TWiki::Func::getTwikiWebname() . + '/JSCalendarContrib/img.gif', + -alt => 'Calendar', + -align => 'MIDDLE' ); + } + + } else { # if( $colDef->{type} =~ /^(text|label)$/) + + $text = CGI::textfield({ + name => $cellName, + size => $colDef->{size}, + value => $this->{text} }); + + } + return $text; +} + +1; Added: twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/TableRow.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/TableRow.pm (rev 0) +++ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/TableRow.pm 2007-03-12 19:46:15 UTC (rev 13127) @@ -0,0 +1,107 @@ +package TWiki::Plugins::EditRowPlugin::TableRow; + +use strict; + +use TWiki::Func; + +my $defCol ||= { type => 'text', size => 20, values => [] }; + +sub new { + my ($class, $table, $number) = @_; + my $this = bless({}, $class); + @{$this->{cols}} = @_; + $this->{table} = $table; + $this->{number} = $number; + $this->{cols} = []; + return $this; +} + +sub stringify { + my $this = shift; + + return '| '.join(' | ', map { $_->stringify() } @{$this->{cols}}).' |'; +} + +sub renderForEdit { + my $this = shift; + + my @out; + my $col = 0; + my $ct = $this->{table}->{colTypes}; + foreach (@{$this->{cols}}) { + push(@out, $_->renderForEdit($ct->[$col++] || $defCol)); + } + my $buttons = CGI::input({ + type => 'submit', + name => 'editrowplugin_save', + value => $TWiki::Plugins::EditRowPlugin::NOISY_SAVE, + style => 'font-size:0;width:18px; height:18px; background-image:url(%PUBURLPATH%/TWiki/TWikiDocGraphics/save.gif)', + }, ''); + my $attrs = $this->{table}->{attrs}; + if (TWiki::isTrue($attrs->{quietsave})) { + $buttons .= CGI::input({ + type => 'submit', + name => 'editrowplugin_save', + value => $TWiki::Plugins::EditRowPlugin::QUIET_SAVE, + style => 'font-size:0;width:18px; height:18px; background-image:url(%PUBURLPATH%/TWiki/TWikiDocGraphics/save.gif)', + }, ''); + } + # add save button + if ($attrs->{changerows}) { + # add add row button + $buttons .= CGI::input({ + type => 'submit', + name => 'editrowplugin_save', + value => $TWiki::Plugins::EditRowPlugin::ADD_ROW, + style => 'font-size:0;width:18px; height:18px; background-image:url(%PUBURLPATH%/TWiki/TWikiDocGraphics/plus.gif)', + }, ''); + if ($attrs->{changerows} eq 'on') { + # add delete row button + $buttons .= CGI::input({ + type => 'submit', + name => 'editrowplugin_save', + value => $TWiki::Plugins::EditRowPlugin::DELETE_ROW, + style => 'font-size:0;width:18px; height:18px; background-image:url(%PUBURLPATH%/TWiki/TWikiDocGraphics/minus.gif)', + }, ''); + } + } + unshift(@out, $buttons); + + return '| ' . join(' | ', @out) . '|'; +} + +sub renderForDisplay { + my $this = shift; + my @out; + my $attrs = $this->{table}->{attrs}; + if ($this->{number} == 1 && + (!defined($attrs->{headerislabel}) || + TWiki::isTrue($attrs->{headerislabel}))) { + @out = map { $_->{text} } @{$this->{cols}}; + unshift(@out, ''); + } else { + my $col = 0; + my $ct = $this->{table}->{colTypes}; + foreach (@{$this->{cols}}) { + push(@out, $_->renderForDisplay($ct->[$col++] || $defCol)); + } + my $url = TWiki::Func::getScriptUrl( + $this->{table}->{web}, $this->{table}->{topic}, 'view', + active_table => $this->{table}->{number}, + active_row => $this->{number}); + unshift(@out, + "<a href='$url'>". + CGI::image_button( + -name => 'editrowplugin_edit', + -src => '%PUBURLPATH%/TWiki/TWikiDocGraphics/edittopic.gif'). + "</a>"); + } + return '| '.join(' | ', @out). ' |'; +} + +sub finish { + my $this = shift; + $this->{table} = undef; +} + +1; Added: twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/build.pl =================================================================== --- twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/build.pl (rev 0) +++ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin/build.pl 2007-03-12 19:46:15 UTC (rev 13127) @@ -0,0 +1,25 @@ + +#!/usr/bin/perl -w +BEGIN { + unshift @INC, split( /:/, $ENV{TWIKI_LIBS} ); +} +use TWiki::Contrib::Build; + +# Create the build object +$build = new TWiki::Contrib::Build('EditRowPlugin'); + +# Set the details of the repository for uploads. +# This can be any web on any accessible TWiki installation. + +# name of web to upload to +$build->{UPLOADTARGETWEB} = 'Plugins'; +# Full URL of pub directory +$build->{UPLOADTARGETPUB} = 'http://twiki.org/p/pub'; +# Full URL of bin directory +$build->{UPLOADTARGETSCRIPT} = 'http://twiki.org/cgi-bin'; +# Script extension +$build->{UPLOADTARGETSUFFIX} = ''; + +# Build the target on the command line, or the default target +$build->build($build->{target}); + Added: twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin.pm (rev 0) +++ twiki/branches/MAIN/twikiplugins/EditRowPlugin/lib/TWiki/Plugins/EditRowPlugin.pm 2007-03-12 19:46:15 UTC (rev 13127) @@ -0,0 +1,176 @@ +# Author: Crawford Currie http://c-dot.co.uk +# +# Copyright (C) 2007 WindRiver Inc. +# and TWiki Contributors. All Rights Reserved. TWiki Contributors +# are listed in the AUTHORS file in the root of this distribution. +# NOTE: Please extend that file, not this notice. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. For +# more details read LICENSE in the root of this distribution. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# For licensing info read LICENSE file in the TWiki root. + +=pod + +---+ package EditRowPlugin + +=cut + +package TWiki::Plugins::EditRowPlugin; + +use strict; + +use vars qw( $VERSION $RELEASE $SHORTDESCRIPTION $debug $pluginName $NO_PREFS_IN_TOPIC ); + +$VERSION = '$Rev$'; +$RELEASE = 'Dakar'; +$SHORTDESCRIPTION = 'Single table row inline edit'; + +$NO_PREFS_IN_TOPIC = 1; + +$pluginName = 'EditRowPlugin'; + +use vars qw($ADD_ROW $DELETE_ROW $QUIET_SAVE $NOISY_SAVE $EDIT_ROW); +$ADD_ROW = 'Add Row'; +$DELETE_ROW = 'Delete Row'; +$QUIET_SAVE = 'Quiet Save'; +$NOISY_SAVE = 'Save'; +$EDIT_ROW = '<button>edit</button>'; + +sub initPlugin { + my( $topic, $web, $user, $installWeb ) = @_; + + # check for Plugins.pm versions + if( $TWiki::Plugins::VERSION < 1.026 ) { + TWiki::Func::writeWarning( "Version mismatch between $pluginName and Plugins.pm" ); + return 0; + } + + TWiki::Func::registerRESTHandler('save', \&save); + + # Plugin correctly initialized + return 1; +} + +# REST handler for table row edit save +sub save { + my $query = TWiki::Func::getCgiQuery(); + + return unless $query; + + my $saveType = $query->param('editrowplugin_save') || ''; + my ($web, $topic) = TWiki::Func::normalizeWebTopicName( + undef, $query->param('topic')); + + my ($meta, $text) = TWiki::Func::readTopic($web, $topic); + my $url; + if (!TWiki::Func::checkAccessPermission( + 'CHANGE', TWiki::Func::getWikiName(), $text, $topic, $web, $meta)) { + $url = TWiki::Func::getOopsUrl( + $web, $topic, 'oopsaccessdenied', + 'accessdenied', 'param2', 'param3'); + } else { + $text =~ s/\\\n//gs; + require TWiki::Plugins::EditRowPlugin::Table; + die $@ if $@; + my $content = TWiki::Plugins::EditRowPlugin::Table::parseTables( + $text, $topic, $web); + + my $urps = $query->Vars(); + + my $nlines = ''; + my $table = undef; + my $active_table = 0; + + my $action; + if ($saveType =~ /^($QUIET_SAVE|$NOISY_SAVE)$/o) { + $action = 'changeRow'; + } elsif ($saveType eq $ADD_ROW) { + $action = 'addRow'; + } elsif ($saveType eq $DELETE_ROW) { + $action = 'deleteRow'; + } + + foreach my $line (@$content) { + if (ref($line) eq 'TWiki::Plugins::EditRowPlugin::Table') { + $table = $line; + $active_table++; + if ($active_table == $urps->{active_table}) { + $line = $table->$action($urps); + } + $table->finish(); + } + $nlines .= "$line\n"; + } + + TWiki::Func::saveTopic($web, $topic, $meta, $nlines, + { minor => 1 }); + + $url = TWiki::Func::getScriptUrl($web, $topic, 'view'); + } + TWiki::Func::redirectCgiQuery(undef, $url); + return 0; +} + +sub commonTagsHandler { + # my ( $text, $topic, $web ) = @_; + + return unless + TWiki::Func::getPreferencesValue('ENABLE_TABLE_ROW_EDIT'); + + return unless $_[0] =~ /%EDITTABLE{(.*?)}%/; + + my ($topic, $web) = ($_[1], $_[2]); + + require TWiki::Plugins::EditRowPlugin::Table; + return if $@; + + my $content = TWiki::Plugins::EditRowPlugin::Table::parseTables(@_); + + $_[0] =~ s/\\\n//gs; + + my $query = TWiki::Func::getCgiQuery(); + + return unless $query; + + my $urps = $query->Vars(); + $urps->{active_table} ||= 0; + $urps->{active_row} ||= 0; + + my $nlines = ''; + my $table = undef; + my $active_table = 0; + + foreach my $line (@$content) { + if (ref($line) eq 'TWiki::Plugins::EditRowPlugin::Table') { + $table = $line; + $active_table++; + if ($active_table == $urps->{active_table}) { + my $saveUrl = + TWiki::Func::getScriptUrl($pluginName, 'save', 'rest'); + $line = <<HTML; +<form name='roweditform_$active_table' method='post' action='$saveUrl'> +<input type="hidden" name="topic" value="$web.$topic" /> +<input type="hidden" name="active_table" value="$active_table" /> +<input type="hidden" name="active_row" value="$urps->{active_row}" /> +HTML + $line .= $table->renderForEdit($urps->{active_row}); + $line .= "\n</form>"; + } else { + $line = $table->renderForDisplay(); + } + $table->finish(); + } + $nlines .= "$line\n"; + } + $_[0] = $nlines; +} + +1; Added: twiki/branches/MAIN/twikiplugins/EditRowPlugin/pub/TWiki/EditRowPlugin/screenshot.gif =================================================================== (Binary files differ) Property changes on: twiki/branches/MAIN/twikiplugins/EditRowPlugin/pub/TWiki/EditRowPlugin/screenshot.gif ___________________________________________________________________ Name: svn:mime-type + application/octet-stream |