Browse Source

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

AntonLV 7 tháng trước cách đây
mục cha
commit
26985305b1

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

@@ -260,6 +260,8 @@
     <string name="_bx_tasks_page_block_title_entries_time_in_context"><![CDATA[Мое время в <a href="{profile_link}">{display_name}</a>]]></string>
     <string name="_bx_tasks_page_block_title_sys_entries_time_in_context_administration"><![CDATA[Всё время в контексте]]></string>
     <string name="_bx_tasks_page_block_title_entries_time_in_context_administration"><![CDATA[Всё время в <a href="{profile_link}">{display_name}</a>]]></string>
+    <string name="_bx_tasks_page_block_title_system_menu_browse"><![CDATA[Меню просмотра]]></string>
+    <string name="_bx_tasks_page_block_title_menu_browse"><![CDATA[Просмотр задач]]></string>
 
     <!-- Menus -->
     <string name="_bx_tasks_menu_title_entry_attachments"><![CDATA[Форма - Прикрепления]]></string>
@@ -342,6 +344,8 @@
     <string name="_bx_tasks_menu_item_title_mt_submenu_time_common"><![CDATA[Моё время]]></string>
     <string name="_bx_tasks_menu_item_title_mt_submenu_time_administration"><![CDATA[Всё время]]></string>
     <string name="_bx_tasks_menu_item_title_mt_submenu_timers"><![CDATA[Мои таймеры]]></string>
+    <string name="_bx_tasks_menu_title_browse"><![CDATA[Просмотр задач]]></string>
+    <string name="_bx_tasks_menu_set_title_browse"><![CDATA[Просмотр задач]]></string>
 
     <!-- Grids -->
     <string name="_bx_tasks_grid_filter_item_title_adm_select_one_filter1"><![CDATA[Все статусы]]></string>

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

@@ -165,6 +165,7 @@ class BxTasksConfig extends BxBaseModTextConfig
             'OBJECT_MENU_SUBMENU_VIEW_CONTEXT' => 'bx_tasks_view_context_submenu',
             'OBJECT_MENU_MANAGE_TOOLS_SUBMENU' => 'bx_tasks_manage_tools_submenu',
             'OBJECT_MENU_MANAGE_TOOLS' => 'bx_tasks_menu_manage_tools', //manage item menu in content administration tools
+            'OBJECT_MENU_BROWSE' => 'bx_tasks_browse',
             'OBJECT_GRID_ADMINISTRATION' => 'bx_tasks_administration',
             'OBJECT_GRID_COMMON' => 'bx_tasks_common',
             'OBJECT_GRID_TIME_ADMINISTRATION' => 'bx_tasks_time_administration',

+ 8 - 0
modules/boonex/tasks/classes/BxTasksDb.php

@@ -155,6 +155,14 @@ class BxTasksDb extends BxBaseModTextDb
         return count($aResult) == (int)$this->query("UPDATE `" . $CNF['TABLE_ENTRIES'] . "` SET `" . $CNF['FIELD_EXPIRED'] . "` = '1' WHERE `id` IN (" . $this->implode_escape($aResult) . ")") ? $aResult : false;
     }
 
