懒羊羊
2023-11-14 8286c62256f23bc2367a6729c0f46f84215e380b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
 * @license Highcharts JS v3.0.6 (2013-10-04)
 * Plugin for displaying a message when there is no data visible in chart.
 *
 * (c) 2010-2013 Highsoft AS
 * Author: Øystein Moseng
 *
 * License: www.highcharts.com/license
 */
 
(function (H) { // docs
    
    var seriesTypes = H.seriesTypes,
        chartPrototype = H.Chart.prototype,
        defaultOptions = H.getOptions(),
        extend = H.extend;
 
    // Add language option
    extend(defaultOptions.lang, {
        noData: 'No data to display'
    });
    
    // Add default display options for message
    defaultOptions.noData = {
        position: {
            x: 0,
            y: 0,            
            align: 'center',
            verticalAlign: 'middle'
        },
        attr: {                        
        },
        style: {    
            fontWeight: 'bold',        
            fontSize: '12px',
            color: '#60606a'        
        }
    };
 
    /**
     * Define hasData functions for series. These return true if there are data points on this series within the plot area
     */    
    function hasDataPie() {
        return !!this.points.length; /* != 0 */
    }
 
    seriesTypes.pie.prototype.hasData = hasDataPie;
 
    if (seriesTypes.gauge) {
        seriesTypes.gauge.prototype.hasData = hasDataPie;
    }
 
    if (seriesTypes.waterfall) {
        seriesTypes.waterfall.prototype.hasData = hasDataPie;
    }
 
    H.Series.prototype.hasData = function () {
        return this.dataMax !== undefined && this.dataMin !== undefined;
    };
    
    /**
     * Display a no-data message.
     *
     * @param {String} str An optional message to show in place of the default one 
     */
    chartPrototype.showNoData = function (str) {
        var chart = this,
            options = chart.options,
            text = str || options.lang.noData,
            noDataOptions = options.noData;
 
        if (!chart.noDataLabel) {
            chart.noDataLabel = chart.renderer.label(text, 0, 0, null, null, null, null, null, 'no-data')
                .attr(noDataOptions.attr)
                .css(noDataOptions.style)
                .add();
            chart.noDataLabel.align(extend(chart.noDataLabel.getBBox(), noDataOptions.position), false, 'plotBox');
        }
    };
 
    /**
     * Hide no-data message    
     */    
    chartPrototype.hideNoData = function () {
        var chart = this;
        if (chart.noDataLabel) {
            chart.noDataLabel = chart.noDataLabel.destroy();
        }
    };
 
    /**
     * Returns true if there are data points within the plot area now
     */    
    chartPrototype.hasData = function () {
        var chart = this,
            series = chart.series,
            i = series.length;
 
        while (i--) {
            if (series[i].hasData() && !series[i].options.isInternal) { 
                return true;
            }    
        }
 
        return false;
    };
 
    /**
     * Show no-data message if there is no data in sight. Otherwise, hide it.
     */
    function handleNoData() {
        var chart = this;
        if (chart.hasData()) {
            chart.hideNoData();
        } else {
            chart.showNoData();
        }
    }
 
    /**
     * Add event listener to handle automatic display of no-data message
     */
    chartPrototype.callbacks.push(function (chart) {
        H.addEvent(chart, 'load', handleNoData);
        H.addEvent(chart, 'redraw', handleNoData);
    });
 
}(Highcharts));