q2-tecton-elements 1.23.0-alpha.0 → 1.23.0

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 (161) hide show
  1. package/dist/cjs/charting-d02cba1f.js +3127 -0
  2. package/dist/cjs/{index-3518c78c.js → index-0648c2ec.js} +5 -2
  3. package/dist/cjs/{installCanvasRenderer-b4d10c92.js → installCanvasRenderer-6c4fbcc9.js} +230 -1130
  4. package/dist/cjs/installLabelLayout-d6b548fe.js +1048 -0
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/q2-badge_2.cjs.entry.js +1 -1
  7. package/dist/cjs/q2-btn_2.cjs.entry.js +2 -2
  8. package/dist/cjs/q2-calendar.cjs.entry.js +1 -1
  9. package/dist/cjs/q2-card.cjs.entry.js +2 -2
  10. package/dist/cjs/q2-carousel-pane.cjs.entry.js +1 -1
  11. package/dist/cjs/q2-carousel.cjs.entry.js +1 -1
  12. package/dist/cjs/q2-chart-area.cjs.entry.js +4569 -0
  13. package/dist/cjs/q2-chart-bar.cjs.entry.js +25 -3133
  14. package/dist/cjs/q2-chart-donut.cjs.entry.js +9 -8
  15. package/dist/cjs/q2-checkbox-group.cjs.entry.js +1 -1
  16. package/dist/cjs/q2-checkbox.cjs.entry.js +2 -2
  17. package/dist/cjs/q2-dropdown-item.cjs.entry.js +1 -1
  18. package/dist/cjs/q2-dropdown.cjs.entry.js +1 -1
  19. package/dist/cjs/q2-editable-field.cjs.entry.js +1 -1
  20. package/dist/cjs/q2-icon.cjs.entry.js +1 -1
  21. package/dist/cjs/q2-loading-element.cjs.entry.js +1 -1
  22. package/dist/cjs/q2-loc.cjs.entry.js +1 -1
  23. package/dist/cjs/q2-message.cjs.entry.js +1 -1
  24. package/dist/cjs/q2-month-picker.cjs.entry.js +1 -1
  25. package/dist/cjs/q2-optgroup.cjs.entry.js +1 -1
  26. package/dist/cjs/q2-option-list_2.cjs.entry.js +5 -3
  27. package/dist/cjs/q2-pagination.cjs.entry.js +1 -1
  28. package/dist/cjs/q2-pill.cjs.entry.js +1 -1
  29. package/dist/cjs/q2-radio-group.cjs.entry.js +1 -1
  30. package/dist/cjs/q2-radio.cjs.entry.js +1 -1
  31. package/dist/cjs/q2-section.cjs.entry.js +1 -1
  32. package/dist/cjs/q2-select.cjs.entry.js +3 -2
  33. package/dist/cjs/q2-stepper-pane.cjs.entry.js +1 -1
  34. package/dist/cjs/q2-stepper-vertical.cjs.entry.js +1 -1
  35. package/dist/cjs/q2-stepper.cjs.entry.js +1 -1
  36. package/dist/cjs/q2-tab-container.cjs.entry.js +1 -1
  37. package/dist/cjs/q2-tag.cjs.entry.js +1 -1
  38. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  39. package/dist/cjs/q2-textarea.cjs.entry.js +1 -1
  40. package/dist/collection/collection-manifest.json +1 -0
  41. package/dist/collection/components/q2-card/index.js +1 -1
  42. package/dist/collection/components/q2-chart-area/index.js +622 -0
  43. package/dist/collection/components/q2-chart-area/styles.css +82 -0
  44. package/dist/collection/components/q2-chart-bar/index.js +4 -4
  45. package/dist/collection/components/q2-chart-bar/styles.css +3 -6
  46. package/dist/collection/components/q2-chart-donut/index.js +1 -1
  47. package/dist/collection/components/q2-checkbox/styles.css +1 -0
  48. package/dist/collection/components/q2-loading/skeleton/q2-loading-element/styles.css +4 -0
  49. package/dist/collection/components/q2-loading/styles.css +4 -0
  50. package/dist/collection/components/q2-popover/index.js +4 -2
  51. package/dist/collection/components/q2-select/index.js +19 -1
  52. package/dist/collection/utils/index.js +5 -2
  53. package/dist/components/charting.js +3113 -0
  54. package/dist/components/index.d.ts +1 -0
  55. package/dist/components/index.js +1 -0
  56. package/dist/components/index12.js +4 -2
  57. package/dist/components/index13.js +5 -2
  58. package/dist/components/index9.js +1 -1
  59. package/dist/components/installCanvasRenderer.js +188 -1123
  60. package/dist/components/installLabelLayout.js +1042 -0
  61. package/dist/components/q2-card.js +1 -1
  62. package/dist/components/q2-chart-area.d.ts +11 -0
  63. package/dist/components/q2-chart-area.js +4604 -0
  64. package/dist/components/q2-chart-bar.js +10 -3118
  65. package/dist/components/q2-chart-donut.js +3 -2
  66. package/dist/components/q2-checkbox.js +1 -1
  67. package/dist/components/q2-loading-element.js +1 -1
  68. package/dist/components/q2-select.js +3 -1
  69. package/dist/esm/charting-2a73ba8e.js +3113 -0
  70. package/dist/esm/{index-9c591682.js → index-501fd22e.js} +5 -2
  71. package/dist/esm/{installCanvasRenderer-0143b52d.js → installCanvasRenderer-4a470516.js} +188 -1123
  72. package/dist/esm/installLabelLayout-d660eaad.js +1042 -0
  73. package/dist/esm/loader.js +1 -1
  74. package/dist/esm/q2-badge_2.entry.js +1 -1
  75. package/dist/esm/q2-btn_2.entry.js +2 -2
  76. package/dist/esm/q2-calendar.entry.js +1 -1
  77. package/dist/esm/q2-card.entry.js +2 -2
  78. package/dist/esm/q2-carousel-pane.entry.js +1 -1
  79. package/dist/esm/q2-carousel.entry.js +1 -1
  80. package/dist/esm/q2-chart-area.entry.js +4565 -0
  81. package/dist/esm/q2-chart-bar.entry.js +11 -3119
  82. package/dist/esm/q2-chart-donut.entry.js +4 -3
  83. package/dist/esm/q2-checkbox-group.entry.js +1 -1
  84. package/dist/esm/q2-checkbox.entry.js +2 -2
  85. package/dist/esm/q2-dropdown-item.entry.js +1 -1
  86. package/dist/esm/q2-dropdown.entry.js +1 -1
  87. package/dist/esm/q2-editable-field.entry.js +1 -1
  88. package/dist/esm/q2-icon.entry.js +1 -1
  89. package/dist/esm/q2-loading-element.entry.js +1 -1
  90. package/dist/esm/q2-loc.entry.js +1 -1
  91. package/dist/esm/q2-message.entry.js +1 -1
  92. package/dist/esm/q2-month-picker.entry.js +1 -1
  93. package/dist/esm/q2-optgroup.entry.js +1 -1
  94. package/dist/esm/q2-option-list_2.entry.js +5 -3
  95. package/dist/esm/q2-pagination.entry.js +1 -1
  96. package/dist/esm/q2-pill.entry.js +1 -1
  97. package/dist/esm/q2-radio-group.entry.js +1 -1
  98. package/dist/esm/q2-radio.entry.js +1 -1
  99. package/dist/esm/q2-section.entry.js +1 -1
  100. package/dist/esm/q2-select.entry.js +3 -2
  101. package/dist/esm/q2-stepper-pane.entry.js +1 -1
  102. package/dist/esm/q2-stepper-vertical.entry.js +1 -1
  103. package/dist/esm/q2-stepper.entry.js +1 -1
  104. package/dist/esm/q2-tab-container.entry.js +1 -1
  105. package/dist/esm/q2-tag.entry.js +1 -1
  106. package/dist/esm/q2-tecton-elements.js +1 -1
  107. package/dist/esm/q2-textarea.entry.js +1 -1
  108. package/dist/q2-tecton-elements/{p-b8b00394.entry.js → p-18629cbf.entry.js} +1 -1
  109. package/dist/q2-tecton-elements/{p-ce015552.entry.js → p-24f4571d.entry.js} +1 -1
  110. package/dist/q2-tecton-elements/{p-de164483.entry.js → p-2c20fc43.entry.js} +1 -1
  111. package/dist/q2-tecton-elements/{p-2d2c5af2.entry.js → p-3603fcdc.entry.js} +1 -1
  112. package/dist/q2-tecton-elements/{p-2c9b1308.entry.js → p-3813f51d.entry.js} +1 -1
  113. package/dist/q2-tecton-elements/{p-f800fd1e.entry.js → p-38a33baa.entry.js} +1 -1
  114. package/dist/q2-tecton-elements/{p-db873db2.entry.js → p-3e9a30c4.entry.js} +1 -1
  115. package/dist/q2-tecton-elements/{p-fc134a5d.entry.js → p-3fd5d010.entry.js} +1 -1
  116. package/dist/q2-tecton-elements/p-458b1987.js +1 -0
  117. package/dist/q2-tecton-elements/{p-0ba564b1.entry.js → p-45d61789.entry.js} +1 -1
  118. package/dist/q2-tecton-elements/p-52063431.js +39 -0
  119. package/dist/q2-tecton-elements/{p-fb37e67e.entry.js → p-53be87c8.entry.js} +1 -1
  120. package/dist/q2-tecton-elements/{p-520c40f6.entry.js → p-5b1aba1a.entry.js} +1 -1
  121. package/dist/q2-tecton-elements/p-604b22a8.entry.js +1 -0
  122. package/dist/q2-tecton-elements/{p-c4640b55.entry.js → p-68ef0786.entry.js} +1 -1
  123. package/dist/q2-tecton-elements/{p-18cc4758.entry.js → p-6b7e1ebd.entry.js} +1 -1
  124. package/dist/q2-tecton-elements/p-6be86940.entry.js +1 -0
  125. package/dist/q2-tecton-elements/p-70b01387.entry.js +1 -0
  126. package/dist/q2-tecton-elements/{p-c444a60b.entry.js → p-78fac0fa.entry.js} +1 -1
  127. package/dist/q2-tecton-elements/{p-97aa8423.entry.js → p-7aa80653.entry.js} +1 -1
  128. package/dist/q2-tecton-elements/p-833398d1.js +1 -0
  129. package/dist/q2-tecton-elements/{p-9281adaa.entry.js → p-8dea9a0c.entry.js} +1 -1
  130. package/dist/q2-tecton-elements/p-9b101e22.entry.js +1 -0
  131. package/dist/q2-tecton-elements/{p-c3f27fe2.entry.js → p-a2add94e.entry.js} +1 -1
  132. package/dist/q2-tecton-elements/p-a510290a.js +1 -0
  133. package/dist/q2-tecton-elements/{p-16c11d74.entry.js → p-acc77332.entry.js} +1 -1
  134. package/dist/q2-tecton-elements/{p-e4dc9ac0.entry.js → p-ba73ee1f.entry.js} +1 -1
  135. package/dist/q2-tecton-elements/{p-0fad9c5a.entry.js → p-ba76ecfd.entry.js} +1 -1
  136. package/dist/q2-tecton-elements/p-bbdae095.entry.js +1 -0
  137. package/dist/q2-tecton-elements/{p-041b3a82.entry.js → p-bf41e71b.entry.js} +1 -1
  138. package/dist/q2-tecton-elements/{p-ffb48ccc.entry.js → p-d27b2caa.entry.js} +1 -1
  139. package/dist/q2-tecton-elements/{p-4625184b.entry.js → p-d68b5eb3.entry.js} +1 -1
  140. package/dist/q2-tecton-elements/{p-cbd1289a.entry.js → p-d7b27803.entry.js} +1 -1
  141. package/dist/q2-tecton-elements/p-d88e4383.entry.js +1 -0
  142. package/dist/q2-tecton-elements/{p-9ebb283a.entry.js → p-ebd7efa5.entry.js} +1 -1
  143. package/dist/q2-tecton-elements/{p-6e6b5b80.entry.js → p-f0ec4d2c.entry.js} +1 -1
  144. package/dist/q2-tecton-elements/{p-0d8dd75a.entry.js → p-f6e868c1.entry.js} +1 -1
  145. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  146. package/dist/types/components/q2-card/index.d.ts +1 -1
  147. package/dist/types/components/q2-chart-area/index.d.ts +40 -0
  148. package/dist/types/components/q2-chart-bar/index.d.ts +2 -2
  149. package/dist/types/components/q2-chart-donut/index.d.ts +1 -1
  150. package/dist/types/components/q2-select/index.d.ts +1 -0
  151. package/dist/types/components.d.ts +58 -0
  152. package/dist/types/global.d.ts +4 -2
  153. package/package.json +2 -2
  154. package/dist/q2-tecton-elements/p-1f85cced.js +0 -39
  155. package/dist/q2-tecton-elements/p-5e374fbd.js +0 -1
  156. package/dist/q2-tecton-elements/p-6b52a262.entry.js +0 -1
  157. package/dist/q2-tecton-elements/p-aaf42539.entry.js +0 -1
  158. package/dist/q2-tecton-elements/p-cf41970f.entry.js +0 -1
  159. package/dist/q2-tecton-elements/p-e6d26f39.entry.js +0 -1
  160. package/dist/q2-tecton-elements/p-f35bf6a3.entry.js +0 -1
  161. /package/dist/types/workspace/workspace/{_production_release_1.22.x-alpha → Tecton_tecton-production_master}/packages/q2-tecton-elements/.stencil/test/helpers.d.ts +0 -0
