Parcourir la source

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

AntonLV il y a 5 mois
Parent
commit
584cd5db4d

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

@@ -19,6 +19,7 @@
     <string name="_bx_tasks_form_entry_display_add"><![CDATA[Добавить задание]]></string>
     <string name="_bx_tasks_form_entry_display_edit"><![CDATA[Редактировать задание]]></string>
     <string name="_bx_tasks_form_entry_display_edit_body"><![CDATA[Редактировать тело задачи]]></string>
+    <string name="_bx_tasks_form_entry_display_edit_tasks_list"><![CDATA[Редактировать принадлежность задачи к списку]]></string>
     <string name="_bx_tasks_form_entry_display_edit_type"><![CDATA[Редактировать тип задачи]]></string>
     <string name="_bx_tasks_form_entry_display_edit_priority"><![CDATA[Редактировать приоритет задачи]]></string>
     <string name="_bx_tasks_form_entry_display_edit_estimate"><![CDATA[Редактировать временные оценки задачи]]></string>
@@ -547,6 +548,7 @@
     <string name="_bx_tasks_txt_processing_failed"><![CDATA[Задание не была опубликовано, тк произошла ошибка при конвертации видео. Обновите видео, чтобы решить проблему.]]></string>
     <string name="_bx_tasks_txt_scheduled_awaiting"><![CDATA[Дата публикации:  {date_publish_uf}]]></string>
     <string name="_bx_tasks_txt_list_title"><![CDATA[{0} ({1})]]></string>
+    <string name="_bx_tasks_txt_list_inbox"><![CDATA[Входящие]]></string>
     <string name="_bx_tasks_txt_new_task_list"><![CDATA[Новый список заданий]]></string>
     <string name="_bx_tasks_txt_new_task"><![CDATA[Новое Задание]]></string>
     <string name="_bx_tasks_txt_total"><![CDATA[Потрачено времени: {0}]]></string>
