diff --git a/src/FilterLists.Web.V2/src/components/listsTable/ListsTable.tsx b/src/FilterLists.Web.V2/src/components/listsTable/ListsTable.tsx
index 538a37129..a86cdf68d 100644
--- a/src/FilterLists.Web.V2/src/components/listsTable/ListsTable.tsx
+++ b/src/FilterLists.Web.V2/src/components/listsTable/ListsTable.tsx
@@ -12,7 +12,7 @@ import { nameof } from '../../utils';
import { Description } from '../Description';
import { LanguageCloud } from '../languageCloud';
import { ListInfoButton } from '../ListInfoButton';
-import { SoftwareCloud } from '../softwareCloud';
+import { SoftwareCloud, SoftwareIcon } from '../softwareCloud';
import { TagCloud } from '../tagCloud';
import { arraySorter } from './arraySorter';
import styles from './ListsTable.module.css';
@@ -87,6 +87,14 @@ export const ListsTable = (props: RouteComponentProps & Props) => {
}}
width={143}
className={styles.nogrow}
+ filters={software.map(s => ({
+ text: <>
+
+ {s.name}
+ >,
+ value: s.name
+ }))}
+ onFilter={(value, record) => software.filter((s: Software) => s.name === value).flatMap(s => s.syntaxIds).includes(record.syntaxId)}
render={(syntaxId: number) =>
syntaxId
? s.syntaxIds.includes(syntaxId))} />
diff --git a/src/FilterLists.Web.V2/src/components/softwareCloud/index.ts b/src/FilterLists.Web.V2/src/components/softwareCloud/index.ts
index 065277b3b..212ee46c3 100644
--- a/src/FilterLists.Web.V2/src/components/softwareCloud/index.ts
+++ b/src/FilterLists.Web.V2/src/components/softwareCloud/index.ts
@@ -1,3 +1,4 @@
import { SoftwareCloud } from './SoftwareCloud';
+import { SoftwareIcon } from './SoftwareIcon';
-export { SoftwareCloud };
\ No newline at end of file
+export { SoftwareCloud, SoftwareIcon };
\ No newline at end of file
diff --git a/src/FilterLists.Web.V2/src/hooks/useLanguages.tsx b/src/FilterLists.Web.V2/src/hooks/useLanguages.tsx
index 862aee4cf..ed67cd574 100644
--- a/src/FilterLists.Web.V2/src/hooks/useLanguages.tsx
+++ b/src/FilterLists.Web.V2/src/hooks/useLanguages.tsx
@@ -1,4 +1,5 @@
import { Language } from '../interfaces/Language';
import { useApiData } from './useApiData';
-export const useLanguages = () => useApiData("/api/v1/languages") || [];
\ No newline at end of file
+export const useLanguages = () => (useApiData("/api/v1/languages") || [])
+ .sort((a: Language, b: Language) => a.name.localeCompare(b.name));
\ No newline at end of file
diff --git a/src/FilterLists.Web.V2/src/hooks/useLicenses.tsx b/src/FilterLists.Web.V2/src/hooks/useLicenses.tsx
index d11b6868c..0704ae603 100644
--- a/src/FilterLists.Web.V2/src/hooks/useLicenses.tsx
+++ b/src/FilterLists.Web.V2/src/hooks/useLicenses.tsx
@@ -1,4 +1,5 @@
import { License } from '../interfaces/License';
import { useApiData } from './useApiData';
-export const useLicenses = () => useApiData("/api/v1/licenses") || [];
\ No newline at end of file
+export const useLicenses = () => (useApiData("/api/v1/licenses") || [])
+ .sort((a: License, b: License) => a.name.localeCompare(b.name));
\ No newline at end of file
diff --git a/src/FilterLists.Web.V2/src/hooks/useLists.tsx b/src/FilterLists.Web.V2/src/hooks/useLists.tsx
index b75846434..f01f960ef 100644
--- a/src/FilterLists.Web.V2/src/hooks/useLists.tsx
+++ b/src/FilterLists.Web.V2/src/hooks/useLists.tsx
@@ -6,5 +6,6 @@ import { useApiData } from './useApiData';
export const useLists = () => {
const lists = useApiData("/api/v1/lists");
lists && lists.forEach(l => l.slug = slugify(l.name));
- return lists || [];
+ return (lists || [])
+ .sort((a: List, b: List) => a.name.localeCompare(b.name));
};
\ No newline at end of file
diff --git a/src/FilterLists.Web.V2/src/hooks/useSoftware.tsx b/src/FilterLists.Web.V2/src/hooks/useSoftware.tsx
index 18507c98f..2e21c1e0c 100644
--- a/src/FilterLists.Web.V2/src/hooks/useSoftware.tsx
+++ b/src/FilterLists.Web.V2/src/hooks/useSoftware.tsx
@@ -1,4 +1,5 @@
import { Software } from '../interfaces/Software';
import { useApiData } from './useApiData';
-export const useSoftware = () => useApiData("/api/v1/software") || [];
\ No newline at end of file
+export const useSoftware = () => (useApiData("/api/v1/software") || [])
+ .sort((a: Software, b: Software) => a.name.localeCompare(b.name));
\ No newline at end of file
diff --git a/src/FilterLists.Web.V2/src/hooks/useSyntaxes.tsx b/src/FilterLists.Web.V2/src/hooks/useSyntaxes.tsx
index 24415f461..8a61eb92b 100644
--- a/src/FilterLists.Web.V2/src/hooks/useSyntaxes.tsx
+++ b/src/FilterLists.Web.V2/src/hooks/useSyntaxes.tsx
@@ -1,4 +1,5 @@
import { Syntax } from '../interfaces/Syntax';
import { useApiData } from './useApiData';
-export const useSyntaxes = () => useApiData("/api/v1/syntaxes") || [];
\ No newline at end of file
+export const useSyntaxes = () => (useApiData("/api/v1/syntaxes") || [])
+ .sort((a: Syntax, b: Syntax) => a.name.localeCompare(b.name));
\ No newline at end of file
diff --git a/src/FilterLists.Web.V2/src/hooks/useTags.tsx b/src/FilterLists.Web.V2/src/hooks/useTags.tsx
index 1840726a4..6495c363a 100644
--- a/src/FilterLists.Web.V2/src/hooks/useTags.tsx
+++ b/src/FilterLists.Web.V2/src/hooks/useTags.tsx
@@ -1,4 +1,5 @@
import { Tag } from '../interfaces/Tag';
import { useApiData } from './useApiData';
-export const useTags = () => useApiData("/api/v1/tags") || [];
\ No newline at end of file
+export const useTags = () => (useApiData("/api/v1/tags") || [])
+ .sort((a: Tag, b: Tag) => a.name.localeCompare(b.name));
\ No newline at end of file