joint+handsontable实现两张电子表格连线关联代码

代码语言:html

所属分类:图表

代码描述:joint+handsontable实现两张电子表格连线关联代码

代码标签: joint handsontable 两张 电子 表格 连线 关联 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  

  
<link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/joint.3.7.2.css">
<link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/handsontable.full.min.css">
<style>
#paper {
  position: absolute;
  right: 0;
  top: 0;
  left: 0;
  bottom: 0;
  overflow: hidden;
}

#logo {
  position: absolute;
  bottom: 25px;
  right: 25px;
}

.joint-highlighted {
  stroke: #5a87f7;
  stroke-width: 3;
}
.joint-highlighted.label rect {
  fill: #e9effe;
  stroke: #5a87f7;
}
.joint-highlighted.label text {
  stroke: none;
}

.handsontable .table-header {
  background: #fcfdc4;
}
</style>

  
</head>

<body translate="no">
  <div id="paper"></div>

  <link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/rappid.3.7.3.css">

<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/lodash.4.17.21.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/backbone-min.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/joint.3.7.2.js"></script>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/handsontable.full.js"></script>
      <script >
const {
    dia,
    shapes,
    highlighters,
    util,
    linkTools,
} = joint;

const HotModel = dia.Element.define('HotModel', {
    size: {
        width: 300,
        height: 0
    },
    z: 1,
    data: null,
    ports: {
        groups: {
            top: {
                z: 0,
                position: {
                    name: 'line',
                    args: {
                        start: {
                            x: 50,
                            y: -15
                        },
                        end: {
                            x: 'calc(w)',
                            y: -15
                        }
                    }
                },
                markup: util.svg/*xml*/`
                      <line @selector="portLine" x1="0" y1="0" x2="0" y2="30" stroke="#131e29" stroke-width="2"/>
                      <rect @selector="portBody" magnet="true" x="-5" y="-5" width="10" height="10" stroke="#131e29" stroke-width="2" fill="white" />
                  `
            }
        }
    }
});

const HotFlags = {
    // RenderView is used to render the adaptive card inside the foreign object
    RenderView: '@render-view',
    // UpdateView is used to update the size of the foreign object
    // and the color of border
    UpdateView: '@update-view',
    // TransformView is used to position and rotate the view
    TransformView: '@transform-view',
    // MeasureView is used to measure the view and update
    // the size of the model
    MeasureView: '@measure-view'
};

const HotModelView = dia.ElementView.extend({

    // The root of the element view is the <g> element by default.
    tagName: 'g',

    HEADER_HEIGHT: 30,
    COL_WIDTH: 50,

    // Whenever the model attributes change (the map key is the attribute name),
    // the update() method will be called, which will contain all the flags that were reported.
    presentationAttributes: {
        size: [HotFlags.UpdateView],
        position: [HotFlags.TransformView],
        angle: [HotFlags.TransformView],
        label: [HotFlags.RenderView],
    },

    // The initFlag property is a list of flags that will be reported to the paper
    // when the element view is initialized.
    initFlag: [HotFlags.RenderView, HotFlags.UpdateView, HotFlags.TransformView, HotFlags.MeasureView],

    confirmUpdate: function(flags) {
        if (this.hasFlag(flags, HotFlags.RenderView)) this.render();
        if (this.hasFlag(flags, HotFlags.UpdateView)) this.update();
        // `updateTransformation` is the original method of the `dia.ElementView`
        // it applies the `transform` attribute to the root element i.e. the `<foreignObject>`
        if (this.hasFlag(flags, HotFlags.TransformView)) this.updateTransformation();
        if (this.hasFlag(flags, HotFlags.MeasureView)) this.resizeModel();
    },

    init: function() {
        this.el.setAttribute('magnet', 'false');
        // Create a ResizeObserver to measure the card's size
        this.resizeObserver = new ResizeObserver(() => this.requestMeasurement());
    },

    onRemove() {
        this.releaseResources();
    },

    releaseResources() {
        const {
            hot,
            resizeObserver
        } = this;
        if (!hot) return;
        hot.destroy();
        resizeObserver.disconnect();
        this.hot = null;
        this.selectors = null;
    },

    render: function() {
        const {
            resizeObserver,
            HEADER_HEIGHT
        } = this;

        this.releaseResources();

        const markup =  util.svg/*xml*/`
            <rect @selector="header" height="${HEADER_HEIGHT}" fill="#F0F0F0" stroke="#DEDEDE"/>
            <rect @selector="border" height="3" fill="#131e239" stroke-width="1"/>
            <text @selector="label"
                y="${HEADER_HEIGHT / 2}"
                fill="#131e29"
                dominant-baseline="central"
                text-anchor="middle"
                font-size="14"
                font-family="sans-serif"
                font-weight="bold"
            />
            <foreignObject @selector="fo" y="${HEADER_HEIGHT}">
                <div xmlns="http://www.w3.org/1999/xhtml" @selector="container"></div>
            </foreignObject>
        `;

        const view = this;
        const docs = this.parseDOMJSON(markup);
        this.selectors = docs.selectors;
        this.el.appendChild(docs.fragment);

        const hot = new Handsontable(this.selectors.container, {
            data: this.model.get('data'),
            cells: (row, col) => {
                return {
                    readOnly: row === 0,
                    className: row === 0 ? 'table-header' : ''
                };
            },
            colHeaders: true,
            rowHeaders: true,
            height: 'auto',
            selectionMode: 'multiple',
            licenseKey: 'non-commercial-and-evaluation', // for non-commercial use only
            contextMenu: {
                items: {
                    row_below: {
                        name: 'Add row'
                    },
                    remove_row: {
                        disabled() {
                            if (this.getSelectedLast()[0] < 1) return true;
                            return this.countRo.........完整代码请登录后点击上方下载按钮下载查看

网友评论0