gunnar: server/patches/fbview HK-GW-framework_3.2_RC1-Fbview_xfb_concept.patch, NONE, 1.1 HK-GW-kronolith_2.2_RC1-Fbview_menu.patch, NONE, 1.1 HK-GW-kronolith_2.2_RC1-Fbview_relevance.patch, NONE, 1.1 HK-GW-kronolith_2.2_RC1-Fbview_xfb_access.patch, NONE, 1.1 HK-JS-kronolith_2.2_RC1-Fix_library_import.patch, NONE, 1.1 HK-SB-kronolith_2.2_RC1-Fbview_extra_params.patch, NONE, 1.1 HK-SB-kronolith_2.2_RC1-Fbview_save_attendees.patch, NONE, 1.1 README_Fbview_extra_params.patch, NONE, 1.1 README_Fbview_menu.patch, NONE, 1.1 README_Fbview_relevance.patch, NONE, 1.1 README_Fbview_save_attendees.patch, NONE, 1.1 README_Fbview_xfb_access.patch, NONE, 1.1 README_Fbview_xfb_concept.patch, NONE, 1.1 README_Fix_library_import.patch, NONE, 1.1
cvs at kolab.org
cvs at kolab.org
Mon Dec 3 17:34:44 CET 2007
Author: gunnar
Update of /kolabrepository/server/patches/fbview
In directory doto:/tmp/cvs-serv28445
Added Files:
HK-GW-framework_3.2_RC1-Fbview_xfb_concept.patch
HK-GW-kronolith_2.2_RC1-Fbview_menu.patch
HK-GW-kronolith_2.2_RC1-Fbview_relevance.patch
HK-GW-kronolith_2.2_RC1-Fbview_xfb_access.patch
HK-JS-kronolith_2.2_RC1-Fix_library_import.patch
HK-SB-kronolith_2.2_RC1-Fbview_extra_params.patch
HK-SB-kronolith_2.2_RC1-Fbview_save_attendees.patch
README_Fbview_extra_params.patch README_Fbview_menu.patch
README_Fbview_relevance.patch
README_Fbview_save_attendees.patch
README_Fbview_xfb_access.patch README_Fbview_xfb_concept.patch
README_Fix_library_import.patch
Log Message:
Create a separate patch directory for the fbview application.
--- NEW FILE: HK-GW-framework_3.2_RC1-Fbview_xfb_concept.patch ---
diff -r fce4450434a7 framework/Share/Share/kolab.php
--- a/framework/Share/Share/kolab.php Thu Nov 29 14:45:46 2007 +0100
+++ b/framework/Share/Share/kolab.php Thu Nov 29 14:49:04 2007 +0100
@@ -17,6 +17,13 @@ define('HORDE_ANNOT_SHARE_ATTR', HORDE_A
* Marks a share without a name. These shares are still invalid
*/
define('KOLAB_SHARE_INVALID', 'KOLAB_SHARE_INVALID');
+
+/**
+ * Kolab specific free/busy relevance
+ */
+define('KOLAB_FBRELEVANCE_ADMINS', 0);
+define('KOLAB_FBRELEVANCE_READERS', 1);
+define('KOLAB_FBRELEVANCE_NOBODY', 2);
/**
* Horde_Share_kolab:: provides the kolab backend for the horde share driver.
@@ -825,16 +832,135 @@ class Horde_Share_Object_kolab extends H
*/
function isDefault()
{
+ $type = $this->getType();
+ if (is_a($type, 'PEAR_Error')) {
+ return false;
+ }
+ return $type[1];
+ }
+
+ //FIXME: The following five functions (actually also most other things in this class
+ // needs to go into Kolab/IMAP.php
+ /**
+ * Get the folder type
+ *
+ * @return mixed Array containing the type and the default status or a PEAR_Error
+ * if the folder annotation cannot be accessed.
+ */
+ function getType()
+ {
$imap = &$this->_shareOb->getImap();
- $annotation = $imap->getAnnotation(KOLAB_ANNOT_FOLDER_TYPE, 'value.shared', $this->_folder);
+ $annotation = $imap->getAnnotation(KOLAB_ANNOT_FOLDER_TYPE,
+ 'value.shared',
+ $this->_folder);
if (is_a($annotation, 'PEAR_Error')) {
- return false;
- }
- if (empty($annotation)) {
- return false;
- }
- $type = explode('.', $annotation);
- return (!empty($type[1]) && $type[1] == 'default');
+ return $annotation;
+ }
+
+ if (!empty($annotation)) {
+ $default = false;
+ $subtype = '';
+ $type = explode('.', $annotation);
+ if (!empty($type[0])) {
+ $foldertype = $type[0];
+ if (!empty($type[1])) {
+ $subtype = $type[1];
+ if ($type[1] == 'default') {
+ $default = true;
+ }
+ }
+ }
+ return array($foldertype, $default, $subtype);
+ } else {
+ return PEAR::raiseError(sprintf(_("Unknown folder type for folder %s."), $this->_folder));
+ }
+ }
+
+ /**
+ * Get the free/busy relevance for this folder
+ *
+ * @return int Value containing the FB_RELEVANCE.
+ */
+ function getFbrelevance()
+ {
+ $imap = &$this->_shareOb->getImap();
+ $entry = KOLAB_ANNOT_ROOT . 'incidences-for';
+
+ $annotation = $imap->getAnnotation($entry, 'value.shared', $this->_folder);
+ if (is_a($annotation, 'PEAR_Error') || empty($annotation)) {
+ return KOLAB_FBRELEVANCE_ADMINS;
+ }
+ switch ($annotation) {
+ case 'admins':
+ return KOLAB_FBRELEVANCE_ADMINS;
+ case 'readers':
+ return KOLAB_FBRELEVANCE_READERS;
+ case 'nobody':
+ return KOLAB_FBRELEVANCE_NOBODY;
+ default:
+ return KOLAB_FBRELEVANCE_ADMINS;
+ }
+ }
+
+ /**
+ * Set the free/busy relevance for this folder
+ *
+ * @param int $relevance Value containing the FB_RELEVANCE
+ *
+ * @return mixed True on success or a PEAR_Error.
+ */
+ function setFbrelevance($relevance)
+ {
+ switch ($relevance) {
+ case KOLAB_FBRELEVANCE_ADMINS:
+ $value = 'admins';
+ break;
+ case KOLAB_FBRELEVANCE_READERS:
+ $value = 'readers';
+ break;
+ case KOLAB_FBRELEVANCE_NOBODY:
+ $value = 'nobody';
+ break;
+ default:
+ $value = 'admins';
+ }
+
+ $imap = &$this->_shareOb->getImap();
+ $entry = KOLAB_ANNOT_ROOT . 'incidences-for';
+ return $imap->setAnnotation($entry, array('value.shared' => $value), $this->_folder);
+ }
+
+ /**
+ * Get the extended free/busy access settings for this folder
+ *
+ * @return array Array containing the users with access to the
+ * extended information.
+ */
+ function getXfbaccess()
+ {
+ $imap = &$this->_shareOb->getImap();
+ $entry = KOLAB_ANNOT_ROOT . 'xfb-readable';
+
+ $annotation = $imap->getAnnotation($entry, 'value.shared', $this->_folder);
+ if (is_a($annotation, 'PEAR_Error') || empty($annotation)) {
+ return array();
+ }
+ return explode(' ', $annotation);
+ }
+
+ /**
+ * Set the extended free/busy access settings for this folder
+ *
+ * @param array $access Array containing the users with access to the
+ * extended information.
+ *
+ * @return mixed True on success or a PEAR_Error.
+ */
+ function setXfbaccess($access)
+ {
+ $imap = &$this->_shareOb->getImap();
+ $entry = KOLAB_ANNOT_ROOT . 'xfb-readable';
+ return $imap->setAnnotation($entry, array('value.shared' => join(' ', $access)), $this->_folder);
}
/**
@@ -910,13 +1036,18 @@ class Horde_Share_Object_kolab extends H
break;
case 'params':
- $params = $this->getAttribute('params');
+ $params = @unserialize($this->getAttribute('params'));
if (is_a($params, 'PEAR_Error') || $params == '') {
- $params = serialize(array('source' => 'kolab',
- 'default' => $this->get('default'),
- 'name' => $this->get('name')));
- }
- $this->data['params'] = $params;
+ $params = array('source' => 'kolab',
+ 'default' => $this->get('default'),
+ 'name' => $this->get('name'));
+ }
+ $type = $this->getType();
+ if (!is_a($type, 'PEAR_Error') && $type[0] == 'event') {
+ $params = array_merge($params, array('fbrelevance' => $this->getFbrelevance(),
+ 'xfbaccess' => $this->getXfbaccess()));
+ }
+ $this->data['params'] = serialize($params);
break;
case 'default':
@@ -967,8 +1098,9 @@ class Horde_Share_Object_kolab extends H
$value = unserialize($value);
if (isset($value['default'])) {
$this->data['default'] = $value['default'];
- }
- break;
+ unset($value['default']);
+ }
+ $value = serialize($value);
default:
$this->data[$attribute] = $value;
@@ -1017,6 +1149,7 @@ class Horde_Share_Object_kolab extends H
}
} elseif ($attribute == 'default') {
$imap = &$this->_shareOb->getImap();
+ //FIXME: Simplify with getType
$annotation = $imap->getAnnotation(KOLAB_ANNOT_FOLDER_TYPE, 'value.shared', $this->_folder);
if (is_a($annotation, 'PEAR_Error')) {
return $annotation;
@@ -1037,6 +1170,40 @@ class Horde_Share_Object_kolab extends H
continue;
} elseif ($attribute == 'folder') {
continue;
+ } elseif ($attribute == 'params') {
+ $type = $this->getType();
+ if (!is_a($type, 'PEAR_Error') && $type[0] == 'event') {
+ $params = @unserialize($value);
+ if (isset($params['fbrelevance'])) {
+ $result = $this->setFbrelevance($params['fbrelevance']);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+ unset($params['fbrelevance']);
+ }
+ if (isset($params['xfbaccess'])) {
+ $result = $this->setXfbaccess($params['xfbaccess']);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+ unset($params['xfbaccess']);
+ }
+
+ if (empty($params)) {
+ continue;
+ }
+
+ $value = @serialize($params);
+ }
+
+ $imap = &$this->_shareOb->getImap();
+ // setAnnotation apparently does not suppoort UTF-8 nor any special characters
+ $store = base64_encode($value);
+ $entry = HORDE_ANNOT_SHARE_ATTR . $attribute;
+ $result = $imap->setAnnotation($entry, array('value.shared' => $store), $this->_folder);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
} else {
$imap = &$this->_shareOb->getImap();
// setAnnotation apparently does not suppoort UTF-8 nor any special characters
--- NEW FILE: HK-GW-kronolith_2.2_RC1-Fbview_menu.patch ---
diff -r 538d4c6293be kronolith/attendees.php
--- a/kronolith/attendees.php Thu Nov 29 12:33:18 2007 +0100
+++ b/kronolith/attendees.php Thu Nov 29 12:34:39 2007 +0100
@@ -236,6 +236,7 @@ Imple::factory('ContactAutoCompleter', a
$title = _("Edit attendees");
require KRONOLITH_TEMPLATES . '/common-header.inc';
+require KRONOLITH_TEMPLATES . '/fbview-menu.inc';
if ($browser->hasFeature('javascript')) {
Horde::addScriptFile('open_savedattlist_win.js');
diff -r 538d4c6293be kronolith/calendars.php
--- a/kronolith/calendars.php Thu Nov 29 12:33:18 2007 +0100
+++ b/kronolith/calendars.php Thu Nov 29 12:34:39 2007 +0100
@@ -134,6 +134,6 @@ Horde::addScriptFile('popup.js', 'horde'
Horde::addScriptFile('popup.js', 'horde', true);
$title = _("My Calendars");
require KRONOLITH_TEMPLATES . '/common-header.inc';
-require KRONOLITH_TEMPLATES . '/menu.inc';
+require KRONOLITH_TEMPLATES . '/fbview-menu.inc';
require KRONOLITH_TEMPLATES . '/calendars/calendars.inc';
require $registry->get('templates', 'horde') . '/common-footer.inc';
diff -r 538d4c6293be kronolith/lib/Kronolith.php
--- a/kronolith/lib/Kronolith.php Thu Nov 29 12:33:18 2007 +0100
+++ b/kronolith/lib/Kronolith.php Thu Nov 29 12:34:39 2007 +0100
@@ -1968,6 +1968,33 @@ class Kronolith {
}
/**
+ * Builds Kronolith's list of menu items.
+ */
+ function getFbviewMenu($returnType = 'object')
+ {
+ global $conf, $registry, $browser, $prefs;
+
+ /* Check here for guest calendars so that we don't get multiple
+ * messages after redirects, etc. */
+ if (!Auth::getAuth() && !count($GLOBALS['all_calendars'])) {
+ $GLOBALS['notification']->push(_("No calendars are available to guests."));
+ }
+
+ require_once 'Horde/Menu.php';
+ $menu = new Menu(HORDE_MENU_MASK_HELP | HORDE_MENU_MASK_LOGIN);
+
+ $menu->add(Horde::applicationUrl('attendees.php'), _("Attendees"), 'attendees.png', null, null, null, '__noselection');
+
+ $menu->add(Horde::applicationUrl('calendars.php'), _("Calendars"), 'calendars.png', null, null, null, '__noselection');
+
+ if ($returnType == 'object') {
+ return $menu;
+ } else {
+ return $menu->render();
+ }
+ }
+
+ /**
* Used with usort() to sort events based on their start times.
* This function ignores the date component so recuring events can
* be sorted correctly on a per day basis.
diff -r 538d4c6293be kronolith/templates/fbview-menu.inc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kronolith/templates/fbview-menu.inc Thu Nov 29 12:34:39 2007 +0100
@@ -0,0 +1,4 @@
+<div id="menu">
+ <?php echo Kronolith::getFbviewMenu('string') ?>
+</div>
+<?php $GLOBALS['notification']->notify(array('listeners' => 'status')) ?>
--- NEW FILE: HK-GW-kronolith_2.2_RC1-Fbview_relevance.patch ---
Allows to set the free/busy relevance on a calendar.
diff -r e7fdad8797ac kronolith/calendars.php
--- a/kronolith/calendars.php Thu Nov 29 14:36:50 2007 +0100
+++ b/kronolith/calendars.php Thu Nov 29 14:43:24 2007 +0100
@@ -39,6 +39,7 @@ case 'save':
$cal = $kronolith_shares->newShare(md5(microtime()));
$cal->set('name', $id);
$cal->set('desc', Util::getFormData('description', ''));
+ $cal->set('params', serialize(array('fbrelevance' => (int) Util::getFormData('fbrelevance', 0))));
$result = $kronolith_shares->addShare($cal);
if (is_a($result, 'PEAR_Error')) {
$notification->push($result, 'horde.error');
@@ -50,6 +51,7 @@ case 'save':
$original_name = $cal->get('name');
$cal->set('name', $id);
$cal->set('desc', Util::getFormData('description', ''));
+ $cal->set('params', serialize(array('fbrelevance' => (int) Util::getFormData('fbrelevance', 0))));
if ($original_name != $id) {
$result = $kronolith_driver->rename($original_name, $id);
@@ -125,9 +127,16 @@ case 'delete':
$remote_calendars = unserialize($prefs->getValue('remote_cals'));
$current_user = Auth::getAuth();
$my_calendars = array();
+$fbrelevance = array();
foreach (Kronolith::listCalendars() as $id => $cal) {
if ($cal->get('owner') == $current_user) {
$my_calendars[$id] = $cal;
+ $params = @unserialize($cal->get('params'));
+ if (isset($params['fbrelevance'])) {
+ $fbrelevance[$id] = $params['fbrelevance'];
+ } else {
+ $fbrelevance[$id] = 0;
+ }
}
}
diff -r e7fdad8797ac kronolith/templates/calendars/calendars.inc
--- a/kronolith/templates/calendars/calendars.inc Thu Nov 29 14:36:50 2007 +0100
+++ b/kronolith/templates/calendars/calendars.inc Thu Nov 29 14:43:24 2007 +0100
@@ -8,7 +8,8 @@ var fields = [];
<?php foreach ($my_calendars as $id => $cal): ?>
fields['<?php echo htmlspecialchars($id) ?>'] = [
"<?php echo rawurlencode(String::convertCharset($cal->get('name'), NLS::getCharset(), 'UTF-8')) ?>",
- "<?php echo rawurlencode(String::convertCharset($cal->get('desc'), NLS::getCharset(), 'UTF-8')) ?>"];
+ "<?php echo rawurlencode(String::convertCharset($cal->get('desc'), NLS::getCharset(), 'UTF-8')) ?>",
+ "<?php echo $fbrelevance[$id] ?>"];
<?php endforeach; ?>
function newChoice()
@@ -25,6 +26,7 @@ function newChoice()
document.shares.edit_share.value = share;
document.shares.id.value = decodeURIComponent(fields[share][0]);
document.shares.description.value = decodeURIComponent(fields[share][1]);
+ document.shares.fbrelevance[fields[share][2]].checked = true;
urlObj.innerHTML = "<?php echo Util::addParameter(Horde::applicationUrl('month.php', true, -1), 'display_cal', '') ?>" + share;
subscriptionUrlObj.innerHTML = "<?php echo $webdav ? (Horde::url($registry->get('webroot', 'horde'), true, -1) . '/rpc.php/kronolith/" + share + ".ics"') : Util::addParameter(Horde::applicationUrl('ics.php', true, -1), 'c', '') . '" + share' ?>;
}
@@ -126,11 +128,55 @@ function checkSubmit()
<textarea id="description" name="description" rows="4" cols="60"></textarea>
</td>
</tr>
- <tr>
- <td valign="top" class="nowrap rightAlign">
+</table>
+
+<div class="control">
+ <?php echo _("Free/Busy relevance") ?>
+</div>
+
+<table width="100%" cellspacing="0">
+ <tr>
+ <td colspan="2">
+ <?php echo _("This calendar is only included into the free/busy data for ...") ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="15%" class="nowrap rightAlign">
+ <strong><?php echo _("owners/administrators") ?></strong>
+ </td>
+ <td width="85%">
+ <input id="admins" name="fbrelevance" type="radio" class="checkbox" value="0"/><br />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="nowrap rightAlign">
+ <strong><?php echo _("readers") ?></strong>
+ </td>
+ <td>
+ <input id="readers" name="fbrelevance" type="radio" class="checkbox" value="1"/>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="nowrap rightAlign">
+ <strong><?php echo _("no one") ?></strong>
+ </td>
+ <td>
+ <input id="none" name="fbrelevance" type="radio" class="checkbox" value="2"/><br />
+ </td>
+ </tr>
+ <td>
+</table>
+
+<div class="control">
+ <?php echo _("Calendar links:") ?>
+</div>
+
+<table width="100%" cellspacing="0">
+ <tr>
+ <td width="15%" class="nowrap rightAlign">
<strong><?php echo _("URL") ?></strong>
</td>
- <td>
+ <td width="85%">
<span id="calendar_url"><em><?php echo _("Select a calendar above to display the URL") ?></em></span>
</td>
</tr>
--- NEW FILE: HK-GW-kronolith_2.2_RC1-Fbview_xfb_access.patch ---
diff -r 14457cf2ea2c kronolith/perms.php
--- a/kronolith/perms.php Thu Nov 29 15:20:49 2007 +0100
+++ b/kronolith/perms.php Thu Nov 29 15:25:36 2007 +0100
@@ -15,6 +15,34 @@ require_once KRONOLITH_BASE . '/lib/base
require_once KRONOLITH_BASE . '/lib/base.php';
require_once 'Horde/Group.php';
+function &getFbperms($share)
+{
+ $fbperms = array();
+ $params = $share->get('params');
+ if (!is_a($params, 'PEAR_Error')) {
+ $params = @unserialize($params);
+ if (isset($params['xfbaccess'])) {
+ $xfbusers = $params['xfbaccess'];
+ foreach ($xfbusers as $user) {
+ $fbperms[$user] = PERMS_READ;
+ }
+ }
+ }
+ return $fbperms;
+}
+
+function setFbperms($share, $xfbusers)
+{
+ $fbperms = array();
+ $params = $share->get('params');
+ if (!is_a($params, 'PEAR_Error')) {
+ $params = @unserialize($params);
+ $params['xfbaccess'] = $xfbusers;
+ $params = serialize($params);
+ $share->set('params', $params);
+ }
+}
+
$shares = &Horde_Share::singleton('kronolith');
$groups = &Group::singleton();
$auth = &Auth::singleton($conf['auth']['driver']);
@@ -36,6 +64,8 @@ case 'edit':
$notification->push($share, 'horde.error');
} elseif (isset($share) && Auth::getAuth() != $share->get('owner')) {
exit('permission denied');
+ } else {
+ $fbperms = getFbperms($share);
}
break;
@@ -251,6 +281,24 @@ case 'editform':
}
}
+ // Process free/busy permissions.
+ $fb_names = Util::getFormData('fb_names');
+ $fb_read = Util::getFormData('fb_read');
+
+ $fbperms = getFbperms($share);
+ foreach ($fb_names as $key => $user) {
+ if (empty($user)) {
+ continue;
+ }
+
+ if (!empty($fb_read[$key])) {
+ $fbperms[$user] = PERMS_READ;
+ } else {
+ unset($fbperms[$user]);
+ }
+ }
+ setFbperms($share, array_keys($fbperms));
+
$share->setPermission($perm, false);
$share->save();
$notification->push(sprintf(_("Updated \"%s\"."), $share->get('name')), 'horde.success');
diff -r 14457cf2ea2c kronolith/templates/perms/perms.inc
--- a/kronolith/templates/perms/perms.inc Thu Nov 29 15:20:49 2007 +0100
+++ b/kronolith/templates/perms/perms.inc Thu Nov 29 15:25:36 2007 +0100
@@ -355,6 +355,61 @@
<td> </td>
</tr>
+<!-- Extended free/busy Permissions -->
+<tr valign="middle">
+ <td class="header leftAlign">
+ <?php echo Horde::img('user.png', '', '', $registry->getImageDir('horde')) . ' ' . _("Extended free/busy access") ?>
+ </td>
+ <td class="header" align="center"> </td>
+ <td class="header" align="center"><?php echo _("Read") ?></td>
+ <td class="header" align="center"> </td>
+ <td class="header" align="center"> </td>
+ <td class="header" align="center"> </td>
+ <td class="header"> </td>
+</tr>
+<?php foreach ($fbperms as $user => $fbperm) { if ($user != $owner) { ?>
+<tr>
+ <td class="light"><?php echo htmlspecialchars(Auth::removeHook($user)) ?><input type="hidden" name="fb_names[<?php echo htmlspecialchars($user) ?>]" value="<?php echo htmlspecialchars($user) ?>" /></td>
+ <td align="center"> </td>
+ <td align="center">
+ <input type="checkbox" id="fb_read_<?php echo str_replace('@', '_', htmlspecialchars($user)) ?>" name="fb_read[<?php echo htmlspecialchars($user) ?>]"<?php echo ($fbperm & PERMS_READ) ? ' checked="checked"' : '' ?> />
+ <label for="fb_read_<?php echo str_replace('@', '_', htmlspecialchars($user)) ?>" class="hidden"><?php echo _("Read") ?></label>
+ </td>
+ <td align="center"> </td>
+ <td align="center"> </td>
+ <td align="center"> </td>
+ <td> </td>
+</tr>
+<?php } } ?>
+<!-- New extended free/busy row -->
+<tr>
+<?php if ($auth->hasCapability('list')): ?>
+ <td class="light">
+ <label for="fb_names_new" class="hidden"><?php echo _("Select a user to add:") ?></label>
+ <select id="fb_names_new" name="fb_names[||new]">
+ <option value=""><?php echo _("Select a user to add:") ?></option>
+ <?php foreach ($userList as $user) { if (!isset($userperms[$user])) { ?>
+ <option value="<?php echo htmlspecialchars($user) ?>"><?php echo htmlspecialchars(Auth::removeHook($user)) ?></option>
+ <?php } } ?>
+ </select>
+ </td>
+<?php else: ?>
+ <td class="light">
+ <label for="fb_names_new" class="hidden"><?php echo _("User to add:") ?></label>
+ <input type="text" id="fb_names_new" name="fb_names[||new]" />
+ </td>
+<?php endif; ?>
+ <td align="center"> </td>
+ <td align="center">
+ <input type="checkbox" id="fb_read_new" name="fb_read[||new]" />
+ <label for="fb_read_new" class="hidden"><?php echo _("Read") ?></label>
+ </td>
+ <td align="center"> </td>
+ <td align="center"> </td>
+ <td align="center"> </td>
+ <td> </td>
+</tr>
+
<tr>
<td colspan="7"> </td>
</tr>
--- NEW FILE: HK-JS-kronolith_2.2_RC1-Fix_library_import.patch ---
Fixes a problem with importing the WebDAV library.
diff -r 56b552eb6b01 kronolith/calendars.php
--- a/kronolith/calendars.php Wed Nov 28 17:00:34 2007 +0100
+++ b/kronolith/calendars.php Thu Nov 29 09:54:49 2007 +0100
@@ -13,7 +13,9 @@
@define('KRONOLITH_BASE', dirname(__FILE__));
require_once KRONOLITH_BASE . '/lib/base.php';
require_once 'Horde/RPC.php';
-require_once 'Horde/RPC/webdav.php';
+if (@include_once 'HTTP/WebDAV/Server.php') {
+ require_once 'Horde/RPC/webdav.php';
+}
// Exit if this isn't an authenticated user.
if (!Auth::getAuth()) {
--- NEW FILE: HK-SB-kronolith_2.2_RC1-Fbview_extra_params.patch ---
This includes extra parameters into the free/busy view. The params are hardcoded so this patch won't make it upstream.
diff -r 735b35f9f866 kronolith/lib/FBView.php
--- a/kronolith/lib/FBView.php Thu Nov 29 11:32:43 2007 +0100
+++ b/kronolith/lib/FBView.php Thu Nov 29 11:35:20 2007 +0100
@@ -86,8 +86,8 @@ class Kronolith_FreeBusy_View {
$template = new Horde_Template();
$rows = '';
foreach ($this->_requiredMembers as $member) {
- $blocks = $this->_getBlocks($member, $member->getBusyPeriods(), 'busyblock.tpl', _("Busy"));
- $template = new Horde_Template();
+ $blocks = $this->_getBlocks($member, $member->getBusyPeriods(), 'busyblock.tpl', _("Busy"), $member->getExtraParams());
+ $template = &new Horde_Template();
$template->set('blocks', $blocks);
$template->set('name', $member->getName());
$rows .= $template->fetch(KRONOLITH_TEMPLATES . '/fbview/row.tpl');
@@ -107,8 +107,8 @@ class Kronolith_FreeBusy_View {
$template = new Horde_Template();
$rows = '';
foreach ($this->_optionalMembers as $member) {
- $blocks = $this->_getBlocks($member, $member->getBusyPeriods(), 'busyblock.tpl', _("Busy"));
- $template = new Horde_Template();
+ $blocks = $this->_getBlocks($member, $member->getBusyPeriods(), 'busyblock.tpl', _("Busy"), $member->getExtraParams());
+ $template = &new Horde_Template();
$template->set('blocks', $blocks);
$template->set('name', $member->getName());
$rows .= $template->fetch(KRONOLITH_TEMPLATES . '/fbview/row.tpl');
@@ -122,6 +122,9 @@ class Kronolith_FreeBusy_View {
$template->set('legend', '');
$html .= $template->fetch(KRONOLITH_TEMPLATES . '/fbview/section.tpl');
}
+
+ //**********
+ //This has been disabled in kolab-fbview. Make this optional?
// Possible meeting times.
$optimal->setAttribute('ORGANIZER', _("All Attendees"));
@@ -144,6 +147,9 @@ class Kronolith_FreeBusy_View {
$template->set('name', _("Required Attendees"));
$template->set('blocks', $blocks);
$rows .= $template->fetch(KRONOLITH_TEMPLATES . '/fbview/row.tpl');
+
+ //This has been disabled in kolab-fbview. Make this optional?
+ //**********
// Reset locale.
setlocale(LC_NUMERIC, $lc);
@@ -217,7 +223,7 @@ class Kronolith_FreeBusy_View {
return $instances[$view];
}
- function _getBlocks($member, $periods, $blockfile, $label)
+ function _getBlocks($member, $periods, $blockfile, $label, $extra = array())
{
$template = new Horde_Template();
$template->set('label', $label);
@@ -250,6 +256,21 @@ class Kronolith_FreeBusy_View {
$template->set('left', $left . '%');
$template->set('width', $width . '%');
+ $template->set('evclick', '');
+
+ if (isset($extra[$periodStart])) {
+ if (!empty($extra[$periodStart]['X-UID'])) {
+ $link = "javascript:performAction('viewaction', '"
+ . addslashes($member->getName() . "#"
+ . String::convertCharset(base64_decode($extra[$periodStart]['X-UID']),
+ 'UTF-8',NLS::getCharset())) . "')";
+ $template->set('evclick', $link);
+ }
+ if (!empty($extra[$periodStart]['X-SUMMARY'])) {
+ $template->set('label', String::convertCharset(base64_decode($extra[$periodStart]['X-SUMMARY']),'UTF-8',
+ NLS::getCharset()));
+ }
+ }
$blocks .= $template->fetch(KRONOLITH_TEMPLATES . '/fbview/' . $blockfile);
} else {
diff -r 735b35f9f866 kronolith/templates/fbview/busyblock.tpl
--- a/kronolith/templates/fbview/busyblock.tpl Thu Nov 29 11:32:43 2007 +0100
+++ b/kronolith/templates/fbview/busyblock.tpl Thu Nov 29 11:35:20 2007 +0100
@@ -1,1 +1,1 @@
-<td><div class="busy" style="left:<tag:left />;width:<tag:width />;"> </div></td>
+<td><div class="busy" onclick="<tag:evclick />" style="cursor:pointer;left:<tag:left />;width:<tag:width />;" title="<tag:label />"> </div></td>
--- NEW FILE: HK-SB-kronolith_2.2_RC1-Fbview_save_attendees.patch ---
Provides a patch to store the list of attendees in the user preferences. This is a broken patch that has been rejected upstream (http://bugs.horde.org/ticket/?id=4788). This should be solved using Horde::Groups.
diff -r 848f241f83e0 kronolith/attendees.php
--- a/kronolith/attendees.php Thu Nov 29 10:56:04 2007 +0100
+++ b/kronolith/attendees.php Thu Nov 29 11:32:43 2007 +0100
@@ -155,6 +155,16 @@ case 'clear':
$attendees = array();
$_SESSION['kronolith']['attendees'] = $attendees;
break;
+
+case 'save':
+ if (empty($attendees)) {
+ break;
+ }
+ $savedattlist = unserialize($prefs->getValue('saved_attendee_list'));
+ $savedattlist[] = array_keys($attendees);
+ $prefs->setValue('saved_attendee_list', serialize($savedattlist));
+ $notification->push(_('Successfully saved attendee list'), 'horde.success');
+ break;
}
// Get the current Free/Busy view; default to the 'day' view if none specified.
@@ -226,6 +236,14 @@ Imple::factory('ContactAutoCompleter', a
$title = _("Edit attendees");
require KRONOLITH_TEMPLATES . '/common-header.inc';
+
+if ($browser->hasFeature('javascript')) {
+ Horde::addScriptFile('open_savedattlist_win.js');
+ $savedattlist_url = 'javascript:open_savedattlist_win();';
+} else {
+ $savedattlist_url = Horde::applicationUrl('savedattlist.php');
+}
+
$notification->notify(array('status'));
require KRONOLITH_TEMPLATES . '/attendees/attendees.inc';
require $registry->get('templates', 'horde') . '/common-footer.inc';
diff -r 848f241f83e0 kronolith/config/prefs.php.dist
--- a/kronolith/config/prefs.php.dist Thu Nov 29 10:56:04 2007 +0100
+++ b/kronolith/config/prefs.php.dist Thu Nov 29 11:32:43 2007 +0100
@@ -465,3 +465,11 @@ if ($GLOBALS['registry']->hasMethod('con
'shared' => false,
'type' => 'implicit'
);
+
+$_prefs['saved_attendee_list'] = array(
+ 'value' => 'a:0:{}',
+ 'locked' => false,
+ 'shared' => false,
+ 'type' => 'implicit',
+ 'desc' => _("A saved list of attendees")
+);
diff -r 848f241f83e0 kronolith/savedattlist.php
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kronolith/savedattlist.php Thu Nov 29 11:32:43 2007 +0100
@@ -0,0 +1,77 @@
+<?php
+/**
+ * $Horde: kronolith/attendeeshandler.php,v 1.1 2004/05/25 08:34:21 stuart Exp $
+ *
+ * Copyright 2004 Code Fusion <http://www.codefusion.co.za/>
+ * Stuart Binge <s.binge at codefusion.co.za>
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ */
+
+ at define('KRONOLITH_BASE', dirname(__FILE__));
+require_once KRONOLITH_BASE . '/lib/base.php';
+require_once KRONOLITH_BASE . '/lib/FBView.php';
+
+$title = _('Load Attendee List');
+
+Horde::addScriptFile('tooltip.js', 'horde');
+require KRONOLITH_TEMPLATES . '/common-header.inc';
+
+// Get our list of saved attendees
+$savedattlist = unserialize($prefs->getValue('saved_attendee_list'));
+
+// Preformat our image urls
+$delimg = Horde::img('delete.png', _("Remove List"), null, $GLOBALS['registry']->getImageDir('horde'));
+$loadimg = Horde::img('tree/folder.png', _("Load List"), null, $GLOBALS['registry']->getImageDir('horde'));
+
+// Get our Action ID & Value. This specifies what action the user initiated.
+$actionID = Util::getFormData('actionID', false);
+$actionValue = Util::getFormData('actionValue', false);
+if (!$actionID) {
+ $actionID = (Util::getFormData('addNew', false) ? 'add' : false);
+ $actionValue = Util::getFormData('newAttendees', '');
+}
+
+// Perform the specified action, if there is one.
+switch ($actionID) {
+case 'remove':
+ // Remove the specified attendee
+ if (array_key_exists($actionValue, $savedattlist)) {
+ unset($savedattlist[$actionValue]);
+ $prefs->setValue('saved_attendee_list', serialize($savedattlist));
+ }
+
+ break;
+
+case 'dismiss':
+ // Make sure we're actually allowed to dismiss
+ if (!$allow_dismiss) break;
+
+ // Close the attendee window
+ global $browser;
+
+ if ($browser->hasFeature('javascript')) {
+ Util::closeWindowJS();
+ } else {
+ $url = Util::getFormData('url');
+
+ if (!empty($url)) {
+ $location = Horde::applicationUrl($url, true);
+ } else {
+ $url = Util::addParameter($prefs->getValue('defaultview') . '.php', 'month', Util::getFormData('month'));
+ $url = Util::addParameter($url, 'year', Util::getFormData('year'));
+ $location = Horde::applicationUrl($url, true);
+ }
+
+ // Make sure URL is unique.
+ $location = Util::addParameter($location, 'unique', md5(microtime()));
+
+ header('Location: ' . $location);
+ }
+ break;
+}
+
+$form_handler = Horde::applicationUrl('savedattlist.php');
+require KRONOLITH_TEMPLATES . '/savedattlist/savedattlist.inc';
+require $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc';
diff -r 848f241f83e0 kronolith/templates/attendees/attendees.inc
--- a/kronolith/templates/attendees/attendees.inc Thu Nov 29 10:56:04 2007 +0100
+++ b/kronolith/templates/attendees/attendees.inc Thu Nov 29 11:32:43 2007 +0100
@@ -92,6 +92,8 @@ function switchDateView(view, timestamp)
<div>
<input type="submit" class="button" name="addNew" value="<?php echo htmlspecialchars(_("Save Attendees")) ?>" />
<input type="submit" class="button" name="addNewClose" value="<?php echo htmlspecialchars(_("Save and Finish")) ?>" />
+ <input type="button" class="button" name="loadAttList" value="<?php echo htmlspecialchars(_("Load Attendee List")) ?>" onclick="<?php echo $savedattlist_url ?>" />
+ <?php if (!empty($attendees)): ?><input type="button" class="button" name="saveAttList" value="<?php echo htmlspecialchars(_("Save Attendee List")) ?>" onclick="performAction('save', '');" /><?php endif; ?>
<?php if (!empty($attendees)): ?><input type="submit" class="button" name="clearAll" value="<?php echo htmlspecialchars(_("Clear all attendees")) ?>" /><?php endif; ?>
</div>
diff -r 848f241f83e0 kronolith/templates/javascript/open_savedattlist_win.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kronolith/templates/javascript/open_savedattlist_win.js Thu Nov 29 11:32:43 2007 +0100
@@ -0,0 +1,36 @@
+<?php if (!strstr($_SERVER['PHP_SELF'], 'javascript.php')): ?><script language="JavaScript" type="text/javascript">
+<!--
+<?php endif; ?>
+function open_savedattlist_win(args)
+{
+ var url = "<?php echo Horde::url($GLOBALS['registry']->applicationWebPath('%application%/savedattlist.php', 'kronolith')) ?>";
+ if (url.indexOf('?') == -1) glue = '?';
+ else glue = '<?php echo ini_get('arg_separator.output') ?>';
+ var now = new Date();
+ var name = "savedattlist_window_" + now.getTime();
+ if (args != "") {
+ url = url + glue + args + '<?php echo ini_get('arg_separator.output') ?>' + "uniq=" + now.getTime();
+ } else {
+ url = url + glue + "uniq=" + now.getTime();
+ }
+ var Width = screen.width;
+ if (Width > 775) {
+ Width = 700;
+ } else {
+ Width -= 75;
+ }
+ var Height = screen.height;
+ if (Height > 725) {
+ Height = 650;
+ } else {
+ Height -= 75;
+ }
+ param = "toolbar=no,location=no,status=yes,scrollbars=yes,resizable=yes,width=" + Width + ",height=" + Height + ",left=0,top=0";
+ name = window.open(url, name, param);
+ if (!eval("name.opener")) {
+ name.opener = self;
+ }
+}
+<?php if (!strstr($_SERVER['PHP_SELF'], 'javascript.php')): ?>// -->
+</script>
+<?php endif; ?>
diff -r 848f241f83e0 kronolith/templates/savedattlist/savedattlist.inc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kronolith/templates/savedattlist/savedattlist.inc Thu Nov 29 11:32:43 2007 +0100
@@ -0,0 +1,68 @@
+<!-- javascript action handling -->
+<script language="JavaScript" type="text/javascript">
+<!--
+function performAction(id, value)
+{
+ document.savedattlistForm.actionID.value = id;
+ document.savedattlistForm.actionValue.value = value;
+ document.savedattlistForm.submit();
+ return false;
+}
+
+function updateMessage(list)
+{
+ if (parent.opener.closed) {
+ alert('<?php echo addslashes(_("The Edit Attendees screen is no longer present. Exiting.")) ?>');
+ this.close();
+ return;
+ }
+
+ if (!parent.opener.document.attendeesForm) {
+ alert('<?php echo addslashes(_("You can only use this form from the Edit Attendees screen.")) ?>');
+ this.close();
+ return;
+ }
+
+ parent.opener.document.attendeesForm.newAttendees.value = list;
+ this.close();
+}
+// -->
+</script>
+
+<form method="post" action="<?php echo $form_handler; ?>" name="savedattlistForm">
+<?php Util::pformInput(); ?>
+<input type="hidden" name="actionID" value="" />
+<input type="hidden" name="actionValue" value="" />
+
+<div align="center">
+
+<table border="0" width="500" cellspacing="0" cellpadding="2">
+
+<!-- header -->
+<tr><td colspan="4" class="header"><b><?php echo $title ?></b></td></tr>
+
+<!-- attendee list header -->
+<tr class="item">
+ <td nowrap="nowrap" width="2%" align="center"><?php echo $loadimg ?></td>
+ <td nowrap="nowrap" width="2%" align="center"><?php echo $delimg ?></td>
+ <td nowrap="nowrap" width="96%"><b><?php echo htmlspecialchars(_("Attendees")) ?></b></td>
+</tr>
+
+<!-- attendees -->
+<?php $i = 0 ?>
+<?php if (empty($savedattlist)): ?>
+ <tr class="item<?php echo ($i++ % 2) ?>"><td align="center" colspan="3"><i><?php echo htmlspecialchars('-- ' . _("No saved attendee lists are available") . ' --') ?></i></td></tr>
+<?php else: foreach ($savedattlist as $index => $list): ?>
+ <tr class="item<?php echo ($i++ % 2) ?>">
+ <?php
+ echo '<td align="center">', Horde::link("javascript:updateMessage('" . addslashes(implode(', ', $list)) . "')", _("Load this list")), $loadimg, "</a></td>";
+ ?>
+ <?php
+ echo '<td align="center">', Horde::link("javascript:performAction('remove', '" . $index . "')", _("Remove this list")), $delimg, "</a></td>";
+ ?>
+ <td><?php echo implode(', ', $list); ?></td>
+ </tr>
+<?php endforeach; endif; ?>
+</table>
+</div>
+</form>
--- NEW FILE: README_Fbview_extra_params.patch ---
DESCRIPTION:
Allows to display extended parameters of events in the free/busy
list. The patch implements this is a Kolab specific fashion and
thus it makes no sense to submit it upstream.
IMPACT:
The free/busy view won't display extended attributes.
REFERENCES:
Mercurial patch repository:
http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary
HISTORY
The patch has been originally developed by Stuart Binge
(Codefusion).
--- NEW FILE: README_Fbview_menu.patch ---
DESCRIPTION:
Adds a reduced menu to the attendees view. This won't make it upstream
since the the view is used by upstream as a popup and does not need a
menu.
IMPACT:
The menu will be missing in fbview.
REFERENCES:
Mercurial patch repository:
http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary
HISTORY
--- NEW FILE: README_Fbview_relevance.patch ---
DESCRIPTION:
Allows to set the free/busy relevance of a calendar. This is Kolab
specific and won't make it upstream in this form.
IMPACT:
Without this patch you won't be able to set the free/busy relevance of
a calendar in fbview.
REFERENCES:
Mercurial patch repository:
http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary
HISTORY
--- NEW FILE: README_Fbview_save_attendees.patch ---
DESCRIPTION:
This allows to store the list of attendees in the user preferences.
The patch implements this in a hackish way and it was consequently
rejected upstream (http://bugs.horde.org/ticket/?id=4788). This
should be solved using Horde::Groups or the Turba API.
IMPACT:
You won't be able to store the list of attendees.
REFERENCES:
Mercurial patch repository:
http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary
HISTORY
The patch has been originally developed by Stuart Binge
(Codefusion).
Horde issue #4788
--- NEW FILE: README_Fbview_xfb_access.patch ---
DESCRIPTION:
Allows to set the access rules for extended free busy parameters.
This is Kolab specific and won't make it upstream in this form.
IMPACT:
Without this patch you won't be able to modify the access rights in
fbview.
REFERENCES:
Mercurial patch repository:
http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary
HISTORY
--- NEW FILE: README_Fbview_xfb_concept.patch ---
DESCRIPTION:
Adds routines in the Horde::Share library to store the free/busy
relevance and the free/busy access settings. This could be submitted
upstream after some restructuring.
IMPACT:
Setting/Getting these parameters won't work in fbview.
REFERENCES:
Mercurial patch repository:
http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary
HISTORY
--- NEW FILE: README_Fix_library_import.patch ---
DESCRIPTION:
A commit shortly before the release of RC1 did break the share editing
in kronolith and nag in case no Webdav PEAR package is available.
IMPACT:
You won't be able to edit calendars or tasklists.
REFERENCES:
Mercurial patch repository:
http://hg.pardus.de/cgi-bin/hg.cgi/horde/HORDE_3_2_RC1/summary
HISTORY
Fix generated from an upstream commit after RC1.
More information about the commits
mailing list