# amazon_s3 is not something that should be enabled via the web.
# external is not a standalone plugin.
-my @default_force_plugins=(qw{amazon_s3 external});
+my @force_plugins=(qw{amazon_s3 external});
sub import { #{{{
hook(type => "getsetup", id => "websetup", call => \&getsetup);
return
websetup_force_plugins => {
type => "string",
- example => \@default_force_plugins,
+ example => [],
description => "list of plugins that cannot be enabled/disabled via the web interface",
safe => 0,
rebuild => 0,
my $key=shift;
my %info=%{shift()};
- # skip complex or internal settings
- next if ref $config{$key} || ref $info{example} || $info{type} eq "internal";
+ # skip internal settings
+ next if $info{type} eq "internal";
+ # XXX hashes not handled yet
+ next if ref $config{$key} && ref $config{$key} eq 'HASH' || ref $info{example} eq 'HASH';
# maybe skip unsafe settings
next if ! $info{safe} && ! $config{websetup_show_unsafe};
# these are handled specially, so don't show
my %shownfields;
if (defined $plugin) {
if (showplugintoggle($form, $plugin, $enabled, $section)) {
- $shownfields{"enable.$plugin"}=$plugin;
+ $shownfields{"enable.$plugin"}=[$plugin];
}
elsif (! $enabled) {
# plugin not enabled and cannot be, so skip showing
my $value=$config{$key};
# multiple plugins can have the same field
my $name=defined $plugin ? $plugin.".".$key : $key;
-
- if ($info{type} eq "string") {
+
+ if (ref $config{$key} eq 'ARRAY' || ref $info{example} eq 'ARRAY') {
+ $form->field(
+ name => $name,
+ label => $description,
+ comment => formatexample($info{example}, $value),
+ type => "text",
+ value => [ref $value eq 'ARRAY' ? @{$value} : "", , "", ""],
+ size => 60,
+ fieldset => $section,
+ );
+ }
+ elsif ($info{type} eq "string") {
$form->field(
name => $name,
label => $description,
$form->text(gettext("Note: Disabled options cannot be configured here, but only by editing the setup file."));
}
else {
- $shownfields{$name}=$key;
+ $shownfields{$name}=[$key, \%info];
}
}
my $section=shift;
if (exists $config{websetup_force_plugins} &&
- grep { $_ eq $plugin } @{$config{websetup_force_plugins}}, @rcs_plugins) {
+ grep { $_ eq $plugin } @{$config{websetup_force_plugins}}) {
return 0;
}
- elsif (! exists $config{websetup_force_plugins} &&
- grep { $_ eq $plugin } @default_force_plugins, @rcs_plugins) {
+ if (grep { $_ eq $plugin } @force_plugins, @rcs_plugins) {
return 0;
}
$form->field(
- ame => "enable.$plugin",
+ name => "enable.$plugin",
label => "",
type => "checkbox",
options => [ [ 1 => sprintf(gettext("enable %s?"), $plugin) ] ],
# list all remaining plugins (with no setup options) at the end
foreach (sort keys %plugins) {
if (showplugintoggle($form, $_, $enabled_plugins{$_}, gettext("other plugins"))) {
- $fields{"enable.$_"}=$_;
+ $fields{"enable.$_"}=[$_];
}
}
IkiWiki::redirect($cgi, $config{url});
return;
}
- elsif ($form->submitted eq 'Save Setup' && $form->validate) {
+ elsif (($form->submitted eq 'Save Setup' || $form->submitted eq 'Rebuild Wiki') && $form->validate) {
+ my %rebuild;
foreach my $field (keys %fields) {
- # TODO plugin enable/disable
- next if $field=~/^enable\./; # plugin
- $config{$fields{$field}}=$form->field($field);
+ if ($field=~/^enable\./) {
+ # rebuild is overkill for many plugins,
+ # but no good way to tell which
+ $rebuild{$field}=1; # TODO only if state changed tho
+ # TODO plugin enable/disable
+ next;
+ }
+
+ my %info=%{$fields{$field}->[1]};
+ my $key=$fields{$field}->[0];
+ my @value=$form->field($field);
+
+ if (! $info{safe}) {
+ error("unsafe field $key"); # should never happen
+ }
+
+ next unless @value;
+ # Avoid setting fields to empty strings,
+ # if they were not set before.
+ next if ! defined $config{$key} && ! grep { length $_ } @value;
+
+ if (ref $config{$key} eq "ARRAY" || ref $info{example} eq "ARRAY") {
+ if ($info{rebuild} && (! defined $config{$key} || (@{$config{$key}}) != (@value))) {
+ $rebuild{$field}=1;
+ }
+ $config{$key}=\@value;
+ }
+ elsif (ref $config{$key} || ref $info{example}) {
+ error("complex field $key"); # should never happen
+ }
+ else {
+ if ($info{rebuild} && (! defined $config{$key} || $config{$key} ne $value[0])) {
+ $rebuild{$field}=1;
+ }
+ $config{$key}=$value[0];
+ }
+ }
+
+ if (%rebuild && $form->submitted eq 'Save Setup') {
+ $form->text(gettext("The configuration changes shown below require a wiki rebuild to take effect."));
+ foreach my $field ($form->field) {
+ next if $rebuild{$field};
+ $form->field(name => $field, type => "hidden",
+ force => 1);
+ }
+ $form->reset(0); # doesn't really make sense here
+ $buttons=["Rebuild Wiki", "Cancel"];
+ }
+ else {
+ # TODO save to real path
+ IkiWiki::Setup::dump("/tmp/s");
+ $form->text(gettext("Setup saved."));
+
+ if (%rebuild) {
+ # TODO rebuild
+ }
}
- # TODO save to real path
- IkiWiki::Setup::dump("/tmp/s");
- $form->text(gettext("Setup saved."));
}
IkiWiki::showform($form, $buttons, $session, $cgi);