diff --git a/docs/content_management/collaborative_editing/collaborative_editing.md b/docs/content_management/collaborative_editing/collaborative_editing.md new file mode 100644 index 0000000000..476d81463c --- /dev/null +++ b/docs/content_management/collaborative_editing/collaborative_editing.md @@ -0,0 +1,25 @@ +--- +description: Collaborative editing enables multiple users to work on the same content simultaneously. +page_type: landing_page +month_change: true +--- + +# Collaborative editing + +With Collaborative editing feature multiple users can work on the same content created in [[= product_name =]] simultaneously. +This feature allows multiple users to work together on the same content item in real time, streamlining the content creation and review process. + +Users can invite both internal and external collaborators to a session, giving them access for editing or previewing. + +Additionaly, they can collaborate using a Real-time collaboration, an advanced part of the collaboration feature, to write and review content in a live mode thanks to CKEditor. +Real-time collaboration syncs changes instantly and shows user avatars and colored tags to indicate who is editing each part of the content. + +This feature also introduces new dashboard tabs for managing shared drafts and joining collaboration sessions easily. + +[[= cards([ +"content_management/collaborative_editing/collaborative_editing", +"content_management/collaborative_editing/collaborative_editing_api", +"content_management/collaborative_editing/invitation_api", +"content_management/collaborative_editing/session_api", +"content_management/collaborative_editing/collaborative_editing_guide" +], columns=3) =]] diff --git a/docs/content_management/collaborative_editing/collaborative_editing_api.md b/docs/content_management/collaborative_editing/collaborative_editing_api.md new file mode 100644 index 0000000000..c08f2838bc --- /dev/null +++ b/docs/content_management/collaborative_editing/collaborative_editing_api.md @@ -0,0 +1,56 @@ +--- +description: Use PHP API to manage invitations and sessions while using collaborative editing feature. +month_change: false +--- + +# Collaborative editing API + +[[= product_name =]]'s Collaborative editing API provides two services for managing sessions and invitations, which differ in function: + +- [`InvitationServiceInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-(?)-InvitationServiceInterface.html) is used to request product data +- [`SessionServiceInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-(?)-SessionServiceInterface.html) is used to modify products + +``` php + +/** + * @copyright Copyright (C) Ibexa AS. All rights reserved. + * @license For full copyright and license information view LICENSE file distributed with this source code. + */ +declare(strict_types=1); + +namespace Ibexa\Tests\Integration\Collaboration; + +use DateTimeImmutable; +use Ibexa\Contracts\Collaboration\Invitation\InvitationCreateStruct; +use Ibexa\Contracts\Collaboration\Invitation\InvitationInterface; +use Ibexa\Contracts\Collaboration\Invitation\InvitationQuery; +use Ibexa\Contracts\Collaboration\Invitation\InvitationStatus; +use Ibexa\Contracts\Collaboration\Invitation\InvitationUpdateStruct; +use Ibexa\Contracts\Collaboration\Invitation\Query\Criterion; +use Ibexa\Contracts\Collaboration\Invitation\Query\SortClause; +use Ibexa\Contracts\Collaboration\InvitationServiceInterface; +use Ibexa\Contracts\Collaboration\SessionServiceInterface; +use Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException; +use Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException; +use Ibexa\Contracts\Core\Test\IbexaKernelTestTrait; +use Ibexa\Contracts\CoreSearch\Values\Query\SortDirection; +use Ibexa\Contracts\Test\Core\IbexaKernelTestCase; + +final class InvitationServiceTest extends IbexaKernelTestCase +{ + use IbexaKernelTestTrait; + + private const EXAMPLE_SESSION_ID = 1; + private const EXAMPLE_INVITATION_ID = 1; + private const EXAMPLE_PARTICIPANT_ID = 1; + + private const EXAMPLE_INVITATION_A = 1; + private const EXAMPLE_INVITATION_B = 2; + private const EXAMPLE_INVITATION_C = 3; + + protected function setUp(): void + { + self::bootKernel(); + self::setAdministratorUser(); + } +``` \ No newline at end of file diff --git a/docs/content_management/collaborative_editing/install_collaborative_editing.md b/docs/content_management/collaborative_editing/install_collaborative_editing.md new file mode 100644 index 0000000000..ee55eca752 --- /dev/null +++ b/docs/content_management/collaborative_editing/install_collaborative_editing.md @@ -0,0 +1,61 @@ +--- +description: Install the Collaborative editing LTS update. +month_change: false +--- + +# Install Collaborative editing + +Collaborative editing feature is available as an LTS update to [[= product_name =]] starting with version v5.0 or higher, regardless of its edition. +To use this feature you must first install the packages and configure them. + +## Install packages + +Run the following commands to install the packages: + +``` bash +composer require ibexa/collaboration +composer require ibexa/share +composer require ibexa/fieldtype-richtext-rte +``` + +This command adds the new real-time editing functionality to the Rich Text field type. +It also modifies the permission system to account for the new functionality. + +## Configure Collaborative editing + +Once the packages are installed, before you can start Collaborative editing feature, you must enable it by following these instructions. + +### Add tables to the database + +To add the tables to the database, run the following commands: + +``` bash +php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/collaboration/src/bundle/Resources/config/schema.yaml | mysql -u -p +php bin/console ibexa:doctrine:schema:dump-sql vendor/ibexa/share/src/bundle/Resources/config/schema.yaml | mysql -u -p +``` + +### Modify the bundles file + +Then, in the `config/bundles.php` file, add the following code: + +``` php + ['all' => true], + Ibexa\Bundle\Share\IbexaShareBundle::class => ['all' => true], + Ibexa\Bundle\FieldTypeRichTextRTE\IbexaFieldTypeRichTextRTEBundle::class => ['all' => true], +]; +``` + +### Add migration file and execute migration + +Last step is to add migration file and execute migration with the following commands: + +``` bash +php bin/console ibexa:migrations:import vendor/ibexa/collaboration/src/bundle/Resources/migrations/2025_08_26_10_14_shareable_user.yaml +php bin/console ibexa:migrations:migrate --file=2025_08_26_10_14_shareable_user.yaml +``` + +You can now restart you application and start [working with the Collaborative editing feature]([[= user_doc =]]/content_management/collaborative_editing/work_with_collaborative_editing/). \ No newline at end of file diff --git a/docs/content_management/collaborative_editing/invitation_api.md b/docs/content_management/collaborative_editing/invitation_api.md new file mode 100644 index 0000000000..2451ea3cfa --- /dev/null +++ b/docs/content_management/collaborative_editing/invitation_api.md @@ -0,0 +1,91 @@ +--- +description: You can use the PHP API to create new invitation, update existing one, read or delete it. +--- + +# Invitation API + +[`InvitationService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-InvitationService.html) enables you to read, add, update, and remove invitation for collaborative editing session. + +## Create invitation + +You can create new invitation for the collaborative session using the [`InvitationService::createInvitation`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-InvitationService.html#method_createInvitation) method: + +``` php +{ + $session = $this->sessionService->getSession(1); + $participant = $session->getParticipants()->getByEmail('foo@link.invalid'); + $createStruct = new InvitationCreateStruct($session, $participant); + $createStruct->setContext([ + 'message' => 'Hello, would you like to join my session?', + ]); + $invitation = $this->invitationService->createInvitation($createStruct); +} +``` + +## Get invitation by ID + +You can get an invitation by ID with [`InvitationService::getInvitation`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-InvitationService.html#method_deleteInvitation): + +``` php + $this->invitationService->getInvitation(1); +``` + +You can select the parameter that you can read from an invitation: + +- Invitation ID: + +``` php + $invitation->getId(); +``` + +- Session ID: + +``` php + $invitation->getSession()->getId(); +``` + +- Participant ID: + +``` php + $invitation->getParticipant()->getId(); +``` + +- Invitation status: + +``` php + $invitation->getStatus(); +``` + +## Get invitation by participant + +You can get an invitation by participant with [`InvitationService::getInvitationByParticipant`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-InvitationService.html#method_getInvitationByParticipant): + +``` php + $this->innerService->getInvitationByParticipant($participant); +``` + +## Find invitations + +You can find an invitation with [`InvitationService::findInvitation`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-InvitationService.html#method_deleteInvitation). + +To learn more about the available search options, see Search Criteria and Sort Clauses for Collaborative editing. + +## Update invitation + +You can update existing invitation with [`InvitationService::updateInvitation`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-InvitationService.html#method_deleteInvitation): + +``` php + $invitation = $this->invitationService->getInvitation(1); + $updateStruct = new InvitationUpdateStruct(); + $updateStruct->setStatus(InvitationStatus::STATUS_ACCEPTED); + $invitation = $this->invitationService->updateInvitation($invitation, $updateStruct); +``` + +## Delete invitation + +You can delete an invitation with [`InvitationService::deleteInvitation`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-InvitationService.html#method_deleteInvitation): + +``` php + $invitation = $this->invitationService->getInvitation(1); + $this->invitationService->deleteInvitation($invitation); +``` \ No newline at end of file diff --git a/docs/content_management/collaborative_editing/session_api.md b/docs/content_management/collaborative_editing/session_api.md new file mode 100644 index 0000000000..72ba3551bd --- /dev/null +++ b/docs/content_management/collaborative_editing/session_api.md @@ -0,0 +1,93 @@ +--- +description: You can use the PHP API to create new session, update existing one, find or delete it, and add or remove participants. +--- + +# Session API + +[`SessionService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SessionService.html) enables you work with the collaborative session, for example, create a new one, update or delete existing one, and add or remove new participants to join collaborative session. + +## Create session + +You can create new collaboration session with given id with [`SessionService::createSession`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SessionService.html#method_createSession): + +``` php + $this->innerService->createSession($createStruct); +``` +## Get session + +You can return existing collaboration session with [`SessionService::getSession`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SessionService.html#method_getSession): + +- using given id: + +``` php + $this->innerService->getSession($id); +``` + +- using given token: + +``` php + $this->innerService->getSessionByToken($token); +``` + +- matching the given query: + +``` php + $this->innerService->findSessions($query); +``` + +## Find session + +You can find an existing session with [`SessionService::findSession`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SessionService.html#method_findSession) by: + +``` php + $this->innerService->findSessions($query); +``` + +## Update session + +You can update existing invitation with [`SessionService::updateSession`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SessionService.html#method_updateSession): + +``` php + $this->innerService->updateSession($session, $updateStruct); +``` + +## Delete session + +You can delete session with [`SessionService::deleteSession`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SessionService.html#method_deleteSession): + +``` php + $this->innerService->deleteSession($session); +``` + +# Participant API + +## Add participant + +You can add participant to the collaboration session with [`SessionService::addParticipant`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SessionService.html#method_addParticipant): + +``` php + $this->innerService->addParticipant($session, $createStruct); +``` + +## Update participant + +You can update participant added to the collaboration session with [`SessionService::updateParticipant`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SessionService.html#method_updateParticipant): + +``` php + $this->innerService->updateParticipant($session, $participant, $updateStruct); +``` +## Remove participant + +You can remove participant from the collaboration session with [`SessionService::removeParticipant`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SessionService.html#method_removeParticipant): + +``` php + $this->innerService->removeParticipant($session, $participant); +``` + +## Check session Owner + +You can check the Owner of the collaboration session with [`SessionService::removeParticipant`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SessionService.html#method_removeParticipant): + +``` php + $this->innerService->isSessionOwner($session, $user); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/created_at_invitation_criterion.md b/docs/search/collaborative_editing_search_reference/invitation/created_at_invitation_criterion.md new file mode 100644 index 0000000000..c4f80dedba --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/created_at_invitation_criterion.md @@ -0,0 +1,23 @@ +--- +description: CreatedAt Search Criterion +--- + +# CreatedAt Search Criterion + +The `CreatedAt` Search Criterion searches for invitations based on the date they were created. + +## Arguments + +- `value` - date to be matched, provided as a DateTimeInterface object +- `operator` - optional operator string (EQ, GT, GTE, LT, LTE) + +## Example + +```php +$criteria = new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\CreatedAt( + new DateTime('2025-05-01 14:07:02'), + 'GTE' +); + +$query = new InvitationQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/created_at_invitation_sort_clause.md b/docs/search/collaborative_editing_search_reference/invitation/created_at_invitation_sort_clause.md new file mode 100644 index 0000000000..d9308d9d04 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/created_at_invitation_sort_clause.md @@ -0,0 +1,19 @@ +--- +description: CreatedAt Sort Clause +--- + +# CreatedAt Sort Clause + +The `CreatedAt` Sort Clause sorts search results by the date and time of the creation of invitation. + +## Arguments + +- (optional) `direction` - SortDirection constant, either SortDirection::ASC or SortDirection::DESC. + +## Example + +```php +$sortClause = [new \Ibexa\Contracts\Collaboration\Invitation\Query\SortClause\CreatedAt(SortDirection::DESC)]); + +$query = new InvitationQuery($criteria, sortClause); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/id_invitation_criterion.md b/docs/search/collaborative_editing_search_reference/invitation/id_invitation_criterion.md new file mode 100644 index 0000000000..7a44e27af4 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/id_invitation_criterion.md @@ -0,0 +1,23 @@ +--- +description: Id Search Criterion +--- + +# Id Criterion + +The `Id` Search Criterion searches for invitations based on invitation ID. + +## Arguments + +- `value` - integer(s) representing the Invitation ID(s) + +## Example + +```php +$criteria = new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Id(1); + +OR + +$criteria = new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Id([1, 2]); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/invitation_id_invitation_sort_clause.md b/docs/search/collaborative_editing_search_reference/invitation/invitation_id_invitation_sort_clause.md new file mode 100644 index 0000000000..2b5af37d6f --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/invitation_id_invitation_sort_clause.md @@ -0,0 +1,19 @@ +--- +description: InvitationId Sort Clause +--- + +# InvitationId Sort Clause + +The `InvitationId` Sort Clause sorts search results by invitation ID. + +## Arguments + +- (optional) `direction` - SortDirection constant, either SortDirection::ASC or SortDirection::DESC. + +## Example + +```php +$sortClause = [new \Ibexa\Contracts\Collaboration\Invitation\Query\SortClause\Id(SortDirection::DESC)]); + +$query = new InvitationQuery($criteria, sortClause); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/invitation_status_invitation_sort_clause.md b/docs/search/collaborative_editing_search_reference/invitation/invitation_status_invitation_sort_clause.md new file mode 100644 index 0000000000..e097d7eadb --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/invitation_status_invitation_sort_clause.md @@ -0,0 +1,19 @@ +--- +description: InvitationStatus Sort Clause +--- + +# InvitationStatus Sort Clause + +The `InvitationStatus` Sort Clause sorts search results by invitation status. + +## Arguments + +- (optional) `direction` - SortDirection constant, either SortDirection::ASC or SortDirection::DESC. + +## Example + +```php +$sortClause = [new \Ibexa\Contracts\Collaboration\Invitation\Query\SortClause\Status(SortDirection::DESC)]); + +$query = new InvitationQuery($criteria, sortClause); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/logical_and_invitation_criterion.md b/docs/search/collaborative_editing_search_reference/invitation/logical_and_invitation_criterion.md new file mode 100644 index 0000000000..9c109c1dab --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/logical_and_invitation_criterion.md @@ -0,0 +1,20 @@ +--- +description: LogicalAnd Search Criterion +--- + +# LogicalAnd Criterion + +The `LogicalAnd` Search Criterion matches combined invitations by the logical operator. + +## Example + +```php +$currentUser = $this->permissionResolver->getCurrentUserReference(); + +$criteria = \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\LogicalAnd( + new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Status('pending'), + new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Sender($currentUser) +); + +$query = new InvitationQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/logical_or_invitation_criterion.md b/docs/search/collaborative_editing_search_reference/invitation/logical_or_invitation_criterion.md new file mode 100644 index 0000000000..22f78914d0 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/logical_or_invitation_criterion.md @@ -0,0 +1,18 @@ +--- +description: LogicalOr Search Criterion +--- + +# LogicalOr Criterion + +The `LogicalOr` Search Criterion matches combined invitations by the logical operator. + +## Example + +```php +$criteria = \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\LogicalOr( , + new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Id(1), + new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Status('pending') +); + +$query = new InvitationQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/sender_invitation_criterion.md b/docs/search/collaborative_editing_search_reference/invitation/sender_invitation_criterion.md new file mode 100644 index 0000000000..5c6a21850c --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/sender_invitation_criterion.md @@ -0,0 +1,26 @@ +--- +description: Sender Search Criterion +--- + +# Sender Search Criterion + +The `Sender` Search Criterion searches for invitations based on invitation sender. + +## Arguments + +- `value` - user(s) to be matched, provided as a UserReference object + +## Example + +```php +$user = $this->userService->loadUserByLogin('foo'); +$currentUser = $this->permissionResolver->getCurrentUserReference(); + +$criteria = new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Owner($user); + +OR + +$criteria = new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Owner([$user, $currentUser]); + +$query = new InvitationQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/session_invitation_criterion.md b/docs/search/collaborative_editing_search_reference/invitation/session_invitation_criterion.md new file mode 100644 index 0000000000..21646bc637 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/session_invitation_criterion.md @@ -0,0 +1,26 @@ +--- +description: Session Search Criterion +--- + +# Session Search Criterion + +The `Session` Search Criterion searches for invitations based on session. + +## Arguments + +- `value` - objects(s) representing the session(s) and implementing `\Ibexa\Contracts\Collaboration\Session\SessionInterface` + +## Example + +```php +$firstSession = $this->sessionService->getSession(1); +$secondSession = $this->sessionService->getSession(2); + +$criteria = new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Session($firstSession); + +OR + +$criteria = new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Session([$firstSession, $secondSession]); + +$query = new InvitationQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/status_invitation_criterion.md b/docs/search/collaborative_editing_search_reference/invitation/status_invitation_criterion.md new file mode 100644 index 0000000000..25f4b731fe --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/status_invitation_criterion.md @@ -0,0 +1,23 @@ +--- +description: Status Search Criterion +--- + +# Status Search Criterion + +The `Status` Search Criterion searches for invitations based on status. + +## Arguments + +- `value` - string(s) representing the invitation status(es) + +## Example + +```php +$criteria = new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Type('pending'); + +OR + +$criteria = new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\Type(['pending', 'accepted']); + +$query = new InvitationQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/updated_at_invitation_criterion.md b/docs/search/collaborative_editing_search_reference/invitation/updated_at_invitation_criterion.md new file mode 100644 index 0000000000..c56ed9671a --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/updated_at_invitation_criterion.md @@ -0,0 +1,23 @@ +--- +description: UpdatedAt Search Criterion +--- + +# UpdatedAt Criterion + +The `UpdatedAt` Search Criterion searches for invitations based on the date they were updated. + +## Arguments + +- `value` - date to be matched, provided as a DateTimeInterface object +- `operator` - optional operator string (EQ, GT, GTE, LT, LTE) + +## Example + +```php +$criteria = new \Ibexa\Contracts\Collaboration\Invitation\Query\Criterion\UpdatedAt( + new DateTime('2025-05-01 14:07:02'), + 'GTE' +); + +$query = new InvitationQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/invitation/updated_at_invitation_sort_clause.md b/docs/search/collaborative_editing_search_reference/invitation/updated_at_invitation_sort_clause.md new file mode 100644 index 0000000000..0d52a0b86f --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/invitation/updated_at_invitation_sort_clause.md @@ -0,0 +1,19 @@ +--- +description: UpdatedAt Sort Clause +--- + +# UpdatedAt Sort Clause + +The UpdatedAt Sort Clause sorts search results by the date and time when invitation was updated. + +## Arguments + +- (optional) `direction` - SortDirection constant, either SortDirection::ASC or SortDirection::DESC. + +## Example + +```php +$sortClause = [new \Ibexa\Contracts\Collaboration\Invitation\Query\SortClause\UpdatedAt(SortDirection::DESC)]); + +$query = new InvitationQuery($criteria, sortClause); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/content_id_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/content_id_session_criterion.md new file mode 100644 index 0000000000..3a3bffe5e1 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/content_id_session_criterion.md @@ -0,0 +1,23 @@ +--- +description: ContentID Search Criterion +--- + +# ContentID Criterion + +The `ContentID` Search Criterion searches for content sessions based on content item ID. + +## Arguments + +- `value` - integer(s) representing the content item id(s) + +## Example + +```php +$criteria = new Ibexa\Share\Session\Query\Criterion\ContentId(1); + +OR + +$criteria = new Ibexa\Share\Session\Query\Criterion\ContentId([1, 2]); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/content_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/content_session_criterion.md new file mode 100644 index 0000000000..d01c731414 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/content_session_criterion.md @@ -0,0 +1,26 @@ +--- +description: ContentSession Search Criterion +--- + +# ContentSession Criterion + +The `ContentSession` Search Criterion searches for contentId, versionNo, languageId. + +## Arguments + +- `contentId` - integer representing content item ID +- `versionNo` - integer representing version number +- `languageId` - integer representing language ID + +## Example + +```php +$criteria = new Ibexa\Share\Session\Query\Criterion\ContentSession(1, 2, 3); + +OR + +$versionInfo = $this->contentService->loadVersionInfoById(1); +$criteria = new Ibexa\Share\Session\Query\Criterion\ContentSession::fromVersionInfo($versionInfo); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/created_at_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/created_at_session_criterion.md new file mode 100644 index 0000000000..7183bc8025 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/created_at_session_criterion.md @@ -0,0 +1,23 @@ +--- +description: CreatedAt Search Criterion +--- + +# CreatedAt Criterion + +The `CreatedAt` Search Criterion searches for sessions based on the date when they were created. + +## Arguments + +- `value` - date to be matched, provided as a DateTimeInterface object +- `operator` - optional operator string (EQ, GT, GTE, LT, LTE) + +## Example + +```php +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\CreatedAt( + new DateTime('2025-05-01 14:07:02'), + 'GTE' +); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/created_at_session_sort_clause.md b/docs/search/collaborative_editing_search_reference/session/created_at_session_sort_clause.md new file mode 100644 index 0000000000..ec7dadfcab --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/created_at_session_sort_clause.md @@ -0,0 +1,19 @@ +--- +description: CreatedAt Sort Clause +--- + +# CreatedAt Sort Clause + +The `CreatedAt` Sort Clause sorts search results by the date and time of the creation of session. + +## Arguments + +- (optional) `direction` - SortDirection constant, either SortDirection::ASC or SortDirection::DESC. + +## Example + +```php +$sortClause = [new \Ibexa\Contracts\Collaboration\Session\Query\SortClause\CreatedAt(SortDirection::DESC)]); + +$query = new SessionQuery($criteria, sortClause); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/email_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/email_session_criterion.md new file mode 100644 index 0000000000..dfb75b00fe --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/email_session_criterion.md @@ -0,0 +1,23 @@ +--- +description: Email Search Criterion +--- + +# Email Criterion + +The `Email` Search Criterion searches for sessions based on external participant email. + +## Arguments + +- `value` - string(s) representing the Participant email(s) + +## Example + +```php +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Email('participant@link.invalid'); + +OR + +$criteria = new \Ibexa\Contracts\Collaboration\Session\Query\Criterion\Email(...['participant1@link.invalid', 'participant2@link.invalid']); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/id_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/id_session_criterion.md new file mode 100644 index 0000000000..172511fbac --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/id_session_criterion.md @@ -0,0 +1,23 @@ +--- +description: Id Search Criterion +--- + +# Id Criterion + +The `Id` Search Criterion searches for sessions based on session ID. + +## Arguments + +- `value` - integer(s) representing the Session ID(s) + +## Example + +```php +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Id(1); + +OR + +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Id([1, 2]); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/is_active_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/is_active_session_criterion.md new file mode 100644 index 0000000000..e4b0d298e2 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/is_active_session_criterion.md @@ -0,0 +1,23 @@ +--- +description: IsActive Search Criterion +--- + +# IsActive Criterion + +The `IsActive` Search Criterion searches for sessions based on active status. + +## Arguments + +- (optional) `value` - bool representing the whether to search for active (default true) or inactive (false) sessions. + +## Example + +```php +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\IsActive(); + +OR + +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\IsActive(false); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/language_id_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/language_id_session_criterion.md new file mode 100644 index 0000000000..8ab3c9996b --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/language_id_session_criterion.md @@ -0,0 +1,23 @@ +--- +description: LanguageID Search Criterion +--- + +# LanguageID Criterion + +The `LanguageID` Search Criterion searches for content sessions based on language ID of content item. + +## Arguments + +- `value` - integer(s) representing language id(s) + +## Example + +```php +$criteria = new Ibexa\Share\Session\Query\Criterion\LanguageId(1); + +OR + +$criteria = new Ibexa\Share\Session\Query\Criterion\LanguageId([1, 2]); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/logical_and_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/logical_and_session_criterion.md new file mode 100644 index 0000000000..3308e7390d --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/logical_and_session_criterion.md @@ -0,0 +1,18 @@ +--- +description: LogicalAnd Search Criterion +--- + +# LogicalAnd Criterion + +The `LogicalAnd` Search Criterion matches combined sessions by the logical operator. + +## Example + +```php +$criteria = Ibexa\Contracts\Collaboration\Session\Query\Criterion\LogicalAnd( + new Ibexa\Contracts\Collaboration\Session\Query\Criterion\IsActive(), + new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Type('content') +); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/logical_or_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/logical_or_session_criterion.md new file mode 100644 index 0000000000..fcad1ef9b0 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/logical_or_session_criterion.md @@ -0,0 +1,18 @@ +--- +description: LogicalOr Search Criterion +--- + +# LogicalOr Criterion + +The `LogicalOr` Search Criterion matches combined sessions by the logical operator. + +## Example + +```php +$criteria = Ibexa\Contracts\Collaboration\Session\Query\Criterion\LogicalOr( , + new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Id(1), + new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Token('12345-12345-12345-12345') +); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/owner_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/owner_session_criterion.md new file mode 100644 index 0000000000..e86c31b6b3 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/owner_session_criterion.md @@ -0,0 +1,26 @@ +--- +description: Owner Search Criterion +--- + +# Owner Criterion + +The `Owner` Search Criterion searches for sessions based on session Owner. + +## Arguments + +- `value` - user(s) to be matched, provided as a UserReference object + +## Example + +```php +$user = $this->userService->loadUserByLogin('foo'); +$currentUser = $this->permissionResolver->getCurrentUserReference(); + +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Owner($user); + +OR + +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Owner([$user, $currentUser]); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/session_id_session_sort_clause.md b/docs/search/collaborative_editing_search_reference/session/session_id_session_sort_clause.md new file mode 100644 index 0000000000..9f00e2b1f3 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/session_id_session_sort_clause.md @@ -0,0 +1,19 @@ +--- +description: SessionId Sort Clause +--- + +# SessionId Sort Clause + +The `SessionId` Sort Clause sorts search results by session ID. + +## Arguments + +- (optional) `direction` - SortDirection constant, either SortDirection::ASC or SortDirection::DESC. + +## Example + +```php +$sortClause = [new \Ibexa\Contracts\Collaboration\Session\Query\SortClause\Id(SortDirection::DESC)]); + +$query = new SessionQuery($criteria, sortClause); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/token_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/token_session_criterion.md new file mode 100644 index 0000000000..05c4b6f55c --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/token_session_criterion.md @@ -0,0 +1,23 @@ +--- +description: Token Search Criterion +--- + +# Token Criterion + +The `Token` Search Criterion searches for sessions based on session token. + +## Arguments + +- `value` - string(s) representing the session token(s) + +## Example + +```php +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Token('12345-12345-12345-12345-12345'); + +OR + +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Token(['12345-12345-12345-12345-12345', '12345-67890-098765-54321-12345']); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/type_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/type_session_criterion.md new file mode 100644 index 0000000000..5ee59b10ea --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/type_session_criterion.md @@ -0,0 +1,23 @@ +--- +description: Type Search Criterion +--- + +# Type Criterion + +The `Type` Search Criterion searches for sessions based on session type. + +## Arguments + +- `value` - string(s) representing the session type(s) + +## Example + +```php +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Type('content'); + +OR + +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\Type(['content', 'product']); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/updated_at_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/updated_at_session_criterion.md new file mode 100644 index 0000000000..5d120bab9f --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/updated_at_session_criterion.md @@ -0,0 +1,23 @@ +--- +description: UpdatedAt Search Criterion +--- + +# UpdatedAt Criterion + +The `UpdatedAt` Search Criterion searches for sessions based on the date they were updated. + +## Arguments + +- `value` - date to be matched, provided as a DateTimeInterface object +- `operator` - optional operator string (EQ, GT, GTE, LT, LTE) + +## Example + +```php +$criteria = new Ibexa\Contracts\Collaboration\Session\Query\Criterion\UpdatedAt( + new DateTime('2025-05-01 14:07:02'), + 'GTE' +); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/updated_at_session_sort_clause.md b/docs/search/collaborative_editing_search_reference/session/updated_at_session_sort_clause.md new file mode 100644 index 0000000000..7fd80dc04d --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/updated_at_session_sort_clause.md @@ -0,0 +1,19 @@ +--- +description: UpdatedAt Sort Clause +--- + +# UpdatedAt Sort Clause + +The `UpdatedAt` Sort Clause sorts search results by the date and time when session was updated. + +## Arguments + +- (optional) `direction` - SortDirection constant, either SortDirection::ASC or SortDirection::DESC. + +## Example + +```php +$sortClause = [new \Ibexa\Contracts\Collaboration\Session\Query\SortClause\UpdatedAt(SortDirection::DESC)]); + +$query = new SessionQuery($criteria, sortClause); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/user_id_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/user_id_session_criterion.md new file mode 100644 index 0000000000..4bae389868 --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/user_id_session_criterion.md @@ -0,0 +1,26 @@ +--- +description: UserID Search Criterion +--- + +# UserID Criterion + +The `UserID` Search Criterion searches for sessions based on internal participants. + +## Arguments + +- `value` - user(s) to be matched, provided as a UserReference object + +## Example + +```php +$user = $this->userService->loadUserByLogin('foo'); +$currentUser = $this->permissionResolver->getCurrentUserReference(); + +$criteria = new \Ibexa\Contracts\Collaboration\Session\Query\Criterion\UserId($user); + +OR + +$criteria = new \Ibexa\Contracts\Collaboration\Session\Query\Criterion\UserId(…[$user, $currentUser]); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/docs/search/collaborative_editing_search_reference/session/version_no_session_criterion.md b/docs/search/collaborative_editing_search_reference/session/version_no_session_criterion.md new file mode 100644 index 0000000000..a92f0114ae --- /dev/null +++ b/docs/search/collaborative_editing_search_reference/session/version_no_session_criterion.md @@ -0,0 +1,23 @@ +--- +description: VersionNo Search Criterion +--- + +# VersionNo Criterion + +The `VersionNo` Search Criterion searches for content sessions based on version number of content item. + +## Arguments + +- `value` - integer(s) representing version number(s) + +## Example + +```php +$criteria = new Ibexa\Share\Session\Query\Criterion\VersionNo(1); + +OR + +$criteria = new Ibexa\Share\Session\Query\Criterion\VersionNo([1, 2]); + +$query = new SessionQuery($criteria); +``` \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 264c8307ed..7ee38878db 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -274,6 +274,11 @@ nav: - Time field type: content_management/field_types/field_type_reference/timefield.md - URL field type: content_management/field_types/field_type_reference/urlfield.md - User field type: content_management/field_types/field_type_reference/userfield.md + - Collaborative editing: + - Collaborative editing: content_management/collaborative_editing/collaborative_editing.md + - Collaborative editing API: content_management/collaborative_editing/collaborative_editing_api.md + - Invitation API: content_management/collaborative_editing/invitation_api.md + - Session API: content_management/collaborative_editing/session_api.md - Templating: - Templating: templating/templating.md - Render content: @@ -652,6 +657,33 @@ nav: - ObjectNameCriterion: search/activity_log_search_reference/object_name_criterion.md - UserCriterion: search/activity_log_search_reference/user_criterion.md - Action Configuration Search Criteria: search/ai_actions_search_reference/action_configuration_criteria.md + - Collaborative editing Search Criteria: + - Session: + - ContentId: search/collaborative_editing_search_reference/session/content_id_session_criterion.md + - Content: search/collaborative_editing_search_reference/session/content_session_criterion.md + - CreatedAt: search/collaborative_editing_search_reference/session/created_at_session_criterion.md + - Email: search/collaborative_editing_search_reference/session/email_session_criterion.md + - Id: search/collaborative_editing_search_reference/session/id_session_criterion.md + - IsActive: search/collaborative_editing_search_reference/session/is_active_session_criterion.md + - LanguageId: search/collaborative_editing_search_reference/session/language_id_session_criterion.md + - LogicalAnd: search/collaborative_editing_search_reference/session/logical_and_session_criterion.md + - LogicalOr: search/collaborative_editing_search_reference/session/logical_or_session_criterion.md + - Owner: search/collaborative_editing_search_reference/session/owner_session_criterion.md + - Token: search/collaborative_editing_search_reference/session/token_session_criterion.md + - Type: search/collaborative_editing_search_reference/session/type_session_criterion.md + - UpdatedAt: search/collaborative_editing_search_reference/session/updated_at_session_criterion.md + - UserId: search/collaborative_editing_search_reference/session/user_id_session_criterion.md + - VersionNo: search/collaborative_editing_search_reference/session/version_no_session_criterion.md + - Invitation: + - CreatedAt: search/collaborative_editing_search_reference/invitation/created_at_invitation_criterion.md + - Id: search/collaborative_editing_search_reference/invitation/id_invitation_criterion.md + - Invitation Id: search/collaborative_editing_search_reference/invitation/invitation_id_invitation_criterion.md + - LogicalAnd: search/collaborative_editing_search_reference/invitation/logical_and_invitation_criterion.md + - LogicalOr: search/collaborative_editing_search_reference/invitation/logical_or_invitation_criterion.md + - Sender: search/collaborative_editing_search_reference/invitation/sender_invitation_criterion.md + - Session: search/collaborative_editing_search_reference/invitation/session_invitation_criterion.md + - Status: search/collaborative_editing_search_reference/invitation/status_invitation_criterion.md + - UpdatedAt: search/collaborative_editing_search_reference/invitation/updated_at_invitation_criterion.md - Sort Clause reference: - General Sort Clauses: - General Sort Clause reference: search/sort_clause_reference/sort_clause_reference.md @@ -718,6 +750,16 @@ nav: - Id Sort Clause: search/url_search_reference/id_url_sort_clause.md - Url Sort Clause: search/url_search_reference/url_url_sort_clause.md - Activity Log Sort Clauses: search/activity_log_search_reference/activity_log_sort_clauses.md + - Collaborative editing Sort Clauses: + - Session: + - CreatedAt: search/collaborative_editing_search_reference/session/created_at_session_sort_clause.md + - SessionId: search/collaborative_editing_search_reference/session/session_id_session_sort_clause.md + - UpdatedAt: search/collaborative_editing_search_reference/session/updated_at_session_sort_clause.md + - Invitation: + - CreatedAt: search/collaborative_editing_search_reference/invitation/created_at_invitation_sort_clause.md + - InvitationId: search/collaborative_editing_search_reference/invitation/invitation_id_invitation_sort_clause.md + - InvitationStatus: search/collaborative_editing_search_reference/invitation/invitation_status_invitation_sort_clause.md + - UpdatedAt: search/collaborative_editing_search_reference/invitation/updated_at_invitation_sort_clause.md - Action Configuration Sort Clauses: search/ai_actions_search_reference/action_configuration_sort_clauses.md - Aggregation reference: # Content aggregations