diff --git a/application/Espo/Controllers/EmailFolder.php b/application/Espo/Controllers/EmailFolder.php new file mode 100644 index 0000000000..37b7edd410 --- /dev/null +++ b/application/Espo/Controllers/EmailFolder.php @@ -0,0 +1,36 @@ +filtersMatcher; } - public function getAction(Email $email, $userId) + public function getMatchingFilter(Email $email, $userId) { if (!array_key_exists($userId, $this->data)) { $emailFilterList = $this->getEntityManager()->getRepository('EmailFilter')->where(array( @@ -69,7 +69,7 @@ class EmailFilterManager } foreach ($this->data[$userId] as $emailFilter) { if ($this->getFiltersMatcher()->match($email, $emailFilter)) { - return $emailFilter->get('action'); + return $emailFilter; } } } diff --git a/application/Espo/Entities/EmailFolder.php b/application/Espo/Entities/EmailFolder.php new file mode 100644 index 0000000000..2dccd653bd --- /dev/null +++ b/application/Espo/Entities/EmailFolder.php @@ -0,0 +1,36 @@ +get('isBeingImported')) { foreach ($entity->getLinkMultipleIdList('users') as $userId) { - $action = $this->getEmailFilterManager()->getAction($entity, $userId); - if ($action === 'Skip') { - $entity->setLinkMultipleColumn('users', 'inTrash', $userId, true); + $filter = $this->getEmailFilterManager()->getMatchingFilter($entity, $userId); + if ($filter) { + $action = $filter->get('action'); + if ($action === 'Skip') { + $entity->setLinkMultipleColumn('users', 'inTrash', $userId, true); + } else if ($action === 'Move to Folder') { + $folderId = $filter->get('folderId'); + if ($folderId) { + $entity->setLinkMultipleColumn('users', 'folderId', $userId, $folderId); + } + } } } } diff --git a/application/Espo/Resources/i18n/en_US/Email.json b/application/Espo/Resources/i18n/en_US/Email.json index cdb4aee44e..b5e300bd25 100644 --- a/application/Espo/Resources/i18n/en_US/Email.json +++ b/application/Espo/Resources/i18n/en_US/Email.json @@ -30,7 +30,8 @@ "isNotReplied": "Is Not Replied", "isUsers": "Is User's", "inTrash": "In Trash", - "sentBy": "Sent by (User)" + "sentBy": "Sent by (User)", + "folder": "Folder" }, "links": { "replied": "Replied", @@ -70,7 +71,8 @@ "Unmark Importance": "Unmark Importance", "Move to Trash": "Move to Trash", "Retrieve from Trash": "Retrieve from Trash", - "Filters": "Filters" + "Filters": "Filters", + "Folders": "Folders" }, "messages": { "noSmtpSetup": "No SMTP setup. {link}.", diff --git a/application/Espo/Resources/i18n/en_US/EmailFolder.json b/application/Espo/Resources/i18n/en_US/EmailFolder.json new file mode 100644 index 0000000000..a522d4c896 --- /dev/null +++ b/application/Espo/Resources/i18n/en_US/EmailFolder.json @@ -0,0 +1,8 @@ +{ + "fields": { + "skipNotifications": "Skip Notifications" + }, + "labels": { + "Create EmailFolder": "Create Folder" + } +} diff --git a/application/Espo/Resources/i18n/en_US/Global.json b/application/Espo/Resources/i18n/en_US/Global.json index 1ee2d900a1..c62aceec10 100644 --- a/application/Espo/Resources/i18n/en_US/Global.json +++ b/application/Espo/Resources/i18n/en_US/Global.json @@ -20,7 +20,8 @@ "EmailFilter": "Email Filter", "Portal": "Portal", "PortalRole": "Portal Role", - "Attachment": "Attachment" + "Attachment": "Attachment", + "EmailFolder": "Email Folder" }, "scopeNamesPlural": { "Email": "Emails", @@ -43,7 +44,8 @@ "EmailFilter": "Email Filters", "Portal": "Portals", "PortalRole": "Portal Roles", - "Attachment": "Attachments" + "Attachment": "Attachments", + "EmailFolder": "Email Folders" }, "labels": { "Misc": "Misc", diff --git a/application/Espo/Resources/metadata/app/acl.json b/application/Espo/Resources/metadata/app/acl.json index fcc1fab226..77229927ae 100644 --- a/application/Espo/Resources/metadata/app/acl.json +++ b/application/Espo/Resources/metadata/app/acl.json @@ -44,6 +44,12 @@ "delete": "own", "create": "yes" }, + "EmailFolder": { + "read": "own", + "edit": "own", + "delete": "own", + "create": "yes" + }, "Preferences": { "read": "own", "edit": "own", @@ -67,6 +73,9 @@ }, "User": { "gender": false + }, + "EmailFolder": { + "assignedUser": false } } }, diff --git a/application/Espo/Resources/metadata/app/aclPortal.json b/application/Espo/Resources/metadata/app/aclPortal.json index 34bc1fa09e..b6fbf8befb 100644 --- a/application/Espo/Resources/metadata/app/aclPortal.json +++ b/application/Espo/Resources/metadata/app/aclPortal.json @@ -33,6 +33,7 @@ "Role": false, "PortalRole": false, "EmailFilter": false, + "EmailFolder": false, "EmailAccount": false, "EmailTemplate": false, "Preferences": { diff --git a/application/Espo/Resources/metadata/clientDefs/Email.json b/application/Espo/Resources/metadata/clientDefs/Email.json index 1b9aca8c17..f358761375 100644 --- a/application/Espo/Resources/metadata/clientDefs/Email.json +++ b/application/Espo/Resources/metadata/clientDefs/Email.json @@ -41,6 +41,10 @@ "acl": "read", "aclScope": "EmailTemplate" }, + { + "label": "Folders", + "link": "#EmailFolder" + }, { "label": "Filters", "link": "#EmailFilter" diff --git a/application/Espo/Resources/metadata/clientDefs/EmailFolder.json b/application/Espo/Resources/metadata/clientDefs/EmailFolder.json new file mode 100644 index 0000000000..9e3921c52f --- /dev/null +++ b/application/Espo/Resources/metadata/clientDefs/EmailFolder.json @@ -0,0 +1,6 @@ +{ + "controller": "controllers/record", + "recordViews": { + }, + "searchPanelDisabled": true +} diff --git a/application/Espo/Resources/metadata/entityDefs/Email.json b/application/Espo/Resources/metadata/entityDefs/Email.json index fac6654d22..2e0d220bb4 100644 --- a/application/Espo/Resources/metadata/entityDefs/Email.json +++ b/application/Espo/Resources/metadata/entityDefs/Email.json @@ -95,6 +95,11 @@ "notStorable": true, "default": false }, + "folder": { + "type": "link", + "notStorable": true, + "readOnly": true + }, "nameHash": { "type": "text", "notStorable": true, @@ -241,7 +246,8 @@ "layoutMassUpdateDisabled": true, "readOnly": true, "columns": { - "inTrash": "usersInTrash" + "inTrash": "inTrash", + "folderId": "folderId" } }, "assignedUsers": { @@ -290,6 +296,11 @@ "inTrash": { "type": "bool", "default": false + }, + "folderId": { + "type": "varchar", + "default": null, + "maxLength": 24 } } }, diff --git a/application/Espo/Resources/metadata/entityDefs/EmailFolder.json b/application/Espo/Resources/metadata/entityDefs/EmailFolder.json new file mode 100644 index 0000000000..e4167980d8 --- /dev/null +++ b/application/Espo/Resources/metadata/entityDefs/EmailFolder.json @@ -0,0 +1,50 @@ +{ + "fields": { + "name": { + "type": "varchar", + "required": true, + "maxLength": 64, + "trim": true + }, + "order": { + "type": "int" + }, + "assignedUser": { + "type": "link" + }, + "createdAt": { + "type": "datetime", + "readOnly": true + }, + "modifiedAt": { + "type": "datetime", + "readOnly": true + }, + "createdBy": { + "type": "link", + "readOnly": true + }, + "modifiedBy": { + "type": "link", + "readOnly": true + } + }, + "links": { + "createdBy": { + "type": "belongsTo", + "entity": "User" + }, + "modifiedBy": { + "type": "belongsTo", + "entity": "User" + }, + "assignedUser": { + "type": "belongsTo", + "entity": "User" + } + }, + "collection": { + "sortBy": "order", + "asc": true + } +} diff --git a/application/Espo/SelectManagers/Email.php b/application/Espo/SelectManagers/Email.php index 36753b4796..39cf61ac1e 100644 --- a/application/Espo/SelectManagers/Email.php +++ b/application/Espo/SelectManagers/Email.php @@ -63,6 +63,7 @@ class Email extends \Espo\Core\SelectManagers\Base $result['additionalSelectColumns']['usersMiddle.is_read'] = 'isRead'; $result['additionalSelectColumns']['usersMiddle.is_important'] = 'isImportant'; $result['additionalSelectColumns']['usersMiddle.in_trash'] = 'inTrash'; + $result['additionalSelectColumns']['usersMiddle.folder_id'] = 'folderId'; } } @@ -74,7 +75,8 @@ class Email extends \Espo\Core\SelectManagers\Base $idList[] = $ea->id; } $d = array( - 'usersMiddle.inTrash=' => false + 'usersMiddle.inTrash=' => false, + 'usersMiddle.folderId' => null ); if (!empty($idList)) { $d['fromEmailAddressId!='] = $idList; diff --git a/application/Espo/SelectManagers/EmailFolder.php b/application/Espo/SelectManagers/EmailFolder.php new file mode 100644 index 0000000000..93bbcc15ef --- /dev/null +++ b/application/Espo/SelectManagers/EmailFolder.php @@ -0,0 +1,39 @@ +accessOnlyOwn($result); + } +} + diff --git a/application/Espo/Services/EmailFolder.php b/application/Espo/Services/EmailFolder.php new file mode 100644 index 0000000000..3e89542d22 --- /dev/null +++ b/application/Espo/Services/EmailFolder.php @@ -0,0 +1,47 @@ +getAcl()->check($entity, 'edit')) { + throw new Forbidden(); + } + } +} +