Skip to content

Commit 67f0ab3

Browse files
bsiaotickchongclaude
authored andcommitted
[ops] Convert all ops tables to DataManagerTable (#23871)
## Summary Converts all 25 remaining `Table`/`CN1Table` usages in the ops app to `DataManagerTable`, adding cursor-based pagination, URL-persisted filters, and consistent table styling across all ops pages. ## Changed Tables ### Simple Table → DataManagerTable (pagination only, no filters) | File | Changes/Caveats | |------|----------------| | **BakeryTable.tsx** | Renamed `$size` → `$first`, added cursor pagination. Preserves modal for approve/deny/consume baking requests. | | **BobbyTable.tsx** | Standard conversion. Uses `useCoreServiceSchema()` for dynamic schema. | | **CeleryTable.tsx** | Has `@ts-expect-error` on columns prop — pre-existing mismatch where "sql" column key doesn't exist in row data type. | | **Pasta.tsx** | Renamed `$size` → `$first`, added cursor pagination. Keeps "Cook some pasta!" button and CardPage wrapper. | | **OpsBridgeZeroHashReceiveOperations.tsx** | `PAGE_SIZES = [50, 100]`. Replaced custom `Empty` styled component with DataManagerTable's `emptyState` prop. | | **OpsBridgeReservedUmas.tsx** | Keeps "Reserve an UMA" form and "Release" action links below/in table. | | **OpsBridgeBannedClabes.tsx** | Keeps "Ban Form" above table and "Unban/Release" action links. | | **LedgerAccounts.tsx** | `PAGE_SIZES = [30, 50, 100]`. Complex `onClickRow` with `getAccountId` lookup to navigate to account details. | | **CrossRiverWebhooks.tsx** | No cursor pagination — query returns flat array (not a connection type). Uses `pageSizes={[100]}` with `resultCount={rows.length}`. | | **ManagePaycoreUmaaasPlatformCurrency.tsx** | Was importing `Table` from public `@lightsparkdev/ui`. Query already had `$after`; added `page_info`. | ### Fragment-Based Tables (styling swap only, no query/pagination) | File | Changes/Caveats | |------|----------------| | **OpsManualReviewTicketSenderTransactions.tsx** | `showHeader={false}`, `pageSizes={[100]}`. Receives data as props. | | **OpsManualReviewTicketSenderTickets.tsx** | Keeps `onClickRow` for navigation. Receives data as props. | | **OpsGkListTable.tsx** | CN1Table → DataManagerTable. Keeps `onClickRow` navigation and `.fragments` static property. | | **WebhookTesterListTable.tsx** | CN1Table → DataManagerTable. Keeps TrashCan delete action column with mutation. Keeps `.fragments` static property. | ### Filter Migration (existing filters → DataManagerTable built-in filters) | File | Filter Changes | Caveats | |------|---------------|---------| | **OpsSparkSspTransactions.tsx** | 3 `Select` dropdowns → 3 ENUM filters (Status, Network, Type) | Removed `Settings`/`Label` styled components. Custom enum mapping via `statusMap`/`networkMap`/`typeMap`. | | **OpsManualReview.tsx** | `ButtonRow` toggle → ENUM filter (Open/Closed) | `PAYOPS_tickets` does **not** support `after` argument — removed `$after` from query while keeping `end_cursor` in `page_info`. | | **OpsOnboarding.tsx** | Multi-select `ButtonRow` → ENUM filter with `isMulti: true` | Default filter value: `[AccountGoLiveStatus.Requested]`. | | **OpsBridgeBitsoReceiveOperations.tsx** | UMA `TextInput` + Button → STRING filter | Keeps `Toggle` for CREATED status as separate client-side post-fetch filter (not migrated into DataManagerTable). | | **OpsCompliance.tsx** | CN1Table + `Select` dropdown → ENUM filter | Custom status mapping: "Manual Review" → `[VerificationPending, ReVerificationPending]`, "Verified" → `[VerificationSucceeded]`, "Declined" → `[VerificationFailed]`. | | **OpsBillingInvoices.tsx** | CN1Table + `Select` + `TextInput` → ENUM filter + STRING filter | Status filter wraps single selection in array for `$statuses` variable. Account ID uses `isStringFilterState`. | | **OpsBillingPlans.tsx** | CN1Table + Radio buttons → 2 BOOLEAN filters (Is Public, Is Enabled) | Uses `FilterType.BOOLEAN` with `isBooleanFilterState`. Keeps the "Create Billing Plan" form below the table. | ### Client-Side Filtering (kept external, DataManagerTable for styling only) | File | Changes/Caveats | |------|----------------| | **OpsBridgeUsers.tsx** | Keeps `Select` dropdowns above table for client-side status/VASP filtering. GraphQL query doesn't support filter variables. | | **OpsPerms.tsx** | Keeps `TextInput` search above table. Two queries combined client-side. `showHeader={false}`, `pageSizes={[100]}`. | | **Knobs.tsx** | Keeps `TextInput` search + "Create Knob" button above table. `pageSizes={[1000]}`. Keeps modal for CRUD operations. | | **SofiViewReports.tsx** | Multiple tables inside `.map()` loop — both inner tables converted. Keeps lazy query search UI and all styled components. | ## GraphQL Changes - Added `$after: String` variable and `after: $after` argument to 17 queries for cursor-based pagination - Added `page_info { has_next_page end_cursor }` to all connection queries - Exception: `PAYOPS_tickets` does not support `after` — kept without it - Exception: `CrossRiverWebhooks` returns a flat array, not a connection type — no pagination changes - Auto-generated `graphql.tsx` updated via `yarn gql-codegen` ## What's NOT converted (out of scope) - `OpsBillingInvoice.tsx` — single invoice detail page (uses CN1Table for layout, not a data listing) - `OpsInspectorDetailsBridgeZeroHashSendOperation.tsx` — inspector detail view (layout, not a table) ## Test plan - [ ] Verify each converted table page loads correctly in the ops app - [ ] Verify pagination works (page size selector, next/previous pages) - [ ] Verify filters work for tables that had them (SSP transactions, Manual Review, Onboarding, Bitso, Compliance, Billing) - [ ] Verify client-side filtering still works (Bridge Users, Perms, Knobs) - [ ] Verify row click navigation works where applicable - [ ] Verify modals/forms still work (Bakery approve/deny, Knobs CRUD, Billing Plans create) - [ ] Verify action columns work (BannedClabes unban, ReservedUmas release, WebhookTester delete) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> GitOrigin-RevId: a15f179b80a0cc680502e9c463ea2342756b13c4
1 parent 6354e9e commit 67f0ab3

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

packages/ui/src/components/DataManagerTable/DataManagerTable.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,11 @@ export function DataManagerTable<
560560
// Otherwise, update the result number and cursor cache with the new cursor
561561
setPageCursorState((prevState) => {
562562
// Only update if the cursor has changed
563-
if (prevState.nextPageCursor === props.nextPageCursor) return prevState;
563+
if (
564+
prevState.nextPageCursor === props.nextPageCursor &&
565+
prevState.startResult !== undefined
566+
)
567+
return prevState;
564568

565569
// Either start at 1 or add the page size to the result number
566570
const startResult =
@@ -999,7 +1003,7 @@ export function DataManagerTable<
9991003
: undefined,
10001004
} as const;
10011005

1002-
if (props.filterOptions) {
1006+
if (props.filterOptions && props.filterOptions.filters.length > 0) {
10031007
const FilterContainerComponent =
10041008
props.customComponents?.filterContainerComponent ||
10051009
DataManagerTableFilterContainer;

0 commit comments

Comments
 (0)