2

I have a problem that I can't solve. I want to use JointJS fromJSON function to reconstruct the flowchart from a JSON (previously exported using JoinJS's toJSON function. The problem is that the call to the fromJSON function always returns the following error:

enter image description here

Whether I call it inside the hook mounted () or call it from the click of a button. For completeness I also want to say that I am using Vue.js. The code I'm using instead is the following:

<template>
    <div class="wrapper">
        <button v-on:click="getGraphJSON">Get graph JSON</button>
        <button v-on:click="resetGraphJSON">Restore graph from JSON</button>
        <div id="myholder"></div>
    </div>
</template>

<script>
    const _ = require('lodash')
    const joint = require('jointjs')
    const g = require('../../node_modules/jointjs/dist/geometry.js')
    const backbone = require('../../node_modules/backbone/backbone.js')
    const $ = require('../../node_modules/jquery/dist/jquery.js')
    import '../../node_modules/jointjs/dist/joint.css';

    var CustomRectangle = joint.shapes.standard.Rectangle.define('CustomRectangle', {
                type: 'CustomRectangle',
                attrs: {
                    body: {
                        rx: 10, // add a corner radius
                        ry: 10,
                        strokeWidth: 1,
                        fill: 'cornflowerblue'
                    },
                    label: {
                        textAnchor: 'left', // align text to left
                        refX: 10, // offset text from right edge of model bbox
                        fill: 'white',
                        fontSize: 18
                    }
                }
            }, {
                    markup: [{
                        tagName: 'rect',
                        selector: 'body',
                    }, {
                        tagName: 'text',
                        selector: 'label'
                    }]
            }, {
                createRandom: function() {

                    var rectangle = new this();

                    var fill = '#' + ('000000' + Math.floor(Math.random() * 16777215).toString(16)).slice(-6);
                    var stroke = '#' + ('000000' + Math.floor(Math.random() * 16777215).toString(16)).slice(-6);
                    var strokeWidth = Math.floor(Math.random() * 6);
                    var strokeDasharray = Math.floor(Math.random() * 6) + ' ' + Math.floor(Math.random() * 6);
                    var radius = Math.floor(Math.random() * 21);

                    rectangle.attr({
                        body: {
                            fill: fill,
                            stroke: stroke,
                            strokeWidth: strokeWidth,
                            strokeDasharray: strokeDasharray,
                            rx: radius,
                            ry: radius
                        },
                        label: { // ensure visibility on dark backgrounds
                            fill: 'black',
                            stroke: 'white',
                            strokeWidth: 1,
                            fontWeight: 'bold'
                        }
                    });

                    return rectangle;
                }
            });

    export default {
        name: 'JointChartRestorable',
        data() {
            return {
                graph: null,
                paper: null,
                // graphJSON: JSON.parse('{"cells":[{"type":"standard.Rectangle","position":{"x":100,"y":30},"size":{"width":100,"height":40},"angle":0,"id":"049776c9-7b6d-4aaa-8b02-1edc3bea9852","z":1,"attrs":{"body":{"fill":"blue"},"label":{"fill":"white","text":"Rect #1"}}},{"type":"standard.Rectangle","position":{"x":400,"y":30},"size":{"width":100,"height":40},"angle":0,"id":"b6e77973-1195-4749-99e1-728549329b11","z":2,"attrs":{"body":{"fill":"#2C3E50","rx":5,"ry":5},"label":{"fontSize":18,"fill":"#3498DB","text":"Rect #2","fontWeight":"bold","fontVariant":"small-caps"}}},{"type":"standard.Link","source":{"id":"049776c9-7b6d-4aaa-8b02-1edc3bea9852"},"target":{"id":"b6e77973-1195-4749-99e1-728549329b11"},"id":"4ed8e3b3-55de-4ad2-b79e-d4848adc4a58","labels":[{"attrs":{"text":{"text":"Hello, World!"}}}],"z":3,"attrs":{"line":{"stroke":"blue","strokeWidth":1,"targetMarker":{"d":"M 10 -5 0 0 10 5 Z","stroke":"black","fill":"yellow"},"sourceMarker":{"type":"path","stroke":"black","fill":"red","d":"M 10 -5 0 0 10 5 Z"}}}}],"graphCustomProperty":true,"graphExportTime":1563951791966}')
                // graphJSON: JSON.parse('{"cells":[{"type":"examples.CustomRectangle","position":{"x":90,"y":30},"size":{"width":100,"height":40},"angle":0,"id":"faa7f957-4691-4bb2-b907-b2054f7e07de","z":1,"attrs":{"body":{"fill":"blue"},"label":{"text":"Rect #1"}}}]}')
                graphJSON: JSON.parse('{"cells":[{"type":"CustomRectangle","position":{"x":100,"y":30},"size":{"width":100,"height":40},"angle":0,"id":"f02da591-c03c-479f-88cf-55c291064ca8","z":1,"attrs":{"body":{"fill":"blue"},"label":{"text":"Rect #1"}}}]}')
            };
        },
        methods: {
            getGraphJSON: function() {
                this.graphJSON = this.graph.toJSON();
                console.log(JSON.stringify(this.graphJSON));

                this.graph.get('graphCustomProperty'); // true
                this.graph.get('graphExportTime');
            },
            resetGraphJSON: function() {
                if(this.graphJSON !== undefined && this.graphJSON !== null && this.graphJSON !== '') {
                    this.graph.fromJSON(this.graphJSON);
                    // this.paper.model.set(this.graphJSON);
                } else {
                    alert('Devi prima cliccare sul tasto "Get graph JSON" almeno una volta');
                }
            }
        },
        mounted() {
            this.graph = new joint.dia.Graph();
            this.graph.fromJSON(this.graphJSON);

            // this.graph.set('graphCustomProperty', true);
            // this.graph.set('graphExportTime', Date.now());

            this.paper = new joint.dia.Paper({
                el: document.getElementById('myholder'),
                model: this.graph,
                width: '100%',
                height: 600,
                gridSize: 10,
                drawGrid: true,
                background: {
                    color: 'rgba(0, 255, 0, 0.3)'
                },
                // interactive: false, // disable default interaction (e.g. dragging)
                /*elementView: joint.dia.ElementView.extend({
                    pointerdblclick: function(evt, x, y) {
                        joint.dia.CellView.prototype.pointerdblclick.apply(this, arguments);
                        this.notify('element:pointerdblclick', evt, x, y);

                        this.model.remove();
                    }
                }),
                linkView: joint.dia.LinkView.extend({
                    pointerdblclick: function(evt, x, y) {
                        joint.dia.CellView.prototype.pointerdblclick.apply(this, arguments);
                        this.notify('link:pointerdblclick', evt, x, y);

                        this.model.remove();
                    }
                })*/
            });
            /*this.paper.on('cell:pointerdblclick', function(cellView) {
                var isElement = cellView.model.isElement();
                var message = (isElement ? 'Element' : 'Link') + ' removed';
                eventOutputLink.attr('label/text', message);

                eventOutputLink.attr('body/visibility', 'visible');
                eventOutputLink.attr('label/visibility', 'visible');
            });*/





            /***************************************************/
            /************** GRAPH ELEMENT SAMPLE ***************/
            /***************************************************/




            // var rect = new joint.shapes.standard.Rectangle();
            // var rect = new CustomRectangle();
            // rect.position(100, 30);
            // rect.resize(100, 40);
            // rect.attr({
            //     body: {
            //         fill: 'blue'
            //     },
            //     label: {
            //         text: 'Rect #1',
            //         fill: 'white'
            //     }
            // });
            // rect.addTo(this.graph);

            /***************************************************/
            /************** GRAPH ELEMENT SAMPLE ***************/
            /***************************************************/





        }

    }
</script>

Right now I'm using a custom element, previously defined, but I've also done tests using the standard Rectangle element of JointJS. Can anyone tell me if I'm doing something wrong? Many thanks in advance.

  • Possible duplicate of [NameSpace Issue in JointJS version 3](https://stackoverflow.com/questions/57151942/namespace-issue-in-jointjs-version-3) – Roman Aug 06 '19 at 17:48

1 Answers1

1

Markup object could not be found in element that's reason why this error is getting. After it's imported jointjs to the vueJS project through jointjs or rabbit dependency;

import * as joint from 'jointjs' or import * as joint from 'rabbit'

window.joint = joint; 

joint should be adjusted as global in environment by using window.

Yagmur SAHIN
  • 277
  • 3
  • 3