Просмотр исходного кода

Ticket #3853 - Notifications need a "clicked" indicator.

AntonLV 3 лет назад
Родитель
Сommit
2dacc6e85a

+ 9 - 0
modules/boonex/notifications/classes/BxNtfsConfig.php

@@ -34,6 +34,8 @@ class BxNtfsConfig extends BxBaseModNotificationsConfig
 
     protected $_bEventsGrouped;
 
+    protected $_bClickedIndicator;
+
     /**
      * Constructor
      */
@@ -136,6 +138,8 @@ class BxNtfsConfig extends BxBaseModNotificationsConfig
         $this->_iProcessedEvent = (int)getParam($sOptionPrefix . 'processed_event');
 
         $this->_bEventsGrouped = getParam($sOptionPrefix . 'enable_group_events') == 'on';
+
+        $this->_bClickedIndicator = getParam($sOptionPrefix . 'enable_clicked_indicator') == 'on';        
     }
 
     public function getOwnerNameMaxLen()
@@ -181,6 +185,11 @@ class BxNtfsConfig extends BxBaseModNotificationsConfig
         return $this->_bEventsGrouped;
     }
 
+    public function isClickedIndicator()
+    {
+        return $this->_bClickedIndicator;
+    }
+            
     public function getProcessedEvent()
     {
         return $this->_iProcessedEvent;

+ 23 - 2
modules/boonex/notifications/classes/BxNtfsDb.php

@@ -29,13 +29,22 @@ class BxNtfsDb extends BxBaseModNotificationsDb
 
         $this->_sTableEvt2Usr = $this->_sPrefix . 'events2users';
         $this->_sTableQueue = $this->_sPrefix . 'queue';
+        $this->_sTableRead = $this->_sPrefix . 'read';
+    }
+
+    public function markAsClicked($iUserId, $iEventId)
+    {
+        return (int)$this->query("INSERT INTO `" . $this->_sTableEvt2Usr . "` (`user_id`, `event_id`, `clicked`) VALUES (:user_id, :event_id, 1) ON DUPLICATE KEY UPDATE `clicked`=1", [
+            'user_id' => $iUserId,
+            'event_id' => $iEventId
+        ]) > 0;
     }
 
     public function markAsRead($iUserId, $iEventId)
     {
         $this->queueDeleteByProfile($iUserId, $iEventId);
 
-        return (int)$this->query("INSERT INTO `" . $this->_sTableEvt2Usr . "` (`user_id`, `event_id`) VALUES (:user_id, :event_id) ON DUPLICATE KEY UPDATE `event_id`=:event_id", array(
+        return (int)$this->query("INSERT INTO `" . $this->_sTableRead . "` (`user_id`, `event_id`) VALUES (:user_id, :event_id) ON DUPLICATE KEY UPDATE `event_id`=:event_id", array(
             'user_id' => $iUserId,
             'event_id' => $iEventId
         )) > 0;
@@ -43,7 +52,7 @@ class BxNtfsDb extends BxBaseModNotificationsDb
 
     public function getLastRead($iUserId)
     {
-        return (int)$this->getOne("SELECT `event_id` FROM `" . $this->_sTableEvt2Usr . "` WHERE `user_id`=:user_id LIMIT 1", array(
+        return (int)$this->getOne("SELECT `event_id` FROM `" . $this->_sTableRead . "` WHERE `user_id`=:user_id LIMIT 1", array(
             'user_id' => (int)$iUserId
         ));
     }
@@ -67,7 +76,9 @@ class BxNtfsDb extends BxBaseModNotificationsDb
         if($aParams['browse'] != 'list' || $aParams['type'] != BX_NTFS_TYPE_OBJECT_OWNER_AND_CONNECTIONS)
             return parent::getEvents($aParams);
 
+        $bClickedIndicator = $this->_oConfig->isClickedIndicator();
         $bCountOnly = !empty($aParams['count_only']);
+        $bViewerId = !empty($aParams['viewer_id']);
 
         //--- Get query for 'Object Owner' notifications
         $sLimitClause = isset($aParams['per_page']) ? "LIMIT 0, " . ($aParams['start'] + $aParams['per_page']) : "";
@@ -75,6 +86,11 @@ class BxNtfsDb extends BxBaseModNotificationsDb
         $aParams['type'] = BX_BASE_MOD_NTFS_TYPE_OBJECT_OWNER;
         list($sMethod, $sSelectClause, $sJoinClausePo, $sWhereClausePo, $sOrderClausePo) = $this->_getSqlPartsEvents($aParams);
 
+        if($bClickedIndicator && $bViewerId) {
+            $sSelectClause .= ", IF(ISNULL(`{$this->_sTableEvt2Usr}`.`clicked`) OR `{$this->_sTableEvt2Usr}`.`clicked`=0, 0, 1) AS `clicked`";
+            $sJoinClausePo .= $this->prepareAsString(" LEFT JOIN `{$this->_sTableEvt2Usr}` ON `{$this->_sTable}`.`id`=`{$this->_sTableEvt2Usr}`.`event_id` AND `{$this->_sTableEvt2Usr}`.`user_id`=?", $aParams['viewer_id']);
+        }
+
         $sQueryOwner = "SELECT {select}
             FROM `{$this->_sTable}`
             LEFT JOIN `{$this->_sTableHandlers}` ON `{$this->_sTable}`.`type`=`{$this->_sTableHandlers}`.`alert_unit` AND `{$this->_sTable}`.`action`=`{$this->_sTableHandlers}`.`alert_action` " . $sJoinClausePo . "
@@ -84,6 +100,11 @@ class BxNtfsDb extends BxBaseModNotificationsDb
         $aParams['type'] = BX_BASE_MOD_NTFS_TYPE_CONNECTIONS;
         list($sMethod, $sSelectClause, $sJoinClausePc, $sWhereClausePc, $sOrderClausePc) = $this->_getSqlPartsEvents($aParams);
 
+        if($bClickedIndicator && $bViewerId) {
+            $sSelectClause .= ", IF(ISNULL(`{$this->_sTableEvt2Usr}`.`clicked`) OR `{$this->_sTableEvt2Usr}`.`clicked`=0, 0, 1) AS `clicked`";
+            $sJoinClausePc .= $this->prepareAsString(" LEFT JOIN `{$this->_sTableEvt2Usr}` ON `{$this->_sTable}`.`id`=`{$this->_sTableEvt2Usr}`.`event_id` AND `{$this->_sTableEvt2Usr}`.`user_id`=?", $aParams['viewer_id']);
+        }
+
         $sQueryConnections = "SELECT {select}
             FROM `{$this->_sTable}`
             LEFT JOIN `{$this->_sTableHandlers}` ON `{$this->_sTable}`.`type`=`{$this->_sTableHandlers}`.`alert_unit` AND `{$this->_sTable}`.`action`=`{$this->_sTableHandlers}`.`alert_action` " . $sJoinClausePc . "

+ 40 - 12
modules/boonex/notifications/classes/BxNtfsModule.php

@@ -59,6 +59,23 @@ class BxNtfsModule extends BxBaseModNotificationsModule
     /**
      * ACTION METHODS
      */
+    function actionMarkAsClicked()
+    {
+        $iId = bx_process_input(bx_get('id'), BX_DATA_INT);
+        $aEvent = $this->_oDb->getEvents(['browse' => 'id', 'value' => $iId]);
+        if(empty($aEvent) || !is_array($aEvent))
+            return echoJson(['code' => 1]);
+
+        $aParams = $this->_prepareParamsGet();
+        if(!$this->_oDb->markAsClicked($aParams['viewer_id'], $iId))
+            return echoJson(['code' => 2]);
+
+        echoJson([
+            'code' => 0, 
+            'id' => $iId
+        ]);
+    }
+
     function actionGetPosts()
     {
         $aParams = $this->_prepareParamsGet();
@@ -582,24 +599,29 @@ class BxNtfsModule extends BxBaseModNotificationsModule
     /*
      * INTERNAL METHODS
      */
-    protected function _prepareParams($sType = '', $iOwnerId = 0, $iStart = -1, $iPerPage = -1, $aModules = array())
+    protected function _prepareParams($sType = '', $iOwnerId = 0, $iStart = -1, $iPerPage = -1, $aModules = [])
     {
-        $aParams = array();
-        $aParams['browse'] = 'list';
-        $aParams['type'] = !empty($sType) ? $sType : BX_NTFS_TYPE_DEFAULT;
-        $aParams['owner_id'] = (int)$iOwnerId != 0 ? $iOwnerId : $this->getUserId();
-        $aParams['start'] = (int)$iStart > 0 ? $iStart : 0;
-        $aParams['per_page'] = (int)$iPerPage > 0 ? $iPerPage : $this->_oConfig->getPerPage();
-        $aParams['modules'] = is_array($aModules) && !empty($aModules) ? $aModules : array();
-        $aParams['last_read'] = $this->_oDb->getLastRead($aParams['owner_id']);
-        $aParams['active'] = 1;
+        $iUserId = $this->getUserId();
+        $iOwnerId = (int)$iOwnerId != 0 ? $iOwnerId : $iUserId;
+
+        $aParams = [
+            'browse' => 'list',
+            'type' => !empty($sType) ? $sType : BX_NTFS_TYPE_DEFAULT,
+            'owner_id' => $iOwnerId,
+            'start' => (int)$iStart > 0 ? $iStart : 0,
+            'per_page' => (int)$iPerPage > 0 ? $iPerPage : $this->_oConfig->getPerPage(),
+            'modules' => is_array($aModules) && !empty($aModules) ? $aModules : [],
+            'last_read' => $this->_oDb->getLastRead($iOwnerId),
+            'viewer_id' => $iUserId,
+            'active' => 1
+        ];
 
         return $aParams;
     }
 
     protected function _prepareParamsGet()
     {
-        $aParams = array();
+        $aParams = [];
         $aParams['browse'] = 'list';
 
         $sType = bx_get('type');
@@ -614,7 +636,13 @@ class BxNtfsModule extends BxBaseModNotificationsModule
         $aParams['per_page'] = $iPerPage !== false ? bx_process_input($iPerPage, BX_DATA_INT) : $this->_oConfig->getPerPage();
 
         $aModules = bx_get('modules');
-        $aParams['modules'] = $aModules !== false ? bx_process_input($aModules, BX_DATA_TEXT) : array();
+        $aParams['modules'] = $aModules !== false ? bx_process_input($aModules, BX_DATA_TEXT) : [];
+
+        $iViewerId = $this->getUserId();
+        if(($aParams['viewer_id'] = bx_get('viewer_id')) !== false)
+            $aParams['viewer_id'] = bx_process_input($aParams['viewer_id'], BX_DATA_INT);
+        if(!$aParams['viewer_id'] || $aParams['viewer_id'] != $iViewerId)
+            $aParams['viewer_id'] = $iViewerId;
 
         $aParams['active'] = 1;
 

+ 15 - 1
modules/boonex/notifications/classes/BxNtfsTemplate.php

@@ -240,16 +240,30 @@ class BxNtfsTemplate extends BxBaseModNotificationsTemplate
         if(isset($aBrowseParams['return_parsed_content']))
             return $aEvent;
 
+        $bClickedIndicator = $this->_oConfig->isClickedIndicator();
+        $sJsObject = $this->_oConfig->getJsObject('view');
+
         return $this->parseHtmlByName('event.html', array (
             'html_id' => $this->_oConfig->getHtmlIds('view', 'event') . $aEvent['id'],
             'style_prefix' => $this->_oConfig->getPrefix('style'),
-            'js_object' => $this->_oConfig->getJsObject('view'),
+            'js_object' => $sJsObject,
             'class' => !empty($aBrowseParams['last_read']) && $aEvent['id'] > $aBrowseParams['last_read'] ? ' bx-def-color-bg-box-active' : '', 
             'id' => $aEvent['id'],
             'author_unit' => $sOwnerUnit,
             'link' => $this->_getContentLink($aEvent),
             'content' => is_array($aEvent['content_parsed']) && isset($aEvent['content_parsed']['site']) ? $aEvent['content_parsed']['site'] : $aEvent['content_parsed'],
             'date' => bx_time_js($aEvent['date']),
+            'bx_if:show_onclick' => [
+                'condition' => $bClickedIndicator,
+                'content' => [
+                    'js_object' => $sJsObject,
+                    'id' => $aEvent['id']
+                ]
+            ],
+            'bx_if:show_clicked_indicator' => [
+                'condition' => $bClickedIndicator && (int)$aEvent['clicked'] != 0,
+                'content' => []
+            ],
         ));
     }
 

+ 1 - 0
modules/boonex/notifications/install/langs/en.xml

@@ -44,6 +44,7 @@
     <string name="_bx_ntfs_option_events_hide_push"><![CDATA[Push notifications]]></string>
     <string name="_bx_ntfs_option_enable_group_settings"><![CDATA[Group settings by category]]></string>
     <string name="_bx_ntfs_option_enable_group_events"><![CDATA[Group notifications by event]]></string>
+    <string name="_bx_ntfs_option_enable_clicked_indicator"><![CDATA[Enable 'clicked' indicator]]></string>
     <string name="_bx_ntfs_option_delivery_timeout"><![CDATA[Delay before sending Email and/or Push notifications (in seconds)]]></string>
     <string name="_bx_ntfs_option_processed_event"><![CDATA[The last processed event upon notifications sending]]></string>
     <string name="_bx_ntfs_option_clear_interval"><![CDATA[Notification lifetime, in days (0 - no limit)]]></string>

+ 1 - 0
modules/boonex/notifications/install/sql/enable.sql

@@ -93,6 +93,7 @@ INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `c
 ('bx_notifications_events_per_preview', '5', @iCategId, '_bx_ntfs_option_events_per_preview', 'digit', '', '', '', '', 5),
 ('bx_notifications_enable_group_settings', 'on', @iCategId, '_bx_ntfs_option_enable_group_settings', 'checkbox', '', '', '', '', 10), 
 ('bx_notifications_enable_group_events', 'on', @iCategId, '_bx_ntfs_option_enable_group_events', 'checkbox', '', '', '', '', 11), 
+('bx_notifications_enable_clicked_indicator', '', @iCategId, '_bx_ntfs_option_enable_clicked_indicator', 'checkbox', '', '', '', '', 15),
 ('bx_notifications_delivery_timeout', '120', @iCategId, '_bx_ntfs_option_delivery_timeout', 'digit', '', '', '', '', 20),
 ('bx_notifications_clear_interval', '0', @iCategId, '_bx_ntfs_option_clear_interval', 'digit', '', '', '', '', 30),
 ('bx_notifications_enable_comment_post_ext', '', @iCategId, '_bx_ntfs_option_enable_comment_post_ext', 'checkbox', '', '', '', '', 40);

+ 9 - 0
modules/boonex/notifications/install/sql/install.sql

@@ -23,6 +23,15 @@ CREATE TABLE IF NOT EXISTS `bx_notifications_events` (
 );
 
 CREATE TABLE IF NOT EXISTS `bx_notifications_events2users` (
+  `id` int(11) NOT NULL auto_increment,
+  `user_id` int(11) NOT NULL DEFAULT '0',
+  `event_id` int(11) NOT NULL DEFAULT '0',
+  `clicked` tinyint(4) NOT NULL default '0',
+  PRIMARY KEY (`id`),
+  UNIQUE `event` (`user_id`, `event_id`)
+);
+
+CREATE TABLE IF NOT EXISTS `bx_notifications_read` (
   `user_id` int(11) NOT NULL DEFAULT '0',
   `event_id` int(11) NOT NULL DEFAULT '0',
   PRIMARY KEY (`user_id`)

+ 3 - 1
modules/boonex/notifications/install/sql/uninstall.sql

@@ -1,7 +1,9 @@
 SET @sName = 'bx_notifications';
 
 
-DROP TABLE IF EXISTS `bx_notifications_events`, `bx_notifications_events2users`, `bx_notifications_handlers`, `bx_notifications_settings`, `bx_notifications_settings2users`, `bx_notifications_queue`;
+DROP TABLE IF EXISTS `bx_notifications_events`, `bx_notifications_events2users`, `bx_notifications_read`;
+DROP TABLE IF EXISTS `bx_notifications_handlers`, `bx_notifications_settings`, `bx_notifications_settings2users`;
+DROP TABLE IF EXISTS `bx_notifications_queue`;
 
 
 -- STUDIO PAGE & WIDGET

+ 12 - 0
modules/boonex/notifications/js/view.js

@@ -29,6 +29,18 @@ BxNtfsView.prototype.changePage = function(oElement, iStart, iPerPage) {
     this._getPosts(oElement);
 };
 
+BxNtfsView.prototype.markAsClicked = function(oElement, iId) {
+    var oData = this._getDefaultData();
+    oData['id'] = iId;
+
+    jQuery.get(
+        this._sActionsUrl + 'mark_as_clicked/',
+        oData,
+    );
+
+    return true;
+};
+
 BxNtfsView.prototype._getPosts = function(oElement) {
     var $this = this;
 

+ 5 - 2
modules/boonex/notifications/template/event.html

@@ -1,12 +1,15 @@
 <div id="__html_id__" class="__style_prefix__-event bx-def-box bx-def-box-round-corners bx-def-color-bg-box bx-def-color-bg-box-hover relative mb-2 __class__">
-    <a class="__style_prefix__-event-link hover:no-underline" href="__link__">
+    <a class="__style_prefix__-event-link hover:no-underline" href="__link__" <bx_if:show_onclick>onclick="__js_object__.markAsClicked(this, __id__)"</bx_if:show_onclick>>
         <div class="__style_prefix__-event-gap p-4">
-            <div class="__style_prefix__-event-cnt flex items-center">
+            <div class="__style_prefix__-event-cnt relative flex items-center">
                 <div class="__style_prefix__-owner-avatar bx-def-thumb-size">__author_unit__</div>
                 <div class="__style_prefix__-body bx-def-thumb-size-min-height flex flex-col ml-4">
                     <div class="__style_prefix__-content">__content__</div>
                     <div class="__style_prefix__-date">__date__</div>
                 </div>
+                <bx_if:show_clicked_indicator>
+                    <div class="absolute h-2 w-2 right-0 bg-blue-500 rounded-full"></div>
+                </bx_if:show_clicked_indicator>
             </div>
         </div>
     </a>

+ 1 - 0
modules/boonex/russian/data/langs/bx_notifications/ru.xml

@@ -44,6 +44,7 @@
     <string name="_bx_ntfs_option_events_hide_push"><![CDATA[Push-уведомления]]></string>
     <string name="_bx_ntfs_option_enable_group_settings"><![CDATA[Сгруппировать настройки по категориям]]></string>
     <string name="_bx_ntfs_option_enable_group_events"><![CDATA[Сгруппировать оповещения по принадлежности к событию]]></string>
+    <string name="_bx_ntfs_option_enable_clicked_indicator"><![CDATA[Включить индикатор перехода по ссылке уведомления]]></string>
     <string name="_bx_ntfs_option_delivery_timeout"><![CDATA[Задержка перед отправкой Email и/или Push уведомлений (в секундах)]]></string>
     <string name="_bx_ntfs_option_clear_interval"><![CDATA[Срок жизни уведомления, в днях (0 - без ограничений)]]></string>
     <string name="_bx_ntfs_option_processed_event"><![CDATA[Последнее событие, обработанное в процессе отправки оповещений]]></string>

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
plugins_public/tailwind/css/tailwind.min.css


Некоторые файлы не были показаны из-за большого количества измененных файлов