فهرست منبع

#1904 Classes: mark as completed

Alex Trofimov 6 سال پیش
والد
کامیت
1d7c50ce75

+ 1 - 0
modules/boonex/classes/classes/BxClssConfig.php

@@ -18,6 +18,7 @@ class BxClssConfig extends BxBaseModTextConfig
         parent::__construct($aModule);
 
         $aMenuItems2Methods = array (
+            'complete-class' => 'checkAllowedViewMarkAsCompletedButton',
             'edit-class' => 'checkAllowedEdit',
             'delete-class' => 'checkAllowedDelete',
         );

+ 7 - 11
modules/boonex/classes/classes/BxClssDb.php

@@ -14,7 +14,12 @@
  */
 class BxClssDb extends BxBaseModTextDb
 {
+    /**
+     * Map of IDs from `bx_classes_completed_when` pre-defined values 
+     * to fields in `bx_classes_statuses` table
+     */
     protected $_aStatuses = array(
+        0 => 'completed',
         1 => 'viewed',
         2 => 'replied',
     );
@@ -131,10 +136,7 @@ class BxClssDb extends BxBaseModTextDb
 
     public function isClassCompleted($iClassId, $iStudentProfileId)
     {
-        if (!($aContentInfo = $this->getContentInfoById($iClassId)))
-            return false;
-
-        return $this->getClassStatus($iClassId, $iStudentProfileId, (int)$aContentInfo['completed_when']);
+        return $this->getClassStatus($iClassId, $iStudentProfileId, 'completed');
     }
 
     public function getClassStatus($iClassId, $iStudentProfileId, $mixedStatus)
@@ -212,13 +214,7 @@ class BxClssDb extends BxBaseModTextDb
         if (!$aContentInfo)
             return array();
 
-        $iCompletedWhen = (int)$aContentInfo['completed_when'];
-        if (!isset($this->_aStatuses[$iCompletedWhen]))
-            return array();
-
-        $sCompletedField = $this->_aStatuses[$iCompletedWhen];
-
-        $a = $this->getColumn("SELECT `student_profile_id` FROM `bx_classes_statuses` WHERE `class_id` = :class AND `$sCompletedField` != 0 LIMIT :start, :limit", array(
+        $a = $this->getColumn("SELECT `student_profile_id` FROM `bx_classes_statuses` WHERE `class_id` = :class AND `completed` != 0 LIMIT :start, :limit", array(
             'class' => $aContentInfo['id'],
             'start' => (int)$iStart,
             'limit' => (int)$iLimit,

+ 5 - 0
modules/boonex/classes/classes/BxClssMenuViewActions.php

@@ -30,6 +30,11 @@ class BxClssMenuViewActions extends BxBaseModTextMenuViewActions
     {
         return $this->_getMenuItemByNameActions($aItem);
     }
+
+    protected function _getMenuItemCompleteClass($aItem)
+    {
+        return $this->_getMenuItemByNameActions($aItem);
+    }
 }
 
 /** @} */

+ 52 - 0
modules/boonex/classes/classes/BxClssModule.php

@@ -17,6 +17,9 @@ define('BX_CLASSES_AVAIL_AFTER_START_DATE_PREV_CLASS_COMPLETED', 4);
 define('BX_CLASSES_AVAIL_BETWEEN_START_END_DATES', 5);
 define('BX_CLASSES_AVAIL_BETWEEN_START_END_DATES_PREV_CLASS_COMPLETED', 6);
 
+define('BX_CLASSES_COMPLETED_WHEN_VIEWED', 1);
+define('BX_CLASSES_COMPLETED_WHEN_REPLIED', 2);
+
 /**
  * Classes module
  */
@@ -36,6 +39,27 @@ class BxClssModule extends BxBaseModTextModule
         ));
     }
 
+    public function actionMarkClassAsCompleted($iClassId = 0)
+    {
+        $iProfileId = bx_get_logged_profile_id();
+
+        if (!($aClass = $this->_oDb->getContentInfoById($iClassId))) {
+            echo _t('_sys_txt_not_found');
+            return;
+        }
+
+        $mixedMsg = $this->checkAllowedMarkAsCompleted($aClass, $iProfileId);
+        if (CHECK_ACTION_RESULT_ALLOWED !== $mixedMsg) {
+            echo $mixedMsg;
+            return;
+        }
+
+        if (!$this->_oDb->updateClassStatus($iClassId, $iProfileId, 'completed')) {
+            echo _t('_sys_txt_error_occured');
+            return;
+        }
+    }
+
     public function actionReorderClasses($iProfileConextId = 0)
     {
         $oProfileContext = $this->_validateActionAndGetContextProfile($iProfileConextId, 'html');
@@ -511,6 +535,34 @@ class BxClssModule extends BxBaseModTextModule
         else
             return $mixed;
     }
+
+    public function checkAllowedMarkAsCompleted($aClass, $isPerformAction, $iProfileId = 0)
+    {
+        if (!$iProfileId)
+            $iProfileId = bx_get_logged_profile_id();
+
+        $mixedMsg = $this->checkAllowedViewForProfile($aClass, $iProfileId);
+        if (CHECK_ACTION_RESULT_ALLOWED !== $mixedMsg)
+            return $mixedMsg;
+
+
+        $a = array(
+            BX_CLASSES_COMPLETED_WHEN_VIEWED => '_bx_classes_txt_err_view_class_needed_before_completion',
+            BX_CLASSES_COMPLETED_WHEN_REPLIED => '_bx_classes_txt_err_reply_in_class_needed_before_completion',
+        );
+        if (isset($a[$aClass['completed_when']]) && !$this->_oDb->getClassStatus($aClass['id'], $iProfileId, (int)$aClass['completed_when']))
+            return _t($a[$aClass['completed_when']]);
+
+        return CHECK_ACTION_RESULT_ALLOWED;
+    }
+
+    public function checkAllowedViewMarkAsCompletedButton($aClass, $isPerformAction = false)
+    {
+        if ($this->serviceIsClassCompleted($aClass['id']))
+            return _t('_sys_txt_access_denied');
+        else
+            return CHECK_ACTION_RESULT_ALLOWED;
+    }
 }
 
 /** @} */

