MCPcopy Create free account
hub / github.com/coder/coder / useTemplateFilterMenu

Function useTemplateFilterMenu

site/src/pages/WorkspacesPage/filter/menus.tsx:20–56  ·  view source on GitHub ↗
({
	value,
	onChange,
}: Pick<UseFilterMenuOptions, "value" | "onChange">)

Source from the content-addressed store, hash-verified

18import { getDisplayWorkspaceStatus } from "#/utils/workspace";
19
20export const useTemplateFilterMenu = ({
21 value,
22 onChange,
23}: Pick<UseFilterMenuOptions, "value" | "onChange">) => {
24 return useFilterMenu({
25 onChange,
26 value,
27 id: "template",
28 getSelectedOption: async () => {
29 // Show all templates including deprecated
30 const templates = await API.getTemplates();
31 const template = templates.find((template) => template.name === value);
32 if (template) {
33 return {
34 label: template.display_name || template.name,
35 value: template.name,
36 startIcon: <TemplateAvatar template={template} />,
37 } satisfies SelectFilterOption;
38 }
39 return null;
40 },
41 getOptions: async (query) => {
42 // Show all templates including deprecated
43 const templates = await API.getTemplates();
44 const filteredTemplates = templates.filter(
45 (template) =>
46 template.name.toLowerCase().includes(query.toLowerCase()) ||
47 template.display_name.toLowerCase().includes(query.toLowerCase()),
48 );
49 return filteredTemplates.map((template) => ({
50 label: template.display_name || template.name,
51 value: template.name,
52 startIcon: <TemplateAvatar template={template} />,
53 }));
54 },
55 });
56};
57
58const TemplateAvatar: FC<{ template: Template }> = ({ template }) => {
59 return (

Callers 1

useWorkspacesFilterFunction · 0.90

Calls 3

useFilterMenuFunction · 0.90
findMethod · 0.80
filterMethod · 0.80

Tested by

no test coverage detected