From 852e532aa4c414f710f6e45dc05b39fb07f7d08e Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Fri, 6 Sep 2019 20:35:28 -0500 Subject: [PATCH] add Maintainer column to grid closes #950 --- .../src/components/listsTable/ListsTable.tsx | 27 ++++++++++++++++++- .../components/listsTable/ListsTableHoc.tsx | 4 ++- .../MaintainerCloud.module.css | 7 +++++ .../maintainerCloud/MaintainerCloud.tsx | 26 ++++++++++++++++++ .../src/components/maintainerCloud/index.ts | 3 +++ src/FilterLists.Web/src/hooks/index.ts | 18 +++++++------ .../src/hooks/useMaintainers.tsx | 5 ++++ .../src/interfaces/Maintainer.ts | 8 ++++++ 8 files changed, 88 insertions(+), 10 deletions(-) create mode 100644 src/FilterLists.Web/src/components/maintainerCloud/MaintainerCloud.module.css create mode 100644 src/FilterLists.Web/src/components/maintainerCloud/MaintainerCloud.tsx create mode 100644 src/FilterLists.Web/src/components/maintainerCloud/index.ts create mode 100644 src/FilterLists.Web/src/hooks/useMaintainers.tsx create mode 100644 src/FilterLists.Web/src/interfaces/Maintainer.ts diff --git a/src/FilterLists.Web/src/components/listsTable/ListsTable.tsx b/src/FilterLists.Web/src/components/listsTable/ListsTable.tsx index 081c9003d..a0af9acb4 100644 --- a/src/FilterLists.Web/src/components/listsTable/ListsTable.tsx +++ b/src/FilterLists.Web/src/components/listsTable/ListsTable.tsx @@ -7,12 +7,14 @@ import { useSearchColumnFilter, useTablePageSizer } from '../../hooks'; import { Language } from '../../interfaces/Language'; import { License } from '../../interfaces/License'; import { List } from '../../interfaces/List'; +import { Maintainer } from '../../interfaces/Maintainer'; import { Software } from '../../interfaces/Software'; import { Tag as TagInterface } from '../../interfaces/Tag'; import { nameof } from '../../utils'; import { Description } from '../Description'; import { LanguageCloud } from '../languageCloud'; import { ListInfoButton } from '../ListInfoButton'; +import { MaintainerCloud } from '../maintainerCloud'; import { SoftwareCloud, SoftwareIcon } from '../softwareCloud'; import { TagCloud } from '../tagCloud'; import { arraySorter } from './arraySorter'; @@ -22,12 +24,13 @@ interface Props { lists: List[]; languages: Language[]; licenses: License[]; + maintainers: Maintainer[]; software: Software[]; tags: TagInterface[]; }; export const ListsTable = (props: RouteComponentProps & Props) => { - const { lists, languages, licenses, software, tags, ...routeComponentProps } = props; + const { lists, languages, licenses, maintainers, software, tags, ...routeComponentProps } = props; const tablePageSize = useTablePageSizer(); const searchNameColumn = useSearchColumnFilter(nameof("name")); const searchDescriptionColumn = useSearchColumnFilter(nameof("description")); @@ -152,6 +155,28 @@ export const ListsTable = (props: RouteComponentProps & Props) => { tagIds ? tagIds.includes(t.id))} /> : null} />} + {tablePageSize.isNarrowWindow + ? null + : + title="Maintainers" + dataIndex={nameof("maintainerIds")} + sorter={(a, b) => arraySorter(a.maintainerIds, b.maintainerIds, maintainers)} + width={191} + className={styles.nogrow} + filters={maintainers.map(t => ({ + text: <> + {t.name} + ({visibleLists.filter(l => l.maintainerIds && l.maintainerIds.includes(t.id)).length}) + , + value: t.id.toString() + }))} + onFilter={(value, record) => record.maintainerIds + ? record.maintainerIds.includes(+value) + : false} + render={(maintainerIds: number[]) => + maintainerIds + ? maintainerIds.includes(t.id))} /> + : null} />} ); }; \ No newline at end of file diff --git a/src/FilterLists.Web/src/components/listsTable/ListsTableHoc.tsx b/src/FilterLists.Web/src/components/listsTable/ListsTableHoc.tsx index 1c0c39481..fd4da339d 100644 --- a/src/FilterLists.Web/src/components/listsTable/ListsTableHoc.tsx +++ b/src/FilterLists.Web/src/components/listsTable/ListsTableHoc.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { RouteComponentProps } from 'react-router-dom'; -import { useLanguages, useLicenses, useLists, useSoftware, useSyntaxes, useTags } from '../../hooks'; +import { useLanguages, useLicenses, useLists, useMaintainers, useSoftware, useSyntaxes, useTags } from '../../hooks'; import { ListDrawer } from './ListDrawer'; import { ListsTable } from './ListsTable'; @@ -9,6 +9,7 @@ export const ListsTableHoc = (props: RouteComponentProps) => { const lists = useLists(); const languages = useLanguages(); const licenses = useLicenses(); + const maintainers = useMaintainers(); const software = useSoftware(); const syntaxes = useSyntaxes(); const tags = useTags(); @@ -18,6 +19,7 @@ export const ListsTableHoc = (props: RouteComponentProps) => { lists={lists} languages={languages} licenses={licenses} + maintainers={maintainers} software={software} tags={tags} {...props} /> diff --git a/src/FilterLists.Web/src/components/maintainerCloud/MaintainerCloud.module.css b/src/FilterLists.Web/src/components/maintainerCloud/MaintainerCloud.module.css new file mode 100644 index 000000000..879bc4070 --- /dev/null +++ b/src/FilterLists.Web/src/components/maintainerCloud/MaintainerCloud.module.css @@ -0,0 +1,7 @@ +.grow { + /* allow for 2nd row's tags' bottom border to not be chopped in AllListsTable */ + max-height: none !important; + + /* leave vertical gap between rows of tags */ + line-height: 28px; +} diff --git a/src/FilterLists.Web/src/components/maintainerCloud/MaintainerCloud.tsx b/src/FilterLists.Web/src/components/maintainerCloud/MaintainerCloud.tsx new file mode 100644 index 000000000..90d9fff0c --- /dev/null +++ b/src/FilterLists.Web/src/components/maintainerCloud/MaintainerCloud.tsx @@ -0,0 +1,26 @@ +import { Tag } from 'antd'; +import React from 'react'; + +import { Maintainer } from '../../interfaces/Maintainer'; +import styles from './MaintainerCloud.module.css'; + +interface Props { + maintainers: Maintainer[]; +}; + +export const MaintainerCloud = (props: Props) => + props.maintainers && props.maintainers.length + ?
+ {props.maintainers.map((m: Maintainer, i: number) => + m.homeUrl + ? + + {m.name} + + + : {m.name})} +
+ : null; \ No newline at end of file diff --git a/src/FilterLists.Web/src/components/maintainerCloud/index.ts b/src/FilterLists.Web/src/components/maintainerCloud/index.ts new file mode 100644 index 000000000..d7e5ed272 --- /dev/null +++ b/src/FilterLists.Web/src/components/maintainerCloud/index.ts @@ -0,0 +1,3 @@ +import { MaintainerCloud } from './MaintainerCloud'; + +export { MaintainerCloud }; \ No newline at end of file diff --git a/src/FilterLists.Web/src/hooks/index.ts b/src/FilterLists.Web/src/hooks/index.ts index 1c59895ce..80f36753c 100644 --- a/src/FilterLists.Web/src/hooks/index.ts +++ b/src/FilterLists.Web/src/hooks/index.ts @@ -1,6 +1,7 @@ import { useLanguages } from './useLanguages'; import { useLicenses } from './useLicenses'; import { useLists } from './useLists'; +import { useMaintainers } from './useMaintainers'; import { useSearchColumnFilter } from './useSearchColumnFilter'; import { useSoftware } from './useSoftware'; import { useSyntaxes } from './useSyntaxes'; @@ -8,12 +9,13 @@ import { useTablePageSizer } from './useTablePageSizer'; import { useTags } from './useTags'; export { - useLanguages, - useLicenses, - useLists, - useSearchColumnFilter, - useSoftware, - useSyntaxes, - useTablePageSizer, - useTags + useLanguages, + useLicenses, + useLists, + useMaintainers, + useSearchColumnFilter, + useSoftware, + useSyntaxes, + useTablePageSizer, + useTags }; \ No newline at end of file diff --git a/src/FilterLists.Web/src/hooks/useMaintainers.tsx b/src/FilterLists.Web/src/hooks/useMaintainers.tsx new file mode 100644 index 000000000..69bcb8dfe --- /dev/null +++ b/src/FilterLists.Web/src/hooks/useMaintainers.tsx @@ -0,0 +1,5 @@ +import { Maintainer } from '../interfaces/Maintainer'; +import { useApiData } from './useApiData'; + +export const useMaintainers = () => (useApiData("/api/v1/maintainers") || []) + .sort((a: Maintainer, b: Maintainer) => a.name.localeCompare(b.name)); \ No newline at end of file diff --git a/src/FilterLists.Web/src/interfaces/Maintainer.ts b/src/FilterLists.Web/src/interfaces/Maintainer.ts new file mode 100644 index 000000000..794b934a9 --- /dev/null +++ b/src/FilterLists.Web/src/interfaces/Maintainer.ts @@ -0,0 +1,8 @@ +export interface Maintainer { + id: number; + emailAddress: string; + filterListIds: number[]; + homeUrl: string; + name: string; + twitterHandle: string; +}; \ No newline at end of file