Sfoglia il codice sorgente

Merge branch 'master' of https://github.com/unaio/una

RomanL 4 anni fa
parent
commit
54f306e73b

+ 16 - 1
inc/classes/BxDolCmts.php

@@ -48,6 +48,11 @@ define('BX_CMT_USAGE_BLOCK', 'block');
 define('BX_CMT_USAGE_INLINE', 'inline');
 define('BX_CMT_USAGE_DEFAULT', BX_CMT_USAGE_BLOCK);
 
+define('BX_CMT_STATUS_ACTIVE', 'active');
+define('BX_CMT_STATUS_HIDDEN', 'hidden');
+define('BX_CMT_STATUS_PENDING', 'pending');
+
+
 /**
  * Comments for any content
  *
@@ -447,6 +452,11 @@ class BxDolCmts extends BxDolFactory implements iBxDolReplaceable, iBxDolContent
         return $iCmtParentId == 0 ? $this->_aSystem['per_view'] : $this->_aSystem['per_view_replies'];
     }
 
+    public function getStatusAdmin()
+    {
+        return $this->isEditAllowedAll() || $this->isRemoveAllowedAll() || $this->isAutoApprove() ? BX_CMT_STATUS_ACTIVE : BX_CMT_STATUS_PENDING;
+    }
+
     public function getViewUrl($iCmtId)
     {
     	if(empty($this->_aSystem['trigger_field_title']))
@@ -642,6 +652,11 @@ class BxDolCmts extends BxDolFactory implements iBxDolReplaceable, iBxDolContent
         return true;
     }
 
+    public function isAutoApprove()
+    {
+        return getParam('sys_cmts_enable_auto_approve') == 'on';
+    }
+
     /**
      * set id to operate with votes
      */
