@@ -18,6 +18,16 @@ export abstract class ResizeStrategy {
18
18
cssFriendlyColumnName : string ,
19
19
columnHeader : HTMLElement ,
20
20
sizeInPx : number ) : void ;
21
+
22
+ abstract applyMinColumnSize (
23
+ cssFriendlyColumnName : string ,
24
+ columnHeader : HTMLElement ,
25
+ minSizeInPx : number ) : void ;
26
+
27
+ abstract applyMaxColumnSize (
28
+ cssFriendlyColumnName : string ,
29
+ columnHeader : HTMLElement ,
30
+ minSizeInPx : number ) : void ;
21
31
}
22
32
23
33
/**
@@ -32,6 +42,15 @@ export class TableLayoutFixedResizeStrategy extends ResizeStrategy {
32
42
applyColumnSize ( _ : string , columnHeader : HTMLElement , sizeInPx : number ) : void {
33
43
columnHeader . style . width = coerceCssPixelValue ( sizeInPx ) ;
34
44
}
45
+
46
+ applyMinColumnSize ( _ : string , columnHeader : HTMLElement , sizeInPx : number ) : void {
47
+ columnHeader . style . minWidth = coerceCssPixelValue ( sizeInPx ) ;
48
+ }
49
+
50
+ applyMaxColumnSize ( ) : void {
51
+ // Intentionally omitted as max-width causes strange rendering issues in Chrome.
52
+ // Max size will still apply when the user is resizing this column.
53
+ }
35
54
}
36
55
37
56
/**
@@ -44,10 +63,14 @@ export class TableLayoutFixedResizeStrategy extends ResizeStrategy {
44
63
export class CdkFlexTableResizeStrategy extends ResizeStrategy implements OnDestroy {
45
64
private readonly _document : Document ;
46
65
private readonly _columnIndexes = new Map < string , number > ( ) ;
66
+ private readonly _columnProperties = new Map < string , Map < string , string > > ( ) ;
47
67
48
68
private _styleElement ?: HTMLStyleElement ;
49
69
private _indexSequence = 0 ;
50
70
71
+ protected readonly defaultMinSize = 0 ;
72
+ protected readonly defaultMaxSize = Number . MAX_SAFE_INTEGER ;
73
+
51
74
constructor (
52
75
private readonly _columnResize : ColumnResize ,
53
76
@Inject ( DOCUMENT ) document : any ) {
@@ -56,40 +79,95 @@ export class CdkFlexTableResizeStrategy extends ResizeStrategy implements OnDest
56
79
}
57
80
58
81
applyColumnSize ( cssFriendlyColumnName : string , _ : HTMLElement , sizeInPx : number ) : void {
82
+ const cssSize = coerceCssPixelValue ( sizeInPx ) ;
83
+
84
+ this . _applyProperty ( cssFriendlyColumnName , 'flex' , `0 0.01 ${ cssSize } ` ) ;
85
+ }
86
+
87
+ applyMinColumnSize ( cssFriendlyColumnName : string , _ : HTMLElement , sizeInPx : number ) : void {
88
+ const cssSize = coerceCssPixelValue ( sizeInPx ) ;
89
+
90
+ this . _applyProperty ( cssFriendlyColumnName , 'min-width' , cssSize ,
91
+ sizeInPx !== this . defaultMinSize ) ;
92
+ }
93
+
94
+ applyMaxColumnSize ( cssFriendlyColumnName : string , _ : HTMLElement , sizeInPx : number ) : void {
95
+ const cssSize = coerceCssPixelValue ( sizeInPx ) ;
96
+
97
+ this . _applyProperty ( cssFriendlyColumnName , 'max-width' , cssSize ,
98
+ sizeInPx !== this . defaultMaxSize ) ;
99
+ }
100
+
101
+ protected getColumnCssClass ( cssFriendlyColumnName : string ) : string {
102
+ return `cdk-column-${ cssFriendlyColumnName } ` ;
103
+ }
104
+
105
+ ngOnDestroy ( ) {
106
+ // TODO: Use remove() once we're off IE11.
107
+ if ( this . _styleElement && this . _styleElement . parentNode ) {
108
+ this . _styleElement . parentNode . removeChild ( this . _styleElement ) ;
109
+ this . _styleElement = undefined ;
110
+ }
111
+ }
112
+
113
+ private _applyProperty (
114
+ cssFriendlyColumnName : string ,
115
+ key : string ,
116
+ value : string ,
117
+ enable = true ) : void {
118
+ const properties = this . _getColumnPropertiesMap ( cssFriendlyColumnName ) ;
119
+
120
+ if ( enable ) {
121
+ properties . set ( key , value ) ;
122
+ } else {
123
+ properties . delete ( key ) ;
124
+ }
125
+ this . _applySizeCSS ( cssFriendlyColumnName ) ;
126
+ }
127
+
128
+ private _getStyleSheet ( ) : CSSStyleSheet {
59
129
if ( ! this . _styleElement ) {
60
130
this . _styleElement = this . _document . createElement ( 'style' ) ;
61
131
this . _styleElement . appendChild ( this . _document . createTextNode ( '' ) ) ;
62
132
this . _document . head . appendChild ( this . _styleElement ) ;
63
133
}
134
+
135
+ return this . _styleElement . sheet as CSSStyleSheet ;
136
+ }
137
+
138
+ private _getColumnPropertiesMap ( cssFriendlyColumnName : string ) : Map < string , string > {
139
+ let properties = this . _columnProperties . get ( cssFriendlyColumnName ) ;
140
+ if ( properties === undefined ) {
141
+ properties = new Map < string , string > ( ) ;
142
+ this . _columnProperties . set ( cssFriendlyColumnName , properties ) ;
143
+ }
144
+ return properties ;
145
+ }
64
146
147
+ private _applySizeCSS ( cssFriendlyColumnName : string ) {
148
+ const properties = this . _getColumnPropertiesMap ( cssFriendlyColumnName ) ;
149
+ const propertyKeys = Array . from ( properties . keys ( ) ) ;
150
+
65
151
let index = this . _columnIndexes . get ( cssFriendlyColumnName ) ;
66
152
if ( index === undefined ) {
153
+ if ( ! propertyKeys . length ) {
154
+ // Nothing to set or unset.
155
+ return ;
156
+ }
157
+
67
158
index = this . _indexSequence ++ ;
68
159
this . _columnIndexes . set ( cssFriendlyColumnName , index ) ;
69
160
} else {
70
- ( this . _styleElement . sheet as CSSStyleSheet ) . deleteRule ( index ) ;
161
+ this . _getStyleSheet ( ) . deleteRule ( index ) ;
71
162
}
72
163
73
164
const columnClassName = this . getColumnCssClass ( cssFriendlyColumnName ) ;
74
165
const tableClassName = this . _columnResize . getIdClass ( ) ;
75
166
76
167
const selector = `.${ tableClassName } .${ columnClassName } ` ;
77
- const cssSize = coerceCssPixelValue ( sizeInPx ) ;
78
-
79
- ( this . _styleElement . sheet as CSSStyleSheet ) . insertRule (
80
- `${ selector } {flex:0 0.01 ${ cssSize } }` , index ! ) ;
81
- }
82
-
83
- protected getColumnCssClass ( cssFriendlyColumnName : string ) : string {
84
- return `cdk-column-${ cssFriendlyColumnName } ` ;
85
- }
168
+ const body = propertyKeys . map ( key => `${ key } :${ properties . get ( key ) } ` ) . join ( ';' ) ;
86
169
87
- ngOnDestroy ( ) {
88
- // TODO: Use remove() once we're off IE11.
89
- if ( this . _styleElement && this . _styleElement . parentNode ) {
90
- this . _styleElement . parentNode . removeChild ( this . _styleElement ) ;
91
- this . _styleElement = undefined ;
92
- }
170
+ this . _getStyleSheet ( ) . insertRule ( `${ selector } {${ body } }` , index ! ) ;
93
171
}
94
172
}
95
173
0 commit comments