Skip to content
Back to skills

Create Custom Filter

ASecurity

Create a custom filter for Datagrok by extending DG.Filter

  • 74 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 12, 2026
developmenttypescriptshellapi

Works with

  • api

Security analysis

A100/100

Scanned September 12, 2026

npx -y skills add datagrok-ai/public --skill create-custom-filter --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Create Custom Filter?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Create Custom Filter
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/datagrok-ai-create-custom-filter/badge)](https://www.skillsdirectory.com/skills/datagrok-ai-create-custom-filter)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: create-custom-filter
description: Create a custom filter for Datagrok by extending DG.Filter
when-to-use: When user asks to create a filter, custom filtering, or data filtering component
effort: medium
argument-hint: "[filter-name] [package-path]"
---

# Create Custom Filter

Create a custom filter widget for the Datagrok filter panel.

## Usage

```
/create-custom-filter [filter-name] [package-path]
```

## Instructions

When this skill is invoked, help the user create a custom filter by extending `DG.Filter`.

### Step 1: Create the filter class

Create a new TypeScript file in the package's `src/filters/` directory.

The class must extend `DG.Filter` and implement the filtering logic. When the filter state changes, call `this.dataFrame.filter` to update the bitset.

```ts
import * as DG from 'datagrok-api/dg';

export class MyFilter extends DG.Filter {
  constructor() {
    super();
    // Initialize filter state
  }

  attach(dataFrame: DG.DataFrame): void {
    super.attach(dataFrame);
    // Set up UI, subscribe to events
    this.column = dataFrame.columns.byName(this.columnName);
    this.render();
  }

  applyFilter(): void {
    // Apply filtering logic to this.dataFrame.filter (a DG.BitSet)
    let filter = this.dataFrame.filter;
    for (let i = 0; i < this.dataFrame.rowCount; i++)
      filter.set(i, this.shouldInclude(i), false);
    filter.fireChanged();
  }

  private render(): void {
    // Build the filter's UI
    this.root.appendChild(/* UI elements */);
  }
}
```

### Step 2: Register the filter

Use the decorator approach (preferred for `datagrok-tools` >= 4.12.x):

```ts
@grok.decorators.filter({
  semType: 'Country',  // optional: auto-apply to columns with this semantic type
})
export class MyFilter extends DG.Filter {
  /* ... */
}
```

Or use the function annotation approach in `package.ts`:

```ts
//name: My Filter
//description: A custom filter
//tags: filter
//output: filter result
export function myFilter() {
  return new MyFilter();
}
```

### Step 3: Use the filter programmatically

The filter can be invoked via JS API:

```ts
let tv = grok.shell.addTableView(grok.data.demo.demog());
tv.filters({filters: [
  {type: 'MyPackage:myFilter', columnName: 'race'},
]});
```

Or added through the UI via the filter panel.

### Key points

- The `semType` option in the decorator auto-applies the filter to columns with that semantic type
- Call `this.dataFrame.filter.set(i, value, notify)` to include/exclude rows; call `fireChanged()` after
- The `root` property is the HTMLElement where you build the filter's UI
- `attach()` is called when the filter is attached to a dataframe
- For a real example, see: `public/packages/Widgets/src/filters/radio-button-filter.ts`
- Both decorator and function annotation approaches are equivalent; prefer decorators

## Behavior

1. Ask the user what kind of filtering logic they need if not specified
2. Create the filter class extending `DG.Filter` with proper filtering logic
3. Register the filter using the decorator approach (or function annotation if preferred)
4. Build appropriate UI for the filter widget
5. Ensure imports are correct (`import * as DG from 'datagrok-api/dg'`, `import * as grok from 'datagrok-api/grok'`, `import * as ui from 'datagrok-api/ui'`)
6. Remind the user to build and publish the package

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.