PDA

View Full Version : TreeGrid (Ext.ux.maximgb.tg) - a tree grid component based on Ext's native grid.



MaximGB
1 Aug 2009, 10:39 AM
Hi.

I've ported my tree grid extension to ExtJS 3.x, the tree grid is based on the Ext.grid.GridPanel and Ext.data.Store, so the most grid/store options are in place. I've also added per node paging and some UI enhancements. Any feedback and/or bug reports are highly appreciated.

Description, demo and download page is here at
http://max-bazhenov.com/dev/ux.maximgb.tg/index.html

Changes from ExtJS 2.x version

No more breadcrumbs header, thought it might be added later as optional component.
Ext.ux.maximgb.tg.EditorGridPanel class added, so TreeGrid gained the cell editing feature as well.

steffenk
2 Aug 2009, 3:02 AM
Hi Maxim,

great plugin!

One thing looks odd to me, but maybe it's a general problem having row estender: when row is expanded and not selected, the hovering looks wrong. It takes row and part of the extender.

sfs
12 Aug 2009, 1:57 AM
Hi Maxim

Can the treegrid do dynamic loading e.g. using ext.Direct?

I have big grid and I'm not to happy about the paging solution. Primarily because sorting only affects whatever page your on.

Thanks in advance.

Izhaki
13 Aug 2009, 4:53 PM
Tips for new users


Hi,

Having spent the last few days trying to get a hang of TreeGrid, I feel I should share some of what I've learnt for the benefit of new users who might come across this thread.

I have found this parts of this thread being slightly outdated (posts from 2 years ago), and TreeGrid in general could use better documentation. Hopefully this will help others:

Adjacency List vs. Nested Set Models

TreeGrid offers two types of stores:
Adjacency List (AdjacencyListStore)
Nested Set (NestedSetStore)These models are, in principal, two SQL related strategies to represent hierarchy in databases.

TreeGrid ships with two corresponding examples (examples/server_al & examples/server_ns), although no use of SQL is demonstrated in these examples.

Adjacency List requires each record to contain the following fields:
ID
Parent ID
Is LeafNested Set requires - in addition to the fields above - the following fields:
Lft
Rgt
LevelHow Lft, Rgt, are calculated is explained below.

Which one should I choose?

Adjacency List is far more simple than the Nested Set model, as you don't have to calculate Lft and Rgt.

One example where this is important is when you plan to add records dynamically to TreeGrid - if you are using NestedSetStore, you'd have to calculate Lft and Rgt; with AdjacencyListStore, you only need to know the parent id.

So why would I choose Nested Set?

The hierarchy logic in databases can be implemented either by SQL queries or by a server-side script. For example, in order to find the top parent of a node, programmers might use SQL only, or a hybrid between SQL and PHP.

Nested Set makes life easier for those who implement the hierarchy logic via SQL queries. Then, if the database contains the lft and rgt fields anyway, you might just as well use the NestedSetStore with TreeGrid. If your database does not contain lft and rgt fields - you should probably use the AdjacencyListStore.

How do I calculate Lft and Rgt?

How Lft and Rgt are calculated is explained (alongside a thorough explanation of the two models) here: http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

However, TreeGrid ships with Tree.php script that can calculate them for you.

The following PHP script demonstrates how it is used:



$tree = new Tree();

$result = sql("SELECT * FROM nodes");

while ($node = mysql_fetch_array($result))
{
$tree->add(array(
'title' => $node['title'],
), $node['parent_id']
);
}

return $tree->getNodes();
$tree->getNodes() will return the nodes with lft and rgt fields.

So what options do I have?

Option 1:
A Nested Set database (with lft and rgt fields per record).
NestedSetStore with TreeGridThis option is good for those who wish to implement the hierarchy logic using SQL.

Option 2:
An Adjacency List database (records having ID and Parent ID)
Having Tree.php calculating lft and rgt
NestedSetStore with TreeGridThis option is good for those who wish to make life hard for themselves.

Option 3:
An Adjacency List database
AdjacencyListStore with TreeGridThis option is good for those who wish to keep things simple, and don't mind implementing the hierarchy logic in PHP (or any other server-side script).

Anything else I need to know?

Be aware that the record definition varies with respect to your NestedSetStore/AdjacencyListStore choice.

With NestedSetStore you need to have the fields starting with '_':



var record = Ext.data.Record.create([
{name: 'company'},
{name: 'price', type: 'float'},
{name: 'change', type: 'float'},
{name: 'pct_change', type: 'float'},
{name: 'last_change', type: 'date', dateFormat: 'n/j h:ia'},
{name: 'desc'},
{name: '_id', type: 'int'},
{name: '_level', type: 'int'},
{name: '_lft', type: 'int'},
{name: '_rgt', type: 'int'},
{name: '_is_leaf', type: 'bool'}
]);
With AdjacencyListStore you don't need the _level, _lft, and _rgt fields. In fact, having them can mess up the TreeGrid Display. So:



var record = Ext.data.Record.create([
{name: 'company'},
{name: 'price', type: 'float'},
{name: 'change', type: 'float'},
{name: 'pct_change', type: 'float'},
{name: 'last_change', type: 'date', dateFormat: 'n/j h:ia'},
{name: '_id', type: 'int'},
{name: '_parent', type: 'auto'},
{name: '_is_leaf', type: 'bool'}
]);

Adding a Record Dynamically


The following code is based on an earlier post in this thread:



function addItemChild() {

// get selected record
var r = grid.getSelectionModel().getSelected();

// if it's a leaf that make it a non-leaf
if (r.get("_is_leaf")) {
r.set("_is_leaf", false);
}

childID = Ext.id();
var myNewRecord = new record({company:"Child " + childID, price:12, _id:childID, _is_leaf:true, _parent:r.get("_id")}, childID);
store.addSorted(myNewRecord);
}A few notes on this:

1) When using EditorGridPanel, I have found the need to replace this line:



var r = grid.getSelectionModel().getSelected(); With:


row = grid.getSelectionModel().getSelectedCell()[0];
r = store.getAt(row);
2) Notice the use of:

new record({...}, id)Where record was defined earlier:


var record = Ext.data.Record.create([...]);This is instead of using:


new Ext.data.Record({...}, id);3) This example applies to AdjacencyListStore. If you want to add a record to a NestedSetStore, you'd need to provide _lft, _rgt and _level (most likely you'd have the server doing this, possible calculating these using the Tree helper class).

4) I have found the need to include the following for the tree to update correctly (mainly with regards to the icons displayed next to the node):



store.addSorted(myNewRecord);
// the two lines below are added so the grid updates correctly
store.expandNode(r);
grid.getView().refresh();
Using Direct with TreeGrid

I got TreeGrid working with direct by replacing the following in treegrid.js:

This:

