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

Ticket #5425 - Tasks: Functionality improvements. Stage 2.

AntonLV 7 месяцев назад
Родитель
Сommit
d6b09e08b9

+ 2 - 0
modules/boonex/russian/data/langs/bx_tasks/ru.xml

@@ -170,6 +170,8 @@
     <string name="_bx_tasks_page_title_browse_updated"><![CDATA[Обновлённые Задания]]></string>
     <string name="_bx_tasks_page_title_sys_home"><![CDATA[Задания - Домой]]></string>
     <string name="_bx_tasks_page_title_home"><![CDATA[Задания]]></string>
+    <string name="_bx_tasks_page_block_title_sys_home_entries"><![CDATA[Задания]]></string>
+    <string name="_bx_tasks_page_block_title_home_entries"><![CDATA[Задания]]></string>
     <string name="_bx_tasks_page_block_title_featured_entries_view_extended"><![CDATA[Продвинутые Задания]]></string>
     <string name="_bx_tasks_page_block_title_recent_entries"><![CDATA[Недавние Задания (Галерея)]]></string>
     <string name="_bx_tasks_page_block_title_recent_entries_view_extended"><![CDATA[Недавние Задания]]></string>

+ 1 - 0
modules/boonex/tasks/classes/BxTasksConfig.php

@@ -34,6 +34,7 @@ class BxTasksConfig extends BxBaseModTextConfig
             // database tables
             'TABLE_ENTRIES' => $aModule['db_prefix'] . 'tasks',
             'TABLE_LISTS' => $aModule['db_prefix'] . 'lists',
+            'TABLE_ASSIGNMENTS' => $aModule['db_prefix'] . 'assignments',
             'TABLE_TIME' => $aModule['db_prefix'] . 'time',
             'TABLE_TIME_TRACK' => $aModule['db_prefix'] . 'time_track',
             'TABLE_TIMERS' => $aModule['db_prefix'] . 'timers',

+ 20 - 2
modules/boonex/tasks/classes/BxTasksDb.php

@@ -45,7 +45,7 @@ class BxTasksDb extends BxBaseModTextDb
         $this->query($sQuery);
     }
 	
-    public function getTasks ($iContextId = 0, $iListId = 0, $bWithStats = false)
+    public function getTasks ($iContextId = 0, $iListId = 0, $iProfileId = 0, $bWithStats = false)
     {
         $CNF = &$this->_oConfig->CNF;
 
@@ -63,6 +63,12 @@ class BxTasksDb extends BxBaseModTextDb
             $sWhereClause .= " AND `te`.`" . $sField . "` = :" . $sField;
         }
 
+        if($iProfileId) {
+            $aBindings['profile_id'] = $iProfileId;
+            $sJoinClause .= " LEFT JOIN `" . $CNF['TABLE_ASSIGNMENTS'] . "` AS `ta` ON `te`.`id`=`ta`.`content`";
+            $sWhereClause .= " AND (`te`.`" . $CNF['FIELD_AUTHOR'] . "`=:profile_id OR `ta`.`initiator`=:profile_id)";
+        }
+
         if(($oCf = BxDolContentFilter::getInstance()) && $oCf->isEnabled())
             $sWhereClause .= $oCf->getSQLParts('te', $CNF['FIELD_CF']);
 
