| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | 'use strict';import H from '../parts/Globals.js';import '../parts/Series.js';var Series = H.Series,    addEvent = H.addEvent,    noop = H.noop;/* ************************************************************************** * * * DERIVED SERIES MIXIN * * ************************************************************************** *//** * Provides methods for auto setting/updating series data based on the based * series data. * * @private * @mixin derivedSeriesMixin */var derivedSeriesMixin = {    /**     * Initialise series     *     * @private     * @function derivedSeriesMixin.init     */    init: function () {        Series.prototype.init.apply(this, arguments);        this.initialised = false;        this.baseSeries = null;        this.eventRemovers = [];        this.addEvents();    },    /**     * Method to be implemented - inside the method the series has already     * access to the base series via m `this.baseSeries` and the bases data is     * initialised. It should return data in the format accepted by     * `Series.setData()` method     *     * @private     * @function derivedSeriesMixin.setDerivedData     *     * @return {Array<*>}     *         An array of data     */    setDerivedData: noop,    /**     * Sets base series for the series     *     * @private     * @function derivedSeriesMixin.setBaseSeries     */    setBaseSeries: function () {        var chart = this.chart,            baseSeriesOptions = this.options.baseSeries,            baseSeries =        baseSeriesOptions &&        (chart.series[baseSeriesOptions] || chart.get(baseSeriesOptions));        this.baseSeries = baseSeries || null;    },    /**     * Adds events for the series     *     * @private     * @function derivedSeriesMixin.addEvents     */    addEvents: function () {        var derivedSeries = this,            chartSeriesLinked;        chartSeriesLinked = addEvent(            this.chart,            'afterLinkSeries',            function () {                derivedSeries.setBaseSeries();                if (derivedSeries.baseSeries && !derivedSeries.initialised) {                    derivedSeries.setDerivedData();                    derivedSeries.addBaseSeriesEvents();                    derivedSeries.initialised = true;                }            }        );        this.eventRemovers.push(            chartSeriesLinked        );    },    /**     * Adds events to the base series - it required for recalculating the data     * in the series if the base series is updated / removed / etc.     *     * @private     * @function derivedSeriesMixin.addBaseSeriesEvents     */    addBaseSeriesEvents: function () {        var derivedSeries = this,            updatedDataRemover,            destroyRemover;        updatedDataRemover = addEvent(            derivedSeries.baseSeries,            'updatedData',            function () {                derivedSeries.setDerivedData();            }        );        destroyRemover = addEvent(            derivedSeries.baseSeries,            'destroy',            function () {                derivedSeries.baseSeries = null;                derivedSeries.initialised = false;            }        );        derivedSeries.eventRemovers.push(            updatedDataRemover,            destroyRemover        );    },    /**     * Destroys the series     *     * @private     * @function derivedSeriesMixin.destroy     */    destroy: function () {        this.eventRemovers.forEach(function (remover) {            remover();        });        Series.prototype.destroy.apply(this, arguments);    }};export default derivedSeriesMixin;
 |