@@ -571,6 +573,7 @@
     <string name="_bx_tasks_txt_msg_confirm_tasklist_deletion"><![CDATA[Вы удалите все задания, которые содержатся в этом списке заданий. Вы уверены?]]></string>
     <string name="_bx_tasks_txt_msg_format"><![CDATA[{0} &#183; <span>{1}</span>]]></string>
     <string name="_bx_tasks_txt_msg_synced"><![CDATA[Задача была синхронизирована с GitHub: <b><a href="{ghi_link}" target="_blank">#{ghi_number}</a></b>]]></string>
+    <string name="_bx_tasks_txt_msg_edit_tasks_list"><![CDATA[<a href="{author_link}">{author_name}</a> переместил в <b>{value}</b>]]></string>
     <string name="_bx_tasks_txt_msg_edit_type"><![CDATA[<a href="{author_link}">{author_name}</a> изменил тип на <b>{value}</b>]]></string>
     <string name="_bx_tasks_txt_msg_edit_priority"><![CDATA[<a href="{author_link}">{author_name}</a> изменил приоритет на <b>{value}</b>]]></string>
     <string name="_bx_tasks_txt_msg_edit_estimate"><![CDATA[<a href="{author_link}">{author_name}</a> изменил 'выделенное время' на <b>{value}</b>]]></string>

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

@@ -13,6 +13,8 @@ bx_import('BxDolInformer');
 
 class BxTasksConfig extends BxBaseModTextConfig
 {
+    protected $_oDb;
+
     protected $_aProperties;
 
     function __construct($aModule)
@@ -75,6 +77,7 @@ class BxTasksConfig extends BxBaseModTextConfig
             'FIELD_STATUS_ADMIN' => 'status_admin',
             'FIELD_LABELS' => 'labels',
             'FIELD_TASKLIST' => 'tasks_list',
+            'FIELD_TASKS_LIST' => 'tasks_list',
             'FIELD_GH_ISSUE' => 'gh_issue',
             'FIELD_GH_ISSUE_URL' => 'gh_issue_url',
             'FIELD_INITIAL_MEMBERS' => 'initial_members',
@@ -151,6 +154,7 @@ class BxTasksConfig extends BxBaseModTextConfig
             'OBJECT_FORM_ENTRY_DISPLAY_ADD' => 'bx_tasks_entry_add',
             'OBJECT_FORM_ENTRY_DISPLAY_EDIT' => 'bx_tasks_entry_edit',
             'OBJECT_FORM_ENTRY_DISPLAY_EDIT_BODY' => 'bx_tasks_entry_edit_body',
+            'OBJECT_FORM_ENTRY_DISPLAY_EDIT_TASKS_LIST' => 'bx_tasks_entry_edit_tasks_list',
             'OBJECT_FORM_ENTRY_DISPLAY_EDIT_TYPE' => 'bx_tasks_entry_edit_type',
             'OBJECT_FORM_ENTRY_DISPLAY_EDIT_PRIORITY' => 'bx_tasks_entry_edit_priority',
             'OBJECT_FORM_ENTRY_DISPLAY_EDIT_ESTIMATE' => 'bx_tasks_entry_edit_estimate',
@@ -301,6 +305,7 @@ class BxTasksConfig extends BxBaseModTextConfig
         $this->_bAttachmentsInTimeline = true;
 
         $this->_aProperties = [
+            $this->CNF['FIELD_TASKLIST'],
             $this->CNF['FIELD_TYPE'], 
             $this->CNF['FIELD_PRIORITY'], 
             $this->CNF['FIELD_ESTIMATE'], 
@@ -309,6 +314,11 @@ class BxTasksConfig extends BxBaseModTextConfig
         ];
     }
 
+    public function init(&$oDb)
+    {
+        $this->_oDb = &$oDb;
+    }
+
     public function isCompleted($iState)
     {
         return in_array($iState, [BX_TASKS_STATE_CANCELLED, BX_TASKS_STATE_DUPLICATE, BX_TASKS_STATE_DONE]);
@@ -319,6 +329,15 @@ class BxTasksConfig extends BxBaseModTextConfig
         return $this->_aProperties;
     }
 
+    public function getTasksListTitle($iValue)
+    {
+        if(!$iValue)
+            return _t('_bx_tasks_txt_list_inbox');
+
+        $aList = $this->_oDb->getList($iValue);
+        return $aList['title'] ?? _t('_undefined');
+    }
+
     public function getTypeTitle($iValue)
     {
         $aItems = BxDolFormQuery::getDataItems($this->CNF['OBJECT_PRE_LIST_TYPES'], false, BX_DATA_VALUES_ALL);

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

@@ -69,16 +69,18 @@ class BxTasksDb extends BxBaseModTextDb
     {
         $CNF = &$this->_oConfig->CNF;
 
-        $sQuery = $this->prepare ("SELECT * FROM `" . $CNF['TABLE_LISTS'] . "` WHERE `context_id` = ?", $iContextId);
-        return $this->getAll($sQuery);
+        return $this->getAll("SELECT * FROM `" . $CNF['TABLE_LISTS'] . "` WHERE `context_id` = :context_id", [
+            'context_id' => $iContextId
+        ]);
     }
 	
     public function getList ($iId = 0)
     {
         $CNF = &$this->_oConfig->CNF;
 
-        $sQuery = $this->prepare ("SELECT * FROM `" . $CNF['TABLE_LISTS'] . "` WHERE `id` = ?", $iId);
-        return $this->getRow($sQuery);
+        return $this->getRow("SELECT * FROM `" . $CNF['TABLE_LISTS'] . "` WHERE `id` = :id", [
+            'id' => $iId
+        ]);
     }
     
     public function deleteList ($iId = 0)
@@ -92,7 +94,7 @@ class BxTasksDb extends BxBaseModTextDb
         $this->query($sQuery);
     }
 	
-    public function getTasks ($iContextId = 0, $iListId = 0, $aParams = [])
+    public function getTasks ($iContextId = 0, $iListId = false, $aParams = [])
     {
         $CNF = &$this->_oConfig->CNF;
 
@@ -105,7 +107,7 @@ class BxTasksDb extends BxBaseModTextDb
             $sWhereClause .= " AND `te`.`" . $sField . "` = :" . $sField;
         }
 
-        if(($sField = $CNF['FIELD_TASKLIST']) && $iListId) {
+        if(($sField = $CNF['FIELD_TASKLIST']) && $iListId !== false) {
             $aBindings[$sField] = $iListId;
             $sWhereClause .= " AND `te`.`" . $sField . "` = :" . $sField;
         }

+ 22 - 7
modules/boonex/tasks/classes/BxTasksFormEntry.php

@@ -41,11 +41,23 @@ class BxTasksFormEntry extends BxBaseModTextFormEntry
 
     public function setContextId($iContextId)
     {
+        if($this->_iContextId == $iContextId)
+            return;
+
         $CNF = &$this->_oModule->_oConfig->CNF;
 
         $this->_iContextId = $iContextId;
 
-        if(($sKf = 'FIELD_TYPE') && isset($CNF[$sKf]) && isset($this->aInputs[$CNF[$sKf]])){
+        if(($sKf = 'FIELD_TASKLIST') && isset($CNF[$sKf]) && isset($this->aInputs[$CNF[$sKf]])) {
+            $aLists = [['id' => 0, 'title' => _t('_bx_tasks_txt_list_inbox')]];
+            if(($aListsAdd = $this->_oModule->_oDb->getLists($this->_iContextId)) && is_array($aListsAdd))
+                $aLists = array_merge($aLists, $aListsAdd);
+
+            foreach($aLists as $aList)
+                $this->aInputs[$CNF[$sKf]]['values'][$aList['id']] = $aList['title'];
+        }
+
+        if(($sKf = 'FIELD_TYPE') && isset($CNF[$sKf]) && isset($this->aInputs[$CNF[$sKf]])) {
             $aItems = $this->_oModule->_oDb->getPreValues([
                 'sample' => 'context_list', 
                 'context_id' => $this->_iContextId, 
@@ -62,7 +74,7 @@ class BxTasksFormEntry extends BxBaseModTextFormEntry
             }
         }
 
-        if(($sKf = 'FIELD_STICKERS') && isset($CNF[$sKf]) && isset($this->aInputs[$CNF[$sKf]])){
+        if(($sKf = 'FIELD_STICKERS') && isset($CNF[$sKf]) && isset($this->aInputs[$CNF[$sKf]])) {
             $aItems = $this->_oModule->_oDb->getPreValues([
                 'sample' => 'context_list', 
                 'context_id' => $this->_iContextId, 
@@ -89,6 +101,14 @@ class BxTasksFormEntry extends BxBaseModTextFormEntry
         return $sValue;
     }
 
+    protected function genCustomViewRowValueTasksList(&$aInput)
+    {
+        if(!isset($aInput['value']))
+            return null;
+
+        return isset($aInput['value']) && isset($aInput['values'][$aInput['value']]) ? $aInput['values'][$aInput['value']] : null;
+    }
+
     public function getCode($bDynamicMode = false)
     {
         $this->_replaceMarkersInControls('controls_edit');
@@ -314,11 +334,6 @@ class BxTasksFormEntry extends BxBaseModTextFormEntry
             'ajax_get_suggestions' => BX_DOL_URL_ROOT . "modules/?r=" . $this->_oModule->_oConfig->getUri() . "/ajax_get_initial_members/" . $this->_iContextId
         ]));
     }
-
-    protected function genCustomInputTasksList(&$aInput)
-    {
-        return $this->genInputStandard($aInput);
-    }
 }
 
 /** @} */

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

@@ -25,6 +25,8 @@ class BxTasksModule extends BxBaseModTextModule implements iBxDolCalendarService
     {
         parent::__construct($aModule);
 
+        $this->_oConfig->init($this->_oDb);
+
         $CNF = &$this->_oConfig->CNF;
         $this->_aSearchableNamesExcept = array_merge($this->_aSearchableNamesExcept, array(
             $CNF['FIELD_PUBLISHED'],

+ 19 - 5
modules/boonex/tasks/classes/BxTasksTemplate.php

@@ -257,7 +257,7 @@ class BxTasksTemplate extends BxBaseModTextTemplate
         $iFilterSelected = $aParams['filter'] ?? ($aFilters[$iContextId] ?? 0);
 
         $sFilters = $this->_getEntriesFilters($iContextId, array_merge($aParams, ['filter_selected' => $iFilterSelected]));
-        
+
         $this->addCssJs();
         $this->addJs([
             'jquery-ui/jquery-ui.min.js',
@@ -283,6 +283,13 @@ class BxTasksTemplate extends BxBaseModTextTemplate
                     'object' => $sJsObject,
                 ]
             ],
+            'bx_if:allow_add_task' => [
+                'condition' => $bAllowAdd,
+                'content' => [
+                    'context_id' => $iContextId,
+                    'object' => $sJsObject,
+                ]
+            ],
             'bx_if:allow_manage_settings' => [
                 'condition' => $bContext,
                 'content' => [
@@ -333,8 +340,15 @@ class BxTasksTemplate extends BxBaseModTextTemplate
                 }
             }
         }
-        else
-            $aLists = $this->_oDb->getLists($iContextId);
+        else {
+            $aLists[] = [
+                'id' => 0,
+                'context_id' => $iContextId,
+                'title' => _t('_bx_tasks_txt_list_inbox')
+            ];
+            if(($aListsAdd = $this->_oDb->getLists($iContextId)) && is_array($aListsAdd))
+                $aLists = array_merge($aLists, $aListsAdd);
+        }
 
         $aParams = array_merge($aParams, [
             'with_stats' => true
@@ -348,8 +362,8 @@ class BxTasksTemplate extends BxBaseModTextTemplate
 
             $bTasksAllowManage = $bContext ? $bAllowManage : $oModule->isAllowManageByContext($iTasksContextId);
 
-            $aTasks = $this->_oDb->getTasks($iTasksContextId, $bContext ? $aList['id'] : 0, $aParams);
-            if(!$aTasks || !is_array($aTasks))
+            $aTasks = $this->_oDb->getTasks($iTasksContextId, $bContext ? $aList['id'] : false, $aParams);
+            if((!$aTasks || !is_array($aTasks)) && (($bContext && !$aList['id']) || !$bTasksAllowManage))
                 continue;
 
             $aTmplVarsTasks = [];

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

@@ -19,6 +19,7 @@
     <string name="_bx_tasks_form_entry_display_add"><![CDATA[Add Task]]></string>
     <string name="_bx_tasks_form_entry_display_edit"><![CDATA[Edit Task]]></string>
     <string name="_bx_tasks_form_entry_display_edit_body"><![CDATA[Edit Task's Body]]></string>
+    <string name="_bx_tasks_form_entry_display_edit_tasks_list"><![CDATA[Edit Task's List]]></string>
     <string name="_bx_tasks_form_entry_display_edit_type"><![CDATA[Edit Task's Type]]></string>
     <string name="_bx_tasks_form_entry_display_edit_priority"><![CDATA[Edit Task's Priority]]></string>
     <string name="_bx_tasks_form_entry_display_edit_estimate"><![CDATA[Edit Task's Estimate]]></string>
@@ -551,6 +552,7 @@
     <string name="_bx_tasks_txt_processing_failed"><![CDATA[Task isn't published because video conversion failed, edit video to fix the issue.]]></string>
     <string name="_bx_tasks_txt_scheduled_awaiting"><![CDATA[Task publishing date is {date_publish_uf}]]></string>
     <string name="_bx_tasks_txt_list_title"><![CDATA[{0} ({1})]]></string>
+    <string name="_bx_tasks_txt_list_inbox"><![CDATA[Inbox]]></string>
     <string name="_bx_tasks_txt_new_task_list"><![CDATA[New Task List]]></string>
     <string name="_bx_tasks_txt_new_task"><![CDATA[New Task]]></string>
     <string name="_bx_tasks_txt_total"><![CDATA[Total: {0}]]></string>
@@ -575,7 +577,8 @@
     <string name="_bx_tasks_txt_msg_status_pending"><![CDATA[This task is pending approval.]]></string>
     <string name="_bx_tasks_txt_msg_confirm_tasklist_deletion"><![CDATA[You will delete all tasks that are contained in this tasklist. Are you sure?]]></string>
     <string name="_bx_tasks_txt_msg_format"><![CDATA[{0} &#183; <span>{1}</span>]]></string>
-    <string name="_bx_tasks_txt_msg_synced"><![CDATA[The task was synced with GitHub: <b><a href="{ghi_link}" target="_blank">#{ghi_number}</a></b>]]></string>
+    <string name="_bx_tasks_txt_msg_synced"><![CDATA[The task was synced with GitHub: <b><a href="{ghi_link}" target="_blank">#{ghi_number}</a></b>]]></string> 
+    <string name="_bx_tasks_txt_msg_edit_tasks_list"><![CDATA[<a href="{author_link}">{author_name}</a> moved to <b>{value}</b>]]></string>
     <string name="_bx_tasks_txt_msg_edit_type"><![CDATA[<a href="{author_link}">{author_name}</a> changed type to <b>{value}</b>]]></string>
     <string name="_bx_tasks_txt_msg_edit_priority"><![CDATA[<a href="{author_link}">{author_name}</a> changed priority to <b>{value}</b>]]></string>
     <string name="_bx_tasks_txt_msg_edit_estimate"><![CDATA[<a href="{author_link}">{author_name}</a> changed estimate to <b>{value}</b>]]></string>

+ 8 - 0
modules/boonex/tasks/install/sql/install.sql

@@ -476,6 +476,7 @@ INSERT INTO `sys_form_displays`(`object`, `display_name`, `module`, `view_mode`,
 ('bx_tasks', 'bx_tasks_entry_delete', 'bx_tasks', 0, '_bx_tasks_form_entry_display_delete'),
 ('bx_tasks', 'bx_tasks_entry_edit', 'bx_tasks', 0, '_bx_tasks_form_entry_display_edit'),
 ('bx_tasks', 'bx_tasks_entry_edit_body', 'bx_tasks', 0, '_bx_tasks_form_entry_display_edit_body'),
+('bx_tasks', 'bx_tasks_entry_edit_tasks_list', 'bx_tasks', 0, '_bx_tasks_form_entry_display_edit_tasks_list'),
 ('bx_tasks', 'bx_tasks_entry_edit_type', 'bx_tasks', 0, '_bx_tasks_form_entry_display_edit_type'),
 ('bx_tasks', 'bx_tasks_entry_edit_priority', 'bx_tasks', 0, '_bx_tasks_form_entry_display_edit_priority'),
 ('bx_tasks', 'bx_tasks_entry_edit_estimate', 'bx_tasks', 0, '_bx_tasks_form_entry_display_edit_estimate'),
@@ -485,6 +486,7 @@ INSERT INTO `sys_form_displays`(`object`, `display_name`, `module`, `view_mode`,
 
 INSERT INTO `sys_form_inputs`(`object`, `module`, `name`, `value`, `values`, `checked`, `type`, `caption_system`, `caption`, `info`, `required`, `collapsed`, `html`, `attrs`, `attrs_tr`, `attrs_wrapper`, `checker_func`, `checker_params`, `checker_error`, `db_pass`, `db_params`, `editable`, `deletable`) VALUES 
 ('bx_tasks', 'bx_tasks', 'cf', '1', '#!sys_content_filter', 0, 'select', '_sys_form_entry_input_sys_cf', '_sys_form_entry_input_cf', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
+('bx_tasks', 'bx_tasks', 'tasks_list', '', '', 0, 'select', '_bx_tasks_form_entry_input_sys_tasks_list', '_bx_tasks_form_entry_input_tasks_list', '', 0, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
 ('bx_tasks', 'bx_tasks', 'allow_view_to', '', '', 0, 'custom', '_bx_tasks_form_entry_input_sys_allow_view_to', '_bx_tasks_form_entry_input_allow_view_to', '', 1, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
 ('bx_tasks', 'bx_tasks', 'delete_confirm', 1, '', 0, 'checkbox', '_bx_tasks_form_entry_input_sys_delete_confirm', '_bx_tasks_form_entry_input_delete_confirm', '_bx_tasks_form_entry_input_delete_confirm_info', 1, 0, 0, '', '', '', 'Avail', '', '_bx_tasks_form_entry_input_delete_confirm_error', '', '', 1, 0),
 ('bx_tasks', 'bx_tasks', 'do_publish', '_bx_tasks_form_entry_input_do_publish', '', 0, 'submit', '_bx_tasks_form_entry_input_sys_do_publish', '', '', 0, 0, 0, '', '', '', '', '', '', '', '', 1, 0),
@@ -556,6 +558,11 @@ INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for
 ('bx_tasks_entry_edit_body', 'text', 2147483647, 1, 2),
 ('bx_tasks_entry_edit_body', 'do_submit', 2147483647, 1, 3),
 
+('bx_tasks_entry_edit_tasks_list', 'tasks_list', 2147483647, 1, 1),
+('bx_tasks_entry_edit_tasks_list', 'controls_edit_popup', 2147483647, 1, 2),
+('bx_tasks_entry_edit_tasks_list', 'do_submit', 2147483647, 1, 3),
+('bx_tasks_entry_edit_tasks_list', 'do_cancel', 2147483647, 1, 4),
+
 ('bx_tasks_entry_edit_state', 'state', 2147483647, 1, 1),
 ('bx_tasks_entry_edit_state', 'controls_edit_popup', 2147483647, 1, 2),
 ('bx_tasks_entry_edit_state', 'do_submit', 2147483647, 1, 3),
@@ -581,6 +588,7 @@ INSERT INTO `sys_form_display_inputs`(`display_name`, `input_name`, `visible_for
 ('bx_tasks_entry_edit_due_date', 'do_submit', 2147483647, 1, 3),
 ('bx_tasks_entry_edit_due_date', 'do_cancel', 2147483647, 1, 4),
 
+('bx_tasks_entry_view', 'tasks_list', 2147483647, 1, 0),
 ('bx_tasks_entry_view', 'stickers', 2147483647, 1, 1),
 ('bx_tasks_entry_view', 'type', 2147483647, 1, 2),
 ('bx_tasks_entry_view', 'priority', 2147483647, 1, 3),

+ 4 - 0
modules/boonex/tasks/js/tasks.js

@@ -83,6 +83,10 @@ BxTasksView.prototype.processTask = function (iContextId, iListId, oSource) {
     });
 };
 
+BxTasksView.prototype.processTaskEditTasksList = function (iContentId, oSource) {
+    this.processTaskEditProperty(iContentId, 'tasks_list', oSource);
+};
+
 BxTasksView.prototype.processTaskEditType = function (iContentId, oSource) {
     this.processTaskEditProperty(iContentId, 'type', oSource);
 };

+ 5 - 0
modules/boonex/tasks/template/browse_tasks.html

@@ -13,6 +13,11 @@
                 <bx_text:_bx_tasks_txt_new_task_list />
             </a>
         </bx_if:allow_add_list>
+        <bx_if:allow_add_task>
+            <a class="bx-btn bx-btn-small bx-def-margin-sec-right bx-tasks-tasklist-add" href="javascript:void(0);" onclick="__object__.processTask(__context_id__, 0, this)">
+                <bx_text:_bx_tasks_txt_new_task />
+            </a>
+        </bx_if:allow_add_task>
         <bx_if:allow_manage_settings>
             <a class="bx-btn bx-btn-small bx-def-margin-sec-right bx-tasks-tasklist-manage" href="javascript:void(0);" onclick="bx_menu_popup('bx_tasks_manage_context_submenu', this, {}, {context_pid: __context_id__});">
                 <bx_image_auto:cog />