Skip to content

Commit 61d5ce9

Browse files
Apply category filter to dev extensions in extension search
Dev extensions were not filtered by the category selector (e.g., "Themes", "Languages"). Add `filtered_dev_extension_indices` to track which dev extensions match the active `provides_filter`, and use it in rendering and list count. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 99a558f commit 61d5ce9

File tree

1 file changed

+38
-3
lines changed

1 file changed

+38
-3
lines changed

crates/extensions_ui/src/extensions_ui.rs

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ pub struct ExtensionsPage {
320320
remote_extension_entries: Vec<ExtensionMetadata>,
321321
dev_extension_entries: Vec<Arc<ExtensionManifest>>,
322322
filtered_remote_extension_indices: Vec<usize>,
323+
filtered_dev_extension_indices: Vec<usize>,
323324
query_editor: Entity<Editor>,
324325
query_contains_error: bool,
325326
provides_filter: Option<ExtensionProvides>,
@@ -381,6 +382,7 @@ impl ExtensionsPage {
381382
filter: ExtensionFilter::All,
382383
dev_extension_entries: Vec::new(),
383384
filtered_remote_extension_indices: Vec::new(),
385+
filtered_dev_extension_indices: Vec::new(),
384386
remote_extension_entries: Vec::new(),
385387
query_contains_error: false,
386388
provides_filter,
@@ -493,6 +495,19 @@ impl ExtensionsPage {
493495
})
494496
.map(|(ix, _)| ix),
495497
);
498+
499+
self.filtered_dev_extension_indices.clear();
500+
self.filtered_dev_extension_indices.extend(
501+
self.dev_extension_entries
502+
.iter()
503+
.enumerate()
504+
.filter(|(_, manifest)| match self.provides_filter {
505+
Some(provides) => dev_extension_matches_provides(manifest, provides),
506+
None => true,
507+
})
508+
.map(|(ix, _)| ix),
509+
);
510+
496511
cx.notify();
497512
}
498513

@@ -601,14 +616,15 @@ impl ExtensionsPage {
601616
cx: &mut Context<Self>,
602617
) -> Vec<ExtensionCard> {
603618
let dev_extension_entries_len = if self.filter.include_dev_extensions() {
604-
self.dev_extension_entries.len()
619+
self.filtered_dev_extension_indices.len()
605620
} else {
606621
0
607622
};
608623
range
609624
.map(|ix| {
610625
if ix < dev_extension_entries_len {
611-
let extension = &self.dev_extension_entries[ix];
626+
let dev_ix = self.filtered_dev_extension_indices[ix];
627+
let extension = &self.dev_extension_entries[dev_ix];
612628
self.render_dev_extension(extension, cx)
613629
} else {
614630
let extension_ix =
@@ -1821,7 +1837,7 @@ impl Render for ExtensionsPage {
18211837
.child(v_flex().px_4().size_full().overflow_y_hidden().map(|this| {
18221838
let mut count = self.filtered_remote_extension_indices.len();
18231839
if self.filter.include_dev_extensions() {
1824-
count += self.dev_extension_entries.len();
1840+
count += self.filtered_dev_extension_indices.len();
18251841
}
18261842

18271843
if count == 0 {
@@ -1868,3 +1884,22 @@ impl Item for ExtensionsPage {
18681884
f(*event)
18691885
}
18701886
}
1887+
1888+
fn dev_extension_matches_provides(
1889+
manifest: &ExtensionManifest,
1890+
provides: ExtensionProvides,
1891+
) -> bool {
1892+
match provides {
1893+
ExtensionProvides::Themes => !manifest.themes.is_empty(),
1894+
ExtensionProvides::IconThemes => !manifest.icon_themes.is_empty(),
1895+
ExtensionProvides::Languages => !manifest.languages.is_empty(),
1896+
ExtensionProvides::Grammars => !manifest.grammars.is_empty(),
1897+
ExtensionProvides::LanguageServers => !manifest.language_servers.is_empty(),
1898+
ExtensionProvides::ContextServers => !manifest.context_servers.is_empty(),
1899+
ExtensionProvides::AgentServers => !manifest.agent_servers.is_empty(),
1900+
ExtensionProvides::SlashCommands => !manifest.slash_commands.is_empty(),
1901+
ExtensionProvides::IndexedDocsProviders => false,
1902+
ExtensionProvides::Snippets => manifest.snippets.is_some(),
1903+
ExtensionProvides::DebugAdapters => !manifest.debug_adapters.is_empty(),
1904+
}
1905+
}

0 commit comments

Comments
 (0)