Skip to content

feat(collectionView): add Index Management tab#732

Open
khelanmodi wants to merge 36 commits into
mainfrom
dev/khelanmodi/index-management-ui
Open

feat(collectionView): add Index Management tab#732
khelanmodi wants to merge 36 commits into
mainfrom
dev/khelanmodi/index-management-ui

Conversation

@khelanmodi

@khelanmodi khelanmodi commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

feat(collectionView): Index Management tab

image image

Summary

Adds an Indexes tab inside the existing CollectionView (between
Results and Query Insights) for managing collection indexes from the
extension. This PR contains the UI / front-end scaffold. The tRPC
router that brokers calls to ClustersClient is in place, but every
integration point is annotated for the backend engineer to validate
end-to-end against the real cluster surface.

What ships in this PR (UI only)

  • Indexes tab in CollectionView (no new webview, no new command,
    no new context-menu entry). Renders when selectedTab === 'tab_indexes'.
  • Top-toolbar Create Index button — the CollectionView primary
    toolbar swaps its Find Query action for Create Index while on the
    Indexes tab. Triggered via a documentdb:openCreateIndex custom event
    so the toolbar stays decoupled from the tab internals.
  • Find Query editor (the multiline query input) is hidden on the
    Indexes tab; visible on Results / Query Insights as before.
  • Index table — Name, Type (color-coded pill), Fields, Memory, Usage
    (with tooltip showing the time window), Created, Notes, Actions
    (Delete, Hide/Unhide). The pencil/Edit action has been removed for
    this iteration — see follow-ups below.
  • Create Index dialog — field picker (populated from SchemaStore),
    per-field asc/desc, type selector (Single Field / TTL / Geospatial /
    Text) with type-specific options (unique + sparse for single-field,
    expiry for TTL), optional name + notes, ≥1-field / ≥1-type validation,
    and the large-collection warning banner (>
    LARGE_COLLECTION_THRESHOLD_DOCS = 1,000,000 documents).
  • Footer bar — total indexes / total memory / total usage.
  • ConfirmDialog wrapper used for the destructive delete confirmation.
  • Reuses existing Fluent UI v9 primitives and the project's theme tokens
    — no new colors, fonts, spacing units, or runtime dependencies.

Backend integration surface — for the backend engineer

All UI ↔ backend traffic flows through one file:

src/webviews/documentdb/indexView/indexViewRouter.ts

The top of the file has a BACKEND INTEGRATION SURFACE banner and
every procedure is preceded by a // BACKEND INTEGRATION POINT — <procedureName> block that documents:

  • what the UI expects back,
  • which ClustersClient method is currently called,
  • known edge cases / TODOs.

Search the file for BACKEND INTEGRATION POINT to walk through them.

Procedure inventory

Procedure UI surface Currently calls
getInfo tab header / dialog titles (pure context read, no backend call)
listIndexes main table ClustersClient.listIndexes + getCollectionStats + getIndexStats
getCollectionDocumentCount large-collection warning banner ClustersClient.getCollectionStats
getFieldSuggestions Create Index field picker SchemaStore.getInstance().getKnownFields (in-process; no backend call)
createIndex Create Index dialog submit ClustersClient.createIndex
dropIndex Delete confirm dialog ClustersClient.dropIndex
hideIndex / unhideIndex Hide/Unhide action button ClustersClient.{hide,unhide}Index

All of the above ClustersClient methods already exist; the router calls
them through their existing signatures and shapes the response into the
view-model types in ./types.ts. If you need to change the underlying
transport (capability gating, batching, caching, server-side endpoint),
do it inside the procedure — the webview never needs to know.

Known follow-ups (not blocking this PR)

  1. dropIndex against in-progress build — confirm DocumentDB
    behaviour and surface a better error if the index is mid-build.
  2. hideIndex capability gate — some cluster tiers / engine versions
    don't support collMod { hidden }. Return a typed error so the UI
    can disable the toggle proactively.
  3. IndexRow.notes persistence — the field is read-only today;
    wire up storage when product confirms scope.
  4. Search-index types ($search, vector) are intentionally not
    surfaced in v1 — confirm we want to keep them filtered out.
  5. Edit-then-recreate flow — the pencil/Edit action was removed for
    this PR. If product wants it back, the agreed pattern is "delete +
    open Create dialog pre-filled".

Files changed

File Purpose
src/webviews/documentdb/collectionView/CollectionView.tsx Adds the Indexes tab, the panel, and hides the Find Query editor on that tab.
src/webviews/documentdb/collectionView/components/toolbar/ToolbarMainView.tsx Swaps the primary toolbar button to Create Index on the Indexes tab.
src/webviews/documentdb/indexView/ (new folder) Tab component, table, dialogs, footer, types, constants, utils, router.
src/webviews/_integration/appRouter.ts Mounts mongoClusters.indexView.

Local testing

  1. npm run build
  2. F5 → Default: Launch Extension (webpack).
  3. Open any collection → click the Indexes tab.
  4. Create / delete / hide an index against a non-prod cluster.

Verification

  • npm run l10n
  • npm run prettier-fix
  • npm run lint
  • npx jest --no-coverage
  • npm run build
  • npm run package

@khelanmodi
khelanmodi requested a review from a team as a code owner June 3, 2026 18:57
Copilot AI review requested due to automatic review settings June 3, 2026 18:57

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new Indexes tab to the existing CollectionView webview, including a front-end scaffold for listing and managing collection indexes (create, delete, hide/unhide) backed by a new mongoClusters.indexView tRPC router.

Changes:

  • Introduces the new indexView/ webview area (tab component, table/footer, create + confirm dialogs, formatting/classification utils, constants, styling).
  • Adds an indexViewRouter tRPC router and mounts it under mongoClusters.indexView in the root webview appRouter.
  • Updates CollectionView + toolbar behavior to expose the Indexes tab, hide the query editor on that tab, and swap the primary toolbar action to “Create Index” via a custom window event.

Reviewed changes

Copilot reviewed 16 out of 16 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
src/webviews/documentdb/indexView/utils/indexType.ts Classifies indexes into badge categories for the table “Type” column.
src/webviews/documentdb/indexView/utils/format.ts Adds formatting helpers for bytes, ops, and date/tooltip strings.
src/webviews/documentdb/indexView/types.ts Defines IndexRow view-model + create-index input types.
src/webviews/documentdb/indexView/indexViewRouter.ts New tRPC router implementing list/create/drop/hide/unhide and field suggestions.
src/webviews/documentdb/indexView/indexView.scss Styling for the Indexes tab layout, table, and dialog controls.
src/webviews/documentdb/indexView/IndexesTab.tsx Main Indexes tab component (fetching, dialogs, hide/unhide, delete flow).
src/webviews/documentdb/indexView/constants.ts Central constants (thresholds, directions, event name, id index name).
src/webviews/documentdb/indexView/components/IndexTypeBadgeView.tsx Renders Fluent UI badge for index type.
src/webviews/documentdb/indexView/components/IndexTable.tsx Renders the indexes table + action buttons and tooltips.
src/webviews/documentdb/indexView/components/IndexFooterBar.tsx Renders footer totals (indexes/memory/usage) as a live region.
src/webviews/documentdb/indexView/components/CreateIndexDialog.tsx Create Index dialog UI + validation and payload shaping.
src/webviews/documentdb/indexView/components/ConfirmDialog.tsx Reusable confirm dialog wrapper for destructive/caution actions.
src/webviews/documentdb/collectionView/components/toolbar/ToolbarMainView.tsx Switches primary toolbar action to “Create Index” when on Indexes tab.
src/webviews/documentdb/collectionView/CollectionView.tsx Adds Indexes tab, hides QueryEditor on Indexes, renders IndexesTab panel.
src/webviews/_integration/appRouter.ts Mounts mongoClusters.indexView router.
l10n/bundle.l10n.json Adds localization entries for newly introduced UI strings.

