mirror of
https://github.com/portainer/portainer.git
synced 2025-08-02 12:25:22 +02:00
fix(access): support to list users or teams with specified endpoint [EE-1704] (#7610)
This commit is contained in:
parent
f71fe87ba7
commit
53025178ef
25 changed files with 632 additions and 61 deletions
|
@ -186,6 +186,7 @@ export function ItemView() {
|
|||
resourceId={id}
|
||||
resourceControl={container.resourceControl}
|
||||
resourceType={ResourceControlType.ContainerGroup}
|
||||
environmentId={environmentId}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
|
|
|
@ -89,6 +89,7 @@ export function ItemView() {
|
|||
resourceType={ResourceControlType.Network}
|
||||
disableOwnershipChange={isSystemNetwork(networkQuery.data.Name)}
|
||||
resourceId={networkId}
|
||||
environmentId={environmentId}
|
||||
/>
|
||||
<NetworkOptionsTable options={networkQuery.data.Options} />
|
||||
<NetworkContainersTable
|
||||
|
|
|
@ -4,6 +4,7 @@ import { useUser } from '@/portainer/hooks/useUser';
|
|||
import { Icon } from '@/react/components/Icon';
|
||||
import { TeamMembership, TeamRole } from '@/react/portainer/users/teams/types';
|
||||
import { useUserMembership } from '@/portainer/users/queries';
|
||||
import { EnvironmentId } from '@/portainer/environments/types';
|
||||
|
||||
import { TableContainer, TableTitle } from '@@/datatables';
|
||||
import { Button } from '@@/buttons';
|
||||
|
@ -18,6 +19,7 @@ interface Props {
|
|||
resourceControl?: ResourceControlViewModel;
|
||||
resourceType: ResourceControlType;
|
||||
resourceId: ResourceId;
|
||||
environmentId: EnvironmentId;
|
||||
disableOwnershipChange?: boolean;
|
||||
onUpdateSuccess(): Promise<void>;
|
||||
}
|
||||
|
@ -27,6 +29,7 @@ export function AccessControlPanel({
|
|||
resourceType,
|
||||
disableOwnershipChange,
|
||||
resourceId,
|
||||
environmentId,
|
||||
onUpdateSuccess,
|
||||
}: Props) {
|
||||
const [isEditMode, toggleEditMode] = useReducer((state) => !state, false);
|
||||
|
@ -69,6 +72,7 @@ export function AccessControlPanel({
|
|||
onCancelClick={() => toggleEditMode()}
|
||||
resourceId={resourceId}
|
||||
resourceType={resourceType}
|
||||
environmentId={environmentId}
|
||||
onUpdateSuccess={handleUpdateSuccess}
|
||||
/>
|
||||
)}
|
||||
|
|
|
@ -178,7 +178,7 @@ function InheritanceMessage({
|
|||
}
|
||||
|
||||
function useAuthorizedTeams(authorizedTeamIds: TeamId[]) {
|
||||
return useTeams(false, {
|
||||
return useTeams(false, 0, {
|
||||
enabled: authorizedTeamIds.length > 0,
|
||||
select: (teams) => {
|
||||
if (authorizedTeamIds.length === 0) {
|
||||
|
@ -196,7 +196,7 @@ function useAuthorizedTeams(authorizedTeamIds: TeamId[]) {
|
|||
}
|
||||
|
||||
function useAuthorizedUsers(authorizedUserIds: UserId[]) {
|
||||
return useUsers(false, authorizedUserIds.length > 0, (users) => {
|
||||
return useUsers(false, 0, authorizedUserIds.length > 0, (users) => {
|
||||
if (authorizedUserIds.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import { object } from 'yup';
|
|||
import { useUser } from '@/portainer/hooks/useUser';
|
||||
import { confirmAsync } from '@/portainer/services/modal.service/confirm';
|
||||
import { notifySuccess } from '@/portainer/services/notifications';
|
||||
import { EnvironmentId } from '@/portainer/environments/types';
|
||||
|
||||
import { Button } from '@@/buttons';
|
||||
import { LoadingButton } from '@@/buttons/LoadingButton';
|
||||
|
@ -27,6 +28,7 @@ interface Props {
|
|||
resourceType: ResourceControlType;
|
||||
resourceId: ResourceId;
|
||||
resourceControl?: ResourceControlViewModel;
|
||||
environmentId?: EnvironmentId;
|
||||
onCancelClick(): void;
|
||||
onUpdateSuccess(): Promise<void>;
|
||||
}
|
||||
|
@ -35,6 +37,7 @@ export function AccessControlPanelForm({
|
|||
resourceId,
|
||||
resourceType,
|
||||
resourceControl,
|
||||
environmentId,
|
||||
onCancelClick,
|
||||
onUpdateSuccess,
|
||||
}: Props) {
|
||||
|
@ -81,6 +84,7 @@ export function AccessControlPanelForm({
|
|||
values={values.accessControl}
|
||||
isPublicVisible
|
||||
errors={errors.accessControl}
|
||||
environmentId={environmentId}
|
||||
/>
|
||||
|
||||
<div className="form-group">
|
||||
|
|
|
@ -2,6 +2,7 @@ import { useCallback } from 'react';
|
|||
import { FormikErrors } from 'formik';
|
||||
|
||||
import { useUser } from '@/portainer/hooks/useUser';
|
||||
import { EnvironmentId } from '@/portainer/environments/types';
|
||||
|
||||
import { BoxSelector } from '@@/BoxSelector';
|
||||
import { FormError } from '@@/form-components/FormError';
|
||||
|
@ -19,6 +20,7 @@ interface Props {
|
|||
isPublicVisible?: boolean;
|
||||
errors?: FormikErrors<AccessControlFormData>;
|
||||
formNamespace?: string;
|
||||
environmentId?: EnvironmentId;
|
||||
}
|
||||
|
||||
export function EditDetails({
|
||||
|
@ -27,10 +29,11 @@ export function EditDetails({
|
|||
isPublicVisible = false,
|
||||
errors,
|
||||
formNamespace,
|
||||
environmentId,
|
||||
}: Props) {
|
||||
const { user, isAdmin } = useUser();
|
||||
|
||||
const { users, teams, isLoading } = useLoadState();
|
||||
const { users, teams, isLoading } = useLoadState(environmentId);
|
||||
const options = useOptions(isAdmin, teams, isPublicVisible);
|
||||
|
||||
const handleChange = useCallback(
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
import { useTeams } from '@/react/portainer/users/teams/queries';
|
||||
import { useUsers } from '@/portainer/users/queries';
|
||||
import { EnvironmentId } from '@/portainer/environments/types';
|
||||
|
||||
export function useLoadState() {
|
||||
const teams = useTeams();
|
||||
export function useLoadState(environmentId?: EnvironmentId) {
|
||||
const teams = useTeams(false, environmentId);
|
||||
|
||||
const users = useUsers(false);
|
||||
const users = useUsers(false, environmentId);
|
||||
|
||||
return {
|
||||
teams: teams.data,
|
||||
|
|
|
@ -12,7 +12,7 @@ export function ListView() {
|
|||
const { isAdmin } = useUser();
|
||||
|
||||
const usersQuery = useUsers(false);
|
||||
const teamsQuery = useTeams(!isAdmin, { enabled: !!usersQuery.data });
|
||||
const teamsQuery = useTeams(!isAdmin, 0, { enabled: !!usersQuery.data });
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
|
@ -14,6 +14,7 @@ import { Team, TeamId, TeamMembership, TeamRole } from './types';
|
|||
|
||||
export function useTeams<T = Team[]>(
|
||||
onlyLedTeams = false,
|
||||
environmentId = 0,
|
||||
{
|
||||
enabled = true,
|
||||
select = (data) => data as unknown as T,
|
||||
|
@ -23,8 +24,8 @@ export function useTeams<T = Team[]>(
|
|||
} = {}
|
||||
) {
|
||||
const teams = useQuery(
|
||||
['teams', { onlyLedTeams }],
|
||||
() => getTeams(onlyLedTeams),
|
||||
['teams', { onlyLedTeams, environmentId }],
|
||||
() => getTeams(onlyLedTeams, environmentId),
|
||||
{
|
||||
meta: {
|
||||
error: { title: 'Failure', message: 'Unable to load teams' },
|
||||
|
|
|
@ -4,10 +4,10 @@ import { type UserId } from '@/portainer/users/types';
|
|||
import { createTeamMembership } from './team-membership.service';
|
||||
import { Team, TeamId, TeamMembership, TeamRole } from './types';
|
||||
|
||||
export async function getTeams(onlyLedTeams = false) {
|
||||
export async function getTeams(onlyLedTeams = false, environmentId = 0) {
|
||||
try {
|
||||
const { data } = await axios.get<Team[]>(buildUrl(), {
|
||||
params: { onlyLedTeams },
|
||||
params: { onlyLedTeams, environmentId },
|
||||
});
|
||||
return data;
|
||||
} catch (error) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue