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