PageSourceSearch

https://proveg.org/wp-content/plugins/iChart-pro-max//assets/js/chartjs-plugin-deferred.js?ver=7.1.2

js proveg.org collected 2026-10-02 04:58:19 UTC 4,365 bytes, 194 lines download raw bytes

1/*
2 * @license
3 * chartjs-plugin-deferred
4 * http://chartjs.org/
5 * Version: 1.0.1
6 *
7 * Copyright 2018 Simon Brunel
8 * Released under the MIT license
9 * https://github.com/chartjs/chartjs-plugin-deferred/blob/master/LICENSE.md
10 */
11(function (global, factory) {
12	typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('chart.js')) :
13	typeof define === 'function' && define.amd ? define(['chart.js'], factory) :
14	(factory(global.Chart));
15}(this, (function (Chart) { 'use strict';
16
17Chart = Chart && Chart.hasOwnProperty('default') ? Chart['default'] : Chart;
18
19'use strict';
20
21var helpers = Chart.helpers;
22var STUB_KEY = '$chartjs_deferred';
23var MODEL_KEY = '$deferred';
24
25/**
26 * Plugin based on discussion from Chart.js issue #2745.
27 * @see https://github.com/chartjs/Chart.js/issues/2745
28 */
29Chart.defaults.global.plugins.deferred = {
30	xOffset: 0,
31	yOffset: 0,
32	delay: 0
33};
34
35function defer(fn, delay) {
36	if (delay) {
37		window.setTimeout(fn, delay);
38	} else {
39		helpers.requestAnimFrame.call(window, fn);
40	}
41}
42
43function computeOffset(value, base) {
44	var number = parseInt(value, 10);
45	if (isNaN(number)) {
46		return 0;
47	} else if (typeof value === 'string' && value.indexOf('%') !== -1) {
48		return number / 100 * base;
49	}
50	return number;
51}
52
53function chartInViewport(chart) {
54	var options = chart[MODEL_KEY].options;
55	var canvas = chart.chart.canvas;
56
57	// http://stackoverflow.com/a/21696585
58	if (!canvas || canvas.offsetParent === null) {
59		return false;
60	}
61
62	var rect = canvas.getBoundingClientRect();
63	var dy = computeOffset(options.yOffset || 0, rect.height);
64	var dx = computeOffset(options.xOffset || 0, rect.width);
65
66	return rect.right - dx >= 0
67		&& rect.bottom - dy >= 0
68		&& rect.left + dx <= window.innerWidth
69		&& rect.top + dy <= window.innerHeight;
70}
71
72function onScroll(event) {
73	var node = event.target;
74	var stub = node[STUB_KEY];
75	if (stub.ticking) {
76		return;
77	}
78
79	stub.ticking = true;
80	defer(function() {
81		var charts = stub.charts.slice();
82		var ilen = charts.length;
83		var chart, i;
84
85		for (i = 0; i < ilen; ++i) {
86			chart = charts[i];
87			if (chartInViewport(chart)) {
88				unwatch(chart); // eslint-disable-line
89				chart[MODEL_KEY].appeared = true;
90				chart.update();
91			}
92		}
93
94		stub.ticking = false;
95	});
96}
97
98function isScrollable(node) {
99	var type = node.nodeType;
100	if (type === Node.ELEMENT_NODE) {
101		var overflowX = helpers.getStyle(node, 'overflow-x');
102		var overflowY = helpers.getStyle(node, 'overflow-y');
103		return overflowX === 'auto' || overflowX === 'scroll'
104			|| overflowY === 'auto' || overflowY === 'scroll';
105	}
106
107	return node.nodeType === Node.DOCUMENT_NODE;
108}
109
110function watch(chart) {
111	var canvas = chart.chart.canvas;
112	var parent = canvas.parentElement;
113	var stub, charts;
114
115	while (parent) {
116		if (isScrollable(parent)) {
117			stub = parent[STUB_KEY] || (parent[STUB_KEY] = {});
118			charts = stub.charts || (stub.charts = []);
119			if (charts.length === 0) {
120				helpers.addEvent(parent, 'scroll', onScroll);
121			}
122
123			charts.push(chart);
124			chart[MODEL_KEY].elements.push(parent);
125		}
126
127		parent = parent.parentElement || parent.ownerDocument;
128	}
129}
130
131function unwatch(chart) {
132	chart[MODEL_KEY].elements.forEach(function(element) {
133		var charts = element[STUB_KEY].charts;
134		charts.splice(charts.indexOf(chart), 1);
135		if (!charts.length) {
136			helpers.removeEvent(element, 'scroll', onScroll);
137			delete element[STUB_KEY];
138		}
139	});
140
141	chart[MODEL_KEY].elements = [];
142}
143
144Chart.plugins.register({
145	id: 'deferred',
146
147	beforeInit: function(chart, options) {
148		chart[MODEL_KEY] = {
149			options: options,
150			appeared: false,
151			delayed: false,
152			loaded: false,
153			elements: []
154		};
155
156		watch(chart);
157	},
158
159	beforeDatasetsUpdate: function(chart, options) {
160		var model = chart[MODEL_KEY];
161		if (!model.loaded) {
162			if (!model.appeared && !chartInViewport(chart)) {
163				// cancel the datasets update
164				return false;
165			}
166
167			model.appeared = true;
168			model.loaded = true;
169			unwatch(chart);
170
171			if (options.delay > 0) {
172				model.delayed = true;
173				defer(function() {
174					model.delayed = false;
175					chart.update();
176				}, options.delay);
177
178				return false;
179			}
180		}
181
182		if (model.delayed) {
183			// in case of delayed update, ensure to block external requests, such
184			// as interacting with the legend label, or direct calls to update()
185			return false;
186		}
187	},
188
189	destroy: function(chart) {
190		unwatch(chart);
191	}
192});
193
194})));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.