
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<html>
    <head>
        <meta charset="utf-8">
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/testHelper.js"></script>
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>

        <div id="main0"></div>
        <div id="main1"></div>


        <script>

            require([
                'echarts',
                'theme/vintage'
            ], function (echarts) {

                function getOption(focusNodeAdjacency) {
                    return {
                        tooltip: {},
                        animationDurationUpdate: 1500,
                        animationEasingUpdate: 'quinticInOut',
                        series : [
                            {
                                type: 'graph',
                                symbolSize: 20,
                                roam: true,
                                label: {
                                    normal: {
                                        show: true
                                    }
                                },
                                edgeSymbol: ['circle', 'arrow'],
                                edgeSymbolSize: [4, 10],
                                edgeLabel: {
                                    normal: {
                                        textStyle: {
                                            color: 'green',
                                            fontSize: 30
                                        }
                                    },
                                    emphasis: {
                                        textStyle: {
                                            color: '#987654'
                                        }
                                    }
                                },
                                focusNodeAdjacency: focusNodeAdjacency,
                                data: [{
                                    name: '节点1',
                                    x: 300,
                                    y: 300,
                                    value: 'set_style_on_item'
                                }, {
                                    name: '节点2',
                                    x: 800,
                                    y: 300
                                }, {
                                    name: '节点3',
                                    x: 550,
                                    y: 100
                                }, {
                                    name: '节点4',
                                    x: 550,
                                    y: 500
                                }],
                                lineStyle: {
                                    normal: {
                                        width: 3,
                                        color: '#184029',
                                        curveness: 0
                                    }
                                },
                                links: [{
                                    source: 0,
                                    target: 1,
                                    symbolSize: [5, 20],
                                    label: {
                                        normal: {
                                            show: true
                                            // position: 'end'
                                        }
                                    },
                                    lineStyle: {
                                        width: 5,
                                        opacity: 1,
                                        curveness: 0.2
                                    },
                                    emphasis: {
                                        lineStyle: {
                                            color: 'blue',
                                            width: 20,
                                            opacity: 0.1
                                        },
                                        label: {
                                            fontSize: 40,
                                            color: 'red'
                                        }
                                    }
                                }, {
                                    source: '节点2',
                                    target: '节点1',
                                    label: {
                                        normal: {
                                            show: true
                                        }
                                    },
                                    lineStyle: {
                                        normal: {
                                            curveness: 0.2
                                        }
                                    }
                                }, {
                                    source: '节点1',
                                    target: '节点3',
                                    emphasis: {
                                        label: {
                                            show: true
                                        }
                                    }
                                }, {
                                    source: '节点2',
                                    target: '节点3'
                                }, {
                                    source: '节点2',
                                    target: '节点4'
                                }, {
                                    source: '节点1',
                                    target: '节点4'
                                }]
                            }
                        ]
                    };
                }

                var chart0 = testHelper.create(echarts, 'main0', {
                    title: [
                        '[focusNodeAdjacency: **true**]',
                        'hover node3, edge label should be displayed.',
                        '节点1 should display value in tooltip.',
                        'series.lineStyle: 5',
                        'hover set_style_on_item, lineStyle: {opacity 0.1, color: "blue", width: 20}, label: {color: "red", fontSize: 40}.',
                        'focusNodeAdjacency triggered and returned, opacity change MUST NOT be kept'
                    ],
                    option: getOption(true),
                    height: 500
                });

                var chart1 = testHelper.create(echarts, 'main1', {
                    title: [
                        '[focusNodeAdjacency: **false**]',
                        'hover node3, edge label should be displayed.',
                        '节点1 should display value in tooltip.',
                        'hover set_style_on_item, lineStyle: {opacity 0.1, color: "blue", width: 20}, label: {color: "red", fontSize: 40}.',
                        'focusNodeAdjacency triggered and returned, opacity change MUST NOT be kept'
                    ],
                    option: getOption(false),
                    height: 500
                });
            });



        </script>
    </body>
</html>