email account monitored folders as array

This commit is contained in:
Yuri Kuznetsov
2021-05-31 12:25:51 +03:00
parent e241ad349a
commit 9c44356d5a
7 changed files with 132 additions and 42 deletions

View File

@@ -41,11 +41,12 @@
"type": "password"
},
"monitoredFolders": {
"type": "varchar",
"default": "INBOX",
"type": "array",
"default": ["INBOX"],
"options": ["INBOX"],
"view": "views/email-account/fields/folders",
"tooltip": true,
"maxLength": 1024
"displayAsList": true,
"noEmptyString": true
},
"sentFolder": {
"type": "varchar",

View File

@@ -40,11 +40,12 @@
"type": "password"
},
"monitoredFolders": {
"type": "varchar",
"default": "INBOX",
"type": "array",
"default": ["INBOX"],
"options": ["INBOX"],
"view": "views/inbound-email/fields/folders",
"tooltip": true,
"maxLength": 1024
"displayAsList": true,
"noEmptyString": true
},
"fetchSince": {
"type": "date"

View File

@@ -367,12 +367,10 @@ class EmailAccount extends Record implements
$monitoredFolders = $emailAccount->get('monitoredFolders');
if (empty($monitoredFolders)) {
throw new Error();
throw new Error("No monitored folders for email account.");
}
$monitoredFoldersArr = explode(',', $monitoredFolders);
foreach ($monitoredFoldersArr as $folder) {
foreach ($monitoredFolders as $folder) {
$folder = mb_convert_encoding(trim($folder), 'UTF7-IMAP', 'UTF-8');
$portionLimit = $this->getConfig()->get('personalEmailMaxPortionSize', self::PORTION_LIMIT);

View File

@@ -255,12 +255,10 @@ class InboundEmail extends RecordService implements
$monitoredFolders = $emailAccount->get('monitoredFolders');
if (empty($monitoredFolders)) {
$monitoredFolders = 'INBOX';
$monitoredFolders = ['INBOX'];
}
$monitoredFoldersArr = explode(',', $monitoredFolders);
foreach ($monitoredFoldersArr as $folder) {
foreach ($monitoredFolders as $folder) {
$folder = mb_convert_encoding(trim($folder), 'UTF7-IMAP', 'UTF-8');
$portionLimit = $this->config->get('inboundEmailMaxPortionSize', self::PORTION_LIMIT);

View File

@@ -26,24 +26,81 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
define('views/email-account/fields/folders', 'views/email-account/fields/folder', function (Dep) {
define('views/email-account/fields/folders', 'views/fields/array', function (Dep) {
return Dep.extend({
addFolder: function (folder) {
var value = this.$element.val();
getFoldersUrl: 'EmailAccount/action/getFolders',
var folders = [];
fetchFolders: function () {
return new Promise(function (resolve) {
var data = {
host: this.model.get('host'),
port: this.model.get('port'),
security: this.model.get('security'),
username: this.model.get('username'),
emailAddress: this.model.get('emailAddress'),
userId: this.model.get('assignedUserId'),
};
if (value != '') {
folders = value.split(',');
}
if (this.model.has('password')) {
data.password = this.model.get('password');
}
else {
if (!this.model.isNew()) {
data.id = this.model.id;
}
}
if (!~folders.indexOf(folder)) {
folders.push(folder);
}
Espo.Ajax.postRequest(this.getFoldersUrl, data)
.then(
function (folders) {
resolve(folders);
}.bind(this)
)
.fail(
function (xhr) {
Espo.Ui.error(this.translate('couldNotConnectToImap', 'messages', 'EmailAccount'));
xhr.errorIsHandled = true;
resolve(["INBOX"]);
}.bind(this)
);
}.bind(this));
},
actionAddItem: function () {
Espo.Ui.notify(this.translate('loading', 'messages'));
this.fetchFolders()
.then(
function (options) {
Espo.Ui.notify(false);
this.createView( 'addModal', this.addItemModalView, {options: options})
.then(
function (view) {
view.render();
view.once('add', function (item) {
this.addValue(item);
view.close();
}.bind(this));
view.once('add-mass', function (items) {
items.forEach(function (item) {
this.addValue(item);
}.bind(this));
view.close();
}.bind(this));
}.bind(this)
);
}.bind(this)
);
this.$element.val(folders.join(','));
},
});
});

View File

@@ -26,24 +26,11 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
define('views/inbound-email/fields/folders', 'views/inbound-email/fields/folder', function (Dep) {
define('views/inbound-email/fields/folders', 'views/email-account/fields/folders', function (Dep) {
return Dep.extend({
addFolder: function (folder) {
var value = this.$element.val();
getFoldersUrl: 'InboundEmail/action/getFolders',
var folders = [];
if (value != '') {
folders = value.split(',');
}
if (!~folders.indexOf(folder)) {
folders.push(folder);
}
this.$element.val(folders.join(','));
},
});
});

View File

@@ -32,6 +32,8 @@ use Espo\Core\Utils\Metadata;
use Espo\Core\Utils\File\Manager as FileManager;
use Espo\Core\Utils\Json;
use Espo\ORM\EntityManager;
class AfterUpgrade
{
public function run(Container $container): void
@@ -43,6 +45,9 @@ class AfterUpgrade
$this->updateEventMetadata($container->get('metadata'), $container->get('fileManager'));
$this->updatePersonMetadata($container->get('metadata'), $container->get('fileManager'));
$this->updateCompanyMetadata($container->get('metadata'), $container->get('fileManager'));
$this->migrateEmailAccountFolders('EmailAccount', $container->get('entityManager'));
$this->migrateEmailAccountFolders('InboundEmail', $container->get('entityManager'));
}
protected function updateTemplates($entityManager)
@@ -160,4 +165,47 @@ class AfterUpgrade
$metadata->save();
}
}
private function migrateEmailAccountFolders(string $entityType, EntityManager $entityManager): void
{
$selectQuery = $entityManager->getQueryBuilder()
->select()
->from($entityType)
->select(['id', 'monitoredFolders'])
->build();
$sth = $entityManager->getQueryExecutor()->execute($selectQuery);
$dataList = [];
while ($row = $sth->fetch()) {
$dataList[] = [
'id' => $row['id'],
'folders' => $row['monitoredFolders'] ?? '',
];
}
foreach ($dataList as $item) {
$id = $item['id'];
$foldersString = $item['folders'];
$folders = array_map(
function (string $item): string {
return trim($item);
},
explode(',', $foldersString)
);
$foldersJsonString = json_encode($folders);
$updateQuery = $entityManager->getQueryBuilder()
->update()
->in($entityType)
->set(['monitoredFolders' => $foldersJsonString])
->where(['id' => $id])
->build();
$entityManager->getQueryExecutor()->execute($updateQuery);
}
}
}