diff --git a/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm/index.js b/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm/index.js
new file mode 100644
index 0000000000..ca069c6e6c
--- /dev/null
+++ b/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm/index.js
@@ -0,0 +1,108 @@
+import React, { useState } from 'react';
+import PropTypes from 'prop-types';
+import { useIntl } from 'react-intl';
+import {
+ Stack,
+ Grid,
+ GridItem,
+ ModalLayout,
+ ModalHeader,
+ ModalFooter,
+ ModalBody,
+ Button,
+ Breadcrumbs,
+ Crumb,
+ Text,
+ Box,
+ H2,
+} from '@strapi/parts';
+import { Formik } from 'formik';
+import { Form } from '@strapi/helper-plugin';
+import schema from './utils/schema';
+import stepper from './utils/stepper';
+
+const ModalForm = ({ onToggle }) => {
+ const [currentStep, setStep] = useState('create');
+ const { formatMessage } = useIntl();
+ const headerTitle = formatMessage({
+ id: 'Settings.permissions.users.create',
+ defaultMessage: 'Create new user',
+ });
+
+ const goNext = () => {
+ if (next) {
+ setStep(next);
+ } else {
+ onToggle();
+ }
+ };
+
+ const { buttonSubmitLabel, isDisabled, next } = stepper[currentStep];
+
+ return (
+
+
+
+ {headerTitle}
+
+
+ {}}
+ validationSchema={schema}
+ validateOnChange={false}
+ >
+ {({ errors, handleChange, values }) => {
+ return (
+
+ );
+ }}
+
+
+ );
+};
+
+ModalForm.propTypes = {
+ onToggle: PropTypes.func.isRequired,
+};
+
+export default ModalForm;
diff --git a/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm/utils/schema.js b/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm/utils/schema.js
new file mode 100644
index 0000000000..98019e27b8
--- /dev/null
+++ b/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm/utils/schema.js
@@ -0,0 +1,17 @@
+import * as yup from 'yup';
+import { translatedErrors } from '@strapi/helper-plugin';
+
+const schema = yup.object().shape({
+ firstname: yup.string().required(translatedErrors.required),
+ lastname: yup.string().required(translatedErrors.required),
+ email: yup
+ .string()
+ .email(translatedErrors.email)
+ .required(translatedErrors.required),
+ roles: yup
+ .array()
+ .min(1, translatedErrors.min)
+ .required(translatedErrors.required),
+});
+
+export default schema;
diff --git a/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm/utils/stepper.js b/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm/utils/stepper.js
new file mode 100644
index 0000000000..d265afc36c
--- /dev/null
+++ b/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm/utils/stepper.js
@@ -0,0 +1,21 @@
+// import { ModalCreateBody } fro../../../../../components/Usersers';
+
+const stepper = {
+ create: {
+ buttonSubmitLabel: {
+ id: 'app.containers.Users.ModalForm.footer.button-success',
+ defaultMessage: 'Create user',
+ },
+ // Component: ModalCreateBody,
+ isDisabled: false,
+ next: 'magic-link',
+ },
+ 'magic-link': {
+ buttonSubmitLabel: { id: 'form.button.finish', defaultMessage: 'Finish' },
+ // Component: ModalCreateBody,
+ isDisabled: true,
+ next: null,
+ },
+};
+
+export default stepper;
diff --git a/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm.js b/packages/core/admin/admin/src/pages/Users/ListPage/ModalForme.js
similarity index 98%
rename from packages/core/admin/admin/src/pages/Users/ListPage/ModalForm.js
rename to packages/core/admin/admin/src/pages/Users/ListPage/ModalForme.js
index 0a4fa38fa3..00ad52d7b0 100644
--- a/packages/core/admin/admin/src/pages/Users/ListPage/ModalForm.js
+++ b/packages/core/admin/admin/src/pages/Users/ListPage/ModalForme.js
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { Button } from '@buffetjs/core';
import { useIntl } from 'react-intl';
import { Modal, ModalFooter, ModalHeader } from '@strapi/helper-plugin';
-import stepper from './stepper';
+import stepper from './ModalForm/utils/stepper';
const ModalForm = ({ isOpen, onClosed, onToggle }) => {
const [currentStep, setStep] = useState('create');
diff --git a/packages/core/admin/admin/src/pages/Users/ListPage/index.js b/packages/core/admin/admin/src/pages/Users/ListPage/index.js
index 29e6801671..b67737b30e 100644
--- a/packages/core/admin/admin/src/pages/Users/ListPage/index.js
+++ b/packages/core/admin/admin/src/pages/Users/ListPage/index.js
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, { useState } from 'react';
import {
CustomContentLayout,
useRBAC,
@@ -15,6 +15,7 @@ import get from 'lodash/get';
import adminPermissions from '../../../permissions';
import DynamicTable from './DynamicTable';
import Filters from './Filters';
+import ModalForm from './ModalForm';
import Search from './Search';
import PaginationFooter from './PaginationFooter';
import { deleteData, fetchData } from './utils/api';
@@ -22,6 +23,7 @@ import displayedFilters from './utils/displayedFilters';
import tableHeaders from './utils/tableHeaders';
const ListPage = () => {
+ const [isModalOpened, setIsModalOpen] = useState(true);
const {
allowedActions: { canCreate, canDelete, canRead, canUpdate },
} = useRBAC(adminPermissions.settings.users);
@@ -29,6 +31,7 @@ const ListPage = () => {
const toggleNotification = useNotification();
const { formatMessage } = useIntl();
const { search } = useLocation();
+ useFocusWhenNavigate();
const { status, data, isFetching } = useQuery(['users', search], () => fetchData(search), {
enabled: canRead,
@@ -43,7 +46,9 @@ const ListPage = () => {
},
});
- useFocusWhenNavigate();
+ const handleToggle = () => {
+ setIsModalOpen(prev => !prev);
+ };
const total = get(data, 'pagination.total', 0);
@@ -68,11 +73,7 @@ const ListPage = () => {
(status !== 'success' && status !== 'error') || (status === 'success' && isFetching);
const createAction = canCreate ? (
-