@@ -7,7 +7,11 @@ import EditableConfigList, {
77} from "./EditableConfigList" ;
88import { connect } from "react-redux" ;
99import ActionCreator from "../actions" ;
10- import { IndividualAdminsData , IndividualAdminData } from "../interfaces" ;
10+ import {
11+ IndividualAdminsData ,
12+ IndividualAdminData ,
13+ AdminRoleData ,
14+ } from "../interfaces" ;
1115import Admin from "../models/Admin" ;
1216import IndividualAdminEditForm from "./IndividualAdminEditForm" ;
1317
@@ -30,6 +34,88 @@ export class IndividualAdmins extends EditableConfigList<
3034 admin : PropTypes . object . isRequired ,
3135 } ;
3236
37+ private getRolesSummary (
38+ item : IndividualAdminData
39+ ) : Array < { label : string ; suffix ?: string ; href ?: string } > {
40+ const roles : AdminRoleData [ ] = item . roles || [ ] ;
41+
42+ if ( roles . some ( ( r ) => r . role === "system" ) ) {
43+ return [ { label : "sysadmin" } ] ;
44+ }
45+
46+ const allLibraries : Array < {
47+ short_name : string ;
48+ name ?: string ;
49+ uuid ?: string ;
50+ } > = ( this . props . data as any ) ?. allLibraries || [ ] ;
51+
52+ const getLibraryName = ( shortName : string ) =>
53+ allLibraries . find ( ( l ) => l . short_name === shortName ) ?. name || shortName ;
54+
55+ const getLibraryHref = ( shortName : string ) => {
56+ const uuid = allLibraries . find ( ( l ) => l . short_name === shortName ) ?. uuid ;
57+ return uuid ? `/admin/web/config/libraries/edit/${ uuid } ` : undefined ;
58+ } ;
59+
60+ const result : Array < { label : string ; suffix ?: string ; href ?: string } > = [ ] ;
61+
62+ if ( roles . some ( ( r ) => r . role === "manager-all" ) ) {
63+ result . push ( { label : "All libraries" , suffix : " - Manager" } ) ;
64+ } else if ( roles . some ( ( r ) => r . role === "librarian-all" ) ) {
65+ result . push ( { label : "All libraries" , suffix : " - Librarian" } ) ;
66+ }
67+
68+ const libraryHighestRole : Record < string , "manager" | "librarian" > = { } ;
69+ for ( const r of roles ) {
70+ if ( r . library ) {
71+ if ( r . role === "manager" ) {
72+ libraryHighestRole [ r . library ] = "manager" ;
73+ } else if (
74+ r . role === "librarian" &&
75+ libraryHighestRole [ r . library ] !== "manager"
76+ ) {
77+ libraryHighestRole [ r . library ] = "librarian" ;
78+ }
79+ }
80+ }
81+
82+ for ( const [ shortName , role ] of Object . entries ( libraryHighestRole ) ) {
83+ result . push ( {
84+ label : getLibraryName ( shortName ) ,
85+ suffix : role === "manager" ? " - Manager" : " - Librarian" ,
86+ href : getLibraryHref ( shortName ) ,
87+ } ) ;
88+ }
89+
90+ result . sort ( ( a , b ) => a . label . localeCompare ( b . label ) ) ;
91+ return result ;
92+ }
93+
94+ protected getAssociatedItems (
95+ item : IndividualAdminData
96+ ) : Array < any > | undefined {
97+ if ( ! item . roles ) return undefined ;
98+ return this . getRolesSummary ( item ) ;
99+ }
100+
101+ protected formatAssociatedCount ( count : number ) : string {
102+ return count === 0 ? "no roles" : count === 1 ? "1 role" : `${ count } roles` ;
103+ }
104+
105+ protected renderAssociatedSection ( item : IndividualAdminData ) : JSX . Element {
106+ const summary = this . getRolesSummary ( item ) ;
107+ return (
108+ < ul className = "associated-libraries" >
109+ { summary . map ( ( entry , i ) => (
110+ < li key = { i } >
111+ { entry . href ? < a href = { entry . href } > { entry . label } </ a > : entry . label }
112+ { entry . suffix }
113+ </ li >
114+ ) ) }
115+ </ ul >
116+ ) ;
117+ }
118+
33119 canCreate ( ) {
34120 return (
35121 this . context . admin && this . context . admin . isLibraryManagerOfSomeLibrary ( )
0 commit comments