feat(collectionView): add Index Management tab#732
Open
khelanmodi wants to merge 36 commits into
Open
Conversation
Contributor
There was a problem hiding this comment.
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
indexViewRoutertRPC router and mounts it undermongoClusters.indexViewin the root webviewappRouter. - 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
force-pushed
the
dev/khelanmodi/index-management-ui
branch
from
June 3, 2026 19:49
98e708c to
72ddf92
Compare
…ui' into copilot/index-management-ui-webview-migration # Conflicts: # l10n/bundle.l10n.json
…soft/vscode-ext-webview
…crosoft/vscode-ext-webview (#781)
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.
…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.
Contributor
📦 Build Size Report
Download artifact · updated automatically on each push. |
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.
Contributor
✅ Code Quality Checks
This comment is updated automatically on each push. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
feat(collectionView): Index Management tab
Summary
Adds an Indexes tab inside the existing
CollectionView(betweenResults 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
ClustersClientis in place, but everyintegration point is annotated for the backend engineer to validate
end-to-end against the real cluster surface.
What ships in this PR (UI only)
CollectionView(no new webview, no new command,no new context-menu entry). Renders when
selectedTab === 'tab_indexes'.toolbar swaps its Find Query action for Create Index while on the
Indexes tab. Triggered via a
documentdb:openCreateIndexcustom eventso the toolbar stays decoupled from the tab internals.
Indexes tab; visible on Results / Query Insights as before.
(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.
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).— no new colors, fonts, spacing units, or runtime dependencies.
Backend integration surface — for the backend engineer
All UI ↔ backend traffic flows through one file:
The top of the file has a
BACKEND INTEGRATION SURFACEbanner andevery procedure is preceded by a
// BACKEND INTEGRATION POINT — <procedureName>block that documents:ClustersClientmethod is currently called,Search the file for
BACKEND INTEGRATION POINTto walk through them.Procedure inventory
getInfolistIndexesClustersClient.listIndexes+getCollectionStats+getIndexStatsgetCollectionDocumentCountClustersClient.getCollectionStatsgetFieldSuggestionsSchemaStore.getInstance().getKnownFields(in-process; no backend call)createIndexClustersClient.createIndexdropIndexClustersClient.dropIndexhideIndex/unhideIndexClustersClient.{hide,unhide}IndexAll of the above
ClustersClientmethods already exist; the router callsthem through their existing signatures and shapes the response into the
view-model types in
./types.ts. If you need to change the underlyingtransport (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)
behaviour and surface a better error if the index is mid-build.
don't support
collMod { hidden }. Return a typed error so the UIcan disable the toggle proactively.
IndexRow.notespersistence — the field is read-only today;wire up storage when product confirms scope.
$search, vector) are intentionally notsurfaced in v1 — confirm we want to keep them filtered out.
this PR. If product wants it back, the agreed pattern is "delete +
open Create dialog pre-filled".
Files changed
src/webviews/documentdb/collectionView/CollectionView.tsxsrc/webviews/documentdb/collectionView/components/toolbar/ToolbarMainView.tsxsrc/webviews/documentdb/indexView/(new folder)src/webviews/_integration/appRouter.tsmongoClusters.indexView.Local testing
npm run buildVerification
npm run l10nnpm run prettier-fixnpm run lintnpx jest --no-coveragenpm run buildnpm run package