+    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`', [
+            'type' => $sType,
+            'author' => $iProfileId
+        ]);
+    }
+
     public function getTimeTracks($aParams = []) 
     {
         $CNF = &$this->_oConfig->CNF;

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

@@ -11,10 +11,20 @@
 
 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';
@@ -23,6 +33,11 @@ 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)
@@ -43,6 +58,9 @@ 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);
     }
 }

+ 89 - 0
modules/boonex/tasks/classes/BxTasksMenuBrowse.php

@@ -0,0 +1,89 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksMenuBrowse extends BxTemplMenu
+{
+    protected $_sModule;
+    protected $_oModule;
+
+    protected $_oPermalink;
+    protected $_sPageLink;
+    protected $_aPageParams;
+
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->_sModule = 'bx_tasks';
+    	$this->_oModule = BxDolModule::getInstance($this->_sModule);
+
+        parent::__construct($aObject, $oTemplate);
+
+        $this->_isMultilevel = true;
+
+        $this->_oPermalink = BxDolPermalinks::getInstance();
+        list($this->_sPageLink, $this->_aPageParams) = bx_get_base_url_inline();
+    }
+
+    protected function getMenuItemsRaw ()
+    {
+        $iProfile = bx_get_logged_profile_id();
+        $aContexts = $this->_oModule->getContexts();
+
+        $aMenuItems = [];
+        foreach($aContexts as $sName => $sTitle) {
+            $aSubmenu = $this->_getMenuSubitems($iProfile, $sName);
+            if(empty($aSubmenu))
+                continue;
+
+            $aMenuItems[] = [
+                'name' => $sName, 
+                'class' => '', 
+                'link' => 'javascript:void(0)', 
+                'onclick' => "javascript:bx_menu_toggle(this, '" . $this->_sObject . "', '" . $sName . "')",
+                'target' => '_self', 
+                'icon' => bx_is_srv($sName, 'module_icon') ? bx_srv($sName, 'module_icon') : '',
+                'title' => $sTitle,
+                'subitems' => $aSubmenu
+            ];
+        }
+
+        return $aMenuItems;
+    }
+
+    protected function _getMenuSubitems($iProfile, $sContextModule)
+    {
+        $aIds = $this->_oModule->_oDb->getContextsIdsByType($sContextModule, $iProfile);
+
+        $aSubmenu = [];
+        foreach($aIds as $iId) {
+            $oContext = BxDolProfile::getInstance($iId);
+            if(!$oContext)
+                continue;
+
+            $aSubmenu[] = [
+                'id' => 'context-' . $iId, 
+                'name' => 'context-' . $iId, 
+                'class' => '', 
+                'link' => $this->_oPermalink->permalink(bx_append_url_params($this->_sPageLink, array_merge($this->_aPageParams, [
+                    'cxt_m' => $sContextModule,
+                    'cxt_id' => $iId
+                ]))), 
+                'onclick' => '', 
+                'target' => '_self', 
+                'title' => $oContext->getDisplayName(), 
+                'icon' => $oContext->getIcon(),
+                'active' => 1
+            ];
+        }
+
+        return $aSubmenu;
+    }
+}
+
+/** @} */

+ 11 - 0
modules/boonex/tasks/classes/BxTasksModule.php

@@ -386,6 +386,17 @@ 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();            
+    }
+
     public function serviceGetBlockMenuContext($iProfileId)
     {
         $CNF = &$this->_oConfig->CNF;

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

@@ -156,6 +156,7 @@ class BxTasksTemplate extends BxBaseModTextTemplate
             ];
         }
 
+        $this->addCss(['timer.css']);
         $this->addJs(['timer.js']);
         return $this->parseHtmlByName('browse_timers.html', [
             'js_code' => $this->getJsCode('timer', [

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

@@ -260,6 +260,8 @@
     <string name="_bx_tasks_page_block_title_entries_time_in_context"><![CDATA[My Time in <a href="{profile_link}">{display_name}</a>]]></string>
     <string name="_bx_tasks_page_block_title_sys_entries_time_in_context_administration"><![CDATA[All time in context]]></string>
     <string name="_bx_tasks_page_block_title_entries_time_in_context_administration"><![CDATA[All Time in <a href="{profile_link}">{display_name}</a>]]></string>
+    <string name="_bx_tasks_page_block_title_system_menu_browse"><![CDATA[Browse menu]]></string>
+    <string name="_bx_tasks_page_block_title_menu_browse"><![CDATA[Browse]]></string>
 
     <!-- Menus -->
     <string name="_bx_tasks_menu_title_entry_attachments"><![CDATA[Form Attachments]]></string>
@@ -344,6 +346,8 @@
     <string name="_bx_tasks_menu_item_title_mt_submenu_time_common"><![CDATA[My Time]]></string>
     <string name="_bx_tasks_menu_item_title_mt_submenu_time_administration"><![CDATA[All Time]]></string>
     <string name="_bx_tasks_menu_item_title_mt_submenu_timers"><![CDATA[My Timers]]></string>
+    <string name="_bx_tasks_menu_title_browse"><![CDATA[Browse Tasks]]></string>
+    <string name="_bx_tasks_menu_set_title_browse"><![CDATA[Browse Tasks]]></string>
 
     <!-- Grids -->
     <string name="_bx_tasks_grid_filter_item_title_adm_select_one_filter1"><![CDATA[All Statuses]]></string>

+ 1 - 1
modules/boonex/tasks/install/sql/disable.sql

@@ -13,7 +13,7 @@ DELETE FROM `sys_pages_blocks` WHERE `module` = 'bx_tasks' OR `object` IN('bx_ta
 -- MENU
 DELETE FROM `sys_objects_menu` WHERE `module` = 'bx_tasks';
 DELETE FROM `sys_menu_sets` WHERE `module` = 'bx_tasks';
-DELETE FROM `sys_menu_items` WHERE `module` = 'bx_tasks' OR `set_name` IN('bx_tasks_create_task_attachments', 'bx_tasks_view', 'bx_tasks_view_actions', 'bx_tasks_view_submenu', 'bx_tasks_view_context_submenu', 'bx_tasks_menu_manage_tools', 'bx_tasks_manage_tools_submenu');
+DELETE FROM `sys_menu_items` WHERE `module` = 'bx_tasks' OR `set_name` IN('bx_tasks_create_task_attachments', 'bx_tasks_view', 'bx_tasks_view_actions', 'bx_tasks_view_submenu', 'bx_tasks_view_context_submenu', 'bx_tasks_menu_manage_tools', 'bx_tasks_manage_tools_submenu', 'bx_tasks_browse');
 
 -- PRIVACY 
 DELETE FROM `sys_objects_privacy` WHERE `object` = 'bx_tasks_allow_view_to';

+ 10 - 2
modules/boonex/tasks/install/sql/enable.sql

@@ -104,10 +104,11 @@ 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', 5, 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', 13, 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', 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);
+('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);
 
 -- 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 
@@ -249,6 +250,13 @@ INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES
 --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 
 --('bx_tasks_menu_manage_tools', 'bx_tasks', 'delete-with-content', '_bx_tasks_menu_item_title_system_delete_with_content', '_bx_tasks_menu_item_title_delete_with_content', 'javascript:void(0)', 'javascript:{js_object}.onClickDeleteWithContent({content_id});', '_self', 'far trash-alt', '', 128, 1, 0, 0);
 
+-- MENU: browse
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_tasks_browse', '_bx_tasks_menu_title_browse', 'bx_tasks_browse', 'bx_tasks', 32, 0, 1, 'BxTasksMenuBrowse', 'modules/boonex/tasks/classes/BxTasksMenuBrowse.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_tasks_browse', 'bx_tasks', '_bx_tasks_menu_set_title_browse', 0);
+
 -- MENU: add menu item to profiles modules (trigger* menu sets are processed separately upon modules enable/disable)
 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 
 ('trigger_group_view_submenu', 'bx_tasks', 'tasks-context', '_bx_tasks_menu_item_title_system_view_entries_in_context', '_bx_tasks_menu_item_title_view_entries_in_context', 'page.php?i=tasks-context&profile_id={profile_id}', '', '', 'tasks', '', 510, 1, 0, 0);

+ 7 - 7
modules/boonex/tasks/template/browse_timers.html

@@ -6,16 +6,16 @@ __js_code__
                 <div class="bx-tasks-section-ttl mb-2 text-xl">__section_title__</div>
                 <div class="bx-tasks-section-cnt flex flex-wrap -m-2">
                     <bx_repeat:timers>
-                        <div class="bx-tasks-timer-wrp w-1/4">
-                            <div class="bx-tasks-timer bx-def-box bx-def-box-round-corners m-2">
-                                <div class="bx-tasks-timer-cnt p-4">
-                                    <div class="bx-tasks-t-task flex">
+                        <div class="bx-tasks-timer-card-wrp w-1/4">
+                            <div class="bx-tasks-timer-card bx-def-box bx-def-box-round-corners m-2">
+                                <div class="bx-tasks-timer-card-cnt p-4">
+                                    <div class="bx-tasks-tc-task flex">
                                         <bx_if:show_context>
-                                            <a class="bx-tasks-t-context truncate" href="__url__">__title__</a><span class="pr-1">:</span>
+                                            <a class="bx-tasks-tc-context truncate" href="__url__">__title__</a><span class="pr-1">:</span>
                                         </bx_if:show_context>
-                                        <a class="bx-tasks-t-content truncate" href="__content_url__">__content_title__</a>
+                                        <a class="bx-tasks-tc-content truncate" href="__content_url__">__content_title__</a>
                                     </div>
-                                    <div class="bx-tasks-t-value mt-4">__timer__</div>
+                                    <div class="bx-tasks-tc-value mt-4">__timer__</div>
                                 </div>
                             </div>
                             <script>__js_code_timer__</script>

+ 7 - 0
modules/boonex/tasks/template/css/timer.css

@@ -1,3 +1,4 @@
+/*-- Timer --*/
 .bx-tasks-actions .bx-menu-custom {
     justify-content: center;
 }
@@ -12,4 +13,10 @@
 .bx-tasks-actions .bx-menu-custom li a {
     padding-left: 1.5rem;
     padding-right: 1.5rem;
+}
+
+/*-- Timer Card --*/
+.bx-tasks-timer-card .bx-tasks-actions .bx-menu-custom li a {
+    padding-left: 1.0rem;
+    padding-right: 1.0rem;
 }