|
Server : Apache/2.4.62 System : FreeBSD fbsdweb2.web.rcn.net 14.1-RELEASE FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC amd64 User : www ( 80) PHP Version : 8.3.8 Disable Function : NONE Directory : /domains/compasssysweb/calendar/CalciumDir39/Operation/ |
Upload File : |
# Copyright 1999-2003, Fred Steinberg, Brown Bear Software
# General Administration Options - conflicts, event owner only, description
package AdminGeneral;
use strict;
use CGI (':standard');
use Calendar::GetHTML;
use Operation::MultiCal;
use vars ('@ISA');
@ISA = ('Operation::MultiCal');
sub perform {
my $self = shift;
my ($save, $cancel) = $self->getParams (qw (Save Cancel));
if ($cancel) {
my $op = $self->isSystemOp ? 'SysAdminPage' : 'AdminPage';
print $self->redir ($self->makeURL({Op => $op}));
return;
}
my $cgi = new CGI;
my $i18n = $self->I18N;
my @names = qw (language description EventHTML conflict pastEdit future
owner EventSorting multiAdd tentative remindable syncable
timezone);
my %captions = $self->_getCaptions;
my ($calendars, $preferences) = $self->getCalsAndPrefs;
my $override = 1;
my $message = $self->adminChecks;
# Save if we're saving
if (!$message and $save) {
$override = 0;
my (%newPrefs, %oldValues);
foreach (qw (Language Description EventHTML IsSyncable
TimeConflicts TimeSeparation NoPastEditing
FutureLimit FutureLimitAmount FutureLimitUnits
EventOwnerOnly MultiAddUsers MultiAddCals
TentativeSubmit RemindersOn DefaultTimezone)) {
my $value = $self->{params}->{$_};
$value = 0 if !defined ($value);
$newPrefs{$_} = $value;
if ($value ne ($preferences->$_() || '')) {
$oldValues{$_} = $preferences->$_(); # for auditing
}
}
# If Syncability changed, clear LastSyncID
if ($newPrefs{IsSyncable} ne ($oldValues{IsSyncable} || '')) {
$newPrefs{LastRMSyncID} = 0;
}
# Sorting is a bit special
my @sortBy = map {$self->{params}->{"EventSorting-$_"}} 1..3;
my $sortPref = join ',', @sortBy;
$newPrefs{EventSorting} = $sortPref;
if ($sortPref ne ($preferences->EventSorting || '')) {
$oldValues{EventSorting} = $preferences->EventSorting; # auditing
}
# If group, remove prefs that were set to 'Ignore'
my @modified;
if ($self->isMultiCal) {
my %prefMap = (language => [qw /Language/],
description => [qw /Description/],
EventHTML => [qw /EventHTML/],
conflict => [qw /TimeConflicts TimeSeparation/],
pastEdit => [qw /NoPastEditing/],
future => [qw /FutureLimit FutureLimitAmount
FutureLimitUnits/],
owner => [qw /EventOwnerOnly/],
EventSorting => [qw /EventSorting/],
multiAdd => [qw /MultiAddUsers MultiAddCals/],
tentative => [qw /TentativeSubmit/],
remindable => [qw /RemindersOn/],
syncable => [qw /IsSyncable/],
timezone => [qw /DefaultTimezone/]);
@modified = $self->removeIgnoredPrefs (map => \%prefMap,
prefs => \%newPrefs);
$message = $self->getModifyMessage (cals => $calendars,
mods => \@modified,
labels => \%captions);
}
foreach (@$calendars) {
$self->saveForAuditing ($_, \%newPrefs);
$self->dbByName ($_)->setPreferences (\%newPrefs);
}
$self->{audit_formsaved}++;
$preferences = $self->prefs ('force');
if ($newPrefs{Language}) {
$self->{I18N} = undef;
$i18n = $self->I18N; # note it is *after* setting new language
%captions = $self->_getCaptions;
}
}
print $cgi->header;
print $cgi->start_html ('-title' => $i18n->get ('General Settings'),
'-bgcolor' => 'white');
print '<center>';
if (!$self->isSystemOp) {
print GetHTML->AdminHeader (I18N => $i18n,
cal => $self->calendarName || '',
goob => $self->goobLabel || '',
group => $self->groupName || '',
section => 'General Settings');
} else {
print GetHTML->SysAdminHeader ($i18n, 'General Settings');
}
print "<h3>$message</h3>" if $message;
print '</center>';
print '<br>';
# Get the prefs we've already got
my $description = $preferences->Description || '';
my $timeConflicts = $preferences->TimeConflicts || 'Allow';
my $timeSeparation = $preferences->TimeSeparation || 0;
my $noPastEditing = $preferences->NoPastEditing || 0;
my $futureLimit = $preferences->FutureLimit;
my $futureLimitAmount = ($preferences->FutureLimitAmount || 0) + 0;
my $futureLimitUnits = $preferences->FutureLimitUnits || 'months';
my $ownerOnly = $preferences->EventOwnerOnly || 0; # true/false
my $eventHTML = $preferences->EventHTML || 'any';
my $eventSorting = $preferences->EventSorting || 'time,text';
my $multiAddUsers = $preferences->MultiAddUsers || 'nobody';
my $multiAddCals = $preferences->MultiAddCals || 'permitted';
my $tentative = $preferences->TentativeSubmit || 0; # true/false
my $isSyncable = $preferences->IsSyncable || 0;
my $remindersOn = $preferences->RemindersOn || 0;
my $timezone = $preferences->DefaultTimezone || 0;
my @sortBy = split /,/, $eventSorting;
my $conflictHelp = $i18n->get ('AdminGeneral_ConflictHelp');
if ($conflictHelp eq 'AdminGeneral_ConflictHelp') {
($conflictHelp =<<' FNORD') =~ s/^ +//gm;
You can prevent entry of events that have time conflicts\n
with existing events, or allow them to be entered.\n
You may also allow entry of conflicting events, but display a\n
warning.\n\n
You can also specify a minimum separation time between events.\n
For instance, if the separation is specified as 20 minutes, two\n
events would be considered to conflict if one started 15 minutes\n
after the other ended. (Note that this setting will be ignored if\n
Conflicting Events are Allowed.)
FNORD
}
my $HTML_Help = $i18n->get ('AdminGeneral_HTMLHelp');
if ($HTML_Help eq 'AdminGeneral_HTMLHelp') {
($HTML_Help =<<' ENDHTMLHELP') =~ s/^ +//gm;
You can choose to prevent HTML tags in Event and Popup Text\n
from being interpreted by browsers. This can be useful to\n
prevent events with malicious formatting or embedded scripts\n
from doing any harm.
ENDHTMLHELP
}
my $multiAddHelp = $i18n->get ('AdminGeneral_MultiAddHelp');
if ($multiAddHelp eq 'AdminGeneral_MultiAddHelp') {
($multiAddHelp =<<' ENDMULTIHELP') =~ s/^ +//gm;
These settings specify whether or not the `Add to Which Calendars`\n
control should appear on the Event Edit Form.\n\n
You can specify which users will see it:\n
\t\tNobody: it will never appear\n
\t\tCalendar Admin: only users with Admin permission in the
calendar\n
\t\tSystem Admins: only users with System Admin permission\n
\t\tAny User: it will always appear\n\n
You also specify which of the calendars that the\n
user has Add permission in should appear in the list:\n
\t\tIncluded: only calendars included into this calendar\n
\t\tIn Group: only calendars in the current calendars group\n
\t\tAll Permitted: All calendars for which the user has Add
permission\n
ENDMULTIHELP
}
print startform;
# If group, allow selecting any calendar we have Admin permission for
my $calSelector;
my %onChange = ();
if ($self->isMultiCal) {
my $mess;
($calSelector, $mess) = $self->calendarSelector;
print $mess if $mess;
foreach (@names) {
$onChange{$_} = $self->getOnChange ($_);
}
}
my %rows;
my %langHash = I18N->getLanguages;
my $today = Date->new;
my $example = $i18n->get ('Example') . ': "'
. $i18n->get ('Today is') . ': '
. $today->pretty ($i18n) . '"';
my @langValues = sort {$langHash{$a} cmp $langHash{$b}} keys %langHash;
$rows{language} = table (Tr (td (
popup_menu (-name => 'Language',
-default => $preferences->Language,
-onChange => $onChange{language},
-override => $override,
-Values => \@langValues,
-labels => {map {$_, $langHash{$_}}
sort keys %langHash})),
td ($example)));
$rows{description} = table (Tr (td (table (Tr (
td (table (Tr (td (textfield (-name => 'Description',
-default => $description,
-onChange => $onChange{description},
-override => $override,
-columns => 40)),
td (font ({size => -2},
$i18n->get (
'This is not displayed on the '.
'calendar; it is used to ' .
'describe the calendar in ' .
'administration and calendar ' .
'selection lists')))))))))));
my %htmlLabels = (any => $i18n->get ('process HTML tags normally'),
none => $i18n->get ('ignore HTML tags'));
$rows{EventHTML} = table (Tr (td (
popup_menu (-name => 'EventHTML',
-default => $eventHTML,
-onChange => $onChange{EventHTML},
-override => $override,
-Values => ['any', 'none'],#'safe'
-labels => \%htmlLabels)),
td (a ({href =>
"JavaScript:alert (\'$HTML_Help\')"},
$i18n->get ('What does this mean?')))));
my %sortLabels = (time => $i18n->get ('Start Time'),
text => $i18n->get ('Event Text'),
incFrom => $i18n->get ('Included From'),
category => $i18n->get ('Category'));
my @sortVals = qw /time text incFrom category/;
$rows{EventSorting} = table ( {-cellpadding => 0, -cellspacing => 0},
Tr (th [$i18n->get ("Sort first by:"),
$i18n->get ("then by:"),
$i18n->get ("then by:")]),
Tr (
td (popup_menu (-name => 'EventSorting-1',
-default => $sortBy[0],
-onChange => $onChange{EventSorting},
-override => $override,
-Values => \@sortVals,
-labels => \%sortLabels)),
td (popup_menu (-name => 'EventSorting-2',
-default => $sortBy[1],
-onChange => $onChange{EventSorting},
-override => $override,
-Values => ['-', @sortVals],
-labels => \%sortLabels)),
td (popup_menu (-name => 'EventSorting-3',
-default => $sortBy[2],
-onChange => $onChange{EventSorting},
-override => $override,
-Values => ['-', @sortVals],
-labels => \%sortLabels))));
$rows{conflict} = table (
Tr (td (table (Tr (td (popup_menu ('-name' => 'TimeConflicts',
'-default' => $timeConflicts,
-onChange => $onChange{conflict},
-override => $override,
'-values' => ['Allow', 'Prevent',
'Warn'],
'-labels' => {'Allow' =>
$i18n->get ('Allow'),
'Prevent' =>
$i18n->get
("Don't Allow"),
'Warn' =>
$i18n->get ('Warn')}
)),
td ({align => 'right'},
b ($i18n->get ("Minimum Event Separation") .
': ')),
td ({align => 'left'},
popup_menu (-name => 'TimeSeparation',
-default => $timeSeparation,
-onChange => $onChange{conflict},
-override => $override,
-Values => [ 0, 5, 10, 15, 20,
25, 30, 35, 40, 45,
50, 55, 60, 120,180])),
td ({align => 'left'},
$i18n->get ('minutes')),
td ({align => 'right'},
a ({href =>
"JavaScript:alert (\'$conflictHelp\')"},
$i18n->get ('What does this mean?')))),
))));
$rows{pastEdit} = table (Tr (td (checkbox (-name => 'NoPastEditing',
-checked => $noPastEditing,
-onChange => $onChange{pastEdit},
-override => $override,
-value => 1,
-label => ' ' . $i18n->get (
'Prevent editing, deleting, or creating events for ' .
'dates before today.')))));
$rows{future} = table (
Tr (td (table (Tr (td (popup_menu ('-name' => 'FutureLimit',
'-default' => $futureLimit,
-onChange => $onChange{future},
-override => $override,
'-values' => ['Allow', 'Prevent',
'Warn'],
'-labels' => {'Allow' =>
$i18n->get ('No Limit'),
'Prevent' =>
$i18n->get
('Enforce Limit'),
'Warn' =>
$i18n->get
('Warn')}
)),
td ($i18n->get ("New events must be within") . ': '),
td (textfield (-name => 'FutureLimitAmount',
-default => $futureLimitAmount,
-onChange => $onChange{future},
-override => $override,
-size => 4,
-maxlength => 3)),
td (popup_menu (-name => 'FutureLimitUnits',
-default => $futureLimitUnits,
-onChange => $onChange{future},
-override => $override,
-Values => [ 'day', 'week',
'month', 'year' ],
-labels => {
day => $i18n->get ('Day(s)'),
week => $i18n->get ('Week(s)'),
month => $i18n->get ('Month(s)'),
year => $i18n->get ('Year(s)') }
)),
td ($i18n->get ("of today's date.")))))));
$rows{owner} = table (Tr (td (checkbox (-name => 'EventOwnerOnly',
-checked => $ownerOnly,
-onChange => $onChange{owner},
-override => $override,
-value => 1,
-label => ' ' . $i18n->get (
'Permit only the creator ' .
'of an event to Edit ' .
'or Delete it')))));
$rows{multiAdd} = table (Tr (
td ({align => 'right'},
$i18n->get ('Allow which users') . ':'),
td ({align => 'left'},
popup_menu ('-name' => 'MultiAddUsers',
'-default' => $multiAddUsers,
-onChange => $onChange{multiAdd},
-override => $override,
'-values' => ['nobody',
'caladmin',
'sysadmin',
'anyone'],
'-labels' => {'sysadmin' =>
$i18n->get ('System Admins'),
'anyone' =>
$i18n->get ("Any User"),
'caladmin' =>
$i18n->get ("Calendar Admins"),
'nobody' =>
$i18n->get ("Nobody")}
)),
td ({align => 'right'},
$i18n->get ("List which calendars") . ': '),
td ({align => 'left'},
popup_menu (-name => 'MultiAddCals',
-default => $multiAddCals,
-onChange => $onChange{multiAdd},
-override => $override,
-Values => ['included',
'ingroup',
'permitted'],
-labels => {permitted =>
$i18n->get ('All Permitted'),
ingroup =>
$i18n->get ('In Group'),
included =>
$i18n->get ('Included')})),
td ({align => 'right'},
a ({href =>
"JavaScript:alert (\'$multiAddHelp\')"},
$i18n->get ('What does this mean?')))));
my $tent = 'Events added by unprivileged users will not appear until ' .
'approved';
$rows{tentative} = table (Tr (td (checkbox (-name => 'TentativeSubmit',
-checked => $tentative,
-onChange => $onChange{tentative},
-override => $override,
-value => 1,
-label => ' ' .
$i18n->get ($tent)))));
$rows{syncable} = table (Tr (td (checkbox (-name => 'IsSyncable',
-checked => $isSyncable,
-onChange => $onChange{syncable},
-override => $override,
-value => 1,
-label => ' ' . $i18n->get (
'Allow Synchronizing with ' .
'TripleSync and Palm ' .
'Handhelds')))));
my $disabled = '';
if (!Defines->mailEnabled) {
$disabled = '<i>' . $i18n->get ('Disabled in this version') . '</i>';
$remindersOn = 0;
}
$rows{remindable} = table (Tr (td (checkbox (-name => 'RemindersOn',
-checked => $remindersOn,
-onChange => $onChange{remindable},
-override => 1,
-value => 1,
-label => '')),
td ($i18n->get
('Enable subscriptions for this ' .
'calendar; anyone can sign up for ' .
'event email reminders')),
td ($disabled)));
my $serverTime = time;
my %labels;
foreach (-23..23) {
my @vals = localtime ($serverTime + $_ * 3600);
my ($s, $m, $h, $w) = @vals[0,1,2,6];
$labels{$_} = "$_ hours - " .
sprintf "%02d:%02d:%02d %s", $h, $m, $s,
'(' . $i18n->get (Date->dayName ($w, 'abbrev')) .
')';
}
($serverTime = $labels{0}) =~ s/^.*hours - //;
$rows{timezone} = table (Tr (td ($i18n->get ('For Anonymous Users')),
td (
popup_menu (-name => 'DefaultTimezone',
-default => $timezone,
-onChange => $onChange{timezone},
-override => $override,
-Values => [-23..23],
-labels => \%labels)),
td (' ' .
$i18n->get ('Server time:')),
td ($serverTime)));
my $bgcolor = '#dddddd';
my $bg2 = '#eeeeee';
my @rows;
foreach (qw (language description EventHTML conflict pastEdit future
owner EventSorting multiAdd tentative remindable syncable
timezone)) {
($bgcolor, $bg2) = ($bg2, $bgcolor);
push @rows, Tr ({bgcolor => $bgcolor},
$self->groupToggle (name => $_),
td ({align => 'right', width => '22%'},
b ($captions{$_} . ': ')),
td ($rows{$_}));
}
print $calSelector if $calSelector;
# Javascript for 'set all', 'ignore all'
my ($setAlljs, $setAllRow) = $self->setAllJavascript;
print $setAlljs;
push @rows, Tr (td ({-align => 'center'}, $setAllRow)) if $setAllRow;
print table ({width => '100%',
cellspacing => 0,
border => 0},
@rows);
print '<hr>';
print submit (-name => 'Save', -value => $i18n->get ('Save'));
print ' ';
print submit (-name => 'Cancel', -value => $i18n->get ('Done'));
print ' ';
print reset (-value => $i18n->get ('Reset'));
print $self->hiddenParams;
print endform;
print $self->helpNotes;
print $cgi->end_html;
}
sub _getCaptions {
my $self = shift;
my $i18n = $self->I18N;
return (description => $i18n->get ('Description'),
language => $i18n->get ('Language'),
EventHTML => $i18n->get ('HTML in Events'),
EventSorting => $i18n->get ('Event Sorting'),
conflict => $i18n->get ('Time Conflicts'),
pastEdit => $i18n->get ('Past Event Protection'),
future => $i18n->get ('Future Event Limit'),
owner => $i18n->get ('Event Ownership'),
multiAdd => $i18n->get ('Add to Multiple Calendars'),
syncable => $i18n->get ('Synching'),
remindable => $i18n->get ('Subscriptions'),
tentative => $i18n->get ('Require Approval'),
timezone => $i18n->get ('Default Timezone Offset'));
}
1;