Editing

The Diagram enables you to add tools and shape forms and utilize its layout options.

Setup

For more information, refer to the article on editing the Kendo UI Diagram.

Enabling Editing

To enable the editing of the Diagram widget:
1. Configure the DataSource for the remote CRUD operations.
1. Configure the connectionsDataSource for the remote CRUD operations. If you skip setting the connectionsDataSource, the editing support of the Diagram will be turned off.
1. Declare the Fields Definition: dataSource schema.
1. Declare the Fields Definition: connectionsDataSource schema.

Adding Records

To enable the insertion of new records, configure the toolbar of the Diagram. The createShape tool is added by default.

Deleting Records

To enable the deletion of records, add a delete tool.

Configuring the Shape Model Fields

Each shape model field is updated upon user interaction.

The shape model provides the following fields:

  • (Mandatory) id—Accepts numbers. Represents the unique identifier of the shape. A shape without an id field will not be connected.
  • (Optional) type—Accepts strings. Represents the shape type.
  • (Optional) text—Accepts strings. Represents the shape text.
  • (Optional) x—Accepts numbers. Represents the x position of the shape.
  • (Optional) y—Accepts numbers. Represents the y position of the shape.
  • (Optional) width—Accepts numbers. Represents the width of the shape.
  • (Optional) height—Accepts numbers. Represents the height of the shape.

Configuring the Connection Model Fields

Each connection model field is updated upon user interaction.

The connection model provides the following fields:

  • (Mandatory) id—Accepts numbers. Represents the unique identifier of the connection.
  • (Optional) text—Accepts strings. Represents the text of the connection.
  • (Optional) from—Accepts numbers. Represents the id shape of the from connection.
  • (Optional) to—Accepts numbers. Represents the id shape of the to connection.
  • (Optional) fromX—Accepts numbers. Represents the x position of the from connection. If from is set, this position is not applied.
  • (Optional) fromY—Accepts numbers. Represents the y position of the from connection. If from is set, this position is not applied.
  • (Optional) toX—Accepts numbers. Represents the x position of the to connection. If from is set, this position is not applied.
  • (Optional) toY—Accepts numbers. Represents the y position of the to connection. If from is set, this position is not applied.
  • (Optional) fromConnector—Accepts strings. Represents the name of the source shape connector.
  • (Optional) toConnector—Accepts strings. Represents the name of the target shape connector.
<div id="vueapp" class="vue-app">
    <kendo-hierarchicaldatasource ref="shapesDataSource"
                                  :batch='false'
                                  :transport-read-url="'https://demos.telerik.com/kendo-ui/service/DiagramShapes'"
                                  :transport-read-data-type="'jsonp'"
                                  :transport-update-url="'https://demos.telerik.com/kendo-ui/service/DiagramShapes/Update'"
                                  :transport-update-data-type="'jsonp'"
                                  :transport-destroy-url="'https://demos.telerik.com/kendo-ui/service/DiagramShapes/Destroy'"
                                  :transport-destroy-data-type="'jsonp'"
                                  :transport-create-url="'https://demos.telerik.com/kendo-ui/service/DiagramShapes/Create'"
                                  :transport-create-data-type="'jsonp'"
                                  :transport-parameter-map="parameterMap"
                                  :schema-model-id="'id'"
                                  :schema-model-fields="schemaModelFields">
    </kendo-hierarchicaldatasource>

    <kendo-diagram :data-source-ref="'shapesDataSource'"
                   :connections-data-source="connectionsDataSource"
                   :layout="layout"
                   :shape-defaults-visual="visualTemplate"
                   :shape-defaults-content-template="shapesContentTemplate"
                   :shape-defaults-content-font-size="shapesContentFontSize"
                   :connection-defaults-stroke-color="'#586477'"
                   :connection-defaults-stroke-width="2"
                   v-on:databound="onDataBound">
    </kendo-diagram>
</div>
Vue.use(DiagramInstaller);
Vue.use(DataSourceInstaller);

new Vue({
    el: '#vueapp',
    data: function() {
        return {
            connectionsDataSource: {
                batch: false,
                transport: {
                    read: {
                        url: "https://demos.telerik.com/kendo-ui/service/DiagramConnections",
                        dataType: "jsonp"
                    },
                    update: {
                        url: "https://demos.telerik.com/kendo-ui/service/DiagramConnections/Update",
                        dataType: "jsonp"
                    },
                    destroy: {
                        url: "https://demos.telerik.com/kendo-ui/service/DiagramConnections/Destroy",
                        dataType: "jsonp"
                    },
                    create: {
                        url: "https://demos.telerik.com/kendo-ui/service/DiagramConnections/Create",
                        dataType: "jsonp"
                    },
                    parameterMap: function (options, operation) {
                        if (operation !== "read") {
                            return { models: kendo.stringify(options.models || [options]) };
                        }
                    }
                },
                schema: {
                    model: {
                        id: "id",
                        fields: {
                            id: { from: "Id", type: "number", editable: false },
                            from: { from: "FromShapeId", type: "number" },
                            to: { from: "ToShapeId", type: "number" },
                            fromX: { from: "FromPointX", type: "number" },
                            fromY: { from: "FromPointY", type: "number" },
                            toX: { from: "ToPointX", type: "number" },
                            toY: { from: "ToPointY", type: "number" }
                        }
                    }
                }
            },
            schemaModelFields:  {
                id: { from: "Id", type: "number", editable: false },
                JobTitle: { type: "string" },
                Color: { type: "string" }
            },
            schemaModelConnectionFields:  {
                id: { from: "Id", type: "number", editable: false },
                from: { from: "FromShapeId", type: "number" },
                to: { from: "ToShapeId", type: "number" },
                fromX: { from: "FromPointX", type: "number" },
                fromY: { from: "FromPointY", type: "number" },
                toX: { from: "ToPointX", type: "number" },
                toY: { from: "ToPointY", type: "number" }
            },
            layout: {
                type: "tree",
                subtype: "tipover",
                underneathHorizontalOffset: 140
            },
            shapesContentTemplate: "#= dataItem.JobTitle #",
            shapesContentFontSize: 17
        }
    },
    methods: {
        parameterMap: function(options, operation) {
            if (operation !== 'read') {
                return { models: kendo.stringify(options.models || [options]) }
            }
        },
        visualTemplate: function (options) {
            var dataviz = kendo.dataviz;
            var g = new dataviz.diagram.Group();
            var dataItem = options.dataItem;

            if (dataItem.JobTitle === "President") {
                g.append(new dataviz.diagram.Circle({
                    radius: 60,
                    stroke: {
                        width: 2,
                        color: dataItem.Color || "#586477"
                    },
                    fill: "#e8eff7"
                }));
            } else {
                g.append(new dataviz.diagram.Rectangle({
                    width: 240,
                    height: 67,
                    stroke: {
                        width: 0
                    },
                    fill: "#e8eff7"
                }));

                g.append(new dataviz.diagram.Rectangle({
                    width: 8,
                    height: 67,
                    fill: dataItem.Color,
                    stroke: {
                        width: 0
                    }
                }));
            }

            return g;
        },
         onDataBound: function(e) {
            var that = e.sender;
            setTimeout(function () {
                that.bringIntoView(that.shapes);
            }, 0);
        }
    }
})

In this article