DevExtreme v23.2 is now available.

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

Your search did not match any results.

Adaptability

The Diagram can adapt its layout to narrow screens. In this demo, the component's Height property is set to 100% to fit a screen.

Note the following changes to the toolbox and properties panel:

  • The toolbox is docked to the left component border.
  • The properties panel is docked to the bottom component border.
  • A tool slides out of the screen when a user drags a shape from the toolbox or edits an item's text.
  • Only one tool can be displayed at a time.

You can switch between landscape and portrait layouts to see the Diagram's appearance and behavior on wide and narrow screens.

Backend API
import React, { useEffect, useRef } from 'react'; import Diagram from 'devextreme-react/diagram'; import 'whatwg-fetch'; export default function App() { const diagramRef = useRef<Diagram>(); useEffect(() => { const diagram = diagramRef.current.instance; fetch('../../../../data/diagram-flow.json') .then((response) => response.json()) .then((json) => { diagram.import(JSON.stringify(json)); }) .catch(() => { throw new Error('Data Loading Error'); }); }, []); return ( <Diagram id="diagram" ref={diagramRef} autoZoomMode="fitWidth" /> ); }
import React, { useEffect, useRef } from 'react'; import Diagram from 'devextreme-react/diagram'; import 'whatwg-fetch'; export default function App() { const diagramRef = useRef(); useEffect(() => { const diagram = diagramRef.current.instance; fetch('../../../../data/diagram-flow.json') .then((response) => response.json()) .then((json) => { diagram.import(JSON.stringify(json)); }) .catch(() => { throw new Error('Data Loading Error'); }); }, []); return ( <Diagram id="diagram" ref={diagramRef} autoZoomMode="fitWidth" /> ); }
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
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', 'whatwg-fetch': 'npm:whatwg-fetch@2.0.4/fetch.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'));
{ "page": { "width": 8391, "height": 11907, "pageWidth": 8391, "pageHeight": 11906, "pageLandscape": false, "gridSize": 180, "snapToGrid": true }, "connectors": [{ "key": "116", "points": [{ "x": 2160, "y": 1800 }, { "x": 2160, "y": 2340 } ], "zIndex": 0, "beginItemKey": "107", "beginConnectionPointIndex": 2, "endItemKey": "108", "endConnectionPointIndex": 0 }, { "key": "117", "points": [{ "x": 2160, "y": 3420 }, { "x": 2160, "y": 3960 } ], "zIndex": 0, "beginItemKey": "108", "beginConnectionPointIndex": 2, "endItemKey": "118", "endConnectionPointIndex": 0 }, { "key": "122", "points": [{ "x": 3420, "y": 4680 }, { "x": 5760, "y": 4680 } ], "zIndex": 0, "texts": { "0.45": "No" }, "beginItemKey": "118", "beginConnectionPointIndex": 1, "endItemKey": "121", "endConnectionPointIndex": 3 }, { "key": "123", "points": [{ "x": 6840, "y": 4140 }, { "x": 3420, "y": 2880 } ], "zIndex": 0, "beginItemKey": "121", "beginConnectionPointIndex": 0, "endItemKey": "108", "endConnectionPointIndex": 1 }, { "key": "126", "points": [{ "x": 3780, "y": 9180 }, { "x": 2880, "y": 10440 } ], "zIndex": 0, "texts": { "0.78": "A popular scenario?" }, "beginItemKey": "120", "beginConnectionPointIndex": 3, "endItemKey": "125", "endConnectionPointIndex": 0 }, { "key": "130", "points": [{ "x": 5220, "y": 9180 }, { "x": 6120, "y": 10440 } ], "zIndex": 0, "texts": { "0.77": "Missing info in\nthe documentation?" }, "beginItemKey": "120", "beginConnectionPointIndex": 1, "endItemKey": "127", "endConnectionPointIndex": 0 }, { "key": "132", "points": [{ "x": 2160, "y": 5400 }, { "x": 2160, "y": 6120 } ], "zIndex": 0, "texts": { "0.47": "Yes" }, "beginItemKey": "118", "beginConnectionPointIndex": 2, "endItemKey": "131", "endConnectionPointIndex": 0 }, { "key": "124", "points": [{ "x": 2160, "y": 7200 }, { "x": 4500, "y": 8820 } ], "zIndex": 0, "beginItemKey": "131", "beginConnectionPointIndex": 2, "endItemKey": "120", "endConnectionPointIndex": 0 }, { "key": "134", "points": [{ "x": 3420, "y": 6660 }, { "x": 5760, "y": 6660 } ], "zIndex": 0, "texts": { "0.5": "Need developer\nassistance?" }, "beginItemKey": "131", "beginConnectionPointIndex": 1, "endItemKey": "133", "endConnectionPointIndex": 3 }, { "key": "135", "points": [{ "x": 6840, "y": 7200 }, { "x": 4500, "y": 8820 } ], "zIndex": 0, "beginItemKey": "133", "beginConnectionPointIndex": 2, "endItemKey": "120", "endConnectionPointIndex": 0 } ], "shapes": [ { "key": "107", "type": "terminator", "text": "A new ticket", "x": 1440, "y": 1080, "width": 1440, "height": 720, "zIndex": 0 }, { "key": "108", "type": "process", "text": "Analyze\nthe issue", "x": 900, "y": 2340, "width": 2520, "height": 1080, "zIndex": 0 }, { "key": "118", "type": "decision", "text": "Do we have all\ninformation to\nwork with?", "x": 900, "y": 3960, "width": 2520, "height": 1440, "zIndex": 0 }, { "key": "120", "type": "terminator", "text": "Answered", "x": 3780, "y": 8640, "width": 1440, "height": 720, "zIndex": 0 }, { "key": "121", "type": "process", "text": "Request additional\ninformation or clarify\nthe scenario", "x": 5760, "y": 4140, "width": 2160, "height": 1080, "zIndex": 0 }, { "key": "125", "type": "process", "text": "Prepare an example in\nCode Central", "x": 1620, "y": 10440, "width": 2520, "height": 1080, "zIndex": 0 }, { "key": "127", "type": "process", "text": "Update the\ndocumentation", "x": 4860, "y": 10440, "width": 2520, "height": 1080, "zIndex": 0 }, { "key": "131", "type": "process", "text": "Process the\nticket", "x": 900, "y": 6120, "width": 2520, "height": 1080, "zIndex": 0 }, { "key": "133", "type": "process", "text": "Work with the\nR&D team", "x": 5760, "y": 6120, "width": 2160, "height": 1080, "zIndex": 0 }, { "key": "136", "type": "text", "locked": true, "text": "Ticket Processing Flow", "x": 360, "y": 360, "width": 7740, "height": 360, "zIndex": 0, "styleText": { "font-size": "14pt", "font-weight": "bold" } } ] }
<!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>
.demo-container, #app, #diagram { height: 100%; }