@@ -14,19 +14,28 @@ var isNumeric = require('fast-isnumeric');
14
14
15
15
// pure functions, don't alter but passes on `gd` and parts of `trace` without deep copying
16
16
module . exports = function calc ( gd , trace ) {
17
- var cellsValues = trace . cells . values ;
17
+ var cellsValues = squareStringMatrix ( trace . cells . values ) ;
18
18
var slicer = function ( a ) {
19
19
return a . slice ( trace . header . values . length , a . length ) ;
20
20
} ;
21
- var headerValues = trace . header . values . map ( function ( c ) {
22
- return Array . isArray ( c ) ? c : [ c ] ;
23
- } ) . concat ( slicer ( cellsValues ) . map ( function ( ) { return [ '' ] ; } ) ) ;
21
+ var headerValuesIn = squareStringMatrix ( trace . header . values ) ;
22
+ if ( headerValuesIn . length && ! headerValuesIn [ 0 ] . length ) {
23
+ headerValuesIn [ 0 ] = [ '' ] ;
24
+ headerValuesIn = squareStringMatrix ( headerValuesIn ) ;
25
+ }
26
+ var headerValues = headerValuesIn
27
+ . concat ( slicer ( cellsValues ) . map ( function ( ) {
28
+ return emptyStrings ( ( headerValuesIn [ 0 ] || [ '' ] ) . length ) ;
29
+ } ) ) ;
30
+
24
31
var domain = trace . domain ;
25
32
var groupWidth = Math . floor ( gd . _fullLayout . _size . w * ( domain . x [ 1 ] - domain . x [ 0 ] ) ) ;
26
33
var groupHeight = Math . floor ( gd . _fullLayout . _size . h * ( domain . y [ 1 ] - domain . y [ 0 ] ) ) ;
27
- var headerRowHeights = trace . header . values . length ? headerValues [ 0 ] . map ( function ( ) { return trace . header . height ; } ) : [ c . emptyHeaderHeight ] ;
28
- var rowHeights = cellsValues . length ? cellsValues [ 0 ] . map ( function ( ) { return trace . cells . height ; } ) : [ ] ;
29
- var headerHeight = headerRowHeights . reduce ( function ( a , b ) { return a + b ; } , 0 ) ;
34
+ var headerRowHeights = trace . header . values . length ?
35
+ headerValues [ 0 ] . map ( function ( ) { return trace . header . height ; } ) :
36
+ [ c . emptyHeaderHeight ] ;
37
+ var rowHeights = cellsValues . length ? cellsValues [ 0 ] . map ( function ( ) { return trace . cells . height ; } ) : [ ] ;
38
+ var headerHeight = headerRowHeights . reduce ( sum , 0 ) ;
30
39
var scrollHeight = groupHeight - headerHeight ;
31
40
var minimumFillHeight = scrollHeight + c . uplift ;
32
41
var anchorToRowBlock = makeAnchorToRowBlock ( rowHeights , minimumFillHeight ) ;
@@ -41,24 +50,27 @@ module.exports = function calc(gd, trace) {
41
50
trace . columnwidth ;
42
51
return isNumeric ( value ) ? Number ( value ) : 1 ;
43
52
} ) ;
44
- var totalColumnWidths = columnWidths . reduce ( function ( p , n ) { return p + n ; } , 0 ) ;
53
+ var totalColumnWidths = columnWidths . reduce ( sum , 0 ) ;
45
54
46
55
// fit columns in the available vertical space as there's no vertical scrolling now
47
- columnWidths = columnWidths . map ( function ( d ) { return d / totalColumnWidths * groupWidth ; } ) ;
56
+ columnWidths = columnWidths . map ( function ( d ) { return d / totalColumnWidths * groupWidth ; } ) ;
57
+
58
+ var maxLineWidth = Math . max ( arrayMax ( trace . header . line . width ) , arrayMax ( trace . cells . line . width ) ) ;
48
59
49
60
var calcdata = {
50
61
key : trace . index ,
51
62
translateX : domain . x [ 0 ] * gd . _fullLayout . _size . w ,
52
63
translateY : gd . _fullLayout . _size . h * ( 1 - domain . y [ 1 ] ) ,
53
64
size : gd . _fullLayout . _size ,
54
65
width : groupWidth ,
66
+ maxLineWidth : maxLineWidth ,
55
67
height : groupHeight ,
56
68
columnOrder : columnOrder , // will be mutated on column move, todo use in callback
57
69
groupHeight : groupHeight ,
58
70
rowBlocks : rowBlocks ,
59
71
headerRowBlocks : headerRowBlocks ,
60
72
scrollY : 0 , // will be mutated on scroll
61
- cells : trace . cells ,
73
+ cells : extendFlat ( { } , trace . cells , { values : cellsValues } ) ,
62
74
headerCells : extendFlat ( { } , trace . header , { values : headerValues } ) ,
63
75
gdColumns : headerValues . map ( function ( d ) { return d [ 0 ] ; } ) ,
64
76
gdColumnsOriginalOrder : headerValues . map ( function ( d ) { return d [ 0 ] ; } ) ,
@@ -89,6 +101,47 @@ module.exports = function calc(gd, trace) {
89
101
return calcdata ;
90
102
} ;
91
103
104
+ function arrayMax ( maybeArray ) {
105
+ if ( Array . isArray ( maybeArray ) ) {
106
+ var max = 0 ;
107
+ for ( var i = 0 ; i < maybeArray . length ; i ++ ) {
108
+ max = Math . max ( max , arrayMax ( maybeArray [ i ] ) ) ;
109
+ }
110
+ return max ;
111
+ }
112
+ return maybeArray ;
113
+ }
114
+
115
+ function sum ( a , b ) { return a + b ; }
116
+
117
+ // fill matrix in place to equal lengths
118
+ // and ensure it's uniformly 2D
119
+ function squareStringMatrix ( matrixIn ) {
120
+ var matrix = matrixIn . slice ( ) ;
121
+ var minLen = Infinity ;
122
+ var maxLen = 0 ;
123
+ var i ;
124
+ for ( i = 0 ; i < matrix . length ; i ++ ) {
125
+ if ( ! Array . isArray ( matrix [ i ] ) ) matrix [ i ] = [ matrix [ i ] ] ;
126
+ minLen = Math . min ( minLen , matrix [ i ] . length ) ;
127
+ maxLen = Math . max ( maxLen , matrix [ i ] . length ) ;
128
+ }
129
+
130
+ if ( minLen !== maxLen ) {
131
+ for ( i = 0 ; i < matrix . length ; i ++ ) {
132
+ var padLen = maxLen - matrix [ i ] . length ;
133
+ if ( padLen ) matrix [ i ] = matrix [ i ] . concat ( emptyStrings ( padLen ) ) ;
134
+ }
135
+ }
136
+ return matrix ;
137
+ }
138
+
139
+ function emptyStrings ( len ) {
140
+ var padArray = new Array ( len ) ;
141
+ for ( var j = 0 ; j < len ; j ++ ) padArray [ j ] = '' ;
142
+ return padArray ;
143
+ }
144
+
92
145
function xScale ( d ) {
93
146
return d . calcdata . columns . reduce ( function ( prev , next ) {
94
147
return next . xIndex < d . xIndex ? prev + next . columnWidth : prev ;
0 commit comments