Ext.ux.maximgb.tg.AbstractTreeStore = Ext.extend(Ext.data.Store,Has changed to this:


Ext.ux.maximgb.tg.AbstractTreeStore = Ext.extend(Ext.data.DirectStore,And then in my code:



var store = new Ext.ux.maximgb.tg.AdjacencyListStore({
autoLoad : true,
directFn : nodes.get,
reader: new Ext.data.JsonReader({id: '_id'}, record),
});


Hope this helps

sfs
14 Aug 2009, 12:27 AM
Hi Izhaki

Great explanation - I have been through the same process as you :D

I didn't try to use direct but finally figured out that if you don't fetch the entire tree to the treegrid, then when you expand a node which is not a leaf, the store will try to fetch the underlying nodes, by adding a parameter to you url called "anode" (Thank you Firebug!) which contains the id of the node you are trying to expand.

Does anyone know the difference between the dynamic load which I have just descriped and what goes on when you use direct?

/sfs

Izhaki
15 Aug 2009, 6:47 AM
Does anyone know the difference between the dynamic load which I have just descriped and what goes on when you use direct?

To my knowledge if you have a node that is not marked as a leaf (meaning it should have children) but has no children in the store, extjs will prompt the server for its children when the node is expanded. This is what you have described as dynamic load, and I think is also termed synchronous load.

Direct is just a way to define server side classes that can be called directly from your javascript code. So for example, I can have a PHP class called Nodes, with a method called get_nodes(), and call it directly from javascript with Nodes.get_nodes(). This really ease the client/server protocol, and results in a more logical server-side code.

MasterAM
30 Aug 2009, 12:08 AM
Hi,

I found an issue with AdjacencyListStore-based grids.
You can easily reproduce it by modifying some of maxim's examples, like the client_editable example, as follows:

(index.js)

...
// create the data store
var record = Ext.data.Record.create([
{name: 'company'},
{name: 'price', type: 'float'},
{name: 'change', type: 'float'},
{name: 'pct_change', type: 'float'},
{name: 'last_change', type: 'date', dateFormat: 'n/j h:ia'},
{name: 'desc'},
{name: '_id', type: 'int'},
{name: '_parent', type: 'int'},
{name: '_is_leaf', type: 'bool'}
]);
var store = new Ext.ux.maximgb.tg.AdjacencyListStore({
...
If you extract a node, the correct children will be expanded, but in most cases they would be in the wrong position.

The problem lies in the AdjacencyListStore's implementation of the getRootNodes method.
In my case, the roots' '_parent' property was an empty string and not null, making the method return an empty array.

Therefore, the following is proposed:
(TreeGrid.js@line 929)

getRootNodes : function()
{
var i,
len,
result = [],
records = this.data.getRange();

for (i = 0, len = records.length; i < len; i++) {
if (isNaN(parseInt(records[i].get(this.parent_id_field_name)),10)) {
result.push(records[i]);
}
}

return result;
},
@MaximGB,
Great extension!
Perhaps some of the code can be refactored a bit so that it can compress better.
I will apply a few changes as I go and post the changes when done.

Cheers!
Alon

MaximGB
1 Sep 2009, 7:42 AM
Great extension!
Perhaps some of the code can be refactored a bit so that it can compress better.
I will apply a few changes as I go and post the changes when done.
Thanks, but I prefer code readability over compressibility.

s.m.srinivas
24 Sep 2009, 9:36 AM
Hi,

I had requirement to use Tree Grid & below is the code. I don't see records in the Grid, I would like to know what am i doing wrong



var fields = [
{name: 'acctClient'},
{name: 'account'},
{name: 'shortName'},
{name: 'forms'},
{name: 'doc'},
{name: 'desc'},
{name: 'revision'},
{name: 'scan'},
{name: 'statusDate'},
{name: 'frame'},
{name: 'loc'},
{name: 'status'},
{name: 'id', type: 'int'},
{name: 'parentid', type: 'int'},
{name: 'leaf', type: 'bool'}
];

var data = [
{
"rows": [
{
"id":1,"parentid":null,"leaf":false,"acctClient":"","account":"","shortName":"","forms":"CL-SVC-SEL","doc":"","desc":"ACCOUNT SERVICES SELECTION","revision":"11-2005","scan":"03/15/2006","statusDate":"","frame":"SEZ","loc":"CMD","status":"Accepted"
},
{
"id":2,"parentid":1,"leaf":true,"acctClient":"","account":"","shortName":"","forms":"","doc":"DF","desc":"FDIC ADDENDUM FOR TRUST ACCTS","revision":"","scan":"","statusDate":"","frame":"","loc":"","status":""
}
],
"success":true,
"total":2
}
];

var acctMaintStore = new Ext.ux.maximgb.tg.AdjacencyListStore({
autoLoad : true,
leaf_field_name: "leaf",
parent_id_field_name: "parentid",
reader: new Ext.data.JsonReader({
idProperty: 'id',
root: 'rows',
fields: fields
}),
proxy: new Ext.data.MemoryProxy(data)
});

var resultPanel = new Ext.ux.maximgb.tg.GridPanel({
store: acctMaintStore,
enableHdMenu : false,
master_column_id : "forms",
disableSelection : true,
columns: [
{header: "Account/Client", hidden: true, width: 100, sortable: true, dataIndex: 'acctClient'},
{header: "Account", hidden: true, width: 100, sortable: true, dataIndex: 'account'},
{header: "Short Name (Friendly)", hidden: true, width: 150, sortable: true, dataIndex: 'shortName'},
{header: "Forms", width: 100, sortable: true, dataIndex: 'forms'},
{header: "Doc Cd", width: 125, sortable: true, dataIndex: 'doc'},
{header: "Description", width: 125, sortable: true, dataIndex: 'desc',id:'auto-expand-column-acct-maint'},
{header: "Revision", hidden: false, width: 125, sortable: true, dataIndex: 'revision'},
{header: "Scan", hidden: false, width: 125, sortable: true, dataIndex: 'scan'},
{header: "Status Date", width: 75, sortable: true, dataIndex: 'statusDate'},
{header: "Frame", hidden: false, width: 75, sortable: true, dataIndex: 'frame'},
{header: "Loc", hidden: false, width: 75, sortable: true, dataIndex: 'loc'},
{header: "Status", width: 75, sortable: true, dataIndex: 'status'},
{header: "Action", width: 150, sortable: false,dataIndex:'action'}
],
stripeRows: true,
autoExpandColumn: 'auto-expand-column-acct-maint',
region: 'center',
margins : '0 0 0 0',
header : false,
border: false,
title:'Results Panel'
});

s.m.srinivas
24 Sep 2009, 11:43 AM
I figured out the issue in the code



.............

var resultPanel = new Ext.ux.maximgb.tg.GridPanel({
store: acctMaintStore,
enableHdMenu : false,
master_column_id : "forms",
disableSelection : true,
columns: [
{header: "Account/Client", hidden: true, width: 100, sortable: true, dataIndex: 'acctClient'},
{header: "Account", hidden: true, width: 100, sortable: true, dataIndex: 'account'},
{header: "Short Name (Friendly)", hidden: true, width: 150, sortable: true, dataIndex: 'shortName'},
{header: "Forms", width: 100, sortable: true, dataIndex: 'forms',id:'forms'},
{header: "Doc Cd", width: 125, sortable: true, dataIndex: 'doc'},
{header: "Description", width: 125, sortable: true, dataIndex: 'desc',id:'auto-expand-column-acct-maint'},
{header: "Revision", hidden: false, width: 125, sortable: true, dataIndex: 'revision'},
{header: "Scan", hidden: false, width: 125, sortable: true, dataIndex: 'scan'},
{header: "Status Date", width: 75, sortable: true, dataIndex: 'statusDate'},
{header: "Frame", hidden: false, width: 75, sortable: true, dataIndex: 'frame'},
{header: "Loc", hidden: false, width: 75, sortable: true, dataIndex: 'loc'},
{header: "Status", width: 75, sortable: true, dataIndex: 'status'},
{header: "Action", width: 150, sortable: false,dataIndex:'action'}
],
stripeRows: true,
autoExpandColumn: 'auto-expand-column-acct-maint',
region: 'center',
margins : '0 0 0 0',
header : false,
border: false,
title:'Results Panel'
});

...............



The id marked in red was missing & hence the grid was not showing

nanich
8 Oct 2009, 8:08 AM
@Maximgb -- First of all, thanks for the great plug-in. Really liked it, when i had seen the same plugin developed using EXTJS 2.x version. The website where you have exposed the source to download seems to be down. Can you please have a look and resolve the issue.

hasdy
9 Oct 2009, 1:32 PM
I've been using the ext3 version of the treegrid with good success.

But when I have a response of over 600 records, I get the browser's "Stop running this script?" and whatever the message is on Firefox. I eventually get there by clicking on "No" a few times.

But is there a way to avoid this issue?

I understand that having this many records in a single grid is not the best practice.... but that's what the client wants.

If there is no resolution to that.... is there a good way to perform pagination on the treegrid that still is able to perform the sort on the entire result list?

Many thanks in advance

josh803316
13 Oct 2009, 3:14 PM
So far, in my experience, the reason you get the stop running scripts message is because you have a circular reference where your parent and your id are the same. Make sure that your id's are all unique and that when you parent and id will be the same thing your parent is null.

hasdy
15 Oct 2009, 8:50 AM
That was a good suggestion but unfortunately its never that simple.

We've combed through our test data list and verified that all parent and id values aren't the same.

Any other suggestions out there?

Just to note..... we eventually do get the full data set rendered onto the grid, it's just that we have to "continue" running the script via the browser's alert 2 or 3 times before it gets there.

I've been reading through some other forums and there are ways to by pass the alert by changing some configurations on the browser itself.... which is obviously not the ideal solution.

Again, even a pagination solution would suffice.... if we can manage to perform the sorting through the entire dataset.

Thanks again in advance.

mschwartz
15 Oct 2009, 8:54 AM
IE throws up that dialog after 5,000,000 statements. Whatever a statement is...

It can be changed by editing a registry key/value. Google for it.

josh803316
15 Oct 2009, 9:19 AM
I think this may be a bug. It has happened in my application a couple times as well. I double checked the id's to make sure they were unique and that there were no circular parent references. The problem is, this doesn't happen every time I load the grid.

MaximGB
15 Oct 2009, 12:37 PM
Again, even a pagination solution would suffice.... if we can manage to perform the sorting through the entire dataset.
I don't get it, what sorting problems do you experience. There is a per node pagination implemented out of the box also...

radutopala
22 Oct 2009, 1:37 AM
Hi,

Where can I find the Extjs 3 version of this great component?

Thanks.

Radu

MaximGB
22 Oct 2009, 7:23 AM
http://max-bazhenov.com/dev/

hasdy
22 Oct 2009, 11:57 AM
I think i must be missing something... based on the example provided in the package, I simply added




bbar: new Ext.ux.maximgb.tg.PagingToolbar({
store: store,
displayInfo: true,
pageSize: 30
}),


So the paging bar shows up and shows the appropriate number of pages but all results show up on the 1st page. ie 45 of 45 show even though my pageSize = 30.

Note: when i click to the next page.... all results are showing while the caption (bottom right) shows "Displaying 31-74 of 45)

Am I missing a declaration somewhere?

Thanks!

MaximGB
22 Oct 2009, 3:21 PM
From my site.

Paging feature explanation:
If the tree grid has no selection then paging toolbar shows information related to grid's root nodes set, e.g. if it shows "Displaying 1 - 10 of 20" then there are 20 root nodes (nodes with root id === null) which are divided into two pages. If the tree grid has a selection then the paging toolbar shows information related to selected node's child node set, node must be expanded for node's paging related information is loaded. After node expanding paging toolbar shows selected node's child node set related information and the paging facility are applyed to that node's child node set only. To start paging at the root nodes you must deselect all nodes first.

liqingzhu
25 Oct 2009, 10:46 PM
What should I do if I want to get the other Paramenters?

As far as I know,If i use the server side ,I need to get the 'anode' as id,then I can get the next json data for the TreeGrid, If I want to get the otherthings like '_level','_rgt' etc,
What should I do? Please tell me !

awebb
26 Oct 2009, 8:44 AM
Hi MaximGB,

In preparation to upgrading our site to ExtJs 3.0.X (X = latest), today I downloaded ExtJs 3.0.3 and the 3.0-compatible version of your excellent TreeGrid.

I looked in TreeGrid.js and saw this:-


if (Ext.version == '3.0') {
Ext.override(Ext.grid.GridView, {
ensureVisible : function(row, col, hscroll) {
However, if you look in ext-base-debug.js for the latest ExtJs, you find this:-


Ext = {
/**
* The version of the framework
* @type String
*/
version : '3.0.3'
};
Is the 'ensureVisible' override specifically for version 3.0, or does it need to be applied to all 3.0.X versions to date?

MaximGB
26 Oct 2009, 11:34 AM
What should I do if I want to get the other Paramenters?

As far as I know,If i use the server side ,I need to get the 'anode' as id,then I can get the next json data for the TreeGrid, If I want to get the otherthings like '_level','_rgt' etc,
What should I do? Please tell me !
Use adjacency list model there are only three parameters you should provide - id of the node, it's parent id and wether the node is leaf or it's not.

MaximGB
26 Oct 2009, 11:41 AM
awebb I might be wrong but I remember that this override is version 3.0 specific. Anyway you have the code so you can comment it out if it does the wrong thing.

sb32
3 Nov 2009, 7:03 PM
Use adjacency list model there are only three parameters you should provide - id of the node, it's parent id and wether the node is leaf or it's not.

The examples all use non hierarchal sample data [random company/number combinations that occur more than once]. It would make more sense to me if the data was representative of a tree structure.

I ran through what I believe to be all the examples and in each one, all that would post to the server was anode

Having said that, I worked around it by creating a unique id for each row essentially.

I.e.,

:food=>1 {
:fruit => 2 {
:orange=>5,:leaf=>true
},
:dairy=>3 {
:milk=>6,:leaf=>true
}
}


I don't like it and truly hope I overlooked a feature - Did I overlook something?

EDIT: BTW - Awesome plugin either way!

MaximGB
3 Nov 2009, 10:03 PM
Extension supports two methods of hierarchical data representation. You can use either Adjacency List method or Nested Set method, you can read about them here http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

sb32
5 Nov 2009, 12:18 PM
Could you share a quick example of how we can post row-level attributes back with the anode?

I.e...

listeners: on 'expand' () {
store.url.params = {
attribute_type: 'company',
attribute_value: tree.selectednode.attributes.company
}
}

Thank you

MaximGB
5 Nov 2009, 12:30 PM
It's something like that


store.on('beforeload', injectNodeAttrsBeforeLoad);
...
function injectNodeAttrsBeforeLoad(store, options)
{
// Get selected node, or use store.getActiveNode() to retrieve expanded node id
...
// Build custom attrs you need.
...
options.params['myCustomAttr'] = myCustomValue;
}

sb32
6 Nov 2009, 10:57 AM
Because expanding a node does not select it, your method fails unless you select the node explicitly before expanding it. Here's what I resorted to:



new Ext.ux.maximgb.tg.AdjacencyListStore({
listeners: {
beforeexpandnode: function(n,e) {
this.setBaseParam('parent_id', e.json._parent);
},
.................
});

wensa
8 Nov 2009, 3:09 PM
I have added a PagingToolbar on my TreeGrid with NestedSetStore. I fixed the Nodes via Tree.php. It works fine. But when I click on a row, the pager loss Data and I couldn't navigate through the pages. Is there a listener needed?

Sorry, I am a poor beginner and my English isn't good.

@MaximGB
Thanks a lot for the great extension.



<?php
$id=1;
echo"<script language=\"javascript\" >";
echo"
Controller = function()

{




var grid, record;

function createGrid()
{";




echo"

// create the data store
var record = Ext.data.Record.create([
{name: '$fname[0]'},
{name: '$fname[1]'},
{name: '$fname[2]'},
{name: '_id', type: 'int'},
{name: '_level', type: 'int'},
{name: '_lft', type: 'int'},
{name: '_rgt', type: 'int'},
{name: '_is_leaf', type: 'bool'}
]);
var store = new Ext.ux.maximgb.tg.NestedSetStore({
autoLoad : true,";
if($geraet==1)
echo"url: 'pager.php?geraet=1',";
else
echo" url: 'pager.php?geraeteid=".$geraeteid."',";
echo"
reader: new Ext.data.JsonReader(
{
id: '_id',
root: 'data',
totalProperty: 'total',
successProperty: 'success'
},
record
)
});
var combo = new Ext.form.ComboBox({
name : 'perpage',
width: 40,
store: new Ext.data.ArrayStore({
fields: ['id'],
data : [
['15'],
['25'],
['50']
]
}),
mode : 'local',
value: '15',

listWidth : 40,
triggerAction : 'all',
displayField : 'id',
valueField : 'id',
editable : false,
forceSelection: true
});

var bbar = new Ext.ux.maximgb.tg.PagingToolbar({
store: store, //the store you use in your grid
displayInfo: true,


items : [
'-',
'Anzahl pro Seite: ',
combo

]
});


combo.on('select', function(combo, record) {
bbar.pageSize = parseInt(record.get('id'), 10);
bbar.doLoad(bbar.cursor);
}, this);
// create the Grid
var grid = new Ext.ux.maximgb.tg.GridPanel({
store: store,


bbar: bbar,
master_column_id : '$fname[0]',
columns: [

{
id:'$fname[0]',
header: '$fname[0]',
width: 160,
sortable: true,
dataIndex: '$fname[0]'

}, {
header: '$fname[1]',
width: 300,
sortable: true,

dataIndex: '$fname[1]'

}, {
header: '$fname[2]',
width: 75,
sortable: true,

dataIndex: '$fname[2]'

}
],
stripeRows: true,
autoExpandColumn: '$fname[0]',
";
if($geraet==1)
echo"title: 'Geräte / Dokumente',";
else
echo "title: 'Methodenliste / Dokumente - ".$geraeteid."',";
echo "


viewConfig : {
enableRowBody : true
}
});
var vp = new Ext.Viewport({
layout : 'fit',
items : grid
});

}






return {
init : function()
{
createGrid();
}
}
}();


Ext.onReady(Controller.init);
</script>";

echo"<script type='text/javascript'>//<![CDATA[
Ext.BLANK_IMAGE_URL = 'ext-3.0.0/resources/images/default/s.gif';
//]]></script>";


echo"<br clear=all>";

echo"</body>";


?>

wensa
8 Nov 2009, 4:14 PM
I fixed my Problem with an Override Logic. I read on the Page from MaximGB, that it is normal, that the Pager goes on the expanded / selected row /node



Ext.override(Ext.grid.RowSelectionModel, {
handleMouseDown : function(g, rowIndex, e){
if(e.button !== 0 || this.isLocked()){
return;
};
var view = this.grid.getView();
if(e.shiftKey && this.last !== false){
var last = this.last;
this.selectRange(last, rowIndex, e.ctrlKey);
this.last = last; view.focusRow(rowIndex);
}else{
var isSelected = this.isSelected(rowIndex);
if(isSelected){
this.deselectRow(rowIndex);
}else if(!isSelected || this.getCount() > 1){
this.deselectRow(rowIndex, e.ctrlKey || e.shiftKey);
view.focusRow(rowIndex);
}
}
}
});


I have added a PagingToolbar on my TreeGrid with NestedSetStore. I fixed the Nodes via Tree.php. It works fine. But when I click on a row, the pager loss Data and I couldn't navigate through the pages. Is there a listener needed?

Sorry, I am a poor beginner and my English isn't good.

@MaximGB
Thanks a lot for the great extension.



<?php
$id=1;
echo"<script language=\"javascript\" >";
echo"
Controller = function()

{




var grid, record;

function createGrid()
{";




echo"

// create the data store
var record = Ext.data.Record.create([
{name: '$fname[0]'},
{name: '$fname[1]'},
{name: '$fname[2]'},
{name: '_id', type: 'int'},
{name: '_level', type: 'int'},
{name: '_lft', type: 'int'},
{name: '_rgt', type: 'int'},
{name: '_is_leaf', type: 'bool'}
]);
var store = new Ext.ux.maximgb.tg.NestedSetStore({
autoLoad : true,";
if($geraet==1)
echo"url: 'pager.php?geraet=1',";
else
echo" url: 'pager.php?geraeteid=".$geraeteid."',";
echo"
reader: new Ext.data.JsonReader(
{
id: '_id',
root: 'data',
totalProperty: 'total',
successProperty: 'success'
},
record
)
});
var combo = new Ext.form.ComboBox({
name : 'perpage',
width: 40,
store: new Ext.data.ArrayStore({
fields: ['id'],
data : [
['15'],
['25'],
['50']
]
}),
mode : 'local',
value: '15',

listWidth : 40,
triggerAction : 'all',
displayField : 'id',
valueField : 'id',
editable : false,
forceSelection: true
});

var bbar = new Ext.ux.maximgb.tg.PagingToolbar({
store: store, //the store you use in your grid
displayInfo: true,


items : [
'-',
'Anzahl pro Seite: ',
combo

]
});


combo.on('select', function(combo, record) {
bbar.pageSize = parseInt(record.get('id'), 10);
bbar.doLoad(bbar.cursor);
}, this);
// create the Grid
var grid = new Ext.ux.maximgb.tg.GridPanel({
store: store,


bbar: bbar,
master_column_id : '$fname[0]',
columns: [

{
id:'$fname[0]',
header: '$fname[0]',
width: 160,
sortable: true,
dataIndex: '$fname[0]'

}, {
header: '$fname[1]',
width: 300,
sortable: true,

dataIndex: '$fname[1]'

}, {
header: '$fname[2]',
width: 75,
sortable: true,

dataIndex: '$fname[2]'

}
],
stripeRows: true,
autoExpandColumn: '$fname[0]',
";
if($geraet==1)
echo"title: 'Geräte / Dokumente',";
else
echo "title: 'Methodenliste / Dokumente - ".$geraeteid."',";
echo "


viewConfig : {
enableRowBody : true
}
});
var vp = new Ext.Viewport({
layout : 'fit',
items : grid
});

}






return {
init : function()
{
createGrid();
}
}
}();


Ext.onReady(Controller.init);
</script>";

echo"<script type='text/javascript'>//<![CDATA[
Ext.BLANK_IMAGE_URL = 'ext-3.0.0/resources/images/default/s.gif';
//]]></script>";


echo"<br clear=all>";

echo"</body>";


?>

fu90
13 Nov 2009, 12:05 AM
Hello Everyone,

There is a flaw of displaying tree grid in IE6 when the content of master column too long,but It's OK in IE7 and IE8

please see attachment for more detail.

Does anyone have any solution to handle this problem?

Thanks and regards.

MaximGB
13 Nov 2009, 3:03 AM
Use strict doctype

fu90
13 Nov 2009, 4:31 PM
Thanks

josh803316
27 Nov 2009, 11:03 PM
I'm having some performance issues with the tree grid. When I expand my nodes, if I have more than 50 or so records in my expanded set it takes quite a while to load and sometimes even freezes with the javascript debugger error. Do you have any performance tips for loading large sets?

demongloom
30 Nov 2009, 2:48 AM
Josh, try to find answers in my changeset for tree grid.

http://www.extjs.com/forum/showthread.php?p=380487#post380487

It is modifications for 2.0 version, but I hope is possible to port them for 3.0 version too.

ps_senthil
2 Dec 2009, 12:56 PM
MaximGB,

Thanks for the great extension. You rock.

I am using EditorGridPanel with Server side paging and it works great.

My only problem is the paging control getting reset when a node is expanded or selected. I read in your documentation that "To start paging at the root nodes level one must deselect all nodes.". However I am not able to reset it to the root level. Please advise on how to deselect all nodes.

Even in your example at http://max-bazhenov.com/dev/ux.maximgb.tg/examples/server_ns/index.html, I am not able to reset to the root level paging.

Please help. Thanks again for the great plugin.

harsha_velicheti
15 Dec 2009, 12:21 AM
Hi maxim,
First thanks a ton for this great extension, i am trying to use the tree grid and facing a couple for problems as below:
1. The rool_title config values appears above the grid header (if i dont give any thing title is taken as default as i see in code), can you please explain how this is used in tree grid.(Please see the attached image to get better view.)17787
2. Even if I give autoExpanColumn the column doesn't get expanded on the first show.

Thanks in advance
Harsha

MaximGB
15 Dec 2009, 12:35 AM
Hi maxim,
First thanks a ton for this great extension, i am trying to use the tree grid and facing a couple for problems as below:
1. The rool_title config values appears above the grid header (if i dont give any thing title is taken as default as i see in code), can you please explain how this is used in tree grid.(Please see the attached image to get better view.)17787
This is used to control selection, by clicking on the root title you'll deselect all and thus pager will switch to root nodes level, otherwise pager shows data for the last selected node.

2. Even if I give autoExpanColumn the column doesn't get expanded on the first show.:-/

harsha_velicheti
15 Dec 2009, 1:37 AM
This is used to control selection, by clicking on the root title you'll deselect all and thus pager will switch to root nodes level, otherwise pager shows data for the last selected node.
:-/
Hi maxim,
Bbut i guess the root title is not supposed to come above the header right(i have seen your examples and it is not coming above header) please let me know if you have any idea where i might have went wrong.
On the second problem i want all the trees to be expanded when the grid is shown, so i am using autoExpandColumn config, but the trees are not epanded.

Thanks in advance
harsha

Dumas
18 Dec 2009, 2:30 PM
Hi!


I really like your EditorGrid Extention, exactly what I need :-)
But I'm facing some problems using the EditorGrid with the AdjustancyListStore, here's the problem: http://screencast.com/t/NmM5YmQ1Nj
Any ideas on that?

And the extention seems to have an bug when using the tbar an error thrown:
uncaught exception: [Exception... "Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER)" nsresult: "0x80004003 (NS_ERROR_INVALID_POINTER)" location: "JS frame :: http://mydomain.com/ext-all-debug.js :: anonymous :: line 21688" data: no]

thx
Dumas

MaximGB
22 Dec 2009, 2:13 AM
Hi Dumas.

Nice screencast. I think you are facing the problems due to your top level nodes has 'parent' field set to "null" which is a string value, but it should be just null without quotes

MaximGB
22 Dec 2009, 2:18 AM
Hi Harsha.

Hi maxim,
Bbut i guess the root title is not supposed to come above the header right(i have seen your examples and it is not coming above header) please let me know if you have any idea where i might have went wrong.
I think you have seen the examples of the treegrid for ExtJS version 3.x, they don't have the breadcrumbs facility. I've decided to get rid of that after I've ported my extension to work with ExtJS 3.x.

On the second problem i want all the trees to be expanded when the grid is shown, so i am using autoExpandColumn config, but the trees are not epanded.
This config property doesn't control the expansion of tree grid, it controls the horizontal expansion of a column. If you want some treegrid nodes to be expanded upon loading then you have to do it manually using store's expandNode/collapseNode methods.

makcs
25 Dec 2009, 4:17 PM
MaximGB, Thanks for the great extension!!! :D

Would you please help me with this problem... I attempt send data via Direct...
Read (load) and update requests work ok. But remove(destroy) and add(create) requests not present.. i catch events only. Many events add/remove fired on expandAll method, but no one request to server... How i can use direct with TreeGrid? May be use it without crud - call create and destroy from handlers?

Sorry for my bad English... :">



recordNomkStore = Ext.data.Record.create([
{name: 'name', type: 'string'},
{name: 'cod', type: 'string'},
{name: 'comment', type: 'string'},
{name: '_id', type: 'int'},
{name: '_parent', type: 'auto'},
{name: '_is_leaf', type: 'bool'}
]);

dsNomkStore = new Ext.ux.maximgb.tg.AdjacencyListStore({
id: 'dsNomk'
// ,restful: true
,autoLoad: true
,autoSave: true
// ,paramsAsHash: false
,api: {
create: TreeNomks.create,
read: TreeNomks.read,
update: TreeNomks.update,
destroy: TreeNomks.destroy
}
,reader: new Ext.data.JsonReader({ idProperty:'_id',root:'root' }, recordNomkStore )
,writer: new Ext.data.JsonWriter({ encode: false })
});




Ext.ns('NomkTreeGrid');
NomkTreeGrid = Ext.extend(Ext.ux.maximgb.tg.EditorGridPanel, {
// border:false
constructor:function(config) {
config = config || {};
config.listeners = config.listeners || {};
Ext.applyIf(config.listeners, {
beforeedit: function(e){
if ( !e.record.get('_is_leaf') && ( e.field != 'name' ) )
return false;
}
});
NomkTreeGrid.superclass.constructor.call(this, config);
} // eo function constructor
,initComponent:function() {
var config = {
tbar: [{
text: 'Добавить',
scope: this,
handler: function(){
var sm = this.getSelectionModel(); var r = sm.getSelected();

if ( !r || r.get("_is_leaf") ){
Ext.MessageBox.alert( 'Сообщение', 'Выбирите группу к которой хотите добавить новую запись...' );
return;
}

this.store.expandNode(r);

childID = Ext.id();
var newRecord = new recordNomkStore({
name: "Child " + childID,
_id: childID,
_is_leaf: true,
_parent: r.get("_id")
},
childID
);
this.store.addSorted( newRecord );
sm.selectRecords([newRecord]);
}
}, {
text: 'Удалить',
scope: this,
handler: function(){
var s = this.getSelectionModel().getSelections();
for(var i = 0, r; r = s[i]; i++){
this.store.remove(r);
}
}
}],
title: 'Номенклатура',
store: dsNomkStore,
master_column_id : 'name',
// plugins: [ _getRowEditor() ],
sm: new Ext.grid.RowSelectionModel(),
columns: [{
id:'name',
header: "Наименование",
width: 400,
sortable: true,
dataIndex: 'name'
,editor: new Ext.form.TextField()
},{
header: "Примечание",
width: 400,
sortable: true,
dataIndex: 'comment'
,editor: new Ext.form.TextField()
}]
,stripeRows: true
// ,autoExpandColumn: 'name'
,viewConfig: {
forceFit : true,
enableRowBody : true
}
}; // eo config object

Ext.apply(this, Ext.apply(this.initialConfig, config));
NomkTreeGrid.superclass.initComponent.apply(this, arguments);
} // eo function initComponent
,onRender:function() {
NomkTreeGrid.superclass.onRender.apply(this, arguments);
} // eo function onRender
}); // eo extend
Ext.reg('NomkTreeGrid', NomkTreeGrid);

flyzb618
27 Dec 2009, 9:00 PM
I changed my code from ext 2.3 to 3.0,so I also changed the treegrid. And I found the bug,if I have a node with 100 children nodes,the node can't load normaly after the js client recieved the json data from the server. But in the version of treegrid for ext2.x,there is no the problem and the node can fastly load 100 children nodes .
Who can help me?

Dumas
4 Jan 2010, 8:04 PM
Hi!

I'm facing a problem using the tg.EditorGridPanel with the AdjustancyListStore (which extends the AbstractTreeStore which extends the Ext.data.DirectStore). I tried to write an addRecord function, but it doesn't work :-/
For details it's much easier to see the problem in a screencast: http://screencast.com/t/YzA2MTIxZ
Can anybody help me?


thx
Dumas

richgoldmd
17 Feb 2010, 11:33 AM
This extension looks great - but when I expand a node in my code the rows are added at the end - not under the parent node. Collapsing the node removes them, but they remain at the end of the table, not under the appropriate parent row.

Any ideas?

Rich

richgoldmd
17 Feb 2010, 11:46 AM
This extension looks great - but when I expand a node in my code the rows are added at the end - not under the parent node. Collapsing the node removes them, but they remain at the end of the table, not under the appropriate parent row.

Any ideas?

Rich

Ok - turns out - I am using parent id == 0 for root nodes, but the comparison to null fails in the store. SO I made this change:


Ext.ux.maximgb.tg.AdjacencyListStore = Ext.extend(Ext.ux.maximgb.tg.AbstractTreeStore,
{
/**
* @cfg {String} parent_id_field_name Record parent id field name.
*/
parent_id_field_name : '_parent',
root_node_value: null, // <-- Added

getRootNodes : function()
{
var i,
len,
result = [],
records = this.data.getRange();

for (i = 0, len = records.length; i < len; i++) {
if (records[i].get(this.parent_id_field_name) == this.root_node_value) { // <-- Changed
result.push(records[i]);
}
}

return result;
},

canxss
8 Mar 2010, 5:19 PM
Hi,

Is the latest version on your download side compatible with 3.1.1? I'm trying to upgrade my app to 3.1.1 and the TreeGrid using an AdjacencyListStore renders and works correctly. But previously I was using Saki's Ext.ux.GridSearch plugin with TreeGrid without a problem (since TreeGrid was extending Grid I had no problems). And it's a lifesaver when trying to quickly locate an item on the grid.

But with 3.1.1 it doesn't work. In my app I don't get any exceptions but I also don't see the filtered result from the plugin. I checked the plugin first and it works OK with other grids. And I also checked the filtered result from the plugin for TreeGrid and I verified that the store filter correctly finds the matching rows. But as I said they don't appear on TreeGrid which was working perfectly before.

Thanks in advance

MaximGB
9 Mar 2010, 2:42 AM
I haven't tested the treegrid with 3.1.1. version. Meybe I'll test it during next weekend, right now I'm just too busy with my freelance tasks.

SimoAmi
9 Mar 2010, 1:29 PM
After deleting the last record, the following AdjacencyListStore function was throwing an error because 'rc' was undefined:



getNodeParent : function(rc) {
return this.getById(rc.get(this.parent_id_field_name));
},
I changed it to:



getNodeParent : function(rc) {
if(rc) {
return this.getById(rc.get(this.parent_id_field_name));
}
return null;
},It works well now.

Wilmar
16 Mar 2010, 1:40 AM
Hi all,

The TreeGrid works great in my application. Now what I would like, are different backgrounds for rows with some specific cell values. One way I found was to enable a GridView in the constructor of the TreeGrid with a specification of getRowClass in it.

That worked well, were it not that the icons of the tree disappeared, making it impossible to browse through my tree's children nodes.

Is there any way to get around this?

richgoldmd
16 Mar 2010, 3:32 AM
Hi all,

The TreeGrid works great in my application. Now what I would like, are different backgrounds for rows with some specific cell values. One way I found was to enable a GridView in the constructor of the TreeGrid with a specification of getRowClass in it.

That worked well, were it not that the icons of the tree disappeared, making it impossible to browse through my tree's children nodes.

Is there any way to get around this?

Cheers,
Wilmar van Beusekom.

No didn't give any code, but make sure your GridView is, or is derived from, Ext.ux.maximgb.tg.GridView.

Wilmar
16 Mar 2010, 4:34 AM
Now why didn't I think of that? Thanks, it works now!

Stju
17 Mar 2010, 5:41 AM
To work correctly with DirectStore this should be modified:

1. Replace


Ext.ux.maximgb.tg.AbstractTreeStore = Ext.extend(Ext.data.Store,
{
...
with:


Ext.ux.maximgb.tg.AbstractTreeStore = Ext.extend(Ext.data.DirectStore,
{
..
2. Replace methid doRender with:


doRender : function(cs, rs, ds, startRow, colCount, stripe)
{
var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount-1;
var tstyle = 'width:'+this.getTotalWidth()+';';
// buffers
var buf = [], cb, c, p = {}, rp = {tstyle: tstyle}, r;
for (var j = 0, len = rs.length; j < len; j++) {
r = rs[j]; cb = [];
var rowIndex = (j+startRow);

var row_render_res = this.renderRow(r, rowIndex, colCount, ds, this.cm.getTotalWidth());

if (row_render_res === false) {
for (var i = 0; i < colCount; i++) {
c = cs[i];
p.id = c.id;
p.css = i == 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');
p.attr = p.cellAttr = "";
p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);
p.style = c.style;
if(Ext.isEmpty(p.value)){
p.value = " ";
}
if(this.markDirty && r.dirty && typeof r.modified[c.name] !== 'undefined'){
p.css += ' x-grid3-dirty-cell';
}
// ----- Modification start
if (c.name == this.grid.master_column_id) {
p.treeui = this.renderCellTreeUI(r, ds);
ct = ts.mastercell;
}
else {
ct = ts.cell;
}
// ----- End of modification
cb[cb.length] = ct.apply(p);
}
}
else {
cb.push(row_render_res);
}

var alt = [];
if (stripe && ((rowIndex+1) % 2 == 0)) {
alt[0] = "x-grid3-row-alt";
}
if (r.dirty) {
alt[1] = " x-grid3-dirty-row";
}
rp.cols = colCount;
if(this.getRowClass){
alt[2] = this.getRowClass(r, rowIndex, rp, ds);
}
rp.alt = alt.join(" ");
rp.cells = cb.join("");
// ----- Modification start
if (!ds.isVisibleNode(r)) {
rp.display_style = 'display: none;';
}
else {
rp.display_style = '';
}
rp.level = ds.getNodeDepth(r);
// ----- End of modification
buf[buf.length] = rt.apply(rp);
}
return buf.join("");
},
3. To use with


this.yourStore = new Ext.ux.maximgb.tg.AdjacencyListStore({
api: {
read: xxxDIRECT.getData,
create: xxxDIRECT.createRow,
update: xxxDIRECT.updateRow,
destroy: xxxDIRECT.deleteRow
},
autoLoad : false,
autoSave: true, // <- IMPORTANT to send data automatically to server!
prettyUrls: false,

reader:new Ext.data.JsonReader({id: '_id', root: 'data',successProperty: 'success',totalProperty: 'total'}),
writer: new Ext.data.JsonWriter({ encode: false}), // <- IMPORTANT to have functions update, insert and delete :) otherwise store only loads data..
paramsAsHash: false, //important
remoteSort: true,

paramOrder: ['sort','dir','start','limit','fields','query', 'destination','anode'],
paramsNames: {start : 'start', limit : 'limit', sort : 'sort', dir : 'dir', fields : 'fields', query : 'query', destination:'destination', anode:'anode'},
baseParams: {start : 0, limit : 20, sort : 'id', dir : 'ASC', fields:'', query:'', destination:'', anode:'zero'},

..
}
});
Other changes may be neacessary to your code, but this is to get general clue.
Tested and working with Extjs 3.2 and metagrid plugin! B)


@Maxim: Thank's for this exellent extension! =D>
Stju

Stju
18 Mar 2010, 8:28 PM
What is a correct way to add nodes dynamically?

Stju
18 Mar 2010, 9:54 PM
If node is inserted in already loaded store, then after clicking to expand any other node will open and load wrong one, completely breaking further use.. :s
To reproduce:
1. load data,
2. add node 'new'
3. click on node B -> Expands node A.
4. click again on node B -> Error
See pictures.

Any help would be greatly appreciated!
Regards,
Stju

squ3lch
22 Mar 2010, 4:28 AM
I know 3.2 is still beta, but this extension is apparently not working in 3.2.

MaximGB
22 Mar 2010, 5:00 AM
If node is inserted in already loaded store, then after clicking to expand any other node will open and load wrong one, completely breaking further use.. :s

Please post your node adding code here, or give me a link to the online demo where I can see the bug.

Wilmar
2 Apr 2010, 12:32 AM
The TreeGrid is an excellent and much-needed piece of work. There is one issue, however, that I stumble upon...

When I select a row on the TreeGrid, the Paging Bar seems to set its scope to the children of the item in that row. I'd like to see that the Paging Bar's scope remains at the root of the tree, no matter what I select in the TreeGrid. How do I do that?

Cheers,
Wilmar.

MaximGB
2 Apr 2010, 11:07 AM
Have you tryed to use standart ExtJS's toolbar widget? It's just an assumption but, if you provide store's reader with 'total' property value set to number of top level nodes in the response, then it might work.

josh803316
6 Apr 2010, 2:29 PM
Has anyone had a problem with row select and paging. For some reason when I select a row and then try to page it throws off all my paging and the display gets stuck in 'loading...' It seems that for some reason the addition of the active_node to the adjacency list store has something to do with this but I can't figure it out. Any help or guidance would be much appreciated.

josh803316
6 Apr 2010, 2:54 PM
if I do this and comment out the store.setActiveNode(record) then paging works (for the parent) while a row is selected but not expanded. How should this be modified/adapted so that I don't break the active node logic but still allow paging?


onTreeGridSelectionChange : function(sm, selection)
{
var record, ancestors, store = this.getStore();
// Row selection model
if (sm.getSelected) {
record = sm.getSelected();
//store.setActiveNode(record);
}
// Cell selection model
else if (sm.getSelectedCell && selection) {
record = selection.record;
//store.setActiveNode(record);
}

// Ensuring that selected node is visible.
if (record) {
if (!store.isVisibleNode(record)) {
ancestors = store.getNodeAncestors(record);
while (ancestors.length > 0) {
store.expandNode(ancestors.pop());
}
}
}
}

MaximGB
6 Apr 2010, 4:38 PM
Do you use the pager component which comes with the treegrid?

josh803316
6 Apr 2010, 4:57 PM
Yeah, it looks like that was the issue........now when I select a row the pager doesn't show page-ability unless the node is expanded. Thank you for your help

wesleyk
15 Apr 2010, 3:16 PM
Hi. This is a great component. Thanks@maximgb.

I'm looking for a way on how to load the full tree in just one ajax call and have all nodes automatically expanded.

Any ideas?

Thanks.

Wilmar
16 Apr 2010, 4:43 AM
Re: Paging Bar scope
Hi Maxim,
Thanks for your response. It seems that the TreeGrid needs the bbar to be the PagingToolbar you wrote, otherwise the grid only shows the record ids. Also, I added a totalProperty to the reader, but nothing changes.
I think my problem really boils down to something to do with the SelectionModel.
Wilmar.

Wilmar
16 Apr 2010, 4:59 AM
Re: Paging Bar scope
Hi Maxim,
Thanks for your response. It seems that the TreeGrid needs the bbar to be the PagingToolbar you wrote, otherwise the grid only shows the record ids. Also, I added a totalProperty to the reader, but nothing changes.
I think my problem really boils down to something to do with the SelectionModel.
Wilmar.
So what I did is this. Upon the rowclick event, the selectionModel's clearSelection method is called. It's a dirty solution, but it works and doesn't interfere with the rest of my program.
Wilmar.

Stju
16 Apr 2010, 5:45 AM
Please post your node adding code here, or give me a link to the online demo where I can see the bug.



editorAddNewRow:function(){
if(this.currentEditorTableId==-1)return false;
this.gridRowEditor.stopEditing();
var sm = this.classEditorGrid.getSelectionModel();
var selectedNode=sm.getSelected();
this.currentAction='create';

if(!selectedNode){ // nothing selected-> add at root level..
this.parentNode = null;
this.addRowAndStartEdit();
}
else{
this.parentNode = selectedNode;
var expandets=selectedNode.ux_maximgb_tg_expanded==true ? true : false;
if(expandets){
this.addRowAndStartEdit();
}
else{
if(selectedNode.ux_maximgb_tg_expanded==undefined)
this.addRowAndStartEdit();
else
this.prefStore.expandNode(selectedNode);
}
}
},

addRowAndStartEdit:function(){
if(this.currentAction=='create'){
var sm = this.classEditorGrid.getSelectionModel();

this.selectionNodePositon = sm.getSelectedIndex();
var pozicija = this.selectionNodePositon + 1;
var selectedNode=sm.getSelected();
var skaits = this.prefStore.getCount();

if(!selectedNode && skaits>0)skaits=0;//important

var metaRecordArray = new Array();
var metaFields = this.prefStore.reader.meta.fields;

for(var a=0; a<metaFields.length; a++){
metaRecordArray.push( { name: metaFields[a].name } )
}
var RecordModel = Ext.data.Record.create(metaRecordArray);

var rm = new RecordModel(); //Record Model
var childID = Ext.id();

var parentId = skaits>0 ? selectedNode.id : null;

rm.set("parentId", parentId);
rm.set("_parent", parentId);
rm.set("_is_leaf",true);
rm.set("id",childID);
rm.set("_id",childID);

this.prefStore.insert(pozicija,rm);

this.prefStore.setActiveNode(rm);
this.classEditorGrid.getView().refresh(); // this = grid
this.classEditorGrid.getSelectionModel().selectRow(this.selectionNodePositon+1);
}
},

ggons
16 Apr 2010, 7:01 AM
Hi Maxim, Thanks for your Good Extension !

I implemented two abstract method in AbstractTreeStore Class.
1) NestedSetStore.addToNode
2) NestedSetStore.removeFromNode

FYI....



/**
* implements NestedSetStore.addToNode
*
* @access public
*
* @param parent Parent node
* @param child Added child node
* @param index Added position index (optional)
* @return added child node. server sync data.
*/
addToNode : function(parent, child, index) {

// #. get siblings
var siblings = this.getNodeChildren(parent);
if (index == null || index > siblings.length) {
index = siblings.length; // add last
}

// #. find point update condition
var point = 0;
if (index < siblings.length) {
var nextSibling = siblings[index];
point = nextSibling.get(this.left_field_name);
} else {
point = parent.get(this.right_field_name);
}

// #. increase node's left and right
var diff = 2; // 1 node has 2 point !
var records = this.data.getRange();
this.updateTreeTraversePoint(records, point, diff);

// #. check parent's is_leaf attribute
var parentIsLeaf = parent.get(this.leaf_field_name);
if (parentIsLeaf) {
parent.beginEdit();
parent.set(this.leaf_field_name, false);
}

// #. find maxId and insert child node
var maxId = 0;
for (i = 0; i < records.length; i++) {
if (records[i].id > maxId) {
maxId = records[i].id;
}
}
child.id = maxId + 1;
child.set(this.level_field_name, parent.get(this.level_field_name) + 1);
child.set(this.left_field_name, point);
child.set(this.right_field_name, point + 1);
child.set(this.leaf_field_name, true); // fix true
this.add(child);

// #. all commit
this.commitChanges();

// #. sort data
this.applySort();

// #. expand and select
this.expandNode(parent);

return child;
},


/**
* implements NestedSetStore.removeFromNode
*
* @access public
*
* @param parent Parent record (Record)
* @param child Removed record (Record)
* @return Removed nodes array. fserver sync data.
*
*/
removeFromNode : function(parent, child) {

// #. get nextSibling
var nextSibling = this.getNodeNextSibling(child);

// #. find point update condition
var point = 0;
if (nextSibling != null) {
point = nextSibling.get(this.left_field_name);
} else {
point = parent.get(this.right_field_name);
}

// #. remove child Node and subChildren...
var pointL = child.get(this.left_field_name);
var pointR = child.get(this.right_field_name);
var removedNodes = [];

var records = this.data.getRange();
for (var i = records.length - 1; i >= 0; i--) {
var rc = records[i];
var left = rc.get(this.left_field_name);
if (pointL <= left && left <= pointR) {
removedNodes.push(rc);
rc.beginEdit();
this.remove(rc);
}
}

// #. decrease node's left and right.. (optional)
var diff = pointL - point; // minus value. decrease left and right
this.updateTreeTraversePoint(records, point, diff);

// #. all commit
this.commitChanges();

// #. check parent's is_leaf attribute
var siblings = this.getNodeChildren(parent);
if (siblings.length == 0) {
parent.set(this.leaf_field_name, true);
parent.commit(true);
}

// #. sort data
this.applySort();

// #. expand and select
this.expandNode(parent);

return removedNodes;
},


/**
* update tree traverse left and right point (like database updating)
* required commitChanges() after call this method..
*
* @access private
*
* @param nodes All nodes list (Record[])
* @param point Base point (int)
* @param diff Traverse point gap..
*/
updateTreeTraversePoint : function(nodes, point, diff) {

for (i = 0; i < nodes.length; i++) {
var rc = nodes[i];

// update left or right point
var left = rc.get(this.left_field_name);
var right = rc.get(this.right_field_name);
if (left >= point || right >= point) {
// avoid fire event
rc.beginEdit();
if (left >= point) {
rc.set(this.left_field_name, (left + diff));
}
if (right >= point) {
rc.set(this.right_field_name, (right + diff));
}
}
} // End of FOR
}

MaximGB
26 Apr 2010, 5:26 AM
Hi Stju.

First of all why do your records have two fields for id and parent, i.e. 'id', '_id', '_parent', 'parentId'?
Next, I don't like your record creation code, it's to cumbersome ;)
Here's the one I use (it's a member of store)


createNewRecord : function(id, is_leaf)
{
var record,
fields = this.fields.getRange(),
i, len, field,
defaults = {};

for (
i = 0, len = fields.length;
i < len;
i++
) {
field = fields[i];
defaults[field.name] = field.defaultValue;
}

defaults.id = id;
defaults.isLeaf = is_leaf;

record = new this.recordType(defaults, id);

this.setNodeLoaded(record, true);

return record;
}

Also, just FYI there's the isExpandedNode() in the Ext.ux.maximgb.tg.AbstractTreeStore, and other usefull methods which makes it easier to deal with my custom ux_maximgb_tg_* record properties.

fmartin
5 May 2010, 4:14 PM
Hi and thanks a lot for the Extension.

I've been working in the EditorGridPanel to generate a recursive SUM. I mean, if I change a child node, all the ancestors are increased in the same quantity.

I'm doing it using the parents array, but I'm having problems with the calling to the onUpdate function that the event fire. How can I avoid that the modification of the parents "behind the scene" make recursive call to the onUpdate function?.

Thanks in advanced!

Felipe

MaximGB
6 May 2010, 3:04 PM
Hi Felipe.

I don't get your question. Nevertheless, if you need parent record rows to be updated when you change their's sum data field then simply do

parent.set('sum', value);
if you don't need parent record rows to be updated then either change parent record sum value by using record's data member, i.e.

parent.data['sum'] = value;
or suppress store events while you are updating.

khushboo
17 May 2010, 12:41 PM
Hi Maxim,
Thanks for the great plugin.

I am facing one problem while applying filter on the grid.


Here is the exception that I get when I apply filter like 'Plan 1'
uncaught exception: Tree inconsistency can't get level 1 node(id=6) parent.

Could you please help?

khushboo
17 May 2010, 12:44 PM
Hi Srinivas,
I tried running this example of urs. But my grid doesnt display anything? Could u please help?

MaximGB
19 May 2010, 12:26 PM
Hi, khushboo.

Please don't post such a mess anymore, regarding your question if you apply filter to the tree grid make sure that you don't filter out the parent nodes of the nodes which pass filtering.

harpreetset
26 May 2010, 9:31 AM
Hey Maxim,
Great plugin. I have been using this for one of my projects and off late started facing some problems when we click on expand button. It takes lot of time to repaint and load the data. Do you know if this could be the issue with too many call back methods being called or issue with repainting logic? It causing my site to slow down. Can you please help?

MaximGB
26 May 2010, 10:36 AM
My experience says that component is hardly usable when there's more then 200 - 300 nodes, I'm going to refactor the component to use lazy rendering logic that will speed up it a lot, but I constantly lack time, also here in the thread someone has posted it's own refactoring of the component which uses lazy rendering.

harpreetset
26 May 2010, 12:26 PM
My experience says that component is hardly usable when there's more then 200 - 300 nodes, I'm going to refactor the component to use lazy rendering logic that will speed up it a lot, but I constantly lack time, also here in the thread someone has posted it's own refactoring of the component which uses lazy rendering.


I understand the performance issue wih 200-300 nodes. but I have a page view with page size 20 so overall there would only be 20 pages. when I expand node having 5-10 children, it takes 2-3 seconds which sould not be the case. When debugged, it appeared that most of the time was taken up by all the fire event methods, most of which I dont need, and disabling the events is a mess. I dont want to touch the code there. Is there a way to resolve this?
My functionality is very simple, its a read only screen with 20 nodes, and each node may have 5-10 children. Teh node are loaded by JSON and there is no requirement to edit/ change information on the tree.
Is there a faster implementation which can just take care of this need. Since you are owner of this library, it would be great help if you suggest some pointers where I can optimize the performance.
Here is the excerpts for log:

17:45:56:994:[10|0]:undefined::ext-all fire event enable
17:45:56:994:[10|0]:undefined::ext-all fire event disable
17:45:56:978:[10|0]:undefined::ext-all fire event disable
17:45:56:963:[10|0]:undefined::ext-all fire event disable
17:45:56:947:[10|0]:undefined::ext-all fire event disable
17:45:56:931:[10|0]:undefined::ext-all fire event valid
17:45:56:931:[10|0]:undefined::ext-all fire event activenodechange
17:45:56:931:[10|0]:undefined::ext-all fire event beforeactivenodechange
17:45:56:916:[10|0]:undefined::ext-all fire event selectionchange
17:45:56:916:[10|0]:undefined::ext-all fire event rowselect
17:45:56:900:[10|0]:undefined::ext-all fire event add
17:45:56:900:[10|0]:undefined::ext-all fire event clear
17:45:56:885:[10|0]:undefined::ext-all fire event beforerowselect
17:45:56:760:[10|0]:undefined::ext-all fire event expandnode
17:45:56:572:[10|0]:undefined::ext-all fire event change
17:45:56:556:[10|0]:undefined::ext-all fire event enable
17:45:56:541:[10|0]:undefined::ext-all fire event enable
17:45:56:541:[10|0]:undefined::ext-all fire event enable
17:45:56:525:[10|0]:undefined::ext-all fire event disable
17:45:56:525:[10|0]:undefined::ext-all fire event disable
17:45:56:510:[10|0]:undefined::ext-all fire event valid
17:45:56:510:[10|0]:undefined::ext-all fire event load
17:45:56:369:[10|0]:undefined::ext-all fire event rowupdated
17:45:56:291:[10|0]:undefined::ext-all fire event update
17:45:56:166:[10|0]:undefined::ext-all fire event rowupdated
17:45:56:88:[10|0]:undefined::ext-all fire event update
17:45:55:947:[10|0]:undefined::ext-all fire event rowupdated
17:45:55:853:[10|0]:undefined::ext-all fire event update
17:45:55:728:[10|0]:undefined::ext-all fire event rowupdated
17:45:55:666:[10|0]:undefined::ext-all fire event update
17:45:55:541:[10|0]:undefined::ext-all fire event rowupdated
17:45:55:463:[10|0]:undefined::ext-all fire event update
17:45:55:322:[10|0]:undefined::ext-all fire event rowupdated
17:45:55:244:[10|0]:undefined::ext-all fire event update
17:45:55:103:[10|0]:undefined::ext-all fire event rowupdated
17:45:55:41:[10|0]:undefined::ext-all fire event update
17:45:54:900:[10|0]:undefined::ext-all fire event rowupdated
17:45:54:822:[10|0]:undefined::ext-all fire event update
17:45:54:697:[10|0]:undefined::ext-all fire event rowupdated
17:45:54:619:[10|0]:undefined::ext-all fire event update
17:45:54:478:[10|0]:undefined::ext-all fire event rowupdated
17:45:54:400:[10|0]:undefined::ext-all fire event update
17:45:54:259:[10|0]:undefined::ext-all fire event rowupdated
17:45:54:181:[10|0]:undefined::ext-all fire event update
17:45:54:41:[10|0]:undefined::ext-all fire event rowupdated
17:45:53:978:[10|0]:undefined::ext-all fire event update
17:45:53:838:[10|0]:undefined::ext-all fire event rowupdated
17:45:53:759:[10|0]:undefined::ext-all fire event update
17:45:53:634:[10|0]:undefined::ext-all fire event rowupdated
17:45:53:556:[10|0]:undefined::ext-all fire event update
17:45:53:416:[10|0]:undefined::ext-all fire event rowupdated
17:45:53:353:[10|0]:undefined::ext-all fire event update
17:45:53:228:[10|0]:undefined::ext-all fire event rowupdated
17:45:53:134:[10|0]:undefined::ext-all fire event update
17:45:52:994:[10|0]:undefined::ext-all fire event rowupdated
17:45:52:916:[10|0]:undefined::ext-all fire event update
17:45:52:791:[10|0]:undefined::ext-all fire event rowupdated
17:45:52:728:[10|0]:undefined::ext-all fire event update
17:45:52:587:[10|0]:undefined::ext-all fire event rowupdated
17:45:52:509:[10|0]:undefined::ext-all fire event update
17:45:52:384:[10|0]:undefined::ext-all fire event rowupdated
17:45:52:306:[10|0]:undefined::ext-all fire event update
17:45:52:291:[10|0]:undefined::ext-all fire event add
17:45:52:291:[10|0]:undefined::ext-all fire event add
17:45:52:291:[10|0]:undefined::ext-all fire event add
17:45:52:275:[10|0]:undefined::ext-all fire event add
17:45:52:275:[10|0]:undefined::ext-all fire event add
17:45:52:275:[10|0]:undefined::ext-all fire event add
17:45:52:259:[10|0]:undefined::ext-all fire event add
17:45:52:259:[10|0]:undefined::ext-all fire event add
17:45:52:259:[10|0]:undefined::ext-all fire event add
17:45:52:259:[10|0]:undefined::ext-all fire event add
17:45:52:244:[10|0]:undefined::ext-all fire event add
17:45:52:244:[10|0]:undefined::ext-all fire event add
17:45:52:244:[10|0]:undefined::ext-all fire event add
17:45:52:244:[10|0]:undefined::ext-all fire event add
17:45:52:228:[10|0]:undefined::ext-all fire event add
17:45:52:228:[10|0]:undefined::ext-all fire event add
17:45:52:228:[10|0]:undefined::ext-all fire event add
17:45:52:228:[10|0]:undefined::ext-all fire event add
17:45:52:212:[10|0]:undefined::ext-all fire event add
17:45:52:212:[10|0]:undefined::ext-all fire event add
17:45:52:212:[10|0]:undefined::ext-all fire event clear
17:45:52:197:[10|0]:undefined::ext-all fire event add
17:45:52:197:[10|0]:undefined::ext-all fire event replace
17:45:52:197:[10|0]:undefined::ext-all fire event add
17:45:52:181:[10|0]:undefined::ext-all fire event replace
17:45:52:181:[10|0]:undefined::ext-all fire event add
17:45:52:181:[10|0]:undefined::ext-all fire event replace
17:45:52:181:[10|0]:undefined::ext-all fire event add
17:45:52:166:[10|0]:undefined::ext-all fire event replace
17:45:52:166:[10|0]:undefined::ext-all fire event add
17:45:52:166:[10|0]:undefined::ext-all fire event replace
17:45:52:166:[10|0]:undefined::ext-all fire event add
17:45:52:150:[10|0]:undefined::ext-all fire event replace
17:45:52:150:[10|0]:undefined::ext-all fire event add
17:45:52:150:[10|0]:undefined::ext-all fire event replace
17:45:52:134:[10|0]:undefined::ext-all fire event add
17:45:52:134:[10|0]:undefined::ext-all fire event replace
17:45:52:134:[10|0]:undefined::ext-all fire event add
17:45:52:119:[10|0]:undefined::ext-all fire event replace
17:45:52:119:[10|0]:undefined::ext-all fire event add
17:45:52:119:[10|0]:undefined::ext-all fire event replace
17:45:52:119:[10|0]:undefined::ext-all fire event add
17:45:52:103:[10|0]:undefined::ext-all fire event replace
17:45:52:103:[10|0]:undefined::ext-all fire event add
17:45:52:103:[10|0]:undefined::ext-all fire event replace
17:45:52:87:[10|0]:undefined::ext-all fire event add
17:45:52:87:[10|0]:undefined::ext-all fire event replace
17:45:52:87:[10|0]:undefined::ext-all fire event add
17:45:52:72:[10|0]:undefined::ext-all fire event replace
17:45:52:72:[10|0]:undefined::ext-all fire event add
17:45:52:72:[10|0]:undefined::ext-all fire event replace
17:45:52:56:[10|0]:undefined::ext-all fire event add
17:45:52:56:[10|0]:undefined::ext-all fire event replace
17:45:52:56:[10|0]:undefined::ext-all fire event add
17:45:52:41:[10|0]:undefined::ext-all fire event replace
17:45:52:41:[10|0]:undefined::ext-all fire event add
17:45:52:41:[10|0]:undefined::ext-all fire event replace
17:45:52:25:[10|0]:undefined::ext-all fire event add
17:45:52:25:[10|0]:undefined::ext-all fire event replace
17:45:52:25:[10|0]:undefined::ext-all fire event add
17:45:52:9:[10|0]:undefined::ext-all fire event replace
17:45:52:9:[10|0]:undefined::AbstractTreeStore - Load records
17:45:52:9:[10|0]:undefined::ext-all fire event load
17:45:51:978:[10|0]:undefined::ext-all fire event requestcomplete
17:45:51:978:[10|0]:undefined::ext-all fire event requestcomplete
17:45:51:837:[10|0]:undefined::TreeGrid.js
17:45:51:822:[10|0]:undefined::ext-all fire event beforerequest
17:45:51:822:[10|0]:undefined::ext-all fire event beforerequest
17:45:51:822:[10|0]:undefined::ext-all fire event beforeload
17:45:51:494:[10|0]:undefined::ext-all fire event disable
17:45:51:462:[10|0]:undefined::ext-all fire event beforeload
17:45:51:462:[10|0]:undefined::ext-all fire event beforeexpandnode
17:45:51:462:[10|0]:undefined::AbstractTreeStore - Expand Node
17:45:51:447:[10|0]:undefined::TreeGrid - onClick

MaximGB
26 May 2010, 12:44 PM
This log says nothing to me, have you tried to profile using firebug, or maybe you have an online demo where I can test it when I'll have some time?

shr1975
11 Jun 2010, 1:29 AM
Thanks for this great plugin MaximGB.

It perfectly fits in for our requirement.

However, there's one problem that we are facing and cannot put a finger on the exact problem area. Our grid has about 150 rows but the performance in IE (we tried with 7 and 8) is very low. After the rows are loaded into the grid, it takes ages to respond to anything - expanding, rendering the editor, scrolling.

Here's my code:


/**
* Config options
* **************
* taskId
* mainTaskId
* columnModel
* formName
* containerEl
* isStateChanged
* stateJSON
* sortField
* sortDirection
* groupField
* gridTitle
* inDetailPage
*/

function GSCompare(config)
{
/*
* Config member variables.
*/
this.taskId = config.taskId;
this.mainTaskId = config.mainTaskId;
this.columnModel = config.columnModel;
this.formName = config.formName;
this.containerEl = config.containerEl;
this.isStateChanged = config.isStateChanged;
this.stateJSON = config.stateJSON;
this.sortField = config.sortField;
this.sortDirection = config.sortDirection;
this.groupField = config.groupField;
this.gridTitle = config.gridTitle;
this.inDetailPage = config.inDetailPage;

/*
* Member variables
*/
this.grid;
this.ds;
this.cm;
this.storeList = {};
this.fixedWidth = 550;
//this.fixedHeight = 375;
this.firstTimeRender = true; //This is to check if the compare grid is being rendered for the first time.
//If it is so, then after the grid data is loaded, the criteria section will be hidden.
this.init = function()
{
/*
* Whatever initializations have to be done will be done here.
*/
this.initCompareGrid();
this.adjustGridSize();
Ext.EventManager.onWindowResize(this.adjustGridSize, this, false);
};
/**
* This function set the height of the grid.
* If no fixed height is specified the height is set to the
* maximum value that does not require scrolling on a page level.
*/
this.adjustGridSize = function()
{
var el = this.grid.getEl();
var gridObj = this.grid;

// this is to adjust the width to the width of the parent element needed for FF3 and IE6
gridObj.setWidth(this.fixedWidth);
gridObj.setWidth(el.findParent('td', null, true).getComputedWidth());

var tblHeight = this.fixedHeight;
if(!tblHeight)
{
var curTblHeight = el.getHeight();
var winHeight = Ext.getBody().getHeight();
var footer = Ext.fly('footerTbl');
var menuTD = Ext.fly('menuTD');
var compareEntities = Ext.fly('gs_compareEntities_' + this.taskId);
//var curDomHeight = footer.getHeight() + footer.getTop() ; //+ compareEntities.getHeight();
var curDomHeight = footer.getHeight() + menuTD.getBottom(false) + compareEntities.getHeight();
tblHeight = (winHeight - curDomHeight -20);// + curTblHeight);
if (tblHeight < 350)
{
tblHeight = 350;
}
}

logger.info("Table height: " + tblHeight);

gridObj.setSize({height: tblHeight});
el.setHeight(tblHeight);
};

this.renderDate = function(dateString, frmt)
{
try
{
var fmtDate = Date.parseDate(dateString, frmt);
if (fmtDate != undefined)
return fmtDate.format(frmt);
else
return Ext.util.Format.date(dateString, frmt);
}
catch(e)
{
return dateString;
}
};

this.checkGridDates = function(value)
{
if(value=='n' || value=='N')
{
this.setValue(new Date());
}
else if(value=='t' || value=='T')
{
var dte = new Date();
dte.setHours(00,00,00,00);
this.setValue(dte);
}
else
return true;
};

this.syncCompareGridWithState = function()
{
var parentObj = this;
if (this.isStateChanged)
{
this.stateJSON = Ext.util.JSON.decode(this.stateJSON) // Convert the JSON string to a JSON object.

var grid = this.grid;
var store = grid.getStore();
var gcColIndex = grid.getColumnModel().findColumnIndex('gc');
store.modified = [];

for (var i=0; i < parentObj.stateJSON.length; i++)
{
var row = parentObj.stateJSON[i]; // Each item in this JSON is a row.

var recIndex = store.findBy(function(rec){
if (rec.get('datagroup') === row.datagroup && rec.get('fieldLabel') === row.modifiedCol)
return true;
});

Ext.fly(grid.getView().getCell(recIndex, gcColIndex)).addClass('x-grid3-dirty-cell'); //Show the indicator that the cell has been edited.
}
}
};

this.showDifference = function()
{
var parentObj = this;
var store = this.ds;
var grid = this.grid;
var gcColIndex = grid.getColumnModel().findColumnIndex('gc');

store.each(function(rec)
{
var valuesDifferent = rec.get('valuesDifferent');
var lockStatus = rec.get('lock-status');
var rowIndex = store.indexOf(rec);
var elem = Ext.fly(grid.getView().getCell(rowIndex, gcColIndex));
if (valuesDifferent)
{
/*var index = store.indexOf(rec);

var rowElem = Ext.get(parentObj.grid.getView().getRow(index));
rowElem.addClass('gs_compareDiff');*/
var value = rec.get('fieldLabel');
value = "*" + value;
rec.set('fieldLabel', value);
}
if(lockStatus === 'ATTR')
{
elem.addClass('gs_locked');
}else if(lockStatus === 'PERP')
{
elem.addClass('gs_permlocked');
}else
{

elem.removeClass([ 'gs_locked', 'gs_permlocked']);

}

}
);
};

this.alignNumberFields = function()
{
var parentObj = this;

var store = this.ds;

store.each(function(rec)
{
var dataType = rec.get('dataType');
if (dataType === 'number')
{
var columnModel = parentObj.grid.getColumnModel();
var columnCount = columnModel.getColumnCount(true);
var gridView = parentObj.grid.getView();

for (var i = 0; i < columnCount; i++)
{
if (columnModel.getDataIndex(i) != 'fieldLabel')
{
gridView.getCell(rec.store.indexOf(rec), i).align = "right";
}
}
}
});
};

this.submitCompareState = function(params)
{
if(this.inDetailPage)
GS.submitFormPPR(this.formName, GS.noResponseId, params, null, false, false);
else
GS.submitFormPPR(this.formName, GS.noResponseId,
{event: params.event,
modifiedCol: params.modifiedCol,
colValue: params.colValue,
datagroup: params.datagroup,
recordId: params.recordId,
taskId: params.taskId
}, null, false, false);
};

this.adjustColumnWidths = function()
{
var minWidth = 100;
var maxWidth = 250;
var colWidth = 100;
var finalColWidth = 100;
var header = '';
var colValue = '';
var colModel = this.grid.getColumnModel();
var store = this.grid.getStore();
var rec;

var conversionFactor = 6;

/*var j = this.selectionType === 'none' ? 1 : 2;*/
for (var j = 0; j < this.columnModel.length; j++)
{
minWidth = 100;
maxWidth = 250;
colWidth = 100;
finalColWidth = 100;
var colConfig = colModel.getColumnById(colModel.getColumnId(j));

if (!colModel.isHidden(j)) // && !colConfig.userSetWidth
{
header = colModel.getColumnHeader(j);
colWidth = header.length *conversionFactor;

finalColWidth = colWidth;
/*if (colWidth < minWidth)
finalColWidth = minWidth;*/
if (colWidth > maxWidth)
finalColWidth = maxWidth;

for (i =0; i < store.getCount(); i++)
{
rec = store.getAt(i);
colValue = rec.get(colModel.getDataIndex(j));

// Check if it is a domval field.
/*if (colConfig.isDomValFld)
{
colValue = this.convertDomVal(colConfig.domValStore, colValue);
}*/

if (!colValue)
colValue = '';

colWidth = colValue.length *conversionFactor;

if (colWidth > finalColWidth)
finalColWidth = colWidth;

/*if (finalColWidth < minWidth)
finalColWidth = minWidth;*/
if (finalColWidth > maxWidth)
finalColWidth = maxWidth;

if (j === 0)
finalColWidth += 50;
}
finalColWidth += 70;
colModel.setColumnWidth(j, finalColWidth);
}
}
};

this.attachGridTooltips = function()
{
var grid = this.grid;
grid.tip = new Ext.ToolTip({
view: grid.getView(),
target: grid.getView().mainBody,
delegate: '.x-grid3-col',
trackMouse: true,
renderTo: document.body,
listeners: {
beforeshow: function updateTipBody(tip)
{
var rowIndex = tip.view.findRowIndex(tip.triggerElement);
var colIndex = tip.view.findCellIndex(tip.triggerElement);
var tTip = Ext.fly(tip.view.getCell(rowIndex, colIndex)).dom.innerHTML;

if (tTip.substring(tTip.indexOf('>') +1, tTip.lastIndexOf('</')) === '&nbsp;')
return false;

if (tTip.indexOf('<div class="ux-maximgb-tg-mastercell-wrap">') == 0)
tTip = Ext.util.Format.stripTags(tTip);

if (tTip === "" || tTip === "&nbsp;")
return false;

tip.body.dom.innerHTML = tTip;
}
}
});
};

this.showHideIcons = function(type, cellAction, records, action)
{
var record = undefined;

for (var i = 0; i < records.length; i++)
{
record = records[i];

var iconType = type+'-icon';
if(type === 'vddb' && record.get('vddbStatType')!= undefined && record.get('vddbStatType')!='')
iconType = type+record.get('vddbStatType')+'-icon';

if (action === 'hide')
{
if (record.get(cellAction) === iconType )
{
record.set(cellAction, 'hidden');
}
}
else
{
if (record.get(cellAction) === 'hidden')
record.set(cellAction, iconType);
}
}
}

this.initCompareGrid = function()
{
//create the dataStore:
var colMapping = new Array();
var i=0;
for(i=0; i<this.columnModel.length; i++)
{
colMapping[i]={'name': this.columnModel[i].dataIndex};
}

var storeUrl;
storeUrl = '../Finders/getCompareResults.vm?allowRedirect=false&taskId=' + this.mainTaskId + '&srchTaskId=' + this.taskId;

colMapping.push({name: '_id', type: 'int'});
colMapping.push({name: '_level', type: 'int'});
colMapping.push({name: '_lft', type: 'int'});
colMapping.push({name: '_rgt', type: 'int'});
colMapping.push({name: '_is_leaf', type: 'bool'});

this.currTime = new Date();
this.finishTime = undefined;
var record = Ext.data.Record.create(colMapping);
this.ds = new Ext.ux.maximgb.tg.NestedSetStore({
reader: new Ext.data.JsonReader({id: '_id'}, record),
proxy: new Ext.data.HttpProxy({
url: storeUrl,
onBeforeLoad: function(dataProxy, params)
{
parentObj.currTime = new Date();
logger.info('before load proxy: ' + currTime);
},
onLoad: function(dataProxy, reqTransObj, options)
{
parentObj.finishTime = new Date();
logger.info('after load proxy: ' + finishTime);
logger.info('time difference proxy: ' + (finishTime - currTime) + ' ms.');
}
})
});

this.renderCompareGrid();
};

this.renderCompareGrid = function()
{
var parentObj = this;
if (!this.cm)
{
this.cm = new Ext.grid.ColumnModel({
columns: this.columnModel,
editors: {
'string': new Ext.grid.GridEditor(new Ext.form.TextField({})),
'number': new Ext.grid.GridEditor(new Ext.form.NumberField({})),
'date': new Ext.grid.GridEditor(new Ext.form.DateField({format: 'd-M-Y'
, validator: this.checkGridDates
,enableKeyEvents : true
,listeners:{
keydown: function(f, e)
{
if (e.getKey() == e.DOWN)
f.onTriggerClick();
}
}
})),
'dateTime': new Ext.grid.GridEditor(new Ext.form.DateField({format: 'd-M-Y h:i:s A'
, validator: this.checkGridDates
,enableKeyEvents : true
,listeners:{
keydown: function(f, e)
{
if (e.getKey() == e.DOWN)
f.onTriggerClick();
}
}
}))
},
moveColumn: function(oldIndex, newIndex)
{
if (oldIndex != 0 && newIndex != 0)
{
var c = this.config[oldIndex];
this.config.splice(oldIndex, 1);
this.config.splice(newIndex, 0, c);
this.dataMap = null;
this.fireEvent("columnmoved", this, oldIndex, newIndex);
}
},
getCellEditor: function(colIndex, rowIndex)
{
var rec = parentObj.ds.getAt(rowIndex);

if (rec.get('readOnly') === true)
return false;

var dataType = rec.get('dataType');
var fieldName = rec.get('fieldName');

if (dataType != 'dropDown' && dataType != 'customDropDown' && dataType != 'string')
{
if (dataType === 'date')
{
this.setRenderer(colIndex, function (data)
{
return parentObj.renderDate(data, 'd-M-Y');
});
}
else if (dataType === 'dateTime')
{
this.setRenderer(colIndex, function (data)
{
return parentObj.renderDate(data, 'd-M-Y h:i:s A');
});
}
return this.editors[dataType];
}
else
{
if (dataType === 'string' && !rec.get('hasValidValues'))
return this.editors[dataType];

this.setRenderer(colIndex, function(data)
{
if (parentObj.storeList[fieldName])
{
var record = parentObj.storeList[fieldName].getById(data);
if(record)
{
return record.data.text;
}
else
{
return data;
}
}
}
);
var comboStore;
var domValFld = '';
if (dataType === 'customDropDown')
{
domValFld = rec.get('customDomVal');
}
else
{
domValFld = fieldName;
}

if (!parentObj.storeList[fieldName])
{
var domValURL = '../Finders/getDomVals.vm?allowRedirect=false&taskId=' + parentObj.mainTaskId + '&srchTaskId=' + parentObj.taskId + '&domValFld=' + domValFld;

if (rec.get('hasValidValues'))
domValURL = '../Finders/getValidVals.vm?allowRedirect=false&taskId=' + parentObj.mainTaskId + '&compareTaskId=' + parentObj.taskId + '&domValFld=' + rec.get('fullName');

comboStore = new Ext.data.Store(
{
proxy: new Ext.data.HttpProxy({
url: domValURL
}),
reader: new Ext.data.JsonReader(
{root: 'options', id: 'value'},
[
{name: 'text'},
{name: 'value'}
]
)
}
);
comboStore.load();
parentObj.storeList[fieldName] = comboStore;
}
else
{
comboStore = parentObj.storeList[fieldName];
}

return new Ext.grid.GridEditor(new Ext.form.ComboBox({
allowBlank: true,
store: comboStore,
displayField:'text',
valueField: 'value',
lazyInit: false,
lazyRender:false,
typeAhead:false,
triggerAction: 'all',
editable: false,
forceSelection:true,
loadingText: 'Fetching list...',
emptyText:'Select...',
resizable:true}));
}
return Ext.grid.ColumnModel.prototype.getCellEditor(this, colIndex, rowIndex);
}
});
}

this.cellActions = new Ext.ux.grid.CellActions({
listeners:{
action:function(grid, record, action, value)
{
if (action === 'vddbgreen-icon' || action === 'vddbyellow-icon' || action === 'vddbred-icon')
{
var fieldName = record.get('fieldName');
var tableName = fieldName.substring(0, fieldName.indexOf('.'));
fieldName = fieldName.substring(fieldName.indexOf() +1);
loadJS('mainForm',
{
event: 'openLookup',
lookupType: 'CompareVDDB',
oid: record.get('oid'),
lookupFields: fieldName,
tableName: tableName
});
}
else if (action === 'cdc-icon')
{
var fieldName = record.get('fieldName');
var tableName = fieldName.substring(0, fieldName.indexOf('.'));
fieldName = fieldName.substring(fieldName.indexOf() +1);
loadJS('mainForm',
{
event: 'openLookup',
lookupType: 'CompareCDC',
oid: record.get('oid'),
lookupFields: fieldName,
tableName: tableName
});
}
else if (action === 'chal-icon')
{
/*loadJS('mainForm',
{
event:'openLookup',
lookupId:'ft_t_chal',
lookupType:'CHAL',
'lookupCondition':"chal_oid='" + record.get('chal-oid') + "'",
'searchSettings':'autoExecute:true,lookupInWindow:true'
});*/

window.open("../Finders/Lookup.vm?event=openLookup&lookupType=CHAL&lookupId=ft_t_chal&lookupCondition=chal_oid='" + record.get('chal-oid') + "'&searchSettings=autoExecute:true");
}
else if(action === 'fvsh-icon')
{
loadJS('mainForm',
{
event:'openLookup',
lookupId:'fvshLookup',
lookupType:'VDDB',
'showStartQueryButton':'false',
'showClearButton':'false',
'showConfigScreen':'false',
'showCancelButton':'false',
'allowPersistence':'false',
'lookupType':'null',
'lookupCondition':" ft_t_fvsh.tbl_id='"+record.get('table_id') +"'and ft_t_fvsh.col_nme in ('"+ record.get('col_name')+"') and VSH_TBL_KEY_TXT='"+record.get('fvsh-oid')+"' ",
'searchSettings':'autoExecute:true,lookupInWindow:true'});
}
}
},
align:'right'
});

this.grid = new Ext.ux.maximgb.tg.EditorGridPanel({
store: this.ds,
master_column_id : 'fieldLabel',
plugins: this.cellActions,
autoScroll: true,
clicksToEdit: 1,
cm: this.cm,
viewConfig: {hideGroupedColumn: true, forceFit: true},
title: this.gridTitle,
iconCls: 'icon-grid',
el: this.containerEl,
stateful: false,
autoExpandColumn: 'fieldLabel',
tools:[{
id: 'hideVDDB',
hidden: true,
qtip: 'Hide VDDB Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('vddb', 'action1', store.getRange(), 'hide');
Ext.fly(parentObj.grid.tools.hideVDDB).hide();
Ext.fly(parentObj.grid.tools.showVDDB).show(true);
}
},{
id: 'showVDDB',
hidden: false,
qtip: 'Show VDDB Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('vddb', 'action1', store.getRange(), 'show');
Ext.fly(parentObj.grid.tools.showVDDB).hide();
Ext.fly(parentObj.grid.tools.hideVDDB).show(true);
}
},{
id: 'hideCDC',
hidden: true,
qtip: 'Hide CDC Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('cdc', 'action2', store.getRange(), 'hide');
Ext.fly(parentObj.grid.tools.hideCDC).hide();
Ext.fly(parentObj.grid.tools.showCDC).show(true);
}
},{
id: 'showCDC',
hidden: false,
qtip: 'Show CDC Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('cdc', 'action2', store.getRange(), 'show');
Ext.fly(parentObj.grid.tools.showCDC).hide();
Ext.fly(parentObj.grid.tools.hideCDC).show(true);
}
},{
id: 'hideCHAL',
hidden: true,
qtip: 'Hide CHAL Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('chal', 'action3', store.getRange(), 'hide');
Ext.fly(parentObj.grid.tools.hideCHAL).hide();
Ext.fly(parentObj.grid.tools.showCHAL).show(true);
}
},{
id: 'showCHAL',
hidden: false,
qtip: 'Show CHAL Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('chal', 'action3', store.getRange(), 'show');
Ext.fly(parentObj.grid.tools.showCHAL).hide();
Ext.fly(parentObj.grid.tools.hideCHAL).show(true);
}
},{
id: 'hideFVSH',
hidden: true,
qtip: 'Hide FVSH Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('fvsh', 'action4', store.getRange(), 'hide');
Ext.fly(parentObj.grid.tools.hideFVSH).hide();
Ext.fly(parentObj.grid.tools.showFVSH).show(true);
}
},{
id: 'showFVSH',
hidden: false,
qtip: 'Show FVSH Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('fvsh', 'action4', store.getRange(), 'show');
Ext.fly(parentObj.grid.tools.showFVSH).hide();
Ext.fly(parentObj.grid.tools.hideFVSH).show(true);
}
},
{
id: 'expand',
hidden: false,
qtip: 'Expand All',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
store.expandAll();
/*Ext.fly(parentObj.grid.tools.expand).hide();
Ext.fly(parentObj.grid.tools.collapse).show(true);*/
}
},{
id: 'collapse',
hidden: false,
qtip: 'Collapse All',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
store.collapseAll();
/*Ext.fly(parentObj.grid.tools.collapse).hide();
Ext.fly(parentObj.grid.tools.expand).show(true);*/
}
}]
});

