email account monitored folders as array
This commit is contained in:
@@ -41,11 +41,12 @@
|
|||||||
"type": "password"
|
"type": "password"
|
||||||
},
|
},
|
||||||
"monitoredFolders": {
|
"monitoredFolders": {
|
||||||
"type": "varchar",
|
"type": "array",
|
||||||
"default": "INBOX",
|
"default": ["INBOX"],
|
||||||
|
"options": ["INBOX"],
|
||||||
"view": "views/email-account/fields/folders",
|
"view": "views/email-account/fields/folders",
|
||||||
"tooltip": true,
|
"displayAsList": true,
|
||||||
"maxLength": 1024
|
"noEmptyString": true
|
||||||
},
|
},
|
||||||
"sentFolder": {
|
"sentFolder": {
|
||||||
"type": "varchar",
|
"type": "varchar",
|
||||||
|
|||||||
@@ -40,11 +40,12 @@
|
|||||||
"type": "password"
|
"type": "password"
|
||||||
},
|
},
|
||||||
"monitoredFolders": {
|
"monitoredFolders": {
|
||||||
"type": "varchar",
|
"type": "array",
|
||||||
"default": "INBOX",
|
"default": ["INBOX"],
|
||||||
|
"options": ["INBOX"],
|
||||||
"view": "views/inbound-email/fields/folders",
|
"view": "views/inbound-email/fields/folders",
|
||||||
"tooltip": true,
|
"displayAsList": true,
|
||||||
"maxLength": 1024
|
"noEmptyString": true
|
||||||
},
|
},
|
||||||
"fetchSince": {
|
"fetchSince": {
|
||||||
"type": "date"
|
"type": "date"
|
||||||
|
|||||||
@@ -367,12 +367,10 @@ class EmailAccount extends Record implements
|
|||||||
$monitoredFolders = $emailAccount->get('monitoredFolders');
|
$monitoredFolders = $emailAccount->get('monitoredFolders');
|
||||||
|
|
||||||
if (empty($monitoredFolders)) {
|
if (empty($monitoredFolders)) {
|
||||||
throw new Error();
|
throw new Error("No monitored folders for email account.");
|
||||||
}
|
}
|
||||||
|
|
||||||
$monitoredFoldersArr = explode(',', $monitoredFolders);
|
foreach ($monitoredFolders as $folder) {
|
||||||
|
|
||||||
foreach ($monitoredFoldersArr as $folder) {
|
|
||||||
$folder = mb_convert_encoding(trim($folder), 'UTF7-IMAP', 'UTF-8');
|
$folder = mb_convert_encoding(trim($folder), 'UTF7-IMAP', 'UTF-8');
|
||||||
|
|
||||||
$portionLimit = $this->getConfig()->get('personalEmailMaxPortionSize', self::PORTION_LIMIT);
|
$portionLimit = $this->getConfig()->get('personalEmailMaxPortionSize', self::PORTION_LIMIT);
|
||||||
|
|||||||
@@ -255,12 +255,10 @@ class InboundEmail extends RecordService implements
|
|||||||
$monitoredFolders = $emailAccount->get('monitoredFolders');
|
$monitoredFolders = $emailAccount->get('monitoredFolders');
|
||||||
|
|
||||||
if (empty($monitoredFolders)) {
|
if (empty($monitoredFolders)) {
|
||||||
$monitoredFolders = 'INBOX';
|
$monitoredFolders = ['INBOX'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$monitoredFoldersArr = explode(',', $monitoredFolders);
|
foreach ($monitoredFolders as $folder) {
|
||||||
|
|
||||||
foreach ($monitoredFoldersArr as $folder) {
|
|
||||||
$folder = mb_convert_encoding(trim($folder), 'UTF7-IMAP', 'UTF-8');
|
$folder = mb_convert_encoding(trim($folder), 'UTF7-IMAP', 'UTF-8');
|
||||||
|
|
||||||
$portionLimit = $this->config->get('inboundEmailMaxPortionSize', self::PORTION_LIMIT);
|
$portionLimit = $this->config->get('inboundEmailMaxPortionSize', self::PORTION_LIMIT);
|
||||||
|
|||||||
@@ -26,24 +26,81 @@
|
|||||||
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
|
* 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({
|
return Dep.extend({
|
||||||
|
|
||||||
addFolder: function (folder) {
|
getFoldersUrl: 'EmailAccount/action/getFolders',
|
||||||
var value = this.$element.val();
|
|
||||||
|
|
||||||
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 != '') {
|
if (this.model.has('password')) {
|
||||||
folders = value.split(',');
|
data.password = this.model.get('password');
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (!this.model.isNew()) {
|
||||||
|
data.id = this.model.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!~folders.indexOf(folder)) {
|
Espo.Ajax.postRequest(this.getFoldersUrl, data)
|
||||||
folders.push(folder);
|
.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(','));
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -26,24 +26,11 @@
|
|||||||
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
|
* 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({
|
return Dep.extend({
|
||||||
|
|
||||||
addFolder: function (folder) {
|
getFoldersUrl: 'InboundEmail/action/getFolders',
|
||||||
var value = this.$element.val();
|
|
||||||
|
|
||||||
var folders = [];
|
|
||||||
|
|
||||||
if (value != '') {
|
|
||||||
folders = value.split(',');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!~folders.indexOf(folder)) {
|
|
||||||
folders.push(folder);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.$element.val(folders.join(','));
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ use Espo\Core\Utils\Metadata;
|
|||||||
use Espo\Core\Utils\File\Manager as FileManager;
|
use Espo\Core\Utils\File\Manager as FileManager;
|
||||||
use Espo\Core\Utils\Json;
|
use Espo\Core\Utils\Json;
|
||||||
|
|
||||||
|
use Espo\ORM\EntityManager;
|
||||||
|
|
||||||
class AfterUpgrade
|
class AfterUpgrade
|
||||||
{
|
{
|
||||||
public function run(Container $container): void
|
public function run(Container $container): void
|
||||||
@@ -43,6 +45,9 @@ class AfterUpgrade
|
|||||||
$this->updateEventMetadata($container->get('metadata'), $container->get('fileManager'));
|
$this->updateEventMetadata($container->get('metadata'), $container->get('fileManager'));
|
||||||
$this->updatePersonMetadata($container->get('metadata'), $container->get('fileManager'));
|
$this->updatePersonMetadata($container->get('metadata'), $container->get('fileManager'));
|
||||||
$this->updateCompanyMetadata($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)
|
protected function updateTemplates($entityManager)
|
||||||
@@ -160,4 +165,47 @@ class AfterUpgrade
|
|||||||
$metadata->save();
|
$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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user