mirror of
https://github.com/Steffo99/sophon.git
synced 2024-12-22 14:54:22 +00:00
✨ Add GroupMembersBox
This commit is contained in:
parent
eea6d14636
commit
f3069817c1
4 changed files with 75 additions and 9 deletions
|
@ -1,6 +1,6 @@
|
||||||
import * as Reach from "@reach/router"
|
import * as Reach from "@reach/router"
|
||||||
import {RouteComponentProps} from "@reach/router"
|
import {RouteComponentProps} from "@reach/router"
|
||||||
import {LayoutThreeCol} from "@steffo/bluelib-react"
|
import {Chapter, LayoutThreeCol} from "@steffo/bluelib-react"
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import {AuthorizationRouter} from "./components/authorization/AuthorizationRouter"
|
import {AuthorizationRouter} from "./components/authorization/AuthorizationRouter"
|
||||||
import {AuthorizationStepPage} from "./components/authorization/AuthorizationStepPage"
|
import {AuthorizationStepPage} from "./components/authorization/AuthorizationStepPage"
|
||||||
|
@ -9,6 +9,7 @@ import {ErrorCatcherBox} from "./components/errors/ErrorCatcherBox"
|
||||||
import {GroupCreateBox} from "./components/group/GroupCreateBox"
|
import {GroupCreateBox} from "./components/group/GroupCreateBox"
|
||||||
import {GroupDescriptionBox} from "./components/group/GroupDescriptionBox"
|
import {GroupDescriptionBox} from "./components/group/GroupDescriptionBox"
|
||||||
import {GroupListBox} from "./components/group/GroupListBox"
|
import {GroupListBox} from "./components/group/GroupListBox"
|
||||||
|
import {GroupMembersBox} from "./components/group/GroupMembersBox"
|
||||||
import {GroupRouter} from "./components/group/GroupRouter"
|
import {GroupRouter} from "./components/group/GroupRouter"
|
||||||
import {InstanceDescriptionBox} from "./components/instance/InstanceDescriptionBox"
|
import {InstanceDescriptionBox} from "./components/instance/InstanceDescriptionBox"
|
||||||
import {InstanceRouter} from "./components/instance/InstanceRouter"
|
import {InstanceRouter} from "./components/instance/InstanceRouter"
|
||||||
|
@ -48,10 +49,15 @@ function App({..._}: RouteComponentProps) {
|
||||||
<GroupCreateBox viewSet={viewSet}/>
|
<GroupCreateBox viewSet={viewSet}/>
|
||||||
</>}
|
</>}
|
||||||
selectedRoute={({selection}) => <>
|
selectedRoute={({selection}) => <>
|
||||||
|
<Chapter>
|
||||||
<GroupDescriptionBox resource={selection}/>
|
<GroupDescriptionBox resource={selection}/>
|
||||||
|
<GroupMembersBox resource={selection}/>
|
||||||
|
</Chapter>
|
||||||
<ProjectRouter
|
<ProjectRouter
|
||||||
groupPk={selection.value.slug}
|
groupPk={selection.value.slug}
|
||||||
unselectedRoute={({viewSet}) => <ProjectListBox viewSet={viewSet}/>}
|
unselectedRoute={({viewSet}) => <>
|
||||||
|
<ProjectListBox viewSet={viewSet}/>
|
||||||
|
</>}
|
||||||
selectedRoute={({selection}) => <>
|
selectedRoute={({selection}) => <>
|
||||||
<NotebookRouter
|
<NotebookRouter
|
||||||
projectPk={selection.value.slug}
|
projectPk={selection.value.slug}
|
||||||
|
|
|
@ -26,7 +26,7 @@ export function GroupCreateBox({viewSet}: GroupCreateBoxProps): JSX.Element | nu
|
||||||
|
|
||||||
const membersOptions: { [key: string]: number } | undefined =
|
const membersOptions: { [key: string]: number } | undefined =
|
||||||
React.useMemo(
|
React.useMemo(
|
||||||
() => cache.users?.resources?.filter(m => m.value.id !== authorization?.state.user?.id).map(m => {
|
() => cache?.users?.resources?.filter(m => m.value.id !== authorization?.state.user?.id).map(m => {
|
||||||
const obj: { [key: string]: number } = {}
|
const obj: { [key: string]: number } = {}
|
||||||
obj[m.value.username] = m.value.id
|
obj[m.value.username] = m.value.id
|
||||||
return obj
|
return obj
|
||||||
|
|
39
frontend/src/components/group/GroupMembersBox.tsx
Normal file
39
frontend/src/components/group/GroupMembersBox.tsx
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import {Box, Heading, Idiomatic, ListUnordered} from "@steffo/bluelib-react"
|
||||||
|
import * as React from "react"
|
||||||
|
import {useCacheContext} from "../../contexts/cache"
|
||||||
|
import {ManagedResource} from "../../hooks/useManagedViewSet"
|
||||||
|
import {SophonResearchGroup} from "../../types/SophonTypes"
|
||||||
|
|
||||||
|
|
||||||
|
export interface GroupMembersBoxProps {
|
||||||
|
resource: ManagedResource<SophonResearchGroup>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function GroupMembersBox({resource}: GroupMembersBoxProps): JSX.Element | null {
|
||||||
|
const cache = useCacheContext()
|
||||||
|
|
||||||
|
if(!cache) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
if(!cache.users) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
const trueMembers = [...new Set([resource.value.owner, ...resource.value.members])]
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Heading level={3}>
|
||||||
|
Members of <Idiomatic>{resource.value.name}</Idiomatic>
|
||||||
|
</Heading>
|
||||||
|
<ListUnordered>
|
||||||
|
{trueMembers.map((id, index) => (
|
||||||
|
<ListUnordered.Item bluelibClassNames={index === 0 ? "color-blue" : ""} key={id}>
|
||||||
|
{cache.getUserById(id)!.value.username}
|
||||||
|
</ListUnordered.Item>
|
||||||
|
))}
|
||||||
|
</ListUnordered>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
import {ManagedViewSet, useManagedViewSet} from "../hooks/useManagedViewSet"
|
import {ManagedResource, ManagedViewSet, useManagedViewSet} from "../hooks/useManagedViewSet"
|
||||||
import {WithChildren} from "../types/ExtraTypes"
|
import {WithChildren} from "../types/ExtraTypes"
|
||||||
import {SophonUser} from "../types/SophonTypes"
|
import {SophonUser} from "../types/SophonTypes"
|
||||||
|
|
||||||
|
@ -8,18 +8,19 @@ import {SophonUser} from "../types/SophonTypes"
|
||||||
* The contents of the {@link cacheContext}.
|
* The contents of the {@link cacheContext}.
|
||||||
*/
|
*/
|
||||||
type Cache = {
|
type Cache = {
|
||||||
users?: ManagedViewSet<SophonUser>,
|
users: ManagedViewSet<SophonUser> | undefined,
|
||||||
|
getUserById: (id: number) => ManagedResource<SophonUser> | undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const cacheContext = React.createContext<Cache>({})
|
const cacheContext = React.createContext<Cache | undefined>(undefined)
|
||||||
const CacheContext = cacheContext
|
const CacheContext = cacheContext
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hook to access the {@link cacheContext}.
|
* Hook to access the {@link cacheContext}.
|
||||||
*/
|
*/
|
||||||
export function useCacheContext(): Cache {
|
export function useCacheContext(): Cache | undefined {
|
||||||
return React.useContext(cacheContext)
|
return React.useContext(cacheContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,5 +36,25 @@ export function useCacheContext(): Cache {
|
||||||
export function CacheProvider({children}: WithChildren): JSX.Element {
|
export function CacheProvider({children}: WithChildren): JSX.Element {
|
||||||
const users = useManagedViewSet<SophonUser>("/api/core/users/", "id")
|
const users = useManagedViewSet<SophonUser>("/api/core/users/", "id")
|
||||||
|
|
||||||
return <CacheContext.Provider value={{users}} children={children}/>
|
const usersIdMap =
|
||||||
|
React.useMemo(
|
||||||
|
() => {
|
||||||
|
return users?.resources?.map(u => {
|
||||||
|
const obj: { [key: string]: ManagedResource<SophonUser> } = {}
|
||||||
|
obj[u.value.id.toString()] = u
|
||||||
|
return obj
|
||||||
|
}).reduce((a, b) => {
|
||||||
|
return {...a, ...b}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
[users],
|
||||||
|
)
|
||||||
|
|
||||||
|
const getUserById =
|
||||||
|
React.useCallback(
|
||||||
|
(id: number) => usersIdMap?.[id.toString()],
|
||||||
|
[usersIdMap],
|
||||||
|
)
|
||||||
|
|
||||||
|
return <CacheContext.Provider value={{users, getUserById}} children={children}/>
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue