Project

General

Profile

Bug #23540 » module_menu_extjs_v9.diff

Administrator Admin, 2010-09-15 13:43

View differences:

t3lib/class.t3lib_befunc.php (working copy)
$signals[] = $params['JScode'];
} else if ($set == 'updatePageTree' || $set == 'updateFolderTree') {
$signals[] = '
if (top && top.content && top.content.nav_frame && top.content.nav_frame.Tree) {
top.content.nav_frame.Tree.refresh();
if (top && top.TYPO3.Backend.NavigationContainer) {
top.TYPO3.Backend.NavigationContainer.refresh();
}';
}
}
t3lib/class.t3lib_loadmodules.php (working copy)
for($i=0;$i < $slashes;$i++) {
$destDir = '../'.$destDir;
}
return $destDir;
return t3lib_div::resolveBackPath($destDir);
}
}
t3lib/config_default.php (working copy)
'ShortcutMenu::create' => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->createAjaxShortcut',
'ModuleMenu::saveMenuState' => 'typo3/classes/class.modulemenu.php:ModuleMenu->saveMenuState',
'ModuleMenu::render' => 'typo3/classes/class.modulemenu.php:ModuleMenu->renderAjax',
'ModuleMenu::getData' => 'typo3/classes/class.modulemenu.php:ModuleMenu->getModuleData',
'BackendLogin::login' => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->login',
'BackendLogin::logout' => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->logout',
'BackendLogin::refreshLogin' => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->refreshLogin',
typo3/alt_db_navframe.php (working copy)
theUrl += "?id=" + id
}
top.fsMod.currentBank = bank;
top.TYPO3.Backend.ContentContainer.setUrl(theUrl);
if (top.TYPO3.configuration.condensedMode) {
top.content.location.href = theUrl;
} else {
parent.list_frame.location.href=theUrl;
}
'.($this->doHighlight ? 'Tree.highlightActiveItem("web", highlightID + "_" + bank);' : '').'
'.(!$GLOBALS['CLIENT']['FORMSTYLE'] ? '' : 'if (linkObj) linkObj.blur(); ').'
return false;
typo3/alt_file_navframe.php (working copy)
theUrl += "?id=" + id
}
top.fsMod.currentBank = bank;
top.TYPO3.Backend.ContentContainer.setUrl(theUrl);
if (top.TYPO3.configuration.condensedMode) {
top.content.location.href = theUrl;
} else {
parent.list_frame.location.href=theUrl;
}
'.($this->doHighlight ? 'Tree.highlightActiveItem("file", highlightID + "_" + bank);' : '').'
'.(!$CLIENT['FORMSTYLE'] ? '' : 'if (linkObj) linkObj.blur(); ').'
return false;
typo3/backend.php (working copy)
'js/loginrefresh.js',
'js/extjs/debugPanel.js',
'js/extjs/viewport.js',
'js/extjs/iframepanel.js',
'js/extjs/viewportConfiguration.js',
);
......
$logo = t3lib_div::makeInstance('TYPO3Logo');
$logo->setLogo('gfx/typo3logo_mini.png');
$menu = $this->moduleMenu->render();
if ($this->menuWidth != $this->menuWidthDefault) {
$this->css .= '
#typo3-top {
margin-left: ' . $this->menuWidth . 'px;
}
';
}
// create backend scaffolding
$backendScaffolding = '
<div id="typo3-backend">
<div id="typo3-top-container" class="x-hide-display">
<div id="typo3-logo">'.$logo->render().'</div>
<div id="typo3-top" class="typo3-top-toolbar">' .
$this->renderToolbar() .
'</div>
</div>
<div id="typo3-main-container">
<div id="typo3-side-menu" class="x-hide-display">' .
$menu .
'</div>
<div id="typo3-content" class="x-hide-display">
<iframe src="alt_intro.php" name="content" id="content" marginwidth="0" marginheight="0" frameborder="0" scrolling="auto"></iframe>
</div>
</div>
</div>
';
/******************************************************
......
protected function generateJavascript() {
$pathTYPO3 = t3lib_div::dirname(t3lib_div::getIndpEnv('SCRIPT_NAME')).'/';
$goToModuleSwitch = $this->moduleMenu->getGotoModuleJavascript();
$moduleFramesHelper = implode(LF, $this->moduleMenu->getFsMod());
// If another page module was specified, replace the default Page module with the new one
......
this.denyFileTypes = TYPO3.configuration.denyFileTypes;
}
var TS = new typoSetup();
var currentModuleLoaded = "";
//backwards compatibility
/**
* Frameset Module object
*
......
this.currentMainLoaded="";
this.currentBank="0";
}
var fsMod = new fsModules();' . $moduleFramesHelper . ';';
var fsMod = new fsModules();' . $moduleFramesHelper . ';
// add goToModule code
$this->pageRenderer->addExtOnReadyCode('
top.goToModule = ' . $goToModuleSwitch . ';
');
top.goToModule = function(modName, cMR_flag, addGetVars) {
ModuleMenu.App.showModule(modName, addGetVars);
}
' . $this->setStartupModule();
// Check editing of page:
$this->handlePageEditing();
$this->setStartupModule();
}
/**
......
$moduleParameters = t3lib_div::_GET('modParams');
if($startModule) {
$this->pageRenderer->addExtOnReadyCode('
// start in module:
function startInModule(modName, cMR_flag, addGetVars) {
Ext.onReady(function() {
top.goToModule(modName, cMR_flag, addGetVars);
});
return '
// start in module:
top.startInModule = [\'' . $startModule . '\', ' . t3lib_div::quoteJSvalue($moduleParameters) . '];
';
} else {
return '';
}
startInModule(\''.$startModule.'\', false, '.t3lib_div::quoteJSvalue($moduleParameters).');
');
}
}
/**
typo3/classes/class.modulemenu.php (working copy)
}
/**
* ModuleMenu Store loading data
*
* @param array_type $params
* @param object $ajaxObj
*/
public function getModuleData($params, $ajaxObj) {
$data = array('success' => TRUE, 'root' => array());
$rawModuleData = $this->getRawModuleData();
$index = 0;
foreach($rawModuleData as $moduleKey => $moduleData) {
$key = substr($moduleKey, 8);
$num = count($data['root']);
if($moduleData['link'] != 'dummy.php' || ($moduleData['link'] == 'dummy.php' && is_array($moduleData['subitems'])) ) {
$data['root'][$num]['key'] = $key;
$data['root'][$num]['menuState'] = $GLOBALS['BE_USER']->uc['moduleData']['menuState'][$moduleKey];
$data['root'][$num]['label'] = $moduleData['title'];
$data['root'][$num]['subitems'] = is_array($moduleData['subitems']) ? count($moduleData['subitems']) : 0;
if($moduleData['link'] && $this->linkModules) {
$data['root'][$num]['link'] = 'top.goToModule(\'' . $moduleData['name'] . '\')';
}
// traverse submodules
if (is_array($moduleData['subitems'])) {
foreach($moduleData['subitems'] as $subKey => $subData) {
// Setting additional JavaScript
$additionalJavascript = '';
if($subData['parentNavigationFrameScript']) {
$parentModuleName = substr($subData['name'], 0, strpos($subData['name'], '_'));
$additionalJavascript = "+'&id='+top.rawurlencodeAndRemoveSiteUrl(top.fsMod.recentIds['" . $parentModuleName . "'])";
}
if($subData['link'] && $this->linkModules) {
$onClickString = htmlspecialchars('top.goToModule(\''.$subData['name'].'\');'.$onBlur.'return false;');
$submoduleLink = '<a href="#" onclick="'.$onClickString.'" title="'.$subData['description'].'">'
//TODO make icon a background image using css
.'<span class="submodule-icon">'.$subData['icon']['html'].'</span>'
.'<span>'.htmlspecialchars($subData['title']).'</span>'
.'</a>';
}
$data['root'][$num]['sub'][] = array(
'name' => $subData['name'],
'description' => $subData['description'],
'label' => $subData['title'],
'icon' => $subData['icon']['filename'],
'navframe' => $subData['parentNavigationFrameScript'],
'link' => $subData['link'],
'originalLink' => $subData['originalLink'],
'index' => $index++,
'navigationFrameScript' => $subData['navFrameScript'],
'navigationFrameScriptParam' => $subData['navFrameScriptParam'],
);
}
}
}
}
if ($ajaxObj) {
echo json_encode($data);
// why doesn't work following ?
//$ajaxObj->addContent('modulemenu', $data);
//$ajaxObj->setContentFormat('json');
} else {
return $data;
}
}
/**
* returns the loaded modules
*
* @return array array of loaded modules
......
$GLOBALS['BE_USER']->writeUC();
}
/**
* renders the backend menu as unordered list
*
* @param boolean optional parameter used to switch wrapping the menu in ul tags off for AJAX calls
* @return string menu html code to use in the backend
*/
public function render($wrapInUl = true) {
$menu = '';
$onBlur = $GLOBALS['CLIENT']['FORMSTYLE'] ? 'this.blur();' : '';
$tsConfiguration = $GLOBALS['BE_USER']->getTSConfig('options.moduleMenuCollapsable');
$collapsable = (isset($tsConfiguration['value']) && $tsConfiguration['value'] == 0) ? 0 : 1;
$rawModuleData = $this->getRawModuleData();
foreach($rawModuleData as $moduleKey => $moduleData) {
if($moduleData['link'] != 'dummy.php' || ($moduleData['link'] == 'dummy.php' && is_array($moduleData['subitems'])) ) {
$menuState = $GLOBALS['BE_USER']->uc['moduleData']['menuState'][$moduleKey];
$moduleLabel = $moduleData['title'];
if($moduleData['link'] && $this->linkModules) {
$moduleLabel = '<a href="#" onclick="top.goToModule(\'' . $moduleData['name'] . '\');'.$onBlur . 'return false;">' . $moduleLabel . '</a>';
}
$menu .= '<li id="modmenu_' . $moduleData['name'] . '" '.
($collapsable ? 'class="menuSection"' : '') .
' title="' . $moduleData['description'] . '">
<div class="' . ($menuState ? 'collapsed' : 'expanded') . '">' .
$moduleData['icon']['html'] . ' ' . $moduleLabel . '</div>';
// traverse submodules
if (is_array($moduleData['subitems'])) {
$menu .= $this->renderSubModules($moduleData['subitems'], $menuState);
}
$menu .= '</li>' . LF;
}
}
return ($wrapInUl ? '<ul id="typo3-menu">' . LF.$menu.'</ul>' . LF : $menu);
}
/**
* renders the backend menu as unordered list as an AJAX response without
* the wrapping ul tags
......
}
/**
* renders submodules
*
* @param array array of (sub)module data
* @param boolean collapse state of menu item, defaults to false
* @return string (sub)module html code
*/
public function renderSubModules($modules, $menuState=false) {
$moduleMenu = '';
$onBlur = $GLOBALS['CLIENT']['FORMSTYLE'] ? 'this.blur();' : '';
foreach($modules as $moduleKey => $moduleData) {
// Setting additional JavaScript
$additionalJavascript = '';
if($moduleData['parentNavigationFrameScript']) {
$parentModuleName = substr($moduleData['name'], 0, strpos($moduleData['name'], '_'));
$additionalJavascript = "+'&id='+top.rawurlencodeAndRemoveSiteUrl(top.fsMod.recentIds['" . $parentModuleName . "'])";
}
if($moduleData['link'] && $this->linkModules) {
$onClickString = htmlspecialchars('top.goToModule(\''.$moduleData['name'].'\');'.$onBlur.'return false;');
$submoduleLink = '<a href="#" onclick="'.$onClickString.'" title="'.$moduleData['description'].'">'
//TODO make icon a background image using css
.'<span class="submodule-icon">'.$moduleData['icon']['html'].'</span>'
.'<span>'.htmlspecialchars($moduleData['title']).'</span>'
.'</a>';
}
$moduleMenu .= '<li id="modmenu_' . $moduleData['name'] . '">' . $submoduleLink . '</li>' . LF;
}
return '<ul'.($menuState ? ' style="display:none;"' : '').'>'.LF.$moduleMenu.'</ul>'.LF;
}
/**
* gets the raw module data
*
* @return array multi dimension array with module data
......
return $prefix;
}
/**
* generates javascript code to switch between modules
*
* @return string javascript code snippet to switch modules
*/
public function getGotoModuleJavascript() {
$moduleJavascriptCommands = array();
$rawModuleData = $this->getRawModuleData();
$navFrameScripts = array();
foreach($rawModuleData as $mainModuleKey => $mainModuleData) {
if ($mainModuleData['subitems']) {
foreach ($mainModuleData['subitems'] as $subModuleKey => $subModuleData) {
$parentModuleName = substr($subModuleData['name'], 0, strpos($subModuleData['name'], '_'));
$javascriptCommand = '';
// Setting additional JavaScript if frameset script:
$additionalJavascript = '';
if($subModuleData['parentNavigationFrameScript']) {
$additionalJavascript = "+'&id='+top.rawurlencodeAndRemoveSiteUrl(top.fsMod.recentIds['" . $parentModuleName . "'])";
}
if ($subModuleData['link'] && $this->linkModules) {
// For condensed mode, send &cMR parameter to frameset script.
if ($additionalJavascript && $GLOBALS['BE_USER']->uc['condensedMode']) {
$additionalJavascript .= "+(cMR ? '&cMR=1' : '')";
}
$javascriptCommand = '
modScriptURL = "'.$this->appendQuestionmarkToLink($subModuleData['link']).'"'.$additionalJavascript.';';
if ($subModuleData['navFrameScript']) {
$javascriptCommand .= '
top.currentSubScript="'.$subModuleData['originalLink'].'";';
}
if (!$GLOBALS['BE_USER']->uc['condensedMode'] && $subModuleData['parentNavigationFrameScript']) {
$additionalJavascript = "+'&id='+top.rawurlencodeAndRemoveSiteUrl(top.fsMod.recentIds['" . $parentModuleName . "'])";
$submoduleNavigationFrameScript = $subModuleData['navigationFrameScript'] ? $subModuleData['navigationFrameScript'] : $subModuleData['parentNavigationFrameScript'];
$submoduleNavigationFrameScript = t3lib_div::resolveBackPath($submoduleNavigationFrameScript);
// Add navigation script parameters if module requires them
if ($subModuleData['navigationFrameScriptParam']) {
$submoduleNavigationFrameScript = $this->appendQuestionmarkToLink($submoduleNavigationFrameScript) . $subModuleData['navigationFrameScriptParam'];
}
$navFrameScripts[$parentModuleName] = $submoduleNavigationFrameScript;
$javascriptCommand = '
top.currentSubScript = "'.$subModuleData['originalLink'].'";
if (top.content.list_frame && top.fsMod.currentMainLoaded == mainModName) {
modScriptURL = "'.$this->appendQuestionmarkToLink($subModuleData['originalLink']).'"'.$additionalJavascript.';
';
// Change link to navigation frame if submodule has it's own navigation
if ($submoduleNavigationFrameScript) {
$javascriptCommand .= 'navFrames["' . $parentModuleName . '"] = "'. $submoduleNavigationFrameScript . '";';
}
$javascriptCommand .= '
} else if (top.nextLoadModuleUrl) {
modScriptURL = "'.($subModuleData['prefix'] ? $this->appendQuestionmarkToLink($subModuleData['link']) . '&exScript=' : '') . 'listframe_loader.php";
} else {
modScriptURL = "'.$this->appendQuestionmarkToLink($subModuleData['link']).'"'.$additionalJavascript.' + additionalGetVariables;
}';
}
}
$moduleJavascriptCommands[] = "
case '".$subModuleData['name']."':".$javascriptCommand."
break;";
}
} elseif(!$mainModuleData['subitems'] && !empty($mainModuleData['link'])) {
// main module has no sub modules but instead is linked itself (doc module f.e.)
$javascriptCommand = '
modScriptURL = "'.$this->appendQuestionmarkToLink($mainModuleData['link']).'";';
$moduleJavascriptCommands[] = "
case '".$mainModuleData['name']."':".$javascriptCommand."
break;";
}
}
$javascriptCode = 'function(modName, cMR_flag, addGetVars) {
var useCondensedMode = '.($GLOBALS['BE_USER']->uc['condensedMode'] ? 'true' : 'false').';
var mainModName = (modName.slice(0, modName.indexOf("_")) || modName);
var additionalGetVariables = "";
if (addGetVars) {
additionalGetVariables = addGetVars;
}';
$javascriptCode .= '
var navFrames = {};';
foreach ($navFrameScripts as $mainMod => $frameScript) {
$javascriptCode .= '
navFrames["'.$mainMod.'"] = "'.$frameScript.'";';
}
$javascriptCode .= '
var cMR = (cMR_flag ? 1 : 0);
var modScriptURL = "";
switch(modName) {'
.LF.implode(LF, $moduleJavascriptCommands).LF.'
}
';
$javascriptCode .= '
if (!useCondensedMode && navFrames[mainModName]) {
if (top.content.list_frame && top.fsMod.currentMainLoaded == mainModName) {
top.content.list_frame.location = top.getModuleUrl(top.TS.PATH_typo3 + modScriptURL + additionalGetVariables);
if (top.currentSubNavScript != navFrames[mainModName]) {
top.currentSubNavScript = navFrames[mainModName];
top.content.nav_frame.location = top.getModuleUrl(top.TS.PATH_typo3 + navFrames[mainModName]);
}
} else {
TYPO3.Backend.loadModule(mainModName, modName, modScriptURL + additionalGetVariables);
}
} else if (modScriptURL) {
TYPO3.Backend.loadModule(mainModName, modName, top.getModuleUrl(modScriptURL + additionalGetVariables));
}
currentModuleLoaded = modName;
top.fsMod.currentMainLoaded = mainModName;
TYPO3ModuleMenu.highlightModule("modmenu_" + modName, (modName == mainModName ? 1 : 0));
}';
return $javascriptCode;
}
/**
* Appends a '?' if there is none in the string already
*
typo3/js/backend.js (working copy)
// clear information about which entry in nav. tree that might have been highlighted.
top.fsMod.navFrameHighlightedID = [];
if (top.content && top.content.nav_frame && top.content.nav_frame.refresh_nav) {
top.content.nav_frame.refresh_nav();
if (TYPO3.Backend.NavigationContainer.isVisible()) {
TYPO3.Backend.NavigationContainer.refresh();
}
top.nextLoadModuleUrl = url;
top.goToModule(modName);
ModuleMenu.App.showModule(modName);
}
/**
typo3/js/extjs/backendsizemanager.js (working copy)
height: (viewportHeight - topHeight - consoleHeight) + 'px'
};
Ext.get('typo3-side-menu').setStyle(styles);
Ext.get('content').setStyle(styles);
//TYPO3.Backend.ModuleMenuContainer.setSize(styles);
//TYPO3.Backend.ContentContainer.setSize(styles);
};
Ext.EventManager.onWindowResize(resizeBackend);
typo3/js/extjs/iframepanel.js (revision 0)
/***************************************************************
* Copyright notice
*
* (c) 2010 Steffen Kamper <steffen@typo3.org>
* 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.
* 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
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
* iFrame panel
*
* @author Steffen Kamper
*/
Ext.ns('TYPO3');
TYPO3.iframePanel = Ext.extend(Ext.Panel, {
name: 'iframe',
iframe: null,
src: Ext.isIE && Ext.isSecure ? Ext.SSL_SECURE_URL : 'about:blank',
maskMessage: 'loading ...',
doMask: true,
// component build
initComponent: function() {
this.bodyCfg = {
tag: 'iframe',
frameborder: '0',
src: this.src,
name: this.name
}
Ext.apply(this, {
});
TYPO3.iframePanel.superclass.initComponent.apply(this, arguments);
// apply the addListener patch for 'message:tagging'
this.addListener = this.on;
},
onRender : function() {
TYPO3.iframePanel.superclass.onRender.apply(this, arguments);
this.maskMessage = TYPO3.LLL.core.please_wait;
this.iframe = Ext.isIE ? this.body.dom.contentWindow : window.frames[this.name];
this.body.dom[Ext.isIE ? 'onreadystatechange' : 'onload'] = this.loadHandler.createDelegate(this);
},
loadHandler: function() {
this.src = this.body.dom.src;
if (this.doMask) {
this.el.unmask();
}
},
getIframe: function() {
return this.iframe;
},
getUrl: function(src) {
return this.body.dom.src;
},
setUrl: function(src) {
if (this.doMask) {
this.el.mask(this.maskMessage, 'x-mask-loading');
}
this.body.dom.src = src;
},
resetUrl: function() {
if (this.doMask) {
this.el.mask(this.maskMessage);
}
this.body.dom.src = this.src;
},
refresh: function() {
if (this.doMask) {
this.el.mask(this.maskMessage);
}
this.body.dom.src = this.body.dom.src;
}
});
Ext.reg('iframePanel', TYPO3.iframePanel);
typo3/js/extjs/viewport.js (working copy)
* @return void
*/
initComponent: function() {
// adjust the width of module menu and the height of the topbar
// adjust the module menu and the height of the topbar
this.initialConfig.items[0].height = TYPO3.configuration.topBarHeight;
this.initialConfig.items[1].width = TYPO3.configuration.moduleMenuWidth;
var moduleMenu = this.initialConfig.items[1];
moduleMenu.width = TYPO3.configuration.moduleMenuWidth;
if (!TYPO3.configuration.moduleMenuSplit) {
moduleMenu.split = false;
moduleMenu.collapsible = false;
moduleMenu.collapseMode = null
}
// call parent constructor
TYPO3.Viewport.superclass.initComponent.apply(this, arguments);
this.ContentContainer = Ext.ComponentMgr.get('typo3-contentContainer');
this.NavigationContainer = Ext.ComponentMgr.get('typo3-navigationContainer');
this.Topbar = Ext.ComponentMgr.get('typo3-topbar');
this.ModuleMenuContainer = Ext.ComponentMgr.get('typo3-module-menu');
this.DebugConsole = Ext.ComponentMgr.get('typo3-debug-console');
this.ContentContainer = Ext.getCmp('typo3-contentContainer');
this.NavigationContainer = Ext.getCmp('typo3-navigationContainer');
this.Topbar = Ext.getCmp('typo3-topbar');
this.ModuleMenuContainer = Ext.getCmp('typo3-module-menu');
this.DebugConsole = Ext.getCmp('typo3-debug-console');
},
/**
* Loads a module into the content container
*
......
widget.hide();
}
}
if (navigationWidgetActive) {
this.NavigationContainer.show();
} else {
......
if (contentScript.indexOf(top.TS.PATH_typo3) !== 0) {
contentScript = top.TS.PATH_typo3 + contentScript;
}
Ext.get('content').set({
src: contentScript
});
this.ContentContainer.setUrl(contentScript);
this.NavigationContainer.ownerCt.doLayout();
},
typo3/js/extjs/viewportConfiguration.js (working copy)
contentEl: 'typo3-top-container',
border: false
}, {
layout: 'absolute',
layout: 'fit',
region: 'west',
id: 'typo3-module-menu',
contentEl: 'typo3-side-menu',
width: 159,
anchor: '100% 100%',
border: false
collapsible: true,
collapseMode: 'mini',
floatable: true,
hideCollapseTool: true,
split: true,
border: false,
autoScroll: true
}, {
region: 'center',
layout: 'border',
border: false,
items: [{
region: 'west',
layout: 'absolute',
layout: 'fit',
id: 'typo3-navigationContainer',
width: 300,
minWidth: 20,
anchor: '100% 100%',
floatable: true,
split: true,
collapsible: true,
collapseMode: 'mini',
hideCollapseTool: true,
animCollapse: false,
split: true,
autoScroll: true,
hidden: true,
border: false
border: false,
xtype: 'iframePanel',
name: 'navigationframe'
}, {
region: 'center',
layout: 'absolute',
layout: 'fit',
id: 'typo3-contentContainer',
contentEl: 'typo3-content',
anchor: '100% 100%',
border: false
border: false,
xtype: 'iframePanel',
name: 'contentframe'
}]
}, {
region: 'south',
typo3/js/modulemenu.js (working copy)
/***************************************************************
* Copyright notice
*
* (c) 2007-2010 Ingo Renner <ingo@typo3.org>
* (c) 2010 Steffen Kamper <steffen@typo3.org>
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
......
/**
* observes clicks on menuHeader and toggles child ul
* Class to render the module menu and handle the BE navigation
*
* @author Ingo Renner
* @author Steffen Kamper
*/
var ModuleMenu = Class.create({
/**
* initially register event listeners
*/
initialize: function() {
// initialize event listeners
Event.observe(document, 'dom:loaded', function(){
this.registerEventListeners();
}.bind(this));
Ext.ns('ModuleMenu');
// initialize some variables
this.currentlyHighLightedMainModule = '';
this.currentlyHighlightedModuleId = '';
},
ModuleMenu.recentIds = [];
/**
* registers the event listeners, can be used to re-register them after refreshing the menu
*/
registerEventListeners: function() {
$$('#typo3-menu li.menuSection div').invoke('observe', 'click', this.toggleMenu);
if (Prototype.Browser.IE) {
//mouseenter and mouseleave are only available but thats our target
$$('#typo3-menu li.menuSection li').invoke('observe', 'mouseenter', this.toggleHoverClass);
$$('#typo3-menu li.menuSection li').invoke('observe', 'mouseleave', this.toggleHoverClass);
}
},
ModuleMenu.Store = new Ext.data.JsonStore({
storeId: 'ModuleMenuStore',
root: 'root',
fields: [
{name: 'index', type: 'int', mapping: 'sub.index'},
{name: 'key', type: 'string'},
{name: 'label', type: 'string'},
{name: 'menuState', type: 'int'},
{name: 'subitems', type: 'int'},
'sub'
],
url: 'ajax.php?ajaxID=ModuleMenu::getData',
baseParams: {
'action': 'getModules'
}
/**
* toggles the hover classname for IE menu hover support
*/
toggleHoverClass: function(event) {
var menuItem = Event.element(event);
menuItem.toggleClassName('hover');
},
});
/**
* toggles the associated submodule menu when clicking a main module header
*/
toggleMenu: function(event) {
var mainModuleHeader = Event.element(event);
var mainMenuId = mainModuleHeader.up().identify();
var subModulesMenu = mainModuleHeader.next('ul');
if (!subModulesMenu) {
return;
ModuleMenu.Template = new Ext.XTemplate(
'<div id="typo3-docheader">',
' <div id="typo3-docheader-row1">',
' <div class="buttonsleft"></div>',
' <div class="buttonsright"></div>',
' </div>',
'</div>',
'<ul id="typo3-menu">',
'<tpl for=".">',
' <li class="menuSection" id="{key}">',
' <div class="modgroup {[this.getStateClass(values)]}">{label}</div>',
' <ul {[this.getStateStyle(values)]}>',
' <tpl for="sub">',
' <li id="{name}" class="submodule mod-{name}">',
' <a title="{description}" href="#" class="modlink">',
' <span class="submodule-icon">',
' <img width="16" height="16" alt="{label}" title="{label}" src="{icon}" />',
' </span>',
' <span>{label}</span>',
' </a>',
' </li>',
' </tpl>',
' </ul>',
' </li>',
'</tpl>',
'</ul>',
{
getStateClass: function(value) {
return value.menuState ? 'collapsed' : 'expanded';
},
getStateStyle: function(value) {
return value.menuState ? 'style="display:none"' : '';
}
}
var state = subModulesMenu.visible();
);
// save state
var save = new Ajax.Request('ajax.php', {
parameters : 'ajaxID=ModuleMenu::saveMenuState&menuid=' + mainMenuId + '&state=' + state
ModuleMenu.App = {
loadedModule: null,
init: function() {
ModuleMenu.Store.load({
scope: this,
callback: function(records, options) {
this.renderMenu(records);
if (top.startInModule) {
this.showModule(top.startInModule[0],top.startInModule[1]);
}
}
});
},
renderMenu: function(records) {
TYPO3.Backend.ModuleMenuContainer.removeAll();
TYPO3.Backend.ModuleMenuContainer.add({
xtype: 'dataview',
animCollapse: true,
store: ModuleMenu.Store,
tpl: ModuleMenu.Template,
singleSelect: true,
itemSelector: 'li.submodule',
overClass: 'x-view-over',
selectedClass: 'highlighted',
autoHeight: true,
itemId: 'modDataView',
tbar: [{text: 'test'}],
listeners: {
click: function(view, index, node, event) {
var el = Ext.fly(node);
if (el.hasClass('submodule')) {
ModuleMenu.App.showModule(el.getAttribute('id'));
}
},
containerclick: function(view, event) {
var item = event.getTarget('li.menuSection', view.getEl());
if (item) {
var el = Ext.fly(item);
var id = el.getAttribute('id');
var section = el.first('div'), state;
if (section.hasClass('expanded')) {
state = true;
section.removeClass('expanded').addClass('collapsed');
el.first('ul').slideOut('t', {
easing: 'easeOut',
duration: .2,
remove: false,
useDisplay: true
});
if (state) {
Effect.BlindUp(subModulesMenu, {duration : 0.1});
$(mainModuleHeader).removeClassName('expanded');
$(mainModuleHeader).addClassName('collapsed');
} else {
state = false;
section.removeClass('collapsed').addClass('expanded');
el.first('ul').slideIn('t', {
easing: 'easeIn',
duration: .2,
remove: false,
useDisplay: true
});
}
// save menu state
Ext.Ajax.request({
url: 'ajax.php?ajaxID=ModuleMenu::saveMenuState',
params: {
'menuid': 'modmenu_' + id,
'state': state
}
});
}
},
scope: this
}
});
TYPO3.Backend.ModuleMenuContainer.doLayout();
},
getRecordFromIndex: function(index) {
var i, record;
for (i = 0; i < ModuleMenu.Store.getCount(); i++) {
record = ModuleMenu.Store.getAt(i);
if (index < record.data.subitems) {
return record.data.sub[index];
}
index -= record.data.subitems;
}
},
getRecordFromName: function(name) {
var i, j, record;
for (i = 0; i < ModuleMenu.Store.getCount(); i++) {
record = ModuleMenu.Store.getAt(i);
for (j = 0; j < record.data.subitems; j++) {
if (record.data.sub[j].name === name) {
return record.data.sub[j];
}
}
}
},
showModule: function(mod, params) {
params = params || '';
this.selecteModule = mod;
var record = this.getRecordFromName(mod);
if (record) {
//get id
var section = mod.split('_')[0];
if (top.fsMod.recentIds[section]) {
params = 'id=' + top.fsMod.recentIds[section] + params;
}
if (record.navframe) {
this.openInNavFrame(record.navframe);
} else {
TYPO3.Backend.NavigationContainer.hide();
}
this.openInContentFrame(record.originalLink, params);
this.loadedModule = mod;
this.highlightModuleMenuItem(mod);
// compatibility
top.currentSubScript = record.originalLink;
top.currentModuleLoaded = mod;
TYPO3.Backend.doLayout();
} else {
Effect.BlindDown(subModulesMenu, {duration : 0.1});
$(mainModuleHeader).removeClassName('collapsed');
$(mainModuleHeader).addClassName('expanded');
console.log(mod + ' was not found in modules');
}
},
/**
* refreshes the complete module menu
*/
openInNavFrame: function(url, params) {
var navUrl = url + (params ? (url.indexOf('?') !== -1 ? '&' : '?') + params : '');
var currentUrl = this.relativeUrl(TYPO3.Backend.NavigationContainer.getUrl());
if (currentUrl !== navUrl) {
TYPO3.Backend.NavigationContainer.setUrl(navUrl);
}
TYPO3.Backend.NavigationContainer.show();
},
openInContentFrame: function(url, params) {
if (top.nextLoadModuleUrl) {
TYPO3.Backend.ContentContainer.setUrl(top.nextLoadModuleUrl);
top.nextLoadModuleUrl = '';
} else {
TYPO3.Backend.ContentContainer.setUrl(url + (params ? (url.indexOf('?') !== -1 ? '&' : '?') + params : ''));
}
},
highlightModuleMenuItem: function(module, mainModule) {
TYPO3.Backend.ModuleMenuContainer.getComponent('modDataView').select(module, false, false);
},
relativeUrl: function(url) {
return url.replace(TYPO3.configuration.siteUrl + 'typo3/', '');
},
refreshMenu: function() {
var refresh = new Ajax.Updater('typo3-menu', TS.PATH_typo3 + 'ajax.php', {
parameters : 'ajaxID=ModuleMenu::render',
asynchronous : false,
evalScripts : true
ModuleMenu.Store.load({
scope: this,
callback: function(records, options) {
this.renderMenu(records);
if (this.loadedModule) {
this.highlightModuleMenuItem(this.loadedModule);
}
}
});
this.registerEventListeners();
this.highlightModule(this.currentlyHighlightedModuleId, this.currentlyHighLightedMainModule);
},
reloadFrames: function() {
TYPO3.Backend.NavigationContainer.refresh();
TYPO3.Backend.ContentContainer.refresh();
}
/**
* de-highlights the old menu item and highlights the new one
*
* @param string css module id to highlight
*/
highlightModule: function(moduleId, mainModule) {
// reset the currently highlighted module
$$('#typo3-menu .highlighted').invoke('removeClassName', 'highlighted');
};
// highlight the new one
if ($(moduleId)) {
$(moduleId).addClassName('highlighted');
}
if (undefined !== mainModule) {
this.currentlyHighLightedMainModule = mainModule;
}
this.currentlyHighlightedModuleId = moduleId;
// kept for backwards compatibility
// @TODO: remove in TYPO3 4.5
// @deprecated since TYPO3 4.3, remove in 4.5
top.currentlyHighLightedId = moduleId;
top.currentlyHighLightedMain = mainModule;
Ext.onReady(function() {
ModuleMenu.App.init();
// keep backward compatibility
top.list_frame = TYPO3.Backend.ContentContainer.getIframe();
top.TYPO3ModuleMenu = ModuleMenu.App;
top.content = {
nav_frame: TYPO3.Backend.NavigationContainer.getIframe(),
list_frame: TYPO3.Backend.ContentContainer.getIframe()
}
});
var TYPO3ModuleMenu = new ModuleMenu();
/*******************************************************************************
*
* Backwards compatability handling down here
*
******************************************************************************/
*
* Backwards compatability handling down here
*
******************************************************************************/
/**
* Highlight module:
*/
* Highlight module:
*/
var currentlyHighLightedId = '';
var currentlyHighLighted_restoreValue = '';
var currentlyHighLightedMain = '';
function highlightModuleMenuItem(trId, mainModule) {
TYPO3ModuleMenu.highlightModule(trId, mainModule);
ModuleMenu.App.highlightModule(trId, mainModule);
}
typo3/js/workspacemenu.js (working copy)
// when in web module reload, otherwise send the user to the web module
if (currentModuleLoaded.startsWith('web_')) {
// the boolean "true" makes the page reload from the server
$('content').contentWindow.location.reload(true);
top.ModuleMenu.App.reloadFrames();
} else {
if (TYPO3.configuration.pageModule) {
top.goToModule(TYPO3.configuration.pageModule);
top.ModuleMenu.App.showModule(TYPO3.configuration.pageModule);
}
}
typo3/sysext/t3skin/extjs/xtheme-t3skin.css (working copy)
*/
.ext-el-mask {
background-color: #000;
background-color: #aaa;
-moz-opacity: 0.75;
opacity: .75;
filter: alpha(opacity=75);
......
/* Pagetree */
.x-layout-split {
background-color: #aeb6c1;
background-color: #dadada;
}
#widget-navigation-tree .x-panel-noborder .x-panel-body-noborder {
typo3/sysext/t3skin/stylesheets/visual/module_menu.css (working copy)
#typo3-module-menu .x-panel-body {
background-color: transparent;
overflow-x: hidden !important; /*temporary fix of horizontal scrollbar */
}
#typo3-side-menu {
(1-1/2)