1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-21 06:19:41 +02:00
portainer/app/react/portainer/access-control/AccessControlPanel/AccessControlPanelForm.tsx
Chaim Lev-Ari 31f5b42962
Some checks are pending
ci / build_images (map[arch:amd64 platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:amd64 platform:windows version:1809]) (push) Waiting to run
ci / build_images (map[arch:amd64 platform:windows version:ltsc2022]) (push) Waiting to run
ci / build_images (map[arch:arm platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:arm64 platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:ppc64le platform:linux version:]) (push) Waiting to run
ci / build_images (map[arch:s390x platform:linux version:]) (push) Waiting to run
ci / build_manifests (push) Blocked by required conditions
/ triage (push) Waiting to run
Lint / Run linters (push) Waiting to run
Test / test-server (map[arch:amd64 platform:windows version:1809]) (push) Waiting to run
Test / test-client (push) Waiting to run
Test / test-server (map[arch:amd64 platform:linux]) (push) Waiting to run
Test / test-server (map[arch:amd64 platform:windows version:ltsc2022]) (push) Waiting to run
Test / test-server (map[arch:arm64 platform:linux]) (push) Waiting to run
feat(auth): add useIsEdgeAdmin hook [EE-6627] (#11057)
2024-02-14 19:50:20 -03:00

151 lines
4 KiB
TypeScript

import { Form, Formik } from 'formik';
import clsx from 'clsx';
import { useMutation } from 'react-query';
import { object } from 'yup';
import { useCurrentUser, useIsEdgeAdmin } from '@/react/hooks/useUser';
import { notifySuccess } from '@/portainer/services/notifications';
import { EnvironmentId } from '@/react/portainer/environments/types';
import { confirm } from '@@/modals/confirm';
import { Button } from '@@/buttons';
import { LoadingButton } from '@@/buttons/LoadingButton';
import { buildConfirmButton } from '@@/modals/utils';
import { ModalType } from '@@/modals';
import { EditDetails } from '../EditDetails';
import { parseAccessControlFormData } from '../utils';
import { validationSchema } from '../AccessControlForm/AccessControlForm.validation';
import { applyResourceControlChange } from '../access-control.service';
import {
ResourceControlType,
ResourceId,
AccessControlFormData,
} from '../types';
import { ResourceControlViewModel } from '../models/ResourceControlViewModel';
import styles from './AccessControlPanelForm.module.css';
interface Props {
resourceType: ResourceControlType;
resourceId: ResourceId;
resourceControl?: ResourceControlViewModel;
environmentId: EnvironmentId;
onCancelClick(): void;
onUpdateSuccess(): Promise<void>;
}
export function AccessControlPanelForm({
resourceId,
resourceType,
resourceControl,
environmentId,
onCancelClick,
onUpdateSuccess,
}: Props) {
const { user } = useCurrentUser();
const isAdminQuery = useIsEdgeAdmin();
const updateAccess = useMutation(
(variables: AccessControlFormData) =>
applyResourceControlChange(
resourceType,
resourceId,
variables,
resourceControl
),
{
meta: {
error: { title: 'Failure', message: 'Unable to update access control' },
},
onSuccess() {
return onUpdateSuccess();
},
}
);
if (isAdminQuery.isLoading) {
return null;
}
const { isAdmin } = isAdminQuery;
const initialValues = {
accessControl: parseAccessControlFormData(
isAdmin,
user.Id,
resourceControl
),
};
return (
<Formik
initialValues={initialValues}
onSubmit={handleSubmit}
validateOnMount
validateOnChange
validationSchema={() =>
object({ accessControl: validationSchema(isAdmin) })
}
>
{({ setFieldValue, values, isSubmitting, isValid, errors }) => (
<Form className={clsx('form-horizontal', styles.form)}>
<EditDetails
onChange={(accessControl) =>
setFieldValue('accessControl', accessControl)
}
values={values.accessControl}
isPublicVisible
errors={errors.accessControl}
environmentId={environmentId}
/>
<div className="form-group">
<div className="col-sm-12">
<Button size="small" color="default" onClick={onCancelClick}>
Cancel
</Button>
<LoadingButton
size="small"
color="primary"
type="submit"
isLoading={isSubmitting}
disabled={!isValid}
loadingText="Updating Ownership"
>
Update Ownership
</LoadingButton>
</div>
</div>
</Form>
)}
</Formik>
);
async function handleSubmit({
accessControl,
}: {
accessControl: AccessControlFormData;
}) {
const confirmed = await confirmAccessControlUpdate();
if (!confirmed) {
return;
}
updateAccess.mutate(accessControl, {
onSuccess() {
notifySuccess('Success', 'Access control successfully updated');
},
});
}
}
function confirmAccessControlUpdate() {
return confirm({
modalType: ModalType.Warn,
title: 'Are you sure?',
message:
'Changing the ownership of this resource will potentially restrict its management to some users.',
confirmButton: buildConfirmButton('Change ownership'),
});
}