if (!empty($_SERVER['HTTP_CLIENT_IP']))
$ip=$_SERVER['HTTP_CLIENT_IP'];
else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
else
$ip=$_SERVER['REMOTE_ADDR'];
?>
Orgchart is a tree browser (or the so called SpaceTree) that offers a convenient way to display data, inspired by JavaScript InfoVis Toolkit. The Orgchart consists of nodes and paths while path represents the links connecting the nodes. You can expand or collapse individual nodes in the tree to show or hide its children. You can also change the attributes to affect how the tree is displayed. For example, you can use level to adjust the number of levels that are shown in the tree.
Example Scenario
Suppose we want to make an orgchart to display a company’s staffs’ information and their relations.
SpaceTree Layout
To show the SpaceTree layout visualization, we need an orgchart component. The template tag refers the staff’s name as the node label. We have also added a button for adding or removing a node.
Now, we can put the staffs’ information into a Java bean (or the data of node) which is called UserDataBean, then we use the UserDataBean as the data of SpaceTreeNode and create their relations in SpaceTreeNode.
Insert staff information into Java Bean
UserDataBean represents the data of SpaceTreeNode and SpaceTreeNode makes up the SpaceTree. You can use template tag in zul or customize the item renderer in a composer to generate the value which shows on the node label. By default the value will be object#toString().
Java Bean
// customize your java bean
public class UserDataBean {
private String name;
private int age;
// constructor, getter and setter
}
Initialize SpaceTree
Create some SpaceTree nodes and combine all nodes together. The ItemRenderer is used to customize the value that shows on the node label. You can customize the item renderer if you don’t want to use template tag in zul or override object#toString().
Composer
public class SpaceTreeComposer extends SelectorComposer<Window> {
@Wire("#myComp")
private Orgchart myComp;
public void doAfterCompose(Window comp) throws Exception {
super.doAfterCompose(comp);
// set true in last argument, that means is root
SpaceTreeNode<UserDataBean> root =
new SpaceTreeNode(null, null, true);
SpaceTreeNode<UserDataBean> spacetreeRoot =
new SpaceTreeNode(new UserDataBean("Peter", 23), null);
root.add(spacetreeRoot);
SpaceTreeNode<UserDataBean> first =
new SpaceTreeNode(new UserDataBean("Jason", 1), null);
SpaceTreeNode<UserDataBean> second =
new SpaceTreeNode(new UserDataBean("Partick", 23), null);
spacetreeRoot.add(first);
spacetreeRoot.add(second);
SpaceTreeNode jack =
new SpaceTreeNode(new UserDataBean("Jack", 11),
null);
SpaceTreeNode mary =
new SpaceTreeNode(new UserDataBean("Mary", 12),
null);
first.add(jack);
first.add(mary);
first.add(new SpaceTreeNode(new UserDataBean("Jean", 13), null));
second.add(new SpaceTreeNode(new UserDataBean("Sam", 21), null));
second.add(new SpaceTreeNode(new UserDataBean("Tom", 22), null));
second.add(new SpaceTreeNode(new UserDataBean("Tim", 23), null));
// customize your renderer, the data means your bean, and index means the node id
// myComp.setItemRenderer(new ItemRenderer() {
// @Override
// public String render(Component owner, Object data, int index) {
// return ((UserDataBean) data).getName();
// }
// });
SpaceTreeModel model = new SpaceTreeModel(root);
model.addToSelection(mary);
myComp.setModel(model);
}
@Listen("onClick= #add")
public void addNode() {
SpaceTreeNode<UserDataBean> childNode = new SpaceTreeNode(
new UserDataBean("Allen", 27), null);
SpaceTreeNode seldNode = myComp.getSelectedNode();
if (seldNode != null) {
seldNode.add(childNode);
}
}
@Listen("onClick= #remove")
public void removeNode() {
SpaceTreeNode seldNode = myComp.getSelectedNode();
if (seldNode != null) {
seldNode.removeFromParent();
}
}
@Listen("onSelect= #myComp")
public void editNode() {
SpaceTreeNode seld = myComp.getSelectedNode();
UserDataBean data = (UserDataBean) seld.getData();
data.setName("Augustin");
seld.setData(data);
}
}
Demo
You can download the complete source code for this example from its github repository here.
Well done guys!
Working with knowledge modelling and ontologies I’ve been expecting such a component for a long time.
Will it be added to the default component set?
Any further development planned?
It would be great if not only hierarchical relations are shown but also point-to-point relations as well…
S
Well done guys!
Working with knowledge modelling and ontologies I’ve been expecting such a component for a long time.
Will it be added to the default component set?
Any further development planned?
It would be great if not only hierarchical relations are shown but also point-to-point relations as well…
S
Thank’s for shearing that.
how to start using this?
If data is more the 40 than how to make orgchart scrollable window to see all organization without drag and drop with mouse???.