Index: typo3/sysext/taskcenter/classes/class.tx_taskcenter_status.php =================================================================== --- typo3/sysext/taskcenter/classes/class.tx_taskcenter_status.php (Revision 0) +++ typo3/sysext/taskcenter/classes/class.tx_taskcenter_status.php (Revision 0) @@ -0,0 +1,76 @@ + +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script 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. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * Status of tasks + * + * @author Georg Ringer uc['taskcenter']['states'][$item] = $state; + $GLOBALS['BE_USER']->writeUC(); + } + + + /** + * Saves the sorting order of tasks in the backend user's uc + * + * @param array array of parameters from the AJAX interface, currently unused + * @param TYPO3AJAX object of type TYPO3AJAX + * @return void + */ + public function saveSortingState(array $params, TYPO3AJAX $ajaxObj) { + $sort = array(); + $items = explode('&', t3lib_div::_POST('data')); + foreach($items as $item) { + $sort[] = substr($item, 12); + } + + $GLOBALS['BE_USER']->uc['taskcenter']['sorting'] = serialize($sort); + $GLOBALS['BE_USER']->writeUC(); + } +} + +if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/taskcenter/classes/class.tx_taskcenter_status.php']) { + include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/taskcenter/classes/class.tx_taskcenter_status.php']); +} + +?> \ No newline at end of file Index: typo3/sysext/taskcenter/ext_autoload.php =================================================================== --- typo3/sysext/taskcenter/ext_autoload.php (Revision 0) +++ typo3/sysext/taskcenter/ext_autoload.php (Revision 0) @@ -0,0 +1,11 @@ + $extensionPath . 'interfaces/interface.tx_taskcenter_task.php', + 'tx_taskcenter_about' => $extensionPath . 'task/class.tx_taskcenter_about.php', +); +?> Index: typo3/sysext/taskcenter/ext_emconf.php =================================================================== --- typo3/sysext/taskcenter/ext_emconf.php (Revision 7230) +++ typo3/sysext/taskcenter/ext_emconf.php (Arbeitskopie) @@ -19,7 +19,7 @@ 'conflicts' => '', 'priority' => '', 'loadOrder' => '', - 'module' => 'task', + 'module' => 'mod', 'doNotLoadInFE' => 1, 'state' => 'stable', 'internal' => 0, Index: typo3/sysext/taskcenter/ext_tables.php =================================================================== --- typo3/sysext/taskcenter/ext_tables.php (Revision 7230) +++ typo3/sysext/taskcenter/ext_tables.php (Arbeitskopie) @@ -1,5 +1,20 @@ 'LLL:EXT:taskcenter/locallang.xml:task_help_title', +// 'description' => 'LLL:EXT:taskcenter/locallang.xml:task_help_description', +// 'icon' => 'EXT:taskcenter/task/icon.gif', +// 'task' => 'tx_taskcenter_about' +// ); + + $GLOBALS['TYPO3_CONF_VARS']['BE']['AJAX']['Taskcenter::saveCollapseState'] = 'EXT:taskcenter/classes/class.tx_taskcenter_status.php:tx_taskcenter_status->saveCollapseState'; + $GLOBALS['TYPO3_CONF_VARS']['BE']['AJAX']['Taskcenter::saveSortingState'] = 'EXT:taskcenter/classes/class.tx_taskcenter_status.php:tx_taskcenter_status->saveSortingState'; +} ?> \ No newline at end of file Index: typo3/sysext/taskcenter/interfaces/interface.tx_taskcenter_task.php =================================================================== --- typo3/sysext/taskcenter/interfaces/interface.tx_taskcenter_task.php (Revision 0) +++ typo3/sysext/taskcenter/interfaces/interface.tx_taskcenter_task.php (Revision 0) @@ -0,0 +1,54 @@ + \ No newline at end of file Index: typo3/sysext/taskcenter/locallang.xml =================================================================== --- typo3/sysext/taskcenter/locallang.xml (Revision 0) +++ typo3/sysext/taskcenter/locallang.xml (Revision 0) @@ -0,0 +1,42 @@ + + + + Module labels + module + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: typo3/sysext/taskcenter/res/item-background.jpg =================================================================== Kann nicht anzeigen: Dateityp ist als binär angegeben. svn:mime-type = application/octet-stream Eigenschaftsänderungen: typo3\sysext\taskcenter\res\item-background.jpg ___________________________________________________________________ Hinzugefügt: svn:mime-type + application/octet-stream Index: typo3/sysext/taskcenter/res/list-item-act.gif =================================================================== Kann nicht anzeigen: Dateityp ist als binär angegeben. svn:mime-type = application/octet-stream Eigenschaftsänderungen: typo3\sysext\taskcenter\res\list-item-act.gif ___________________________________________________________________ Hinzugefügt: svn:mime-type + application/octet-stream Index: typo3/sysext/taskcenter/res/list-item.gif =================================================================== Kann nicht anzeigen: Dateityp ist als binär angegeben. svn:mime-type = application/octet-stream Eigenschaftsänderungen: typo3\sysext\taskcenter\res\list-item.gif ___________________________________________________________________ Hinzugefügt: svn:mime-type + application/octet-stream Index: typo3/sysext/taskcenter/res/mod_styles.css =================================================================== --- typo3/sysext/taskcenter/res/mod_styles.css (Revision 0) +++ typo3/sysext/taskcenter/res/mod_styles.css (Revision 0) @@ -0,0 +1,237 @@ +/* ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- */ + +/* general */ +body#ext-taskcenter-task-index-php { + margin:0; +} + +body#ext-taskcenter-task-index-php div#typo3-docbody { + top:60px; +} + +body#ext-taskcenter-task-index-php div#typo3-inner-docbody { + padding:0 10px; + height:100%; +} + +#typo3-inner-docbody p.help { + font-size: 12px; + margin-bottom: 10px; +} + +body#ext-taskcenter-task-index-php img.icon { + vertical-align: bottom; +} + +body#ext-taskcenter-task-index-php h3 { + margin:4px 0 8px; + padding:0; +} + +/* ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- */ +/* overview */ + +#taskcenter-main { + width:100%; +} + +#taskcenter-main #taskcenter-menu { + width:250px; +} + +#taskcenter-main #taskcenter-item { + position:absolute; + margin-left:270px; + margin-right:20px; + top:0; + min-width:300px; + +} + +/* ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- */ +/* menu */ +#taskcenter-menu ul { + list-style:none; + padding:0; + margin:0; + border-bottom:1px solid #b0b7c2; +} + +#taskcenter-menu li { + margin-top:1px; + border-top:1px solid #EFEFF4; +} + +#taskcenter-menu .image { + float:left; + height:23px; + width:23px; +} +#taskcenter-menu .image img { + margin:3px 0 0 1px; +} + +#taskcenter-menu .down { + background:url(../../t3skin/icons/gfx/pil2right.gif) no-repeat 5px 7px; + height:23px; + float:left; + width:25px; + cursor:pointer; +} + +#taskcenter-menu .collapsed .down { + background-image:url(../../t3skin/icons/gfx/pil2down.gif); +} + +#taskcenter-menu .drag { + float:right; + height:23px; + width:24px; +} + +#taskcenter-menu .drag img { + margin-top:6px; + cursor:move; +} + + +#taskcenter-menu .link { + background:url(item-background.jpg) repeat-x; + border:1px solid #b0b7c2; + border-width:1px 1px 0; + line-height:18px; + /*height:23px;*/ + display:block; +} + +#taskcenter-menu .link a { + padding:2px 5px; + display:block; + color:#fff; +} + +#taskcenter-menu .active-task .link a { + font-weight:bold; +} + +#taskcenter-menu .content { + padding:5px 0; + background:#fff; + border:1px solid #b7bec9; +} + +#taskcenter-menu .content p { + padding:3px 5px 5px 5px; + margin:0; +} + +#taskcenter-menu .content ul, #taskcenter-menu .content ul li { + border:0; +} + + +#taskcenter-menu .content ul li a { + display:block; + line-height:16px; + margin:0; + padding:2px 24px; + background:url(list-item.gif) no-repeat 10px 6px; +} + +#taskcenter-menu .content ul li.active { + background-color:#e1e6ec; +} + +#taskcenter-menu .content ul li.active a { + color:#272527; + font-weight:bold; + background-image:url(list-item-act.gif); +} + + + +/* ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- */ +/* content section */ +#taskcenter-item ul { + padding:5px 0 5px 5px; + margin:0; + list-style:none; +} + +#taskcenter-item ul li { + padding:5px 0 0 12px; +} + +#taskcenter-item ul.withicons li { + background:url(list-item.gif) no-repeat 0 7px; +} + +#taskcenter-item ul .image { + float:left; + width: 20px; +} + +#taskcenter-item ul .link { + font-weight: bold; + padding: 2px 5px; +} + +#taskcenter-item ul .link a { + padding:5px; +} + +#taskcenter-item ul .link a:hover { + text-decoration:underline; +} + +#taskcenter-item ul .content { + padding:2px 0 0 25px; +} + +#taskcenter-item ul .content .edit { + display:block; + margin-top:2px; +} + + +/* ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- */ +/* forms */ +#taskcenter-item fieldset.fields legend { + font-weight:bold; + border-bottom:1px solid #ccc; + width:100%; + padding:0 0 2px 20px; +} + +#taskcenter-item fieldset.fields { + border:0; +} + +#taskcenter-item fieldset.fields .row { + width:350px; + clear:both; + padding:5px 0; +} + +#taskcenter-item fieldset.fields label { + width:120px; + display:block; + float:left; +} + +#taskcenter-item fieldset.fields input, #taskcenter-item fieldset.fields select { + /*margin-left:140px;*/ + width:160px; + float:left; + border:1px solid #ccc; + padding:2px 3px; +} + +#taskcenter-item fieldset.fields select { + width:170px; +} + +#taskcenter-item fieldset.fields input[type=checkbox] { + width:16px; + text-align:left; +} Index: typo3/sysext/taskcenter/res/mod_styles2.css =================================================================== --- typo3/sysext/taskcenter/res/mod_styles2.css (Revision 0) +++ typo3/sysext/taskcenter/res/mod_styles2.css (Revision 0) @@ -0,0 +1,87 @@ + +body#ext-taskcenter-task-index-php { + margin: 0px; +} + +#typo3-inner-docbody p.help { + font-size: 12px; + margin-bottom: 10px; +} + +img.icon { + vertical-align: bottom; +} + + +/* ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- */ +/* overview */ + +.task-list dt { + font-weight: bold; + font-size: 11px; + padding: 15px; +margin:10px; +border:1px solid #333; +background:#eee; +float:left; +width:120px; +height:60px; +text-align:center +} + +.task-list dt:hover { +background:#ccc; +border-color:red; +} + +.task-list dt img { + margin: 0 auto 10px auto; +height:30px; +width:30px; +display:block; +} + +.task-list dd { + margin: 2px 0 15px 20px; + padding-left: 22px; +display:none; +} + +/* ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- */ +/* status report */ + +/* +#ext-reports-mod-index-php h2.section-header { + margin: 15px 0; + padding: 2px 0 0 20px; + cursor: pointer; + height: 20px; + clear: left; +} +#ext-reports-mod-index-php h2.collapsed { + background-image:url(../../../gfx/arrowright.png); + background-repeat:no-repeat; +} +#ext-reports-mod-index-php h2.expanded { + background-image:url(../../../gfx/arrowdown.png); + background-repeat:no-repeat; +} +#ext-reports-mod-index-php h2.section-header img { + margin-right:2px; + vertical-align:bottom; +} + +#ext-reports-mod-index-php .message-body { + clear: left; +} + +#ext-reports-mod-index-php .message-left { + float: left; + width: 400px; +} + +#ext-reports-mod-index-php .message-right { + float: left; +} + +*/ \ No newline at end of file Index: typo3/sysext/taskcenter/res/mod_template.html =================================================================== --- typo3/sysext/taskcenter/res/mod_template.html (Revision 0) +++ typo3/sysext/taskcenter/res/mod_template.html (Revision 0) @@ -0,0 +1,35 @@ + +
+ +
+
+
###BUTTONLIST_LEFT###
+
###BUTTONLIST_RIGHT###
+
+
+
###FUNC_MENU###
+
+
+
+ +
+
+ ###CONTENT### +
+
+
+ + + + + +
###BUTTONS###
+ + + + + + + +###OPEN_NEW_WINDOW### ###SHORTCUT### + \ No newline at end of file Index: typo3/sysext/taskcenter/task/class.tx_taskcenter_about.php =================================================================== --- typo3/sysext/taskcenter/task/class.tx_taskcenter_about.php (Revision 0) +++ typo3/sysext/taskcenter/task/class.tx_taskcenter_about.php (Revision 0) @@ -0,0 +1,87 @@ + +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script 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. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + + +/** + * This class provides a description about the taskcenter. + * + * @author Georg Ringer + * @package TYPO3 + * @subpackage tx_taskcenter + * + */ +class tx_taskcenter_about implements tx_taskcenter_Task { + + /** + * Back-reference to the calling reports module + * + * @var tx_reports_Module $taskObject + */ + protected $taskObject; + + + /** + * Constructor + */ + public function __construct(SC_mod_user_task_index $taskObject) { + $this->taskObject = $taskObject; + $GLOBALS['LANG']->includeLLFile('EXT:taskcenter/task/locallang_mod.xml'); + } + + /** + * Render the description of the taskcenter + * + * @return string The task as HTML + */ + public function getTask() { + $content = $this->taskObject->description ( + $GLOBALS['LANG']->getLL('mlang_tabs_tab'), + $GLOBALS['LANG']->getLL('mlang_labels_tabdescr') + ); + + $content .= $GLOBALS['LANG']->getLL('taskcenter-about'); + + return $content; + + } + + /** + * Render an optional additional information for the 1st view in taskcenter. + * Empty for this extension + * + * @return string Overview as HTML + */ + public function getOverview() { + + return ''; + } + +} + + +if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/taskcenter/task/class.tx_taskcenter_about.php']) { + include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/taskcenter/task/class.tx_taskcenter_about.php']); +} + +?> \ No newline at end of file Index: typo3/sysext/taskcenter/task/conf.php =================================================================== --- typo3/sysext/taskcenter/task/conf.php (Revision 7230) +++ typo3/sysext/taskcenter/task/conf.php (Arbeitskopie) @@ -1,11 +1,11 @@ \ No newline at end of file Index: typo3/sysext/taskcenter/task/icon.gif =================================================================== Kann nicht anzeigen: Dateityp ist als binär angegeben. svn:mime-type = application/octet-stream Eigenschaftsänderungen: typo3\sysext\taskcenter\task\icon.gif ___________________________________________________________________ Hinzugefügt: svn:mime-type + application/octet-stream Index: typo3/sysext/taskcenter/task/index.php =================================================================== --- typo3/sysext/taskcenter/task/index.php (Revision 7230) +++ typo3/sysext/taskcenter/task/index.php (Arbeitskopie) @@ -2,7 +2,7 @@ /*************************************************************** * Copyright notice * -* (c) 1999-2009 Kasper Skaarhoj (kasperYYYY@typo3.com) +* (c) 2010 Georg Ringer * All rights reserved * * This script is part of the TYPO3 project. The TYPO3 project is @@ -13,10 +13,7 @@ * * The GNU General Public License can be found at * http://www.gnu.org/copyleft/gpl.html. -* A copy is found in the textfile GPL.txt and important notices to the license -* from the author is found in LICENSE.txt distributed with these scripts. * -* * This script 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 @@ -24,21 +21,24 @@ * * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ + + /** -* User Task Center -* -* @author Kasper Skårhøj -* @author Christian Jul Jensen -* Revision for TYPO3 3.8.0 / Native Workflow System -*/ + * This class provides a taskcenter for BE users + * + * @author Georg Ringer + * @package TYPO3 + * @subpackage taskcenter + * + */ unset($MCONF); require ('conf.php'); require ($BACK_PATH.'init.php'); require ($BACK_PATH.'template.php'); -$LANG->includeLLFile('EXT:taskcenter/task/locallang.php'); -require_once('class.mod_user_task.php'); +$LANG->includeLLFile('EXT:taskcenter/task/locallang.xml'); + $BE_USER->modAccess($MCONF, 1); @@ -46,146 +46,517 @@ // Script Classes // *************************** class SC_mod_user_task_index extends t3lib_SCbase { - var $allExtClassConf = array(); - var $backPath; + protected $pageinfo; + /** - * BE user + * Initializes the Module * - * @var t3lib_beUserAuth + * @return void */ - var $BE_USER; + public function __construct() { + parent::init(); + // initialize document + $this->doc = t3lib_div::makeInstance('template'); + $this->doc->setModuleTemplate( + t3lib_extMgm::extPath('taskcenter') . 'res/mod_template.html' + ); + $this->doc->backPath = $GLOBALS['BACK_PATH']; + $this->doc->getPageRenderer()->loadScriptaculous('effects,dragdrop'); + $this->doc->addStyleSheet( + 'tx_taskcenter', + '../' . t3lib_extMgm::siteRelPath('taskcenter') . 'res/mod_styles.css' + ); + } + /** - * document template object + * Adds items to the ->MOD_MENU array. Used for the function menu selector. * - * @var noDoc + * @return void */ - var $doc; + public function menuConfig() { + $this->MOD_MENU = array('mode' => array()); + $this->MOD_MENU['mode']['tasks'] = 'Tasks'; + $this->MOD_MENU['mode']['information'] = $GLOBALS['LANG']->sL('LLL:EXT:scheduler/mod1/locallang.xml:function.info'); + + parent::menuConfig(); + } + /** - * This makes sure that all classes of task-center related extensions are included - * Further it registers the classes in the variable $this->allExtClassConf + * Creates the module's content. In this case it rather acts as a kind of # + * dispatcher redirecting requests to specific tasks. * * @return void */ - function includeAllClasses() { - foreach($this->MOD_MENU['function'] as $key => $name) { - $curExtClassConf = $this->getExternalItemConfig($this->MCONF['name'], 'function', $key); - if (is_array($curExtClassConf) && $curExtClassConf['path']) { - $this->allExtClassConf[] = $curExtClassConf; - $this->include_once[] = $curExtClassConf['path']; + public function main() { + $docHeaderButtons = $this->getButtons(); + $markers = array(); + + // Access check! @todo: need access check? + if ($GLOBALS['BE_USER']->user['admin'] || 1==1) { + + $this->doc->JScodeArray[] = ' + script_ended = 0; + function jumpToUrl(URL) { + document.location = URL; + } + + Event.observe(document, "dom:loaded", function(){ + var changeEffect; + Sortable.create("task-list", { handles:$$("#task-list .drag"), tag: "li", ghosting:false, overlap:"vertical", constraint:false, + onChange: function(item) { + var list = Sortable.options(item).element; + // deactivate link + $$("#task-list a").each(function(link) { + link.writeAttribute("onclick","return false;"); + }); + + }, + + onUpdate: function(list) { + new Ajax.Request("../../../ajax.php", { + method: "post", + parameters: { ajaxID :"Taskcenter::saveSortingState", data: Sortable.serialize(list)} + //parameters : "ajaxID=Taskcenter::saveSortingState&item=" + Sortable.serialize(list) + }); + // activate link + Event.observe(window,"mouseup",function(){ + $$("#task-list a").each(function(link) { + link.writeAttribute("onclick",""); + }); + }); + + } + }); + + $$("#taskcenter-menu .down").invoke("observe", "click", function(event){ + var item = Event.element(event); + var itemParent = item.up(); + item = item.next("div").next("div").next("div").next("div"); + + if (itemParent.hasClassName("expanded")) { + itemParent.removeClassName("expanded").addClassName("collapsed"); + Effect.BlindUp(item, {duration : 0.5}); + state = 1; + } else { + itemParent.removeClassName("collapsed").addClassName("expanded"); + Effect.BlindDown(item, {duration : 0.5}); + state = 0; + } + new Ajax.Request("../../../ajax.php", { + parameters : "ajaxID=Taskcenter::saveCollapseState&item=" + itemParent.id + "&state=" + state + }); + }); + }); + '; + $this->doc->postCode=' + + '; + + // Render content depending on the mode + $mode = (string)$this->MOD_SETTINGS['mode']; + if ($mode == 'information') { + $this->renderInformationContent(); + } else { + $this->renderModuleContent(); } + + + } else { + $flashMessage = t3lib_div::makeInstance( + 't3lib_FlashMessage', + $GLOBALS['LANG']->getLL('error-access', true), + $GLOBALS['LANG']->getLL('error_header'), + t3lib_FlashMessage::ERROR + ); + $this->content.= $flashMessage->render(); } + + // compile document + $markers['FUNC_MENU'] = t3lib_BEfunc::getFuncMenu( + 0, + 'SET[mode]', + $this->MOD_SETTINGS['mode'], + $this->MOD_MENU['mode'] + ); + $markers['CONTENT'] = $this->content; + + // Build the for the module + $this->content = $this->doc->startPage($GLOBALS['LANG']->getLL('title')); + $this->content .= $this->doc->moduleBody($this->pageinfo, $docHeaderButtons, $markers); + $this->content .= $this->doc->endPage(); + $this->content = $this->doc->insertStylesAndJS($this->content); } /** - * This is the main function called by the TYPO3 framework + * Prints out the module's HTML * - * @return string The conntent of the module (HTML) + * @return void */ - function main() { - global $BE_USER, $LANG, $BACK_PATH, $TCA_DESCR, $TCA, $CLIENT, $TYPO3_CONF_VARS; + public function printContent() { + echo $this->content; + } - /* Setup document template */ - $this->doc = t3lib_div::makeInstance('noDoc'); - $this->doc->divClass = ''; - $this->doc->form = '
'; - $this->backPath = $this->doc->backPath = $BACK_PATH; - $this->doc->getPageRenderer()->loadPrototype(); - $this->doc->JScode = ' - '; - $this->doc->JScode .= $this->doc->getDynTabMenuJScode(); - $this->doc->JScode .= ''; + $content = $this->doc->section($title, $description, FALSE, TRUE); - /* call getMainContent first, because what happens here might affect leftContent */ - $mainContent = $this->getMainContent(); + return $content; + } - /* content... */ - $this->content = ''; - $this->content .= $this->doc->startPage($this->MOD_MENU['function'][$this->MOD_SETTINGS['function']]); - $this->content .= ''; - $this->content .= ''; - $this->content .= ''; - $this->content .= '
'.$this->getleftHeader().$this->getDynTabMenu().''.$mainContent.'
'; + /** + * Render a list of items as a nicely formated definition list including a + * link, icon, title and description. + * The keys of a single item are: + * - title: Title of the item + * - link: Link to the task + * - icon: Path to the icon or Icon as HTML if it begins with uc['taskcenter']['sorting']); + if (is_array($userSorting)) { + $newSorting = array(); + foreach($userSorting as $item) { + if(isset($items[$item])) { + $newSorting[] = $items[$item]; + unset($items[$item]); + } + } + $items = $newSorting + $items; + } + } + + if (is_array($items) && count($items) > 0) { + foreach($items as $item) { + $title = htmlspecialchars($item['title']); + + $icon = $additionalClass = $collapsedStyle = ''; + // Check for custom icon + if (!empty($item['icon'])) { + if (strpos($item['icon'], '' . $title . ''; + } + if (@is_file($icon)) { + $icon = ''; + } + } else { + $icon = $item['icon']; + } + } + + + $description = (!empty($item['descriptionHtml'])) ? $item['descriptionHtml'] : '