@@ -157,7 +163,19 @@ class BxTasksDb extends BxBaseModTextDb
 
     public function getContextsIdsByType($sType, $iProfileId)
     {
-        return $this->getColumn('SELECT `tp`.`id` FROM `bx_tasks_tasks` AS `tt` INNER JOIN `sys_profiles` AS `tp` ON ABS(`tt`.`allow_view_to`)=`tp`.`id` WHERE `tp`.`type`=:type AND `tt`.`author`=:author GROUP BY `tp`.`id`', [
+        $CNF = $this->_oConfig->CNF;
+
+        //--- Add own tasks
+        $sQuery = '(SELECT `tp`.`id` FROM `' . $CNF['TABLE_ENTRIES'] . '` AS `tt` INNER JOIN `sys_profiles` AS `tp` ON ABS(`tt`.`allow_view_to`)=`tp`.`id` AND `tp`.`type`=:type WHERE `tt`.`author`=:author GROUP BY `tp`.`id`)';
+
+        //--- Add assigned tasks
+        $oAssignments = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTION']);
+        $aSql = $oAssignments->getConnectedContentAsSQLParts('tt', 'id', $iProfileId);
+
+        if($aSql && ($sJoin = $aSql['join'] ?? false))
+            $sQuery .= ' UNION (SELECT `tp`.`id` FROM `' . $CNF['TABLE_ENTRIES'] . '` AS `tt` INNER JOIN `sys_profiles` AS `tp` ON ABS(`tt`.`allow_view_to`)=`tp`.`id` AND `tp`.`type`=:type ' . $sJoin . ' WHERE 1)';
+
+        return $this->getColumn($sQuery, [
             'type' => $sType,
             'author' => $iProfileId
         ]);

+ 0 - 18
modules/boonex/tasks/classes/BxTasksGridCommon.php

@@ -11,20 +11,10 @@
 
 class BxTasksGridCommon extends BxBaseModTextGridCommon
 {
-    /**
-     * Context module
-     */
     protected $_sFilter3Name;
     protected $_sFilter3Value;
     protected $_aFilter3Values;
 
-    /**
-     * Context entry
-     */
-    protected $_sFilter4Name;
-    protected $_sFilter4Value;
-    protected $_aFilter4Values;
-
     public function __construct ($aOptions, $oTemplate = false)
     {
     	$this->MODULE = 'bx_tasks';
@@ -33,11 +23,6 @@ class BxTasksGridCommon extends BxBaseModTextGridCommon
         $this->_sTableAlias = 'tt';
 
         $this->_initFilter(3, $this->_oModule->getContexts());
-        if(($sValue = bx_get('cxt_m')) !== false)
-            $this->_setFilterValue(3, $sValue);
-
-        if(($sValue = bx_get('cxt_id')) !== false)
-            $this->_setFilterValue(4, $sValue);
     }
 
     protected function _getCellContextModule($mixedValue, $sKey, $aField, $aRow)
@@ -58,9 +43,6 @@ class BxTasksGridCommon extends BxBaseModTextGridCommon
         if(!empty($this->_sFilter3Value))
             $this->_aOptions['source'] .= $this->_oModule->_oDb->prepareAsString(" AND `tp`.`type`=?", $this->_sFilter3Value);
 
-        if(!empty($this->_sFilter4Value))
-            $this->_aOptions['source'] .= $this->_oModule->_oDb->prepareAsString(" AND `tp`.`id`=?", $this->_sFilter4Value);
-
         return parent::_getDataSql($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);
     }
 }

+ 20 - 5
modules/boonex/tasks/classes/BxTasksMenuBrowse.php

@@ -13,10 +13,15 @@ class BxTasksMenuBrowse extends BxTemplMenu
     protected $_sModule;
     protected $_oModule;
 
+    protected $_iProfileId;
+
     protected $_oPermalink;
     protected $_sPageLink;
     protected $_aPageParams;
 
+    protected $_sParamName;
+    protected $_iParamValue;
+
     public function __construct($aObject, $oTemplate = false)
     {
         $this->_sModule = 'bx_tasks';
@@ -26,18 +31,28 @@ class BxTasksMenuBrowse extends BxTemplMenu
 
         $this->_isMultilevel = true;
 
+        $this->_iProfileId = 0;
+
         $this->_oPermalink = BxDolPermalinks::getInstance();
         list($this->_sPageLink, $this->_aPageParams) = bx_get_base_url_inline();
+
+        $this->_sParamName = 'context_pid';
+        if(($iParamValue = bx_get($this->_sParamName)) !== false)
+            $this->_iParamValue = (int)$iParamValue;
+    }
+    
+    public function setProfileId($iProfileId)
+    {
+        $this->_iProfileId = $iProfileId;
     }
 
     protected function getMenuItemsRaw ()
     {
-        $iProfile = bx_get_logged_profile_id();
         $aContexts = $this->_oModule->getContexts();
 
         $aMenuItems = [];
         foreach($aContexts as $sName => $sTitle) {
-            $aSubmenu = $this->_getMenuSubitems($iProfile, $sName);
+            $aSubmenu = $this->_getMenuSubitems($this->_iProfileId, $sName);
             if(empty($aSubmenu))
                 continue;
 
@@ -69,10 +84,10 @@ class BxTasksMenuBrowse extends BxTemplMenu
             $aSubmenu[] = [
                 'id' => 'context-' . $iId, 
                 'name' => 'context-' . $iId, 
-                'class' => '', 
+                'class_add' => $iId == $this->_iParamValue ? 'bx-menu-tab-active' : '',
+                'class' => '',
                 'link' => $this->_oPermalink->permalink(bx_append_url_params($this->_sPageLink, array_merge($this->_aPageParams, [
-                    'cxt_m' => $sContextModule,
-                    'cxt_id' => $iId
+                    $this->_sParamName => $iId
                 ]))), 
                 'onclick' => '', 
                 'target' => '_self', 

+ 33 - 19
modules/boonex/tasks/classes/BxTasksModule.php

@@ -388,19 +388,16 @@ class BxTasksModule extends BxBaseModTextModule implements iBxDolCalendarService
 
     public function serviceGetBlockMenuBrowse()
     {
-        $CNF = &$this->_oConfig->CNF;
-
-        $oMenu = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_BROWSE']);
-        if(!$oMenu)
-            return '';
-
-        return $oMenu->getCode();            
+        return $this->_oTemplate->getBlockMenuBrowse();
     }
 
     public function serviceGetBlockMenuContext($iProfileId)
     {
         $CNF = &$this->_oConfig->CNF;
 
+        if(!$this->isAllowView($iProfileId))
+            return ''; 
+
         $oMenu = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_SUBMENU_VIEW_CONTEXT']);
         if(!$oMenu)
             return '';
@@ -757,8 +754,30 @@ class BxTasksModule extends BxBaseModTextModule implements iBxDolCalendarService
         $aSQLPart['where'] = " AND " . $CNF['TABLE_ENTRIES'] . ".`" . $CNF['FIELD_ID'] . "` IN(" . implode(',', $aData2) . ")";
         return $this->_oDb->getEntriesByDate(bx_get('start'), bx_get('end'), null, $aSQLPart);
     }
-	
-    public function serviceBrowseContext ($iProfileId = 0, $aParams = array())
+
+    public function serviceBrowseHome($aParams = [])
+    {
+        $iContextPid = bx_process_input(bx_get('context_pid'), BX_DATA_INT);
+        if(!$iContextPid)
+            return MsgBox(_t('_Empty'));
+
+        $sContent = $this->serviceBrowseTasks(-$iContextPid, array_merge($aParams, [
+            'for_profile' => bx_get_logged_profile_id()
+        ]));
+        
+        if($sContent && ($oProfile = BxDolProfile::getInstance($iContextPid)) !== false)
+            return [
+                'title' => bx_replace_markers(_t('_bx_tasks_page_block_title_entries_in_context'), [
+                    'display_name' => $oProfile->getDisplayName(),
+                    'profile_link' => $oProfile->getUrl()
+                ]),
+                'content' => $sContent
+            ];
+
+        return $sContent;
+    }
+
+    public function serviceBrowseContext($iProfileId = 0, $aParams = [])
     {
         if(!$iProfileId)
             $iProfileId = bx_process_input(bx_get('profile_id'), BX_DATA_INT);
@@ -767,18 +786,13 @@ class BxTasksModule extends BxBaseModTextModule implements iBxDolCalendarService
 
         return $this->serviceBrowseTasks (-$iProfileId, $aParams);
     }
-	
-    public function serviceBrowseTasks ($iContextId = 0, $aParams = array())
-    {
-        $_iContextId = abs($iContextId);
-
-        if(!$this->isAllowView($_iContextId))
-            return;  
 
-        if(!($oProfileContext = BxDolProfile::getInstance($_iContextId)) || $oProfileContext->checkAllowedProfileView($_iContextId) !== CHECK_ACTION_RESULT_ALLOWED)
-            return false;
+    public function serviceBrowseTasks($iContextId = 0, $aParams = [])
+    {
+        if(!$this->isAllowView(abs($iContextId)))
+            return '';
 
-        return $this->_oTemplate->getEntriesList($iContextId);
+        return $this->_oTemplate->getEntriesList($iContextId, $aParams);
     }
 
     /**

+ 38 - 6
modules/boonex/tasks/classes/BxTasksTemplate.php

@@ -44,6 +44,38 @@ class BxTasksTemplate extends BxBaseModTextTemplate
             parent::getJsCode($sType, $aParams, $mixedWrap);
     }
     
+    public function getBlockMenuBrowse()
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $iProfileId = bx_get_logged_profile_id();
+
+        $sMenuManage = '';
+        if(($oMenu = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_MANAGE_TOOLS_SUBMENU'])) !== false)
+            $sMenuManage = $oMenu->getCode();
+
+        $sMenuBrowse = '';
+        if(($oMenu = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_BROWSE'])) !== false) {
+            $oMenu->setProfileId($iProfileId);
+            $sMenuBrowse = $oMenu->getCode();
+        }
+
+        return $this->parseHtmlByName('menu_browse.html', [
+            'bx_if:show_menu_manage' => [
+                'condition' => $sMenuManage != '',
+                'content' => [
+                    'menu_manage' => $sMenuManage
+                ]
+            ],
+            'bx_if:show_menu_browse' => [
+                'condition' => $sMenuBrowse != '',
+                'content' => [
+                    'menu_browse' => $sMenuBrowse
+                ]
+            ]
+        ]);
+    }
+    
     /**
      * Use Gallery image for both because currently there is no Unit types with small thumbnails.
      */
@@ -203,10 +235,11 @@ class BxTasksTemplate extends BxBaseModTextTemplate
         ]);
     }
 
-    public function getEntriesList($iContextId)
+    public function getEntriesList($iContextId, $aParams = [])
     {
         $CNF = &$this->_oConfig->CNF;
 
+        $oModule = $this->getModule();
         $oPermalinks = BxDolPermalinks::getInstance();
         $oConnection = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTION']);
 
@@ -219,16 +252,15 @@ class BxTasksTemplate extends BxBaseModTextTemplate
             $aFilterValues = json_decode($_COOKIE[$CNF['COOKIE_SETTING_KEY']], true);
 
         $_iContextId = abs($iContextId);
-
-        $oModule = $this->getModule();
         $bAllowAdd = $oModule->isAllowAdd($_iContextId);
         $bAllowManage = $oModule->isAllowManageByContext($_iContextId);
-
-        $aLists = $this->_oDb->getLists($iContextId);
+        $iForProfile = (int)($aParams['for_profile'] ?? 0);
 
         $aTmplVarsLists = [];
+
+        $aLists = $this->_oDb->getLists($iContextId);
         foreach($aLists as $aList) {
-            $aTasks = $this->_oDb->getTasks($iContextId, $aList['id'], true);
+            $aTasks = $this->_oDb->getTasks($iContextId, $aList['id'], $iForProfile, true);
 
             $aTmplVarsTasks = [];
             foreach($aTasks as $aTask) {

+ 2 - 0
modules/boonex/tasks/install/langs/en.xml

@@ -170,6 +170,8 @@
     <string name="_bx_tasks_page_title_browse_updated"><![CDATA[Updated Tasks]]></string>
     <string name="_bx_tasks_page_title_sys_home"><![CDATA[Tasks Home]]></string>
     <string name="_bx_tasks_page_title_home"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_sys_home_entries"><![CDATA[Tasks]]></string>
+    <string name="_bx_tasks_page_block_title_home_entries"><![CDATA[Tasks]]></string>
     <string name="_bx_tasks_page_block_title_featured_entries_view_extended"><![CDATA[Featured Tasks]]></string>
     <string name="_bx_tasks_page_block_title_recent_entries"><![CDATA[Latest Tasks (Gallery View)]]></string>
     <string name="_bx_tasks_page_block_title_recent_entries_view_extended"><![CDATA[Latest Tasks]]></string>

+ 12 - 5
modules/boonex/tasks/install/sql/enable.sql

@@ -86,6 +86,14 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_tasks_context', 3, 'bx_tasks', '_bx_tasks_page_block_title_sys_entries_in_context', '_bx_tasks_page_block_title_entries_in_context', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_tasks\";s:6:\"method\";s:14:\"browse_context\";}', 0, 0, 1, 1),
 ('bx_tasks_context', 4, 'bx_tasks', '_bx_tasks_page_block_title_sys_calendar_in_context', '_bx_tasks_page_block_title_calendar_in_context', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:8:"calendar";s:12:"ignore_cache";b:1;s:6:"params";a:1:{i:0;a:1:{s:10:"context_id";s:12:"{profile_id}";}}}', 0, 0, 1, 2);
 
+-- PAGE: module home
+INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
+('bx_tasks_home', 'tasks-home', '_bx_tasks_page_title_sys_home', '_bx_tasks_page_title_home', 'bx_tasks', 13, 2147483647, 1, 'page.php?i=tasks-home', '', '', '', 0, 1, 0, 'BxTasksPageBrowse', 'modules/boonex/tasks/classes/BxTasksPageBrowse.php');
+
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES 
+('bx_tasks_home', 2, 'bx_tasks', '_bx_tasks_page_block_title_system_menu_browse', '_bx_tasks_page_block_title_menu_browse', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:21:"get_block_menu_browse";}', 0, 1, 1, 0),
+('bx_tasks_home', 3, 'bx_tasks', '_bx_tasks_page_block_title_sys_home_entries', '_bx_tasks_page_block_title_home_entries', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:11:"browse_home";}', 0, 1, 1, 1);
+
 -- PAGE: entries' time in context (own)
 INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_tasks_context_time', 'tasks-context-time', '_bx_tasks_page_title_sys_entries_time_in_context', '_bx_tasks_page_title_entries_time_in_context', 'bx_tasks', 13, 510, 1, '', '', '', '', 0, 1, 0, 'BxTasksPageAuthor', 'modules/boonex/tasks/classes/BxTasksPageAuthor.php');
@@ -104,11 +112,10 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 
 -- PAGE: manage own entries
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
-('bx_tasks_manage', '_bx_tasks_page_title_sys_manage', '_bx_tasks_page_title_manage', 'bx_tasks', 13, 2147483647, 1, 'tasks-manage', 'page.php?i=tasks-manage', '', '', '', 0, 1, 0, 'BxTasksPageBrowse', 'modules/boonex/tasks/classes/BxTasksPageBrowse.php');
+('bx_tasks_manage', '_bx_tasks_page_title_sys_manage', '_bx_tasks_page_title_manage', 'bx_tasks', 5, 2147483647, 1, 'tasks-manage', 'page.php?i=tasks-manage', '', '', '', 0, 1, 0, 'BxTasksPageBrowse', 'modules/boonex/tasks/classes/BxTasksPageBrowse.php');
 
 INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
-('bx_tasks_manage', 2, 'bx_tasks', '_bx_tasks_page_block_title_system_menu_browse', '_bx_tasks_page_block_title_menu_browse', 13, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:21:"get_block_menu_browse";}', 0, 1, 0),
-('bx_tasks_manage', 3, 'bx_tasks', '_bx_tasks_page_block_title_system_manage', '_bx_tasks_page_block_title_manage', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:12:"manage_tools";}', 0, 1, 0);
+('bx_tasks_manage', 1, 'bx_tasks', '_bx_tasks_page_block_title_system_manage', '_bx_tasks_page_block_title_manage', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:12:"manage_tools";}', 0, 1, 0);
 
 -- PAGE: manage all entries
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
@@ -133,7 +140,7 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 
 -- PAGE: timers
 INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
-('bx_tasks_timers', '_bx_tasks_page_title_sys_timers', '_bx_tasks_page_title_timers', 'bx_tasks', 5, 192, 1, 'tasks-timers', 'page.php?i=tasks-timers', '', '', '', 0, 1, 0, 'BxTasksPageBrowse', 'modules/boonex/tasks/classes/BxTasksPageBrowse.php');
+('bx_tasks_timers', '_bx_tasks_page_title_sys_timers', '_bx_tasks_page_title_timers', 'bx_tasks', 5, 2147483647, 1, 'tasks-timers', 'page.php?i=tasks-timers', '', '', '', 0, 1, 0, 'BxTasksPageBrowse', 'modules/boonex/tasks/classes/BxTasksPageBrowse.php');
 
 INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
 ('bx_tasks_timers', 1, 'bx_tasks', '_bx_tasks_page_block_title_system_timers', '_bx_tasks_page_block_title_timers', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_tasks";s:6:"method";s:16:"get_block_timers";}', 0, 1, 0);
@@ -142,7 +149,7 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 -- MENU: add to site menu
 SET @iSiteMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_site' AND `active` = 1 AND `order` < 9999 ORDER BY `order` DESC LIMIT 1);
 INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
-('sys_site', 'bx_tasks', 'tasks-manage', '_bx_tasks_menu_item_title_system_entries_home', '_bx_tasks_menu_item_title_entries_home', 'page.php?i=tasks-manage', '', '', 'tasks', '', 2147483647, 1, 1, IFNULL(@iSiteMenuOrder, 0) + 1);
+('sys_site', 'bx_tasks', 'tasks-home', '_bx_tasks_menu_item_title_system_entries_home', '_bx_tasks_menu_item_title_entries_home', 'page.php?i=tasks-home', '', '', 'tasks', '', 2147483647, 1, 1, IFNULL(@iSiteMenuOrder, 0) + 1);
 
 -- MENU: create task form attachments (link, photo, video, etc)
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 

+ 15 - 0
modules/boonex/tasks/template/menu_browse.html

@@ -0,0 +1,15 @@
+<div class="bx-tasks-menu-browse">
+    <div class="bx-tasks-menu-browse-cnt">
+        <bx_if:show_menu_manage>
+            <div class="bx-tasks-mb-manage">
+                __menu_manage__
+            </div>
+            <div class="bx-tasks-mb-div bx-def-hr my-4"></div>
+        </bx_if:show_menu_manage>
+        <bx_if:show_menu_browse>
+            <div class="bx-tasks-mb-browse">
+                __menu_browse__
+            </div>
+        </bx_if:show_menu_browse>
+    </div>
+</div>