api.focus-spec.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. describe('c3 api focus', function () {
  2. 'use strict';
  3. var chart;
  4. var args = {
  5. data: {
  6. columns: [
  7. ['data1', 30, 200, 100, 400],
  8. ['data2', 1000, 800, 500, 2000],
  9. ['data3', 5000, 2000, 1000, 4000]
  10. ]
  11. }
  12. };
  13. beforeEach(function (done) {
  14. chart = window.initChart(chart, args, done);
  15. });
  16. describe('focus', function () {
  17. it('should focus all targets', function (done) {
  18. var main = chart.internal.main,
  19. legend = chart.internal.legend;
  20. chart.focus();
  21. setTimeout(function () {
  22. var targets = main.select('.c3-chart-line.c3-target'),
  23. legendItems = legend.select('.c3-legend-item');
  24. targets.each(function () {
  25. var line = d3.select(this);
  26. expect(line.classed('c3-focused')).toBeTruthy();
  27. });
  28. legendItems.each(function () {
  29. var item = d3.select(this);
  30. expect(item.classed('c3-legend-item-focused')).toBeTruthy();
  31. });
  32. done();
  33. }, 1000);
  34. });
  35. it('should focus one target', function (done) {
  36. var main = chart.internal.main,
  37. legend = chart.internal.legend;
  38. chart.focus('data2');
  39. setTimeout(function () {
  40. var targets = {
  41. data1: main.select('.c3-chart-line.c3-target.c3-target-data1'),
  42. data2: main.select('.c3-chart-line.c3-target.c3-target-data2'),
  43. data3: main.select('.c3-chart-line.c3-target.c3-target-data3')
  44. },
  45. legendItems = {
  46. data1: legend.select('.c3-legend-item-data1'),
  47. data2: legend.select('.c3-legend-item-data2'),
  48. data3: legend.select('.c3-legend-item-data3')
  49. };
  50. expect(targets.data1.classed('c3-focused')).toBeFalsy();
  51. expect(targets.data2.classed('c3-focused')).toBeTruthy();
  52. expect(targets.data3.classed('c3-focused')).toBeFalsy();
  53. expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy();
  54. expect(legendItems.data2.classed('c3-legend-item-focused')).toBeTruthy();
  55. expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy();
  56. done();
  57. }, 1000);
  58. });
  59. it('should focus multiple targets', function (done) {
  60. var main = chart.internal.main,
  61. legend = chart.internal.legend;
  62. chart.focus(['data1', 'data2']);
  63. setTimeout(function () {
  64. var targets = {
  65. data1: main.select('.c3-chart-line.c3-target.c3-target-data1'),
  66. data2: main.select('.c3-chart-line.c3-target.c3-target-data2'),
  67. data3: main.select('.c3-chart-line.c3-target.c3-target-data3')
  68. },
  69. legendItems = {
  70. data1: legend.select('.c3-legend-item-data1'),
  71. data2: legend.select('.c3-legend-item-data2'),
  72. data3: legend.select('.c3-legend-item-data3')
  73. };
  74. expect(targets.data1.classed('c3-focused')).toBeTruthy();
  75. expect(targets.data2.classed('c3-focused')).toBeTruthy();
  76. expect(targets.data3.classed('c3-focused')).toBeFalsy();
  77. expect(legendItems.data1.classed('c3-legend-item-focused')).toBeTruthy();
  78. expect(legendItems.data2.classed('c3-legend-item-focused')).toBeTruthy();
  79. expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy();
  80. done();
  81. }, 1000);
  82. });
  83. });
  84. describe('defocus', function () {
  85. it('should defocus all targets', function (done) {
  86. var main = chart.internal.main,
  87. legend = chart.internal.legend;
  88. chart.defocus();
  89. setTimeout(function () {
  90. var targets = main.select('.c3-chart-line.c3-target'),
  91. legendItems = legend.select('.c3-legend-item');
  92. targets.each(function () {
  93. var line = d3.select(this);
  94. expect(line.classed('c3-focused')).toBeFalsy();
  95. expect(line.classed('c3-defocused')).toBeTruthy();
  96. });
  97. legendItems.each(function () {
  98. var item = d3.select(this);
  99. expect(item.classed('c3-legend-item-focused')).toBeFalsy();
  100. expect(+item.style('opacity')).toBeCloseTo(0.3);
  101. });
  102. done();
  103. }, 1000);
  104. });
  105. it('should defocus one target', function (done) {
  106. var main = chart.internal.main,
  107. legend = chart.internal.legend;
  108. chart.defocus('data2');
  109. setTimeout(function () {
  110. var targets = {
  111. data1: main.select('.c3-chart-line.c3-target.c3-target-data1'),
  112. data2: main.select('.c3-chart-line.c3-target.c3-target-data2'),
  113. data3: main.select('.c3-chart-line.c3-target.c3-target-data3')
  114. },
  115. legendItems = {
  116. data1: legend.select('.c3-legend-item-data1'),
  117. data2: legend.select('.c3-legend-item-data2'),
  118. data3: legend.select('.c3-legend-item-data3')
  119. };
  120. expect(targets.data1.classed('c3-defocused')).toBeFalsy();
  121. expect(targets.data2.classed('c3-defocused')).toBeTruthy();
  122. expect(targets.data3.classed('c3-defocused')).toBeFalsy();
  123. expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy();
  124. expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy();
  125. expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy();
  126. expect(+legendItems.data1.style('opacity')).toBeCloseTo(1);
  127. expect(+legendItems.data2.style('opacity')).toBeCloseTo(0.3);
  128. expect(+legendItems.data3.style('opacity')).toBeCloseTo(1);
  129. done();
  130. }, 1000);
  131. });
  132. it('should defocus multiple targets', function (done) {
  133. var main = chart.internal.main,
  134. legend = chart.internal.legend;
  135. chart.defocus(['data1', 'data2']);
  136. setTimeout(function () {
  137. var targets = {
  138. data1: main.select('.c3-chart-line.c3-target.c3-target-data1'),
  139. data2: main.select('.c3-chart-line.c3-target.c3-target-data2'),
  140. data3: main.select('.c3-chart-line.c3-target.c3-target-data3')
  141. },
  142. legendItems = {
  143. data1: legend.select('.c3-legend-item-data1'),
  144. data2: legend.select('.c3-legend-item-data2'),
  145. data3: legend.select('.c3-legend-item-data3')
  146. };
  147. expect(targets.data1.classed('c3-defocused')).toBeTruthy();
  148. expect(targets.data2.classed('c3-defocused')).toBeTruthy();
  149. expect(targets.data3.classed('c3-defocused')).toBeFalsy();
  150. expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy();
  151. expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy();
  152. expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy();
  153. expect(+legendItems.data1.style('opacity')).toBeCloseTo(0.3);
  154. expect(+legendItems.data2.style('opacity')).toBeCloseTo(0.3);
  155. expect(+legendItems.data3.style('opacity')).toBeCloseTo(1);
  156. done();
  157. }, 1000);
  158. });
  159. it('should defocus multiple targets after focused', function (done) {
  160. var main = chart.internal.main,
  161. legend = chart.internal.legend;
  162. chart.focus();
  163. setTimeout(function () {
  164. chart.defocus(['data1', 'data2']);
  165. setTimeout(function () {
  166. var targets = {
  167. data1: main.select('.c3-chart-line.c3-target.c3-target-data1'),
  168. data2: main.select('.c3-chart-line.c3-target.c3-target-data2'),
  169. data3: main.select('.c3-chart-line.c3-target.c3-target-data3')
  170. },
  171. legendItems = {
  172. data1: legend.select('.c3-legend-item-data1'),
  173. data2: legend.select('.c3-legend-item-data2'),
  174. data3: legend.select('.c3-legend-item-data3')
  175. };
  176. expect(targets.data1.classed('c3-defocused')).toBeTruthy();
  177. expect(targets.data2.classed('c3-defocused')).toBeTruthy();
  178. expect(targets.data3.classed('c3-defocused')).toBeFalsy();
  179. expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy();
  180. expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy();
  181. expect(legendItems.data3.classed('c3-legend-item-focused')).toBeTruthy();
  182. expect(+legendItems.data1.style('opacity')).toBeCloseTo(0.3);
  183. expect(+legendItems.data2.style('opacity')).toBeCloseTo(0.3);
  184. expect(+legendItems.data3.style('opacity')).toBeCloseTo(1);
  185. done();
  186. }, 1000);
  187. }, 1000);
  188. });
  189. });
  190. describe('revert', function () {
  191. it('should revert all targets after focus', function (done) {
  192. var main = chart.internal.main,
  193. legend = chart.internal.legend;
  194. chart.focus();
  195. setTimeout(function () {
  196. chart.revert();
  197. setTimeout(function () {
  198. var targets = main.select('.c3-chart-line.c3-target'),
  199. legendItems = legend.select('.c3-legend-item');
  200. targets.each(function () {
  201. var line = d3.select(this);
  202. expect(line.classed('c3-focused')).toBeFalsy();
  203. });
  204. legendItems.each(function () {
  205. var item = d3.select(this);
  206. expect(item.classed('c3-legend-item-focused')).toBeFalsy();
  207. expect(+item.style('opacity')).toBeCloseTo(1);
  208. });
  209. done();
  210. }, 1000);
  211. }, 1000);
  212. });
  213. it('should revert all targets after defocus', function (done) {
  214. var main = chart.internal.main,
  215. legend = chart.internal.legend;
  216. chart.defocus();
  217. setTimeout(function () {
  218. chart.revert();
  219. setTimeout(function () {
  220. var targets = main.select('.c3-chart-line.c3-target'),
  221. legendItems = legend.select('.c3-legend-item');
  222. targets.each(function () {
  223. var line = d3.select(this);
  224. expect(line.classed('c3-defocused')).toBeFalsy();
  225. });
  226. legendItems.each(function () {
  227. var item = d3.select(this);
  228. expect(item.classed('c3-legend-item-focused')).toBeFalsy();
  229. expect(+item.style('opacity')).toBeCloseTo(1);
  230. });
  231. done();
  232. }, 1000);
  233. }, 1000);
  234. });
  235. it('should revert one target after focus', function (done) {
  236. var main = chart.internal.main,
  237. legend = chart.internal.legend;
  238. chart.focus();
  239. setTimeout(function () {
  240. chart.revert('data2');
  241. setTimeout(function () {
  242. var targets = {
  243. data1: main.select('.c3-chart-line.c3-target.c3-target-data1'),
  244. data2: main.select('.c3-chart-line.c3-target.c3-target-data2'),
  245. data3: main.select('.c3-chart-line.c3-target.c3-target-data3')
  246. },
  247. legendItems = {
  248. data1: legend.select('.c3-legend-item-data1'),
  249. data2: legend.select('.c3-legend-item-data2'),
  250. data3: legend.select('.c3-legend-item-data3')
  251. };
  252. expect(targets.data1.classed('c3-focused')).toBeTruthy();
  253. expect(targets.data2.classed('c3-focused')).toBeFalsy();
  254. expect(targets.data3.classed('c3-focused')).toBeTruthy();
  255. expect(+legendItems.data1.style('opacity')).toBeCloseTo(1);
  256. expect(+legendItems.data2.style('opacity')).toBeCloseTo(1);
  257. expect(+legendItems.data3.style('opacity')).toBeCloseTo(1);
  258. expect(legendItems.data1.classed('c3-legend-item-focused')).toBeTruthy();
  259. expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy();
  260. expect(legendItems.data3.classed('c3-legend-item-focused')).toBeTruthy();
  261. done();
  262. }, 1000);
  263. }, 1000);
  264. });
  265. it('should revert one target after defocus', function (done) {
  266. var main = chart.internal.main,
  267. legend = chart.internal.legend;
  268. chart.defocus();
  269. setTimeout(function () {
  270. chart.revert('data2');
  271. setTimeout(function () {
  272. var targets = {
  273. data1: main.select('.c3-chart-line.c3-target.c3-target-data1'),
  274. data2: main.select('.c3-chart-line.c3-target.c3-target-data2'),
  275. data3: main.select('.c3-chart-line.c3-target.c3-target-data3')
  276. },
  277. legendItems = {
  278. data1: legend.select('.c3-legend-item-data1'),
  279. data2: legend.select('.c3-legend-item-data2'),
  280. data3: legend.select('.c3-legend-item-data3')
  281. };
  282. expect(targets.data1.classed('c3-defocused')).toBeTruthy();
  283. expect(targets.data2.classed('c3-defocused')).toBeFalsy();
  284. expect(targets.data3.classed('c3-defocused')).toBeTruthy();
  285. expect(+legendItems.data1.style('opacity')).toBeCloseTo(0.3);
  286. expect(+legendItems.data2.style('opacity')).toBeCloseTo(1);
  287. expect(+legendItems.data3.style('opacity')).toBeCloseTo(0.3);
  288. expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy();
  289. expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy();
  290. expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy();
  291. done();
  292. }, 1000);
  293. }, 1000);
  294. });
  295. it('should focus multiple targets after focus', function (done) {
  296. var main = chart.internal.main,
  297. legend = chart.internal.legend;
  298. chart.focus();
  299. setTimeout(function () {
  300. chart.revert(['data1', 'data2']);
  301. setTimeout(function () {
  302. var targets = {
  303. data1: main.select('.c3-chart-line.c3-target.c3-target-data1'),
  304. data2: main.select('.c3-chart-line.c3-target.c3-target-data2'),
  305. data3: main.select('.c3-chart-line.c3-target.c3-target-data3')
  306. },
  307. legendItems = {
  308. data1: legend.select('.c3-legend-item-data1'),
  309. data2: legend.select('.c3-legend-item-data2'),
  310. data3: legend.select('.c3-legend-item-data3')
  311. };
  312. expect(targets.data1.classed('c3-focused')).toBeFalsy();
  313. expect(targets.data2.classed('c3-focused')).toBeFalsy();
  314. expect(targets.data3.classed('c3-focused')).toBeTruthy();
  315. expect(+legendItems.data1.style('opacity')).toBeCloseTo(1);
  316. expect(+legendItems.data2.style('opacity')).toBeCloseTo(1);
  317. expect(+legendItems.data3.style('opacity')).toBeCloseTo(1);
  318. expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy();
  319. expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy();
  320. expect(legendItems.data3.classed('c3-legend-item-focused')).toBeTruthy();
  321. done();
  322. }, 1000);
  323. }, 1000);
  324. });
  325. it('should focus multiple targets after defocus', function (done) {
  326. var main = chart.internal.main,
  327. legend = chart.internal.legend;
  328. chart.defocus();
  329. setTimeout(function () {
  330. chart.revert(['data1', 'data2']);
  331. setTimeout(function () {
  332. var targets = {
  333. data1: main.select('.c3-chart-line.c3-target.c3-target-data1'),
  334. data2: main.select('.c3-chart-line.c3-target.c3-target-data2'),
  335. data3: main.select('.c3-chart-line.c3-target.c3-target-data3')
  336. },
  337. legendItems = {
  338. data1: legend.select('.c3-legend-item-data1'),
  339. data2: legend.select('.c3-legend-item-data2'),
  340. data3: legend.select('.c3-legend-item-data3')
  341. };
  342. expect(targets.data1.classed('c3-defocused')).toBeFalsy();
  343. expect(targets.data2.classed('c3-defocused')).toBeFalsy();
  344. expect(targets.data3.classed('c3-defocused')).toBeTruthy();
  345. expect(+legendItems.data1.style('opacity')).toBeCloseTo(1);
  346. expect(+legendItems.data2.style('opacity')).toBeCloseTo(1);
  347. expect(+legendItems.data3.style('opacity')).toBeCloseTo(0.3);
  348. expect(legendItems.data1.classed('c3-legend-item-focused')).toBeFalsy();
  349. expect(legendItems.data2.classed('c3-legend-item-focused')).toBeFalsy();
  350. expect(legendItems.data3.classed('c3-legend-item-focused')).toBeFalsy();
  351. done();
  352. }, 1000);
  353. }, 1000);
  354. });
  355. });
  356. describe('when legend.show = false', function () {
  357. beforeAll(function () {
  358. args.legend = {
  359. show: false
  360. };
  361. });
  362. it('should focus all targets without showing legend', function (done) {
  363. var main = chart.internal.main,
  364. legend = chart.internal.legend;
  365. chart.focus();
  366. setTimeout(function () {
  367. var targets = main.select('.c3-chart-line.c3-target'),
  368. legendItems = legend.select('.c3-legend-item');
  369. targets.each(function () {
  370. var line = d3.select(this);
  371. expect(line.classed('c3-focused')).toBeTruthy();
  372. });
  373. expect(legendItems.size()).toBeCloseTo(0);
  374. done();
  375. }, 1000);
  376. });
  377. it('should defocus all targets without showing legend', function (done) {
  378. var main = chart.internal.main,
  379. legend = chart.internal.legend;
  380. chart.defocus();
  381. setTimeout(function () {
  382. var targets = main.select('.c3-chart-line.c3-target'),
  383. legendItems = legend.select('.c3-legend-item');
  384. targets.each(function () {
  385. var line = d3.select(this);
  386. expect(line.classed('c3-defocused')).toBeTruthy();
  387. });
  388. expect(legendItems.size()).toBeCloseTo(0);
  389. done();
  390. }, 1000);
  391. });
  392. it('should revert all targets after focus', function (done) {
  393. var main = chart.internal.main,
  394. legend = chart.internal.legend;
  395. chart.focus();
  396. setTimeout(function () {
  397. chart.revert();
  398. setTimeout(function () {
  399. var targets = main.select('.c3-chart-line.c3-target'),
  400. legendItems = legend.select('.c3-legend-item');
  401. targets.each(function () {
  402. var line = d3.select(this);
  403. expect(line.classed('c3-focused')).toBeFalsy();
  404. });
  405. expect(legendItems.size()).toBeCloseTo(0);
  406. done();
  407. }, 1000);
  408. }, 1000);
  409. });
  410. });
  411. });