@linzjs/step-ag-grid 30.0.0 → 30.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/components/gridFilter/GridFilterColumnsMultiSelect.d.ts +4 -0
- package/dist/step-ag-grid.cjs +27 -0
- package/dist/step-ag-grid.cjs.map +1 -1
- package/dist/step-ag-grid.esm.js +27 -0
- package/dist/step-ag-grid.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/components/gridFilter/GridFilterColumnsMultiSelect.tsx +30 -2
- package/src/stories/grid/GridFilterColumnsMultiSelect.stories.tsx +5 -1
package/package.json
CHANGED
|
@@ -45,7 +45,6 @@ const FilterUI: React.FC<FilterUIProps> = ({
|
|
|
45
45
|
return (
|
|
46
46
|
<div className="GridFilterColsMultiSelect">
|
|
47
47
|
<span className="LuiSelect-label-text">Filter column</span>
|
|
48
|
-
|
|
49
48
|
<LuiCheckboxInput
|
|
50
49
|
className="LuiCheckboxInput-selectAll"
|
|
51
50
|
label={'Select All'}
|
|
@@ -75,6 +74,9 @@ export class GridFilterColumnsMultiSelect implements IFilterComp {
|
|
|
75
74
|
private gui!: HTMLElement;
|
|
76
75
|
private labelFormatter?: (value: string) => string;
|
|
77
76
|
private reactRoot: Root | null = null;
|
|
77
|
+
private filterButtonClickListener: ((e: Event) => void) | null = null;
|
|
78
|
+
private filterButton: Element | null = null;
|
|
79
|
+
private hasOpened = false;
|
|
78
80
|
|
|
79
81
|
private normalizeCellValue(value: unknown): string {
|
|
80
82
|
if (typeof value === 'string') return value.trim() === '' ? EMPTY_KEY : value;
|
|
@@ -123,11 +125,31 @@ export class GridFilterColumnsMultiSelect implements IFilterComp {
|
|
|
123
125
|
this.gui = document.createElement('div');
|
|
124
126
|
this.reactRoot = createRoot(this.gui);
|
|
125
127
|
this.render();
|
|
128
|
+
this.setupFilterButtonListener();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private setupFilterButtonListener(): void {
|
|
132
|
+
const columnId = this.params.column.getColId();
|
|
133
|
+
this.filterButton = document.querySelector(`[col-id="${columnId}"] .ag-header-cell-filter-button`);
|
|
134
|
+
|
|
135
|
+
if (this.filterButton) {
|
|
136
|
+
this.filterButtonClickListener = (e: Event) => {
|
|
137
|
+
if (this.hasOpened) {
|
|
138
|
+
e.stopPropagation();
|
|
139
|
+
e.preventDefault();
|
|
140
|
+
this.params.api.hidePopupMenu();
|
|
141
|
+
this.hasOpened = false;
|
|
142
|
+
} else {
|
|
143
|
+
this.hasOpened = true;
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
this.filterButton.addEventListener('click', this.filterButtonClickListener, true);
|
|
148
|
+
}
|
|
126
149
|
}
|
|
127
150
|
|
|
128
151
|
private render(): void {
|
|
129
152
|
if (!this.reactRoot) return;
|
|
130
|
-
|
|
131
153
|
this.reactRoot.render(
|
|
132
154
|
<FilterUI
|
|
133
155
|
allValues={this.allValues}
|
|
@@ -196,6 +218,12 @@ export class GridFilterColumnsMultiSelect implements IFilterComp {
|
|
|
196
218
|
}
|
|
197
219
|
|
|
198
220
|
destroy(): void {
|
|
221
|
+
if (this.filterButtonClickListener && this.filterButton) {
|
|
222
|
+
this.filterButton.removeEventListener('click', this.filterButtonClickListener, true);
|
|
223
|
+
this.filterButtonClickListener = null;
|
|
224
|
+
this.filterButton = null;
|
|
225
|
+
}
|
|
226
|
+
|
|
199
227
|
if (this.reactRoot) {
|
|
200
228
|
this.reactRoot.unmount();
|
|
201
229
|
this.reactRoot = null;
|
|
@@ -159,7 +159,11 @@ const filterGridUsingColumnFilter = async (filterString: string): Promise<void>
|
|
|
159
159
|
});
|
|
160
160
|
const headerCellFilterButton = await findQuick({ classes: `.ag-header-cell-filter-button` });
|
|
161
161
|
await expect(headerCellFilterButton).toBeInTheDocument();
|
|
162
|
-
|
|
162
|
+
// Check if menu is already open
|
|
163
|
+
const existingMenu = document.querySelector('.ag-menu');
|
|
164
|
+
if (!existingMenu) {
|
|
165
|
+
await user.click(headerCellFilterButton);
|
|
166
|
+
}
|
|
163
167
|
const canvas = within(document.body);
|
|
164
168
|
const regex = new RegExp(filterString, 'i'); // case‑insensitive
|
|
165
169
|
const filterCheckbox = await canvas.findByRole('checkbox', { name: regex });
|