
<!--
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/esl.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>
        <script src="lib/draggable.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="lib/reset.css">
    </head>
    <body>
        <style>
            h1 {
                line-height: 60px;
                height: 60px;
                background: #146402;
                text-align: center;
                font-weight: bold;
                color: #eee;
                font-size: 14px;
            }
            .chart {
                height: 400px;
            }
        </style>

        <div class="chart" id="main1"></div>
        <div class="chart" id="main2"></div>
        <div class="chart" id="main3" style="height: 600px;"></div>


        <script>

            require([
                'echarts'
            ], function (echarts) {
                var data = [
                    [7880,6.52],
                    [7881,3.18], // very near 7880, which makes the bar very thin
                    [6110,2.68],
                    [7390,9.55],
                    [7250,5.59],
                    [7300,7.43],
                    [3980,8.54],
                    [4290,3.22],
                    [500,4.68],
                    [1720,5.15],
                    [900,9],
                    [910,10]
                ];

                function makeOption() {
                    var option = {
                        tooltip: {},
                        xAxis: {
                        },
                        yAxis: {
                        },
                        dataZoom:
                        [{
                            type: 'inside'
                        }, {
                            type: 'slider'
                        }],
                        series: {
                            type: 'bar',
                            label: {
                                show: true,
                                position: 'top'
                            },
                            data: data
                        },
                        title: {
                            text: 'no barMinWidth, no barMaxWidth specifed'
                        }
                    };
                    return option;
                }

                var chart = testHelper.create(echarts, 'main1', {
                    title: [
                        'On `value` axis.',
                        'Test **barMinWidth** and **barMaxWidth**: move dataZoom, ',
                        'bar should be **visible** ',
                        '**bar width** should be correct as the title described.'
                    ],
                    height: 200,
                    option: makeOption(),
                    buttons: [{
                        text: 'barMinWidth: 10',
                        onclick: function () {
                            var option = makeOption();
                            option.title.text = 'barMinWidth: 10, no barMaxWidth';
                            option.series.barMinWidth = 10;
                            chart.setOption(option, true);
                        }
                    }, {
                        text: 'barMinWidth: 10, barMaxWidth: 40',
                        onclick: function () {
                            var option = makeOption();
                            option.title.text = 'barMinWidth: 10, barMaxWidth: 40';
                            option.series.barMinWidth = 10;
                            option.series.barMaxWidth = 40;
                            chart.setOption(option, true);
                        }
                    }, {
                        text: 'barMaxWidth: 40',
                        onclick: function () {
                            var option = makeOption();
                            option.title.text = 'no barMinWidth, barMaxWidth: 40';
                            option.series.barMaxWidth = 40;
                            chart.setOption(option, true);
                        }
                    }, {
                        text: 'barWidth: 60, barMaxWidth: 20',
                        onclick: function () {
                            var option = makeOption();
                            option.title.text = 'barWidth: 60, barMaxWidth: 20, final bar width should keep 20';
                            option.series.barWidth = 60;
                            option.series.barMaxWidth = 20;
                            chart.setOption(option, true);
                        }
                    }]
                });
            });

        </script>








        <script>

            require([
                'echarts'
            ], function (echarts) {
                var data = [];
                for (var i = 0; i < 80; i++) {
                    data.push(['a' + i, 10]);
                }

                function makeOption() {
                    var option = {
                        tooltip: {},
                        xAxis: {
                            type: 'category'
                        },
                        yAxis: {
                        },
                        dataZoom:
                        [{
                            type: 'inside'
                        }, {
                            type: 'slider'
                        }],
                        series: {
                            type: 'bar',
                            data: data
                        },
                        title: {
                            text: 'no barMinWidth, no barMaxWidth specifed'
                        }
                    };
                    return option;
                }

                var chart = testHelper.create(echarts, 'main2', {
                    title: [
                        'On `category` axis.',
                        'Test **barMinWidth** and **barMaxWidth**: move dataZoom, ',
                        'bar should be **visible**.',
                        '**bar width** should be correct as the title described.'
                    ],
                    height: 200,
                    width: 600,
                    option: makeOption(),
                    buttons: [{
                        text: 'barMinWidth: 10',
                        onclick: function () {
                            var option = makeOption();
                            option.title.text = 'barMinWidth: 10, no barMaxWidth';
                            option.series.barMinWidth = 10;
                            chart.setOption(option, true);
                        }
                    }, {
                        text: 'barMinWidth: 10, barMaxWidth: 40',
                        onclick: function () {
                            var option = makeOption();
                            option.title.text = 'barMinWidth: 10, barMaxWidth: 40';
                            option.series.barMinWidth = 10;
                            option.series.barMaxWidth = 40;
                            chart.setOption(option, true);
                        }
                    }, {
                        text: 'barMaxWidth: 40',
                        onclick: function () {
                            var option = makeOption();
                            option.title.text = 'no barMinWidth, barMaxWidth: 40';
                            option.series.barMaxWidth = 40;
                            chart.setOption(option, true);
                        }
                    }, {
                        text: 'barWidth: "98%", barMaxWidth: 20',
                        onclick: function () {
                            var option = makeOption();
                            option.title.text = 'barWidth: "98%", barMaxWidth: 20\nfinal bar width should not over 20';
                            option.series.barWidth = '98%';
                            option.series.barMaxWidth = 20;
                            chart.setOption(option, true);
                        }
                    }, {
                        text: 'barWidth: 60, barMaxWidth: 20',
                        onclick: function () {
                            var option = makeOption();
                            option.title.text = 'barWidth: 60, barMaxWidth: 20\nfinal bar width should keep 20';
                            option.series.barWidth = 60;
                            option.series.barMaxWidth = 20;
                            chart.setOption(option, true);
                        }
                    }]
                });
            });

        </script>


        <script>

            require([
                'echarts'
            ], function (echarts) {
                var cat = [];
                var data3 = [];
                var data4 = [];
                var days = 20;
                for (var i = 0; i < days; i++) {
                    cat.push(i);
                    data3.push(i * 2);
                    data4.push(50 - i * 2);
                }
                var option = {
                    title: {
                        name: "数据纯属虚构"
                    },
                    tooltip: {
                        trigger: "axis",
                        axisPointer: {
                            type: "shadow"
                        }
                    },
                    xAxis: {
                        type: "category",
                        data: cat,
                        interval: 1,
                    },
                    yAxis: {
                        type: "value",
                        min: 0,
                    },
                    series: [
                        {
                            type: "bar",
                            name: "系列3",
                            barMaxWidth: 20,
                            data: data3,
                        }, {
                            type: "bar",
                            name: "系列4",
                            barMaxWidth: 20,
                            data: data4,
                            barGap: "-100%",
                        }
                    ],
                };

                var chart = testHelper.create(echarts, 'main3', {
                    title: [
                        'Two series of bar should have same width if barGap is set to -100%, and barMaxWidth is set',
                        'Case from #7356'
                    ],
                    draggable: true,
                    width: 700,
                    option: option,
                    buttons: []
                });
            });

        </script>


    </body>
</html>