diff --git a/lib/dashboard/Notification.inc.php b/lib/dashboard/Notification.inc.php
index 0b8a176..3bade91 100644
--- a/lib/dashboard/Notification.inc.php
+++ b/lib/dashboard/Notification.inc.php
@@ -5,32 +5,32 @@
* KnowledgeTree Open Source Edition
* Document Management Made Simple
* Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited
- *
+ *
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 3 as published by the
* Free Software Foundation.
- *
+ *
* 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. See the GNU General Public License for more
* details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
- *
+ *
* You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place,
* Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com.
- *
+ *
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
- *
+ *
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "Powered by
- * KnowledgeTree" logo and retain the original copyright notice. If the display of the
+ * KnowledgeTree" logo and retain the original copyright notice. If the display of the
* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
- * must display the words "Powered by KnowledgeTree" and retain the original
- * copyright notice.
+ * must display the words "Powered by KnowledgeTree" and retain the original
+ * copyright notice.
* Contributor( s): ______________________________________
*
*/
@@ -58,7 +58,7 @@ class KTNotification extends KTEntity {
/** primary key value */
var $iId = -1;
var $iUserId;
-
+
// sType and sLabel provide the title of the dashboard alert.
var $sLabel; // a simple label - e.g. the document's title, or so forth.
var $sType; // namespaced item type. (e.g. ktcore/subscriptions, word/officeupload)
@@ -73,34 +73,34 @@ class KTNotification extends KTEntity {
var $iData2;
// sData1 and sData2 are 255-length character fields
var $sData1;
- var $sData2;
+ var $sData2;
// sText1 is a 65535-length text field
- var $sText1;
-
+ var $sText1;
+
var $_bUsePearError = true;
-
+
function getId() { return $this->iId; }
-
- function getLabel() { return $this->sLabel; }
+
+ function getLabel() { return $this->sLabel; }
function setLabel($sLabel) { $this->sLabel = $sLabel; }
- function getType() { return $this->sType; }
+ function getType() { return $this->sType; }
function setType($sType) { $this->sType = $sType; }
-
- function getIntData1() { return $this->iData1; }
+
+ function getIntData1() { return $this->iData1; }
function setIntData1($iData1) { $this->iData1 = $iData1; }
- function getIntData2() { return $this->iData2; }
+ function getIntData2() { return $this->iData2; }
function setIntData2($iData2) { $this->iData2 = $iData2; }
- function getStrData1() { return $this->sData1; }
+ function getStrData1() { return $this->sData1; }
function setStrData1($sData1) { $this->sData1 = $sData1; }
- function getStrData2() { return $this->sData2; }
- function setStrData2($sData2) { $this->sData2 = $sData2; }
- function getTextData1() { return $this->sText1; }
- function setTextData1($mValue) { $this->sText1 = $mValue; }
+ function getStrData2() { return $this->sData2; }
+ function setStrData2($sData2) { $this->sData2 = $sData2; }
+ function getTextData1() { return $this->sText1; }
+ function setTextData1($mValue) { $this->sText1 = $mValue; }
var $_aFieldToSelect = array(
"iId" => "id",
"iUserId" => "user_id",
- "sLabel" => "label",
+ "sLabel" => "label",
"sType" => "type",
"dCreationDate" => "creation_date",
"iData1" => "data_int_1",
@@ -109,7 +109,7 @@ class KTNotification extends KTEntity {
"sData2" => "data_str_2",
"sText1" => "data_text_1",
);
-
+
function _table () {
return KTUtil::getTableName('notifications');
}
@@ -118,11 +118,11 @@ class KTNotification extends KTEntity {
$notificationRegistry =& KTNotificationRegistry::getSingleton();
$handler = $notificationRegistry->getHandler($this->sType);
- if (is_null($handler)) { return null; }
-
+ if (is_null($handler)) { return null; }
+
return $handler->handleNotification($this);
}
-
+
function &getHandler() {
$notificationRegistry =& KTNotificationRegistry::getSingleton();
$handler =& $notificationRegistry->getHandler($this->sType);
@@ -131,10 +131,10 @@ class KTNotification extends KTEntity {
// Static function
function &get($iId) { return KTEntityUtil::get('KTNotification', $iId); }
- function &getList($sWhereClause = null, $aOptions = null ) {
+ function &getList($sWhereClause = null, $aOptions = null ) {
if(!is_array($aOptions)) $aOptions = array($aOptions);
$aOptions['orderby'] = KTUtil::arrayGet($aOptions, 'orderby', 'creation_date DESC');
- return KTEntityUtil::getList2('KTNotification', $sWhereClause, $aOptions);
+ return KTEntityUtil::getList2('KTNotification', $sWhereClause, $aOptions);
}
function &createFromArray($aOptions) { return KTEntityUtil::createFromArray('KTNotification', $aOptions); }
@@ -151,14 +151,15 @@ class KTNotificationHandler extends KTStandardDispatcher {
function handleNotification($oKTNotification) {
$oTemplating =& KTTemplating::getSingleton();
$oTemplate = $oTemplating->loadTemplate("kt3/notifications/generic");
- $aTemplateData = array("context" => $oKTNotification,);
+
+ $aTemplateData = array("context" => $oKTNotification, "oKTConfig" => $oKTConfig);
return $oTemplate->render($aTemplateData);
}
function do_main() {
$this->resolveNotification($this->notification);
}
-
+
// called to resolve the notification (typically from /notify.php?id=xxxxx
function resolveNotification($oKTNotification) {
$_SESSION['KTErrorMessage'][] = _kt("This notification handler does not support publication.");
@@ -172,10 +173,10 @@ class KTSubscriptionNotification extends KTNotificationHandler {
/* Subscription Notifications
*
* Subscriptions are a large part of the notification volume.
- * That said, notifications cater to a larger group, so there is some
+ * That said, notifications cater to a larger group, so there is some
* degree of mismatch between the two.
*
- * Mapping the needs of subscriptions onto the provisions of notifications
+ * Mapping the needs of subscriptions onto the provisions of notifications
* works as:
*
* $oKTN->label: object name [e.g. Document Name]
@@ -183,9 +184,9 @@ class KTSubscriptionNotification extends KTNotificationHandler {
* $oKTN->strData2: _location_ name. (e.g. folder of the subscription.)
* $oKTN->intData1: object id (e.g. document_id, folder_id)
* $oKTN->intData2: actor id (e.g. user_id)
- *
+ *
*/
-
+
var $notificationType = 'ktcore/subscriptions';
var $_eventObjectMap = array(
@@ -202,7 +203,7 @@ class KTSubscriptionNotification extends KTNotificationHandler {
"ArchivedDocument" => 'document', // can go through and request un-archival (?)
"RestoredArchivedDocument" => 'document',
"DiscussDocument" => 'document',
- );
+ );
function KTSubscriptionNotification() {
$this->_eventTypeNames = array(
@@ -218,7 +219,7 @@ class KTSubscriptionNotification extends KTNotificationHandler {
"MovedDocument" => _kt('Document moved'),
"ArchivedDocument" => _kt('Document archived'), // can go through and request un-archival (?)
"RestoredArchivedDocument" => _kt('Document restored'),
- "DiscussDocument" => _kt('Document Discussions updated'),
+ "DiscussDocument" => _kt('Document Discussions updated'),
);
//parent::KTNotificationHandler();
}
@@ -233,9 +234,9 @@ class KTSubscriptionNotification extends KTNotificationHandler {
'has_actor' => false,
'notify_id' => $oKTNotification->getId(),
);
-
+
$info['title'] = KTUtil::arrayGet($this->_eventTypeNames, $info['event_type'], 'Subscription alert:') .': ' . $info['object_name'];
-
+
if ($info['actor_id'] !== null) {
$oTempUser = User::get($info['actor_id']);
if (PEAR::isError($oTempUser) || ($oTempUser == false)) {
@@ -246,31 +247,31 @@ class KTSubscriptionNotification extends KTNotificationHandler {
$info['has_actor'] = true;
}
}
-
+
if ($info['object_id'] !== null) {
$info['object'] = $this->_getEventObject($info['event_type'], $info['object_id']);
}
-
+
return $info;
}
-
+
// resolve the object type based on the alert type.
function _getEventObject($sAlertType, $id) {
$t = KTUtil::arrayGet($this->_eventObjectMap, $sAlertType ,'');
-
+
if ($t == 'document') {
$o = Document::get($id);
- if (PEAR::isError($o) || ($o == false)) { return null;
+ if (PEAR::isError($o) || ($o == false)) { return null;
} else { return $o; }
} else if ($t == 'folder') {
$o = Folder::get($id);
- if (PEAR::isError($o) || ($o == false)) { return null;
+ if (PEAR::isError($o) || ($o == false)) { return null;
} else { return $o; }
} else {
return null;
}
}
-
+
function _getEventObjectType($sAlertType) {
return KTUtil::arrayGet($this->_eventObjectMap, $sAlertType ,'');
}
@@ -286,21 +287,21 @@ class KTSubscriptionNotification extends KTNotificationHandler {
/*
"iId" => "id",
"iUserId" => "user_id",
- "sLabel" => "label",
+ "sLabel" => "label",
"sType" => "type",
"dCreationDate" => "creation_date",
"iData1" => "data_int_1",
"iData2" => "data_int_2",
"sData1" => "data_str_1",
"sData2" => "data_str_2",
-
+
'object_name' => $oKTNotification->getLabel(),
'event_type' => $oKTNotification->getStrData1(),
'location_name' => $oKTNotification->getStrData2(),
'object_id' => $oKTNotification->getIntData1(),
'actor_id' => $oKTNotification->getIntData2(),
- 'has_actor' => false,
-
+ 'has_actor' => false,
+
*/
$creationInfo['sLabel'] = $aOptions['target_name'];
$creationInfo['sData1'] = $aOptions['event_type'];
@@ -312,20 +313,23 @@ class KTSubscriptionNotification extends KTNotificationHandler {
$creationInfo['dCreationDate'] = getCurrentDateTime(); // erk.
global $default;
-
+
//$default->log->debug('subscription notification: from ' . print_r($aOptions, true));
$default->log->debug('subscription notification: using ' . print_r($creationInfo, true));
-
+
$oNotification =& KTNotification::createFromArray($creationInfo);
-
-
+
+
$default->log->debug('subscription notification: created ' . print_r($oNotification, true));
-
+
return $oNotification; // $res.
}
-
-
-
+
+ /**
+ * View the notification, and clear if requested
+ *
+ * @param unknown_type $oKTNotification
+ */
function resolveNotification($oKTNotification) {
$notify_action = KTUtil::arrayGet($_REQUEST, 'notify_action', null);
if ($notify_action == 'clear') {
@@ -333,38 +337,38 @@ class KTSubscriptionNotification extends KTNotificationHandler {
$oKTNotification->delete();
exit(redirect(generateControllerLink('dashboard')));
}
-
+
// otherwise, we want to redirect the to object represented by the item.
// - viewDocument and viewFolder are the appropriate items.
- // - object_id
+ // - object_id
$info = $this->_getSubscriptionData($oKTNotification);
-
+
$object_type = $this->_getEventObjectType($info['event_type']);
-
+
if ($object_type == '') {
- $_SESSION['KTErrorMessage'][] = 'This notification has no "target". Please report as a bug that this subscription should only have a clear action.' . $object_type;
+ $_SESSION['KTErrorMessage'][] = 'This notification has no "target". Please report as a bug that this subscription should only have a clear action.' . $object_type;
exit(redirect(generateControllerLink('dashboard')));
- }
-
+ }
+
if ($object_type == 'document') {
if ($info['object_id'] !== null) { // fails and generates an error with no doc-id.
$params = 'fDocumentId=' . $info['object_id'];
$url = generateControllerLink('viewDocument', $params);
- $oKTNotification->delete(); // clear the alert.
+ //$oKTNotification->delete(); // clear the alert.
exit(redirect($url));
- }
+ }
} else if ($object_type == 'folder') {
if ($info['object_id'] !== null) { // fails and generates an error with no doc-id.
$params = 'fFolderId=' . $info['object_id'];
$url = generateControllerLink('browse', $params);
- $oKTNotification->delete(); // clear the alert.
+ //$oKTNotification->delete(); // clear the alert.
exit(redirect($url));
- }
+ }
}
- $_SESSION['KTErrorMessage'][] = sprintf('This notification has no "target". Please inform the %s developers that there is a target bug with type: ' . $info['event_type'], APP_NAME);
+ $_SESSION['KTErrorMessage'][] = sprintf('This notification has no "target". Please inform the %s developers that there is a target bug with type: ' . $info['event_type'], APP_NAME);
exit(redirect(generateControllerLink('dashboard')));
}
-
+
}
class KTWorkflowNotification extends KTNotificationHandler {
@@ -374,41 +378,41 @@ class KTWorkflowNotification extends KTNotificationHandler {
foreach ($aNotifications as $oNotification) {
$oNotification->delete();
}
-
+
}
- function & newNotificationForDocument($oDocument, $oUser, $oState, $oActor, $sComments) {
- $aInfo = array();
+ function & newNotificationForDocument($oDocument, $oUser, $oState, $oActor, $sComments) {
+ $aInfo = array();
$aInfo['sData1'] = $oState->getName();
$aInfo['sData2'] = $sComments;
$aInfo['iData1'] = $oDocument->getId();
$aInfo['iData2'] = $oActor->getId();
$aInfo['sType'] = 'ktcore/workflow';
- $aInfo['dCreationDate'] = getCurrentDateTime();
+ $aInfo['dCreationDate'] = getCurrentDateTime();
$aInfo['iUserId'] = $oUser->getId();
$aInfo['sLabel'] = $oDocument->getName();
-
+
$oNotification = KTNotification::createFromArray($aInfo);
-
+
$handler = new KTWorkflowNotification();
-
+
if ($oUser->getEmailNotification() && (strlen($oUser->getEmail()) > 0)) {
$emailContent = $handler->handleNotification($oNotification);
$emailSubject = sprintf(_kt('Workflow Notification: %s'), $oDocument->getName());
$oEmail = new EmailAlert($oUser->getEmail(), $emailSubject, $emailContent);
$oEmail->send();
}
-
+
return $oNotification;
}
- function handleNotification($oKTNotification) {
+ function handleNotification($oKTNotification) {
$oTemplating =& KTTemplating::getSingleton();
$oTemplate =& $oTemplating->loadTemplate('ktcore/workflow/workflow_notification');
-
+
$oDoc = Document::get($oKTNotification->getIntData1());
$isBroken = (PEAR::isError($oDoc) || ($oDoc->getStatusID() != LIVE));
-
+
$oTemplate->setData(array(
'context' => $this,
'document_id' => $oKTNotification->getIntData1(),
@@ -421,7 +425,7 @@ class KTWorkflowNotification extends KTNotificationHandler {
));
return $oTemplate->render();
}
-
+
function resolveNotification($oKTNotification) {
$notify_action = KTUtil::arrayGet($_REQUEST, 'notify_action', null);
if ($notify_action == 'clear') {
@@ -429,10 +433,10 @@ class KTWorkflowNotification extends KTNotificationHandler {
$oKTNotification->delete();
exit(redirect(generateControllerLink('dashboard')));
}
-
+
$params = 'fDocumentId=' . $oKTNotification->getIntData1();
$url = generateControllerLink('viewDocument', $params);
- $oKTNotification->delete(); // clear the alert.
+ //$oKTNotification->delete(); // clear the alert.
exit(redirect($url));
}
}
diff --git a/templates/kt3/notifications/subscriptions.AddDocument.smarty b/templates/kt3/notifications/subscriptions.AddDocument.smarty
index 0931815..f54ad2a 100644
--- a/templates/kt3/notifications/subscriptions.AddDocument.smarty
+++ b/templates/kt3/notifications/subscriptions.AddDocument.smarty
@@ -1,13 +1,26 @@
{$info.title|sanitize}
+
{i18n arg_object_name=$info.object_name|sanitize}The document "#object_name#" was added{/i18n}{if ($info.location_name !== null)} {i18n arg_location_name=$info.location_name}to "#location_name#"{/i18n}{/if}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}.
diff --git a/templates/kt3/notifications/subscriptions.AddFolder.smarty b/templates/kt3/notifications/subscriptions.AddFolder.smarty
index fd23def..a1897a9 100644
--- a/templates/kt3/notifications/subscriptions.AddFolder.smarty
+++ b/templates/kt3/notifications/subscriptions.AddFolder.smarty
@@ -3,11 +3,22 @@
{i18n arg_object_name=$info.object_name|sanitize}The folder "#object_name#" was added{/i18n}{if ($info.location_name !== null)} {i18n arg_location_name=$info.location_name}to "#location_name#"{/i18n}{/if}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}.
diff --git a/templates/kt3/notifications/subscriptions.ArchivedDocument.smarty b/templates/kt3/notifications/subscriptions.ArchivedDocument.smarty
index 32210fa..0cd268f 100644
--- a/templates/kt3/notifications/subscriptions.ArchivedDocument.smarty
+++ b/templates/kt3/notifications/subscriptions.ArchivedDocument.smarty
@@ -3,6 +3,9 @@
{i18n arg_object_name=$info.object_name|sanitize}The document "#object_name#"{/i18n}{if ($info.location_name !== null)} {i18n arg_location_name=$info.location_name}from "#location_name#"{/i18n}{/if} {i18n}was archived{/i18n}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}.
diff --git a/templates/kt3/notifications/subscriptions.CheckInDocument.smarty b/templates/kt3/notifications/subscriptions.CheckInDocument.smarty
index 4fe7a1d..5bbf175 100644
--- a/templates/kt3/notifications/subscriptions.CheckInDocument.smarty
+++ b/templates/kt3/notifications/subscriptions.CheckInDocument.smarty
@@ -3,11 +3,18 @@
{i18n arg_object_name=$info.object_name|sanitize}The document "#object_name#" has been checked in{/i18n}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}{if ($info.location_name !== null)}, {i18n arg_location_name=$info.location_name}in the folder "#location_name#"{/i18n}{/if}.
diff --git a/templates/kt3/notifications/subscriptions.CheckOutDocument.smarty b/templates/kt3/notifications/subscriptions.CheckOutDocument.smarty
index 4a48000..af607f3 100644
--- a/templates/kt3/notifications/subscriptions.CheckOutDocument.smarty
+++ b/templates/kt3/notifications/subscriptions.CheckOutDocument.smarty
@@ -3,11 +3,18 @@
{i18n arg_object_name=$info.object_name|sanitize}The document "#object_name#" has been checked out{/i18n}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}{if ($info.location_name !== null)}, {i18n arg_location_name=$info.location_name}from the folder "#location_name#"{/i18n}{/if}.
diff --git a/templates/kt3/notifications/subscriptions.DiscussDocument.smarty b/templates/kt3/notifications/subscriptions.DiscussDocument.smarty
index a691323..eabfd95 100644
--- a/templates/kt3/notifications/subscriptions.DiscussDocument.smarty
+++ b/templates/kt3/notifications/subscriptions.DiscussDocument.smarty
@@ -7,11 +7,20 @@
The discussion around document "{$info.object_name|sanitize}" has been updated.
{/if}
diff --git a/templates/kt3/notifications/subscriptions.ModifyDocument.smarty b/templates/kt3/notifications/subscriptions.ModifyDocument.smarty
index c61fb83..ed8625b 100644
--- a/templates/kt3/notifications/subscriptions.ModifyDocument.smarty
+++ b/templates/kt3/notifications/subscriptions.ModifyDocument.smarty
@@ -3,11 +3,20 @@
{i18n arg_object_name=$info.object_name|sanitize}The document "#object_name#" has been changed{/i18n}{if ($info.location_name !== null)} {i18n arg_location_name=$info.location_name}in the folder "#location_name#"{/i18n}{/if}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}.
diff --git a/templates/kt3/notifications/subscriptions.MoveDocument.smarty b/templates/kt3/notifications/subscriptions.MoveDocument.smarty
index 194c549..504c68b 100644
--- a/templates/kt3/notifications/subscriptions.MoveDocument.smarty
+++ b/templates/kt3/notifications/subscriptions.MoveDocument.smarty
@@ -3,12 +3,21 @@
{i18n arg_object_name=$info.object_name|sanitize}The document "#object_name#" has been moved{/i18n}{if ($info.location_name !== null)} {i18n arg_location_name=$info.location_name}to the folder "#location_name#"{/i18n}{/if}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}.
diff --git a/templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty b/templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty
index e0db4f0..c347c53 100644
--- a/templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty
+++ b/templates/kt3/notifications/subscriptions.RemoveChildDocument.smarty
@@ -3,11 +3,20 @@
{i18n arg_object_name=$info.object_name|sanitize}The document "#object_name#" has been removed{/i18n}{if ($info.location_name !== null)} {i18n arg_location_name=$info.location_name}from the folder "#location_name#"{/i18n} ({i18n}to which you are subscribed{/i18n}){/if}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}.
diff --git a/templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty b/templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty
index 105eaf0..da6816a 100644
--- a/templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty
+++ b/templates/kt3/notifications/subscriptions.RemoveChildFolder.smarty
@@ -3,12 +3,21 @@
{i18n arg_object_name=$info.object_name|sanitize}The folder "#object_name#" has been removed{/i18n}{if ($info.location_name !== null)} {i18n arg_location_name=$info.location_name}from "#location_name#"{/i18n}{/if}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}.
- {if !$is_broken}
-
{i18n}View Folder{/i18n}
- {else}
-
{i18n}Location is no longer available{/i18n}
- {/if}
+
+ {if !$is_broken}
+
{i18n}View Folder{/i18n}
+ {else}
+
{i18n}Location is no longer available{/i18n}
+ {/if}
- |
{i18n}Clear Alert{/i18n}
+ |
+
diff --git a/templates/kt3/notifications/subscriptions.RemoveSubscribedDocument.smarty b/templates/kt3/notifications/subscriptions.RemoveSubscribedDocument.smarty
index 2ecebd8..7f9b479 100644
--- a/templates/kt3/notifications/subscriptions.RemoveSubscribedDocument.smarty
+++ b/templates/kt3/notifications/subscriptions.RemoveSubscribedDocument.smarty
@@ -3,6 +3,12 @@
{i18n arg_object_name=$info.object_name|sanitize}The document "#object_name#" to which you were subscribed, has been removed{/i18n}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}.
diff --git a/templates/kt3/notifications/subscriptions.RemoveSubscribedFolder.smarty b/templates/kt3/notifications/subscriptions.RemoveSubscribedFolder.smarty
index 1a8c49a..f8eaf16 100644
--- a/templates/kt3/notifications/subscriptions.RemoveSubscribedFolder.smarty
+++ b/templates/kt3/notifications/subscriptions.RemoveSubscribedFolder.smarty
@@ -3,6 +3,12 @@
{i18n arg_object_name=$info.object_name|sanitize}The folder "#object_name#" to which you were subscribed, has been removed{/i18n}{if ($info.has_actor)} {i18n arg_actor_name=$info.actor_name}by #actor_name#{/i18n}{/if}.
diff --git a/templates/kt3/notifications/subscriptions.RestoreDocument.smarty b/templates/kt3/notifications/subscriptions.RestoreDocument.smarty
index 02aa440..4f36447 100644
--- a/templates/kt3/notifications/subscriptions.RestoreDocument.smarty
+++ b/templates/kt3/notifications/subscriptions.RestoreDocument.smarty
@@ -3,6 +3,12 @@
{i18n arg_object_name=$info.object_name|sanitize}The document "#object_name#" has been restored by an administrator.{/i18n}
diff --git a/templates/kt3/notifications/subscriptions.generic.smarty b/templates/kt3/notifications/subscriptions.generic.smarty
index fdc7074..0bfb0ab 100644
--- a/templates/kt3/notifications/subscriptions.generic.smarty
+++ b/templates/kt3/notifications/subscriptions.generic.smarty
@@ -1,6 +1,12 @@
{$info.title|sanitize}
diff --git a/templates/ktcore/assist/assist_notification.smarty b/templates/ktcore/assist/assist_notification.smarty
index 4f3057c..c734fb6 100644
--- a/templates/ktcore/assist/assist_notification.smarty
+++ b/templates/ktcore/assist/assist_notification.smarty
@@ -4,11 +4,20 @@
user,
#user#, has requested help on the document
#name#, and you are
the owner or an admin of this document.{/i18n}
diff --git a/templates/ktcore/assist/assist_notification_details.smarty b/templates/ktcore/assist/assist_notification_details.smarty
index c3bb4cf..f2c14eb 100644
--- a/templates/ktcore/assist/assist_notification_details.smarty
+++ b/templates/ktcore/assist/assist_notification_details.smarty
@@ -12,7 +12,16 @@