@progress/kendo-charts 2.4.0-dev.202405211537 → 2.4.0-dev.202406100726

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/cdn/js/kendo-charts.js +1 -1
  2. package/dist/cdn/main.js +1 -1
  3. package/dist/es/chart/legend/legend-layout.js +4 -2
  4. package/dist/es/common/event-map.js +17 -0
  5. package/dist/es/common/event-utils.js +61 -0
  6. package/dist/es/common/get-supported-features.js +55 -0
  7. package/dist/es/common/noop.js +1 -0
  8. package/dist/es/common/now.js +3 -0
  9. package/dist/es/common/observable.js +1 -3
  10. package/dist/es/{map/scroller → common}/user-events.js +43 -131
  11. package/dist/es/common.js +7 -0
  12. package/dist/es/map/layers/layer.js +2 -5
  13. package/dist/es/map/layers/marker.js +3 -3
  14. package/dist/es/map/map.js +6 -6
  15. package/dist/es/map/navigator.js +3 -3
  16. package/dist/es/map/scroller/draggable.js +6 -11
  17. package/dist/es/map/scroller/fx.js +2 -2
  18. package/dist/es/map/scroller/scroller.js +7 -12
  19. package/dist/es/map/utils.js +9 -339
  20. package/dist/es/map/zoom.js +3 -3
  21. package/dist/es/sankey/label.js +21 -7
  22. package/dist/es/sankey/legend.js +16 -4
  23. package/dist/es/sankey/link.js +11 -4
  24. package/dist/es/sankey/sankey.js +67 -15
  25. package/dist/es/services/dom-events-builder.js +2 -4
  26. package/dist/es2015/chart/legend/legend-layout.js +4 -2
  27. package/dist/es2015/common/event-map.js +17 -0
  28. package/dist/es2015/common/event-utils.js +61 -0
  29. package/dist/es2015/common/get-supported-features.js +55 -0
  30. package/dist/es2015/common/noop.js +1 -0
  31. package/dist/es2015/common/now.js +3 -0
  32. package/dist/es2015/common/observable.js +1 -3
  33. package/dist/es2015/{map/scroller → common}/user-events.js +39 -131
  34. package/dist/es2015/common.js +7 -0
  35. package/dist/es2015/map/layers/layer.js +2 -5
  36. package/dist/es2015/map/layers/marker.js +3 -3
  37. package/dist/es2015/map/map.js +6 -6
  38. package/dist/es2015/map/navigator.js +3 -3
  39. package/dist/es2015/map/scroller/draggable.js +6 -11
  40. package/dist/es2015/map/scroller/fx.js +2 -2
  41. package/dist/es2015/map/scroller/scroller.js +7 -12
  42. package/dist/es2015/map/utils.js +8 -339
  43. package/dist/es2015/map/zoom.js +3 -3
  44. package/dist/es2015/sankey/label.js +19 -6
  45. package/dist/es2015/sankey/legend.js +15 -5
  46. package/dist/es2015/sankey/link.js +9 -4
  47. package/dist/es2015/sankey/sankey.js +66 -17
  48. package/dist/es2015/services/dom-events-builder.js +2 -4
  49. package/dist/npm/main.js +2795 -2975
  50. package/dist/npm/sankey.d.ts +4 -0
  51. package/dist/systemjs/kendo-charts.js +1 -1
  52. package/package.json +1 -1
@@ -1,15 +1,13 @@
1
- import {
2
- isFunction,
3
- isArray,
4
- hasOwnProperty
5
- } from '../common';
1
+ import { getSupportedFeatures } from '../common';
6
2
 
7
3
  /* eslint-disable arrow-body-style, no-useless-escape */
8
4
 
9
- const defineProperty = Object.defineProperty;
10
-
11
5
  export const extend = Object.assign;
12
6
 