+ 2 - 0
modules/boonex/classes/classes/BxClssPageEntry.php

@@ -30,6 +30,8 @@ class BxClssPageEntry extends BxBaseModTextPageEntry
 
     public function getCode ()
     {
+        $this->_oTemplate->addJs('main.js');
+
         $s = parent::getCode ();
 
         // mark class as viewed

+ 24 - 0
modules/boonex/classes/classes/BxClssTemplate.php

@@ -30,6 +30,30 @@ class BxClssTemplate extends BxBaseModTextTemplate
 
         return array($sPhotoGallery, $sPhotoGallery);
     }
+
+    public function getTitle($aData, $mixedProcessOutput = BX_DATA_TEXT)
+    {
+        $sTitle = parent::getTitle($aData, $mixedProcessOutput);
+
+        if ($this->_oModule->serviceIsClassCompleted($aData['id'])) {
+            $sStatusClass = 'bx-classes-class-status-completed';
+        }
+        else {
+            $sStatusClass = 'bx-classes-class-status-avail';
+        }
+
+        return $this->parseHtmlByName('classes_class_title.html', array(
+            'status' => $sStatusClass,
+            'bx_if:completed' => array(
+                'condition' => 'bx-classes-class-status-completed' == $sStatusClass,
+                'content' => array('title' => $sTitle),
+            ),
+            'bx_if:avail' => array(
+                'condition' => 'bx-classes-class-status-avail' == $sStatusClass,
+                'content' => array('title' => $sTitle),
+            ),
+        ));
+    }
 }
 
 /** @} */

+ 5 - 2
modules/boonex/classes/install/langs/en.xml

@@ -190,6 +190,7 @@
 	<string name="_bx_classes_menu_item_title_admt_classes"><![CDATA[Classes]]></string>
 	<string name="_bx_classes_menu_item_title_manage_my"><![CDATA[My Classes]]></string>
 	<string name="_bx_classes_menu_item_title_manage_all"><![CDATA[All Classes]]></string>
