api.focus-spec.ts 18 KB

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