Build organization chart image in Vue Diagram component

17 Mar 202314 minutes to read

In the organizationchart, bind the text inside the rectangle node annotation. In this section, you can see how to build the organization chart with Image nodes.

Step1

The following code snippet are used to bind the data source to dataSourceSettings and how to map the image source from the data source.

// Data source
export let data = [{
        Id: "parent",
        Role: "Project Management",
        ImageUrl: "./diagram/images/employees/image30.png"
    },
    {
        Id: 1,
        Role: "R&D Team",
        Team: "parent",
        ImageUrl: "./diagram/images/employees/image2.png"
    }
];

Step2

Image nodes can be created on the organization chart using the doBinding method. In this method, you can customize the nodes properties.
In the following code sample, the image node and annotation properties can be customized. Refer to the image node for creating the image node.

export default {
    data() {
        return{
          dataSourceSettings: {
            doBinding: (node, data) => {
                node.shape = {
                    // sets the type of the shape as image
                    type: 'Image',
                    // image url for the image node
                    source: node.data.ImageUrl,
                    // sets the alignment the image
                    align:'XMinYMin',

                };
                node.annotations = [{
                    // sets the annotation content for the Node
                    content:node.data.Name,
                    // sets postions of the annotation
                    offset:{x:0.82, y:0.9}}];
            }
        }
    }
// ...
// ...
}
}
<template>
    <div id="app">
        <ejs-diagram id="diagram" :width='width' :height='height' :getNodeDefaults='getNodeDefaults'  :snapSettings='snapSettings':getConnectorDefaults='getConnectorDefaults' :layout='layout' :dataSourceSettings='dataSourceSettings' ></ejs-diagram>
    </div>
</template>
<script>
    import Vue from 'vue';
    import { DiagramPlugin,Diagram, HierarchicalTree, DataBinding,DiagramTools,NodeModel } from '@syncfusion/ej2-vue-diagrams';
    import { DataManager,Query } from "@syncfusion/ej2-data";
    Diagram.Inject(DataBinding, HierarchicalTree);
    Vue.use(DiagramPlugin);


    export let data = [{
            'Id': 'parent', 'Name': 'Maria Anders', 'Designation': 'Managing Director',
            'ImageUrl': 'https://d1nhio0ox7pgb.cloudfront.net/_img/g_collection_png/standard/512x512/businessman.png', 'IsExpand': 'true', 'RatingColor': '#C34444'
        },
        {
            'Id': 1, 'Name': 'Ana Trujillo', 'Designation': 'Project Manager',
            'ImageUrl': 'https://d1nhio0ox7pgb.cloudfront.net/_img/g_collection_png/standard/512x512/businessman.png', 'IsExpand': 'false',
            'RatingColor': '#68C2DE', 'ReportingPerson': 'parent'
        },
        {
            'Id': 2, 'Name': 'Anto Moreno', 'Designation': 'Project Lead',
            'ImageUrl': 'https://d1nhio0ox7pgb.cloudfront.net/_img/g_collection_png/standard/512x512/businessman.png', 'IsExpand': 'false',
            'RatingColor': '#93B85A', 'ReportingPerson': 1
        },
        {
            'Id': 3, 'Name': 'Thomas Hardy', 'Designation': 'Senior S/w Engg',
            'ImageUrl': 'https://d1nhio0ox7pgb.cloudfront.net/_img/g_collection_png/standard/512x512/businessman.png', 'IsExpand': 'false',
            'RatingColor': '#68C2DE', 'ReportingPerson': 2
        },
        {
            'Id': 4, 'Name': 'Christina kaff', 'Designation': 'S/w Engg',
            'ImageUrl': 'https://d1nhio0ox7pgb.cloudfront.net/_img/g_collection_png/standard/512x512/businessman.png', 'IsExpand': 'false',
            'RatingColor': '#93B85A', 'ReportingPerson': 3
        },
        {
            'Id': 5, 'Name': 'Hanna Moos', 'Designation': 'Project Trainee',
            'ImageUrl': 'https://d1nhio0ox7pgb.cloudfront.net/_img/g_collection_png/standard/512x512/businessman.png', 'IsExpand': 'true',
            'RatingColor': '#D46E89', 'ReportingPerson': 4
        },
        {
            'Id': 6, 'Name': 'Peter Citeaux', 'Designation': 'Project Trainee',
            'ImageUrl': 'https://d1nhio0ox7pgb.cloudfront.net/_img/g_collection_png/standard/512x512/businessman.png', 'IsExpand': 'true',
            'RatingColor': '#68C2DE', 'ReportingPerson': 4
        },
        {
            'Id': 7, 'Name': 'Martín Kloss', 'Designation': 'Senior S/w Engg',
            'ImageUrl': 'https://d1nhio0ox7pgb.cloudfront.net/_img/g_collection_png/standard/512x512/businessman.png', 'IsExpand': 'false',
            'RatingColor': '#93B85A', 'ReportingPerson': 1
        },
        {
            'Id': 9, 'Name': 'Elizabeth Mary', 'Designation': 'Project Trainee',
            'ImageUrl': 'https://d1nhio0ox7pgb.cloudfront.net/_img/g_collection_png/standard/512x512/businessman.png', 'IsExpand': 'None',
            'RatingColor': '#93B85A', 'ReportingPerson': 8
        },
        {
            'Id': 10, 'Name': 'Victoria Ash', 'Designation': 'Project Trainee',
            'ImageUrl': 'https://d1nhio0ox7pgb.cloudfront.net/_img/g_collection_png/standard/512x512/businessman.png', 'IsExpand': 'None',
            'RatingColor': '#D46E89', 'ReportingPerson': 8
        }
];
let items = new DataManager(data, new Query().take(7));
export default {
    name: 'app',
    data() {
        return {
            width: "100%",
            height: "590px",
            //Uses layout to auto-arrange nodes on the Diagram page
            snapSettings: {
                constraints: 0
            }, //Uses layout to auto-arrange nodes on the Diagram page
            layout: {
                //Sets layout type
                type: 'OrganizationalChart',
                getLayoutInfo: (node, options) => {
                    if (!options.hasSubTree) {
                        options.type = 'Center';
                        options.orientation = 'Horizontal';
                    }
                }
            }, //Configures data source for Diagram
            dataSourceSettings: {
                id: 'Id',
                parentId: 'ReportingPerson',
                dataManager: items
            },
            //Sets the default properties for nodes and connectors
            getNodeDefaults: (obj, diagram) => {
                obj.width = 150;
                obj.height = 50;
                obj.style.fill = '#6BA5D7';
                obj.shape = {
                    type: 'Image', source: (obj.data).ImageUrl,align:'XMinYMin',

                };
                obj.annotations = [{content:(obj.data).Name, offset:{x:0.7, y:0.5}}];
                return obj;
            },
            getConnectorDefaults: (connector, diagram) => {
                connector.style = {
                    strokeColor: '#6BA5D7',
                    strokeWidth: 2
                };
                connector.targetDecorator.style.fill  =  '#6BA5D7';
                connector.targetDecorator.style.strokeColor  =  '#6BA5D7';
                connector.targetDecorator.shape = 'None';
                connector.targetDecorator.shape = 'None';
                connector.type = 'Orthogonal';
                return connector;
            }
        }
    },
}
</script>
<style>
    @import "../../node_modules/@syncfusion/ej2-vue-diagrams/styles/material.css";
</style>