From 1d80be8a78e6b785cf428962deac690d3e127b0e Mon Sep 17 00:00:00 2001 From: Megan Watson Date: Fri, 14 Dec 2007 06:43:02 +0000 Subject: [PATCH] KTC-286 "Welcome to knowledgeTree dashlet should always be on the top left corner of the dashlet container" Fixed. Refactored the way the users state is refreshed. It now uses the plugin_helper table to get any new dashlets. --- dashboard.php | 61 ++++++++++++++++++++++++++++++++----------------------------- lib/dashboard/dashletregistry.inc.php | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- lib/users/User.inc | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- 3 files changed, 151 insertions(+), 65 deletions(-) diff --git a/dashboard.php b/dashboard.php index c12b88e..647c142 100644 --- a/dashboard.php +++ b/dashboard.php @@ -3,38 +3,38 @@ * $Id$ * * Main dashboard page -- This page is presented to the user after login. - * It contains a high level overview of the users subscriptions, checked out - * document, pending approval routing documents, etc. + * It contains a high level overview of the users subscriptions, checked out + * document, pending approval routing documents, etc. * * KnowledgeTree Open Source Edition * Document Management Made Simple * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited - * + * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation. - * + * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. - * + * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. - * + * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by - * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices - * must display the words "Powered by KnowledgeTree" and retain the original - * copyright notice. + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. * Contributor( s): ______________________________________ */ @@ -53,9 +53,9 @@ require_once(KT_LIB_DIR . '/dashboard/DashletDisables.inc.php'); $sectionName = 'dashboard'; class DashboardDispatcher extends KTStandardDispatcher { - + var $notifications = array(); - var $sHelpPage = 'ktcore/dashboard.html'; + var $sHelpPage = 'ktcore/dashboard.html'; function DashboardDispatcher() { $this->aBreadcrumbs = array( @@ -67,25 +67,29 @@ class DashboardDispatcher extends KTStandardDispatcher { $this->oPage->setShowPortlets(false); // retrieve action items for the user. // FIXME what is the userid? - - + + $oDashletRegistry =& KTDashletRegistry::getSingleton(); $aDashlets = $oDashletRegistry->getDashlets($this->oUser); - + $this->sSection = 'dashboard'; $this->oPage->setBreadcrumbDetails(_kt('Home')); $this->oPage->title = _kt('Dashboard'); - + // simplistic improvement over the standard rendering: float half left // and half right. +Involves no JS -can leave lots of white-space at the bottom. $aDashletsLeft = array(); - $aDashletsRight = array(); + $aDashletsRight = array(); $i = 0; foreach ($aDashlets as $oDashlet) { - if ($i == 0) { $aDashletsLeft[] = $oDashlet; } - else {$aDashletsRight[] = $oDashlet; } + if(strpos(strtolower($oDashlet->sTitle), 'welcome to knowledgetree') !== false && !empty($aDashletsLeft)){ + array_unshift($aDashletsLeft, $oDashlet); + }else{ + if ($i == 0) { $aDashletsLeft[] = $oDashlet; } + else {$aDashletsRight[] = $oDashlet; } + } $i += 1; $i %= 2; } @@ -97,10 +101,10 @@ class DashboardDispatcher extends KTStandardDispatcher { $this->oPage->requireJSResource('thirdpartyjs/yui/dom/dom.js'); $this->oPage->requireJSResource('thirdpartyjs/yui/dragdrop/dragdrop.js'); $this->oPage->requireJSResource('resources/js/DDList.js'); - + $this->oUser->refreshDashboadState(); - + // dashboard $sDashboardState = $this->oUser->getDashboardState(); $sDSJS = 'var savedState = '; @@ -114,7 +118,6 @@ class DashboardDispatcher extends KTStandardDispatcher { $this->oPage->requireJSStandalone($sDSJS); $this->oPage->requireJSResource('resources/js/dashboard.js'); - // render $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate('kt3/dashboard'); @@ -125,33 +128,33 @@ class DashboardDispatcher extends KTStandardDispatcher { ); return $oTemplate->render($aTemplateData); } - + // return some kind of ID for each dashlet // currently uses the class name function _getDashletId($oDashlet) { return get_class($oDashlet); } - // disable a dashlet. + // disable a dashlet. // FIXME this very slightly violates the separation of concerns, but its not that flagrant. function do_disableDashlet() { $sNamespace = KTUtil::arrayGet($_REQUEST, 'fNamespace'); $iUserId = $this->oUser->getId(); - + if (empty($sNamespace)) { $this->errorRedirectToMain('No dashlet specified.'); exit(0); } - + // do the "delete" - + $this->startTransaction(); $aParams = array('sNamespace' => $sNamespace, 'iUserId' => $iUserId); $oDD = KTDashletDisable::createFromArray($aParams); if (PEAR::isError($oDD)) { $this->errorRedirectToMain('Failed to disable the dashlet.'); } - + $this->commitTransaction(); $this->successRedirectToMain('Dashlet disabled.'); } diff --git a/lib/dashboard/dashletregistry.inc.php b/lib/dashboard/dashletregistry.inc.php index afa1c76..8445ade 100644 --- a/lib/dashboard/dashletregistry.inc.php +++ b/lib/dashboard/dashletregistry.inc.php @@ -5,32 +5,32 @@ * KnowledgeTree Open Source Edition * Document Management Made Simple * Copyright (C) 2004 - 2007 The Jam Warehouse Software (Pty) Limited - * + * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation. - * + * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * * You can contact The Jam Warehouse Software (Pty) Limited, Unit 1, Tramber Place, * Blake Street, Observatory, 7925 South Africa. or email info@knowledgetree.com. - * + * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. - * + * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by - * KnowledgeTree" logo and retain the original copyright notice. If the display of the + * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices - * must display the words "Powered by KnowledgeTree" and retain the original - * copyright notice. + * must display the words "Powered by KnowledgeTree" and retain the original + * copyright notice. * Contributor( s): ______________________________________ * */ @@ -53,6 +53,55 @@ class KTDashletRegistry { $this->nsnames[$nsname] = array($name, $filename, $nsname, $sPlugin); } + /** + * Get any dashlets added since the user's last login + * + * @param object $oUser + */ + function getNewDashlets($oUser, $sCurrent) { + $new = array(); + $inactive = array(); + + static $sInactive = ''; + $sIgnore = (!empty($sInactive)) ? $sCurrent.','.$sInactive : $sCurrent; + + // Get all dashlets that haven't already been displayed to the user and are active for the user + $query = "SELECT * FROM plugin_helper h + INNER JOIN plugins p ON (h.plugin = p.namespace) + WHERE p.disabled = 0 AND classtype = 'dashlet' + AND h.classname NOT IN ($sIgnore)"; + + $res = DBUtil::getResultArray($query); + + // If the query is not empty, get the dashlets and return the new active ones + // Add the inactive ones the list. + if(!PEAR::isError($res) && !empty($res)){ + $oRegistry =& KTPluginRegistry::getSingleton(); + foreach ($res as $item){ + $name = $item['classname']; + $filename = $item['pathname']; + $sPluginName = $item['plugin']; + + require_once($filename); + $oPlugin =& $oRegistry->getPlugin($sPluginName); + + $oDashlet = new $name; + $oDashlet->setPlugin($oPlugin); + if ($oDashlet->is_active($oUser)) { + $new[] = $name; + }else{ + $inactive[] = "'$name'"; + } + } + // Add new inactive dashlets + $sNewInactive = implode(',', $inactive); + $sInactive = (!empty($sInactive)) ? $sInactive.','.$sNewInactive : $sNewInactive; + + return $new; + } + return ''; + } + // FIXME we might want to do the pruning now, but I'm unsure how to handle the preconditions. function getDashlets($oUser) { $aDashlets = array(); diff --git a/lib/users/User.inc b/lib/users/User.inc index 4d54a9f..edaeaf2 100644 --- a/lib/users/User.inc +++ b/lib/users/User.inc @@ -81,6 +81,12 @@ class User extends KTEntity { var $dLastLogin = null; var $bDisabled = false; + /** + * The dashboard state for the current user + * @var string + */ + var $sDashboardState = ''; + var $_aFieldToSelect = array( 'iId' => 'id', 'sUserName' => 'username', @@ -176,23 +182,26 @@ class User extends KTEntity { } function getDashboardState() { - return KTUtil::getSystemSetting($this->_getDashboardStateKey()); + if(empty($this->sDashboardState)){ + $this->sDashboardState = KTUtil::getSystemSetting($this->_getDashboardStateKey()); + } + return $this->sDashboardState; } function setDashboardState($mValue) { + $this->sDashboardState = $mValue; KTUtil::setSystemSetting($this->_getDashboardStateKey(), $mValue); } function refreshDashboadState() { require_once(KT_DIR . "/thirdparty/pear/JSON.php"); - $dashletRegistry = & KTDashletRegistry::getSingleton(); - $aDashlets = $dashletRegistry->getDashlets($this); + $update = false; + $knownlist = array(); $oJSON = new Services_JSON(); - $state = $this->getDashboardState(); $dashlets = $oJSON->decode($state); @@ -200,34 +209,59 @@ class User extends KTEntity { if (!isset($dashlets->right)) $dashlets->right = array(); $mergedlist = kt_array_merge($dashlets->left,$dashlets->right); - - $knownlist = array(); foreach($mergedlist as $dashlet) { - array_push($knownlist,$dashlet->id); + array_push($knownlist,"'".$dashlet->id."'"); } - $update=false; - //if (!isset($dashlets->left)) $dashlets->left=array(); - //if (!isset($dashlets->right)) $dashlets->right=array(); + $sKnownlist = implode(',', $knownlist); + $aDashlets = $dashletRegistry->getNewDashlets($this, $sKnownlist); + + if(!empty($aDashlets)){ + $column=1; + foreach($aDashlets as $class) + { + $column = ($column + 1) %2; + $obj = new stdClass(); + $obj->id=$class; + $obj->state=0; + + if ($column == 0) + array_push($dashlets->left,$obj); + else + array_push($dashlets->right,$obj); + $update=true; + } + } - $column=1; - foreach($aDashlets as $dashlet) - { - $class = get_class($dashlet); - $column=($column + 1) %2; - if (!in_array($class,$knownlist)) - { - $obj = new stdClass(); - $obj->id=$class; - $obj->state=0; - - if ($column == 0) - array_push($dashlets->left,$obj); - else - array_push($dashlets->right,$obj); - $update=true; - } + // Check if the KT Info dashlet is being displayed + // If it's not in the top left corner, move it there. + if(!(strpos($sKnownlist, 'KTInfoDashlet') === false) && $knownlist[0] != "'KTInfoDashlet'"){ + $left = $dashlets->left; + $right = $dashlets->right; + + $found = false; + $update = true; + foreach($left as $key => $item){ + if($item->id == 'KTInfoDashlet'){ + // found the dashlet + $found = 'true'; + array_splice($dashlets->left, $key, 1); + array_unshift($dashlets->left, $item); + continue; + } + } + if(!$found){ + foreach($right as $key => $item){ + if($item->id == 'KTInfoDashlet'){ + // found the dashlet + $found = 'true'; + array_splice($dashlets->right, $key, 1); + array_unshift($dashlets->left, $item); + continue; + } + } + } } if ($update) -- libgit2 0.21.4