AntonLV 12 лет назад
Родитель
Сommit
5baec4d4c1

+ 23 - 34
inc/classes/BxDolCacheUtilities.php

@@ -11,9 +11,6 @@
 
 class BxDolCacheUtilities extends BxDol
 {
-    protected $oMemberMenu;
-    protected $oCacheMemberMenu;
-    protected $oCachePb;
     protected $oCacheDb;
     protected $oCacheTemplates;
 
@@ -21,21 +18,22 @@ class BxDolCacheUtilities extends BxDol
     {
         parent::__construct();
 
-        // member menu
-        bx_import('BxDolMemberMenu');
-        $this->oMemberMenu = new BxDolMemberMenu();
-        $this->oCacheMemberMenu = $this->oMemberMenu->getCacheObject();
-
-        // page blocks
-        bx_import('BxDolPageViewAdmin');
-        $oPageViewCacher = new BxDolPageViewCacher ('', '');
-        $this->oCachePb = $oPageViewCacher->getBlocksCacheObject ();
-
         // DB
-        $this->oCacheDb = $GLOBALS['MySQL']->getDbCacheObject();
+        $this->oCacheDb = BxDolDb::getInstance()->getDbCacheObject();
 
         // templates
-        $this->oCacheTemplates = $GLOBALS['oSysTemplate']->getTemplatesCacheObject();
+        $this->oCacheTemplates = BxDolTemplate::getInstance()->getTemplatesCacheObject();
+    }
+
+	/**
+     * Get singleton instance of the class
+     */
+    public static function getInstance()
+    {
+        if(!isset($GLOBALS['bxDolClasses'][__CLASS__]))
+            $GLOBALS['bxDolClasses'][__CLASS__] = new BxDolCacheUtilities();
+
+        return $GLOBALS['bxDolClasses'][__CLASS__];
     }
 
     function clear($sCache)
@@ -49,21 +47,12 @@ class BxDolCacheUtilities extends BxDol
         return $isFormatted ? sprintf("%.2f", $iSize / 1024 / 1024) : $iSize;
     }
 
-    function _action($sCache, $sMode = 'clear')
+    protected function _action($sCache, $sMode = 'clear')
     {
-        $sFuncCacheObject = ('clear' == $sMode ? '_clearCacheObject' : '_getSizeCacheObject');
-        $sFuncCacheFile = ('clear' == $sMode ? '_clearCache' : '_getSizeCache');
+        $sFuncCacheObject = $sMode == 'clear' ? '_clearCacheObject' : '_getSizeCacheObject';
+        $sFuncCacheFile = $sMode == 'clear' ? '_clearCache' : '_getSizeCache';
 
         switch ($sCache) {
-
-            case 'member_menu':
-                $mixedResult = $this->$sFuncCacheObject ($this->oCacheMemberMenu, $this->oMemberMenu->sMenuMemberKeysCache);
-                break;
-
-            case 'pb':
-                $mixedResult = $this->$sFuncCacheObject ($this->oCacheDb, 'pb_');
-                break;
-
             case 'users':
                 $mixedResult = $this->$sFuncCacheFile('user', BX_DIRECTORY_PATH_CACHE);
                 break;
@@ -73,15 +62,15 @@ class BxDolCacheUtilities extends BxDol
                 break;
 
             case 'template':
-                $mixedResult = $this->$sFuncCacheObject ($this->oCacheTemplates, $GLOBALS['oSysTemplate']->_sCacheFilePrefix);
+                $mixedResult = $this->$sFuncCacheObject ($this->oCacheTemplates, BxDolStudioTemplate::getInstance()->getCacheFilePrefix($sCache));
                 break;
 
             case 'css':
-                $mixedResult = $this->$sFuncCacheFile($GLOBALS['oSysTemplate']->_sCssCachePrefix, BX_DIRECTORY_PATH_CACHE_PUBLIC);
+                $mixedResult = $this->$sFuncCacheFile(BxDolStudioTemplate::getInstance()->getCacheFilePrefix($sCache), BX_DIRECTORY_PATH_CACHE_PUBLIC);
                 break;
 
             case 'js':
-                $mixedResult = $this->$sFuncCacheFile($GLOBALS['oSysTemplate']->_sJsCachePrefix, BX_DIRECTORY_PATH_CACHE_PUBLIC);
+                $mixedResult = $this->$sFuncCacheFile(BxDolStudioTemplate::getInstance()->getCacheFilePrefix($sCache), BX_DIRECTORY_PATH_CACHE_PUBLIC);
                 break;
         }
 
@@ -91,9 +80,9 @@ class BxDolCacheUtilities extends BxDol
     function _clearCacheObject($oCache, $sPrefix)
     {
         if (!$oCache->removeAllByPrefix ($sPrefix))
-            return array('code' => 1, 'message' => _t('_adm_txt_dashboard_cache_clean_failed'));
+            return array('code' => 1, 'message' => _t('_adm_dbd_err_c_clean_failed'));
         else
-            return array('code' => 0, 'message' => _t('_adm_txt_dashboard_cache_clean_success'));
+            return array('code' => 0, 'message' => _t('_adm_dbd_msg_c_clean_success'));
     }
 
     function _getSizeCacheObject($oCache, $sPrefix)
@@ -104,7 +93,7 @@ class BxDolCacheUtilities extends BxDol
     function _clearCache($sPrefix, $sPath)
     {
         if (!($rHandler = opendir($sPath)))
-            return array('code' => 1, 'message' => _t('_adm_txt_dashboard_cache_clean_failed'));
+            return array('code' => 1, 'message' => _t('_adm_dbd_err_c_clean_failed'));
 
         $l = strlen($sPrefix);
         while (($sFile = readdir($rHandler)) !== false)
@@ -113,7 +102,7 @@ class BxDolCacheUtilities extends BxDol
 
         closedir($rHandler);
 
-        return array('code' => 0, 'message' => _t('_adm_txt_dashboard_cache_clean_success'));
+        return array('code' => 0, 'message' => _t('_adm_dbd_msg_c_clean_success'));
     }
 
     function _getSizeCache($sPrefix, $sPath)

+ 19 - 0
inc/classes/BxDolTemplate.php

@@ -1019,6 +1019,25 @@ class BxDolTemplate extends BxDol implements iBxDolSingleton
 
         return $sRet;
     }
