DevExtreme v23.2 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.

OrgChart Shapes

The Diagram component provides shapes with images that are specially designed for use in OrgCharts. You can select a shape with the following image positions: on the left, right, or top of the shape.

In this demo, the Diagram is bound to a data source. The imageUrlExpr property specifies the name of a field that provides a path to images.

Backend API
import React from 'react'; import Diagram, { Nodes, AutoLayout, Edges, Toolbox, Group, } from 'devextreme-react/diagram'; import ArrayStore from 'devextreme/data/array_store'; import service from './data.ts'; const orgItemsDataSource = new ArrayStore({ key: 'id', data: service.getOrgItems(), }); const orgLinksDataSource = new ArrayStore({ key: 'id', data: service.getOrgLinks(), }); export default function App() { return ( <Diagram id="diagram"> <Nodes dataSource={orgItemsDataSource} imageUrlExpr="picture"> <AutoLayout orientation="horizontal" type="tree" /> </Nodes> <Edges dataSource={orgLinksDataSource} /> <Toolbox> <Group category="general" title="General" /> <Group category="orgChart" title="Organizational Chart" expanded={true} /> </Toolbox> </Diagram> ); }
import React from 'react'; import Diagram, { Nodes, AutoLayout, Edges, Toolbox, Group, } from 'devextreme-react/diagram'; import ArrayStore from 'devextreme/data/array_store'; import service from './data.js'; const orgItemsDataSource = new ArrayStore({ key: 'id', data: service.getOrgItems(), }); const orgLinksDataSource = new ArrayStore({ key: 'id', data: service.getOrgLinks(), }); export default function App() { return ( <Diagram id="diagram"> <Nodes dataSource={orgItemsDataSource} imageUrlExpr="picture" > <AutoLayout orientation="horizontal" type="tree" /> </Nodes> <Edges dataSource={orgLinksDataSource} /> <Toolbox> <Group category="general" title="General" /> <Group category="orgChart" title="Organizational Chart" expanded={true} /> </Toolbox> </Diagram> ); }
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
const orgItems = [ { id: '106', text: 'Development', type: 'ellipse', }, { id: '107', text: 'WinForms\nTeam', type: 'ellipse', }, { id: '108', text: 'WPF\nTeam', type: 'ellipse', }, { id: '109', text: 'Javascript\nTeam', type: 'ellipse', }, { id: '110', text: 'ASP.NET\nTeam', type: 'ellipse', }, { id: '112', text: 'Ken Samuelson', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/32.png', }, { id: '113', text: 'Terry Bradley', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/33.png', }, { id: '115', text: 'Nat Maguiree', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/34.png', }, { id: '116', text: 'Gabe Jones', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/35.png', }, { id: '117', text: 'Lucy Ball', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/36.png', }, { id: '119', text: 'Bart Arnaz', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/37.png', }, { id: '120', text: 'Leah Simpson', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/38.png', }, { id: '122', text: 'Hannah Brookly', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/39.png', }, { id: '123', text: 'Arnie Schwartz', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/40.png', }, ]; const orgLinks = [ { id: '124', from: '106', to: '108', }, { id: '125', from: '106', to: '109', }, { id: '126', from: '106', to: '107', }, { id: '127', from: '106', to: '110', }, { id: '129', from: '110', to: '112', }, { id: '130', from: '110', to: '113', }, { id: '132', from: '107', to: '115', }, { id: '133', from: '107', to: '116', }, { id: '134', from: '107', to: '117', }, { id: '136', from: '108', to: '119', }, { id: '137', from: '108', to: '120', }, { id: '139', from: '109', to: '122', }, { id: '140', from: '109', to: '123', }, ]; export default { getOrgItems() { return orgItems; }, getOrgLinks() { return orgLinks; }, };
window.exports = window.exports || {}; window.config = { transpiler: 'ts', typescriptOptions: { module: 'system', emitDecoratorMetadata: true, experimentalDecorators: true, jsx: 'react', }, meta: { 'react': { 'esModule': true, }, 'typescript': { 'exports': 'ts', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', }, defaultExtension: 'js', map: { 'ts': 'npm:plugin-typescript@4.2.4/lib/plugin.js', 'typescript': 'npm:typescript@4.2.4/lib/typescript.js', 'react': 'npm:react@17.0.2/umd/react.development.js', 'react-dom': 'npm:react-dom@17.0.2/umd/react-dom.development.js', 'prop-types': 'npm:prop-types@15.8.1/prop-types.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@23.2.5/cjs', 'devextreme-react': 'npm:devextreme-react@23.2.5/cjs', 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.6.4/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.5/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.51/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.12', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js', 'devextreme-cldr-data': 'npm:devextreme-cldr-data@1.0.3', // SystemJS plugins 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.4/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.4/parser-html.js', }, packages: { 'devextreme': { defaultExtension: 'js', }, 'devextreme-react': { main: 'index.js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/localization/messages': { format: 'json', defaultExtension: '', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.12/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, react: true, }, }; System.config(window.config);
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App />, document.getElementById('app'));
const orgItems = [ { id: '106', text: 'Development', type: 'ellipse', }, { id: '107', text: 'WinForms\nTeam', type: 'ellipse', }, { id: '108', text: 'WPF\nTeam', type: 'ellipse', }, { id: '109', text: 'Javascript\nTeam', type: 'ellipse', }, { id: '110', text: 'ASP.NET\nTeam', type: 'ellipse', }, { id: '112', text: 'Ken Samuelson', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/32.png', }, { id: '113', text: 'Terry Bradley', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/33.png', }, { id: '115', text: 'Nat Maguiree', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/34.png', }, { id: '116', text: 'Gabe Jones', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/35.png', }, { id: '117', text: 'Lucy Ball', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/36.png', }, { id: '119', text: 'Bart Arnaz', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/37.png', }, { id: '120', text: 'Leah Simpson', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/38.png', }, { id: '122', text: 'Hannah Brookly', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/39.png', }, { id: '123', text: 'Arnie Schwartz', type: 'cardWithImageOnLeft', picture: '../../../../images/employees/40.png', }, ]; const orgLinks = [ { id: '124', from: '106', to: '108', }, { id: '125', from: '106', to: '109', }, { id: '126', from: '106', to: '107', }, { id: '127', from: '106', to: '110', }, { id: '129', from: '110', to: '112', }, { id: '130', from: '110', to: '113', }, { id: '132', from: '107', to: '115', }, { id: '133', from: '107', to: '116', }, { id: '134', from: '107', to: '117', }, { id: '136', from: '108', to: '119', }, { id: '137', from: '108', to: '120', }, { id: '139', from: '109', to: '122', }, { id: '140', from: '109', to: '123', }, ]; export default { getOrgItems() { return orgItems; }, getOrgLinks() { return orgLinks; }, };
<!DOCTYPE html> <html> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/23.2.5/css/dx-diagram.min.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/23.2.5/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import("./index.tsx"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>
#diagram { height: 900px; }