diff --git a/application/Espo/Classes/AssignmentNotificators/Email.php b/application/Espo/Classes/AssignmentNotificators/Email.php index 2b513b7804..b9920eedff 100644 --- a/application/Espo/Classes/AssignmentNotificators/Email.php +++ b/application/Espo/Classes/AssignmentNotificators/Email.php @@ -213,6 +213,10 @@ class Email implements AssignmentNotificator continue; } + if ($entity->getLinkMultipleColumn('users', EmailEntity::USERS_COLUMN_IS_READ, $userId)) { + continue; + } + if (!$this->userChecker->checkAssignment(EmailEntity::ENTITY_TYPE, $userId)) { continue; } diff --git a/application/Espo/Core/Utils/EmailFilterManager.php b/application/Espo/Core/Utils/EmailFilterManager.php index f7f753ba7c..7024466cbe 100644 --- a/application/Espo/Core/Utils/EmailFilterManager.php +++ b/application/Espo/Core/Utils/EmailFilterManager.php @@ -69,6 +69,7 @@ class EmailFilterManager [ EmailFilter::ACTION_SKIP, EmailFilter::ACTION_MOVE_TO_FOLDER, + EmailFilter::ACTION_NONE, ] ) ) diff --git a/application/Espo/Entities/EmailFilter.php b/application/Espo/Entities/EmailFilter.php index f413a1230b..c27dac4eb6 100644 --- a/application/Espo/Entities/EmailFilter.php +++ b/application/Espo/Entities/EmailFilter.php @@ -29,13 +29,16 @@ namespace Espo\Entities; -class EmailFilter extends \Espo\Core\ORM\Entity +use Espo\Core\ORM\Entity; + +class EmailFilter extends Entity { public const ENTITY_TYPE = 'EmailFilter'; public const ACTION_SKIP = 'Skip'; public const ACTION_MOVE_TO_FOLDER = 'Move to Folder'; public const ACTION_MOVE_TO_GROUP_FOLDER = 'Move to Group Folder'; + public const ACTION_NONE = 'None'; /** * @return self::ACTION_*|null @@ -55,6 +58,11 @@ class EmailFilter extends \Espo\Core\ORM\Entity return $this->get('groupEmailFolderId'); } + public function markAsRead(): bool + { + return (bool) $this->get('markAsRead'); + } + public function isGlobal(): bool { return (bool) $this->get('isGlobal'); diff --git a/application/Espo/Repositories/Email.php b/application/Espo/Repositories/Email.php index 2be0c844ed..181c87ffd2 100644 --- a/application/Espo/Repositories/Email.php +++ b/application/Espo/Repositories/Email.php @@ -45,7 +45,7 @@ use Espo\Repositories\EmailAddress as EmailAddressRepository; use Espo\Entities\EmailAddress; /** - * @extends Database<\Espo\Entities\Email> + * @extends Database */ class Email extends Database implements @@ -444,15 +444,20 @@ class Email extends Database implements $action = $filter->getAction(); if ($action === EmailFilter::ACTION_SKIP) { - $entity->setLinkMultipleColumn('users', 'inTrash', $userId, true); + $entity->setLinkMultipleColumn('users', EmailEntity::USERS_COLUMN_IN_TRASH, $userId, true); } else if ($action === EmailFilter::ACTION_MOVE_TO_FOLDER) { $folderId = $filter->getEmailFolderId(); if ($folderId) { - $entity->setLinkMultipleColumn('users', 'folderId', $userId, $folderId); + $entity + ->setLinkMultipleColumn('users', EmailEntity::USERS_COLUMN_FOLDER_ID, $userId, $folderId); } } + + if ($filter->markAsRead()) { + $entity->setLinkMultipleColumn('users', EmailEntity::USERS_COLUMN_IS_READ, $userId, true); + } } } } diff --git a/application/Espo/Resources/i18n/en_US/EmailFilter.json b/application/Espo/Resources/i18n/en_US/EmailFilter.json index a9f4d446b2..0d125d0e2d 100644 --- a/application/Espo/Resources/i18n/en_US/EmailFilter.json +++ b/application/Espo/Resources/i18n/en_US/EmailFilter.json @@ -7,7 +7,8 @@ "action": "Action", "isGlobal": "Is Global", "emailFolder": "Folder", - "groupEmailFolder": "Group Email Folder" + "groupEmailFolder": "Group Email Folder", + "markAsRead": "Mark as Read" }, "links": { "emailFolder": "Folder", @@ -19,6 +20,7 @@ }, "options": { "action": { + "None": "None", "Skip": "Ignore", "Move to Folder": "Put in Folder", "Move to Group Folder": "Put in Group Folder" diff --git a/application/Espo/Resources/layouts/EmailFilter/detail.json b/application/Espo/Resources/layouts/EmailFilter/detail.json index b866e056db..213acaf528 100644 --- a/application/Espo/Resources/layouts/EmailFilter/detail.json +++ b/application/Espo/Resources/layouts/EmailFilter/detail.json @@ -16,6 +16,9 @@ [ false, {"name": "groupEmailFolder"} ], + [ + false, {"name": "markAsRead"} + ], [ {"name": "subject", "fullWidth": true} ], diff --git a/application/Espo/Resources/layouts/EmailFilter/detailSmall.json b/application/Espo/Resources/layouts/EmailFilter/detailSmall.json index 5ae8ca83da..cdadeed45d 100644 --- a/application/Espo/Resources/layouts/EmailFilter/detailSmall.json +++ b/application/Espo/Resources/layouts/EmailFilter/detailSmall.json @@ -16,6 +16,9 @@ [ {"name": "groupEmailFolder"} ], + [ + {"name": "markAsRead"} + ], [ {"name": "from"} ], diff --git a/application/Espo/Resources/layouts/EmailFilter/filters.json b/application/Espo/Resources/layouts/EmailFilter/filters.json index 37604de5ee..a59f2cf3ca 100644 --- a/application/Espo/Resources/layouts/EmailFilter/filters.json +++ b/application/Espo/Resources/layouts/EmailFilter/filters.json @@ -1,6 +1,7 @@ [ "parent", "action", + "markAsRead", "createdBy", "createdAt" ] diff --git a/application/Espo/Resources/metadata/clientDefs/EmailFilter.json b/application/Espo/Resources/metadata/clientDefs/EmailFilter.json index d65324f37b..5710314fe0 100644 --- a/application/Espo/Resources/metadata/clientDefs/EmailFilter.json +++ b/application/Espo/Resources/metadata/clientDefs/EmailFilter.json @@ -7,6 +7,7 @@ "recordViews": { "list": "views/email-filter/record/list" }, + "inlineEditDisabled": true, "searchPanelDisabled": false, "menu": { "list": { @@ -82,6 +83,17 @@ } ] } + }, + "markAsRead": { + "visible": { + "conditionGroup": [ + { + "attribute": "parentType", + "type": "equals", + "value": "User" + } + ] + } } }, "options": { @@ -107,7 +119,8 @@ ], "optionList": [ "Skip", - "Move to Folder" + "Move to Folder", + "None" ] }, { diff --git a/application/Espo/Resources/metadata/entityDefs/EmailFilter.json b/application/Espo/Resources/metadata/entityDefs/EmailFilter.json index a3986430a4..d4786c6c8f 100644 --- a/application/Espo/Resources/metadata/entityDefs/EmailFilter.json +++ b/application/Espo/Resources/metadata/entityDefs/EmailFilter.json @@ -44,7 +44,8 @@ "options": [ "Skip", "Move to Folder", - "Move to Group Folder" + "Move to Group Folder", + "None" ], "view": "views/email-filter/fields/action" }, @@ -55,6 +56,9 @@ "groupEmailFolder": { "type": "link" }, + "markAsRead": { + "type": "bool" + }, "createdAt": { "type": "datetime", "readOnly": true diff --git a/application/Espo/Services/EmailFilter.php b/application/Espo/Services/EmailFilter.php index 4f81439508..ab6b97389b 100644 --- a/application/Espo/Services/EmailFilter.php +++ b/application/Espo/Services/EmailFilter.php @@ -93,6 +93,7 @@ class EmailFilter extends Record !in_array( $entity->getAction(), [ + EmailFilterEntity::ACTION_NONE, EmailFilterEntity::ACTION_SKIP, EmailFilterEntity::ACTION_MOVE_TO_FOLDER, ] diff --git a/client/src/handlers/email-filter.js b/client/src/handlers/email-filter.js index 16ccce15fa..a3b4a1d0ad 100644 --- a/client/src/handlers/email-filter.js +++ b/client/src/handlers/email-filter.js @@ -56,8 +56,7 @@ define('handlers/email-filter', ['dynamic-handler'], (Dep) => { } else if ( this.model.get('parentType') && - !this.recordView.options.duplicateSourceId && - this.model.get('parentType') !== 'User' + !this.recordView.options.duplicateSourceId ) { this.recordView.setFieldReadOnly('parent'); this.recordView.setFieldReadOnly('isGlobal'); @@ -69,11 +68,15 @@ define('handlers/email-filter', ['dynamic-handler'], (Dep) => { } if (value) { - this.model.set('action', 'Skip'); - this.model.set('parentType', null); - this.model.set('parentId', null); - this.model.set('emailFolderId', null); - this.model.set('groupEmailFolderId', null); + this.model.set({ + action: 'Skip', + parentName: null, + parentType: null, + parentId: null, + emailFolderId: null, + groupEmailFolderId: null, + markAsRead: false, + }); } }); @@ -84,10 +87,15 @@ define('handlers/email-filter', ['dynamic-handler'], (Dep) => { // Avoiding side effects. setTimeout(() => { + if (value !== 'User') { + this.model.set('markAsRead', false); + } + if (value === 'EmailAccount') { this.model.set('action', 'Skip'); this.model.set('emailFolderId', null); this.model.set('groupEmailFolderId', null); + this.model.set('markAsRead', false); return; }