Author: YaojunFei Date: 2012-11-30 03:07:26 -0600 (Fri, 30 Nov 2012) New Revision: 24249 Trac url: http://develop.twiki.org/trac/changeset/24249 Added: twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Config.spec Modified: twiki/trunk/ActionTrackerPlugin/data/TWiki/ActionTrackerPlugin.txt twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin.pm twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Action.pm twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/ActionNotify.pm twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/ActionSet.pm twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Format.pm twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Options.pm twiki/trunk/ActionTrackerPlugin/pub/TWiki/ActionTrackerPlugin/styles.css twiki/trunk/ActionTrackerPlugin/templates/actionnotify.tmpl Log: Item7062: ActionTrackerPlugin doesn't support readonly/slave site mode. Item7063: Prettify ActionTrackerPlugin generated HTML. Item7064: Add closed closer column in action tracker. Item7065: Make searching a single web as default behavior. Item7066: Notification should process only master mode webs. Modified: twiki/trunk/ActionTrackerPlugin/data/TWiki/ActionTrackerPlugin.txt =================================================================== --- twiki/trunk/ActionTrackerPlugin/data/TWiki/ActionTrackerPlugin.txt 2012-11-30 08:39:32 UTC (rev 24248) +++ twiki/trunk/ActionTrackerPlugin/data/TWiki/ActionTrackerPlugin.txt 2012-11-30 09:07:26 UTC (rev 24249) @@ -1,4 +1,4 @@ -%META:TOPICINFO{author="TWikiContributor" date="1294610126" format="1.1" version="$Rev$"}% +%META:TOPICINFO{author="TWikiContributor" date="1354188067" format="1.1" version="$Rev$"}% ---+!! Action Tracker Plugin <!-- Contributions to this TWiki plugin are appreciated. Please update the plugin page at @@ -80,7 +80,7 @@ | =notify= | See [[#PeopleAnchor][People]] | Persons who want to be notified of a change | | =state= | =late=, or any legal state value | Set to =late= to search for late actions; set to any any legal state value to search for actions in that state. See [[#SettingsAnchor][Settings]] for details on how to extend the state set. <br /> You can also use a Perl regular expression, which must match the entire state name e.g. =state="open|closed"= will match either open or closed states, but no other states, and =state="(?!closed).*"= will match every state except =closed=. Google for =perlre= for help with Perl regular expressions. | | =within= | a number of days | Search for actions that are within a number of days of their due date. Usually used in conjunction with other attributes, such as <code>state="open"</code>. If you give it a simple number _N_, it will match actions that are due within _N_ days *either side* of the current date. If you give _N_ with a leading '+', this restricts the search to _N_ days in the future. If you give _N_ with a leading '-', it matches only actions that _fell due_ in the last _N_ days. | - | =web= | Perl regular expression | A regular expression that matches the names of all the webs to search. If this attribute is omitted, the default is to search only the current web. Searching many webs is much slower, especially in a large installation. Webs marked NOSEARCHALL will not be searched. | + | =web= | Perl regular expression | A regular expression that matches the names of all the webs to search. If this attribute is omitted, the default is to search only the current web. Searching many webs is much slower, especially in a large installation. Webs marked NOSEARCHALL will not be searched. Setup "$TWiki::cfg{Plugins}{ActionTrackerPlugin}{SearchAllWebs}" to change this default searching behavior. | | =topic= | Perl regular expression | A regular expression that matches the names of all the topics to search. If this attribute is omitted, the default is to search all the topics in the selected webs. | | =due= | Absolute or relative date expression. See [[#DateFormats][Date Formats]] | Due date for the action. | | =creator= | See [[#PeopleAnchor][People]] | Who created the action. | @@ -479,6 +479,11 @@ | License: | GPL ([[http://www.gnu.org/copyleft/gpl.html][GNU General Public License]]) | | Plugin Version: | %$VERSION% | | Change History: | <!-- versions below in reverse order --> | +| 2012-11-29 | TWikibug:Item7066: Notification should process only master mode webs.| +| 2012-11-29 | TWikibug:Item7065: Make searching a single web as default behavior. | +| 2012-11-29 | TWikibug:Item7064: Add "$closed $closer" column in action tracker. | +| 2012-11-29 | TWikibug:Item7063: Prettify ActionTrackerPlugin generated HTML. | +| 2012-11-29 | TWikibug:Item7062: ActionTrackerPlugin doesn't support readonly/slave site mode. | | 2011-01-09 | TWikibug:Item6629: Fix for wrong URL reference for target icon -- TWiki:Main.MichaelGulitz | | 2010-11-12 | TWikibug:Item6530: Doc improvements -- TWiki:Main.PeterThoeny | | 04 Nov 2010 | Improved the fix for unwanted date changes when you create or edit an action. Now it should also work for servers west of Greenwich. | Modified: twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Action.pm =================================================================== --- twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Action.pm 2012-11-30 08:39:32 UTC (rev 24248) +++ twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Action.pm 2012-11-30 09:07:26 UTC (rev 24249) @@ -152,10 +152,11 @@ # PUBLIC Constructor sub new { - my ( $class, $web, $topic, $number, $attrs, $descr ) = @_; + my ( $class, $web, $topic, $number, $attrs, $descr, $readOnly ) = @_; my $this = {}; my $attr = new TWiki::Attrs( $attrs, 1 ); + delete $attr->{uid} if ( $readOnly ); # We always have a state, and if it's not defined in the # attribute set, and the closed attribute isn't defined, @@ -374,12 +375,8 @@ } if ( $this->{state} eq 'closed' ) { - if ( !defined( $this->{closer} ) ) { - $this->{closer} = $me; - } - if ( !defined( $this->{closed} ) ) { - $this->{closed} = $now; - } + $this->{closer} ||= $me; + $this->{closed} ||= $now; } } @@ -825,7 +822,7 @@ sub _formatField_edit { my ( $this, $args, $asHTML, $type, $newWindow ) = @_; - if ( !$asHTML ) { + if ( !$asHTML || !$this->{uid} ) { # Can't edit from plain text return ''; Modified: twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/ActionNotify.pm =================================================================== --- twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/ActionNotify.pm 2012-11-30 08:39:32 UTC (rev 24248) +++ twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/ActionNotify.pm 2012-11-30 09:07:26 UTC (rev 24249) @@ -40,7 +40,7 @@ sub actionNotify { my $expr = shift; - my $session = new TWiki(); + my $session = new TWiki(undef, undef, {command_line => 1}); # Assign SESSION so that Func methods work $TWiki::Plugins::SESSION = $session; @@ -52,24 +52,67 @@ TWiki::Plugins::ActionTrackerPlugin::lazyInit($session->{webName}, $session->{topicName}); if ( $expr =~ s/DEBUG//o ) { - print doNotifications( $session->{webName}, $expr, 1 ), "\n"; + print doAllNotifications( $expr, 1 ),"\n"; } else { - doNotifications( $session->{webName}, $expr, 0 ); + doAllNotifications( $expr, 0 ); } } +sub doAllNotifications { + my ($expr, $debug) = @_; + + $options = TWiki::Plugins::ActionTrackerPlugin::Options::load(); + my $attrs = new TWiki::Attrs( $expr, 1 ); + my $webFilter = $attrs->remove('web') || '.'; + + my @weblist = grep { /$webFilter/ } TWiki::Func::getListOfWebs( 'user' ); + my $session = $TWiki::Plugins::SESSION; + my $infoManager = $session->{admininfomanager} || ''; + my $thisSite = $TWiki::cfg{SiteID} || ''; + + if ( $session->inContext('command_line') ) { + print "* processing action notification ...\n"; + } + foreach my $web ( @weblist ) { + my $topLevWeb = $web; + $topLevWeb =~ s:/.*$::; + my $webRec; + if ( $infoManager && $thisSite ) { + $webRec = $infoManager->getRec("webs", $topLevWeb) or + next; + $webRec->{origsite} eq $thisSite or + next; + } + print " - $web\n"; + if ( $webRec && $webRec->{contact} ) { + my $contact = $webRec->{contact} . '@ms.com'; + $options->{CONTACT_PLAIN} = $contact; + $options->{CONTACT_HTML} = + qq(<a href="mailto:$contact">$contact</a>); + } + else { + delete $options->{CONTACT_PLAIN}; + delete $options->{CONTACT_HTML}; + } + doNotificationsCore($web, $attrs, $options, $debug); + } +} + # Entry point separated from main entry point, because we may want # to call it in a topic without re-initialising. sub doNotifications { my ( $webName, $expr, $debugMailer ) = @_; $options = TWiki::Plugins::ActionTrackerPlugin::Options::load(); + my $attrs = new TWiki::Attrs( $expr, 1 ); + doNotificationsCore($webName, $attrs, $options, $debugMailer); +} +sub doNotificationsCore { + my ($webName, $attrs, $options, $debugMailer) = @_; # Disable the state shortcut in mails $options->{ENABLESTATESHORTCUT} = 0; - - my $attrs = new TWiki::Attrs( $expr, 1 ); my $hdr = $attrs->remove('header') || $options->{TABLEHEADER}; my $bdy = $attrs->remove('format') || $options->{TABLEFORMAT}; @@ -82,7 +125,6 @@ $textform, $changes ); my $result = ''; - my $webs = $attrs->remove('web') || '.*'; my $topics = $attrs->remove('topic') || '.*'; # Okay, we have tables of all the actions and a partial set of the @@ -95,7 +137,7 @@ # need to get rid of formatting done in actionnotify perl script $date =~ s/[, ]+/ /go; $date = _getRelativeDate($date); - _findChangesInWebs( $webs, $topics, $date, $format, \%notifications ); + _findChangesInWeb( $webName, $topics, $date, $format, \%notifications ); foreach my $key ( keys %notifications ) { if ( defined( $notifications{$key} ) ) { $people{$key} = 1; @@ -107,8 +149,8 @@ # Get all the actions that match the search $actions = - TWiki::Plugins::ActionTrackerPlugin::ActionSet::allActionsInWebs( - $webs, $attrs, 1 ); + TWiki::Plugins::ActionTrackerPlugin::ActionSet::allActionsInWeb( + $webName, $attrs, 1 ); $actions->getActionees( \%people ); } @@ -198,7 +240,7 @@ if ( $actionsString || $changesString ) { my $message = _composeActionsMail( $actionsString, $actionsHTML, $changesString, - $changesHTML, $date, $email, $format ); + $changesHTML, $date, $email, $format, $options ); # COVERAGE OFF debug only if ($debugMailer) { @@ -310,7 +352,9 @@ } elsif ( $who =~ m/^($webNameRE)\.($wikiWordRE)$/o ) { my ( $inweb, $intopic ) = ( $1, $2 ); - $addresses = join( ',', TWiki::Func::wikinameToEmails($intopic) ); + $addresses = join( ',', TWiki::Func::wikinameToEmails("$inweb.$intopic") ); + # originally $intopic was handed. By the change, you now can + # specify a group not in the Main web. # LEGACY - Try and expand groups the old way if ( !$addresses && TWiki::Func::topicExists( $inweb, $intopic ) ) { @@ -345,7 +389,7 @@ # PRIVATE Mail the contents of the action set to the given user(s) sub _composeActionsMail { my ( $actionsString, $actionsHTML, $changesString, $changesHTML, $since, - $mailaddr, $format ) + $mailaddr, $format, $options ) = @_; my $from = @@ -375,6 +419,7 @@ $text =~ s/%EMAILFROM%/$from/go; $text =~ s/%EMAILTO%/$mailaddr/go; + $text =~ s/%ACTIONTRACKERPLUGIN_CSS%/$options->{CSS}/g; if ( $actionsString ne '' ) { $text =~ s/%ACTIONS_AS_STRING%/$actionsString/go; @@ -404,6 +449,11 @@ $text =~ s/%CHANGES%.*?%END%//gso; } + my $contactPlain = $options->{CONTACT_PLAIN} || $from; + my $contactHtml = $options->{CONTACT_HTML} || $from; + $text =~ s/%CONTACT_PLAIN%/$contactPlain/g; + $text =~ s/%CONTACT_HTML%/$contactHtml/g; + $text = TWiki::Func::expandCommonVariables( $text, $TWiki::cfg{HomeTopicName} ); Modified: twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/ActionSet.pm =================================================================== --- twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/ActionSet.pm 2012-11-30 08:39:32 UTC (rev 24248) +++ twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/ActionSet.pm 2012-11-30 09:07:26 UTC (rev 24249) @@ -46,6 +46,11 @@ sub load { my ( $web, $topic, $text, $keepText ) = @_; + my $readonly = 0; + if ( defined &TWiki::Func::webWritable ) { + $readonly = 1 unless ( TWiki::Func::webWritable($web) ); + } + $text =~ s/\r//g; my @blocks = split( /(%ACTION{.*?}%|%ENDACTION%)/, $text ); my $actionSet = new TWiki::Plugins::ActionTrackerPlugin::ActionSet(); @@ -81,7 +86,7 @@ } my $action = new TWiki::Plugins::ActionTrackerPlugin::Action( $web, $topic, - $actionNumber++, $attrs, $descr ); + $actionNumber++, $attrs, $descr, $readonly ); $actionSet->add($action); } elsif ($keepText) { Added: twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Config.spec =================================================================== --- twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Config.spec (rev 0) +++ twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Config.spec 2012-11-30 09:07:26 UTC (rev 24249) @@ -0,0 +1,8 @@ +# ---+ Extensions +# ---++ CommentPlugin +# **BOOLEAN** +# %ACTIONSEARCH% searches single web or multiple webs. +$TWiki::cfg{Plugins}{ActionTrackerPlugin}{SearchAllWebs} = 0; + +1; + Modified: twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Format.pm =================================================================== --- twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Format.pm 2012-11-30 08:39:32 UTC (rev 24248) +++ twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Format.pm 2012-11-30 09:07:26 UTC (rev 24249) @@ -202,7 +202,7 @@ $entry = CGI::a( { name => $object->getAnchor() } ) . $entry; $anchored = 1; } - $entry = CGI::td($entry); + $entry = CGI::td($entry) . "\n"; $entry ||= ' '; push @cols, $entry; } @@ -276,24 +276,24 @@ my $newval = _expandVar( $new, $field, undef, 1 ); if ( $oldval ne $newval ) { $row = - CGI::td( $a, $field ) - . CGI::td( $a, $oldval ) - . CGI::td( $a, $newval ); + CGI::td( $a, $field ) . "\n" + . CGI::td( $a, $oldval ) . "\n" + . CGI::td( $a, $newval ) . "\n"; } } elsif ( defined( $old->{$field} ) ) { my $oldval = _expandVar( $old, $field, undef, 1 ); $row = - CGI::td( $a, $field ) - . CGI::td( $a, $oldval ) - . CGI::td( $a, ' *removed* ' ); + CGI::td( $a, $field ) . "\n" + . CGI::td( $a, $oldval ) . "\n" + . CGI::td( $a, ' *removed* ' ) . "\n"; } elsif ( defined( $new->{$field} ) ) { my $newval = _expandVar( $new, $field, undef, 1 ); $row = - CGI::td( $a, $field ) - . CGI::td( $a, ' *missing* ' ) - . CGI::td( $a, $newval ); + CGI::td( $a, $field ) . "\n" + . CGI::td( $a, ' *missing* ' ) . "\n" + . CGI::td( $a, $newval ) . "\n"; } $tbl .= CGI::Tr( $a, $row ) if $row; } @@ -346,7 +346,7 @@ my $entry = $col; $entry =~ s/\$(\w+\b)(?:\((.*?)\))?/ _expandEditField( $this, $object, $1, $2, $expanded )/geos; - $entry = CGI::td( { class => 'atpEdit' }, $entry ); + $entry = CGI::td( { class => 'atpEdit' }, $entry ) . "\n"; push @fields, $entry; } my @rows; Modified: twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Options.pm =================================================================== --- twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Options.pm 2012-11-30 08:39:32 UTC (rev 24248) +++ twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin/Options.pm 2012-11-30 09:07:26 UTC (rev 24249) @@ -10,7 +10,7 @@ CSS => '%PUBURL%/%SYSTEMWEB%/ActionTrackerPlugin/styles.css', DEBUG => '0', DEFAULTDUE => 9999999999, # far in the future - EDITBOXHEIGHT => '10', + EDITBOXHEIGHT => '8', EDITBOXWIDTH => '%EDITBOXWIDTH%', EDITFORMAT => '| $who | $due | $state | $notify |', EDITHEADER => '| Assigned to | Due date | State | Notify |', @@ -19,10 +19,10 @@ EXTRAS => '', NOPREVIEW => '1', NOTIFYCHANGES => '$who,$due,$state,$text', - TABLEFORMAT => '| $who | $due | $text $link | $state | $notify | $edit |', - TABLEHEADER => '| Assigned to | Due date | Description | State | Notify ||', - TABLEORIENT => 'cols', - TEXTFORMAT => 'Action for $who, due $due, $state$n$text$n', + TABLEFORMAT => '| $who | $due | $text $link | $state | $closed $closer | $notify | $edit |', + TABLEHEADER => '| Assigned to | Due date | Description | State | Closed | Notify ||', + TABLEORIENT => 'cols', + TEXTFORMAT => 'Action for $who, due $due, $state$n$text$n', USENEWWINDOW => '1', ); %options = %defaults; Modified: twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin.pm =================================================================== --- twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin.pm 2012-11-30 08:39:32 UTC (rev 24248) +++ twiki/trunk/ActionTrackerPlugin/lib/TWiki/Plugins/ActionTrackerPlugin.pm 2012-11-30 09:07:26 UTC (rev 24249) @@ -73,10 +73,10 @@ } sub commonTagsHandler { - my ( $otext, $topic, $web, $meta ) = @_; - return unless ( $_[0] =~ m/%ACTION.*{.*}%/o ); + my( $otext, $topic, $web, $meta ) = @_; + return unless lazyInit( $web, $topic ); _addCSSAndJS(); @@ -409,6 +409,10 @@ foreach my $action ( @{ $as->{ACTIONS} } ) { next unless ref($action); $action->populateMissingFields(); + if ( $action->{state} eq 'open' ) { + delete $action->{closed}; + delete $action->{closer}; + } if ( $seenUID{ $action->{uid} } ) { # This can happen if there has been a careless @@ -452,9 +456,17 @@ $fmt = $defaultFormat; } - my $actions = - TWiki::Plugins::ActionTrackerPlugin::ActionSet::allActionsInWebs( $web, - $attrs, 0 ); + my $actions; + if ( $TWiki::cfg{Plugins}{ActionTrackerPlugin}{SearchAllWebs} ) { + $actions = + TWiki::Plugins::ActionTrackerPlugin::ActionSet::allActionsInWebs( $web, + $attrs, 0 ); + } + else { + $actions = + TWiki::Plugins::ActionTrackerPlugin::ActionSet::allActionsInWeb( $web, + $attrs, 0 ); + } $actions->sort( $sort, $reverse ); my $result = $actions->formatAsHTML( $fmt, 'href', $options->{USENEWWINDOW}, 'atpSearch' ); @@ -578,6 +590,10 @@ if ( $action->{uid} == $uid ) { foreach my $key ( keys %changes ) { $action->{$key} = $changes{$key}; + if ( $key eq 'state' && $changes{$key} eq 'open' ) { + delete $action->{closed}; + delete $action->{closer}; + } } } } Modified: twiki/trunk/ActionTrackerPlugin/pub/TWiki/ActionTrackerPlugin/styles.css =================================================================== --- twiki/trunk/ActionTrackerPlugin/pub/TWiki/ActionTrackerPlugin/styles.css 2012-11-30 08:39:32 UTC (rev 24248) +++ twiki/trunk/ActionTrackerPlugin/pub/TWiki/ActionTrackerPlugin/styles.css 2012-11-30 09:07:26 UTC (rev 24249) @@ -1,4 +1,4 @@ .atpDef, .atpChanges{border-collapse:collapse;border-spacing:0px;border:solid #ccc 1px;}.atpDef th,.atpChanges th{padding:2px 5px;border:solid #ccc 1px;background-color:#6b7f93;color:white;}.atpDef td,.atpChanges td{padding:2px 5px;}.atpWysiwyg{border:solid #ccc 1px;background-color:#F0DC88;}.atpSearch{border-collapse:collapse;border-spacing:0px;border:solid #ccc 1px;}.atpSearch th{background-color:#6b7f93;color:white;padding:2px 5px;}.atpOrientRows th{text-align:right;}.atpSearch td{padding:2px 5px;border-top:solid #ccc 1px;}.atpClosed, .atpOpen, .atpError, -.atpWarn{display:block;margin:-2px -5px;padding:2px 5px 2px 20px;}.atpClosed{background-color:#40AA54;}.atpOpen{}.atpError{background-color:#F8EAF1;}.atpWarn{background-color:yellow;}.atpStateopen{background-color:orange;}.atpStateclosed{background-color:#D0D0D0;}.atpSignopen{}.atpSignclosed{background-color:#D0D0D0;} +.atpWarn{display:block; margin: -2px -5px;padding: 2px 5px;}.atpClosed{background-color:#BBFFBB;}.atpOpen{}.atpError{background-color:#F8EAF1;}.atpWarn{background-color:#FFFF66;}.atpStateopen{background-color:orange;}.atpStateclosed{background-color:#D0D0D0;}.atpSignopen{}.atpSignclosed{background-color:#D0D0D0;} Modified: twiki/trunk/ActionTrackerPlugin/templates/actionnotify.tmpl =================================================================== --- twiki/trunk/ActionTrackerPlugin/templates/actionnotify.tmpl 2012-11-30 08:39:32 UTC (rev 24248) +++ twiki/trunk/ActionTrackerPlugin/templates/actionnotify.tmpl 2012-11-30 09:07:26 UTC (rev 24249) @@ -20,15 +20,22 @@ %CHANGES_AS_STRING% %END% -For help please contact %WIKIWEBMASTER%. +For help please contact %CONTACT_PLAIN%. --=====================_64421935==_.ALT -Content-Type: text/html; charset="us-ascii" +Content-Type: text/html; charset="%CHARSET%" Content-Transfer-Encoding: 8bit <html> +<head> <link rel="stylesheet" href="%ACTIONTRACKERPLUGIN_CSS%" type="text/css" /> +<style type="text/css"> +#actionnotify table {border-width: 1px; border-style: outset;} +#actionnotify th, #actionnotify td {border-width: 1px; border-style: inset;} +</style> +</head> <body> +<div id="actionnotify"> <p /> This is an automated notification from %WIKITOOLNAME%. %ACTIONS% @@ -41,7 +48,8 @@ <br /> You are registered to receive notifications about state changes in these actions because you are in the =notify= list associated with the action. %END% -<p />For help please contact %WIKIWEBMASTER%. +<p />For help please contact %CONTACT_HTML%. +</div> </body> </html> |