11// https://github.com/evoluteur/d3-table-cards
22// (c) 2017 Olivier Giulieri
33
4- var animTime = 750 ;
5- var curStyle = 'table' ; // "table" or "card"
6- var cardsPerRow = 3 ;
7-
84var layoutInfo = {
95 table : {
106 // ---- row position & size
@@ -25,7 +21,7 @@ var layoutInfo = {
2521 c2Top : 5 ,
2622 c2Left : 200 ,
2723 } ,
28- card : {
24+ cards : {
2925 // ---- card position & size
3026 top : function ( d ) { return Math . floor ( d . idx / cardsPerRow ) * 90 + 'px' } ,
3127 left : function ( d ) { return ( d . idx % cardsPerRow ) * 200 + 'px' } ,
@@ -46,6 +42,13 @@ var layoutInfo = {
4642 }
4743} ;
4844
45+ var selector = '.holder' ;
46+ var curStyle = 'cards' ; // "table" or "cards"
47+ var animTime = 650 ;
48+
49+ var holder ;
50+ var cardsPerRow = 3 ;
51+
4952function getLayoutInfo ( style ) {
5053 var width = window . innerWidth - 20 ;
5154 cardsPerRow = Math . floor ( width / 200 ) ;
@@ -54,23 +57,26 @@ function getLayoutInfo(style){
5457
5558function render ( ) {
5659 var l = getLayoutInfo ( curStyle ) ;
57- var sel = d3 . select ( '.holder' ) . selectAll ( '.item' )
60+ holder = d3 . select ( selector ) ;
61+ var sel = holder . selectAll ( '.item' )
5862 . data ( data )
5963 . enter ( )
6064 . append ( 'div' ) . attr ( 'class' , function ( d ) { return 'item chakra' + d . chakra } ) ;
6165
62- sel . insert ( 'div' ) . attr ( 'class' , 'c1' ) . html ( function ( d ) { return d . name } )
63- . style ( 'top' , l . c1Top ) ;
64- sel . insert ( 'div' ) . attr ( 'class' , 'c2' ) . html ( function ( d ) { return d . spirit } )
65- . style ( 'top' , l . c2Top ) ;
66+ sel . insert ( 'div' ) . attr ( 'class' , 'c1' ) . style ( 'top' , l . c1Top )
67+ . html ( function ( d ) { return d . name } ) ;
68+ sel . insert ( 'div' ) . attr ( 'class' , 'c2' ) . style ( 'top' , l . c2Top )
69+ . html ( function ( d ) { return d . spirit } ) ;
6670
67- layout ( sel ) ;
71+ data . forEach ( function ( d , idx ) {
72+ d . idx = idx ;
73+ } ) ;
74+ layout ( true , false ) ;
6875}
6976
7077function redraw ( style ) {
7178 curStyle = style || curStyle ;
72- layout ( d3 . select ( '.holder' ) . selectAll ( '.item' )
73- . transition ( ) . duration ( animTime ) ) ;
79+ layout ( ) ;
7480}
7581function sort ( key ) {
7682 var l = getLayoutInfo ( curStyle ) ;
@@ -82,36 +88,38 @@ function sort(key){
8288 data . forEach ( function ( d , idx ) {
8389 d . idx = idx ;
8490 } ) ;
85- layout ( d3 . select ( '.holder' ) . selectAll ( '.item' )
86- . transition ( ) . duration ( animTime ) ) ;
91+ layout ( false , true ) ;
8792}
8893
89- function layout ( sel ) {
94+ function layout ( skipAnim , skipChildren ) {
9095 var l = getLayoutInfo ( curStyle ) ,
91- t = d3 . transition ( ) . duration ( animTime ) ;
92-
93- sel . style ( 'left' , l . left )
96+ t = d3 . transition ( ) . duration ( skipAnim ? 0 : animTime ) ;
97+
98+ holder . selectAll ( '.item' ) . transition ( t )
99+ . style ( 'left' , l . left )
94100 . style ( 'top' , l . top )
95101 . style ( 'height' , l . height )
96102 . style ( 'width' , l . width )
97103 . style ( 'border-radius' , l . radius ) ;
98104
99- d3 . selectAll ( '.c1' ) . transition ( t )
100- . style ( 'top' , l . c1Top )
101- . style ( 'left' , l . c1Left )
102- . style ( 'font-size' , l . c1FontSize ) ;
103- d3 . selectAll ( '.c2' ) . transition ( t )
104- . style ( 'top' , l . c2Top )
105- . style ( 'left' , l . c2Left ) ;
105+ if ( ! skipChildren ) {
106+ holder . selectAll ( '.c1' ) . transition ( t )
107+ . style ( 'top' , l . c1Top )
108+ . style ( 'left' , l . c1Left )
109+ . style ( 'font-size' , l . c1FontSize ) ;
110+ holder . selectAll ( '.c2' ) . transition ( t )
111+ . style ( 'top' , l . c2Top )
112+ . style ( 'left' , l . c2Left ) ;
106113
107- d3 . select ( '.header' ) . transition ( t )
108- . style ( 'opacity' , l . headerOpacity )
109- . style ( 'left' , l . headerLeft ) ;
114+ holder . select ( '.header' ) . transition ( t )
115+ . style ( 'opacity' , l . headerOpacity )
116+ . style ( 'left' , l . headerLeft ) ;
110117
111- var totalHeight = 20 + ( curStyle === 'card ' ?
112- Math . ceil ( data . length / cardsPerRow ) * 90
113- : 40 + data . length * 29 ) ;
118+ var totalHeight = 20 + ( curStyle === 'cards ' ?
119+ Math . ceil ( data . length / cardsPerRow ) * 90
120+ : 40 + data . length * 29 ) ;
114121
115- d3 . select ( '.holder' ) . transition ( t )
116- . style ( 'height' , totalHeight ) ;
122+ d3 . select ( '.holder' ) . transition ( t )
123+ . style ( 'height' , totalHeight ) ;
124+ }
117125}
0 commit comments