From a43903dfd27eb595d796237cc78a87f661a517e0 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Thu, 30 May 2024 09:33:01 +0300 Subject: [PATCH] task reminders --- .../Core/FieldProcessing/Reminder/Saver.php | 14 ++++++++--- .../Resources/i18n/en_US/Preferences.json | 1 + .../Resources/layouts/Preferences/detail.json | 6 ++--- .../metadata/entityDefs/Preferences.json | 9 +++++++ .../crm/src/views/calendar/modals/edit.js | 15 ++++++++++-- .../crm/src/views/meeting/fields/reminders.js | 24 +++++++++++++------ 6 files changed, 54 insertions(+), 15 deletions(-) diff --git a/application/Espo/Core/FieldProcessing/Reminder/Saver.php b/application/Espo/Core/FieldProcessing/Reminder/Saver.php index 2a97a3a8c8..d33efae286 100644 --- a/application/Espo/Core/FieldProcessing/Reminder/Saver.php +++ b/application/Espo/Core/FieldProcessing/Reminder/Saver.php @@ -35,6 +35,7 @@ use Espo\Core\Utils\Metadata; use Espo\Entities\Preferences; use Espo\Entities\User; use Espo\Modules\Crm\Entities\Reminder; +use Espo\Modules\Crm\Entities\Task; use Espo\ORM\Entity; use Espo\Core\ORM\Entity as CoreEntity; use Espo\Core\FieldProcessing\Saver as SaverInterface; @@ -112,7 +113,7 @@ class Saver implements SaverInterface foreach ($userIdList as $userId) { $reminderList = $userId === $this->user->getId() ? $this->getReminderList($entity, $typeList) : - $this->getPreferencesReminderList($typeList, $userId); + $this->getPreferencesReminderList($typeList, $userId, $entityType); foreach ($reminderList as $item) { $this->createReminder($entity, $userId, $start, $item); @@ -296,7 +297,7 @@ class Saver implements SaverInterface * @param string[] $typeList * @return object{seconds: int, type: string}[] */ - private function getPreferencesReminderList(array $typeList, string $userId): array + private function getPreferencesReminderList(array $typeList, string $userId, string $entityType): array { $preferences = $this->entityManager->getRepositoryByClass(Preferences::class)->getById($userId); @@ -304,8 +305,15 @@ class Saver implements SaverInterface return []; } + $param = 'defaultReminders'; + + // @todo Refactor. + if ($entityType === Task::ENTITY_TYPE) { + $param = 'defaultRemindersTask'; + } + /** @var stdClass[] $list */ - $list = $preferences->get('defaultReminders') ?? []; + $list = $preferences->get($param) ?? []; return $this->sanitizeList($list, $typeList); } diff --git a/application/Espo/Resources/i18n/en_US/Preferences.json b/application/Espo/Resources/i18n/en_US/Preferences.json index b1d1fecbfd..5803fa6806 100644 --- a/application/Espo/Resources/i18n/en_US/Preferences.json +++ b/application/Espo/Resources/i18n/en_US/Preferences.json @@ -19,6 +19,7 @@ "signature": "Email Signature", "dashboardTabList": "Tab List", "defaultReminders": "Default Reminders", + "defaultRemindersTask": "Default Reminders for Tasks", "theme": "Theme", "useCustomTabList": "Custom Tab List", "addCustomTabs": "Add Custom Tabs", diff --git a/application/Espo/Resources/layouts/Preferences/detail.json b/application/Espo/Resources/layouts/Preferences/detail.json index 236c471f56..9c400f53e7 100644 --- a/application/Espo/Resources/layouts/Preferences/detail.json +++ b/application/Espo/Resources/layouts/Preferences/detail.json @@ -86,11 +86,11 @@ "rows": [ [ {"name": "calendarSlotDuration"}, - {"name": "defaultReminders"} + {"name": "calendarScrollHour"} ], [ - {"name": "calendarScrollHour"}, - false + {"name": "defaultReminders"}, + {"name": "defaultRemindersTask"} ] ] }, diff --git a/application/Espo/Resources/metadata/entityDefs/Preferences.json b/application/Espo/Resources/metadata/entityDefs/Preferences.json index b166dacf7f..25353db696 100644 --- a/application/Espo/Resources/metadata/entityDefs/Preferences.json +++ b/application/Espo/Resources/metadata/entityDefs/Preferences.json @@ -127,6 +127,15 @@ "Espo\\Modules\\Crm\\Classes\\FieldValidators\\Event\\Reminders\\MaxCount" ] }, + "defaultRemindersTask": { + "type": "jsonArray", + "view": "crm:views/meeting/fields/reminders", + "default": [], + "validatorClassNameList": [ + "Espo\\Modules\\Crm\\Classes\\FieldValidators\\Event\\Reminders\\Valid", + "Espo\\Modules\\Crm\\Classes\\FieldValidators\\Event\\Reminders\\MaxCount" + ] + }, "theme": { "type": "enum", "view": "views/preferences/fields/theme", diff --git a/client/modules/crm/src/views/calendar/modals/edit.js b/client/modules/crm/src/views/calendar/modals/edit.js index e369ac2eab..54349caf72 100644 --- a/client/modules/crm/src/views/calendar/modals/edit.js +++ b/client/modules/crm/src/views/calendar/modals/edit.js @@ -51,6 +51,8 @@ class CalenderEditModalView extends EditModalView { 'change .scope-switcher input[name="scope"]': function () { Espo.Ui.notify(' ... '); + const prevScope = this.scope; + const scope = $('.scope-switcher input[name="scope"]:checked').val(); this.scope = scope; @@ -61,7 +63,7 @@ class CalenderEditModalView extends EditModalView { attributes = {...attributes, ...this.getRecordView().model.getClonedAttributes()}; - this.filterAttributesForEntityType(attributes, scope); + this.filterAttributesForEntityType(attributes, scope, prevScope); model.set(attributes); @@ -77,7 +79,16 @@ class CalenderEditModalView extends EditModalView { }, } - filterAttributesForEntityType(attributes, entityType) { + /** + * @param {Record} attributes + * @param {string} entityType + * @param {string} previousEntityType + */ + filterAttributesForEntityType(attributes, entityType, previousEntityType) { + if (entityType === 'Task' || previousEntityType === 'Task') { + delete attributes.reminders; + } + this.getHelper() .fieldManager .getEntityTypeFieldList(entityType, {type: 'enum'}) diff --git a/client/modules/crm/src/views/meeting/fields/reminders.js b/client/modules/crm/src/views/meeting/fields/reminders.js index baa0ebb738..6bfa319b46 100644 --- a/client/modules/crm/src/views/meeting/fields/reminders.js +++ b/client/modules/crm/src/views/meeting/fields/reminders.js @@ -74,13 +74,7 @@ class MeetingRemindersField extends BaseFieldView { } setup() { - if (this.model.isNew() && !this.model.get(this.name) && this.model.entityType !== 'Preferences') { - this.reminderList = this.getPreferences().get('defaultReminders') || []; - } else { - this.reminderList = this.model.get(this.name) || []; - } - - this.reminderList = Espo.Utils.cloneDeep(this.reminderList); + this.setupReminderList(); this.listenTo(this.model, 'change:' + this.name, () => { this.reminderList = Espo.Utils @@ -101,6 +95,22 @@ class MeetingRemindersField extends BaseFieldView { }); } + setupReminderList() { + if (this.model.isNew() && !this.model.get(this.name) && this.model.entityType !== 'Preferences') { + let param = 'defaultReminders'; + + if (this.model.entityType === 'Task') { + param = 'defaultRemindersTask'; + } + + this.reminderList = this.getPreferences().get(param) || []; + } else { + this.reminderList = this.model.get(this.name) || []; + } + + this.reminderList = Espo.Utils.cloneDeep(this.reminderList); + } + afterRender() { if (this.isEditMode()) { this.$container = this.$el.find('.reminders-container');