From c681c3ba54a2c8e7793968357e786466d665ec7f Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Mon, 1 May 2023 14:21:27 +0300 Subject: [PATCH] event status treatment editable --- .../Select/Event/PrimaryFilters/Held.php | 13 ++- .../Select/Event/PrimaryFilters/Planned.php | 13 ++- .../Core/Templates/Metadata/Event/scopes.json | 2 + .../Select/Meeting/PrimaryFilters/Held.php | 13 ++- .../Select/Meeting/PrimaryFilters/Planned.php | 13 ++- .../ActualStartingNotInFuture.php | 29 ++--- .../Select/Task/PrimaryFilters/Completed.php | 17 +-- .../Select/Task/PrimaryFilters/Deferred.php | 4 +- .../Select/Task/PrimaryFilters/Overdue.php | 39 ++----- .../Resources/i18n/en_US/EntityManager.json | 10 +- .../Crm/Resources/metadata/app/calendar.json | 4 +- .../metadata/app/entityManagerParams.json | 107 +++++++++++++++++- .../Crm/Resources/metadata/scopes/Call.json | 2 + .../Resources/metadata/scopes/Meeting.json | 2 + .../Crm/Resources/metadata/scopes/Task.json | 2 + .../Modules/Crm/Tools/Calendar/Service.php | 19 +++- ...{history-status-list.js => status-list.js} | 4 +- .../crm/src/views/calendar/calendar.js | 40 +++---- .../crm/src/views/calendar/timeline.js | 42 ++++--- .../views/event/fields/name-for-history.js | 8 +- upgrades/7.5/scripts/AfterUpgrade.php | 11 +- 21 files changed, 253 insertions(+), 141 deletions(-) rename client/modules/crm/src/views/admin/entity-manager/fields/{history-status-list.js => status-list.js} (89%) diff --git a/application/Espo/Classes/Select/Event/PrimaryFilters/Held.php b/application/Espo/Classes/Select/Event/PrimaryFilters/Held.php index 4a9f9b8a75..092de13203 100644 --- a/application/Espo/Classes/Select/Event/PrimaryFilters/Held.php +++ b/application/Espo/Classes/Select/Event/PrimaryFilters/Held.php @@ -30,15 +30,20 @@ namespace Espo\Classes\Select\Event\PrimaryFilters; use Espo\Core\Select\Primary\Filter; -use Espo\Core\Templates\Entities\Event; +use Espo\Core\Utils\Metadata; use Espo\ORM\Query\SelectBuilder; class Held implements Filter { + public function __construct( + private string $entityType, + private Metadata $metadata + ) {} + public function apply(SelectBuilder $queryBuilder): void { - $queryBuilder->where([ - 'status' => Event::STATUS_HELD, - ]); + $statusList = $this->metadata->get(['scopes', $this->entityType, 'completedStatusList']) ?? []; + + $queryBuilder->where(['status' => $statusList]); } } diff --git a/application/Espo/Classes/Select/Event/PrimaryFilters/Planned.php b/application/Espo/Classes/Select/Event/PrimaryFilters/Planned.php index a3bc829a07..3f41c46d56 100644 --- a/application/Espo/Classes/Select/Event/PrimaryFilters/Planned.php +++ b/application/Espo/Classes/Select/Event/PrimaryFilters/Planned.php @@ -30,15 +30,20 @@ namespace Espo\Classes\Select\Event\PrimaryFilters; use Espo\Core\Select\Primary\Filter; -use Espo\Core\Templates\Entities\Event; +use Espo\Core\Utils\Metadata; use Espo\ORM\Query\SelectBuilder; class Planned implements Filter { + public function __construct( + private string $entityType, + private Metadata $metadata + ) {} + public function apply(SelectBuilder $queryBuilder): void { - $queryBuilder->where([ - 'status' => Event::STATUS_PLANNED, - ]); + $statusList = $this->metadata->get(['scopes', $this->entityType, 'activityStatusList']) ?? []; + + $queryBuilder->where(['status' => $statusList]); } } diff --git a/application/Espo/Core/Templates/Metadata/Event/scopes.json b/application/Espo/Core/Templates/Metadata/Event/scopes.json index 1eed84dd43..29430ac3ff 100644 --- a/application/Espo/Core/Templates/Metadata/Event/scopes.json +++ b/application/Espo/Core/Templates/Metadata/Event/scopes.json @@ -12,6 +12,8 @@ "notifications": true, "activityStatusList": ["Planned"], "historyStatusList": ["Held", "Not Held"], + "completedStatusList": ["Held"], + "canceledStatusList": ["Not Held"], "statusField": "status", "statusFieldLocked": true } diff --git a/application/Espo/Modules/Crm/Classes/Select/Meeting/PrimaryFilters/Held.php b/application/Espo/Modules/Crm/Classes/Select/Meeting/PrimaryFilters/Held.php index a8fc368b0a..e9e617d220 100644 --- a/application/Espo/Modules/Crm/Classes/Select/Meeting/PrimaryFilters/Held.php +++ b/application/Espo/Modules/Crm/Classes/Select/Meeting/PrimaryFilters/Held.php @@ -30,15 +30,20 @@ namespace Espo\Modules\Crm\Classes\Select\Meeting\PrimaryFilters; use Espo\Core\Select\Primary\Filter; -use Espo\Modules\Crm\Entities\Meeting; +use Espo\Core\Utils\Metadata; use Espo\ORM\Query\SelectBuilder; class Held implements Filter { + public function __construct( + private string $entityType, + private Metadata $metadata + ) {} + public function apply(SelectBuilder $queryBuilder): void { - $queryBuilder->where([ - 'status' => Meeting::STATUS_HELD, - ]); + $statusList = $this->metadata->get(['scopes', $this->entityType, 'completedStatusList']) ?? []; + + $queryBuilder->where(['status' => $statusList]); } } diff --git a/application/Espo/Modules/Crm/Classes/Select/Meeting/PrimaryFilters/Planned.php b/application/Espo/Modules/Crm/Classes/Select/Meeting/PrimaryFilters/Planned.php index 0bfc018f51..44b78c45be 100644 --- a/application/Espo/Modules/Crm/Classes/Select/Meeting/PrimaryFilters/Planned.php +++ b/application/Espo/Modules/Crm/Classes/Select/Meeting/PrimaryFilters/Planned.php @@ -30,15 +30,20 @@ namespace Espo\Modules\Crm\Classes\Select\Meeting\PrimaryFilters; use Espo\Core\Select\Primary\Filter; -use Espo\Modules\Crm\Entities\Meeting; +use Espo\Core\Utils\Metadata; use Espo\ORM\Query\SelectBuilder; class Planned implements Filter { + public function __construct( + private string $entityType, + private Metadata $metadata + ) {} + public function apply(SelectBuilder $queryBuilder): void { - $queryBuilder->where([ - 'status' => Meeting::STATUS_PLANNED, - ]); + $statusList = $this->metadata->get(['scopes', $this->entityType, 'activityStatusList']) ?? []; + + $queryBuilder->where(['status' => $statusList]); } } diff --git a/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/ActualStartingNotInFuture.php b/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/ActualStartingNotInFuture.php index 0877db0ec1..863330fd7b 100644 --- a/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/ActualStartingNotInFuture.php +++ b/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/ActualStartingNotInFuture.php @@ -33,36 +33,21 @@ use Espo\Entities\User; use Espo\ORM\Query\SelectBuilder; use Espo\ORM\Query\Part\Condition as Cond; - use Espo\Core\Select\Primary\Filter; use Espo\Core\Select\Helpers\UserTimeZoneProvider; use Espo\Core\Select\Where\Item; use Espo\Core\Select\Where\ConverterFactory; use Espo\Core\Utils\Metadata; - use Espo\Modules\Crm\Entities\Task; class ActualStartingNotInFuture implements Filter { - private $user; - - private $userTimeZoneProvider; - - private $metadata; - - private $converterFactory; - public function __construct( - User $user, - UserTimeZoneProvider $userTimeZoneProvider, - Metadata $metadata, - ConverterFactory $converterFactory - ) { - $this->user = $user; - $this->userTimeZoneProvider = $userTimeZoneProvider; - $this->metadata = $metadata; - $this->converterFactory = $converterFactory; - } + private User $user, + private UserTimeZoneProvider $userTimeZoneProvider, + private Metadata $metadata, + private ConverterFactory $converterFactory + ) {} public function apply(SelectBuilder $queryBuilder): void { @@ -91,7 +76,7 @@ class ActualStartingNotInFuture implements Filter $converter->convert( $queryBuilder, Item::fromRaw([ - 'type' => 'past', + 'type' => Item\Type::PAST, 'attribute' => 'dateStart', 'timeZone' => $this->userTimeZoneProvider->get(), 'dateTime' => true, @@ -100,7 +85,7 @@ class ActualStartingNotInFuture implements Filter $converter->convert( $queryBuilder, Item::fromRaw([ - 'type' => 'today', + 'type' => Item\Type::TODAY, 'attribute' => 'dateStart', 'timeZone' => $this->userTimeZoneProvider->get(), 'dateTime' => true, diff --git a/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Completed.php b/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Completed.php index db8b0a20c0..2f27953473 100644 --- a/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Completed.php +++ b/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Completed.php @@ -29,20 +29,21 @@ namespace Espo\Modules\Crm\Classes\Select\Task\PrimaryFilters; +use Espo\Core\Utils\Metadata; +use Espo\Modules\Crm\Entities\Task; use Espo\ORM\Query\SelectBuilder; -use Espo\ORM\Query\Part\Condition as Cond; - use Espo\Core\Select\Primary\Filter; class Completed implements Filter { + public function __construct( + private Metadata $metadata + ) {} + public function apply(SelectBuilder $queryBuilder): void { - $queryBuilder->where( - Cond::equal( - Cond::column('status'), - 'Completed' - ) - ); + $statusList = $this->metadata->get(['scopes', Task::ENTITY_TYPE, 'completedStatusList']) ?? []; + + $queryBuilder->where(['status' => $statusList]); } } diff --git a/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Deferred.php b/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Deferred.php index 95c5183f56..72b8e1817b 100644 --- a/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Deferred.php +++ b/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Deferred.php @@ -29,9 +29,9 @@ namespace Espo\Modules\Crm\Classes\Select\Task\PrimaryFilters; +use Espo\Modules\Crm\Entities\Task; use Espo\ORM\Query\SelectBuilder; use Espo\ORM\Query\Part\Condition as Cond; - use Espo\Core\Select\Primary\Filter; class Deferred implements Filter @@ -41,7 +41,7 @@ class Deferred implements Filter $queryBuilder->where( Cond::equal( Cond::column('status'), - 'Deferred' + Task::STATUS_DEFERRED ) ); } diff --git a/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Overdue.php b/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Overdue.php index ccf86c5191..24520781a0 100644 --- a/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Overdue.php +++ b/application/Espo/Modules/Crm/Classes/Select/Task/PrimaryFilters/Overdue.php @@ -30,52 +30,33 @@ namespace Espo\Modules\Crm\Classes\Select\Task\PrimaryFilters; use Espo\Entities\User; - use Espo\ORM\Query\SelectBuilder; use Espo\ORM\Query\Part\Condition as Cond; - use Espo\Core\Select\Primary\Filter; use Espo\Core\Select\Helpers\UserTimeZoneProvider; use Espo\Core\Select\Where\Item; use Espo\Core\Select\Where\ConverterFactory; use Espo\Core\Utils\Metadata; - use Espo\Modules\Crm\Entities\Task; class Overdue implements Filter { - private $user; - - private $userTimeZoneProvider; - - private $metadata; - - private $converterFactory; - public function __construct( - User $user, - UserTimeZoneProvider $userTimeZoneProvider, - Metadata $metadata, - ConverterFactory $converterFactory - ) { - $this->user = $user; - $this->userTimeZoneProvider = $userTimeZoneProvider; - $this->metadata = $metadata; - $this->converterFactory = $converterFactory; - } + private User $user, + private UserTimeZoneProvider $userTimeZoneProvider, + private Metadata $metadata, + private ConverterFactory $converterFactory + ) {} public function apply(SelectBuilder $queryBuilder): void { - $notActualStatusList = - array_filter( - $this->metadata->get(['entityDefs', 'Task', 'fields', 'status', 'notActualOptions']) ?? [], - function (string $item) { - return $item !== 'Deferred'; - } - ); + $notActualStatusList = array_filter( + $this->metadata->get(['entityDefs', 'Task', 'fields', 'status', 'notActualOptions']) ?? [], + fn(string $item) => $item !== Task::STATUS_DEFERRED + ); $pastItem = Item::fromRaw([ - 'type' => 'past', + 'type' => Item\Type::PAST, 'attribute' => 'dateEnd', 'timeZone' => $this->userTimeZoneProvider->get(), 'dateTime' => true, diff --git a/application/Espo/Modules/Crm/Resources/i18n/en_US/EntityManager.json b/application/Espo/Modules/Crm/Resources/i18n/en_US/EntityManager.json index f6871841aa..24a39e65e0 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/en_US/EntityManager.json +++ b/application/Espo/Modules/Crm/Resources/i18n/en_US/EntityManager.json @@ -1,8 +1,14 @@ { "fields": { - "historyStatusList": "History Statuses" + "activityStatusList": "Activity Statuses", + "historyStatusList": "History Statuses", + "completedStatusList": "Completed Statues", + "canceledStatusList": "Canceled Statues" }, "tooltips": { - "historyStatusList": "Status values determining that a record should be displayed in the History panel." + "activityStatusList": "Status values determining that an activity record should be displayed in the Activity panel and considered as actual.", + "historyStatusList": "Status values determining that an activity record should be displayed in the History panel.", + "completedStatusList": "Status values determining that an activity is completed.", + "canceledStatusList": "Status values determining that an activity is canceled and won't be taken into account in free/busy ranges." } } diff --git a/application/Espo/Modules/Crm/Resources/metadata/app/calendar.json b/application/Espo/Modules/Crm/Resources/metadata/app/calendar.json index 0c2a686ed1..307e732daa 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/app/calendar.json +++ b/application/Espo/Modules/Crm/Resources/metadata/app/calendar.json @@ -1,7 +1,5 @@ { "additionalAttributeList": [ "color" - ], - "canceledStatusList": ["Not Held", "Canceled"], - "completedStatusList": ["Held", "Completed"] + ] } diff --git a/application/Espo/Modules/Crm/Resources/metadata/app/entityManagerParams.json b/application/Espo/Modules/Crm/Resources/metadata/app/entityManagerParams.json index 6c25a05dcd..477d455ee5 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/app/entityManagerParams.json +++ b/application/Espo/Modules/Crm/Resources/metadata/app/entityManagerParams.json @@ -1,34 +1,135 @@ { "Meeting": { + "activityStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" + } + }, "historyStatusList": { "location": "scopes", "fieldDefs": { "type": "multiEnum", "required": true, "tooltip": true, - "view": "crm:views/admin/entity-manager/fields/history-status-list" + "view": "crm:views/admin/entity-manager/fields/status-list" + } + }, + "completedStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" + } + }, + "canceledStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" } } }, "Call": { + "activityStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" + } + }, "historyStatusList": { "location": "scopes", "fieldDefs": { "type": "multiEnum", "required": true, "tooltip": true, - "view": "crm:views/admin/entity-manager/fields/history-status-list" + "view": "crm:views/admin/entity-manager/fields/status-list" + } + }, + "completedStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" + } + }, + "canceledStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" + } + } + }, + "Task": { + "completedStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" + } + }, + "canceledStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" } } }, "@Event": { + "activityStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" + } + }, "historyStatusList": { "location": "scopes", "fieldDefs": { "type": "multiEnum", "required": true, "tooltip": true, - "view": "crm:views/admin/entity-manager/fields/history-status-list" + "view": "crm:views/admin/entity-manager/fields/status-list" + } + }, + "completedStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" + } + }, + "canceledStatusList": { + "location": "scopes", + "fieldDefs": { + "type": "multiEnum", + "required": true, + "tooltip": true, + "view": "crm:views/admin/entity-manager/fields/status-list" } } } diff --git a/application/Espo/Modules/Crm/Resources/metadata/scopes/Call.json b/application/Espo/Modules/Crm/Resources/metadata/scopes/Call.json index 84282589c4..2e384f29b1 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/scopes/Call.json +++ b/application/Espo/Modules/Crm/Resources/metadata/scopes/Call.json @@ -13,6 +13,8 @@ "object": true, "activityStatusList": ["Planned"], "historyStatusList": ["Held", "Not Held"], + "completedStatusList": ["Held"], + "canceledStatusList": ["Not Held"], "statusField": "status", "statusFieldLocked": true } diff --git a/application/Espo/Modules/Crm/Resources/metadata/scopes/Meeting.json b/application/Espo/Modules/Crm/Resources/metadata/scopes/Meeting.json index c6e3dce78c..0a60987eeb 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/scopes/Meeting.json +++ b/application/Espo/Modules/Crm/Resources/metadata/scopes/Meeting.json @@ -14,6 +14,8 @@ "object": true, "activityStatusList": ["Planned"], "historyStatusList": ["Held", "Not Held"], + "completedStatusList": ["Held"], + "canceledStatusList": ["Not Held"], "statusField": "status", "statusFieldLocked": true } diff --git a/application/Espo/Modules/Crm/Resources/metadata/scopes/Task.json b/application/Espo/Modules/Crm/Resources/metadata/scopes/Task.json index 08b7820f88..5d3e88fb50 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/scopes/Task.json +++ b/application/Espo/Modules/Crm/Resources/metadata/scopes/Task.json @@ -7,6 +7,8 @@ "aclPortalLevelList": ["all", "account", "contact", "own", "no"], "activityStatusList": ["Not Started", "Started"], "historyStatusList": ["Completed"], + "completedStatusList": ["Completed"], + "canceledStatusList": ["Canceled"], "module": "Crm", "customizable": true, "importable": true, diff --git a/application/Espo/Modules/Crm/Tools/Calendar/Service.php b/application/Espo/Modules/Crm/Tools/Calendar/Service.php index b99aab0e2f..d4c54a4bcf 100644 --- a/application/Espo/Modules/Crm/Tools/Calendar/Service.php +++ b/application/Espo/Modules/Crm/Tools/Calendar/Service.php @@ -62,6 +62,8 @@ use RuntimeException; class Service { private const BUSY_RANGES_MAX_RANGE_DAYS = 10; + /** @var array */ + private array $entityTypeCanceledStatusListCacheMap = []; public function __construct( private EntityManager $entityManager, @@ -757,8 +759,6 @@ class Service } } - $canceledStatusList = $this->metadata->get(['app', 'calendar', 'canceledStatusList']) ?? []; - foreach ($eventList as $event) { if (!$event instanceof Event) { continue; @@ -773,7 +773,7 @@ class Service continue; } - if (in_array($status, $canceledStatusList)) { + if (in_array($status, $this->getEntityTypeCanceledStatusList($event->getEntityType()))) { continue; } @@ -850,7 +850,18 @@ class Service } /** - * @return array + * @return string[] + */ + private function getEntityTypeCanceledStatusList(string $entityType): array + { + $this->entityTypeCanceledStatusListCacheMap[$entityType] ??= + $this->metadata->get(['scopes', $entityType, 'canceledStatusList']) ?? []; + + return $this->entityTypeCanceledStatusListCacheMap[$entityType]; + } + + /** + * @return array */ private function getWorkingRangeList(WorkingCalendar $calendar, FetchParams $fetchParams): array { diff --git a/client/modules/crm/src/views/admin/entity-manager/fields/history-status-list.js b/client/modules/crm/src/views/admin/entity-manager/fields/status-list.js similarity index 89% rename from client/modules/crm/src/views/admin/entity-manager/fields/history-status-list.js rename to client/modules/crm/src/views/admin/entity-manager/fields/status-list.js index a143b863be..2974bdf6f0 100644 --- a/client/modules/crm/src/views/admin/entity-manager/fields/history-status-list.js +++ b/client/modules/crm/src/views/admin/entity-manager/fields/status-list.js @@ -26,7 +26,7 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -define('crm:views/admin/entity-manager/fields/history-status-list', ['views/fields/multi-enum'], function (Dep) { +define('crm:views/admin/entity-manager/fields/status-list', ['views/fields/multi-enum'], function (Dep) { return Dep.extend({ @@ -36,8 +36,6 @@ define('crm:views/admin/entity-manager/fields/history-status-list', ['views/fiel this.params.options = Espo.Utils.clone( this.getMetadata().get(['entityDefs', entityType, 'fields', 'status', 'options'])) || []; - this.params.options = this.params.options.filter(item => item !== 'Planned'); - this.params.translation = `${entityType}.options.status`; }, }); diff --git a/client/modules/crm/src/views/calendar/calendar.js b/client/modules/crm/src/views/calendar/calendar.js index 307861ab29..58d703194f 100644 --- a/client/modules/crm/src/views/calendar/calendar.js +++ b/client/modules/crm/src/views/calendar/calendar.js @@ -33,21 +33,11 @@ define('crm:views/calendar/calendar', ['view', 'lib!full-calendar'], function (D template: 'crm:calendar/calendar', eventAttributes: [], - colors: {}, - allDayScopeList: ['Task'], - scopeList: ['Meeting', 'Call', 'Task'], - - canceledStatusList: [], - - completedStatusList: [], - header: true, - modeList: [], - fullCalendarModeList: [ 'month', 'agendaWeek', @@ -56,11 +46,8 @@ define('crm:views/calendar/calendar', ['view', 'lib!full-calendar'], function (D 'basicDay', 'listWeek', ], - defaultMode: 'agendaWeek', - slotDuration: 30, - titleFormat: { month: 'MMMM YYYY', week: 'MMMM YYYY', @@ -133,10 +120,6 @@ define('crm:views/calendar/calendar', ['view', 'lib!full-calendar'], function (D .clone(this.getMetadata().get('clientDefs.Calendar.colors') || this.colors); this.modeList = this.getMetadata() .get('clientDefs.Calendar.modeList') || this.modeList; - this.canceledStatusList = this.getMetadata() - .get('app.calendar.canceledStatusList') || this.canceledStatusList; - this.completedStatusList = this.getMetadata() - .get('app.calendar.completedStatusList') || this.completedStatusList; this.scopeList = this.getConfig() .get('calendarEntityList') || Espo.Utils.clone(this.scopeList); this.allDayScopeList = this.getMetadata() @@ -424,6 +407,22 @@ define('crm:views/calendar/calendar', ['view', 'lib!full-calendar'], function (D return event; }, + /** + * @param {string} scope + * @return {string[]} + */ + getEventTypeCompletedStatusList: function (scope) { + return this.getMetadata().get(['scopes', scope, 'completedStatusList']) || []; + }, + + /** + * @param {string} scope + * @return {string[]} + */ + getEventTypeCanceledStatusList: function (scope) { + return this.getMetadata().get(['scopes', scope, 'canceledStatusList']) || []; + }, + fillColor: function (event) { let color = this.colors[event.scope]; @@ -437,7 +436,10 @@ define('crm:views/calendar/calendar', ['view', 'lib!full-calendar'], function (D if ( color && - ~this.completedStatusList.indexOf(event.status) || ~this.canceledStatusList.indexOf(event.status) + ( + this.getEventTypeCompletedStatusList(event.scope).includes(event.status) || + this.getEventTypeCanceledStatusList(event.scope).includes(event.status) + ) ) { color = this.shadeColor(color, 0.4); } @@ -446,7 +448,7 @@ define('crm:views/calendar/calendar', ['view', 'lib!full-calendar'], function (D }, handleStatus: function (event) { - if (~this.canceledStatusList.indexOf(event.status)) { + if (this.getEventTypeCanceledStatusList(event.scope).includes(event.status)) { event.className = ['event-canceled']; } else { event.className = []; diff --git a/client/modules/crm/src/views/calendar/timeline.js b/client/modules/crm/src/views/calendar/timeline.js index 732eb0f2c3..b44a5215e7 100644 --- a/client/modules/crm/src/views/calendar/timeline.js +++ b/client/modules/crm/src/views/calendar/timeline.js @@ -33,33 +33,17 @@ define('crm:views/calendar/timeline', ['view', 'lib!vis'], function (Dep, Vis) { template: 'crm:calendar/timeline', eventAttributes: [], - colors: {}, - scopeList: [], - - canceledStatusList: [], - - completedStatusList: [], - header: true, - modeList: [], - defaultMode: 'timeline', - maxRange: 120, - rangeMarginThreshold: 12 * 3600, - leftMargin: 24 * 3600, - rightMargin: 48 * 3600, - calendarType: 'single', - calendarTypeList: ['single', 'shared'], - zoomPercentage: 1, data: function () { @@ -150,10 +134,6 @@ define('crm:views/calendar/timeline', ['view', 'lib!vis'], function (Dep, Vis) { .clone(this.getMetadata().get('clientDefs.Calendar.colors') || this.colors || {}); this.modeList = this.getMetadata() .get('clientDefs.Calendar.modeList') || this.modeList || []; - this.canceledStatusList = this.getMetadata() - .get('app.calendar.canceledStatusList') || this.canceledStatusList || []; - this.completedStatusList = this.getMetadata() - .get('app.calendar.completedStatusList') || this.completedStatusList || []; this.scopeList = this.getConfig() .get('calendarEntityList') || Espo.Utils.clone(this.scopeList) || []; this.allDayScopeList = this.getMetadata() @@ -509,6 +489,22 @@ define('crm:views/calendar/timeline', ['view', 'lib!vis'], function (Dep, Vis) { return event; }, + /** + * @param {string} scope + * @return {string[]} + */ + getEventTypeCompletedStatusList: function (scope) { + return this.getMetadata().get(['scopes', scope, 'completedStatusList']) || []; + }, + + /** + * @param {string} scope + * @return {string[]} + */ + getEventTypeCanceledStatusList: function (scope) { + return this.getMetadata().get(['scopes', scope, 'canceledStatusList']) || []; + }, + fillColor: function (event) { let key = event.scope; @@ -529,8 +525,8 @@ define('crm:views/calendar/timeline', ['view', 'lib!vis'], function (Dep, Vis) { if ( event.status && ( - ~this.completedStatusList.indexOf(event.status) || - ~this.canceledStatusList.indexOf(event.status) + this.getEventTypeCompletedStatusList(event.scope).includes(event.status) || + this.getEventTypeCanceledStatusList(event.scope).includes(event.status) ) ) { color = this.shadeColor(color, 0.4); @@ -542,7 +538,7 @@ define('crm:views/calendar/timeline', ['view', 'lib!vis'], function (Dep, Vis) { }, handleStatus: function (event) { - if (~this.canceledStatusList.indexOf(event.status)) { + if (this.getEventTypeCanceledStatusList(event.scope).includes(event.status)) { event.className += ' event-canceled'; } }, diff --git a/client/src/views/event/fields/name-for-history.js b/client/src/views/event/fields/name-for-history.js index d289898c8c..23c9208e26 100644 --- a/client/src/views/event/fields/name-for-history.js +++ b/client/src/views/event/fields/name-for-history.js @@ -33,13 +33,13 @@ define('views/event/fields/name-for-history', ['views/fields/varchar'], function listLinkTemplate: 'event/fields/name-for-history/list-link', data: function () { - var data = Dep.prototype.data.call(this); + let data = Dep.prototype.data.call(this); - var status = this.model.get('status'); + let status = this.model.get('status'); - var canceledStatusList = this.getMetadata().get('app.calendar.canceledStatusList') || []; + let canceledStatusList = this.getMetadata().get(['scopes', this.model.entityType, 'canceledStatusList']); - data.strikethrough = !!~canceledStatusList.indexOf(status); + data.strikethrough = canceledStatusList.includes(status); return data; }, diff --git a/upgrades/7.5/scripts/AfterUpgrade.php b/upgrades/7.5/scripts/AfterUpgrade.php index dec9828abf..bddf746a3c 100644 --- a/upgrades/7.5/scripts/AfterUpgrade.php +++ b/upgrades/7.5/scripts/AfterUpgrade.php @@ -65,11 +65,16 @@ class AfterUpgrade $toSave = true; - $data = $metadata->getCustom('selectDefs', $entityType); + $data1 = $metadata->getCustom('selectDefs', $entityType); + $data1->primaryFilterClassNameMap = $primaryFilterClassNameMap; - $data->primaryFilterClassNameMap = $primaryFilterClassNameMap; + $metadata->saveCustom('selectDefs', $entityType, $data1); - $metadata->saveCustom('selectDefs', $entityType, $data); + $data2 = $metadata->getCustom('scopes', $entityType); + $data2->completedStatusList = ['Held']; + $data2->canceledStatusList = ['Not Held']; + + $metadata->saveCustom('scopes', $entityType, $data2); } if ($toSave) {