1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-19 05:19:39 +02:00
portainer/app/portainer/access-control/AccessControlForm/AccessControlForm.tsx

71 lines
2 KiB
TypeScript

import { FormikErrors } from 'formik';
import { useUser } from '@/portainer/hooks/useUser';
import { EditDetails } from '@/portainer/access-control/EditDetails/EditDetails';
import { FormSectionTitle } from '@@/form-components/FormSectionTitle';
import { SwitchField } from '@@/form-components/SwitchField';
import { ResourceControlOwnership, AccessControlFormData } from '../types';
export interface Props {
values: AccessControlFormData;
onChange(values: AccessControlFormData): void;
hideTitle?: boolean;
formNamespace?: string;
errors?: FormikErrors<AccessControlFormData>;
}
export function AccessControlForm({
values,
onChange,
hideTitle,
formNamespace,
errors,
}: Props) {
const { isAdmin } = useUser();
const accessControlEnabled =
values.ownership !== ResourceControlOwnership.PUBLIC;
return (
<>
{!hideTitle && <FormSectionTitle>Access control</FormSectionTitle>}
<div className="form-group">
<div className="col-sm-12">
<SwitchField
checked={accessControlEnabled}
name={withNamespace('accessControlEnabled')}
label="Enable access control"
tooltip="When enabled, you can restrict the access and management of this resource."
onChange={handleToggleEnable}
dataCy="portainer-accessMgmtToggle"
/>
</div>
</div>
{accessControlEnabled && (
<EditDetails
onChange={onChange}
values={values}
errors={errors}
formNamespace={formNamespace}
/>
)}
</>
);
function withNamespace(name: string) {
return formNamespace ? `${formNamespace}.${name}` : name;
}
function handleToggleEnable(accessControlEnabled: boolean) {
let ownership = ResourceControlOwnership.PUBLIC;
if (accessControlEnabled) {
ownership = isAdmin
? ResourceControlOwnership.ADMINISTRATORS
: ResourceControlOwnership.PRIVATE;
}
onChange({ ...values, ownership });
}
}