Skip to content

Commit

Permalink
Subgroup Tab
Browse files Browse the repository at this point in the history
  • Loading branch information
linathedog committed Jun 15, 2023
1 parent 41ebb42 commit 3b9cf30
Show file tree
Hide file tree
Showing 10 changed files with 141 additions and 166 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -548,4 +548,28 @@

.gm_invitation-content-container {
margin-top:1rem;
}


.gm_kebab-menu-cell {
font-size:0.9rem;
}

.gm_group-title svg {
font-size: 1.1rem;
margin-left: 0.2rem;
}

.gm_group-title svg:hover {
opacity: .5;
}

.gm_group-title {
margin-top: 1.5rem!important;
margin-left: 1.5rem!important;
}

.gm_createsub-button{
padding: 0.3rem 0.5rem !important;
font-size: 0.8rem;
}
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ export const AdminGroupPage: FC<AdminGroupPageProps> = (props)=> {


const [groupConfiguration,setGroupConfiguration] = useState({} as GroupConfiguration);
const [groupId] = useState(props.match.params.id);
const [groupId,setGroupId] = useState(props.match.params.id);
const [activeTabKey, setActiveTabKey] = React.useState<string | number>(0);
const [descriptionInput,setDescriptionInput] = useState<string>("");
const [editDescription,setEditDescription] = useState<boolean>(false);
Expand All @@ -118,10 +118,13 @@ export const AdminGroupPage: FC<AdminGroupPageProps> = (props)=> {


useEffect(()=>{

},[groupConfiguration]);


setGroupId(props.match.params.id);
},[props.match.params.id]);

useEffect(()=>{
fetchGroupConfiguration();
setActiveTabKey(0);
},[groupId]);



