This repository has been archived by the owner on Apr 18, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Default Permissions tab (PROJQUAY-4570)
Signed-off-by: harishsurf <[email protected]>
- Loading branch information
1 parent
78938df
commit ce61555
Showing
9 changed files
with
301 additions
and
53 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,35 @@ | ||
import {atom} from 'recoil'; | ||
import {SearchState} from 'src/components/toolbar/SearchTypes'; | ||
import {IOrganization} from 'src/resources/OrganizationResource'; | ||
import ColumnNames from 'src/routes/OrganizationsList/ColumnNames'; | ||
|
||
export const refreshPageState = atom({ | ||
key: 'refreshOrgPageState', | ||
default: 0, | ||
}); | ||
|
||
// Organization List page | ||
export const selectedOrgsState = atom<IOrganization[]>({ | ||
key: 'selectedOrgsState', | ||
default: [], | ||
}); | ||
export const searchOrgsState = atom<SearchState>({ | ||
key: 'searchOrgsState', | ||
default: { | ||
query: '', | ||
field: ColumnNames.name, | ||
}, | ||
}); | ||
|
||
// OrgList -> Default Permissions tab | ||
export const selectedPermissionsState = atom({ | ||
key: 'selectedPermissionsState', | ||
default: [], | ||
}); | ||
export const searchPermissionsState = atom<SearchState>({ | ||
key: 'searchPermissionsState', | ||
default: { | ||
query: '', | ||
field: ColumnNames.name, | ||
}, | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,6 @@ | ||
import {atom} from 'recoil'; | ||
import {IOrganization} from 'src/resources/OrganizationResource'; | ||
import ColumnNames from 'src/routes/OrganizationsList/ColumnNames'; | ||
import {SearchState} from 'src/components/toolbar/SearchTypes'; | ||
|
||
export const CurrentUsernameState = atom({ | ||
key: 'currentUsernameState', | ||
default: '', | ||
}); | ||
|
||
export const selectedOrgsState = atom<IOrganization[]>({ | ||
key: 'selectedOrgsState', | ||
default: [], | ||
}); | ||
|
||
export const searchOrgsState = atom<SearchState>({ | ||
key: 'searchOrgsState', | ||
default: { | ||
query: '', | ||
field: ColumnNames.name, | ||
}, | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
export interface IPermission { | ||
name: string; | ||
} | ||
|
||
export async function fetchDefaultPermissions() { | ||
// const response: AxiosResponse<IUserResource> = await axios.get( | ||
// '/api/v1/user/', | ||
// ); | ||
// assertHttpCode(response.status, 200); | ||
// return response.data; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
23 changes: 23 additions & 0 deletions
23
src/routes/OrganizationsList/Organization/Tabs/DefaultPermissions/CreatePermissionModal.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
import {Drawer, DrawerContent, DrawerContentBody} from '@patternfly/react-core'; | ||
|
||
export default function CreatePermissionModal( | ||
props: CreatePermissionModalProps, | ||
) { | ||
const panelContent = {}; | ||
return ( | ||
<Drawer isExpanded={props.isExpanded} onExpand={props.onExpand}> | ||
<DrawerContent panelContent={panelContent}> | ||
<DrawerContentBody>content-body</DrawerContentBody> | ||
<DrawerContentBody hasPadding> | ||
content-body with padding | ||
</DrawerContentBody> | ||
<DrawerContentBody>content-body</DrawerContentBody> | ||
</DrawerContent> | ||
</Drawer> | ||
); | ||
} | ||
|
||
interface CreatePermissionModalProps { | ||
isExpanded?: boolean; | ||
onExpand: () => void; | ||
} |
201 changes: 201 additions & 0 deletions
201
src/routes/OrganizationsList/Organization/Tabs/DefaultPermissions/DefaultPermissions.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,201 @@ | ||
import { | ||
PageSection, | ||
PageSectionVariants, | ||
TextContent, | ||
Text, | ||
TextVariants, | ||
SearchInput, | ||
Toolbar, | ||
ToolbarContent, | ||
Flex, | ||
FlexItem, | ||
Button, | ||
} from '@patternfly/react-core'; | ||
import { | ||
TableComposable, | ||
Tbody, | ||
Td, | ||
Th, | ||
Thead, | ||
Tr, | ||
} from '@patternfly/react-table'; | ||
import {useEffect, useState} from 'react'; | ||
import {useRecoilState, useResetRecoilState} from 'recoil'; | ||
import { | ||
searchPermissionsState, | ||
selectedPermissionsState, | ||
} from 'src/atoms/OrganizationListState'; | ||
import {DropdownCheckbox} from 'src/components/toolbar/DropdownCheckbox'; | ||
import {SearchDropdown} from 'src/components/toolbar/SearchDropdown'; | ||
import { | ||
fetchDefaultPermissions, | ||
IPermission, | ||
} from 'src/resources/PermissionsResource'; | ||
import CreatePermissionModal from './CreatePermissionModal'; | ||
|
||
export default function DefaultPermissions() { | ||
const [permissionsList, setPermissionsList] = useState<IPermission[]>([]); | ||
|
||
const [search, setSearch] = useRecoilState(searchPermissionsState); | ||
const resetSearch = useResetRecoilState(searchPermissionsState); | ||
|
||
const [isCreatePermModalOpen, setCreatePermModalOpen] = useState(true); | ||
|
||
const filteredPermissionsList = | ||
search.query !== '' | ||
? permissionsList?.filter((permission) => | ||
permission.name.includes(search.query), | ||
) | ||
: permissionsList; | ||
|
||
// Select checkbox related states | ||
const [selectedPermissions, setSelectedPermissions] = useRecoilState( | ||
selectedPermissionsState, | ||
); | ||
const isPermissionSelectable = (permission: IPermission) => | ||
permission.name !== ''; // Arbitrary logic for this example | ||
const selectAllPermissions = (isSelecting = true) => | ||
setSelectedPermissions( | ||
isSelecting ? filteredPermissionsList.map((p) => p.name) : [], | ||
); | ||
|
||
const setPermissionSelected = (permission: IPermission, isSelecting = true) => | ||
setSelectedPermissions((prevSelected) => { | ||
const otherSelectedPermissions = prevSelected.filter( | ||
(p) => p !== permission.name, | ||
); | ||
return isSelecting && isPermissionSelectable(permission) | ||
? [...otherSelectedPermissions, permission.name] | ||
: otherSelectedPermissions; | ||
}); | ||
|
||
const isPermissionSelected = (permission: IPermission) => | ||
selectedPermissions.includes(permission.name); | ||
|
||
const onSelectPermission = ( | ||
permission: IPermission, | ||
rowIndex: number, | ||
isSelecting: boolean, | ||
) => { | ||
setPermissionSelected(permission, isSelecting); | ||
}; | ||
|
||
async function fetchPermissions() { | ||
// clearing previous states | ||
resetSearch(); | ||
setPermissionsList([]); | ||
setSelectedPermissions([]); | ||
try { | ||
const user = await fetchDefaultPermissions(); | ||
// setUserState(user); | ||
} catch (err) { | ||
console.error(err); | ||
} | ||
} | ||
|
||
useEffect(() => { | ||
fetchPermissions(); | ||
}, []); | ||
|
||
const permissionColumnNames = { | ||
repoCreatedBy: 'Repository Created By', | ||
permAppliedTo: 'Permission Applied To', | ||
permission: 'Permission', | ||
}; | ||
|
||
const createPermissionModal = ( | ||
<CreatePermissionModal | ||
isExpanded={isCreatePermModalOpen} | ||
onExpand={() => handleCreatePermOnClick} | ||
/> | ||
); | ||
|
||
const handleCreatePermOnClick = () => { | ||
setCreatePermModalOpen(!isCreatePermModalOpen); | ||
}; | ||
|
||
return ( | ||
<PageSection variant={PageSectionVariants.light}> | ||
<TextContent> | ||
<Text component={TextVariants.p}> | ||
The Default permissions panel defines permissions that should be | ||
granted automatically to a repository when it is created, in addition | ||
to the default of the repository's creator. Permissions are | ||
assigned based on the user who created the repository. | ||
</Text> | ||
<Text component={TextVariants.p}> | ||
Note: Permissions added here do not automatically get added to | ||
existing repositories. | ||
</Text> | ||
</TextContent> | ||
<Toolbar> | ||
<ToolbarContent> | ||
<DropdownCheckbox | ||
selectedItems={selectedPermissions} | ||
deSelectAll={setSelectedPermissions} | ||
allItemsList={permissionsList} | ||
itemsPerPageList={permissionsList} | ||
onItemSelect={onSelectPermission} | ||
/> | ||
<SearchDropdown | ||
items={[permissionColumnNames.repoCreatedBy]} | ||
searchState={search} | ||
setSearchState={setSearch} | ||
/> | ||
<Flex className="pf-u-mr-md"> | ||
<FlexItem> | ||
<SearchInput searchState={search} onChange={setSearch} /> | ||
</FlexItem> | ||
</Flex> | ||
<Button | ||
aria-expanded={isCreatePermModalOpen} | ||
onClick={handleCreatePermOnClick} | ||
> | ||
Create default permission | ||
</Button> | ||
{/* <ToolbarButton | ||
id="create-default-permission" | ||
buttonValue="Create default permission" | ||
Modal={createPermissionModal} | ||
isModalOpen={isCreatePermModalOpen} | ||
setModalOpen={setCreatePermModalOpen} | ||
/> */} | ||
</ToolbarContent> | ||
</Toolbar> | ||
<TableComposable aria-label="Selectable table"> | ||
<Thead> | ||
<Tr> | ||
<Th /> | ||
<Th>{permissionColumnNames.repoCreatedBy}</Th> | ||
<Th>{permissionColumnNames.permAppliedTo}</Th> | ||
<Th>{permissionColumnNames.permission}</Th> | ||
</Tr> | ||
</Thead> | ||
<Tbody> | ||
{permissionsList?.map((permission, rowIndex) => ( | ||
<Tr key={permission.name}> | ||
<Td | ||
select={{ | ||
rowIndex, | ||
onSelect: (_event, isSelecting) => | ||
onSelectPermission(permission, rowIndex, isSelecting), | ||
isSelected: isPermissionSelected(permission), | ||
disable: !isPermissionSelectable(permission), | ||
}} | ||
/> | ||
<Td dataLabel={permissionColumnNames.repoCreatedBy}> | ||
{permissionColumnNames.repoCreatedBy} | ||
</Td> | ||
<Td dataLabel={permissionColumnNames.repoCreatedBy}> | ||
{permissionColumnNames.repoCreatedBy} | ||
</Td> | ||
<Td dataLabel={permissionColumnNames.repoCreatedBy}> | ||
{permissionColumnNames.repoCreatedBy} | ||
</Td> | ||
</Tr> | ||
))} | ||
</Tbody> | ||
</TableComposable> | ||
</PageSection> | ||
); | ||
} |
3 changes: 0 additions & 3 deletions
3
src/routes/OrganizationsList/Organization/Tabs/UsageLogs/UsageLogsTab.tsx
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.