@@ -147,7 +147,12 @@ function getSplitAxisIndices(selector: APColumnSelectorWithSplit | ((spec: PColu
147147 return splitIndices ;
148148}
149149
150- type UniversalPColumnOptsNoDeriver = {
150+ type SimpleSelectorWithSplit = ( ( spec : PColumnSpec ) => boolean ) | PColumnSelectorWithSplit | PColumnSelectorWithSplit [ ] ;
151+ type SimpleSelector = ( ( spec : PColumnSpec ) => boolean ) | PColumnSelector | PColumnSelector [ ] ;
152+ type AnchoredSelectorWithSplit = ( ( spec : PColumnSpec ) => boolean ) | APColumnSelectorWithSplit | APColumnSelectorWithSplit [ ] ;
153+ type AnchoredSelector = ( ( spec : PColumnSpec ) => boolean ) | AnchoredPColumnSelector | AnchoredPColumnSelector [ ] ;
154+
155+ type UniversalPColumnOptsNoDeriver < S = SimpleSelector > = {
151156 labelOps ?: LabelDerivationOps ;
152157 /** If true, incomplete data will cause the column to be skipped instead of returning undefined for the whole request. */
153158 dontWaitAllData ?: boolean ;
@@ -158,9 +163,14 @@ type UniversalPColumnOptsNoDeriver = {
158163 * Default value in getUniversalEntries is false, in getColumns it is true.
159164 */
160165 overrideLabelAnnotation ?: boolean ;
166+
167+ /**
168+ * Exclude columns that match the provided selector.
169+ */
170+ exclude ?: S ;
161171} ;
162172
163- type UniversalPColumnOpts = UniversalPColumnOptsNoDeriver & {
173+ type UniversalPColumnOpts = UniversalPColumnOptsNoDeriver < AnchoredSelector > & {
164174 anchorCtx : AnchoredIdDeriver ;
165175} & ResolveAnchorsOptions ;
166176
@@ -202,15 +212,15 @@ export class PColumnCollection {
202212
203213 // Overload signatures updated to return PColumnEntry types
204214 public getUniversalEntries (
205- predicateOrSelectors : ( ( spec : PColumnSpec ) => boolean ) | APColumnSelectorWithSplit | APColumnSelectorWithSplit [ ] ,
215+ predicateOrSelectors : AnchoredSelectorWithSplit ,
206216 opts : UniversalPColumnOpts ) : PColumnEntryUniversal [ ] | undefined ;
207217 public getUniversalEntries (
208- predicateOrSelectors : ( ( spec : PColumnSpec ) => boolean ) | PColumnSelectorWithSplit | PColumnSelectorWithSplit [ ] ,
218+ predicateOrSelectors : SimpleSelectorWithSplit ,
209219 opts ?: UniversalPColumnOptsNoDeriver ) : PColumnEntryWithLabel [ ] | undefined ;
210220 public getUniversalEntries (
211- predicateOrSelectors : ( ( spec : PColumnSpec ) => boolean ) | APColumnSelectorWithSplit | APColumnSelectorWithSplit [ ] ,
221+ predicateOrSelectors : AnchoredSelector ,
212222 opts ?: Optional < UniversalPColumnOpts , 'anchorCtx' > ) : ( PColumnEntryWithLabel | PColumnEntryUniversal ) [ ] | undefined {
213- const { anchorCtx, labelOps : rawLabelOps , dontWaitAllData = false , overrideLabelAnnotation = false } = opts ?? { } ;
223+ const { anchorCtx, labelOps : rawLabelOps , dontWaitAllData = false , overrideLabelAnnotation = false , exclude } = opts ?? { } ;
214224
215225 const labelOps : LabelDerivationOps = {
216226 ...( overrideLabelAnnotation && rawLabelOps ?. includeNativeLabel !== false ? { includeNativeLabel : true } : { } ) ,
@@ -223,6 +233,14 @@ export class PColumnCollection {
223233 ? predicateOrSelectors
224234 : [ predicateOrSelectors ] ;
225235
236+ const excludePredicate = exclude == undefined
237+ ? ( _ : PColumnSpec ) => false
238+ : typeof exclude === 'function'
239+ ? exclude
240+ : selectorsToPredicate ( anchorCtx
241+ ? Array . isArray ( exclude ) ? exclude . map ( ( e ) => resolveAnchors ( anchorCtx . anchors , e , opts ) ) : resolveAnchors ( anchorCtx . anchors , exclude , opts )
242+ : exclude as PColumnSelectorWithSplit | PColumnSelectorWithSplit [ ] ) ;
243+
226244 const intermediateResults : IntermediateColumnEntry [ ] = [ ] ;
227245
228246 for ( const rawSelector of selectorsArray ) {
@@ -232,7 +250,7 @@ export class PColumnCollection {
232250 if ( usesAnchors ) {
233251 if ( ! anchorCtx )
234252 throw new Error ( 'Anchored selectors require an AnchoredIdDeriver to be provided in options.' ) ;
235- currentSelector = resolveAnchors ( anchorCtx . anchors , rawSelector as AnchoredPColumnSelector , opts ) ;
253+ currentSelector = resolveAnchors ( anchorCtx . anchors , rawSelector , opts ) ;
236254 } else
237255 currentSelector = rawSelector as PColumnSelectorWithSplit | ( ( spec : PColumnSpec ) => boolean ) ;
238256
@@ -241,6 +259,7 @@ export class PColumnCollection {
241259 for ( const provider of this . providers ) {
242260 const providerColumns = provider . selectColumns ( currentSelector ) ;
243261 for ( const col of providerColumns ) {
262+ if ( excludePredicate ( col . spec ) ) continue ;
244263 if ( selectedIds . has ( col . id ) ) throw new Error ( `Duplicate column id ${ col . id } in provider ${ provider . constructor . name } ` ) ;
245264 selectedIds . add ( col . id ) ;
246265 selectedColumns . push ( col ) ;
@@ -391,13 +410,13 @@ export class PColumnCollection {
391410 }
392411
393412 public getColumns (
394- predicateOrSelectors : ( ( spec : PColumnSpec ) => boolean ) | APColumnSelectorWithSplit | APColumnSelectorWithSplit [ ] ,
413+ predicateOrSelectors : AnchoredSelectorWithSplit ,
395414 opts : UniversalPColumnOpts ) : PColumn < TreeNodeAccessor | DataInfo < TreeNodeAccessor > > [ ] | undefined ;
396415 public getColumns (
397- predicateOrSelectors : ( ( spec : PColumnSpec ) => boolean ) | PColumnSelectorWithSplit | PColumnSelectorWithSplit [ ] ,
416+ predicateOrSelectors : SimpleSelectorWithSplit ,
398417 opts ?: UniversalPColumnOptsNoDeriver ) : PColumn < TreeNodeAccessor | DataInfo < TreeNodeAccessor > > [ ] | undefined ;
399418 public getColumns (
400- predicateOrSelectors : ( ( spec : PColumnSpec ) => boolean ) | APColumnSelectorWithSplit | APColumnSelectorWithSplit [ ] ,
419+ predicateOrSelectors : AnchoredSelector ,
401420 opts ?: Optional < UniversalPColumnOpts , 'anchorCtx' > ) : PColumn < TreeNodeAccessor | DataInfo < TreeNodeAccessor > > [ ] | undefined {
402421 const entries = this . getUniversalEntries ( predicateOrSelectors , {
403422 overrideLabelAnnotation : true , // default for getColumns
0 commit comments