relationship="description"
withArrow
>
<span>{formatOps(idx.usageOps)}</span>
Comment on lines +87 to +94
<Button
appearance="subtle"
size="small"
icon={<DeleteRegular />}
aria-label={l10n.t('Delete index {0}', idx.name)}
disabled={isProtected}
onClick={() => onDelete(idx)}
/>
Comment on lines +107 to +118
<Button
appearance="subtle"
size="small"
icon={idx.hidden ? <EyeRegular /> : <EyeOffRegular />}
aria-label={
idx.hidden
? l10n.t('Unhide index {0}', idx.name)
: l10n.t('Hide index {0}', idx.name)
}
disabled={isProtected}
onClick={() => onToggleHidden(idx)}
/>
Comment on lines +72 to +75
</Tooltip>
</TableCell>
<TableCell>{formatDate(idx.usageSince)}</TableCell>
<TableCell>{idx.notes ?? ''}</TableCell>

return (
<div className="indexView">
{isLoading && <ProgressBar thickness="large" shape="square" className="progressBar" />}
: ASC_DIRECTION,
})
}
aria-label={l10n.t('Sort direction')}
// IndexesTab component listens for; this keeps the toolbar
// free of any direct coupling to the IndexesTab internals.
<ToolbarButton
aria-label={l10n.t('Create a new index')}
Comment on lines +353 to +357
.mutation(async ({ input, ctx }) => {
const myCtx = ctx as WithTelemetry<RouterContext>;
const client = await ClustersClient.getClient(myCtx.clusterId);
await client.unhideIndex(myCtx.databaseName, myCtx.collectionName, input.indexName);
return { ok: true };
Adds an Indexes tab inside the existing CollectionView (between Results and Query Insights) for managing collection indexes:

- Indexes tab in CollectionView (no new webview, no new command, no context-menu entry)

- Top-toolbar Create Index button (replaces Find Query on the Indexes tab)

- Find Query editor hidden on the Indexes tab

- Index table: Name, Type (color pill), Fields, Memory, Usage (tooltip), Created, Notes, Actions (Delete, Hide/Unhide)

- Create Index dialog: field picker (SchemaStore), per-field asc/desc, type selector with type-specific options, large-collection warning, validation

- Footer with totals; ConfirmDialog for destructive delete

- Reuses Fluent UI v9 + existing theme tokens; no new runtime dependencies

Backend integration: all UI <-> backend traffic flows through src/webviews/documentdb/indexView/indexViewRouter.ts. Every procedure has a BACKEND INTEGRATION POINT comment block for the backend engineer documenting expected shape, currently-called ClustersClient method, and follow-ups.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@khelanmodi
khelanmodi force-pushed the dev/khelanmodi/index-management-ui branch from 98e708c to 72ddf92 Compare June 3, 2026 19:49
@khelanmodi
khelanmodi requested a review from tnaum-ms June 3, 2026 19:51
@tnaum-ms tnaum-ms added this to the 0.10.0 milestone Jun 4, 2026
Copilot AI and others added 20 commits July 6, 2026 11:23
…ui' into copilot/index-management-ui-webview-migration

# Conflicts:
#	l10n/bundle.l10n.json
The DocumentDB operator/compatibility docs moved from
MicrosoftDocs/azure-databases-docs (articles/documentdb/...) to the public
MicrosoftDocs/nosql-docs repo, breaking the scraper with 404s. Update:

- COMPAT_PAGE_URL, OPERATOR_DOC_BASE, DOC_LINK_BASE and the GitHub API base
  in scrape-operator-docs.ts to the new nosql-docs paths.
- DOC_BASE and expr:type dir in docLinks.ts to match (type-expression pages
  are now under aggregation/).
- Map the newly-listed 'Text Expression Operator' $meta to the projection
  meta (same operator, deduped) in the generator/evaluator/tests.
- Bump expected query operator count 43 -> 44 (Projection $meta now listed).
- Regenerate operator-reference.md dump and src/*.ts.

Operators discovered went up (308 -> 310 listed; 324 total unchanged);
description coverage remains 100% via overrides.
Extend the docs scraper to parse the compatibility page's '## Index types'
and '## Index properties' tables into a new resources/scraped/index-reference.md
dump, and generate src/indexReference.ts exporting INDEX_TYPES and
INDEX_PROPERTIES (name/description/supported).

- scrape-operator-docs.ts: add index-table parsing (handles the upstream
  wrapped Vector row) and Phase 3b index dump generation.
- generate-from-reference.ts: parse the index dump and emit indexReference.ts.
- Add IndexReferenceEntry type; export INDEX_TYPES/INDEX_PROPERTIES from index.ts.
- Add indexReference tests; document the new outputs in scripts/README.md.

Captures the 8 supported index types (incl. Wildcard, Hashed, Multikey,
Vector) and 6 properties (TTL, Unique, Partial, Case Insensitive, Sparse,
Background) that were previously missing from the UI's hardcoded model.
The compatibility page (now scraped into operator-registry's INDEX_TYPES)
lists Wildcard and Hashed as supported index types, but the Index Management
Type column previously mislabeled them as 'Single Field'/'Compound'.

Detect them from the key spec (display-only, no create-index changes):
- Hashed  -> key direction === 'hashed'
- Wildcard -> key field contains the '$**' token

Adds the two badge categories (with colours) and the supporting constants.
Labels mirror the registry's canonical INDEX_TYPES names.
…x support

Add two notes under docs/ai-and-plans/PRs:
- 732-operator-registry-scraper-updates.md: PR summary of the scraper
  migration to nosql-docs, operator-count impact, and the new index metadata.
- documentdb-supported-indexes.md: reference summary of the 8 index types and
  6 index properties DocumentDB supports, scraped from the compatibility page,
  with how each maps to the extension's classification and create UI.
…ation

The docs migration left several stale references to the old
azure-databases-docs paths:

- README.md: per-operator docs link (now .../documentdb/query/operators/) and
  source-repo reference (now MicrosoftDocs/nosql-docs, new folder layout).
- resources/overrides/operator-overrides.md: $minN and $cmp Doc Link
  overrides rebased onto the new learn.microsoft.com/en-us/documentdb/query
  path; regenerated expressionOperators.ts / windowOperators.ts accordingly.
- scrape-operator-docs.ts: updated the CATEGORY_TO_DIR and subdirectory-crawl
  comments (nosql-docs; operators tree is now flat).

The compatibility-page URL (learn.microsoft.com/en-us/azure/documentdb/
compatibility-query-language) is unchanged and still canonical.
Redesign the Index Management tab to lead with a summary, mirroring the
Query Insights layout:

- New IndexMetricsRow renders a single responsive row (1/2/4 columns) of
  four cards, reusing the Query Insights metric-card kit (MetricsRow,
  CountMetric, GenericMetric).
- Cards: Total Indexes, Total Size, Total Usage (the former footer
  aggregates), plus a new Unused Indexes card (non-default indexes with zero
  recorded usage) as an index-hygiene signal.
- The index table becomes the second row; the old IndexFooterBar is removed.

Exploratory UI prototyping — data wiring for the newly discovered index-type
source of truth will follow once the direction is finalized.
Under the metrics row, add an in-tab toolbar (Fluent Toolbar) with:
- a filter SearchBox (captured in state but not yet wired to filtering), for
  collections with many indexes;
- a Cards/Table view toggle (radio-style ToolbarToggleButtons).

The default Cards view is a placeholder for now (comfortable layout intended
for collections with few indexes); the Table view renders the existing table.
Content container renamed to indexContentContainer to serve both views.

Exploratory UI prototyping — filtering and the card layout will follow once
the direction is finalized.
- Replace the Cards/Table toggle with a Dropdown (matching the Results tab's
  Table/Tree/JSON ViewSwitcher).
- Prototype the Cards view with four Fluent Card design variations, each
  rendering the same index list so a direction can be chosen:
  A) compact horizontal list cards
  B) vertical cards with footer Hide/Delete buttons
  C) vertical cards with a 3-dot overflow menu (Hide/Unhide, Delete)
  D) stat-forward cards with a preview strip + overflow menu
  Variations C and D include the requested (…) menu; delete/hide are wired to
  the existing handlers and disabled on the default _id index. No multiselect.

Exploratory prototype — one variation will be kept once a direction is picked.
Replace the earlier card variations with a new set that leans on Fluent Card's
header (icon + title + subtitle), footer actions, and preview slots:

- Variation 1: icon header + size/usage stat chips + footer actions
- Variation 2: small property badges (Unique/Sparse/TTL/Hidden) on top
- Variation 3: stat-forward — large Size/Usage figures
- Variation 4: CardPreview strip hosting type + property badges

All variations share a taller card at the compact-list width (~260px), an
icon in the header image slot, footer Hide/Unhide + Delete (disabled on the
default _id index), and Fluent icons on the size/usage stats. No 3-dot menu,
no multiselect.
Replace the card gallery with six stat-forward sub-variants exploring how the
size/usage figures and row actions are rendered:

- Stat renderings borrowed from the Query Insights cards: big figures
  (metric-card feel), bordered grid cells (execution-plan StageDetailCard),
  inline badges, a two-column summary grid (efficiency SummaryCard), and a
  compact medium inline row.
- Action treatments: none, icon-only buttons pinned bottom-right, an overflow
  (...) menu (header or bottom-right), and footer text buttons. All disabled on
  the default _id index.
- Leading icon switched to SquareMultiple (mirrors the tree combine codicon
  for indexes) tinted with the theme accent (colorBrandForeground1).

Exploratory prototype - pick a stat + action combination to keep.
… right actions)

Narrow the card gallery to the variant 3D family and apply feedback:

- Right-align the footer Hide/Delete actions.
- Fix the type badge wrapping: "Single Field" now uses a non-breaking space so
  it stays on one line (IndexTypeBadgeView), keeping an aria-label with the
  normal text.
- Size/Usage badges now use the accessible focusableBadge pattern (tabIndex,
  focus ring, aria-label, tooltip, aria-hidden visible text).
- Card title + subtitle truncate with an ellipsis instead of wrapping (with a
  title attribute for the full text on hover).
- Add a mixed variant (3D+) using the big figures from 3A with the same
  right-aligned footer actions.
The relative import had one extra '../' (4 levels) so webpack could not
resolve it at runtime. indexView/components is three levels below
src/webviews, so the correct path is ../../../components/focusableBadge/...
Address the "cards feel noisy / no value over the table" feedback and add the
requested experiments:

- Tunable column breakpoint: the grid min card width is now a CSS custom
  property (--index-card-min-width, default 320px) on .indexCardsView with a
  TUNE ME comment, so columns are introduced later and are easy to adjust.
- Per-type icons are back (Globe = geospatial, Text, Key = _id, etc.); Single
  Field uses SquareMultiple to mirror the tree view index (combine) icon.
- Per-type accent colour (VS Code chart colours) drives icon tint, left
  borders, header bands and footer accents.
- Badges match Query Insights sizing (small, rounded, tint); type badge gains
  an optional size prop. Index key components render as small chips.
- New fresh variants: F1 accent left border, F2 soft brand header band,
  F3 big-name hero (minimal), F4 accent icon tile, F5 component-chips-forward,
  F6 colour-accented footer — alongside the kept 3D / 3D+ designs.

Exploratory prototype.
Act on prototype feedback:

- Fix index names not rendering in the hero / component variants: a robust
  TitleRow (icon, growing min-width:0 title block, action) guarantees the name
  shows and ellipsises.
- Drop per-type colour coding (not accessible): a single theme accent is used
  for every index type; removed the accent left-border / brand band / accent
  footer variants (F1, F2, F6).
- F3 (minimal hero) is now a real bordered card with icon-free minimal stats
  that include the "since" date and a fuller tooltip (size / usage / since).
- Explore F3 and F5 with and without the leading icon and with different
  actions: none, footer buttons, icon-only buttons, and overflow menu.
- F5 key components are readable again (emphasised chips in a padded panel).
- Badges keep the Query Insights small/rounded/tint sizing; stat icons dropped
  from the plain stats line.

Kept 3D / 3D+ / accent tile; added F3a-c and F5a-c.
…riants

- Fix field-name text rendering invisible/white: key components are now custom
  chips (.keyChip) with an explicit legible colour instead of a Fluent subtle
  Badge, so they read on any card surface (fixes F3a-c and F5a).
- Make F3 / F5 cards a filled surface so they clearly read as cards.
- Normalise index type badge colour: all types now use one neutral tint (was
  arbitrary per-type palette tokens; Wildcard=severe/orange and Hashed=danger/
  red wrongly implied problems). Affects the table Type column too.
- More F5 variants: no-icon big-title (F5d/F5f) and icon-without-gray-panel
  (F5e).
- New L family: full-width "rich list" rows (table-like). A shared grid template
  aligns columns across rows; fields stack one per line (or inline chips);
  actions at the far right. Collapses on narrow panels.
tnaum-ms added 3 commits July 8, 2026 06:22
…ents

Drop every unlisted variant. Keep/refine per feedback:

- 3D+ kept as the big-figures reference.
- F3c: type badge moved to the upper-right corner.
- F5c: Hide/Unhide now shows its label; add a no-icon option; add icon
  treatments — accent tile background (was F4, now dropped) and accent-colour
  icon with no background (Query Insights AI-card style).
- F5e: inline fields without the panel frame, with and without the "Fields"
  label.
- Rich list (L1-L3): fixed column widths so columns align across rows, and
  grid-auto-rows:1fr makes every row equal height (the tallest), fixing the
  ragged/mismatched-height problem.

Single neutral accent for all index types (no colour coding).
Drop all other variants (including the L list). Everything now leads with big
stat figures:

- B1/B2: two big figures (Size, Usage), with and without the leading icon.
- B3: three unified columns (Size · Usage · Since) each 1/3, adding the usage
  since-date (formatDate, with a full datetime tooltip).
- B4/B5: a bottom-left "Details" toggle that reveals the index fields with a
  Fluent Collapse animation (@fluentui/react-motion-components-preview), over
  two- or three-column stats; Hide/Unhide shows its label.
- B6: three big figures in bordered cells with icon actions.
The card prototypes did not add value over the table, so remove them:

- Delete IndexCardsView and the IndexViewMode type; the tab always renders the
  table now.
- Drop the Cards/Table view dropdown from the toolbar.
- Keep the filter row: the filter SearchBox plus suggested (not-yet-wired)
  filter controls — a multi-select "Type" menu (index types) and quick
  "Hidden" / "Unused" toggle buttons.

Metrics row and table are unchanged.
@github-actions

Copy link
Copy Markdown
Contributor

📦 Build Size Report

Metric Base (main) PR Delta
VSIX (vscode-documentdb-0.9.1.vsix) 8.01 MB 8.03 MB ⬆️ +27 KB (+0.3%)
Webview bundle (views.js) 5.88 MB 5.99 MB ⬆️ +107 KB (+1.8%)

Download artifact · updated automatically on each push.

tnaum-ms added 12 commits July 16, 2026 12:14
Keep the filter box and the quick Hidden / Unused toggles; drop the
(presentational) index-type multi-select menu.
Move the details table + filter row into a new components/indexList/ folder and
wrap them in an <IndexList> component so the list UI can be tweaked in isolation:

- indexList/IndexList.tsx: owns the filter text + quick-filter (Hidden/Unused)
  state, applies them to the indexes (name + field match; hidden; unused =
  non-default with zero usage), and renders the details table. Exposes the
  filter state and available-vs-shown counts via onStateChange.
- indexList/IndexListFilterBar.tsx: the filter box, Hidden/Unused toggles, and a
  live "Showing X of Y" count (replaces the old IndexToolbar).
- Move IndexTable + IndexTypeBadgeView into the folder; add a barrel index.ts.
- IndexesTab now renders <IndexList> and no longer owns filter state.

The filters are now wired (previously presentational).
- Move the "Showing X of Y indexes" count out of the filter bar to a centered
  line below the table, in a slightly larger font. The table area now only
  takes the height it needs (flex 0 1 auto) so the count shifts up as the list
  shrinks instead of staying pinned to the bottom.
- Filter row: drop the divider; the filter box now grows to fill the full width
  minus the Hidden/Unused toggles (flex: 1), which stay on the right.
- Force the filter toolbar to span the full width (width: 100%); the filter box
  grows to fill, pushing the Hidden/Unused toggles to the right.
- Add a Clear button at the far right that resets the filter text and the quick
  toggles; disabled when no filters are active.
DocumentDB rejects unknown index options (strict MongoDB 4.4+ wire
protocol validation), so a 'notes' field cannot be persisted on the
index definition. Drop the placeholder end to end: the Create Index
dialog field, the Notes table column, the IndexRow/CreateIndexInput
types, and the router's zod field and follow-up comment.
Show a table skeleton (mirroring the Results tab loading animation) and
hide the 'Showing X of Y' count while indexes are loading. The refresh
flow now clears existing rows first so the skeleton is shown instead of
stale data, and the CollectionView toolbar Refresh button reloads the
index list (via a new REFRESH_INDEXES_EVENT) when the Indexes tab is
active.
Match the filter row to the rest of the webview: use the toolbar's
medium size for all buttons (dropping the per-button size override),
normalize the toggle and Clear buttons to the regular font weight, and
add description tooltips (same style as the document toolbar) to the
Hidden/Unused toggles and the Clear filters button.
Replace Fluent's fixed-pixel column-sizing plugin with a fluid layout
(width:100% + table-layout:fixed + <colgroup>) so the index table always
fits the panel width instead of overflowing horizontally; the name column
absorbs the slack. Reserve the scroll gutter (scrollbar-gutter: stable)
so expanding a row no longer reflows the table narrower. Move the
expanded field list into a new IndexRowDetails component rendered as a
full-width Card styled to match the metrics cards (appearance=filled),
and fix the detail cell colSpan (7 -> 6) after the Notes column removal.
Indent the detail card through the sub-row cell's left padding (50px) so
the card keeps uniform internal padding and its left edge lines up with
the Name column, instead of faking the offset with lopsided card padding.
Add a words-only Properties column (Unique/Sparse/Partial/TTL/Collation/
Hidden), rename Memory -> Size, and move the usage 'since' out of the row.
Redesign the expanded detail into inline, wrapping key badges plus a
present-only facts list (usage, TTL, partial filter, collation). Add a
'View raw definition' button that opens the raw server-reported index
document in a new untitled JSON editor via a new openIndexDefinition
mutation. Forward partialFilterExpression/collation/wildcardProjection on
IndexRow to support the above. Status column intentionally omitted (not
reported by listIndexes for traditional indexes).
Enlarge the Properties badges to medium (matching the Type badge), bolden
the table header column names, and move the 'View Raw Index Definition'
action (now with an eye icon) to the top-right of the detail card.
Replace the Create Index dialog with an OverlayDrawer pinned to the right
(position=end), organised into titled sections with brief explanations and
a scrollable body. The form state is preserved on close so users don't
lose a half-built compound index; a 'Reset form' button clears it on
demand (state also resets after a successful create). On success we now
show a VS Code information message via a new common displayInformationMessage
procedure. Note: true build progress isn't available from the driver
(createIndex resolves only on completion); we show an indeterminate
'Creating…' state — currentOp polling is a possible future enhancement.
@github-actions

Copy link
Copy Markdown
Contributor

✅ Code Quality Checks

Check Status How to fix
Localization (l10n) ✅ Passed
ESLint ✅ Passed
Prettier formatting ✅ Passed

This comment is updated automatically on each push.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

4 participants