DevExtreme v24.1 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
<template> <DxDiagram id="diagram" ref="diagram" > <DxNodes :data-source="orgItemsDataSource" :image-url-expr="'picture'" > <DxAutoLayout :type="'tree'" :orientation="'horizontal'" /> </DxNodes> <DxEdges :data-source="orgLinksDataSource"/> <DxToolbox> <DxGroup :category="'general'" :title="'General'" /> <DxGroup :category="'orgChart'" :title="'Organizational Chart'" :expanded="true" /> </DxToolbox> </DxDiagram> </template> <script setup lang="ts"> import { DxDiagram, DxNodes, DxAutoLayout, DxEdges, DxToolbox, DxGroup, } from 'devextreme-vue/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(), }); </script> <style scoped> #diagram { height: 900px; } </style>
window.exports = window.exports || {}; window.config = { transpiler: 'plugin-babel', meta: { '*.vue': { loader: 'vue-loader', }, '*.ts': { loader: 'demo-ts-loader', }, '*.svg': { loader: 'svg-loader', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, }, paths: { 'root:': '../../../../', 'npm:': 'https://unpkg.com/', }, map: { 'vue': 'npm:vue@3.2.47/dist/vue.esm-browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@1.1.1/index.js', 'demo-ts-loader': 'root:utils/demo-ts-loader.js', 'svg-loader': 'root:utils/svg-loader.js', 'mitt': 'npm:mitt/dist/mitt.umd.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@24.1.3/cjs', 'devextreme-vue': 'npm:devextreme-vue@24.1.3/cjs', 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.8/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.56/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.13', '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', '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.8/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js', }, packages: { 'devextreme-vue': { main: 'index.js', }, 'devextreme': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.13/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, }, }; System.config(window.config);
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; }, };
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app');
<!DOCTYPE html> <html lang="en"> <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=5.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/24.1.3/css/dx-diagram.min.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/24.1.3/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" /> <script src="https://unpkg.com/typescript@4.9.5/lib/typescript.js"></script> <script type="module"> import * as vueCompilerSFC from "https://unpkg.com/@vue/compiler-sfc@3.4.16/dist/compiler-sfc.esm-browser.js"; window.vueCompilerSFC = vueCompilerSFC; </script> <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.ts"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"> </div> </div> </body> </html>