+    function getCacheFilePrefix($sType)
+    {
+    	$sResult = '';
+    	switch($sType) {
+    		case 'template':
+				$sResult = $this->_sCacheFilePrefix;
+				break;
+
+    		case 'css':
+    			$sResult = $this->_sCssCachePrefix;
+    			break;
+
+    		case 'js':
+    			$sResult = $this->_sJsCachePrefix;
+    			break;
+    	}
+
+    	return $sResult;
+    }
     /**
      * Get cache object for templates
      * @return cache class instance

+ 12 - 2
install/sql/system.sql

@@ -3029,7 +3029,8 @@ INSERT INTO `sys_objects_page` (`object`, `uri`, `title_system`, `title`, `modul
 ('sys_account_profile_switcher', 'account-profile-switcher', '_sys_page_title_system_account_profile_switcher', '_sys_page_title_account_profile_switcher', 'system', 5, 2147483647, 1, 'page.php?i=account-profile-switcher', '', '', '', 0, 1, 0, 'BxTemplPageAccount', ''),
 ('sys_unsubscribe_notifications', 'unsubscribe-notifications', '_sys_page_title_system_unsubscribe_notifications', '_sys_page_title_unsubscribe_notifications', 'system', 5, 2147483647, 1, 'page.php?i=unsubscribe-notifications', '', '', '', 0, 1, 0, '', ''),
 ('sys_unsubscribe_news', 'unsubscribe-news', '_sys_page_title_system_unsubscribe_news', '_sys_page_title_unsubscribe_news', 'system', 5, 2147483647, 1, 'page.php?i=unsubscribe-news', '', '', '', 0, 1, 0, '', ''),
-('sys_add_content', 'add-content', '_sys_page_title_system_add_content', '_sys_page_title_add_content', 'system', 5, 2147483647, 1, 'page.php?i=add-content', '', '', '', 0, 1, 0, '', '');
+('sys_add_content', 'add-content', '_sys_page_title_system_add_content', '_sys_page_title_add_content', 'system', 5, 2147483647, 1, 'page.php?i=add-content', '', '', '', 0, 1, 0, '', ''),
+('sys_std_dashboard', '', '_sys_page_title_system_studio_dashboard', '_sys_page_title_studio_dashboard', 'system', 4, 2147483647, 1, '', '', '', '', 0, 1, 0, '', '');
 
 
 
@@ -3134,7 +3135,16 @@ INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title`, `designb
 
 ('sys_unsubscribe_news', 1, 'system', '_sys_page_block_title_unsubscribe_news', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:16:"unsubscribe_news";s:6:"params";a:0:{}s:5:"class";s:19:"TemplServiceAccount";}', 0, 1, 1),
 
-('sys_add_content', 1, 'system', '_sys_page_block_title_add_content', 11, 2147483647, 'menu', 'sys_add_content', 0, 1, 1);
+('sys_add_content', 1, 'system', '_sys_page_block_title_add_content', 11, 2147483647, 'menu', 'sys_add_content', 0, 1, 1),
+
+-- studio dashboard blocks
+('sys_std_dashboard', 1, 'system', '_sys_page_block_title_std_dash_version', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:17:"get_block_version";s:6:"params";a:0:{}s:5:"class";s:20:"TemplStudioDashboard";}', 0, 0, 1),
+
+('sys_std_dashboard', 1, 'system', '_sys_page_block_title_std_dash_space', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:15:"get_block_space";s:6:"params";a:0:{}s:5:"class";s:20:"TemplStudioDashboard";}', 0, 0, 2),
+
+('sys_std_dashboard', 2, 'system', '_sys_page_block_title_std_dash_host_tools', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:20:"get_block_host_tools";s:6:"params";a:0:{}s:5:"class";s:20:"TemplStudioDashboard";}', 0, 0, 1),
+
+('sys_std_dashboard', 2, 'system', '_sys_page_block_title_std_dash_cache', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:15:"get_block_cache";s:6:"params";a:0:{}s:5:"class";s:20:"TemplStudioDashboard";}', 0, 0, 2);
 
 -- --------------------------------------------------------
 

+ 17 - 5
modules/boonex/english/data/langs/system.xml

@@ -521,13 +521,21 @@
 	<string name="_adm_btn_purchase_submit"><![CDATA[Purchase]]></string>
 	<string name="_adm_btn_settings_save"><![CDATA[Save]]></string>
 	<string name="_adm_dbd_btn_update"><![CDATA[Update]]></string>
-	<string name="_adm_dbd_txt_db_size"><![CDATA[Database size: ]]></string>
 	<string name="_adm_dbd_txt_dolphin_n_available"><![CDATA[Dolphin {0} available!]]></string>
 	<string name="_adm_dbd_txt_dolphin_on"><![CDATA[Dolphin U on]]></string>
 	<string name="_adm_dbd_txt_installed"><![CDATA[Installed:]]></string>
-	<string name="_adm_dbd_txt_media_size"><![CDATA[User media files: ]]></string>
-	<string name="_adm_dbd_txt_space_size"><![CDATA[Total space used: ]]></string>
 	<string name="_adm_dbd_txt_version"><![CDATA[Version:]]></string>
+	<string name="_adm_dbd_txt_su_database"><![CDATA[Database]]></string>
+	<string name="_adm_dbd_txt_su_user_media"><![CDATA[User Media]]></string>
+	<string name="_adm_dbd_txt_su_system"><![CDATA[System]]></string>
+	<string name="_adm_dbd_txt_c_all"><![CDATA[All]]></string>
+	<string name="_adm_dbd_txt_c_db"><![CDATA[Database]]></string>
+	<string name="_adm_dbd_txt_c_template"><![CDATA[Templates]]></string>
+	<string name="_adm_dbd_txt_c_css"><![CDATA[CSS]]></string>
+	<string name="_adm_dbd_txt_c_js"><![CDATA[JavaScript]]></string>
+	<string name="_adm_dbd_txt_c_users"><![CDATA[Users]]></string>
+	<string name="_adm_dbd_err_c_clean_failed"><![CDATA[Failed to clean cache]]></string>
+	<string name="_adm_dbd_msg_c_clean_success"><![CDATA[Cache was successfully cleaned]]></string>
     <string name="_adm_dsn_cnf_uninstall"><![CDATA[<h3>Uninstall "{0}" template?</h3><p>Uninstalling "{0}" template will also delete all of its data. Do you want to continue?</p>]]></string>
 	<string name="_adm_dsg_btn_make_default"><![CDATA[Make Default]]></string>
 	<string name="_adm_dsg_dsc_alt_text"><![CDATA[Serves as "ALT" text for logo image. Used as a logo when no logo image is uploaded.]]></string>
@@ -1182,8 +1190,6 @@
 	<string name="_adm_txt_back_to_launcher"><![CDATA[Back to Launcher]]></string>
 	<string name="_adm_txt_confirm_cancel"><![CDATA[Cancel]]></string>
 	<string name="_adm_txt_confirm_ok"><![CDATA[OK]]></string>
-	<string name="_adm_txt_dashboard_cache_clean_failed"><![CDATA[Failed to clean cache]]></string>
-	<string name="_adm_txt_dashboard_cache_clean_success"><![CDATA[Cache was successfully cleaned]]></string>
 	<string name="_adm_txt_forgot_password"><![CDATA[Forgot password?]]></string>
 	<string name="_adm_txt_form_view_iu_delete"><![CDATA[Delete]]></string>
 	<string name="_adm_txt_form_view_iu_preview"><![CDATA[Current Image]]></string>
@@ -1790,6 +1796,10 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_page_block_title_profile_stats"><![CDATA[Profile stats]]></string>
 	<string name="_sys_page_block_title_unsubscribe_news"><![CDATA[Unsubscribe From Site Newsletters]]></string>
 	<string name="_sys_page_block_title_unsubscribe_notifications"><![CDATA[Unsubscribe From Site Notifications]]></string>
+	<string name="_sys_page_block_title_std_dash_version"><![CDATA[Version]]></string>
+	<string name="_sys_page_block_title_std_dash_space"><![CDATA[Space Usage]]></string>
+	<string name="_sys_page_block_title_std_dash_host_tools"><![CDATA[Host Tools]]></string>
+	<string name="_sys_page_block_title_std_dash_cache"><![CDATA[Cache]]></string>
 	<string name="_sys_page_lang_block_about"><![CDATA[This site is powered by BoonEx Dolphin U. The rest is a mystery.]]></string>
 	<string name="_sys_page_title_about"><![CDATA[About]]></string>
 	<string name="_sys_page_title_account_profile_switcher"><![CDATA[Switch Profile]]></string>
@@ -1819,8 +1829,10 @@ If it is not enabled then please consider implement this optimization, since it
 	<string name="_sys_page_title_system_login"><![CDATA[Sign in]]></string>
 	<string name="_sys_page_title_system_unsubscribe_news"><![CDATA[Unsubscribe From Newsletters]]></string>
 	<string name="_sys_page_title_system_unsubscribe_notifications"><![CDATA[Unsubscribe From Notifications]]></string>
+	<string name="_sys_page_title_system_studio_dashboard"><![CDATA[Studio Dashboard]]></string>
 	<string name="_sys_page_title_unsubscribe_news"><![CDATA[Unsubscribe From Site Newsletters]]></string>
 	<string name="_sys_page_title_unsubscribe_notifications"><![CDATA[Unsubscribe From Site Notifications]]></string>
+	<string name="_sys_page_title_studio_dashboard"><![CDATA[Studio Dashboard]]></string>
 	<string name="_sys_paginate_info"><![CDATA[{0}-{1}]]></string>
 	<string name="_sys_paginate_view_all"><![CDATA[View All]]></string>
 	<string name="_sys_please_select"><![CDATA[Please select...]]></string>

+ 73 - 15
studio/classes/BxDolStudioDashboard.php

@@ -12,10 +12,21 @@ bx_import('BxDolStudioStoreQuery');
 
 class BxDolStudioDashboard extends BxTemplStudioPage
 {
+	protected $aItemsCache;
+
     function __construct()
     {
         parent::__construct('dashboard');
 
+        $this->aItemsCache = array (
+		    array('name' => 'all', 'title' => _t('_adm_dbd_txt_c_all')),
+		    array('name' => 'db', 'title' => _t('_adm_dbd_txt_c_db')),
+		    array('name' => 'template', 'title' => _t('_adm_dbd_txt_c_template')),
+		    array('name' => 'css', 'title' => _t('_adm_dbd_txt_c_css')),
+		    array('name' => 'js', 'title' => _t('_adm_dbd_txt_c_js')),
+		    array('name' => 'users', 'title' => _t('_adm_dbd_txt_c_users')),
+		);
+
         //--- Check actions ---//
         if(($sAction = bx_get('dbd_action')) !== false) {
             $sAction = bx_process_input($sAction);
@@ -40,6 +51,51 @@ class BxDolStudioDashboard extends BxTemplStudioPage
                     if(version_compare($sVersionCur, $sVersionAvl) == -1)
                         $aResult = array('version' => $sVersionAvl);
                     break;
+
+				case 'clear_cache':
+					$sValue = bx_get('dbd_value');
+					if($sValue === false)
+						break;
+
+					$sValue = bx_process_input($sValue);
+
+					bx_import('BxDolCacheUtilities');
+					$oCacheUtilities = BxDolCacheUtilities::getInstance();
+
+					switch ($sValue) {
+				        case 'all':
+				            foreach($this->aItemsCache as $aItem) {
+				            	if($aItem['name'] == 'all')
+				            		continue;
+
+				                $aResult = $oCacheUtilities->clear($aItem['name']);
+				                if($aResult['code'] != 0)
+				                    break;
+				            }
+				            break;
+
+				        case 'users':
+				        case 'db':
+				        case 'template':
+				        case 'css':
+				        case 'js':
+				            $aResult = $oCacheUtilities->clear($sValue);
+				            break;
+
+				        default:
+				            $aResult = array('code' => 1, 'message' => _t('_Error Occured'));
+				    }
+
+				    if($aResult['code'] == 0)
+				        $aResult['data'] = $this->getCacheChartData(false);
+
+					break;
+
+				case 'server_audit':
+					bx_import('BxDolStudioToolsAudit');
+					$oAudit = new BxDolStudioToolsAudit();
+					echo $oAudit->generate();
+					exit;
             }
 
             if(!empty($aResult['message'])) {
@@ -55,21 +111,6 @@ class BxDolStudioDashboard extends BxTemplStudioPage
         }
     }
 
-    protected function loadBlocks()
-    {
-        $aNames = array('versions', 'space');
-
-        $aBlocks = array();
-        foreach($aNames as $sName)
-            $aBlocks[$sName] = array(
-                'caption' => '_adm_block_cpt_' . $sName,
-                'actions' => array(),
-                'items' => ''
-            );
-
-        return $aBlocks;
-    }
-
     protected function getDbSize()
     {
         $iTotalSize = 0;
@@ -98,6 +139,23 @@ class BxDolStudioDashboard extends BxTemplStudioPage
 
         return $iTotalSize;
     }
+
+    protected function getCacheChartData($bAsString = true)
+    {
+		bx_import('BxDolCacheUtilities');
+		$oCacheUtilities = BxDolCacheUtilities::getInstance();
+
+    	$aChartData = array();
+    	foreach($this->aItemsCache as $aItem) {
+    		if($aItem['name'] == 'all')
+	            continue;
+
+	        $iSize = $oCacheUtilities->size($aItem['name']);
+	        $aChartData[] = array(bx_js_string($aItem['title'], BX_ESCAPE_STR_APOS), array('v' => $iSize, 'f' => bx_js_string(_t_format_size($iSize))));
+    	}
+
+    	return $bAsString ? json_encode($aChartData) : $aChartData;
+    }
 }
 
 /** @} */

