diff --git a/application/Espo/Modules/Crm/Resources/metadata/dashlets/Activities.json b/application/Espo/Modules/Crm/Resources/metadata/dashlets/Activities.json index d552b2179c..cc97a2007b 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/dashlets/Activities.json +++ b/application/Espo/Modules/Crm/Resources/metadata/dashlets/Activities.json @@ -25,13 +25,17 @@ "type": "int", "min": 0, "required": true + }, + "includeShared": { + "type": "bool" } }, "defaults": { "displayRecords": 10, "autorefreshInterval": 0.5, "futureDays": 3, - "enabledScopeList": ["Meeting", "Call", "Task"] + "enabledScopeList": ["Meeting", "Call", "Task"], + "includeShared": false }, "layout": [ { @@ -46,7 +50,7 @@ ], [ {"name": "futureDays"}, - false + {"name": "includeShared"} ] ] } diff --git a/application/Espo/Modules/Crm/Tools/Activities/Api/GetUpcoming.php b/application/Espo/Modules/Crm/Tools/Activities/Api/GetUpcoming.php index 2eb1af491e..8c2c289d0e 100644 --- a/application/Espo/Modules/Crm/Tools/Activities/Api/GetUpcoming.php +++ b/application/Espo/Modules/Crm/Tools/Activities/Api/GetUpcoming.php @@ -82,6 +82,7 @@ class GetUpcoming implements Action maxSize: $searchParams->getMaxSize(), futureDays: $futureDays, entityTypeList: $entityTypeList, + includeShared: $request->getQueryParam('includeShared') === 'true', ); } diff --git a/application/Espo/Modules/Crm/Tools/Activities/Upcoming/Params.php b/application/Espo/Modules/Crm/Tools/Activities/Upcoming/Params.php index ebdb5542e7..0a55acf78a 100644 --- a/application/Espo/Modules/Crm/Tools/Activities/Upcoming/Params.php +++ b/application/Espo/Modules/Crm/Tools/Activities/Upcoming/Params.php @@ -38,6 +38,7 @@ class Params readonly public ?int $offset = null, readonly public ?int $maxSize = null, readonly public ?int $futureDays = null, - readonly public ?array $entityTypeList = null + readonly public ?array $entityTypeList = null, + readonly public bool $includeShared = false, ) {} } diff --git a/application/Espo/Modules/Crm/Tools/Activities/UpcomingService.php b/application/Espo/Modules/Crm/Tools/Activities/UpcomingService.php index 2b676ce274..71d845a6e7 100644 --- a/application/Espo/Modules/Crm/Tools/Activities/UpcomingService.php +++ b/application/Espo/Modules/Crm/Tools/Activities/UpcomingService.php @@ -37,6 +37,7 @@ use Espo\Core\Name\Field; use Espo\Core\ORM\Entity as CoreEntity; use Espo\Core\Record\ServiceContainer; use Espo\Core\Select\Bool\Filters\OnlyMy; +use Espo\Core\Select\Bool\Filters\Shared; use Espo\Core\Utils\Config; use Espo\Core\Utils\DateTime as DateTimeUtil; use Espo\Core\Utils\Metadata; @@ -57,8 +58,10 @@ use Espo\Core\Select\Where\ConverterFactory as WhereConverterFactory; use Espo\Core\Select\SelectBuilderFactory; use Espo\ORM\Query\SelectBuilder; +use Exception; use PDO; use DateTime; +use RuntimeException; class UpcomingService { @@ -118,7 +121,7 @@ class UpcomingService continue; } - $queryList[] = $this->getEntityTypeQuery($entityType, $user, $futureDays); + $queryList[] = $this->getEntityTypeQuery($entityType, $user, $futureDays, $params->includeShared); } if ($queryList === []) { @@ -200,10 +203,14 @@ class UpcomingService * @throws Forbidden * @throws BadRequest */ - private function getEntityTypeQuery(string $entityType, User $user, int $futureDays): Select + private function getEntityTypeQuery(string $entityType, User $user, int $futureDays, bool $includeShared): Select { - $beforeString = (new DateTime())->modify('+' . $futureDays . ' days') - ->format(DateTimeUtil::SYSTEM_DATE_TIME_FORMAT); + try { + $beforeString = (new DateTime())->modify('+' . $futureDays . ' days') + ->format(DateTimeUtil::SYSTEM_DATE_TIME_FORMAT); + } catch (Exception $e) { + throw new RuntimeException($e->getMessage(), 0, $e); + } $builder = $this->selectBuilderFactory ->create() @@ -212,6 +219,10 @@ class UpcomingService ->withBoolFilter(OnlyMy::NAME) ->withStrictAccessControl(); + if ($includeShared && $this->metadata->get("scopes.$entityType.collaborators")) { + $builder->withBoolFilter(Shared::NAME); + } + $orderField = 'dateStart'; $primaryFilter = Planned::NAME; diff --git a/application/Espo/Resources/i18n/en_US/DashletOptions.json b/application/Espo/Resources/i18n/en_US/DashletOptions.json index 202247811b..ab45658832 100644 --- a/application/Espo/Resources/i18n/en_US/DashletOptions.json +++ b/application/Espo/Resources/i18n/en_US/DashletOptions.json @@ -19,7 +19,8 @@ "url": "URL", "dateFilter": "Date Filter", "text": "Text", - "folder": "Folder" + "folder": "Folder", + "includeShared": "Include Shared" }, "options": { "mode": { diff --git a/client/modules/crm/src/views/dashlets/activities.js b/client/modules/crm/src/views/dashlets/activities.js index 5f1c3dfd5e..f4e4fb1ab7 100644 --- a/client/modules/crm/src/views/dashlets/activities.js +++ b/client/modules/crm/src/views/dashlets/activities.js @@ -154,6 +154,10 @@ class ActivitiesDashletView extends BaseDashletView { this.collection.data.entityTypeList = this.scopeList; this.collection.data.futureDays = this.getOption('futureDays'); + if (this.getOption('includeShared')) { + this.collection.data.includeShared = true; + } + this.listenToOnce(this.collection, 'sync', () => { this.createView('list', 'crm:views/record/list-activities-dashlet', { selector: '> .list-container',