
<!--
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 lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/facePrint.js"></script>
        <script src="lib/testHelper.js"></script>
        <link rel="stylesheet" href="lib/reset.css" />
        <title>graph-thumbnail.html</title>
    </head>

    <body>
        <style>
            .test-chart {
                border: 10px solid #ddd;
            }
        </style>
        <div id="main0"></div>
        <div id="main2"></div>
        <div id="main3"></div>
        <div id="main_in_matrix"></div>
    </body>

    <script>
        function createBaseGraphOption() {
            return {
                tooltip: {},
                legend: {},
                series: [{
                    type: 'graph',
                    name: 'Gene',
                    layout: 'circular',
                    circular: {
                        rotateLabel: true
                    },
                    // center: [700, '30%'],
                    // zoom: 8,
                    roam: true,
                    focusNodeAdjacency: true,
                    label: {
                        show: true
                    },
                    lineStyle: {
                        color: 'source',
                        curveness: 0.3
                    },
                    emphasis: {
                        label: {
                            color: 'blue'
                        },
                        lineStyle: {
                            width: 10
                        }
                    },
                    data: [
                        {
                            itemStyle: null,
                            name: 'DRD2',
                            value: 40,
                            symbolSize: 40
                        },
                        {
                            itemStyle: null,
                            name: 'ADORA2A',
                            value: 0,
                            symbolSize: 20
                        },
                        {
                            itemStyle: null,
                            name: 'ARRB2',
                            value: 30,
                            symbolSize: 20,
                        },
                        {
                            itemStyle: null,
                            name: 'CALM1',
                            value: 20,
                            symbolSize: 40
                        },
                        {
                            itemStyle: null,
                            name: 'CALM2',
                            value: 0,
                            symbolSize: 20
                        },
                        {
                            itemStyle: null,
                            name: 'FLNA',
                            value: 0,
                            symbolSize: 20
                        },
                        {
                            itemStyle: null,
                            name: 'NSF',
                            value: 0,
                            symbolSize: 20
                        }
                    ],
                    links: [
                        {
                            source: 'DRD2',
                            target: 'ADORA2A'
                        },
                        {
                            source: 'DRD2',
                            target: 'ARRB2'
                        },
                        {
                            source: 'DRD2',
                            target: 'CALM1'
                        },
                        {
                            source: 'DRD2',
                            target: 'CALM2'
                        },
                        {
                            source: 'DRD2',
                            target: 'FLNA'
                        },
                        {
                            source: 'DRD2',
                            target: 'NSF'
                        },
                        {
                            source: 'CALM1',
                            target: 'ADORA2A'
                        },
                        {
                            source: 'CALM1',
                            target: 'ARRB2'
                        },
                        {
                            source: 'CALM1',
                            target: 'CALM2'
                        },
                        {
                            source: 'CALM1',
                            target: 'FLNA'
                        },
                        {
                            source: 'CALM1',
                            target: 'NSF'
                        },
                    ]
                }]
            };
        }
    </script>


    <script>
        require(['echarts'], function (echarts) {
            var option = createBaseGraphOption();
            option.thumbnail = {
            };

            var chart = testHelper.create(echarts, 'main0', {
                option: option,
                width: 600,
                title: [
                    'minimun opiton (default behavior): ',
                    '- thumbnail should be placed at right-bottom',
                    '- thumbnail content should show the entire graph',
                    '- widdth and height should be 1/4 of canvas',
                    '- Should has white bg',
                    '- "pen" and "zoom" should be fine',
                ],
                inputsStyle: 'compact',
                inputs: [
                    {
                        type: 'select',
                        text: 'thumbnail.show:',
                        values: [true, false],
                        onchange() {
                            chart.setOption({
                                thumbnail: {
                                    show: this.value,
                                }
                            });
                        }
                    },
                    {
                        type: 'select',
                        text: 'roam:',
                        values: [true, false, 'scale', 'move'],
                        onchange() {
                            chart.setOption({
                                series: {
                                    roam: this.value,
                                }
                            });
                        }
                    },
                    {
                        type: 'select',
                        text: 'series:',
                        values: ['graph', 'no_graph'],
                        onchange() {
                            var newSeries;
                            if (this.value === 'graph') {
                                newSeries = createBaseGraphOption().series;
                            }
                            chart.setOption({
                                series: newSeries
                            }, {
                                replaceMerge: ['series']
                            })
                        },
                    },
                    {
                        type: 'select',
                        text: 'graph layout:',
                        values: ['circular', 'force'],
                        onchange() {
                            var layout = this.value;
                            chart.setOption({
                                series: {
                                    layout: layout,
                                }
                            });
                        }
                    }
                ]
            });
        });
    </script>

    <script>
        require(['echarts'], function (echarts) {
            var option = createBaseGraphOption();
            option.thumbnail = {
                width: 100,
                right: 10,
                top: 10,
                bottom: 10,
                itemStyle: {
                    borderWidth: 20,
                    borderColor: 'rgba(0,0,0,0.4)'
                },
                windowStyle: {
                    color: 'yellow',
                    borderWidth: 3,
                    borderColor: 'blue',
                    shadowBlur: 5
                }
            };

            var chart = testHelper.create(echarts, 'main2', {
                option: option,
                width: 600,
                height: 200,
                title: [
                    'style:',
                    '- borderWidth: 10, width: 100, height: 180, right: 10, top: 10',
                    '- windowStyle: {color: "yellow", borderWidth: 3, borderColor: "blue", shadowBlur: 5}'
                ]
            });
        });
    </script>


    <script>
        require(['echarts'], function (echarts) {
            var option = createBaseGraphOption();
            option.backgroundColor = 'rgba(222, 200, 100, 0.5)';
            option.series[0].zoom = 5;
            option.series[0].scaleLimit = {
                max: 6,
                min: 0.8,
            };

            option.thumbnail = {
                left: 10,
                top: 'center',
                width: '10%',
                height: '30%',
                itemStyle: {
                    borderRadius: 3,
                },
                windowStyle: {
                    borderRadius: 3,
                    // color: 'yellow',
                }
            };

            var chart = testHelper.create(echarts, 'main3', {
                title: [
                    'Should have border-radius in both box and window rect',
                    'Should auto use chart bg, should be opacity bg',
                    'left: 10, top: "center", width: "10%", height: "30%"',
                    'init zoom: 5, **scaleLimit: exists**'
                ],
                option: option,
                height: 300,
                width: 600
            });
        });
    </script>



    <script>
        require(['echarts'], function (echarts) {
            var option = createBaseGraphOption();
            var colCount = 5;
            var rowCount = 5;
            var shouldShow = false;

            var itemStyle = shouldShow ? {borderWidth: 1} : {borderWidth: 0};
            option.matrix = {
                x: {data: Array(colCount).fill(null), show: shouldShow, itemStyle},
                y: {data: Array(rowCount).fill(null), show: shouldShow, itemStyle},
                body: {itemStyle},
                backgroundStyle: {borderWidth: 0},
                left: 0,
                right: 0,
                top: 0,
                bottom: 0,
            };
            option.series[0].coordinateSystem = 'matrix';
            option.series[0].coordinateSystemUsage = 'box';
            option.series[0].coord = [[0, 1], [0, colCount - 1]];

            option.thumbnail = {
                left: 2,
                top: 2,
                right: 2,
                bottom: 2,
                coordinateSystem: 'matrix',
                coord: [4, [3, 4]],
                itemStyle: {
                },
            };

            var chart = testHelper.create(echarts, 'main_in_matrix', {
                title: [
                    'In matrix layout'
                ],
                option: option,
                width: 600,
                inputsStyle: 'compact',
                inputs: [
                    {
                        type: 'select',
                        text: 'matix grid show:',
                        values: [false, true],
                        onchange() {
                            var shouldShow = this.value;
                            var itemStyle = shouldShow ? {borderWidth: 1} : {borderWidth: 0};
                            chart.setOption({
                                matrix: {
                                    x: {show: shouldShow, itemStyle},
                                    y: {show: shouldShow, itemStyle},
                                    body: {itemStyle},
                                },
                            });
                        }
                    }
                ]
            });
        });
    </script>


</html>