Skip to content

Commit c3dd565

Browse files
committed
WIP
1 parent b5b5cc2 commit c3dd565

File tree

1 file changed

+29
-10
lines changed

1 file changed

+29
-10
lines changed

sdk/model/src/render/util/column_collection.ts

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)