Page MenuHomePhorge

No OneTemporary

diff --git a/plugins/calendar/helpdocs/en_US/_static/larry/calendar-acl.png b/plugins/calendar/helpdocs/en_US/_static/larry/calendar-acl.png
index 0d0b2514..753644f7 100644
Binary files a/plugins/calendar/helpdocs/en_US/_static/larry/calendar-acl.png and b/plugins/calendar/helpdocs/en_US/_static/larry/calendar-acl.png differ
diff --git a/plugins/calendar/helpdocs/en_US/manage.rst b/plugins/calendar/helpdocs/en_US/manage.rst
index b86cdd34..6f63c8a6 100644
--- a/plugins/calendar/helpdocs/en_US/manage.rst
+++ b/plugins/calendar/helpdocs/en_US/manage.rst
@@ -1,167 +1,169 @@
.. _calendar-manage:
Manage Your Schedule
====================
All functions to maintain your events are accessible from the main calendar view.
Add Events to a Calendar
------------------------
**Via toolbar**
Click the *New event* button in the toolbar to get an empty dialog where you enter
the :ref:`event properties <calendar-edit-event>` such as summary, date/time, reminders, etc.
Click *Save* to finally add it to the selected calendar.
**At a specific date/time**
Navigate the calendar view to the date you want to add an event for. Then mark the range
of time (or dates in month view) with the mouse by pressing the button at the time the event
should start and releasing it again at time it finishes. This will open the :ref:`event dialog <calendar-edit-event>`
with the selected date/time range already filled in.
In order to create new all-day events, double-click the desired day in the calendar view.
.. index:: Recurring events, Participants, Participants
.. _calendar-edit-event:
Edit and Reschedule Events
--------------------------
The Event Dialog
^^^^^^^^^^^^^^^^
When clicking an event in the calendar view, a dialog showing its details is displayed.
Clicking the *Edit* button in that dialog opens the form to edit all properties of the selected event.
The edit form is divided into different section which can be switched using the tabs on top
of the dialog:
**Summary**
This general section has text fields and selectors for various properties of an event.
Here's a description of all the possible values:
* ``Summary``: The title of the event. This is what you will see in the calendar view.
* ``Location``: Where the event will be taking place.
* ``Description``: Any text that describes the event.
* ``URL``: A link to more information about this event.
* ``Start``: Date and time when the event starts.
* ``End``: Date and time when the event starts.
* ``all-day``: Check this if the event has no start/end time.
* ``Reminder``: Will pop up with an notification at a the specified time before the event.
* ``Calendar``: The calendar the event is saved in. Change it to move an event from one calendar to another.
* ``Category``: The type of event. Categories can also be used for :ref:`coloring <settings-calendar>`.
* ``Show me as``: The representation in your free/busy scheduling calendar visible to others.
* ``Priority``: The priority value of the event.
* ``Privacy``: Flag an event as "private" or "confidential" when sharing your calendar with others.
**Recurrence**
For periodically recurring event series, this tabs has the settings how an event is repeated
over time.
* ``Repeat``: Start with selecting a repetition interval (e.g. monthly)
* ``Every``: How often the frequency will be relevant. For example, for an event that takes place every other week choose Weekly and then 2.
If you choose a frequency of weekly or monthly you can select which days of the week or month the event will occur.
* ``Until``: Determines the duration of the repetition. The recurrence can either run forever, for a number it times or until a specific date.
**Participants**
An important part of managing your schedule is to invite others to events and track their RSVP.
In this part of the edit dialog you can manage the participants of an event. Read more about this
further down in the :ref:`calendar-event-participants` section.
**Attachments**
Sometimes a description text isn't enough to collect information for a specific event.
Switch to this tab to attach files to the current event or to remove them again. Adding
files works pretty much the same as :ref:`attaching them to email messages <mail-compose-attachments>`:
first select a file from your local disk and click *Upload* in order to attach it.
.. note:: Don't forget to finally save the changes by clicking *Save* in the event edit dialog.
Even switching back and forth the tabs will not yet save the data.
+.. index:: Move, Drag & Drop
+
Moving and Resizing with the Mouse
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. container:: image-right
.. image:: _static/_skin/event-resize.png
If an existing event shall be rescheduled to another time or date, you'll find it handy
to do that directly in the calendar view without opening the edit form. Simply grab the event
block with the mouse and move it to the new date or time. Release the mouse button to complete.
In *Month* and *Day* view, the event blocks have a small handle at the bottom. Drag this with the
mouse in order to resize the event meaning to adjust its duration.
.. index:: Notifications, Reminders, Alarms
.. _calendar-event-alarms:
Get Notifications
-----------------
.. container:: image-right
.. image:: _static/_skin/alarms-popup.png
While logged in to the webmail, event reminders will be displayed with pop-up boxes at the specified time
before the event starts. You can specify if you want to see alarms for every calendar individually.
Enable or disable alarms in :ref:`Calendar Settings <calendar-edit-properties>` from the :ref:`calendar-lists`.
Dismiss or Snooze Alarms
^^^^^^^^^^^^^^^^^^^^^^^^
When a reminder box pops up, you can either dismiss the notification for all events or each one individually.
When dismissed, no further reminders will be displayed. Choose a time from the *Snooze* menu to get another
reminder after the selected time.
.. index:: Invite, Participants, Attendees
.. _calendar-event-participants:
Inviting Other People
---------------------
If you need to set up a meeting, and keep track of who's attending and who is not, the calendar can do this
as well as you to automatically send invitations and read their responses.
When creating a new event, switch to the *Participants* tab. You're already listed as the organizer of the event.
.. image:: _static/_skin/event-participants.png
1. Enter the name or email address of the person to invite. Contacts from the address book are suggested as you type.
In order to send invitations, make sure the entered contact has an email address. Type it in the form
``Person Name <email@address.com>``.
2. Click *Add participant* to add the person to the list.
3. Select a *Role* (e.g. required or optional) for this person.
4. Repeat 1-3 for further participants.
5. Check the *Send invitations* box if the application should send out invitation emails.
Invitations will be sent out when you click *Save* and the event is created.
.. only:: kolab
.. index:: Availability
.. _calendar-availability-finder:
Find Availability
^^^^^^^^^^^^^^^^^
Once all the participants are added to the list, you see the individual availability status for each one
of them, given that this information is available. In case not everybody is free, click the *Find availability...*
button to open the scheduling dialog. In that dialog, detailed availability information for all participants is
displayed. Use the *Previous/Next Slot* buttons to find the next time slot where all required participants are
available. Or drag the gray area representing the event duration with the mouse to manually select a free slot.
Click *Select* to copy the rescheduled date/time back into the event form and to close this dialog.
Receive Event Invitations
-------------------------
How to process incoming event invitations is described in chapter :ref:`calendar-invitations`.
\ No newline at end of file
diff --git a/plugins/kolab_addressbook/helpdocs/en_US/_static/_skin b/plugins/kolab_addressbook/helpdocs/en_US/_static/_skin
new file mode 120000
index 00000000..01372893
--- /dev/null
+++ b/plugins/kolab_addressbook/helpdocs/en_US/_static/_skin
@@ -0,0 +1 @@
+larry
\ No newline at end of file
diff --git a/plugins/kolab_addressbook/helpdocs/en_US/_static/larry/abook-menu.png b/plugins/kolab_addressbook/helpdocs/en_US/_static/larry/abook-menu.png
new file mode 100644
index 00000000..7c26c6ca
Binary files /dev/null and b/plugins/kolab_addressbook/helpdocs/en_US/_static/larry/abook-menu.png differ
diff --git a/plugins/kolab_addressbook/helpdocs/en_US/addressbook.rst b/plugins/kolab_addressbook/helpdocs/en_US/addressbook.rst
new file mode 100644
index 00000000..2142d653
--- /dev/null
+++ b/plugins/kolab_addressbook/helpdocs/en_US/addressbook.rst
@@ -0,0 +1,39 @@
+.. index:: Sharing
+.. _kolab-addressbook-sharing:
+
+
+Sharing Address Books
+=====================
+
+Just like calendars or regular email folders, personal address books can also be shared
+with other users in your workgroup.
+
+
+Share Contacts with others
+--------------------------
+
+.. container:: image-right
+
+ .. image:: _static/_skin/abook-menu.png
+
+ Settings for sharing is controlled through the address book properties accessible
+ through the *More actions* menu behind the gear icon the footer in the :ref:`addressbook-groups` list.
+
+ 1. Select the address book you want to share.
+ 2. Choose *Edit address book* from the actions menu.
+ 3. Switch to the *Sharing* tab in the properties form on the right.
+
+ The table displays who already has permission to see and modify the selected address book.
+ Here you can manage permissions the same way as :ref:`Sharing a Folder <settings-folder-sharing>`.
+
+
+Subscribe to Shared Address Books
+---------------------------------
+
+Address books shared by others are not showing up right away in the directories list of the web client.
+Switch to :ref:`Settings > Folders <settings-folders>` to see all resources you can access.
+There's a shortcut to this: click *Manage folders* in the actions menu behind the gear icon
+located the footer of the directory list.
+
+In order to make a shared address book appear in the address book view, locate it in the folder manager
+and check the *Subscribed* mark in the list. Only subscribed directories are visible in the address book view.
diff --git a/plugins/kolab_addressbook/kolab_addressbook.php b/plugins/kolab_addressbook/kolab_addressbook.php
index bcaf97df..4f812c23 100644
--- a/plugins/kolab_addressbook/kolab_addressbook.php
+++ b/plugins/kolab_addressbook/kolab_addressbook.php
@@ -1,538 +1,538 @@
<?php
/**
* Kolab address book
*
* Sample plugin to add a new address book source with data from Kolab storage
* It provides also a possibilities to manage contact folders
* (create/rename/delete/acl) directly in Addressbook UI.
*
* @version @package_version@
* @author Thomas Bruederli <bruederli@kolabsys.com>
* @author Aleksander Machniak <machniak@kolabsys.com>
*
* Copyright (C) 2011, Kolab Systems AG <contact@kolabsys.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
class kolab_addressbook extends rcube_plugin
{
- public $task = 'mail|settings|addressbook|calendar';
+ public $task = 'mail|settings|addressbook|calendar|tasks';
private $sources;
private $rc;
private $ui;
const GLOBAL_FIRST = 0;
const PERSONAL_FIRST = 1;
const GLOBAL_ONLY = 2;
const PERSONAL_ONLY = 3;
/**
* Startup method of a Roundcube plugin
*/
public function init()
{
require_once(dirname(__FILE__) . '/lib/rcube_kolab_contacts.php');
$this->rc = rcube::get_instance();
// load required plugin
$this->require_plugin('libkolab');
// register hooks
$this->add_hook('addressbooks_list', array($this, 'address_sources'));
$this->add_hook('addressbook_get', array($this, 'get_address_book'));
$this->add_hook('config_get', array($this, 'config_get'));
if ($this->rc->task == 'addressbook') {
$this->add_texts('localization');
$this->add_hook('contact_form', array($this, 'contact_form'));
// Plugin actions
$this->register_action('plugin.book', array($this, 'book_actions'));
$this->register_action('plugin.book-save', array($this, 'book_save'));
// Load UI elements
if ($this->api->output->type == 'html') {
$this->load_config();
require_once($this->home . '/lib/kolab_addressbook_ui.php');
$this->ui = new kolab_addressbook_ui($this);
}
}
else if ($this->rc->task == 'settings') {
$this->add_texts('localization');
$this->add_hook('preferences_list', array($this, 'prefs_list'));
$this->add_hook('preferences_save', array($this, 'prefs_save'));
}
}
/**
* Handler for the addressbooks_list hook.
*
* This will add all instances of available Kolab-based address books
* to the list of address sources of Roundcube.
* This will also hide some addressbooks according to kolab_addressbook_prio setting.
*
* @param array $p Hash array with hook parameters
*
* @return array Hash array with modified hook parameters
*/
public function address_sources($p)
{
$abook_prio = $this->addressbook_prio();
$undelete = $this->rc->config->get('undo_timeout');
// Disable all global address books
// Assumes that all non-kolab_addressbook sources are global
if ($abook_prio == self::PERSONAL_ONLY) {
$p['sources'] = array();
}
$sources = array();
$names = array();
foreach ($this->_list_sources() as $abook_id => $abook) {
$name = kolab_storage::folder_displayname($abook->get_name(), $names);
// register this address source
$sources[$abook_id] = array(
'id' => $abook_id,
'name' => $name,
'readonly' => $abook->readonly,
'editable' => $abook->editable,
'groups' => $abook->groups,
'undelete' => $abook->undelete && $undelete,
'realname' => rcube_charset::convert($abook->get_realname(), 'UTF7-IMAP'), // IMAP folder name
'class_name' => $abook->get_namespace(),
'carddavurl' => $abook->get_carddav_url(),
'kolab' => true,
);
}
// Add personal address sources to the list
if ($abook_prio == self::PERSONAL_FIRST) {
// $p['sources'] = array_merge($sources, $p['sources']);
// Don't use array_merge(), because if you have folders name
// that resolve to numeric identifier it will break output array keys
foreach ($p['sources'] as $idx => $value)
$sources[$idx] = $value;
$p['sources'] = $sources;
}
else {
// $p['sources'] = array_merge($p['sources'], $sources);
foreach ($sources as $idx => $value)
$p['sources'][$idx] = $value;
}
return $p;
}
/**
* Sets autocomplete_addressbooks option according to
* kolab_addressbook_prio setting extending list of address sources
* to be used for autocompletion.
*/
public function config_get($args)
{
if ($args['name'] != 'autocomplete_addressbooks') {
return $args;
}
$abook_prio = $this->addressbook_prio();
// here we cannot use rc->config->get()
$sources = $GLOBALS['CONFIG']['autocomplete_addressbooks'];
// Disable all global address books
// Assumes that all non-kolab_addressbook sources are global
if ($abook_prio == self::PERSONAL_ONLY) {
$sources = array();
}
if (!is_array($sources)) {
$sources = array();
}
$kolab_sources = array();
foreach (array_keys($this->_list_sources()) as $abook_id) {
if (!in_array($abook_id, $sources))
$kolab_sources[] = $abook_id;
}
// Add personal address sources to the list
if (!empty($kolab_sources)) {
if ($abook_prio == self::PERSONAL_FIRST) {
$sources = array_merge($kolab_sources, $sources);
}
else {
$sources = array_merge($sources, $kolab_sources);
}
}
$args['result'] = $sources;
return $args;
}
/**
* Getter for the rcube_addressbook instance
*
* @param array $p Hash array with hook parameters
*
* @return array Hash array with modified hook parameters
*/
public function get_address_book($p)
{
if ($p['id']) {
$this->_list_sources();
if ($this->sources[$p['id']]) {
$p['instance'] = $this->sources[$p['id']];
}
}
return $p;
}
private function _list_sources()
{
// already read sources
if (isset($this->sources))
return $this->sources;
$this->sources = array();
$abook_prio = $this->addressbook_prio();
// Personal address source(s) disabled?
if ($abook_prio == self::GLOBAL_ONLY) {
return $this->sources;
}
// get all folders that have "contact" type
$folders = kolab_storage::sort_folders(kolab_storage::get_folders('contact'));
if (PEAR::isError($folders)) {
rcube::raise_error(array(
'code' => 600, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
'message' => "Failed to list contact folders from Kolab server:" . $folders->getMessage()),
true, false);
}
else {
// we need at least one folder to prevent from errors in Roundcube core
// when there's also no sql nor ldap addressbook (Bug #2086)
if (empty($folders)) {
if ($folder = kolab_storage::create_default_folder('contact')) {
$folders = array(new kolab_storage_folder($folder, 'contact'));
}
}
// convert to UTF8 and sort
$names = array();
foreach ($folders as $folder) {
// create instance of rcube_contacts
$abook_id = kolab_storage::folder_id($folder->name);
$abook = new rcube_kolab_contacts($folder->name);
$this->sources[$abook_id] = $abook;
}
}
return $this->sources;
}
/**
* Plugin hook called before rendering the contact form or detail view
*
* @param array $p Hash array with hook parameters
*
* @return array Hash array with modified hook parameters
*/
public function contact_form($p)
{
// none of our business
if (!is_object($GLOBALS['CONTACTS']) || !is_a($GLOBALS['CONTACTS'], 'rcube_kolab_contacts'))
return $p;
// extend the list of contact fields to be displayed in the 'personal' section
if (is_array($p['form']['personal'])) {
$p['form']['personal']['content']['profession'] = array('size' => 40);
$p['form']['personal']['content']['children'] = array('size' => 40);
$p['form']['personal']['content']['freebusyurl'] = array('size' => 40);
$p['form']['personal']['content']['pgppublickey'] = array('size' => 70);
$p['form']['personal']['content']['pkcs7publickey'] = array('size' => 70);
// re-order fields according to the coltypes list
$p['form']['contact']['content'] = $this->_sort_form_fields($p['form']['contact']['content']);
$p['form']['personal']['content'] = $this->_sort_form_fields($p['form']['personal']['content']);
/* define a separate section 'settings'
$p['form']['settings'] = array(
'name' => $this->gettext('settings'),
'content' => array(
'freebusyurl' => array('size' => 40, 'visible' => true),
'pgppublickey' => array('size' => 70, 'visible' => true),
'pkcs7publickey' => array('size' => 70, 'visible' => false),
)
);
*/
}
return $p;
}
private function _sort_form_fields($contents)
{
$block = array();
$contacts = reset($this->sources);
foreach (array_keys($contacts->coltypes) as $col) {
if (isset($contents[$col]))
$block[$col] = $contents[$col];
}
return $block;
}
/**
* Handler for user preferences form (preferences_list hook)
*
* @param array $args Hash array with hook parameters
*
* @return array Hash array with modified hook parameters
*/
public function prefs_list($args)
{
if ($args['section'] != 'addressbook') {
return $args;
}
$ldap_public = $this->rc->config->get('ldap_public');
$abook_type = $this->rc->config->get('address_book_type');
// Hide option if there's no global addressbook
if (empty($ldap_public) || $abook_type != 'ldap') {
return $args;
}
// Check that configuration is not disabled
$dont_override = (array) $this->rc->config->get('dont_override', array());
$prio = $this->addressbook_prio();
if (!in_array('kolab_addressbook_prio', $dont_override)) {
// Load localization
$this->add_texts('localization');
$field_id = '_kolab_addressbook_prio';
$select = new html_select(array('name' => $field_id, 'id' => $field_id));
$select->add($this->gettext('globalfirst'), self::GLOBAL_FIRST);
$select->add($this->gettext('personalfirst'), self::PERSONAL_FIRST);
$select->add($this->gettext('globalonly'), self::GLOBAL_ONLY);
$select->add($this->gettext('personalonly'), self::PERSONAL_ONLY);
$args['blocks']['main']['options']['kolab_addressbook_prio'] = array(
'title' => html::label($field_id, Q($this->gettext('addressbookprio'))),
'content' => $select->show($prio),
);
}
return $args;
}
/**
* Handler for user preferences save (preferences_save hook)
*
* @param array $args Hash array with hook parameters
*
* @return array Hash array with modified hook parameters
*/
public function prefs_save($args)
{
if ($args['section'] != 'addressbook') {
return $args;
}
// Check that configuration is not disabled
$dont_override = (array) $this->rc->config->get('dont_override', array());
$key = 'kolab_addressbook_prio';
if (!in_array('kolab_addressbook_prio', $dont_override) || !isset($_POST['_'.$key])) {
$args['prefs'][$key] = (int) get_input_value('_'.$key, RCUBE_INPUT_POST);
}
return $args;
}
/**
* Handler for plugin actions
*/
public function book_actions()
{
$action = trim(get_input_value('_act', RCUBE_INPUT_GPC));
if ($action == 'create') {
$this->ui->book_edit();
}
else if ($action == 'edit') {
$this->ui->book_edit();
}
else if ($action == 'delete') {
$this->book_delete();
}
}
/**
* Handler for address book create/edit form submit
*/
public function book_save()
{
$prop = array(
'name' => trim(get_input_value('_name', RCUBE_INPUT_POST)),
'oldname' => trim(get_input_value('_oldname', RCUBE_INPUT_POST, true)), // UTF7-IMAP
'parent' => trim(get_input_value('_parent', RCUBE_INPUT_POST, true)), // UTF7-IMAP
'type' => 'contact',
'subscribed' => true,
);
$result = $error = false;
$type = strlen($prop['oldname']) ? 'update' : 'create';
$prop = $this->rc->plugins->exec_hook('addressbook_'.$type, $prop);
if (!$prop['abort']) {
if ($newfolder = kolab_storage::folder_update($prop)) {
$folder = $newfolder;
$result = true;
}
else {
$error = kolab_storage::$last_error;
}
}
else {
$result = $prop['result'];
$folder = $prop['name'];
}
if ($result) {
$storage = $this->rc->get_storage();
$delimiter = $storage->get_hierarchy_delimiter();
$kolab_folder = new rcube_kolab_contacts($folder);
// create display name for the folder (see self::address_sources())
if (strpos($folder, $delimiter)) {
$names = array();
foreach ($this->_list_sources() as $abook) {
$realname = $abook->get_realname();
// The list can be not updated yet, handle old folder name
if ($type == 'update' && $realname == $prop['oldname']) {
$abook = $kolab_folder;
$realname = $folder;
}
$name = kolab_storage::folder_displayname($abook->get_name(), $names);
if ($realname == $folder) {
break;
}
}
}
else {
$name = $kolab_folder->get_name();
}
$this->rc->output->show_message('kolab_addressbook.book'.$type.'d', 'confirmation');
$this->rc->output->command('set_env', 'delimiter', $delimiter);
$this->rc->output->command('book_update', array(
'id' => kolab_storage::folder_id($folder),
'name' => $name,
'readonly' => false,
'editable' => true,
'groups' => true,
'realname' => rcube_charset::convert($folder, 'UTF7-IMAP'), // IMAP folder name
'class_name' => $kolab_folder->get_namespace(),
'kolab' => true,
), kolab_storage::folder_id($prop['oldname']));
$this->rc->output->send('iframe');
}
if (!$error)
$error = $plugin['message'] ? $plugin['message'] : 'kolab_addressbook.book'.$type.'error';
$this->rc->output->show_message($error, 'error');
// display the form again
$this->ui->book_edit();
}
/**
* Handler for address book delete action (AJAX)
*/
private function book_delete()
{
$folder = trim(get_input_value('_source', RCUBE_INPUT_GPC, true, 'UTF7-IMAP'));
if (kolab_storage::folder_delete($folder)) {
$storage = $this->rc->get_storage();
$delimiter = $storage->get_hierarchy_delimiter();
$this->rc->output->show_message('kolab_addressbook.bookdeleted', 'confirmation');
$this->rc->output->set_env('pagecount', 0);
$this->rc->output->command('set_rowcount', rcmail_get_rowcount_text(new rcube_result_set()));
$this->rc->output->command('set_env', 'delimiter', $delimiter);
$this->rc->output->command('list_contacts_clear');
$this->rc->output->command('book_delete_done', kolab_storage::folder_id($folder));
}
else {
$this->rc->output->show_message('kolab_addressbook.bookdeleteerror', 'error');
}
$this->rc->output->send();
}
/**
* Returns value of kolab_addressbook_prio setting
*/
private function addressbook_prio()
{
// Load configuration
if (!$this->config_loaded) {
$this->load_config();
$this->config_loaded = true;
}
$abook_prio = (int) $this->rc->config->get('kolab_addressbook_prio');
// Make sure any global addressbooks are defined
if ($abook_prio == 0 || $abook_prio == 2) {
$ldap_public = $this->rc->config->get('ldap_public');
$abook_type = $this->rc->config->get('address_book_type');
if (empty($ldap_public) || $abook_type != 'ldap') {
$abook_prio = 1;
}
}
return $abook_prio;
}
}
diff --git a/plugins/tasklist/helpdocs/en_US/_static/_skin b/plugins/tasklist/helpdocs/en_US/_static/_skin
new file mode 120000
index 00000000..01372893
--- /dev/null
+++ b/plugins/tasklist/helpdocs/en_US/_static/_skin
@@ -0,0 +1 @@
+larry
\ No newline at end of file
diff --git a/plugins/tasklist/helpdocs/en_US/_static/larry/quickview.png b/plugins/tasklist/helpdocs/en_US/_static/larry/quickview.png
new file mode 100644
index 00000000..6e8372e8
Binary files /dev/null and b/plugins/tasklist/helpdocs/en_US/_static/larry/quickview.png differ
diff --git a/plugins/tasklist/helpdocs/en_US/_static/larry/subtask-menu.png b/plugins/tasklist/helpdocs/en_US/_static/larry/subtask-menu.png
new file mode 100644
index 00000000..2492110d
Binary files /dev/null and b/plugins/tasklist/helpdocs/en_US/_static/larry/subtask-menu.png differ
diff --git a/plugins/tasklist/helpdocs/en_US/_static/larry/tags-autocomplete.png b/plugins/tasklist/helpdocs/en_US/_static/larry/tags-autocomplete.png
new file mode 100644
index 00000000..b1e4346f
Binary files /dev/null and b/plugins/tasklist/helpdocs/en_US/_static/larry/tags-autocomplete.png differ
diff --git a/plugins/tasklist/helpdocs/en_US/_static/larry/tasklist-items.png b/plugins/tasklist/helpdocs/en_US/_static/larry/tasklist-items.png
new file mode 100644
index 00000000..6f5a2c2b
Binary files /dev/null and b/plugins/tasklist/helpdocs/en_US/_static/larry/tasklist-items.png differ
diff --git a/plugins/tasklist/helpdocs/en_US/filterstags.rst b/plugins/tasklist/helpdocs/en_US/filterstags.rst
deleted file mode 100644
index 342ad8db..00000000
--- a/plugins/tasklist/helpdocs/en_US/filterstags.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-.. index:: Filter, Tags
-.. _taskslist-tags:
-
-Filters and Tags
-================
-
-TBD.
-
-
diff --git a/plugins/tasklist/helpdocs/en_US/index.rst b/plugins/tasklist/helpdocs/en_US/index.rst
index 2ca38762..ea8770a0 100644
--- a/plugins/tasklist/helpdocs/en_US/index.rst
+++ b/plugins/tasklist/helpdocs/en_US/index.rst
@@ -1,15 +1,14 @@
.. index:: Tasks
.. _tasklist:
********
Tasks
********
The *Tasks* module helps you organize your daily jobs and ToDo's and will alert you about upcoming deadlines.
.. toctree::
:maxdepth: 2
overview
manage
- filterstags
diff --git a/plugins/tasklist/helpdocs/en_US/manage.rst b/plugins/tasklist/helpdocs/en_US/manage.rst
index 0b1e15aa..0ac8be03 100644
--- a/plugins/tasklist/helpdocs/en_US/manage.rst
+++ b/plugins/tasklist/helpdocs/en_US/manage.rst
@@ -1,42 +1,159 @@
.. _tasklist-management:
Managing Tasks
==============
-TBD.
+All the described functions to manage your tasks are accessible from the main task view.
Create new Tasks
----------------
-TBD.
+**The New Task Dialog**
+ Click the *New task* button in the toolbar to get an empty dialog where you enter the
+ tasks properties like title, description, start/due dates and reminder settings.
+ Click *Save* to finally add it to the selected task list.
+**Quick Entry**
+ The text box in the centre of the toolbar area lets you add new tasks very fast by
+ simply entering a title and then press <Enter> on the keyboard. Tasks will be created
+ in the currently selected list.
+
+ Begin the quick entry with a date or time description like "Tomorrow" or "Monday at 16:00"
+ to directly assign a due date to the task.
+
+
+.. _tasklist-edit-task:
Edit Tasks
----------
-TBD.
+The Edit Dialog
+^^^^^^^^^^^^^^^
+
+When clicking a task item in list a dialog showing its details is displayed. Clicking the Edit button
+in that dialog opens the form to edit all properties of the selected task.
+
+The edit form is divided into different section which can be switched using the tabs on top of the dialog:
+
+**Summary**
+
+This general section has text fields and selectors for various properties. Here’s a description of all the possible values:
+
+* ``Title``: The title of the task. This is what you will see in the list.
+* ``Description``: Any text that describes the task. Links and email addresses will be become clickable.
+* ``Tags``: A list of tags assigned to this task. Add one by typing to the text box and hit <Enter>.
+* ``Start``: The date/time, the task is supposed to be worked on.
+* ``Due``: The date/time this job is due. Define a time when setting a reminder for this task.
+* ``Reminder``: This will pop up with an notification at a the specified time before the task is due.
+* ``Complete``: The completeness state of a task in percent. Use the slider or enter a number.
+* ``Tasklist``: The list the task is saved in. Change it to move an event from one list to another.
+
+
+.. only:: kolab
+
+ **Attachments**
+
+ Append files and documents related to this task directly as attachments.
+ Switch to the Attachments tab to upload files to the current task or to remove them again. Adding
+ files works pretty much the same as :ref:`attaching them to email messages <mail-compose-attachments>`:
+ first select a file from your local disk and click *Upload* in order to attach it.
+
+ .. note:: Don't forget to finally save the changes by clicking *Save* in the edit dialog.
+ Switching back and forth the tabs will not yet save the data.
+
+
+.. index:: Tags
+
+Assign Tags
+^^^^^^^^^^^
+
+Tags help you organize your tasks in the list view. Open the :ref:`Edit Dialog <tasklist-edit-task>` and
+enter tags into the according text box:
+
+.. image:: _static/_skin/tags-autocomplete.png
+
+Append a tag by hitting <Enter> and continue typing to add more. While typing, a suggestion of already
+used tags will be shown. Use the arrow keys on the keyboard to select one and press <Enter> to select.
+
+Remove tags with a click on the *Remove* icon.
+
+**Datg & Drop Tags**
+
+Existing tags listed in the tags box on the left can also be assigned to tasks directly in the list view
+by simply dragging the tag from the box and drop it on a task bar.
.. index:: Due Date
-Setting Due Dates
------------------
+Set Due Dates
+^^^^^^^^^^^^^
-TBD.
+Assign due dates to your tasks to not miss your deadlines and to enable reminder notifications for them.
+The due dates with time can be entered in the :ref:`Edit Dialog <tasklist-edit-task>`. When entering the input
+field, a small calendar widget will help you to quickly select a date.
+
+Due dates can also be entered or changed directly in the list view without going to the edit dialog.
+Click the due date or the "no date" area on the right end of a task bar and select a date from the calendar widget.
+The change will be saved immediately.
.. index:: Complete
Mark Tasks as Complete
-----------------------
+^^^^^^^^^^^^^^^^^^^^^^
+
+In the :ref:`tasklist-edit-task` section we learned how to set a percentage value
+for a task's completeness. Until a task isn't fully completed, the percentage is displayed as a
+think horizontal line in the list view.
-TBD.
+In order to mark a task as complete, simply click the checkbox in the list view. The task is now
+grayed out and moved to the bottom of the list. After some time or when refreshing the list, completed
+tasks will be removed from the view. You can still find them with the *Complete* quick filter.
+Uncheck the box to bring it back to the normal list.
Organize Tasks in Groups
------------------------
-TBD.
+For bigger jobs or entire projects, tasks can be divided into subtasks and organized hierarchically
+to visualize dependencies.
+
+Create a Subtask
+^^^^^^^^^^^^^^^^
+
+.. container:: image-right
+
+ .. image:: _static/_skin/subtask-menu.png
+
+ 1. Open the options menu of a task from the arrow icon on the far right of the task bar.
+ 2. Select *Add subtask*
+ 3. Enter the subtask properties in the :ref:`Edit Dialog <tasklist-edit-task>`
+ 4. Press *Save* to insert it
+
+
+.. index:: Move, Drag & Drop
+
+Re-organize Groups
+^^^^^^^^^^^^^^^^^^
+
+Ther hierarchical nesting of tasks and subtasks can be changed at any time. Simple grab a task with the mouse
+and drop onto another one to make it a subtask. This works for entire subtrees equally well. While dragging,
+a possible drop target is highlighted when moving over it.
+
+Drop a task onto the small bar on top of the tasks list to make it a main task again.
+
+If you organize your tasks in different lists, dropping a task onto a tasklist in the box on the left
+moves it (and all child tasks) to that particular list.
+
+
+
+Delete Tasks
+------------
+Usually finished tasks are marked as complete. But there are still situations where you might want to actually
+delete a task.
+1. Open the options menu of a task from the arrow icon on the far right of the task bar.
+2. Select *Delete*.
+3. Click *Delete* again in the confirmation dialog.
diff --git a/plugins/tasklist/helpdocs/en_US/overview.rst b/plugins/tasklist/helpdocs/en_US/overview.rst
index c05bf4b1..3f788ae7 100644
--- a/plugins/tasklist/helpdocs/en_US/overview.rst
+++ b/plugins/tasklist/helpdocs/en_US/overview.rst
@@ -1,39 +1,111 @@
*************
Overview
*************
The content area of the tasks screen is divided into three areas: the :ref:`Tasks <tasklist-tasks>`
itself, the :ref:`Tags <taskslist-tags>` and the :ref:`Tasklist Selector <tasklist-lists>`.
.. index:: Tasks
.. _tasklist-tasks:
The Tasks List
==============
-TBD.
+The main content are lists the task items that match the current selection of active lists,
+filters and tags. The listed tasks are sorted by due date (ascending) and completed ones move to the bottom.
+
+.. container:: image-right
+
+ .. image:: _static/_skin/tasklist-items.png
+
+ Tasks can be organized hierarchically and the list appears like a tree structure.
+ A small arrow icon on the left side of a task bar indicates subordinated tasks and expands or collapses
+ the tree upon click.
+
+ Some basic editing like flagging, assigning a due date as well as completing tasks can directly be done in the list
+ by clicking the checkbox, the flag icon or the date selector.
+
+A single click anywhere else on a task bar displays all details in a dialog box. Hit <Esc> on the keyboard
+or click the close icon to hide it again.
+
+Double-clicks open the clicked task item for full detail editing.
Control the List
----------------
-TBD.
+Quick Filters
+^^^^^^^^^^^^^
+
+The selection your tasks displayed on the screen can be refined in various ways. Use the quick filters
+above the list to reduce the listed tasks according to their status or due date.
+
+.. _taskslist-tags:
+
+Tags
+^^^^
+
+The tags list on the left is another way to display a selection of tasks. Click a tag to only display tasks
+with this tag assigned. Click it again to show all. Hold down the <Shift> key on the the keyboard to select
+mutliple tags and further reduce the selection.
+
+Task Lists
+^^^^^^^^^^
+
+The checkboxes in the :ref:`tasklist-lists` box control whether tasks from the according list are
+currently displayed. Use the *Quick View* icon |quickview| in the list to quickly reduce the view to tasks from a single
+list. This can also be used when the according list isn't activated. Click it again to turn off quick view mode and
+return to regular display of active lists.
+
+.. |quickview| image:: _static/_skin/quickview.png
Searching Tasks
---------------
-TBD.
+The search box above the calendar view lets you quickly get a list of events matching the entered keyword in either
+the title or the description text. Enter the search term into the box and press <Enter> on your keyboard to start the search.
+
+After searching, you can still use the filters and tags as explained above to hide some results.
+
+Reset the search by clicking the *Reset search* icon on the right border of the search box.
.. index:: Tasklist
.. _tasklist-lists:
-Tasklists
-=========
+Task Lists
+==========
+
+Organize your tasks in various lists. All of your personal task lists as well as those
+shared by others are listed in the box in the lower left area of the screen.
+
+You can create any number of lists to store and manage all your tasks and name them individually.
+
+
+Create a Task List
+------------------
+
+1. Click the + icon in the tasklists box footer.
+2. In the dialog, give the new list a unique name.
+3. Click *Save* to create it.
+
+.. _tasklist-edit-list:
+
+Edit List Names and Settings
+----------------------------
-TBD.
+1. Select the task list to edit by clicking the name in the box.
+2. Click the gear icon in the box footer and select *Edit* from the options menu.
+3. Adjust name or reminders settings in the edit dialog.
+4. Click *Save* to finally update the list.
+Remove entire Task Lists
+------------------------
+1. Select the task list to edit by clicking the name in the box.
+2. Click the gear icon in the box footer and select *Remove* from the options menu.
+3. After a confirmation dialog, the selected list with all its tasks will be deleted.
+ Caution: This action cannot be undone!

File Metadata

Mime Type
text/x-diff
Expires
Mon, Jun 9, 1:55 PM (1 d, 9 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
196814
Default Alt Text
(42 KB)

Event Timeline