Expand Down Expand Up @@ -245,9 +248,9 @@ export const AdminGroupPage: FC<AdminGroupPageProps> = (props)=> {
<Tab eventKey={4} title={<TabTitleText>Group Attributes</TabTitleText>} aria-label="Default content - attributes">
<GroupAttributes groupConfiguration={groupConfiguration} setGroupConfiguration={setGroupConfiguration} fetchGroupConfiguration={fetchGroupConfiguration} updateAttributes={updateAttributes}/>
</Tab>
{/* <Tab eventKey={5} title={<TabTitleText>Sub Groups</TabTitleText>} aria-label="Default content - attributes">
<Tab eventKey={5} title={<TabTitleText>Sub Groups</TabTitleText>} aria-label="Default content - attributes">
<GroupSubGroups groupConfiguration={groupConfiguration} groupId={groupId} setGroupConfiguration={setGroupConfiguration} fetchGroupConfiguration={fetchGroupConfiguration} updateAttributes={updateAttributes}/>
</Tab> */}
</Tab>

</Tabs>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ export const AdminGroupsPage: FC<AdminGroupsPageProps> = (props) =>{
}


const GroupListItem: FC<GroupListItemProps> = ({group,appIndex,depth,fetchAdminGroups}) =>{
export const GroupListItem: FC<GroupListItemProps> = ({group,appIndex,depth,fetchAdminGroups}) =>{
useEffect(()=>{
setExpanded(false);
},[group]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ export const GroupAdmins: FC<any> = (props) => {
fetchGroupAdminIds();
},[]);

useEffect(()=>{
fetchGroupAdminIds();
},[props.groupId]);

useEffect(()=>{

if(groupIds.length>0){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,11 @@ export const GroupEnrollment: FC<any> = (props) => {
let groupsService = new GroupsServiceClient();
useEffect(()=>{
fetchGroupEnrollments();
},[])
},[]);

useEffect(()=>{
fetchGroupEnrollments();
},[props.groupId]);

let fetchGroupEnrollments = ()=>{
groupsService!.doGet<any>("/group-admin/group/"+props.groupId+"/configuration/all")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,10 @@ export const GroupMembers: FC<any> = (props) => {
fetchGroupMembers();
},[])


useEffect(()=>{
setPage(1);
fetchGroupMembers();
},[props.groupId])

useEffect(()=>{
setPage(1);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,117 +1,76 @@
import * as React from 'react';
import {FC,useState,useEffect,useRef} from 'react';
import { DataList,DataListItem,DataListItemCells,DataListItemRow,DataListCell, Button, Tooltip, DataListAction, SelectVariant, Checkbox,Select,SelectOption, FormAlert, Alert, Modal, ModalVariant, Form, FormGroup, TextInput} from '@patternfly/react-core';
// @ts-ignore
import { HttpResponse, GroupsServiceClient } from '../../groups-mngnt-service/groups.service';
// @ts-ignore
import { ConfirmationModal } from '../Modals';
import {ValidateEmail} from '../../js/utils.js'
import { Loading } from '../LoadingModal';
import { Msg } from '../../widgets/Msg';
import { GroupListItem } from '../../content/group-page/AdminGroupsPage';
import {PlusIcon } from '@patternfly/react-icons';
import { CreateSubgroupModal } from '../Modals';

interface AdminGroup{
id? : string;
name: string;
path: string;
extraSubGroups: AdminGroup[];
}

export const GroupSubGroups: FC<any> = (props) => {

const [createSubgroup,setCreateSubgroup] = useState(false);

const titleId = 'typeahead-select-id-1';
let subgroupDefault = {
name: "",
attributes: {
description: [""]
}
}
let groupsService = new GroupsServiceClient();
const [modalInfo,setModalInfo] = useState({});
const [loading,setLoading] = useState(false);
const [createModal,setCreateModal] = useState(false);
const [subGroup,setSubGroup] = useState(subgroupDefault);
const [validSubGroup,setValidSubGroup]= useState(false);

useEffect(()=>{
setValidSubGroup(subGroup.name.length>0&&subGroup.attributes.description[0].length>0);
},[subGroup]);
const emptyGroup= ()=>{
return (
<DataListItem key='emptyItem' aria-labelledby="empty-item">
<DataListItemRow key='emptyRow'>
<DataListItemCells dataListCells={[
<DataListCell key='empty'><strong>No subgroups</strong></DataListCell>
]} />
</DataListItemRow>
</DataListItem>
)
}

const createSubgroup = () =>{
setLoading(true);
groupsService!.doPost<any>("/group-admin/group/"+props.groupId+"/children",{...subGroup})
.then((response: HttpResponse<any>) => {
setLoading(false);
if(response.status===200||response.status===204){
setModalInfo({
title:"Sub Group Created",
accept_message: "OK",
accept: function(){
setModalInfo({})},
cancel: function(){
setModalInfo({})}
});
// setGroupMembers(response.data.results);
}
}).catch((err)=>{
setLoading(false);
console.log(err)})
}


return (
<React.Fragment>
<Button onClick={()=>{setCreateModal(true);}}>Create Subgroup</Button>
<Modal
variant={ModalVariant.medium}
title={"Create Subgroup"}
isOpen={createModal}
onClose={()=>{setCreateModal(false)}}
actions={[
<Tooltip {...(!!validSubGroup ? { trigger:'manual', isVisible:false }:{trigger:'mouseenter'})}
content={
<div>
Make sure you have provided all the required information
</div>
}
<CreateSubgroupModal groupId={props.groupId} active={createSubgroup} afterSuccess={()=>{props.fetchGroupConfiguration();}} close={()=>{setCreateSubgroup(false);}}/>
<DataList id="groups-list" aria-label={Msg.localize('groupLabel')} isCompact>

<DataListItem id="groups-list-header" aria-labelledby="Columns names">

<DataListItemRow className="gm_datalist-header">
<DataListItemCells
dataListCells={[
<DataListCell key='group-name-header' width={2}>
<strong><Msg msgKey='Name' /></strong>
</DataListCell>,
<DataListCell key='group-path-header' width={2}>
<strong><Msg msgKey='Path' /></strong>
</DataListCell>
]}
/>
<DataListAction
className="gm_cell-center"
aria-labelledby="check-action-item1 check-action-action2"
id="check-action-action1"
aria-label="Actions"
isPlainButtonAction
>
<div>
<Button key="confirm" variant="primary" isDisabled={!validSubGroup} onClick={()=>{createSubgroup();}}>
Create
</Button>
</div>

</Tooltip>
,

<Button key="cancel" variant="link" onClick={()=>{setCreateModal(false);}}>
Cancel
</Button>

]}
>
<Form>
<FormGroup
label="Group Name"
isRequired
fieldId="simple-form-name-01"
// helperText=""
>
<TextInput
isRequired
type="text"
id="simple-form-name-01"
name="simple-form-name-01"
aria-describedby="simple-form-name-01-helper"
value={subGroup.name}
onChange={(value)=>{console.log("This is the thing " + value); subGroup.name=value; setSubGroup({...subGroup})}}
/>
</FormGroup>
<FormGroup label="Description" isRequired fieldId="simple-form-desription-01">
<TextInput
isRequired
type="text"
id="simple-form-email-01"
name="simple-form-email-01"
value={subGroup.attributes.description[0]}
onChange={(value)=>{console.log("This is the thing " + value); subGroup.attributes.description[0]=value; setSubGroup({...subGroup})}}
/>
</FormGroup>
</Form>
</Modal>
<Loading active={loading}/>
<ConfirmationModal modalInfo={modalInfo}/>
<Tooltip content={"Create Subgroup"}>
<Button className={"gm_createsub-button"} onClick={()=>{setCreateSubgroup(true)}}><PlusIcon/></Button>
</Tooltip>
</DataListAction>

</DataListItemRow>
</DataListItem>
{props.groupConfiguration?.extraSubGroups&&props.groupConfiguration?.extraSubGroups.length>0 ?
props.groupConfiguration?.extraSubGroups.map((group:AdminGroup,appIndex:number)=>{
return(
<GroupListItem group={group as AdminGroup} fetchAdminGroups={props.fetchGroupConfiguration} appIndex={appIndex} depth={0} />
)
}):
emptyGroup()
}
</DataList>
</React.Fragment>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -290,10 +290,22 @@ const EmailStep: React.FC<any> = (props) => {
const [isOpen,setIsOpen] = useState(false);
const [selected,setSelected] = useState<any>(null);
const [options,setOptions] = useState<any>([])
const [groupIds,setGroupIds] = useState([]);



useEffect(()=>{
fetchGroupMembers();
},[])
//fetchGroupMembers();
fetchGroupAdminIds();
},[]);


useEffect(()=>{
if(groupIds.length>0){
fetchGroupMembers();
}
},[groupIds])


useEffect(()=>{
props.setIsStep2Complete(inviteAddress&&!emailError);
Expand Down Expand Up @@ -349,21 +361,32 @@ const EmailStep: React.FC<any> = (props) => {
setIsOpen(open);
};


let fetchGroupAdminIds = () => {
groupsService!.doGet<any>("/group-admin/groupids/all")
.then((response: HttpResponse<any>) => {
if(response.status===200&&response.data){
setGroupIds(response.data)
// setGroupMembers(response.data.results);
}
}).catch((err)=>{console.log(err)})

}
let fetchGroupMembers = async (searchString = "")=>{
groupsService!.doGet<any>("/group-admin/group/"+props.groupId+"/members",{params:{max:20,search:searchString}})
groupsService!.doGet<any>("/group-admin/groups/members",{params:{max:20,search:searchString,groups:groupIds.join(',')}})
.then((response: HttpResponse<any>) => {
if(response.status===200&&response.data){
let members: any = [];
response.data.results.forEach((membership)=>{
members.push({value:getUserIdentifier(membership.user),description:membership.user.email,id:membership.user.id});
response.data.results.forEach((user)=>{
members.push({value:getUserIdentifier(user),description:user.email,id:user.id});
})
setOptions(members);
// setGroupMembers(response.data.results);
}
}).catch((err)=>{console.log(err)})
}



let getUserIdentifier = (user) => {
return (user.firstName || user.lastName?(user.firstName&&user.firstName+" ")+ user.lastName:user.username?user.username:user.email?user.email:user.id?user.id:"Info Not Available")
}
Expand Down
Loading

0 comments on commit 3b9cf30

Please sign in to comment.