this.grid.render();
//this.adjustGridSize();
this.ds.on("beforeload", function(store, options)
{
parentObj.grid.getEl().mask("Populating grid...");
});

this.ds.on("load", function(store, records, options)
{
parentObj.grid.getEl().unmask();
});

this.currTime = new Date();
logger.info('before loading: ' + this.currTime);
this.ds.load({callback: function (records, options, success)
{
var finishTime = new Date();
logger.info('after loading: ' + finishTime);
logger.info("Time to load data: " + (finishTime - parentObj.currTime) + " ms.");
/*parentObj.syncCompareGridWithState();
parentObj.showDifference();
//parentObj.alignNumberFields();
parentObj.adjustColumnWidths();
parentObj.attachGridTooltips();*/
}});

this.grid.on('validateedit',
function(editObj)
{
if (editObj.value.dateFormat)
{
if (editObj.value.dateFormat('d-M-Y h:i:s A') === editObj.originalValue)
editObj.cancel = true;
else if (editObj.value.dateFormat('h:i:s A') === editObj.originalValue)
editObj.cancel = true;
}
else if ((editObj.originalValue === null && editObj.value === "") || (editObj.value === editObj.originalValue))
editObj.cancel = true;
}
);

this.grid.on("columnmove", function(oldIndex, newIndex)
{
parentObj.showDifference();
//parentObj.alignNumberFields();
}
);