+	<string name="_bx_classes_menu_item_title_complete_class"><![CDATA[Mark as Completed]]></string>
 
 	<string name="_bx_classes_grid_filter_item_title_adm_select_one_filter1"><![CDATA[All Statuses]]></string>
 	<string name="_bx_classes_grid_filter_item_title_adm_active"><![CDATA[Active]]></string>
@@ -223,8 +224,8 @@
     <string name="_bx_classes_cmts_own_and_admins"><![CDATA[Own and admin comments are shown]]></string>
 
     <string name="_bx_classes_pre_lists_completed_when"><![CDATA[Class is completed when]]></string>
-    <string name="_bx_classes_completed_when_viewed"><![CDATA[Viewed]]></string>
-    <string name="_bx_classes_completed_when_replied"><![CDATA[Replied]]></string>
+    <string name="_bx_classes_completed_when_viewed"><![CDATA[Viewed and marked as completed]]></string>
+    <string name="_bx_classes_completed_when_replied"><![CDATA[Replied and marked as completed]]></string>
 
     <string name="_bx_classes_txt_all_entries_in"><![CDATA[<a href="{0}">All Classes in {1} ({2})</a>]]></string>
     <string name="_bx_classes_txt_all_entries_by"><![CDATA[{0} classes]]></string>