@@ -732,7 +747,7 @@ class BxDolCmts extends BxDolFactory implements iBxDolReplaceable, iBxDolContent
      */
     public function getCommentUniqId($iCmtId, $iAuthorId = 0)
     {
-        return $this->_oQuery->getUniqId($this->getSystemId(), $iCmtId, $iAuthorId);
+        return $this->_oQuery->getUniqId($this->getSystemId(), $iCmtId, ['author_id' => $iAuthorId]);
     }
 
     /**

+ 11 - 1
inc/classes/BxDolCmtsGridAdministration.php

@@ -53,6 +53,16 @@ class BxDolCmtsGridAdministration extends BxTemplGrid
         $this->_sDefaultSortingOrder = 'DESC';
     }
 
+    protected function _switcherChecked2State($isChecked)
+    {
+        return $isChecked ? 'active' : 'hidden';
+    }
+
+    protected function _switcherState2Checked($mixedState)
+    {
+        return 'active' == $mixedState ? true : false;
+    }
+
     protected function _getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage)
     {
         if(strpos($sFilter, $this->_sParamsDivider) !== false)
@@ -69,7 +79,7 @@ class BxDolCmtsGridAdministration extends BxTemplGrid
         if(!$this->_oCmts || !$this->_oCmts->isEnabled())
             return '';
 
-        $this->_aOptions['source'] = $oModule->_oDb->prepareAsString("SELECT `sys_cmts_ids`.`id`, `sys_cmts_ids`.`cmt_id`, `sys_cmts_ids`.`reports`, `cmts`.*, `sys_accounts`.`email` FROM `sys_cmts_ids` INNER JOIN " . $this->_oCmts->getCommentsTableName() . " AS `cmts` ON `cmts`.`cmt_id`=`sys_cmts_ids`.`cmt_id` INNER JOIN `sys_profiles` ON `cmts`.`cmt_author_id`=`sys_profiles`.`id` INNER JOIN `sys_accounts` ON `sys_profiles`.`account_id`=`sys_accounts`.`id` WHERE `sys_cmts_ids`.`system_id`=?", $this->_oCmts->getSystemId());
+        $this->_aOptions['source'] = $oModule->_oDb->prepareAsString("SELECT `sys_cmts_ids`.`id`, `sys_cmts_ids`.`cmt_id`, `sys_cmts_ids`.`reports`, `sys_cmts_ids`.`status_admin`, `cmts`.*, `sys_accounts`.`email` FROM `sys_cmts_ids` INNER JOIN " . $this->_oCmts->getCommentsTableName() . " AS `cmts` ON `cmts`.`cmt_id`=`sys_cmts_ids`.`cmt_id` INNER JOIN `sys_profiles` ON `cmts`.`cmt_author_id`=`sys_profiles`.`id` INNER JOIN `sys_accounts` ON `sys_profiles`.`account_id`=`sys_accounts`.`id` WHERE `sys_cmts_ids`.`system_id`=?", $this->_oCmts->getSystemId());
 
         return parent::_getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);
     }

+ 70 - 13
inc/classes/BxDolCmtsQuery.php

@@ -24,10 +24,12 @@ class BxDolCmtsQuery extends BxDolDb
     protected $_sTableFiles;
     protected $_sTableFiles2Entries;
 
+    protected $_sTableSystems;
     protected $_sTableIds;
 
     public function __construct(&$oMain)
     {
+        $this->_sTableSystems = BxDolCmts::$sTableSystems;
         $this->_sTableIds = BxDolCmts::$sTableIds;
 
         $this->_oMain = $oMain;
@@ -46,6 +48,37 @@ class BxDolCmtsQuery extends BxDolDb
         parent::__construct();
     }
 
+    public static function getSystemBy($aParams)
+    {
+        $oDb = BxDolDb::getInstance();
+
+        $aMethod = ['name' => 'getAll', 'params' => [0 => 'query', 1 => []]];
+        $sSelectClause = $sJoinClause = $sWhereClause = $sOrderClause = $sLimitClause = "";
+
+        $sSelectClause = "`ts`.*";
+
+        switch($aParams['type']) {
+            case 'name':
+                $aMethod['name'] = 'getRow';
+                $aMethod['params'][1]['name'] = $aParams['name'];
+
+                $sWhereClause .= " AND `ts`.`Name` = :name";
+                break;
+
+            case 'all':
+                break;
+        }
+
+        if(!empty($sOrderClause))
+            $sOrderClause = 'ORDER BY ' . $sOrderClause;
+
+        if(!empty($sLimitClause))
+            $sLimitClause = 'LIMIT ' . $sLimitClause;
+
+        $aMethod['params'][0] = "SELECT " . $sSelectClause . " FROM `" . BxDolCmts::$sTableSystems . "` AS `ts` " . $sJoinClause . " WHERE 1 " . $sWhereClause . " " . $sOrderClause . " " . $sLimitClause;
+        return call_user_func_array(array($oDb, $aMethod['name']), $aMethod['params']);
+    }
+
     public static function getInfoBy($aParams)
     {
         $oDb = BxDolDb::getInstance();
@@ -77,7 +110,7 @@ class BxDolCmtsQuery extends BxDolDb
         if(!empty($sLimitClause))
             $sLimitClause = 'LIMIT ' . $sLimitClause;
 
-        $aMethod['params'][0] = "SELECT " . $sSelectClause . " FROM `" . BxDolCmts::$sTableIds . "` " . $sJoinClause . " AS `ti` WHERE 1 " . $sWhereClause . " " . $sOrderClause . " " . $sLimitClause;
+        $aMethod['params'][0] = "SELECT " . $sSelectClause . " FROM `" . BxDolCmts::$sTableIds . "` AS `ti` " . $sJoinClause . " WHERE 1 " . $sWhereClause . " " . $sOrderClause . " " . $sLimitClause;
         return call_user_func_array(array($oDb, $aMethod['name']), $aMethod['params']);
     }
 
@@ -297,10 +330,13 @@ class BxDolCmtsQuery extends BxDolDb
     {
     	$aBindings = array(
             'cmt_object_id' => $iId,
-            'system_id' => $this->_oMain->getSystemId()
+            'system_id' => $this->_oMain->getSystemId(),
+            'status_admin' => BX_CMT_STATUS_ACTIVE
     	);
         $sFields = $sJoin = "";
-        
+
+        $sWhereStatus = " AND `{$this->_sTableIds}`.`status_admin`=:status_admin";
+
         $sWhereParent = '';
         if((int)$iCmtVParentId >= 0) {
             $aBindings['cmt_vparent_id'] = $iCmtVParentId;
@@ -355,17 +391,27 @@ class BxDolCmtsQuery extends BxDolDb
         
        	$sLimit = $iCount != -1 ? $this->prepareAsString(" LIMIT ?, ?", (int)$iStart, (int)$iCount) : '';
 
-        $sWhereClause = $sWhereParent . $sWhereFilter . $sWhereCf;
+        $sWhereClause = $sWhereStatus . $sWhereParent . $sWhereFilter . $sWhereCf;
            
         $sQuery = "SELECT
                 `{$this->_sTable}`.*,
-                `{$this->_sTableIds}`.`id` AS `cmt_unique_id`
+                `{$this->_sTableIds}`.`id` AS `cmt_unique_id`,
+                `{$this->_sTableIds}`.`status_admin` AS `cmt_status_admin`
                 $sFields
             FROM `{$this->_sTable}`
             LEFT JOIN `{$this->_sTableIds}` ON (`{$this->_sTable}`.`cmt_id` = `{$this->_sTableIds}`.`cmt_id` AND `{$this->_sTableIds}`.`system_id` = :system_id) 
             INNER JOIN `sys_profiles` AS `p` ON (`p`.`id` = `{$this->_sTable}`.`cmt_author_id` AND (`p`.`status` = 'active' OR `{$this->_sTable}`.`cmt_replies` != 0))";
            
-        bx_alert('comment', 'get_comments', 0, bx_get_logged_profile_id(), array('system' => $this->_oMain->getSystemInfo(), 'select_clause' => &$sQuery, 'join_clause' => &$sJoin, 'where_clause' => &$sWhereClause, 'order_clause' => &$sOrder, 'limit_clause' => &$sLimit, 'params' => &$aBindings)); 
+        bx_alert('comment', 'get_comments', 0, bx_get_logged_profile_id(), array(
+            'system' => $this->_oMain->getSystemInfo(), 
+            'select_clause' => &$sQuery, 
+            'join_clause' => &$sJoin, 
+            'where_clause' => &$sWhereClause, 
+            'order_clause' => &$sOrder, 
+            'limit_clause' => &$sLimit, 
+            'params' => &$aBindings
+        ));
+
         $sQuery = $sQuery . $sJoin . " WHERE `{$this->_sTable}`.`cmt_object_id` = :cmt_object_id" . $sWhereClause . $sOrder . $sLimit;
         
         return $this->getAll($sQuery, $aBindings);
@@ -524,7 +570,8 @@ class BxDolCmtsQuery extends BxDolDb
 
         $sQuery = $this->prepare("SELECT
                 `{$this->_sTable}`.*,
-                `{$this->_sTableIds}`.`id` AS `cmt_unique_id`
+                `{$this->_sTableIds}`.`id` AS `cmt_unique_id`,
+                `{$this->_sTableIds}`.`status_admin` AS `cmt_status_admin`
                 $sFields
             FROM `{$this->_sTable}`
             LEFT JOIN `{$this->_sTableIds}` ON (`{$this->_sTable}`.`cmt_id` = `{$this->_sTableIds}`.`cmt_id` AND `{$this->_sTableIds}`.`system_id` = ?)
@@ -750,7 +797,7 @@ class BxDolCmtsQuery extends BxDolDb
     }
     
 
-    function updateTriggerTable($iId, $iCount)
+    public function updateTriggerTable($iId, $iCount)
     {
         if (!$this->_sTriggerFieldComments)
             return true;
@@ -758,22 +805,32 @@ class BxDolCmtsQuery extends BxDolDb
         return $this->query($sQuery);
     }
 
-    function getUniqId($iSystemId, $iCmtId, $iAuthorId = 0)
+    public function getUniqId($iSystemId, $iCmtId, $aData = [])
     {
         $sQuery = $this->prepare("SELECT `id` FROM `{$this->_sTableIds}` WHERE `system_id` = ? AND `cmt_id` = ?", $iSystemId, $iCmtId);
         if(($iUniqId = (int)$this->getOne($sQuery)) != 0)
             return $iUniqId;
 
-        if(empty($iAuthorId))
-            $iAuthorId = bx_get_logged_profile_id();
+        $aDataDefault = [
+            'system_id' => $iSystemId, 
+            'cmt_id' => $iCmtId,
+            'author_id' => bx_get_logged_profile_id()
+        ];
 
-        $sQuery = $this->prepare("INSERT INTO `{$this->_sTableIds}` SET `system_id` = ?, `cmt_id` = ?, `author_id` = ?", $iSystemId, $iCmtId, $iAuthorId);
-        if(!$this->query($sQuery))
+        if(!$this->query("INSERT INTO `{$this->_sTableIds}` SET " . $this->arrayToSQL(array_merge($aDataDefault, $aData))))
             return false;
 
         return $this->lastId();
     }
 
+    public function updateUniqId($aSetClause, $aWhereClause)
+    {
+        if(empty($aSetClause) || empty($aWhereClause))
+            return;
+
+        return (int)$this->query("UPDATE `{$this->_sTableIds}` SET " . $this->arrayToSQL($aSetClause) . " WHERE " . $this->arrayToSQL($aWhereClause)) > 0;
+    }
+
     protected function convertImagesArray($a)
     {
         if (!$a || !is_array($a))

+ 15 - 7
install/sql/system.sql

@@ -509,7 +509,9 @@ INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `ex
 
 (@iCategoryId, 'sys_hide_post_to_context_for_privacy', '_adm_stg_cpt_option_sys_hide_post_to_context_for_privacy', '', 'list', 'a:3:{s:6:"module";s:6:"system";s:6:"method";s:44:"get_options_module_list_for_privacy_selector";s:5:"class";s:13:"TemplServices";}', '', '', 50),
 
-(@iCategoryId, 'sys_vote_reactions_quick_mode', '_adm_stg_cpt_option_sys_vote_reactions_quick_mode', 'on', 'checkbox', '', '', '', 60);
+(@iCategoryId, 'sys_vote_reactions_quick_mode', '_adm_stg_cpt_option_sys_vote_reactions_quick_mode', 'on', 'checkbox', '', '', '', 60),
+
+(@iCategoryId, 'sys_cmts_enable_auto_approve', '_adm_stg_cpt_option_sys_cmts_enable_auto_approve', 'on', 'checkbox', '', '', '', 70);
 
 --
 -- CATEGORY: Storage
@@ -1607,6 +1609,7 @@ CREATE TABLE IF NOT EXISTS `sys_cmts_ids` (
   `sc_up` int(11) NOT NULL default '0',
   `sc_down` int(11) NOT NULL default '0',
   `reports` int(11) NOT NULL default '0',
+  `status_admin` enum('active','hidden','pending') NOT NULL DEFAULT 'active',
   PRIMARY KEY (`id`),
   UNIQUE KEY `system_cmt_id` (`system_id`,`cmt_id`)
 );
@@ -4494,6 +4497,10 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('sys_account_dashboard_manage_tools', 'system', 'cmts-administration', '_sys_menu_item_title_system_cmts_administration', '_sys_menu_item_title_cmts_administration', 'page.php?i=cmts-administration', '', '', 'comments', 'a:2:{s:6:"module";s:6:"system";s:6:"method";s:27:"get_menu_addon_manage_tools";}', '', 192, 1, 0, 1),
 ('sys_account_dashboard_manage_tools', 'system', 'audit-administration', '_sys_menu_item_title_system_audit_administration', '_sys_menu_item_title_audit_administration', 'page.php?i=audit-administration', '', '', 'comments', 'a:2:{s:6:"module";s:6:"system";s:6:"method";s:27:"get_menu_addon_manage_tools";}', '', 192, 1, 0, 2);
 
+-- dashboard content
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('sys_dashboard_content_manage', 'system', 'cmts', '_sys_menu_item_title_system_cmts_administration', '_sys_menu_item_title_cmts_administration', 'page.php?i=dashboard-content&module=cmts', '', '', '', '', '', 192, 1, 0, 1);
+
 -- profile stats
 INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
 ('sys_profile_stats', 'system', 'profile-stats-profile', '_sys_menu_item_title_system_profile', '_sys_menu_item_title_profile', '{member_url}', '', '', 'user', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:27:"get_menu_addon_profile_edit";s:6:"params";a:0:{}s:5:"class";s:20:"TemplServiceProfiles";}', '', 2147483646, 1, 0, 0);
@@ -4865,15 +4872,16 @@ INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon
 
 -- GRIDS: moderation tools
 INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
-('sys_cmts_administration', 'Sql', '', 'sys_cmts_ids', 'cmt_id', 'cmt_time', '', '', 20, NULL, 'start', '', 'cmt_text,email', '', 'like', 'reports', '', 192, 'BxTemplCmtsGridAdministration', '');
+('sys_cmts_administration', 'Sql', '', 'sys_cmts_ids', 'cmt_id', 'cmt_time', 'status_admin', '', 20, NULL, 'start', '', 'cmt_text,email', '', 'like', 'reports', '', 192, 'BxTemplCmtsGridAdministration', '');
 
 INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
 ('sys_cmts_administration', 'checkbox', '_sys_select', '2%', 0, '0', '', 1),
-('sys_cmts_administration', 'reports', '_sys_txt_reports_title', '5%', 0, '0', '', 2),
-('sys_cmts_administration', 'cmt_text', '_sys_cmts_administration_grid_column_title_adm_cmt_text', '33%', 0, '25', '', 3),
-('sys_cmts_administration', 'cmt_time', '_sys_cmts_administration_grid_column_title_adm_cmt_time', '20%', 1, '25', '', 4),
-('sys_cmts_administration', 'cmt_author_id', '_sys_cmts_administration_grid_column_title_adm_cmt_author_id', '20%', 0, '25', '', 5),
-('sys_cmts_administration', 'actions', '', '20%', 0, '', '', 6);
+('sys_cmts_administration', 'switcher', '_sys_cmts_administration_grid_column_title_adm_active', '8%', 0, '', '', 2),
+('sys_cmts_administration', 'reports', '_sys_txt_reports_title', '5%', 0, '0', '', 3),
+('sys_cmts_administration', 'cmt_text', '_sys_cmts_administration_grid_column_title_adm_cmt_text', '30%', 0, '25', '', 4),
+('sys_cmts_administration', 'cmt_time', '_sys_cmts_administration_grid_column_title_adm_cmt_time', '15%', 1, '25', '', 5),
+('sys_cmts_administration', 'cmt_author_id', '_sys_cmts_administration_grid_column_title_adm_cmt_author_id', '20%', 0, '25', '', 6),
+('sys_cmts_administration', 'actions', '', '20%', 0, '', '', 7);
 
 INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
 ('sys_cmts_administration', 'bulk', 'delete', '_sys_cmts_administration_grid_action_title_adm_delete', '', 0, 1, 1),

+ 28 - 1
modules/base/general/classes/BxBaseModGeneralCmtsSearchResult.php

@@ -21,7 +21,7 @@ class BxBaseModGeneralCmtsSearchResult extends BxBaseModGeneralSearchResult
 
         $this->oModule = $this->getMain();
         $this->sModuleObjectComments = $this->oModule->_oConfig->CNF['OBJECT_COMMENTS'];
-        $this->aCommentsAddons = array();
+        $this->aCommentsAddons = array();        
 
         $this->aCurrent = array(
             'name' => $this->oModule->_oConfig->getName() . '_cmts',
@@ -39,6 +39,8 @@ class BxBaseModGeneralCmtsSearchResult extends BxBaseModGeneralSearchResult
             'ident' => 'cmt_id'
         );
 
+        $this->_joinTableUniqueIds();
+
         $this->sBrowseUrl = BX_DOL_SEARCH_KEYWORD_PAGE;
     }
 
@@ -98,6 +100,31 @@ class BxBaseModGeneralCmtsSearchResult extends BxBaseModGeneralSearchResult
             'added' => 'cmt_time'
         );
     }
+
+    protected function _joinTableUniqueIds()
+    {
+        $aCommentsSystem = BxDolCmtsQuery::getSystemBy(['type' => 'name', 'name' => $this->sModuleObjectComments]);
+        if(empty($aCommentsSystem) || !is_array($aCommentsSystem))
+            return;
+
+        $sTableMain = $this->aCurrent['table'];
+        $sTableUniqueIds = 'sys_cmts_ids';
+
+        $this->aCurrent['restriction']['status_admin'] = [
+            'value' => 'active', 
+            'field' => 'status_admin', 
+            'operator' => '=', 
+            'table' => $sTableUniqueIds
+        ];
+
+        $this->aCurrent['join']['unique_ids'] = [
+            'type' => 'INNER',
+            'table' => $sTableUniqueIds,
+            'mainField' => 'cmt_id',
+            'on_sql' => "`{$sTableMain}`.`cmt_id`=`{$sTableUniqueIds}`.`cmt_id` AND `{$sTableUniqueIds}`.`system_id`='{$aCommentsSystem['ID']}' ",
+            'joinFields' => array('status_admin'),
+        ];
+    }
 }
 
 /** @} */