7
+ export const proxy = (method, context) => {
8
+ return method.bind(context);
9
+ };
10
+
13
11
  export let convertToHtml = (html) => {
14
12
  const div = document.createElement("div");
15
13
  div.innerHTML = html;
@@ -65,331 +63,9 @@ export let toPixels = (value) => {
65
63
  return result;
66
64
  };
67
65
 
68
- const detectOS = (ua) => {
69
- let os = false, minorVersion, match = [],
70
- // notAndroidPhone = !/mobile safari/i.test(ua),
71
- agentRxs = {
72
- wp: /(Windows Phone(?: OS)?)\s(\d+)\.(\d+(\.\d+)?)/,
73
- fire: /(Silk)\/(\d+)\.(\d+(\.\d+)?)/,
74
- android: /(Android|Android.*(?:Opera|Firefox).*?\/)\s*(\d+)\.?(\d+(\.\d+)?)?/,
75
- iphone: /(iPhone|iPod).*OS\s+(\d+)[\._]([\d\._]+)/,
76
- ipad: /(iPad).*OS\s+(\d+)[\._]([\d_]+)/,
77
- meego: /(MeeGo).+NokiaBrowser\/(\d+)\.([\d\._]+)/,
78
- webos: /(webOS)\/(\d+)\.(\d+(\.\d+)?)/,
79
- blackberry: /(BlackBerry|BB10).*?Version\/(\d+)\.(\d+(\.\d+)?)/,
80
- playbook: /(PlayBook).*?Tablet\s*OS\s*(\d+)\.(\d+(\.\d+)?)/,
81
- windows: /(MSIE)\s+(\d+)\.(\d+(\.\d+)?)/,
82
- tizen: /(tizen).*?Version\/(\d+)\.(\d+(\.\d+)?)/i,
83
- sailfish: /(sailfish).*rv:(\d+)\.(\d+(\.\d+)?).*firefox/i,
84
- ffos: /(Mobile).*rv:(\d+)\.(\d+(\.\d+)?).*Firefox/
85
- },
86
- osRxs = {
87
- ios: /^i(phone|pad|pod)$/i,
88
- android: /^android|fire$/i,
89
- blackberry: /^blackberry|playbook/i,
90
- windows: /windows/,
91
- wp: /wp/,
92
- flat: /sailfish|ffos|tizen/i,
93
- meego: /meego/
94
- },
95
- formFactorRxs = {
96
- tablet: /playbook|ipad|fire/i
97
- },
98
- browserRxs = {
99
- omini: /Opera\sMini/i,
100
- omobile: /Opera\sMobi/i,
101
- firefox: /Firefox|Fennec/i,
102
- mobilesafari: /version\/.*safari/i,
103
- ie: /MSIE|Windows\sPhone/i,
104
- chrome: /chrome|crios/i,
105
- webkit: /webkit/i
106
- };
107
-
108
- for (let agent in agentRxs) {
109
- if (hasOwnProperty(agentRxs, agent)) {
110
- match = ua.match(agentRxs[agent]);
111
- if (match) {
112
- if (agent === "windows" && "plugins" in navigator) { return false; } // Break if not Metro/Mobile Windows
113
-
114
- os = {};
115
- os.device = agent;
116
- os.tablet = testRegex(agent, formFactorRxs, false);
117
- os.browser = testRegex(ua, browserRxs, "default");
118
- os.name = testRegex(agent, osRxs);
119
- os[os.name] = true;
120
- os.majorVersion = match[2];
121
- os.minorVersion = (match[3] || "0").replace("_", ".");
122
- minorVersion = os.minorVersion.replace(".", "").substr(0, 2);
123
- os.flatVersion = os.majorVersion + minorVersion + (new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join("0"));
124
-
125
-
126
- break;
127
- }
128
- }
129
- }
130
-
131
- return os;
132
- };
133
-
134
- function testRegex(agent, regexes, dflt) {
135
- for (let regex in regexes) {
136
- if (hasOwnProperty(regexes, regex) && regexes[regex].test(agent)) {
137
- return regex;
138
- }
139
- }
140
- return dflt !== undefined ? dflt : agent;
141
- }
142
-
143
66
  export let hasNativeScrolling = (userAgent) => {
144
- const os = detectOS(userAgent);
145
- return os.ios || os.android;
146
- };
147
-
148
- const detectBrowser = (userAgent) => {
149
- let browser = false,
150
- match = [],
151
- browserRxs = {
152
- edge: /(edge)[ \/]([\w.]+)/i,
153
- webkit: /(chrome|crios)[ \/]([\w.]+)/i,
154
- safari: /(webkit)[ \/]([\w.]+)/i,
155
- opera: /(opera)(?:.*version|)[ \/]([\w.]+)/i,
156
- msie: /(msie\s|trident.*? rv:)([\w.]+)/i,
157
- mozilla: /(mozilla)(?:.*? rv:([\w.]+)|)/i
158
- };
159
-
160
- for (let agent in browserRxs) {
161
- if (hasOwnProperty(browserRxs, agent)) {
162
- match = userAgent.match(browserRxs[agent]);
163
-
164
- if (match) {
165
- browser = {};
166
- browser[agent] = true;
167
- browser[match[1].toLowerCase().split(" ")[0].split("/")[0]] = true;
168
- browser.version = parseInt(document.documentMode || match[2], 10);
169
-
170
- break;
171
- }
172
- }
173
- }
174
-
175
- return browser;
176
- };
177
-
178
- export let getEventMap = () => {
179
- let eventMap = {
180
- down: "touchstart mousedown",
181
- move: "mousemove touchmove",
182
- up: "mouseup touchend touchcancel",
183
- cancel: "mouseleave touchcancel"
184
- };
185
-
186
- const support = getSupportedFeatures();
187
-
188
- if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {
189
- eventMap = {
190
- down: "touchstart",
191
- move: "touchmove",
192
- up: "touchend touchcancel",
193
- cancel: "touchcancel"
194
- };
195
- } else if (support.pointers) {
196
- eventMap = {
197
- down: "pointerdown",
198
- move: "pointermove",
199
- up: "pointerup",
200
- cancel: "pointercancel pointerleave"
201
- };
202
- } else if (support.msPointers) {
203
- eventMap = {
204
- down: "MSPointerDown",
205
- move: "MSPointerMove",
206
- up: "MSPointerUp",
207
- cancel: "MSPointerCancel MSPointerLeave"
208
- };
209
- }
210
-
211
- return eventMap;
212
- };
213
-
214
- export const getSupportedFeatures = () => {
215
- const os = detectOS(navigator.userAgent);
216
- const browser = detectBrowser(navigator.userAgent);
217
-
218
- let chrome = browser.chrome,
219
- mobileChrome = browser.crios,
220
- mozilla = browser.mozilla,
221
- safari = browser.safari;
222
-
223
- const support = {};
224
-
225
- support.mobileOS = os;
226
- support.touch = "ontouchstart" in window;
227
- support.pointers = !chrome && !mobileChrome && !mozilla && !safari && window.PointerEvent;
228
- support.msPointers = !chrome && window.MSPointerEvent;
229
- support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);
230
- support.eventCapture = document.documentElement.addEventListener;
231
-
232
- let table = document.createElement("table");
233
-
234
- let transitions = support.transitions = false,
235
- transforms = support.transforms = false;
236
-
237
- const STRING = "string";
238
-
239
- ["Moz", "webkit", "O", "ms"].forEach(function(prefix) {
240
- let hasTransitions = typeof table.style[prefix + "Transition"] === STRING;
241
-
242
- if (hasTransitions || typeof table.style[prefix + "Transform"] === STRING) {
243
- let lowPrefix = prefix.toLowerCase();
244
-
245
- transforms = {
246
- css: (lowPrefix !== "ms") ? "-" + lowPrefix + "-" : "",
247
- prefix: prefix,
248
- event: (lowPrefix === "o" || lowPrefix === "webkit") ? lowPrefix : ""
249
- };
250
-
251
- if (hasTransitions) {
252
- transitions = transforms;
253
- transitions.event = transitions.event ? transitions.event + "TransitionEnd" : "transitionend";
254
- }
255
-
256
- return false;
257
- }
258
- });
259
-
260
- table = null;
261
-
262
- support.transforms = transforms;
263
- support.transitions = transitions;
264
-
265
- support.delayedClick = function() {
266
- // only the mobile devices with touch events do this.
267
- if (support.touch) {
268
- // All iOS devices so far (by the time I am writing this, iOS 9.0.2 is the latest),
269
- // delay their click events.
270
- if (support.mobileOS.ios) {
271
- return true;
272
- }
273
-
274
- if (support.mobileOS.android) {
275
-
276
- if (!support.browser.chrome) { // older webkits and webviews delay the click
277
- return true;
278
- }
279
-
280
- // from here on, we deal with Chrome on Android.
281
- if (support.browser.version < 32) {
282
- return false;
283
- }
284
-
285
- // Chrome 32+ does conditional fast clicks if the view port is not user scalable.
286
- const meta = document.querySelector("meta[name=viewport]");
287
- const contentAttr = meta ? meta.getAttribute("content") : "";
288
- return !contentAttr.match(/user-scalable=no/i);
289
- }
290
- }
291
-
292
- return false;
293
- };
294
-
295
- return support;
296
- };
297
-
298
- export const ownsElement = (parent, element) => {
299
- if (!element) {
300
- return false;
301
- }
302
-
303
- let node = element.parentNode;
304
-
305
- while (node !== null) {
306
- if (node === parent) {
307
- return true;
308
- }
309
-
310
- node = node.parentNode;
311
- }
312
-
313
- return false;
314
- };
315
-
316
- export const contains = (parent, element) => {
317
- return parent === element || ownsElement(parent, element);
318
- };
319
-
320
- export const proxy = (method, context) => {
321
- return method.bind(context);
322
- };
323
-
324
- function isString(value) {
325
- return typeof(value) === "string";
326
- }
327
-
328
- export const on = (element, events, filter, handler, useCapture) => {
329
- addEventListeners(element, events, filter, handler, useCapture);
330
- };
331
-
332
- export const addEventListeners = (element, events, filter, handler, useCapture) => {
333
- const eventNames = isArray(events) ? events : (events || "").split(" ");
334
-
335
- eventNames.forEach(function(eventName) {
336
- addEventListener(element, eventName, filter, handler, useCapture);
337
- });
338
- };
339
-
340
- export const addEventListener = (element, event, filter, handler, useCapture) => {
341
- let eventHandler = handler;
342
- let eventFilter;
343
-
344
- if (filter && isFunction(filter) && !handler) {
345
- eventHandler = filter;
346
- } else if (filter && isString(filter) && isFunction(eventHandler)) {
347
- eventFilter = filter;
348
- }
349
-
350
- element.addEventListener(event, function(e) {
351
- const closestMatchingTarget = e.target ? e.target.closest(eventFilter) : null;
352
-
353
- if (!eventFilter ||
354
- (eventFilter && e.target && closestMatchingTarget)) {
355
- const currentTarget = eventFilter ? closestMatchingTarget : e.currentTarget;
356
-
357
- // reassign the property as it is a getters only
358
- defineProperty(e, "currentTarget", { value: currentTarget });
359
- // keep a reference to the top-level target
360
- defineProperty(e, "delegateTarget", { value: element });
361
-
362
- eventHandler(e);
363
- }
364
- }, Boolean(useCapture));
365
- };
366
-
367
- export const off = (element, events, filter, handler, useCapture) => {
368
- removeEventListeners(element, events, filter, handler, useCapture);
369
- };
370
-
371
- export const removeEventListeners = (element, events, handler, useCapture) => {
372
- const eventNames = isArray(events) ? events : (events || "").split(" ");
373
-
374
- eventNames.forEach(function(eventName) {
375
- removeEventListener(element, eventName, handler, useCapture);
376
- });
377
- };
378
-
379
- export const removeEventListener = (element, event, handler, useCapture) => {
380
- element.removeEventListener(event, handler, Boolean(useCapture));
381
- };
382
-
383
- export const applyEventMap = (events) => {
384
- const eventMap = getEventMap(navigator.userAgent);
385
- function queryEventMap(e) {
386
- return eventMap[e] || e;
387
- }
388
-
389
- const eventRegEx = /([^ ]+)/g;
390
- const appliedEvents = events.replace(eventRegEx, queryEventMap);
391
-
392
- return appliedEvents;
67
+ const { mobileOS } = getSupportedFeatures(userAgent);
68
+ return mobileOS.ios || mobileOS.android;
393
69
  };
