Files
luos/workflow/engine/templates/cases/main.js

735 lines
22 KiB
JavaScript
Raw Normal View History

var PANEL_EAST_OPEN = false,
centerPanel,
setFlag,
flagRefresh = true,
debugVarTpl = new Ext.Template('<span style="font-size:11">{value}</span>'),
detailsText = '<i></i>',
debugTriggersDetailTpl = new Ext.Template('<pre style="font-size:10px"><code>{code}</code></pre>'),
propStore,
triggerStore,
result,
_action = '',
//@var treeMenuItemsLoaded -> added to flag the "treeMenuItems" tree, to ensure that its onload event is executed just once
treeMenuItemsLoaded = false,
loader,
_BROWSER;
debugVarTpl.compile();
debugTriggersDetailTpl.compile();
setFlag = function (val) {
flagRefresh = val;
};
2020-08-19 20:38:49 +00:00
Ext.BLANK_IMAGE_URL = "data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
2010-12-02 23:34:41 +00:00
Ext.onReady(function(){
new Ext.KeyMap(document, {
key: Ext.EventObject.F5,
fn: function(keycode, e) {
if (! e.ctrlKey) {
if (Ext.isIE) {
e.browserEvent.keyCode = 8;
}
e.stopEvent();
updateCasesTree();
2020-01-30 16:26:32 -04:00
highlightCasesTree();
}
else
2013-03-14 15:15:04 -04:00
Ext.Msg.alert(_('ID_REFRESH_LABEL'),_('ID_REFRESH_MESSAGE'));
}
});
2010-12-02 23:34:41 +00:00
Ext.QuickTips.init();
2010-12-02 23:34:41 +00:00
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
var resetGrid = function() {
2010-12-02 23:34:41 +00:00
propStore.load();
};
var resetTriggers = function(){
triggerStore.load();
};
2010-12-02 23:34:41 +00:00
var debugVariablesFilterDynaform = function(){
propStore.load({params:{filter:'dyn'}});
};
2010-12-02 23:34:41 +00:00
var debugVariablesFilterSystem = function(){
propStore.load({params:{filter:'sys'}});
};
//center iframe panel
2010-12-02 23:34:41 +00:00
centerPanel = {
region : 'center',
xtype : 'iframepanel',
frameConfig:{
name : 'casesSubFrame',
id : 'casesSubFrame'
},
deferredRender: false
};
2010-12-02 23:34:41 +00:00
/**
* Menu Panel
*/
var treeMenuItems = new Ext.tree.TreePanel({
xtype: 'treepanel',
height: 350,
id: 'tree-panel',
region: 'center',
margins: '0 0 0 0',
useArrows : true,
2010-12-02 23:34:41 +00:00
animate:true,
autoScroll: true,
rootVisible: false,
clearOnReLoad: false,
root: new Ext.tree.AsyncTreeNode(),
useArrows: true,
2010-12-02 23:34:41 +00:00
// Our custom TreeLoader:
loader: new Ext.app.menuLoader({
dataUrl:'casesMenuLoader',
clearOnLoad: false
}),
listeners: {
'click': function(tp) {
2010-12-02 23:34:41 +00:00
if( tp.attributes.url ){
document.getElementById('casesSubFrame').src = tp.attributes.url;
}
},
'render': function(tp){}
2010-12-02 23:34:41 +00:00
}
});
/**
* Gets the user client browser and its version
* @return (object)
*/
function getBrowserClient() {
var browsers = ["opera", "msie", "firefox", "opera", "safari", "trident"],
infoBrowser = navigator.userAgent.toLowerCase(),
versionBrowser,
currentBrowser = "";
for (var i = 0; i < browsers.length; i++) {
if ((currentBrowser === "") && (infoBrowser.indexOf(browsers[i]) !== -1)) {
currentBrowser = browsers[i];
versionBrowser = String(parseFloat(infoBrowser.substr(infoBrowser.indexOf(browsers[i]) + browsers[i].length + 1)));
return {name: currentBrowser, browser: currentBrowser, version: versionBrowser}
}
}
return false;
}
_BROWSER = getBrowserClient();
loader = treeMenuItems.getLoader();
loader.on("load", function () {
var treePanel1,
node;
// it was added since the feature to reload a specific node of tree is now working
if (!treeMenuItemsLoaded) { // this section of code should be executed once
if ((_BROWSER.name === "msie" || _BROWSER.name === "trident") && openCaseIE) {
parent.window.location.href = defaultOption;
} else {
document.getElementById('casesSubFrame').src = defaultOption;
// check if a case was open directly
if (defaultOption.indexOf('open') > -1) {
//if it is, then update cases trees
updateCasesTree();
2020-01-30 16:26:32 -04:00
highlightCasesTree();
}
if (_nodeId !== '') {
treePanel1 = Ext.getCmp('tree-panel');
if (treePanel1) {
node = treePanel1.getNodeById(_nodeId);
}
if (node) {
node.select();
if (_nodeId === 'CASES_START_CASE') {
updateCasesTree();
2020-01-30 16:26:32 -04:00
highlightCasesTree();
}
}
}
}
treeMenuItemsLoaded = true;
}
});
2010-12-02 23:34:41 +00:00
// set the root node
var root = new Ext.tree.AsyncTreeNode({
text: 'Ext JS',
draggable:false, // disable root node dragging
id:'src',
loaded:false,
expanded:true
});
2010-12-02 23:34:41 +00:00
mainMenu = new Ext.Panel({
id:'menuTreePanel',
title: '',
region: regionTreePanel,
2010-12-02 23:34:41 +00:00
layout: 'border',
width: 200,
height: 500,
minSize: 175,
maxSize: 400,
split: true,
collapsible: true,
collapseMode: 'mini',
margins: '0 0 0 2',
2010-12-02 23:34:41 +00:00
items: [
treeMenuItems
2010-12-02 23:34:41 +00:00
]
});
2020-01-30 16:26:32 -04:00
mainMenu.setTitle("<div style=\"height: 18px;\"><a href=\"javascript:;\"><img id=\"refreshNotifiers\" " +
"src=\"/images/refresh.gif\" onclick=\"updateCasesTree(); highlightCasesTree(); updateCasesView();\" /></a></div>");
2010-12-02 23:34:41 +00:00
propStore = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({url: 'debug_vars'}),
reader: new Ext.data.DynamicJsonReader({root: 'data'})
});
propStore.on('load', function(){
propStore.fields = propStore.recordType.prototype.fields;
debugVariables.setSource(propStore.getAt(0).data);
});
/**
* Triggers Panel
*/
var debugVariables = new Ext.grid.PropertyGrid({
id: 'debugVariables',
title:TRANSLATIONS.ID_VARIABLES,
autoHeight: false,
height: 300,
width: 400,
region: 'center',
margins: '2 2 0 2',
border: true,
stripeRows: true,
listeners: {
beforeedit: function(event) { //Cancel editing - read only
event.cancel = true;
}
},
tbar: [
{text: TRANSLATIONS.ID_ALL, handler: resetGrid},
{text: TRANSLATIONS.ID_DYNAFORM, handler: debugVariablesFilterDynaform},
{text: TRANSLATIONS.ID_SYSTEM, handler: debugVariablesFilterSystem}
],
sm: new Ext.grid.RowSelectionModel({singleSelect: true}),
viewConfig: {
forceFit: true
}
});
//set debug variable details
debugVariables.getSelectionModel().on('rowselect', function(sm, rowIdx, r) {
var detailPanel = Ext.getCmp('debug-details-panel'),
d = {};
d.name = r.data.name;
d.value = parent.parent.htmlentities ? parent.parent.htmlentities(r.data.value) : r.data.value;
debugVarTpl.overwrite(detailPanel.body, d);
detailPanel.setTitle(r.data.name);
if(r.data.value === '<object>' || r.data.value === '<array>' ){
Ext.getCmp('deatachAction').setDisabled(false);
Ext.Ajax.request({
url: 'debug_vars?r='+Math.random(),
success: function(response){
try{
result = eval('('+response.responseText+')');
var store1a = new Ext.data.ArrayStore({fields: result.headers});
// manually load local data
store1a.loadData(result.rows);
var myGridPanel = new Ext.grid.GridPanel({
store: store1a,
height: 200,
border : false,
columns: result.columns,
stripeRows : true,
layout: 'fit',
viewConfig:{forceFit:true, scrollOffset:0},
listeners: {
rowdblclick: function(grid, n,e){
},
render: function(){
this.loadMask = new Ext.LoadMask(this.body, { msg:_('ID_LOADING_GRID') });
}
}
});
Ext.each(detailPanel.items.items, function(childPanel) {
detailPanel.remove(childPanel, true);
});
detailPanel.add(myGridPanel);
detailPanel.doLayout();
} catch (e){
}
},
failure: function(){},
params: {request: 'getRows', fieldname:r.data.name}
});
} else
Ext.getCmp('deatachAction').setDisabled(true);
});
2010-12-02 23:34:41 +00:00
/**
* Triggers Panel
*/
var xg = Ext.grid;
2010-12-02 23:34:41 +00:00
var reader = new Ext.data.JsonReader(
{
root: 'data',
totalProperty: 'total',
id: 'name'
},
2010-12-02 23:34:41 +00:00
[
{name: 'name'},
{name: 'execution_time'},
{name: 'code'},
{name: "script_execution_time"}
2010-12-02 23:34:41 +00:00
]
);
triggerStore = new Ext.data.GroupingStore({
reader: reader,
groupField:'execution_time',
groupDir: 'DESC',
proxy: new Ext.data.HttpProxy({url: 'debug_triggers?r='+Math.random()})
2010-12-02 23:34:41 +00:00
});
var debugTriggers = new xg.GridPanel({
id: 'debugTriggers',
2010-12-02 23:34:41 +00:00
store: triggerStore,
columns: [
2014-01-29 10:57:57 -04:00
{id:'name',header: _('ID_NAME'), width: 60, sortable: true, dataIndex: 'name'},
{header: _('ID_EXECUTION'), width: 30, sortable: true, dataIndex: 'execution_time'},
{header: "Code", width: 30, sortable: false, dataIndex: 'code', hidden: true},
{header: _("ID_EXECUTION_TIME") + " (" + _("ID_MILLISECONDS") + ")", dataIndex: "script_execution_time", width: 60, sortable: true, hidden: true}
2010-12-02 23:34:41 +00:00
],
view: new Ext.grid.GroupingView({
forceFit:true,
groupTextTpl: '{text} ({[values.rs.length]} {[ values.rs[0].data.execution_time=="error" || values.rs[0].data.execution_time=="Fatal error"? "<font color=red>"+values.rs[0].data.execution_time+"</font>": values.rs.length > 1 ? "Triggers" : "Trigger"]})'
}),
width: 700,
height: 450,
title: TRANSLATIONS.ID_TRIGGERS,
sm: new Ext.grid.RowSelectionModel({singleSelect: true}),
viewConfig: {
forceFit: true
},
listeners: {
rowdblclick: function(grid, n,e) {
2010-12-02 23:34:41 +00:00
triggerWindow();
}
}
});
2010-12-02 23:34:41 +00:00
debugTriggers.getSelectionModel().on('rowselect', function(sm, rowIdx, r) {
2011-02-24 21:55:00 +00:00
Ext.getCmp('deatachAction').setDisabled(false);
2010-12-02 23:34:41 +00:00
var detailPanel = Ext.getCmp('debug-details-panel');
debugTriggersDetailTpl.overwrite(detailPanel.body, r.data);
detailPanel.setTitle(r.data.name);
2010-12-02 23:34:41 +00:00
});
2010-12-02 23:34:41 +00:00
function triggerWindow() {
var r = debugTriggers.getSelectionModel().getSelected();
if(r) {
var w = new Ext.Window({
title: r.data.name,
width: 500,
height: 400,
modal: true,
autoScroll: true,
maximizable: true,
items: [],
listeners:{
show: function() {
this.loadMask = new Ext.LoadMask(this.body, { msg:_('ID_LOADING') });
}
}
});
w.show();
debugTriggersDetailTpl.overwrite(w.body, r.data);
2010-12-02 23:34:41 +00:00
}
}
2010-12-02 23:34:41 +00:00
debugPanel = new Ext.Panel({
id:'debugPanel',
2011-02-24 21:55:00 +00:00
title: _('ID_DEBUG_PANEL_TITLE'),
region: regionDebug,
2010-12-02 23:34:41 +00:00
layout: 'border',
width: 300,
height: 500,
minSize: 175,
maxSize: 400,
split: true,
collapsible: true,
collapseMode: 'mini',
margins: '0 0 0 5',
items: [
new Ext.TabPanel({
2011-02-24 14:39:11 +00:00
id: 'debugPanelTabs',
2010-12-02 23:34:41 +00:00
border: true, // already wrapped so don't add another border
activeTab: 0, // second tab initially active
tabPosition: 'top',
2011-02-24 14:39:11 +00:00
region:'center',
2010-12-02 23:34:41 +00:00
split: true,
items: [
debugVariables,
debugTriggers
],
2011-02-24 21:55:00 +00:00
listeners: {
beforetabchange: function(){
Ext.getCmp('deatachAction').setDisabled(true);
Ext.getCmp('debug-details-panel').html = '';
},
tabchange: function (tabpanel, tab) {
clearItemSelected(tab.id);
}
2011-02-24 21:55:00 +00:00
}
2010-12-02 23:34:41 +00:00
}),
{
2011-02-24 14:39:11 +00:00
region: 'south',
2010-12-02 23:34:41 +00:00
layout: 'fit',
2011-02-24 14:39:11 +00:00
title: '&nbsp;',
2010-12-02 23:34:41 +00:00
id: 'debug-details-panel',
autoScroll: true,
collapsible: false,
split: true,
margins: '0 2 2 2',
cmargins: '2 2 2 2',
2011-02-24 14:39:11 +00:00
height: 50,
2010-12-02 23:34:41 +00:00
html: detailsText,
tbar:[
2011-02-24 14:39:11 +00:00
'->',
{
id: 'deatachAction',
2011-02-24 21:55:00 +00:00
disabled: true,
2011-02-24 14:39:11 +00:00
text: _('ID_OPEN_IN_A_NEW_WINDOW'),
iconCls: 'button_menu_ext ss_sprite ss_application_form',
2011-02-24 14:39:11 +00:00
handler: function(){
if( Ext.getCmp('debugPanelTabs').getActiveTab().id === 'debugVariables' ){
var i,
store1a = new Ext.data.ArrayStore({fields: result.headers});
2011-02-24 14:39:11 +00:00
store1a.loadData(result.rows);
for(i = 0; i < result.columns.length; i += 1){
2011-02-24 14:39:11 +00:00
result.columns[i].editor = new Ext.form.TextField({allowBlank: true, readOnly:true})
}
var myGridPanel = new Ext.grid.EditorGridPanel({
region:'center',
store: store1a,
autoHeight: true,
autoWidth: true,
border : false,
columns: result.columns,
stripeRows : true,
layout: 'fit',
viewConfig:{forceFit:true, scrollOffset:0},
clicksToEdit: 1
});
var w = new Ext.Window({
title: '',
width: 600,
height: 250,
layout:'fit',
autoScroll:true,
modal: true,
maximizable: true,
items: [myGridPanel]
});
w.show();
} else {
triggerWindow();
}
}
}
2010-12-02 23:34:41 +00:00
]
}]
2010-12-02 23:34:41 +00:00
});
function restartPanelDetail () {
var detailPanel = Ext.getCmp('debug-details-panel'),
domDetailPanel;
if (detailPanel && detailPanel.body) {
domDetailPanel = detailPanel.body.dom;
detailPanel.setTitle("");
domDetailPanel.innerHTML = "";
}
}
function clearItemSelected (id) {
var debugVar = Ext.getCmp("debugVariables"),
debugTri = Ext.getCmp("debugTriggers");
switch (id) {
case "debugTriggers":
if (debugVar && debugVar.getSelectionModel().getSelected()) {
debugVar.getSelectionModel().clearSelections();
restartPanelDetail();
}
break;
case "debugVariables":
if (debugTri && debugTri.getSelectionModel().getSelected()) {
debugTri.getSelectionModel().clearSelections();
restartPanelDetail();
}
break;
}
}
2010-12-02 23:34:41 +00:00
var viewport = new Ext.Viewport({
layout: 'border',
items: [ mainMenu, centerPanel, debugPanel]
});
/** after panel creation routines */
2010-12-02 23:34:41 +00:00
var menuPanelC = Ext.getCmp('debugPanel');
2010-12-02 23:34:41 +00:00
/**hide*/
menuPanelC.hide();
menuPanelC.ownerCt.doLayout();
// Get the counters the first time
updateCasesTree();
2020-01-30 16:26:32 -04:00
highlightCasesTree();
// FORMATS.casesListRefreshTime is in seconds
setInterval("timer()", parseInt(FORMATS.casesListRefreshTime) * 1000);
2020-01-30 16:26:32 -04:00
// If the feature for highlight the home folders is enabled, add timer for highlight the tree options
if (typeof highlightUrlProxy !== "undefined") {
setInterval("highlightCasesTree()", (parseInt(highlightRefreshTime) * 60) * 1000);
}
2010-12-02 23:34:41 +00:00
});
2013-02-05 15:20:22 -04:00
function updateCasesView(viewList) {
var refreshList = viewList || false;
2010-12-02 23:34:41 +00:00
try{
if (document.getElementById('casesSubFrame').contentWindow.storeCases) {
2013-02-05 15:20:22 -04:00
if (refreshList) {
2013-02-05 15:00:07 -04:00
document.getElementById('casesSubFrame').contentWindow.storeCases.reload();
} else {
switch (document.getElementById('casesSubFrame').contentWindow.storeCases.baseParams.action) {
case "todo":
case "unassigned":
case "paused":
case "to_revise":
case "to_reassign":
document.getElementById('casesSubFrame').contentWindow.storeCases.reload();
break;
default:
break;
}
}
2010-12-02 23:34:41 +00:00
}
} catch(e){}
2010-12-02 23:34:41 +00:00
}
function updateCasesTree() {
document.getElementById('refreshNotifiers').src = '/images/ext/default/grid/loading.gif';
2011-02-22 23:02:23 +00:00
Ext.Ajax.request({
url: urlProxy + Math.random(),
success: function (response) {
2011-02-22 23:02:23 +00:00
result = Ext.util.JSON.decode(response.responseText);
for (i = 0; i < result.length; i++) {
if (document.getElementById('NOTIFIER_' + result[i].item)) {
oldValue = document.getElementById('NOTIFIER_' + result[i].item).innerHTML;
2011-02-22 23:02:23 +00:00
oldValue = oldValue.replace('<b>', '');
oldValue = oldValue.replace('</b>', '');
newValue = result[i].count;
if (oldValue != newValue && oldValue != 0) {
document.getElementById('NOTIFIER_' + result[i].item).innerHTML = '<b>' + result[i].count + '</b>';
2011-02-22 23:02:23 +00:00
} else {
document.getElementById('NOTIFIER_' + result[i].item).innerHTML = result[i].count;
2011-02-22 23:02:23 +00:00
}
}
else continue;
}
document.getElementById('refreshNotifiers').src = '/images/refresh.gif';
2011-02-22 23:02:23 +00:00
},
failure: function () {
},
2011-02-22 23:02:23 +00:00
params: {'updateCasesTree': true}
});
2010-12-02 23:34:41 +00:00
}
2020-01-30 16:26:32 -04:00
/**
* Function to highlight the tree options
*/
function highlightCasesTree() {
if (typeof highlightUrlProxy !== "undefined") {
document.getElementById('refreshNotifiers').src = '/images/ext/default/grid/loading.gif';
Ext.Ajax.request({
url: highlightUrlProxy + Math.random(),
success: function (response) {
var result = Ext.util.JSON.decode(response.responseText);
var treePanelObject = Ext.getCmp('tree-panel');
for (var i = 0; i < result.length; i++) {
var nodeObject = treePanelObject.getNodeById(result[i].item);
// Set the style for the option
if (result[i].highlight) {
nodeObject.setCls('row_updated');
} else {
nodeObject.setCls('');
}
}
document.getElementById('refreshNotifiers').src = '/images/refresh.gif';
},
failure: function () {
// Nothing to do for now...
}
});
}
}
function timer() {
2015-04-30 15:04:02 -04:00
if (flagRefresh) {
updateCasesTree();
updateCasesView();
}
2010-12-02 23:34:41 +00:00
}
Ext.data.DynamicJsonReader = function(config){
Ext.data.DynamicJsonReader.superclass.constructor.call(this, config, []);
};
Ext.extend(Ext.data.DynamicJsonReader, Ext.data.JsonReader, {
getRecordType : function(data) {
var i = 0, arr = [];
for (var name in data[0]) {
arr[i++] = name;
} // is there a built-in to do this?
this.recordType = Ext.data.Record.create(arr);
return this.recordType;
},
readRecords : function(o){ // this is just the same as base class, with call to getRecordType injected
this.jsonData = o;
var s = this.meta;
var sid = s.id;
var totalRecords = 0;
if(s.totalProperty){
var v = parseInt(eval("o." + s.totalProperty), 10);
if(!isNaN(v)){
totalRecords = v;
}
}
var root = s.root ? eval("o." + s.root) : o;
var recordType = this.getRecordType(root);
var fields = recordType.prototype.fields;
var records = [];
2010-12-02 23:34:41 +00:00
for(var i = 0; i < root.length; i++){
var n = root[i];
var values = {};
var id = (n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
for(var j = 0, jlen = fields.length; j < jlen; j++){
var f = fields.items[j];
var map = f.mapping || f.name;
var v = n[map] !== undefined ? n[map] : f.defaultValue;
v = f.convert(v);
values[f.name] = v;
}
var record = new recordType(values, id);
record.json = n;
records[records.length] = record;
}
return {
records : records,
totalRecords : totalRecords || records.length
};
}
});
Ext.app.menuLoader = Ext.extend(Ext.ux.tree.XmlTreeLoader, {
processAttributes : function(attr){
//console.log(attr);
2010-12-02 23:34:41 +00:00
if(attr.blockNestedTree){
//console.log(attr);
attr.text = attr.blockTitle;
attr.iconCls = 'ICON_' + attr.id;
attr.loaded = false;
attr.expanded = false;
attr.xtype = 'treepanel';
attr.rootVisible = true;
attr.singleClickExpand=true;
attr.animate = true;
attr.nodeType = 'async';
attr.clearOnReLoad= false;
attr.loader = new Ext.tree.TreeLoader({
dataUrl : attr.blockNestedTree,
baseParams : {
action : 'expandNode',
folderID: attr.folderId
}
});
attr.style= {
// width: '50%',
height: '50px',
// marginBottom: '10px',
overflow:'auto'
};
}
else if(attr.blockHeaderNoChild){
//console.info(attr);
attr.text = attr.blockTitle;
attr.iconCls = 'ICON_' + attr.id;
attr.loaded = true;
attr.expanded = false;
//attr.disabled=true;
attr.expandable=true;
attr.qtip=attr.blockTitle;
}else if(attr.blockTitle){
2010-12-02 23:34:41 +00:00
attr.text = attr.blockTitle;
attr.iconCls = 'ICON_' + attr.id;
attr.loaded = true;
//if((attr.url)&&(attr.url!="")){
// attr.expanded = false;
2010-12-02 23:34:41 +00:00
//}else{
attr.expanded = true;
2010-12-02 23:34:41 +00:00
//}
}else if(attr.title){
attr.text = Ext.util.Format.htmlDecode(attr.title);
2010-12-02 23:34:41 +00:00
if( attr.cases_count )
attr.text += ' (<label id="NOTIFIER_'+attr.id+'">' + attr.cases_count + '</label>)';
2010-12-02 23:34:41 +00:00
attr.iconCls = 'ICON_' + attr.id;
attr.loaded = true;
FEATURE, was added a feature to enable load three level nodes on cases tree menu on HOME tab Now we can set from any menu file (core or plugin) a three level nodes on cases menu: Example: $G_TMP_MENU->AddIdRawOption('TEST1', '#', 'Enterprise Search', '', '', 'blockHeader'); $G_TMP_MENU->AddIdRawOption('TEST2', '#', 'New Seach', '', ''); $G_TMP_MENU->AddIdRawOption('TEST3', '#', 'Saved Searches (9)', '', ''); $G_TMP_MENU->AddIdRawOption('TEST4', '#', 'Favorites', '', '', 'rootNode'); $G_TMP_MENU->AddIdRawOption('TEST5', '#', 'test child 2.1', '', '', 'childNode'); $G_TMP_MENU->AddIdRawOption('TEST6', '#', 'test child 2.2', '', '', 'childNode'); $G_TMP_MENU->AddIdRawOption('TEST7', '#', 'test child 2.3', '', '', 'childNode'); $G_TMP_MENU->AddIdRawOption('TEST8', '#', 'test child 3', '', '', ''); $G_TMP_MENU->AddIdRawOption('TEST9', '#', 'test child 4', '', '', ''); On the last parameter was added two new menu types "rootNode" and "childNode" On the example the first node will be set by "blockHeader" menu type all menu options below that will be added such as its child nodes Now, if a menu option has a type "rootNode" (...'Favorites', '', '', 'rootNode'...) all menu options below this with type "childNode" (...'test child 2.2', '', '', 'childNode'...) will be consireded as its child nodes of menu with type "rootNode", inmediatly a menu option without any menu type is found (..'test child 3', '', '', ''..), this menu and all menu options like it will be added as child nodes of the last menu option with "blockHeader". The result of the example will be something like this: + Enterprise Search - New search - Saved Searches (9) + Favorites - test child 2.1 - test child 2.2 - test child 2.3 - test child 3 - test child 4 ...
2013-08-01 19:06:05 -04:00
attr.expanded = attr.expanded ? true : false;
2010-12-02 23:34:41 +00:00
} else if(attr.PRO_UID){
attr.loaded = true;
attr.leaf = true;
}
}
});
2011-02-04 15:00:20 +00:00
var notify = function(title, msg){
PMExt.notify(title, msg);
};