+ 2 - 0
modules/boonex/albums/classes/BxAlbumsCmtsSearchResultMedia.php

@@ -23,6 +23,8 @@ class BxAlbumsCmtsSearchResultMedia extends BxBaseModGeneralCmtsSearchResult
 
         $this->aCurrent['name'] = $this->oModule->_oConfig->getName() . '_cmts_media';
         $this->aCurrent['table'] = $this->oModule->_oConfig->getDbPrefix() . 'cmts_media';
+
+        $this->_joinTableUniqueIds();
     }
 }
 

+ 9 - 0
modules/boonex/artificer/data/template/system/comment.html

@@ -4,6 +4,15 @@
         <div class="__style_prefix__-blink-plate"></div>
         <div class="__style_prefix__-avatar bx-def-thumb-size">__author_unit__</div>
         <div class="__style_prefix__-info bx-def-thumb-size-min-height sm:pl-2 lg:pl-4">
+            <bx_if:show_notes>
+                <div class="__style_prefix__-notes mb-1">
+                    <bx_repeat:notes>
+                        <div class="__style_prefix__-note mt-1 first:mt-0 text-sm text-gray-500 dark:text-gray-400">
+                            <div class="__style_prefix__-n-text<bx_if:show_note_color> col-__item_note_color__</bx_if:show_note_color>">__item_note__</div>
+                        </div>
+                    </bx_repeat:notes>
+                </div>
+            </bx_if:show_notes>
             <div class="__style_prefix__-head">
                 <bx_if:meta><span class="__style_prefix__-meta bx-base-general-unit-meta">__meta__</span></bx_if:meta>
                 <bx_if:show_pinned><span class="__style_prefix__-pinned ml-2"><i class="sys-icon thumbtack" title="<bx_text:_cmt_txt_pinned />"></i></span></bx_if:show_pinned>

