Skip to content

Commit

Permalink
Fixed dropsdowns for groups
Browse files Browse the repository at this point in the history
  • Loading branch information
rmathis committed Jul 2, 2021
1 parent b592f38 commit c8b5eaa
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 14 deletions.
1 change: 1 addition & 0 deletions backend/src/main/resources/i18n/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,7 @@ label.current=Current
label.restore=Restore
label.compare-selected=Compare Selected
label.restore-version=Restore Version ({ date })
label.group=Group

label.saved=Saved
label.by=By
Expand Down
4 changes: 2 additions & 2 deletions ui/src/app/admin/component/UserMaintenance.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,13 @@ export default function UserMaintenance({ users, roles, onDeleteUser, onChangeUs
</select>
</td>
<td>
<label htmlFor={`group-${user.username}`} className="sr-only"><Translate value="action.user-role">User role</Translate></label>
<label htmlFor={`group-${user.username}`} className="sr-only"><Translate value="action.user-group">User group</Translate></label>
<select
id={`group-${user.username}`}
name={`group-${user.username}`}
className="form-control"
onChange={(event) => onChangeUserGroup(user, event.target.value)}
value={user.group ? user.group : ''}
value={user.groupId ? user.groupId : ''}
disabled={loadingGroups || currentUser.username === user.username}
disablevalidation="true">
<option>Select Group</option>
Expand Down
13 changes: 12 additions & 1 deletion ui/src/app/core/user/UserContext.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,16 @@ function useIsAdmin() {
return user.role === 'ROLE_ADMIN';
}

function useIsInGroup(id) {
const user = useCurrentUser();
return user.group === id;
}

function useIsAdminOrInGroup() {
const isAdmin = useIsAdmin();
const isInGroup = useIsInGroup();
return isAdmin || isInGroup;
}


export { UserContext, UserProvider, Consumer as UserConsumer, useCurrentUser, useIsAdmin };
export { UserContext, UserProvider, Consumer as UserConsumer, useCurrentUser, useIsAdmin, useIsAdminOrInGroup };
18 changes: 16 additions & 2 deletions ui/src/app/dashboard/view/SourcesTab.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from 'react';
import Translate from '../../i18n/components/translate';

import SourceList from '../../metadata/domain/source/component/SourceList';
import { useMetadataEntities } from '../../metadata/hooks/api';
import { useMetadataEntities, useMetadataEntity } from '../../metadata/hooks/api';
import { Search } from '../component/Search';

const searchProps = ['serviceProviderName', 'entityId', 'createdBy'];
Expand All @@ -15,6 +15,10 @@ export function SourcesTab () {
cachePolicy: 'no-cache'
});

const updater = useMetadataEntity('source', {
cachePolicy: 'no-cache'
})

async function loadSources() {
const sources = await get('');
if (response.ok) {
Expand All @@ -27,6 +31,16 @@ export function SourcesTab () {
/*eslint-disable react-hooks/exhaustive-deps*/
React.useEffect(() => { loadSources() }, []);

async function changeSourceGroup(source, group) {
const sources = await updater.put(`/${source.id}`, {
...source,
groupId: group
});
if (updater.response.ok) {
loadSources();
}
}

return (
<section className="section">
<div className="section-body border border-top-0 border-primary">
Expand All @@ -37,7 +51,7 @@ export function SourcesTab () {
</div>
<div className="p-3">
<Search entities={sources} searchable={searchProps}>
{(searched) => <SourceList entities={ searched } onDelete={ updateSources }></SourceList>}
{(searched) => <SourceList entities={ searched } onDelete={ updateSources } onChangeGroup={changeSourceGroup}></SourceList>}
</Search>
</div>
</div>
Expand Down
48 changes: 39 additions & 9 deletions ui/src/app/metadata/domain/source/component/SourceList.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,13 @@ import FormattedDate from '../../../../core/components/FormattedDate';
import Translate from '../../../../i18n/components/translate';
import { Scroller } from '../../../../dashboard/component/Scroller';
import { DeleteSourceConfirmation } from './DeleteSourceConfirmation';
import { useIsAdmin } from '../../../../core/user/UserContext';
import { GroupsProvider } from '../../../../admin/hoc/GroupsProvider';

export default function SourceList({ entities, onDelete, onEnable, onChangeGroup }) {

const isAdmin = useIsAdmin();

export default function SourceList({ entities, onDelete, onEnable }) {
return (
<DeleteSourceConfirmation>
{(onDeleteSource) =>
Expand All @@ -24,11 +29,12 @@ export default function SourceList({ entities, onDelete, onEnable }) {
<table className="table table-striped w-100 table-hover">
<thead>
<tr>
<th><Translate value="label.title">Title</Translate></th>
<th className="w-40"><Translate value="label.entity-id">Entity ID</Translate></th>
<th className="w-15"><Translate value="label.author">Author</Translate></th>
<th className="w-15"><Translate value="label.creation-date">Created Date</Translate></th>
<th className="text-center w-15"><Translate value="label.enabled">Enabled</Translate></th>
<th className="w-25"><Translate value="label.title">Title</Translate></th>
<th className="w-25"><Translate value="label.entity-id">Entity ID</Translate></th>
<th className=""><Translate value="label.author">Author</Translate></th>
<th className=""><Translate value="label.creation-date">Created Date</Translate></th>
<th className=""><Translate value="label.enabled">Enabled</Translate></th>
{isAdmin && onChangeGroup && <th className=""><Translate value="label.group">Group</Translate></th> }
{onDeleteSource && <th className="w-auto"></th>}
</tr>
</thead>
Expand All @@ -45,7 +51,7 @@ export default function SourceList({ entities, onDelete, onEnable }) {
{source.createdBy}
</td>
<td><FormattedDate date={source.createdDate} /></td>
<td className="text-center">
<td className="">
{onEnable ?
<Button
variant="success"
Expand All @@ -62,8 +68,32 @@ export default function SourceList({ entities, onDelete, onEnable }) {
}
</td>


{onDeleteSource && <td className="text-right">
{isAdmin && onChangeGroup &&
<td className="">
<GroupsProvider>
{(groups, removeGroup, loadingGroups) =>
<React.Fragment>
<label htmlFor={`group-${source.serviceProviderName}`} className="sr-only"><Translate value="action.source-group">Group</Translate></label>
<select
id={`group-${source.id}`}
name={`group-${source.id}`}
className="form-control"
onChange={(event) => onChangeGroup(source, event.target.value)}
value={source.groupId ? source.groupId : ''}
disabled={loadingGroups}
disablevalidation="true">
<option>Select Group</option>
{groups.map((g, ridx) => (
<option key={ridx} value={g.resourceId}>{g.name}</option>
))}
</select>
</React.Fragment>
}
</GroupsProvider>
</td>
}
{onDeleteSource &&
<td className="text-right">
<OverlayTrigger trigger={source.serviceEnabled ? ['hover', 'focus'] : []} placement="left"
overlay={
<Popover id={`delete-source-btn-${idx}`}>
Expand Down

0 comments on commit c8b5eaa

Please sign in to comment.