+ 1 - 0
studio/classes/BxDolStudioTemplate.php

@@ -67,6 +67,7 @@ class BxDolStudioTemplate extends BxDolTemplate implements iBxDolSingleton
             'common.css',
             'default.less',
             'general.css',
+        	'menu.css',
         ));
 
         //--- Add default JS in output

+ 8 - 1
studio/classes/BxDolStudioToolsAudit.php

@@ -145,8 +145,9 @@ class BxDolStudioToolsAudit extends BxDol
         return ob_get_clean();
     }
 
-    public function generateStyles()
+    public function generateStyles($bReturn = false)
     {
+    	ob_start();
         ?>
 <style>
     .ok {
@@ -163,6 +164,12 @@ class BxDolStudioToolsAudit extends BxDol
     }
 </style>
         <?php
+        $sStyles = ob_get_clean();
+
+        if($bReturn)
+			return $sStyles;
+
+		echo $sStyles;
     }
 
     public function generateJs()

+ 1 - 1
studio/dashboard.php

@@ -25,7 +25,7 @@ $oTemplate->setPageHeader($oPage->getPageHeader());
 $oTemplate->setPageContent('page_caption_code', $oPage->getPageCaption());
 $oTemplate->setPageContent('page_attributes', $oPage->getPageAttributes());
 //$oTemplate->setPageContent('page_menu_code', $oPage->getPageMenu());