+ 21 - 18
modules/boonex/english/data/langs/system/en.xml

@@ -1638,6 +1638,7 @@
     <string name="_adm_stg_cpt_option_sys_profile_bot"><![CDATA[System bot profile]]></string>
     <string name="_adm_stg_cpt_option_sys_logs_storage_default"><![CDATA[Default logs storage]]></string>
     <string name="_adm_stg_cpt_option_sys_vote_reactions_quick_mode"><![CDATA[Enable 'Quick Reactions' mode - vote with default reaction when clicked]]></string>
+    <string name="_adm_stg_cpt_option_sys_cmts_enable_auto_approve"><![CDATA[Auto approve a comment after creation]]></string>
 	<string name="_adm_stg_cpt_type_system"><![CDATA[System]]></string>
 	<string name="_adm_stg_scs_save"><![CDATA[Settings were successfully saved]]></string>
 	<string name="_adm_stg_err_save_error_message"><![CDATA[Error in '{0}': {1}]]></string>
@@ -1848,6 +1849,7 @@
         <string name="_cmt_txt_counter"><![CDATA[{0}]]></string>
 	<string name="_cmt_txt_counter_empty"><![CDATA[Comment]]></string>
         <string name="_cmt_txt_min_form_placeholder"><![CDATA[{0}, leave your comment here.]]></string>