' . nl2br(htmlspecialchars($item['description'])) . '

'; + + $id = $this->getUniqueKey($item['uid']); + + // collapsed & expanded menu items + if ($mainMenu && isset($GLOBALS['BE_USER']->uc['taskcenter']['states'][$id]) && $GLOBALS['BE_USER']->uc['taskcenter']['states'][$id]) { + $collapsedStyle = 'style="display:none"'; + $additionalClass = 'collapsed'; + } else { + $additionalClass = 'expanded'; + } + + // first & last menu item + if ($count == 0) { + $additionalClass .= ' first-item'; + } elseif ($count + 1 === count($items)) { + $additionalClass .= ' last-item'; + } + + // active menu item + $active = ((string) $this->MOD_SETTINGS['function'] == $item['uid']) ? ' active-task' : ''; + + if ($mainMenu) { + $section = '
 
+
' . $icon . '
+
+ +
'; + } + + $content .= '
  • + ' . $section . ' + + +
    ' . $description . '
    +
  • '; + + $count++; + } + + $navId = ($mainMenu) ? 'id="task-list"' : ''; + + $content = '
      ' . $content . '
    '; + + } + + return $content; } - /** Generate the dynamic tab menu in the left side by iterating - * over all submodules and creating configurations. + /** + * Shows an overview list of available reports. * - * @return string the code for the dynamic tab menu (HTML) + * @return string list of available reports */ - function getDynTabMenu() { - //walk through registered submodules and generate configuration - //for tabmenu - $parts = Array(); - foreach($this->allExtClassConf as $conf) { - $extObj = t3lib_div::makeInstance($conf['name']); - /* call init to make sure the LOCAL_LANG is included for all listed - * extensions. If they OVERRIDE each other there is trouble! */ - $extObj->init($this, $conf); - $extObj->backPath = $this->backPath; - $extObj->mod_user_task_init($GLOBALS['BE_USER']); - $part = $extObj->overview_main(); - if (is_array($part)) { - $parts[] = $part; + protected function indexAction() { + $icon = t3lib_extMgm::extRelPath('taskcenter') . 'task/task.gif'; + $tasks = array(); + + foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['taskcenter'] as $extKey => $extensionReports) { + foreach ($extensionReports as $taskName => $task) { + if (!$this->checkAccess($extKey, $taskName)) { + continue; + } + $link = 'index.php?M=tools_txtaskcenterM1&SET[function]=' . $extKey . '.' . $taskName; + $taskTitle = $GLOBALS['LANG']->sL($task['title']); + $taskDescriptionHtml = ''; + + // Check for custom icon + if (!empty($task['icon'])) { + $icon = t3lib_div::getFileAbsFilename($task['icon']); + } + + $taskInstance = t3lib_div::makeInstance($task['task'], $this); + if ($taskInstance instanceof tx_taskcenter_Task) { + $taskDescriptionHtml = $taskInstance->getOverview(); + } + + + $uniqueKey = $this->getUniqueKey($extKey . '.' . $taskName); + $tasks[$uniqueKey] = array( + 'title' => $taskTitle, + 'descriptionHtml' => $taskDescriptionHtml, + 'description' => $GLOBALS['LANG']->sL($task['description']), + 'icon' => $icon, + 'link' => $link, + 'uid' => $extKey . '.' . $taskName + ); } } - return $this->doc->getDynTabMenu($parts, 'tx_taskcenter', 1, true); + + $content .= $this->renderListMenu($tasks, TRUE); + + return $content; } /** - * Generate the header of the left column + * Create the panel of buttons for submitting the form or otherwise + * perform operations. * - * @return string header in the left side (HTML) + * @return array all available buttons as an assoc. array */ - function getleftHeader() { - $name = $GLOBALS['BE_USER']->user['realName'] ? $GLOBALS['BE_USER']->user['realName'] : $GLOBALS['BE_USER']->user['username']; - return '

    TYPO3 taskcenter
    ' . htmlspecialchars($name) . '

    '; + protected function getButtons() { + $buttons = array( + 'csh' => t3lib_BEfunc::cshItem('_MOD_web_func', '', $GLOBALS['BACK_PATH']), + 'shortcut' => '', + 'open_new_window' => $this->openInNewWindow() + ); + + // Shortcut + if ($GLOBALS['BE_USER']->mayMakeShortcut()) { + $buttons['shortcut'] = $this->doc->makeShortcutIcon('', 'function', $this->MCONF['name']); + } + + return $buttons; } /** - * Get the main content for the module by initiating the external object (if any) and calling it's main function. + * Check the access to a task. Considered are: + * - Admins are always allowed + * - Tasks can be restriced to admins only + * - Tasks can be blinded for Users with TsConfig taskcenter.. = 0 * - * @return string main content (HTML) + * @param string $extKey: Extension key + * @param string $taskName: Name of the task + * @return boolean Access to the task allowed or not */ - function getMainContent() { - if (is_object($this->extObj)) { - $this->extObj->backPath = $this->backPath; - $this->extObj->mod_user_task_init($GLOBALS['BE_USER']); - return $this->extObj->main(); + protected function checkAccess($extKey, $taskName) { + // check if task is blinded with TsConfig (taskcenter.. + $tsConfig = $GLOBALS['BE_USER']->getTSConfig('taskcenter.' . $extKey . '.' . $taskName); + if (isset($tsConfig['value']) && intval($tsConfig['value']) == 0) { + return FALSE; + } + + // admins are always allowed + if ($GLOBALS['BE_USER']->isAdmin()) { + return TRUE; } + + // check if task is restricted to admins + if (intval($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['taskcenter'][$extKey][$taskName]['admin']) == 1) { + return FALSE; + } + } /** - * Output the content of the object to the browser + * Returns HTML code to dislay an url in an iframe at the right side of the taskcenter * - * @return void + * @param string $url: url to display + * @param int $max: + * @return string code that inserts the iframe (HTML) */ - function printContent() { - $this->content .= $this->doc->endPage(); - echo $this->content; + public function urlInIframe($url, $max=0) { + $this->doc->JScodeArray[] = + 'function resizeIframe(frame,max) { + var parent = $("typo3-docbody"); + var parentHeight = $(parent).getHeight() - 0; + var parentWidth = $(parent).getWidth() - $("taskcenter-menu").getWidth() - 50; + $("list_frame").setStyle({height: parentHeight+"px", width: parentWidth+"px"}); + + } + // event crashes IE6 so he is excluded first + var version = parseFloat(navigator.appVersion.split(";")[1].strip().split(" ")[1]); + if (!(Prototype.Browser.IE && version == 6)) { + Event.observe(window, "resize", resizeIframe, false); + }'; + + return ''; } + /** + * Create a unique key from a string which can be used in Prototype's Sortable + * Therefore '_' are replaced + * + * @param string $string: string which is used to generate the identifier + * @return string modified string + */ + protected function getUniqueKey($string) { + $search = array('.', '_'); + $replace = array('-', ''); + + return str_replace($search, $replace, $string); + } + + /** + * This method prepares the link for opening the devlog in a new window + * + * @return string Hyperlink with icon and appropriate JavaScript + */ + protected function openInNewWindow() { + $url = t3lib_div::getIndpEnv('TYPO3_REQUEST_SCRIPT'); + $onClick = "devlogWin=window.open('" . $url . "','taskcenter','width=790,status=0,menubar=1,resizable=1,location=0,scrollbars=1,toolbar=0');return false;"; + $content = '' . + '' . + ''; + return $content; + } + + } @@ -197,12 +568,10 @@ // Make instance: $SOBE = t3lib_div::makeInstance('SC_mod_user_task_index'); -$SOBE->init(); -$SOBE->includeAllClasses(); - // Include files? -foreach($SOBE->include_once as $INC_FILE) include_once($INC_FILE); -$SOBE->checkExtObj(); // Checking for first level external objects +foreach($SOBE->include_once as $INC_FILE) { + include_once($INC_FILE); +} $SOBE->main(); $SOBE->printContent(); Index: typo3/sysext/taskcenter/task/locallang.xml =================================================================== --- typo3/sysext/taskcenter/task/locallang.xml (Revision 7230) +++ typo3/sysext/taskcenter/task/locallang.xml (Arbeitskopie) @@ -6,7 +6,16 @@ - + + + + + + + + + + @@ -19,6 +28,25 @@ + + + + + + + + \ No newline at end of file