From 4b39626b83fa373b73b47d0e2e7983aea9ef4929 Mon Sep 17 00:00:00 2001 From: yuri Date: Mon, 16 Sep 2019 11:59:19 +0300 Subject: [PATCH] stream onlyNotified param --- application/Espo/Controllers/Stream.php | 6 +- .../Resources/i18n/en_US/DashletOptions.json | 4 + .../Resources/metadata/dashlets/Stream.json | 11 +- application/Espo/Services/Stream.php | 141 ++++++++++++++---- client/src/views/dashlets/stream.js | 4 + 5 files changed, 132 insertions(+), 34 deletions(-) diff --git a/application/Espo/Controllers/Stream.php b/application/Espo/Controllers/Stream.php index 0d2491a89e..68d90943ce 100644 --- a/application/Espo/Controllers/Stream.php +++ b/application/Espo/Controllers/Stream.php @@ -46,6 +46,7 @@ class Stream extends \Espo\Core\Controllers\Base $maxSize = intval($request->get('maxSize')); $after = $request->get('after'); $filter = $request->get('filter'); + $onlyNotified = $request->get('onlyNotified') === 'true'; $service = $this->getService('Stream'); @@ -61,7 +62,8 @@ class Stream extends \Espo\Core\Controllers\Base 'offset' => $offset, 'maxSize' => $maxSize, 'after' => $after, - 'filter' => $filter + 'filter' => $filter, + 'onlyNotified' => $onlyNotified, ]); return (object) [ @@ -96,7 +98,7 @@ class Stream extends \Espo\Core\Controllers\Base 'maxSize' => $maxSize, 'after' => $after, 'filter' => 'posts', - 'where' => $where + 'where' => $where, ]); return (object) [ diff --git a/application/Espo/Resources/i18n/en_US/DashletOptions.json b/application/Espo/Resources/i18n/en_US/DashletOptions.json index b4fca4596e..a22d4940a5 100644 --- a/application/Espo/Resources/i18n/en_US/DashletOptions.json +++ b/application/Espo/Resources/i18n/en_US/DashletOptions.json @@ -15,6 +15,7 @@ "sortBy": "Order (field)", "sortDirection": "Order (direction)", "expandedLayout": "Layout", + "onlyNotified": "Display only records you notified about", "dateFilter": "Date Filter" }, "options": { @@ -29,5 +30,8 @@ }, "messages": { "selectEntityType": "Select Entity Type in dashlet options." + }, + "tooltips": { + "onlyNotified": "Actions done by your user won't be displayed." } } diff --git a/application/Espo/Resources/metadata/dashlets/Stream.json b/application/Espo/Resources/metadata/dashlets/Stream.json index 8fd7ba1160..f0262dcd58 100644 --- a/application/Espo/Resources/metadata/dashlets/Stream.json +++ b/application/Espo/Resources/metadata/dashlets/Stream.json @@ -13,11 +13,16 @@ "displayRecords": { "type": "enumInt", "options": [3,4,5,10,15,20,30,50] + }, + "onlyNotified": { + "type": "bool", + "tooltip": true } }, "defaults": { "displayRecords": 10, - "autorefreshInterval": 0.5 + "autorefreshInterval": 0.5, + "onlyNotified": true }, "layout": [ { @@ -28,6 +33,10 @@ [ {"name": "displayRecords"}, {"name": "autorefreshInterval"} + ], + [ + {"name": "onlyNotified"}, + false ] ] } diff --git a/application/Espo/Services/Stream.php b/application/Espo/Services/Stream.php index 8d28014b15..5fb2f6b677 100644 --- a/application/Espo/Services/Stream.php +++ b/application/Espo/Services/Stream.php @@ -29,10 +29,11 @@ namespace Espo\Services; -use \Espo\Core\Exceptions\Forbidden; -use \Espo\Core\Exceptions\NotFound; +use Espo\Core\Exceptions\Forbidden; +use Espo\Core\Exceptions\NotFound; use Espo\ORM\Entity; +use Espo\Entities\User; class Stream extends \Espo\Core\Services\Base { @@ -302,7 +303,7 @@ class Stream extends \Espo\Core\Services\Base $sth = $pdo->prepare($sql)->execute(); } - public function findUserStream($userId, $params = array()) + public function findUserStream($userId, $params = []) { $offset = intval($params['offset']); $maxSize = intval($params['maxSize']); @@ -319,6 +320,12 @@ class Stream extends \Espo\Core\Services\Base } } + $onlyNotified = $params['onlyNotified'] ?? false; + + if ($onlyNotified) { + return $this->findUserStreamNotified($user, $params); + } + $teamIdList = $user->getTeamIdList(); $pdo = $this->getEntityManager()->getPDO(); @@ -336,7 +343,7 @@ class Stream extends \Espo\Core\Services\Base $selectManager = $this->getSelectMangerFactory()->create('Note'); $additionalSelectParams = $selectManager->getSelectParams([ 'where' => $params['where'] - ], false, true); + ], false, true, true); } $selectParamsList = []; @@ -658,38 +665,13 @@ class Stream extends \Espo\Core\Services\Base $collection = $this->getEntityManager()->getRepository('Note')->findByQuery($sql); foreach ($collection as $e) { - if ($e->get('type') == 'Post' || $e->get('type') == 'EmailReceived') { - $e->loadAttachments(); - } - } - - foreach ($collection as $e) { - if ($e->get('parentId') && $e->get('parentType')) { - $e->loadParentNameField('parent'); - } - if ($e->get('relatedId') && $e->get('relatedType')) { - $e->loadParentNameField('related'); - } - if ($e->get('type') == 'Post' && $e->get('parentId') === null && !$e->get('isGlobal')) { - $targetType = $e->get('targetType'); - if (!$targetType || $targetType === 'users' || $targetType === 'self') { - $e->loadLinkMultipleField('users'); - } - if ($targetType !== 'users' && $targetType !== 'self') { - if (!$targetType || $targetType === 'teams') { - $e->loadLinkMultipleField('teams'); - } else if ($targetType === 'portals') { - $e->loadLinkMultipleField('portals'); - } - } - } + $this->loadNoteAdditionalFields($e); } + $total = -2; if (count($collection) > $maxSize) { $total = -1; unset($collection[count($collection) - 1]); - } else { - $total = -2; } return (object) [ @@ -698,6 +680,33 @@ class Stream extends \Espo\Core\Services\Base ]; } + protected function loadNoteAdditionalFields(Entity $e) + { + if ($e->get('type') == 'Post' || $e->get('type') == 'EmailReceived') { + $e->loadAttachments(); + } + + if ($e->get('parentId') && $e->get('parentType')) { + $e->loadParentNameField('parent'); + } + if ($e->get('relatedId') && $e->get('relatedType')) { + $e->loadParentNameField('related'); + } + if ($e->get('type') == 'Post' && $e->get('parentId') === null && !$e->get('isGlobal')) { + $targetType = $e->get('targetType'); + if (!$targetType || $targetType === 'users' || $targetType === 'self') { + $e->loadLinkMultipleField('users'); + } + if ($targetType !== 'users' && $targetType !== 'self') { + if (!$targetType || $targetType === 'teams') { + $e->loadLinkMultipleField('teams'); + } else if ($targetType === 'portals') { + $e->loadLinkMultipleField('portals'); + } + } + } + } + public function find($scope, $id, $params = []) { if ($scope === 'User') { @@ -908,6 +917,76 @@ class Stream extends \Espo\Core\Services\Base ]; } + protected function findUserStreamNotified(User $user, $params = []) + { + $offset = $params['offset'] ?? 0; + $maxSize = $params['maxSize'] ?? 0; + $where = $params['where'] ?? null; + $after = $params['after'] ?? null; + $filter = $params['filter'] ?? null; + + $selectManager = $this->getSelectMangerFactory()->create('Note'); + $selectParams = $selectManager->getEmptySelectParams(); + + if ($where) { + $selectManager->checkWhere($where, true, true); + $selectManager->applyWhere($where, $selectParams); + } + + if ($filter) { + switch ($filter) { + case 'posts': + $whereClause[]['type'] = 'Post'; + break; + case 'updates': + $whereClause[]['type'] = ['Update', 'Status']; + break; + } + } + + if ($after) { + $selectParams['whereClause'][] = [ + 'createdAt>=' => $after, + ]; + } + + $selectManager->applyOrder('number', true, $selectParams); + + $selectManager->addJoin([ + 'Notification', + 'notification', + [ + 'note.id:' => 'notification.relatedId', + 'notification.relatedType' => 'Note', + ] + ], $selectParams); + + $selectParams['whereClause'][] = [ + 'notification.userId' => $user->id, + ]; + + $selectManager->applyLimit($offset, $maxSize + 1, $selectParams); + + $sql = $this->getEntityManager()->getQuery()->createSelectQuery('Note', $selectParams); + + $collection = $this->getEntityManager()->getRepository('Note')->findByQuery($sql); + + foreach ($collection as $e) { + $this->loadNoteAdditionalFields($e); + } + + $total = -2; + if (count($collection) > $maxSize) { + $total = -1; + unset($collection[count($collection) - 1]); + } + + return (object) [ + 'total' => $total, + 'collection' => $collection, + ]; + } + protected function loadAssignedUserName(Entity $entity) { $user = $this->getEntityManager()->getEntity('User', $entity->get('assignedUserId')); diff --git a/client/src/views/dashlets/stream.js b/client/src/views/dashlets/stream.js index 20020edaa0..e17d77a59d 100644 --- a/client/src/views/dashlets/stream.js +++ b/client/src/views/dashlets/stream.js @@ -45,6 +45,10 @@ Espo.define('views/dashlets/stream', 'views/dashlets/abstract/base', function (D collection.url = 'Stream'; collection.maxSize = this.getOption('displayRecords'); + if (this.getOption('onlyNotified')) { + collection.data.onlyNotified = true; + } + this.listenToOnce(collection, 'sync', function () { this.createView('list', 'views/stream/record/list', { el: this.getSelector() + ' > .list-container',