@@ -252,6 +253,8 @@
     <string name="_bx_classes_txt_err_not_avail_after_end_date"><![CDATA[Class isn't available after {0}]]></string>
     <string name="_bx_classes_txt_err_not_avail_before_prev_class_completed"><![CDATA[Class will be available after completing previous class - <a href="{0}">{1}</a>]]></string>
     <string name="_bx_classes_txt_err_modules_with_classes_cannot_be_deleted"><![CDATA[Modules with classes can't be deleted]]></string>
+    <string name="_bx_classes_txt_err_view_class_needed_before_completion"><![CDATA[Class need to be viewed before marking it as completed]]></string>
+    <string name="_bx_classes_txt_err_reply_in_class_needed_before_completion"><![CDATA[Reply in class comments is needed before marking it as completed]]></string>
 
     <string name="_bx_classes_txt_poll_view_answers"><![CDATA[poll]]></string>
     <string name="_bx_classes_txt_poll_view_results"><![CDATA[results]]></string>

+ 6 - 4
modules/boonex/classes/install/sql/enable.sql

@@ -56,8 +56,8 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_author', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:13:\"entity_author\";}', 0, 0, 0, 1),
 ('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_prev_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:10:"bx_classes";s:6:"method";s:10:"prev_class";}', 0, 0, 1, 2),
 ('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_text', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:17:\"entity_text_block\";}', 0, 0, 1, 3),
-('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_next_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:10:"bx_classes";s:6:"method";s:10:"next_class";}', 0, 0, 1, 4),
-('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_all_actions', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:18:\"entity_all_actions\";}', 0, 0, 1, 5),
+('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_all_actions', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:18:\"entity_all_actions\";}', 0, 0, 1, 4),
+('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_next_entry', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:10:"bx_classes";s:6:"method";s:10:"next_class";}', 0, 0, 1, 5),
 ('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_actions', 13, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:14:\"entity_actions\";}', 0, 0, 0, 6),
 ('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_social_sharing', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:21:\"entity_social_sharing\";}', 0, 0, 0, 7),
 ('bx_classes_view_entry', 2, 'bx_classes', '', '_bx_classes_page_block_title_entry_attachments', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:10:\"bx_classes\";s:6:\"method\";s:18:\"entity_attachments\";}', 0, 0, 1, 8),
@@ -133,8 +133,9 @@ INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES
 ('bx_classes_view', 'bx_classes', '_bx_classes_menu_set_title_view_entry', 0);
 
 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_classes_view', 'bx_classes', 'edit-class', '_bx_classes_menu_item_title_system_edit_entry', '_bx_classes_menu_item_title_edit_entry', 'page.php?i=edit-class&id={content_id}', '', '', 'pencil-alt', '', 2147483647, 1, 0, 1),
-('bx_classes_view', 'bx_classes', 'delete-class', '_bx_classes_menu_item_title_system_delete_entry', '_bx_classes_menu_item_title_delete_entry', 'page.php?i=delete-class&id={content_id}', '', '', 'remove', '', 2147483647, 1, 0, 2);
+('bx_classes_view', 'bx_classes', 'complete-class', '', '_bx_classes_menu_item_title_complete_class', 'javascript:void(0);', 'bx_classes_mark_as_completed(''{content_id}'');', '', 'check', '', 2147483647, 1, 0, 1),
+('bx_classes_view', 'bx_classes', 'edit-class', '_bx_classes_menu_item_title_system_edit_entry', '_bx_classes_menu_item_title_edit_entry', 'page.php?i=edit-class&id={content_id}', '', '', 'pencil-alt', '', 2147483647, 1, 0, 2),
+('bx_classes_view', 'bx_classes', 'delete-class', '_bx_classes_menu_item_title_system_delete_entry', '_bx_classes_menu_item_title_delete_entry', 'page.php?i=delete-class&id={content_id}', '', '', 'remove', '', 2147483647, 1, 0, 3);
 
 
 -- MENU: all actions menu for view entry 
@@ -146,6 +147,7 @@ INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES
 ('bx_classes_view_actions', 'bx_classes', '_sys_menu_set_title_view_actions', 0);
 
 INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `submenu_popup`, `visible_for_levels`, `visibility_custom`, `active`, `copyable`, `order`) VALUES 
+('bx_classes_view_actions', 'bx_classes', 'complete-class', '', '_bx_classes_menu_item_title_complete_class', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 1),
 ('bx_classes_view_actions', 'bx_classes', 'edit-class', '_bx_classes_menu_item_title_system_edit_entry', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 10),
 ('bx_classes_view_actions', 'bx_classes', 'delete-class', '_bx_classes_menu_item_title_system_delete_entry', '', '', '', '', '', '', '', 0, 2147483647, '', 1, 0, 20),
 ('bx_classes_view_actions', 'bx_classes', 'set-badges', '_sys_menu_item_title_system_set_badges', '_sys_menu_item_title_set_badges', 'javascript:void(0)', 'bx_menu_popup(''sys_set_badges'', window, {}, {module: ''bx_classes'', content_id: {content_id}});', '', 'check-circle', '', '', 0, 2147483647, 'a:2:{s:6:"module";s:10:"bx_classes";s:6:"method";s:19:"is_badges_avaliable";}', 1, 0, 40),

+ 1 - 0
modules/boonex/classes/install/sql/install.sql

@@ -55,6 +55,7 @@ CREATE TABLE IF NOT EXISTS `bx_classes_statuses` (
   `student_profile_id` int(11) NOT NULL,
   `viewed` int(11) NOT NULL,
   `replied` int(11) NOT NULL,
+  `completed` int(11) NOT NULL,
   PRIMARY KEY (`id`),
   UNIQUE `class_student` (`class_id`,`student_profile_id`)
 );

+ 11 - 0
modules/boonex/classes/js/main.js

@@ -8,6 +8,17 @@
  * @{
  */
 
+function bx_classes_mark_as_completed (iClassId)
+{
+    var sActionUrl = sUrlRoot + 'modules/index.php?r=classes/mark_class_as_completed/' + iClassId;
+    $.post(sActionUrl, function (sData) {
+        if (sData.length)
+            bx_alert(sData);
+        else
+            document.location.reload();
+    });
+}
+
 function bx_classes_show_module_add_form(iContextProfileId)
 {
     var sActionUrl = sUrlRoot + 'modules/index.php?r=classes/add_module/' + iContextProfileId + '/html';

+ 10 - 0
modules/boonex/classes/template/classes_class_title.html

@@ -0,0 +1,10 @@
+<span class="bx-classes-class-title __status__">
+<bx_if:completed>
+    <i class="sys-icon check-circle col-green1-dark sys-colored"></i>
+    <b>__title__</b>
+</bx_if:completed>
+<bx_if:avail>
+    <i class="sys-icon play-circle col-blue1 sys-colored"></i>
+    <b>__title__</b>
+</bx_if:avail>
+</span>

+ 1 - 0
modules/boonex/classes/template/css/main.css

@@ -27,6 +27,7 @@
     display:none;
 }
 
+.bx-classes-class-status-completed b,
 .bx-classes-class-status-completed a {
     text-decoration: line-through;
 }