import type { GridApi, IRowNode } from "ag-grid-enterprise"; import { Deferred } from "@milaboratories/helpers"; class DeferredTracked extends Deferred { #resolved = false; constructor() { super(); this.promise.finally(() => { this.#resolved = true; }); } public get resolved(): boolean { return this.#resolved; } } export class DeferredCircular { private deferred = new DeferredTracked(); public get promise(): Promise { return this.deferred.promise; } public resolve(ctx: T): void { this.deferred.resolve(ctx); } public get resolved(): boolean { return this.deferred.resolved; } public reset(): void { if (this.resolved) { this.deferred = new DeferredTracked(); } } } export function ensureNodeVisible( api: GridApi, selector: (row: IRowNode) => boolean, ): boolean { let rowIndex: number | null = null; const nodeSelector = (row: IRowNode): boolean => { if (selector(row)) { rowIndex = row.rowIndex; return true; } return false; }; api.ensureNodeVisible(nodeSelector, "middle"); if (rowIndex) { const columns = api.getAllDisplayedColumns(); if (columns.length > 0) { api.ensureColumnVisible(columns[0]); api.setFocusedCell(rowIndex, columns[0]); } } return rowIndex !== null; }