From 6ed4b60ebb3f7c34be317b6256cbcccabda58980 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Tue, 10 Aug 2021 14:08:44 +0300 Subject: [PATCH] ics create event --- .../FieldProcessing/Email/IcsDataLoader.php | 4 +- .../Meeting/SourceEmailSaver.php | 86 +++++++++++++++++++ .../Crm/Resources/i18n/en_US/Meeting.json | 1 + .../metadata/entityDefs/Meeting.json | 12 +++ .../metadata/recordDefs/Meeting.json | 3 +- client/src/views/email/fields/create-event.js | 10 +-- 6 files changed, 106 insertions(+), 10 deletions(-) create mode 100644 application/Espo/Modules/Crm/Classes/FieldProcessing/Meeting/SourceEmailSaver.php diff --git a/application/Espo/Classes/FieldProcessing/Email/IcsDataLoader.php b/application/Espo/Classes/FieldProcessing/Email/IcsDataLoader.php index 29088e0f08..7ab55a5c86 100644 --- a/application/Espo/Classes/FieldProcessing/Email/IcsDataLoader.php +++ b/application/Espo/Classes/FieldProcessing/Email/IcsDataLoader.php @@ -91,7 +91,9 @@ class IcsDataLoader implements Loader $espoEvent = EventFactory::createFromU01jmg3Ical($ical); - $valueMap = (object) []; + $valueMap = (object) [ + 'sourceEmailId' => $entity->getId(), + ]; try { $valueMap->name = $espoEvent->getName(); diff --git a/application/Espo/Modules/Crm/Classes/FieldProcessing/Meeting/SourceEmailSaver.php b/application/Espo/Modules/Crm/Classes/FieldProcessing/Meeting/SourceEmailSaver.php new file mode 100644 index 0000000000..6f40831e15 --- /dev/null +++ b/application/Espo/Modules/Crm/Classes/FieldProcessing/Meeting/SourceEmailSaver.php @@ -0,0 +1,86 @@ +entityManager = $entityManager; + } + + public function process(Entity $entity, SaverParams $params): void + { + if (!$entity->isNew()) { + return; + } + + $emailId = $entity->get('sourceEmailId'); + + if (!$emailId) { + return; + } + + $email = $this->entityManager->getEntity('Email', $emailId); + + if (!$email) { + return; + } + + $icsContents = $email->get('icsContents'); + + if ($icsContents === null) { + return; + } + + $ical = new ICal(); + + $ical->initString($icsContents); + + $espoEvent = EventFactory::createFromU01jmg3Ical($ical); + + $email->set('createdEventId', $entity->getId()); + $email->set('createdEventType', $entity->getEntityType()); + $email->set('icsEventUid', $espoEvent->getUid()); + + $this->entityManager->saveEntity($email); + } +} diff --git a/application/Espo/Modules/Crm/Resources/i18n/en_US/Meeting.json b/application/Espo/Modules/Crm/Resources/i18n/en_US/Meeting.json index 36d8922055..2860738131 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/en_US/Meeting.json +++ b/application/Espo/Modules/Crm/Resources/i18n/en_US/Meeting.json @@ -16,6 +16,7 @@ "dateStartDate": "Date Start (all day)", "dateEndDate": "Date End (all day)", "isAllDay": "Is All-Day", + "sourceEmail": "Source Email", "Acceptance": "Acceptance" }, "links": { diff --git a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Meeting.json b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Meeting.json index 630b427340..876903863a 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Meeting.json +++ b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/Meeting.json @@ -250,6 +250,18 @@ "additionalAttributeList": ["columns"], "orderBy": "name" }, + "sourceEmail": { + "type": "link", + "notStorable": true, + "layoutDetailDisabled": true, + "layoutListDisabled": true, + "layoutMassUpdateDisabled": true, + "layoutFiltersDisabled": true, + "exportDisabled": true, + "importDisabled": true, + "entity": "TargetList", + "directAccessDisabled": true + }, "createdAt": { "type": "datetime", "readOnly": true diff --git a/application/Espo/Modules/Crm/Resources/metadata/recordDefs/Meeting.json b/application/Espo/Modules/Crm/Resources/metadata/recordDefs/Meeting.json index ec2621635e..ed0d9d165e 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/recordDefs/Meeting.json +++ b/application/Espo/Modules/Crm/Resources/metadata/recordDefs/Meeting.json @@ -3,6 +3,7 @@ "Espo\\Core\\FieldProcessing\\Reminder\\Loader" ], "saverClassNameList": [ - "Espo\\Core\\FieldProcessing\\Reminder\\Saver" + "Espo\\Core\\FieldProcessing\\Reminder\\Saver", + "Espo\\Modules\\Crm\\Classes\\FieldProcessing\\Meeting\\SourceEmailSaver" ] } diff --git a/client/src/views/email/fields/create-event.js b/client/src/views/email/fields/create-event.js index 5d674d02a7..c5192c4b26 100644 --- a/client/src/views/email/fields/create-event.js +++ b/client/src/views/email/fields/create-event.js @@ -68,15 +68,9 @@ define('views/email/fields/create-event', ['views/fields/base', 'lib!espo'], fun .then(view => { view.render(); - this.listenToOnce(view, 'after:save', model => { - let id = model.id; - - this.model.set('createdEventId', id); - this.model.set('createdEventType', model.entityType); - this.model.set('icsEventUid', eventData.uid); - + this.listenToOnce(view, 'after:save', () => { this.model - .save() + .fetch() .then(() => Espo.Ui.success(this.translate('Done')) );