From ca0176a53e8d1fc6d94aadb3e5267e21d73dffb8 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Fri, 28 Feb 2025 18:00:14 +0000 Subject: [PATCH] Squashed commit of the following: commit 847981ebcb6ae6aaac5463602cb185e2ade40200 Merge: 0ea6dcff0e 23f2b9ef59 Author: Kris Stern Date: Wed Feb 26 09:16:52 2025 +0800 Merge branch 'master' into add-groups-to-command-palette commit 0ea6dcff0e791c2e63d3da5b942e0524e1dc9620 Merge: c0777dbe79 68425e2cd4 Author: Kris Stern Date: Wed Feb 26 01:06:33 2025 +0800 Merge branch 'master' into add-groups-to-command-palette commit c0777dbe79b022dda8eb6f4fff117cf39064ee2b Merge: 1638afe17e c37293c52d Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon Feb 24 13:40:35 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit 1638afe17eaabc2d0cfe2a1b9240cd40df8ce4d6 Merge: c987a9e536 b97764d3fd Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Fri Feb 21 11:49:03 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit c987a9e536a56c5815d868def8c5c6a3dbf1f2d6 Merge: f909eec0d4 16748f4413 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Thu Feb 20 08:17:19 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit f909eec0d49fb71e81ceeecf5a81f4d5159a16d3 Merge: 85eedb7e88 217b0f5742 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Feb 19 16:12:45 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit 85eedb7e88c38f0ae872f2f0a0c154162cf5c455 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Feb 19 16:11:24 2025 +0000 Move to Item commit 8f4f117bac52988dc2a3e11602159304bb43fd2c Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Feb 19 15:43:50 2025 +0000 Tighten up animations + improve contrast commit d7b7d6388deb477ba0cfb07588cff9f87e144c1d Merge: 8750f7cb92 4fa61274f9 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Feb 19 08:50:45 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit 8750f7cb922e97fdb621fec6bff376786863db14 Merge: 7b527340a2 a05c33f797 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue Feb 18 21:42:31 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit 7b527340a27e81af95343e70fce8ad1a610f0850 Merge: e2c133d128 3505fb3540 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon Feb 17 20:59:02 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit e2c133d1283e7e444fd49e21a26753f2085e925c Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sun Feb 16 18:23:14 2025 +0000 Update require-changelog-label.yml commit d32a61c1eabdb66b0d8d5e3300c714de484c8989 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sun Feb 16 17:11:18 2025 +0000 Update _theme.scss commit 42ecfcac5c555800d3b24fe6af6705e62073ddec Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sun Feb 16 17:10:48 2025 +0000 Rename to Items commit cc3779171a89988d2755092cd6b490be9b3a9b86 Merge: 0f1cb2187c 2b9d4d62a6 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sun Feb 16 17:10:25 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit 0f1cb2187c66967a209e7cca34a6faf2775e6690 Merge: 04dc6cd222 9474c89bf1 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Feb 12 20:42:01 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit 04dc6cd2225f4635a5f91c648d9e3dbbb0a7350d Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue Feb 11 17:06:31 2025 +0000 Reduce spacing a touch, fix icon spacing commit 0ab3665587aec8a2c6d458bc394594299fecbbf2 Merge: 7c9e172b2f 848ac9b66a Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue Feb 11 14:44:03 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit 7c9e172b2f427ffd9b1a85594615261bea327477 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue Feb 11 11:23:27 2025 +0000 Update Messages.properties commit ec6a5e5ee01879fe817a6827ed42e238f6d46217 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue Feb 11 08:51:16 2025 +0000 Fix test commit 14a64885a2284883d86f2af8f7ce4745d34511db Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon Feb 10 16:44:39 2025 +0000 Tidy up commit 46a9e5681a98d86914123c50cec31ea6d3d01d0c Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon Feb 10 16:28:15 2025 +0000 Tidy commit d7270b1fa49b27c2005e86807400f033969d7a41 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon Feb 10 16:06:04 2025 +0000 Tidy commit b2da3f8d39c2c606c293919562528732390f386c Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon Feb 10 16:03:37 2025 +0000 Tidy up commit b746fba008faf4784747c7494a4995628c02726e Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon Feb 10 15:53:53 2025 +0000 Move to extensionpoint commit 7827304ae14cafbfc1f1500dea16881d6e4dec6a Merge: cac127d119 d03a2e11c9 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon Feb 10 15:45:28 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit cac127d1196eeda50d15457384bf57009e7a0f41 Merge: add75bf6a9 e3e3c45270 Author: Tim Jacomb <21194782+timja@users.noreply.github.com> Date: Mon Jan 13 11:03:10 2025 +0000 Merge branch 'jenkinsci:master' into add-groups-to-command-palette commit add75bf6a9605ab61bf66b9e5e736803cb836d93 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sat Jan 11 19:02:52 2025 +0000 Update _command-palette.scss commit eb4073f4fb74217d6aaf1ad960151e10318b67f0 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sat Jan 11 18:59:37 2025 +0000 Tidy up commit 323e48fddfa079550c040066272a50efdcc0ede6 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sat Jan 11 18:47:34 2025 +0000 Update Job.java commit 3cbdfbc4b5d3981c7c69c3c742127d11972e13c0 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sat Jan 11 18:47:13 2025 +0000 Update _command-palette.scss commit 8fecf0d88053b43953d25d0430e2662b8e4ec02e Merge: 428e826fcd 331c7685ca Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sat Jan 11 18:45:30 2025 +0000 Merge branch 'master' into add-groups-to-command-palette commit 428e826fcd1597f216b8534414aba45556e3ac03 Merge: 5657369d95 f1b6d31272 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon Dec 16 20:53:15 2024 +0000 Merge branch 'master' into add-groups-to-command-palette commit 5657369d9556231595c20aa2c7c8e9b3d0ae0f7c Merge: 26f17a277f 674d5085c3 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Fri Dec 13 09:46:35 2024 +0000 Merge branch 'add-icons-to-command-palette' into add-groups-to-command-palette commit 674d5085c333e3f580279ae0dbb8ce032b45c1b9 Merge: 809d2e6120 7020e80af8 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Fri Dec 13 09:42:59 2024 +0000 Merge branch 'master' into add-icons-to-command-palette commit 26f17a277f39cb27528bd647db266174a95b356e Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Dec 11 22:10:56 2024 +0000 Update _command-palette.scss commit 2b6ffc85f33c17a095dffc770b5c383293d5d261 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Dec 11 22:09:09 2024 +0000 Init commit 809d2e6120b36093c60ab88e2794d14fb3aaa5ea Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Dec 11 21:37:47 2024 +0000 Make iconXml private, rename to icon commit 3d45ca7c3926586e17f8aed1f31f556109e63ea2 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Dec 11 21:29:27 2024 +0000 Add group field commit 80f24cbfdcbadd52801c987e75cffec761df8fc6 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Dec 11 21:25:23 2024 +0000 Init commit 1b9faa8fb0c129a1543b97aae2de55f676f2cecc Merge: d6868c970a 26738449cd Author: Tim Jacomb Date: Wed Dec 11 21:11:56 2024 +0000 Merge branch 'add-icons-to-command-palette' of github.com:janfaracik/jenkins into add-icons-to-command-palette commit d6868c970a06a17633cf7d145beef28598730a0b Author: Tim Jacomb Date: Wed Dec 11 21:11:41 2024 +0000 Reword javadoc commit 26738449cd62ea3c007503c0bebff4872b1fc14b Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Dec 11 21:03:29 2024 +0000 Implement IconSpec in IComputer commit 57910109f32aa4cb2cf81188c12534f676e5a4ac Merge: 661f994783 05ed7560fd Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Dec 11 20:23:58 2024 +0000 Merge branch 'master' into add-icons-to-command-palette commit 661f994783b96c867b2b0a618e66c603d5384b40 Merge: 23570203ea dad5ef3266 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Dec 11 20:15:22 2024 +0000 Merge branch 'refine-command-palette' into add-icons-to-command-palette commit 23570203ea4eace9656825f7fb2e7233cdd59592 Merge: 436a02b9d3 788ae63c50 Author: Tim Jacomb Date: Wed Dec 11 16:35:43 2024 +0000 Merge branch 'add-icons-to-command-palette' of github.com:janfaracik/jenkins into add-icons-to-command-palette commit 436a02b9d307183e6cdedca66ec565f639896474 Author: Tim Jacomb Date: Wed Dec 11 16:35:24 2024 +0000 Add support for images commit a3fdb3e0c7df55fdf2876dc71ad0e3cda13289c5 Merge: ea67d6a554 d22cc2fa3c Author: Tim Jacomb Date: Wed Dec 11 15:27:12 2024 +0000 Merge branch 'master' into add-icons-to-command-palette commit 788ae63c5077057f5c53cf29cb61e2bbda5facb5 Merge: ea67d6a554 d22cc2fa3c Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed Dec 11 10:00:04 2024 +0000 Merge branch 'jenkinsci:master' into add-icons-to-command-palette commit dad5ef3266cf3a188a78f42c36eaa4c381e5bbf4 Merge: cc63c9c8e5 d22cc2fa3c Author: Tim Jacomb <21194782+timja@users.noreply.github.com> Date: Wed Dec 11 09:07:05 2024 +0000 Merge branch 'master' into refine-command-palette commit ea67d6a554417f3a976918b242b78ee3a816b2a9 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue Dec 10 22:26:16 2024 +0000 Update Search.java commit a9aadbab3068e2f456866523f94ff88fa9052184 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue Dec 10 22:25:40 2024 +0000 Revert "Update Search.java" This reverts commit 24837ea667183f189ee0ab73e86cb8cda58c8fe2. commit 24837ea667183f189ee0ab73e86cb8cda58c8fe2 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue Dec 10 21:59:03 2024 +0000 Update Search.java commit d43a8d3b2f4121e234ef16a7b4723e271cd9c43e Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue Dec 10 21:54:23 2024 +0000 Init commit cc63c9c8e50a27b78874ac67f48584e232c4e1b5 Author: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue Dec 10 21:37:09 2024 +0000 Refine command palette --- core/src/main/java/hudson/model/Computer.java | 6 ++ core/src/main/java/hudson/model/Item.java | 6 ++ core/src/main/java/hudson/model/User.java | 6 ++ core/src/main/java/hudson/model/View.java | 6 ++ core/src/main/java/hudson/search/Search.java | 43 ++++++++--- .../main/java/hudson/search/SearchItem.java | 5 ++ .../main/java/jenkins/search/SearchGroup.java | 73 +++++++++++++++++++ .../jenkins/search/Messages.properties | 27 +++++++ .../components/command-palette/datasources.js | 1 + .../js/components/command-palette/index.js | 23 ++++-- .../js/components/command-palette/models.js | 2 + .../js/components/command-palette/utils.js | 13 ++++ src/main/scss/abstracts/_theme.scss | 14 ++-- .../scss/components/_command-palette.scss | 37 ++++++---- .../hudson/model/AbstractProjectTest.java | 1 + 15 files changed, 225 insertions(+), 38 deletions(-) create mode 100644 core/src/main/java/jenkins/search/SearchGroup.java create mode 100644 core/src/main/resources/jenkins/search/Messages.properties create mode 100644 src/main/js/components/command-palette/utils.js diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 0c525dfabe..c6f7801270 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -110,6 +110,7 @@ import jenkins.model.DisplayExecutor; import jenkins.model.IComputer; import jenkins.model.IDisplayExecutor; import jenkins.model.Jenkins; +import jenkins.search.SearchGroup; import jenkins.security.ImpersonatingExecutorService; import jenkins.security.MasterToSlaveCallable; import jenkins.security.stapler.StaplerDispatchable; @@ -1109,6 +1110,11 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces return getUrl(); } + @Override + public SearchGroup getSearchGroup() { + return SearchGroup.get(SearchGroup.ComputerSearchGroup.class); + } + /** * {@link RetentionStrategy} associated with this computer. * diff --git a/core/src/main/java/hudson/model/Item.java b/core/src/main/java/hudson/model/Item.java index 838f4e6f75..dd2fd993cb 100644 --- a/core/src/main/java/hudson/model/Item.java +++ b/core/src/main/java/hudson/model/Item.java @@ -39,6 +39,7 @@ import hudson.util.Secret; import java.io.IOException; import java.util.Collection; import jenkins.model.Jenkins; +import jenkins.search.SearchGroup; import jenkins.util.SystemProperties; import jenkins.util.io.OnMaster; import org.kohsuke.stapler.StaplerRequest2; @@ -249,6 +250,11 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont */ void delete() throws IOException, InterruptedException; + @Override + default SearchGroup getSearchGroup() { + return SearchGroup.get(SearchGroup.ItemSearchGroup.class); + } + PermissionGroup PERMISSIONS = new PermissionGroup(Item.class, Messages._Item_Permissions_Title()); Permission CREATE = new Permission( diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index d40664ca2c..e67e2c7200 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -72,6 +72,7 @@ import jenkins.model.Jenkins; import jenkins.model.Loadable; import jenkins.model.ModelObjectWithContextMenu; import jenkins.scm.RunWithSCM; +import jenkins.search.SearchGroup; import jenkins.security.ImpersonatingUserDetailsService2; import jenkins.security.LastGrantedAuthoritiesProperty; import jenkins.security.UserDetailsCache; @@ -284,6 +285,11 @@ public class User extends AbstractModelObject implements AccessControlled, Descr return UserAvatarResolver.resolve(this, "48x48"); } + @Override + public SearchGroup getSearchGroup() { + return SearchGroup.get(SearchGroup.UserSearchGroup.class); + } + /** * The URL of the user page. */ diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index 722254572c..1f03c3f813 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -94,6 +94,7 @@ import jenkins.model.ModelObjectWithContextMenu; import jenkins.model.item_category.Categories; import jenkins.model.item_category.Category; import jenkins.model.item_category.ItemCategory; +import jenkins.search.SearchGroup; import jenkins.security.stapler.StaplerNotDispatchable; import jenkins.util.xml.XMLUtils; import jenkins.widgets.HasWidgets; @@ -565,6 +566,11 @@ public abstract class View extends AbstractModelObject implements AccessControll return "symbol-jobs"; } + @Override + public SearchGroup getSearchGroup() { + return SearchGroup.get(SearchGroup.ViewSearchGroup.class); + } + /** * Returns the transient {@link Action}s associated with the top page. * diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index 97d15b65c2..5040d9b28e 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -29,6 +29,8 @@ import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND; import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import hudson.ExtensionComponent; +import hudson.ExtensionList; import hudson.Util; import hudson.util.EditDistance; import io.jenkins.servlet.ServletExceptionWrapper; @@ -37,12 +39,16 @@ import java.io.IOException; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import jenkins.model.Jenkins; +import jenkins.search.SearchGroup; import jenkins.security.stapler.StaplerNotDispatchable; import jenkins.util.MemoryReductionUtil; import jenkins.util.SystemProperties; @@ -171,11 +177,26 @@ public class Search implements StaplerProxy { if (iconName.startsWith("symbol")) { r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), - Symbol.get(new SymbolRequest.Builder().withRaw(iconName).build()))); + Symbol.get(new SymbolRequest.Builder().withRaw(iconName).build()), "symbol", curItem.item.getSearchGroup().getDisplayName())); } else { - r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), iconName, "image")); + r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), iconName, "image", curItem.item.getSearchGroup().getDisplayName())); } } + + // Sort results by group + ExtensionList groupsExtensionList = ExtensionList.lookup(SearchGroup.class); + List> components = groupsExtensionList.getComponents(); + Map searchGroupOrdinal = components.stream() + .collect(Collectors.toMap( + (k) -> k.getInstance().getDisplayName(), + ExtensionComponent::ordinal + )); + r.suggestions.sort( + Comparator.comparingDouble((Item item) -> searchGroupOrdinal.getOrDefault(item.getGroup(), Double.MAX_VALUE)) + .reversed() + .thenComparing(item -> item.name) + ); + rsp.serveExposedBean(req, r, new ExportConfig()); } @@ -279,22 +300,19 @@ public class Search implements StaplerProxy { private final String icon; + private final String group; + public Item(String name) { - this(name, null, null); + this(name, null, null, "symbol", null); } - public Item(String name, String url, String icon) { + public Item(String name, String url, String icon, String type, String group) { this.name = name; this.url = url; this.icon = icon; - this.type = "symbol"; - } - - public Item(String name, String url, String icon, String type) { this.name = name; - this.url = url; - this.icon = icon; this.type = type; + this.group = group; } @Exported @@ -311,6 +329,11 @@ public class Search implements StaplerProxy { public String getType() { return type; } + + @Exported + public String getGroup() { + return group; + } } private enum Mode { diff --git a/core/src/main/java/hudson/search/SearchItem.java b/core/src/main/java/hudson/search/SearchItem.java index e64efb0257..5453af9f02 100644 --- a/core/src/main/java/hudson/search/SearchItem.java +++ b/core/src/main/java/hudson/search/SearchItem.java @@ -25,6 +25,7 @@ package hudson.search; import hudson.model.Build; +import jenkins.search.SearchGroup; import org.jenkins.ui.icon.IconSpec; /** @@ -63,6 +64,10 @@ public interface SearchItem { return "symbol-search"; } + default SearchGroup getSearchGroup() { + return SearchGroup.get(SearchGroup.UnclassifiedSearchGroup.class); + } + /** * Returns the {@link SearchIndex} to further search sub items inside this item. * diff --git a/core/src/main/java/jenkins/search/SearchGroup.java b/core/src/main/java/jenkins/search/SearchGroup.java new file mode 100644 index 0000000000..62ba316601 --- /dev/null +++ b/core/src/main/java/jenkins/search/SearchGroup.java @@ -0,0 +1,73 @@ +package jenkins.search; + +import static jenkins.search.Messages.SearchGroup_ComputerSearchGroup_DisplayName; +import static jenkins.search.Messages.SearchGroup_ItemSearchGroup_DisplayName; +import static jenkins.search.Messages.SearchGroup_UnclassifiedSearchGroup_DisplayName; +import static jenkins.search.Messages.SearchGroup_UserSearchGroup_DisplayName; +import static jenkins.search.Messages.SearchGroup_ViewSearchGroup_DisplayName; + +import edu.umd.cs.findbugs.annotations.NonNull; +import hudson.Extension; +import hudson.ExtensionList; +import hudson.ExtensionPoint; +import hudson.model.ModelObject; + +public interface SearchGroup extends ExtensionPoint, ModelObject { + + static ExtensionList all() { + return ExtensionList.lookup(SearchGroup.class); + } + + static @NonNull T get(Class type) { + T category = all().get(type); + if (category == null) { + throw new AssertionError("Group not found. It seems the " + type + " is not annotated with @Extension and so not registered"); + } + return category; + } + + @Extension(ordinal = -1) + class UnclassifiedSearchGroup implements SearchGroup { + + @Override + public String getDisplayName() { + return SearchGroup_UnclassifiedSearchGroup_DisplayName(); + } + } + + @Extension(ordinal = 999) + class ItemSearchGroup implements SearchGroup { + + @Override + public String getDisplayName() { + return SearchGroup_ItemSearchGroup_DisplayName(); + } + } + + @Extension + class ComputerSearchGroup implements SearchGroup { + + @Override + public String getDisplayName() { + return SearchGroup_ComputerSearchGroup_DisplayName(); + } + } + + @Extension + class ViewSearchGroup implements SearchGroup { + + @Override + public String getDisplayName() { + return SearchGroup_ViewSearchGroup_DisplayName(); + } + } + + @Extension + class UserSearchGroup implements SearchGroup { + + @Override + public String getDisplayName() { + return SearchGroup_UserSearchGroup_DisplayName(); + } + } +} diff --git a/core/src/main/resources/jenkins/search/Messages.properties b/core/src/main/resources/jenkins/search/Messages.properties new file mode 100644 index 0000000000..2b805c7fb0 --- /dev/null +++ b/core/src/main/resources/jenkins/search/Messages.properties @@ -0,0 +1,27 @@ +# The MIT License +# +# Copyright (c) 2025 Jan Faracik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +SearchGroup.UnclassifiedSearchGroup.DisplayName=Other +SearchGroup.ItemSearchGroup.DisplayName=Items +SearchGroup.ComputerSearchGroup.DisplayName=Nodes +SearchGroup.ViewSearchGroup.DisplayName=Views +SearchGroup.UserSearchGroup.DisplayName=Users diff --git a/src/main/js/components/command-palette/datasources.js b/src/main/js/components/command-palette/datasources.js index 58dd5389d5..5fb70b0afe 100644 --- a/src/main/js/components/command-palette/datasources.js +++ b/src/main/js/components/command-palette/datasources.js @@ -21,6 +21,7 @@ export const JenkinsSearchSource = { type: e.type, label: e.name, url: correctAddress(e.url), + group: e.group, }), ); }), diff --git a/src/main/js/components/command-palette/index.js b/src/main/js/components/command-palette/index.js index dd44e67b27..700e017819 100644 --- a/src/main/js/components/command-palette/index.js +++ b/src/main/js/components/command-palette/index.js @@ -5,6 +5,7 @@ import * as Symbols from "./symbols"; import makeKeyboardNavigable from "@/util/keyboard"; import { xmlEscape } from "@/util/security"; import { createElementFromHtml } from "@/util/dom"; +import { groupResultsByCategory } from "@/components/command-palette/utils"; const datasources = [JenkinsSearchSource]; @@ -68,6 +69,7 @@ function init() { label: i18n.dataset.getHelp, url: document.querySelector("body").dataset.searchHelpUrl, isExternal: true, + group: null, }), ]); } else { @@ -77,15 +79,26 @@ function init() { } results.then((results) => { + results = groupResultsByCategory(results); + // Clear current search results searchResults.innerHTML = ""; if (query.length === 0 || Object.keys(results).length > 0) { - results.forEach(function (obj) { - const link = createElementFromHtml(obj.render()); - link.addEventListener("mouseenter", (e) => itemMouseEnter(e)); - searchResults.append(link); - }); + for (const [group, items] of Object.entries(results)) { + if (group !== "null") { + const heading = document.createElement("p"); + heading.className = "jenkins-command-palette__results__heading"; + heading.innerText = group; + searchResults.append(heading); + } + + items.forEach(function (obj) { + const link = createElementFromHtml(obj.render()); + link.addEventListener("mouseenter", (e) => itemMouseEnter(e)); + searchResults.append(link); + }); + } updateSelectedItem(0); } else { diff --git a/src/main/js/components/command-palette/models.js b/src/main/js/components/command-palette/models.js index 0c6a733e0d..79d35fcf7b 100644 --- a/src/main/js/components/command-palette/models.js +++ b/src/main/js/components/command-palette/models.js @@ -7,12 +7,14 @@ import { xmlEscape } from "@/util/security"; * @param {string} params.label * @param {'symbol' | 'image'} params.type * @param {string} params.url + * @param {string | null} params.group * @param {boolean | undefined} params.isExternal */ export function LinkResult(params) { return { label: params.label, url: params.url, + group: params.group, render: () => { return `