Search and navigation
Two search modes, six layered tools, and a fully keyboard-driven flow — find any of 17,500+ ACI classes in two keystrokes, or browse a whole package when you don't remember the name.
A typical MIM load registers around 17,500 classes. The browser exposes every one of them through a layered search surface: a mode toggle on top, a search box that's smart about slashes, a package combobox, an AI suggester, four filter chips, and full keyboard navigation. Every layer composes — they all narrow the same result list.
The two search modes
The mode tabs sit just above the search input (hidden in child mode, where scoping is already CONTAINS-only).
By class (default)
Searches the class itself — name, label, description, comment, and (when slashes are present) DN format. Results are scored across multiple tiers:
| Tier | Score | Match | Chip |
|---|---|---|---|
| Exact | 100 | className equals query | — (no chip) |
| Prefix | 75 | className starts with query | — |
| DN pattern | 60 | a dnFormats[] entry contains the query | dn |
| Contains | 50 | className contains query (not prefix) | sub |
| Label | 25 | label contains query, name doesn't | label |
| Description | 20 | description contains query, name/label don't | desc |
| Fulltext (fuzzy) | dynamic | Lucene full-text index, typo-tolerant | fuzzy |
| Note | 200 | a favorite's note matches | note |
The chip appears in the list row so you know why a class matched. For desc matches, the first ~120 chars of the description show as a preview line under the label.
By property
Switches the search target to property names and labels. Use this when you know the field but not the class — encap, mac, dn, subject, prio. Each result lists up to five matched property names as small chips below the class.
fvAEPg [fv]
ApplicationEPG
encap encapMode
vmmEpPD [vmm]
EpP Definition
encap primaryEncap encapAllocKey encapModeOverrideProperty mode requires at least 2 characters (so e doesn't dump 5,000 rows). It's disabled in child mode because parent-child scoping already picks a single hierarchy.
When to use which: if your sentence has the word "class" in it ("the BGP peer class") → by class. If it has "field" or "property" ("the encap field") → by property. The novice question — "which class even has this?" — is what By property solves in one keystroke.
Typed search
The search box hits Neo4j with a 250 ms debounce — fast enough that focus never feels laggy, slow enough not to thrash.
- One character is enough. Single-letter queries narrow the index meaningfully when combined with a package filter; on their own they show prefix matches.
- Case is irrelevant.
bdfindsfvBD,fabricBD, anything containing those letters. - The slash triggers DN search. Type
uni/tn-or/BD-or/epg-and the search switches to scanningdnFormats[]entries. Useful when you know the URL fragment but not the class name. - Notes count as matches. Favorites you've tagged with a note are searched too. "interface stats" finds your starred
eqptIngrBytes5minif you noted it that way.
Clear the search to return to the default landing (Trending / Common roots / Favorites / Recent — see below).
Browse mode
Pick a package from the combobox, leave the search box empty: Fabrik lists every class in that package, alphabetically, up to 200 rows. Filter chips still apply, so the list is already trimmed of monitoring/deprecated noise.
This is the discovery mode — "what's even in the coop package?" — that flat search couldn't answer because nobody knows enough class names to type the right starting letter.
Package combobox
Every ACI class belongs to a package (fv, vz, bgp, l3ext, eqpt, and 100+ more). The combobox in the search bar narrows results to one package.
- Searchable. Type
cooporlacpto find packages that aren't in the top 15 — the old fixed dropdown couldn't reach them. The picker has a search input at the top. - Top section pinned. The 15 highest-volume packages stay at the top of the picker for one-click access; everything else is alphabetised below.
- One-click clear. When a package is selected, the picker shows an
Xyou can tap to reset to All Packages without opening the dropdown. - Class counts visible. Every entry shows its size (
fv (312)) so you know what you're committing to.
Picking a package while a search is active filters the search results to that package. Clearing the search but keeping the package opens browse mode.
Filter chips
Sit just under the search input (hidden in child mode). Each is a toggle; all four are ON by default. Each chip shows an eye icon that mirrors what the chip does right now — closed eye (EyeOff) means the category is currently hidden, open eye (Eye) means it's currently visible. Click to flip.
| Chip | What it hides when active | Why default ON |
|---|---|---|
monitoring/stats | Classes whose names contain stats, ag15min, ag1h, ag5min, fault, health, trend, threshold, event, record. ACI ships ~500 such classes. | They're rarely the subject of a query — they're almost always operational metadata you'd join into a structural query. |
deprecated | Classes Cisco marked isDeprecated=true. | Picking one means picking technology Cisco has already declared end-of-life. |
abstract | Classes Cisco marked isAbstract=true — they don't have direct instances, only concrete subclasses. | Querying an abstract class usually returns 0 rows; picking one is almost always a mistake. |
hidden | Classes Cisco marked isHidden=true. | These are MIM internals not intended for external query. |
Click any chip to widen the search — the eye opens and the category appears in the result list. The state is persisted in localStorage (fabrik_class_filter_flags_v1) so your preference follows you across sessions on the same browser. Filter flags are sent to the backend as query parameters (excludeDeprecated=1, etc.) so filtering happens in Cypher — payloads stay small.
The first time a search returns "no results," check the chips — you may have hidden the only matches. Toggle monitoring/stats off if you're explicitly looking for fault or stats classes.
AI suggest
The sparkle icon next to the search box opens a violet input. Type a natural-language description — "BGP peer neighbors," "bridge domain subnets," "interfaces that are down" — and Fabrik asks the configured LLM to propose classes.
Every proposed class is MIM-validated before display:
- The LLM returns a JSON array of class names.
- Each name is checked against Neo4j (
get_class_by_name). - Names that don't exist are dropped silently — hallucinations never reach the UI.
- In child mode, the parent class is passed in as context, and any name that isn't a valid CONTAINS-child of that parent is also dropped.
Results show with a violet MIM validated header. Click a row to confirm; the dialog closes and adds the class.
AI suggest counts against your daily AI quota (one call per Suggest button press, configurable in admin settings). When AI is unavailable or disabled, the sparkle icon is hidden — the rest of the browser still works.
Keyboard navigation
The dialog is fully keyboard-driven, and so is the inline EnhancedClassSelector (used by ChainNode and other places that pick a class without opening the full dialog).
| Keys | Action |
|---|---|
↑ / ↓ | Move focus up and down the list. Focused row gets a primary-coloured border on the left. |
Enter | Confirm the focused class (same as clicking Confirm). |
Esc | Clear the search if non-empty; otherwise close the dialog. |
Double-click | Confirm without reaching for the footer. |
When the AI input is open, Enter runs Suggest; list nav resumes when focus leaves the input. The same applies to the favorite-note input and the inline note editor.
The focused row scrolls into view automatically — long lists won't trap focus off-screen.
Result layout
The left panel is one scrolling column with section headers that appear when relevant. Order top-to-bottom:
- AI Suggestions — only when AI input is open and results exist. Violet header,
MIM validatedtag. - Reference Targets (child mode, opt-in) — amber header, marked
read-only. See 3.1 below. - Suggested (child mode, default state) — top 25 useful children of the parent (stats-filtered), pulled from the
getClassInsightsendpoint. - Trending in your org (root mode, default state) — top 10 classes other users have added recently, last 30 days.
- Common roots (root mode, fallback when nothing else lands) — context-root classes (
fvTenant,polUni,fabricInst). - Favorites — pinned during normal browsing; the whole list in favorites-only mode.
- Recent — last 10 classes you added, sorted by use_count descending.
- Search results — split into Favorites match + Other matches when search is active.
Sections that would be empty are skipped — the panel is never padded with empty headings.
Reference targets (child mode, opt-in)
In child mode, the standard list comes from (parent)-[:CONTAINS]->(child) — that's the contract: confirming any of those produces a correct query. But ACI also has Rs* reference relations: fvAEPg → fvRsBd → fvBD, where fvBD is referenced from fvAEPg but is not a direct child. Adding fvBD as a child of fvAEPg would produce a wrong query.
The reference targets (read-only) toggle, just below the search bar in child mode, opts you into seeing those references. Behaviour:
- The toggle is default OFF so the contract-correct CONTAINS-only experience is preserved.
- When ON, an amber
Reference Targets · read-onlysection appears at the top of the list. - Each row shows the class name plus
via fvRsBdto identify the helper class that wires the relation. - Clicking a row opens its detail panel — exactly like a normal click.
- Confirm is disabled for these rows. The footer banner explains:
↪ fvBD is referenced from fvAEPg — it isn't a direct child and can't be added directly. Add the source class and configure its reference filters instead.
The point: senior experts can explore the full graph (Cisco's full reference structure is otherwise invisible from the picker) without risk of producing a malformed query.
Result row anatomy
Every row in any section follows the same layout, left to right:
fvAEPg [deprecated][abstract][root] desc [fv] ✏ ★
└─class name meta badges (when set) method package edit star
chip badge note
ApplicationEPG
└─Cisco label (when different from class name)
The Application Endpoint Group is a logical grouping of …
└─description preview (only when searchMethod === 'description')
encap encapMode primaryEncap
└─matched property chips (only in `By property` mode)
"EPGs I monitor weekly"
└─favorite note (when starred and a note is set)- Meta badges: colour-coded chips for
isDeprecated(red),isAbstract(amber),isContextRoot(blue),isHidden(grey). Multiple can apply. - Method chip: small uppercase chip —
desc,label,sub,fuzzy,dn,prop,note. Hidden for exact/prefix matches because the score already implies them. - Package badge: monospace, neutral, always present.
- Edit-note pencil: appears on hover for starred favorites; opens an inline editor in place.
- Star: click to favorite/unfavorite. On a non-favorite class, a single click opens a note input under the search bar; press Enter to confirm with the note, Esc to cancel.
Empty-state landings
When you open the dialog and haven't typed anything, the body shows context-aware suggestions instead of a blank panel:
- Root mode with usage history → Trending in your org (top 10) + Favorites + Recent.
- Root mode with no history yet → Common roots (
fvTenant,polUni,fabricInst, …). - Child mode → Reference Targets (if toggle ON) + Suggested (top 25 useful children) + Favorites (filtered to actual children of the parent) + Recent (same filter).
The child-mode filter is enforced by validChildrenSet — any starred or recently-used class that isn't a real CONTAINS-child of the current parent is hidden. Picking a stale favorite is impossible.
Soft warnings
The footer (above Confirm/Cancel) shows up to two banner rows when the highlighted class triggers them:
- Reference-only banner (amber, only in child mode with reference-targets ON):
↪ fvBD is referenced from fvAEPg — it isn't a direct child and can't be added directly. …
- Deprecated banner (red, any mode):
⚠ tagInst is marked deprecated in the MIM. You can still add it, but consider whether a current class fits better.
The deprecated warning is a soft warning by design — selecting a deprecated class is allowed (you may need it to edit a saved query that still references it), but you're told. The reference-only banner is enforced: Confirm is disabled.
Performance
- Debounce: 250 ms. Five rapid keystrokes produce one Neo4j round-trip, not five.
- Full-text index:
classSearchIndexcoversclassName,label,classPkg,description. Fuzzy matching (term~) is built in, sofvtenatfindsfvTenant. - Server-side filtering: all four filter chips translate to Cypher
WHEREclauses, so excluded classes never leave Neo4j. No client-side filtering of large payloads. - Stale-time cache: searches are cached for 30 seconds, MIM details for 24 hours. Re-opening the same search is instant.
- Offline fallback: when the backend is unreachable, the inline selector falls back to an IndexedDB cache populated during normal sessions. The full dialog shows a "Searching…" state until the server responds.
Troubleshooting
Search-and-browse issues that come up often:
- "Search returns nothing for a class I know exists." Check the package filter isn't set to something other than All Packages. Then check the filter chips —
monitoring/statshides ~500 classes by default,deprecatedhides anything Cisco end-of-lifed. In child mode, the class may not be a real CONTAINS-child of the parent; switch to root mode or open it from the search results in another node. - "By property mode shows nothing for
dn."dnis excluded automatically because it's a structural meta-property of every class. TrytDn,fromDn, or the specific naming property you have in mind. - "AI suggest returned a class I already knew wouldn't work." Every suggestion is MIM-validated for existence, but not all of them are best-fit. Treat the AI list as a starting point, not a ranking. Switch to
By propertyif you know the field instead. - "DN pattern search isn't finding anything."
dnFormatsis populated only for classes that have a canonical DN — abstract classes and root objects don't have one. Try searching the parent or the concrete subclass. - "The browser feels slow when I type fast." Debounce is tuned for typical typing speeds; long queries over a 17,500-class MIM can take a moment. Narrow with the package combobox first, then search inside the package.
- "I don't see AI suggest." The feature requires an LLM backend to be configured (Groq, OpenAI, Ollama). If the sparkle icon is missing, the deployment hasn't enabled it. Check Settings → AI to configure.
- "Recent is empty even though I've added classes." Recents are per-user on the backend. If you signed in as a different user, your recents are isolated. If the backend is unreachable, the dialog falls back to localStorage — check that you weren't in private/incognito browsing on first use.
- "Reference targets toggle does nothing." It's only available in child mode (when the dialog was opened to pick a child class). The dialog title shows
Child of: <parent>when you're in that mode — if it doesn't, you're in root mode and the toggle is hidden.
Search is the motor of the browser. The next page — Class detail panel — is what you see after a search lands: five tabs covering identity, properties, relationships, DN/REST shortcuts, and operational codes for the highlighted class.
Class Browser
The searchable, MIM-backed picker that turns the entire ACI Managed Information Model into a five-second lookup — for novices, operators, power users, and senior experts alike.
Class detail panel
The right-hand pane of the Class Browser — five tabs covering identity with meta badges, properties bucketed by role, the full Rs* relationship graph, DN/REST shortcuts with live examples, and operational fault and event codes.