Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/documentation.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--admin_manual/configuration_server/config_sample_php_parameters.rst23
-rw-r--r--admin_manual/configuration_server/language_configuration.rst2
-rw-r--r--admin_manual/installation/system_requirements.rst4
-rw-r--r--developer_manual/app_development/tutorial.rst32
-rw-r--r--developer_manual/app_publishing_maintenance/app_upgrade_guide/upgrade_to_25.rst22
-rw-r--r--developer_manual/app_publishing_maintenance/app_upgrade_guide/upgrade_to_26.rst5
-rw-r--r--developer_manual/basics/controllers.rst4
-rw-r--r--developer_manual/basics/dependency_injection.rst100
-rw-r--r--developer_manual/basics/front-end/js.rst6
-rw-r--r--developer_manual/basics/storage/configuration.rst2
-rw-r--r--developer_manual/digging_deeper/continuous_integration.rst65
-rw-r--r--developer_manual/digging_deeper/groupware/calendar.rst21
-rw-r--r--developer_manual/getting_started/development_process.rst69
-rw-r--r--developer_manual/getting_started/index.rst1
-rw-r--r--user_manual/files/access_webdav.rst33
-rw-r--r--user_manual/groupware/calendar.rst95
-rw-r--r--user_manual/groupware/images/appointment__config_options.pngbin0 -> 30943 bytes
-rw-r--r--user_manual/groupware/images/appointment_booking_1.pngbin0 -> 51659 bytes
-rw-r--r--user_manual/groupware/images/appointment_booking_2.pngbin0 -> 85928 bytes
-rw-r--r--user_manual/groupware/images/appointment_booking_3.pngbin0 -> 18207 bytes
-rw-r--r--user_manual/groupware/images/appointment_booking_confirmation_dialogue.pngbin0 -> 30650 bytes
-rw-r--r--user_manual/groupware/images/appointment_booking_confirmation_email.pngbin0 -> 58324 bytes
-rw-r--r--user_manual/groupware/images/appointment_booking_email_2.pngbin0 -> 56762 bytes
-rw-r--r--user_manual/groupware/images/appointment_calendar_event.pngbin0 -> 77242 bytes
-rw-r--r--user_manual/groupware/images/appointment_calendar_prep.pngbin0 -> 51189 bytes
-rw-r--r--user_manual/groupware/images/appointment_config_basics.pngbin0 -> 19768 bytes
-rw-r--r--user_manual/groupware/images/appointment_config_booking_hours.pngbin0 -> 30614 bytes
-rw-r--r--user_manual/groupware/images/appointment_config_calendar_settings.pngbin0 -> 19745 bytes
-rw-r--r--user_manual/groupware/images/appointment_config_limits.pngbin0 -> 32637 bytes
-rw-r--r--user_manual/groupware/images/appointment_config_new.pngbin0 -> 157133 bytes
-rw-r--r--user_manual/groupware/images/appointment_config_options.pngbin0 -> 36551 bytes
-rw-r--r--user_manual/groupware/images/appointment_new.pngbin0 -> 20606 bytes
-rw-r--r--user_manual/groupware/images/caldav_availability.pngbin70639 -> 56908 bytes
-rw-r--r--user_manual/groupware/images/calendar_accept_sidebar_editor.pngbin26563 -> 53042 bytes
-rw-r--r--user_manual/groupware/images/calendar_accept_simple_editor.pngbin38983 -> 46429 bytes
-rw-r--r--user_manual/groupware/images/calendar_application.pngbin139744 -> 149523 bytes
-rw-r--r--user_manual/groupware/images/calendar_create_1.pngbin28903 -> 54659 bytes
-rw-r--r--user_manual/groupware/images/calendar_create_2.pngbin28982 -> 55601 bytes
-rw-r--r--user_manual/groupware/images/calendar_dropdown.pngbin24416 -> 37682 bytes
-rw-r--r--user_manual/groupware/images/calendar_editing.pngbin36824 -> 43345 bytes
-rw-r--r--user_manual/groupware/images/calendar_event_invitation_level.pngbin45716 -> 57142 bytes
-rw-r--r--user_manual/groupware/images/calendar_event_menu.pngbin35612 -> 37225 bytes
-rw-r--r--user_manual/groupware/images/calendar_event_menu_modal.pngbin0 -> 98641 bytes
-rw-r--r--user_manual/groupware/images/calendar_event_reminders.pngbin32176 -> 41874 bytes
-rw-r--r--user_manual/groupware/images/calendar_event_repeat.pngbin30036 -> 28022 bytes
-rw-r--r--user_manual/groupware/images/calendar_new-event_month.pngbin53961 -> 50544 bytes
-rw-r--r--user_manual/groupware/images/calendar_new-event_week.pngbin62429 -> 46347 bytes
-rw-r--r--user_manual/groupware/images/calendar_settings.pngbin30954 -> 44501 bytes
-rw-r--r--user_manual/locale/sv/LC_MESSAGES/talk/index.pot42
49 files changed, 377 insertions, 149 deletions
diff --git a/admin_manual/configuration_server/config_sample_php_parameters.rst b/admin_manual/configuration_server/config_sample_php_parameters.rst
index 9d6c26c82..1b30c2151 100644
--- a/admin_manual/configuration_server/config_sample_php_parameters.rst
+++ b/admin_manual/configuration_server/config_sample_php_parameters.rst
@@ -1302,6 +1302,29 @@ Defaults to ``true``
::
+ 'preview_concurrency_all' => 8,
+
+Number of all preview requests being processed concurrently,
+including previews that need to be newly generated, and those that have
+been generated.
+
+This should be greater than 'preview_concurrency_new'.
+If unspecified, defaults to twice the value of 'preview_concurrency_new'.
+
+::
+
+ 'preview_concurrency_new' => 4,
+
+Number of new previews that are being concurrently generated.
+
+Depending on the max preview size set by 'preview_max_x' and 'preview_max_y',
+the generation process can consume considerable CPU and memory resources.
+It's recommended to limit this to be no greater than the number of CPU cores.
+If unspecified, defaults to the number of CPU cores, or 4 if that cannot
+be determined.
+
+::
+
'preview_max_x' => 4096,
The maximum width, in pixels, of a preview. A value of ``null`` means there
diff --git a/admin_manual/configuration_server/language_configuration.rst b/admin_manual/configuration_server/language_configuration.rst
index fcf1b42f4..792880542 100644
--- a/admin_manual/configuration_server/language_configuration.rst
+++ b/admin_manual/configuration_server/language_configuration.rst
@@ -34,7 +34,7 @@ If users shall be unable to change their language, but users have different lang
this value can be set to ``true`` instead of a language code.
.. note:: Please check `Transifex language codes
- <https://www.transifex.com/explore/languages/>`_ for the list of valid language
+ <https://explore.transifex.com/languages/>`_ for the list of valid language
codes.
Default locale
diff --git a/admin_manual/installation/system_requirements.rst b/admin_manual/installation/system_requirements.rst
index a65495fe8..180696068 100644
--- a/admin_manual/installation/system_requirements.rst
+++ b/admin_manual/installation/system_requirements.rst
@@ -17,9 +17,9 @@ For best performance, stability and functionality we have documented some recomm
| Operating System | - **Ubuntu 22.04 LTS** (recommended) |
| (64-bit) | - Ubuntu 20.04 LTS |
| | - **Red Hat Enterprise Linux 8** (recommended) |
-| | - Debian 10 (Buster) |
+| | - Debian 11 (Bullseye) |
| | - SUSE Linux Enterprise Server 15 |
-| | - openSUSE Leap 42.1+ |
+| | - openSUSE Leap 15.4 |
| | - CentOS Stream |
+------------------+-----------------------------------------------------------------------+
| Database | - **MySQL 8.0+ or MariaDB 10.2/10.3/10.4/10.5** (recommended) |
diff --git a/developer_manual/app_development/tutorial.rst b/developer_manual/app_development/tutorial.rst
index 324f4ccde..3d7736c2a 100644
--- a/developer_manual/app_development/tutorial.rst
+++ b/developer_manual/app_development/tutorial.rst
@@ -107,8 +107,8 @@ This route calls the controller **OCA\\notestutorial\\PageController->index()**
class PageController extends Controller {
- public function __construct(string $AppName, IRequest $request){
- parent::__construct($AppName, $request);
+ public function __construct(string $appName, IRequest $request){
+ parent::__construct($appName, $request);
}
/**
@@ -133,8 +133,8 @@ Since the route which returns the initial HTML has been taken care of, the contr
class NoteController extends Controller {
- public function __construct(string $AppName, IRequest $request){
- parent::__construct($AppName, $request);
+ public function __construct(string $appName, IRequest $request){
+ parent::__construct($appName, $request);
}
/**
@@ -386,7 +386,7 @@ Connect database & controllers
The mapper which provides the database access is finished and can be passed into the controller.
-You can pass in the mapper by adding it as a type hinted parameter. Nextcloud will figure out how to :doc:`assemble them by itself <../basics/dependency_injection>`. Additionally we want to know the userId of the currently logged in user. Simply add a **$UserId** parameter to the constructor (case sensitive!). To do that open **notestutorial/lib/Controller/NoteController.php** and change it to the following:
+You can pass in the mapper by adding it as a type hinted parameter. Nextcloud will figure out how to :doc:`assemble them by itself <../basics/dependency_injection>`. Additionally we want to know the userId of the currently logged in user. Simply add a **$userId** parameter to the constructor (case sensitive!). To do that open **notestutorial/lib/Controller/NoteController.php** and change it to the following:
.. code-block:: php
@@ -408,10 +408,10 @@ You can pass in the mapper by adding it as a type hinted parameter. Nextcloud wi
private NoteMapper $mapper;
private ?string $userId;
- public function __construct(string $AppName, IRequest $request, NoteMapper $mapper, ?string $UserId = null){
- parent::__construct($AppName, $request);
+ public function __construct(string $appName, IRequest $request, NoteMapper $mapper, ?string $userId = null){
+ parent::__construct($appName, $request);
$this->mapper = $mapper;
- $this->userId = $UserId;
+ $this->userId = $userId;
}
/**
@@ -654,11 +654,11 @@ Now we can wire up the trait and the service inside the **NoteController**:
use Errors;
- public function __construct(string $AppName, IRequest $request,
- NoteService $service, ?string $UserId = null) {
- parent::__construct($AppName, $request);
+ public function __construct(string $appName, IRequest $request,
+ NoteService $service, ?string $userId = null) {
+ parent::__construct($appName, $request);
$this->service = $service;
- $this->userId = $UserId;
+ $this->userId = $userId;
}
/**
@@ -967,11 +967,11 @@ With that in mind create a new controller in **notestutorial/lib/Controller/Note
use Errors;
- public function __construct($AppName, IRequest $request,
- NoteService $service, ?string $UserId = null) {
- parent::__construct($AppName, $request);
+ public function __construct(string $appName, IRequest $request,
+ NoteService $service, ?string $userId = null) {
+ parent::__construct($appName, $request);
$this->service = $service;
- $this->userId = $UserId;
+ $this->userId = $userId;
}
/**
diff --git a/developer_manual/app_publishing_maintenance/app_upgrade_guide/upgrade_to_25.rst b/developer_manual/app_publishing_maintenance/app_upgrade_guide/upgrade_to_25.rst
index e2c988b1a..128ac405a 100644
--- a/developer_manual/app_publishing_maintenance/app_upgrade_guide/upgrade_to_25.rst
+++ b/developer_manual/app_publishing_maintenance/app_upgrade_guide/upgrade_to_25.rst
@@ -17,23 +17,37 @@ Make sure your ``appinfo/info.xml`` allows for Nextcloud 25.
<dependencies>
<nextcloud min-version="22" max-version="25" />
</dependencies>
-
+
SCSS support removal
^^^^^^^^^^^^^^^^^^^^
With 25, we removed the support for scss files provided by apps.
Please handle your own compilation, move to a vue app or move back to css.
-See `Github issue <https://github.com/nextcloud/server/issues/32060>`_.
+See `Github issue #32060 <https://github.com/nextcloud/server/issues/32060>`_.
Front-end changes
-----------------
-tbd
+Disabled keyboard shortcuts
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A global option to disable keyboard shortcuts was added to the accessibility settings.
+Since it heavily depends on the screenreader and tools that you use if Ctrl and/or Alt or other things are okay to use
+or not and maintaining a more detailed list is too much effort, we went for a global on/off switch. Apps can use this
+public javascript API call to determine whether the user used the opt-out: ``OCP.Accessibility.disableKeyboardShortcuts()``.
+If that is the case, no additional shortcuts shall be registered by any app. Only ``space`` to toggle checkboxes and
+``enter`` to submit the currently active buttons/links are okay to be used.
+See `Github issue #34081 <https://github.com/nextcloud/server/pull/34081>`_ and :ref:`JavaScript Frontend documentation <basics_frontend_javascript_keyboard_shortcuts>`.
Back-end changes
----------------
-tbd
+``christophwurst/nextcloud`` replaced
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The `christophwurst/nextcloud <https://packagist.org/packages/christophwurst/nextcloud>`_ composer package was replaced
+with a now Nextcloud owned `nextcloud/ocp <https://packagist.org/packages/nextcloud/ocp>`_ package. The content is the
+same and all older versions were generated, so you can transition right away no matter which versions you support.
Changed APIs
^^^^^^^^^^^^
diff --git a/developer_manual/app_publishing_maintenance/app_upgrade_guide/upgrade_to_26.rst b/developer_manual/app_publishing_maintenance/app_upgrade_guide/upgrade_to_26.rst
index 45489a601..02b90ae85 100644
--- a/developer_manual/app_publishing_maintenance/app_upgrade_guide/upgrade_to_26.rst
+++ b/developer_manual/app_publishing_maintenance/app_upgrade_guide/upgrade_to_26.rst
@@ -33,7 +33,10 @@ tbd
Back-end changes
----------------
-tbd
+Dependency Injection Parameters
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+App container parameters with pascal case names ``AppName``, ``UserId`` and ``WebRoot`` are deprecated. Use the camel case variants ``appName``, ``userId`` and ``webRoot`` instead if you have them injected into one of your app classes.
Changed APIs
^^^^^^^^^^^^
diff --git a/developer_manual/basics/controllers.rst b/developer_manual/basics/controllers.rst
index 59cdce03a..f7f30a992 100644
--- a/developer_manual/basics/controllers.rst
+++ b/developer_manual/basics/controllers.rst
@@ -238,8 +238,8 @@ Then session variables can be accessed like this:
private ISession $session;
- public function __construct($AppName, IRequest $request, ISession $session) {
- parent::__construct($AppName, $request);
+ public function __construct($appName, IRequest $request, ISession $session) {
+ parent::__construct($appName, $request);
$this->session = $session;
}
diff --git a/developer_manual/basics/dependency_injection.rst b/developer_manual/basics/dependency_injection.rst
index d3efaf34f..59d2ec158 100644
--- a/developer_manual/basics/dependency_injection.rst
+++ b/developer_manual/basics/dependency_injection.rst
@@ -104,7 +104,7 @@ use the **registerService** method on the container object:
*/
$container->registerService(AuthorController::class, function(ContainerInterface $c): AuthorController {
return new AuthorController(
- $c->get('AppName'),
+ $c->get('appName'),
$c->get(Request::class),
$c->get(AuthorService::class)
);
@@ -139,12 +139,12 @@ The container works in the following way:
* The matched route queries **AuthorController** service from the container::
return new AuthorController(
- $c->get('AppName'),
+ $c->get('appName'),
$c->get(Request::class),
$c->get(AuthorService::class)
);
-* The **AppName** is queried and returned from the base class
+* The **appName** is queried and returned from the base class
* The **Request** is queried and returned from the server container
* **AuthorService** is queried::
@@ -198,9 +198,9 @@ So basically the following is now possible:
public MyTestClass $class;
public string $appName;
- public function __construct(MyTestClass $class, string $AppName) {
+ public function __construct(MyTestClass $class, string $appName) {
$this->class = $class;
- $this->appName = $AppName;
+ $this->appName = $appName;
}
}
@@ -213,7 +213,7 @@ So basically the following is now possible:
$class2->appName === 'myname'; // true
$class2 === $app->getContainer()->get(MyTestClass2::class); // true
-.. note:: $AppName is resolved because the container registered a parameter under the key 'AppName' which will return the app id. The lookup is case sensitive so while $AppName will work correctly, using $appName as a constructor parameter will fail.
+.. note:: $appName is resolved because the container registered a parameter under the key 'appName' which will return the app id.
How does it affect the request lifecycle
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -252,8 +252,8 @@ The only thing that needs to be done to add a route and a controller method is n
use OCP\IRequest;
class PageController {
- public function __construct($AppName, IRequest $request) {
- parent::__construct($AppName, $request);
+ public function __construct($appName, IRequest $request) {
+ parent::__construct($appName, $request);
}
public function index() {
@@ -309,46 +309,54 @@ The following parameter names and type hints can be used to inject core services
Parameters:
-* **AppName**: The app id
-* **WebRoot**: The path to the Nextcloud installation
-* **UserId**: The id of the current user
+* **appName**: The app id
+* **userId**: The id of the current user
+* **webRoot**: The path to the Nextcloud installation
+
+Aliases:
+
+* **AppName**: resolves to ``appName`` (deprecated)
+* **Request**: resolves to ``\OCP\IRequest``
+* **ServerContainer**: resolves to ``\OCP\IServerContainer``
+* **UserId**: resolves to ``userId`` (deprecated)
+* **WebRoot**: resolves to ``webRoot`` (deprecated)
Types:
-* **OCP\\IAppConfig**
-* **OCP\\IAppManager**
-* **OCP\\IAvatarManager**
-* **OCP\\Activity\\IManager**
-* **OCP\\ICache**
-* **OCP\\ICacheFactory**
-* **OCP\\IConfig**
-* **OCP\\AppFramework\\Utility\\IControllerMethodReflector**
-* **OCP\\Contacts\\IManager**
-* **OCP\\IDateTimeZone**
-* **OCP\\IDBConnection**
-* **OCP\\Diagnostics\\IEventLogger**
-* **OCP\\Diagnostics\\IQueryLogger**
-* **OCP\\Files\\Config\\IMountProviderCollection**
-* **OCP\\Files\\IRootFolder**
-* **OCP\\IGroupManager**
-* **OCP\\IL10N**
-* **OCP\\ILogger**
-* **OCP\\BackgroundJob\\IJobList**
-* **OCP\\INavigationManager**
-* **OCP\\IPreview**
-* **OCP\\IRequest**
-* **OCP\\AppFramework\\Utility\\ITimeFactory**
-* **OCP\\ITagManager**
-* **OCP\\ITempManager**
-* **OCP\\Route\\IRouter**
-* **OCP\\ISearch**
-* **OCP\\ISearch**
-* **OCP\\Security\\ICrypto**
-* **OCP\\Security\\IHasher**
-* **OCP\\Security\\ISecureRandom**
-* **OCP\\IURLGenerator**
-* **OCP\\IUserManager**
-* **OCP\\IUserSession**
+* ``\OCP\IAppConfig``
+* ``\OCP\IAppManager``
+* ``\OCP\IAvatarManager``
+* ``\OCP\Activity\IManager``
+* ``\OCP\ICache``
+* ``\OCP\ICacheFactory``
+* ``\OCP\IConfig``
+* ``\OCP\AppFramework\Utility\IControllerMethodReflector``
+* ``\OCP\Contacts\IManager``
+* ``\OCP\IDateTimeZone``
+* ``\OCP\IDBConnection``
+* ``\OCP\Diagnostics\IEventLogger``
+* ``\OCP\Diagnostics\IQueryLogger``
+* ``\OCP\Files\Config\IMountProviderCollection``
+* ``\OCP\Files\IRootFolder``
+* ``\OCP\IGroupManager``
+* ``\OCP\IL10N``
+* ``\OCP\ILogger``
+* ``\OCP\BackgroundJob\IJobList``
+* ``\OCP\INavigationManager``
+* ``\OCP\IPreview``
+* ``\OCP\IRequest``
+* ``\OCP\AppFramework\Utility\ITimeFactory``
+* ``\OCP\ITagManager``
+* ``\OCP\ITempManager``
+* ``\OCP\Route\IRouter``
+* ``\OCP\ISearch``
+* ``\OCP\ISearch``
+* ``\OCP\Security\ICrypto``
+* ``\OCP\Security\IHasher``
+* ``\OCP\Security\ISecureRandom``
+* ``\OCP\IURLGenerator``
+* ``\OCP\IUserManager``
+* ``\OCP\IUserSession``
How to enable it
^^^^^^^^^^^^^^^^
@@ -396,7 +404,7 @@ What not to inject:
Accessing the container from anywhere
-------------------------------------
+-------------------------------------
Sometimes it can be hard to inject some service inside legacy code, in these case
you can use :code:`OCP\Server::get(MyService::class)`. This should only be used in
diff --git a/developer_manual/basics/front-end/js.rst b/developer_manual/basics/front-end/js.rst
index 17d69ec51..1251c66af 100644
--- a/developer_manual/basics/front-end/js.rst
+++ b/developer_manual/basics/front-end/js.rst
@@ -150,6 +150,8 @@ function
Now state will contain the provided state which you can use as any variable. It
is as simple as that.
+.. _basics_frontend_javascript_keyboard_shortcuts:
+
Keyboard shortcuts
------------------
@@ -164,6 +166,6 @@ Nextcloud wide. You can check the setting with the following function which retu
OCP.Accessibility.disableKeyboardShortcuts();
-If that is the case, no additional shortcuts shall be registered by any app. Only space
-to toggle checkboxes and enter to submit the currently active buttons or links are okay,
+If that is the case, no additional shortcuts shall be registered by any app. Only ``space``
+to toggle checkboxes and ``enter`` to submit the currently active buttons or links are okay,
as any other shortcut might interfere with screenreaders and other accessibility tools.
diff --git a/developer_manual/basics/storage/configuration.rst b/developer_manual/basics/storage/configuration.rst
index 1b619119c..afb26e856 100644
--- a/developer_manual/basics/storage/configuration.rst
+++ b/developer_manual/basics/storage/configuration.rst
@@ -30,7 +30,7 @@ The config that allows the app to set global, app and user settings can be injec
$container->registerService('AuthorService', function(IServerContainer $c): AuthorService {
return new AuthorService(
$c->get(IConfig::class),
- $c->get('AppName')
+ $c->get('appName')
);
});
}
diff --git a/developer_manual/digging_deeper/continuous_integration.rst b/developer_manual/digging_deeper/continuous_integration.rst
index 9b1423f30..8ac113d02 100644
--- a/developer_manual/digging_deeper/continuous_integration.rst
+++ b/developer_manual/digging_deeper/continuous_integration.rst
@@ -21,26 +21,9 @@ Linting
info.xml
^^^^^^^^
-You can validate the ``info.xml`` :ref:`app metadata<app metadata>` file of an app with a simple github action:
-
-.. code-block:: yaml
-
- name: Lint
- on: pull_request
-
- jobs:
- xml-linters:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@master
- - name: Download schema
- run: wget https://apps.nextcloud.com/schema/apps/info.xsd
- - name: Lint info.xml
- uses: ChristophWurst/xmllint-action@v1
- with:
- xml-file: ./appinfo/info.xml
- xml-schema-file: ./info.xsd
+You can validate the ``info.xml`` :ref:`app metadata<app metadata>` file of an app with a
+`simple github action <https://github.com/nextcloud/.github/blob/master/workflow-templates/lint-info-xml.yml>`_.
+Please refer to our `nextcloud template repository <https://github.com/nextcloud/.github>`_ for an up to date template.
php
^^^
@@ -69,7 +52,10 @@ relevant github actions in our `nextcloud template repository <https://github.co
Static analysis
---------------
-`Psalm`_ is a static analysis tool that can check if your app code uses all types correctly, like if classes and methods exist. For the basic setup see the `Psalm`_ website. In order to let Psalm know about Nextcloud interfaces (the OCP namespace), you can install the `API package <https://packagist.org/packages/christophwurst/nextcloud>`_. Afterwards you'll be able to check the app with the following ``psalm.xml`` that should be put into the root of the app.
+`Psalm`_ is a static analysis tool that can check if your app code uses all types correctly, like if classes and methods exist.
+For the basic setup see the `Psalm`_ website. In order to let Psalm know about Nextcloud interfaces (the OCP namespace),
+you can install the `API package <https://packagist.org/packages/nextcloud/ocp>`_.
+Afterwards you'll be able to check the app with the following ``psalm.xml`` that should be put into the root of the app.
.. code-block:: xml
@@ -113,37 +99,18 @@ Static analysis
</issueHandlers>
</psalm>
-.. Note:: The definition suppresses usages of the global and static class ``OC`` like ``\OC::$server``, which is discouraged but still found in some apps. The doctrine supression is currently necessary as the database mappers and schema abstractions leak some of the 3rd party libraries of Nextcloud that are not known to Psalm.
+.. Note:: The definition suppresses usages of the global and static class ``OC`` like ``\OC::$server``, which is
+discouraged but still found in some apps. The doctrine suppression is currently necessary as the database mappers and
+schema abstractions leak some of the 3rd party libraries of Nextcloud that are not known to Psalm.
You can put this process into a GitHub Action that is run for every pull request.
+Check our `simple github action <https://github.com/nextcloud/.github/blob/master/workflow-templates/psalm.yml>`_ from
+our `nextcloud template repository <https://github.com/nextcloud/.github>`_.
-.. code-block:: yaml
-
- name: Static analysis
- on: [push]
- jobs:
- static-psalm-analysis:
- runs-on: ubuntu-latest
- strategy:
- matrix:
- ocp-version: [ 'dev-master', 'v20.0.0' ]
- name: Nextcloud ${{ matrix.ocp-version }}
- steps:
- - name: Checkout
- uses: actions/checkout@master
- - name: Set up php
- uses: shivammathur/setup-php@master
- with:
- php-version: 7.4
- coverage: none
- - name: Install dependencies
- run: composer i
- - name: Install dependencies
- run: composer require --dev christophwurst/nextcloud:${{ matrix.ocp-version }}
- - name: Run coding standards check
- run: composer run psalm
-
-This creates a matrix, where the app is tested against ``dev-master``, the latest version of ``OCP`` found in the main branch of Nextcloud server, as well as ``v20.0.0``, the currently latest stable release. Adjust this to your needs.
+If you want to support multiple versions of Nextcloud server with a single app version, checkout this slightly
+`more complex action <https://github.com/nextcloud/.github/blob/master/workflow-templates/psalm-matrix.yml>`_.
+This creates a matrix, where the app is tested against ``dev-master``, the latest version of ``OCP`` found in the master
+branch of Nextcloud server, as well as other currently supported stable branches. Adjust this to your needs.
.. _Psalm: https://psalm.dev/docs/
diff --git a/developer_manual/digging_deeper/groupware/calendar.rst b/developer_manual/digging_deeper/groupware/calendar.rst
index 91467c837..437e59290 100644
--- a/developer_manual/digging_deeper/groupware/calendar.rst
+++ b/developer_manual/digging_deeper/groupware/calendar.rst
@@ -161,6 +161,27 @@ Calendars that only return `ICalendar` are implicitly read-only. If your app's c
}
+Handling iMIP data
+~~~~~~~~~~~~~~~~~~
+
+You may implement the ``IHandleIMipMessage`` interface to process iMIP data you receive in a client and want to pass on for processing to the backend.
+
+Please be aware that there are some security considerations to take into account. You can find more infomation on these and the conditions that have to be fulfilled for iMIP data to be processed in the `RFC <https://www.rfc-editor.org/rfc/rfc6047>`_
+
+.. code-block:: php
+
+ <?php
+
+ use OCP\Calendar\IHandleIMipMessage;
+
+ class HandleIMipMessage implements IHandleIMipMessage {
+
+ public function handleIMipMessage(string $name, string $calendarData): void {
+ // Validation and write to your calendar representation
+ }
+
+ }
+
Resources
---------
diff --git a/developer_manual/getting_started/development_process.rst b/developer_manual/getting_started/development_process.rst
new file mode 100644
index 000000000..c76d74ef0
--- /dev/null
+++ b/developer_manual/getting_started/development_process.rst
@@ -0,0 +1,69 @@
+===================
+Development process
+===================
+
+This page gives an overview of how Nextcloud code is developed.
+
+Source Code Version Control
+---------------------------
+
+Nextcloud uses `git <https://git-scm.com/>`_ to manage revisions of the code. Software components have their own repositories.
+
+Branch Names
+^^^^^^^^^^^^
+
+Default branches of Nextcloud and its app repositories are named ``main`` or ``master``. Additionally, there are *stable branches* whenever a major version of Nextcloud is released. Those are named ``stableX``, where X refers to the version. For Nextcloud 25, for example, the stable branch is named ``stable25``.
+
+Target Branches for Contributions
+---------------------------------
+
+Any changes made to the source code go into the default branch of a repository through a `pull request <https://docs.github.com/en/pull-requests>`_.
+
+.. code-block:: bash
+
+ # Switch to the default branch and update it
+ git checkout main
+ git pull origin/main
+
+ # Create the new feature branch
+ git checkout -b feature/foo-bar
+
+ # Add and commit the changes
+ git add file1 file2
+ git commit --signoff -m 'Add foo bar'
+
+ # Push the new commit to the remote repository and open a pull request
+ git push origin feature/foo-bar
+
+Bugfixes
+^^^^^^^^
+
+If a contribution fixes a bug that also affects older Nextcloud or app releases, it may qualify for a *backport*. Backporting a fix means applying the change on an older version of the code. Git calls this operation *cherry picking*.
+
+Automatic Backport
+******************
+
+In many cases the cherry pick results in a clean apply of the patch and git is able to resolve any small conflicts. In those cases it's easiest to let the `backport bot <https://github.com/nextcloud/backportbot>`_ do the backport.
+
+See the `bot usage <https://github.com/nextcloud/backportbot#usage>`_ for its commands.
+
+Manual Backport
+***************
+
+More complex changes may require the developer to do the backport manually. This can be done as follows:
+
+.. code-block:: bash
+
+ # Switch to the target branch and update it
+ git checkout stable25
+ git pull origin/stable25
+
+ # Create the new backport branch
+ git checkout -b fix/foo-stable25
+
+ # Cherry pick the change from the commit sha1 of the change against the default branch
+ # This might cause conflicts. Resolve them.
+ git cherry-pick abc123
+
+ # Push the cherry pick commit to the remote repository and open a pull request
+ git push origin fix/foo-stable25
diff --git a/developer_manual/getting_started/index.rst b/developer_manual/getting_started/index.rst
index ab7e2f242..3eeab21ec 100644
--- a/developer_manual/getting_started/index.rst
+++ b/developer_manual/getting_started/index.rst
@@ -5,6 +5,7 @@ Getting started
.. toctree::
:maxdepth: 2
+ development_process
devenv
codingguidelines
debugging
diff --git a/user_manual/files/access_webdav.rst b/user_manual/files/access_webdav.rst
index 59611d063..4d9c084ff 100644
--- a/user_manual/files/access_webdav.rst
+++ b/user_manual/files/access_webdav.rst
@@ -515,6 +515,39 @@ To get the properties of files in the root folder:
</d:propstat>
</d:response>
</d:multistatus>
+
+
+
+
+Accessing files using WinSCP
+-------------------------------
+
+`WinSCP <https://winscp.net/eng/docs/introduction/>`_ is an open source free SFTP client, FTP client, WebDAV client, S3 client and SCP client for Windows. Its main function is file transfer between a local and a remote computer. Beyond this, WinSCP offers scripting and basic file manager functionality.
+
+You can `download <https://winscp.net/eng/downloads.php/>`_ the portable version of WinSCP and run it on Linux through `Wine <https://wiki.winehq.org/Main_Page/>`_.
+
+To run WinSCP on Linux, download wine through your distribution's package manager, then run it via: wine WinSCP.exe.
+
+To connect to Nextcloud:
+
+* Start WinSCP
+* Press 'Session' in the menu
+* Press the 'New Session' menu option
+* Set the 'File protocol' dropdown to WebDAV
+* Set the 'Encryption' dropdown to TSL/SSL Implicit encryption
+* Fill in the hostname field: example.com
+* Fill in the username field: NEXTCLOUDUSERNAME
+* Fill in the password field: NEXTCLOUDPASSWORD
+* Press the 'Advanced...' button
+* Navigate to 'Environment', 'Directories' on the left side
+* Fill in the 'Remote directory' field with the following: /nextcloud/remote.php/dav/files/NEXTCLOUDUSERNAME/
+* Press the 'OK' button
+* Press the 'Save' button
+* Select the desired options and press the 'OK' button
+* Press the 'Login' button to connect to Nextcloud
+
+Note: it is recommended to use an app password for the password if you use TOTP, as WinSCP does not understand TOTP in Nextcloud at the time of writing (2022-11-07).
+
.. _KB2668751: https://web.archive.org/web/20211008025539/https://support.microsoft.com/en-us/topic/you-cannot-download-more-than-50-mb-or-upload-large-files-when-the-upload-takes-longer-than-30-minutes-using-web-client-in-windows-7-8709ae9d-e808-c5a0-95d0-9a7143c50b11
diff --git a/user_manual/groupware/calendar.rst b/user_manual/groupware/calendar.rst
index 8c2d5bb0e..76d31314a 100644
--- a/user_manual/groupware/calendar.rst
+++ b/user_manual/groupware/calendar.rst
@@ -67,12 +67,10 @@ hard drive or delete it forever.
have a local backup.
.. figure:: images/calendar_dropdown.png
- :scale: 80%
1. Click on the three-dot-menu of the respective calendar.
.. figure:: images/calendar_editing.png
- :scale: 80%
2. Click on *Edit name*, *Edit color*, *Export* or *Delete*.
@@ -127,15 +125,11 @@ Events can be created by clicking in the area when the event is scheduled.
In the day- and week-view of the calendar you just click, pull and release your
cursor over the area when the event is taking place.
-.. only:: html
-
- .. figure:: images/calendar_new-event_week.png
+.. figure:: images/calendar_new-event_week.png
The month-view only requires a single click into the area of the target day.
-.. only:: html
-
- .. figure:: images/calendar_new-event_month.png
+.. figure:: images/calendar_new-event_month.png
After that, you can type in the event's name (e.g. **Meeting with Lukas**), choose
the calendar in which you want to save the event to (e.g. **Personal**, **Work**),
@@ -152,10 +146,11 @@ sidebar editor.
Clicking on the blue ``Create`` button will finally create the event.
-Edit or delete an event
-~~~~~~~~~~~~~~~~~~~~~~~
+Edit, duplicate or delete an event
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If you want to edit, duplicate or delete a specific event, you first need to click on the event.
-If you want to edit or delete a specific event, you just need to click on it.
After that you will be able to re-set all event details and open the
advanced sidebar-editor by clicking on ``More``.
@@ -163,11 +158,14 @@ Clicking on the ``Update`` button will update the event. To cancel your changes,
If you open the sidebar view and click the three dot menu next to the event name, you have an option to export the event as an ``.ics`` file or remove the event from your calendar.
- .. figure:: images/calendar_event_menu.png
- :scale: 70%
+.. figure:: images/calendar_event_menu.png
.. tip:: If you delete events they will go into your :ref:`trash bin<calendar-trash-bin>`. You can restore accidentally deleted events there.
+You can also export, duplicate or delete an event from the basic editor.
+
+.. figure:: images/calendar_event_menu_modal.png
+
.. _calendar-attendees:
Invite attendees to an event
@@ -176,8 +174,8 @@ Invite attendees to an event
You may add attendees to an event to let them know they're invited. They will receive an email invitation and will be able to confirm or cancel their participation to the event.
Attendees may be other users on your Nextcloud instances, contacts in your address books and direct email addresses. You may also change the level of participation per attendees, or disable the email information for a specific attendee.
- .. figure:: images/calendar_event_invitation_level.png
- :scale: 80%
+.. figure:: images/calendar_event_invitation_level.png
+ :scale: 80%
.. tip:: When adding other Nextcloud users as attendees to an event, you may access their free-busy information if available, helping you determine when the best time slot for your event is. Set your :ref:`working hours<calendar-working-hours>` to let others know when you are available. Free-busy information is only available for other users on the same Nextcloud instance.
@@ -278,34 +276,81 @@ Creating an appointment configuration
As an organizer of appointments you open the main Calendar web UI. In the left sidebar you'll find a section for appointments, were you can open the dialogue to create a new one.
-One of the basic infos of every appointment is a title describing what the appointment is about, e.g. "One-on-one" when a user wants to offer colleagues a personal call. The duration of the appointment can be picked from a predefined list. Next, you can set the desired increment. The increment is the rate at which possible slots are available. For example, you could have one hour long slots, but you give them away at 30 minute increments so an attendee can book at 9:00AM but also at 9:30AM. Optional infos about location and a description give the attendees some more context.
+.. figure:: images/appointment_new.png
+
+One of the basic infos of every appointment is a title describing what the appointment is about (e.g. "One-on-one" when an organizer wants to offer colleagues a personal call), where an
+appointment will take place and a more detailed description of what this appointment is about.
+
+.. figure:: images/appointment_config_basics.png
-Every booked appointment will be written into one of your calendars, so you can chose which one that should be. Only slots that do not conflict with existing events in your calendars will be shown to attendees.
+The duration of the appointment can be picked from a predefined list. Next, you can set the desired increment. The increment is the rate at which possible slots are available.
+For example, you could have one hour long slots, but you give them away at 30 minute increments so an attendee can book at 9:00AM but also at 9:30AM.
+Optional infos about location and a description give the attendees some more context.Every booked appointment will be written into one of your calendars, so you can chose which one that should be. Appointments can be *public* or *private*.
+Public appointments can be discovered through the profile page of a Nextcloud user. Private appointments are only accessible to the people who receive the secret URL.
-Appointments can be *public* or *private*. Public appointments can be discovered through the profile page of a Nextcloud user. Private appointments are only accessible to the people who receive the secret URL.
+.. figure:: images/appointment_config_calendar_settings.png
+
+.. note:: Only slots that do not conflict with existing events in your conflict calendars will be shown to attendees.
The organizer of an appointment can specify at which times of the week it's generally possible to book a slot. This could be the working hours but also any other customized schedule.
-Some appointments require time to prepare, e.g. when you meet at a venue and you have to drive there. The organizer can chose to select a time duration that must be free. Only slots that do not conflict with other events during the preparation time will be available. Moreover there is the option to specify a time after each appointment that has to be free.
+.. figure:: images/appointment_config_booking_hours.png
+Some appointments require time to prepare, e.g. when you meet at a venue and you have to drive there.
+The organizer can chose to select a time duration that must be free. Only slots that do not conflict with other events during the preparation time will be available. Moreover there is the option to specify a time after each appointment that has to be free.
To prevent an attendee from booking too short notice it's possible to configure how soon the next possible appointment might take place.
-
Setting a maximum number of slots per day can limit how many appointments are possibly booked by attendees.
-The configured appointment will then be listed in the left sidebar. You can copy its link and share it with the target attendees, or let them discover your public appointment via the profile page.
+.. figure:: images/appointment_config_limits.png
+
+The configured appointment will then be listed in the left sidebar. Via the three dot menu, you can preview the appointment. You can copy the link to the appointment and share it with your target attendees,
+or let them discover your public appointment via the profile page. You can also edit or delete the appointment configuration.
+
+.. figure:: images/appointment_config_options.png
Booking an appointment
~~~~~~~~~~~~~~~~~~~~~~
-The booking page shows an attendee the title, location, description and length of an appointment. For a selected day there will be a list with all the possible time slots. On days with no available slots, too many conflicts or a reached daily maximum limit of already booked appointments, the list might be empty.
+The booking page shows an attendee the title, location, description and length of an appointment.
+For a selected day there will be a list with all the possible time slots. On days with no available slots,
+too many conflicts or a reached daily maximum limit of already booked appointments, the list might be empty.
+
+.. figure:: images/appointment_booking_1.png
+
+For the booking, attendees have to enter a name and an email address. Optionally they can also add a comment.
+
+.. figure:: images/appointment_booking_2.png
+
+When the booking was successful, a confirmation dialogue will be shown to the attendee.
+
+.. figure:: images/appointment_booking_3.png
+
+To verify that the attendee email address is valid, a confirmation email will be sent to them.
-For the booking users have to enter a name and an email address. Optionally they can also add a comment.
+.. figure:: images/appointment_booking_confirmation_email.png
-To verify that the email is valid, a confirmation email will be sent. Only after clicking the confirmation link from the email the appointment booking will be finished. Until then the time slot might also be booked by another user who confirms their booking earlier. The system will detect the conflict and offer to pick a new time slot.
+Only after the attendee clicks the confirmation link from the email the appointment booking will be accepted and forwarded to the organizer.
+
+.. figure:: images/appointment_booking_confirmation_dialogue.png
+
+The attendee will receive another email confirming the details of their appointment.
+
+.. figure:: images/appointment_booking_email_2.png
+
+.. note:: If a slot has not been confirmed, it will still show up as bookable. Until then the time slot might also be booked by another user who confirms their booking earlier.
+ The system will detect the conflict and offer to pick a new time slot.
Working with the booked appointment
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Once the booking is done, the organizer will find an event in their calendar with the appointment details and the :ref:`attendee<calendar-attendees>`. As with any other event that has attendees, changes and cancellations will trigger a notification to the attendee's email.
+Once the booking is done, the organizer will find an event in their calendar with the appointment details and the :ref:`attendee<calendar-attendees>`.
+
+.. figure:: images/appointment_calendar_event.png
+
+If the appointment has the setting "Add time before event" or "Add time after the event" enabled, they will show up as separate events in the calendar for the organizer.
+
+.. figure:: images/appointment_calendar_prep.png
+
+As with any other event that has attendees, changes and cancellations will trigger a notification to the attendee's email.
If attendees wish to cancel the appointment they have to get in contact with the organizer, so that the organizer can cancel or even delete the event.
diff --git a/user_manual/groupware/images/appointment__config_options.png b/user_manual/groupware/images/appointment__config_options.png
new file mode 100644
index 000000000..308dc12bb
--- /dev/null
+++ b/user_manual/groupware/images/appointment__config_options.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_booking_1.png b/user_manual/groupware/images/appointment_booking_1.png
new file mode 100644
index 000000000..191a2cb6e
--- /dev/null
+++ b/user_manual/groupware/images/appointment_booking_1.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_booking_2.png b/user_manual/groupware/images/appointment_booking_2.png
new file mode 100644
index 000000000..dbb6459a2
--- /dev/null
+++ b/user_manual/groupware/images/appointment_booking_2.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_booking_3.png b/user_manual/groupware/images/appointment_booking_3.png
new file mode 100644
index 000000000..d1f3a10fb
--- /dev/null
+++ b/user_manual/groupware/images/appointment_booking_3.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_booking_confirmation_dialogue.png b/user_manual/groupware/images/appointment_booking_confirmation_dialogue.png
new file mode 100644
index 000000000..163b8d01d
--- /dev/null
+++ b/user_manual/groupware/images/appointment_booking_confirmation_dialogue.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_booking_confirmation_email.png b/user_manual/groupware/images/appointment_booking_confirmation_email.png
new file mode 100644
index 000000000..97aa5da11
--- /dev/null
+++ b/user_manual/groupware/images/appointment_booking_confirmation_email.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_booking_email_2.png b/user_manual/groupware/images/appointment_booking_email_2.png
new file mode 100644
index 000000000..111fabe14
--- /dev/null
+++ b/user_manual/groupware/images/appointment_booking_email_2.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_calendar_event.png b/user_manual/groupware/images/appointment_calendar_event.png
new file mode 100644
index 000000000..70add4a51
--- /dev/null
+++ b/user_manual/groupware/images/appointment_calendar_event.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_calendar_prep.png b/user_manual/groupware/images/appointment_calendar_prep.png
new file mode 100644
index 000000000..78f3424c7
--- /dev/null
+++ b/user_manual/groupware/images/appointment_calendar_prep.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_config_basics.png b/user_manual/groupware/images/appointment_config_basics.png
new file mode 100644
index 000000000..edd7afe1d
--- /dev/null
+++ b/user_manual/groupware/images/appointment_config_basics.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_config_booking_hours.png b/user_manual/groupware/images/appointment_config_booking_hours.png
new file mode 100644
index 000000000..8869cbb16
--- /dev/null
+++ b/user_manual/groupware/images/appointment_config_booking_hours.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_config_calendar_settings.png b/user_manual/groupware/images/appointment_config_calendar_settings.png
new file mode 100644
index 000000000..c9153938d
--- /dev/null
+++ b/user_manual/groupware/images/appointment_config_calendar_settings.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_config_limits.png b/user_manual/groupware/images/appointment_config_limits.png
new file mode 100644
index 000000000..5e290b0e1
--- /dev/null
+++ b/user_manual/groupware/images/appointment_config_limits.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_config_new.png b/user_manual/groupware/images/appointment_config_new.png
new file mode 100644
index 000000000..8d22769bc
--- /dev/null
+++ b/user_manual/groupware/images/appointment_config_new.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_config_options.png b/user_manual/groupware/images/appointment_config_options.png
new file mode 100644
index 000000000..ee6db8375
--- /dev/null
+++ b/user_manual/groupware/images/appointment_config_options.png
Binary files differ
diff --git a/user_manual/groupware/images/appointment_new.png b/user_manual/groupware/images/appointment_new.png
new file mode 100644
index 000000000..1ed616cde
--- /dev/null
+++ b/user_manual/groupware/images/appointment_new.png
Binary files differ
diff --git a/user_manual/groupware/images/caldav_availability.png b/user_manual/groupware/images/caldav_availability.png
index ed5bb2d55..36edd94a0 100644
--- a/user_manual/groupware/images/caldav_availability.png
+++ b/user_manual/groupware/images/caldav_availability.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_accept_sidebar_editor.png b/user_manual/groupware/images/calendar_accept_sidebar_editor.png
index 82b8e879c..b5a280cda 100644
--- a/user_manual/groupware/images/calendar_accept_sidebar_editor.png
+++ b/user_manual/groupware/images/calendar_accept_sidebar_editor.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_accept_simple_editor.png b/user_manual/groupware/images/calendar_accept_simple_editor.png
index a5b0e8181..d16901721 100644
--- a/user_manual/groupware/images/calendar_accept_simple_editor.png
+++ b/user_manual/groupware/images/calendar_accept_simple_editor.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_application.png b/user_manual/groupware/images/calendar_application.png
index 5f3eec37a..572201be6 100644
--- a/user_manual/groupware/images/calendar_application.png
+++ b/user_manual/groupware/images/calendar_application.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_create_1.png b/user_manual/groupware/images/calendar_create_1.png
index 90ad2e78b..bba81a093 100644
--- a/user_manual/groupware/images/calendar_create_1.png
+++ b/user_manual/groupware/images/calendar_create_1.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_create_2.png b/user_manual/groupware/images/calendar_create_2.png
index fe5187db0..6c198d394 100644
--- a/user_manual/groupware/images/calendar_create_2.png
+++ b/user_manual/groupware/images/calendar_create_2.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_dropdown.png b/user_manual/groupware/images/calendar_dropdown.png
index 188bfc2db..60b0d5d04 100644
--- a/user_manual/groupware/images/calendar_dropdown.png
+++ b/user_manual/groupware/images/calendar_dropdown.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_editing.png b/user_manual/groupware/images/calendar_editing.png
index 41fc3c6ae..431f70b83 100644
--- a/user_manual/groupware/images/calendar_editing.png
+++ b/user_manual/groupware/images/calendar_editing.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_event_invitation_level.png b/user_manual/groupware/images/calendar_event_invitation_level.png
index c872db832..62da8723e 100644
--- a/user_manual/groupware/images/calendar_event_invitation_level.png
+++ b/user_manual/groupware/images/calendar_event_invitation_level.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_event_menu.png b/user_manual/groupware/images/calendar_event_menu.png
index cf02b643d..3d8319f61 100644
--- a/user_manual/groupware/images/calendar_event_menu.png
+++ b/user_manual/groupware/images/calendar_event_menu.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_event_menu_modal.png b/user_manual/groupware/images/calendar_event_menu_modal.png
new file mode 100644
index 000000000..4238ba783
--- /dev/null
+++ b/user_manual/groupware/images/calendar_event_menu_modal.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_event_reminders.png b/user_manual/groupware/images/calendar_event_reminders.png
index 1f5dd4d48..59d59d9a8 100644
--- a/user_manual/groupware/images/calendar_event_reminders.png
+++ b/user_manual/groupware/images/calendar_event_reminders.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_event_repeat.png b/user_manual/groupware/images/calendar_event_repeat.png
index 0e3513418..e1a384499 100644
--- a/user_manual/groupware/images/calendar_event_repeat.png
+++ b/user_manual/groupware/images/calendar_event_repeat.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_new-event_month.png b/user_manual/groupware/images/calendar_new-event_month.png
index 58d024f37..d06a6fac4 100644
--- a/user_manual/groupware/images/calendar_new-event_month.png
+++ b/user_manual/groupware/images/calendar_new-event_month.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_new-event_week.png b/user_manual/groupware/images/calendar_new-event_week.png
index bf15d4555..a5eed1723 100644
--- a/user_manual/groupware/images/calendar_new-event_week.png
+++ b/user_manual/groupware/images/calendar_new-event_week.png
Binary files differ
diff --git a/user_manual/groupware/images/calendar_settings.png b/user_manual/groupware/images/calendar_settings.png
index d3a22ee6c..1fc8e63ee 100644
--- a/user_manual/groupware/images/calendar_settings.png
+++ b/user_manual/groupware/images/calendar_settings.png
Binary files differ
diff --git a/user_manual/locale/sv/LC_MESSAGES/talk/index.pot b/user_manual/locale/sv/LC_MESSAGES/talk/index.pot
new file mode 100644
index 000000000..a631fdfe2
--- /dev/null
+++ b/user_manual/locale/sv/LC_MESSAGES/talk/index.pot
@@ -0,0 +1,42 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2022 Nextcloud GmbH
+# This file is distributed under the same license as the Nextcloud latest User Manual package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+# Translators:
+# Leif-Jöran Olsson <ljo@fripost.org>, 2022
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Nextcloud latest User Manual latest\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-01-07 14:47+0100\n"
+"PO-Revision-Date: 2021-10-11 16:50+0000\n"
+"Last-Translator: Leif-Jöran Olsson <ljo@fripost.org>, 2022\n"
+"Language-Team: Swedish (https://www.transifex.com/nextcloud/teams/64236/sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../talk/index.rst:3
+msgid "Talk"
+msgstr "Talk"
+
+#: ../../talk/index.rst:5
+msgid ""
+"Nextcloud Talk offers audio/video and text chat integrated in Nextcloud. It "
+"offers a web interface as well as mobile apps."
+msgstr ""
+"Nextcloud Talk ger ljud/video och textchatt integrerat i Nextcloud. Det "
+"finns tillgängligt både via webbgränssnitt och mobilappar."
+
+#: ../../talk/index.rst:8
+msgid ""
+"You can find out more about Nextcloud Talk `on our website "
+"<https://nextcloud.com/talk/>`_."
+msgstr ""
+"Du hittar mer om Nextcloud Talk `på webbsidan "
+"<https://nextcloud.com/talk/>`_."