this.grid.on("cellclick", function(grid, rowIndex, colIndex, evtObj)
{
var store = grid.getStore();
var record = store.getAt(rowIndex);

if (record.get("_is_leaf") === false)
{
if (store.isExpandedNode(record))
store.collapseNode(record);
else
store.expandNode(record);

Ext.get(grid.getView().getCell(rowIndex, colIndex)).removeClass('x-grid3-cell-selected');
}
else
return true;
});

this.grid.on("cellcontextmenu", function(grid, rowIndex, cellIndex, ev)
{
//innerHtml.substring(innerHtml.indexOf('>') +1, innerHtml.lastIndexOf('<'))
ev.stopEvent();
var rec = parentObj.ds.getAt(rowIndex);

if (rec.get("_is_leaf") != false)
{
var coords = ev.getXY();

//var cell = grid.getView().getCell(rowIndex, cellIndex);
var gcColIndex = grid.getColumnModel().findColumnIndex('gc');
if (cellIndex != 0 && cellIndex != gcColIndex)
{
var menu = new Ext.menu.Menu({
id: 'compareCtxtMenu'
});
menu.on("hide", function(menuComponent){
Ext.get(grid.getView().getCell(rowIndex, cellIndex)).removeClass('gs_focusCell');
menuComponent.destroy();

});
menu.addMenuItem({text: 'Copy To GC'}).
setHandler(function(item, ev){
/*var innerHtml = grid.getView().getCell(rowIndex, cellIndex).innerHTML;
var text = innerHtml.substring(innerHtml.indexOf('>') +1, innerHtml.lastIndexOf('<'));

var gcColIndex = grid.getColumnModel().findColumnIndex('gc');
var gcInnerHTML = grid.getView().getCell(rowIndex, gcColIndex).innerHTML;
gcInnerHTML = gcInnerHTML.substring(0, gcInnerHTML.indexOf('>') +1) + text + gcInnerHTML.substring(gcInnerHTML.lastIndexOf('<'));
grid.getView().getCell(rowIndex, gcColIndex).innerHTML = gcInnerHTML;
grid.getView().focusCell(rowIndex, cellIndex);*/
var cm = grid.getColumnModel();
var data = rec.get(cm.getColumnById(cm.getColumnId(cellIndex)).dataIndex);
rec.data['gc'] = data;
rec.commit();
var elem = Ext.get(grid.getView().getCell(rowIndex, gcColIndex));
var lockStatus = rec.get('lock-status');
Ext.fly(grid.getView().getCell(rowIndex, gcColIndex)).frame("E31014", 1, { duration: 1 });
Ext.fly(grid.getView().getCell(rowIndex, gcColIndex)).addClass('x-grid3-dirty-cell'); //Show the indicator that the cell has been edited.

var from = cm.getColumnById(cm.getColumnId(cellIndex)).dataIndex;
var datagroup = rec.get('datagroup');
var fieldName = rec.get('fieldLabel');
var path = rec.id;
if(lockStatus === 'ATTR')
{
elem.addClass('gs_locked');
}
else if(lockStatus === 'PERP')
{
elem.addClass('gs_permlocked');
}else
{
elem.removeClass([ 'gs_locked', 'gs_permlocked']);
}
if(parentObj.inDetailPage)
GS.submitFormPPR(parentObj.formName, GS.noResponseId,
{event: 'copyToGC',
from: from,
path :path,
fld_value : data,
dataGroup: datagroup,
fld_nme: fieldName.replace("*",""),
srchTaskId: taskId,
taskId: mainTaskId
}, null, false, false);
else
GS.submitFormPPR(parentObj.formName, GS.noResponseId,
{event: 'copyToGC',
from: from,
fld_value : data,
path:path,
dataGroup: datagroup,
fld_nme: fieldName.replace("*",""),
taskId: taskId
}, null, false, false);


});




Ext.get(grid.getView().getCell(rowIndex, cellIndex)).addClass('gs_focusCell');
menu.showAt([coords[0], coords[1]]);
}
}
});

this.grid.on('afteredit',
function(editObj)
{
//editObj properties: grid, record, field, value, originalValue, row, column
var rec = parentObj.ds.getAt(editObj.row);
var path = rec.id;
var lockStatus = rec.get('lock-status');
var fieldName = rec.get('fieldLabel');
var datagroup = rec.get('datagroup');
var editedValue = "" + editObj.value;
var rowIndex = editObj.row;
var gcColIndex = editObj.grid.getColumnModel().findColumnIndex('gc');
var elem = Ext.get(editObj.grid.getView().getCell(rowIndex, gcColIndex));
if(lockStatus === 'ATTR')
{
elem.addClass('gs_locked');
}else if(lockStatus === 'PERP')
{
elem.addClass('gs_permlocked');
}else
{

elem.removeClass([ 'gs_locked', 'gs_permlocked']);

}
parentObj.submitCompareState(
{event: 'saveCompareState',
modifiedCol: fieldName.replace("*",""),
colValue: editedValue,
datagroup: datagroup,
recordId: path,
srchTaskId: parentObj.taskId,
taskId: parentObj.mainTaskId
});
}
);
};
this.init();
}

showHideCompareCriteria = function(hideOnly, formName, taskId, criteriaExpanded)
{
if(hideOnly && !criteriaExpanded)
return true;

var compareCritElem = Ext.fly('gs_compareEntities_' + this.taskId);

if (compareCritElem != undefined) //Can be undefined if 'showCriteria' is set to false.
{
toggleSection('gs_compareEntities_' + taskId, formName, null, null, null, taskId);
criteriaExpanded = !criteriaExpanded;
}
return false;
}

Ext.override(Ext.ToolTip, {
dismissDelay: 10000,
onTargetOver : function(e){
if(this.disabled || e.within(this.target.dom, true)){
return;
}
var t = e.getTarget(this.delegate);
if (t) {
this.triggerElement = t;
this.clearTimer('hide');
this.targetXY = e.getXY();
this.delayShow();
}
},
onMouseMove : function(e){
var t = e.getTarget(this.delegate);
if (t) {
this.targetXY = e.getXY();
if (t === this.triggerElement) {
if(!this.hidden && this.trackMouse){
this.setPagePosition(this.getTargetXY());
}
} else {
this.hide();
this.lastActive = new Date(0);
this.onTargetOver(e);
}
} else if (!this.closable && this.isVisible()) {
this.hide();
}
},
hide: function(){
this.clearTimer('dismiss');
this.lastActive = new Date();
delete this.triggerElement;
Ext.ToolTip.superclass.hide.call(this);
}
});


Could you please help me out here or point me in the right direction?

shr1975
11 Jun 2010, 5:51 AM
Here's the JSON string that this grid is populated with:


