basic removal form skeleton
authorJoey Hess <joey@kodama.kitenet.net>
Mon, 21 Jul 2008 16:54:23 +0000 (12:54 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Mon, 21 Jul 2008 16:54:23 +0000 (12:54 -0400)
IkiWiki/Plugin/remove.pm [new file with mode: 0644]

diff --git a/IkiWiki/Plugin/remove.pm b/IkiWiki/Plugin/remove.pm
new file mode 100644 (file)
index 0000000..77ddd63
--- /dev/null
@@ -0,0 +1,105 @@
+#!/usr/bin/perl
+package IkiWiki::Plugin::remove;
+
+use warnings;
+use strict;
+use IkiWiki 2.00;
+
+sub import { #{{{
+       hook(type => "formbuilder_setup", id => "remove", call => \&formbuilder_setup);
+       hook(type => "formbuilder", id => "remove", call => \&formbuilder);
+       hook(type => "sessioncgi", id => "remove", call => \&sessioncgi);
+
+} # }}}
+
+sub formbuilder_setup (@) { #{{{
+       my %params=@_;
+       my $form=$params{form};
+       my $q=$params{cgi};
+
+       if (defined $form->field("do") && $form->field("do") eq "edit") {
+               push @{$params{buttons}}, "Remove";
+               # TODO button for attachments
+       }
+} #}}}
+
+sub confirmation_form ($$) { #{{{ 
+       my $q=shift;
+       my $session=shift;
+
+       eval q{use CGI::FormBuilder};
+       error($@) if $@;
+       my @fields=qw(do page);
+       my $f = CGI::FormBuilder->new(
+               title => "confirm removal",
+               name => "remove",
+               header => 0,
+               charset => "utf-8",
+               method => 'POST',
+               javascript => 0,
+               params => $q,
+               action => $config{cgiurl},
+               stylesheet => IkiWiki::baseurl()."style.css",
+               fields => \@fields,
+       );
+               
+       $f->field(name => "do", type => "hidden", value => "remove", force => 1);
+       $f->field(name => "page", label => "Will remove:", validate => sub {
+               my $page=shift;
+               if (! exists $pagesources{$page}) {
+                       $f->field(name => "page", message => gettext("page does not exist"));
+                       return 0;
+               }
+               else {
+                       IkiWiki::check_canedit($page, $q, $session);
+                       return 1;
+               }
+       });
+
+       return $f, ["Remove", "Cancel"];
+} #}}}
+
+sub formbuilder (@) { #{{{
+       my %params=@_;
+       my $form=$params{form};
+
+       if (defined $form->field("do") && $form->field("do") eq "edit" &&
+           $form->submitted eq "Remove") {
+               # When the remove button is pressed on the edit form,
+               # save the rest of the form state and generate a small
+               # remove confirmation form.
+
+               # TODO save state
+
+
+               my $q=$params{cgi};
+               my $session=$params{session};
+               my ($f, $buttons)=confirmation_form($q, $session);
+               $f->field(name => "page", value => $form->field("page"),
+                       force => 1);
+               IkiWiki::showform($f, $buttons, $session, $q);
+               exit 0;
+       }
+} #}}}
+
+sub sessioncgi ($$) { #{{{
+        my $q=shift;
+
+       if ($q->param("do") eq 'remove') {
+               my $session=shift;
+               my ($form, $buttons)=confirmation_form($q, $session);
+               IkiWiki::decode_form_utf8($form);
+               if ($form->submitted eq 'Cancel') {
+                       error("canceled"); # TODO load state
+               }
+               elsif ($form->submitted eq 'Remove' && $form->validate) {
+                       error("removal not yet implemented"); # TODO
+               }
+               else {
+                       IkiWiki::showform($form, $buttons, $session, $q);
+                       exit 0;
+               }
+       }
+}
+
+1