@@ -0,0 +1,1042 @@
1
+ import { W as Point, bV as DISPLAY_STATES, b6 as retrieve2, ba as Polyline, y as defaults, J as SPECIAL_STATES, bz as invert, P as Path, Y as lerp, bW as quadraticProjectPoint, bX as cubicProjectPoint, bY as dist, v as PathProxy, bZ as normalizeRadian, a3 as makeInner, Q as BoundingRect, D as isFunction, bK as keys, d as getECData, aM as parsePercent, b_ as prepareLayoutList, a5 as filter, b$ as shiftLayoutOnX, b8 as shiftLayoutOnY, c0 as hideOverlap, I as each, c1 as isElementRemoved, H as labelInner, i as initProps, at as indexOf, u as updateProps, c2 as animateLabelValue, X as Transformable } from './installCanvasRenderer.js';
2
+
3
+ var PI2 = Math.PI * 2;
4
+ var CMD = PathProxy.CMD;
5
+ var DEFAULT_SEARCH_SPACE = ['top', 'right', 'bottom', 'left'];
6
+
7
+ function getCandidateAnchor(pos, distance, rect, outPt, outDir) {
8
+ var width = rect.width;
9
+ var height = rect.height;
10
+
11
+ switch (pos) {
12
+ case 'top':
13
+ outPt.set(rect.x + width / 2, rect.y - distance);
14
+ outDir.set(0, -1);
15
+ break;
16
+
17
+ case 'bottom':
18
+ outPt.set(rect.x + width / 2, rect.y + height + distance);
19
+ outDir.set(0, 1);
20
+ break;
21
+
22
+ case 'left':
23
+ outPt.set(rect.x - distance, rect.y + height / 2);
24
+ outDir.set(-1, 0);
25
+ break;
26
+
27
+ case 'right':
28
+ outPt.set(rect.x + width + distance, rect.y + height / 2);
29
+ outDir.set(1, 0);
30
+ break;
31
+ }
32
+ }
33
+
34
+ function projectPointToArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y, out) {
35
+ x -= cx;
36
+ y -= cy;
37
+ var d = Math.sqrt(x * x + y * y);
38
+ x /= d;
39
+ y /= d; // Intersect point.
40
+
41
+ var ox = x * r + cx;
42
+ var oy = y * r + cy;
43
+
44
+ if (Math.abs(startAngle - endAngle) % PI2 < 1e-4) {
45
+ // Is a circle
46
+ out[0] = ox;
47
+ out[1] = oy;
48
+ return d - r;
49
+ }
50
+
51
+ if (anticlockwise) {
52
+ var tmp = startAngle;
53
+ startAngle = normalizeRadian(endAngle);
54
+ endAngle = normalizeRadian(tmp);
55
+ } else {
56
+ startAngle = normalizeRadian(startAngle);
57
+ endAngle = normalizeRadian(endAngle);
58
+ }
59
+
60
+ if (startAngle > endAngle) {
61
+ endAngle += PI2;
62
+ }
63
+
64
+ var angle = Math.atan2(y, x);
65
+
66
+ if (angle < 0) {
67
+ angle += PI2;
68
+ }
69
+
70
+ if (angle >= startAngle && angle <= endAngle || angle + PI2 >= startAngle && angle + PI2 <= endAngle) {
71
+ // Project point is on the arc.
72
+ out[0] = ox;
73
+ out[1] = oy;
74
+ return d - r;
75
+ }
76
+
77
+ var x1 = r * Math.cos(startAngle) + cx;
78
+ var y1 = r * Math.sin(startAngle) + cy;
79
+ var x2 = r * Math.cos(endAngle) + cx;
80
+ var y2 = r * Math.sin(endAngle) + cy;
81
+ var d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y);
82
+ var d2 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y);
83
+
84
+ if (d1 < d2) {
85
+ out[0] = x1;
86
+ out[1] = y1;
87
+ return Math.sqrt(d1);
88
+ } else {
89
+ out[0] = x2;
90
+ out[1] = y2;
91
+ return Math.sqrt(d2);
92
+ }
93
+ }
94
+
95
+ function projectPointToLine(x1, y1, x2, y2, x, y, out, limitToEnds) {
96
+ var dx = x - x1;
97
+ var dy = y - y1;
98
+ var dx1 = x2 - x1;
99
+ var dy1 = y2 - y1;
100
+ var lineLen = Math.sqrt(dx1 * dx1 + dy1 * dy1);
101
+ dx1 /= lineLen;
102
+ dy1 /= lineLen; // dot product
103
+
104
+ var projectedLen = dx * dx1 + dy * dy1;
105
+ var t = projectedLen / lineLen;
106
+
107
+ if (limitToEnds) {
108
+ t = Math.min(Math.max(t, 0), 1);
109
+ }
110
+
111
+ t *= lineLen;
112
+ var ox = out[0] = x1 + t * dx1;
113
+ var oy = out[1] = y1 + t * dy1;
114
+ return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y));
115
+ }
116
+
117
+ function projectPointToRect(x1, y1, width, height, x, y, out) {
118
+ if (width < 0) {
119
+ x1 = x1 + width;
120
+ width = -width;
121
+ }
122
+
123
+ if (height < 0) {
124
+ y1 = y1 + height;
125
+ height = -height;
126
+ }
127
+
128
+ var x2 = x1 + width;
129
+ var y2 = y1 + height;
130
+ var ox = out[0] = Math.min(Math.max(x, x1), x2);
131
+ var oy = out[1] = Math.min(Math.max(y, y1), y2);
132
+ return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y));
133
+ }
134
+
135
+ var tmpPt = [];
136
+
137
+ function nearestPointOnRect(pt, rect, out) {
138
+ var dist = projectPointToRect(rect.x, rect.y, rect.width, rect.height, pt.x, pt.y, tmpPt);
139
+ out.set(tmpPt[0], tmpPt[1]);
140
+ return dist;
141
+ }
142
+ /**
143
+ * Calculate min distance corresponding point.
144
+ * This method won't evaluate if point is in the path.
145
+ */
146
+
147
+
148
+ function nearestPointOnPath(pt, path, out) {
149
+ var xi = 0;
150
+ var yi = 0;
151
+ var x0 = 0;
152
+ var y0 = 0;
153
+ var x1;
154
+ var y1;
155
+ var minDist = Infinity;
156
+ var data = path.data;
157
+ var x = pt.x;
158
+ var y = pt.y;
159
+
160
+ for (var i = 0; i < data.length;) {
161
+ var cmd = data[i++];
162
+
163
+ if (i === 1) {
164
+ xi = data[i];
165
+ yi = data[i + 1];
166
+ x0 = xi;
167
+ y0 = yi;
168
+ }
169
+
170
+ var d = minDist;
171
+
172
+ switch (cmd) {
173
+ case CMD.M:
174
+ // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点
175
+ // 在 closePath 的时候使用
176
+ x0 = data[i++];
177
+ y0 = data[i++];
178
+ xi = x0;
179
+ yi = y0;
180
+ break;
181
+
182
+ case CMD.L:
183
+ d = projectPointToLine(xi, yi, data[i], data[i + 1], x, y, tmpPt, true);
184
+ xi = data[i++];
185
+ yi = data[i++];
186
+ break;
187
+
188
+ case CMD.C:
189
+ d = cubicProjectPoint(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt);
190
+ xi = data[i++];
191
+ yi = data[i++];
192
+ break;
193
+
194
+ case CMD.Q:
195
+ d = quadraticProjectPoint(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt);
196
+ xi = data[i++];
197
+ yi = data[i++];
198
+ break;
199
+
200
+ case CMD.A:
201
+ // TODO Arc 判断的开销比较大
202
+ var cx = data[i++];
203
+ var cy = data[i++];
204
+ var rx = data[i++];
205
+ var ry = data[i++];
206
+ var theta = data[i++];
207
+ var dTheta = data[i++]; // TODO Arc 旋转
208
+
209
+ i += 1;
210
+ var anticlockwise = !!(1 - data[i++]);
211
+ x1 = Math.cos(theta) * rx + cx;
212
+ y1 = Math.sin(theta) * ry + cy; // 不是直接使用 arc 命令
213
+
214
+ if (i <= 1) {
215
+ // 第一个命令起点还未定义
216
+ x0 = x1;
217
+ y0 = y1;
218
+ } // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放
219
+
220
+
221
+ var _x = (x - cx) * ry / rx + cx;
222
+
223
+ d = projectPointToArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y, tmpPt);
224
+ xi = Math.cos(theta + dTheta) * rx + cx;
225
+ yi = Math.sin(theta + dTheta) * ry + cy;
226
+ break;
227
+
228
+ case CMD.R:
229
+ x0 = xi = data[i++];
230
+ y0 = yi = data[i++];
231
+ var width = data[i++];
232
+ var height = data[i++];
233
+ d = projectPointToRect(x0, y0, width, height, x, y, tmpPt);
234
+ break;
235
+
236
+ case CMD.Z:
237
+ d = projectPointToLine(xi, yi, x0, y0, x, y, tmpPt, true);
238
+ xi = x0;
239
+ yi = y0;
240
+ break;
241
+ }
242
+
243
+ if (d < minDist) {
244
+ minDist = d;
245
+ out.set(tmpPt[0], tmpPt[1]);
246
+ }
247
+ }
248
+
249
+ return minDist;
250
+ } // Temporal variable for intermediate usage.
251
+
252
+
253
+ var pt0 = new Point();
254
+ var pt1 = new Point();
255
+ var pt2 = new Point();
256
+ var dir = new Point();
257
+ var dir2 = new Point();
258
+ /**
259
+ * Calculate a proper guide line based on the label position and graphic element definition
260
+ * @param label
261
+ * @param labelRect
262
+ * @param target
263
+ * @param targetRect
264
+ */
265
+
266
+ function updateLabelLinePoints(target, labelLineModel) {
267
+ if (!target) {
268
+ return;
269
+ }
270
+
271
+ var labelLine = target.getTextGuideLine();
272
+ var label = target.getTextContent(); // Needs to create text guide in each charts.
273
+
274
+ if (!(label && labelLine)) {
275
+ return;
276
+ }
277
+
278
+ var labelGuideConfig = target.textGuideLineConfig || {};
279
+ var points = [[0, 0], [0, 0], [0, 0]];
280
+ var searchSpace = labelGuideConfig.candidates || DEFAULT_SEARCH_SPACE;
281
+ var labelRect = label.getBoundingRect().clone();
282
+ labelRect.applyTransform(label.getComputedTransform());
283
+ var minDist = Infinity;
284
+ var anchorPoint = labelGuideConfig.anchor;
285
+ var targetTransform = target.getComputedTransform();
286
+ var targetInversedTransform = targetTransform && invert([], targetTransform);
287
+ var len = labelLineModel.get('length2') || 0;
288
+
289
+ if (anchorPoint) {
290
+ pt2.copy(anchorPoint);
291
+ }
292
+
293
+ for (var i = 0; i < searchSpace.length; i++) {
294
+ var candidate = searchSpace[i];
295
+ getCandidateAnchor(candidate, 0, labelRect, pt0, dir);
296
+ Point.scaleAndAdd(pt1, pt0, dir, len); // Transform to target coord space.
297
+
298
+ pt1.transform(targetInversedTransform); // Note: getBoundingRect will ensure the `path` being created.
299
+
300
+ var boundingRect = target.getBoundingRect();
301
+ var dist = anchorPoint ? anchorPoint.distance(pt1) : target instanceof Path ? nearestPointOnPath(pt1, target.path, pt2) : nearestPointOnRect(pt1, boundingRect, pt2); // TODO pt2 is in the path
302
+
303
+ if (dist < minDist) {
304
+ minDist = dist; // Transform back to global space.
305
+
306
+ pt1.transform(targetTransform);
307
+ pt2.transform(targetTransform);
308
+ pt2.toArray(points[0]);
309
+ pt1.toArray(points[1]);
310
+ pt0.toArray(points[2]);
311
+ }
312
+ }
313
+
314
+ limitTurnAngle(points, labelLineModel.get('minTurnAngle'));
315
+ labelLine.setShape({
316
+ points: points
317
+ });
318
+ } // Temporal variable for the limitTurnAngle function
319
+
320
+ var tmpArr = [];
321
+ var tmpProjPoint = new Point();
322
+ /**
323
+ * Reduce the line segment attached to the label to limit the turn angle between two segments.
324
+ * @param linePoints
325
+ * @param minTurnAngle Radian of minimum turn angle. 0 - 180
326
+ */
327
+
328
+ function limitTurnAngle(linePoints, minTurnAngle) {
329
+ if (!(minTurnAngle <= 180 && minTurnAngle > 0)) {
330
+ return;
331
+ }
332
+
333
+ minTurnAngle = minTurnAngle / 180 * Math.PI; // The line points can be
334
+ // /pt1----pt2 (label)
335
+ // /
336
+ // pt0/
337
+
338
+ pt0.fromArray(linePoints[0]);
339
+ pt1.fromArray(linePoints[1]);
340
+ pt2.fromArray(linePoints[2]);
341
+ Point.sub(dir, pt0, pt1);
342
+ Point.sub(dir2, pt2, pt1);
343
+ var len1 = dir.len();
344
+ var len2 = dir2.len();
345
+
346
+ if (len1 < 1e-3 || len2 < 1e-3) {
347
+ return;
348
+ }
349
+
350
+ dir.scale(1 / len1);
351
+ dir2.scale(1 / len2);
352
+ var angleCos = dir.dot(dir2);
353
+ var minTurnAngleCos = Math.cos(minTurnAngle);
354
+
355
+ if (minTurnAngleCos < angleCos) {
356
+ // Smaller than minTurnAngle
357
+ // Calculate project point of pt0 on pt1-pt2
358
+ var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false);
359
+ tmpProjPoint.fromArray(tmpArr); // Calculate new projected length with limited minTurnAngle and get the new connect point
360
+
361
+ tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle)); // Limit the new calculated connect point between pt1 and pt2.
362
+
363
+ var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y);
364
+
365
+ if (isNaN(t)) {
366
+ return;
367
+ }
368
+
369
+ if (t < 0) {
370
+ Point.copy(tmpProjPoint, pt1);
371
+ } else if (t > 1) {
372
+ Point.copy(tmpProjPoint, pt2);
373
+ }
374
+
375
+ tmpProjPoint.toArray(linePoints[1]);
376
+ }
377
+ }
378
+ /**
379
+ * Limit the angle of line and the surface
380
+ * @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite
381
+ */
382
+
383
+ function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) {
384
+ if (!(maxSurfaceAngle <= 180 && maxSurfaceAngle > 0)) {
385
+ return;
386
+ }
387
+
388
+ maxSurfaceAngle = maxSurfaceAngle / 180 * Math.PI;
389
+ pt0.fromArray(linePoints[0]);
390
+ pt1.fromArray(linePoints[1]);
391
+ pt2.fromArray(linePoints[2]);
392
+ Point.sub(dir, pt1, pt0);
393
+ Point.sub(dir2, pt2, pt1);
394
+ var len1 = dir.len();
395
+ var len2 = dir2.len();
396
+
397
+ if (len1 < 1e-3 || len2 < 1e-3) {
398
+ return;
399
+ }
400
+
401
+ dir.scale(1 / len1);
402
+ dir2.scale(1 / len2);
403
+ var angleCos = dir.dot(surfaceNormal);
404
+ var maxSurfaceAngleCos = Math.cos(maxSurfaceAngle);
405
+
406
+ if (angleCos < maxSurfaceAngleCos) {
407
+ // Calculate project point of pt0 on pt1-pt2
408
+ var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false);
409
+ tmpProjPoint.fromArray(tmpArr);
410
+ var HALF_PI = Math.PI / 2;
411
+ var angle2 = Math.acos(dir2.dot(surfaceNormal));
412
+ var newAngle = HALF_PI + angle2 - maxSurfaceAngle;
413
+
414
+ if (newAngle >= HALF_PI) {
415
+ // parallel
416
+ Point.copy(tmpProjPoint, pt2);
417
+ } else {
418
+ // Calculate new projected length with limited minTurnAngle and get the new connect point
419
+ tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI / 2 - newAngle)); // Limit the new calculated connect point between pt1 and pt2.
420
+
421
+ var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y);
422
+
423
+ if (isNaN(t)) {
424
+ return;
425
+ }
426
+
427
+ if (t < 0) {
428
+ Point.copy(tmpProjPoint, pt1);
429
+ } else if (t > 1) {
430
+ Point.copy(tmpProjPoint, pt2);
431
+ }
432
+ }
433
+
434
+ tmpProjPoint.toArray(linePoints[1]);
435
+ }
436
+ }
437
+
438
+ function setLabelLineState(labelLine, ignore, stateName, stateModel) {
439
+ var isNormal = stateName === 'normal';
440
+ var stateObj = isNormal ? labelLine : labelLine.ensureState(stateName); // Make sure display.
441
+
442
+ stateObj.ignore = ignore; // Set smooth
443
+
444
+ var smooth = stateModel.get('smooth');
445
+
446
+ if (smooth && smooth === true) {
447
+ smooth = 0.3;
448
+ }
449
+
450
+ stateObj.shape = stateObj.shape || {};
451
+
452
+ if (smooth > 0) {
453
+ stateObj.shape.smooth = smooth;
454
+ }
455
+
456
+ var styleObj = stateModel.getModel('lineStyle').getLineStyle();
457
+ isNormal ? labelLine.useStyle(styleObj) : stateObj.style = styleObj;
458
+ }
459
+
460
+ function buildLabelLinePath(path, shape) {
461
+ var smooth = shape.smooth;
462
+ var points = shape.points;
463
+
464
+ if (!points) {
465
+ return;
466
+ }
467
+
468
+ path.moveTo(points[0][0], points[0][1]);
469
+
470
+ if (smooth > 0 && points.length >= 3) {
471
+ var len1 = dist(points[0], points[1]);
472
+ var len2 = dist(points[1], points[2]);
473
+
474
+ if (!len1 || !len2) {
475
+ path.lineTo(points[1][0], points[1][1]);
476
+ path.lineTo(points[2][0], points[2][1]);
477
+ return;
478
+ }
479
+
480
+ var moveLen = Math.min(len1, len2) * smooth;
481
+ var midPoint0 = lerp([], points[1], points[0], moveLen / len1);
482
+ var midPoint2 = lerp([], points[1], points[2], moveLen / len2);
483
+ var midPoint1 = lerp([], midPoint0, midPoint2, 0.5);
484
+ path.bezierCurveTo(midPoint0[0], midPoint0[1], midPoint0[0], midPoint0[1], midPoint1[0], midPoint1[1]);
485
+ path.bezierCurveTo(midPoint2[0], midPoint2[1], midPoint2[0], midPoint2[1], points[2][0], points[2][1]);
486
+ } else {
487
+ for (var i = 1; i < points.length; i++) {
488
+ path.lineTo(points[i][0], points[i][1]);
489
+ }
490
+ }
491
+ }
492
+ /**
493
+ * Create a label line if necessary and set it's style.
494
+ */
495
+
496
+
497
+ function setLabelLineStyle(targetEl, statesModels, defaultStyle) {
498
+ var labelLine = targetEl.getTextGuideLine();
499
+ var label = targetEl.getTextContent();
500
+
501
+ if (!label) {
502
+ // Not show label line if there is no label.
503
+ if (labelLine) {
504
+ targetEl.removeTextGuideLine();
505
+ }
506
+
507
+ return;
508
+ }
509
+
510
+ var normalModel = statesModels.normal;
511
+ var showNormal = normalModel.get('show');
512
+ var labelIgnoreNormal = label.ignore;
513
+
514
+ for (var i = 0; i < DISPLAY_STATES.length; i++) {
515
+ var stateName = DISPLAY_STATES[i];
516
+ var stateModel = statesModels[stateName];
517
+ var isNormal = stateName === 'normal';
518
+
519
+ if (stateModel) {
520
+ var stateShow = stateModel.get('show');
521
+ var isLabelIgnored = isNormal ? labelIgnoreNormal : retrieve2(label.states[stateName] && label.states[stateName].ignore, labelIgnoreNormal);
522
+
523
+ if (isLabelIgnored // Not show when label is not shown in this state.
524
+ || !retrieve2(stateShow, showNormal) // Use normal state by default if not set.
525
+ ) {
526
+ var stateObj = isNormal ? labelLine : labelLine && labelLine.states[stateName];
527
+
528
+ if (stateObj) {
529
+ stateObj.ignore = true;
530
+ }
531
+
532
+ continue;
533
+ } // Create labelLine if not exists
534
+
535
+
536
+ if (!labelLine) {
537
+ labelLine = new Polyline();
538
+ targetEl.setTextGuideLine(labelLine); // Reset state of normal because it's new created.
539
+ // NOTE: NORMAL should always been the first!
540
+
541
+ if (!isNormal && (labelIgnoreNormal || !showNormal)) {
542
+ setLabelLineState(labelLine, true, 'normal', statesModels.normal);
543
+ } // Use same state proxy.
544
+
545
+
546
+ if (targetEl.stateProxy) {
547
+ labelLine.stateProxy = targetEl.stateProxy;
548
+ }
549
+ }
550
+
551
+ setLabelLineState(labelLine, false, stateName, stateModel);
552
+ }
553
+ }
554
+
555
+ if (labelLine) {
556
+ defaults(labelLine.style, defaultStyle); // Not fill.
557
+
558
+ labelLine.style.fill = null;
559
+ var showAbove = normalModel.get('showAbove');
560
+ var labelLineConfig = targetEl.textGuideLineConfig = targetEl.textGuideLineConfig || {};
561
+ labelLineConfig.showAbove = showAbove || false; // Custom the buildPath.
562
+
563
+ labelLine.buildPath = buildLabelLinePath;
564
+ }
565
+ }
566
+ function getLabelLineStatesModels(itemModel, labelLineName) {
567
+ labelLineName = labelLineName || 'labelLine';
568
+ var statesModels = {
569
+ normal: itemModel.getModel(labelLineName)
570
+ };
571
+
572
+ for (var i = 0; i < SPECIAL_STATES.length; i++) {
573
+ var stateName = SPECIAL_STATES[i];
574
+ statesModels[stateName] = itemModel.getModel([stateName, labelLineName]);
575
+ }
576
+
577
+ return statesModels;
578
+ }
579
+
580
+ function cloneArr(points) {
581
+ if (points) {
582
+ var newPoints = [];
583
+
584
+ for (var i = 0; i < points.length; i++) {
585
+ newPoints.push(points[i].slice());
586
+ }
587
+
588
+ return newPoints;
589
+ }
590
+ }
591
+
592
+ function prepareLayoutCallbackParams(labelItem, hostEl) {
593
+ var label = labelItem.label;
594
+ var labelLine = hostEl && hostEl.getTextGuideLine();
595
+ return {
596
+ dataIndex: labelItem.dataIndex,
597
+ dataType: labelItem.dataType,
598
+ seriesIndex: labelItem.seriesModel.seriesIndex,
599
+ text: labelItem.label.style.text,
600
+ rect: labelItem.hostRect,
601
+ labelRect: labelItem.rect,
602
+ // x: labelAttr.x,
603
+ // y: labelAttr.y,
604
+ align: label.style.align,
605
+ verticalAlign: label.style.verticalAlign,
606
+ labelLinePoints: cloneArr(labelLine && labelLine.shape.points)
607
+ };
608
+ }
609
+
610
+ var LABEL_OPTION_TO_STYLE_KEYS = ['align', 'verticalAlign', 'width', 'height', 'fontSize'];
611
+ var dummyTransformable = new Transformable();
612
+ var labelLayoutInnerStore = makeInner();
613
+ var labelLineAnimationStore = makeInner();
614
+
615
+ function extendWithKeys(target, source, keys) {
616
+ for (var i = 0; i < keys.length; i++) {
617
+ var key = keys[i];
618
+
619
+ if (source[key] != null) {
620
+ target[key] = source[key];
621
+ }
622
+ }
623
+ }
624
+
625
+ var LABEL_LAYOUT_PROPS = ['x', 'y', 'rotation'];
626
+
627
+ var LabelManager =
628
+ /** @class */
629
+ function () {
630
+ function LabelManager() {
631
+ this._labelList = [];
632
+ this._chartViewList = [];
633
+ }
634
+
635
+ LabelManager.prototype.clearLabels = function () {
636
+ this._labelList = [];
637
+ this._chartViewList = [];
638
+ };
639
+ /**
640
+ * Add label to manager
641
+ */
642
+
643
+
644
+ LabelManager.prototype._addLabel = function (dataIndex, dataType, seriesModel, label, layoutOption) {
645
+ var labelStyle = label.style;
646
+ var hostEl = label.__hostTarget;
647
+ var textConfig = hostEl.textConfig || {}; // TODO: If label is in other state.
648
+
649
+ var labelTransform = label.getComputedTransform();
650
+ var labelRect = label.getBoundingRect().plain();
651
+ BoundingRect.applyTransform(labelRect, labelRect, labelTransform);
652
+
653
+ if (labelTransform) {
654
+ dummyTransformable.setLocalTransform(labelTransform);
655
+ } else {
656
+ // Identity transform.
657
+ dummyTransformable.x = dummyTransformable.y = dummyTransformable.rotation = dummyTransformable.originX = dummyTransformable.originY = 0;
658
+ dummyTransformable.scaleX = dummyTransformable.scaleY = 1;
659
+ }
660
+
661
+ var host = label.__hostTarget;
662
+ var hostRect;
663
+
664
+ if (host) {
665
+ hostRect = host.getBoundingRect().plain();
666
+ var transform = host.getComputedTransform();
667
+ BoundingRect.applyTransform(hostRect, hostRect, transform);
668
+ }
669
+
670
+ var labelGuide = hostRect && host.getTextGuideLine();
671
+
672
+ this._labelList.push({
673
+ label: label,
674
+ labelLine: labelGuide,
675
+ seriesModel: seriesModel,
676
+ dataIndex: dataIndex,
677
+ dataType: dataType,
678
+ layoutOption: layoutOption,
679
+ computedLayoutOption: null,
680
+ rect: labelRect,
681
+ hostRect: hostRect,
682
+ // Label with lower priority will be hidden when overlapped
683
+ // Use rect size as default priority
684
+ priority: hostRect ? hostRect.width * hostRect.height : 0,
685
+ // Save default label attributes.
686
+ // For restore if developers want get back to default value in callback.
687
+ defaultAttr: {
688
+ ignore: label.ignore,
689
+ labelGuideIgnore: labelGuide && labelGuide.ignore,
690
+ x: dummyTransformable.x,
691
+ y: dummyTransformable.y,
692
+ scaleX: dummyTransformable.scaleX,
693
+ scaleY: dummyTransformable.scaleY,
694
+ rotation: dummyTransformable.rotation,
695
+ style: {
696
+ x: labelStyle.x,
697
+ y: labelStyle.y,
698
+ align: labelStyle.align,
699
+ verticalAlign: labelStyle.verticalAlign,
700
+ width: labelStyle.width,
701
+ height: labelStyle.height,
702
+ fontSize: labelStyle.fontSize
703
+ },
704
+ cursor: label.cursor,
705
+ attachedPos: textConfig.position,
706
+ attachedRot: textConfig.rotation
707
+ }
708
+ });
709
+ };
710
+
711
+ LabelManager.prototype.addLabelsOfSeries = function (chartView) {
712
+ var _this = this;
713
+
714
+ this._chartViewList.push(chartView);
715
+
716
+ var seriesModel = chartView.__model;
717
+ var layoutOption = seriesModel.get('labelLayout');
718
+ /**
719
+ * Ignore layouting if it's not specified anything.
720
+ */
721
+
722
+ if (!(isFunction(layoutOption) || keys(layoutOption).length)) {
723
+ return;
724
+ }
725
+
726
+ chartView.group.traverse(function (child) {
727
+ if (child.ignore) {
728
+ return true; // Stop traverse descendants.
729
+ } // Only support label being hosted on graphic elements.
730
+
731
+
732
+ var textEl = child.getTextContent();
733
+ var ecData = getECData(child); // Can only attach the text on the element with dataIndex
734
+
735
+ if (textEl && !textEl.disableLabelLayout) {
736
+ _this._addLabel(ecData.dataIndex, ecData.dataType, seriesModel, textEl, layoutOption);
737
+ }
738
+ });
739
+ };
740
+
741
+ LabelManager.prototype.updateLayoutConfig = function (api) {
742
+ var width = api.getWidth();
743
+ var height = api.getHeight();
744
+
745
+ function createDragHandler(el, labelLineModel) {
746
+ return function () {
747
+ updateLabelLinePoints(el, labelLineModel);
748
+ };
749
+ }
750
+
751
+ for (var i = 0; i < this._labelList.length; i++) {
752
+ var labelItem = this._labelList[i];
753
+ var label = labelItem.label;
754
+ var hostEl = label.__hostTarget;
755
+ var defaultLabelAttr = labelItem.defaultAttr;
756
+ var layoutOption = void 0; // TODO A global layout option?
757
+
758
+ if (isFunction(labelItem.layoutOption)) {
759
+ layoutOption = labelItem.layoutOption(prepareLayoutCallbackParams(labelItem, hostEl));
760
+ } else {
761
+ layoutOption = labelItem.layoutOption;
762
+ }
763
+
764
+ layoutOption = layoutOption || {};
765
+ labelItem.computedLayoutOption = layoutOption;
766
+ var degreeToRadian = Math.PI / 180; // TODO hostEl should always exists.
767
+ // Or label should not have parent because the x, y is all in global space.
768
+
769
+ if (hostEl) {
770
+ hostEl.setTextConfig({
771
+ // Force to set local false.
772
+ local: false,
773
+ // Ignore position and rotation config on the host el if x or y is changed.
774
+ position: layoutOption.x != null || layoutOption.y != null ? null : defaultLabelAttr.attachedPos,
775
+ // Ignore rotation config on the host el if rotation is changed.
776
+ rotation: layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.attachedRot,
777
+ offset: [layoutOption.dx || 0, layoutOption.dy || 0]
778
+ });
779
+ }
780
+
781
+ var needsUpdateLabelLine = false;
782
+
783
+ if (layoutOption.x != null) {
784
+ // TODO width of chart view.
785
+ label.x = parsePercent(layoutOption.x, width);
786
+ label.setStyle('x', 0); // Ignore movement in style. TODO: origin.
787
+
788
+ needsUpdateLabelLine = true;
789
+ } else {
790
+ label.x = defaultLabelAttr.x;
791
+ label.setStyle('x', defaultLabelAttr.style.x);
792
+ }
793
+
794
+ if (layoutOption.y != null) {
795
+ // TODO height of chart view.
796
+ label.y = parsePercent(layoutOption.y, height);
797
+ label.setStyle('y', 0); // Ignore movement in style.
798
+
799
+ needsUpdateLabelLine = true;
800
+ } else {
801
+ label.y = defaultLabelAttr.y;
802
+ label.setStyle('y', defaultLabelAttr.style.y);
803
+ }
804
+
805
+ if (layoutOption.labelLinePoints) {
806
+ var guideLine = hostEl.getTextGuideLine();
807
+
808
+ if (guideLine) {
809
+ guideLine.setShape({
810
+ points: layoutOption.labelLinePoints
811
+ }); // Not update
812
+
813
+ needsUpdateLabelLine = false;
814
+ }
815
+ }
816
+
817
+ var labelLayoutStore = labelLayoutInnerStore(label);
818
+ labelLayoutStore.needsUpdateLabelLine = needsUpdateLabelLine;
819
+ label.rotation = layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.rotation;
820
+ label.scaleX = defaultLabelAttr.scaleX;
821
+ label.scaleY = defaultLabelAttr.scaleY;
822
+
823
+ for (var k = 0; k < LABEL_OPTION_TO_STYLE_KEYS.length; k++) {
824
+ var key = LABEL_OPTION_TO_STYLE_KEYS[k];
825
+ label.setStyle(key, layoutOption[key] != null ? layoutOption[key] : defaultLabelAttr.style[key]);
826
+ }
827
+
828
+ if (layoutOption.draggable) {
829
+ label.draggable = true;
830
+ label.cursor = 'move';
831
+
832
+ if (hostEl) {
833
+ var hostModel = labelItem.seriesModel;
834
+
835
+ if (labelItem.dataIndex != null) {
836
+ var data = labelItem.seriesModel.getData(labelItem.dataType);
837
+ hostModel = data.getItemModel(labelItem.dataIndex);
838
+ }
839
+
840
+ label.on('drag', createDragHandler(hostEl, hostModel.getModel('labelLine')));
841
+ }
842
+ } else {
843
+ // TODO Other drag functions?
844
+ label.off('drag');
845
+ label.cursor = defaultLabelAttr.cursor;
846
+ }
847
+ }
848
+ };
849
+
850
+ LabelManager.prototype.layout = function (api) {
851
+ var width = api.getWidth();
852
+ var height = api.getHeight();
853
+ var labelList = prepareLayoutList(this._labelList);
854
+ var labelsNeedsAdjustOnX = filter(labelList, function (item) {
855
+ return item.layoutOption.moveOverlap === 'shiftX';
856
+ });
857
+ var labelsNeedsAdjustOnY = filter(labelList, function (item) {
858
+ return item.layoutOption.moveOverlap === 'shiftY';
859
+ });
860
+ shiftLayoutOnX(labelsNeedsAdjustOnX, 0, width);
861
+ shiftLayoutOnY(labelsNeedsAdjustOnY, 0, height);
862
+ var labelsNeedsHideOverlap = filter(labelList, function (item) {
863
+ return item.layoutOption.hideOverlap;
864
+ });
865
+ hideOverlap(labelsNeedsHideOverlap);
866
+ };
867
+ /**
868
+ * Process all labels. Not only labels with layoutOption.
869
+ */
870
+
871
+
872
+ LabelManager.prototype.processLabelsOverall = function () {
873
+ var _this = this;
874
+
875
+ each(this._chartViewList, function (chartView) {
876
+ var seriesModel = chartView.__model;
877
+ var ignoreLabelLineUpdate = chartView.ignoreLabelLineUpdate;
878
+ var animationEnabled = seriesModel.isAnimationEnabled();
879
+ chartView.group.traverse(function (child) {
880
+ if (child.ignore && !child.forceLabelAnimation) {
881
+ return true; // Stop traverse descendants.
882
+ }
883
+
884
+ var needsUpdateLabelLine = !ignoreLabelLineUpdate;
885
+ var label = child.getTextContent();
886
+
887
+ if (!needsUpdateLabelLine && label) {
888
+ needsUpdateLabelLine = labelLayoutInnerStore(label).needsUpdateLabelLine;
889
+ }
890
+
891
+ if (needsUpdateLabelLine) {
892
+ _this._updateLabelLine(child, seriesModel);
893
+ }
894
+
895
+ if (animationEnabled) {
896
+ _this._animateLabels(child, seriesModel);
897
+ }
898
+ });
899
+ });
900
+ };
901
+
902
+ LabelManager.prototype._updateLabelLine = function (el, seriesModel) {
903
+ // Only support label being hosted on graphic elements.
904
+ var textEl = el.getTextContent(); // Update label line style.
905
+
906
+ var ecData = getECData(el);
907
+ var dataIndex = ecData.dataIndex; // Only support labelLine on the labels represent data.
908
+
909
+ if (textEl && dataIndex != null) {
910
+ var data = seriesModel.getData(ecData.dataType);
911
+ var itemModel = data.getItemModel(dataIndex);
912
+ var defaultStyle = {};
913
+ var visualStyle = data.getItemVisual(dataIndex, 'style');
914
+ var visualType = data.getVisual('drawType'); // Default to be same with main color
915
+
916
+ defaultStyle.stroke = visualStyle[visualType];
917
+ var labelLineModel = itemModel.getModel('labelLine');
918
+ setLabelLineStyle(el, getLabelLineStatesModels(itemModel), defaultStyle);
919
+ updateLabelLinePoints(el, labelLineModel);
920
+ }
921
+ };
922
+
923
+ LabelManager.prototype._animateLabels = function (el, seriesModel) {
924
+ var textEl = el.getTextContent();
925
+ var guideLine = el.getTextGuideLine(); // Animate
926
+
927
+ if (textEl // `forceLabelAnimation` has the highest priority
928
+ && (el.forceLabelAnimation || !textEl.ignore && !textEl.invisible && !el.disableLabelAnimation && !isElementRemoved(el))) {
929
+ var layoutStore = labelLayoutInnerStore(textEl);
930
+ var oldLayout = layoutStore.oldLayout;
931
+ var ecData = getECData(el);
932
+ var dataIndex = ecData.dataIndex;
933
+ var newProps = {
934
+ x: textEl.x,
935
+ y: textEl.y,
936
+ rotation: textEl.rotation
937
+ };
938
+ var data = seriesModel.getData(ecData.dataType);
939
+
940
+ if (!oldLayout) {
941
+ textEl.attr(newProps); // Disable fade in animation if value animation is enabled.
942
+
943
+ if (!labelInner(textEl).valueAnimation) {
944
+ var oldOpacity = retrieve2(textEl.style.opacity, 1); // Fade in animation
945
+
946
+ textEl.style.opacity = 0;
947
+ initProps(textEl, {
948
+ style: {
949
+ opacity: oldOpacity
950
+ }
951
+ }, seriesModel, dataIndex);
952
+ }
953
+ } else {
954
+ textEl.attr(oldLayout); // Make sure the animation from is in the right status.
955
+
956
+ var prevStates = el.prevStates;
957
+
958
+ if (prevStates) {
959
+ if (indexOf(prevStates, 'select') >= 0) {
960
+ textEl.attr(layoutStore.oldLayoutSelect);
961
+ }
962
+
963
+ if (indexOf(prevStates, 'emphasis') >= 0) {
964
+ textEl.attr(layoutStore.oldLayoutEmphasis);
965
+ }
966
+ }
967
+
968
+ updateProps(textEl, newProps, seriesModel, dataIndex);
969
+ }
970
+
971
+ layoutStore.oldLayout = newProps;
972
+
973
+ if (textEl.states.select) {
974
+ var layoutSelect = layoutStore.oldLayoutSelect = {};
975
+ extendWithKeys(layoutSelect, newProps, LABEL_LAYOUT_PROPS);
976
+ extendWithKeys(layoutSelect, textEl.states.select, LABEL_LAYOUT_PROPS);
977
+ }
978
+
979
+ if (textEl.states.emphasis) {
980
+ var layoutEmphasis = layoutStore.oldLayoutEmphasis = {};
981
+ extendWithKeys(layoutEmphasis, newProps, LABEL_LAYOUT_PROPS);
982
+ extendWithKeys(layoutEmphasis, textEl.states.emphasis, LABEL_LAYOUT_PROPS);
983
+ }
984
+
985
+ animateLabelValue(textEl, dataIndex, data, seriesModel, seriesModel);
986
+ }
987
+
988
+ if (guideLine && !guideLine.ignore && !guideLine.invisible) {
989
+ var layoutStore = labelLineAnimationStore(guideLine);
990
+ var oldLayout = layoutStore.oldLayout;
991
+ var newLayout = {
992
+ points: guideLine.shape.points
993
+ };
994
+
995
+ if (!oldLayout) {
996
+ guideLine.setShape(newLayout);
997
+ guideLine.style.strokePercent = 0;
998
+ initProps(guideLine, {
999
+ style: {
1000
+ strokePercent: 1
1001
+ }
1002
+ }, seriesModel);
1003
+ } else {
1004
+ guideLine.attr({
1005
+ shape: oldLayout
1006
+ });
1007
+ updateProps(guideLine, {
1008
+ shape: newLayout
1009
+ }, seriesModel);
1010
+ }
1011
+
1012
+ layoutStore.oldLayout = newLayout;
1013
+ }
1014
+ };
1015
+
1016
+ return LabelManager;
1017
+ }();
1018
+
1019
+ var getLabelManager = makeInner();
1020
+ function installLabelLayout(registers) {
1021
+ registers.registerUpdateLifecycle('series:beforeupdate', function (ecModel, api, params) {
1022
+ // TODO api provide an namespace that can save stuff per instance
1023
+ var labelManager = getLabelManager(api).labelManager;
1024
+
1025
+ if (!labelManager) {
1026
+ labelManager = getLabelManager(api).labelManager = new LabelManager();
1027
+ }
1028
+
1029
+ labelManager.clearLabels();
1030
+ });
1031
+ registers.registerUpdateLifecycle('series:layoutlabels', function (ecModel, api, params) {
1032
+ var labelManager = getLabelManager(api).labelManager;
1033
+ params.updatedSeries.forEach(function (series) {
1034
+ labelManager.addLabelsOfSeries(api.getViewOfSeriesModel(series));
1035
+ });
1036
+ labelManager.updateLayoutConfig(api);
1037
+ labelManager.layout(api);
1038
+ labelManager.processLabelsOverall();
1039
+ });
1040
+ }
1041
+
1042
+ export { limitSurfaceAngle as a, getLabelLineStatesModels as g, installLabelLayout as i, limitTurnAngle as l, setLabelLineStyle as s };