394
70
 
395
71
  export const setDefaultEvents = (type, events) => {
@@ -406,8 +82,7 @@ export const setDefaultEvents = (type, events) => {
406
82
  }
407
83
  };
408
84
 
409
- export const wheelDeltaY = (jQueryEvent) => {
410
- const e = jQueryEvent.originalEvent || jQueryEvent;
85
+ export const wheelDeltaY = (e) => {
411
86
  const deltaY = e.wheelDeltaY;
412
87
  let delta;
413
88
 
@@ -422,12 +97,6 @@ export const wheelDeltaY = (jQueryEvent) => {
422
97
  return delta;
423
98
  };
424
99
 
425
- export const now = () => {
426
- return Number(new Date());
427
- };
428
-
429
- export const noop = () => {};
430
-
431
100
  export const renderPos = (pos) => {
432
101
  let result = [];
433
102
 
@@ -5,12 +5,12 @@ import {
5
5
  keys,
6
6
  hasClasses,
7
7
  setDefaultOptions,
8
- renderIcon
8
+ renderIcon,
9
+ on,
10
+ off,
9
11
  } from '../common';
10
12
 
11
13
  import {
12
- on,
13
- off,
14
14
  setDefaultEvents,
15
15
  convertToHtml
16
16
  } from './utils';
@@ -8,7 +8,11 @@ const AFTER = 'after';
8
8
  export class Label extends SankeyElement {
9
9
  getElement() {
10
10
  const options = deepExtend({}, this.options, this.options.node.label);
11
- const { node, totalWidth, position, text, offset } = options;
11
+ const { node, diagramMinX, diagramMaxX, text, offset, rtl } = options;
12
+ let position = options.position;
13
+ if (rtl && position !== INSIDE) {
14
+ position = position === BEFORE ? AFTER : BEFORE;
15
+ }
12
16
 
13
17
  if (!options.visible || !text) {
14
18
  return null;
@@ -16,13 +20,20 @@ export class Label extends SankeyElement {
16
20
 
17
21
  const nodeBox = new Box(node.x0, node.y0, node.x1, node.y1);
18
22
  const visualOptions = this.visualOptions();
23
+ if (rtl && !visualOptions.align) {
24
+ visualOptions.align = 'right';
25
+ }
19
26
  const textbox = new TextBox(text, visualOptions);
20
27
  textbox.reflow(new Box());
21
28
  const textSizeBox = textbox.box;
22
-
23
- const goesOutside = node.x1 + textSizeBox.width() > totalWidth;
24
29
  const textY = nodeBox.center().y - (textSizeBox.height() / 2);
25
- const side = position === BEFORE || (position === INSIDE && goesOutside) ? BEFORE : AFTER;
30
+
31
+ const labelAfterLastNode = node.x1 + textSizeBox.width() > diagramMaxX;
32
+ const labelBeforeFirstNode = node.x0 - textSizeBox.width() < diagramMinX;
33
+ let side = position === BEFORE || (position === INSIDE && labelAfterLastNode) ? BEFORE : AFTER;
34
+ if (rtl) {
35
+ side = position === AFTER || (position === INSIDE && labelBeforeFirstNode) ? AFTER : BEFORE;
36
+ }
26
37
  const textOrigin = [side === BEFORE ? node.x0 - textSizeBox.width() : node.x1, textY];
27
38
 
28
39
  const textRect = new Box(textOrigin[0], textOrigin[1], textOrigin[0] + textSizeBox.width(), textOrigin[1] + textSizeBox.height());
@@ -53,11 +64,13 @@ setDefaultOptions(Label, {
53
64
  position: INSIDE, // inside, before, after
54
65
  });
55
66
 
56
- export const resolveLabelOptions = (node, options, totalWidth) => deepExtend({},
67
+ export const resolveLabelOptions = (node, options, rtl, diagramMinX, diagramMaxX) => deepExtend({},
57
68
  options,
58
69
  {
59
70
  node,
60
- totalWidth,
71
+ diagramMinX,
72
+ diagramMaxX,
73
+ rtl,
61
74
  visual: node.label.visual,
62
75
  visible: node.label.visible,
63
76
  margin: node.label.margin,
@@ -1,7 +1,7 @@
1
1
  import { default as ChartLegend } from "../chart/legend/legend";
2
2
  import { SankeyElement } from "./element";
3
3
  import { setDefaultOptions } from '../common';
4
- import { BOTTOM, CENTER, POINTER } from "../common/constants";
4
+ import { BOTTOM, CENTER, LEFT, POINTER, RIGHT } from "../common/constants";
5
5
  import { AREA } from "../chart/constants";
6
6
 
7
7
  const sortData = (a, b) => {
@@ -11,10 +11,19 @@ const sortData = (a, b) => {
11
11
  return a.node.y0 - b.node.y0;
12
12
  };
13
13
 
14
+ const sortDataRTL = (a, b) => {
15
+ if (a.node.x1 - b.node.x1 !== 0) {
16
+ return a.node.x1 - b.node.x1;
17
+ }
18
+ return b.node.y0 - a.node.y0;
19
+ };
20
+
21
+ const sort = (rtl) => (rtl ? sortDataRTL : sortData);
22
+
14
23
  export class Legend extends SankeyElement {
15
24
  getElement() {
16
25
  const options = this.options;
17
- const { drawingRect, nodes = [], item } = options;
26
+ const { drawingRect, rtl, nodes = [], item, position } = options;
18
27
 
19
28
  if (options.visible === false || !nodes.length) {
20
29
  return null;
@@ -26,12 +35,13 @@ export class Legend extends SankeyElement {
26
35
  background: item.areaBackground !== undefined ? item.areaBackground : node.color,
27
36
  opacity: item.areaOpacity !== undefined ? item.areaOpacity : node.opacity
28
37
  },
29
- node: node,
38
+ node: node
30
39
  }));
31
40
 
32
- data.sort(sortData);
41
+ data.sort(sort(rtl));
33
42
 
34
- const legend = new ChartLegend(Object.assign({}, options, {data}));
43
+ const reverse = rtl && position !== LEFT && position !== RIGHT;
44
+ const legend = new ChartLegend(Object.assign({}, options, {data, reverse}), { rtl });
35
45
  legend.reflow(drawingRect);
36
46
 
37
47
  legend.renderVisual();
@@ -31,7 +31,7 @@ const angelBetweenTwoLines = (line1, line2) => {
31
31
  return Math.abs(a1 - a2);
32
32
  };
33
33
 
34
- const calculateControlPointsOffsetX = (link) => {
34
+ const calculateControlPointsOffsetX = (link, rtl) => {
35
35
  const { x0, x1, y0, y1 } = link;
36
36
  let xC = (x0 + x1) / 2;
37
37
 
@@ -60,7 +60,12 @@ const calculateControlPointsOffsetX = (link) => {
60
60
  // Another option is to assume the triangle is isosceles
61
61
  // => offset = Math.sqrt(2) * upperNarrowness;
62
62
 
63
- return y0 - y1 > 0 ? (-1) * offset : offset;
63
+ let sign = y0 - y1 > 0 ? (-1) : 1;
64
+ if (rtl) {
65
+ sign = -sign;
66
+ }
67
+
68
+ return sign * offset;
64
69
  };
65
70
 
66
71
  export class Link extends SankeyElement {
@@ -102,12 +107,12 @@ export class Link extends SankeyElement {
102
107
  if (!this.options.navigatable) {
103
108
  return;
104
109
  }
105
- const link = this.options.link;
110
+ const { link, rtl } = this.options;
106
111
  const { x0, x1, y0, y1 } = link;
107
112
  const xC = (x0 + x1) / 2;
108
113
  const halfWidth = link.width / 2;
109
114
 
110
- const offset = calculateControlPointsOffsetX(link);
115
+ const offset = calculateControlPointsOffsetX(link, rtl);
111
116
 
112
117
  this._highlight = new drawing.Path({ stroke: this.options.focusHighlight, visible: false })
113
118
  .moveTo(x0, y0 + halfWidth)