-$oTemplate->setPageContent('page_main_code', $oPage->getPageCode());
+$oTemplate->setPageContent('page_main_code', $oPage->getPageJsCode() . $oPage->getPageCode());
 $oTemplate->addCss($oPage->getPageCss());
 $oTemplate->addJs($oPage->getPageJs());
 $oTemplate->getPageCode();

+ 102 - 0
studio/js/dashboard.js

@@ -11,6 +11,8 @@ function BxDolStudioDashboard(oOptions) {
     this.sAnimationEffect = oOptions.sAnimationEffect == undefined ? 'fade' : oOptions.sAnimationEffect;
     this.iAnimationSpeed = oOptions.iAnimationSpeed == undefined ? 'slow' : oOptions.iAnimationSpeed;
 
+    this.oData = [];
+
     var $this = this;
     $(document).ready(function() {
     	$('.bx-dbd-block-content').bxTime();
@@ -39,4 +41,104 @@ BxDolStudioDashboard.prototype.checkForUpdateScript = function() {
 		'json'
 	);
 };
+
+BxDolStudioDashboard.prototype.initChart = function(sType, oData) {
+	var $this = this;
+
+    google.setOnLoadCallback(function() {
+    	$this.showChart(sType, oData);
+    });
+};
+
+BxDolStudioDashboard.prototype.showChart = function(sType, oData) {
+	var sDivId = 'bx-dbd-' + sType + '-chart';
+    $('#' + sDivId).html('');
+
+    var oDataTable = new google.visualization.DataTable();
+    oDataTable.addColumn('string', 'Label');
+    oDataTable.addColumn('number', 'Size');   
+
+    if(oData != undefined)
+		this.oData = oData;
+    oDataTable.addRows(this.oData);
+
+    var oOptions = {
+        	width: 512,
+        	height: 256,
+
+			chartArea: {
+				left:10,
+				top:10,
+				width:'92%',
+				height:'92%'
+			}
+        };
+
+    var oChart = new google.visualization.PieChart($('#' + sDivId)[0]);
+    oChart.draw(oDataTable, oOptions);
+};
+
+BxDolStudioDashboard.prototype.clearCache = function(sType) {
+	var $this = this;
+	var oDate = new Date();
+	var sDivId = 'bx-dbd-cache-chart';
+
+	$('#' + sDivId).parents('.bx-page-block-container').find('.bx-db-header .bx-popup-applied:visible').dolPopupHide();
+
+	bx_loading(sDivId, true);
+
+    $.post(
+    	sUrlStudio + 'dashboard.php', 
+        {
+    		dbd_action: 'clear_cache',
+    		dbd_value: sType,
+            _t: oDate.getTime()
+        }, 
+        function(oData) {
+        	bx_loading(sDivId, false);
+
+        	if(oData.message.length > 0)
+    			$this.popup(oData.message);
+
+            if(oData.data != undefined)
+            	$this.showChart('cache', oData.data);
+        },
+        'json'
+    );
+};
+
+BxDolStudioDashboard.prototype.serverAudit = function() {
+	var $this = this;
+	var oDate = new Date();
+	var sDivId = 'bx-dbd-host-tools';
+
+	$('#' + sDivId).parents('.bx-page-block-container').find('.bx-db-header .bx-popup-applied:visible').dolPopupHide();
+
+	bx_loading(sDivId, true);
+
+	$.get(
+		this.sActionsUrl,
+		{
+			dbd_action: 'server_audit',
+			_t: oDate.getTime()
+		},
+		function(sData) {
+			bx_loading(sDivId, false);
+
+			if(!sData.length)
+			    return;
+
+			$('#' + sDivId).hide().html(sData).bx_anim('show', 'fade', 'slow');
+		},
+		'html'
+	);
+};
+
+BxDolStudioDashboard.prototype.popup = function(sValue) {
+	var sId = 'bx-std-dbd-popup';
+
+    $('#' + sId).remove();
+    $('<div id="' + sId + '" style="display: none;"></div>').prependTo('body').html(sValue);
+    $('#' + sId).dolPopup({});
+};
 /** @} */

+ 22 - 1
studio/template/css/dashboard.css

@@ -1,3 +1,11 @@
+div.bx-dashboard {
+	position: relative;
+}
+div.bx-dbd-column {
+	position: relative;
+	float: left;
+	width: 50%;
+}
 div.bx-dbd-block-content {
 	position: relative;
 }
@@ -22,4 +30,17 @@ div.bx-dbd-update-script span {
 	line-height: 26px;
 	line-height: 1.6rem;
 }
-/*--- Space Usage block ---*/
+
+/*--- Chart based blocks ---*/
+div.bx-dbd-space-chart,
+div.bx-dbd-cache-chart {
+	width: 512px;
+	height: 256px;
+	margin: 0px auto; 
+}
+
+/*--- Host Tools block ---*/
+div.bx-dbd-host-tools .bx-btn {
+    display: inline-block;
+    float: none;
+}

+ 6 - 0
studio/template/css/menu.css

@@ -0,0 +1,6 @@
+@import url(../../../template/css/menu.css);
+
+.bx-menu-ver li div {
+	padding: 10px 20px 10px 10px;
+    padding: 0.625rem 1.25rem 0.625rem 0.625rem;
+}

+ 0 - 7
studio/template/dashboard.html

@@ -1,7 +0,0 @@
-<script defer type="text/javascript">
-    var __js_object__ = new BxDolStudioDashboard({
-        sActionUrl: '<bx_url_studio />dashboard.php',
-        sVersion: '__version__'
-    });
-</script>
-<bx_include_auto:page_blocks.html />

+ 8 - 0
studio/template/dbd_cache.html

@@ -0,0 +1,8 @@
+<div class="bx-dbd-block-content bx-clearfix">
+	<div id="bx-dbd-cache-chart" class="bx-dbd-cache-chart bx-def-border"></div>
+
+	<script type="text/javascript">
+		bx_loading('bx-dbd-cache-chart', true);
+		__js_object__.initChart('cache', __chart_data__);
+	</script>
+</div>

+ 11 - 0
studio/template/dbd_htools.html

@@ -0,0 +1,11 @@
+<div class="bx-dbd-block-content bx-clearfix">
+	<div id="bx-dbd-host-tools" class="bx-dbd-host-tools">
+		<bx_text:_sys_inst_hosting_fails />
+	 	<ul>
+			<bx_repeat:items>
+				<li>__item__</li>
+			</bx_repeat:items>
+		</ul>
+		__styles__
+	</div>
+</div>

+ 7 - 10
studio/template/dbd_space.html

@@ -1,11 +1,8 @@
-<div class="bx-dbd-block-content bx-def-margin-bottom">
-	<div class="bx-def-margin-thd-top-auto">
-		<span><bx_text:_adm_dbd_txt_space_size />&nbsp;</span><b>__space_size__</b>
-	</div>
-	<div class="bx-def-margin-thd-top-auto">
-		<span><bx_text:_adm_dbd_txt_db_size />&nbsp;</span><b>__db_size__</b>
-	</div>
-	<div class="bx-def-margin-thd-top-auto">
-		<span><bx_text:_adm_dbd_txt_media_size />&nbsp;</span><b>__media_size__</b>
-	</div>
+<div class="bx-dbd-block-content">
+	<div id="bx-dbd-space-chart" class="bx-dbd-space-chart bx-def-border"></div>
+
+	<script type="text/javascript">
+		bx_loading('bx-dbd-space-chart', true);
+		__js_object__.initChart('space', __chart_data__);
+	</script>
 </div>

+ 6 - 11
studio/template/dbd_versions.html

@@ -2,17 +2,12 @@
 	<div class="bx-dbd-virsion-image">
 		<img src="<bx_image_url:dbd_version.png />"/>
 	</div>
-	<div class="bx-dbd-virsion-info bx-clearfix">
-		<div class="bx-dbd-vi-column">
-			<div class="bx-def-margin-thd-top"><bx_text:_adm_dbd_txt_dolphin_on />&nbsp;<b>__domain__</b></div>
-			<div class="bx-def-margin-thd-top"><bx_text:_adm_dbd_txt_version />&nbsp;<b>__version__</b>&nbsp;<bx_text:_adm_dbd_txt_installed />&nbsp;<b>__installed__</b></div>
-			<div class="bx-dbd-update-script bx-def-margin-thd-top" id="bx-dbd-update-script" style="display:none">
-				<a class="bx-btn bx-btn-small" href="javascript:void(0)" onclick="javascript:alert('TODO: Redirect to update script.')"><bx_text:_adm_dbd_btn_update /></a>
-				<span class="col-red1 bx-def-padding-thd-left"></span>
-			</div>
-		</div>
-		<div class="bx-dbd-vi-column">
-			Modules updated would be here.
+	<div class="bx-dbd-virsion-info">
+		<div class="bx-def-margin-thd-top"><bx_text:_adm_dbd_txt_dolphin_on />&nbsp;<b>__domain__</b></div>
+		<div class="bx-def-margin-thd-top"><bx_text:_adm_dbd_txt_version />&nbsp;<b>__version__</b>&nbsp;<bx_text:_adm_dbd_txt_installed />&nbsp;<b>__installed__</b></div>
+		<div class="bx-dbd-update-script bx-def-margin-thd-top" id="bx-dbd-update-script" style="display:none">
+			<a class="bx-btn bx-btn-small" href="javascript:void(0)" onclick="javascript:alert('TODO: Redirect to update script.')"><bx_text:_adm_dbd_btn_update /></a>
+			<span class="col-red1 bx-def-padding-thd-left"></span>
 		</div>
 	</div>
 </div>

+ 109 - 38
studio/template/scripts/BxBaseStudioDashboard.php

@@ -19,12 +19,21 @@ class BxBaseStudioDashboard extends BxDolStudioDashboard
 
     function getPageCss()
     {
-        return array_merge(parent::getPageCss(), array('dashboard.css'));
+        return array_merge(parent::getPageCss(), array('page_layouts.css', 'dashboard.css'));
     }
 
     function getPageJs()
     {
-        return array_merge(parent::getPageJs(), array('dashboard.js'));
+        return array_merge(parent::getPageJs(), array(
+        	"https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization','version':'1','packages':['corechart']}]}",
+        	'jquery.anim.js',
+        	'dashboard.js'
+        ));
+    }
+
+	function getPageJsClass()
+    {
+        return 'BxDolStudioDashboard';
     }
 
     function getPageJsObject()
@@ -32,58 +41,120 @@ class BxBaseStudioDashboard extends BxDolStudioDashboard
         return 'oBxDolStudioDashboard';
     }
 
-    function getPageCode($bHidden = false)
+	function getPageJsCode($aOptions = array(), $bWrap = true)
     {
-        $oTemplate = BxDolStudioTemplate::getInstance();
-
-        $aBlocks = $this->loadBlocks();
-
-        $aTmplVars = array(
-            'js_object' => $this->getPageJsObject(),
-            'bx_repeat:blocks' => array()
-        );
-
-        $sActions = "";
-        foreach($aBlocks as $sName => $aBlock) {
-            $sMethod = 'getBlockCode' . ucfirst($sName);
-            if(!method_exists($this, $sMethod))
-                continue;
-
-            $aTmplVars['bx_repeat:blocks'][] = array(
-                'caption' => $this->getBlockCaption($aBlock),
-                'panel_top' => '',
-                'items' => $this->$sMethod($sName, $aBlock),
-                'panel_bottom' => '',
-            );
-        }
+        $aOptions = array_merge($aOptions, array(
+            'sActionUrl' => BX_DOL_URL_STUDIO . 'dashboard.php',
+        	'sVersion' => '__version__'
+        ));
+
+		return parent::getPageJsCode($aOptions, $bWrap);
+    }
 
-        return $oTemplate->parseHtmlByName('dashboard.html', $aTmplVars);
+    function getPageCode($bHidden = false)
+    {
+    	bx_import('BxDolPage');
+    	$oPage = BxDolPage::getObjectInstance('sys_std_dashboard');
+    	return $oPage->getCode();
     }
 
-    protected function getBlockCodeVersions($sName, $aBlock)
+	public function serviceGetBlockVersion()
     {
-        $oTemplate = BxDolStudioTemplate::getInstance();
+    	$oTemplate = BxDolStudioTemplate::getInstance();
 
         $oTemplate->addJsTranslation('_adm_dbd_txt_dolphin_n_available');
-        return $oTemplate->parseHtmlByName('dbd_versions.html', array(
+        $sContent = $oTemplate->parseHtmlByName('dbd_versions.html', array(
             'domain' => getParam('site_title'),
             'version' => bx_get_ver(),
             'installed' => bx_time_js(getParam('sys_install_time')),
         ));
+
+    	return array('content' => $sContent);
     }
 
-    protected function getBlockCodeSpace($sName, $aBlock)
+    public function serviceGetBlockSpace()
     {
-        $sSizesSpace = $this->getFolderSize(BX_DIRECTORY_PATH_ROOT);
-        $iSizeDb = $this->getDbSize();
-        $sSizesMedia = $this->getFolderSize(BX_DIRECTORY_STORAGE);
-
-        return BxDolStudioTemplate::getInstance()->parseHtmlByName('dbd_space.html', array(
-            'space_size' => _t_format_size($sSizesSpace),
-            'db_size' => _t_format_size($iSizeDb),
-            'media_size' => _t_format_size($sSizesMedia)
+    	$sJsObject = $this->getPageJsObject();
+
+    	$iSizeDiskTotal = $this->getFolderSize(BX_DIRECTORY_PATH_ROOT);
+    	$iSizeDiskMedia = $this->getFolderSize(BX_DIRECTORY_STORAGE);
+    	$iSizeDb = $this->getDbSize();
+
+    	$aItems = array(
+    		array('label' => '_adm_dbd_txt_su_database', 'value' => $iSizeDb),
+    		array('label' => '_adm_dbd_txt_su_user_media', 'value' => $iSizeDiskMedia),
+    		array('label' => '_adm_dbd_txt_su_system', 'value' => $iSizeDiskTotal - $iSizeDiskMedia),    		
+    	);
+
+    	$iSizeTotal = 0;
+        $aChartData = array();
+        foreach($aItems as $sColor => $aItem) {
+        	$iSizeTotal += $aItem['value'];
+            $aChartData[] = array(bx_js_string(strip_tags(_t($aItem['label'])), BX_ESCAPE_STR_APOS), array('v' => $aItem['value'], 'f' => bx_js_string(_t_format_size($aItem['value']))));
+        }
+
+        $sContent = BxDolStudioTemplate::getInstance()->parseHtmlByName('dbd_space.html', array(
+        	'js_object' => $sJsObject,
+        	'chart_data' => json_encode($aChartData)
         ));
+
+        return array('content' => $sContent);
     }
+
+	public function serviceGetBlockHostTools()
+	{
+		$sJsObject = $this->getPageJsObject();
+
+		bx_import('BxDolStudioToolsAudit');
+		$oAudit = new BxDolStudioToolsAudit();
+
+        $aErrors = $oAudit->checkRequirements(BX_DOL_AUDIT_FAIL);
+        $aWarnings = $oAudit->checkRequirements(BX_DOL_AUDIT_WARN);
+
+        $aTmplVarsItems = array();
+        foreach($aErrors as $sError)
+        	$aTmplVarsItems[] = array('item' => $sError);
+
+        foreach($aWarnings as $sWarning)
+        	$aTmplVarsItems[] = array('item' => $sWarning);
+
+		$aMenu = array(
+			array(
+				'name' => 'audit', 
+				'title' => _t('_sys_inst_server_audit'), 
+				'link' => 'javascript:void(0)',
+				'onclick' => $sJsObject . '.serverAudit()'
+			)
+		);
+
+        $sContent = BxDolStudioTemplate::getInstance()->parseHtmlByName('dbd_htools.html', array(
+	    	'bx_repeat:items' => $aTmplVarsItems,
+        	'styles' => $oAudit->generateStyles(true)
+	    ));
+
+		return array('content' => $sContent, 'menu' => $aMenu);
+	}
+
+	public function serviceGetBlockCache()
+	{
+		$sJsObject = $this->getPageJsObject();
+
+		$aMenu = array();
+	    foreach($this->aItemsCache as $aItem)
+			$aMenu[] = array(
+				'name' => $aItem['name'], 
+				'title' => _t($aItem['title']), 
+				'link' => 'javascript:void(0)', 
+				'onclick' => $sJsObject . ".clearCache('" . $aItem['name'] . "')"
+			);
+
+	    $sContent = BxDolStudioTemplate::getInstance()->parseHtmlByName('dbd_cache.html', array(
+	    	'js_object' => $sJsObject,
+	        'chart_data' => $this->getCacheChartData(),
+	    ));
+    
+		return array('content' => $sContent, 'menu' => $aMenu);
+	}
 }
 
 /** @} */