[{fieldLabel:'BulkData','_id':'.BulkData[31848364]','_parent':'null','_level':1,'_lft':1,'_rgt':10000,'_is_leaf':false},
{fieldLabel:'CapitalChanges',gc:'',gc1:'',valuesDifferent:false,datagroup:'BulkData',dataType:'string',businessEntityFieldName:'CapitalChanges',fieldName:'CapitalChanges', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.CapitalChanges', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.BulkData[31848364].capitalchanges[0]', '_parent':'.BulkData[31848364]', '_level':2, '_lft':2, '_rgt':102, '_is_leaf':true},
{fieldLabel:'SharesOutstandingHistory',gc:'',gc1:'',valuesDifferent:false,datagroup:'BulkData',dataType:'string',businessEntityFieldName:'SharesOutstandingHistory',fieldName:'SharesOutstandingHistory', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.SharesOutstandingHistory', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.BulkData[31848364].sharesoutstandinghistory[0]', '_parent':'.BulkData[31848364]', '_level':2, '_lft':103, '_rgt':202, '_is_leaf':true},
{fieldLabel:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[2787042]','_parent':'.BulkData[31848364]','_level':2,'_lft':203,'_rgt':302,'_is_leaf':false},
{fieldLabel:'EndDate',gc:'',dataType:'dateTime',fieldName:'FT_T_ISID.END_TMS',businessEntityFieldName:'EndDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[2787042].enddate', '_parent':'.BulkData[31848364].IdentifierHistory[2787042]', '_level':3, '_lft':204, '_rgt':214,'gc1':'', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.EndDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'StartDate',gc:'19-May-2010 12:00:00 AM',dataType:'dateTime',fieldName:'FT_T_ISID.START_TMS',businessEntityFieldName:'StartDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[2787042].startdate', '_parent':'.BulkData[31848364].IdentifierHistory[2787042]', '_level':3, '_lft':215, '_rgt':219,'gc1':'', oid: 'ISID_OID:*L9201sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.StartDate', hasValidValues: false, 'lock-status': 'ATTR', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierType',gc:'CUSIP Number',dataType:'dropDown',fieldName:'FT_T_ISID.ID_CTXT_TYP',businessEntityFieldName:'IdentifierType',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[2787042].identifiertype', '_parent':'.BulkData[31848364].IdentifierHistory[2787042]', '_level':3, '_lft':220, '_rgt':224,'gc1':'', oid: 'ISID_OID:*L9201sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.IdentifierType', hasValidValues: true, 'lock-status': 'ATTR', readOnly: false,'_is_leaf':true},
{fieldLabel:'Identifier',gc:'02225AM66',dataType:'string',fieldName:'FT_T_ISID.ISS_ID',businessEntityFieldName:'Identifier',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[2787042].identifier', '_parent':'.BulkData[31848364].IdentifierHistory[2787042]', '_level':3, '_lft':225, '_rgt':229,'gc1':'', oid: 'ISID_OID:*L9201sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.Identifier', hasValidValues: false, 'lock-status': 'PERP', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[31925950]','_parent':'.BulkData[31848364]','_level':2,'_lft':303,'_rgt':402,'_is_leaf':false},
{fieldLabel:'EndDate',gc:'',dataType:'dateTime',fieldName:'FT_T_ISID.END_TMS',businessEntityFieldName:'EndDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[31925950].enddate', '_parent':'.BulkData[31848364].IdentifierHistory[31925950]', '_level':3, '_lft':304, '_rgt':304,'gc1':'', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.EndDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'StartDate',gc:'19-May-2010 12:00:00 AM',dataType:'dateTime',fieldName:'FT_T_ISID.START_TMS',businessEntityFieldName:'StartDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[31925950].startdate', '_parent':'.BulkData[31848364].IdentifierHistory[31925950]', '_level':3, '_lft':305, '_rgt':309,'gc1':'', oid: 'ISID_OID:*L9301sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.StartDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierType',gc:'ISIN ID Number',dataType:'dropDown',fieldName:'FT_T_ISID.ID_CTXT_TYP',businessEntityFieldName:'IdentifierType',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[31925950].identifiertype', '_parent':'.BulkData[31848364].IdentifierHistory[31925950]', '_level':3, '_lft':310, '_rgt':314,'gc1':'', oid: 'ISID_OID:*L9301sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.IdentifierType', hasValidValues: true, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'Identifier',gc:'AT0000307699',dataType:'string',fieldName:'FT_T_ISID.ISS_ID',businessEntityFieldName:'Identifier',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[31925950].identifier', '_parent':'.BulkData[31848364].IdentifierHistory[31925950]', '_level':3, '_lft':315, '_rgt':319,'gc1':'', oid: 'ISID_OID:*L9301sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.Identifier', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[14429677]','_parent':'.BulkData[31848364]','_level':2,'_lft':403,'_rgt':502,'_is_leaf':false},
{fieldLabel:'EndDate',gc:'',dataType:'dateTime',fieldName:'FT_T_ISID.END_TMS',businessEntityFieldName:'EndDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[14429677].enddate', '_parent':'.BulkData[31848364].IdentifierHistory[14429677]', '_level':3, '_lft':404, '_rgt':404,'gc1':'', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.EndDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'StartDate',gc:'19-May-2010 12:00:00 AM',dataType:'dateTime',fieldName:'FT_T_ISID.START_TMS',businessEntityFieldName:'StartDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[14429677].startdate', '_parent':'.BulkData[31848364].IdentifierHistory[14429677]', '_level':3, '_lft':405, '_rgt':409,'gc1':'', oid: 'ISID_OID:*L9401sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.StartDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierType',gc:'Valoren Number',dataType:'dropDown',fieldName:'FT_T_ISID.ID_CTXT_TYP',businessEntityFieldName:'IdentifierType',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[14429677].identifiertype', '_parent':'.BulkData[31848364].IdentifierHistory[14429677]', '_level':3, '_lft':410, '_rgt':414,'gc1':'', oid: 'ISID_OID:*L9401sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.IdentifierType', hasValidValues: true, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'Identifier',gc:'119114',dataType:'string',fieldName:'FT_T_ISID.ISS_ID',businessEntityFieldName:'Identifier',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[14429677].identifier', '_parent':'.BulkData[31848364].IdentifierHistory[14429677]', '_level':3, '_lft':415, '_rgt':419,'gc1':'', oid: 'ISID_OID:*L9401sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.Identifier', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[4827936]','_parent':'.BulkData[31848364]','_level':2,'_lft':503,'_rgt':602,'_is_leaf':false},
{fieldLabel:'EndDate',gc:'',dataType:'dateTime',fieldName:'FT_T_ISID.END_TMS',businessEntityFieldName:'EndDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[4827936].enddate', '_parent':'.BulkData[31848364].IdentifierHistory[4827936]', '_level':3, '_lft':504, '_rgt':504,'gc1':'', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.EndDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'StartDate',gc:'',dataType:'dateTime',fieldName:'FT_T_ISID.START_TMS',businessEntityFieldName:'StartDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[4827936].startdate', '_parent':'.BulkData[31848364].IdentifierHistory[4827936]', '_level':3, '_lft':505, '_rgt':509,'gc1':'19-May-2010 12:00:00 AM', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.StartDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierType',gc:'',dataType:'dropDown',fieldName:'FT_T_ISID.ID_CTXT_TYP',businessEntityFieldName:'IdentifierType',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[4827936].identifiertype', '_parent':'.BulkData[31848364].IdentifierHistory[4827936]', '_level':3, '_lft':510, '_rgt':514,'gc1':'CUSIP Number', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.IdentifierType', hasValidValues: true, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'Identifier',gc:'',dataType:'string',fieldName:'FT_T_ISID.ISS_ID',businessEntityFieldName:'Identifier',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[4827936].identifier', '_parent':'.BulkData[31848364].IdentifierHistory[4827936]', '_level':3, '_lft':515, '_rgt':519,'gc1':'03832LJJ1', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.Identifier', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[8516156]','_parent':'.BulkData[31848364]','_level':2,'_lft':603,'_rgt':702,'_is_leaf':false},
{fieldLabel:'EndDate',gc:'',dataType:'dateTime',fieldName:'FT_T_ISID.END_TMS',businessEntityFieldName:'EndDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[8516156].enddate', '_parent':'.BulkData[31848364].IdentifierHistory[8516156]', '_level':3, '_lft':604, '_rgt':604,'gc1':'', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.EndDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'StartDate',gc:'',dataType:'dateTime',fieldName:'FT_T_ISID.START_TMS',businessEntityFieldName:'StartDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[8516156].startdate', '_parent':'.BulkData[31848364].IdentifierHistory[8516156]', '_level':3, '_lft':605, '_rgt':609,'gc1':'19-May-2010 12:00:00 AM', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.StartDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierType',gc:'',dataType:'dropDown',fieldName:'FT_T_ISID.ID_CTXT_TYP',businessEntityFieldName:'IdentifierType',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[8516156].identifiertype', '_parent':'.BulkData[31848364].IdentifierHistory[8516156]', '_level':3, '_lft':610, '_rgt':614,'gc1':'ISIN ID Number', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.IdentifierType', hasValidValues: true, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'Identifier',gc:'',dataType:'string',fieldName:'FT_T_ISID.ISS_ID',businessEntityFieldName:'Identifier',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[8516156].identifier', '_parent':'.BulkData[31848364].IdentifierHistory[8516156]', '_level':3, '_lft':615, '_rgt':619,'gc1':'ES0144580018', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.Identifier', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[21388569]','_parent':'.BulkData[31848364]','_level':2,'_lft':703,'_rgt':802,'_is_leaf':false},
{fieldLabel:'EndDate',gc:'',dataType:'dateTime',fieldName:'FT_T_ISID.END_TMS',businessEntityFieldName:'EndDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[21388569].enddate', '_parent':'.BulkData[31848364].IdentifierHistory[21388569]', '_level':3, '_lft':704, '_rgt':704,'gc1':'', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.EndDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'StartDate',gc:'',dataType:'dateTime',fieldName:'FT_T_ISID.START_TMS',businessEntityFieldName:'StartDate',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[21388569].startdate', '_parent':'.BulkData[31848364].IdentifierHistory[21388569]', '_level':3, '_lft':705, '_rgt':709,'gc1':'19-May-2010 12:00:00 AM', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.StartDate', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'IdentifierType',gc:'',dataType:'dropDown',fieldName:'FT_T_ISID.ID_CTXT_TYP',businessEntityFieldName:'IdentifierType',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[21388569].identifiertype', '_parent':'.BulkData[31848364].IdentifierHistory[21388569]', '_level':3, '_lft':710, '_rgt':714,'gc1':'Valoren Number', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.IdentifierType', hasValidValues: true, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'Identifier',gc:'',dataType:'string',fieldName:'FT_T_ISID.ISS_ID',businessEntityFieldName:'Identifier',datagroup:'IdentifierHistory','_id':'.BulkData[31848364].IdentifierHistory[21388569].identifier', '_parent':'.BulkData[31848364].IdentifierHistory[21388569]', '_level':3, '_lft':715, '_rgt':719,'gc1':'350485', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.IdentifierHistory.Identifier', hasValidValues: false, 'lock-status': '', readOnly: false,'_is_leaf':true},
{fieldLabel:'OtherActions',gc:'',gc1:'',valuesDifferent:false,datagroup:'BulkData',dataType:'string',businessEntityFieldName:'OtherActions',fieldName:'OtherActions', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.OtherActions', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.BulkData[31848364].otheractions[1]', '_parent':'.BulkData[31848364]', '_level':2, '_lft':803, '_rgt':902, '_is_leaf':true},
{fieldLabel:'DividendPaymentHistory',gc:'',gc1:'',valuesDifferent:false,datagroup:'BulkData',dataType:'string',businessEntityFieldName:'DividendPaymentHistory',fieldName:'DividendPaymentHistory', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.DividendPaymentHistory', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.BulkData[31848364].dividendpaymenthistory[1]', '_parent':'.BulkData[31848364]', '_level':2, '_lft':903, '_rgt':1002, '_is_leaf':true},
{fieldLabel:'Earnings',gc:'',gc1:'',valuesDifferent:false,datagroup:'BulkData',dataType:'string',businessEntityFieldName:'Earnings',fieldName:'Earnings', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.BulkData.Earnings', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.BulkData[31848364].earnings[1]', '_parent':'.BulkData[31848364]', '_level':2, '_lft':1003, '_rgt':1102, '_is_leaf':true},
{fieldLabel:'Settlement','_id':'settlement[0]','_parent':null,'_level':1,'_lft':10001,'_rgt':20000,'_is_leaf':false},
{fieldLabel:'TransferAgent',gc:'',gc1:'',valuesDifferent:false,datagroup:'Settlement',dataType:'string',businessEntityFieldName:'TransferAgent',fieldName:'FT_T_ISCM.CMNT_TXT', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.Settlement.TransferAgent', readOnly: false, 'lock-status': '', '_id':'.Settlement[0].transferagent[0]', '_parent':'.Settlement[0]', '_level':2, '_lft':10002, '_rgt':10102, '_is_leaf':true},
{fieldLabel:'DTCEligibleFlag',gc:'',gc1:'',valuesDifferent:false,datagroup:'Settlement',dataType:'string',businessEntityFieldName:'DTCEligibleFlag',fieldName:'FT_T_ISST.STAT_CHAR_VAL_TXT', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.Settlement.DTCEligibleFlag', readOnly: false, 'lock-status': '', '_id':'.Settlement[0].dtceligibleflag[0]', '_parent':'.Settlement[0]', '_level':2, '_lft':10103, '_rgt':10202, '_is_leaf':true},
{fieldLabel:'InstrumentForm',gc:'',gc1:'',valuesDifferent:false,datagroup:'Settlement',dataType:'dropDown',businessEntityFieldName:'InstrumentForm',fieldName:'FT_T_ISSU.SEC_FORM_TYP', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.Settlement.InstrumentForm', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.Settlement[0].instrumentform[0]', '_parent':'.Settlement[0]', '_level':2, '_lft':10203, '_rgt':10302, '_is_leaf':true},
{fieldLabel:'RelatedInstrument','_id':'relatedinstrument[0]','_parent':null,'_level':1,'_lft':20001,'_rgt':30000,'_is_leaf':false},
{fieldLabel:'RelatedDetails','_id':'.RelatedDetails[0]','_parent':'','_level':2,'_lft':20002,'_rgt':20102,'_is_leaf':false},
{fieldLabel:'IdentifierInformation',gc:'',gc1:'',valuesDifferent:false,datagroup:'RelatedDetails',dataType:'string',businessEntityFieldName:'IdentifierInformation',fieldName:'IdentifierInformation', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.RelatedInstrument.RelatedDetails.IdentifierInformation', readOnly: false, 'lock-status': '', '_id':'.RelatedDetails[0].identifierinformation[0]', '_parent':'.RelatedDetails[0]', '_level':3, '_lft':20003, '_rgt':20003, '_is_leaf':true},
{fieldLabel:'DummyField1',gc:'',gc1:'',valuesDifferent:false,datagroup:'RelatedDetails',dataType:'string',businessEntityFieldName:'DummyField1',fieldName:'DummyField1', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.RelatedInstrument.RelatedDetails.DummyField1', readOnly: false, 'lock-status': '', '_id':'.RelatedDetails[0].dummyfield1[0]', '_parent':'.RelatedDetails[0]', '_level':3, '_lft':20004, '_rgt':20008, '_is_leaf':true},
{fieldLabel:'ParticipantRoleType',gc:'',gc1:'',valuesDifferent:false,datagroup:'RelatedDetails',dataType:'dropDown',businessEntityFieldName:'ParticipantRoleType',fieldName:'FT_T_RISS.ISS_PART_RL_TYP', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.RelatedInstrument.RelatedDetails.ParticipantRoleType', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.RelatedDetails[0].participantroletype[0]', '_parent':'.RelatedDetails[0]', '_level':3, '_lft':20009, '_rgt':20013, '_is_leaf':true},
{fieldLabel:'RelatedInstrumentName',gc:'',gc1:'',valuesDifferent:false,datagroup:'RelatedDetails',dataType:'dropDown',businessEntityFieldName:'RelatedInstrumentName',fieldName:'FT_T_ISSU.PREF_ISS_NME', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.RelatedInstrument.RelatedDetails.RelatedInstrumentName', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.RelatedDetails[0].relatedinstrumentname[0]', '_parent':'.RelatedDetails[0]', '_level':3, '_lft':20014, '_rgt':20018, '_is_leaf':true},
{fieldLabel:'DummyField',gc:'',gc1:'',valuesDifferent:false,datagroup:'RelatedInstrument',dataType:'dateTime',businessEntityFieldName:'DummyField',fieldName:'DummyField', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.RelatedInstrument.DummyField', readOnly: false, 'lock-status': '', '_id':'.RelatedInstrument[0].dummyfield[0]', '_parent':'.RelatedInstrument[0]', '_level':2, '_lft':20103, '_rgt':20202, '_is_leaf':true},
{fieldLabel:'RelationshipType',gc:'',gc1:'',valuesDifferent:false,datagroup:'RelatedInstrument',dataType:'dropDown',businessEntityFieldName:'RelationshipType',fieldName:'FT_T_RIDF.REL_TYP', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.RelatedInstrument.RelationshipType', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.RelatedInstrument[0].relationshiptype[0]', '_parent':'.RelatedInstrument[0]', '_level':2, '_lft':20203, '_rgt':20302, '_is_leaf':true},
{fieldLabel:'RelatedDetails',gc:'',gc1:'',valuesDifferent:false,datagroup:'RelatedInstrument',dataType:'string',businessEntityFieldName:'RelatedDetails',fieldName:'RelatedDetails', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.RelatedInstrument.RelatedDetails', readOnly: false, 'lock-status': '', '_id':'.RelatedInstrument[0].relateddetails[0]', '_parent':'.RelatedInstrument[0]', '_level':2, '_lft':20303, '_rgt':20402, '_is_leaf':true},
{fieldLabel:'DepositoryReceiptInformation','_id':'depositoryreceiptinformation[0]','_parent':null,'_level':1,'_lft':30001,'_rgt':40000,'_is_leaf':false},
{fieldLabel:'DepositoryReceiptsPerShare',gc:'',gc1:'',valuesDifferent:false,datagroup:'DepositoryReceiptInformation',dataType:'number',businessEntityFieldName:'DepositoryReceiptsPerShare',fieldName:'FT_T_RIST.ADR_SHR_CRTE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.DepositoryReceiptInformation.DepositoryReceiptsPerShare', readOnly: false, 'lock-status': '', '_id':'.DepositoryReceiptInformation[0].depositoryreceiptspershare[0]', '_parent':'.DepositoryReceiptInformation[0]', '_level':2, '_lft':30002, '_rgt':30102, '_is_leaf':true},
{fieldLabel:'SharesPerDepositoryReceipt',gc:'',gc1:'',valuesDifferent:false,datagroup:'DepositoryReceiptInformation',dataType:'number',businessEntityFieldName:'SharesPerDepositoryReceipt',fieldName:'FT_T_RIST.SHR_ADR_CRTE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.DepositoryReceiptInformation.SharesPerDepositoryReceipt', readOnly: false, 'lock-status': '', '_id':'.DepositoryReceiptInformation[0].sharesperdepositoryreceipt[0]', '_parent':'.DepositoryReceiptInformation[0]', '_level':2, '_lft':30103, '_rgt':30202, '_is_leaf':true},
{fieldLabel:'IssuerRatings','_id':'issuerratings[0]','_parent':null,'_level':1,'_lft':40001,'_rgt':50000,'_is_leaf':false},
{fieldLabel:'SnPIssuerRatingLong',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerRatings',dataType:'string',businessEntityFieldName:'SnPIssuerRatingLong',fieldName:'FT_T_IRRT.RTNG_CDE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerRatings.SnPIssuerRatingLong', readOnly: true, 'lock-status': '', '_id':'.IssuerRatings[0].snpissuerratinglong[0]', '_parent':'.IssuerRatings[0]', '_level':2, '_lft':40002, '_rgt':40102, '_is_leaf':true},
{fieldLabel:'FitchIssuerRatingLong',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerRatings',dataType:'string',businessEntityFieldName:'FitchIssuerRatingLong',fieldName:'FT_T_IRRT.RTNG_CDE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerRatings.FitchIssuerRatingLong', readOnly: true, 'lock-status': '', '_id':'.IssuerRatings[0].fitchissuerratinglong[0]', '_parent':'.IssuerRatings[0]', '_level':2, '_lft':40103, '_rgt':40202, '_is_leaf':true},
{fieldLabel:'MoodysIssuerRatingLongDate',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerRatings',dataType:'dateTime',businessEntityFieldName:'MoodysIssuerRatingLongDate',fieldName:'FT_T_IRRT.START_TMS', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerRatings.MoodysIssuerRatingLongDate', readOnly: true, 'lock-status': '', '_id':'.IssuerRatings[0].moodysissuerratinglongdate[0]', '_parent':'.IssuerRatings[0]', '_level':2, '_lft':40203, '_rgt':40302, '_is_leaf':true},
{fieldLabel:'SnPIssuerRatingLongDate',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerRatings',dataType:'dateTime',businessEntityFieldName:'SnPIssuerRatingLongDate',fieldName:'FT_T_IRRT.START_TMS', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerRatings.SnPIssuerRatingLongDate', readOnly: true, 'lock-status': '', '_id':'.IssuerRatings[0].snpissuerratinglongdate[0]', '_parent':'.IssuerRatings[0]', '_level':2, '_lft':40303, '_rgt':40402, '_is_leaf':true},
{fieldLabel:'MoodysIssuerRatingLong',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerRatings',dataType:'dateTime',businessEntityFieldName:'MoodysIssuerRatingLong',fieldName:'FT_T_IRRT.RTNG_CDE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerRatings.MoodysIssuerRatingLong', readOnly: true, 'lock-status': '', '_id':'.IssuerRatings[0].moodysissuerratinglong[0]', '_parent':'.IssuerRatings[0]', '_level':2, '_lft':40403, '_rgt':40502, '_is_leaf':true},
{fieldLabel:'FitchIssuerRatingLongDate',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerRatings',dataType:'dateTime',businessEntityFieldName:'FitchIssuerRatingLongDate',fieldName:'FT_T_IRRT.START_TMS', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerRatings.FitchIssuerRatingLongDate', readOnly: true, 'lock-status': '', '_id':'.IssuerRatings[0].fitchissuerratinglongdate[0]', '_parent':'.IssuerRatings[0]', '_level':2, '_lft':40503, '_rgt':40602, '_is_leaf':true},
{fieldLabel:'MarketLevelInformation','_id':'marketlevelinformation[0]','_parent':null,'_level':1,'_lft':50001,'_rgt':60000,'_is_leaf':false},
{fieldLabel:'Beta',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'Beta',fieldName:'FT_T_ISAN.BETA_CRTE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.Beta', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].beta[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':50002, '_rgt':50102, '_is_leaf':true},
{fieldLabel:'GlobalPrimaryExchange',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'GlobalPrimaryExchange',fieldName:'FT_T_MRKT.MKT_NME', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.GlobalPrimaryExchange', hasValidValues: true, readOnly: true, 'lock-status': '', '_id':'.MarketLevelInformation[0].globalprimaryexchange[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':50103, '_rgt':50202, '_is_leaf':true},
{fieldLabel:'RIC',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'RIC',fieldName:'FT_T_ISID.ISS_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.RIC', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].ric[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':50203, '_rgt':50302, '_is_leaf':true},
{fieldLabel:'TradingCurrency',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'TradingCurrency',fieldName:'FT_T_MKIS.TRDNG_CURR_CDE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.TradingCurrency', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].tradingcurrency[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':50303, '_rgt':50402, '_is_leaf':true},
{fieldLabel:'BBTicker',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'BBTicker',fieldName:'FT_T_ISID.ISS_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.BBTicker', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].bbticker[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':50403, '_rgt':50502, '_is_leaf':true},
{fieldLabel:'BBExchCode',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'BBExchCode',fieldName:'FT_T_MKID.MKT_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.BBExchCode', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].bbexchcode[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':50503, '_rgt':50602, '_is_leaf':true},
{fieldLabel:'IDCTicker',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'IDCTicker',fieldName:'FT_T_ISID.ISS_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.IDCTicker', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].idcticker[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':50603, '_rgt':50702, '_is_leaf':true},
{fieldLabel:'Sedol',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'Sedol',fieldName:'FT_T_ISID.ISS_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.Sedol', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].sedol[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':50703, '_rgt':50802, '_is_leaf':true},
{fieldLabel:'TRTicker',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'TRTicker',fieldName:'FT_T_ISID.ISS_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.TRTicker', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].trticker[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':50803, '_rgt':50902, '_is_leaf':true},
{fieldLabel:'RelativeIndex',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'RelativeIndex',fieldName:'FT_T_MUST.STAT_CHAR_VAL_TXT', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.RelativeIndex', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].relativeindex[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':50903, '_rgt':51002, '_is_leaf':true},
{fieldLabel:'ExchangeName',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'ExchangeName',fieldName:'FT_T_MRKT.MKT_NME', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.ExchangeName', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].exchangename[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':51003, '_rgt':51102, '_is_leaf':true},
{fieldLabel:'SegmentMIC',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'SegmentMIC',fieldName:'FT_T_MKID.MKT_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.SegmentMIC', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].segmentmic[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':51103, '_rgt':51202, '_is_leaf':true},
{fieldLabel:'TKExchCode',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'TKExchCode',fieldName:'FT_T_MKID.MKT_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.TKExchCode', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].tkexchcode[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':51203, '_rgt':51302, '_is_leaf':true},
{fieldLabel:'BloombergUniqueID',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'BloombergUniqueID',fieldName:'FT_T_ISID.ISS_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.BloombergUniqueID', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].bloomberguniqueid[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':51303, '_rgt':51402, '_is_leaf':true},
{fieldLabel:'RoundLotSize',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'RoundLotSize',fieldName:'FT_T_MKIS.RND_LOT_SZ_CQTY', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.RoundLotSize', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].roundlotsize[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':51403, '_rgt':51502, '_is_leaf':true},
{fieldLabel:'IDCExchCode',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'IDCExchCode',fieldName:'FT_T_MKID.MKT_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.IDCExchCode', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].idcexchcode[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':51503, '_rgt':51602, '_is_leaf':true},
{fieldLabel:'MarketStatus',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'dropDown',businessEntityFieldName:'MarketStatus',fieldName:'FT_T_MKIS.TRDNG_STAT_TYP', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.MarketStatus', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].marketstatus[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':51603, '_rgt':51702, '_is_leaf':true},
{fieldLabel:'TradeLotSize',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'TradeLotSize',fieldName:'FT_T_MKIS.TRD_LOT_SIZE_CQTY', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.TradeLotSize', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].tradelotsize[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':51703, '_rgt':51802, '_is_leaf':true},
{fieldLabel:'PriceDetails',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'string',businessEntityFieldName:'PriceDetails',fieldName:'PriceDetails', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.PriceDetails', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].pricedetails[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':51803, '_rgt':51902, '_is_leaf':true},
{fieldLabel:'NormalMarketSize',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'NormalMarketSize',fieldName:'FT_T_MKIS.NORM_MKT_SZ_CQTY', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.NormalMarketSize', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].normalmarketsize[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':51903, '_rgt':52002, '_is_leaf':true},
{fieldLabel:'TradingCountry',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'TradingCountry',fieldName:'FT_T_MKIS.GU_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.TradingCountry', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].tradingcountry[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':52003, '_rgt':52102, '_is_leaf':true},
{fieldLabel:'TRExchCode',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'TRExchCode',fieldName:'FT_T_MKID.MKT_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.TRExchCode', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].trexchcode[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':52103, '_rgt':52202, '_is_leaf':true},
{fieldLabel:'ExchangeCalendar',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'ExchangeCalendar',fieldName:'FT_T_MUST.STAT_CHAR_VAL_TXT', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.ExchangeCalendar', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].exchangecalendar[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':52203, '_rgt':52302, '_is_leaf':true},
{fieldLabel:'RegionalPrimaryExchange',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'RegionalPrimaryExchange',fieldName:'FT_T_MRKT.MKT_NME', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.RegionalPrimaryExchange', hasValidValues: true, readOnly: true, 'lock-status': '', '_id':'.MarketLevelInformation[0].regionalprimaryexchange[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':52303, '_rgt':52402, '_is_leaf':true},
{fieldLabel:'BBExchTicker',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'BBExchTicker',fieldName:'FT_T_ISID.ISS_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.BBExchTicker', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].bbexchticker[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':52403, '_rgt':52502, '_is_leaf':true},
{fieldLabel:'Sedol2',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'Sedol2',fieldName:'FT_T_ISID.ISS_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.Sedol2', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].sedol2[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':52503, '_rgt':52602, '_is_leaf':true},
{fieldLabel:'ExchangeMIC',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'ExchangeMIC',fieldName:'FT_T_MUST.STAT_CHAR_VAL_TXT', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.ExchangeMIC', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].exchangemic[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':52603, '_rgt':52702, '_is_leaf':true},
{fieldLabel:'CESREEARegulatedFlag',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'CESREEARegulatedFlag',fieldName:'FT_T_MUST.STAT_CHAR_VAL_TXT', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.CESREEARegulatedFlag', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].cesreearegulatedflag[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':52703, '_rgt':52802, '_is_leaf':true},
{fieldLabel:'TKTicker',gc:'',gc1:'',valuesDifferent:false,datagroup:'MarketLevelInformation',dataType:'number',businessEntityFieldName:'TKTicker',fieldName:'FT_T_ISID.ISS_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.MarketLevelInformation.TKTicker', readOnly: false, 'lock-status': '', '_id':'.MarketLevelInformation[0].tkticker[0]', '_parent':'.MarketLevelInformation[0]', '_level':2, '_lft':52803, '_rgt':52902, '_is_leaf':true},
{fieldLabel:'IssuerLevelIdentifiers','_id':'issuerlevelidentifiers[0]','_parent':null,'_level':1,'_lft':60001,'_rgt':70000,'_is_leaf':false},
{fieldLabel:'REDCode',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerLevelIdentifiers',dataType:'string',businessEntityFieldName:'REDCode',fieldName:'FT_T_IRID.ISSR_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerLevelIdentifiers.REDCode', readOnly: true, 'lock-status': '', '_id':'.IssuerLevelIdentifiers[0].redcode[0]', '_parent':'.IssuerLevelIdentifiers[0]', '_level':2, '_lft':60002, '_rgt':60102, '_is_leaf':true},
{fieldLabel:'BloombergCompanyID',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerLevelIdentifiers',dataType:'string',businessEntityFieldName:'BloombergCompanyID',fieldName:'FT_T_IRID.ISSR_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerLevelIdentifiers.BloombergCompanyID', readOnly: true, 'lock-status': '', '_id':'.IssuerLevelIdentifiers[0].bloombergcompanyid[0]', '_parent':'.IssuerLevelIdentifiers[0]', '_level':2, '_lft':60103, '_rgt':60202, '_is_leaf':true},
{fieldLabel:'IssuerCUSIP',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerLevelIdentifiers',dataType:'string',businessEntityFieldName:'IssuerCUSIP',fieldName:'IssuerCUSIP', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerLevelIdentifiers.IssuerCUSIP', readOnly: false, 'lock-status': '', '_id':'.IssuerLevelIdentifiers[0].issuercusip[0]', '_parent':'.IssuerLevelIdentifiers[0]', '_level':2, '_lft':60203, '_rgt':60302, '_is_leaf':true},
{fieldLabel:'InstrumentLevelIdentifiers','_id':'.InstrumentLevelIdentifiers[5094648]','_parent':'null','_level':1,'_lft':70001,'_rgt':80000,'_is_leaf':false},
{fieldLabel:'CommonCode',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentLevelIdentifiers',dataType:'string',businessEntityFieldName:'CommonCode',fieldName:'FT_T_ISID.ISS_ID', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentLevelIdentifiers.CommonCode', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentLevelIdentifiers[5094648].commoncode[0]', '_parent':'.InstrumentLevelIdentifiers[5094648]', '_level':2, '_lft':70002, '_rgt':70102, '_is_leaf':true},
{fieldLabel:'CUSIP',gc:'02225AM66',gc1:'03832LJJ1',valuesDifferent:true,datagroup:'InstrumentLevelIdentifiers',dataType:'string',businessEntityFieldName:'CUSIP',fieldName:'FT_T_ISID.ISS_ID', oid: 'ISID_OID:*L9201sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentLevelIdentifiers.CUSIP', hasValidValues: false, fullName: '', 'lock-status': 'PERP', readOnly: false, '_id':'.InstrumentLevelIdentifiers[5094648].cusip[0]', '_parent':'.InstrumentLevelIdentifiers[5094648]', '_level':2, '_lft':70103, '_rgt':70202, '_is_leaf':true},
{fieldLabel:'Valoren',gc:'119114',gc1:'350485',valuesDifferent:true,datagroup:'InstrumentLevelIdentifiers',dataType:'string',businessEntityFieldName:'Valoren',fieldName:'FT_T_ISID.ISS_ID', oid: 'ISID_OID:*L9401sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentLevelIdentifiers.Valoren', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentLevelIdentifiers[5094648].valoren[0]', '_parent':'.InstrumentLevelIdentifiers[5094648]', '_level':2, '_lft':70203, '_rgt':70302, '_is_leaf':true},
{fieldLabel:'ISIN',gc:'AT0000307699',gc1:'ES0144580018',valuesDifferent:true,datagroup:'InstrumentLevelIdentifiers',dataType:'string',businessEntityFieldName:'ISIN',fieldName:'FT_T_ISID.ISS_ID', oid: 'ISID_OID:*L9301sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentLevelIdentifiers.ISIN', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentLevelIdentifiers[5094648].isin[0]', '_parent':'.InstrumentLevelIdentifiers[5094648]', '_level':2, '_lft':70303, '_rgt':70402, '_is_leaf':true},
{fieldLabel:'AtIssuance','_id':'atissuance[0]','_parent':null,'_level':1,'_lft':80001,'_rgt':90000,'_is_leaf':false},
{fieldLabel:'PricingDate',gc:'',gc1:'',valuesDifferent:false,datagroup:'AtIssuance',dataType:'date',businessEntityFieldName:'PricingDate',fieldName:'FT_T_UWCH.ISS_PRC_FIXING_TMS', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.AtIssuance.PricingDate', readOnly: false, 'lock-status': '', '_id':'.AtIssuance[0].pricingdate[0]', '_parent':'.AtIssuance[0]', '_level':2, '_lft':80002, '_rgt':80102, '_is_leaf':true},
{fieldLabel:'IPODate',gc:'',gc1:'',valuesDifferent:false,datagroup:'AtIssuance',dataType:'date',businessEntityFieldName:'IPODate',fieldName:'FT_T_UWCH.OFFER_TMS', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.AtIssuance.IPODate', readOnly: false, 'lock-status': '', '_id':'.AtIssuance[0].ipodate[0]', '_parent':'.AtIssuance[0]', '_level':2, '_lft':80103, '_rgt':80202, '_is_leaf':true},
{fieldLabel:'IPONumberOfShares',gc:'',gc1:'',valuesDifferent:false,datagroup:'AtIssuance',dataType:'number',businessEntityFieldName:'IPONumberOfShares',fieldName:'FT_T_UWCH.OFFER_CQTY', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.AtIssuance.IPONumberOfShares', readOnly: false, 'lock-status': '', '_id':'.AtIssuance[0].iponumberofshares[0]', '_parent':'.AtIssuance[0]', '_level':2, '_lft':80203, '_rgt':80302, '_is_leaf':true},
{fieldLabel:'IPOPrice',gc:'',gc1:'',valuesDifferent:false,datagroup:'AtIssuance',dataType:'number',businessEntityFieldName:'IPOPrice',fieldName:'FT_T_UWCH.OFFER_CPRC', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.AtIssuance.IPOPrice', readOnly: false, 'lock-status': '', '_id':'.AtIssuance[0].ipoprice[0]', '_parent':'.AtIssuance[0]', '_level':2, '_lft':80303, '_rgt':80402, '_is_leaf':true},
{fieldLabel:'IPOUnderwriter',gc:'',gc1:'',valuesDifferent:false,datagroup:'AtIssuance',dataType:'number',businessEntityFieldName:'IPOUnderwriter',fieldName:'FT_T_UWCH.LEAD_MANAGER_NME', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.AtIssuance.IPOUnderwriter', readOnly: false, 'lock-status': '', '_id':'.AtIssuance[0].ipounderwriter[0]', '_parent':'.AtIssuance[0]', '_level':2, '_lft':80403, '_rgt':80502, '_is_leaf':true},
{fieldLabel:'PrivatePlacementFlag',gc:'',gc1:'',valuesDifferent:false,datagroup:'AtIssuance',dataType:'dropDown',businessEntityFieldName:'PrivatePlacementFlag',fieldName:'FT_T_UWCH.PVT_PLCMNT_IND', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.AtIssuance.PrivatePlacementFlag', readOnly: false, 'lock-status': '', '_id':'.AtIssuance[0].privateplacementflag[0]', '_parent':'.AtIssuance[0]', '_level':2, '_lft':80503, '_rgt':80602, '_is_leaf':true},
{fieldLabel:'FirstTradingDate',gc:'',gc1:'',valuesDifferent:false,datagroup:'AtIssuance',dataType:'date',businessEntityFieldName:'FirstTradingDate',fieldName:'FT_T_UWCH.FIRST_TRDNG_TMS', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.AtIssuance.FirstTradingDate', readOnly: false, 'lock-status': '', '_id':'.AtIssuance[0].firsttradingdate[0]', '_parent':'.AtIssuance[0]', '_level':2, '_lft':80603, '_rgt':80702, '_is_leaf':true},
{fieldLabel:'VotingRights',gc:'',gc1:'',valuesDifferent:false,datagroup:'AtIssuance',dataType:'number',businessEntityFieldName:'VotingRights',fieldName:'FT_T_EQST.VOTING_RIGHTS_CRTE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.AtIssuance.VotingRights', readOnly: false, 'lock-status': '', '_id':'.AtIssuance[0].votingrights[0]', '_parent':'.AtIssuance[0]', '_level':2, '_lft':80703, '_rgt':80802, '_is_leaf':true},
{fieldLabel:'VotingRightsFlag',gc:'',gc1:'',valuesDifferent:false,datagroup:'AtIssuance',dataType:'dropDown',businessEntityFieldName:'VotingRightsFlag',fieldName:'FT_T_EQCH.VOTING_RIGHTS_TYP', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.AtIssuance.VotingRightsFlag', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.AtIssuance[0].votingrightsflag[0]', '_parent':'.AtIssuance[0]', '_level':2, '_lft':80803, '_rgt':80902, '_is_leaf':true},
{fieldLabel:'EquityDetails','_id':'equitydetails[0]','_parent':null,'_level':1,'_lft':90001,'_rgt':100000,'_is_leaf':false},
{fieldLabel:'MarketCapitalization',gc:'',gc1:'',valuesDifferent:false,datagroup:'EquityDetails',dataType:'number',businessEntityFieldName:'MarketCapitalization',fieldName:'FT_T_EQST.MKT_CPTLZN_CQTY', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.EquityDetails.MarketCapitalization', readOnly: false, 'lock-status': '', '_id':'.EquityDetails[0].marketcapitalization[0]', '_parent':'.EquityDetails[0]', '_level':2, '_lft':90002, '_rgt':90102, '_is_leaf':true},
{fieldLabel:'PriceEarningsRatio',gc:'',gc1:'',valuesDifferent:false,datagroup:'EquityDetails',dataType:'number',businessEntityFieldName:'PriceEarningsRatio',fieldName:'FT_T_EQST.PE_RATIO_CRTE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.EquityDetails.PriceEarningsRatio', readOnly: false, 'lock-status': '', '_id':'.EquityDetails[0].priceearningsratio[0]', '_parent':'.EquityDetails[0]', '_level':2, '_lft':90103, '_rgt':90202, '_is_leaf':true},
{fieldLabel:'DividendInformation','_id':'dividendinformation[0]','_parent':null,'_level':1,'_lft':100001,'_rgt':110000,'_is_leaf':false},
{fieldLabel:'DividendDetails',gc:'',gc1:'',valuesDifferent:false,datagroup:'DividendInformation',dataType:'string',businessEntityFieldName:'DividendDetails',fieldName:'DividendDetails', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.DividendInformation.DividendDetails', readOnly: false, 'lock-status': '', '_id':'.DividendInformation[0].dividenddetails[0]', '_parent':'.DividendInformation[0]', '_level':2, '_lft':100002, '_rgt':100102, '_is_leaf':true},
{fieldLabel:'RedemptionDetails','_id':'redemptiondetails[0]','_parent':null,'_level':1,'_lft':110001,'_rgt':120000,'_is_leaf':false},
{fieldLabel:'TerminationDate',gc:'',gc1:'',valuesDifferent:false,datagroup:'RedemptionDetails',dataType:'date',businessEntityFieldName:'TerminationDate',fieldName:'FT_T_ISSU.MAT_EXP_TMS', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.RedemptionDetails.TerminationDate', readOnly: false, 'lock-status': '', '_id':'.RedemptionDetails[0].terminationdate[0]', '_parent':'.RedemptionDetails[0]', '_level':2, '_lft':110002, '_rgt':110102, '_is_leaf':true},
{fieldLabel:'InstrumentDescription','_id':'.InstrumentDescription[20746302]','_parent':'null','_level':1,'_lft':120001,'_rgt':130000,'_is_leaf':false},
{fieldLabel:'InstrumentName',gc:'Test Equity',gc1:'Test Equity 1',valuesDifferent:true,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'InstrumentName',fieldName:'FT_T_ISSU.PREF_ISS_NME', oid: 'INSTR_ID:~Tv1G7sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.InstrumentName', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].instrumentname[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':120002, '_rgt':120102, '_is_leaf':true},
{fieldLabel:'USCFICode',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'USCFICode',fieldName:'FT_T_ISCL.CL_VALUE', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.USCFICode', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].uscficode[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':120103, '_rgt':120202, '_is_leaf':true},
{fieldLabel:'ThomsonReutersInstrumentSubType',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'ThomsonReutersInstrumentSubType',fieldName:'FT_T_INCL.CL_NME', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.ThomsonReutersInstrumentSubType', hasValidValues: true, 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].thomsonreutersinstrumentsubtype[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':120203, '_rgt':120302, '_is_leaf':true},
{fieldLabel:'InstrumentStatus',gc:'Default',gc1:'Active',valuesDifferent:true,datagroup:'InstrumentDescription',dataType:'dropDown',businessEntityFieldName:'InstrumentStatus',fieldName:'FT_T_ISSU.ISS_ACTVY_STAT_TYP', oid: 'INSTR_ID:~Tv1G7sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.InstrumentStatus', hasValidValues: true, 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].instrumentstatus[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':120303, '_rgt':120402, '_is_leaf':true},
{fieldLabel:'TelekursInstrumentSubType',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'TelekursInstrumentSubType',fieldName:'FT_T_INCL.CL_NME', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.TelekursInstrumentSubType', hasValidValues: true, 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].telekursinstrumentsubtype[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':120403, '_rgt':120502, '_is_leaf':true},
{fieldLabel:'ISOCFICode',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'ISOCFICode',fieldName:'FT_T_ISCL.CL_VALUE', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.ISOCFICode', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].isocficode[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':120503, '_rgt':120602, '_is_leaf':true},
{fieldLabel:'IDCInstrumentSubType',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'IDCInstrumentSubType',fieldName:'FT_T_INCL.CL_NME', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.IDCInstrumentSubType', hasValidValues: true, 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].idcinstrumentsubtype[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':120603, '_rgt':120702, '_is_leaf':true},
{fieldLabel:'SharesOutstandingDate',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'date',businessEntityFieldName:'SharesOutstandingDate',fieldName:'FT_T_ISMC.CAP_CHG_EFF_TMS', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.SharesOutstandingDate', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].sharesoutstandingdate[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':120703, '_rgt':120802, '_is_leaf':true},
{fieldLabel:'InstrumentType',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'InstrumentType',fieldName:'FT_T_ISTY.ISS_TYP_CLSF_NME', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.InstrumentType', hasValidValues: true, 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].instrumenttype[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':120803, '_rgt':120902, '_is_leaf':true},
{fieldLabel:'BloombergInstrumentSubType',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'BloombergInstrumentSubType',fieldName:'FT_T_INCL.CL_NME', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.BloombergInstrumentSubType', hasValidValues: true, 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].bloomberginstrumentsubtype[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':120903, '_rgt':121002, '_is_leaf':true},
{fieldLabel:'InstrumentSubType',gc:'EQSHR ',gc1:'EQSHR ',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'InstrumentSubType',fieldName:'FT_T_ISSU.ISS_TYP', oid: 'INSTR_ID:~Tv1G7sTG1:', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.InstrumentSubType', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].instrumentsubtype[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':121003, '_rgt':121102, '_is_leaf':true},
{fieldLabel:'BloombergMarketSector',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'BloombergMarketSector',fieldName:'FT_T_ISCL.CL_VALUE', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.BloombergMarketSector', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].bloombergmarketsector[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':121103, '_rgt':121202, '_is_leaf':true},
{fieldLabel:'ParValue',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'number',businessEntityFieldName:'ParValue',fieldName:'FT_T_ISSU.NOM_VAL_UNIT_CAMT', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.ParValue', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].parvalue[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':121203, '_rgt':121302, '_is_leaf':true},
{fieldLabel:'SharesOutstanding',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'number',businessEntityFieldName:'SharesOutstanding',fieldName:'FT_T_ISMC.CAP_SEC_CQTY', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.SharesOutstanding', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].sharesoutstanding[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':121303, '_rgt':121402, '_is_leaf':true},
{fieldLabel:'InstrumentDescription',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'string',businessEntityFieldName:'InstrumentDescription',fieldName:'FT_T_ISSU.PREF_ISS_DESC', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.InstrumentDescription', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].instrumentdescription[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':121403, '_rgt':121502, '_is_leaf':true},
{fieldLabel:'Currency',gc:'',gc1:'',valuesDifferent:false,datagroup:'InstrumentDescription',dataType:'dropDown',businessEntityFieldName:'Currency',fieldName:'FT_T_ISSU.DENOM_CURR_CDE', oid: 'null', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.InstrumentDescription.Currency', hasValidValues: false, fullName: '', 'lock-status': '', readOnly: false, '_id':'.InstrumentDescription[20746302].currency[0]', '_parent':'.InstrumentDescription[20746302]', '_level':2, '_lft':121503, '_rgt':121602, '_is_leaf':true},
{fieldLabel:'Regulatory','_id':'regulatory[0]','_parent':null,'_level':1,'_lft':130001,'_rgt':140000,'_is_leaf':false},
{fieldLabel:'MiFIDFlag',gc:'',gc1:'',valuesDifferent:false,datagroup:'Regulatory',dataType:'dropDown',businessEntityFieldName:'MiFIDFlag',fieldName:'FT_T_RGCH.MIFID_REGULATED_IND', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.Regulatory.MiFIDFlag', hasValidValues: true, readOnly: false, 'lock-status': '', '_id':'.Regulatory[0].mifidflag[0]', '_parent':'.Regulatory[0]', '_level':2, '_lft':130002, '_rgt':130102, '_is_leaf':true},
{fieldLabel:'ISMAFlag',gc:'',gc1:'',valuesDifferent:false,datagroup:'Regulatory',dataType:'dropDown',businessEntityFieldName:'ISMAFlag',fieldName:'FT_T_RGCH.ISMA_REGULATED_IND', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.Regulatory.ISMAFlag', readOnly: false, 'lock-status': '', '_id':'.Regulatory[0].ismaflag[0]', '_parent':'.Regulatory[0]', '_level':2, '_lft':130103, '_rgt':130202, '_is_leaf':true},
{fieldLabel:'Flag144A',gc:'',gc1:'',valuesDifferent:false,datagroup:'Regulatory',dataType:'dropDown',businessEntityFieldName:'Flag144A',fieldName:'FT_T_RGCH.RULE_144A_IND', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.Regulatory.Flag144A', readOnly: false, 'lock-status': '', '_id':'.Regulatory[0].flag144a[0]', '_parent':'.Regulatory[0]', '_level':2, '_lft':130203, '_rgt':130302, '_is_leaf':true},
{fieldLabel:'RegulationSFlag',gc:'',gc1:'',valuesDifferent:false,datagroup:'Regulatory',dataType:'dropDown',businessEntityFieldName:'RegulationSFlag',fieldName:'FT_T_RGCH.REG_S_IND', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.Regulatory.RegulationSFlag', readOnly: false, 'lock-status': '', '_id':'.Regulatory[0].regulationsflag[0]', '_parent':'.Regulatory[0]', '_level':2, '_lft':130303, '_rgt':130402, '_is_leaf':true},
{fieldLabel:'IssuerInformation','_id':'issuerinformation[0]','_parent':null,'_level':1,'_lft':140001,'_rgt':150000,'_is_leaf':false},
{fieldLabel:'BBIndustryGroup',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerInformation',dataType:'string',businessEntityFieldName:'BBIndustryGroup',fieldName:'FT_T_INCL.CL_NME', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerInformation.BBIndustryGroup', hasValidValues: true, readOnly: true, 'lock-status': '', '_id':'.IssuerInformation[0].bbindustrygroup[0]', '_parent':'.IssuerInformation[0]', '_level':2, '_lft':140002, '_rgt':140102, '_is_leaf':true},
{fieldLabel:'BBIndustrySector',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerInformation',dataType:'string',businessEntityFieldName:'BBIndustrySector',fieldName:'FT_T_INCL.CL_NME', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerInformation.BBIndustrySector', readOnly: true, 'lock-status': '', '_id':'.IssuerInformation[0].bbindustrysector[0]', '_parent':'.IssuerInformation[0]', '_level':2, '_lft':140103, '_rgt':140202, '_is_leaf':true},
{fieldLabel:'IssuerName',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerInformation',dataType:'string',businessEntityFieldName:'IssuerName',fieldName:'FT_T_ISSR.ISSR_DESC', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerInformation.IssuerName', readOnly: true, 'lock-status': '', '_id':'.IssuerInformation[0].issuername[0]', '_parent':'.IssuerInformation[0]', '_level':2, '_lft':140203, '_rgt':140302, '_is_leaf':true},
{fieldLabel:'IDCIndustrySector',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerInformation',dataType:'string',businessEntityFieldName:'IDCIndustrySector',fieldName:'FT_T_IRCL.CL_VALUE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerInformation.IDCIndustrySector', readOnly: true, 'lock-status': '', '_id':'.IssuerInformation[0].idcindustrysector[0]', '_parent':'.IssuerInformation[0]', '_level':2, '_lft':140303, '_rgt':140402, '_is_leaf':true},
{fieldLabel:'TKIndustrySector',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerInformation',dataType:'string',businessEntityFieldName:'TKIndustrySector',fieldName:'FT_T_IRCL.CL_VALUE', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerInformation.TKIndustrySector', readOnly: true, 'lock-status': '', '_id':'.IssuerInformation[0].tkindustrysector[0]', '_parent':'.IssuerInformation[0]', '_level':2, '_lft':140403, '_rgt':140502, '_is_leaf':true},
{fieldLabel:'TKIndustrySubSector',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerInformation',dataType:'string',businessEntityFieldName:'TKIndustrySubSector',fieldName:'FT_T_INCL.CL_NME', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerInformation.TKIndustrySubSector', hasValidValues: true, readOnly: true, 'lock-status': '', '_id':'.IssuerInformation[0].tkindustrysubsector[0]', '_parent':'.IssuerInformation[0]', '_level':2, '_lft':140503, '_rgt':140602, '_is_leaf':true},
{fieldLabel:'IDCIndustrySubSector',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerInformation',dataType:'string',businessEntityFieldName:'IDCIndustrySubSector',fieldName:'FT_T_INCL.CL_NME', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerInformation.IDCIndustrySubSector', hasValidValues: true, readOnly: true, 'lock-status': '', '_id':'.IssuerInformation[0].idcindustrysubsector[0]', '_parent':'.IssuerInformation[0]', '_level':2, '_lft':140603, '_rgt':140702, '_is_leaf':true},
{fieldLabel:'CountryofDomicile',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerInformation',dataType:'string',businessEntityFieldName:'CountryofDomicile',fieldName:'FT_T_IRGU.GU_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerInformation.CountryofDomicile', readOnly: true, 'lock-status': '', '_id':'.IssuerInformation[0].countryofdomicile[0]', '_parent':'.IssuerInformation[0]', '_level':2, '_lft':140703, '_rgt':140802, '_is_leaf':true},
{fieldLabel:'GICS',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerInformation',dataType:'string',businessEntityFieldName:'GICS',fieldName:'FT_T_INCL.CL_NME', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerInformation.GICS', hasValidValues: true, readOnly: true, 'lock-status': '', '_id':'.IssuerInformation[0].gics[0]', '_parent':'.IssuerInformation[0]', '_level':2, '_lft':140803, '_rgt':140902, '_is_leaf':true},
{fieldLabel:'CountryofIncorporation',gc:'',gc1:'',valuesDifferent:false,datagroup:'IssuerInformation',dataType:'string',businessEntityFieldName:'CountryofIncorporation',fieldName:'FT_T_IRGU.GU_ID', oid: '', action1: '', vddbTip: '', action2: '', cdcTip: '', action3: '', chalTip: '', 'chal-oid': '', action4: '', fvshTip: '', 'fvsh-oid': '' , 'table_id':'' , 'col_name': '', fullName: 'Equity.IssuerInformation.CountryofIncorporation', readOnly: true, 'lock-status': '', '_id':'.IssuerInformation[0].countryofincorporation[0]', '_parent':'.IssuerInformation[0]', '_level':2, '_lft':140903, '_rgt':141002, '_is_leaf':true}]

ryanfebus
23 Jun 2010, 1:39 PM
Hello,

Can you please post your solution or perhaps tell me know it differs from my attempts at solving the paging problem. My problem is that once the grid is clicked I cannot return to the parent node paging. I must be missing something. The clearSelection() method does not seem to change the paging state.





// rowclick event on treegrid
rowclick: function(grid, rowIndex, e){

sm = grid.getSelectionModel();
sm.clearSelections();

},




Thanks much,

Ryan



So what I did is this. Upon the rowclick event, the selectionModel's clearSelection method is called. It's a dirty solution, but it works and doesn't interfere with the rest of my program.
Wilmar.

ryanfebus
24 Jun 2010, 8:01 AM
Hi Maximus,

I attempted the clearSelections() method inside the treegrid's grid onclick event as well without much luck. Further info on my problem is that I am using the adjacency list store and paging remotely. I would prefer to deactivate the child paging completely but a button that would reset the paging would we awesome as well. I am really in a crunch on this one and would very much appreciate any help.

Thanks much,

Ryan

ryanfebus
24 Jun 2010, 9:32 AM
Hello,

hacking away i commented out the below code in the treegrid.js. This turns off the child node paging. Seems to work well enough for the time being.


onTreeGridSelectionChange : function(sm, selection)
{
var record, ancestors, store = this.getStore();
// Row selection model
if (sm.getSelected) {
record = sm.getSelected();
store.setActiveNode(record);
}
// Cell selection model
else if (sm.getSelectedCell && selection) {
record = selection.record;
// turn off paging for nodes by commenting out below code - top level paging cannot be returned to once lower level is accessed
// reapir once treegrid ux is upgraded
// store.setActiveNode(record);
}

julesmoulis
29 Jun 2010, 11:03 PM
Hi I guess I'm newer than a newer...
Would it be possible to post a zip file with the full php connexion mysql code?

Thanks

canxss
8 Jul 2010, 7:28 AM
Hi,

A while ago I've sent this post (http://www.sencha.com/forum/showthread.php?76331-TreeGrid-(Ext.ux.maximgb.tg)-a-tree-grid-component-based-on-Ext-s-native-grid.&p=444646#post444646).

It was about not being able to use Saki's Ext.ux.GridSearch plugin with TreeGrid on Ext JS 3.2.1 which was working perfectly with previous versions.

Have you had time to check it out?

Thanks in advance

MaximGB
13 Jul 2010, 11:56 PM
No I haven't, any patches are welcome ;)

canxss
16 Jul 2010, 6:23 AM
OK,

I fixed the problem. But I don't know whether it might have any negative side-effects on other parts. So far it works without a problem:



getNodeParent : function(rc)
{
return this.getById(rc.get(this.parent_id_field_name));
},


getById function has changed in Ext JS 3.2.1: Now it first searches in snapshot and then data. Because of that the Ext.ux.GridSearch plugin wasn't working as before as I've explained in this post (http://www.sencha.com/forum/showthread.php?76331-TreeGrid-(Ext.ux.maximgb.tg)-a-tree-grid-component-based-on-Ext-s-native-grid.&p=444646#post444646).

So I've changed this statement as following:



getNodeParent : function(rc)
{
return this.data.key(rc.get(this.parent_id_field_name));
},

treblereel
29 Aug 2010, 11:56 AM
I dont know is it my mistake or bug but i find something wrong with BaseParams.


var timesheetStore = new Ext.ux.maximgb.tg.AdjacencyListStore({
baseParams: {
user_id: user_id,
date: window.currDate,
},
id: 'timesheetStoreId',
listeners: {
'beforeexpandnode': function(n,e) {
console.log(window.currDate);
},
url: '<?php echo base_url();?>hour/getHour',

method:'POST',

reader: new Ext.data.JsonReader(
{
id: '_id',
root: 'data',
user_id: user_id,
totalProperty: 'total',
successProperty: 'success'
},
record
)
});





If i am setting currDate value to new, root nodes loading nodes ok, but child nodes loading with previous currDare params.
Does anybody can help me ?

Gerard Pastis
21 Sep 2010, 3:57 AM
Has anyone tried to bring the plugin for 3.3?
There is updates on Ext.grid.GridView that makes renderCellTreeUI fails on GridEditor

jiashaoshan
30 Sep 2010, 8:55 AM
I need a tree-grid page, this page contains the following functions ,Can you provide me a solution or sample?
1.TreeGrid Extension


Drag & Drop Reordering
editable
Columns

tree columns auto fit
grid columns can be lock/unlocked(lock item)
grid width visable enable/disabled
column width can be adjusted
action column(action icon)
icon column (dynamically loader)


filting(based on tree column)
context menu(right key memu)

2.Inline form/panel


expend form via click icon in action column
rich text editor area
forms contrel

Who can give me a solution ?If you still do not understand,i can email some renderings to you

dougbieber
8 Oct 2010, 3:52 AM
Excellent extension, just one problem plus a suggested enhancement...

PROBLEM
-------

I am using the AdjacencyListStore (on an ArrayReader with a MemoryProxy), and my tree displays fine, except...

Whenever I sort the columns the rows are literally sorted as a single group (i.e. levels are ignored and different depths of children end up all over the place).

I don't understamd _lft and _rgt enough to be able to use a NestedSetStore, and want to know whether proper (taking levels into account) sorting IS NOT supported with AdjacencyListStore?

SUGGESTED ENHANCEMENT
---------------------

I often have row lines which are multiple rows in height, i.e. cell text which overflows onto the next line. Anyway, the leaf / line / elbow icons look a little strange because they sit at the top right of the cell and have no continuity to the rows above an beneath.

My suggestion (which I have seen used on other java trees) is to use taller connector images (e.g. 10 lines high) and then center them and allow them to be 'cut off' by the rows above and below,...

For example, instead of a single image for | and |- use a single image for

|
|
|
|
|
|
|

and

|
|
|--
|
|
|

I can provide these images if it helps.

Dio
25 Oct 2010, 8:51 AM
Hi.

First of all, thanks for your great extension MaximGB.

I'm having a little problem with an editor grid and ExtJS 3.3.

After editing and saving a line, a display problem appear.
Some tags disappear.




//Before edit

<td class="x-grid3-col x-grid3-cell x-grid3-td-name x-grid3-cell-first " style="width: 603px;" tabindex="0">
<div class="ux-maximgb-tg-mastercell-wrap">
<div class="ux-maximgb-tg-uiwrap" style="width: 32px;">
<div style="left: 0px;" class="ux-maximgb-tg-elbow-line">&nbsp;</div>
<div style="left: 17px;" class="ux-maximgb-tg-elbow">&nbsp;</div>
</div>
<div class="x-grid3-cell-inner x-grid3-col-name" unselectable="on">Blabla</div>
</div>
</td>

//After save/commit

<td tabindex="0" style="width: 603px;" class="x-grid3-col x-grid3-cell x-grid3-td-name x-grid3-cell-first">
<div unselectable="on" class="x-grid3-cell-inner x-grid3-col-name">Blablabla</div>
</td>



I don't know if I made a mistake or if it's a problem with the gridView.

Thx.

wasp
28 Oct 2010, 11:55 PM
I'm having exactly the same problem with Ext 3.3 :( Any fixes or ideas?

gelleneu
29 Oct 2010, 1:17 AM
In the debug Source code, there are Methods "onUpdate", "onDelete" and so on ....

...try to add this.grid.view.refresh() after this.processRows() call in this methods...

Keylan
3 Nov 2010, 1:39 PM
Thanks gelleneu - was running into the same issue and that fixed it.

Keylan
4 Nov 2010, 9:00 AM
MaximGB - Great plugin, but couldn't help but notice that you are not actually adding the record to the store in this code sample. Am I missing something?

(In reference to this post (http://www.sencha.com/forum/showthread.php?76331-TreeGrid-%28Ext.ux.maximgb.tg%29-a-tree-grid-component-based-on-Ext-s-native-grid.&p=461540#post461540).)

I am running into the issue when adding a new record as a parent node to a couple existing records. The record is indeed added, but the child records remain in the same location they were in the grid. When I expand the new row, the child rows show themselves - but they are in their old location (not directly underneath the parent row).

Do you have an example of how to add a new record dynamically in this fashion?

Thanks.

Keylan
4 Nov 2010, 9:57 AM
Bah. Got it. getRootNodes wasn't correctly grabbing the root nodes. Ignore previous post.

noimehl
4 Nov 2010, 10:51 PM
Hi,

great extenstion.

I am a newbie with extjs. Is the possibility to use "renderTo"?

best regards
t

zikr
19 Nov 2010, 7:46 AM
Hi, Maxim. I was tried your grid with ExtJs 3.3.0, works great, but seems that it requires one small improvement. Currently if first column has combobox editor and was edited, then, when row is redrawn, tags defined in treeui template disappears. Have looked code. GridView's refreshRow: function(record) is called. Seems that your view requires to override this method like in doRender : function(cs, rs, ds, startRow, colCount, stripe) was done - part between comments: Modification start, End of modification.

Shanthi
19 Nov 2010, 11:51 PM
HI
I could not see data in grid

Could you let me know what am i missing

Thanks
Shanthi

Controller = function()
{
function createGrid()
{
// create the data store
var fields = [
{name: 'acctClient'},
{name: 'account'},
{name: 'shortName'},
{name: 'forms'},
{name: 'doc'},
{name: 'desc'},
{name: 'revision'},
{name: 'scan'},
{name: 'statusDate'},
{name: 'frame'},
{name: 'loc'},
{name: 'status'},
{name: 'id', type: 'int'},
{name: 'parentid', type: 'int'},
{name: 'leaf', type: 'bool'}
];

var data = [
{
"rows": [
{
"id":1,"parentid":null,"leaf":false,"acctClient":"","account":"","shortName":"","forms":"CL-SVC-SEL","doc":"","desc":"ACCOUNT SERVICES SELECTION","revision":"11-2005","scan":"03/15/2006","statusDate":"","frame":"SEZ","loc":"CMD","status":"Accepted"
},
{
"id":2,"parentid":1,"leaf":true,"acctClient":"","account":"","shortName":"","forms":"","doc":"DF","desc":"FDIC ADDENDUM FOR TRUST ACCTS","revision":"","scan":"","statusDate":"","frame":"","loc":"","status":""
}
],
"success":true,
"total":2
}
];

var acctMaintStore = new Ext.ux.maximgb.tg.AdjacencyListStore({
autoLoad : true,
leaf_field_name: "leaf",
parent_id_field_name: "parentid",
reader: new Ext.data.JsonReader({
idProperty: 'id',
root: 'rows',
fields: fields
}),
proxy: new Ext.data.MemoryProxy(data)
});

var grid = new Ext.ux.maximgb.tg.GridPanel({
store: acctMaintStore,
enableHdMenu : false,
master_column_id : "forms",
disableSelection : true,
columns: [
{header: "Account/Client", hidden: true, width: 100, sortable: true, dataIndex: 'acctClient'},
{header: "Account", hidden: true, width: 100, sortable: true, dataIndex: 'account'},
{header: "Short Name (Friendly)", hidden: true, width: 150, sortable: true, dataIndex: 'shortName'},
{header: "Forms", width: 100, sortable: true, dataIndex: 'forms',id:'forms'},
{header: "Doc Cd", width: 125, sortable: true, dataIndex: 'doc'},
{header: "Description", width: 125, sortable: true, dataIndex: 'desc',id:'auto-expand-column-acct-maint'},
{header: "Revision", hidden: false, width: 125, sortable: true, dataIndex: 'revision'},
{header: "Scan", hidden: false, width: 125, sortable: true, dataIndex: 'scan'},
{header: "Status Date", width: 75, sortable: true, dataIndex: 'statusDate'},
{header: "Frame", hidden: false, width: 75, sortable: true, dataIndex: 'frame'},
{header: "Loc", hidden: false, width: 75, sortable: true, dataIndex: 'loc'},
{header: "Status", width: 75, sortable: true, dataIndex: 'status'},
{header: "Action", width: 150, sortable: false,dataIndex:'action'}
],
stripeRows: true,
autoExpandColumn: 'auto-expand-column-acct-maint',
region: 'center',
margins : '0 0 0 0',
header : false,
border: false,
title:'Results Panel'
});



var vp = new Ext.Viewport({
layout : 'fit',
items : grid

});

grid.getSelectionModel().selectFirstRow();
}

// example of custom renderer function
function change(val)
{
if (val > 0) {
val = '<span style="color:green;">' + val + '</span>';
}
else if(val < 0) {
val = '<span style="color:red;">' + val + '</span>';
}
return val;
}
// example of custom renderer function
function pctChange(val)
{
if (val > 0) {
val = '<span style="color:green;">' + val + '%</span>';
}
else if(val < 0) {
val = '<span style="color:red;">' + val + '%</span>';
}
return val;
}
return {
init : function()
{
createGrid();
}
}
}();
Ext.onReady(Controller.init);

foxmarco
23 Nov 2010, 2:30 AM
Is it possible to use CheckboxSelectionModel?

Becouse i've tried to set the sm property to "new Ext.grid.CheckboxSelectionModel()" but not checkboxs were rendered...

Any idea? Thanks

Shanthi
23 Nov 2010, 7:15 AM
How can i render Ext.ux.maximgb.tg.GridPanel to div tag....

Condor
23 Nov 2010, 7:25 AM
How can i render Ext.ux.maximgb.tg.GridPanel to div tag....

What's the problem? Simply specify renderTo or call render().

ps. The gridpanel will need a fixed height and width (or you could use the FitToParent plugin).

Shanthi
24 Nov 2010, 7:18 AM
I fixed it using FitToParent plugin. Whne i execute it as standalone jsp, its fine. But when i add plugin to my portal, i could not see grid at all.....

TheSoul75
10 Dec 2010, 2:16 AM
'string' as ID Fieldtype

Short Question, when I use a 'string' as ID Fieldtype, the TreeGrid add all Subnodes at the last Node and not at the expanded. If i change my ID Fieldtype to 'int' all is fine. I can't find the bug? Do you know why this happened?

TheSoul75
10 Dec 2010, 5:22 AM
ok i found the problem if you use 'string' as fieldtype on ID you must set the _parent value for the topnodes to null.
if there an "" or something else i won't display correct.

nassaja-rus
26 Jan 2011, 3:36 AM
Is it possible to use CheckboxSelectionModel?

Becouse i've tried to set the sm property to "new Ext.grid.CheckboxSelectionModel()" but not checkboxs were rendered...

Any idea? Thanks



onRender: function() {
Grid.superclass.onRender.apply(this, arguments);
this.selectionModel.init(this);
}

Cindy Azcha
28 Jan 2011, 1:10 PM
Hello, i am working with Ext.ux.maximgb.tg.AdjacencyListStore I may add a node to my Ext.ux.maximgb.tg.EditorGridPanel, and then select this node, for power appreciate all the children to that you can add to this node, this process is normal, but the moments of add one group of nodes and select one of then for add his children, returns an error
r is undefined in TreeGrid.js (línea 1209),
and i look the mistake this call to function doRender where exists one r=rs[j], case is that never use this function.
the code that i use for add the children is the following:


{
text:'spell',iconCls:'spell-icon',id:'seleccionaPartida',
scope:this,
handler: function () {
if(Ext.getCmp('gridPartida').getSelectionModel().hasSelection() ){
Ext.each( Ext.getCmp('gridPartida').getSelectionModel().getSelections(), function (record) {
if ( Ext.getCmp ('grid_det_presu').getStore().getById ( record.id ) == null){
var Nodopadre = Ext.getCmp('grid_det_presu').getSelectionModel().getSelected().data.codigo;
var NodoPartida = new recordNodo({
IDpresupuesto: 0,
codigo : Nodopadre+"."+record.data.cod_Partida,
escripcion : record.data.descripcion,
unidad : null,
metrado : null,
precio1 : null,
precio : null,
parcial : null,
_id : Ext.id(),
_parent : Nodopadre,
_is_leaf : true
});

var res = Ext.getCmp('grid_det_presu').getSelectionModel().getSelected();
Ext.getCmp('grid_det_presu').store.expandNode(res);
var PositionId = Ext.getCmp ( 'grid_det_presu' ).getStore().indexOfId( res.id );
Ext.getCmp('grid_det_presu').store.addToNode(res,NodoPartida, PositionId + 1);
Ext.getCmp('grid_det_presu').getStore().applyTreeSort();
Ext.getCmp('grid_det_presu').getStore().sortData( 'codigo', 'ASC');
Ext.getCmp('grid_det_presu').store.commitChanges();
Ext.getCmp('grid_det_presu').store.reload();
Ext.getCmp('grid_det_presu').doLayout();
Ext.getCmp('grid_det_presu').getView().refresh();
}
});
}
}
},



help please

sumanb
5 May 2011, 5:07 AM
Hello,
I am using a server side nested Adjacency List store to render a 2 level tree grid. I need to display a loading icon on the elbow of any of the parent row. I tried out may times within the Grid view and the Grid panel, but the problem I am facing is that for all those parent rows, whose children need to be fetched via a server side call, the loading icon is not being displayed. But once, the children are rendered, the loading icon is coming up.

I am a little confused at this. Can someone please guide me.

corsons
16 May 2011, 10:18 AM
Does anybody know how to delete or remove a node. I had assumed that it was similar to the addition of a node where you call addsorted with the new record but using the remove() as below:


function addItemChild() {
// get selected record
var r = grid.getSelectionModel().getSelected();
// if it's a leaf that make it a non-leaf
if (r.get("_is_leaf")) {
r.set("_is_leaf", false);
}
childID = Ext.id();
var myNewRecord = new record({
node:"file " + childID,
name: 'file',
value: null,
_id:childID,
_parent:r.get("_id"),
_is_leaf:true },childID);
store.addSorted(myNewRecord);
}

function deleteItemChild() {
// get selected record
var r = grid.getSelectionModel().getSelected();
// Create a copy of the selected record
var myNewRecord = new record({
node:r.get("node"),
name: r.get("name"),
value: r.get("value"),
_id:r.get("_id"),
_parent:r.get("_parent"),
_is_leaf:r.get("_is_leaf")});
console.log(myNewRecord);
store.remove(myNewRecord);
console.log(store);
} The addItemChild works but the deleteItemChild does not, Any ideas?

Thanks

MaximGB
19 May 2011, 7:29 AM
Hm, strange method you've decided to use to remove a node. If I were you I would use just

store.remove(r);

corsons
19 May 2011, 8:56 AM
Thanks Max
Got that last night. Having got the add working from example from here, I thought that the delete would be the same, it took me a while to think that i was just dealing with a grid, the row I had just selected, then vua-la.

I know that this has probably already been asked but can the store for the complete tree be populated on load rather than from branch?

Stephen

Vanongart
6 Jun 2011, 2:23 AM
Hi,

First: Great Plugin, thanks for sharing!!

Secod: Is there any way to dynamicaly calculate sums on non-leaf level?

To Explain in more detail:

I have data in an hierarchical structure - where only the leaf level can be modified.
Now I would like to have on each non-leaf node a (recursive) sum over all child nodes.

Is this by any change already implemented, if not - how would be the best approach to do so?

mrdoom
26 Jun 2011, 8:24 PM
Hey thanks for this plugin, could be explained as I can put summary bar

Thank you.

corsons
30 Jun 2011, 2:05 PM
When insereing a node off the root node using ext id as node id, the new node appreas at the end of the node list ( I assume that nodes are ordered by Id ). How would one insert a node in the middle of siblings?

Would the following node ids have to be shifted (renumbered) from the following sibling and how, has anybody got any ideas on this subject?

Stephen

Matt Bittner
16 Aug 2011, 9:29 AM
I have the following:


var record = Ext.data.Record.create([
{name: 'id'},
{name: 'parent_id'},
{name: 'leaf'},
{name: 'A'},
{name: 'B'}
]);

var store = new Ext.ux.maximgb.tg.AdjacencyListStore({
autoLoad: true,
url: 'get_new_tree.sql&params='params,
reader: new Ext. data.JsonReader({
idProperty: 'id',
root: 'results',
totalProperty: 'total',
successProperty: 'success',
fields: [
{name: 'id', mapping: 'id'},
{name: 'parent_id', mapping: 'parent_id'},
{name: 'leaf', mapping: 'leaf'},
{name: 'A', mapping: 'A'},
{name: 'B', mapping: 'B'}
]},
record
)});

Why can't I see 'id', 'parent_id' and 'leaf' is always displaying 'false', even when all data is coming from the database correctly? TIA!

corsons
16 Aug 2011, 2:48 PM
Should variables be _id, _parent_id and _is_leaf?

Matt Bittner
17 Aug 2011, 3:24 AM
Should variables be _id, _parent_id and _is_leaf?

We have constraints on our database that don't allow an underscore as the first character. I changed everything I could within TreeGrid.js. I hope I found everything.

Never mind, figured it out.

ustim
12 Oct 2011, 12:40 AM
Привет, Максим.
Используя Ваш компонент заметил одну странность:
28620
В этом примере используется AdjacencyListStore. Исследование разметки показало, что это не из-за стилей, он физически вставляет разметку в конец списка.
Версия ExtJS 3.3.0.

sureace
29 Mar 2012, 5:38 AM
Hi everybody,
I am new this plug-in. When i try with the below code, i am not able to see the list in the code. Can any one tell me where i did the mistake.


var fields = [
{name: 'acctClient'},
{name: 'account'},
{name: 'shortName'},
{name: 'forms'},
{name: 'doc'},
{name: 'desc'},
{name: 'revision'},
{name: 'scan'},
{name: 'statusDate'},
{name: 'frame'},
{name: 'loc'},
{name: 'status'},
{name: '_id', type: 'int'},
{name: '_parent', type: 'int'},
{name: '_is_leaf', type: 'bool'}
];
var data = [
{
"rows": [
{
"_id":1,"_parent":null,"_is_leaf":false,"acctClient":"","account":"","shortName":"","forms":"CL-SVC-SEL","doc":"","desc":"ACCOUNT SERVICES SELECTION","revision":"11-2005","scan":"03/15/2006","statusDate":"","frame":"SEZ","loc":"CMD","status":"Accepted"
},
{
"_id":2,"_parent":1,"_is_leaf":true,"acctClient":"","account":"","shortName":"","forms":"","doc":"DF","desc":"FDIC ADDENDUM FOR TRUST ACCTS","revision":"","scan":"","statusDate":"","frame":"","loc":"","status":""
}
],
"success":true,
"total":2
}
];
var acctMaintStore = new Ext.ux.maximgb.tg.AdjacencyListStore({
autoLoad : true,
leaf_field_name: "_is_leaf",
parent_id_field_name: "_parent",
reader: new Ext.data.JsonReader({
idProperty: '_id',
root: 'rows',
fields: fields
}),
proxy: new Ext.data.MemoryProxy(data)
});
var resultPanel = new Ext.ux.maximgb.tg.GridPanel({
store: acctMaintStore,
enableHdMenu : false,
master_column_id : "forms",
disableSelection : true,
columns: [
{header: "Account/Client", hidden: true, width: 100, sortable: true, dataIndex: 'acctClient'},
{header: "Account", hidden: true, width: 100, sortable: true, dataIndex: 'account'},
{header: "Short Name (Friendly)", hidden: true, width: 150, sortable: true, dataIndex: 'shortName'},
{header: "Forms", width: 100, sortable: true, dataIndex: 'forms',id:"forms"},
{header: "Doc Cd", width: 125, sortable: true, dataIndex: 'doc'},
{header: "Description", width: 125, sortable: true, dataIndex: 'desc',id:'auto-expand-column-acct-maint'},
{header: "Revision", hidden: false, width: 125, sortable: true, dataIndex: 'revision'},
{header: "Scan", hidden: false, width: 125, sortable: true, dataIndex: 'scan'},
{header: "Status Date", width: 75, sortable: true, dataIndex: 'statusDate'},
{header: "Frame", hidden: false, width: 75, sortable: true, dataIndex: 'frame'},
{header: "Loc", hidden: false, width: 75, sortable: true, dataIndex: 'loc'},
{header: "Status", width: 75, sortable: true, dataIndex: 'status'},
{header: "Action", width: 150, sortable: false,dataIndex:'action'}
],
stripeRows: true,
autoExpandColumn: 'auto-expand-column-acct-maint',
region: 'center',
margins : '0 0 0 0',
header : false,
border: false,
title:'Results Panel'
});
var vp = new Ext.Viewport({
layout : 'fit',
items : resultPanel
});



Thanks
Sureace

wki01
8 Apr 2012, 3:55 AM
Hello Maximgb.

Is available a version of your grid (and in particular for adiacent store) for version 4.1 of extjs?
If yes, what is the cost of the license?

(PS: I can not send you a PM message, your mailbox has exceeded stored private messages quota and can not accept further top messages)

Thank you.

jkliou
5 May 2012, 6:19 PM
to shr1975:
did you solve you problem?


...
var store = new Ext.ux.maximgb.tg.AdjacencyListStore({ //Ext.ux.maximgb.tg.NestedSetStore({
autoLoad: true,
url: '....',
reader: new Ext.data.JsonReader(
{
id: '_id',
root: 'data',
totalProperty: 'total',
successProperty: 'success'
},
record
),
listeners: {
'beforeload': function() {
var el = this.getEl();
if (el) {
el.mask(GO.lang.waitMsgLoad);
}
},
'load': function() {
var el = this.getEl();
if (el) {
el.unmask();
}
},
scope: this
}
});
...



Thanks for this great plugin MaximGB.

It perfectly fits in for our requirement.

However, there's one problem that we are facing and cannot put a finger on the exact problem area. Our grid has about 150 rows but the performance in IE (we tried with 7 and 8) is very low. After the rows are loaded into the grid, it takes ages to respond to anything - expanding, rendering the editor, scrolling.

Here's my code:


/**
* Config options
* **************
* taskId
* mainTaskId
* columnModel
* formName
* containerEl
* isStateChanged
* stateJSON
* sortField
* sortDirection
* groupField
* gridTitle
* inDetailPage
*/

function GSCompare(config)
{
/*
* Config member variables.
*/
this.taskId = config.taskId;
this.mainTaskId = config.mainTaskId;
this.columnModel = config.columnModel;
this.formName = config.formName;
this.containerEl = config.containerEl;
this.isStateChanged = config.isStateChanged;
this.stateJSON = config.stateJSON;
this.sortField = config.sortField;
this.sortDirection = config.sortDirection;
this.groupField = config.groupField;
this.gridTitle = config.gridTitle;
this.inDetailPage = config.inDetailPage;

/*
* Member variables
*/
this.grid;
this.ds;
this.cm;
this.storeList = {};
this.fixedWidth = 550;
//this.fixedHeight = 375;
this.firstTimeRender = true; //This is to check if the compare grid is being rendered for the first time.
//If it is so, then after the grid data is loaded, the criteria section will be hidden.
this.init = function()
{
/*
* Whatever initializations have to be done will be done here.
*/
this.initCompareGrid();
this.adjustGridSize();
Ext.EventManager.onWindowResize(this.adjustGridSize, this, false);
};
/**
* This function set the height of the grid.
* If no fixed height is specified the height is set to the
* maximum value that does not require scrolling on a page level.
*/
this.adjustGridSize = function()
{
var el = this.grid.getEl();
var gridObj = this.grid;

// this is to adjust the width to the width of the parent element needed for FF3 and IE6
gridObj.setWidth(this.fixedWidth);
gridObj.setWidth(el.findParent('td', null, true).getComputedWidth());

var tblHeight = this.fixedHeight;
if(!tblHeight)
{
var curTblHeight = el.getHeight();
var winHeight = Ext.getBody().getHeight();
var footer = Ext.fly('footerTbl');
var menuTD = Ext.fly('menuTD');
var compareEntities = Ext.fly('gs_compareEntities_' + this.taskId);
//var curDomHeight = footer.getHeight() + footer.getTop() ; //+ compareEntities.getHeight();
var curDomHeight = footer.getHeight() + menuTD.getBottom(false) + compareEntities.getHeight();
tblHeight = (winHeight - curDomHeight -20);// + curTblHeight);
if (tblHeight < 350)
{
tblHeight = 350;
}
}

logger.info("Table height: " + tblHeight);

gridObj.setSize({height: tblHeight});
el.setHeight(tblHeight);
};

this.renderDate = function(dateString, frmt)
{
try
{
var fmtDate = Date.parseDate(dateString, frmt);
if (fmtDate != undefined)
return fmtDate.format(frmt);
else
return Ext.util.Format.date(dateString, frmt);
}
catch(e)
{
return dateString;
}
};

this.checkGridDates = function(value)
{
if(value=='n' || value=='N')
{
this.setValue(new Date());
}
else if(value=='t' || value=='T')
{
var dte = new Date();
dte.setHours(00,00,00,00);
this.setValue(dte);
}
else
return true;
};

this.syncCompareGridWithState = function()
{
var parentObj = this;
if (this.isStateChanged)
{
this.stateJSON = Ext.util.JSON.decode(this.stateJSON) // Convert the JSON string to a JSON object.

var grid = this.grid;
var store = grid.getStore();
var gcColIndex = grid.getColumnModel().findColumnIndex('gc');
store.modified = [];

for (var i=0; i < parentObj.stateJSON.length; i++)
{
var row = parentObj.stateJSON[i]; // Each item in this JSON is a row.

var recIndex = store.findBy(function(rec){
if (rec.get('datagroup') === row.datagroup && rec.get('fieldLabel') === row.modifiedCol)
return true;
});

Ext.fly(grid.getView().getCell(recIndex, gcColIndex)).addClass('x-grid3-dirty-cell'); //Show the indicator that the cell has been edited.
}
}
};

this.showDifference = function()
{
var parentObj = this;
var store = this.ds;
var grid = this.grid;
var gcColIndex = grid.getColumnModel().findColumnIndex('gc');

store.each(function(rec)
{
var valuesDifferent = rec.get('valuesDifferent');
var lockStatus = rec.get('lock-status');
var rowIndex = store.indexOf(rec);
var elem = Ext.fly(grid.getView().getCell(rowIndex, gcColIndex));
if (valuesDifferent)
{
/*var index = store.indexOf(rec);

var rowElem = Ext.get(parentObj.grid.getView().getRow(index));
rowElem.addClass('gs_compareDiff');*/
var value = rec.get('fieldLabel');
value = "*" + value;
rec.set('fieldLabel', value);
}
if(lockStatus === 'ATTR')
{
elem.addClass('gs_locked');
}else if(lockStatus === 'PERP')
{
elem.addClass('gs_permlocked');
}else
{

elem.removeClass([ 'gs_locked', 'gs_permlocked']);

}

}
);
};

this.alignNumberFields = function()
{
var parentObj = this;

var store = this.ds;

store.each(function(rec)
{
var dataType = rec.get('dataType');
if (dataType === 'number')
{
var columnModel = parentObj.grid.getColumnModel();
var columnCount = columnModel.getColumnCount(true);
var gridView = parentObj.grid.getView();

for (var i = 0; i < columnCount; i++)
{
if (columnModel.getDataIndex(i) != 'fieldLabel')
{
gridView.getCell(rec.store.indexOf(rec), i).align = "right";
}
}
}
});
};

this.submitCompareState = function(params)
{
if(this.inDetailPage)
GS.submitFormPPR(this.formName, GS.noResponseId, params, null, false, false);
else
GS.submitFormPPR(this.formName, GS.noResponseId,
{event: params.event,
modifiedCol: params.modifiedCol,
colValue: params.colValue,
datagroup: params.datagroup,
recordId: params.recordId,
taskId: params.taskId
}, null, false, false);
};

this.adjustColumnWidths = function()
{
var minWidth = 100;
var maxWidth = 250;
var colWidth = 100;
var finalColWidth = 100;
var header = '';
var colValue = '';
var colModel = this.grid.getColumnModel();
var store = this.grid.getStore();
var rec;

var conversionFactor = 6;

/*var j = this.selectionType === 'none' ? 1 : 2;*/
for (var j = 0; j < this.columnModel.length; j++)
{
minWidth = 100;
maxWidth = 250;
colWidth = 100;
finalColWidth = 100;
var colConfig = colModel.getColumnById(colModel.getColumnId(j));

if (!colModel.isHidden(j)) // && !colConfig.userSetWidth
{
header = colModel.getColumnHeader(j);
colWidth = header.length *conversionFactor;

finalColWidth = colWidth;
/*if (colWidth < minWidth)
finalColWidth = minWidth;*/
if (colWidth > maxWidth)
finalColWidth = maxWidth;

for (i =0; i < store.getCount(); i++)
{
rec = store.getAt(i);
colValue = rec.get(colModel.getDataIndex(j));

// Check if it is a domval field.
/*if (colConfig.isDomValFld)
{
colValue = this.convertDomVal(colConfig.domValStore, colValue);
}*/

if (!colValue)
colValue = '';

colWidth = colValue.length *conversionFactor;

if (colWidth > finalColWidth)
finalColWidth = colWidth;

/*if (finalColWidth < minWidth)
finalColWidth = minWidth;*/
if (finalColWidth > maxWidth)
finalColWidth = maxWidth;

if (j === 0)
finalColWidth += 50;
}
finalColWidth += 70;
colModel.setColumnWidth(j, finalColWidth);
}
}
};

this.attachGridTooltips = function()
{
var grid = this.grid;
grid.tip = new Ext.ToolTip({
view: grid.getView(),
target: grid.getView().mainBody,
delegate: '.x-grid3-col',
trackMouse: true,
renderTo: document.body,
listeners: {
beforeshow: function updateTipBody(tip)
{
var rowIndex = tip.view.findRowIndex(tip.triggerElement);
var colIndex = tip.view.findCellIndex(tip.triggerElement);
var tTip = Ext.fly(tip.view.getCell(rowIndex, colIndex)).dom.innerHTML;

if (tTip.substring(tTip.indexOf('>') +1, tTip.lastIndexOf('</')) === '&nbsp;')
return false;

if (tTip.indexOf('<div class="ux-maximgb-tg-mastercell-wrap">') == 0)
tTip = Ext.util.Format.stripTags(tTip);

if (tTip === "" || tTip === "&nbsp;")
return false;

tip.body.dom.innerHTML = tTip;
}
}
});
};

this.showHideIcons = function(type, cellAction, records, action)
{
var record = undefined;

for (var i = 0; i < records.length; i++)
{
record = records[i];

var iconType = type+'-icon';
if(type === 'vddb' && record.get('vddbStatType')!= undefined && record.get('vddbStatType')!='')
iconType = type+record.get('vddbStatType')+'-icon';

if (action === 'hide')
{
if (record.get(cellAction) === iconType )
{
record.set(cellAction, 'hidden');
}
}
else
{
if (record.get(cellAction) === 'hidden')
record.set(cellAction, iconType);
}
}
}

this.initCompareGrid = function()
{
//create the dataStore:
var colMapping = new Array();
var i=0;
for(i=0; i<this.columnModel.length; i++)
{
colMapping[i]={'name': this.columnModel[i].dataIndex};
}

var storeUrl;
storeUrl = '../Finders/getCompareResults.vm?allowRedirect=false&taskId=' + this.mainTaskId + '&srchTaskId=' + this.taskId;

colMapping.push({name: '_id', type: 'int'});
colMapping.push({name: '_level', type: 'int'});
colMapping.push({name: '_lft', type: 'int'});
colMapping.push({name: '_rgt', type: 'int'});
colMapping.push({name: '_is_leaf', type: 'bool'});

this.currTime = new Date();
this.finishTime = undefined;
var record = Ext.data.Record.create(colMapping);
this.ds = new Ext.ux.maximgb.tg.NestedSetStore({
reader: new Ext.data.JsonReader({id: '_id'}, record),
proxy: new Ext.data.HttpProxy({
url: storeUrl,
onBeforeLoad: function(dataProxy, params)
{
parentObj.currTime = new Date();
logger.info('before load proxy: ' + currTime);
},
onLoad: function(dataProxy, reqTransObj, options)
{
parentObj.finishTime = new Date();
logger.info('after load proxy: ' + finishTime);
logger.info('time difference proxy: ' + (finishTime - currTime) + ' ms.');
}
})
});

this.renderCompareGrid();
};

this.renderCompareGrid = function()
{
var parentObj = this;
if (!this.cm)
{
this.cm = new Ext.grid.ColumnModel({
columns: this.columnModel,
editors: {
'string': new Ext.grid.GridEditor(new Ext.form.TextField({})),
'number': new Ext.grid.GridEditor(new Ext.form.NumberField({})),
'date': new Ext.grid.GridEditor(new Ext.form.DateField({format: 'd-M-Y'
, validator: this.checkGridDates
,enableKeyEvents : true
,listeners:{
keydown: function(f, e)
{
if (e.getKey() == e.DOWN)
f.onTriggerClick();
}
}
})),
'dateTime': new Ext.grid.GridEditor(new Ext.form.DateField({format: 'd-M-Y h:i:s A'
, validator: this.checkGridDates
,enableKeyEvents : true
,listeners:{
keydown: function(f, e)
{
if (e.getKey() == e.DOWN)
f.onTriggerClick();
}
}
}))
},
moveColumn: function(oldIndex, newIndex)
{
if (oldIndex != 0 && newIndex != 0)
{
var c = this.config[oldIndex];
this.config.splice(oldIndex, 1);
this.config.splice(newIndex, 0, c);
this.dataMap = null;
this.fireEvent("columnmoved", this, oldIndex, newIndex);
}
},
getCellEditor: function(colIndex, rowIndex)
{
var rec = parentObj.ds.getAt(rowIndex);

if (rec.get('readOnly') === true)
return false;

var dataType = rec.get('dataType');
var fieldName = rec.get('fieldName');

if (dataType != 'dropDown' && dataType != 'customDropDown' && dataType != 'string')
{
if (dataType === 'date')
{
this.setRenderer(colIndex, function (data)
{
return parentObj.renderDate(data, 'd-M-Y');
});
}
else if (dataType === 'dateTime')
{
this.setRenderer(colIndex, function (data)
{
return parentObj.renderDate(data, 'd-M-Y h:i:s A');
});
}
return this.editors[dataType];
}
else
{
if (dataType === 'string' && !rec.get('hasValidValues'))
return this.editors[dataType];

this.setRenderer(colIndex, function(data)
{
if (parentObj.storeList[fieldName])
{
var record = parentObj.storeList[fieldName].getById(data);
if(record)
{
return record.data.text;
}
else
{
return data;
}
}
}
);
var comboStore;
var domValFld = '';
if (dataType === 'customDropDown')
{
domValFld = rec.get('customDomVal');
}
else
{
domValFld = fieldName;
}

if (!parentObj.storeList[fieldName])
{
var domValURL = '../Finders/getDomVals.vm?allowRedirect=false&taskId=' + parentObj.mainTaskId + '&srchTaskId=' + parentObj.taskId + '&domValFld=' + domValFld;

if (rec.get('hasValidValues'))
domValURL = '../Finders/getValidVals.vm?allowRedirect=false&taskId=' + parentObj.mainTaskId + '&compareTaskId=' + parentObj.taskId + '&domValFld=' + rec.get('fullName');

comboStore = new Ext.data.Store(
{
proxy: new Ext.data.HttpProxy({
url: domValURL
}),
reader: new Ext.data.JsonReader(
{root: 'options', id: 'value'},
[
{name: 'text'},
{name: 'value'}
]
)
}
);
comboStore.load();
parentObj.storeList[fieldName] = comboStore;
}
else
{
comboStore = parentObj.storeList[fieldName];
}

return new Ext.grid.GridEditor(new Ext.form.ComboBox({
allowBlank: true,
store: comboStore,
displayField:'text',
valueField: 'value',
lazyInit: false,
lazyRender:false,
typeAhead:false,
triggerAction: 'all',
editable: false,
forceSelection:true,
loadingText: 'Fetching list...',
emptyText:'Select...',
resizable:true}));
}
return Ext.grid.ColumnModel.prototype.getCellEditor(this, colIndex, rowIndex);
}
});
}

this.cellActions = new Ext.ux.grid.CellActions({
listeners:{
action:function(grid, record, action, value)
{
if (action === 'vddbgreen-icon' || action === 'vddbyellow-icon' || action === 'vddbred-icon')
{
var fieldName = record.get('fieldName');
var tableName = fieldName.substring(0, fieldName.indexOf('.'));
fieldName = fieldName.substring(fieldName.indexOf() +1);
loadJS('mainForm',
{
event: 'openLookup',
lookupType: 'CompareVDDB',
oid: record.get('oid'),
lookupFields: fieldName,
tableName: tableName
});
}
else if (action === 'cdc-icon')
{
var fieldName = record.get('fieldName');
var tableName = fieldName.substring(0, fieldName.indexOf('.'));
fieldName = fieldName.substring(fieldName.indexOf() +1);
loadJS('mainForm',
{
event: 'openLookup',
lookupType: 'CompareCDC',
oid: record.get('oid'),
lookupFields: fieldName,
tableName: tableName
});
}
else if (action === 'chal-icon')
{
/*loadJS('mainForm',
{
event:'openLookup',
lookupId:'ft_t_chal',
lookupType:'CHAL',
'lookupCondition':"chal_oid='" + record.get('chal-oid') + "'",
'searchSettings':'autoExecute:true,lookupInWindow:true'
});*/

window.open("../Finders/Lookup.vm?event=openLookup&lookupType=CHAL&lookupId=ft_t_chal&lookupCondition=chal_oid='" + record.get('chal-oid') + "'&searchSettings=autoExecute:true");
}
else if(action === 'fvsh-icon')
{
loadJS('mainForm',
{
event:'openLookup',
lookupId:'fvshLookup',
lookupType:'VDDB',
'showStartQueryButton':'false',
'showClearButton':'false',
'showConfigScreen':'false',
'showCancelButton':'false',
'allowPersistence':'false',
'lookupType':'null',
'lookupCondition':" ft_t_fvsh.tbl_id='"+record.get('table_id') +"'and ft_t_fvsh.col_nme in ('"+ record.get('col_name')+"') and VSH_TBL_KEY_TXT='"+record.get('fvsh-oid')+"' ",
'searchSettings':'autoExecute:true,lookupInWindow:true'});
}
}
},
align:'right'
});

this.grid = new Ext.ux.maximgb.tg.EditorGridPanel({
store: this.ds,
master_column_id : 'fieldLabel',
plugins: this.cellActions,
autoScroll: true,
clicksToEdit: 1,
cm: this.cm,
viewConfig: {hideGroupedColumn: true, forceFit: true},
title: this.gridTitle,
iconCls: 'icon-grid',
el: this.containerEl,
stateful: false,
autoExpandColumn: 'fieldLabel',
tools:[{
id: 'hideVDDB',
hidden: true,
qtip: 'Hide VDDB Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('vddb', 'action1', store.getRange(), 'hide');
Ext.fly(parentObj.grid.tools.hideVDDB).hide();
Ext.fly(parentObj.grid.tools.showVDDB).show(true);
}
},{
id: 'showVDDB',
hidden: false,
qtip: 'Show VDDB Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('vddb', 'action1', store.getRange(), 'show');
Ext.fly(parentObj.grid.tools.showVDDB).hide();
Ext.fly(parentObj.grid.tools.hideVDDB).show(true);
}
},{
id: 'hideCDC',
hidden: true,
qtip: 'Hide CDC Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('cdc', 'action2', store.getRange(), 'hide');
Ext.fly(parentObj.grid.tools.hideCDC).hide();
Ext.fly(parentObj.grid.tools.showCDC).show(true);
}
},{
id: 'showCDC',
hidden: false,
qtip: 'Show CDC Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('cdc', 'action2', store.getRange(), 'show');
Ext.fly(parentObj.grid.tools.showCDC).hide();
Ext.fly(parentObj.grid.tools.hideCDC).show(true);
}
},{
id: 'hideCHAL',
hidden: true,
qtip: 'Hide CHAL Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('chal', 'action3', store.getRange(), 'hide');
Ext.fly(parentObj.grid.tools.hideCHAL).hide();
Ext.fly(parentObj.grid.tools.showCHAL).show(true);
}
},{
id: 'showCHAL',
hidden: false,
qtip: 'Show CHAL Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('chal', 'action3', store.getRange(), 'show');
Ext.fly(parentObj.grid.tools.showCHAL).hide();
Ext.fly(parentObj.grid.tools.hideCHAL).show(true);
}
},{
id: 'hideFVSH',
hidden: true,
qtip: 'Hide FVSH Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('fvsh', 'action4', store.getRange(), 'hide');
Ext.fly(parentObj.grid.tools.hideFVSH).hide();
Ext.fly(parentObj.grid.tools.showFVSH).show(true);
}
},{
id: 'showFVSH',
hidden: false,
qtip: 'Show FVSH Lookup Icons',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
parentObj.showHideIcons('fvsh', 'action4', store.getRange(), 'show');
Ext.fly(parentObj.grid.tools.showFVSH).hide();
Ext.fly(parentObj.grid.tools.hideFVSH).show(true);
}
},
{
id: 'expand',
hidden: false,
qtip: 'Expand All',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
store.expandAll();
/*Ext.fly(parentObj.grid.tools.expand).hide();
Ext.fly(parentObj.grid.tools.collapse).show(true);*/
}
},{
id: 'collapse',
hidden: false,
qtip: 'Collapse All',
handler: function(event, toolEl, panel)
{
var store = parentObj.grid.getStore();
store.collapseAll();
/*Ext.fly(parentObj.grid.tools.collapse).hide();
Ext.fly(parentObj.grid.tools.expand).show(true);*/
}
}]
});

this.grid.render();
//this.adjustGridSize();
this.ds.on("beforeload", function(store, options)
{
parentObj.grid.getEl().mask("Populating grid...");
});

this.ds.on("load", function(store, records, options)
{
parentObj.grid.getEl().unmask();
});

this.currTime = new Date();
logger.info('before loading: ' + this.currTime);
this.ds.load({callback: function (records, options, success)
{
var finishTime = new Date();
logger.info('after loading: ' + finishTime);
logger.info("Time to load data: " + (finishTime - parentObj.currTime) + " ms.");
/*parentObj.syncCompareGridWithState();
parentObj.showDifference();
//parentObj.alignNumberFields();
parentObj.adjustColumnWidths();
parentObj.attachGridTooltips();*/
}});

this.grid.on('validateedit',
function(editObj)
{
if (editObj.value.dateFormat)
{
if (editObj.value.dateFormat('d-M-Y h:i:s A') === editObj.originalValue)
editObj.cancel = true;
else if (editObj.value.dateFormat('h:i:s A') === editObj.originalValue)
editObj.cancel = true;
}
else if ((editObj.originalValue === null && editObj.value === "") || (editObj.value === editObj.originalValue))
editObj.cancel = true;
}
);

this.grid.on("columnmove", function(oldIndex, newIndex)
{
parentObj.showDifference();
//parentObj.alignNumberFields();
}
);

this.grid.on("cellclick", function(grid, rowIndex, colIndex, evtObj)
{
var store = grid.getStore();
var record = store.getAt(rowIndex);

if (record.get("_is_leaf") === false)
{
if (store.isExpandedNode(record))
store.collapseNode(record);
else
store.expandNode(record);

Ext.get(grid.getView().getCell(rowIndex, colIndex)).removeClass('x-grid3-cell-selected');
}
else
return true;
});

this.grid.on("cellcontextmenu", function(grid, rowIndex, cellIndex, ev)
{
//innerHtml.substring(innerHtml.indexOf('>') +1, innerHtml.lastIndexOf('<'))
ev.stopEvent();
var rec = parentObj.ds.getAt(rowIndex);

if (rec.get("_is_leaf") != false)
{
var coords = ev.getXY();

//var cell = grid.getView().getCell(rowIndex, cellIndex);
var gcColIndex = grid.getColumnModel().findColumnIndex('gc');
if (cellIndex != 0 && cellIndex != gcColIndex)
{
var menu = new Ext.menu.Menu({
id: 'compareCtxtMenu'
});
menu.on("hide", function(menuComponent){
Ext.get(grid.getView().getCell(rowIndex, cellIndex)).removeClass('gs_focusCell');
menuComponent.destroy();

});
menu.addMenuItem({text: 'Copy To GC'}).
setHandler(function(item, ev){
/*var innerHtml = grid.getView().getCell(rowIndex, cellIndex).innerHTML;
var text = innerHtml.substring(innerHtml.indexOf('>') +1, innerHtml.lastIndexOf('<'));

var gcColIndex = grid.getColumnModel().findColumnIndex('gc');
var gcInnerHTML = grid.getView().getCell(rowIndex, gcColIndex).innerHTML;
gcInnerHTML = gcInnerHTML.substring(0, gcInnerHTML.indexOf('>') +1) + text + gcInnerHTML.substring(gcInnerHTML.lastIndexOf('<'));
grid.getView().getCell(rowIndex, gcColIndex).innerHTML = gcInnerHTML;
grid.getView().focusCell(rowIndex, cellIndex);*/
var cm = grid.getColumnModel();
var data = rec.get(cm.getColumnById(cm.getColumnId(cellIndex)).dataIndex);
rec.data['gc'] = data;
rec.commit();
var elem = Ext.get(grid.getView().getCell(rowIndex, gcColIndex));
var lockStatus = rec.get('lock-status');
Ext.fly(grid.getView().getCell(rowIndex, gcColIndex)).frame("E31014", 1, { duration: 1 });
Ext.fly(grid.getView().getCell(rowIndex, gcColIndex)).addClass('x-grid3-dirty-cell'); //Show the indicator that the cell has been edited.

var from = cm.getColumnById(cm.getColumnId(cellIndex)).dataIndex;
var datagroup = rec.get('datagroup');
var fieldName = rec.get('fieldLabel');
var path = rec.id;
if(lockStatus === 'ATTR')
{
elem.addClass('gs_locked');
}
else if(lockStatus === 'PERP')
{
elem.addClass('gs_permlocked');
}else
{
elem.removeClass([ 'gs_locked', 'gs_permlocked']);
}
if(parentObj.inDetailPage)
GS.submitFormPPR(parentObj.formName, GS.noResponseId,
{event: 'copyToGC',
from: from,
path :path,
fld_value : data,
dataGroup: datagroup,
fld_nme: fieldName.replace("*",""),
srchTaskId: taskId,
taskId: mainTaskId
}, null, false, false);
else
GS.submitFormPPR(parentObj.formName, GS.noResponseId,
{event: 'copyToGC',
from: from,
fld_value : data,
path:path,
dataGroup: datagroup,
fld_nme: fieldName.replace("*",""),
taskId: taskId
}, null, false, false);


});




Ext.get(grid.getView().getCell(rowIndex, cellIndex)).addClass('gs_focusCell');
menu.showAt([coords[0], coords[1]]);
}
}
});

this.grid.on('afteredit',
function(editObj)
{
//editObj properties: grid, record, field, value, originalValue, row, column
var rec = parentObj.ds.getAt(editObj.row);
var path = rec.id;
var lockStatus = rec.get('lock-status');
var fieldName = rec.get('fieldLabel');
var datagroup = rec.get('datagroup');
var editedValue = "" + editObj.value;
var rowIndex = editObj.row;
var gcColIndex = editObj.grid.getColumnModel().findColumnIndex('gc');
var elem = Ext.get(editObj.grid.getView().getCell(rowIndex, gcColIndex));
if(lockStatus === 'ATTR')
{
elem.addClass('gs_locked');
}else if(lockStatus === 'PERP')
{
elem.addClass('gs_permlocked');
}else
{

elem.removeClass([ 'gs_locked', 'gs_permlocked']);

}
parentObj.submitCompareState(
{event: 'saveCompareState',
modifiedCol: fieldName.replace("*",""),
colValue: editedValue,
datagroup: datagroup,
recordId: path,
srchTaskId: parentObj.taskId,
taskId: parentObj.mainTaskId
});
}
);
};
this.init();
}

showHideCompareCriteria = function(hideOnly, formName, taskId, criteriaExpanded)
{
if(hideOnly && !criteriaExpanded)
return true;

var compareCritElem = Ext.fly('gs_compareEntities_' + this.taskId);

if (compareCritElem != undefined) //Can be undefined if 'showCriteria' is set to false.
{
toggleSection('gs_compareEntities_' + taskId, formName, null, null, null, taskId);
criteriaExpanded = !criteriaExpanded;
}
return false;
}

Ext.override(Ext.ToolTip, {
dismissDelay: 10000,
onTargetOver : function(e){
if(this.disabled || e.within(this.target.dom, true)){
return;
}
var t = e.getTarget(this.delegate);
if (t) {
this.triggerElement = t;
this.clearTimer('hide');
this.targetXY = e.getXY();
this.delayShow();
}
},
onMouseMove : function(e){
var t = e.getTarget(this.delegate);
if (t) {
this.targetXY = e.getXY();
if (t === this.triggerElement) {
if(!this.hidden && this.trackMouse){
this.setPagePosition(this.getTargetXY());
}
} else {
this.hide();
this.lastActive = new Date(0);
this.onTargetOver(e);
}
} else if (!this.closable && this.isVisible()) {
this.hide();
}
},
hide: function(){
this.clearTimer('dismiss');
this.lastActive = new Date();
delete this.triggerElement;
Ext.ToolTip.superclass.hide.call(this);
}
});


Could you please help me out here or point me in the right direction?

dhanrajb4
28 Dec 2012, 2:40 AM
hi,

i am trying to render an editor grid panel inside a panel and column headers is not shown

on load the column header is shown when the AdjacencyListStore data is loaded the column header goes invisible

note:when i mouse over on the header section of the editor grid panel the column headers are shown.

please help me in showing the column headers when the store is loaded:(

its happening only in IE