+        <string name="_cmt_txt_note_approve_pending"><![CDATA[Comment will be published as soon as it's approved by moderator]]></string>
         <string name="_cmt_nts_popup_view_title"><![CDATA[Notes]]></string>
         <string name="_cmt_rvw_block_rating_title"><![CDATA[Reviews Rating]]></string>
         <string name="_cmt_rvw_block_reviews_title"><![CDATA[Reviews ({0})]]></string>
@@ -2071,25 +2073,26 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_block_types_custom"><![CDATA[Custom]]></string>
 	<string name="_sys_block_types_skeletons"><![CDATA[Skeletons]]></string>
 	<string name="_sys_block_types_system"><![CDATA[System]]></string>
+
+    <string name="_sys_cmts"><![CDATA[Comments]]></string>
+    <string name="_sys_cmts_administration_grid_column_title_adm_active"><![CDATA[Active]]></string>
+    <string name="_sys_cmts_administration_grid_column_title_adm_cmt_text"><![CDATA[Text]]></string>
+    <string name="_sys_cmts_administration_grid_column_title_adm_cmt_time"><![CDATA[Added]]></string>
+    <string name="_sys_cmts_administration_grid_column_title_adm_cmt_author_id"><![CDATA[Author]]></string>
+    <string name="_sys_cmts_administration_grid_action_title_adm_delete"><![CDATA[Delete]]></string>
   
-  <string name="_sys_cmts"><![CDATA[Comments]]></string>
-  <string name="_sys_cmts_administration_grid_column_title_adm_cmt_text"><![CDATA[Text]]></string>
-  <string name="_sys_cmts_administration_grid_column_title_adm_cmt_time"><![CDATA[Added]]></string>
-  <string name="_sys_cmts_administration_grid_column_title_adm_cmt_author_id"><![CDATA[Author]]></string>
-  <string name="_sys_cmts_administration_grid_action_title_adm_delete"><![CDATA[Delete]]></string>
-  
-  <string name="_sys_chart_growth_object"><![CDATA[Display]]></string>
-	<string name="_sys_chart_growth_date_from"><![CDATA[From]]></string>
-	<string name="_sys_chart_growth_date_to"><![CDATA[To]]></string>
-	<string name="_sys_chart_accounts_growth"><![CDATA[Accounts: Growth]]></string>
-	<string name="_sys_chart_accounts_growth_speed"><![CDATA[Accounts: Growth Speed]]></string>
-	<string name="_sys_close"><![CDATA[Close]]></string>
-        <string name="_sys_confirm"><![CDATA[Confirm]]></string>
-        <string name="_sys_confirmed"><![CDATA[Confirmed]]></string>
-	<string name="_sys_conn_err_connection_already_exists"><![CDATA[Connection already exists]]></string>
-	<string name="_sys_conn_err_connection_does_not_exists"><![CDATA[Connection doesn't exist]]></string>
-	<string name="_sys_conn_err_connection_is_awaiting_confirmation"><![CDATA[Connection request is awaiting confirmation]]></string>
-	<string name="_sys_conn_err_input_data_is_not_defined"><![CDATA[Input data isn't defined]]></string>
+    <string name="_sys_chart_growth_object"><![CDATA[Display]]></string>
+    <string name="_sys_chart_growth_date_from"><![CDATA[From]]></string>
+    <string name="_sys_chart_growth_date_to"><![CDATA[To]]></string>
+    <string name="_sys_chart_accounts_growth"><![CDATA[Accounts: Growth]]></string>
+    <string name="_sys_chart_accounts_growth_speed"><![CDATA[Accounts: Growth Speed]]></string>
+    <string name="_sys_close"><![CDATA[Close]]></string>
+    <string name="_sys_confirm"><![CDATA[Confirm]]></string>
+    <string name="_sys_confirmed"><![CDATA[Confirmed]]></string>
+    <string name="_sys_conn_err_connection_already_exists"><![CDATA[Connection already exists]]></string>
+    <string name="_sys_conn_err_connection_does_not_exists"><![CDATA[Connection doesn't exist]]></string>
+    <string name="_sys_conn_err_connection_is_awaiting_confirmation"><![CDATA[Connection request is awaiting confirmation]]></string>
+    <string name="_sys_conn_err_input_data_is_not_defined"><![CDATA[Input data isn't defined]]></string>
     <string name="_sys_conn_msg_success"><![CDATA[Operation has beed successfully completed]]></string>
 
     <string name="_sys_connect_information"><![CDATA[Configuration info]]></string>

+ 9 - 0
modules/boonex/lucid/data/template/system/comment.html

@@ -3,6 +3,15 @@
         <div class="__style_prefix__-blink-plate"></div>
         <div class="__style_prefix__-avatar bx-def-thumb-size">__author_unit__</div>
         <div class="__style_prefix__-info bx-def-thumb-size-min-height bx-def-thumb-size-left-indent">
+            <bx_if:show_notes>
+                <div class="__style_prefix__-notes">
+                    <bx_repeat:notes>
+                        <div class="__style_prefix__-note bx-def-margin-thd-top-auto bx-def-font-small bx-def-font-grayed">
+                            <div class="__style_prefix__-n-text<bx_if:show_note_color> col-__item_note_color__</bx_if:show_note_color>">__item_note__</div>
+                        </div>
+                    </bx_repeat:notes>
+                </div>
+            </bx_if:show_notes>
             <div class="__style_prefix__-head bx-clearfix">
                 <bx_if:meta><span class="__style_prefix__-meta bx-base-general-unit-meta">__meta__</span></bx_if:meta>
                 <bx_if:show_pinned><span class="__style_prefix__-pinned bx-def-margin-sec-left"><i class="sys-icon thumbtack" title="<bx_text:_cmt_txt_pinned />"></i></span></bx_if:show_pinned>

+ 17 - 14
modules/boonex/russian/data/langs/system/ru.xml

@@ -1623,6 +1623,7 @@
     <string name="_adm_stg_cpt_option_sys_profile_bot"><![CDATA[Профиль системного бота]]></string>
     <string name="_adm_stg_cpt_option_sys_logs_storage_default"><![CDATA[Система логирования по умолчанию]]></string>
     <string name="_adm_stg_cpt_option_sys_vote_reactions_quick_mode"><![CDATA[Включить режим 'Быстрых реакций' - голосовать при клике, используя реакцию по умолчанию]]></string>
+    <string name="_adm_stg_cpt_option_sys_cmts_enable_auto_approve"><![CDATA[Автоматически активировать комментарий после создания]]></string>
 	<string name="_adm_stg_cpt_type_system"><![CDATA[Система]]></string>
 	<string name="_adm_stg_scs_save"><![CDATA[Настройки удачно сохранены]]></string>
 	<string name="_adm_stg_err_save_error_message"><![CDATA[Ошибка в '{0}': {1}]]></string>
@@ -1833,6 +1834,7 @@
         <string name="_cmt_txt_counter"><![CDATA[{0}]]></string>
 	<string name="_cmt_txt_counter_empty"><![CDATA[Комментировать]]></string>
         <string name="_cmt_txt_min_form_placeholder"><![CDATA[{0}, здесь Вы можете оставить комментарий.]]></string>
+        <string name="_cmt_txt_note_approve_pending"><![CDATA[Комментарий будет опубликован, как только пройдет проверку модератором.]]></string>
         <string name="_cmt_nts_popup_view_title"><![CDATA[Заметки]]></string>
         <string name="_cmt_rvw_block_rating_title"><![CDATA[Оценка по обзорам]]></string>
         <string name="_cmt_rvw_block_reviews_title"><![CDATA[Обзоры ({0})]]></string>
@@ -2057,30 +2059,31 @@
 	<string name="_sys_block_types_skeletons"><![CDATA[Скелеты]]></string>
 	<string name="_sys_block_types_system"><![CDATA[Система]]></string>
   
-  <string name="_sys_cmts"><![CDATA[комментарии]]></string>
-  <string name="_sys_cmts_administration_grid_column_title_adm_cmt_text"><![CDATA[Текст]]></string>
-  <string name="_sys_cmts_administration_grid_column_title_adm_cmt_time"><![CDATA[Добавлено]]></string>
-  <string name="_sys_cmts_administration_grid_column_title_adm_cmt_author_id"><![CDATA[Автор]]></string>
-  <string name="_sys_cmts_administration_grid_action_title_adm_delete"><![CDATA[Удалить]]></string>
-	
+    <string name="_sys_cmts"><![CDATA[комментарии]]></string>
+    <string name="_sys_cmts_administration_grid_column_title_adm_active"><![CDATA[Активные]]></string>
+    <string name="_sys_cmts_administration_grid_column_title_adm_cmt_text"><![CDATA[Текст]]></string>
+    <string name="_sys_cmts_administration_grid_column_title_adm_cmt_time"><![CDATA[Добавлено]]></string>
+    <string name="_sys_cmts_administration_grid_column_title_adm_cmt_author_id"><![CDATA[Автор]]></string>
+    <string name="_sys_cmts_administration_grid_action_title_adm_delete"><![CDATA[Удалить]]></string>
+
     <string name="_sys_chart_growth_object"><![CDATA[Вывести]]></string>
     <string name="_sys_chart_growth_date_from"><![CDATA[С]]></string>
     <string name="_sys_chart_growth_date_to"><![CDATA[По]]></string>
     <string name="_sys_chart_accounts_growth"><![CDATA[Аккаунты: Развитие]]></string>
     <string name="_sys_chart_accounts_growth_speed"><![CDATA[Аккаунты: Скорость развития]]></string>
-	<string name="_sys_close"><![CDATA[Закрыть]]></string>
-        <string name="_sys_confirm"><![CDATA[Подтвердить]]></string>
-        <string name="_sys_confirmed"><![CDATA[Подтвержденный]]></string>
-	<string name="_sys_conn_err_connection_already_exists"><![CDATA[Связь уже существует]]></string>
-	<string name="_sys_conn_err_connection_does_not_exists"><![CDATA[Связь не существует]]></string>
-	<string name="_sys_conn_err_connection_is_awaiting_confirmation"><![CDATA[Запрос на связь ожидает подтверждения]]></string>
-	<string name="_sys_conn_err_input_data_is_not_defined"><![CDATA[Входные данные не определены]]></string>
+    <string name="_sys_close"><![CDATA[Закрыть]]></string>
+    <string name="_sys_confirm"><![CDATA[Подтвердить]]></string>
+    <string name="_sys_confirmed"><![CDATA[Подтвержденный]]></string>
+    <string name="_sys_conn_err_connection_already_exists"><![CDATA[Связь уже существует]]></string>
+    <string name="_sys_conn_err_connection_does_not_exists"><![CDATA[Связь не существует]]></string>
+    <string name="_sys_conn_err_connection_is_awaiting_confirmation"><![CDATA[Запрос на связь ожидает подтверждения]]></string>
+    <string name="_sys_conn_err_input_data_is_not_defined"><![CDATA[Входные данные не определены]]></string>
     <string name="_sys_conn_msg_success"><![CDATA[Операция удачно завершена]]></string>
 
     <string name="_sys_connect_information"><![CDATA[Информация о настройке]]></string>
     <string name="_sys_connect_error_join_unavailable"><![CDATA[Извините, но регистрация на данный момент недоступна. Пожалуйста попробуйте снова попозже.]]></string>
     <string name="_sys_connect_profile_error_info"><![CDATA[Невозможно получить информацию о профиле]]></string>
-	<string name="_sys_connect_state_invalid"><![CDATA["State" параметр не совпадает]]></string>
+    <string name="_sys_connect_state_invalid"><![CDATA["State" параметр не совпадает]]></string>
     <string name="_sys_connect_adm_stg_cpt_category_general"><![CDATA[Общие]]></string>
     <string name="_sys_connect_option_redirect"><![CDATA[Перенаправление после захода на сайт]]></string>
     <string name="_sys_connect_option_module"><![CDATA[Модуль в котором создавать профили]]></string>

+ 2 - 0
modules/boonex/timeline/classes/BxTimelineCmtsSearchResult.php

@@ -19,6 +19,8 @@ class BxTimelineCmtsSearchResult extends BxBaseModGeneralCmtsSearchResult
 
         $this->aCurrent['title'] = _t('_bx_timeline_page_block_title_browse_cmts');
         $this->aCurrent['table'] = $this->oModule->_oConfig->getDbPrefix() . 'comments';
+
+        $this->_joinTableUniqueIds();
     }
 }
 

+ 7 - 3
modules/boonex/timeline/classes/BxTimelineMenuItemShare.php

@@ -108,9 +108,13 @@ class BxTimelineMenuItemShare extends BxTemplMenu
                 ));
         }
 
-        $oSocial = BxDolMenu::getObjectInstance('sys_social_sharing');
-        $oSocial->addMarkers($aMarkers);
-        return array_merge($aItems, $oSocial->getMenuItems());
+        if(($oSocial = BxDolMenu::getObjectInstance('sys_social_sharing')) !== false) {
+            $oSocial->addMarkers($aMarkers);
+
+            $aItems = array_merge($aItems, $oSocial->getMenuItems());
+        }
+
+        return $aItems;
     }
 
     protected function _setBrowseParams($aBrowseParams = array())

+ 2 - 1
modules/boonex/timeline/classes/BxTimelineSearchResult.php

@@ -23,11 +23,12 @@ class BxTimelineSearchResult extends BxBaseModNotificationsSearchResult
             'object_metatags' => 'bx_timeline',
             'title' => _t('_bx_timeline_page_title_browse'),
             'table' => 'bx_timeline_events',
-            'ownFields' => array('id', 'owner_id', 'type', 'action', 'object_id', 'object_privacy_view', 'content', 'title', 'description', 'views', 'rate', 'votes', 'rrate', 'rvotes', 'score', 'sc_up', 'sc_down', 'comments', 'reports', 'reposts', 'date', 'status', 'pinned', 'sticked', 'promoted'),
+            'ownFields' => array('id', 'owner_id', 'type', 'action', 'object_id', 'object_privacy_view', 'content', 'title', 'description', 'views', 'rate', 'votes', 'rrate', 'rvotes', 'score', 'sc_up', 'sc_down', 'comments', 'reports', 'reposts', 'date', 'status', 'status_admin', 'pinned', 'sticked', 'promoted'),
             'searchFields' => array('title'),
             'restriction' => array(
                 'internal' => array('value' => 'timeline_common_post', 'field' => 'type', 'operator' => '='),
                 'status' => array('value' => BX_TIMELINE_STATUS_ACTIVE, 'field' => 'status', 'operator' => '='),
+                'status_admin' => array('value' => BX_TIMELINE_STATUS_ACTIVE, 'field' => 'status_admin', 'operator' => '='),
                 'active' => array('value' => '1', 'field' => 'active', 'operator' => '='),
             ),
             'paginate' => array('perPage' => getParam('bx_timeline_events_per_page'), 'start' => 0),

+ 4 - 3
modules/boonex/timeline/install/sql/disable.sql

@@ -37,10 +37,11 @@ DELETE FROM `sys_alerts_handlers` WHERE `id` = @iHandlerId LIMIT 1;
 -- SEARCH
 DELETE FROM `sys_objects_search` WHERE `ObjectName` IN ('bx_timeline', 'bx_timeline_cmts');
 
+
 -- GRIDS
-DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_timeline_mute', 'bx_timeline_administration');
-DELETE FROM `sys_grid_fields` WHERE `object` IN ('bx_timeline_mute', 'bx_timeline_administration');
-DELETE FROM `sys_grid_actions` WHERE `object` IN ('bx_timeline_mute', 'bx_timeline_administration');
+DELETE FROM `sys_objects_grid` WHERE `object` LIKE 'bx_timeline%';
+DELETE FROM `sys_grid_fields` WHERE `object` LIKE 'bx_timeline%';
+DELETE FROM `sys_grid_actions` WHERE `object` LIKE 'bx_timeline%';
 
 
 -- METATAGS

+ 9 - 0
modules/boonex/timeline/template/item_search.html

@@ -3,6 +3,15 @@
         <div class="__style_prefix__-item-owner bx-def-margin-leftright"> 
             <div class="__style_prefix__-owner-avatar bx-def-thumb-size">__item_owner_unit__</div>
             <div class="__style_prefix__-owner-info bx-def-thumb-size-min-height bx-def-thumb-size-left-indent">
+                <bx_if:show_note>
+                    <div class="__style_prefix__-item-notes bx-def-margin-thd-bottom">
+                        <bx_repeat:notes>
+                            <div class="__style_prefix__-item-note bx-def-margin-sec-top-auto bx-def-font-small bx-def-font-grayed">
+                                <div class="__style_prefix__-in-text<bx_if:show_note_color> col-__item_note_color__</bx_if:show_note_color>">__item_note__</div>
+                            </div>
+                        </bx_repeat:notes>
+                    </div>
+                </bx_if:show_note>
                 <!-- NOTE: Spaces after and between elements in 'owner-name' DIV are needed for better line folding -->
                 <div class="__style_prefix__-owner-name bx-def-font-middle bx-def-font-light bx-def-font-grayed">
                     <a href="__item_owner_url__" class="__style_prefix__-owner-name" title="__item_owner_title__">__item_owner_name__</a>

+ 9 - 0
template/comment.html

@@ -4,6 +4,15 @@
         <div class="__style_prefix__-blink-plate"></div>
         <div class="__style_prefix__-avatar bx-def-thumb-size">__author_unit__</div>
         <div class="__style_prefix__-info bx-def-thumb-size-min-height bx-def-thumb-size-left-indent">
+            <bx_if:show_notes>
+                <div class="__style_prefix__-notes bx-def-margin-thd-bottom">
+                    <bx_repeat:notes>
+                        <div class="__style_prefix__-note bx-def-margin-thd-top-auto bx-def-font-small bx-def-font-grayed">
+                            <div class="__style_prefix__-n-text<bx_if:show_note_color> col-__item_note_color__</bx_if:show_note_color>">__item_note__</div>
+                        </div>
+                    </bx_repeat:notes>
+                </div>
+            </bx_if:show_notes>
             <div class="__style_prefix__-head bx-clearfix">
                 <bx_if:meta><span class="__style_prefix__-meta bx-base-general-unit-meta">__meta__</span></bx_if:meta>
                 <bx_if:show_pinned><span class="__style_prefix__-pinned bx-def-margin-sec-left"><i class="sys-icon thumbtack" title="<bx_text:_cmt_txt_pinned />"></i></span></bx_if:show_pinned>

+ 3 - 0
template/css/cmts.css

@@ -92,6 +92,9 @@
         background-color: rgb(255, 244, 213);
         background-color: rgba(255, 234, 193, 0.5);
     }
+    div.cmt-notes {
+        text-align: left;
+    }
     div.cmt-head {
         text-align: left;
         text-overflow: ellipsis;

+ 45 - 27
template/location_field_plain.html

@@ -12,7 +12,22 @@
 
 <script>
 (function () {
-    var getLocationString = function (sMode) {
+
+    var eForm = $('.bx-form-input-location-__name__').parents('form:first');
+    eForm.on('submit', function (ev) {
+        if (typeof(glBxLocationDisableFormSubmit) !== 'undefined' && glBxLocationDisableFormSubmit)
+            ev.preventDefault();
+    });
+
+    var disableFormSubmit = function (b) {
+        glBxLocationDisableFormSubmit = b;
+        if (b)
+            eForm.find('[type=submit]').addClass('bx-btn-disabled').attr('disabled', true);
+        else
+            eForm.find('[type=submit]').removeClass('bx-btn-disabled').attr('disabled', false);
+    }
+
+    var getLocationParams = function (sMode) {
         var sCountry = $('select[name="__name___country"] :selected').text();
         var sCountryCode = $('select[name="__name___country"]').val();
         var sZip = $('input[name="__name___zip"]').val();
@@ -24,29 +39,29 @@
         if (!sCountryCode || !sCountryCode.length)
             return '';
 
-        sRet = sZip.length ? sZip : '';
-        if ('undefined' !== typeof(sMode) && 'zip_only' == sMode) {
+        sRet = '&country=' + encodeURIComponent(sCountryCode);
+
+        if (sZip.length && sMode !== 'no_street_no_zip')
+            sRet += '&postalcode=' + encodeURIComponent(sZip);
+
+        if ('zip_only' == sMode)
             return sZip.length ? sRet : '';
-        }
-        if ('undefined' !== typeof(sMode) && 'city_only' == sMode) {
-            return (sCity.length ? sCity + ', ': '') + (sState.length ? sState + ', ': '') + sCountry;
-        }
-        sRet = (sCity.length ? sCity + ', ': '') + (sState.length ? sState + ', ': '') + sRet;
-        
-        if (sCity.length)
-            sRet = (sStreet.length && sNum.length ? sNum + ' ' : '') + (sStreet.length ? sStreet + ', ' : '') + sRet;
 
-        if ('undefined' !== typeof(sMode) &&  'address_wo_zip' == sMode) {
-            return sCity.length && sStreet.length ? 
-                    (sStreet.length && sNum.length ? sNum + ' ' : '') + (sStreet.length ? sStreet + ', ' : '') + (sCity.length ? sCity + ', ': '') + (sState.length ? sState : '') : '';
-        }
+        if (sState.length)
+            sRet += '&state=' + encodeURIComponent(sState);
+
+        if (sCity.length)
+            sRet += ('county_as_city' == sMode ? '&county=' : '&city=') + encodeURIComponent(sCity);
+        
+        if (sStreet.length && sMode !== 'no_street_no_zip')
+            sRet += '&street=' + (sNum.length ? encodeURIComponent(sNum) + ' ' : '') + encodeURIComponent(sStreet);
 
         return sRet;
     }
 
-    var geocode = function (a, i, sCountryCode) {
+    var geocode = function (a, i) {
         var s = a[i];
-        $.getJSON('__nominatim_server__/search/?q=' + encodeURIComponent(s) + '&countrycodes=' + sCountryCode + '&addressdetails=1&format=json&limit=1&email=__nominatim_email__', function (oResult) {
+        $.getJSON('__nominatim_server__/search/?addressdetails=1' + s + '&format=json&limit=1&email=__nominatim_email__', function (oResult) {
             glBxLocationFieldPlainGeocodingRequest = false;
             if (('object' === typeof oResult) && oResult.length && ('undefined' !== typeof oResult[0].lat) && ('undefined' !== typeof oResult[0].lon)) {
 
@@ -72,7 +87,7 @@
             else {
                 i += 1;
                 if ('undefined' !== typeof(a[i])) {
-                    geocode(a, i, sCountryCode);
+                    geocode(a, i);
                 }
                 else {
                     $('input[name="__name___lat"]').val(0);
@@ -86,6 +101,8 @@
     var setLocationStatus = function (s) {
         $('.bx-form-input-location-__name__ .bx-form-input-location-status').hide();
         $('.bx-form-input-location-__name__ .bx-form-input-location-status.' + s).show();
+        if ('loading' !== s)
+            disableFormSubmit(false);
     }
 
     setLocationStatus('undef');
@@ -100,26 +117,27 @@
             if ('hidden' == this.type)
                 return;
             
-            var s = getLocationString();
+            var s = getLocationParams();
             if (!s) {
                 setLocationStatus('undef');
                 return;
             }
             var a = [s];
-            if (s = getLocationString('address_wo_zip'))
-                a.push(s);
-            if (s = getLocationString('zip_only'))
-                a.push(s);
-            if (s = getLocationString('city_only'))
-                a.push(s);
+
+            if (s = getLocationParams('zip_only'))
+                 a.push(s);
+
+            if (s = getLocationParams('no_street_no_zip'))
+                 a.push(s);
  
+            disableFormSubmit(true);
             glBxLocationFieldPlainGeocodingRequest = setTimeout(function () {
                 setLocationStatus('loading');
-                geocode(a, 0, $('select[name="__name___country"]').val());
+                geocode(a, 0);
             }, 1500);
         });
 
-        if (getLocationString()) {
+        if (getLocationParams()) {
             if (parseFloat($('input[name="__name___lat"]').val()) && parseFloat($('input[name="__name___lng"]').val()))
                 setLocationStatus('ok');
             else

+ 44 - 4
template/scripts/BxBaseCmts.php

@@ -427,7 +427,7 @@ class BxBaseCmts extends BxDolCmts
             'content' => $sContent,
             'actions' => $sActions,
             'replies' =>  $sReplies,
-        ), $this->_getTmplVarsAuthor($aCmt));
+        ), $this->_getTmplVarsAuthor($aCmt), $this->_getTmplVarsNotes($aCmt));
         
         $sResult = $this->_oTemplate->parseHtmlByName($this->_sTmplNameItem, $aVars);
         
@@ -1056,7 +1056,10 @@ class BxBaseCmts extends BxDolCmts
                 return array('code' => 2, 'message' => '_cmt_err_cannot_perform_action');
         }
 
-        $iCmtUniqId = $this->_oQuery->getUniqId($this->_aSystem['system_id'], $iCmtId, $iCmtAuthorId);
+        $iCmtUniqId = $this->_oQuery->getUniqId($this->_aSystem['system_id'], $iCmtId, [
+            'author_id' => $iCmtAuthorId, 
+            'status_admin' => $this->getStatusAdmin()
+        ]);
 
         if($iCmtParentId) {
             $this->_oQuery->updateRepliesCount($iCmtParentId, 1);
@@ -1138,7 +1141,10 @@ class BxBaseCmts extends BxDolCmts
 
             $iCmtId = (int)$oForm->insert(array('cmt_vparent_id' => $iCmtVisualParentId, 'cmt_object_id' => $this->_iId, 'cmt_author_id' => $iCmtAuthorId, 'cmt_level' => $iLevel, 'cmt_time' => time()));
             if($iCmtId != 0) {
-                $iCmtUniqId = $this->_oQuery->getUniqId($this->_aSystem['system_id'], $iCmtId, $iCmtAuthorId);
+                $iCmtUniqId = $this->_oQuery->getUniqId($this->_aSystem['system_id'], $iCmtId, [
+                    'author_id' => $iCmtAuthorId,
+                    'status_admin' => $this->getStatusAdmin()
+                ]);
 
                 if($this->isAttachImageEnabled())
                     $oForm->processImages($this, 'cmt_image', $iCmtUniqId, $iCmtId, $iCmtAuthorId, true);
@@ -1189,7 +1195,13 @@ class BxBaseCmts extends BxDolCmts
             $sCmtText = $oForm->getCleanValue('cmt_text');
 
             if($oForm->update($iCmtId) !== false) {
-                $iCmtUniqId = $this->_oQuery->getUniqId($this->_aSystem['system_id'], $iCmtId, (int)$aCmt['cmt_author_id']);
+                $iCmtUniqId = $this->_oQuery->getUniqId($this->_aSystem['system_id'], $iCmtId, [
+                    'author_id' => (int)$aCmt['cmt_author_id']
+                ]);
+                
+                $sStatusAdmin = $this->getStatusAdmin();
+                if($sStatusAdmin !== BX_CMT_STATUS_ACTIVE)
+                    $this->_oQuery->updateUniqId(['status_admin' => $sStatusAdmin], ['id' => $iCmtUniqId]);
 
                 if($this->isAttachImageEnabled())
                     $oForm->processImages($this, 'cmt_image', $iCmtUniqId, $iCmtId, $iCmtAuthorId, false);
@@ -1409,6 +1421,34 @@ class BxBaseCmts extends BxDolCmts
         ));
     }
 
+    protected function _getTmplVarsNotes($aCmt)
+    {
+        $aTmplVars = array();
+        
+        //--- Pending status related notes.
+        if($aCmt['cmt_status_admin'] == BX_CMT_STATUS_PENDING)
+            $aTmplVars[] = [
+                'style_prefix' => $this->_sStylePrefix,
+                'bx_if:show_note_color' => [
+                    'condition' => true,
+                    'content' => [
+                        'item_note_color' => 'red3'
+                    ]
+                ],
+                'item_note' => _t('_cmt_txt_note_approve_pending')
+            ];
+
+        return [
+            'bx_if:show_notes' => [
+                'condition' => !empty($aTmplVars),
+                'content' => [
+                    'style_prefix' => $this->_sStylePrefix,
+                    'bx_repeat:notes' => $aTmplVars
+                ]
+            ],
+        ];
+    }
+
     protected function _getTmplVarsAuthor($aCmt)
     {
     	list($sAuthorName, $sAuthorLink, $sAuthorIcon, $sAuthorUnit) = $this->_getAuthorInfo($aCmt['cmt_author_id']);

+ 37 - 24
template/scripts/BxBaseDashboardServices.php

@@ -59,47 +59,60 @@ class BxBaseDashboardServices extends BxDol
     {
         return bx_srv('system', 'manage_tools', array(), 'TemplAuditServices');
     }
-    
+
     public function serviceManageContent()
     {
         $oMenu = BxDolMenu::getObjectInstance('sys_dashboard_content');
         if(!$oMenu)
             return '';
 
-        $BxDolModuleQuery = BxDolModuleQuery::getInstance();
-        $aModules = $BxDolModuleQuery->getModulesBy(array('type' => 'modules', 'active' => 1));
-    	$aModulesList = array();
-        foreach($aModules as $iKey => $aModule){
+        $aModules = BxDolModuleQuery::getInstance()->getModulesBy(['type' => 'modules', 'active' => 1]);
+
+    	$aModulesList = [];
+        foreach($aModules as $aModule) {
             $oModule = BxDolModule::getInstance($aModule['name']);
-            if ($oModule instanceof iBxDolContentInfoService && BxDolRequest::serviceExists($aModule['name'], 'manage_tools')){
-                $aModule['selected'] = false;
+            if($oModule instanceof iBxDolContentInfoService && BxDolRequest::serviceExists($aModule['name'], 'manage_tools')) {
                 $aModulesList[$aModule['uri']] = $aModule;
             }
-            else{
-                unset($aModules[$iKey]);
-            }
         }
-        $aModules = array_values($aModules);
-        $sSelected = bx_get('module');
-        
-        if ($sSelected == ''){
-            $aModulesList[$aModules[0]['uri']]['selected'] = true; 
-            $sSelected = $aModules[0]['uri'];
+
+        $sSelected = bx_get('module');        
+        if($sSelected == '')
+            $sSelected = reset($aModulesList)['uri'];
+
+        $sContent = '';
+        if(isset($aModulesList[$sSelected])) {
+            $sSelectedModule = $aModulesList[$sSelected]['name'];
+
+            $aBlock = bx_srv($sSelectedModule, 'manage_tools', array('administration'));
+            if(!empty($aBlock) && is_array($aBlock))
+                $sContent = $aBlock['content'];
         }
-        else{
-            $aModulesList[$sSelected]['selected'] = true;
+        else {
+            $sSelectedModule = 'system';
+
+            $sMethod = '_getManageContent' . bx_gen_method_name($sSelected);
+            if(method_exists($this, $sMethod))
+                $sContent = $this->$sMethod();
         }
-        
+
         $oMenu->setMenuData($aModulesList);
-        
-        $aGrid = BxDolService::call($aModulesList[$sSelected]['name'], 'manage_tools', array('administration'));
-     
+        $oMenu->setSelected($sSelectedModule, $sSelected);
+
     	return array(
-            'content' => $aGrid['content'],
+            'content' => $sContent,
             'menu' => $oMenu
         );
     }
-    
+
+    protected function _getManageContentCmts()
+    {
+        $aBlock = bx_srv('system', 'manage_tools', ['administration'], 'TemplCmtsServices');
+        if(empty($aBlock) || !is_array($aBlock))
+            return '';
+
+        return $aBlock['content'];
+    }
 }
 
 /** @} */

+ 14 - 19
template/scripts/BxBaseMenuDashboardContentManage.php

@@ -28,23 +28,24 @@ class BxBaseMenuDashboardContentManage extends BxTemplMenuCustom
     {
         $this->_aModulesList = $aModulesList;
     }
-    
+
     protected function getMenuItemsRaw ()
     {
-        $aResult = array();
+        $aResult = parent::getMenuItemsRaw();
+
         $aUrl = bx_get_base_url_inline();
-        
         foreach($this->_aModulesList as $aModule){
-            $aResult[$aModule['name']] = array(
-                'name' => $aModule['name'],
+            $aResult[] = [
+                'module' => $aModule['name'],
+                'name' => $aModule['uri'],
                 'title' => $aModule['title'],
-                'link' => bx_append_url_params($aUrl[0], array_merge($aUrl[1], array('module' => $aModule['uri']))),
-                'active' => true,
-                'selected' => $aModule['selected']//todo selected
-            );                
+                'link' => bx_append_url_params($aUrl[0], array_merge($aUrl[1], ['module' => $aModule['uri']])),
+                'active' => 1,
+            ];
     	}
-        if(!empty($aResult) && is_array($aResult)){
-            $aResult['more-auto'] = array(
+
+        if(!empty($aResult) && is_array($aResult)) {
+            $aResult['more-auto'] = [
                 'module' => 'system', 
                 'id' => 'more-auto', 
                 'name' => 'more-auto',
@@ -52,17 +53,11 @@ class BxBaseMenuDashboardContentManage extends BxTemplMenuCustom
                 'title' => '_sys_menu_item_title_va_more_auto', 
                 'href' => 'javascript:void(0)', 
                 'icon' => 'ellipsis-v',
-            );
+            ];
         }
+
         return $aResult;
     }
-    
-    protected function _isSelected ($a)
-    {
-        if (isset($a['selected']))
-            return $a['selected'];
-        return false;
-    }
 }
 
 /** @} */